momentic 2.46.2 → 2.46.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 +23 -23
- package/npm-shrinkwrap.json +41 -62
- package/package.json +1 -1
- package/static/assets/{index-2Cj_1s-q.js → index-fJg8DJgg.js} +366 -357
- 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 self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
3
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="d314727f-a64e-5dbe-a217-ea3e84717376")}catch(e){}}();
|
|
4
4
|
var NB=Object.defineProperty;var Mt=(t,e)=>()=>(t&&(e=t(t=0)),e);var DB=(t,e)=>{for(var r in e)NB(t,r,{get:e[r],enumerable:!0})};var v_,A_=Mt(()=>{"use strict";v_=typeof globalThis=="object"?globalThis:global});var R_=Mt(()=>{"use strict";A_()});var C_=Mt(()=>{"use strict";R_()});var Qo,Vy=Mt(()=>{"use strict";Qo="1.9.0"});function qV(t){var e=new Set([t]),r=new Set,n=t.match(w_);if(!n)return function(){return!1};var o={major:+n[1],minor:+n[2],patch:+n[3],prerelease:n[4]};if(o.prerelease!=null)return function(c){return c===t};function i(s){return r.add(s),!1}function a(s){return e.add(s),!0}return function(c){if(e.has(c))return!0;if(r.has(c))return!1;var l=c.match(w_);if(!l)return i(c);var u={major:+l[1],minor:+l[2],patch:+l[3],prerelease:l[4]};return u.prerelease!=null||o.major!==u.major?i(c):o.major===0?o.minor===u.minor&&o.patch<=u.patch?a(c):i(c):o.minor<=u.minor?a(c):i(c)}}var w_,x_,__=Mt(()=>{"use strict";Vy();w_=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;x_=qV(Qo)});function bl(t,e,r,n){var o;n===void 0&&(n=!1);var i=Iu[_u]=(o=Iu[_u])!==null&&o!==void 0?o:{version:Qo};if(!n&&i[t]){var a=new Error("@opentelemetry/api: Attempted duplicate registration of API: "+t);return r.error(a.stack||a.message),!1}if(i.version!==Qo){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+t+" does not match previously registered API v"+Qo);return r.error(a.stack||a.message),!1}return i[t]=e,r.debug("@opentelemetry/api: Registered a global for "+t+" v"+Qo+"."),!0}function ei(t){var e,r,n=(e=Iu[_u])===null||e===void 0?void 0:e.version;if(!(!n||!x_(n)))return(r=Iu[_u])===null||r===void 0?void 0:r[t]}function El(t,e){e.debug("@opentelemetry/api: Unregistering a global for "+t+" v"+Qo+".");var r=Iu[_u];r&&delete r[t]}var KV,_u,Iu,Pu=Mt(()=>{"use strict";C_();Vy();__();KV=Qo.split(".")[0],_u=Symbol.for("opentelemetry.js.api."+KV),Iu=v_});function Mu(t,e,r){var n=ei("diag");if(n)return r.unshift(e),n[t].apply(n,XV([],YV(r),!1))}var YV,XV,I_,P_=Mt(()=>{"use strict";Pu();YV=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},XV=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},I_=function(){function t(e){this._namespace=e.namespace||"DiagComponentLogger"}return t.prototype.debug=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Mu("debug",this._namespace,e)},t.prototype.error=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Mu("error",this._namespace,e)},t.prototype.info=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Mu("info",this._namespace,e)},t.prototype.warn=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Mu("warn",this._namespace,e)},t.prototype.verbose=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Mu("verbose",this._namespace,e)},t}()});var Rt,Em=Mt(()=>{"use strict";(function(t){t[t.NONE=0]="NONE",t[t.ERROR=30]="ERROR",t[t.WARN=50]="WARN",t[t.INFO=60]="INFO",t[t.DEBUG=70]="DEBUG",t[t.VERBOSE=80]="VERBOSE",t[t.ALL=9999]="ALL"})(Rt||(Rt={}))});function M_(t,e){t<Rt.NONE?t=Rt.NONE:t>Rt.ALL&&(t=Rt.ALL),e=e||{};function r(n,o){var i=e[n];return typeof i=="function"&&t>=o?i.bind(e):function(){}}return{error:r("error",Rt.ERROR),warn:r("warn",Rt.WARN),info:r("info",Rt.INFO),debug:r("debug",Rt.DEBUG),verbose:r("verbose",Rt.VERBOSE)}}var O_=Mt(()=>{"use strict";Em()});var JV,ZV,QV,To,Ou=Mt(()=>{"use strict";P_();O_();Em();Pu();JV=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},ZV=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},QV="diag",To=function(){function t(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=ei("diag");if(s)return s[o].apply(s,ZV([],JV(i),!1))}}var r=this,n=function(o,i){var a,s,c;if(i===void 0&&(i={logLevel:Rt.INFO}),o===r){var l=new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");return r.error((a=l.stack)!==null&&a!==void 0?a:l.message),!1}typeof i=="number"&&(i={logLevel:i});var u=ei("diag"),d=M_((s=i.logLevel)!==null&&s!==void 0?s:Rt.INFO,o);if(u&&!i.suppressOverrideMessage){var p=(c=new Error().stack)!==null&&c!==void 0?c:"<failed to generate stacktrace>";u.warn("Current logger will be overwritten from "+p),d.warn("Current logger will overwrite one already registered from "+p)}return bl("diag",d,r,!0)};r.setLogger=n,r.disable=function(){El(QV,r)},r.createComponentLogger=function(o){return new I_(o)},r.verbose=e("verbose"),r.debug=e("debug"),r.info=e("info"),r.warn=e("warn"),r.error=e("error")}return t.instance=function(){return this._instance||(this._instance=new t),this._instance},t}()});var L_,N_=Mt(()=>{"use strict";L_=Symbol("BaggageEntryMetadata")});function $y(t){return typeof t!="string"&&(e$.error("Cannot create baggage metadata from unknown type: "+typeof t),t=""),{__TYPE__:L_,toString:function(){return t}}}var e$,D_=Mt(()=>{"use strict";Ou();N_();e$=To.instance()});function Wy(t){return Symbol.for(t)}var t$,qy,Ky=Mt(()=>{"use strict";t$=function(){function t(e){var r=this;r._currentContext=e?new Map(e):new Map,r.getValue=function(n){return r._currentContext.get(n)},r.setValue=function(n,o){var i=new t(r._currentContext);return i._currentContext.set(n,o),i},r.deleteValue=function(n){var o=new t(r._currentContext);return o._currentContext.delete(n),o}}return t}(),qy=new t$});function Jy(){return Xy}var Ya,r$,Tm,n$,o$,i$,a$,Yy,s$,l$,c$,Xy,u$,d$,p$,m$,g$,h$,f$,Zy=Mt(()=>{"use strict";Ya=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),r$=function(){function t(){}return t.prototype.createGauge=function(e,r){return d$},t.prototype.createHistogram=function(e,r){return p$},t.prototype.createCounter=function(e,r){return u$},t.prototype.createUpDownCounter=function(e,r){return m$},t.prototype.createObservableGauge=function(e,r){return h$},t.prototype.createObservableCounter=function(e,r){return g$},t.prototype.createObservableUpDownCounter=function(e,r){return f$},t.prototype.addBatchObservableCallback=function(e,r){},t.prototype.removeBatchObservableCallback=function(e){},t}(),Tm=function(){function t(){}return t}(),n$=function(t){Ya(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(Tm),o$=function(t){Ya(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(Tm),i$=function(t){Ya(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(Tm),a$=function(t){Ya(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(Tm),Yy=function(){function t(){}return t.prototype.addCallback=function(e){},t.prototype.removeCallback=function(e){},t}(),s$=function(t){Ya(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Yy),l$=function(t){Ya(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Yy),c$=function(t){Ya(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Yy),Xy=new r$,u$=new n$,d$=new i$,p$=new a$,m$=new o$,g$=new s$,h$=new l$,f$=new c$});var ln,k_=Mt(()=>{"use strict";(function(t){t[t.INT=0]="INT",t[t.DOUBLE=1]="DOUBLE"})(ln||(ln={}))});var S$,y$,U_,F_=Mt(()=>{"use strict";Ky();S$=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},y$=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},U_=function(){function t(){}return t.prototype.active=function(){return qy},t.prototype.with=function(e,r,n){for(var o=[],i=3;i<arguments.length;i++)o[i-3]=arguments[i];return r.call.apply(r,y$([n],S$(o),!1))},t.prototype.bind=function(e,r){return r},t.prototype.enable=function(){return this},t.prototype.disable=function(){return this},t}()});var b$,E$,Qy,T$,B_,z_=Mt(()=>{"use strict";F_();Pu();Ou();b$=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},E$=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},Qy="context",T$=new U_,B_=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalContextManager=function(e){return bl(Qy,e,To.instance())},t.prototype.active=function(){return this._getContextManager().active()},t.prototype.with=function(e,r,n){for(var o,i=[],a=3;a<arguments.length;a++)i[a-3]=arguments[a];return(o=this._getContextManager()).with.apply(o,E$([e,r,n],b$(i),!1))},t.prototype.bind=function(e,r){return this._getContextManager().bind(e,r)},t.prototype._getContextManager=function(){return ei(Qy)||T$},t.prototype.disable=function(){this._getContextManager().disable(),El(Qy,To.instance())},t}()});var Tl,H_=Mt(()=>{"use strict";z_();Tl=B_.getInstance()});var Z,j_=Mt(()=>{"use strict";Ou();Z=To.instance()});var v$,G_,V_=Mt(()=>{"use strict";Zy();v$=function(){function t(){}return t.prototype.getMeter=function(e,r,n){return Xy},t}(),G_=new v$});var eb,$_,W_=Mt(()=>{"use strict";V_();Pu();Ou();eb="metrics",$_=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalMeterProvider=function(e){return bl(eb,e,To.instance())},t.prototype.getMeterProvider=function(){return ei(eb)||G_},t.prototype.getMeter=function(e,r,n){return this.getMeterProvider().getMeter(e,r,n)},t.prototype.disable=function(){El(eb,To.instance())},t}()});var vm,q_=Mt(()=>{"use strict";W_();vm=$_.getInstance()});var ft=Mt(()=>{"use strict";D_();Ky();Em();Zy();k_();H_();j_();q_()});import HTe,{multistream as GTe}from"pino";import $Te from"pino-pretty";import{z as Lf}from"zod";var E7=Lf.object({input:Lf.string(),agentConfigVersion:Lf.string().optional()}),op="finish";import{z as Xt}from"zod";var A7=Xt.object({srcs:Xt.array(Xt.string()),urls:Xt.array(Xt.string()),desiredSrc:Xt.string().optional(),desiredUrl:Xt.string().optional()}),sA=Xt.object({srcRegex:Xt.string().optional(),urlRegex:Xt.string().optional()}),lA=Xt.object({x:Xt.number(),y:Xt.number(),correlation:Xt.number()}),R7=Xt.object({searchImageBase64String:Xt.string(),pageImageBase64String:Xt.string(),id:Xt.string().uuid(),timeoutMs:Xt.number().max(1e4).min(0).optional()});import{z as D}from"zod";import*as G from"zod";import{extendZodWithOpenApi as kB}from"zod-openapi";import Cc from"zod";var wc=Cc.object({updatedAt:Cc.coerce.date().optional()}),ba=Cc.object({contentType:Cc.enum(["image/jpeg","image/png"]),id:Cc.string()});kB(G);var Go=(s=>(s.AI="AI",s.AI_HEALED="AI_HEALED",s.CLICK_TO_FIND="CLICK_TO_FIND",s.XY_PERCENT="XY_PERCENT",s.RECORDING="RECORDING",s.USER_CSS_SELECTOR="USER_CSS_SELECTOR",s.HEURISTIC_HEALED="HEURISTIC_HEALED",s))(Go||{}),UB=G.object({mPathSelectorTokens:G.string().array(),frameSrcRegex:G.string().optional(),frameUrlRegex:G.string().optional(),indices:G.number().array()}),xc=G.object({result:G.number(),traceId:G.string()}).array(),Vo=G.object({type:G.literal("GCS_TRACES"),traces:xc}),Yr=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(Yr||{}),cA=G.object({attributes:G.record(G.string(),G.string()).optional(),text:G.string().optional(),position:G.object({x1:G.number(),y1:G.number(),x2:G.number(),y2:G.number(),tolerance:G.nativeEnum(Yr)}).optional(),shape:G.object({width:G.number(),height:G.number(),tolerance:G.nativeEnum(Yr)}).optional(),boundingBox:G.object({x:G.number(),y:G.number(),width:G.number(),height:G.number()}).optional()}),FB=G.object({selectors:G.string().array(),requirements:cA.optional(),relativeAngleRadians:G.number().min(0).max(2*Math.PI).optional(),relativeDistance:G.number().optional()}),Ti=G.object({id:G.number().int(),dataMomenticId:G.number().int().optional(),selector:G.string().optional(),hybridSelector:G.object({textContent:G.string().nullish(),attributes:G.record(G.string(),G.string().optional()),tagName:G.string(),expandShadowRoot:G.boolean().optional(),classNames:G.string().array(),nthChild:G.number()}).array().optional(),generatedSelectors:G.string().array().optional(),requirements:cA.optional(),additionalElements:FB.array().optional(),role:G.string().optional(),name:G.string().optional(),numChildren:G.number().optional(),content:G.string().optional(),pathFromRoot:G.string().optional(),serializedHtml:G.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:G.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:G.string().url().optional().or(ba.optional()),boundingBox:G.object({x:G.number().optional(),y:G.number().optional(),width:G.number(),height:G.number()}).describe("css pixel bounding box").optional(),frameCache:UB.optional(),inputDescription:G.string().optional().describe("the description that generated this cache"),targetSource:G.nativeEnum(Go).optional(),targetUpdateTime:G.string().optional(),targetUpdateLoggerTags:G.record(G.string(),G.string()).optional(),cacheResolutionUpdateSource:G.string().optional(),cacheResolutionUpdateTime:G.string().optional(),cacheResolutionUpdateLoggerTags:G.record(G.string(),G.string()).optional(),memory:Vo.optional()}).openapi({ref:"ElementTargetCache"});function Ds(t){return!!(t.serializedHtml||t.screenshotUrl||t.generatedSelectors||t.hybridSelector)}var BB=G.object({type:G.literal("description"),elementDescriptor:G.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),zB=G.object({x:G.number(),y:G.number()}),HB=G.object({type:G.literal("coordinates"),pixels:zB}).openapi({ref:"CoordinatesTarget"});function vi(t){return t.type==="description"}function uo(t){return t.type==="coordinates"}var Tr=G.discriminatedUnion("type",[BB,HB]).openapi({ref:"ElementTarget"});function Nf(t){if(!t)return!1;switch(t.type){case"description":return!!t.elementDescriptor}return!0}function vr(t){if(!t)return"";switch(t.type){case"description":return t.elementDescriptor;case"coordinates":return`x: ${t.pixels.x}, y: ${t.pixels.y}`}}function ip(t){return Vo.safeParse(t).success}import{v4 as nt}from"uuid";import*as C from"zod";import{extendZodWithOpenApi as ZB}from"zod-openapi";import{z as Ue}from"zod";import{extendZodWithOpenApi as jB}from"zod-openapi";import{z as _c}from"zod";var Ic=_c.object({result:_c.boolean(),traceId:_c.string()}).array(),Ea=_c.object({type:_c.literal("GCS_TRACES"),traces:Ic}),Df=wc.extend({memory:Ea.optional()});jB(Ue);var uA=Ue.object({thoughts:Ue.string(),result:Ue.boolean(),relevantElements:Ue.array(Ue.number()).optional(),updatedMemory:Ic.optional()}),qn=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(qn||{});var GB=Ue.object({type:Ue.literal("ELEMENT_NAME"),negated:Ue.boolean().optional(),operation:Ue.nativeEnum(qn),value:Ue.string()}).openapi({ref:"ElementNameAssertion"}),VB=Ue.object({type:Ue.literal("ELEMENT_STYLE"),negated:Ue.boolean().optional(),operation:Ue.nativeEnum(qn),property:Ue.string(),value:Ue.string()}).openapi({ref:"ElementStyleAssertion"}),$B=Ue.object({type:Ue.literal("ELEMENT_CONTENT"),negated:Ue.boolean().optional(),operation:Ue.nativeEnum(qn),value:Ue.string()}).openapi({ref:"ElementContentAssertion"}),WB=Ue.object({type:Ue.literal("ELEMENT_ATTRIBUTE"),negated:Ue.boolean().optional(),operation:Ue.nativeEnum(qn),attr:Ue.string(),value:Ue.string()}).openapi({ref:"ElementAttributeValueAssertion"}),$o=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))($o||{});var qB=Ue.object({type:Ue.literal("ELEMENT_EXISTENCE"),negated:Ue.boolean().optional(),condition:Ue.nativeEnum($o).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),ap=Ue.discriminatedUnion("type",[$B,WB,qB,GB,VB]).openapi({ref:"ManualElementAssertion"});var KB=Ue.object({type:Ue.literal("CONTENT"),negated:Ue.boolean().optional(),value:Ue.string()}).openapi({ref:"PageContentAssertion"}),dA=Ue.discriminatedUnion("type",[KB]).openapi({ref:"ManualPageAssertion"});import kr from"zod";var kf=kr.discriminatedUnion("type",[kr.object({type:kr.literal("SUBSTRING"),url:kr.string()}),kr.object({type:kr.literal("GLOB"),glob:kr.string()}),kr.object({type:kr.literal("REGEX"),regex:kr.string()}),kr.object({type:kr.literal("DOMAIN"),domain:kr.string()})]),po=kr.object({urlMatcher:kf,method:kr.string().optional()});import{z as Me}from"zod";var YB=Me.object({type:Me.literal("json"),content:Me.string().describe("The JSON content to send in the request body")}),XB=Me.object({type:Me.literal("form-urlencoded"),content:Me.record(Me.string(),Me.string()).describe("The form fields to send in the request body")}),JB=Me.discriminatedUnion("type",[YB,XB]),Ta=Me.object({url:Me.string(),method:Me.union([Me.literal("GET"),Me.literal("POST"),Me.literal("PUT"),Me.literal("DELETE"),Me.literal("PATCH")]),headers:Me.record(Me.string(),Me.string()).optional(),params:Me.record(Me.string(),Me.string()).optional(),body:JB.optional(),timeout:Me.number().int().optional().describe("Max seconds to wait for the request to complete")}),pA=Me.object({url:Me.string(),headers:Me.record(Me.string(),Me.string()).optional(),query:Me.string(),variables:Me.string().optional(),timeout:Me.number().int().optional().describe("Max seconds to wait for the request to complete")}),sp=Me.object({code:Me.string(),fragment:Me.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:Me.union([Me.literal("NODE"),Me.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:Me.number().int().max(60).optional().describe("Max seconds for the code to complete")});var ut=(ee=>(ee.AI_EXTRACT="AI_EXTRACT",ee.AI_ASSERTION="AI_ASSERTION",ee.AUTH_LOAD="AUTH_LOAD",ee.AUTH_SAVE="AUTH_SAVE",ee.BLUR="BLUR",ee.CAPTCHA="CAPTCHA",ee.CLICK="CLICK",ee.COOKIE="COOKIE",ee.COPY="COPY",ee.DIALOG="DIALOG",ee.DRAG="DRAG",ee.ELEMENT_CHECK="ELEMENT_CHECK",ee.FILE_UPLOAD="FILE_UPLOAD",ee.FOCUS="FOCUS",ee.GO_BACK="GO_BACK",ee.GO_FORWARD="GO_FORWARD",ee.HOVER="HOVER",ee.JAVASCRIPT="JAVASCRIPT",ee.LOCAL_STORAGE="LOCAL_STORAGE",ee.MOUSE_DRAG="MOUSE_DRAG",ee.NAVIGATE="NAVIGATE",ee.NEW_TAB="NEW_TAB",ee.PAGE_CHECK="PAGE_CHECK",ee.PASTE="PASTE",ee.PRESS="PRESS",ee.KEY_DOWN="KEY_DOWN",ee.KEY_UP="KEY_UP",ee.REFRESH="REFRESH",ee.REQUEST="REQUEST",ee.GRAPHQL_REQUEST="GRAPHQL_REQUEST",ee.SCROLL_DOWN="SCROLL_DOWN",ee.SCROLL_UP="SCROLL_UP",ee.SCROLL_LEFT="SCROLL_LEFT",ee.SCROLL_RIGHT="SCROLL_RIGHT",ee.SELECT_OPTION="SELECT_OPTION",ee.SWITCH_TAB="TAB",ee.TYPE="TYPE",ee.VISUAL_DIFF="VISUAL_DIFF",ee.WAIT="WAIT",ee.WAIT_FOR_URL="WAIT_FOR_URL",ee.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",ee.AWAIT_LISTENER="AWAIT_LISTENER",ee.RECORD_REQUESTS="RECORD_REQUESTS",ee.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",ee.SET_HEADER="SET_HEADER",ee.MOCK_ROUTE="MOCK_ROUTE",ee.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",ee.OFFLINE_MODE="OFFLINE_MODE",ee.SUCCESS="SUCCESS",ee))(ut||{});ZB(C);var de=C.object({thoughts:C.string().optional(),id:C.string().uuid().describe("unique identifier to this step, used for step cache")}),Tn=C.object({useSelector:C.boolean().optional(),force:C.boolean().optional(),disableCache:C.boolean().optional().describe("disable element caching for this step"),iframeUrl:C.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),on=wc.extend({target:Ti}).optional().openapi({ref:"SingleTargetCache"});function cp(t){return!!t&&on.safeParse(t).success}var up=C.object({loadTimeout:C.number().int().max(60).optional().describe("Max seconds for the page to load")}),mA=de.merge(up).merge(C.object({type:C.literal("NAVIGATE"),url:C.string()})).openapi({ref:"NavigateCommand"}),dp=Tn.merge(C.object({cache:on})),va=de.merge(dp.merge(C.object({target:Tr.optional(),type:C.literal("SCROLL_UP"),deltaY:C.number().optional()}))).openapi({ref:"ScrollUpCommand"}),Aa=de.merge(dp.merge(C.object({target:Tr.optional(),type:C.literal("SCROLL_DOWN"),deltaY:C.number().optional()}))).openapi({ref:"ScrollDownCommand"}),ks=de.merge(dp.merge(C.object({target:Tr.optional(),type:C.literal("SCROLL_LEFT"),deltaX:C.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Us=de.merge(dp.merge(C.object({target:Tr.optional(),type:C.literal("SCROLL_RIGHT"),deltaX:C.number().optional()}))).openapi({ref:"ScrollRightCommand"}),iee=C.discriminatedUnion("type",[va,Aa,ks,Us]).openapi({ref:"AllScrollCommands"}),QB=de.merge(C.object({type:C.literal("DIALOG"),action:C.union([C.literal("ACCEPT"),C.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),gA=de.merge(C.object({type:C.literal("WAIT"),delay:C.number()})).openapi({ref:"WaitCommand"}),ez=C.object({caseInsensitive:C.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:C.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:C.number().int().optional().describe("Max seconds to wait for the URL to match")}),hA=de.extend({type:C.literal("WAIT_FOR_URL"),matcher:kf}).merge(ez).openapi({ref:"WaitUrlCommand"}),fA=de.merge(up).merge(C.object({type:C.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),SA=de.merge(C.object({type:C.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),yA=de.merge(C.object({type:C.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),tz=de.extend({type:C.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),rz=de.extend({type:C.literal("AUTH_LOAD"),storageState:C.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),Uf=de.merge(Tn).extend({type:C.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),bA=de.extend({type:C.literal("COPY"),value:C.string()}).openapi({ref:"CopyCommand"}),EA=de.extend({type:C.literal("PASTE")}).openapi({ref:"PasteCommand"}),TA=de.merge(sp).extend({type:C.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Fs=de.merge(Tn).extend({type:C.literal("CLICK"),target:Tr,doubleClick:C.boolean().optional(),rightClick:C.boolean().optional(),waitForDownload:C.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:C.number().optional(),downloadTimeoutMs:C.number().optional(),cache:on,relativePosition:C.object({x:C.number(),y:C.number()}).optional()}).openapi({ref:"ClickCommand"}),Ff=wc.extend({fromTarget:Ti.optional(),toTarget:Ti.optional()}),Bs=de.merge(Tn).merge(C.object({type:C.literal("DRAG"),fromTarget:Tr,toTarget:Tr,steps:C.number().optional(),hoverSeconds:C.number().optional().describe("Seconds to hover the object before dropping"),cache:Ff.optional()})).openapi({ref:"DragCommand"}),zs=de.merge(Tn).merge(C.object({type:C.literal("MOUSE_DRAG"),target:Tr.optional(),deltaX:C.string().describe("pixels to move horizontally, can be template"),deltaY:C.string().describe("pixels to move vertically, can be template"),steps:C.number().optional(),cache:on})).openapi({ref:"MouseDragCommand"}),Hs=de.merge(Tn).merge(C.object({type:C.literal("HOVER"),target:Tr,cache:on})).openapi({ref:"HoverCommand"}),Pc=de.merge(Tn).merge(C.object({type:C.literal("FOCUS"),target:Tr,cache:on})).openapi({ref:"FocusCommand"}),Mc=de.merge(Tn).extend({type:C.literal("BLUR"),target:Tr.optional(),cache:on}).openapi({ref:"BlurCommand"}),nz=C.object({type:C.literal("URL"),url:C.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),oz=C.object({type:C.literal("USER_FILE"),name:C.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),iz=de.extend({type:C.literal("FILE_UPLOAD"),fileSource:C.discriminatedUnion("type",[nz,oz]),filename:C.string().optional()}).openapi({ref:"FileUploadCommand"}),Bf=C.discriminatedUnion("type",[C.object({type:C.literal("VALUE"),value:C.string()}),C.object({type:C.literal("LABEL"),label:C.string()}),C.object({type:C.literal("INDEX"),index:C.coerce.string()})]),js=de.merge(Tn).extend({type:C.literal("SELECT_OPTION"),target:Tr,cache:on,choice:Bf.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),zf=C.union([C.literal("MULTIMODAL"),C.literal("VISION_ONLY")]),Oc=de.merge(C.object({type:C.literal("AI_ASSERTION"),assertion:C.string(),disableCache:C.boolean().optional(),iframeUrl:C.string().optional(),contextChoice:zf.optional(),timeout:C.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:Df.optional(),source:C.string().optional()})).openapi({ref:"AIAssertionCommand"}),mo=5,Ra=600,Gs=de.merge(Tn).extend({type:C.literal("ELEMENT_CHECK"),target:Tr,assertion:ap,cache:on.or(Df).optional(),timeout:C.number().int().min(0).max(Ra).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),vA=de.extend({type:C.literal("PAGE_CHECK"),assertion:dA,iframeUrl:C.string().optional().describe("url or url regex for the iframe"),timeout:C.number().int().min(0).max(Ra).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),AA=de.merge(C.object({type:C.literal("AI_EXTRACT"),goal:C.string(),schema:C.string().optional(),envKey:C.string().optional(),disableCache:C.boolean().optional(),iframeUrl:C.string().optional()})).openapi({ref:"AIExtractCommand"}),az=C.object({clearContent:C.boolean().optional(),forceClearContent:C.boolean().optional(),delay:C.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:C.boolean().optional(),pressEnter:C.boolean().optional(),relativePosition:C.object({x:C.number(),y:C.number()}).optional()}),RA=25,Vs=de.merge(Tn).merge(az).extend({type:C.literal("TYPE"),target:Tr.optional(),value:C.string(),cache:on}).openapi({ref:"TypeCommand"}),CA=de.merge(C.object({type:C.literal("PRESS"),value:C.string(),repeat:C.number().optional(),convertMeta:C.boolean().optional(),delayMs:C.number().optional()})).openapi({ref:"PressCommand"}),wA=de.merge(C.object({type:C.literal("KEY_DOWN"),value:C.string(),convertMeta:C.boolean().optional()})).openapi({ref:"KeyDownCommand"}),xA=de.merge(C.object({type:C.literal("KEY_UP"),value:C.string(),convertMeta:C.boolean().optional()})).openapi({ref:"KeyUpCommand"}),sz=C.object({type:C.literal("SUBSTRING"),substring:C.string()}),lz=C.object({type:C.literal("REGEX"),pattern:C.string()}),cz=C.object({type:C.literal("INDEX"),index:C.coerce.string()}),uz=C.discriminatedUnion("type",[sz,lz,cz]),dz=de.merge(up).merge(C.object({type:C.literal("TAB"),action:uz})).openapi({ref:"TabCommand"}),_A=de.merge(up).merge(C.object({type:C.literal("NEW_TAB"),url:C.string()})).openapi({ref:"NewTabCommand"}),pz=de.merge(C.object({type:C.literal("COOKIE"),value:C.string()})).openapi({ref:"CookieCommand"}),IA=de.merge(C.object({type:C.literal("LOCAL_STORAGE"),key:C.string(),value:C.string()})).openapi({ref:"LocalStorageCommand"}),PA=de.extend({type:C.literal("REQUEST")}).merge(Ta).openapi({ref:"RequestCommand"}),Lc=C.object({status:C.number().optional(),headers:C.record(C.string(),C.string()),json:C.unknown().optional(),text:C.string().optional(),cookies:C.record(C.string(),C.unknown()).array().optional(),request:C.object({url:C.string(),method:C.string(),headers:C.record(C.string(),C.string()),json:C.unknown().optional()})}),MA=de.extend({type:C.literal("GRAPHQL_REQUEST")}).merge(pA).openapi({ref:"GraphQLRequestCommand"}),OA=de.merge(C.object({type:C.literal("SUCCESS"),condition:Oc.optional()})).openapi({ref:"SuccessCommand"}),LA=de.merge(C.object({type:C.literal("FAILURE")})).openapi({ref:"FailureCommand"}),mz=C.object({data:C.union([C.string().describe("location at which to find a jpg - public URL or local"),ba]),width:C.number(),height:C.number()});function NA(t){return t?ba.safeParse(t).success:!1}var Nc=de.merge(Tn).merge(C.object({type:C.literal("VISUAL_DIFF"),threshold:C.number().optional().describe("default 0.1"),target:Tr.optional(),screenshot:mz.optional(),cache:on})).openapi({ref:"VisualDiffCommand"}),DA=de.merge(C.object({type:C.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:po,key:C.string()})).openapi({ref:"RegisterRequestListenerCommand"}),gz=de.merge(C.object({type:C.literal("AWAIT_LISTENER"),key:C.string(),timeout:C.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),kA=de.merge(C.object({type:C.literal("RECORD_REQUESTS"),requestMatcher:po,key:C.string()})).openapi({ref:"RecordRequestsCommand"}),hz=de.merge(C.object({type:C.literal("GET_RECORDED_REQUESTS"),key:C.string()})).openapi({ref:"GetRecordedRequestsCommand"}),UA=de.merge(C.object({type:C.literal("SET_HEADER"),name:C.string(),value:C.string(),requestMatcher:po.optional()})).openapi({ref:"SetHeaderCommand"}),FA=de.merge(C.object({type:C.literal("MOCK_ROUTE"),requestMatcher:po,responseGenerator:C.string().describe("JavaScript code to generate a response"),fetchOriginalResponse:C.boolean().optional().describe("Whether to fetch the real response and pass it to the response generator. If enabled, the original response will be available as `response` in the code."),key:C.string().optional().describe("Key to reference this mock. This only needs to be set if you plan to remove the mock later in the test.")}).openapi({ref:"MockRouteCommandOptions"})),fz=de.merge(C.object({type:C.literal("REMOVE_ROUTE_MOCK"),key:C.string().optional().describe("Key of the mock to remove. If not set, all route mocks will be removed.")}).openapi({ref:"RemoveRouteMockCommandOptions"})),Sz=de.merge(C.object({type:C.literal("OFFLINE_MODE"),enable:C.boolean()})).openapi({ref:"OfflineModeCommand"}),yz=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],aee=[...yz,"DRAG"],bz=C.discriminatedUnion("type",[Fs,Vs,CA,wA,xA,js,mA,Aa,va,Oc,SA,Hs,gA]),Ez=C.discriminatedUnion("type",[...bz.options,Bs]),Tz=C.discriminatedUnion("type",[...Ez.options]),BA=C.discriminatedUnion("type",[...Tz.options,OA]),Hf=C.discriminatedUnion("type",[OA,Fs,Vs,CA,wA,xA,js,mA,Aa,va,Oc,SA,Hs,gA,TA,Gs,vA,_A,hA,AA,bA,yA,IA,Bs,zs,EA,fA,PA,MA,UA,DA,kA,FA]),vz=C.discriminatedUnion("type",[AA,rz,tz,Uf,pz,bA,QB,Gs,iz,yA,TA,IA,zs,_A,vA,EA,fA,PA,MA,ks,Us,dz,Nc,Pc,Mc,hA,DA,gz,kA,hz,UA,FA,fz,Sz]),$s=C.discriminatedUnion("type",[...BA.options,...vz.options]).openapi({ref:"Command"}),pp=C.discriminatedUnion("type",[...BA.options,LA]),see=C.discriminatedUnion("type",[...Hf.options,LA]);function Wo(t){let e;switch(t){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:nt(),type:t};break;case"AUTH_LOAD":{e={id:nt(),type:t,storageState:""};break}case"AI_EXTRACT":e={id:nt(),type:t,goal:""};break;case"DIALOG":e={id:nt(),type:t,action:"DISMISS"};break;case"DRAG":e={id:nt(),type:t,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:nt(),type:t,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:nt(),type:t,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:nt(),type:t,delay:1};break;case"BLUR":e={id:nt(),type:t};break;case"HOVER":case"FOCUS":case"CLICK":e={id:nt(),type:t,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:nt(),type:t,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:nt(),type:t,value:""};break;case"SELECT_OPTION":e={id:nt(),type:t,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:nt(),type:t,url:""};case"TAB":e={id:nt(),type:t,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:nt(),type:t,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:nt(),type:t,url:"",query:""};break;case"LOCAL_STORAGE":e={id:nt(),type:t,key:"",value:""};break;case"JAVASCRIPT":e={id:nt(),type:t,code:""};break;case"AI_ASSERTION":e={id:nt(),type:t,assertion:""};break;case"FILE_UPLOAD":{e={id:nt(),type:t,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:nt(),type:t,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:nt(),type:t,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:nt(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:nt(),type:t,key:""};break}case"RECORD_REQUESTS":{e={id:nt(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:nt(),type:t,key:""};break}case"SET_HEADER":{e={id:nt(),type:t,name:"",value:""};break}case"MOCK_ROUTE":{e={id:nt(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:nt(),type:t};break}case"OFFLINE_MODE":{e={id:nt(),type:t,enable:!0};break}default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return e}var uee={AI_ASSERTION:"AI Check",JAVASCRIPT:"JavaScript",PAGE_CHECK:"Page Check"};import{z as Az}from"zod";var hee=Az.discriminatedUnion("type",[Mc,Uf,Fs,Bs,Pc,Hs,zs,va,Aa,ks,Us,js,Vs,Nc,Gs]);function zA(t){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(t)}import{z as Rz}from"zod";import{z as Ri}from"zod";function Dc(t){return Ri.object({key:Ri.string(),testId:Ri.string().optional(),moduleId:Ri.string().optional(),organizationId:Ri.string(),value:t})}function kc(t){return Dc(t).extend({uniqueKey:Ri.string()})}function mp(t){return Ri.record(Ri.string(),kc(t))}var Ur={type:!0,cache:!0},qo=Rz.discriminatedUnion("type",[Oc.pick(Ur),Mc.pick(Ur),Fs.pick(Ur),Bs.pick(Ur),Gs.pick(Ur),Pc.pick(Ur),Hs.pick(Ur),zs.pick(Ur),va.pick(Ur),Aa.pick(Ur),ks.pick(Ur),Us.pick(Ur),js.pick(Ur),Vs.pick(Ur),Nc.pick(Ur)]),gp=Object.values(ut).filter(t=>qo.options.some(e=>e.shape.type.safeParse(t).success));$s.options.forEach(t=>{if("target"in t.shape&&!gp.includes(t.shape.type.value))throw new Error(`Command ${t.shape.type.value} has a target but no cache`)});function hp(t){return gp.includes(t.type)}var HA=Dc(qo),jA=kc(qo),Aee=mp(qo);import{v4 as ot}from"uuid";import{z as _}from"zod";var VA=Symbol("Let zodToJsonSchema decide on which parser to use");var GA={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"},$A=t=>typeof t=="string"?{...GA,name:t}:{...GA,...t};var WA=t=>{let e=$A(t),r=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,flags:{hasReferencedOpenAiAnyType:!1},currentPath:r,propertyPath:void 0,seen:new Map(Object.entries(e.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...e.basePath,e.definitionPath,n],jsonSchema:void 0}]))}};function jf(t,e,r,n){n?.errorMessages&&r&&(t.errorMessage={...t.errorMessage,[e]:r})}function je(t,e,r,n,o){t[e]=r,jf(t,e,n,o)}var fp=(t,e)=>{let r=0;for(;r<t.length&&r<e.length&&t[r]===e[r];r++);return[(t.length-r).toString(),...e.slice(r)].join("/")};import{ZodFirstPartyTypeKind as Be}from"zod";function wt(t){if(t.target!=="openAi")return{};let e=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?fp(e,t.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as Cz}from"zod";function qA(t,e){let r={type:"array"};return t.type?._def&&t.type?._def?.typeName!==Cz.ZodAny&&(r.items=pe(t.type._def,{...e,currentPath:[...e.currentPath,"items"]})),t.minLength&&je(r,"minItems",t.minLength.value,t.minLength.message,e),t.maxLength&&je(r,"maxItems",t.maxLength.value,t.maxLength.message,e),t.exactLength&&(je(r,"minItems",t.exactLength.value,t.exactLength.message,e),je(r,"maxItems",t.exactLength.value,t.exactLength.message,e)),r}function KA(t,e){let r={type:"integer",format:"int64"};if(!t.checks)return r;for(let n of t.checks)switch(n.kind){case"min":e.target==="jsonSchema7"?n.inclusive?je(r,"minimum",n.value,n.message,e):je(r,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(r.exclusiveMinimum=!0),je(r,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?je(r,"maximum",n.value,n.message,e):je(r,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(r.exclusiveMaximum=!0),je(r,"maximum",n.value,n.message,e));break;case"multipleOf":je(r,"multipleOf",n.value,n.message,e);break}return r}function YA(){return{type:"boolean"}}function Sp(t,e){return pe(t.type._def,e)}var XA=(t,e)=>pe(t.innerType._def,e);function Gf(t,e,r){let n=r??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>Gf(t,e,o))};switch(n){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return wz(t,e)}}var wz=(t,e)=>{let r={type:"integer",format:"unix-time"};if(e.target==="openApi3")return r;for(let n of t.checks)switch(n.kind){case"min":je(r,"minimum",n.value,n.message,e);break;case"max":je(r,"maximum",n.value,n.message,e);break}return r};function JA(t,e){return{...pe(t.innerType._def,e),default:t.defaultValue()}}function ZA(t,e){return e.effectStrategy==="input"?pe(t.schema._def,e):wt(e)}function QA(t){return{type:"string",enum:Array.from(t.values)}}var xz=t=>"type"in t&&t.type==="string"?!1:"allOf"in t;function eR(t,e){let r=[pe(t.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),pe(t.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter(i=>!!i),n=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return r.forEach(i=>{if(xz(i))o.push(...i.allOf),i.unevaluatedProperties===void 0&&(n=void 0);else{let a=i;if("additionalProperties"in i&&i.additionalProperties===!1){let{additionalProperties:s,...c}=i;a=c}else n=void 0;o.push(a)}}),o.length?{allOf:o,...n}:void 0}function tR(t,e){let r=typeof t.value;return r!=="bigint"&&r!=="number"&&r!=="boolean"&&r!=="string"?{type:Array.isArray(t.value)?"array":"object"}:e.target==="openApi3"?{type:r==="bigint"?"integer":r,enum:[t.value]}:{type:r==="bigint"?"integer":r,const:t.value}}import{ZodFirstPartyTypeKind as Uc}from"zod";var Vf,Kn={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>(Vf===void 0&&(Vf=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),Vf),uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};function yp(t,e){let r={type:"string"};if(t.checks)for(let n of t.checks)switch(n.kind){case"min":je(r,"minLength",typeof r.minLength=="number"?Math.max(r.minLength,n.value):n.value,n.message,e);break;case"max":je(r,"maxLength",typeof r.maxLength=="number"?Math.min(r.maxLength,n.value):n.value,n.message,e);break;case"email":switch(e.emailStrategy){case"format:email":Yn(r,"email",n.message,e);break;case"format:idn-email":Yn(r,"idn-email",n.message,e);break;case"pattern:zod":Fr(r,Kn.email,n.message,e);break}break;case"url":Yn(r,"uri",n.message,e);break;case"uuid":Yn(r,"uuid",n.message,e);break;case"regex":Fr(r,n.regex,n.message,e);break;case"cuid":Fr(r,Kn.cuid,n.message,e);break;case"cuid2":Fr(r,Kn.cuid2,n.message,e);break;case"startsWith":Fr(r,RegExp(`^${$f(n.value,e)}`),n.message,e);break;case"endsWith":Fr(r,RegExp(`${$f(n.value,e)}$`),n.message,e);break;case"datetime":Yn(r,"date-time",n.message,e);break;case"date":Yn(r,"date",n.message,e);break;case"time":Yn(r,"time",n.message,e);break;case"duration":Yn(r,"duration",n.message,e);break;case"length":je(r,"minLength",typeof r.minLength=="number"?Math.max(r.minLength,n.value):n.value,n.message,e),je(r,"maxLength",typeof r.maxLength=="number"?Math.min(r.maxLength,n.value):n.value,n.message,e);break;case"includes":{Fr(r,RegExp($f(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&Yn(r,"ipv4",n.message,e),n.version!=="v4"&&Yn(r,"ipv6",n.message,e);break}case"base64url":Fr(r,Kn.base64url,n.message,e);break;case"jwt":Fr(r,Kn.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&Fr(r,Kn.ipv4Cidr,n.message,e),n.version!=="v4"&&Fr(r,Kn.ipv6Cidr,n.message,e);break}case"emoji":Fr(r,Kn.emoji(),n.message,e);break;case"ulid":{Fr(r,Kn.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{Yn(r,"binary",n.message,e);break}case"contentEncoding:base64":{je(r,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{Fr(r,Kn.base64,n.message,e);break}}break}case"nanoid":Fr(r,Kn.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return r}function $f(t,e){return e.patternStrategy==="escape"?Iz(t):t}var _z=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function Iz(t){let e="";for(let r=0;r<t.length;r++)_z.has(t[r])||(e+="\\"),e+=t[r];return e}function Yn(t,e,r,n){t.format||t.anyOf?.some(o=>o.format)?(t.anyOf||(t.anyOf=[]),t.format&&(t.anyOf.push({format:t.format,...t.errorMessage&&n.errorMessages&&{errorMessage:{format:t.errorMessage.format}}}),delete t.format,t.errorMessage&&(delete t.errorMessage.format,Object.keys(t.errorMessage).length===0&&delete t.errorMessage)),t.anyOf.push({format:e,...r&&n.errorMessages&&{errorMessage:{format:r}}})):je(t,"format",e,r,n)}function Fr(t,e,r,n){t.pattern||t.allOf?.some(o=>o.pattern)?(t.allOf||(t.allOf=[]),t.pattern&&(t.allOf.push({pattern:t.pattern,...t.errorMessage&&n.errorMessages&&{errorMessage:{pattern:t.errorMessage.pattern}}}),delete t.pattern,t.errorMessage&&(delete t.errorMessage.pattern,Object.keys(t.errorMessage).length===0&&delete t.errorMessage)),t.allOf.push({pattern:rR(e,n),...r&&n.errorMessages&&{errorMessage:{pattern:r}}})):je(t,"pattern",rR(e,n),r,n)}function rR(t,e){if(!e.applyRegexFlags||!t.flags)return t.source;let r={i:t.flags.includes("i"),m:t.flags.includes("m"),s:t.flags.includes("s")},n=r.i?t.source.toLowerCase():t.source,o="",i=!1,a=!1,s=!1;for(let c=0;c<n.length;c++){if(i){o+=n[c],i=!1;continue}if(r.i){if(a){if(n[c].match(/[a-z]/)){s?(o+=n[c],o+=`${n[c-2]}-${n[c]}`.toUpperCase(),s=!1):n[c+1]==="-"&&n[c+2]?.match(/[a-z]/)?(o+=n[c],s=!0):o+=`${n[c]}${n[c].toUpperCase()}`;continue}}else if(n[c].match(/[a-z]/)){o+=`[${n[c]}${n[c].toUpperCase()}]`;continue}}if(r.m){if(n[c]==="^"){o+=`(^|(?<=[\r
|
|
5
5
|
]))`;continue}else if(n[c]==="$"){o+=`($|(?=[\r
|
|
6
6
|
]))`;continue}}if(r.s&&n[c]==="."){o+=a?`${n[c]}\r
|
|
@@ -8,7 +8,7 @@ var NB=Object.defineProperty;var Mt=(t,e)=>()=>(t&&(e=t(t=0)),e);var DB=(t,e)=>{
|
|
|
8
8
|
]`;continue}o+=n[c],n[c]==="\\"?i=!0:a&&n[c]==="]"?a=!1:!a&&n[c]==="["&&(a=!0)}try{new RegExp(o)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return o}function bp(t,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&t.keyType?._def.typeName===Uc.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((n,o)=>({...n,[o]:pe(t.valueType._def,{...e,currentPath:[...e.currentPath,"properties",o]})??wt(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let r={type:"object",additionalProperties:pe(t.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return r;if(t.keyType?._def.typeName===Uc.ZodString&&t.keyType._def.checks?.length){let{type:n,...o}=yp(t.keyType._def,e);return{...r,propertyNames:o}}else{if(t.keyType?._def.typeName===Uc.ZodEnum)return{...r,propertyNames:{enum:t.keyType._def.values}};if(t.keyType?._def.typeName===Uc.ZodBranded&&t.keyType._def.type._def.typeName===Uc.ZodString&&t.keyType._def.type._def.checks?.length){let{type:n,...o}=Sp(t.keyType._def,e);return{...r,propertyNames:o}}}return r}function nR(t,e){if(e.mapStrategy==="record")return bp(t,e);let r=pe(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||wt(e),n=pe(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||wt(e);return{type:"array",maxItems:125,items:{type:"array",items:[r,n],minItems:2,maxItems:2}}}function oR(t){let e=t.values,n=Object.keys(t.values).filter(i=>typeof e[e[i]]!="number").map(i=>e[i]),o=Array.from(new Set(n.map(i=>typeof i)));return{type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function iR(t){return t.target==="openAi"?void 0:{not:wt({...t,currentPath:[...t.currentPath,"not"]})}}function aR(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var Fc={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function lR(t,e){if(e.target==="openApi3")return sR(t,e);let r=t.options instanceof Map?Array.from(t.options.values()):t.options;if(r.every(n=>n._def.typeName in Fc&&(!n._def.checks||!n._def.checks.length))){let n=r.reduce((o,i)=>{let a=Fc[i._def.typeName];return a&&!o.includes(a)?[...o,a]:o},[]);return{type:n.length>1?n:n[0]}}else if(r.every(n=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=r.reduce((o,i)=>{let a=typeof i._def.value;switch(a){case"string":case"number":case"boolean":return[...o,a];case"bigint":return[...o,"integer"];case"object":if(i._def.value===null)return[...o,"null"];case"symbol":case"undefined":case"function":default:return o}},[]);if(n.length===r.length){let o=n.filter((i,a,s)=>s.indexOf(i)===a);return{type:o.length>1?o:o[0],enum:r.reduce((i,a)=>i.includes(a._def.value)?i:[...i,a._def.value],[])}}}else if(r.every(n=>n._def.typeName==="ZodEnum"))return{type:"string",enum:r.reduce((n,o)=>[...n,...o._def.values.filter(i=>!n.includes(i))],[])};return sR(t,e)}var sR=(t,e)=>{let r=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((n,o)=>pe(n._def,{...e,currentPath:[...e.currentPath,"anyOf",`${o}`]})).filter(n=>!!n&&(!e.strictUnions||typeof n=="object"&&Object.keys(n).length>0));return r.length?{anyOf:r}:void 0};function cR(t,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(t.innerType._def.typeName)&&(!t.innerType._def.checks||!t.innerType._def.checks.length))return e.target==="openApi3"?{type:Fc[t.innerType._def.typeName],nullable:!0}:{type:[Fc[t.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let n=pe(t.innerType._def,{...e,currentPath:[...e.currentPath]});return n&&"$ref"in n?{allOf:[n],nullable:!0}:n&&{...n,nullable:!0}}let r=pe(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return r&&{anyOf:[r,{type:"null"}]}}function uR(t,e){let r={type:"number"};if(!t.checks)return r;for(let n of t.checks)switch(n.kind){case"int":r.type="integer",jf(r,"type",n.message,e);break;case"min":e.target==="jsonSchema7"?n.inclusive?je(r,"minimum",n.value,n.message,e):je(r,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(r.exclusiveMinimum=!0),je(r,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?je(r,"maximum",n.value,n.message,e):je(r,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(r.exclusiveMaximum=!0),je(r,"maximum",n.value,n.message,e));break;case"multipleOf":je(r,"multipleOf",n.value,n.message,e);break}return r}function dR(t,e){let r=e.target==="openAi",n={type:"object",properties:{}},o=[],i=t.shape();for(let s in i){let c=i[s];if(c===void 0||c._def===void 0)continue;let l=Mz(c);l&&r&&(c._def.typeName==="ZodOptional"&&(c=c._def.innerType),c.isNullable()||(c=c.nullable()),l=!1);let u=pe(c._def,{...e,currentPath:[...e.currentPath,"properties",s],propertyPath:[...e.currentPath,"properties",s]});u!==void 0&&(n.properties[s]=u,l||o.push(s))}o.length&&(n.required=o);let a=Pz(t,e);return a!==void 0&&(n.additionalProperties=a),n}function Pz(t,e){if(t.catchall._def.typeName!=="ZodNever")return pe(t.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(t.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function Mz(t){try{return t.isOptional()}catch{return!0}}var pR=(t,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return pe(t.innerType._def,e);let r=pe(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return r?{anyOf:[{not:wt(e)},r]}:wt(e)};var mR=(t,e)=>{if(e.pipeStrategy==="input")return pe(t.in._def,e);if(e.pipeStrategy==="output")return pe(t.out._def,e);let r=pe(t.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),n=pe(t.out._def,{...e,currentPath:[...e.currentPath,"allOf",r?"1":"0"]});return{allOf:[r,n].filter(o=>o!==void 0)}};function gR(t,e){return pe(t.type._def,e)}function hR(t,e){let n={type:"array",uniqueItems:!0,items:pe(t.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return t.minSize&&je(n,"minItems",t.minSize.value,t.minSize.message,e),t.maxSize&&je(n,"maxItems",t.maxSize.value,t.maxSize.message,e),n}function fR(t,e){return t.rest?{type:"array",minItems:t.items.length,items:t.items.map((r,n)=>pe(r._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[]),additionalItems:pe(t.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((r,n)=>pe(r._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[])}}function SR(t){return{not:wt(t)}}function yR(t){return wt(t)}var bR=(t,e)=>pe(t.innerType._def,e);var ER=(t,e,r)=>{switch(e){case Be.ZodString:return yp(t,r);case Be.ZodNumber:return uR(t,r);case Be.ZodObject:return dR(t,r);case Be.ZodBigInt:return KA(t,r);case Be.ZodBoolean:return YA();case Be.ZodDate:return Gf(t,r);case Be.ZodUndefined:return SR(r);case Be.ZodNull:return aR(r);case Be.ZodArray:return qA(t,r);case Be.ZodUnion:case Be.ZodDiscriminatedUnion:return lR(t,r);case Be.ZodIntersection:return eR(t,r);case Be.ZodTuple:return fR(t,r);case Be.ZodRecord:return bp(t,r);case Be.ZodLiteral:return tR(t,r);case Be.ZodEnum:return QA(t);case Be.ZodNativeEnum:return oR(t);case Be.ZodNullable:return cR(t,r);case Be.ZodOptional:return pR(t,r);case Be.ZodMap:return nR(t,r);case Be.ZodSet:return hR(t,r);case Be.ZodLazy:return()=>t.getter()._def;case Be.ZodPromise:return gR(t,r);case Be.ZodNaN:case Be.ZodNever:return iR(r);case Be.ZodEffects:return ZA(t,r);case Be.ZodAny:return wt(r);case Be.ZodUnknown:return yR(r);case Be.ZodDefault:return JA(t,r);case Be.ZodBranded:return Sp(t,r);case Be.ZodReadonly:return bR(t,r);case Be.ZodCatch:return XA(t,r);case Be.ZodPipeline:return mR(t,r);case Be.ZodFunction:case Be.ZodVoid:case Be.ZodSymbol:return;default:return(n=>{})(e)}};function pe(t,e,r=!1){let n=e.seen.get(t);if(e.override){let s=e.override?.(t,e,n,r);if(s!==VA)return s}if(n&&!r){let s=Oz(n,e);if(s!==void 0)return s}let o={def:t,path:e.currentPath,jsonSchema:void 0};e.seen.set(t,o);let i=ER(t,t.typeName,e),a=typeof i=="function"?pe(i(),e):i;if(a&&Lz(t,e,a),e.postProcess){let s=e.postProcess(a,t,e);return o.jsonSchema=a,s}return o.jsonSchema=a,a}var Oz=(t,e)=>{switch(e.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:fp(e.currentPath,t.path)};case"none":case"seen":return t.path.length<e.currentPath.length&&t.path.every((r,n)=>e.currentPath[n]===r)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),wt(e)):e.$refStrategy==="seen"?wt(e):void 0}},Lz=(t,e,r)=>(t.description&&(r.description=t.description,e.markdownDescription&&(r.markdownDescription=t.description)),r);var Bc=(t,e)=>{let r=WA(e),n=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((c,[l,u])=>({...c,[l]:pe(u._def,{...r,currentPath:[...r.basePath,r.definitionPath,l]},!0)??wt(r)}),{}):void 0,o=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,i=pe(t._def,o===void 0?r:{...r,currentPath:[...r.basePath,r.definitionPath,o]},!1)??wt(r),a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(i.title=a),r.flags.hasReferencedOpenAiAnyType&&(n||(n={}),n[r.openAiAnyTypeName]||(n[r.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:r.$refStrategy==="relative"?"1":[...r.basePath,r.definitionPath,r.openAiAnyTypeName].join("/")}}));let s=o===void 0?n?{...i,[r.definitionPath]:n}:i:{$ref:[...r.$refStrategy==="relative"?[]:r.basePath,r.definitionPath,o].join("/"),[r.definitionPath]:{...n,[o]:i}};return r.target==="jsonSchema7"?s.$schema="http://json-schema.org/draft-07/schema#":(r.target==="jsonSchema2019-09"||r.target==="openAi")&&(s.$schema="https://json-schema.org/draft/2019-09/schema#"),r.target==="openAi"&&("anyOf"in s||"oneOf"in s||"allOf"in s||"type"in s&&Array.isArray(s.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),s};import{z as go}from"zod";import{extendZodWithOpenApi as Nz}from"zod-openapi";Nz(go);var Ie=(m=>(m.AI_PROVIDER="AIProviderError",m.USER_INFRA="UserInfrastructureError",m.ACTION_FAILURE="ActionFailureError",m.NO_MATCHING_ELEMENT="NoMatchingElementError",m.ASSERTION_FAILURE="AssertionFailureError",m.CONFIG_ERROR="UserConfigurationError",m.SETUP_FAILURE="SetupFailureError",m.TEARDOWN_FAILURE="TeardownFailureError",m.WEB_AGENT_PLATFORM="InternalWebAgentError",m.UNKNOWN_PLATFORM="InternalPlatformError",m.JOB_TIMEOUT="JobTimeoutError",m.CONCURRENCY_ERROR="ConcurrencyError",m.UNKNOWN="UnknownError",m))(Ie||{});var TR=["JobTimeoutError","UserConfigurationError","UserInfrastructureError"],Ep={ActionFailureError:"Action failure",NoMatchingElementError:"No matching element",AssertionFailureError:"Assertion failure",SetupFailureError:"Setup failure",TeardownFailureError:"Teardown failure",UserInfrastructureError:"Infrastructure failure",UserConfigurationError:"Configuration error",AIProviderError:"AI provider error",InternalWebAgentError:"Momentic AI agent error",JobTimeoutError:"Job timeout",InternalPlatformError:"Unknown Momentic platform error",UnknownError:"Unknown error",ConcurrencyError:"Concurrency error"},Ws={ActionFailureError:"A browser action such as a click or type failed to execute because of the underlying page state is incorrect, suggesting a bug in the application itself.",NoMatchingElementError:"The AI agent failed to find a matching element for the given description.",AssertionFailureError:"An AI check failed for a legitimate reason, such as a missing element, a change in the page structure, or an unexpected state (e.g. loading state).",SetupFailureError:"A setup step failed to execute, preventing the main test from running. This indicates an issue with test preparation, prerequisite steps, or initial state. This can only apply to failures that occur before teardown.",TeardownFailureError:"A teardown step failed to execute after the main test completed. This indicates an issue with cleanup or post-test operations or an uncaught error in the test. This can only apply to failures that occur after setup.",AIProviderError:"The AI provider failed to return a response or returned a malformed response.",UserInfrastructureError:"The user's web application exhibited an infrastructure failure, such as a page load timeout, a 5XX status code, maintenance page, or session crash.",UserConfigurationError:"The error message suggests a user-caused misconfiguration in the test, such as an undefined variable, a missing base URL, an empty test/module input parameter, or an invalid step option",JobTimeoutError:"The test took too long to complete, suggesting a problem with the test itself.",InternalWebAgentError:"The AI testing framework failed to find the correct element or evaluate the assertion correctly, even though the test steps and application state look valid. In other words, the AI agent failed to understand the page.",ConcurrencyError:"The AI test executed correctly, but the application state did not match expectations because another process modified the same resource concurrently. This failure is due to a concurrency error, such as a race condition or deadlock. Commonly caused by tests running simultaneously when using constants rather than random values, or underlying operations that allow for race conditions. For example, in Notion, if multiple tests are running at the same time where one creates a page and enters text to check if it renders, but another test deletes all pages before it can validate the render, this would be a concurrency error.",UnknownError:"An unknown error occurred. Please refer to the failure details in the run for more information or reach out to Momentic Support for assistance.",InternalPlatformError:"An unknown error occurred with the Momentic platform."},Wf=go.object({reason:go.nativeEnum(Ie),previousStepsDescription:go.array(go.string()).optional(),summary:go.string(),rootCause:go.string().optional()}).openapi({ref:"TestResultClassification"}),Tp=go.object({errorMessage:go.string(),errorStack:go.string().optional(),classification:Wf.optional()}).openapi({ref:"TestFailureDetails"});var At=class extends Error{constructor(e,r={}){super(e,r),this.name="ValidationError"}};var zc=class extends Error{constructor(e,r,n,o={}){super(`The ${n} with id ${r} is invalid: ${e}`,o),this.name="InvalidEntityError"}};var Ca=class extends zc{zodIssues;constructor(e,r,n,o,i={}){super(e,r,n,i),this.zodIssues=o,this.name="SchemaValidationError"}};function vR(t){for(let e of Object.values(Ie))if(t.includes(e))return e}var M=class t extends Error{reason;constructor(e,r,n){let o=!1;for(let i of Object.values(Ie))if(r.startsWith(i)){o=!0,e=i;break}if(n?.errOptions?.cause)super(o?r:`${e}: ${r}`,n?.errOptions);else{let i=o?r:`${e}${r?`: ${r}`:""}`;super(i,n?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e}toString(){return this.message}toJSON(){return{message:this.message,stack:this.stack,reason:this.reason}}static fromMessage(e){let r,n=e;for(let o of Object.values(Ie))if(e.startsWith(o)){r=o,e.startsWith(`${o}: `)?n=e.slice(`${o}: `.length):e===o&&(n="");break}return r||(r="UnknownError"),new t(r,n)}},qs=class extends Error{updatedLocatorMemory;constructor(e,r,n={}){super(e,n),this.updatedLocatorMemory=r,this.name="NoElementsFoundUsingAIError"}},vn=class extends Error{decisions;cacheMissReason;constructor(e,r=[],n,o={}){super(e,o),this.decisions=r,this.name="NoElementsFoundUsingCacheError",this.cacheMissReason=n}toString(){return`${this.message}
|
|
9
9
|
Decisions:
|
|
10
10
|
${this.decisions.map(e=>e.toString()).join(`
|
|
11
|
-
`)}`}};function Dz(t){return t instanceof Error?t.message.includes("Timeout")&&t.message.includes("exceeded")&&t.message.includes("waiting for locator"):!1}function kz(t){return!(t instanceof Error)||t.message.includes("locator resolved to visible")?!1:!!(t.message.includes("Timeout")&&t.message.includes("exceeded")&&t.message.includes("body >")||t.message.includes("Element is not attached to the DOM"))}var Ks=class extends Error{constructor(e,r={}){super(e,r),this.name="CacheAttributesDisqualifyElementError"}},Ci=class extends Ks{constructor(e,r={}){super(e,r),this.name="ElementMovedError"}},vp=class extends Ks{constructor(e,r={}){super(e,r),this.name="ZeroOpacityError"}},Hc=class extends Error{constructor(e,r={}){super(e,r),this.name="IsInvalidMomenticIdError"}};function Uz(t){return t instanceof Error?t.message.includes("Could not find attribute data-momentic-id for object"):!1}var qf="Element to be clicked has no bounding box";function Fz(t){return t instanceof Error?t.message.startsWith(qf):!1}function Kf(t){return t instanceof Ci||kz(t)||Bz(t)||zz(t)||Dz(t)||Uz(t)||Fz(t)}function Bz(t){return t instanceof Error?t instanceof Hc?!0:t.message.includes("Timeout")&&t.message.includes("exceeded")&&t.message.includes("waiting for locator")&&t.message.includes("data-momentic-id")&&!t.message.includes("locator resolved")&&!t.message.includes("waiting for element to be"):!1}function zz(t){return t instanceof Error?t.message.includes("Protocol error (DOM.resolveNode): No node with given id found")||t.message.includes("Could not resolve backend node"):!1}var jc=class extends Error{constructor(e,r={}){super(e,r),this.name="InsufficientCacheDataError"}};var Yf={CLICK:"Click on an element on the page.",TYPE:"Focus the element then type the specified text into an input on the page.",PRESS:"Press one or more keyboard keys.",KEY_DOWN:"Hold down one or more keyboard keys.",KEY_UP:"Release one or more keyboard keys.",SELECT_OPTION:"Choose an option from a native <select> component. Never use this command for non <select> elements. Instead, use a series of CLICK commands for those.",NAVIGATE:"Go to the specified fully qualified URL.",SCROLL_UP:"Scroll up.",SCROLL_DOWN:"Scroll down.",GO_BACK:"Go back to the previous page.",HOVER:"Hover over an element.",AI_ASSERTION:"Verify a statement about the current page, retrying until it is true. Only generate an assertion if the goal includes language like 'check that', 'verify that', etc..",WAIT:"Wait a fixed amount of seconds.",DRAG:"Drag an element from one location and drop it onto another element.",JAVASCRIPT:"Execute JavaScript code in NODE or BROWSER environment.",ELEMENT_CHECK:"Perform a manual assertion on a specific element.",PAGE_CHECK:"Perform a manual case sensitive assertion on the page's html.",NEW_TAB:"Open a new browser tab with the specified URL.",WAIT_FOR_URL:"Wait for the URL to match a pattern.",AI_EXTRACT:"Extract data from the page and optionally store it in an environment variable.",COPY:"Copy the specified text value to the browser clipboard.",GO_FORWARD:"Navigate forward to the next page in the browser history (if available). Only use this after having navigated back with GO_BACK. Do not use this to navigate to a different page - use NAVIGATE instead.",LOCAL_STORAGE:"Set or get a value in the browser's localStorage. Use this to store data that persists across page reloads or to read stored values.",MOUSE_DRAG:"Drag the mouse from a starting point (or element) in a specific direction by pixel amounts. Prefer using DRAG (drag and drop between elements) instead unless the user explicitly requests dragging in a direction or by pixels. Use this when dragging needs to move a specific distance rather than to a target element.",PASTE:"Paste the contents of the browser clipboard into the currently focused element. Use this after copying text with COPY or when pasting content that was previously copied.",REFRESH:"Reload the current page. Use this to refresh the page content or retry a failed operation.",REQUEST:"Make an HTTP API request to a specified URL. Use this to interact with REST APIs, send data to a server, or retrieve data from an endpoint. Supports GET, POST, PUT, DELETE, and PATCH methods with custom headers, query parameters, and request body.",GRAPHQL_REQUEST:"Make a GraphQL request to a specified URL. Provide the GraphQL query (or mutation), optional variables JSON, and any required headers. Use this for GraphQL APIs instead of REQUEST.",SET_HEADER:"Set a header for subsequent network requests. Optionally scope it to matching requests.",REGISTER_REQUEST_LISTENER:"Register a request listener for matching requests and save them under a key.",RECORD_REQUESTS:"Record matching requests and store them under a key for later retrieval.",MOCK_ROUTE:"Mock matching network requests with a generated response."};Hf.options.forEach(t=>{let e=t.shape.type.value;if(e!=="SUCCESS"&&!Yf[e])throw new Error(`Command type ${e} is missing a description`)});var AR=_.object({type:_.literal("CLICK"),description:_.string().describe("Description of the element to click in the Current Page. Never click on <select> elements, see SELECT_OPTION."),doubleClick:_.boolean().or(_.null()),rightClick:_.boolean().or(_.null()),waitForDownload:_.boolean().or(_.null()).describe("Wait for the click to trigger a file download and for the download to complete."),downloadTimeoutMs:_.number().int().or(_.null()).describe("Max milliseconds to wait for a download to start and complete when waitForDownload is enabled."),delayMs:_.number().int().or(_.null()).describe("Delay before performing the click, in milliseconds.")}),RR=_.object({type:_.literal("TYPE"),description:_.string().describe("Description of the element to type into, which must be an <input>, <textarea>, or contenteditable element."),text:_.string().describe("The text to enter, truncated to 500 characters. If the PM provided text in the goals, use it exactly without modification."),pressEnter:_.boolean().or(_.null()).describe("Press enter after typing (useful for form submissions)."),clearContent:_.boolean().describe("Clear existing content before typing. Disable to append to the existing text.")}),CR=_.object({type:_.literal("GO_BACK")}),Hz=_.object({type:_.literal("GO_FORWARD")}),jz=_.object({type:_.literal("LOCAL_STORAGE"),key:_.string().describe("The localStorage key to set or get."),value:_.string().describe("The value to store in localStorage. If reading, this can be empty.")}),wR=_.object({type:_.literal("PRESS"),keys:_.array(_.string()).describe('The keys to press. Only use key names supported by the Playwright press method, such as "a", "ArrowLeft", "Meta", "Control", and "Enter". Multiple keys will be pressed together. Do not suggest platform-specific key combinations, such as CTRL+C.')}),xR=_.object({type:_.literal("SELECT_OPTION"),description:_.string().describe("Description of the <select> element to choose from. Only use this command to interact with native HTML <select> elements. You must use CLICK to select from any other HTML element, such as <input>, <div>, or custom elements."),option:_.discriminatedUnion("type",[_.object({type:_.literal("VALUE"),value:_.string()}),_.object({type:_.literal("LABEL"),label:_.string()}),_.object({type:_.literal("INDEX"),index:_.string().describe("Zero-based index of the option within the select.")})]).describe("Which option to select. Choose 1 of 3 strategies for selecting. By value is exactly matching the 'value' attribute. By label is exactly matching the 'label' attribute. By index is using the zero-based index of the option within the select.")}),_R=_.object({type:_.literal("NAVIGATE"),url:_.string().describe("The URL to navigate to. Only navigate to URLs relevant to the user goal.")}),IR=_.object({type:_.literal("SCROLL"),y:_.number().describe("Scroll up or down by the specified pixels. Positive values scroll down.")}),PR=_.object({type:_.literal("WAIT"),timeout:_.number().describe("The number of seconds to wait.")}),MR=_.object({type:_.literal("AI_ASSERTION"),assertion:_.string().describe("The assertion to verify. This should be a statement verifiable based on the current page HTML or screenshot. Be specific enough that the assertion is not ambiguous or open to interpretation. Make sure the assertion aligns with what the user intends to verify."),timeout:_.number().describe("The max amount of seconds to wait for the assertion to be true. Respect user wishes but allow no more than 60. If unspecified, choose 5 for quick checks like form status, 10 for page loads, and 30 for actions that explicitly trigger a long time, like image generation.")}),OR=_.object({type:_.literal("HOVER"),description:_.string().describe("Description of the element to hover over. Prefer elements that have visible bounding boxes according to the screenshot, element class attribute, or child contents.")}),Gz=_.object({type:_.literal("COPY"),value:_.string().describe("The text value to copy to the browser clipboard. This should be the exact text that needs to be copied.")}),Vz=_.object({type:_.literal("PASTE")}),$z=_.object({type:_.literal("REFRESH")}),Wz=_.object({type:_.literal("REQUEST"),url:_.string().describe("The URL to send the HTTP request to. Can be a full URL or relative path."),method:_.enum(["GET","POST","PUT","DELETE","PATCH"]).describe("The HTTP method to use. GET for retrieving data, POST for creating resources, PUT for updating resources, DELETE for removing resources, PATCH for partial updates."),headers:_.record(_.string(),_.string()).or(_.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),params:_.record(_.string(),_.string()).or(_.null()).describe("Optional URL query parameters as key-value pairs. These will be appended to the URL as ?key1=value1&key2=value2."),body:_.string().or(_.null()).describe("Optional request body as a string. For JSON data, stringify the object. Typically used with POST, PUT, or PATCH requests."),timeout:_.number().int().or(_.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),qz=_.object({type:_.literal("GRAPHQL_REQUEST"),url:_.string().describe("The URL of the GraphQL endpoint. Can be a full URL or relative path."),headers:_.record(_.string(),_.string()).or(_.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),query:_.string().describe("The GraphQL query or mutation string. Include any required fields and arguments."),variables:_.string().or(_.null()).describe("Optional JSON string of variables to pass with the GraphQL request."),timeout:_.number().int().or(_.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),Kz=_.object({type:_.literal("SET_HEADER"),name:_.string().describe("The header name to set."),value:_.string().describe("The header value to set."),requestMatcher:po.or(_.null()).describe("Optional request matcher to scope the header to matching requests.")}),Yz=_.object({type:_.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:po.describe("Request matcher to define which requests should be captured."),key:_.string().describe("Identifier for the listener. Used to retrieve recorded data.")}),Xz=_.object({type:_.literal("RECORD_REQUESTS"),requestMatcher:po.describe("Request matcher to define which requests should be recorded."),key:_.string().describe("Identifier for the recording. Used to retrieve recorded data.")}),Jz=_.object({type:_.literal("MOCK_ROUTE"),requestMatcher:po.describe("Request matcher defining which requests should be mocked."),responseGenerator:_.string().describe("JavaScript code to generate the mocked response."),fetchOriginalResponse:_.boolean().or(_.null()).describe("Whether to fetch the real response and pass it to the response generator."),key:_.string().or(_.null()).describe("Optional key to reference this mock for removal.")}),LR=_.object({type:_.literal("DRAG"),fromDescription:_.string().describe("Description of the element to drag. Prefer precise identifiers or text that clearly distinguishes the element."),toDescription:_.string().describe("Description of the element to drop onto. Ensure the drop target is interactable and visible."),steps:_.number().int().positive().or(_.null()).describe("Optional number of intermediate mouse move steps during the drag. Do not use this unless the user tells you to."),hoverSeconds:_.number().positive().or(_.null()).describe("Optional seconds to hover over the destination before releasing the drag.")}),Zz=_.object({type:_.literal("MOUSE_DRAG"),description:_.string().or(_.null()).describe("Optional description of the element to start the drag from. If not provided, starts from current mouse position."),deltaX:_.number().describe("Number of pixels to move horizontally (positive = right, negative = left)."),deltaY:_.number().describe("Number of pixels to move vertically (positive = down, negative = up)."),steps:_.number().int().positive().or(_.null()).describe("Optional number of intermediate mouse move steps during the drag.")}),Qz=_.object({type:_.literal("JAVASCRIPT"),code:_.string().describe("JavaScript code to execute. Defaults to NODE environment unless BROWSER is specified."),environment:_.union([_.literal("NODE"),_.literal("BROWSER")]).or(_.null()).describe("Execution environment. Default is NODE."),timeout:_.number().or(_.null()).describe("Max seconds for the code to complete. Max 60 seconds.")}),e1=_.object({type:_.literal("AI_EXTRACT"),goal:_.string().describe("Description of what data to extract from the page. Be specific about what you want to extract and where to find it."),schema:_.string().or(_.null()).describe("JSON schema defining the expected structure of the extracted data."),envKey:_.string().or(_.null()).describe("Environment variable name to store the extracted result in. If provided, the result will be stored and can be referenced later."),iframeUrl:_.string().or(_.null()).describe("URL or URL regex for the iframe to extract data from.")}),t1=_.object({type:_.literal("ELEMENT_CHECK"),description:_.string().describe("Description of the element to check."),assertionType:_.enum(["EXISTS","VISIBLE","CONTENT_CONTAINS","CONTENT_EQUALS"]).describe("The type of assertion. EXISTS checks if element exists, VISIBLE checks if visible, CONTENT_CONTAINS checks if text contains value, CONTENT_EQUALS checks if text equals value."),value:_.string().or(_.null()).describe("The value to check against (required for CONTENT assertions)."),negated:_.boolean().or(_.null()).describe("If true, asserts the opposite (e.g., does NOT exist)."),timeout:_.number().or(_.null()).describe("Max seconds to wait for the assertion to be true.")}),r1=_.object({type:_.literal("PAGE_CHECK"),value:_.string().describe("The text content to check for on the page."),negated:_.boolean().or(_.null()).describe("If true, checks that the content is NOT present."),timeout:_.number().or(_.null()).describe("Max seconds to wait for the assertion to be true.")}),n1=_.object({type:_.literal("NEW_TAB"),url:_.string().describe("The URL to open in the new tab.")}),o1=_.object({type:_.literal("WAIT_FOR_URL"),matcher:_.discriminatedUnion("type",[_.object({type:_.literal("SUBSTRING"),url:_.string()}),_.object({type:_.literal("GLOB"),glob:_.string()}),_.object({type:_.literal("REGEX"),regex:_.string()}),_.object({type:_.literal("DOMAIN"),domain:_.string()})]).describe("How to match the URL."),caseInsensitive:_.boolean().or(_.null()),negated:_.boolean().or(_.null()).describe("Wait for the URL to NOT match instead."),timeout:_.number().or(_.null()).describe("Max seconds to wait for the URL.")}),Xf=_.object({type:_.literal("SUCCESS")}),Jf=_.object({type:_.literal("FAILURE")}),NR=_.discriminatedUnion("type",[AR,RR,wR,xR,_R,IR,PR,MR,OR,CR]),i1=_.discriminatedUnion("type",[...NR.options,LR]),wa=_.discriminatedUnion("type",[AR,RR,wR,xR,_R,IR,PR,MR,OR,CR,LR,Qz,t1,r1,n1,o1,e1,Gz,Hz,jz,Zz,Vz,$z,Wz,qz,Kz,Yz,Xz,Jz]),Nne=Bc(wa),a1=_.discriminatedUnion("type",[...wa.options,Xf,Jf]),Dne=Bc(_.discriminatedUnion("type",[...NR.options,Xf,Jf])),kne=Bc(_.discriminatedUnion("type",[...i1.options,Xf,Jf])),Une=_.object({command:_.unknown(),thoughts:_.string()});var Ys=t=>{let e=a1.parse(t);switch(e.type){case"CLICK":return{id:ot(),type:"CLICK",doubleClick:e.doubleClick??void 0,rightClick:e.rightClick??void 0,waitForDownload:e.waitForDownload??void 0,downloadTimeoutMs:e.waitForDownload===!0?e.downloadTimeoutMs??void 0:void 0,delayMs:e.delayMs??void 0,target:{type:"description",elementDescriptor:e.description}};case"TYPE":return{id:ot(),type:"TYPE",value:e.text,target:{type:"description",elementDescriptor:e.description},pressEnter:e.pressEnter??void 0,clearContent:e.clearContent};case"PRESS":return{id:ot(),type:"PRESS",value:e.keys.join("+")};case"SELECT_OPTION":return{id:ot(),type:"SELECT_OPTION",target:{type:"description",elementDescriptor:`<select> element matching description: ${e.description}`},choice:Bf.parse(e.option)};case"NAVIGATE":return{id:ot(),type:"NAVIGATE",url:e.url};case"SCROLL":return e.y>0?{id:ot(),type:"SCROLL_DOWN",deltaY:e.y}:{id:ot(),type:"SCROLL_UP",deltaY:-e.y};case"WAIT":return{id:ot(),type:"WAIT",delay:e.timeout};case"AI_ASSERTION":return{id:ot(),type:"AI_ASSERTION",assertion:e.assertion,timeout:e.timeout};case"HOVER":return{id:ot(),type:"HOVER",target:{type:"description",elementDescriptor:e.description}};case"DRAG":return{id:ot(),type:"DRAG",fromTarget:{type:"description",elementDescriptor:e.fromDescription},toTarget:{type:"description",elementDescriptor:e.toDescription},steps:e.steps??void 0,hoverSeconds:e.hoverSeconds??void 0};case"JAVASCRIPT":return{id:ot(),type:"JAVASCRIPT",code:e.code,environment:e.environment??void 0,timeout:e.timeout??void 0};case"AI_EXTRACT":return{id:ot(),type:"AI_EXTRACT",goal:e.goal,schema:e.schema??void 0,envKey:e.envKey??void 0,iframeUrl:e.iframeUrl??void 0};case"COPY":return{id:ot(),type:"COPY",value:e.value};case"PASTE":return{id:ot(),type:"PASTE"};case"REFRESH":return{id:ot(),type:"REFRESH"};case"GO_FORWARD":return{id:ot(),type:"GO_FORWARD"};case"LOCAL_STORAGE":return{id:ot(),type:"LOCAL_STORAGE",key:e.key,value:e.value};case"MOUSE_DRAG":return{id:ot(),type:"MOUSE_DRAG",target:e.description?{type:"description",elementDescriptor:e.description}:void 0,deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),steps:e.steps??void 0};case"ELEMENT_CHECK":{let r;switch(e.assertionType){case"EXISTS":r={type:"ELEMENT_EXISTENCE",condition:"EXISTS",negated:e.negated??void 0};break;case"VISIBLE":r={type:"ELEMENT_EXISTENCE",condition:"VISIBLE",negated:e.negated??void 0};break;case"CONTENT_CONTAINS":r={type:"ELEMENT_CONTENT",operation:"CONTAINS",value:e.value??"",negated:e.negated??void 0};break;case"CONTENT_EQUALS":r={type:"ELEMENT_CONTENT",operation:"EQUALS",value:e.value??"",negated:e.negated??void 0};break;default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.assertionType)}return{id:ot(),type:"ELEMENT_CHECK",target:{type:"description",elementDescriptor:e.description},assertion:r,timeout:e.timeout??void 0}}case"PAGE_CHECK":return{id:ot(),type:"PAGE_CHECK",assertion:{type:"CONTENT",value:e.value??void 0,negated:e.negated??void 0},timeout:e.timeout??void 0};case"NEW_TAB":return{id:ot(),type:"NEW_TAB",url:e.url};case"WAIT_FOR_URL":return{id:ot(),type:"WAIT_FOR_URL",matcher:e.matcher,caseInsensitive:e.caseInsensitive??void 0,negated:e.negated??void 0,timeout:e.timeout??void 0};case"GO_BACK":return{id:ot(),type:"GO_BACK"};case"REQUEST":return{id:ot(),type:"REQUEST",url:e.url,method:e.method,headers:e.headers??void 0,params:e.params??void 0,body:e.body?{type:"json",content:e.body}:void 0,timeout:e.timeout??void 0};case"GRAPHQL_REQUEST":return{id:ot(),type:"GRAPHQL_REQUEST",url:e.url,headers:e.headers??void 0,query:e.query,variables:e.variables??void 0,timeout:e.timeout??void 0};case"SET_HEADER":return{id:ot(),type:"SET_HEADER",name:e.name,value:e.value,requestMatcher:e.requestMatcher??void 0};case"REGISTER_REQUEST_LISTENER":return{id:ot(),type:"REGISTER_REQUEST_LISTENER",requestMatcher:e.requestMatcher,key:e.key};case"RECORD_REQUESTS":return{id:ot(),type:"RECORD_REQUESTS",requestMatcher:e.requestMatcher,key:e.key};case"MOCK_ROUTE":return{id:ot(),type:"MOCK_ROUTE",requestMatcher:e.requestMatcher,responseGenerator:e.responseGenerator,fetchOriginalResponse:e.fetchOriginalResponse??void 0,key:e.key??void 0};case"SUCCESS":case"FAILURE":return{id:ot(),type:e.type};default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}},Gc=_.object({type:_.literal("PRESET_ACTION"),command:wa}),Rp=_.object({type:_.literal("AI_ACTION_DYNAMIC"),text:_.string().describe("The goal description for the AI action. Supports handlebars templates (ex: {{env.PASSWORD}})")});import{z as Zf}from"zod";import{extendZodWithOpenApi as c1}from"zod-openapi";import{z as DR}from"zod";import{extendZodWithOpenApi as s1}from"zod-openapi";import{z as wi}from"zod";var An=wi.object({index:wi.number().optional().describe("global index within a test (in-order traversal)"),id:wi.string(),skipped:wi.boolean().optional(),comment:wi.string().optional(),envKey:wi.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:wi.boolean().optional(),retries:wi.number().optional()});s1(DR);var l1=An.extend({type:DR.literal("PRESET_ACTION")}),an=l1.extend({command:$s}).openapi({ref:"PresetAction"});c1(Zf);var xa=An.extend({type:Zf.literal("AI_ACTION"),text:Zf.string(),steps:an.array().optional()}).openapi({ref:"AIAction"});import{z as Br}from"zod";import{z as Vc}from"zod";import{extendZodWithOpenApi as u1}from"zod-openapi";u1(Vc);var Qf=(r=>(r.V2="2",r.V3="3",r))(Qf||{}),d1=Vc.nativeEnum(Qf),Xs=An.extend({type:Vc.literal("AI_ACTION_DYNAMIC"),text:Vc.string(),retries:Vc.number().optional(),version:d1.optional()}).openapi({ref:"AIActionDynamic"});import{z as kR}from"zod";var eS=An.extend({type:kR.literal("CONDITIONAL"),skipped:kR.boolean().optional()});import{z as Ge}from"zod";var p1=Ge.object({cacheKey:Ge.string(),cacheExpiryMs:Ge.number()}),tS=An.extend({id:Ge.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:Ge.record(Ge.string()).optional(),cacheConfig:p1.optional()}),Xn=tS.extend({type:Ge.literal("MODULE"),moduleId:Ge.string().uuid()}),m1=Ge.union([Xn.pick({type:!0,moduleId:!0}),Ge.record(Ge.unknown())]),g1=Ge.object({type:Ge.literal("URL_REGEX"),regex:Ge.string()}),h1=Ge.object({type:Ge.literal("PAGE_CHECK"),substring:Ge.string()}),rS=Ge.object({cacheInvalidation:Ge.discriminatedUnion("type",[h1,g1]).optional()}),Xr=Ge.object({moduleId:Ge.string().uuid(),name:Ge.string(),description:Ge.string().nullish(),enabled:Ge.boolean().nullish(),parameters:Ge.string().array().nullish(),defaultParameters:Ge.record(Ge.string(),Ge.string()).nullish(),parameterEnums:Ge.record(Ge.string(),Ge.string().array()).nullish(),defaultCacheKey:Ge.string().nullish(),defaultCacheTtl:Ge.number().nullish(),defaultCacheAllInvocations:Ge.boolean().nullish(),autoAuth:Ge.boolean().nullish(),advanced:rS.nullish()});var nS=t=>t.type==="RESOLVED_MODULE",oS=t=>t.type==="AI_ACTION"||t.type==="AI_ACTION_DYNAMIC"||t.type==="CONDITIONAL"||t.type==="PRESET_ACTION";import{z as Rn}from"zod";var iS=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(iS||{});var f1=Rn.discriminatedUnion("type",[Rn.object({type:Rn.literal("NAVIGATE_URL"),url:Rn.string().url()}),Rn.object({type:Rn.literal("GO_TO_SECTION_START")})]),S1=Rn.object({trigger:Rn.nativeEnum(iS).optional(),attempts:Rn.number().int().optional(),restartBehavior:f1}),$c=An.extend({type:Rn.literal("SECTION"),description:Rn.string().describe("user provided goal of what the section should accomplish"),plan:Rn.string().array().optional(),autohealingConfig:S1.optional()});var UR=Xr.merge(tS).extend({type:Br.literal("RESOLVED_MODULE"),steps:Br.lazy(()=>kt.array())}),aS=Xr.extend({steps:Br.lazy(()=>kt.array())}),sS=$c.extend({steps:Br.lazy(()=>Et.array())}),y1=$c.extend({steps:Br.lazy(()=>kt.array())}),_a=eS.extend({blocks:Br.object({assertion:Br.lazy(()=>an),steps:Br.lazy(()=>Et.array())}).array(),elseSteps:Br.lazy(()=>Et.array().optional())}),b1=eS.extend({blocks:Br.object({assertion:Br.lazy(()=>an),steps:Br.lazy(()=>kt.array())}).array(),elseSteps:Br.lazy(()=>kt.array().optional())}),Et=Br.discriminatedUnion("type",[an,xa,Xs,Xn,_a,sS]),kt=Br.discriminatedUnion("type",[an,xa,Xs,UR,b1,y1]);import{z as Cn}from"zod";var E1=Cn.object({steps:Et.array(),beforeSteps:Et.array().nullish(),afterSteps:Et.array().nullish()}),xi=Cn.object({steps:kt.array(),beforeSteps:kt.array().nullish(),afterSteps:kt.array().nullish()}),Ia=Cn.object({steps:Cn.record(Cn.string(),Cn.unknown()).array(),beforeSteps:Cn.record(Cn.string(),Cn.unknown()).array().nullish(),afterSteps:Cn.record(Cn.string(),Cn.unknown()).array().nullish()});var Qe="1.0.22",lS="0.0.3";import{z as rr}from"zod";import{z as Pa}from"zod";var T1=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,st=t=>{let e=t.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var Ko=Pa.string().min(1).max(255).superRefine((t,e)=>{try{_i(t)}catch(r){return e.addIssue({code:Pa.ZodIssueCode.custom,message:r.message,fatal:!0}),Pa.NEVER}});function _i(t){if(t=t.toLowerCase().trim(),t.length===0||t.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(t))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(t.endsWith("-")||t.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(t.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(t))throw new Error(`"${t}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(t)||/^\s|\s$/.test(t))throw new Error("Name cannot start or end with a space or dot.");if(t.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(t==="none")throw new Error("Name cannot be 'none'.");if(t.match(T1))throw new Error("Name cannot be a UUID. Please choose a different name.")}var Cp=Pa.preprocess(t=>t===null?"":t,Pa.union([Pa.string().url(),Pa.literal("")])).optional();var Ma=rr.enum(["setup","teardown","main"]).describe("Test section to modify: 'setup' corresponds to beforeSteps (steps that run before the test), 'teardown' corresponds to afterSteps (steps that run after the test), 'main' is synonymous with steps (the main test steps)"),cS=["AI_EXTRACT","JAVASCRIPT","REQUEST","GRAPHQL_REQUEST","AUTH_SAVE","COPY"],Ii=rr.object({id:rr.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:Ko.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:rr.string().optional().describe("The path of the entity to resolve.")}).describe("A selector for a single entity. Exactly one of id, name, or path must be provided. Id is recommended.").refine(t=>[t.id,t.name,t.path].filter(Boolean).length===1,"Exactly one of id, name, or path must be provided."),v1=rr.object({selector:Ii,inputs:rr.record(rr.string()).or(rr.null())}),wp=rr.object({type:rr.literal("PRESET_ACTION"),action:wa,envKey:rr.string().or(rr.null()).describe(`key in the environment to save the result of this step to. Only use this for ${cS.join(" or ")} steps.`)}),xp=rr.object({type:rr.literal("MODULE"),module:v1}),uS=rr.object({type:rr.literal("AI_ACTION_DYNAMIC"),text:rr.string().describe("The goal description for the AI action. Supports handlebars templates like {{env.VARIABLE_NAME}}.")}),FR=rr.discriminatedUnion("type",[wp,xp,uS]);function BR(t,e){let r=e.parameters??[],n=e.defaultParameters??{},o=e.parameterEnums??{},i=t??{},a=new Set([...r,...Object.keys(n)]),s=Object.keys(i).filter(u=>!a.has(u));if(s.length>0){let u=a.size>0?Array.from(a).join(", "):"none";throw new Error(`Module "${e.name}" received unknown parameters: ${s.join(", ")}. Valid parameters are: ${u}`)}let l=r.filter(u=>!(u in n)).filter(u=>!(u in i));if(l.length>0)throw new Error(`Module "${e.name}" is missing required parameters: ${l.join(", ")}. Please call momentic_module_get to inspect the module's parameter requirements.`);for(let[u,d]of Object.entries(i))if(u in o){let p=o[u];if(p&&!p.includes(d))throw new Error(`Module "${e.name}" parameter "${u}" must be one of: ${p.join(", ")}. Received: "${d}"`)}}var zR=D.object({phrase:D.string()}),dS=D.object({thoughts:D.string().optional(),result:D.union([D.literal("NOT_FOUND"),D.string(),D.number(),D.array(D.unknown()),D.record(D.unknown(),D.unknown()),D.unknown()])}),Mie=D.object({text:D.string()}),A1=D.boolean().or(D.nativeEnum(Yr)).transform(t=>!(!t||t==="irrelevant")),HR=D.object({attributes:D.array(D.string()).nullish(),text:A1.nullish(),position:D.nativeEnum(Yr).nullish(),shape:D.nativeEnum(Yr).nullish()}),R1=D.object({id:D.number().int(),requirements:HR}),C1=R1.array(),_p=D.object({thoughts:D.string(),review:D.string().optional(),id:D.number().int(),updatedMemory:xc.optional(),requirements:HR.nullish().transform(t=>{if(t!==null)return t}),additionalElements:C1.nullish().transform(t=>{if(t!==null)return t})});var jR=(m=>(m.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",m.FEW_WORDS="FEW_WORDS",m.STYLE_TAG="STYLE_TAG",m.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",m.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",m.NONE="NONE",m.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",m.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",m.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",m.PREFER_ASSERTION="PREFER_ASSERTION",m.HTML_ELEMENTS="HTML_ELEMENTS",m.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",m.NEEDS_DATE_VARIABLE="NEEDS_DATE_VARIABLE",m))(jR||{}),pS=(o=>(o.NONE="NONE",o.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",o.COPILOT_MISUSE="COPILOT_MISUSE",o.IRRELEVANT_MESSAGE="IRRELEVANT_MESSAGE",o))(pS||{});var GR=D.object({thoughts:D.string(),category:D.nativeEnum(jR)}),VR=D.object({thoughts:D.string(),category:D.nativeEnum(pS)}),$R=D.object({anyUntestedSteps:D.boolean().describe("True if any steps (especially new/edited) were not fully run (preview + add) or if their immediately following step, if any, was not run."),possibleErrors:D.object({error:D.string(),solutionFound:D.object({description:D.string(),passedSuccessfully:D.boolean().describe("Whether the solution passed successfully")})}).array().describe("Information about any errors we encountered and how we solved them"),safeToContinue:D.boolean().describe("Whether it is safe to continue or if we are stuck and need intervention"),finalReport:D.string().describe("A final summary report of the session, are we stuck, can we go forward, do we need help, or are we good to go?")}),WR=D.object({summary:D.string().describe("Single large block of text summary of the full chat thread; high-signal only."),errorsRanInto:D.array(D.object({error:D.string(),workAround:D.string()})).default([]).describe("List of encountered errors and mitigations."),untestedSteps:D.array(D.string()).default([]).describe("Steps added/discussed but not validated.")}),w1=D.discriminatedUnion("op",[D.object({op:D.literal("replace"),path:D.string(),value:D.string()}),D.object({op:D.literal("add"),path:D.string(),value:D.string()}),D.object({op:D.literal("remove"),path:D.string()})]),Oie=D.object({thoughts:D.string(),patches:w1.array()}),x1=[D.literal("add"),D.literal("replace"),D.literal("remove")],_1=D.object({op:D.union(x1),path:D.string(),value:kt.optional()}),qR=D.object({patches:_1.array(),thoughts:D.string()}),mS=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(mS||{}),KR=D.object({thoughts:D.string(),scenario:D.nativeEnum(mS),instructions:D.string().nullish()}),YR=D.object({reasoning:D.string(),scenario:D.string(),patch:D.null().optional()}),Lie=D.object({thoughts:D.string(),evaluation:D.number().min(0).max(10)}),Nie=D.object({observations:D.string(),reasoning:D.string(),command:pp});var gS=D.object({summary:D.string(),reasoning:D.string(),evaluation:D.discriminatedUnion("type",[D.object({type:D.literal("DONE")}),D.object({type:D.literal("RIGHT_TRACK")}),D.object({type:D.literal("WRONG_TRACK"),feedback:D.string()}),D.object({type:D.literal("IMPOSSIBLE")})])}),I1=D.object({startId:D.number().int(),endId:D.number().int()}),XR=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))(XR||{}),JR=D.object({categoryThoughts:D.string(),category:D.nativeEnum(XR),relevantSections:I1.array()}),Yo=D.boolean().nullish().transform(t=>t??!1),ZR=D.object({thoughts:D.string().optional(),isPageReady:Yo,descriptionLabels:D.object({usesTextContent:Yo,usesAppearance:Yo,usesPosition:Yo,usesRelativeElements:Yo,usesSingleQuotes:Yo,isAmbiguous:Yo,targetDoesNotExist:Yo,usesIcon:Yo}).optional()});import{z as U}from"zod";import*as Oe from"zod";var Hie=Oe.object({thoughts:Oe.string().optional().describe("only provided if a description was provided"),target:Ti.optional().describe("only provided if a description was provided"),pageState:Oe.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:Oe.object({label:Oe.string(),value:Oe.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:Oe.object({data:Oe.string().or(ba),height:Oe.number().int(),width:Oe.number().int()}).optional().describe("only provided if returnScreenshot is true")}),QR=Oe.union([Oe.literal("ELEMENT_CHECK"),Oe.literal("NEGATED_CHECK"),Oe.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),Oe.literal("SELECT_OPTION"),Oe.literal("TYPE")]);function Oa(t){if(!("useSelector"in t&&t.useSelector)){if(t.type==="SELECT_OPTION")return"SELECT_OPTION";if(t.type==="TYPE")return"TYPE";if(t.type==="ELEMENT_CHECK"&&t.assertion.type==="ELEMENT_EXISTENCE"&&t.assertion.condition==="EXISTS"&&t.assertion.negated)return"NEGATED_CHECK";if(t.type==="ELEMENT_CHECK"&&t.assertion.type==="ELEMENT_EXISTENCE"&&t.assertion.condition==="VISIBLE"&&t.assertion.negated)return"NEGATED_ELEMENT_VISIBLE_CHECK";if(t.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Wc=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(Wc||{}),Js=Oe.object({matched:Oe.boolean(),reason:Oe.string().optional().describe("Human understandable description"),logs:Oe.string().array().optional().describe("Logs for debugging")}),P1=Js.extend({type:Oe.literal("USER_SELECTOR")}),M1=Js.extend({type:Oe.literal("CSS_SELECTOR"),selectors:Oe.string().array()}),O1=Js.extend({type:Oe.literal("HYBRID_SELECTOR")}),L1=Js.extend({type:Oe.literal("HTML_DISTANCE"),distance:Oe.number().optional(),closestElement:Oe.string().optional(),savedElement:Oe.string().optional()}),N1=Js.extend({type:Oe.literal("TEMPLATE_MATCHING")}),D1=Js.extend({type:Oe.literal("AUTO_FRAME"),logs:Oe.string().array().optional()}),eC=Oe.discriminatedUnion("type",[P1,M1,O1,L1,N1,D1]);import{z as Yc}from"zod";import{z as Y1}from"zod";import*as ne from"zod";import{extendZodWithOpenApi as H1}from"zod-openapi";import{cloneDeep as qc}from"lodash-es";import sC from"truncate-json";import*as Da from"zod";import{extendZodWithOpenApi as F1}from"zod-openapi";import{z as Rr}from"zod";import{z as ve}from"zod";import{z as hS}from"zod";var ho=(o=>(o.CHROMIUM="Chromium",o.GOOGLE_CHROME="Google Chrome",o.CHROME_FOR_TESTING="Chrome for Testing",o.ORG_DEFAULT="Org Default",o))(ho||{});var Ip=hS.object({width:hS.number().min(200).max(1e4),height:hS.number().min(200).max(1e4)}),tC={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},Vie=Object.keys(tC);var Ar=tC["Desktop Large"],Pi="en-us",Mi="America/Los_Angeles",k1="Chromium",Oi={latitude:37.7749,longitude:-122.4194};function Pp({browserType:t,orgDefaultBrowserType:e}){return t==="Org Default"&&e?e:t??k1}var Mp=(a=>(a.ClipboardRead="clipboard-read",a.ClipboardWrite="clipboard-write",a.Microphone="microphone",a.Camera="camera",a.Geolocation="geolocation",a.LocalNetworkAccess="local-network-access",a))(Mp||{});var fS=ve.object({autoFollowNewTabs:ve.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:ve.union([ve.boolean(),ve.literal("inputs-only")]).optional(),ignoreHrefForCaching:ve.boolean().optional(),disableSecondaryCacheResolution:ve.boolean().optional(),hybridSelectorMode:ve.enum(["off","test","prefer"]).optional(),globalLocatorRedirect:ve.union([ve.boolean(),ve.literal("always")]).optional(),visualActions:ve.boolean().optional(),autoExpandIframes:ve.boolean().optional(),disableHtmlSnapshots:ve.boolean().optional(),defaultBrowserType:ve.nativeEnum(ho).optional(),importantAttributes:ve.string().array().optional(),importantClasses:ve.string().array().optional(),importantStyles:ve.string().array().optional()});var rC=1e4,nC=6e4,U1=ve.object({server:ve.string(),username:ve.string().optional(),password:ve.string().optional()}),La=fS.extend({pageLoadTimeoutMs:ve.number().optional().refine(t=>t===void 0||t<=nC&&t>=-1,{message:`Page load timeout must be between 0 and ${nC/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:ve.number().optional().refine(t=>t===void 0||t<=rC&&t>=-1,{message:`Smart waiting timeout must be between 0 and ${rC/1e3} seconds`}),localChromeExtensionPaths:ve.string().array().optional(),extraHeaders:ve.record(ve.string(),ve.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:ve.record(ve.string(),ve.record(ve.string(),ve.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:ve.string().optional(),disableGpu:ve.boolean().optional(),disableBrowserMonitoring:ve.boolean().optional().describe("Disable console logs and network request recording, which power the console and network tab in the run viewer"),disableConsoleLogs:ve.boolean().optional().describe("Disable console log recording in the run viewer."),disableNetworkLogs:ve.boolean().optional().describe("Disable network request recording in the run viewer."),bustCacheOnBoundingBoxChange:ve.boolean().optional().describe("This setting is deprecated. Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:ve.boolean().optional().describe("Allow fetching the partial accessibility tree if fetching the full tree takes too long."),ignoreHttpsErrors:ve.boolean().optional().describe("Ignore HTTPS errors, such as self-signed certificates and certificate errors. This can be useful for testing sites that use self-signed certificates or certificate errors."),proxy:U1.optional().describe("HTTP proxy server to use for the entire browser. This can dramatically increase network latency."),disableFullStory:ve.boolean().optional().describe("Disable FullStory, a third-party analytics tool that can significantly impact browser performance. This can be useful for testing sites that use FullStory."),grantedPermissions:ve.nativeEnum(Mp).array().optional().describe("List of permissions to grant to sites. If not provided, all permissions are granted.")});var nr="BASE_URL",Op="CURRENT_URL",Na="ENV_NAME",Zs="TEST_NAME",Qie={[nr]:"https://www.google.com"},oC=Rr.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),iC=Rr.object({name:Rr.string(),variables:Rr.record(Rr.string().describe("variable name"),Rr.string().describe("variable value"))}),aC=Rr.object({name:Rr.string(),variables:Rr.record(Rr.string().describe("variable name"),Rr.unknown().describe("variable value")),browser:La.optional()});var eae=Rr.object({name:Rr.string(),variables:Rr.record(Rr.string().describe("variable name"),Rr.unknown().describe("variable value"))});F1(Da);var SS=Da.object({env:Da.record(Da.unknown())}).openapi({ref:"TestContextSnapshot"}),B1="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",z1=[nr,Na,Zs],lC=[Op,nr,Na,Zs],zr=class t{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,r=void 0,n={}){return new t({baseUrl:"about:blank",currentUrl:"about:blank",testName:e,envName:r,variablesFromEnvironment:n})}static fromSnapshot({snapshot:e,environmentVariables:r}){let n=e.env[nr]??"about:blank",o=e.env[Op]??"about:blank",i=e.env[Na],a=e.env[Zs],s={};for(let[l,u]of Object.entries(e.env))lC.includes(l)||(r??{})[l]===void 0&&(s[l]=u);return new t({baseUrl:n,currentUrl:o,dynamicVariables:s,envName:i,testName:a,variablesFromEnvironment:r??{}})}setEnvVariables(e){let r=qc(e);this.env=Object.assign(this.env,r)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,r){this.varsFromMomenticEnvironment[e]=r}getVariable(e){return this.env[e]}setVariable(e,r){z1.includes(e)||(this.env[e]=r)}getEnvName(){return this.env[Na]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return qc(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([n,o])=>lC.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,B1]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=sC(JSON.stringify(o),5e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:r}=sC(JSON.stringify(e.env),25e3);try{e.env=JSON.parse(r)}catch{e.env={}}return e}setCurrentUrl(e){this.env[Op]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=qc(e.variablesFromEnvironment),this.setMomenticSystemVariable(nr,e.baseUrl),e.envName&&this.setMomenticSystemVariable(Na,e.envName),e.testName&&this.setMomenticSystemVariable(Zs,e.testName)}getDynamicVariablesCopy(){return qc(this.env)}getVariablesFromEnvironmentCopy(){return qc(this.varsFromMomenticEnvironment)}};var Ye=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Ye||{}),Lp=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(Lp||{});H1(ne);var yS=ne.object({beforeUrl:ne.string().optional(),afterUrl:ne.string().optional(),message:ne.string().optional(),beforeSnapshot:ne.string().optional(),afterSnapshot:ne.string().optional(),startedAt:ne.coerce.date(),finishedAt:ne.coerce.date()}),j1=yS.extend({viewport:ne.object({height:ne.number(),width:ne.number()}).nullish(),status:ne.nativeEnum(Lp),message:ne.string().optional(),elementInteracted:ne.string().optional()}),ka=yS.extend({status:ne.nativeEnum(Ye),message:ne.string().optional(),data:ne.unknown().optional(),beforeTestContext:SS.optional(),afterTestContext:SS.optional(),failureReason:ne.nativeEnum(Ie).optional(),details:ne.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information."),trace:ne.unknown().optional().describe("Web interaction trace from step execution (WebSectionSpan)")}).openapi({ref:"StepResultMetadata"}),bS=(r=>(r.NOT_ELIGIBLE="NOT_ELIGIBLE",r.ATTEMPTED="ATTEMPTED",r))(bS||{}),Np=ka.merge(an).extend({results:j1.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:ne.lazy(()=>Jt.array()).optional(),failureRecoveryStatus:ne.object({type:ne.nativeEnum(bS),message:ne.string()}).optional()}),G1=ka.merge(xa).extend({results:ne.lazy(()=>Np.array()),previousAttempts:ne.lazy(()=>Jt.array()).optional()}),V1=ka.merge(Xs).extend({results:ne.lazy(()=>Np.array()),previousAttempts:ne.lazy(()=>Jt.array()).optional()}),$1=ka.merge(Xn).extend({moduleName:ne.string().optional(),results:ne.lazy(()=>Jt.array()),previousAttempts:ne.lazy(()=>Jt.array()).optional()}),W1=ka.merge(_a).extend({assertionResult:Np.optional(),results:ne.lazy(()=>Jt.array()).describe("results for the block actually executed"),previousAttempts:ne.lazy(()=>Jt.array()).optional()}),q1=ka.merge($c).extend({results:ne.lazy(()=>Jt.array()),healingAttempts:ne.lazy(()=>Jt.array().array()).optional(),previousAttempts:ne.lazy(()=>Jt.array()).optional()}),Jt=ne.discriminatedUnion("type",[G1,V1,Np,$1,W1,q1]),Dp=ka.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),K1=yS.extend({index:ne.number().optional(),userFacingStepReference:ne.string().optional(),description:ne.string(),pageState:ne.string().optional(),elementInteracted:ne.string().optional(),startedAt:ne.coerce.date().or(ne.string()).optional().catch(void 0),finishedAt:ne.coerce.date().or(ne.string()).optional().catch(void 0)}),kp=K1.extend({beforeScreenshot:ne.string().optional(),afterScreenshot:ne.string().optional()});var ES=Y1.object({results:Jt.array().describe("main results"),beforeResults:Jt.array().optional(),afterResults:Jt.array().optional()}),Kc=ES.partial();import{z as Y}from"zod";import{extendZodWithOpenApi as rH}from"zod-openapi";import X1 from"zod";var Ua=(r=>(r.ANDROID="ANDROID",r.IOS="IOS",r))(Ua||{}),Rae=X1.nativeEnum(Ua);var Li=(n=>(n.WEB="WEB",n[n.ANDROID="ANDROID"]="ANDROID",n[n.IOS="IOS"]="IOS",n))(Li||{}),xae={WEB:"Web",[Li.ANDROID]:"Android",[Li.IOS]:"iOS"};import{z as gt}from"zod";import{isValidCron as J1}from"cron-validator";import{z as Le}from"zod";var cC=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var uC=1e4,Qs=La.extend({browserType:Le.nativeEnum(ho).optional(),slowMoMs:Le.number().optional().refine(t=>t===void 0||t<=uC&&t>=-1,{message:`Slow motion must be between 0 and ${uC} milliseconds`}),basicAuthorization:Le.object({username:Le.string().optional(),password:Le.string().optional()}).optional(),geolocation:Le.object({latitude:Le.coerce.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Le.coerce.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:Le.boolean().optional(),locale:Le.string().optional(),timezone:Le.enum(cC).optional(),colorScheme:Le.enum(["light","dark"]).optional()}),dC=["extraHeaders","basicAuthorization","localChromeExtensionPaths","proxy"],TS=Le.object({useMemory:Le.boolean().optional(),failureRecovery:Le.boolean().optional().describe("undefined means inherit org settings")}),vS=TS.extend({disableAICaching:Le.boolean().optional(),failureRecoveryInstructions:Le.string().optional()}),Z1=Le.object({viewport:Ip.optional()}),Fa=Z1.merge(vS).merge(Qs),el=Le.object({cron:Le.string().refine(t=>J1(t),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:Le.boolean().default(!1),env:Le.string().optional(),timeZone:Le.string().default("America/Los_Angeles"),jobKey:Le.string().optional()}),tl=Le.object({onSuccess:Le.boolean().default(!1),failureMessage:Le.string().optional(),onFailure:Le.boolean().default(!0),successMessage:Le.string().optional()}),Q1=Le.object({name:Le.string(),required:Le.boolean().optional(),defaultValue:Le.string().describe("this is not optional because we need a value when the editor is first loaded")}),Up=Q1.array(),eH=Le.object({name:Le.string(),value:Le.string()}),pC=eH.array(),Fp=Le.object({name:Le.string(),default:Le.boolean().optional(),fixtures:oC.array().optional()});var Xo=TS.extend({aiAction:gt.boolean().optional(),agentConfig:gt.record(gt.string(),gt.string()).optional(),aiFailureAnalysis:gt.boolean().optional(),aiPageFiltering:gt.boolean().optional().describe("rag v2 feature flag")}),tH=gt.object({cliOnly:gt.boolean().optional(),neverShowUsageBanner:gt.boolean().optional()}),AS=gt.object({fakerConstantSeed:gt.boolean().optional()}),mC=gt.object({ai:Xo.optional(),githubAppInstallationId:gt.number().nullish(),githubAppSummaryMessageEnabled:gt.boolean().nullish(),githubReleaseAppInstallationId:gt.number().nullish(),gitlabAppAccessToken:gt.string().nullish(),gitlabAppBaseUrl:gt.string().nullish(),qaseAccessToken:gt.string().nullish(),testSuggestionsEnabled:gt.boolean().nullish(),browser:fS.optional(),internal:tH.optional(),advanced:AS.optional()}),zae=gt.object({globalOverrides:gt.record(gt.string()).optional(),agentConfig:gt.record(gt.string(),gt.string()).optional()}),Hae=gt.record(gt.string(),gt.string()).nullish();rH(Y);var Jr={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},Ve=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(Ve||{}),Bp=(r=>(r.BEFORE_ALL="BEFORE_ALL",r.AFTER_ALL="AFTER_ALL",r))(Bp||{});var nH=Y.object({attempts:Y.number().int().nonnegative()}),Wt=Y.string().pipe(Y.coerce.date()).or(Y.date()),Ba=Y.object({id:Y.string(),runKey:Y.string(),organizationId:Y.string(),executionType:Y.nativeEnum(Li).optional().default("WEB"),createdAt:Wt,createdBy:Y.string(),flake:Y.boolean().nullish(),scheduledAt:Wt.or(Y.null()),startedAt:Wt.or(Y.null()),updatedAt:Wt.nullish(),finishedAt:Wt.or(Y.null()),resolvedBaseUrl:Y.string().nullish(),environmentName:Y.string().nullish(),gitBranchName:Y.string().nullish(),githubRepository:Y.string().nullish(),gitlabProjectPath:Y.string().nullish(),labels:Y.array(Y.string()).optional(),gitOriginUrl:Y.string().nullish(),gitCommitSha:Y.string().nullish(),gitCommitShaShort:Y.string().nullish(),gitCommitAuthorName:Y.string().nullish(),cliVersion:Y.string().nullish(),section:Y.nativeEnum(Bp).nullish(),status:Y.nativeEnum(Ve),trigger:Y.nativeEnum(Jr),attempts:Y.number(),runAttempts:Y.array(Y.object({id:Y.string(),status:Y.nativeEnum(Ve),startedAt:Wt.or(Y.null()),finishedAt:Wt.or(Y.null())})).optional(),videos:Y.array(Y.string()).optional(),failureReason:Y.nativeEnum(Ie).nullish(),failureDetails:Tp.nullish(),failureRecoveryDetails:nH.nullish(),pipelineId:Y.string().nullish(),resolvedInputs:Y.record(Y.string(),Y.string()).nullish(),quarantined:Y.boolean().nullish().default(!1),quarantinedReason:Y.string().nullish(),localTestId:Y.string().nullish(),testId:Y.string().nullish(),testName:Y.string().nullish(),description:Y.string().nullish(),directory:Y.string().nullish(),test:Y.object({name:Y.string(),id:Y.string()}).nullish().default(null),suiteId:Y.string().nullish(),aiSettings:Xo.nullish()}).openapi({ref:"RunMetadata"}),oH={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},zp=Ba.pick({...oH,test:!0}),gC=Ba.omit({failureReason:!0,failureDetails:!0,test:!0}),RS=Ba.extend({stepsSnapshot:Y.array(Y.record(Y.unknown())).nullish(),resolvedInputs:Y.record(Y.string(),Y.string()).nullish(),test:Y.object({name:Y.string(),id:Y.string(),description:Y.string().nullish(),baseUrl:Y.string().nullish(),advanced:Fa.nullish()}).nullish()}).merge(ES),hC=t=>t.includes("PASSED")&&t.includes("FAILED");var iH=Yc.object({id:Yc.string().uuid(),startedAt:Wt.or(Yc.null()),finishedAt:Wt.or(Yc.null()),status:Yc.nativeEnum(Ve)}).merge(Kc),rse=iH.array();var Hp=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(Hp||{});import{z as Ht}from"zod";var fC=Ht.object({id:Ht.string(),status:Ht.nativeEnum(Ve),trigger:Ht.nativeEnum(Jr),createdAt:Wt,startedAt:Wt.nullish(),finishedAt:Wt.nullish(),gitCommitSha:Ht.string().nullish(),gitCommitShaShort:Ht.string().nullish(),gitCommitTimestamp:Wt.nullish(),gitBranchName:Ht.string().nullish(),gitOriginUrl:Ht.string().nullish(),gitCommitMessage:Ht.string().nullish(),gitCommitAuthorName:Ht.string().nullish(),githubRepository:Ht.string().nullish(),gitlabProjectPath:Ht.string().nullish(),pipelineId:Ht.string().nullish(),cliVersion:Ht.string().nullish(),labels:Ht.string().array().optional(),localSuiteName:Ht.string().optional(),suite:Ht.object({id:Ht.string(),name:Ht.string()}).nullish(),runs:Ht.object({status:Ht.nativeEnum(Ve)}).array()}).openapi({ref:"RunGroup"}),SC=fC.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0,localSuiteName:!0}).extend({runs:zp.array()}),lse=fC.extend({runs:Ba.array()});import{z as or}from"zod";var aH=or.object({type:or.literal("TARGETING"),name:or.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:eC.array(),pageState:or.string().optional(),targetSource:or.nativeEnum(Go).optional(),targetUpdateTime:or.string().optional()}),sH=or.object({type:or.literal("AI_LOCATION"),matched:or.boolean(),pageState:or.string().optional(),ragUsed:or.boolean().optional(),thoughts:or.string().optional()}),lH=or.object({type:or.literal("ASSERTION"),relevantElementsSerialized:or.string().array().optional(),pageState:or.string().optional(),ragUsed:or.boolean().optional()}),yC=or.discriminatedUnion("type",[aH,sH,lH]);function jp(){return{details:[]}}import{z as jt}from"zod";var cH=jt.object({id:jt.string(),name:jt.string()}),Sse=cH.merge(jt.object({createdAt:Wt,createdBy:jt.string(),schedule:el,notification:tl,environment:jt.object({name:jt.string()}).nullish(),beforeTests:jt.object({id:jt.string()}).array().nullish(),afterTests:jt.object({id:jt.string()}).array().nullish()})),bC=jt.object({id:jt.string().uuid(),orgId:jt.string(),createdAt:Wt,startedAt:Wt.or(jt.null()),finishedAt:Wt.or(jt.null()),status:jt.nativeEnum(Ve),trigger:jt.nativeEnum(Jr),suite:jt.object({id:jt.string(),name:jt.string()}).nullish(),runs:Ba.array()}),yse=bC.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),EC=bC.extend({runs:zp.array()});import{z as wn}from"zod";import{cloneDeep as Tse}from"lodash-es";import{z as it}from"zod";var xse=it.object({thoughts:it.string(),subGoals:it.object({instruction:it.string()}).array()}),_se=it.object({thoughts:it.string(),newPlanMarkdown:it.string()}),Ise=it.object({thoughts:it.string(),correct:it.boolean(),failedActionIndex:it.number().optional()}),uH=it.object({type:it.literal("PLANNING"),beforePlan:it.string(),goalDecision:it.string(),thoughts:it.string()}),dH=it.object({type:it.literal("RUNNING"),stepDisplayName:it.string(),status:it.nativeEnum(Ye),results:Jt.array()}),pH=it.object({type:it.literal("REVISING"),beforePlan:it.string(),afterPlan:it.string(),errString:it.string(),diffs:it.string(),thoughts:it.string()}),mH=it.object({type:it.literal("SYSTEM"),message:it.string()}),gH=it.discriminatedUnion("type",[uH,dH,pH,mH]),TC=gH.array();var Nse=wn.object({id:wn.string(),scheduledAt:wn.coerce.date().nullable(),startedAt:wn.coerce.date().nullable(),finishedAt:wn.coerce.date().nullable(),status:wn.nativeEnum(Ve),history:TC.nullable(),testPlan:wn.object({id:wn.string(),name:wn.string()}).nullable(),test:wn.object({id:wn.string(),name:wn.string()}).nullable()});import{z as Hr}from"zod";var CS=Hr.object({content:Hr.string(),ids:Hr.string().array(),tokenLength:Hr.number()}),hH=Hr.object({chunks:CS.array()}),Jse=Hr.object({ids:Hr.string().array(),score:Hr.number(),tokenLength:Hr.number()}),Zse=hH.extend({description:Hr.string().describe("Input to pass to RAG engine"),tokenLimit:Hr.number()}),vC=Hr.object({ids:Hr.number().array()}),AC=Hr.object({indices:Hr.number().array()});var qt=U.object({disableCache:U.boolean().optional(),useMemory:U.boolean().optional(),clientMode:U.enum(["interactive","runner"]).optional(),loggerTags:U.record(U.string(),U.string()).optional(),langfuseSessionId:U.string().optional(),agentConfigVersion:U.string().optional()}),sle=qt.extend({chunks:CS.array(),description:U.string().describe("Input to pass to AI"),type:U.union([U.literal("locator"),U.literal("assertion"),U.literal("ai-action")]),softTokenLimit:U.number(),hardTokenLimit:U.number(),callId:U.string().optional()}),fH=U.object({screenshotBase64AfterCommand:U.string(),urlAfterCommand:U.string(),serializedCommand:U.string(),elementInteracted:U.string().optional(),thoughts:U.string().optional()}),RC=U.object({goal:U.string(),browserState:U.string(),screenshot:U.string(),source:QR.optional().catch(void 0),isTieBreakerCall:U.boolean().optional(),memory:U.discriminatedUnion("type",[Vo,U.object({type:U.literal("RESOLVED_TRACES"),traces:U.unknown().array()})]).optional(),firstPassModelResults:_p.array().optional()}),CC=U.object({target:U.string().or(U.number()),browserState:U.string().optional(),screenshot:U.string().optional(),boundingBox:U.object({x:U.number(),y:U.number(),height:U.number(),width:U.number()}).optional()}),wC=U.object({goal:U.string(),browserState:U.string(),screenshot:U.string().optional(),returnSchema:U.string().optional()}),wS=U.union([U.literal("NEGATED_CHECK"),U.literal("CONDITIONAL_CHECK")]),xC=U.object({goal:U.string(),browserState:U.string(),screenshot:U.string(),url:U.string(),contextChoice:zf.optional(),memory:U.discriminatedUnion("type",[Ea,U.object({type:U.literal("RESOLVED_TRACES"),traces:U.unknown().array()})]).optional(),source:wS.optional()}),_C=U.object({command:$s}),IC=U.object({message:U.string()}),PC=U.object({messagesAndToolCalls:U.array(U.string())}),MC=U.object({messagesAndToolCalls:U.array(U.string()).describe("Chat history to condense for summarization")}),xS=U.object({goal:U.string(),browserState:U.string(),startingScreenshot:U.string().optional(),screenshot:U.string(),url:U.string(),history:fH.array(),actionHint:U.string().optional(),lastError:U.string().optional()}),OC=U.object({results:kp.array(),errorMessage:U.string(),errorStack:U.string().optional()}),LC=U.object({results:kp.array(),goal:U.string(),errorMessage:U.string()}),NC=U.object({failedResults:kp.array(),nextStepsSerialized:U.string().array(),currentUrl:U.string(),currentPageState:U.string(),currentScreenshot:U.string(),customInstructions:U.string().optional(),testDescription:U.string().optional()}),lle=U.object({description:U.string(),type:U.union([U.literal("locator"),U.literal("assertion"),U.literal("ai-action")]),excerpt:U.string()}),DC=U.object({type:U.string(),browserContext:U.string(),currentStep:U.string(),screenshot:U.string()}),kC=U.object({description:U.string(),browserState:U.string(),screenshot:U.string()});import{z as Xc}from"zod";var dle=Xc.object({goal:Xc.string()}),UC=Xc.object({keywords:Xc.array(Xc.string())});import{z as rl}from"zod";var Jc=(o=>(o.LOCATOR="locator",o.ASSERTION="assertion",o.VISUAL_ASSERTION="visual-assertion",o.TEXT_EXTRACTION="text-extraction",o))(Jc||{}),gle=rl.nativeEnum(Jc),hle=new Set(Object.values(Jc));var SH=rl.enum(["v1","v2","v3","v4"]),yH=rl.string().regex(/^v\d+\.\d+$/).describe("pinned sub-version like v3.1"),fle=rl.union([SH,yH,rl.string().describe("for people with special configurations")]),Gp={locator:"v3",assertion:"v3","visual-assertion":"v3","text-extraction":"v3"};var FC=(o=>(o.ANDROID_LOCATOR="android-locator",o.IOS_LOCATOR="ios-locator",o.ANDROID_ASSERTION="android-assertion",o.IOS_ASSERTION="ios-assertion",o))(FC||{}),Sle=rl.nativeEnum(FC);import{z as be}from"zod";import mu from"zod";import pr from"zod";import Zt from"zod";import{v4 as Aue}from"uuid";import NH from"zod";import*as K from"zod";var _S=K.discriminatedUnion("type",[K.object({type:K.literal("SCREEN")}),K.object({type:K.literal("OPEN_APP")}),K.object({type:K.literal("OPEN_WEBVIEW")})]),Ni=K.object({type:K.literal("description"),description:K.string()}),BC=K.object({type:K.literal("CUSTOM_COORDINATES"),startX:K.number().describe("Starting X coordinate in pixels"),startY:K.number().describe("Starting Y coordinate in pixels"),deltaPixels:K.number().describe("Number of pixels to scroll in the specified direction")}),Vp=K.discriminatedUnion("type",[..._S.options,K.object({type:K.literal("CUSTOM"),target:Ni}),BC]);var bH=K.object({type:K.literal("coordinates"),xPercent:K.number(),yPercent:K.number()}),nl=K.discriminatedUnion("type",[Ni,bH]),zC=K.object({requiredText:K.string().optional(),requiredAttributes:K.record(K.string(),K.string()).optional(),requiredBounds:K.boolean().optional(),position:K.object({x1:K.number(),y1:K.number(),x2:K.number(),y2:K.number(),tolerance:K.nativeEnum(Yr),preciseTolerance:K.boolean().optional()}).optional(),shape:K.object({width:K.number(),height:K.number(),tolerance:K.nativeEnum(Yr),preciseTolerance:K.boolean().optional()}).optional()}),EH=K.object({xPath:K.string(),requirements:zC.optional()}),TH=K.object({type:K.literal("CUSTOM"),target:Ni,cache:K.lazy(()=>HC).optional()}),vH=K.object({pixelDelta:K.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:K.union([_S,TH,BC]),direction:K.enum(["up","down"])}),HC=K.object({type:K.literal("NATIVE"),bounds:K.number().array().optional(),resolvedDescription:K.string().optional(),xPath:K.string().optional(),elementOnlySerializedXml:K.string().optional(),scrollDetails:vH.optional(),requirements:zC.optional(),requiredRelatedElements:EH.array().optional(),memory:Vo.optional()}),AH=K.object({type:K.literal("WEBVIEW"),resolvedDescription:K.string().optional(),xPath:K.string().optional(),browserCache:Ti.optional(),memory:Vo.optional()}),$p=K.union([HC,AH]);var RH=K.object({left:K.number(),top:K.number(),right:K.number(),bottom:K.number()}),Tle=K.object({newViewportBounds:RH});import IS from"zod";import Di from"zod";var Xe=(A=>(A.AI_CHECK="AI_CHECK",A.TAP="TAP",A.TYPE="TYPE",A.PRESS="PRESS",A.PRESS_KEYBOARD="PRESS_KEYBOARD",A.OPEN_APP="OPEN_APP",A.KILL_APP="KILL_APP",A.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",A.SWIPE="SWIPE",A.SCROLL_TO="SCROLL_TO",A.SCREEN_CHECK="SCREEN_CHECK",A.ELEMENT_CHECK="ELEMENT_CHECK",A.DRAG_AND_DROP="DRAG_AND_DROP",A.JAVASCRIPT="JAVASCRIPT",A.REQUEST="REQUEST",A.WAIT="WAIT",A.ADD_FILE="ADD_FILE",A.INSTALL_APP="INSTALL_APP",A.UNINSTALL_APP="UNINSTALL_APP",A.TOGGLE_SETTINGS="TOGGLE_SETTINGS",A.ROTATE_ORIENTATION="ROTATE_ORIENTATION",A.ADB="ADB",A.STATE="STATE",A))(Xe||{}),he=Di.object({id:Di.string().uuid(),disableCache:Di.boolean().optional()}),Wp=Di.object({updatedAt:Di.coerce.date().optional(),updatedAtLoggerTags:Di.record(Di.string(),Di.string()).optional()}),xn=Wp.extend({target:$p}),qp=Wp.extend({fromTarget:$p,toTarget:$p});var PS=he.extend({type:IS.literal("ADB"),command:IS.string(),jsonArgs:IS.string().optional()});import MS from"zod";var OS=he.extend({type:MS.literal("ADD_FILE"),file:MS.string(),storageLocation:MS.string()});import LS from"zod";var Zc=he.extend({type:LS.literal("DRAG_AND_DROP"),fromTarget:Ni,toTarget:Ni,cache:qp.optional(),hoverDuration:LS.number().optional(),dragDuration:LS.number().optional()});import jC from"zod";var Qc=he.extend({type:jC.literal("ELEMENT_CHECK"),target:nl,cache:xn.optional(),assertion:ap,timeout:jC.number().int().min(0).max(Ra).optional().describe("max seconds to wait for the assertion to be true")});import GC from"zod";var CH=GC.string().trim(),NS=he.extend({type:GC.literal("INSTALL_APP"),uri:CH});import wH from"zod";var DS=he.extend({type:wH.literal("KILL_APP")});import xH from"zod";var kS=he.extend({type:xH.literal("OPEN_NOTIFICATION_DRAWER")});import US from"zod";var eu=he.extend({type:US.literal("SCROLL_TO"),target:Ni,direction:US.enum(["down","up"]),scrollableElement:Vp,scrollStepPercent:US.number().min(.1).max(1).optional().describe("How much of the container height to scroll at each step (0.1 to 1.0). Default is 0.8 (80%)."),cache:xn.optional()});import Kp from"zod";var tu=he.extend({type:Kp.literal("SWIPE"),direction:Kp.enum(["up","down","left","right"]),scrollableElement:Vp,cache:xn.optional(),viewportPercent:Kp.number().optional(),durationMs:Kp.number().optional()});import VC from"zod";var ru=(o=>(o.AIRPLANE_MODE="AIRPLANE_MODE",o.DATA="DATA",o.WIFI="WIFI",o.LOCATION="LOCATION",o))(ru||{}),FS=he.extend({type:VC.literal("TOGGLE_SETTINGS"),settingsType:VC.nativeEnum(ru)});import $C from"zod";var BS=he.extend({type:$C.literal("UNINSTALL_APP"),packageName:$C.string()});import YC from"zod";import zS from"zod";var nu=he.extend({type:zS.literal("AI_CHECK"),assertion:zS.string(),timeoutSecs:zS.number().optional(),cache:Wp.extend({memory:Ea.optional()}).optional()});import HS from"zod";var jS=he.extend({type:HS.literal("JAVASCRIPT"),code:HS.string(),timeout:HS.number().int().max(60).optional().describe("Max seconds for the code to complete")});import WC from"zod";var Yp=(n=>(n.CLOSE_KEYBOARD="CLOSE_KEYBOARD",n.ENTER="ENTER",n.BACKSPACE="BACKSPACE",n))(Yp||{}),GS=he.extend({type:WC.literal("PRESS_KEYBOARD"),key:WC.nativeEnum(Yp)});import ou from"zod";var Xp=(r=>(r.HOME="HOME",r.POWER="POWER",r))(Xp||{}),ol=(a=>(a.BACK="BACK",a.APP_SWITCHER="APP_SWITCHER",a.SEARCH="SEARCH",a.VOLUME_UP="VOLUME_UP",a.VOLUME_DOWN="VOLUME_DOWN",a.VOLUME_MUTE="VOLUME_MUTE",a))(ol||{}),iu=he.extend({type:ou.literal("PRESS"),key:ou.nativeEnum(Xp),longPress:ou.boolean().optional()}),VS=iu.extend({key:ou.nativeEnum(ol).or(ou.nativeEnum(Xp))}),$S=iu;import _H from"zod";var WS=he.extend({type:_H.literal("REQUEST")}).merge(Ta);import qC from"zod";var Jp=(r=>(r.PORTRAIT="PORTRAIT",r.LANDSCAPE="LANDSCAPE",r))(Jp||{}),qS=he.extend({type:qC.literal("ROTATE_ORIENTATION"),orientation:qC.nativeEnum(Jp)});import IH from"zod";var KS=he.extend({type:IH.literal("STATE")});import fo from"zod";var au=he.extend({type:fo.literal("TAP"),target:nl,cache:xn.optional(),longPress:fo.boolean().optional(),longPressDurationMs:fo.number().optional(),iterations:fo.number().optional(),tapDelayMs:fo.number().optional(),relativePosition:fo.object({x:fo.number(),y:fo.number()}).optional(),doubleTap:fo.boolean().optional(),doubleTapDelayMs:fo.number().optional()});import su from"zod";var lu=he.extend({type:su.literal("TYPE"),target:nl.optional(),cache:xn.optional(),keyPressDelayMs:su.number().optional(),text:su.string(),clearContent:su.boolean().optional(),forceClearContent:su.boolean().optional()});import KC from"zod";var YS=he.extend({type:KC.literal("WAIT"),timeoutSecs:KC.number()});var cu=YC.discriminatedUnion("type",[KS,nu,au,lu,GS,jS,YS,WS,qS]),PH=YC.discriminatedUnion("type",[...cu.options,iu]);import il from"zod";var XS=he.extend({type:il.literal("OPEN_APP"),packageName:il.string(),activityName:il.string().optional(),intentExtras:il.string().optional()}),JS=he.extend({type:il.literal("OPEN_APP"),packageName:il.string()});import al from"zod";var MH=al.object({type:al.literal("CONTENT"),negated:al.boolean().optional(),value:al.string()}),ZS=he.extend({type:al.literal("SCREEN_CHECK"),assertion:MH,timeout:al.number().int().min(0).max(Ra).optional().describe("max seconds to wait for the assertion to be true")});var ey=NH.discriminatedUnion("type",[...cu.options,DS,VS,BS,NS,OS,PS,Zc,ZS,kS,eu,tu,FS,Qc,XS]);import DH from"zod";var ty=DH.discriminatedUnion("type",[...cu.options,$S,JS]);var sn=(n=>(n.PRESET="MOBILE_PRESET_STEP",n.MODULE="MOBILE_MODULE_STEP",n.AI_ACTION="MOBILE_AI_ACTION_STEP",n))(sn||{}),sl=Zt.object({id:Zt.string().uuid(),envKey:Zt.string().optional(),skipped:Zt.boolean().optional(),retries:Zt.number().optional()}),XC=sl.extend({type:Zt.literal("MOBILE_PRESET_STEP"),keyPressDelayMs:Zt.number().optional()}),uu=XC.extend({command:ey}),ry=XC.extend({command:ty}),ll=Zt.object({moduleId:Zt.string(),inputs:Zt.record(Zt.string(),Zt.string()).optional()}),du=sl.merge(ll.extend({type:Zt.literal("MOBILE_MODULE_STEP")})),epe=ll.extend({steps:Zt.lazy(()=>Ha.array())}),tpe=ll.extend({steps:Zt.lazy(()=>Zp.array())}),za=sl.extend({type:Zt.literal("MOBILE_AI_ACTION_STEP"),text:Zt.string()}),Ha=Zt.discriminatedUnion("type",[uu,du,za]),Zp=Zt.discriminatedUnion("type",[ry,du,za]);var pu=pr.object({message:pr.string().optional(),startTime:pr.number(),endTime:pr.number(),status:pr.nativeEnum(Ye),trace:pr.unknown(),beforeSnapshot:pr.string().optional(),afterSnapshot:pr.string().optional(),data:pr.unknown().optional().describe("output data from the step"),aiSuggested:pr.boolean().optional()}),UH=pu.merge(uu).extend({previousAttempts:pr.lazy(()=>Jn.array()).optional()}),FH=pu.merge(du).extend({steps:pr.lazy(()=>Jn.array()),name:pr.string().optional(),previousAttempts:pr.lazy(()=>Jn.array()).optional()}),BH=pu.merge(za).extend({steps:pr.lazy(()=>Jn.array()),previousAttempts:pr.lazy(()=>Jn.array()).optional()}),Jn=pr.discriminatedUnion("type",[UH,FH,BH]);var zH=pu.extend({index:mu.number().optional(),userFacingStepReference:mu.string().optional(),description:mu.string()}),JC=zH.extend({beforeScreenshot:mu.string().optional(),afterScreenshot:mu.string().optional()});var ZC=be.object({attributesRequired:be.array(be.string()).optional(),textRequired:be.boolean().optional(),boundsRequired:be.boolean().optional(),positionSpecificity:be.nativeEnum(Yr).optional(),shapeSpecificity:be.nativeEnum(Yr).optional()}),HH=be.object({thoughts:be.string(),id:be.number(),updatedMemory:xc.optional(),inWebview:be.boolean().optional(),requirements:ZC.optional(),additionalElements:be.object({id:be.number(),requirements:ZC}).array().optional()}),QC=be.object({description:be.string(),screenXml:be.string(),screenshot:be.string(),memory:be.discriminatedUnion("type",[Vo,be.object({type:be.literal("RESOLVED_TRACES"),traces:be.unknown().array()})]).optional()}),ew=be.object({assertion:be.string(),screenXml:be.string(),screenshot:be.string(),memory:be.discriminatedUnion("type",[Ea,be.object({type:be.literal("RESOLVED_TRACES"),traces:be.unknown().array()})]).optional()}),jH=be.object({thoughts:be.string(),result:be.boolean(),relevantElements:be.array(be.number()).optional(),updatedMemory:Ic.optional()}),tw=be.object({failedResults:JC.array(),nextStepsSerialized:be.string().array(),currentScreenXml:be.string(),currentScreenshot:be.string(),customInstructions:be.string().optional(),testDescription:be.string()}),rw=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(rw||{}),GH=be.object({thoughts:be.string(),scenario:be.nativeEnum(rw),instructions:be.string().nullish()});var nw=t=>!(!t.org_id||!t.user_id||!t.platform);import{z as ja}from"zod";var ow=ja.object({id:ja.string().uuid(),skipped:ja.boolean().optional(),envKey:ja.string().optional().describe("key in the environment to save the result of this step to")}),ny=ow.merge(Ta).extend({type:ja.literal("REQUEST")}),oy=ow.merge(sp).extend({type:ja.literal("JAVASCRIPT")}),iy=ja.discriminatedUnion("type",[oy,ny]);import{z as _n}from"zod";var iw=_n.object({id:_n.string(),name:Ko,description:_n.string().optional().nullish(),baseUrl:Cp.nullish(),schemaVersion:_n.string(),advanced:_n.unknown().optional(),retries:_n.number(),envs:_n.array(Fp).nullish(),parameters:Up.nullish()}),VH=_n.object({createdAt:_n.coerce.date(),updatedAt:_n.coerce.date(),schedule:el.nullish(),notification:tl.nullish(),createdBy:_n.string(),organizationId:_n.string()}),$H=iw.merge(VH),Upe=$H.extend({steps:iy.array()}),Fpe=iw.extend({steps:iy.array()});import{z as Zr}from"zod";var aw=Zr.object({startedAt:Zr.coerce.date(),finishedAt:Zr.coerce.date(),status:Zr.nativeEnum(Ye),message:Zr.string().optional(),data:Zr.unknown().optional()}),WH=aw.merge(oy).extend({type:Zr.literal("JAVASCRIPT")}),qH=aw.merge(ny).extend({type:Zr.literal("REQUEST")}),KH=Zr.discriminatedUnion("type",[WH,qH]),sw=Zr.object({startedAt:Zr.coerce.date(),finishedAt:Zr.coerce.date().nullish(),status:Zr.nativeEnum(Ve),results:KH.array(),failureReason:Zr.string().nullish(),failureDetails:Tp.nullish()});import{z as Qr}from"zod";var YH=Qr.object({id:Qr.string(),organizationId:Qr.string(),createdAt:Qr.coerce.date(),updatedAt:Qr.coerce.date(),createdBy:Qr.string(),scheduledAt:Qr.coerce.date().nullish(),startedAt:Qr.coerce.date().nullish(),finishedAt:Qr.coerce.date().nullish(),status:Qr.nativeEnum(Ve),trigger:Qr.nativeEnum(Jr),results:sw.array().nullish(),apiTestName:Qr.string().nullish(),apiTestPath:Qr.string().nullish(),apiTestId:Qr.string().nullish()}),Kpe=YH.pick({status:!0,startedAt:!0,finishedAt:!0});var gu=(o=>(o.TestRun="test-run",o.MobileTestRun="mobile-test-run",o.CreditsUsed="credits-used",o.CreditsUsedV2="credits-used-v2",o))(gu||{}),lw=3;function XH(t){return t==="MODULE"||t==="CONDITIONAL"||t==="SECTION"||t==="RESOLVED_MODULE"}function ay(t){if(!XH(t))switch(t){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}function sy(t){switch(t.type){case"AI_EXTRACT":case"AI_ASSERTION":return lw;case"CAPTCHA":return 3;case"CLICK":case"TYPE":case"SELECT_OPTION":case"HOVER":case"ELEMENT_CHECK":case"FOCUS":case"BLUR":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":case"MOUSE_DRAG":return t.useSelector||!t.target||t.target.type!=="description"?0:1;case"DRAG":return t.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":case"OFFLINE_MODE":return 0;default:(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}var cl=class{trackStepExecution(){}async flush(){}};import{parseString as JH,splitCookiesString as ZH}from"set-cookie-parser";import{z as Je}from"zod";var ly=Je.object({name:Je.string(),value:Je.string(),url:Je.string().optional(),domain:Je.string().optional(),path:Je.string().optional(),expires:Je.number().default(Date.now()/1e3+60*60*24*365),httpOnly:Je.boolean().optional(),secure:Je.boolean().default(!0),sameSite:Je.union([Je.literal("Strict"),Je.literal("Lax"),Je.literal("None")]).default("None")});function Qp(t,e){let r=[],n=ZH(t);for(let o of n){let i=JH(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let u=i.sameSite.trim().toLowerCase();if(u==="strict")a="Strict";else if(u==="lax")a="Lax";else if(u==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${u}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=ly.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});r.push(s);let c=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),l=o.match(/\b(\S+)=([^;]*)/g);if(l)for(let u of l){let[d,p]=u.split("=");if(!d||!p)throw new Error(`Invalid key-value pair in cookie: ${u}`);c.includes(d.toLowerCase())||r.push({...s,name:d,value:p})}}return r}var QH=Je.object({origin:Je.string(),localStorage:Je.array(Je.object({name:Je.string(),value:Je.string()})),sessionStorage:Je.array(Je.object({name:Je.string(),value:Je.string()})).optional()}),ej=Je.object({entries:Je.record(Je.string(),Je.array(Je.tuple([Je.unknown(),Je.unknown()]))),version:Je.number().optional()}),em=Je.object({cookies:ly.array().optional(),origins:QH.array().optional(),idb:Je.record(Je.string(),ej).optional().describe("key is db name")});function cw(t,e){let r=[];return t.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=ly.safeParse({name:n.key,...n});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),r.push(i)}),r}import{v4 as hme}from"uuid";import Ne from"zod";var tj=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM"],uw=Ne.object({type:Ne.enum(tj).describe("Where to interact. SCREEN = entire device (use for system surfaces like the notification bar or quick settings), OPEN_APP = current foreground app, OPEN_WEBVIEW = active webview (only if a webview is present and there is high confidence that the element is inside it), CUSTOM = explicitly describe the container if and only if NONE of the above fit."),description:Ne.string().or(Ne.null()).describe("Description of the container to interact with. This is only used if the container type is CUSTOM.")}),rj=Ne.object({type:Ne.literal("TAP"),description:Ne.string().describe("Description of the element to tap."),longPress:Ne.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),iterations:Ne.null().or(Ne.number()).describe("Number of times to tap the element, useful for selecting text, selecting a row, or opening a menu. If null, tap once."),relativePosition:Ne.null().or(Ne.object({x:Ne.number(),y:Ne.number()})).describe("Specific position to tap within the bounding box of the element, specified in pixels. E.g. 0,0 is the top left corner.")}).describe(`
|
|
11
|
+
`)}`}};function Dz(t){return t instanceof Error?t.message.includes("Timeout")&&t.message.includes("exceeded")&&t.message.includes("waiting for locator"):!1}function kz(t){return!(t instanceof Error)||t.message.includes("locator resolved to visible")?!1:!!(t.message.includes("Timeout")&&t.message.includes("exceeded")&&t.message.includes("body >")||t.message.includes("Element is not attached to the DOM"))}var Ks=class extends Error{constructor(e,r={}){super(e,r),this.name="CacheAttributesDisqualifyElementError"}},Ci=class extends Ks{constructor(e,r={}){super(e,r),this.name="ElementMovedError"}},vp=class extends Ks{constructor(e,r={}){super(e,r),this.name="ZeroOpacityError"}},Hc=class extends Error{constructor(e,r={}){super(e,r),this.name="IsInvalidMomenticIdError"}};function Uz(t){return t instanceof Error?t.message.includes("Could not find attribute data-momentic-id for object"):!1}var qf="Element to be clicked has no bounding box";function Fz(t){return t instanceof Error?t.message.startsWith(qf):!1}function Kf(t){return t instanceof Ci||kz(t)||Bz(t)||zz(t)||Dz(t)||Uz(t)||Fz(t)}function Bz(t){return t instanceof Error?t instanceof Hc?!0:t.message.includes("Timeout")&&t.message.includes("exceeded")&&t.message.includes("waiting for locator")&&t.message.includes("data-momentic-id")&&!t.message.includes("locator resolved")&&!t.message.includes("waiting for element to be"):!1}function zz(t){return t instanceof Error?t.message.includes("Protocol error (DOM.resolveNode): No node with given id found")||t.message.includes("Could not resolve backend node"):!1}var jc=class extends Error{constructor(e,r={}){super(e,r),this.name="InsufficientCacheDataError"}};var Yf={CLICK:"Click on an element on the page.",TYPE:"Focus the element then type the specified text into an input on the page.",PRESS:"Press one or more keyboard keys.",KEY_DOWN:"Hold down one or more keyboard keys.",KEY_UP:"Release one or more keyboard keys.",SELECT_OPTION:"Choose an option from a native <select> component. Never use this command for non <select> elements. Instead, use a series of CLICK commands for those.",NAVIGATE:"Go to the specified fully qualified URL.",SCROLL_UP:"Scroll up.",SCROLL_DOWN:"Scroll down.",GO_BACK:"Go back to the previous page.",HOVER:"Hover over an element.",AI_ASSERTION:"Verify a statement about the current page, retrying until it is true. Only generate an assertion if the goal includes language like 'check that', 'verify that', etc..",WAIT:"Wait a fixed amount of seconds.",DRAG:"Drag an element from one location and drop it onto another element.",JAVASCRIPT:"Execute JavaScript code in NODE or BROWSER environment.",ELEMENT_CHECK:"Perform a manual assertion on a specific element.",PAGE_CHECK:"Perform a manual case sensitive assertion on the page's html.",NEW_TAB:"Open a new browser tab with the specified URL.",WAIT_FOR_URL:"Wait for the URL to match a pattern.",AI_EXTRACT:"Extract data from the page and optionally store it in an environment variable.",COPY:"Copy the specified text value to the browser clipboard.",GO_FORWARD:"Navigate forward to the next page in the browser history (if available). Only use this after having navigated back with GO_BACK. Do not use this to navigate to a different page - use NAVIGATE instead.",LOCAL_STORAGE:"Set or get a value in the browser's localStorage. Use this to store data that persists across page reloads or to read stored values.",MOUSE_DRAG:"Drag the mouse from a starting point (or element) in a specific direction by pixel amounts. Prefer using DRAG (drag and drop between elements) instead unless the user explicitly requests dragging in a direction or by pixels. Use this when dragging needs to move a specific distance rather than to a target element.",PASTE:"Paste the contents of the browser clipboard into the currently focused element. Use this after copying text with COPY or when pasting content that was previously copied.",REFRESH:"Reload the current page. Use this to refresh the page content or retry a failed operation.",REQUEST:"Make an HTTP API request to a specified URL. Use this to interact with REST APIs, send data to a server, or retrieve data from an endpoint. Supports GET, POST, PUT, DELETE, and PATCH methods with custom headers, query parameters, and request body.",GRAPHQL_REQUEST:"Make a GraphQL request to a specified URL. Provide the GraphQL query (or mutation), optional variables JSON, and any required headers. Use this for GraphQL APIs instead of REQUEST.",SET_HEADER:"Set a header for subsequent network requests. Optionally scope it to matching requests.",REGISTER_REQUEST_LISTENER:"Register a request listener for matching requests and save them under a key.",RECORD_REQUESTS:"Record matching requests and store them under a key for later retrieval.",MOCK_ROUTE:"Mock matching network requests with a generated response."};Hf.options.forEach(t=>{let e=t.shape.type.value;if(e!=="SUCCESS"&&!Yf[e])throw new Error(`Command type ${e} is missing a description`)});var AR=_.object({type:_.literal("CLICK"),description:_.string().describe("Description of the element to click in the Current Page. Never click on <select> elements, see SELECT_OPTION."),doubleClick:_.boolean().or(_.null()),rightClick:_.boolean().or(_.null()),waitForDownload:_.boolean().or(_.null()).describe("Wait for the click to trigger a file download and for the download to complete."),downloadTimeoutMs:_.number().int().or(_.null()).describe("Max milliseconds to wait for a download to start and complete when waitForDownload is enabled."),delayMs:_.number().int().or(_.null()).describe("Delay before performing the click, in milliseconds.")}),RR=_.object({type:_.literal("TYPE"),description:_.string().describe("Description of the element to type into, which must be an <input>, <textarea>, or contenteditable element."),text:_.string().describe("The text to enter, truncated to 500 characters. If the PM provided text in the goals, use it exactly without modification."),pressEnter:_.boolean().or(_.null()).describe("Press enter after typing (useful for form submissions)."),clearContent:_.boolean().describe("Clear existing content before typing. Disable to append to the existing text.")}),CR=_.object({type:_.literal("GO_BACK")}),Hz=_.object({type:_.literal("GO_FORWARD")}),jz=_.object({type:_.literal("LOCAL_STORAGE"),key:_.string().describe("The localStorage key to set or get."),value:_.string().describe("The value to store in localStorage. If reading, this can be empty.")}),wR=_.object({type:_.literal("PRESS"),keys:_.array(_.string()).describe('The keys to press. Only use key names supported by the Playwright press method, such as "a", "ArrowLeft", "Meta", "Control", and "Enter". Multiple keys will be pressed together. Do not suggest platform-specific key combinations, such as CTRL+C.')}),xR=_.object({type:_.literal("SELECT_OPTION"),description:_.string().describe("Description of the <select> element to choose from. Only use this command to interact with native HTML <select> elements. You must use CLICK to select from any other HTML element, such as <input>, <div>, or custom elements."),option:_.discriminatedUnion("type",[_.object({type:_.literal("VALUE"),value:_.string()}),_.object({type:_.literal("LABEL"),label:_.string()}),_.object({type:_.literal("INDEX"),index:_.string().describe("Zero-based index of the option within the select.")})]).describe("Which option to select. Choose 1 of 3 strategies for selecting. By value is exactly matching the 'value' attribute. By label is exactly matching the 'label' attribute. By index is using the zero-based index of the option within the select.")}),_R=_.object({type:_.literal("NAVIGATE"),url:_.string().describe("The URL to navigate to. Only navigate to URLs relevant to the user goal.")}),IR=_.object({type:_.literal("SCROLL"),y:_.number().describe("Scroll up or down by the specified pixels. Positive values scroll down.")}),PR=_.object({type:_.literal("WAIT"),timeout:_.number().describe("The number of seconds to wait.")}),MR=_.object({type:_.literal("AI_ASSERTION"),assertion:_.string().describe("The assertion to verify. This should be a statement verifiable based on the current page HTML or screenshot. Be specific enough that the assertion is not ambiguous or open to interpretation. Make sure the assertion aligns with what the user intends to verify."),timeout:_.number().describe("The max amount of seconds to wait for the assertion to be true. Respect user wishes but allow no more than 60. If unspecified, choose 5 for quick checks like form status, 10 for page loads, and 30 for actions that explicitly trigger a long time, like image generation.")}),OR=_.object({type:_.literal("HOVER"),description:_.string().describe("Description of the element to hover over. Prefer elements that have visible bounding boxes according to the screenshot, element class attribute, or child contents.")}),Gz=_.object({type:_.literal("COPY"),value:_.string().describe("The text value to copy to the browser clipboard. This should be the exact text that needs to be copied.")}),Vz=_.object({type:_.literal("PASTE")}),$z=_.object({type:_.literal("REFRESH")}),Wz=_.object({type:_.literal("REQUEST"),url:_.string().describe("The URL to send the HTTP request to. Can be a full URL or relative path."),method:_.enum(["GET","POST","PUT","DELETE","PATCH"]).describe("The HTTP method to use. GET for retrieving data, POST for creating resources, PUT for updating resources, DELETE for removing resources, PATCH for partial updates."),headers:_.record(_.string(),_.string()).or(_.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),params:_.record(_.string(),_.string()).or(_.null()).describe("Optional URL query parameters as key-value pairs. These will be appended to the URL as ?key1=value1&key2=value2."),body:_.string().or(_.null()).describe("Optional request body as a string. For JSON data, stringify the object. Typically used with POST, PUT, or PATCH requests."),timeout:_.number().int().or(_.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),qz=_.object({type:_.literal("GRAPHQL_REQUEST"),url:_.string().describe("The URL of the GraphQL endpoint. Can be a full URL or relative path."),headers:_.record(_.string(),_.string()).or(_.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),query:_.string().describe("The GraphQL query or mutation string. Include any required fields and arguments."),variables:_.string().or(_.null()).describe("Optional JSON string of variables to pass with the GraphQL request."),timeout:_.number().int().or(_.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),Kz=_.object({type:_.literal("SET_HEADER"),name:_.string().describe("The header name to set."),value:_.string().describe("The header value to set."),requestMatcher:po.or(_.null()).describe("Optional request matcher to scope the header to matching requests.")}),Yz=_.object({type:_.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:po.describe("Request matcher to define which requests should be captured."),key:_.string().describe("Identifier for the listener. Used to retrieve recorded data.")}),Xz=_.object({type:_.literal("RECORD_REQUESTS"),requestMatcher:po.describe("Request matcher to define which requests should be recorded."),key:_.string().describe("Identifier for the recording. Used to retrieve recorded data.")}),Jz=_.object({type:_.literal("MOCK_ROUTE"),requestMatcher:po.describe("Request matcher defining which requests should be mocked."),responseGenerator:_.string().describe("JavaScript code to generate the mocked response."),fetchOriginalResponse:_.boolean().or(_.null()).describe("Whether to fetch the real response and pass it to the response generator."),key:_.string().or(_.null()).describe("Optional key to reference this mock for removal.")}),LR=_.object({type:_.literal("DRAG"),fromDescription:_.string().describe("Description of the element to drag. Prefer precise identifiers or text that clearly distinguishes the element."),toDescription:_.string().describe("Description of the element to drop onto. Ensure the drop target is interactable and visible."),steps:_.number().int().positive().or(_.null()).describe("Optional number of intermediate mouse move steps during the drag. Do not use this unless the user tells you to."),hoverSeconds:_.number().positive().or(_.null()).describe("Optional seconds to hover over the destination before releasing the drag.")}),Zz=_.object({type:_.literal("MOUSE_DRAG"),description:_.string().or(_.null()).describe("Optional description of the element to start the drag from. If not provided, starts from current mouse position."),deltaX:_.number().describe("Number of pixels to move horizontally (positive = right, negative = left)."),deltaY:_.number().describe("Number of pixels to move vertically (positive = down, negative = up)."),steps:_.number().int().positive().or(_.null()).describe("Optional number of intermediate mouse move steps during the drag.")}),Qz=_.object({type:_.literal("JAVASCRIPT"),code:_.string().describe("JavaScript code to execute. Defaults to NODE environment unless BROWSER is specified."),environment:_.union([_.literal("NODE"),_.literal("BROWSER")]).or(_.null()).describe("Execution environment. Default is NODE."),timeout:_.number().or(_.null()).describe("Max seconds for the code to complete. Max 60 seconds.")}),e1=_.object({type:_.literal("AI_EXTRACT"),goal:_.string().describe("Description of what data to extract from the page. Be specific about what you want to extract and where to find it."),schema:_.string().or(_.null()).describe("JSON schema defining the expected structure of the extracted data."),envKey:_.string().or(_.null()).describe("Environment variable name to store the extracted result in. If provided, the result will be stored and can be referenced later."),iframeUrl:_.string().or(_.null()).describe("URL or URL regex for the iframe to extract data from.")}),t1=_.object({type:_.literal("ELEMENT_CHECK"),description:_.string().describe("Description of the element to check."),assertionType:_.enum(["EXISTS","VISIBLE","CONTENT_CONTAINS","CONTENT_EQUALS"]).describe("The type of assertion. EXISTS checks if element exists, VISIBLE checks if visible, CONTENT_CONTAINS checks if text contains value, CONTENT_EQUALS checks if text equals value."),value:_.string().or(_.null()).describe("The value to check against (required for CONTENT assertions)."),negated:_.boolean().or(_.null()).describe("If true, asserts the opposite (e.g., does NOT exist)."),timeout:_.number().or(_.null()).describe("Max seconds to wait for the assertion to be true.")}),r1=_.object({type:_.literal("PAGE_CHECK"),value:_.string().describe("The text content to check for on the page."),negated:_.boolean().or(_.null()).describe("If true, checks that the content is NOT present."),timeout:_.number().or(_.null()).describe("Max seconds to wait for the assertion to be true.")}),n1=_.object({type:_.literal("NEW_TAB"),url:_.string().describe("The URL to open in the new tab.")}),o1=_.object({type:_.literal("WAIT_FOR_URL"),matcher:_.discriminatedUnion("type",[_.object({type:_.literal("SUBSTRING"),url:_.string()}),_.object({type:_.literal("GLOB"),glob:_.string()}),_.object({type:_.literal("REGEX"),regex:_.string()}),_.object({type:_.literal("DOMAIN"),domain:_.string()})]).describe("How to match the URL."),caseInsensitive:_.boolean().or(_.null()),negated:_.boolean().or(_.null()).describe("Wait for the URL to NOT match instead."),timeout:_.number().or(_.null()).describe("Max seconds to wait for the URL.")}),Xf=_.object({type:_.literal("SUCCESS")}),Jf=_.object({type:_.literal("FAILURE")}),NR=_.discriminatedUnion("type",[AR,RR,wR,xR,_R,IR,PR,MR,OR,CR]),i1=_.discriminatedUnion("type",[...NR.options,LR]),wa=_.discriminatedUnion("type",[AR,RR,wR,xR,_R,IR,PR,MR,OR,CR,LR,Qz,t1,r1,n1,o1,e1,Gz,Hz,jz,Zz,Vz,$z,Wz,qz,Kz,Yz,Xz,Jz]),Nne=Bc(wa),a1=_.discriminatedUnion("type",[...wa.options,Xf,Jf]),Dne=Bc(_.discriminatedUnion("type",[...NR.options,Xf,Jf])),kne=Bc(_.discriminatedUnion("type",[...i1.options,Xf,Jf])),Une=_.object({command:_.unknown(),thoughts:_.string()});var Ys=t=>{let e=a1.parse(t);switch(e.type){case"CLICK":return{id:ot(),type:"CLICK",doubleClick:e.doubleClick??void 0,rightClick:e.rightClick??void 0,waitForDownload:e.waitForDownload??void 0,downloadTimeoutMs:e.waitForDownload===!0?e.downloadTimeoutMs??void 0:void 0,delayMs:e.delayMs??void 0,target:{type:"description",elementDescriptor:e.description}};case"TYPE":return{id:ot(),type:"TYPE",value:e.text,target:{type:"description",elementDescriptor:e.description},pressEnter:e.pressEnter??void 0,clearContent:e.clearContent};case"PRESS":return{id:ot(),type:"PRESS",value:e.keys.join("+")};case"SELECT_OPTION":return{id:ot(),type:"SELECT_OPTION",target:{type:"description",elementDescriptor:`<select> element matching description: ${e.description}`},choice:Bf.parse(e.option)};case"NAVIGATE":return{id:ot(),type:"NAVIGATE",url:e.url};case"SCROLL":return e.y>0?{id:ot(),type:"SCROLL_DOWN",deltaY:e.y}:{id:ot(),type:"SCROLL_UP",deltaY:-e.y};case"WAIT":return{id:ot(),type:"WAIT",delay:e.timeout};case"AI_ASSERTION":return{id:ot(),type:"AI_ASSERTION",assertion:e.assertion,timeout:e.timeout};case"HOVER":return{id:ot(),type:"HOVER",target:{type:"description",elementDescriptor:e.description}};case"DRAG":return{id:ot(),type:"DRAG",fromTarget:{type:"description",elementDescriptor:e.fromDescription},toTarget:{type:"description",elementDescriptor:e.toDescription},steps:e.steps??void 0,hoverSeconds:e.hoverSeconds??void 0};case"JAVASCRIPT":return{id:ot(),type:"JAVASCRIPT",code:e.code,environment:e.environment??void 0,timeout:e.timeout??void 0};case"AI_EXTRACT":return{id:ot(),type:"AI_EXTRACT",goal:e.goal,schema:e.schema??void 0,envKey:e.envKey??void 0,iframeUrl:e.iframeUrl??void 0};case"COPY":return{id:ot(),type:"COPY",value:e.value};case"PASTE":return{id:ot(),type:"PASTE"};case"REFRESH":return{id:ot(),type:"REFRESH"};case"GO_FORWARD":return{id:ot(),type:"GO_FORWARD"};case"LOCAL_STORAGE":return{id:ot(),type:"LOCAL_STORAGE",key:e.key,value:e.value};case"MOUSE_DRAG":return{id:ot(),type:"MOUSE_DRAG",target:e.description?{type:"description",elementDescriptor:e.description}:void 0,deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),steps:e.steps??void 0};case"ELEMENT_CHECK":{let r;switch(e.assertionType){case"EXISTS":r={type:"ELEMENT_EXISTENCE",condition:"EXISTS",negated:e.negated??void 0};break;case"VISIBLE":r={type:"ELEMENT_EXISTENCE",condition:"VISIBLE",negated:e.negated??void 0};break;case"CONTENT_CONTAINS":r={type:"ELEMENT_CONTENT",operation:"CONTAINS",value:e.value??"",negated:e.negated??void 0};break;case"CONTENT_EQUALS":r={type:"ELEMENT_CONTENT",operation:"EQUALS",value:e.value??"",negated:e.negated??void 0};break;default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.assertionType)}return{id:ot(),type:"ELEMENT_CHECK",target:{type:"description",elementDescriptor:e.description},assertion:r,timeout:e.timeout??void 0}}case"PAGE_CHECK":return{id:ot(),type:"PAGE_CHECK",assertion:{type:"CONTENT",value:e.value??void 0,negated:e.negated??void 0},timeout:e.timeout??void 0};case"NEW_TAB":return{id:ot(),type:"NEW_TAB",url:e.url};case"WAIT_FOR_URL":return{id:ot(),type:"WAIT_FOR_URL",matcher:e.matcher,caseInsensitive:e.caseInsensitive??void 0,negated:e.negated??void 0,timeout:e.timeout??void 0};case"GO_BACK":return{id:ot(),type:"GO_BACK"};case"REQUEST":return{id:ot(),type:"REQUEST",url:e.url,method:e.method,headers:e.headers??void 0,params:e.params??void 0,body:e.body?{type:"json",content:e.body}:void 0,timeout:e.timeout??void 0};case"GRAPHQL_REQUEST":return{id:ot(),type:"GRAPHQL_REQUEST",url:e.url,headers:e.headers??void 0,query:e.query,variables:e.variables??void 0,timeout:e.timeout??void 0};case"SET_HEADER":return{id:ot(),type:"SET_HEADER",name:e.name,value:e.value,requestMatcher:e.requestMatcher??void 0};case"REGISTER_REQUEST_LISTENER":return{id:ot(),type:"REGISTER_REQUEST_LISTENER",requestMatcher:e.requestMatcher,key:e.key};case"RECORD_REQUESTS":return{id:ot(),type:"RECORD_REQUESTS",requestMatcher:e.requestMatcher,key:e.key};case"MOCK_ROUTE":return{id:ot(),type:"MOCK_ROUTE",requestMatcher:e.requestMatcher,responseGenerator:e.responseGenerator,fetchOriginalResponse:e.fetchOriginalResponse??void 0,key:e.key??void 0};case"SUCCESS":case"FAILURE":return{id:ot(),type:e.type};default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}},Gc=_.object({type:_.literal("PRESET_ACTION"),command:wa}),Rp=_.object({type:_.literal("AI_ACTION_DYNAMIC"),text:_.string().describe("The goal description for the AI action. Supports handlebars templates (ex: {{env.PASSWORD}})")});import{z as Zf}from"zod";import{extendZodWithOpenApi as c1}from"zod-openapi";import{z as DR}from"zod";import{extendZodWithOpenApi as s1}from"zod-openapi";import{z as wi}from"zod";var An=wi.object({index:wi.number().optional().describe("global index within a test (in-order traversal)"),id:wi.string(),skipped:wi.boolean().optional(),comment:wi.string().optional(),envKey:wi.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:wi.boolean().optional(),retries:wi.number().optional()});s1(DR);var l1=An.extend({type:DR.literal("PRESET_ACTION")}),an=l1.extend({command:$s}).openapi({ref:"PresetAction"});c1(Zf);var xa=An.extend({type:Zf.literal("AI_ACTION"),text:Zf.string(),steps:an.array().optional()}).openapi({ref:"AIAction"});import{z as Br}from"zod";import{z as Vc}from"zod";import{extendZodWithOpenApi as u1}from"zod-openapi";u1(Vc);var Qf=(r=>(r.V2="2",r.V3="3",r))(Qf||{}),d1=Vc.nativeEnum(Qf),Xs=An.extend({type:Vc.literal("AI_ACTION_DYNAMIC"),text:Vc.string(),retries:Vc.number().optional(),version:d1.optional()}).openapi({ref:"AIActionDynamic"});import{z as kR}from"zod";var eS=An.extend({type:kR.literal("CONDITIONAL"),skipped:kR.boolean().optional()});import{z as Ge}from"zod";var p1=Ge.object({cacheKey:Ge.string(),cacheExpiryMs:Ge.number()}),tS=An.extend({id:Ge.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:Ge.record(Ge.string()).optional(),cacheConfig:p1.optional()}),Xn=tS.extend({type:Ge.literal("MODULE"),moduleId:Ge.string().uuid()}),m1=Ge.union([Xn.pick({type:!0,moduleId:!0}),Ge.record(Ge.unknown())]),g1=Ge.object({type:Ge.literal("URL_REGEX"),regex:Ge.string()}),h1=Ge.object({type:Ge.literal("PAGE_CHECK"),substring:Ge.string()}),rS=Ge.object({cacheInvalidation:Ge.discriminatedUnion("type",[h1,g1]).optional()}),Xr=Ge.object({moduleId:Ge.string().uuid(),name:Ge.string(),description:Ge.string().nullish(),enabled:Ge.boolean().nullish(),parameters:Ge.string().array().nullish(),defaultParameters:Ge.record(Ge.string(),Ge.string()).nullish(),parameterEnums:Ge.record(Ge.string(),Ge.string().array()).nullish(),defaultCacheKey:Ge.string().nullish(),defaultCacheTtl:Ge.number().nullish(),defaultCacheAllInvocations:Ge.boolean().nullish(),autoAuth:Ge.boolean().nullish(),advanced:rS.nullish()});var nS=t=>t.type==="RESOLVED_MODULE",oS=t=>t.type==="AI_ACTION"||t.type==="AI_ACTION_DYNAMIC"||t.type==="CONDITIONAL"||t.type==="PRESET_ACTION";import{z as Rn}from"zod";var iS=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(iS||{});var f1=Rn.discriminatedUnion("type",[Rn.object({type:Rn.literal("NAVIGATE_URL"),url:Rn.string().url()}),Rn.object({type:Rn.literal("GO_TO_SECTION_START")})]),S1=Rn.object({trigger:Rn.nativeEnum(iS).optional(),attempts:Rn.number().int().optional(),restartBehavior:f1}),$c=An.extend({type:Rn.literal("SECTION"),description:Rn.string().describe("user provided goal of what the section should accomplish"),plan:Rn.string().array().optional(),autohealingConfig:S1.optional()});var UR=Xr.merge(tS).extend({type:Br.literal("RESOLVED_MODULE"),steps:Br.lazy(()=>kt.array())}),aS=Xr.extend({steps:Br.lazy(()=>kt.array())}),sS=$c.extend({steps:Br.lazy(()=>Et.array())}),y1=$c.extend({steps:Br.lazy(()=>kt.array())}),_a=eS.extend({blocks:Br.object({assertion:Br.lazy(()=>an),steps:Br.lazy(()=>Et.array())}).array(),elseSteps:Br.lazy(()=>Et.array().optional())}),b1=eS.extend({blocks:Br.object({assertion:Br.lazy(()=>an),steps:Br.lazy(()=>kt.array())}).array(),elseSteps:Br.lazy(()=>kt.array().optional())}),Et=Br.discriminatedUnion("type",[an,xa,Xs,Xn,_a,sS]),kt=Br.discriminatedUnion("type",[an,xa,Xs,UR,b1,y1]);import{z as Cn}from"zod";var E1=Cn.object({steps:Et.array(),beforeSteps:Et.array().nullish(),afterSteps:Et.array().nullish()}),xi=Cn.object({steps:kt.array(),beforeSteps:kt.array().nullish(),afterSteps:kt.array().nullish()}),Ia=Cn.object({steps:Cn.record(Cn.string(),Cn.unknown()).array(),beforeSteps:Cn.record(Cn.string(),Cn.unknown()).array().nullish(),afterSteps:Cn.record(Cn.string(),Cn.unknown()).array().nullish()});var Qe="1.0.22",lS="0.0.3";import{z as rr}from"zod";import{z as Pa}from"zod";var T1=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,st=t=>{let e=t.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var Ko=Pa.string().min(1).max(255).superRefine((t,e)=>{try{_i(t)}catch(r){return e.addIssue({code:Pa.ZodIssueCode.custom,message:r.message,fatal:!0}),Pa.NEVER}});function _i(t){if(t=t.toLowerCase().trim(),t.length===0||t.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(t))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(t.endsWith("-")||t.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(t.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(t))throw new Error(`"${t}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(t)||/^\s|\s$/.test(t))throw new Error("Name cannot start or end with a space or dot.");if(t.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(t==="none")throw new Error("Name cannot be 'none'.");if(t.match(T1))throw new Error("Name cannot be a UUID. Please choose a different name.")}var Cp=Pa.preprocess(t=>t===null?"":t,Pa.union([Pa.string().url(),Pa.literal("")])).optional();var Ma=rr.enum(["setup","teardown","main"]).describe("Test section to modify: 'setup' corresponds to beforeSteps (steps that run before the test), 'teardown' corresponds to afterSteps (steps that run after the test), 'main' is synonymous with steps (the main test steps)"),cS=["AI_EXTRACT","JAVASCRIPT","REQUEST","GRAPHQL_REQUEST","AUTH_SAVE","COPY"],Ii=rr.object({id:rr.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:Ko.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:rr.string().optional().describe("The path of the entity to resolve.")}).describe("A selector for a single entity. Exactly one of id, name, or path must be provided. Id is recommended.").refine(t=>[t.id,t.name,t.path].filter(Boolean).length===1,"Exactly one of id, name, or path must be provided."),v1=rr.object({selector:Ii,inputs:rr.record(rr.string()).or(rr.null())}),wp=rr.object({type:rr.literal("PRESET_ACTION"),action:wa,envKey:rr.string().or(rr.null()).describe(`key in the environment to save the result of this step to. Only use this for ${cS.join(" or ")} steps.`)}),xp=rr.object({type:rr.literal("MODULE"),module:v1}),uS=rr.object({type:rr.literal("AI_ACTION_DYNAMIC"),text:rr.string().describe("The goal description for the AI action. Supports handlebars templates like {{env.VARIABLE_NAME}}.")}),FR=rr.discriminatedUnion("type",[wp,xp,uS]);function BR(t,e){let r=e.parameters??[],n=e.defaultParameters??{},o=e.parameterEnums??{},i=t??{},a=new Set([...r,...Object.keys(n)]),s=Object.keys(i).filter(u=>!a.has(u));if(s.length>0){let u=a.size>0?Array.from(a).join(", "):"none";throw new Error(`Module "${e.name}" received unknown parameters: ${s.join(", ")}. Valid parameters are: ${u}`)}let l=r.filter(u=>!(u in n)).filter(u=>!(u in i));if(l.length>0)throw new Error(`Module "${e.name}" is missing required parameters: ${l.join(", ")}. Please call momentic_module_get to inspect the module's parameter requirements.`);for(let[u,d]of Object.entries(i))if(u in o){let p=o[u];if(p&&!p.includes(d))throw new Error(`Module "${e.name}" parameter "${u}" must be one of: ${p.join(", ")}. Received: "${d}"`)}}var zR=D.object({phrase:D.string()}),dS=D.object({thoughts:D.string().optional(),result:D.union([D.literal("NOT_FOUND"),D.string(),D.number(),D.array(D.unknown()),D.record(D.unknown(),D.unknown()),D.unknown()])}),Mie=D.object({text:D.string()}),A1=D.boolean().or(D.nativeEnum(Yr)).transform(t=>!(!t||t==="irrelevant")),HR=D.object({attributes:D.array(D.string()).nullish(),text:A1.nullish(),position:D.nativeEnum(Yr).nullish(),shape:D.nativeEnum(Yr).nullish()}),R1=D.object({id:D.number().int(),requirements:HR}),C1=R1.array(),_p=D.object({thoughts:D.string(),review:D.string().optional(),id:D.number().int(),updatedMemory:xc.optional(),requirements:HR.nullish().transform(t=>{if(t!==null)return t}),additionalElements:C1.nullish().transform(t=>{if(t!==null)return t})});var jR=(m=>(m.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",m.FEW_WORDS="FEW_WORDS",m.STYLE_TAG="STYLE_TAG",m.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",m.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",m.NONE="NONE",m.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",m.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",m.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",m.PREFER_ASSERTION="PREFER_ASSERTION",m.HTML_ELEMENTS="HTML_ELEMENTS",m.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",m.NEEDS_DATE_VARIABLE="NEEDS_DATE_VARIABLE",m))(jR||{}),pS=(o=>(o.NONE="NONE",o.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",o.COPILOT_MISUSE="COPILOT_MISUSE",o.IRRELEVANT_MESSAGE="IRRELEVANT_MESSAGE",o))(pS||{});var GR=D.object({thoughts:D.string(),category:D.nativeEnum(jR)}),VR=D.object({thoughts:D.string(),category:D.nativeEnum(pS)}),$R=D.object({anyUntestedSteps:D.boolean().describe("True if any steps (especially new/edited) were not fully run (preview + add) or if their immediately following step, if any, was not run."),possibleErrors:D.object({error:D.string(),solutionFound:D.object({description:D.string(),passedSuccessfully:D.boolean().describe("Whether the solution passed successfully")})}).array().describe("Information about any errors we encountered and how we solved them"),safeToContinue:D.boolean().describe("Whether it is safe to continue or if we are stuck and need intervention"),finalReport:D.string().describe("A final summary report of the session, are we stuck, can we go forward, do we need help, or are we good to go?")}),WR=D.object({summary:D.string().describe("Single large block of text summary of the full chat thread; high-signal only."),errorsRanInto:D.array(D.object({error:D.string(),workAround:D.string()})).default([]).describe("List of encountered errors and mitigations."),untestedSteps:D.array(D.string()).default([]).describe("Steps added/discussed but not validated.")}),w1=D.discriminatedUnion("op",[D.object({op:D.literal("replace"),path:D.string(),value:D.string()}),D.object({op:D.literal("add"),path:D.string(),value:D.string()}),D.object({op:D.literal("remove"),path:D.string()})]),Oie=D.object({thoughts:D.string(),patches:w1.array()}),x1=[D.literal("add"),D.literal("replace"),D.literal("remove")],_1=D.object({op:D.union(x1),path:D.string(),value:kt.optional()}),qR=D.object({patches:_1.array(),thoughts:D.string()}),mS=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(mS||{}),KR=D.object({thoughts:D.string(),scenario:D.nativeEnum(mS),instructions:D.string().nullish()}),YR=D.object({reasoning:D.string(),scenario:D.string(),patch:D.null().optional()}),Lie=D.object({thoughts:D.string(),evaluation:D.number().min(0).max(10)}),Nie=D.object({observations:D.string(),reasoning:D.string(),command:pp});var gS=D.object({summary:D.string(),reasoning:D.string(),evaluation:D.discriminatedUnion("type",[D.object({type:D.literal("DONE")}),D.object({type:D.literal("RIGHT_TRACK")}),D.object({type:D.literal("WRONG_TRACK"),feedback:D.string()}),D.object({type:D.literal("IMPOSSIBLE")})])}),I1=D.object({startId:D.number().int(),endId:D.number().int()}),XR=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))(XR||{}),JR=D.object({categoryThoughts:D.string(),category:D.nativeEnum(XR),relevantSections:I1.array()}),Yo=D.boolean().nullish().transform(t=>t??!1),ZR=D.object({thoughts:D.string().optional(),isPageReady:Yo,descriptionLabels:D.object({usesTextContent:Yo,usesAppearance:Yo,usesPosition:Yo,usesRelativeElements:Yo,usesSingleQuotes:Yo,isAmbiguous:Yo,targetDoesNotExist:Yo,usesIcon:Yo}).optional()});import{z as U}from"zod";import*as Oe from"zod";var Hie=Oe.object({thoughts:Oe.string().optional().describe("only provided if a description was provided"),target:Ti.optional().describe("only provided if a description was provided"),pageState:Oe.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:Oe.object({label:Oe.string(),value:Oe.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:Oe.object({data:Oe.string().or(ba),height:Oe.number().int(),width:Oe.number().int()}).optional().describe("only provided if returnScreenshot is true")}),QR=Oe.union([Oe.literal("ELEMENT_CHECK"),Oe.literal("NEGATED_CHECK"),Oe.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),Oe.literal("SELECT_OPTION"),Oe.literal("TYPE")]);function Oa(t){if(!("useSelector"in t&&t.useSelector)){if(t.type==="SELECT_OPTION")return"SELECT_OPTION";if(t.type==="TYPE")return"TYPE";if(t.type==="ELEMENT_CHECK"&&t.assertion.type==="ELEMENT_EXISTENCE"&&t.assertion.condition==="EXISTS"&&t.assertion.negated)return"NEGATED_CHECK";if(t.type==="ELEMENT_CHECK"&&t.assertion.type==="ELEMENT_EXISTENCE"&&t.assertion.condition==="VISIBLE"&&t.assertion.negated)return"NEGATED_ELEMENT_VISIBLE_CHECK";if(t.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Wc=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(Wc||{}),Js=Oe.object({matched:Oe.boolean(),reason:Oe.string().optional().describe("Human understandable description"),logs:Oe.string().array().optional().describe("Logs for debugging")}),P1=Js.extend({type:Oe.literal("USER_SELECTOR")}),M1=Js.extend({type:Oe.literal("CSS_SELECTOR"),selectors:Oe.string().array()}),O1=Js.extend({type:Oe.literal("HYBRID_SELECTOR")}),L1=Js.extend({type:Oe.literal("HTML_DISTANCE"),distance:Oe.number().optional(),closestElement:Oe.string().optional(),savedElement:Oe.string().optional()}),N1=Js.extend({type:Oe.literal("TEMPLATE_MATCHING")}),D1=Js.extend({type:Oe.literal("AUTO_FRAME"),logs:Oe.string().array().optional()}),eC=Oe.discriminatedUnion("type",[P1,M1,O1,L1,N1,D1]);import{z as Yc}from"zod";import{z as Y1}from"zod";import*as ne from"zod";import{extendZodWithOpenApi as H1}from"zod-openapi";import{cloneDeep as qc}from"lodash-es";import sC from"truncate-json";import*as Da from"zod";import{extendZodWithOpenApi as F1}from"zod-openapi";import{z as Rr}from"zod";import{z as ve}from"zod";import{z as hS}from"zod";var ho=(o=>(o.CHROMIUM="Chromium",o.GOOGLE_CHROME="Google Chrome",o.CHROME_FOR_TESTING="Chrome for Testing",o.ORG_DEFAULT="Org Default",o))(ho||{});var Ip=hS.object({width:hS.number().min(200).max(1e4),height:hS.number().min(200).max(1e4)}),tC={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},Vie=Object.keys(tC);var Ar=tC["Desktop Large"],Pi="en-us",Mi="America/Los_Angeles",k1="Chromium",Oi={latitude:37.7749,longitude:-122.4194};function Pp({browserType:t,orgDefaultBrowserType:e}){return t==="Org Default"&&e?e:t??k1}var Mp=(a=>(a.ClipboardRead="clipboard-read",a.ClipboardWrite="clipboard-write",a.Microphone="microphone",a.Camera="camera",a.Geolocation="geolocation",a.LocalNetworkAccess="local-network-access",a))(Mp||{});var fS=ve.object({autoFollowNewTabs:ve.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:ve.union([ve.boolean(),ve.literal("inputs-only")]).optional(),ignoreHrefForCaching:ve.boolean().optional(),disableSecondaryCacheResolution:ve.boolean().optional(),hybridSelectorMode:ve.enum(["off","test","prefer"]).optional(),globalLocatorRedirect:ve.union([ve.boolean(),ve.literal("always")]).optional(),visualActions:ve.boolean().optional(),autoExpandIframes:ve.boolean().optional(),disableHtmlSnapshots:ve.boolean().optional(),defaultBrowserType:ve.nativeEnum(ho).optional(),importantAttributes:ve.string().array().optional(),importantClasses:ve.string().array().optional(),importantStyles:ve.string().array().optional()});var rC=1e4,nC=6e4,U1=ve.object({server:ve.string(),username:ve.string().optional(),password:ve.string().optional()}),La=fS.extend({pageLoadTimeoutMs:ve.number().optional().refine(t=>t===void 0||t<=nC&&t>=-1,{message:`Page load timeout must be between 0 and ${nC/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:ve.number().optional().refine(t=>t===void 0||t<=rC&&t>=-1,{message:`Smart waiting timeout must be between 0 and ${rC/1e3} seconds`}),localChromeExtensionPaths:ve.string().array().optional(),extraHeaders:ve.record(ve.string(),ve.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:ve.record(ve.string(),ve.record(ve.string(),ve.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:ve.string().optional(),disableGpu:ve.boolean().optional(),disableBrowserMonitoring:ve.boolean().optional().describe("Disable console logs and network request recording, which power the console and network tab in the run viewer"),disableConsoleLogs:ve.boolean().optional().describe("Disable console log recording in the run viewer."),disableNetworkLogs:ve.boolean().optional().describe("Disable network request recording in the run viewer."),bustCacheOnBoundingBoxChange:ve.boolean().optional().describe("This setting is deprecated. Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:ve.boolean().optional().describe("Allow fetching the partial accessibility tree if fetching the full tree takes too long."),ignoreHttpsErrors:ve.boolean().optional().describe("Ignore HTTPS errors, such as self-signed certificates and certificate errors. This can be useful for testing sites that use self-signed certificates or certificate errors."),proxy:U1.optional().describe("HTTP proxy server to use for the entire browser. This can dramatically increase network latency."),disableFullStory:ve.boolean().optional().describe("Disable FullStory, a third-party analytics tool that can significantly impact browser performance. This can be useful for testing sites that use FullStory."),grantedPermissions:ve.nativeEnum(Mp).array().optional().describe("List of permissions to grant to sites. If not provided, all permissions are granted.")});var nr="BASE_URL",Op="CURRENT_URL",Na="ENV_NAME",Zs="TEST_NAME",Qie={[nr]:"https://www.google.com"},oC=Rr.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),iC=Rr.object({name:Rr.string(),variables:Rr.record(Rr.string().describe("variable name"),Rr.string().describe("variable value"))}),aC=Rr.object({name:Rr.string(),variables:Rr.record(Rr.string().describe("variable name"),Rr.unknown().describe("variable value")),browser:La.optional()});var eae=Rr.object({name:Rr.string(),variables:Rr.record(Rr.string().describe("variable name"),Rr.unknown().describe("variable value"))});F1(Da);var SS=Da.object({env:Da.record(Da.unknown())}).openapi({ref:"TestContextSnapshot"}),B1="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",z1=[nr,Na,Zs],lC=[Op,nr,Na,Zs],zr=class t{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,r=void 0,n={}){return new t({baseUrl:"about:blank",currentUrl:"about:blank",testName:e,envName:r,variablesFromEnvironment:n})}static fromSnapshot({snapshot:e,environmentVariables:r}){let n=e.env[nr]??"about:blank",o=e.env[Op]??"about:blank",i=e.env[Na],a=e.env[Zs],s={};for(let[l,u]of Object.entries(e.env))lC.includes(l)||(r??{})[l]===void 0&&(s[l]=u);return new t({baseUrl:n,currentUrl:o,dynamicVariables:s,envName:i,testName:a,variablesFromEnvironment:r??{}})}setEnvVariables(e){let r=qc(e);this.env=Object.assign(this.env,r)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,r){this.varsFromMomenticEnvironment[e]=r}getVariable(e){return this.env[e]}setVariable(e,r){z1.includes(e)||(this.env[e]=r)}getEnvName(){return this.env[Na]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return qc(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([n,o])=>lC.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,B1]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=sC(JSON.stringify(o),5e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:r}=sC(JSON.stringify(e.env),25e3);try{e.env=JSON.parse(r)}catch{e.env={}}return e}setCurrentUrl(e){this.env[Op]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=qc(e.variablesFromEnvironment),this.setMomenticSystemVariable(nr,e.baseUrl),e.envName&&this.setMomenticSystemVariable(Na,e.envName),e.testName&&this.setMomenticSystemVariable(Zs,e.testName)}getDynamicVariablesCopy(){return qc(this.env)}getVariablesFromEnvironmentCopy(){return qc(this.varsFromMomenticEnvironment)}};var Ye=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Ye||{}),Lp=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(Lp||{});H1(ne);var yS=ne.object({beforeUrl:ne.string().optional(),afterUrl:ne.string().optional(),message:ne.string().optional(),beforeSnapshot:ne.string().optional(),afterSnapshot:ne.string().optional(),startedAt:ne.coerce.date(),finishedAt:ne.coerce.date()}),j1=yS.extend({viewport:ne.object({height:ne.number(),width:ne.number()}).nullish(),status:ne.nativeEnum(Lp),message:ne.string().optional(),elementInteracted:ne.string().optional()}),ka=yS.extend({status:ne.nativeEnum(Ye),message:ne.string().optional(),data:ne.unknown().optional(),beforeTestContext:SS.optional(),afterTestContext:SS.optional(),failureReason:ne.nativeEnum(Ie).optional(),details:ne.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information."),trace:ne.unknown().optional().describe("Web interaction trace from step execution (WebSectionSpan)")}).openapi({ref:"StepResultMetadata"}),bS=(r=>(r.NOT_ELIGIBLE="NOT_ELIGIBLE",r.ATTEMPTED="ATTEMPTED",r))(bS||{}),Np=ka.merge(an).extend({results:j1.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:ne.lazy(()=>Jt.array()).optional(),failureRecoveryStatus:ne.object({type:ne.nativeEnum(bS),message:ne.string()}).optional()}),G1=ka.merge(xa).extend({results:ne.lazy(()=>Np.array()),previousAttempts:ne.lazy(()=>Jt.array()).optional()}),V1=ka.merge(Xs).extend({results:ne.lazy(()=>Np.array()),previousAttempts:ne.lazy(()=>Jt.array()).optional()}),$1=ka.merge(Xn).extend({moduleName:ne.string().optional(),results:ne.lazy(()=>Jt.array()),previousAttempts:ne.lazy(()=>Jt.array()).optional()}),W1=ka.merge(_a).extend({assertionResult:Np.optional(),results:ne.lazy(()=>Jt.array()).describe("results for the block actually executed"),previousAttempts:ne.lazy(()=>Jt.array()).optional()}),q1=ka.merge($c).extend({results:ne.lazy(()=>Jt.array()),healingAttempts:ne.lazy(()=>Jt.array().array()).optional(),previousAttempts:ne.lazy(()=>Jt.array()).optional()}),Jt=ne.discriminatedUnion("type",[G1,V1,Np,$1,W1,q1]),Dp=ka.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),K1=yS.extend({index:ne.number().optional(),userFacingStepReference:ne.string().optional(),description:ne.string(),pageState:ne.string().optional(),elementInteracted:ne.string().optional(),startedAt:ne.coerce.date().or(ne.string()).optional().catch(void 0),finishedAt:ne.coerce.date().or(ne.string()).optional().catch(void 0)}),kp=K1.extend({beforeScreenshot:ne.string().optional(),afterScreenshot:ne.string().optional()});var ES=Y1.object({results:Jt.array().describe("main results"),beforeResults:Jt.array().optional(),afterResults:Jt.array().optional()}),Kc=ES.partial();import{z as Y}from"zod";import{extendZodWithOpenApi as rH}from"zod-openapi";import X1 from"zod";var Ua=(r=>(r.ANDROID="ANDROID",r.IOS="IOS",r))(Ua||{}),Rae=X1.nativeEnum(Ua);var Li=(n=>(n.WEB="WEB",n[n.ANDROID="ANDROID"]="ANDROID",n[n.IOS="IOS"]="IOS",n))(Li||{}),xae={WEB:"Web",[Li.ANDROID]:"Android",[Li.IOS]:"iOS"};import{z as gt}from"zod";import{isValidCron as J1}from"cron-validator";import{z as Le}from"zod";var cC=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var uC=1e4,Qs=La.extend({browserType:Le.nativeEnum(ho).optional(),slowMoMs:Le.number().optional().refine(t=>t===void 0||t<=uC&&t>=-1,{message:`Slow motion must be between 0 and ${uC} milliseconds`}),basicAuthorization:Le.object({username:Le.string().optional(),password:Le.string().optional()}).optional(),geolocation:Le.object({latitude:Le.coerce.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Le.coerce.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:Le.boolean().optional(),locale:Le.string().optional(),timezone:Le.enum(cC).optional(),colorScheme:Le.enum(["light","dark"]).optional()}),dC=["extraHeaders","basicAuthorization","localChromeExtensionPaths","proxy"],TS=Le.object({useMemory:Le.boolean().optional(),failureRecovery:Le.boolean().optional().describe("undefined means inherit org settings")}),vS=TS.extend({disableAICaching:Le.boolean().optional(),failureRecoveryInstructions:Le.string().optional()}),Z1=Le.object({viewport:Ip.optional()}),Fa=Z1.merge(vS).merge(Qs),el=Le.object({cron:Le.string().refine(t=>J1(t),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:Le.boolean().default(!1),env:Le.string().optional(),timeZone:Le.string().default("America/Los_Angeles"),jobKey:Le.string().optional()}),tl=Le.object({onSuccess:Le.boolean().default(!1),failureMessage:Le.string().optional(),onFailure:Le.boolean().default(!0),successMessage:Le.string().optional()}),Q1=Le.object({name:Le.string(),required:Le.boolean().optional(),defaultValue:Le.string().describe("this is not optional because we need a value when the editor is first loaded")}),Up=Q1.array(),eH=Le.object({name:Le.string(),value:Le.string()}),pC=eH.array(),Fp=Le.object({name:Le.string(),default:Le.boolean().optional(),fixtures:oC.array().optional()});var Xo=TS.extend({aiAction:gt.boolean().optional(),agentConfig:gt.record(gt.string(),gt.string()).optional(),aiFailureAnalysis:gt.boolean().optional(),aiPageFiltering:gt.boolean().optional().describe("rag v2 feature flag")}),tH=gt.object({cliOnly:gt.boolean().optional(),neverShowUsageBanner:gt.boolean().optional()}),AS=gt.object({fakerConstantSeed:gt.boolean().optional()}),mC=gt.object({ai:Xo.optional(),githubAppInstallationId:gt.number().nullish(),githubAppSummaryMessageEnabled:gt.boolean().nullish(),githubReleaseAppInstallationId:gt.number().nullish(),gitlabAppAccessToken:gt.string().nullish(),gitlabAppBaseUrl:gt.string().nullish(),qaseAccessToken:gt.string().nullish(),testSuggestionsEnabled:gt.boolean().nullish(),browser:fS.optional(),internal:tH.optional(),advanced:AS.optional()}),zae=gt.object({globalOverrides:gt.record(gt.string()).optional(),agentConfig:gt.record(gt.string(),gt.string()).optional()}),Hae=gt.record(gt.string(),gt.string()).nullish();rH(Y);var Jr={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},Ve=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(Ve||{}),Bp=(r=>(r.BEFORE_ALL="BEFORE_ALL",r.AFTER_ALL="AFTER_ALL",r))(Bp||{});var nH=Y.object({attempts:Y.number().int().nonnegative()}),Wt=Y.string().pipe(Y.coerce.date()).or(Y.date()),Ba=Y.object({id:Y.string(),runKey:Y.string(),organizationId:Y.string(),executionType:Y.nativeEnum(Li).optional().default("WEB"),createdAt:Wt,createdBy:Y.string(),flake:Y.boolean().nullish(),scheduledAt:Wt.or(Y.null()),startedAt:Wt.or(Y.null()),updatedAt:Wt.nullish(),finishedAt:Wt.or(Y.null()),resolvedBaseUrl:Y.string().nullish(),environmentName:Y.string().nullish(),gitBranchName:Y.string().nullish(),githubRepository:Y.string().nullish(),gitlabProjectPath:Y.string().nullish(),labels:Y.array(Y.string()).optional(),gitOriginUrl:Y.string().nullish(),gitCommitSha:Y.string().nullish(),gitCommitShaShort:Y.string().nullish(),gitCommitAuthorName:Y.string().nullish(),cliVersion:Y.string().nullish(),section:Y.nativeEnum(Bp).nullish(),status:Y.nativeEnum(Ve),trigger:Y.nativeEnum(Jr),attempts:Y.number(),runAttempts:Y.array(Y.object({id:Y.string(),status:Y.nativeEnum(Ve),startedAt:Wt.or(Y.null()),finishedAt:Wt.or(Y.null())})).optional(),videos:Y.array(Y.string()).optional(),failureReason:Y.nativeEnum(Ie).nullish(),failureDetails:Tp.nullish(),failureRecoveryDetails:nH.nullish(),pipelineId:Y.string().nullish(),resolvedInputs:Y.record(Y.string(),Y.string()).nullish(),quarantined:Y.boolean().nullish().default(!1),quarantinedReason:Y.string().nullish(),localTestId:Y.string().nullish(),testId:Y.string().nullish(),testName:Y.string().nullish(),description:Y.string().nullish(),directory:Y.string().nullish(),test:Y.object({name:Y.string(),id:Y.string()}).nullish().default(null),suiteId:Y.string().nullish(),aiSettings:Xo.nullish()}).openapi({ref:"RunMetadata"}),oH={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},zp=Ba.pick({...oH,test:!0}),gC=Ba.omit({failureReason:!0,failureDetails:!0,test:!0}),RS=Ba.extend({stepsSnapshot:Y.array(Y.record(Y.unknown())).nullish(),resolvedInputs:Y.record(Y.string(),Y.string()).nullish(),test:Y.object({name:Y.string(),id:Y.string(),description:Y.string().nullish(),baseUrl:Y.string().nullish(),advanced:Fa.nullish()}).nullish()}).merge(ES),hC=t=>t.includes("PASSED")&&t.includes("FAILED");var iH=Yc.object({id:Yc.string().uuid(),startedAt:Wt.or(Yc.null()),finishedAt:Wt.or(Yc.null()),status:Yc.nativeEnum(Ve)}).merge(Kc),rse=iH.array();var Hp=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(Hp||{});import{z as Ht}from"zod";var fC=Ht.object({id:Ht.string(),status:Ht.nativeEnum(Ve),trigger:Ht.nativeEnum(Jr),createdAt:Wt,startedAt:Wt.nullish(),finishedAt:Wt.nullish(),gitCommitSha:Ht.string().nullish(),gitCommitShaShort:Ht.string().nullish(),gitCommitTimestamp:Wt.nullish(),gitBranchName:Ht.string().nullish(),gitOriginUrl:Ht.string().nullish(),gitCommitMessage:Ht.string().nullish(),gitCommitAuthorName:Ht.string().nullish(),githubRepository:Ht.string().nullish(),gitlabProjectPath:Ht.string().nullish(),pipelineId:Ht.string().nullish(),cliVersion:Ht.string().nullish(),labels:Ht.string().array().optional(),localSuiteName:Ht.string().optional(),suite:Ht.object({id:Ht.string(),name:Ht.string()}).nullish(),runs:Ht.object({status:Ht.nativeEnum(Ve)}).array()}).openapi({ref:"RunGroup"}),SC=fC.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0,localSuiteName:!0}).extend({runs:zp.array()}),lse=fC.extend({runs:Ba.array()});import{z as or}from"zod";var aH=or.object({type:or.literal("TARGETING"),name:or.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:eC.array(),pageState:or.string().optional(),targetSource:or.nativeEnum(Go).optional(),targetUpdateTime:or.string().optional()}),sH=or.object({type:or.literal("AI_LOCATION"),matched:or.boolean(),pageState:or.string().optional(),ragUsed:or.boolean().optional(),thoughts:or.string().optional()}),lH=or.object({type:or.literal("ASSERTION"),relevantElementsSerialized:or.string().array().optional(),pageState:or.string().optional(),ragUsed:or.boolean().optional()}),yC=or.discriminatedUnion("type",[aH,sH,lH]);function jp(){return{details:[]}}import{z as jt}from"zod";var cH=jt.object({id:jt.string(),name:jt.string()}),Sse=cH.merge(jt.object({createdAt:Wt,createdBy:jt.string(),schedule:el,notification:tl,environment:jt.object({name:jt.string()}).nullish(),beforeTests:jt.object({id:jt.string()}).array().nullish(),afterTests:jt.object({id:jt.string()}).array().nullish()})),bC=jt.object({id:jt.string().uuid(),orgId:jt.string(),createdAt:Wt,startedAt:Wt.or(jt.null()),finishedAt:Wt.or(jt.null()),status:jt.nativeEnum(Ve),trigger:jt.nativeEnum(Jr),suite:jt.object({id:jt.string(),name:jt.string()}).nullish(),runs:Ba.array()}),yse=bC.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),EC=bC.extend({runs:zp.array()});import{z as wn}from"zod";import{cloneDeep as Tse}from"lodash-es";import{z as it}from"zod";var xse=it.object({thoughts:it.string(),subGoals:it.object({instruction:it.string()}).array()}),_se=it.object({thoughts:it.string(),newPlanMarkdown:it.string()}),Ise=it.object({thoughts:it.string(),correct:it.boolean(),failedActionIndex:it.number().optional()}),uH=it.object({type:it.literal("PLANNING"),beforePlan:it.string(),goalDecision:it.string(),thoughts:it.string()}),dH=it.object({type:it.literal("RUNNING"),stepDisplayName:it.string(),status:it.nativeEnum(Ye),results:Jt.array()}),pH=it.object({type:it.literal("REVISING"),beforePlan:it.string(),afterPlan:it.string(),errString:it.string(),diffs:it.string(),thoughts:it.string()}),mH=it.object({type:it.literal("SYSTEM"),message:it.string()}),gH=it.discriminatedUnion("type",[uH,dH,pH,mH]),TC=gH.array();var Nse=wn.object({id:wn.string(),scheduledAt:wn.coerce.date().nullable(),startedAt:wn.coerce.date().nullable(),finishedAt:wn.coerce.date().nullable(),status:wn.nativeEnum(Ve),history:TC.nullable(),testPlan:wn.object({id:wn.string(),name:wn.string()}).nullable(),test:wn.object({id:wn.string(),name:wn.string()}).nullable()});import{z as Hr}from"zod";var CS=Hr.object({content:Hr.string(),ids:Hr.string().array(),tokenLength:Hr.number()}),hH=Hr.object({chunks:CS.array()}),Jse=Hr.object({ids:Hr.string().array(),score:Hr.number(),tokenLength:Hr.number()}),Zse=hH.extend({description:Hr.string().describe("Input to pass to RAG engine"),tokenLimit:Hr.number()}),vC=Hr.object({ids:Hr.number().array()}),AC=Hr.object({indices:Hr.number().array()});var qt=U.object({disableCache:U.boolean().optional(),useMemory:U.boolean().optional(),clientMode:U.enum(["interactive","runner"]).optional(),loggerTags:U.record(U.string(),U.string()).optional(),langfuseSessionId:U.string().optional(),agentConfigVersion:U.string().optional()}),sle=qt.extend({chunks:CS.array(),description:U.string().describe("Input to pass to AI"),type:U.union([U.literal("locator"),U.literal("assertion"),U.literal("ai-action")]),softTokenLimit:U.number(),hardTokenLimit:U.number(),callId:U.string().optional()}),fH=U.object({screenshotBase64AfterCommand:U.string(),urlAfterCommand:U.string(),serializedCommand:U.string(),elementInteracted:U.string().optional(),thoughts:U.string().optional()}),RC=U.object({goal:U.string(),browserState:U.string(),screenshot:U.string(),source:QR.optional().catch(void 0),isTieBreakerCall:U.boolean().optional(),memory:U.discriminatedUnion("type",[Vo,U.object({type:U.literal("RESOLVED_TRACES"),traces:U.unknown().array()})]).optional(),firstPassModelResults:_p.array().optional()}),CC=U.object({target:U.string().or(U.number()),browserState:U.string().optional(),screenshot:U.string().optional(),boundingBox:U.object({x:U.number(),y:U.number(),height:U.number(),width:U.number()}).optional()}),wC=U.object({goal:U.string(),browserState:U.string(),screenshot:U.string().optional(),returnSchema:U.string().optional()}),wS=U.union([U.literal("NEGATED_CHECK"),U.literal("CONDITIONAL_CHECK")]),xC=U.object({goal:U.string(),browserState:U.string(),screenshot:U.string(),url:U.string(),contextChoice:zf.optional(),memory:U.discriminatedUnion("type",[Ea,U.object({type:U.literal("RESOLVED_TRACES"),traces:U.unknown().array()})]).optional(),source:wS.optional()}),_C=U.object({command:$s}),IC=U.object({message:U.string()}),PC=U.object({messagesAndToolCalls:U.array(U.string())}),MC=U.object({messagesAndToolCalls:U.array(U.string()).describe("Chat history to condense for summarization")}),xS=U.object({goal:U.string(),browserState:U.string(),startingScreenshot:U.string().optional(),screenshot:U.string(),url:U.string(),history:fH.array(),actionHint:U.string().optional(),lastError:U.string().optional()}),OC=U.object({results:kp.array(),errorMessage:U.string(),errorStack:U.string().optional()}),LC=U.object({results:kp.array(),goal:U.string(),errorMessage:U.string()}),NC=U.object({failedResults:kp.array(),nextStepsSerialized:U.string().array(),currentUrl:U.string(),currentPageState:U.string(),currentScreenshot:U.string(),customInstructions:U.string().optional(),testDescription:U.string().optional()}),lle=U.object({description:U.string(),type:U.union([U.literal("locator"),U.literal("assertion"),U.literal("ai-action")]),excerpt:U.string()}),DC=U.object({type:U.string(),browserContext:U.string(),currentStep:U.string(),screenshot:U.string()}),kC=U.object({description:U.string(),browserState:U.string(),screenshot:U.string()});import{z as Xc}from"zod";var dle=Xc.object({goal:Xc.string()}),UC=Xc.object({keywords:Xc.array(Xc.string())});import{z as rl}from"zod";var Jc=(o=>(o.LOCATOR="locator",o.ASSERTION="assertion",o.VISUAL_ASSERTION="visual-assertion",o.TEXT_EXTRACTION="text-extraction",o))(Jc||{}),gle=rl.nativeEnum(Jc),hle=new Set(Object.values(Jc));var SH=rl.enum(["v1","v2","v3","v4"]),yH=rl.string().regex(/^v\d+\.\d+$/).describe("pinned sub-version like v3.1"),fle=rl.union([SH,yH,rl.string().describe("for people with special configurations")]),Gp={locator:"v3",assertion:"v3","visual-assertion":"v3","text-extraction":"v3"};var FC=(o=>(o.ANDROID_LOCATOR="android-locator",o.IOS_LOCATOR="ios-locator",o.ANDROID_ASSERTION="android-assertion",o.IOS_ASSERTION="ios-assertion",o))(FC||{}),Sle=rl.nativeEnum(FC);import{z as ye}from"zod";import mu from"zod";import pr from"zod";import Zt from"zod";import{v4 as Aue}from"uuid";import NH from"zod";import*as K from"zod";var _S=K.discriminatedUnion("type",[K.object({type:K.literal("SCREEN")}),K.object({type:K.literal("OPEN_APP")}),K.object({type:K.literal("OPEN_WEBVIEW")})]),Ni=K.object({type:K.literal("description"),description:K.string()}),BC=K.object({type:K.literal("CUSTOM_COORDINATES"),startX:K.number().describe("Starting X coordinate in pixels"),startY:K.number().describe("Starting Y coordinate in pixels"),deltaPixels:K.number().describe("Number of pixels to scroll in the specified direction")}),Vp=K.discriminatedUnion("type",[..._S.options,K.object({type:K.literal("CUSTOM"),target:Ni}),BC]);var bH=K.object({type:K.literal("coordinates"),xPercent:K.number(),yPercent:K.number()}),nl=K.discriminatedUnion("type",[Ni,bH]),zC=K.object({requiredText:K.string().optional(),requiredAttributes:K.record(K.string(),K.string()).optional(),requiredBounds:K.boolean().optional(),position:K.object({x1:K.number(),y1:K.number(),x2:K.number(),y2:K.number(),tolerance:K.nativeEnum(Yr),preciseTolerance:K.boolean().optional()}).optional(),shape:K.object({width:K.number(),height:K.number(),tolerance:K.nativeEnum(Yr),preciseTolerance:K.boolean().optional()}).optional()}),EH=K.object({xPath:K.string(),requirements:zC.optional()}),TH=K.object({type:K.literal("CUSTOM"),target:Ni,cache:K.lazy(()=>HC).optional()}),vH=K.object({pixelDelta:K.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:K.union([_S,TH,BC]),direction:K.enum(["up","down"])}),HC=K.object({type:K.literal("NATIVE"),bounds:K.number().array().optional(),resolvedDescription:K.string().optional(),xPath:K.string().optional(),elementOnlySerializedXml:K.string().optional(),scrollDetails:vH.optional(),requirements:zC.optional(),requiredRelatedElements:EH.array().optional(),memory:Vo.optional()}),AH=K.object({type:K.literal("WEBVIEW"),resolvedDescription:K.string().optional(),xPath:K.string().optional(),browserCache:Ti.optional(),memory:Vo.optional()}),$p=K.union([HC,AH]);var RH=K.object({left:K.number(),top:K.number(),right:K.number(),bottom:K.number()}),Tle=K.object({newViewportBounds:RH});import IS from"zod";import Di from"zod";var Xe=(A=>(A.AI_CHECK="AI_CHECK",A.TAP="TAP",A.TYPE="TYPE",A.PRESS="PRESS",A.PRESS_KEYBOARD="PRESS_KEYBOARD",A.OPEN_APP="OPEN_APP",A.KILL_APP="KILL_APP",A.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",A.SWIPE="SWIPE",A.SCROLL_TO="SCROLL_TO",A.SCREEN_CHECK="SCREEN_CHECK",A.ELEMENT_CHECK="ELEMENT_CHECK",A.DRAG_AND_DROP="DRAG_AND_DROP",A.JAVASCRIPT="JAVASCRIPT",A.REQUEST="REQUEST",A.WAIT="WAIT",A.ADD_FILE="ADD_FILE",A.INSTALL_APP="INSTALL_APP",A.UNINSTALL_APP="UNINSTALL_APP",A.TOGGLE_SETTINGS="TOGGLE_SETTINGS",A.ROTATE_ORIENTATION="ROTATE_ORIENTATION",A.ADB="ADB",A.STATE="STATE",A))(Xe||{}),he=Di.object({id:Di.string().uuid(),disableCache:Di.boolean().optional()}),Wp=Di.object({updatedAt:Di.coerce.date().optional(),updatedAtLoggerTags:Di.record(Di.string(),Di.string()).optional()}),xn=Wp.extend({target:$p}),qp=Wp.extend({fromTarget:$p,toTarget:$p});var PS=he.extend({type:IS.literal("ADB"),command:IS.string(),jsonArgs:IS.string().optional()});import MS from"zod";var OS=he.extend({type:MS.literal("ADD_FILE"),file:MS.string(),storageLocation:MS.string()});import LS from"zod";var Zc=he.extend({type:LS.literal("DRAG_AND_DROP"),fromTarget:Ni,toTarget:Ni,cache:qp.optional(),hoverDuration:LS.number().optional(),dragDuration:LS.number().optional()});import jC from"zod";var Qc=he.extend({type:jC.literal("ELEMENT_CHECK"),target:nl,cache:xn.optional(),assertion:ap,timeout:jC.number().int().min(0).max(Ra).optional().describe("max seconds to wait for the assertion to be true")});import GC from"zod";var CH=GC.string().trim(),NS=he.extend({type:GC.literal("INSTALL_APP"),uri:CH});import wH from"zod";var DS=he.extend({type:wH.literal("KILL_APP")});import xH from"zod";var kS=he.extend({type:xH.literal("OPEN_NOTIFICATION_DRAWER")});import US from"zod";var eu=he.extend({type:US.literal("SCROLL_TO"),target:Ni,direction:US.enum(["down","up"]),scrollableElement:Vp,scrollStepPercent:US.number().min(.1).max(1).optional().describe("How much of the container height to scroll at each step (0.1 to 1.0). Default is 0.8 (80%)."),cache:xn.optional()});import Kp from"zod";var tu=he.extend({type:Kp.literal("SWIPE"),direction:Kp.enum(["up","down","left","right"]),scrollableElement:Vp,cache:xn.optional(),viewportPercent:Kp.number().optional(),durationMs:Kp.number().optional()});import VC from"zod";var ru=(o=>(o.AIRPLANE_MODE="AIRPLANE_MODE",o.DATA="DATA",o.WIFI="WIFI",o.LOCATION="LOCATION",o))(ru||{}),FS=he.extend({type:VC.literal("TOGGLE_SETTINGS"),settingsType:VC.nativeEnum(ru)});import $C from"zod";var BS=he.extend({type:$C.literal("UNINSTALL_APP"),packageName:$C.string()});import YC from"zod";import zS from"zod";var nu=he.extend({type:zS.literal("AI_CHECK"),assertion:zS.string(),timeoutSecs:zS.number().optional(),cache:Wp.extend({memory:Ea.optional()}).optional()});import HS from"zod";var jS=he.extend({type:HS.literal("JAVASCRIPT"),code:HS.string(),timeout:HS.number().int().max(60).optional().describe("Max seconds for the code to complete")});import WC from"zod";var Yp=(n=>(n.CLOSE_KEYBOARD="CLOSE_KEYBOARD",n.ENTER="ENTER",n.BACKSPACE="BACKSPACE",n))(Yp||{}),GS=he.extend({type:WC.literal("PRESS_KEYBOARD"),key:WC.nativeEnum(Yp)});import ou from"zod";var Xp=(r=>(r.HOME="HOME",r.POWER="POWER",r))(Xp||{}),ol=(a=>(a.BACK="BACK",a.APP_SWITCHER="APP_SWITCHER",a.SEARCH="SEARCH",a.VOLUME_UP="VOLUME_UP",a.VOLUME_DOWN="VOLUME_DOWN",a.VOLUME_MUTE="VOLUME_MUTE",a))(ol||{}),iu=he.extend({type:ou.literal("PRESS"),key:ou.nativeEnum(Xp),longPress:ou.boolean().optional()}),VS=iu.extend({key:ou.nativeEnum(ol).or(ou.nativeEnum(Xp))}),$S=iu;import _H from"zod";var WS=he.extend({type:_H.literal("REQUEST")}).merge(Ta);import qC from"zod";var Jp=(r=>(r.PORTRAIT="PORTRAIT",r.LANDSCAPE="LANDSCAPE",r))(Jp||{}),qS=he.extend({type:qC.literal("ROTATE_ORIENTATION"),orientation:qC.nativeEnum(Jp)});import IH from"zod";var KS=he.extend({type:IH.literal("STATE")});import fo from"zod";var au=he.extend({type:fo.literal("TAP"),target:nl,cache:xn.optional(),longPress:fo.boolean().optional(),longPressDurationMs:fo.number().optional(),iterations:fo.number().optional(),tapDelayMs:fo.number().optional(),relativePosition:fo.object({x:fo.number(),y:fo.number()}).optional(),doubleTap:fo.boolean().optional(),doubleTapDelayMs:fo.number().optional()});import su from"zod";var lu=he.extend({type:su.literal("TYPE"),target:nl.optional(),cache:xn.optional(),keyPressDelayMs:su.number().optional(),text:su.string(),clearContent:su.boolean().optional(),forceClearContent:su.boolean().optional()});import KC from"zod";var YS=he.extend({type:KC.literal("WAIT"),timeoutSecs:KC.number()});var cu=YC.discriminatedUnion("type",[KS,nu,au,lu,GS,jS,YS,WS,qS]),PH=YC.discriminatedUnion("type",[...cu.options,iu]);import il from"zod";var XS=he.extend({type:il.literal("OPEN_APP"),packageName:il.string(),activityName:il.string().optional(),intentExtras:il.string().optional()}),JS=he.extend({type:il.literal("OPEN_APP"),packageName:il.string()});import al from"zod";var MH=al.object({type:al.literal("CONTENT"),negated:al.boolean().optional(),value:al.string()}),ZS=he.extend({type:al.literal("SCREEN_CHECK"),assertion:MH,timeout:al.number().int().min(0).max(Ra).optional().describe("max seconds to wait for the assertion to be true")});var ey=NH.discriminatedUnion("type",[...cu.options,DS,VS,BS,NS,OS,PS,Zc,ZS,kS,eu,tu,FS,Qc,XS]);import DH from"zod";var ty=DH.discriminatedUnion("type",[...cu.options,$S,JS]);var sn=(n=>(n.PRESET="MOBILE_PRESET_STEP",n.MODULE="MOBILE_MODULE_STEP",n.AI_ACTION="MOBILE_AI_ACTION_STEP",n))(sn||{}),sl=Zt.object({id:Zt.string().uuid(),envKey:Zt.string().optional(),skipped:Zt.boolean().optional(),retries:Zt.number().optional()}),XC=sl.extend({type:Zt.literal("MOBILE_PRESET_STEP"),keyPressDelayMs:Zt.number().optional()}),uu=XC.extend({command:ey}),ry=XC.extend({command:ty}),ll=Zt.object({moduleId:Zt.string(),inputs:Zt.record(Zt.string(),Zt.string()).optional()}),du=sl.merge(ll.extend({type:Zt.literal("MOBILE_MODULE_STEP")})),epe=ll.extend({steps:Zt.lazy(()=>Ha.array())}),tpe=ll.extend({steps:Zt.lazy(()=>Zp.array())}),za=sl.extend({type:Zt.literal("MOBILE_AI_ACTION_STEP"),text:Zt.string()}),Ha=Zt.discriminatedUnion("type",[uu,du,za]),Zp=Zt.discriminatedUnion("type",[ry,du,za]);var pu=pr.object({message:pr.string().optional(),startTime:pr.number(),endTime:pr.number(),status:pr.nativeEnum(Ye),trace:pr.unknown(),beforeSnapshot:pr.string().optional(),afterSnapshot:pr.string().optional(),data:pr.unknown().optional().describe("output data from the step"),aiSuggested:pr.boolean().optional()}),UH=pu.merge(uu).extend({previousAttempts:pr.lazy(()=>Jn.array()).optional()}),FH=pu.merge(du).extend({steps:pr.lazy(()=>Jn.array()),name:pr.string().optional(),previousAttempts:pr.lazy(()=>Jn.array()).optional()}),BH=pu.merge(za).extend({steps:pr.lazy(()=>Jn.array()),previousAttempts:pr.lazy(()=>Jn.array()).optional()}),Jn=pr.discriminatedUnion("type",[UH,FH,BH]);var zH=pu.extend({index:mu.number().optional(),userFacingStepReference:mu.string().optional(),description:mu.string()}),JC=zH.extend({beforeScreenshot:mu.string().optional(),afterScreenshot:mu.string().optional()});var ZC=ye.object({attributesRequired:ye.array(ye.string()).optional(),textRequired:ye.boolean().optional(),boundsRequired:ye.boolean().optional(),positionSpecificity:ye.nativeEnum(Yr).optional(),shapeSpecificity:ye.nativeEnum(Yr).optional()}),HH=ye.object({thoughts:ye.string(),id:ye.number(),updatedMemory:xc.optional(),inWebview:ye.boolean().optional(),requirements:ZC.optional(),additionalElements:ye.object({id:ye.number(),requirements:ZC}).array().optional()}),QC=ye.object({description:ye.string(),screenXml:ye.string(),screenshot:ye.string(),memory:ye.discriminatedUnion("type",[Vo,ye.object({type:ye.literal("RESOLVED_TRACES"),traces:ye.unknown().array()})]).optional()}),ew=ye.object({assertion:ye.string(),screenXml:ye.string(),screenshot:ye.string(),memory:ye.discriminatedUnion("type",[Ea,ye.object({type:ye.literal("RESOLVED_TRACES"),traces:ye.unknown().array()})]).optional()}),jH=ye.object({thoughts:ye.string(),result:ye.boolean(),relevantElements:ye.array(ye.number()).optional(),updatedMemory:Ic.optional()}),tw=ye.object({failedResults:JC.array(),nextStepsSerialized:ye.string().array(),currentScreenXml:ye.string(),currentScreenshot:ye.string(),customInstructions:ye.string().optional(),testDescription:ye.string()}),rw=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(rw||{}),GH=ye.object({thoughts:ye.string(),scenario:ye.nativeEnum(rw),instructions:ye.string().nullish()});var nw=t=>!(!t.org_id||!t.user_id||!t.platform);import{z as ja}from"zod";var ow=ja.object({id:ja.string().uuid(),skipped:ja.boolean().optional(),envKey:ja.string().optional().describe("key in the environment to save the result of this step to")}),ny=ow.merge(Ta).extend({type:ja.literal("REQUEST")}),oy=ow.merge(sp).extend({type:ja.literal("JAVASCRIPT")}),iy=ja.discriminatedUnion("type",[oy,ny]);import{z as _n}from"zod";var iw=_n.object({id:_n.string(),name:Ko,description:_n.string().optional().nullish(),baseUrl:Cp.nullish(),schemaVersion:_n.string(),advanced:_n.unknown().optional(),retries:_n.number(),envs:_n.array(Fp).nullish(),parameters:Up.nullish()}),VH=_n.object({createdAt:_n.coerce.date(),updatedAt:_n.coerce.date(),schedule:el.nullish(),notification:tl.nullish(),createdBy:_n.string(),organizationId:_n.string()}),$H=iw.merge(VH),Upe=$H.extend({steps:iy.array()}),Fpe=iw.extend({steps:iy.array()});import{z as Zr}from"zod";var aw=Zr.object({startedAt:Zr.coerce.date(),finishedAt:Zr.coerce.date(),status:Zr.nativeEnum(Ye),message:Zr.string().optional(),data:Zr.unknown().optional()}),WH=aw.merge(oy).extend({type:Zr.literal("JAVASCRIPT")}),qH=aw.merge(ny).extend({type:Zr.literal("REQUEST")}),KH=Zr.discriminatedUnion("type",[WH,qH]),sw=Zr.object({startedAt:Zr.coerce.date(),finishedAt:Zr.coerce.date().nullish(),status:Zr.nativeEnum(Ve),results:KH.array(),failureReason:Zr.string().nullish(),failureDetails:Tp.nullish()});import{z as Qr}from"zod";var YH=Qr.object({id:Qr.string(),organizationId:Qr.string(),createdAt:Qr.coerce.date(),updatedAt:Qr.coerce.date(),createdBy:Qr.string(),scheduledAt:Qr.coerce.date().nullish(),startedAt:Qr.coerce.date().nullish(),finishedAt:Qr.coerce.date().nullish(),status:Qr.nativeEnum(Ve),trigger:Qr.nativeEnum(Jr),results:sw.array().nullish(),apiTestName:Qr.string().nullish(),apiTestPath:Qr.string().nullish(),apiTestId:Qr.string().nullish()}),Kpe=YH.pick({status:!0,startedAt:!0,finishedAt:!0});var gu=(o=>(o.TestRun="test-run",o.MobileTestRun="mobile-test-run",o.CreditsUsed="credits-used",o.CreditsUsedV2="credits-used-v2",o))(gu||{}),lw=3;function XH(t){return t==="MODULE"||t==="CONDITIONAL"||t==="SECTION"||t==="RESOLVED_MODULE"}function ay(t){if(!XH(t))switch(t){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}function sy(t){switch(t.type){case"AI_EXTRACT":case"AI_ASSERTION":return lw;case"CAPTCHA":return 3;case"CLICK":case"TYPE":case"SELECT_OPTION":case"HOVER":case"ELEMENT_CHECK":case"FOCUS":case"BLUR":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":case"MOUSE_DRAG":return t.useSelector||!t.target||t.target.type!=="description"?0:1;case"DRAG":return t.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":case"OFFLINE_MODE":return 0;default:(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}var cl=class{trackStepExecution(){}async flush(){}};import{parseString as JH,splitCookiesString as ZH}from"set-cookie-parser";import{z as Je}from"zod";var ly=Je.object({name:Je.string(),value:Je.string(),url:Je.string().optional(),domain:Je.string().optional(),path:Je.string().optional(),expires:Je.number().default(Date.now()/1e3+60*60*24*365),httpOnly:Je.boolean().optional(),secure:Je.boolean().default(!0),sameSite:Je.union([Je.literal("Strict"),Je.literal("Lax"),Je.literal("None")]).default("None")});function Qp(t,e){let r=[],n=ZH(t);for(let o of n){let i=JH(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let u=i.sameSite.trim().toLowerCase();if(u==="strict")a="Strict";else if(u==="lax")a="Lax";else if(u==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${u}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=ly.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});r.push(s);let c=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),l=o.match(/\b(\S+)=([^;]*)/g);if(l)for(let u of l){let[d,p]=u.split("=");if(!d||!p)throw new Error(`Invalid key-value pair in cookie: ${u}`);c.includes(d.toLowerCase())||r.push({...s,name:d,value:p})}}return r}var QH=Je.object({origin:Je.string(),localStorage:Je.array(Je.object({name:Je.string(),value:Je.string()})),sessionStorage:Je.array(Je.object({name:Je.string(),value:Je.string()})).optional()}),ej=Je.object({entries:Je.record(Je.string(),Je.array(Je.tuple([Je.unknown(),Je.unknown()]))),version:Je.number().optional()}),em=Je.object({cookies:ly.array().optional(),origins:QH.array().optional(),idb:Je.record(Je.string(),ej).optional().describe("key is db name")});function cw(t,e){let r=[];return t.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=ly.safeParse({name:n.key,...n});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),r.push(i)}),r}import{v4 as hme}from"uuid";import Ne from"zod";var tj=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM"],uw=Ne.object({type:Ne.enum(tj).describe("Where to interact. SCREEN = entire device (use for system surfaces like the notification bar or quick settings), OPEN_APP = current foreground app, OPEN_WEBVIEW = active webview (only if a webview is present and there is high confidence that the element is inside it), CUSTOM = explicitly describe the container if and only if NONE of the above fit."),description:Ne.string().or(Ne.null()).describe("Description of the container to interact with. This is only used if the container type is CUSTOM.")}),rj=Ne.object({type:Ne.literal("TAP"),description:Ne.string().describe("Description of the element to tap."),longPress:Ne.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),iterations:Ne.null().or(Ne.number()).describe("Number of times to tap the element, useful for selecting text, selecting a row, or opening a menu. If null, tap once."),relativePosition:Ne.null().or(Ne.object({x:Ne.number(),y:Ne.number()})).describe("Specific position to tap within the bounding box of the element, specified in pixels. E.g. 0,0 is the top left corner.")}).describe(`
|
|
12
12
|
Tap on an element on the screen.
|
|
13
13
|
`),nj=Ne.object({type:Ne.literal("PRESS"),key:Ne.nativeEnum(ol)}).describe(`
|
|
14
14
|
Press a button on the device. Some buttons are physical (volume) while others are virtual (Back/Home/App Switcher).
|
|
@@ -34,13 +34,13 @@ ${this.decisions.map(e=>e.toString()).join(`
|
|
|
34
34
|
To resolve the conflict:`,jb(l,e))),i=c):Z.warn("A view or instrument with the name ",e.name,` has already been registered and is incompatible with another registered view.
|
|
35
35
|
`,`Details:
|
|
36
36
|
`,Hb(l,e),`To resolve the conflict:
|
|
37
|
-
`,jb(l,e))}}catch(u){n={error:u}}finally{try{s&&!s.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return i},t}();var aM=function(){function t(e){this._backingStorages=e}return t.prototype.record=function(e,r,n,o){this._backingStorages.forEach(function(i){i.record(e,r,n,o)})},t}();ft();ft();var sM=function(){function t(e,r){this._instrumentName=e,this._valueType=r,this._buffer=new Qn}return t.prototype.observe=function(e,r){if(r===void 0&&(r={}),typeof e!="number"){Z.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===ln.INT&&!Number.isInteger(e)&&(Z.warn("INT value type cannot accept a floating-point value for "+this._instrumentName+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._buffer.set(r,e)},t}();var lM=function(){function t(){this._buffer=new Map}return t.prototype.observe=function(e,r,n){if(n===void 0&&(n={}),!!Xu(e)){var o=this._buffer.get(e);if(o==null&&(o=new Qn,this._buffer.set(e,o)),typeof r!="number"){Z.warn("non-number value provided to metric "+e._descriptor.name+": "+r);return}e._descriptor.valueType===ln.INT&&!Number.isInteger(r)&&(Z.warn("INT value type cannot accept a floating-point value for "+e._descriptor.name+", ignoring the fractional digits."),r=Math.trunc(r),!Number.isInteger(r))||o.set(n,r)}},t}();var Vb=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},$b=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},cM=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},uM=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},dM=function(){function t(){this._callbacks=[],this._batchCallbacks=[]}return t.prototype.addCallback=function(e,r){var n=this._findCallback(e,r);n>=0||this._callbacks.push({callback:e,instrument:r})},t.prototype.removeCallback=function(e,r){var n=this._findCallback(e,r);n<0||this._callbacks.splice(n,1)},t.prototype.addBatchCallback=function(e,r){var n=new Set(r.filter(Xu));if(n.size===0){Z.error("BatchObservableCallback is not associated with valid instruments",r);return}var o=this._findBatchCallback(e,n);o>=0||this._batchCallbacks.push({callback:e,instruments:n})},t.prototype.removeBatchCallback=function(e,r){var n=new Set(r.filter(Xu)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},t.prototype.observe=function(e,r){return Vb(this,void 0,void 0,function(){var n,o,i,a;return $b(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,r),o=this._observeBatchCallbacks(e,r),[4,cP(uM(uM([],cM(n),!1),cM(o),!1))];case 1:return i=s.sent(),a=i.filter(uP).map(function(c){return c.reason}),[2,a]}})})},t.prototype._observeCallbacks=function(e,r){var n=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return Vb(n,void 0,void 0,function(){var s,c;return $b(this,function(l){switch(l.label){case 0:return s=new sM(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),r!=null&&(c=Vi(c,r)),[4,c];case 1:return l.sent(),a._metricStorages.forEach(function(u){u.record(s._buffer,e)}),[2]}})})})},t.prototype._observeBatchCallbacks=function(e,r){var n=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return Vb(n,void 0,void 0,function(){var s,c;return $b(this,function(l){switch(l.label){case 0:return s=new lM,c=Promise.resolve(i(s)),r!=null&&(c=Vi(c,r)),[4,c];case 1:return l.sent(),a.forEach(function(u){var d=s._buffer.get(u);d!=null&&u._metricStorages.forEach(function(p){p.record(d,e)})}),[2]}})})})},t.prototype._findCallback=function(e,r){return this._callbacks.findIndex(function(n){return n.callback===e&&n.instrument===r})},t.prototype._findBatchCallback=function(e,r){return this._batchCallbacks.findIndex(function(n){return n.callback===e&&dP(n.instruments,r)})},t}();var qq=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),pM=function(t){qq(e,t);function e(r,n,o,i,a){var s=t.call(this,r)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new rg(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new ng(n,i),s}return e.prototype.record=function(r,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(r,n,o,i)},e.prototype.collect=function(r,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(r,this._instrumentDescriptor,o,n)},e}(tg);var mM=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),Ml=function(){function t(){}return t.Noop=function(){return Yq},t}();var Kq=function(t){mM(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.process=function(r,n){return r},e}(Ml);var gM=function(t){mM(e,t);function e(r){var n=t.call(this)||this;return n._allowedAttributeNames=r,n}return e.prototype.process=function(r,n){var o=this,i={};return Object.keys(r).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=r[a]}),i},e}(Ml);var Yq=new Kq;var Xq=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},Jq=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Zq=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},hM=function(){function t(e,r){this._meterProviderSharedState=e,this._instrumentationScope=r,this.metricStorageRegistry=new iM,this.observableRegistry=new dM,this.meter=new tM(this)}return t.prototype.registerMetricStorage=function(e){var r=this._registerMetricStorage(e,pM);return r.length===1?r[0]:new aM(r)},t.prototype.registerAsyncMetricStorage=function(e){var r=this._registerMetricStorage(e,oM);return r},t.prototype.collect=function(e,r,n){return Xq(this,void 0,void 0,function(){var o,i,a;return Jq(this,function(s){switch(s.label){case 0:return[4,this.observableRegistry.observe(r,n?.timeoutMillis)];case 1:return o=s.sent(),i=this.metricStorageRegistry.getStorages(e),i.length===0?[2,null]:(a=i.map(function(c){return c.collect(e,r)}).filter(sP),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},t.prototype._registerMetricStorage=function(e,r){var n=this,o=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope),i=o.map(function(c){var l=gP(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(l);if(u!=null)return u;var d=c.aggregation.createAggregator(l),p=new r(l,d,c.attributesProcessor,n._meterProviderSharedState.metricCollectors,c.aggregationCardinalityLimit);return n.metricStorageRegistry.register(p),p});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(e.type),s=a.map(function(c){var l=Zq(c,2),u=l[0],d=l[1],p=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(p!=null)return p;var m=d.createAggregator(e),g=u.selectCardinalityLimit(e.type),h=new r(e,m,Ml.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},t}();var Qq=function(t){var e=typeof Symbol=="function"&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&typeof t.length=="number")return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},fM=function(){function t(e){this.resource=e,this.viewRegistry=new qP,this.metricCollectors=[],this.meterSharedStates=new Map}return t.prototype.getMeterSharedState=function(e){var r=lP(e),n=this.meterSharedStates.get(r);return n==null&&(n=new hM(this,e),this.meterSharedStates.set(r,n)),n},t.prototype.selectAggregations=function(e){var r,n,o=[];try{for(var i=Qq(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(e)])}}catch(c){r={error:c}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return o},t}();var og=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},ig=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},e2=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},t2=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},SM=function(){function t(e,r){this._sharedState=e,this._metricReader=r}return t.prototype.collect=function(e){return og(this,void 0,void 0,function(){var r,n,o,i,a=this;return ig(this,function(s){switch(s.label){case 0:return r=es(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return og(a,void 0,void 0,function(){var l;return ig(this,function(u){switch(u.label){case 0:return[4,c.collect(this,r,e)];case 1:return l=u.sent(),l?.scopeMetrics!=null&&n.push(l.scopeMetrics),l?.errors!=null&&o.push.apply(o,t2([],e2(l.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return s.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:o}]}})})},t.prototype.forceFlush=function(e){return og(this,void 0,void 0,function(){return ig(this,function(r){switch(r.label){case 0:return[4,this._metricReader.forceFlush(e)];case 1:return r.sent(),[2]}})})},t.prototype.shutdown=function(e){return og(this,void 0,void 0,function(){return ig(this,function(r){switch(r.label){case 0:return[4,this._metricReader.shutdown(e)];case 1:return r.sent(),[2]}})})},t.prototype.selectAggregationTemporality=function(e){return this._metricReader.selectAggregationTemporality(e)},t.prototype.selectAggregation=function(e){return this._metricReader.selectAggregation(e)},t.prototype.selectCardinalityLimit=function(e){var r,n,o;return(o=(n=(r=this._metricReader).selectCardinalityLimit)===null||n===void 0?void 0:n.call(r,e))!==null&&o!==void 0?o:2e3},t}();var yM=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},bM=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},EM=function(t){var e=typeof Symbol=="function"&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&typeof t.length=="number")return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function r2(t,e){var r=e??Zm.empty();return t?Zm.default().merge(r):r}var Wb=function(){function t(e){var r,n,o,i,a;if(this._shutdown=!1,this._sharedState=new fM(r2((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=EM(e.views),c=s.next();!c.done;c=s.next()){var l=c.value;this._sharedState.viewRegistry.addView(l)}}catch(m){r={error:m}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}if(e?.readers!=null&&e.readers.length>0)try{for(var u=EM(e.readers),d=u.next();!d.done;d=u.next()){var p=d.value;this.addMetricReader(p)}}catch(m){o={error:m}}finally{try{d&&!d.done&&(i=u.return)&&i.call(u)}finally{if(o)throw o.error}}}return t.prototype.getMeter=function(e,r,n){return r===void 0&&(r=""),n===void 0&&(n={}),this._shutdown?(Z.warn("A shutdown MeterProvider cannot provide a Meter"),Jy()):this._sharedState.getMeterSharedState({name:e,version:r,schemaUrl:n.schemaUrl}).meter},t.prototype.addMetricReader=function(e){var r=new SM(this._sharedState,e);e.setMetricProducer(r),this._sharedState.metricCollectors.push(r)},t.prototype.shutdown=function(e){return yM(this,void 0,void 0,function(){return bM(this,function(r){switch(r.label){case 0:return this._shutdown?(Z.warn("shutdown may only be called once per MeterProvider"),[2]):(this._shutdown=!0,[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.shutdown(e)}))]);case 1:return r.sent(),[2]}})})},t.prototype.forceFlush=function(e){return yM(this,void 0,void 0,function(){return bM(this,function(r){switch(r.label){case 0:return this._shutdown?(Z.warn("invalid attempt to force flush after MeterProvider shutdown"),[2]):[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.forceFlush(e)}))];case 1:return r.sent(),[2]}})})},t}();var n2=/[\^$\\.+?()[\]{}|]/g,ag=function(){function t(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(t.escapePattern(e)))}return t.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},t.escapePattern=function(e){return"^"+e.replace(n2,"\\$&").replace("*",".*")+"$"},t.hasWildcard=function(e){return e.includes("*")},t}();var Ol=function(){function t(e){this._matchAll=e===void 0,this._pattern=e}return t.prototype.match=function(e){return!!(this._matchAll||e===this._pattern)},t}();var TM=function(){function t(e){var r;this._nameFilter=new ag((r=e?.name)!==null&&r!==void 0?r:"*"),this._type=e?.type,this._unitFilter=new Ol(e?.unit)}return t.prototype.getType=function(){return this._type},t.prototype.getNameFilter=function(){return this._nameFilter},t.prototype.getUnitFilter=function(){return this._unitFilter},t}();var vM=function(){function t(e){this._nameFilter=new Ol(e?.name),this._versionFilter=new Ol(e?.version),this._schemaUrlFilter=new Ol(e?.schemaUrl)}return t.prototype.getNameFilter=function(){return this._nameFilter},t.prototype.getVersionFilter=function(){return this._versionFilter},t.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},t}();function o2(t){return t.instrumentName==null&&t.instrumentType==null&&t.instrumentUnit==null&&t.meterName==null&&t.meterVersion==null&&t.meterSchemaUrl==null}var sg=function(){function t(e){var r;if(o2(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||ag.hasWildcard(e.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.");e.attributeKeys!=null?this.attributesProcessor=new gM(e.attributeKeys):this.attributesProcessor=Ml.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(r=e.aggregation)!==null&&r!==void 0?r:Dn.Default(),this.instrumentSelector=new TM({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new vM({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return t}();var kPe=process.env.APP||"unknown";ft();import{v4 as i2}from"uuid";function a2(){return new oP({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:Za.DELTA})}var s2=[new sg({instrumentName:"test_event_duration",instrumentType:$e.HISTOGRAM,aggregation:new Yu([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new sg({instrumentName:"test_step_duration",instrumentType:$e.HISTOGRAM,aggregation:new Yu([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],lg=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let r=this.counterCache.get(e);if(r)return r;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let r=this.histogramCache.get(e);if(r)return r;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let r=this.observableGaugeCache.get(e);if(r)return r;let n=this.meter.createObservableGauge(e);return n.addCallback(o=>{let i=this.gaugeValues.get(e);i!==void 0&&o.observe(i,this.globalAttributes)}),this.observableGaugeCache.set(e,n),n}constructor(e){this.globalAttributes={...e.globalAttributes??{}};let r=typeof process<"u"?"production":"unknown",n=new hb({[wm]:e.serviceName,[eI]:r,[rI]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:i2()}),o=a2(),i=new Bb({exporter:o,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new Wb({resource:n,readers:[i],views:s2}),vm.setGlobalMeterProvider(this.provider),this.meter=vm.getMeter("momentic-serverless")}increment(e,r,n){try{let o=bm(n,this.globalAttributes);this.getCounter(e).add(typeof r=="number"?r:1,o)}catch{}}gauge(e,r){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,r)}catch{}}distribution(e,r,n){try{let o=bm(n,this.globalAttributes);this.getHistogram(e).record(r,o)}catch{}}async flush(){try{await this.provider.forceFlush()}catch{}}async recordDuration({fn:e,name:r,tags:n}){let o=Date.now();try{return await Promise.resolve(e())}finally{this.distribution(r,Date.now()-o,n)}}};var ir=new ym;function AM(t){t.disabled||(ir=new lg(t))}var qb=!1;try{let t=await import("@sentry/node");t.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:"da7fd088484e2198bc822011f1280586bd1d4583",tracesSampleRate:0,sendDefaultPii:!0}),l_(t.captureException),qb=!0}catch{}import{Argument as l7,Command as c7,Option as Dr}from"@commander-js/extra-typings";import{execSync as u7}from"child_process";import{existsSync as l2,statSync as c2}from"fs";function RM(t){try{return l2(t)&&c2(t).isDirectory()}catch(e){return v.error({err:e},`Error reading path ${t} during directory existence check`),!1}}import{confirm as u2,input as d2}from"@inquirer/prompts";import{existsSync as p2,mkdirSync as m2,statSync as g2}from"fs";import{dirname as h2}from"path";var f2=!1,wM=(()=>{try{return g2("/.dockerenv"),!0}catch{return!1}})();async function hr(t){return qa||f2||wM?!0:(await v.flush(),await new Promise(r=>setTimeout(r,100)),await u2({message:t}))}async function Kb(t){let e=h2(t);return RM(e)?p2(t)?hr(`File '${CM(t)}' already exists. Overwrite existing content?`):!0:await hr(`Directory '${CM(e)}' doesn't exist. Create it now?`)?(m2(e,{recursive:!0}),!0):!1}function CM(t){return t.replace(/(\s+)/g,"\\$1")}async function xM(t,e){return qa||wM?e:(await d2({message:t,default:e})).trim()||e}import Co,{supportsColor as y2}from"chalk";import{Console as _M}from"console";import{format as Zu}from"util";var Yb=class extends Error{constructor(e,r,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,r),Error.stackTraceLimit=o}},cg=class t extends _M{_buffer=[];_groupDepth=0;Console=_M;constructor(){super({write:e=>(t.write(this._buffer,"log",e),!0)})}static write(e,r,n,o=2){let i=new Yb(void 0,t.write).stack;if(!i)return e;let a=i.split(`
|
|
37
|
+
`,jb(l,e))}}catch(u){n={error:u}}finally{try{s&&!s.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return i},t}();var aM=function(){function t(e){this._backingStorages=e}return t.prototype.record=function(e,r,n,o){this._backingStorages.forEach(function(i){i.record(e,r,n,o)})},t}();ft();ft();var sM=function(){function t(e,r){this._instrumentName=e,this._valueType=r,this._buffer=new Qn}return t.prototype.observe=function(e,r){if(r===void 0&&(r={}),typeof e!="number"){Z.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===ln.INT&&!Number.isInteger(e)&&(Z.warn("INT value type cannot accept a floating-point value for "+this._instrumentName+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._buffer.set(r,e)},t}();var lM=function(){function t(){this._buffer=new Map}return t.prototype.observe=function(e,r,n){if(n===void 0&&(n={}),!!Xu(e)){var o=this._buffer.get(e);if(o==null&&(o=new Qn,this._buffer.set(e,o)),typeof r!="number"){Z.warn("non-number value provided to metric "+e._descriptor.name+": "+r);return}e._descriptor.valueType===ln.INT&&!Number.isInteger(r)&&(Z.warn("INT value type cannot accept a floating-point value for "+e._descriptor.name+", ignoring the fractional digits."),r=Math.trunc(r),!Number.isInteger(r))||o.set(n,r)}},t}();var Vb=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},$b=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},cM=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},uM=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},dM=function(){function t(){this._callbacks=[],this._batchCallbacks=[]}return t.prototype.addCallback=function(e,r){var n=this._findCallback(e,r);n>=0||this._callbacks.push({callback:e,instrument:r})},t.prototype.removeCallback=function(e,r){var n=this._findCallback(e,r);n<0||this._callbacks.splice(n,1)},t.prototype.addBatchCallback=function(e,r){var n=new Set(r.filter(Xu));if(n.size===0){Z.error("BatchObservableCallback is not associated with valid instruments",r);return}var o=this._findBatchCallback(e,n);o>=0||this._batchCallbacks.push({callback:e,instruments:n})},t.prototype.removeBatchCallback=function(e,r){var n=new Set(r.filter(Xu)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},t.prototype.observe=function(e,r){return Vb(this,void 0,void 0,function(){var n,o,i,a;return $b(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,r),o=this._observeBatchCallbacks(e,r),[4,cP(uM(uM([],cM(n),!1),cM(o),!1))];case 1:return i=s.sent(),a=i.filter(uP).map(function(c){return c.reason}),[2,a]}})})},t.prototype._observeCallbacks=function(e,r){var n=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return Vb(n,void 0,void 0,function(){var s,c;return $b(this,function(l){switch(l.label){case 0:return s=new sM(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),r!=null&&(c=Vi(c,r)),[4,c];case 1:return l.sent(),a._metricStorages.forEach(function(u){u.record(s._buffer,e)}),[2]}})})})},t.prototype._observeBatchCallbacks=function(e,r){var n=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return Vb(n,void 0,void 0,function(){var s,c;return $b(this,function(l){switch(l.label){case 0:return s=new lM,c=Promise.resolve(i(s)),r!=null&&(c=Vi(c,r)),[4,c];case 1:return l.sent(),a.forEach(function(u){var d=s._buffer.get(u);d!=null&&u._metricStorages.forEach(function(p){p.record(d,e)})}),[2]}})})})},t.prototype._findCallback=function(e,r){return this._callbacks.findIndex(function(n){return n.callback===e&&n.instrument===r})},t.prototype._findBatchCallback=function(e,r){return this._batchCallbacks.findIndex(function(n){return n.callback===e&&dP(n.instruments,r)})},t}();var qq=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),pM=function(t){qq(e,t);function e(r,n,o,i,a){var s=t.call(this,r)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new rg(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new ng(n,i),s}return e.prototype.record=function(r,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(r,n,o,i)},e.prototype.collect=function(r,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(r,this._instrumentDescriptor,o,n)},e}(tg);var mM=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),Ml=function(){function t(){}return t.Noop=function(){return Yq},t}();var Kq=function(t){mM(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.process=function(r,n){return r},e}(Ml);var gM=function(t){mM(e,t);function e(r){var n=t.call(this)||this;return n._allowedAttributeNames=r,n}return e.prototype.process=function(r,n){var o=this,i={};return Object.keys(r).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=r[a]}),i},e}(Ml);var Yq=new Kq;var Xq=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},Jq=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Zq=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},hM=function(){function t(e,r){this._meterProviderSharedState=e,this._instrumentationScope=r,this.metricStorageRegistry=new iM,this.observableRegistry=new dM,this.meter=new tM(this)}return t.prototype.registerMetricStorage=function(e){var r=this._registerMetricStorage(e,pM);return r.length===1?r[0]:new aM(r)},t.prototype.registerAsyncMetricStorage=function(e){var r=this._registerMetricStorage(e,oM);return r},t.prototype.collect=function(e,r,n){return Xq(this,void 0,void 0,function(){var o,i,a;return Jq(this,function(s){switch(s.label){case 0:return[4,this.observableRegistry.observe(r,n?.timeoutMillis)];case 1:return o=s.sent(),i=this.metricStorageRegistry.getStorages(e),i.length===0?[2,null]:(a=i.map(function(c){return c.collect(e,r)}).filter(sP),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},t.prototype._registerMetricStorage=function(e,r){var n=this,o=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope),i=o.map(function(c){var l=gP(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(l);if(u!=null)return u;var d=c.aggregation.createAggregator(l),p=new r(l,d,c.attributesProcessor,n._meterProviderSharedState.metricCollectors,c.aggregationCardinalityLimit);return n.metricStorageRegistry.register(p),p});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(e.type),s=a.map(function(c){var l=Zq(c,2),u=l[0],d=l[1],p=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(p!=null)return p;var m=d.createAggregator(e),g=u.selectCardinalityLimit(e.type),h=new r(e,m,Ml.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},t}();var Qq=function(t){var e=typeof Symbol=="function"&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&typeof t.length=="number")return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},fM=function(){function t(e){this.resource=e,this.viewRegistry=new qP,this.metricCollectors=[],this.meterSharedStates=new Map}return t.prototype.getMeterSharedState=function(e){var r=lP(e),n=this.meterSharedStates.get(r);return n==null&&(n=new hM(this,e),this.meterSharedStates.set(r,n)),n},t.prototype.selectAggregations=function(e){var r,n,o=[];try{for(var i=Qq(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(e)])}}catch(c){r={error:c}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return o},t}();var og=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},ig=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},e2=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},t2=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},SM=function(){function t(e,r){this._sharedState=e,this._metricReader=r}return t.prototype.collect=function(e){return og(this,void 0,void 0,function(){var r,n,o,i,a=this;return ig(this,function(s){switch(s.label){case 0:return r=es(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return og(a,void 0,void 0,function(){var l;return ig(this,function(u){switch(u.label){case 0:return[4,c.collect(this,r,e)];case 1:return l=u.sent(),l?.scopeMetrics!=null&&n.push(l.scopeMetrics),l?.errors!=null&&o.push.apply(o,t2([],e2(l.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return s.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:o}]}})})},t.prototype.forceFlush=function(e){return og(this,void 0,void 0,function(){return ig(this,function(r){switch(r.label){case 0:return[4,this._metricReader.forceFlush(e)];case 1:return r.sent(),[2]}})})},t.prototype.shutdown=function(e){return og(this,void 0,void 0,function(){return ig(this,function(r){switch(r.label){case 0:return[4,this._metricReader.shutdown(e)];case 1:return r.sent(),[2]}})})},t.prototype.selectAggregationTemporality=function(e){return this._metricReader.selectAggregationTemporality(e)},t.prototype.selectAggregation=function(e){return this._metricReader.selectAggregation(e)},t.prototype.selectCardinalityLimit=function(e){var r,n,o;return(o=(n=(r=this._metricReader).selectCardinalityLimit)===null||n===void 0?void 0:n.call(r,e))!==null&&o!==void 0?o:2e3},t}();var yM=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},bM=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},EM=function(t){var e=typeof Symbol=="function"&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&typeof t.length=="number")return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function r2(t,e){var r=e??Zm.empty();return t?Zm.default().merge(r):r}var Wb=function(){function t(e){var r,n,o,i,a;if(this._shutdown=!1,this._sharedState=new fM(r2((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=EM(e.views),c=s.next();!c.done;c=s.next()){var l=c.value;this._sharedState.viewRegistry.addView(l)}}catch(m){r={error:m}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}if(e?.readers!=null&&e.readers.length>0)try{for(var u=EM(e.readers),d=u.next();!d.done;d=u.next()){var p=d.value;this.addMetricReader(p)}}catch(m){o={error:m}}finally{try{d&&!d.done&&(i=u.return)&&i.call(u)}finally{if(o)throw o.error}}}return t.prototype.getMeter=function(e,r,n){return r===void 0&&(r=""),n===void 0&&(n={}),this._shutdown?(Z.warn("A shutdown MeterProvider cannot provide a Meter"),Jy()):this._sharedState.getMeterSharedState({name:e,version:r,schemaUrl:n.schemaUrl}).meter},t.prototype.addMetricReader=function(e){var r=new SM(this._sharedState,e);e.setMetricProducer(r),this._sharedState.metricCollectors.push(r)},t.prototype.shutdown=function(e){return yM(this,void 0,void 0,function(){return bM(this,function(r){switch(r.label){case 0:return this._shutdown?(Z.warn("shutdown may only be called once per MeterProvider"),[2]):(this._shutdown=!0,[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.shutdown(e)}))]);case 1:return r.sent(),[2]}})})},t.prototype.forceFlush=function(e){return yM(this,void 0,void 0,function(){return bM(this,function(r){switch(r.label){case 0:return this._shutdown?(Z.warn("invalid attempt to force flush after MeterProvider shutdown"),[2]):[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.forceFlush(e)}))];case 1:return r.sent(),[2]}})})},t}();var n2=/[\^$\\.+?()[\]{}|]/g,ag=function(){function t(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(t.escapePattern(e)))}return t.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},t.escapePattern=function(e){return"^"+e.replace(n2,"\\$&").replace("*",".*")+"$"},t.hasWildcard=function(e){return e.includes("*")},t}();var Ol=function(){function t(e){this._matchAll=e===void 0,this._pattern=e}return t.prototype.match=function(e){return!!(this._matchAll||e===this._pattern)},t}();var TM=function(){function t(e){var r;this._nameFilter=new ag((r=e?.name)!==null&&r!==void 0?r:"*"),this._type=e?.type,this._unitFilter=new Ol(e?.unit)}return t.prototype.getType=function(){return this._type},t.prototype.getNameFilter=function(){return this._nameFilter},t.prototype.getUnitFilter=function(){return this._unitFilter},t}();var vM=function(){function t(e){this._nameFilter=new Ol(e?.name),this._versionFilter=new Ol(e?.version),this._schemaUrlFilter=new Ol(e?.schemaUrl)}return t.prototype.getNameFilter=function(){return this._nameFilter},t.prototype.getVersionFilter=function(){return this._versionFilter},t.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},t}();function o2(t){return t.instrumentName==null&&t.instrumentType==null&&t.instrumentUnit==null&&t.meterName==null&&t.meterVersion==null&&t.meterSchemaUrl==null}var sg=function(){function t(e){var r;if(o2(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||ag.hasWildcard(e.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.");e.attributeKeys!=null?this.attributesProcessor=new gM(e.attributeKeys):this.attributesProcessor=Ml.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(r=e.aggregation)!==null&&r!==void 0?r:Dn.Default(),this.instrumentSelector=new TM({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new vM({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return t}();var kPe=process.env.APP||"unknown";ft();import{v4 as i2}from"uuid";function a2(){return new oP({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:Za.DELTA})}var s2=[new sg({instrumentName:"test_event_duration",instrumentType:$e.HISTOGRAM,aggregation:new Yu([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new sg({instrumentName:"test_step_duration",instrumentType:$e.HISTOGRAM,aggregation:new Yu([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],lg=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let r=this.counterCache.get(e);if(r)return r;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let r=this.histogramCache.get(e);if(r)return r;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let r=this.observableGaugeCache.get(e);if(r)return r;let n=this.meter.createObservableGauge(e);return n.addCallback(o=>{let i=this.gaugeValues.get(e);i!==void 0&&o.observe(i,this.globalAttributes)}),this.observableGaugeCache.set(e,n),n}constructor(e){this.globalAttributes={...e.globalAttributes??{}};let r=typeof process<"u"?"production":"unknown",n=new hb({[wm]:e.serviceName,[eI]:r,[rI]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:i2()}),o=a2(),i=new Bb({exporter:o,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new Wb({resource:n,readers:[i],views:s2}),vm.setGlobalMeterProvider(this.provider),this.meter=vm.getMeter("momentic-serverless")}increment(e,r,n){try{let o=bm(n,this.globalAttributes);this.getCounter(e).add(typeof r=="number"?r:1,o)}catch{}}gauge(e,r){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,r)}catch{}}distribution(e,r,n){try{let o=bm(n,this.globalAttributes);this.getHistogram(e).record(r,o)}catch{}}async flush(){try{await this.provider.forceFlush()}catch{}}async recordDuration({fn:e,name:r,tags:n}){let o=Date.now();try{return await Promise.resolve(e())}finally{this.distribution(r,Date.now()-o,n)}}};var ir=new ym;function AM(t){t.disabled||(ir=new lg(t))}var qb=!1;try{let t=await import("@sentry/node");t.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:"10ac18999ff1df78c7cd72df618911a464ac1c3a",tracesSampleRate:0,sendDefaultPii:!0}),l_(t.captureException),qb=!0}catch{}import{Argument as l7,Command as c7,Option as Dr}from"@commander-js/extra-typings";import{execSync as u7}from"child_process";import{existsSync as l2,statSync as c2}from"fs";function RM(t){try{return l2(t)&&c2(t).isDirectory()}catch(e){return v.error({err:e},`Error reading path ${t} during directory existence check`),!1}}import{confirm as u2,input as d2}from"@inquirer/prompts";import{existsSync as p2,mkdirSync as m2,statSync as g2}from"fs";import{dirname as h2}from"path";var f2=!1,wM=(()=>{try{return g2("/.dockerenv"),!0}catch{return!1}})();async function hr(t){return qa||f2||wM?!0:(await v.flush(),await new Promise(r=>setTimeout(r,100)),await u2({message:t}))}async function Kb(t){let e=h2(t);return RM(e)?p2(t)?hr(`File '${CM(t)}' already exists. Overwrite existing content?`):!0:await hr(`Directory '${CM(e)}' doesn't exist. Create it now?`)?(m2(e,{recursive:!0}),!0):!1}function CM(t){return t.replace(/(\s+)/g,"\\$1")}async function xM(t,e){return qa||wM?e:(await d2({message:t,default:e})).trim()||e}import Co,{supportsColor as y2}from"chalk";import{Console as _M}from"console";import{format as Zu}from"util";var Yb=class extends Error{constructor(e,r,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,r),Error.stackTraceLimit=o}},cg=class t extends _M{_buffer=[];_groupDepth=0;Console=_M;constructor(){super({write:e=>(t.write(this._buffer,"log",e),!0)})}static write(e,r,n,o=2){let i=new Yb(void 0,t.write).stack;if(!i)return e;let a=i.split(`
|
|
38
38
|
`).slice(o).filter(Boolean).join(`
|
|
39
39
|
`);return e.push({message:n,origin:a,type:r}),e}_log(e,r){t.write(this._buffer,e," ".repeat(this._groupDepth)+r,3)}debug(e,...r){this._log("debug",Zu(e,...r))}error(e,...r){this._log("error",Zu(e,...r))}info(e,...r){this._log("info",Zu(e,...r))}log(e,...r){this._log("log",Zu(e,...r))}warn(e,...r){this._log("warn",Zu(e,...r))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function IM(t){let e=globalThis.console,r=new cg;globalThis.console=r;try{t()}finally{let o=r.getBuffer()?.map(i=>i.message).join(`
|
|
40
40
|
`);process.stderr.write(`${o}
|
|
41
41
|
`),globalThis.console=e}}var It=" ".repeat(6);function PM(t,e="",r=!1){let n=process.stdout?.columns||process.stderr?.columns||80,o=Math.max(n-e.length,20),i=t.split(`
|
|
42
42
|
`),a=[];for(let s of i)if(r){let c=s;for(;c.length>o;){let u=c.slice(0,o+1).lastIndexOf(" "),d=u>-1?u:o;a.push(e+c.slice(0,d)),c=c.slice(d).trimStart()}a.push(e+c)}else{let c=s.split(" "),l="";for(let u of c){if(!l.length){l=u;continue}let d=`${l} ${u}`;d.length<=o?l=d:(a.push(e+l),l=u)}a.push(e+l)}return a.join(`
|
|
43
|
-
`)}import{hostname as S2}from"os";var J=yl({app:"cli",hostname:S2(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:"2.46.
|
|
43
|
+
`)}import{hostname as S2}from"os";var J=yl({app:"cli",hostname:S2(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:"2.46.3"});var b2=5;async function dg({getResults:t,checkDone:e,name:r,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>b2&&(v.error(`Failed to fetch ${r} status too many times.`),process.exit(1));try{a=await t(),i=0}catch(l){i++,J.warn({err:l},"Failed to fetch run status, retrying..."),v.warn({err:l},"Failed to fetch run status, retrying..."),await new Promise(u=>setTimeout(u,1500*i));continue}if(e(a))return a;let c=Math.max(1e4,Math.floor(n/100));await new Promise(l=>setTimeout(l,c))}v.error(`Timeout elapsed waiting for ${r} to complete (${Math.floor(n/1e3)}s).`),process.exit(1)}function Ll({results:t,startTime:e,entity:r,getDisplayLine:n,onFailed:o}){let i=t.filter(u=>u.status==="PASSED"&&u.quarantined),a=t.filter(u=>u.status==="PASSED"&&!u.quarantined),s=t.filter(u=>u.status==="FAILED"&&u.quarantined),c=t.filter(u=>u.status==="FAILED"&&!u.quarantined),l=t.filter(u=>u.status==="CANCELLED");return IM(()=>{if(c.forEach(u=>{v.log(""),o(u)}),c.length){v.log("");let u=c.length===1?"":"s";v.error(`${c.length} ${r}${u} failed:`),c.forEach(d=>{v.dimmed(n(d))})}if(l.length){v.log("");let u=l.length===1?"":"s";v.warn(`${l.length} ${r}${u} cancelled:`),l.forEach(d=>{v.dimmed(n(d))})}if(a.length){v.log("");let u=a.length===1?"":"s";v.success(`${a.length} ${r}${u} passed:`),a.forEach(d=>{v.dimmed(n(d))})}if(s.length){v.log("");let u=s.length===1?"":"s";v.warn(`${s.length} quarantined ${r}${u} failed:`),s.forEach(d=>{v.dimmed(n(d))})}if(i.length){v.log("");let u=i.length===1?"":"s";v.warn(`${i.length} quarantined ${r}${u} passed:`),i.forEach(d=>{v.dimmed(n(d))})}v.log(""),v.dimmed(`Total time: ${Math.round((Date.now()-e)/1e3)}s`)}),{quarantinedPassed:i.length,passed:a.length,quarantinedFailed:s.length,failed:c.length,cancelled:l.length}}var pg=(t,e)=>{if(!t.failureDetails||!t.failureReason)return;let r=Ep[t.failureDetails?.classification?.reason||t.failureReason],n=t.failureDetails?.classification?.summary||Ws[t.failureReason],o=t.failureDetails.classification?.rootCause;if(v.error(e),o){v.log(`${It}- Error type: ${Co.dim(r)}`);let i="- Root cause analysis:",a=PM(`${i} ${o}`,`${It} `,!1),s=a.indexOf(":");v.log(`${It}${i} ${Co.dim(a.slice(s+1))}`)}else v.log(`${It}Reason: ${Co.red(r)}`),v.log(`${It}Description: ${Co.red(n)}`)},Qu=({status:t,testLogRef:e,getRunningTestsCount:r,getTotalTestsCount:n,additionalText:o})=>{t=t.toUpperCase();let i=t,a;t.includes("FAIL")?(i=Co.bgRed.white("FAIL"),a=3):t.includes("PASS")?(i=Co.bgGreen.white("PASS"),a=3):t.includes("START")?(i=Co.bgBlue.white("START"),a=2):t.includes("CANCEL")?(i=Co.bgRgb(191,68,11).white("CANCEL"),a=1):t.includes("RETRY")?(i=Co.bgRgb(191,68,11).white("RETRY"),a=2):t.includes("RUN")||t.includes("PROG")?(i=Co.bgMagenta.white("RUNNING"),a=0):(v.warn(`Unknown status tried to be logged in run test locally: ${t}`),a=0),y2||(i=`${i}`),v.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${r()}/${n()})`)};import E2 from"fs";import{platform as T2,tmpdir as v2}from"os";import A2 from"path";import{program as R2}from"playwright-core/lib/cli/program";import{registry as ed}from"playwright-core/lib/server";import MM from"proper-lockfile";var OM=A2.join(v2(),"momenticBrowserInstallation");var Xb=["chrome","chromium","chrome-for-testing","ffmpeg"],C2={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},LM={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function NM(t){if(t==="Org Default")return!1;let e=LM[C2[t]??""]??"",r=ed.findExecutable(e);return!r||r.installType==="none"?!1:Jb(r)}function Jb(t){let e=t.executablePath();return E2.existsSync(e)}function w2(t,e){let r=LM[t];if(!r)throw new Error(`Requested install of unknown browser type ${t}`);let n=ed.findExecutable(r);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${t}`);if(!(!e&&Jb(n)))return n}async function x2({browser:t,force:e}){let r=w2(t,e);if(!r){v.info(`Browser '${t}' is already installed, skipping...`);return}v.info(`Installing browser '${t}'...`);try{await ed.installDeps([r],!1),await ed.install([r],!1)}catch(n){if(n.message.includes("Lock file is already being held")){v.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=ed.findExecutable(t),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Jb(o);)v.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function _2(){if(T2()==="win32"){v.info("Installing Windows dependencies for Playwright...");try{await R2.parseAsync(["","","install","winldd"])}catch(t){v.warn(`Failed to install Windows dependencies: ${t}. Continuing with browser installation...`)}}}async function DM({rawBrowsers:t,force:e=!1,all:r=!1}){await _2();let n=r?Xb:Array.from(new Set(t));try{await MM.lock(OM,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){v.warn(`Failed to acquire lock to install browsers. Please ensure that any other process installing browsers completes within 5 minutes: ${i}. Continuing without installation...`);return}let o;try{for(let i of n)try{await x2({browser:i,force:e})}catch(a){o=a,v.error(`Failed to install the ${i} browser: ${a}`)}}finally{await MM.unlock(OM,{realpath:!1})}if(o)throw o}import{createServer as I2}from"http";async function kM(t,e,r=30){for(let n=0;n<r;n+=1){let o=t+n;if(await P2(o))return o}v.error(`Could not find an available port for ${e} starting from ${t} after ${r} attempts`),process.exit(1)}async function P2(t){return new Promise((e,r)=>{let n=I2();n.once("error",o=>{o.code==="EADDRINUSE"?e(!1):(v.warn({err:o},"Unexpected error checking for open ports, continuing..."),n.close(),e(!0))}),n.once("listening",()=>{n.close(()=>{e(!0)})}),n.listen(t)})}import M2 from"blocked-at";import O2 from"why-is-node-running";function UM(t){L2(t),N2()}function L2(t){M2((e,r)=>{console.warn(`Detected the NodeJS event loop was blocked for ${e.toFixed(0)}ms. This can cause the CLI to hang.`);let n=r.join(`
|
|
44
44
|
`);console.warn(n),t.warn({stack:n,time:e},"NodeJS event loop blocked")},{threshold:1e3,trimFalsePositives:!0})}function N2(){process.on("SIGINT",()=>{if("_getActiveHandles"in process){let t=process._getActiveHandles();console.log("Active handles:",t.map(e=>e.constructor?.name))}O2(),setImmediate(()=>{setTimeout(()=>{process.exit(1)},2e3).unref()})})}function FM(t){let e=t?.shardIndex??1,r=t?.shardCount??1;if(e<1)throw new Error("Shard index must be greater than 0.");if(r<1)throw new Error("Shard count must be greater than 0.");if(e>r)throw new Error("Shard index cannot be greater than shard count")}function D2(t,e,r,n){if(r>t.length&&(v.warn(`Shard count ${r} is greater than the number of tests ${t.length}! Some workers won't have any tests to run.`),r=Math.max(r,t.length),e>r))return[];let o=Math.floor((e-1)*(t.length/r)),i=Math.floor(e*(t.length/r));return(n?[...t].sort((s,c)=>n(s).localeCompare(n(c))):[...t].sort()).filter((s,c)=>c>=o&&c<i)}function BM(t){let{items:e,shardIndex:r,shardCount:n,sortKey:o}=t;return n>1?D2(e,r,n,o):e}function Zb({regenerateCache:t,saveCache:e,disableCache:r}){if(r){if(t)throw new Error("--disable-cache and --regenerate-cache cannot be used together.");if(e)throw new Error("--disable-cache and --save-cache cannot be used together.")}}function Qb(t,e,r){return t instanceof Ca?(t.zodIssues.forEach(n=>{r.push({file:e,stepIndex:typeof n.path[0]=="number"?n.path[0]:void 0,field:n.path.slice(1).join(".")||n.path.join("."),issue:n.message})}),!0):!1}function Nl({parsingErrors:t,parsingErrorDetails:e,failedTestFilePaths:r,failedModuleFilePaths:n}){if(v.error(`
|
|
45
45
|
Found ${t} file(s) with validation errors that must be fixed manually:
|
|
46
46
|
`),e.length>0){let o=new Map;e.forEach(i=>{let a=o.get(i.file)||[];a.push(i),o.set(i.file,a)}),o.forEach((i,a)=>{v.error(` ${a}`),i.forEach(({stepIndex:s,field:c,issue:l})=>{let u=s!==void 0?`Step ${s}`:"File",d=c?`, field "${c}"`:"";v.error(` ${u}${d}:`),v.error(` \u2192 ${l}`)})})}else r.size>0&&v.error(`Failed test files:
|
|
@@ -56,7 +56,7 @@ ${JSON.stringify(r)}`);let n=[];return n.push({key:WM(t.id,e.join(":")),organiza
|
|
|
56
56
|
`)&&(r=r.slice(0,-1))),super.equals(e,r,n)}},JM=new aE;function sE(t,e,r){return JM.diff(t,e,r)}function W2(t,e){e.stripTrailingCr&&(t=t.replace(/\r\n/g,`
|
|
57
57
|
`));let r=[],n=t.split(/(\n|\r\n)/);n[n.length-1]||n.pop();for(let o=0;o<n.length;o++){let i=n[o];o%2&&!e.newlineIsToken?r[r.length-1]+=i:r.push(i)}return r}function ad(t,e,r){r=r||{};let n=r.n_surrounding??-1;n=n>=0?n:-1;let o=sE(t,e,{ignoreWhitespace:!1}),i=[],a=[];if(o.forEach(function(s){let c=s.removed&&s.added?"!":s.removed?"-":s.added?"+":" ",l=s.value.split(`
|
|
58
58
|
`);l.length>0&&l[l.length-1]===""&&(l=l.slice(0,l.length-1)),l.forEach(function(u){c!==" "&&n>=0&&a.push(i.length),i.push(c+u)})}),n>=0){let s={};a.forEach(function(u){let d,p;for(d=-n;d<n+1;d++)p=u+d,p>=0&&p<i.length&&(s[p]=i[p])}),i=[];let c,l;for(l in s)Object.hasOwn(s,l)&&(c!==void 0&&parseInt(l,10)!==parseInt(c,10)+1&&i.push("@@"),i.push(s[l]),c=l)}return i.join(`
|
|
59
|
-
`)}var vg=class{limit;windowMs;userActions;constructor(e,r){this.limit=e,this.windowMs=r,this.userActions=new Map}_cleanup(e,r="DEFAULT_USER"){let n=Date.now(),o=`${r}:${e}`;if(this.userActions.has(o)){let a=this.userActions.get(o)?.filter(s=>n-s<=this.windowMs)??[];a.length>0?this.userActions.set(o,a):this.userActions.delete(o)}}increment(e,r="DEFAULT_USER"){let n=Date.now(),o=`${r}:${e}`;this._cleanup(r,e),this.userActions.has(o)||this.userActions.set(o,[]);let i=this.userActions.get(o);return i.length>=this.limit?!0:(i.push(n),!1)}};async function Se(t,e){if(!(t<=0))return new Promise((r,n)=>{if(e?.aborted){n(e.reason);return}e?.addEventListener("abort",i,{once:!0});let o=setTimeout(()=>{e?.removeEventListener("abort",i),r()},t);function i(){clearTimeout(o),e?.removeEventListener("abort",i),n(e?.reason)}})}function Y2(t){return t.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}async function lE({metadata:t,steps:e,logger:r,toVersion:n,migrations:o}){let i=e,{schemaVersion:a,id:s}=t,c=o.findIndex(d=>q2.gt(d.toVersion,a));if(c===-1)return{steps:i,newVersion:a};let l=a;for(let d=c;d<o.length;d++){if(n&&K2(l,n)){r.debug("Stopping migration early because toVersion was reached");break}let p=o[d],m={id:s,migration:p.name,toVersion:p.toVersion};try{i=await ZM(i,p),l=p.toVersion}catch(g){throw r.warn({err:g,...m},"Migration failed"),new Error(`Step migration ${p.name} failed: ${g}`)}}let u=ad(JSON.stringify(e,void 0,2),JSON.stringify(i,void 0,2),{n_surrounding:1});return u.trim()&&r.debug({diffs:u,id:s},"Migration diffs"),{newVersion:l,steps:i}}async function ZM(t,e){let r=await e.execute(t);for(let n of r)for(let o of Object.keys(n)){if(!e.recursiveKeys.has(o))continue;let i=n[o];!i||!Array.isArray(i)||Y2(i)&&(n[o]=await ZM(i,e))}return r}var QM={name:"Migrate API request body types",fromVersion:"0.0.1",toVersion:"0.0.2",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="MOBILE_PRESET_STEP")return e;let r=e.command;if(!r||r.type!=="REQUEST")return e;let n=typeof r.body=="string"&&r.body.length>0?{type:"json",content:r.body}:void 0;return r.body=n,e})};var eO={name:"Migrate double tap to iterations",fromVersion:"0.0.2",toVersion:"0.0.3",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="MOBILE_PRESET_STEP")return e;let r=e.command;return!r||r.type!=="TAP"||!r.doubleTap||(r.iterations=2,delete r.doubleTap,r.tapDelayMs=r.doubleTapDelayMs,delete r.doubleTapDelayMs),e})};var X2=[QM,eO];Tg(lS,X2);var tO={name:"Migrate to ai step v2",fromVersion:"1.0.4",toVersion:"1.0.5",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async t=>(t=t.filter(e=>!(e.status!==void 0&&e.type==="AI_ACTION")),t=t.map(e=>(e.status===void 0||e.type==="PRESET_ACTION"&&(e.results=e.commands??e.results??[]),e)),t)};var rO={name:"Make sure ai step v2 has done command",fromVersion:"1.0.5",toVersion:"1.0.6",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="AI_ACTION"||e.status!==void 0||!e.commands||!e.commands.length)return e;let r=e.commands,n=r[r.length-1];return n&&n.type!=="SUCCESS"&&r.push({type:"SUCCESS"}),e})};var J2=["target","fromTarget","toTarget"];function nO(t){for(let e of J2){if(t[e]===void 0)continue;let r=t[e];r.elementDescriptor!==void 0?r.type="description":t[e]={type:"description",elementDescriptor:""}}}var oO={name:"Migrate element target to discriminated union",fromVersion:"1.0.6",toVersion:"1.0.7",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{switch(e.type){case"PRESET_ACTION":return nO(e.command),e;case"AI_ACTION":{let r=e.commands;for(let n of r??[])nO(n);return e}default:return e}})};import{v4 as Z2}from"uuid";var iO={name:"Ensure module steps have ids",fromVersion:"1.0.7",toVersion:"1.0.8",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{switch(e.type){case"MODULE":return e.id||(e.id=Z2()),e;default:return e}})};import{v4 as aO}from"uuid";var sO={name:"Ensure module steps have ids",fromVersion:"1.0.8",toVersion:"1.0.9",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let r=e.command;return r.id=r.id??aO(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(r=>({type:"PRESET_ACTION",command:{...r,id:r.id??aO()}})),delete e.commands),e;default:return e}})};var lO={name:"Migrate ai waits to checks",fromVersion:"1.0.9",toVersion:"1.0.10",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let r=e.command;return typeof r.type!="string"||r.type!=="AI_WAIT"||(r.type="AI_ASSERTION",r.timeout||(r.timeout=10)),e}default:return e}})};import{v4 as Q2}from"uuid";var cO={name:"Add ids to all steps",fromVersion:"1.0.10",toVersion:"1.0.11",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>("id"in e&&typeof e.id=="string"||(e.id=Q2()),e))};import{v4 as uO}from"uuid";var dO={name:"Add ids to all steps",fromVersion:"1.0.11",toVersion:"1.0.12",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if("id"in e&&typeof e.id=="string")return e;if("condition"in e&&typeof e.condition=="object"&&e.condition){let r=e.condition;r.id||(r.id=uO())}return e.id=uO(),e})};var pO={name:"Move env key to steps",fromVersion:"1.0.12",toVersion:"1.0.13",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||typeof r.envKey!="string"||(e.envKey=r.envKey,delete r.envKey),e})};import{v4 as eK}from"uuid";var mO={name:"Redo last two migrations",fromVersion:"1.0.13",toVersion:"1.0.14",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if((!("id"in e)||typeof e.id!="string")&&(e.id=eK()),e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||typeof r.envKey!="string"||(e.envKey=r.envKey,delete r.envKey),e})};var gO={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="SELECT_OPTION"||e.option===void 0||(e.choice={type:"VALUE",value:r.option},e.option=void 0),e})};var hO={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return r&&fO(r),e})};function fO(t){t&&Object.keys(t).forEach(e=>{if(typeof t[e]=="object"&&t[e]){fO(t[e]);return}if(typeof t[e]!="string")return;let r=t[e];e==="code"?t[e]=r.replace(/inputs\./g,"env."):r.includes("{{")&&r.includes("}}")&&(t[e]=r.replace(/inputs\./g,"env."))})}var SO={name:"Migrate switch tab choice",fromVersion:"1.0.16",toVersion:"1.0.17",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="TAB"||r.url===void 0||(r.action={type:"SUBSTRING",substring:r.url},r.url=void 0),e})};var yO={name:"Remove press keys sequentially",fromVersion:"1.0.17",toVersion:"1.0.18",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="TYPE"?e:r.pressKeysSequentially===void 0?(r.delay=0,e):(r.pressKeysSequentially&&(r.pressKeysSequentially=void 0,r.delay=50),e)})};var bO={name:"Migrate wait for URL to matcher",fromVersion:"1.0.18",toVersion:"1.0.19",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="WAIT_FOR_URL"||r.url===void 0||(r.matcher={type:"GLOB",glob:r.url},r.url=void 0),e})};var EO={name:"Migrate select choice round 2",fromVersion:"1.0.19",toVersion:"1.0.20",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;if(!r)return e;if(r.type==="SELECT_OPTION"){if(r.option===void 0)return e;r.choice={type:"VALUE",value:r.option},r.option=void 0}else if(r.type==="TAB"){if(r.url===void 0)return e;r.action={type:"SUBSTRING",substring:r.url},r.url=void 0}else if(r.type==="WAIT_FOR_URL"){if(r.url===void 0)return e;r.matcher={type:"GLOB",glob:r.url},r.url=void 0}else r.type==="AI_WAIT"&&(r.type="AI_ASSERTION",r.timeout||(r.timeout=10));return e})};var TO={name:"Migrate ",fromVersion:"1.0.20",toVersion:"1.0.21",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="MOCK_ROUTE"&&r.type!=="SET_HEADER"&&r.type!=="RECORD_REQUESTS"&&r.type!=="REGISTER_REQUEST_LISTENER"||(r.type==="REGISTER_REQUEST_LISTENER"||r.type==="RECORD_REQUESTS"?r.requestMatcher={urlMatcher:{type:"REGEX",regex:r.pattern}}:(r.type==="SET_HEADER"||r.type==="MOCK_ROUTE")&&r.urlPattern&&(r.requestMatcher={urlMatcher:{type:"REGEX",regex:r.urlPattern}})),e})};var vO={name:"Migrate API request body types",fromVersion:"1.0.21",toVersion:"1.0.22",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;if(!r||r.type!=="REQUEST")return e;let n=typeof r.body=="string"&&r.body.length>0?{type:"json",content:r.body}:void 0;return r.body=n,e})};var AO={name:"Migrate AI checks to preset actions",fromVersion:"1.0.0",toVersion:"1.0.1",recursiveKeys:new Set,execute:async t=>t.map(e=>{if(e.type!=="AI_ASSERTION")return e;let n={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.text,useVision:!1,disableCache:!0}},o={...e,...n};return delete o.text,o}),stopOnFailure:!0};var Ag=new Set(["CLICK","TYPE","SELECT_OPTION"]),RO={name:"Migrate element descriptor to live in a target object",fromVersion:"1.0.3",toVersion:"1.0.4",recursiveKeys:new Set,execute:async t=>t.map(e=>{let r=e.command,n=r?.type,o=r?.elementDescriptor;return(o!==void 0||Ag.has(n))&&(r.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(a=>{let s=a?.elementDescriptor,c=a?.type;(s!==void 0||Ag.has(c))&&(a.target={elementDescriptor:s??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(a=>{let s=a.command,c=s?.elementDescriptor,l=s?.type;(c!==void 0||Ag.has(l))&&(s.target={elementDescriptor:c??""}),a.commands&&Array.isArray(a.commands)&&a.commands.forEach(d=>{let p=d?.elementDescriptor,m=d?.type;(p!==void 0||Ag.has(m))&&(d.target={elementDescriptor:p??""})})}),e}),stopOnFailure:!0};var CO={name:"Migrate FAILURE status to FAILED",fromVersion:"1.0.1",toVersion:"1.0.2",recursiveKeys:new Set,execute:async t=>t.map(e=>{let r=e;return r.status==="FAILURE"&&(r.status="FAILED"),typeof r.commands=="object"&&Array.isArray(r.commands)&&r.commands.forEach(n=>{if(n&&typeof n=="object"){let o=n;o?.status==="FAILURE"&&(o.status="FAILED")}}),r}),stopOnFailure:!0};var wO={name:"Migrate preset step types to use the same",fromVersion:"1.0.2",toVersion:"1.0.3",recursiveKeys:new Set,execute:async t=>t.map(e=>{let r=e.command,n=r?.type;return n?.startsWith("PRESET_")&&(r.type=n.slice(7)),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(i=>{let a=i.type;a?.startsWith("PRESET_")&&(i.type=a.slice(7))}),e.results&&Array.isArray(e.results)&&e.results.forEach(i=>{let a=i.command,s=a?.type;s?.startsWith("PRESET_")&&(a.type=s.slice(7)),i.commands&&Array.isArray(i.commands)&&i.commands.forEach(l=>{let u=l.type;u?.startsWith("PRESET_")&&(l.type=u.slice(7))})}),e}),stopOnFailure:!0};var xO=[AO,CO,wO,RO,tO,rO,oO,iO,sO,lO,cO,dO,pO,mO,gO,hO,SO,yO,bO,EO,TO,vO];Tg(Qe,xO);async function Fl({metadata:t,steps:e,logger:r,toVersion:n}){return await lE({metadata:t,steps:e,logger:r,toVersion:n,migrations:xO})}import c0e from"zod";import{cloneDeep as C0e}from"lodash-es";import{diff as G0e}from"deep-object-diff";import{cloneDeep as $0e}from"lodash-es";import{v4 as ske}from"uuid";import{cloneDeep as sK}from"lodash-es";import DO from"truncate-json";import{v4 as PO}from"uuid";import{cloneDeep as Uke,unset as Fke}from"lodash-es";function _O(t){switch(t.type){case"AI_ACTION":return`AI action: ${Tt(t.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${Tt(t.text,100)}`;case"PRESET_ACTION":return ni(t.command);case"MODULE":return`Module ${t.moduleName??t.id}`;case"CONDITIONAL":return"Conditional step";case"SECTION":return`Section ${t.description?`with goal: ${Tt(t.description,100)}`:""}`;default:return(r=>{throw new Error("You missed a case in the switch above")})(t)}}function ii(t){switch(t.type){case"AI_ACTION":return`AI action: ${Tt(t.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${Tt(t.text,100)}`;case"PRESET_ACTION":return ni(t.command);case"MODULE":return`Module: ${t.id}`;case"RESOLVED_MODULE":return`Module: ${t.name}`;case"CONDITIONAL":return"Conditional step";case"SECTION":return`Section${t.description?`with goal: ${Tt(t.description,100)}`:""}`;default:return(r=>{throw new Error("You missed a case in the switch above")})(t)}}function Bl(t,e){return t.split(`
|
|
59
|
+
`)}var vg=class{limit;windowMs;userActions;constructor(e,r){this.limit=e,this.windowMs=r,this.userActions=new Map}_cleanup(e,r="DEFAULT_USER"){let n=Date.now(),o=`${r}:${e}`;if(this.userActions.has(o)){let a=this.userActions.get(o)?.filter(s=>n-s<=this.windowMs)??[];a.length>0?this.userActions.set(o,a):this.userActions.delete(o)}}increment(e,r="DEFAULT_USER"){let n=Date.now(),o=`${r}:${e}`;this._cleanup(r,e),this.userActions.has(o)||this.userActions.set(o,[]);let i=this.userActions.get(o);return i.length>=this.limit?!0:(i.push(n),!1)}};async function fe(t,e){if(!(t<=0))return new Promise((r,n)=>{if(e?.aborted){n(e.reason);return}e?.addEventListener("abort",i,{once:!0});let o=setTimeout(()=>{e?.removeEventListener("abort",i),r()},t);function i(){clearTimeout(o),e?.removeEventListener("abort",i),n(e?.reason)}})}function Y2(t){return t.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}async function lE({metadata:t,steps:e,logger:r,toVersion:n,migrations:o}){let i=e,{schemaVersion:a,id:s}=t,c=o.findIndex(d=>q2.gt(d.toVersion,a));if(c===-1)return{steps:i,newVersion:a};let l=a;for(let d=c;d<o.length;d++){if(n&&K2(l,n)){r.debug("Stopping migration early because toVersion was reached");break}let p=o[d],m={id:s,migration:p.name,toVersion:p.toVersion};try{i=await ZM(i,p),l=p.toVersion}catch(g){throw r.warn({err:g,...m},"Migration failed"),new Error(`Step migration ${p.name} failed: ${g}`)}}let u=ad(JSON.stringify(e,void 0,2),JSON.stringify(i,void 0,2),{n_surrounding:1});return u.trim()&&r.debug({diffs:u,id:s},"Migration diffs"),{newVersion:l,steps:i}}async function ZM(t,e){let r=await e.execute(t);for(let n of r)for(let o of Object.keys(n)){if(!e.recursiveKeys.has(o))continue;let i=n[o];!i||!Array.isArray(i)||Y2(i)&&(n[o]=await ZM(i,e))}return r}var QM={name:"Migrate API request body types",fromVersion:"0.0.1",toVersion:"0.0.2",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="MOBILE_PRESET_STEP")return e;let r=e.command;if(!r||r.type!=="REQUEST")return e;let n=typeof r.body=="string"&&r.body.length>0?{type:"json",content:r.body}:void 0;return r.body=n,e})};var eO={name:"Migrate double tap to iterations",fromVersion:"0.0.2",toVersion:"0.0.3",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="MOBILE_PRESET_STEP")return e;let r=e.command;return!r||r.type!=="TAP"||!r.doubleTap||(r.iterations=2,delete r.doubleTap,r.tapDelayMs=r.doubleTapDelayMs,delete r.doubleTapDelayMs),e})};var X2=[QM,eO];Tg(lS,X2);var tO={name:"Migrate to ai step v2",fromVersion:"1.0.4",toVersion:"1.0.5",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async t=>(t=t.filter(e=>!(e.status!==void 0&&e.type==="AI_ACTION")),t=t.map(e=>(e.status===void 0||e.type==="PRESET_ACTION"&&(e.results=e.commands??e.results??[]),e)),t)};var rO={name:"Make sure ai step v2 has done command",fromVersion:"1.0.5",toVersion:"1.0.6",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="AI_ACTION"||e.status!==void 0||!e.commands||!e.commands.length)return e;let r=e.commands,n=r[r.length-1];return n&&n.type!=="SUCCESS"&&r.push({type:"SUCCESS"}),e})};var J2=["target","fromTarget","toTarget"];function nO(t){for(let e of J2){if(t[e]===void 0)continue;let r=t[e];r.elementDescriptor!==void 0?r.type="description":t[e]={type:"description",elementDescriptor:""}}}var oO={name:"Migrate element target to discriminated union",fromVersion:"1.0.6",toVersion:"1.0.7",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{switch(e.type){case"PRESET_ACTION":return nO(e.command),e;case"AI_ACTION":{let r=e.commands;for(let n of r??[])nO(n);return e}default:return e}})};import{v4 as Z2}from"uuid";var iO={name:"Ensure module steps have ids",fromVersion:"1.0.7",toVersion:"1.0.8",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{switch(e.type){case"MODULE":return e.id||(e.id=Z2()),e;default:return e}})};import{v4 as aO}from"uuid";var sO={name:"Ensure module steps have ids",fromVersion:"1.0.8",toVersion:"1.0.9",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let r=e.command;return r.id=r.id??aO(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(r=>({type:"PRESET_ACTION",command:{...r,id:r.id??aO()}})),delete e.commands),e;default:return e}})};var lO={name:"Migrate ai waits to checks",fromVersion:"1.0.9",toVersion:"1.0.10",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let r=e.command;return typeof r.type!="string"||r.type!=="AI_WAIT"||(r.type="AI_ASSERTION",r.timeout||(r.timeout=10)),e}default:return e}})};import{v4 as Q2}from"uuid";var cO={name:"Add ids to all steps",fromVersion:"1.0.10",toVersion:"1.0.11",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>("id"in e&&typeof e.id=="string"||(e.id=Q2()),e))};import{v4 as uO}from"uuid";var dO={name:"Add ids to all steps",fromVersion:"1.0.11",toVersion:"1.0.12",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if("id"in e&&typeof e.id=="string")return e;if("condition"in e&&typeof e.condition=="object"&&e.condition){let r=e.condition;r.id||(r.id=uO())}return e.id=uO(),e})};var pO={name:"Move env key to steps",fromVersion:"1.0.12",toVersion:"1.0.13",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||typeof r.envKey!="string"||(e.envKey=r.envKey,delete r.envKey),e})};import{v4 as eK}from"uuid";var mO={name:"Redo last two migrations",fromVersion:"1.0.13",toVersion:"1.0.14",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if((!("id"in e)||typeof e.id!="string")&&(e.id=eK()),e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||typeof r.envKey!="string"||(e.envKey=r.envKey,delete r.envKey),e})};var gO={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="SELECT_OPTION"||e.option===void 0||(e.choice={type:"VALUE",value:r.option},e.option=void 0),e})};var hO={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return r&&fO(r),e})};function fO(t){t&&Object.keys(t).forEach(e=>{if(typeof t[e]=="object"&&t[e]){fO(t[e]);return}if(typeof t[e]!="string")return;let r=t[e];e==="code"?t[e]=r.replace(/inputs\./g,"env."):r.includes("{{")&&r.includes("}}")&&(t[e]=r.replace(/inputs\./g,"env."))})}var SO={name:"Migrate switch tab choice",fromVersion:"1.0.16",toVersion:"1.0.17",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="TAB"||r.url===void 0||(r.action={type:"SUBSTRING",substring:r.url},r.url=void 0),e})};var yO={name:"Remove press keys sequentially",fromVersion:"1.0.17",toVersion:"1.0.18",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="TYPE"?e:r.pressKeysSequentially===void 0?(r.delay=0,e):(r.pressKeysSequentially&&(r.pressKeysSequentially=void 0,r.delay=50),e)})};var bO={name:"Migrate wait for URL to matcher",fromVersion:"1.0.18",toVersion:"1.0.19",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="WAIT_FOR_URL"||r.url===void 0||(r.matcher={type:"GLOB",glob:r.url},r.url=void 0),e})};var EO={name:"Migrate select choice round 2",fromVersion:"1.0.19",toVersion:"1.0.20",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;if(!r)return e;if(r.type==="SELECT_OPTION"){if(r.option===void 0)return e;r.choice={type:"VALUE",value:r.option},r.option=void 0}else if(r.type==="TAB"){if(r.url===void 0)return e;r.action={type:"SUBSTRING",substring:r.url},r.url=void 0}else if(r.type==="WAIT_FOR_URL"){if(r.url===void 0)return e;r.matcher={type:"GLOB",glob:r.url},r.url=void 0}else r.type==="AI_WAIT"&&(r.type="AI_ASSERTION",r.timeout||(r.timeout=10));return e})};var TO={name:"Migrate ",fromVersion:"1.0.20",toVersion:"1.0.21",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="MOCK_ROUTE"&&r.type!=="SET_HEADER"&&r.type!=="RECORD_REQUESTS"&&r.type!=="REGISTER_REQUEST_LISTENER"||(r.type==="REGISTER_REQUEST_LISTENER"||r.type==="RECORD_REQUESTS"?r.requestMatcher={urlMatcher:{type:"REGEX",regex:r.pattern}}:(r.type==="SET_HEADER"||r.type==="MOCK_ROUTE")&&r.urlPattern&&(r.requestMatcher={urlMatcher:{type:"REGEX",regex:r.urlPattern}})),e})};var vO={name:"Migrate API request body types",fromVersion:"1.0.21",toVersion:"1.0.22",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;if(!r||r.type!=="REQUEST")return e;let n=typeof r.body=="string"&&r.body.length>0?{type:"json",content:r.body}:void 0;return r.body=n,e})};var AO={name:"Migrate AI checks to preset actions",fromVersion:"1.0.0",toVersion:"1.0.1",recursiveKeys:new Set,execute:async t=>t.map(e=>{if(e.type!=="AI_ASSERTION")return e;let n={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.text,useVision:!1,disableCache:!0}},o={...e,...n};return delete o.text,o}),stopOnFailure:!0};var Ag=new Set(["CLICK","TYPE","SELECT_OPTION"]),RO={name:"Migrate element descriptor to live in a target object",fromVersion:"1.0.3",toVersion:"1.0.4",recursiveKeys:new Set,execute:async t=>t.map(e=>{let r=e.command,n=r?.type,o=r?.elementDescriptor;return(o!==void 0||Ag.has(n))&&(r.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(a=>{let s=a?.elementDescriptor,c=a?.type;(s!==void 0||Ag.has(c))&&(a.target={elementDescriptor:s??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(a=>{let s=a.command,c=s?.elementDescriptor,l=s?.type;(c!==void 0||Ag.has(l))&&(s.target={elementDescriptor:c??""}),a.commands&&Array.isArray(a.commands)&&a.commands.forEach(d=>{let p=d?.elementDescriptor,m=d?.type;(p!==void 0||Ag.has(m))&&(d.target={elementDescriptor:p??""})})}),e}),stopOnFailure:!0};var CO={name:"Migrate FAILURE status to FAILED",fromVersion:"1.0.1",toVersion:"1.0.2",recursiveKeys:new Set,execute:async t=>t.map(e=>{let r=e;return r.status==="FAILURE"&&(r.status="FAILED"),typeof r.commands=="object"&&Array.isArray(r.commands)&&r.commands.forEach(n=>{if(n&&typeof n=="object"){let o=n;o?.status==="FAILURE"&&(o.status="FAILED")}}),r}),stopOnFailure:!0};var wO={name:"Migrate preset step types to use the same",fromVersion:"1.0.2",toVersion:"1.0.3",recursiveKeys:new Set,execute:async t=>t.map(e=>{let r=e.command,n=r?.type;return n?.startsWith("PRESET_")&&(r.type=n.slice(7)),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(i=>{let a=i.type;a?.startsWith("PRESET_")&&(i.type=a.slice(7))}),e.results&&Array.isArray(e.results)&&e.results.forEach(i=>{let a=i.command,s=a?.type;s?.startsWith("PRESET_")&&(a.type=s.slice(7)),i.commands&&Array.isArray(i.commands)&&i.commands.forEach(l=>{let u=l.type;u?.startsWith("PRESET_")&&(l.type=u.slice(7))})}),e}),stopOnFailure:!0};var xO=[AO,CO,wO,RO,tO,rO,oO,iO,sO,lO,cO,dO,pO,mO,gO,hO,SO,yO,bO,EO,TO,vO];Tg(Qe,xO);async function Fl({metadata:t,steps:e,logger:r,toVersion:n}){return await lE({metadata:t,steps:e,logger:r,toVersion:n,migrations:xO})}import c0e from"zod";import{cloneDeep as C0e}from"lodash-es";import{diff as G0e}from"deep-object-diff";import{cloneDeep as $0e}from"lodash-es";import{v4 as ske}from"uuid";import{cloneDeep as sK}from"lodash-es";import DO from"truncate-json";import{v4 as PO}from"uuid";import{cloneDeep as Uke,unset as Fke}from"lodash-es";function _O(t){switch(t.type){case"AI_ACTION":return`AI action: ${Tt(t.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${Tt(t.text,100)}`;case"PRESET_ACTION":return ni(t.command);case"MODULE":return`Module ${t.moduleName??t.id}`;case"CONDITIONAL":return"Conditional step";case"SECTION":return`Section ${t.description?`with goal: ${Tt(t.description,100)}`:""}`;default:return(r=>{throw new Error("You missed a case in the switch above")})(t)}}function ii(t){switch(t.type){case"AI_ACTION":return`AI action: ${Tt(t.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${Tt(t.text,100)}`;case"PRESET_ACTION":return ni(t.command);case"MODULE":return`Module: ${t.id}`;case"RESOLVED_MODULE":return`Module: ${t.name}`;case"CONDITIONAL":return"Conditional step";case"SECTION":return`Section${t.description?`with goal: ${Tt(t.description,100)}`:""}`;default:return(r=>{throw new Error("You missed a case in the switch above")})(t)}}function Bl(t,e){return t.split(`
|
|
60
60
|
`).map(r=>" ".repeat(e)+r).join(`
|
|
61
61
|
`)}function cE(t){switch(t.type){case"AI_ACTION":case"AI_ACTION_DYNAMIC":{let e="results"in t&&Array.isArray(t.results)?t.results.length:0;return`AI action: ${t.text}
|
|
62
62
|
${Bl(`Number of sub-steps: ${e}`,2)}`}case"PRESET_ACTION":return ni(t.command,!1);case"MODULE":{let e="results"in t&&Array.isArray(t.results)?t.results.length:0,r=[`Module: ${t.id}`];if("moduleName"in t){let n=t.moduleName;r.push(`Module Name: ${n}`)}return r.push(Bl(`Number of sub-steps: ${e}`,2)),r.join(`
|
|
@@ -68,7 +68,7 @@ ${o}`:o)(cE(t))}function uK(t,{unflattenedIndex:e,parentStep:r}){if(!(e===void 0
|
|
|
68
68
|
${n}`}function TK(t){let e=EK(t);return kn({steps:e,earlyStop:!1,onPresetAction:(r,n)=>{let o=r;o.parentStepIdChain=n.parentChain.map(s=>s.id),mE(r);let i;if(hp(r.command)&&r.command.cache!==void 0){let s=AK(r.command.cache);s&&"target"in s&&(i=s.target)}let a=r.command;return i!==void 0?a.cache=i:delete a.cache,a.thoughts&&delete a.thoughts,delete a.id,"index"in r&&delete r.index,!1},onConditional:(r,n)=>{let o=r;return o.parentStepIdChain=n.parentChain.map(i=>i.id),mE(r),!1},onSimpleStepContainer:(r,n)=>{let o=n.parentChain.map(a=>a.id);if(r.type==="AI_ACTION"){let a=r,s=r.text,c=r.id;return Object.keys(a).forEach(l=>{delete a[l]}),a.type="AI_ACTION_DYNAMIC",a.text=s,a.id=c,a.parentStepIdChain=o,!1}let i=r;if(i.parentStepIdChain=o,mE(r),r.type==="RESOLVED_MODULE"){let a=r;delete a.cacheConfig,delete a.enabled,delete a.defaultCacheKey,delete a.defaultCacheTtl,delete a.defaultCacheAllInvocations,delete a.autoAuth,delete a.advanced}return!1}}),e}function mE(t){let e=t;delete e.aiSuggested,delete e.retries,delete e.skipped}function vK(t){return t.selector?t.selector:t.generatedSelectors?.[0]}function gE(t){let e=vK(t),r=t.nodeOnlySerializedHtml,n={};return e&&(n.selector=e),r&&(n.nodeOnlySerializedHtml=r),Object.keys(n).length?n:void 0}function AK(t){if(!t)return;let e={};if("target"in t)return{target:gE(t.target)};if("fromTarget"in t||"toTarget"in t){let r=t.fromTarget?gE(t.fromTarget):void 0,n=t.toTarget?gE(t.toTarget):void 0;return r&&(e.fromTarget=r),n&&(e.toTarget=n),Object.keys(e).length?e:void 0}}import $l from"yaml";import{z as tL}from"zod";import{execSync as RK}from"child_process";function ai(t,e){let r=e.hooks?.postSave;if(!r)return;let n;r.includes("$1")?n=r.replaceAll("$1",t):n=`${r} ${t}`,v.debug({postSaveCommand:n},"Executing post-save hook command");try{RK(n,{encoding:"utf-8"})}catch(o){v.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as QO}from"deep-object-diff";import wo from"fs";import{cloneDeep as CK}from"lodash-es";import ud from"path";import{v4 as wK}from"uuid";import dd from"yaml";function Un({content:t,schemaVersion:e,momenticFiles:r,project:n,forceSaveOnNoDiffs:o}){let i=r.modules[t.moduleId]?.fullFilePath;if(!i||!wo.existsSync(i))throw new Error(`Tried to update module ${t.moduleId} that could not be found on disk`);let a=wo.readFileSync(i,"utf-8"),s=dd.parse(a),c;if(t.name&&t.name!==s.name){let m=`${st(t.name)}.module.yaml`;if(c=ud.join(ud.dirname(i),m),wo.existsSync(c))throw new Error(`A conflicting file '${t.name}' already exists at path '${c}'`)}let l={...t,schemaVersion:e},u=eo({fileType:De.MODULE,...xy.parse(l),steps:Et.array().parse(t.steps)}),d=QO(u,s);if(d&&Object.keys(d).length===0&&!o){v.debug(`Skipping save for module ${t.moduleId} since there are no changes`);return}let p=dd.stringify(u);wo.writeFileSync(i,p,"utf-8"),c&&wo.renameSync(i,c),ai(c||i,n.config)}function eL({moduleId:t,content:e,momenticFiles:r,project:n,logger:o}){let i=r.modules[t]?.fullFilePath;if(!i)throw new Error(`Tried to update module ${t} that could not be found on disk`);let a=si(i,o),s={...a,...e},c=eo({fileType:De.MODULE,...xy.parse(s),steps:a.steps}),l=QO(c,a);if(l&&Object.keys(l).length===0){v.debug(`Skipping save for module ${t} since there are no changes`);return}let u=dd.stringify(c);wo.writeFileSync(i,u,"utf-8");let d;if(e.name){let p=`${st(e.name)}.module.yaml`;if(d=ud.join(ud.dirname(i),p),wo.existsSync(d))throw new Error(`Module with name '${e.name}' already exists at path '${d}'`);wo.renameSync(i,d)}ai(d||i,n.config)}async function Ng({name:t,description:e,enabled:r,steps:n,folder:o,project:i}){let a=st(t),s=ud.join(o,`${a}.module.yaml`),c=wK(),{stepsToSave:l}=await Pt({stepLists:{steps:n}}),u={fileType:De.MODULE,schemaVersion:Qe,moduleId:c,name:t,description:e,enabled:r,steps:l.steps},d=dd.stringify(u);return wo.writeFileSync(s,d,"utf-8"),ai(s,i.config),{moduleId:c,name:t,description:e,enabled:r,steps:n}}function si(t,e){let r=wo.readFileSync(t,"utf-8"),n=dd.parse(r);try{return uy.parse(n)}catch(o){throw e.error({err:o,moduleFilePath:t,moduleContents:r},`${t} does not parse as a valid Momentic module`),o}}async function to(t,e,r,n){let o=si(t.fullFilePath,r),{resolvedSteps:i}=await xg({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:n,logger:r,callbacks:{onFetchModule:async({id:s})=>{let c=e.modules[s]?.fullFilePath;if(c)return si(c,r)}}}),a={...o,steps:i};return n&&(n[t.id]=CK(a)),a}async function Dg(t,e){let r={};return await Promise.all(Object.values(t.modules).map(async n=>{await to(n,t,e,r)})),Array.from(Object.values(r))}async function rL({test:t,name:e,folder:r}){let n=await qO({test:t});if(Object.keys(n.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${st(e)}.test.yaml`,a=as.join(r,i);return ro.writeFileSync(a,n.test,"utf-8"),a}function hE(t,e,r){let n=as.join(r.rootDir,t);if(!ro.existsSync(n))throw new Error(`Test not found at path '${t}' in project '${r.rootDir}'`);let o=ro.readFileSync(n,"utf-8"),i=$l.parse(o),a,s;if(e.name&&e.name!==i.name){let p=`${st(e.name)}.test.yaml`;if(a=as.join(as.dirname(t),p),s=as.join(r.rootDir,a),ro.existsSync(s))throw new Error(`Test with name '${e.name}' already exists at path '${s}'`)}let c={...i,...e},l=In.parse(c),u=eo({fileType:De.TEST,...In.parse(l),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0,retries:l.retries??void 0}),d=$l.stringify(u);return ro.writeFileSync(n,d,"utf-8"),s&&ro.renameSync(n,s),ai(n,r.config),{newRelativeTestPath:a}}function cn({relativeTestPath:t,steps:e,schemaVersion:r,project:n,forceSaveOnNoDiffs:o}){let i=as.join(n.rootDir,t);if(!ro.existsSync(i))throw new Error(`Test not found at path '${t}' in project '${n.rootDir}'`);let a=ro.readFileSync(i,"utf-8"),s=$l.parse(a),c=In.parse({...s,schemaVersion:r}),l=Et.array().or(tL.undefined()).parse(e.beforeSteps),u=Et.array().parse(e.steps),d=Et.array().or(tL.undefined()).parse(e.afterSteps),p=eo({fileType:De.TEST,...c,beforeSteps:l&&l.length>0?l:void 0,steps:u,afterSteps:d&&d.length>0?d:void 0}),m=xK(p,s);if(m&&Object.keys(m).length===0&&!o){v.debug(`Skipping save for test ${c.name} since there are no changes`);return}let g=$l.stringify(p);ro.writeFileSync(i,g,"utf-8"),v.debug(`Saving test ${c.name} to ${i}`),ai(i,n.config)}function pd(t,e){let r=as.join(e.rootDir,t);if(!r)throw new Error(`Could not find test with path ${t} in Momentic project (${e.rootDir})`);let n;try{n=ro.readFileSync(r,"utf8"),n=n.replace(/\r\n|\r/g,`
|
|
69
69
|
`)}catch(i){throw new Error(`Could not read test file ${r}: ${i}`)}let o;try{o=$l.parse(n)}catch(i){throw new Error(`Could not parse test file ${r} as YAML: ${i}`)}return Cr.parse(o)}function ss(t,e,r){let n=r.project.rootDir,o;try{o=ro.readFileSync(t,"utf-8")}catch(a){throw e.error({err:a,projectRoot:n},a.message),new Error(a.message)}let i=$l.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${t} is missing steps`);return i}async function St(t,e,r){let n=ss(t,e,r),o;try{o=In.parse(n)}catch(a){throw new Error(`Test ${t} is missing metadata or has invalid metadata: ${a}`)}let{resolvedTest:i}=await $O({rawSteps:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},metadata:o,logger:e,callbacks:{onFetchModule:async({id:a,logger:s})=>{let c=r.modules[a]?.fullFilePath;if(c)return si(c,s)}}});return i}import _K from"@dotenvx/dotenvx";import IK from"fs";import nL from"path";function kg(t,e){return(t.config.environments??[]).map(r=>ls(r.name,t,e))}function oL(t){return t.includes("${")?t.replace(/\$\{([^}]+)\}/g,(e,r)=>{let n=r.match(/^([A-Za-z_][A-Za-z0-9_]*)(?:(:-|-)([\s\S]*))?$/);if(!n)return process.env[r]||"";let o=n[1];if(!o)return"";let i=n[2],a=n[3],s=process.env[o];return i===":-"?s&&s!==""?s:a||"":i==="-"?s!==void 0?s:a||"":s||""}):t}function PK(t){let{envVariables:e,project:r}=t;if(!e)return{};let n={};for(let[o,i]of Object.entries(e)){if(typeof i=="string"){let s=oL(i);s&&(n[o]=s);continue}let a;try{a=IK.readFileSync(nL.resolve(r.rootDir,i.fromFile),"utf-8")}catch(s){throw new Error(`Failed to read environment variable '${o}' from file '${i.fromFile}': ${s}`)}if(i.json)try{n[o]=JSON.parse(a)}catch(s){throw new Error(`Failed to parse environment variable '${o}' from file '${i.fromFile}' as JSON: ${s}`)}else n[o]=a}return Object.keys(n).length>0&&v.debug(n,"Set environment variables with interpolation from project configuration"),n}function MK(t){let{project:e,envFile:r,logger:n}=t,o={};if(!r)return o;let i=_K.config({path:nL.resolve(e.rootDir,r),processEnv:o,logLevel:"error",quiet:!0});if(i.error)throw new Error(`Failed to load .env file: ${i.error.message}`);return n.debug("Set environment variables from .env file"),o}function ls(t,e,r){let n=(e.config.environments??[]).find(c=>c.name===t);if(!n)throw new Error(`Environment ${t} not found in local project configuration file`);if(!n.baseUrl)throw new Error(`Browser environment ${t} does not have a baseUrl configured`);let o={[nr]:oL(n.baseUrl)},i=PK({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=MK({project:e,envFile:n.envFile,logger:r});return Object.assign(o,a),n.inheritFromShell&&(r.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:t,variables:o,browser:n.browser}}import{existsSync as LK,readFileSync as NK,readdirSync as DK,writeFileSync as kK}from"fs";import{glob as UK}from"glob";import cs,{dirname as iL}from"path";import{cwd as SE}from"process";import aL from"yaml";import{z as ht}from"zod";import OK from"zod";var Ug=["**/*.test.yaml","**/*.module.yaml"],fE=OK.string().refine(t=>/^[a-zA-Z0-9-]+$/.test(t)),Fg=15;var Wl="momentic.config.yaml",yE="momentic.workspace.yaml",FK=ht.object({projects:ht.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),BK=ht.union([ht.string(),ht.object({fromFile:ht.string(),json:ht.boolean().optional()})]),zK=ht.object({name:fE,baseUrl:ht.string().optional().describe("Optional for mobile tests"),envFile:ht.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:ht.record(ht.string(),BK).optional(),inheritFromShell:ht.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:La.optional().describe("NB: most things should use project-level configuration only")}),HK=ht.object({postSave:ht.string().optional()}),jK=ht.object({name:fE,include:ht.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:ht.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:ht.string().optional(),reporterDir:ht.string().optional(),outputDir:ht.string().optional(),recordVideo:ht.boolean().optional(),retries:ht.number().optional().describe("number of retries per test"),parallel:ht.number().optional().describe("degree of parallelism"),environments:ht.array(zK).optional(),gitMainBranch:ht.string().optional().readonly(),gitProtectedBranches:ht.string().array().optional().readonly(),ai:Xo.optional(),browser:La.optional(),emulator:hy.optional(),advanced:AS.optional(),displayRoot:ht.string().optional().describe("relative path from project root to use as the Repository root"),hooks:HK.optional()});function sL(t,e){let r;try{r=NK(t,"utf-8")}catch(o){v.warn(`Could not read possible Momentic ${e} file at ${t}: ${o}`);return}let n;try{if(n=aL.parse(r),typeof n!="object"||n===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof n} instead`)}catch(o){v.warn(`Possible Momentic ${e} file at ${t} does not parse as valid YAML: ${o}`);return}return n}function bE(t){let e=sL(t,"project configuration");if(e!==void 0)try{return jK.parse(e)}catch(r){v.warn(`Possible Momentic project configuration file at ${t} does not adhere to the required schema: ${r}`);return}}function GK(t){let e=sL(t,"workspace configuration");if(e!==void 0)try{return FK.parse(e)}catch(r){v.warn(`Possible Momentic workspace configuration file at ${t} does not adhere to the required schema: ${r}`);return}}function VK(){let t=[],e=SE(),r=cs.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=cs.basename(e);if(am.includes(i))return v.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),t;for(let a of DK(e))if(a.endsWith(Wl)){let s=cs.join(e,a),c=bE(s);c&&t.push({configFilePath:s,config:c,rootDir:iL(s)})}if(t.length)return t;if(e=cs.dirname(e),e===r)break}return t}async function Nt(t={}){let{configFilePath:e,nameFilter:r}=t,n=await EE(e);if(r&&(n=n.filter(o=>o.config.name===r)),n.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
|
|
70
70
|
${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return v.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}async function $K(t){let e=GK(t);if(!e||!e.projects||!e.projects.length)return;let r=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${Wl}`)),n=AbortSignal.timeout(2e3),o;try{o=await UK(r,{absolute:!1,cwd:SE(),dotRelative:!1,maxDepth:Fg,nodir:!0,signal:n})}catch(a){throw v.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${yE} is misconfigured.`),a}let i=[];for(let a of o){let s=cs.join(SE(),a),c=bE(s);c&&i.push({configFilePath:s,config:c,rootDir:iL(s)})}return i}async function EE(t){if(t){t=cs.resolve(t);let r=bE(t);return r||(console.error(`No valid Momentic project file found at ${t}.`),process.exit(1)),[{config:r,configFilePath:t,rootDir:cs.dirname(t)}]}if(LK(yE)){let r=await $K(yE);if(r)return r}return VK()}function Xi(t,e){let r=aL.stringify(t);kK(e,r)}import cL from"fs";import{glob as WK}from"glob";import md from"path";import qK from"yaml";import{z as lL}from"zod";var uL=!1,KK=lL.object({fileType:lL.nativeEnum(De)});async function ce(t,e=!1){let r={project:t,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=t.config.include??Ug,o=Array.from(t.config.exclude??[]).concat(sm),i=AbortSignal.timeout(5e3),a;try{a=await WK(n,{absolute:!1,cwd:t.rootDir,ignore:o,dotRelative:!1,maxDepth:Fg,nodir:!0,signal:i})}catch(s){throw v.error({err:s},"Failed to list all Momentic files in the current directory. This usually indicates the 'include' and 'exclude' globs are misconfigured in your momentic.config.yaml, or that your machine is severely resource constrained."),new Error("Listing Momentic files timed out after 5 seconds.",{cause:s})}for(let s of a){let c=YK(t.rootDir,s,r,e?Eo:v);c&&(r.duplicateEntities[c.id]=c.paths)}return uL=!0,r}function YK(t,e,r,n){let o=md.join(t,e),i=XK(o,n);if(!i)return;let a=JK(i,o,n);if(!a)return;let s=KK.safeParse(a);if(s.success===!1){n.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${s.error}`);return}let c=s.data.fileType,l=ZK(o,n);if(!l)return;let u=QK(e,o,l);switch(c){case De.TEST:try{return eY(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case De.MODULE:try{return tY(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case De.MOBILE_TEST:try{return nY(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case De.MOBILE_MODULE:try{return rY(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile module metadata: ${d}`);return}default:{let d=c;return}}}function XK(t,e){try{return cL.readFileSync(t,"utf-8")}catch(r){e.warn(`Could not read possible Momentic file at ${t}, skipping: ${r}`);return}}function JK(t,e,r){try{let n=qK.parse(t);if(typeof n!="object"||n===null)throw new Error("The YAML document should parse as a map with key-value pairs");return n}catch(n){r.warn(`Could not parse possible Momentic file at ${e}, skipping: ${n}`);return}}function ZK(t,e){try{return cL.statSync(t)}catch(r){e.warn(`Skipping path '${t}' because it could not be stat, skipping: ${r}`);return}}function QK(t,e,r){return{relativePath:t,fullFilePath:e,platformSep:md.sep,fullPathSegments:e.split(md.sep),relativePathSegments:t.split(md.sep),fileName:md.basename(e),lastModified:r.mtime,createdAt:r.birthtime}}function eY(t,e,r,n,o){let i=In.parse(t),a;if(e.tests[i.id]){let s=e.tests[i.id].fullFilePath;a={id:i.id,paths:[s,n]}}return e.tests[i.id]={type:De.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...r},a}function tY(t,e,r,n,o){let i=Xr.parse(t),a;if(e.modules[i.moduleId]){let c=e.modules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}e.modules[i.moduleId]={type:De.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...r};let s=r.fileName.replace(".module.yaml","");return!uL&&st(i.name)!==s&&o.warn(`The module with ID ${i.moduleId} has a name (${i.name}) that does not match its file name (${s}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`),a}function rY(t,e,r,n,o){let i=nm.parse(t),a;if(e.mobileModules[i.moduleId]){let c=e.mobileModules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}let s=r.fileName.replace(".module.yaml","");return e.mobileModules[i.moduleId]={type:De.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...r},a}function nY(t,e,r,n,o){let i=fy.parse(t),a;if(e.mobileTests[i.id]){let c=e.mobileTests[i.id].fullFilePath;a={id:i.id,paths:[c,n]}}let s=r.fileName.replace(".test.yaml","");return e.mobileTests[i.id]={type:De.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,labels:i.labels,...r},a}import ql from"fs";import TE from"path";import{z as vE}from"zod";var dL="golden/visual-diff",pL="reports",mL="test-results";var oY=vE.object({width:vE.number(),height:vE.number()}),Kl=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;apiClient;constructor(e,r,n){let o=TE.join(e.rootDir,e.config.goldenFileDir??dL);this.defaultGoldenScreenshotDir=o,this.regenerateGoldenFiles=n,this.apiClient=r}async prepareGoldenScreenshotForComparison(e,r,n){if(NA(r.screenshot?.data))return{buffer:(await this.apiClient.fetchOnDemandScreenshot(r.screenshot.data.id)).data,width:r.screenshot.width,height:r.screenshot.height};if(r.screenshot?.data?.startsWith("https://")){let a=await fetch(r.screenshot.data);return{buffer:Buffer.from(await a.arrayBuffer()),width:r.screenshot.width,height:r.screenshot.height}}let o=r.screenshot?.data;o||(o=TE.join(this.defaultGoldenScreenshotDir,`${r.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return ql.mkdirSync(TE.dirname(o),{recursive:!0}),ql.writeFileSync(o,n.buffer),ql.writeFileSync(i,JSON.stringify({width:n.width,height:n.height})),{buffer:Buffer.from(n.buffer),width:n.width,height:n.height};if(ql.existsSync(o)){let a=ql.readFileSync(o),s=oY.parse(JSON.parse(ql.readFileSync(i,"utf-8")));return{buffer:a,width:s.width,height:s.height}}else throw new M("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};import{execFile as iY}from"node:child_process";import{promisify as aY}from"node:util";import sY from"simple-git";var yt=sY(),gL=aY(iY);function li(t){if(t)try{let e=new Date(t);return isNaN(e.getTime())?void 0:e}catch{return}}async function lY(t){let e=await vt(t,yt.raw(["config","--list"])),r={};if(!e)return r;for(let n of e.split(`
|
|
71
|
-
`)){let o=n.indexOf("=");if(o===-1)continue;let i=n.slice(0,o),a=n.slice(o+1).trim();r[i]=a}return r}async function cY(t,e,r){try{let o=r["github.user"]||void 0;if(o)return o}catch{}let n;try{if(e?.startsWith("http://")||e?.startsWith("https://"))n=new URL(e).host;else if(e?.startsWith("git@")){let o=e.indexOf("@"),i=e.indexOf(":",o+1);o!==-1&&i!==-1&&(n=e.slice(o+1,i))}}catch{}if(n=n?.toLowerCase(),!!n){try{if(e?.startsWith("git@")&&n?.includes("github")){let{stdout:o,stderr:i}=await gL("ssh",["-T","-o","BatchMode=yes",`git@${n}`],{timeout:5e3}),s=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}}catch{}try{let o=n&&n!=="github.com"?["api","--hostname",n,"user","-q",".login"]:["api","user","-q",".login"],{stdout:i}=await gL("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function uY(t,e,r){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return cY(t,e,r);if(o)return}catch{}}function Bg(t){if(t.startsWith("git@")){let e=t.split(":");if(e.length===2){let r=e[1].replace(".git","").split("/");if(r.length===2){let n=r[0],o=r[1];return`${n}/${o}`}}}else if(t.startsWith("http")||t.startsWith("https")){let r=new URL(t).pathname.split("/").filter(Boolean);if(r.length>=2){let n=r[0],o=r[1].replace(".git","");return`${n}/${o}`}}}async function vt(t,e){try{return(await e).trim()}catch(r){if(r instanceof Error&&r.message.includes("not a git repository"))return;t.error({err:r},"Failed to run git command");return}}function dY(){if(process.env.GITHUB_ACTION)return"GithubActions";if(process.env.GITLAB_CI)return"GitlabCI";if(process.env.CIRCLECI)return"CircleCI";if(process.env.BUILDKITE)return"Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return"AzureDevOps";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return"GCPCloudBuild";if(process.env.MOMENTIC_GIT_OVERRIDE)return"Custom"}async function pY(t){let[e,r,n]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return{ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?li(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function mY(t){let[e,r,n]=await Promise.all([vt(t,yt.listRemote(["--get-url","origin"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]);return{ciProvider:"GitlabCI",gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?li(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:r,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function gY(t){let[e,r,n,o]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.listRemote(["--get-url","origin"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??r,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Bg(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?li(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?c:void 0,gitlabProjectPath:s?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function hY(t){let[e,r,n]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Bg(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?li(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function fY(t){let[e,r,n]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Bg(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?li(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function SY(t,e){let[r,n,o,i,a,s,c,l,u]=await Promise.all([vt(t,yt.revparse(["HEAD"])),vt(t,yt.revparse(["--short","HEAD"])),vt(t,yt.revparse(["--abbrev-ref","HEAD"])),vt(t,yt.listRemote(["--get-url","origin"])),vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"])),e?vt(t,yt.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),lY(t)]),d=l?await vt(t,yt.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),g=i?Bg(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,S=u["user.username"]||void 0,b=await uY(t,i,u)??S??void 0;return{ciProvider:"none",gitCommitSha:r,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?li(a):void 0,gitCommitMessage:s,gitCommitAuthorName:c,gitLocalUsername:b,gitLocalEmail:h,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?li(d):void 0,githubRepository:p?g:void 0,gitlabProjectPath:m?g:void 0,pipelineId:void 0}}async function yY(){let t=process.env._HEAD_REPO_URL;return{ciProvider:"GCPCloudBuild",gitCommitSha:process.env.COMMIT_SHA,gitCommitShaShort:process.env.COMMIT_SHA?.slice(0,6),gitBranchName:process.env.BRANCH_NAME,gitOriginUrl:t?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:t?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}function bY(){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:li(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:li(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 EY(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function ci(t,e){let r=dY();if(!r)return SY(t,e);switch(r){case"GithubActions":return pY(t);case"GitlabCI":return mY(t);case"CircleCI":return gY(t);case"Buildkite":return hY(t);case"AzureDevOps":return fY(t);case"GCPCloudBuild":return yY();case"Custom":return bY()}}async function TY(t,e,r,n){let o=n;if(!n.gitCommitSha)return o;if(n.gitMainBranch&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let i=await e.getMergeBaseCommitFromGitlab(r,n.gitMainBranch,n.gitCommitSha);o={...o,lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(i){t.warn({err:i},"Failed to get merge base commit from Gitlab")}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let i=await e.getCommitFromGitlab(r,n.gitCommitSha);i&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??i.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??i.author.name,gitCommitMessage:o.gitCommitMessage??i.message})}catch(i){t.warn({err:i},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName)try{let i=await e.getMergedBranchFromGitlab(r,n.gitBranchName??"",n.gitCommitSha);i.mergedBranch&&(o={...o,mergedGitBranchName:i.mergedBranch})}catch(i){t.warn({err:i},"Failed to get merged branch from Gitlab")}return o}async function vY(t,e,r,n,o){let i=o;if(!o.gitCommitSha)return i;if(o.gitMainBranch&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let a=await e.getMergeBaseCommitFromGithub(r,n,o.gitMainBranch,o.gitCommitSha);i={...i,lastCommitOnMainSha:a.sha,lastCommitOnMainTimestamp:a.committer.date}}catch(a){t.warn({err:a},"Failed to get merge base commit from GitHub")}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let a=await e.getCommitFromGithub(r,n,o.gitCommitSha);a&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??a.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??a.author.name,gitCommitMessage:i.gitCommitMessage??a.message})}catch(a){t.warn({err:a},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName)try{let a=await e.getMergedBranchFromGithub(r,n,o.gitBranchName??"",o.gitCommitSha);a.mergedBranch&&(i={...i,mergedGitBranchName:a.mergedBranch})}catch(a){t.warn({err:a},"Failed to get merged branch from GitHub")}return i}async function AY(t,e,r){try{if(r.githubRepository){let[n,o]=r.githubRepository.split("/");return await vY(t,e,n,o,r)}else if(r.gitlabProjectPath)return await TY(t,e,r.gitlabProjectPath,r)}catch(n){t.warn({err:n},"Failed to get remote git metadata")}return r}async function Ir(t,e,r){let n=await EY(r),o=await ci(t,n.gitMainBranch),i={...n,...o};(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp)&&i.gitBranchName===n.gitMainBranch&&(i.lastCommitOnMainSha=i.gitCommitSha,i.lastCommitOnMainTimestamp=i.gitCommitTimestamp);let a=await AY(t,e,i);return{...n,...o,...a}}async function hL(){try{return!!(await yt.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as a1e}from"deep-object-diff";import{cloneDeep as l1e}from"lodash-es";import{v4 as E1e}from"uuid";import v1e from"yaml";import z1e from"yaml";import j1e from"zod";import{randomUUID as RY}from"crypto";import Ji from"fs";import Yl from"path";var SL=new Set([".DS_Store","__MACOSX"]),yL={status:(t,e)=>{if(t.status===e.status)return t.status;if(t.status==="FAILED"||e.status==="FAILED")return"FAILED";if(t.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(t.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(t.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(t.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${t.status} and ${e.status}`)},startedAt:(t,e)=>t.startedAt<e.startedAt?t.startedAt:e.startedAt,updatedAt:(t,e)=>t.updatedAt>e.updatedAt?t.updatedAt:e.updatedAt,finishedAt:(t,e)=>!t.finishedAt||!e.finishedAt?new Date:t.finishedAt>e.finishedAt?t.finishedAt:e.finishedAt,gitCommitTimestamp:(t,e)=>{if(!(!t&&!e)){if(!t.gitCommitTimestamp||!e.gitCommitTimestamp||t.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${t.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return t.gitCommitTimestamp}},pipelineId:(t,e)=>t.pipelineId===e.pipelineId?t.pipelineId:!t.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&t.pipelineId?t.pipelineId:t.startedAt<e.startedAt?e.pipelineId:t.pipelineId,labels:(t,e)=>{let r=new Set([...t.labels??[],...e.labels??[]]);return Array.from(r)}};function CY(t,e,r){if(yL[r]){let i=yL[r];return i(t,e)}let n=t[r],o=e[r];if(n!==o)throw new Error(`Metadata values for key "${r}" do not match: "${n}" vs "${o}"`);return n}var AE=class extends Error{constructor(e,r){let n=`${e} contains invalid Momentic results: ${r}. Please ensure that the path points to a folder containing only valid results. If you passed \`--output-dir test-results/results-1\` to the \`run\` command, your results path for merging should be \`test-results\`.`;super(n),this.name="InvalidMomenticResultsPathError"}};function bL(t,e){try{let r=Yl.join(e,"metadata.json");return fl.parse(JSON.parse(Ji.readFileSync(r,"utf-8")))}catch{throw new AE(t,e)}}function EL(t,e,r){let n=RY(),o=t.child({runGroupId:n});Ji.rmSync(e,{recursive:!0,force:!0});let i=Ji.readdirSync(r).filter(c=>!SL.has(c)).map(c=>Yl.join(r,c));if(i.length===0)throw new Error(`No run groups found in results path: ${r}`);Ji.mkdirSync(e,{recursive:!0});let a={...bL(r,i[0]),id:n};for(let c of i){let l=Yl.join(c,"runs");if(!Ji.existsSync(l))continue;let u=bL(r,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=CY(a,u,m)}let d=Ji.readdirSync(l);for(let p of d){if(SL.has(p))continue;let m=Yl.join(l,p),g=Yl.join(e,"runs",p);Ji.cpSync(m,g,{recursive:!0})}}let s=Yl.join(e,"metadata.json");Ji.writeFileSync(s,JSON.stringify(a,null,2))}import oN from"adm-zip";import WE from"fs";import{z as p3}from"zod";var q="v1",RE="cli",us="2.46.2";var wY=9e4,xY=3,_Y=1500,IY=15e3,no=class extends Error{status;rawError;constructor(e,r,n,o={}){super(n,o),this.status=e,this.rawError=r}};async function PY(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var CE=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return us&&(e[pm]=us),RE&&(e[ox]=RE),e}async sendRequest(e,r){let{retries:n=xY,requestTimeoutMs:o=wY,initialRetryDelayMs:i=_Y,maxRetryDelayMs:a=IY,onFailedRequest:s}=r,c=n,l=n,u,d={path:e,baseUrl:this.baseUrl,method:r.method};for(;c>0;)try{return c--,await this.sendSingleRequestHelper(e,r,o)}catch(p){u=p;try{s?.(u)}catch{}if(p instanceof no&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new zi),c===0)throw u;let m=l-c,g=Math.min(i*Math.pow(2,m-1),a);await new Promise(h=>setTimeout(h,g))}throw this.logger.warn({...d,err:u},"Got fatal error response from Momentic server"),u}async sendSingleRequestHelper(e,r,n){let o={path:e,baseUrl:this.baseUrl,method:r.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();r.signal&&r.signal.addEventListener("abort",s,{once:!0});let c=Date.now(),l={...this.getHeaders(),...r.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:r.method,body:r.body?JSON.stringify(r.body):void 0,headers:l,signal:i.signal});if(!u.ok){let m=await PY(u);throw new no(u.status,m,`Request to ${r.method} ${e} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else if(r.responseType==="buffer"){let m=await u.arrayBuffer();d=Buffer.from(m)}else{let m=await u.text();try{d=JSON.parse(m)}catch{d=m}}this.logger&&r.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server");let p=r.responseHeadersObject;return p&&u.headers.forEach((m,g)=>{p[g.toLowerCase()]=m}),d}finally{clearTimeout(a),r.signal&&r.signal.removeEventListener("abort",s)}}},fr=class extends CE{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[nx]:this.mode??""}}};import{createAnthropic as d3}from"@ai-sdk/anthropic";import{InvalidArgumentError as OY}from"@ai-sdk/provider";import{APICallError as mHe}from"@ai-sdk/provider";import{APICallError as NY}from"@ai-sdk/provider";import{LoadAPIKeyError as jg}from"@ai-sdk/provider";import{LoadSettingError as SHe}from"@ai-sdk/provider";import{JSONParseError as Wg,TypeValidationError as zY}from"@ai-sdk/provider";import{TypeValidationError as PE}from"@ai-sdk/provider";import{TypeValidationError as VY}from"@ai-sdk/provider";var zg=class extends Error{constructor(e,r){super(e),this.name="ParseError",this.type=r.type,this.field=r.field,this.value=r.value,this.line=r.line}};function wE(t){}function TL(t){if(typeof t=="function")throw new TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:e=wE,onError:r=wE,onRetry:n=wE,onComment:o}=t,i="",a=!0,s,c="",l="";function u(h){let f=a?h.replace(/^\xEF\xBB\xBF/,""):h,[S,b]=MY(`${i}${f}`);for(let y of S)d(y);i=b,a=!1}function d(h){if(h===""){m();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let f=h.indexOf(":");if(f!==-1){let S=h.slice(0,f),b=h[f+1]===" "?2:1,y=h.slice(f+b);p(S,y,h);return}p(h,"",h)}function p(h,f,S){switch(h){case"event":l=f;break;case"data":c=`${c}${f}
|
|
71
|
+
`)){let o=n.indexOf("=");if(o===-1)continue;let i=n.slice(0,o),a=n.slice(o+1).trim();r[i]=a}return r}async function cY(t,e,r){try{let o=r["github.user"]||void 0;if(o)return o}catch{}let n;try{if(e?.startsWith("http://")||e?.startsWith("https://"))n=new URL(e).host;else if(e?.startsWith("git@")){let o=e.indexOf("@"),i=e.indexOf(":",o+1);o!==-1&&i!==-1&&(n=e.slice(o+1,i))}}catch{}if(n=n?.toLowerCase(),!!n){try{if(e?.startsWith("git@")&&n?.includes("github")){let{stdout:o,stderr:i}=await gL("ssh",["-T","-o","BatchMode=yes",`git@${n}`],{timeout:5e3}),s=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}}catch{}try{let o=n&&n!=="github.com"?["api","--hostname",n,"user","-q",".login"]:["api","user","-q",".login"],{stdout:i}=await gL("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function uY(t,e,r){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return cY(t,e,r);if(o)return}catch{}}function Bg(t){if(t.startsWith("git@")){let e=t.split(":");if(e.length===2){let r=e[1].replace(".git","").split("/");if(r.length===2){let n=r[0],o=r[1];return`${n}/${o}`}}}else if(t.startsWith("http")||t.startsWith("https")){let r=new URL(t).pathname.split("/").filter(Boolean);if(r.length>=2){let n=r[0],o=r[1].replace(".git","");return`${n}/${o}`}}}async function vt(t,e){try{return(await e).trim()}catch(r){if(r instanceof Error&&r.message.includes("not a git repository"))return;t.error({err:r},"Failed to run git command");return}}function dY(){if(process.env.GITHUB_ACTION)return"GithubActions";if(process.env.GITLAB_CI)return"GitlabCI";if(process.env.CIRCLECI)return"CircleCI";if(process.env.BUILDKITE)return"Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return"AzureDevOps";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return"GCPCloudBuild";if(process.env.MOMENTIC_GIT_OVERRIDE)return"Custom"}async function pY(t){let[e,r,n]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return{ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?li(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function mY(t){let[e,r,n]=await Promise.all([vt(t,yt.listRemote(["--get-url","origin"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]);return{ciProvider:"GitlabCI",gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?li(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:r,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function gY(t){let[e,r,n,o]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.listRemote(["--get-url","origin"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??r,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Bg(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?li(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?c:void 0,gitlabProjectPath:s?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function hY(t){let[e,r,n]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Bg(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?li(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function fY(t){let[e,r,n]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Bg(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?li(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function SY(t,e){let[r,n,o,i,a,s,c,l,u]=await Promise.all([vt(t,yt.revparse(["HEAD"])),vt(t,yt.revparse(["--short","HEAD"])),vt(t,yt.revparse(["--abbrev-ref","HEAD"])),vt(t,yt.listRemote(["--get-url","origin"])),vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"])),e?vt(t,yt.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),lY(t)]),d=l?await vt(t,yt.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),g=i?Bg(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,S=u["user.username"]||void 0,b=await uY(t,i,u)??S??void 0;return{ciProvider:"none",gitCommitSha:r,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?li(a):void 0,gitCommitMessage:s,gitCommitAuthorName:c,gitLocalUsername:b,gitLocalEmail:h,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?li(d):void 0,githubRepository:p?g:void 0,gitlabProjectPath:m?g:void 0,pipelineId:void 0}}async function yY(){let t=process.env._HEAD_REPO_URL;return{ciProvider:"GCPCloudBuild",gitCommitSha:process.env.COMMIT_SHA,gitCommitShaShort:process.env.COMMIT_SHA?.slice(0,6),gitBranchName:process.env.BRANCH_NAME,gitOriginUrl:t?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:t?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}function bY(){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:li(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:li(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 EY(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function ci(t,e){let r=dY();if(!r)return SY(t,e);switch(r){case"GithubActions":return pY(t);case"GitlabCI":return mY(t);case"CircleCI":return gY(t);case"Buildkite":return hY(t);case"AzureDevOps":return fY(t);case"GCPCloudBuild":return yY();case"Custom":return bY()}}async function TY(t,e,r,n){let o=n;if(!n.gitCommitSha)return o;if(n.gitMainBranch&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let i=await e.getMergeBaseCommitFromGitlab(r,n.gitMainBranch,n.gitCommitSha);o={...o,lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(i){t.warn({err:i},"Failed to get merge base commit from Gitlab")}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let i=await e.getCommitFromGitlab(r,n.gitCommitSha);i&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??i.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??i.author.name,gitCommitMessage:o.gitCommitMessage??i.message})}catch(i){t.warn({err:i},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName)try{let i=await e.getMergedBranchFromGitlab(r,n.gitBranchName??"",n.gitCommitSha);i.mergedBranch&&(o={...o,mergedGitBranchName:i.mergedBranch})}catch(i){t.warn({err:i},"Failed to get merged branch from Gitlab")}return o}async function vY(t,e,r,n,o){let i=o;if(!o.gitCommitSha)return i;if(o.gitMainBranch&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let a=await e.getMergeBaseCommitFromGithub(r,n,o.gitMainBranch,o.gitCommitSha);i={...i,lastCommitOnMainSha:a.sha,lastCommitOnMainTimestamp:a.committer.date}}catch(a){t.warn({err:a},"Failed to get merge base commit from GitHub")}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let a=await e.getCommitFromGithub(r,n,o.gitCommitSha);a&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??a.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??a.author.name,gitCommitMessage:i.gitCommitMessage??a.message})}catch(a){t.warn({err:a},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName)try{let a=await e.getMergedBranchFromGithub(r,n,o.gitBranchName??"",o.gitCommitSha);a.mergedBranch&&(i={...i,mergedGitBranchName:a.mergedBranch})}catch(a){t.warn({err:a},"Failed to get merged branch from GitHub")}return i}async function AY(t,e,r){try{if(r.githubRepository){let[n,o]=r.githubRepository.split("/");return await vY(t,e,n,o,r)}else if(r.gitlabProjectPath)return await TY(t,e,r.gitlabProjectPath,r)}catch(n){t.warn({err:n},"Failed to get remote git metadata")}return r}async function Ir(t,e,r){let n=await EY(r),o=await ci(t,n.gitMainBranch),i={...n,...o};(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp)&&i.gitBranchName===n.gitMainBranch&&(i.lastCommitOnMainSha=i.gitCommitSha,i.lastCommitOnMainTimestamp=i.gitCommitTimestamp);let a=await AY(t,e,i);return{...n,...o,...a}}async function hL(){try{return!!(await yt.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as a1e}from"deep-object-diff";import{cloneDeep as l1e}from"lodash-es";import{v4 as E1e}from"uuid";import v1e from"yaml";import z1e from"yaml";import j1e from"zod";import{randomUUID as RY}from"crypto";import Ji from"fs";import Yl from"path";var SL=new Set([".DS_Store","__MACOSX"]),yL={status:(t,e)=>{if(t.status===e.status)return t.status;if(t.status==="FAILED"||e.status==="FAILED")return"FAILED";if(t.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(t.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(t.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(t.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${t.status} and ${e.status}`)},startedAt:(t,e)=>t.startedAt<e.startedAt?t.startedAt:e.startedAt,updatedAt:(t,e)=>t.updatedAt>e.updatedAt?t.updatedAt:e.updatedAt,finishedAt:(t,e)=>!t.finishedAt||!e.finishedAt?new Date:t.finishedAt>e.finishedAt?t.finishedAt:e.finishedAt,gitCommitTimestamp:(t,e)=>{if(!(!t&&!e)){if(!t.gitCommitTimestamp||!e.gitCommitTimestamp||t.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${t.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return t.gitCommitTimestamp}},pipelineId:(t,e)=>t.pipelineId===e.pipelineId?t.pipelineId:!t.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&t.pipelineId?t.pipelineId:t.startedAt<e.startedAt?e.pipelineId:t.pipelineId,labels:(t,e)=>{let r=new Set([...t.labels??[],...e.labels??[]]);return Array.from(r)}};function CY(t,e,r){if(yL[r]){let i=yL[r];return i(t,e)}let n=t[r],o=e[r];if(n!==o)throw new Error(`Metadata values for key "${r}" do not match: "${n}" vs "${o}"`);return n}var AE=class extends Error{constructor(e,r){let n=`${e} contains invalid Momentic results: ${r}. Please ensure that the path points to a folder containing only valid results. If you passed \`--output-dir test-results/results-1\` to the \`run\` command, your results path for merging should be \`test-results\`.`;super(n),this.name="InvalidMomenticResultsPathError"}};function bL(t,e){try{let r=Yl.join(e,"metadata.json");return fl.parse(JSON.parse(Ji.readFileSync(r,"utf-8")))}catch{throw new AE(t,e)}}function EL(t,e,r){let n=RY(),o=t.child({runGroupId:n});Ji.rmSync(e,{recursive:!0,force:!0});let i=Ji.readdirSync(r).filter(c=>!SL.has(c)).map(c=>Yl.join(r,c));if(i.length===0)throw new Error(`No run groups found in results path: ${r}`);Ji.mkdirSync(e,{recursive:!0});let a={...bL(r,i[0]),id:n};for(let c of i){let l=Yl.join(c,"runs");if(!Ji.existsSync(l))continue;let u=bL(r,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=CY(a,u,m)}let d=Ji.readdirSync(l);for(let p of d){if(SL.has(p))continue;let m=Yl.join(l,p),g=Yl.join(e,"runs",p);Ji.cpSync(m,g,{recursive:!0})}}let s=Yl.join(e,"metadata.json");Ji.writeFileSync(s,JSON.stringify(a,null,2))}import oN from"adm-zip";import WE from"fs";import{z as p3}from"zod";var q="v1",RE="cli",us="2.46.3";var wY=9e4,xY=3,_Y=1500,IY=15e3,no=class extends Error{status;rawError;constructor(e,r,n,o={}){super(n,o),this.status=e,this.rawError=r}};async function PY(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var CE=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return us&&(e[pm]=us),RE&&(e[ox]=RE),e}async sendRequest(e,r){let{retries:n=xY,requestTimeoutMs:o=wY,initialRetryDelayMs:i=_Y,maxRetryDelayMs:a=IY,onFailedRequest:s}=r,c=n,l=n,u,d={path:e,baseUrl:this.baseUrl,method:r.method};for(;c>0;)try{return c--,await this.sendSingleRequestHelper(e,r,o)}catch(p){u=p;try{s?.(u)}catch{}if(p instanceof no&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new zi),c===0)throw u;let m=l-c,g=Math.min(i*Math.pow(2,m-1),a);await new Promise(h=>setTimeout(h,g))}throw this.logger.warn({...d,err:u},"Got fatal error response from Momentic server"),u}async sendSingleRequestHelper(e,r,n){let o={path:e,baseUrl:this.baseUrl,method:r.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();r.signal&&r.signal.addEventListener("abort",s,{once:!0});let c=Date.now(),l={...this.getHeaders(),...r.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:r.method,body:r.body?JSON.stringify(r.body):void 0,headers:l,signal:i.signal});if(!u.ok){let m=await PY(u);throw new no(u.status,m,`Request to ${r.method} ${e} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else if(r.responseType==="buffer"){let m=await u.arrayBuffer();d=Buffer.from(m)}else{let m=await u.text();try{d=JSON.parse(m)}catch{d=m}}this.logger&&r.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server");let p=r.responseHeadersObject;return p&&u.headers.forEach((m,g)=>{p[g.toLowerCase()]=m}),d}finally{clearTimeout(a),r.signal&&r.signal.removeEventListener("abort",s)}}},fr=class extends CE{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[nx]:this.mode??""}}};import{createAnthropic as d3}from"@ai-sdk/anthropic";import{InvalidArgumentError as OY}from"@ai-sdk/provider";import{APICallError as mHe}from"@ai-sdk/provider";import{APICallError as NY}from"@ai-sdk/provider";import{LoadAPIKeyError as jg}from"@ai-sdk/provider";import{LoadSettingError as SHe}from"@ai-sdk/provider";import{JSONParseError as Wg,TypeValidationError as zY}from"@ai-sdk/provider";import{TypeValidationError as PE}from"@ai-sdk/provider";import{TypeValidationError as VY}from"@ai-sdk/provider";var zg=class extends Error{constructor(e,r){super(e),this.name="ParseError",this.type=r.type,this.field=r.field,this.value=r.value,this.line=r.line}};function wE(t){}function TL(t){if(typeof t=="function")throw new TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:e=wE,onError:r=wE,onRetry:n=wE,onComment:o}=t,i="",a=!0,s,c="",l="";function u(h){let f=a?h.replace(/^\xEF\xBB\xBF/,""):h,[S,b]=MY(`${i}${f}`);for(let y of S)d(y);i=b,a=!1}function d(h){if(h===""){m();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let f=h.indexOf(":");if(f!==-1){let S=h.slice(0,f),b=h[f+1]===" "?2:1,y=h.slice(f+b);p(S,y,h);return}p(h,"",h)}function p(h,f,S){switch(h){case"event":l=f;break;case"data":c=`${c}${f}
|
|
72
72
|
`;break;case"id":s=f.includes("\0")?void 0:f;break;case"retry":/^\d+$/.test(f)?n(parseInt(f,10)):r(new zg(`Invalid \`retry\` value: "${f}"`,{type:"invalid-retry",value:f,line:S}));break;default:r(new zg(`Unknown field "${h.length>20?`${h.slice(0,20)}\u2026`:h}"`,{type:"unknown-field",field:h,value:f,line:S}));break}}function m(){c.length>0&&e({id:s,event:l||void 0,data:c.endsWith(`
|
|
73
73
|
`)?c.slice(0,-1):c}),s=void 0,c="",l=""}function g(h={}){i&&h.consume&&d(i),a=!0,s=void 0,c="",l="",i=""}return{feed:u,reset:g}}function MY(t){let e=[],r="",n=0;for(;n<t.length;){let o=t.indexOf("\r",n),i=t.indexOf(`
|
|
74
74
|
`,n),a=-1;if(o!==-1&&i!==-1?a=Math.min(o,i):o!==-1?a=o:i!==-1&&(a=i),a===-1){r=t.slice(n);break}else{let s=t.slice(n,a);e.push(s),n=a+1,t[n-1]==="\r"&&t[n]===`
|
|
@@ -76,7 +76,7 @@ ${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Moment
|
|
|
76
76
|
]))`;continue}else if(o[l]==="$"){i+=`($|(?=[\r
|
|
77
77
|
]))`;continue}}if(n.s&&o[l]==="."){i+=s?`${o[l]}\r
|
|
78
78
|
`:`[${o[l]}\r
|
|
79
|
-
]`;continue}i+=o[l],o[l]==="\\"?a=!0:s&&o[l]==="]"?s=!1:!s&&o[l]==="["&&(s=!0)}try{new RegExp(i)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return i}function kL(t,e){var r,n,o,i,a,s;let c={type:"object",additionalProperties:(r=dt(t.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]}))!=null?r:e.allowedAdditionalProperties};if(((n=t.keyType)==null?void 0:n._def.typeName)===Vg.ZodString&&((o=t.keyType._def.checks)!=null&&o.length)){let{type:l,...u}=DL(t.keyType._def,e);return{...c,propertyNames:u}}else{if(((i=t.keyType)==null?void 0:i._def.typeName)===Vg.ZodEnum)return{...c,propertyNames:{enum:t.keyType._def.values}};if(((a=t.keyType)==null?void 0:a._def.typeName)===Vg.ZodBranded&&t.keyType._def.type._def.typeName===Vg.ZodString&&((s=t.keyType._def.type._def.checks)!=null&&s.length)){let{type:l,...u}=LL(t.keyType._def,e);return{...c,propertyNames:u}}}return c}function S4(t,e){if(e.mapStrategy==="record")return kL(t,e);let r=dt(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||un(),n=dt(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||un();return{type:"array",maxItems:125,items:{type:"array",items:[r,n],minItems:2,maxItems:2}}}function y4(t){let e=t.values,n=Object.keys(t.values).filter(i=>typeof e[e[i]]!="number").map(i=>e[i]),o=Array.from(new Set(n.map(i=>typeof i)));return{type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function b4(){return{not:un()}}function E4(){return{type:"null"}}var ME={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function T4(t,e){let r=t.options instanceof Map?Array.from(t.options.values()):t.options;if(r.every(n=>n._def.typeName in ME&&(!n._def.checks||!n._def.checks.length))){let n=r.reduce((o,i)=>{let a=ME[i._def.typeName];return a&&!o.includes(a)?[...o,a]:o},[]);return{type:n.length>1?n:n[0]}}else if(r.every(n=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=r.reduce((o,i)=>{let a=typeof i._def.value;switch(a){case"string":case"number":case"boolean":return[...o,a];case"bigint":return[...o,"integer"];case"object":if(i._def.value===null)return[...o,"null"];case"symbol":case"undefined":case"function":default:return o}},[]);if(n.length===r.length){let o=n.filter((i,a,s)=>s.indexOf(i)===a);return{type:o.length>1?o:o[0],enum:r.reduce((i,a)=>i.includes(a._def.value)?i:[...i,a._def.value],[])}}}else if(r.every(n=>n._def.typeName==="ZodEnum"))return{type:"string",enum:r.reduce((n,o)=>[...n,...o._def.values.filter(i=>!n.includes(i))],[])};return v4(t,e)}var v4=(t,e)=>{let r=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((n,o)=>dt(n._def,{...e,currentPath:[...e.currentPath,"anyOf",`${o}`]})).filter(n=>!!n&&(!e.strictUnions||typeof n=="object"&&Object.keys(n).length>0));return r.length?{anyOf:r}:void 0};function A4(t,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(t.innerType._def.typeName)&&(!t.innerType._def.checks||!t.innerType._def.checks.length))return{type:[ME[t.innerType._def.typeName],"null"]};let r=dt(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return r&&{anyOf:[r,{type:"null"}]}}function R4(t){let e={type:"number"};if(!t.checks)return e;for(let r of t.checks)switch(r.kind){case"int":e.type="integer";break;case"min":r.inclusive?e.minimum=r.value:e.exclusiveMinimum=r.value;break;case"max":r.inclusive?e.maximum=r.value:e.exclusiveMaximum=r.value;break;case"multipleOf":e.multipleOf=r.value;break}return e}function C4(t,e){let r={type:"object",properties:{}},n=[],o=t.shape();for(let a in o){let s=o[a];if(s===void 0||s._def===void 0)continue;let c=x4(s),l=dt(s._def,{...e,currentPath:[...e.currentPath,"properties",a],propertyPath:[...e.currentPath,"properties",a]});l!==void 0&&(r.properties[a]=l,c||n.push(a))}n.length&&(r.required=n);let i=w4(t,e);return i!==void 0&&(r.additionalProperties=i),r}function w4(t,e){if(t.catchall._def.typeName!=="ZodNever")return dt(t.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(t.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function x4(t){try{return t.isOptional()}catch{return!0}}var _4=(t,e)=>{var r;if(e.currentPath.toString()===((r=e.propertyPath)==null?void 0:r.toString()))return dt(t.innerType._def,e);let n=dt(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return n?{anyOf:[{not:un()},n]}:un()},I4=(t,e)=>{if(e.pipeStrategy==="input")return dt(t.in._def,e);if(e.pipeStrategy==="output")return dt(t.out._def,e);let r=dt(t.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),n=dt(t.out._def,{...e,currentPath:[...e.currentPath,"allOf",r?"1":"0"]});return{allOf:[r,n].filter(o=>o!==void 0)}};function P4(t,e){return dt(t.type._def,e)}function M4(t,e){let n={type:"array",uniqueItems:!0,items:dt(t.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return t.minSize&&(n.minItems=t.minSize.value),t.maxSize&&(n.maxItems=t.maxSize.value),n}function O4(t,e){return t.rest?{type:"array",minItems:t.items.length,items:t.items.map((r,n)=>dt(r._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[]),additionalItems:dt(t.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((r,n)=>dt(r._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[])}}function L4(){return{not:un()}}function N4(){return un()}var D4=(t,e)=>dt(t.innerType._def,e),k4=(t,e,r)=>{switch(e){case ze.ZodString:return DL(t,r);case ze.ZodNumber:return R4(t);case ze.ZodObject:return C4(t,r);case ze.ZodBigInt:return i4(t);case ze.ZodBoolean:return a4();case ze.ZodDate:return NL(t,r);case ze.ZodUndefined:return L4();case ze.ZodNull:return E4();case ze.ZodArray:return o4(t,r);case ze.ZodUnion:case ze.ZodDiscriminatedUnion:return T4(t,r);case ze.ZodIntersection:return m4(t,r);case ze.ZodTuple:return O4(t,r);case ze.ZodRecord:return kL(t,r);case ze.ZodLiteral:return g4(t);case ze.ZodEnum:return d4(t);case ze.ZodNativeEnum:return y4(t);case ze.ZodNullable:return A4(t,r);case ze.ZodOptional:return _4(t,r);case ze.ZodMap:return S4(t,r);case ze.ZodSet:return M4(t,r);case ze.ZodLazy:return()=>t.getter()._def;case ze.ZodPromise:return P4(t,r);case ze.ZodNaN:case ze.ZodNever:return b4();case ze.ZodEffects:return u4(t,r);case ze.ZodAny:return un();case ze.ZodUnknown:return N4();case ze.ZodDefault:return c4(t,r);case ze.ZodBranded:return LL(t,r);case ze.ZodReadonly:return D4(t,r);case ze.ZodCatch:return s4(t,r);case ze.ZodPipeline:return I4(t,r);case ze.ZodFunction:case ze.ZodVoid:case ze.ZodSymbol:return;default:return(n=>{})(e)}};function dt(t,e,r=!1){var n;let o=e.seen.get(t);if(e.override){let c=(n=e.override)==null?void 0:n.call(e,t,e,o,r);if(c!==t4)return c}if(o&&!r){let c=U4(o,e);if(c!==void 0)return c}let i={def:t,path:e.currentPath,jsonSchema:void 0};e.seen.set(t,i);let a=k4(t,t.typeName,e),s=typeof a=="function"?dt(a(),e):a;if(s&&F4(t,e,s),e.postProcess){let c=e.postProcess(s,t,e);return i.jsonSchema=s,c}return i.jsonSchema=s,s}var U4=(t,e)=>{switch(e.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:e4(e.currentPath,t.path)};case"none":case"seen":return t.path.length<e.currentPath.length&&t.path.every((r,n)=>e.currentPath[n]===r)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),un()):e.$refStrategy==="seen"?un():void 0}},F4=(t,e,r)=>(t.description&&(r.description=t.description),r),B4=t=>{let e=r4(t),r=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,currentPath:r,propertyPath:void 0,seen:new Map(Object.entries(e.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...e.basePath,e.definitionPath,n],jsonSchema:void 0}]))}},z4=(t,e)=>{var r;let n=B4(e),o=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((l,[u,d])=>{var p;return{...l,[u]:(p=dt(d._def,{...n,currentPath:[...n.basePath,n.definitionPath,u]},!0))!=null?p:un()}},{}):void 0,i=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,a=(r=dt(t._def,i===void 0?n:{...n,currentPath:[...n.basePath,n.definitionPath,i]},!1))!=null?r:un(),s=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;s!==void 0&&(a.title=s);let c=i===void 0?o?{...a,[n.definitionPath]:o}:a:{$ref:[...n.$refStrategy==="relative"?[]:n.basePath,n.definitionPath,i].join("/"),[n.definitionPath]:{...o,[i]:a}};return c.$schema="http://json-schema.org/draft-07/schema#",c},H4=z4;function j4(t,e){var r;let n=(r=e?.useReferences)!=null?r:!1;return UL(()=>H4(t,{$refStrategy:n?"root":"none"}),{validate:async o=>{let i=await t.safeParseAsync(o);return i.success?{success:!0,value:i.data}:{success:!1,error:i.error}}})}function G4(t,e){var r;let n=(r=e?.useReferences)!=null?r:!1;return UL(()=>$g(Kg.toJSONSchema(t,{target:"draft-7",io:"input",reused:n?"ref":"inline"})),{validate:async o=>{let i=await Kg.safeParseAsync(t,o);return i.success?{success:!0,value:i.data}:{success:!1,error:i.error}}})}function V4(t){return"_zod"in t}function me(t,e){return V4(t)?G4(t,e):j4(t,e)}var $4=Symbol.for("vercel.ai.schema");function Ft(t){let e;return()=>(e==null&&(e=t()),e)}function UL(t,{validate:e}={}){return{[$4]:!0,_type:void 0,[qg]:!0,get jsonSchema(){return typeof t=="function"&&(t=t()),t},validate:e}}var{btoa:W4,atob:q4}=globalThis;function FL(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=q4(e);return Uint8Array.from(r,n=>n.codePointAt(0))}function K4(t){let e="";for(let r=0;r<t.length;r++)e+=String.fromCodePoint(t[r]);return W4(e)}function Zi(t){return t instanceof Uint8Array?K4(t):t}function BL(t){return t?.replace(/\/$/,"")}import{InvalidResponseDataError as kE}from"@ai-sdk/provider";import{z as Qi}from"zod/v4";import{UnsupportedFunctionalityError as Yg}from"@ai-sdk/provider";import{z as H}from"zod/v4";import{z as Ct}from"zod/v4";import{UnsupportedFunctionalityError as Q4}from"@ai-sdk/provider";import{InvalidPromptError as r5,UnsupportedFunctionalityError as HL}from"@ai-sdk/provider";import{z as Ee}from"zod/v4";import{z as _o}from"zod/v4";import{TooManyEmbeddingValuesForCallError as s5}from"@ai-sdk/provider";import{z as FE}from"zod/v4";import{z as ds}from"zod/v4";import{z as yr}from"zod/v4";import{z as ar}from"zod/v4";import{z as qe}from"zod/v4";import{z as Pr}from"zod/v4";import{z as pn}from"zod/v4";import{z as tt}from"zod/v4";import{z as $t}from"zod/v4";import{APICallError as B5}from"@ai-sdk/provider";import{UnsupportedFunctionalityError as z5}from"@ai-sdk/provider";import{z as BE}from"zod/v4";import{z as E}from"zod/v4";import{z as Dt}from"zod/v4";import{UnsupportedFunctionalityError as q5}from"@ai-sdk/provider";import{z as zE}from"zod/v4";import{z as Bt}from"zod/v4";import{z as ea}from"zod/v4";var HE=Qi.object({error:Qi.object({message:Qi.string(),type:Qi.string().nullish(),param:Qi.any().nullish(),code:Qi.union([Qi.string(),Qi.number()]).nullish()})}),Io=ML({errorSchema:HE,errorToMessage:t=>t.error.message});function XL(t){let e=t.startsWith("o3")||t.startsWith("o4-mini")||t.startsWith("gpt-5")&&!t.startsWith("gpt-5-chat"),r=t.startsWith("gpt-4")||t.startsWith("gpt-5-mini")||t.startsWith("gpt-5")&&!t.startsWith("gpt-5-nano")&&!t.startsWith("gpt-5-chat")||t.startsWith("o3")||t.startsWith("o4-mini"),n=!(t.startsWith("gpt-3")||t.startsWith("gpt-4")||t.startsWith("chatgpt-4o")||t.startsWith("gpt-5-chat")),o=t.startsWith("gpt-5.1")||t.startsWith("gpt-5.2");return{supportsFlexProcessing:e,supportsPriorityProcessing:r,isReasoningModel:n,systemMessageMode:n?"developer":"system",supportsNonReasoningParameters:o}}function Y4({prompt:t,systemMessageMode:e="system"}){let r=[],n=[];for(let{role:o,content:i}of t)switch(o){case"system":{switch(e){case"system":{r.push({role:"system",content:i});break}case"developer":{r.push({role:"developer",content:i});break}case"remove":{n.push({type:"other",message:"system messages are removed for this model"});break}default:{let a=e;throw new Error(`Unsupported system message mode: ${a}`)}}break}case"user":{if(i.length===1&&i[0].type==="text"){r.push({role:"user",content:i[0].text});break}r.push({role:"user",content:i.map((a,s)=>{var c,l,u;switch(a.type){case"text":return{type:"text",text:a.text};case"file":if(a.mediaType.startsWith("image/")){let d=a.mediaType==="image/*"?"image/jpeg":a.mediaType;return{type:"image_url",image_url:{url:a.data instanceof URL?a.data.toString():`data:${d};base64,${Zi(a.data)}`,detail:(l=(c=a.providerOptions)==null?void 0:c.openai)==null?void 0:l.imageDetail}}}else if(a.mediaType.startsWith("audio/")){if(a.data instanceof URL)throw new Yg({functionality:"audio file parts with URLs"});switch(a.mediaType){case"audio/wav":return{type:"input_audio",input_audio:{data:Zi(a.data),format:"wav"}};case"audio/mp3":case"audio/mpeg":return{type:"input_audio",input_audio:{data:Zi(a.data),format:"mp3"}};default:throw new Yg({functionality:`audio content parts with media type ${a.mediaType}`})}}else if(a.mediaType==="application/pdf"){if(a.data instanceof URL)throw new Yg({functionality:"PDF file parts with URLs"});return{type:"file",file:typeof a.data=="string"&&a.data.startsWith("file-")?{file_id:a.data}:{filename:(u=a.filename)!=null?u:`part-${s}.pdf`,file_data:`data:application/pdf;base64,${Zi(a.data)}`}}}else throw new Yg({functionality:`file part media type ${a.mediaType}`})}})});break}case"assistant":{let a="",s=[];for(let c of i)switch(c.type){case"text":{a+=c.text;break}case"tool-call":{s.push({id:c.toolCallId,type:"function",function:{name:c.toolName,arguments:JSON.stringify(c.input)}});break}}r.push({role:"assistant",content:a,tool_calls:s.length>0?s:void 0});break}case"tool":{for(let a of i){let s=a.output,c;switch(s.type){case"text":case"error-text":c=s.value;break;case"content":case"json":case"error-json":c=JSON.stringify(s.value);break}r.push({role:"tool",tool_call_id:a.toolCallId,content:c})}break}default:{let a=o;throw new Error(`Unsupported role: ${a}`)}}return{messages:r,warnings:n}}function UE({id:t,model:e,created:r}){return{id:t??void 0,modelId:e??void 0,timestamp:r?new Date(r*1e3):void 0}}function zL(t){switch(t){case"stop":return"stop";case"length":return"length";case"content_filter":return"content-filter";case"function_call":case"tool_calls":return"tool-calls";default:return"unknown"}}var X4=bt(()=>me(H.object({id:H.string().nullish(),created:H.number().nullish(),model:H.string().nullish(),choices:H.array(H.object({message:H.object({role:H.literal("assistant").nullish(),content:H.string().nullish(),tool_calls:H.array(H.object({id:H.string().nullish(),type:H.literal("function"),function:H.object({name:H.string(),arguments:H.string()})})).nullish(),annotations:H.array(H.object({type:H.literal("url_citation"),url_citation:H.object({start_index:H.number(),end_index:H.number(),url:H.string(),title:H.string()})})).nullish()}),index:H.number(),logprobs:H.object({content:H.array(H.object({token:H.string(),logprob:H.number(),top_logprobs:H.array(H.object({token:H.string(),logprob:H.number()}))})).nullish()}).nullish(),finish_reason:H.string().nullish()})),usage:H.object({prompt_tokens:H.number().nullish(),completion_tokens:H.number().nullish(),total_tokens:H.number().nullish(),prompt_tokens_details:H.object({cached_tokens:H.number().nullish()}).nullish(),completion_tokens_details:H.object({reasoning_tokens:H.number().nullish(),accepted_prediction_tokens:H.number().nullish(),rejected_prediction_tokens:H.number().nullish()}).nullish()}).nullish()}))),J4=bt(()=>me(H.union([H.object({id:H.string().nullish(),created:H.number().nullish(),model:H.string().nullish(),choices:H.array(H.object({delta:H.object({role:H.enum(["assistant"]).nullish(),content:H.string().nullish(),tool_calls:H.array(H.object({index:H.number(),id:H.string().nullish(),type:H.literal("function").nullish(),function:H.object({name:H.string().nullish(),arguments:H.string().nullish()})})).nullish(),annotations:H.array(H.object({type:H.literal("url_citation"),url_citation:H.object({start_index:H.number(),end_index:H.number(),url:H.string(),title:H.string()})})).nullish()}).nullish(),logprobs:H.object({content:H.array(H.object({token:H.string(),logprob:H.number(),top_logprobs:H.array(H.object({token:H.string(),logprob:H.number()}))})).nullish()}).nullish(),finish_reason:H.string().nullish(),index:H.number()})),usage:H.object({prompt_tokens:H.number().nullish(),completion_tokens:H.number().nullish(),total_tokens:H.number().nullish(),prompt_tokens_details:H.object({cached_tokens:H.number().nullish()}).nullish(),completion_tokens_details:H.object({reasoning_tokens:H.number().nullish(),accepted_prediction_tokens:H.number().nullish(),rejected_prediction_tokens:H.number().nullish()}).nullish()}).nullish()}),HE]))),Z4=bt(()=>me(Ct.object({logitBias:Ct.record(Ct.coerce.number(),Ct.number()).optional(),logprobs:Ct.union([Ct.boolean(),Ct.number()]).optional(),parallelToolCalls:Ct.boolean().optional(),user:Ct.string().optional(),reasoningEffort:Ct.enum(["none","minimal","low","medium","high","xhigh"]).optional(),maxCompletionTokens:Ct.number().optional(),store:Ct.boolean().optional(),metadata:Ct.record(Ct.string().max(64),Ct.string().max(512)).optional(),prediction:Ct.record(Ct.string(),Ct.any()).optional(),structuredOutputs:Ct.boolean().optional(),serviceTier:Ct.enum(["auto","flex","priority","default"]).optional(),strictJsonSchema:Ct.boolean().optional(),textVerbosity:Ct.enum(["low","medium","high"]).optional(),promptCacheKey:Ct.string().optional(),promptCacheRetention:Ct.enum(["in_memory","24h"]).optional(),safetyIdentifier:Ct.string().optional()})));function e5({tools:t,toolChoice:e,structuredOutputs:r,strictJsonSchema:n}){t=t?.length?t:void 0;let o=[];if(t==null)return{tools:void 0,toolChoice:void 0,toolWarnings:o};let i=[];for(let s of t)switch(s.type){case"function":i.push({type:"function",function:{name:s.name,description:s.description,parameters:s.inputSchema,strict:r?n:void 0}});break;default:o.push({type:"unsupported-tool",tool:s});break}if(e==null)return{tools:i,toolChoice:void 0,toolWarnings:o};let a=e.type;switch(a){case"auto":case"none":case"required":return{tools:i,toolChoice:a,toolWarnings:o};case"tool":return{tools:i,toolChoice:{type:"function",function:{name:e.toolName}},toolWarnings:o};default:{let s=a;throw new Q4({functionality:`tool choice type: ${s}`})}}}var t5=class{constructor(t,e){this.specificationVersion="v2",this.supportedUrls={"image/*":[/^https?:\/\/.*$/]},this.modelId=t,this.config=e}get provider(){return this.config.provider}async getArgs({prompt:t,maxOutputTokens:e,temperature:r,topP:n,topK:o,frequencyPenalty:i,presencePenalty:a,stopSequences:s,responseFormat:c,seed:l,tools:u,toolChoice:d,providerOptions:p}){var m,g,h,f;let S=[],b=(m=await Gr({provider:"openai",providerOptions:p,schema:Z4}))!=null?m:{},y=(g=b.structuredOutputs)!=null?g:!0,T=XL(this.modelId);o!=null&&S.push({type:"unsupported-setting",setting:"topK"}),c?.type==="json"&&c.schema!=null&&!y&&S.push({type:"unsupported-setting",setting:"responseFormat",details:"JSON response format schema is only supported with structuredOutputs"});let{messages:w,warnings:P}=Y4({prompt:t,systemMessageMode:T.systemMessageMode});S.push(...P);let A=(h=b.strictJsonSchema)!=null?h:!1,x={model:this.modelId,logit_bias:b.logitBias,logprobs:b.logprobs===!0||typeof b.logprobs=="number"?!0:void 0,top_logprobs:typeof b.logprobs=="number"?b.logprobs:typeof b.logprobs=="boolean"&&b.logprobs?0:void 0,user:b.user,parallel_tool_calls:b.parallelToolCalls,max_tokens:e,temperature:r,top_p:n,frequency_penalty:i,presence_penalty:a,response_format:c?.type==="json"?y&&c.schema!=null?{type:"json_schema",json_schema:{schema:c.schema,strict:A,name:(f=c.name)!=null?f:"response",description:c.description}}:{type:"json_object"}:void 0,stop:s,seed:l,verbosity:b.textVerbosity,max_completion_tokens:b.maxCompletionTokens,store:b.store,metadata:b.metadata,prediction:b.prediction,reasoning_effort:b.reasoningEffort,service_tier:b.serviceTier,prompt_cache_key:b.promptCacheKey,prompt_cache_retention:b.promptCacheRetention,safety_identifier:b.safetyIdentifier,messages:w};T.isReasoningModel?((b.reasoningEffort!=="none"||!T.supportsNonReasoningParameters)&&(x.temperature!=null&&(x.temperature=void 0,S.push({type:"unsupported-setting",setting:"temperature",details:"temperature is not supported for reasoning models"})),x.top_p!=null&&(x.top_p=void 0,S.push({type:"unsupported-setting",setting:"topP",details:"topP is not supported for reasoning models"})),x.logprobs!=null&&(x.logprobs=void 0,S.push({type:"other",message:"logprobs is not supported for reasoning models"}))),x.frequency_penalty!=null&&(x.frequency_penalty=void 0,S.push({type:"unsupported-setting",setting:"frequencyPenalty",details:"frequencyPenalty is not supported for reasoning models"})),x.presence_penalty!=null&&(x.presence_penalty=void 0,S.push({type:"unsupported-setting",setting:"presencePenalty",details:"presencePenalty is not supported for reasoning models"})),x.logit_bias!=null&&(x.logit_bias=void 0,S.push({type:"other",message:"logitBias is not supported for reasoning models"})),x.top_logprobs!=null&&(x.top_logprobs=void 0,S.push({type:"other",message:"topLogprobs is not supported for reasoning models"})),x.max_tokens!=null&&(x.max_completion_tokens==null&&(x.max_completion_tokens=x.max_tokens),x.max_tokens=void 0)):(this.modelId.startsWith("gpt-4o-search-preview")||this.modelId.startsWith("gpt-4o-mini-search-preview"))&&x.temperature!=null&&(x.temperature=void 0,S.push({type:"unsupported-setting",setting:"temperature",details:"temperature is not supported for the search preview models and has been removed."})),b.serviceTier==="flex"&&!T.supportsFlexProcessing&&(S.push({type:"unsupported-setting",setting:"serviceTier",details:"flex processing is only available for o3, o4-mini, and gpt-5 models"}),x.service_tier=void 0),b.serviceTier==="priority"&&!T.supportsPriorityProcessing&&(S.push({type:"unsupported-setting",setting:"serviceTier",details:"priority processing is only available for supported models (gpt-4, gpt-5, gpt-5-mini, o3, o4-mini) and requires Enterprise access. gpt-5-nano is not supported"}),x.service_tier=void 0);let{tools:O,toolChoice:L,toolWarnings:N}=e5({tools:u,toolChoice:d,structuredOutputs:y,strictJsonSchema:A});return{args:{...x,tools:O,tool_choice:L},warnings:[...S,...N]}}async doGenerate(t){var e,r,n,o,i,a,s,c,l,u,d,p,m,g;let{args:h,warnings:f}=await this.getArgs(t),{responseHeaders:S,value:b,rawValue:y}=await Vr({url:this.config.url({path:"/chat/completions",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),body:h,failedResponseHandler:Io,successfulResponseHandler:Bn(X4),abortSignal:t.abortSignal,fetch:this.config.fetch}),T=b.choices[0],w=[],P=T.message.content;P!=null&&P.length>0&&w.push({type:"text",text:P});for(let L of(e=T.message.tool_calls)!=null?e:[])w.push({type:"tool-call",toolCallId:(r=L.id)!=null?r:dn(),toolName:L.function.name,input:L.function.arguments});for(let L of(n=T.message.annotations)!=null?n:[])w.push({type:"source",sourceType:"url",id:dn(),url:L.url_citation.url,title:L.url_citation.title});let A=(o=b.usage)==null?void 0:o.completion_tokens_details,x=(i=b.usage)==null?void 0:i.prompt_tokens_details,O={openai:{}};return A?.accepted_prediction_tokens!=null&&(O.openai.acceptedPredictionTokens=A?.accepted_prediction_tokens),A?.rejected_prediction_tokens!=null&&(O.openai.rejectedPredictionTokens=A?.rejected_prediction_tokens),((a=T.logprobs)==null?void 0:a.content)!=null&&(O.openai.logprobs=T.logprobs.content),{content:w,finishReason:zL(T.finish_reason),usage:{inputTokens:(c=(s=b.usage)==null?void 0:s.prompt_tokens)!=null?c:void 0,outputTokens:(u=(l=b.usage)==null?void 0:l.completion_tokens)!=null?u:void 0,totalTokens:(p=(d=b.usage)==null?void 0:d.total_tokens)!=null?p:void 0,reasoningTokens:(m=A?.reasoning_tokens)!=null?m:void 0,cachedInputTokens:(g=x?.cached_tokens)!=null?g:void 0},request:{body:h},response:{...UE(b),headers:S,body:y},warnings:f,providerMetadata:O}}async doStream(t){let{args:e,warnings:r}=await this.getArgs(t),n={...e,stream:!0,stream_options:{include_usage:!0}},{responseHeaders:o,value:i}=await Vr({url:this.config.url({path:"/chat/completions",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),body:n,failedResponseHandler:Io,successfulResponseHandler:Jl(J4),abortSignal:t.abortSignal,fetch:this.config.fetch}),a=[],s="unknown",c={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},l=!1,u=!1,d={openai:{}};return{stream:i.pipeThrough(new TransformStream({start(p){p.enqueue({type:"stream-start",warnings:r})},transform(p,m){var g,h,f,S,b,y,T,w,P,A,x,O,L,N,j,W,B,xe,F,z,ae,ue,_e,ye;if(t.includeRawChunks&&m.enqueue({type:"raw",rawValue:p.rawValue}),!p.success){s="error",m.enqueue({type:"error",error:p.error});return}let le=p.value;if("error"in le){s="error",m.enqueue({type:"error",error:le.error});return}if(!l){let Ae=UE(le);Object.values(Ae).some(Boolean)&&(l=!0,m.enqueue({type:"response-metadata",...UE(le)}))}le.usage!=null&&(c.inputTokens=(g=le.usage.prompt_tokens)!=null?g:void 0,c.outputTokens=(h=le.usage.completion_tokens)!=null?h:void 0,c.totalTokens=(f=le.usage.total_tokens)!=null?f:void 0,c.reasoningTokens=(b=(S=le.usage.completion_tokens_details)==null?void 0:S.reasoning_tokens)!=null?b:void 0,c.cachedInputTokens=(T=(y=le.usage.prompt_tokens_details)==null?void 0:y.cached_tokens)!=null?T:void 0,((w=le.usage.completion_tokens_details)==null?void 0:w.accepted_prediction_tokens)!=null&&(d.openai.acceptedPredictionTokens=(P=le.usage.completion_tokens_details)==null?void 0:P.accepted_prediction_tokens),((A=le.usage.completion_tokens_details)==null?void 0:A.rejected_prediction_tokens)!=null&&(d.openai.rejectedPredictionTokens=(x=le.usage.completion_tokens_details)==null?void 0:x.rejected_prediction_tokens));let Q=le.choices[0];if(Q?.finish_reason!=null&&(s=zL(Q.finish_reason)),((O=Q?.logprobs)==null?void 0:O.content)!=null&&(d.openai.logprobs=Q.logprobs.content),Q?.delta==null)return;let Te=Q.delta;if(Te.content!=null&&(u||(m.enqueue({type:"text-start",id:"0"}),u=!0),m.enqueue({type:"text-delta",id:"0",delta:Te.content})),Te.tool_calls!=null)for(let Ae of Te.tool_calls){let I=Ae.index;if(a[I]==null){if(Ae.type!=="function")throw new kE({data:Ae,message:"Expected 'function' type."});if(Ae.id==null)throw new kE({data:Ae,message:"Expected 'id' to be a string."});if(((L=Ae.function)==null?void 0:L.name)==null)throw new kE({data:Ae,message:"Expected 'function.name' to be a string."});m.enqueue({type:"tool-input-start",id:Ae.id,toolName:Ae.function.name}),a[I]={id:Ae.id,type:"function",function:{name:Ae.function.name,arguments:(N=Ae.function.arguments)!=null?N:""},hasFinished:!1};let ge=a[I];((j=ge.function)==null?void 0:j.name)!=null&&((W=ge.function)==null?void 0:W.arguments)!=null&&(ge.function.arguments.length>0&&m.enqueue({type:"tool-input-delta",id:ge.id,delta:ge.function.arguments}),DE(ge.function.arguments)&&(m.enqueue({type:"tool-input-end",id:ge.id}),m.enqueue({type:"tool-call",toolCallId:(B=ge.id)!=null?B:dn(),toolName:ge.function.name,input:ge.function.arguments}),ge.hasFinished=!0));continue}let oe=a[I];oe.hasFinished||(((xe=Ae.function)==null?void 0:xe.arguments)!=null&&(oe.function.arguments+=(z=(F=Ae.function)==null?void 0:F.arguments)!=null?z:""),m.enqueue({type:"tool-input-delta",id:oe.id,delta:(ae=Ae.function.arguments)!=null?ae:""}),((ue=oe.function)==null?void 0:ue.name)!=null&&((_e=oe.function)==null?void 0:_e.arguments)!=null&&DE(oe.function.arguments)&&(m.enqueue({type:"tool-input-end",id:oe.id}),m.enqueue({type:"tool-call",toolCallId:(ye=oe.id)!=null?ye:dn(),toolName:oe.function.name,input:oe.function.arguments}),oe.hasFinished=!0))}if(Te.annotations!=null)for(let Ae of Te.annotations)m.enqueue({type:"source",sourceType:"url",id:dn(),url:Ae.url_citation.url,title:Ae.url_citation.title})},flush(p){u&&p.enqueue({type:"text-end",id:"0"}),p.enqueue({type:"finish",finishReason:s,usage:c,...d!=null?{providerMetadata:d}:{}})}})),request:{body:n},response:{headers:o}}}};function n5({prompt:t,user:e="user",assistant:r="assistant"}){let n="";t[0].role==="system"&&(n+=`${t[0].content}
|
|
79
|
+
]`;continue}i+=o[l],o[l]==="\\"?a=!0:s&&o[l]==="]"?s=!1:!s&&o[l]==="["&&(s=!0)}try{new RegExp(i)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return i}function kL(t,e){var r,n,o,i,a,s;let c={type:"object",additionalProperties:(r=dt(t.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]}))!=null?r:e.allowedAdditionalProperties};if(((n=t.keyType)==null?void 0:n._def.typeName)===Vg.ZodString&&((o=t.keyType._def.checks)!=null&&o.length)){let{type:l,...u}=DL(t.keyType._def,e);return{...c,propertyNames:u}}else{if(((i=t.keyType)==null?void 0:i._def.typeName)===Vg.ZodEnum)return{...c,propertyNames:{enum:t.keyType._def.values}};if(((a=t.keyType)==null?void 0:a._def.typeName)===Vg.ZodBranded&&t.keyType._def.type._def.typeName===Vg.ZodString&&((s=t.keyType._def.type._def.checks)!=null&&s.length)){let{type:l,...u}=LL(t.keyType._def,e);return{...c,propertyNames:u}}}return c}function S4(t,e){if(e.mapStrategy==="record")return kL(t,e);let r=dt(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||un(),n=dt(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||un();return{type:"array",maxItems:125,items:{type:"array",items:[r,n],minItems:2,maxItems:2}}}function y4(t){let e=t.values,n=Object.keys(t.values).filter(i=>typeof e[e[i]]!="number").map(i=>e[i]),o=Array.from(new Set(n.map(i=>typeof i)));return{type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function b4(){return{not:un()}}function E4(){return{type:"null"}}var ME={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function T4(t,e){let r=t.options instanceof Map?Array.from(t.options.values()):t.options;if(r.every(n=>n._def.typeName in ME&&(!n._def.checks||!n._def.checks.length))){let n=r.reduce((o,i)=>{let a=ME[i._def.typeName];return a&&!o.includes(a)?[...o,a]:o},[]);return{type:n.length>1?n:n[0]}}else if(r.every(n=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=r.reduce((o,i)=>{let a=typeof i._def.value;switch(a){case"string":case"number":case"boolean":return[...o,a];case"bigint":return[...o,"integer"];case"object":if(i._def.value===null)return[...o,"null"];case"symbol":case"undefined":case"function":default:return o}},[]);if(n.length===r.length){let o=n.filter((i,a,s)=>s.indexOf(i)===a);return{type:o.length>1?o:o[0],enum:r.reduce((i,a)=>i.includes(a._def.value)?i:[...i,a._def.value],[])}}}else if(r.every(n=>n._def.typeName==="ZodEnum"))return{type:"string",enum:r.reduce((n,o)=>[...n,...o._def.values.filter(i=>!n.includes(i))],[])};return v4(t,e)}var v4=(t,e)=>{let r=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((n,o)=>dt(n._def,{...e,currentPath:[...e.currentPath,"anyOf",`${o}`]})).filter(n=>!!n&&(!e.strictUnions||typeof n=="object"&&Object.keys(n).length>0));return r.length?{anyOf:r}:void 0};function A4(t,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(t.innerType._def.typeName)&&(!t.innerType._def.checks||!t.innerType._def.checks.length))return{type:[ME[t.innerType._def.typeName],"null"]};let r=dt(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return r&&{anyOf:[r,{type:"null"}]}}function R4(t){let e={type:"number"};if(!t.checks)return e;for(let r of t.checks)switch(r.kind){case"int":e.type="integer";break;case"min":r.inclusive?e.minimum=r.value:e.exclusiveMinimum=r.value;break;case"max":r.inclusive?e.maximum=r.value:e.exclusiveMaximum=r.value;break;case"multipleOf":e.multipleOf=r.value;break}return e}function C4(t,e){let r={type:"object",properties:{}},n=[],o=t.shape();for(let a in o){let s=o[a];if(s===void 0||s._def===void 0)continue;let c=x4(s),l=dt(s._def,{...e,currentPath:[...e.currentPath,"properties",a],propertyPath:[...e.currentPath,"properties",a]});l!==void 0&&(r.properties[a]=l,c||n.push(a))}n.length&&(r.required=n);let i=w4(t,e);return i!==void 0&&(r.additionalProperties=i),r}function w4(t,e){if(t.catchall._def.typeName!=="ZodNever")return dt(t.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(t.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function x4(t){try{return t.isOptional()}catch{return!0}}var _4=(t,e)=>{var r;if(e.currentPath.toString()===((r=e.propertyPath)==null?void 0:r.toString()))return dt(t.innerType._def,e);let n=dt(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return n?{anyOf:[{not:un()},n]}:un()},I4=(t,e)=>{if(e.pipeStrategy==="input")return dt(t.in._def,e);if(e.pipeStrategy==="output")return dt(t.out._def,e);let r=dt(t.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),n=dt(t.out._def,{...e,currentPath:[...e.currentPath,"allOf",r?"1":"0"]});return{allOf:[r,n].filter(o=>o!==void 0)}};function P4(t,e){return dt(t.type._def,e)}function M4(t,e){let n={type:"array",uniqueItems:!0,items:dt(t.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return t.minSize&&(n.minItems=t.minSize.value),t.maxSize&&(n.maxItems=t.maxSize.value),n}function O4(t,e){return t.rest?{type:"array",minItems:t.items.length,items:t.items.map((r,n)=>dt(r._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[]),additionalItems:dt(t.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((r,n)=>dt(r._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[])}}function L4(){return{not:un()}}function N4(){return un()}var D4=(t,e)=>dt(t.innerType._def,e),k4=(t,e,r)=>{switch(e){case ze.ZodString:return DL(t,r);case ze.ZodNumber:return R4(t);case ze.ZodObject:return C4(t,r);case ze.ZodBigInt:return i4(t);case ze.ZodBoolean:return a4();case ze.ZodDate:return NL(t,r);case ze.ZodUndefined:return L4();case ze.ZodNull:return E4();case ze.ZodArray:return o4(t,r);case ze.ZodUnion:case ze.ZodDiscriminatedUnion:return T4(t,r);case ze.ZodIntersection:return m4(t,r);case ze.ZodTuple:return O4(t,r);case ze.ZodRecord:return kL(t,r);case ze.ZodLiteral:return g4(t);case ze.ZodEnum:return d4(t);case ze.ZodNativeEnum:return y4(t);case ze.ZodNullable:return A4(t,r);case ze.ZodOptional:return _4(t,r);case ze.ZodMap:return S4(t,r);case ze.ZodSet:return M4(t,r);case ze.ZodLazy:return()=>t.getter()._def;case ze.ZodPromise:return P4(t,r);case ze.ZodNaN:case ze.ZodNever:return b4();case ze.ZodEffects:return u4(t,r);case ze.ZodAny:return un();case ze.ZodUnknown:return N4();case ze.ZodDefault:return c4(t,r);case ze.ZodBranded:return LL(t,r);case ze.ZodReadonly:return D4(t,r);case ze.ZodCatch:return s4(t,r);case ze.ZodPipeline:return I4(t,r);case ze.ZodFunction:case ze.ZodVoid:case ze.ZodSymbol:return;default:return(n=>{})(e)}};function dt(t,e,r=!1){var n;let o=e.seen.get(t);if(e.override){let c=(n=e.override)==null?void 0:n.call(e,t,e,o,r);if(c!==t4)return c}if(o&&!r){let c=U4(o,e);if(c!==void 0)return c}let i={def:t,path:e.currentPath,jsonSchema:void 0};e.seen.set(t,i);let a=k4(t,t.typeName,e),s=typeof a=="function"?dt(a(),e):a;if(s&&F4(t,e,s),e.postProcess){let c=e.postProcess(s,t,e);return i.jsonSchema=s,c}return i.jsonSchema=s,s}var U4=(t,e)=>{switch(e.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:e4(e.currentPath,t.path)};case"none":case"seen":return t.path.length<e.currentPath.length&&t.path.every((r,n)=>e.currentPath[n]===r)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),un()):e.$refStrategy==="seen"?un():void 0}},F4=(t,e,r)=>(t.description&&(r.description=t.description),r),B4=t=>{let e=r4(t),r=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,currentPath:r,propertyPath:void 0,seen:new Map(Object.entries(e.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...e.basePath,e.definitionPath,n],jsonSchema:void 0}]))}},z4=(t,e)=>{var r;let n=B4(e),o=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((l,[u,d])=>{var p;return{...l,[u]:(p=dt(d._def,{...n,currentPath:[...n.basePath,n.definitionPath,u]},!0))!=null?p:un()}},{}):void 0,i=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,a=(r=dt(t._def,i===void 0?n:{...n,currentPath:[...n.basePath,n.definitionPath,i]},!1))!=null?r:un(),s=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;s!==void 0&&(a.title=s);let c=i===void 0?o?{...a,[n.definitionPath]:o}:a:{$ref:[...n.$refStrategy==="relative"?[]:n.basePath,n.definitionPath,i].join("/"),[n.definitionPath]:{...o,[i]:a}};return c.$schema="http://json-schema.org/draft-07/schema#",c},H4=z4;function j4(t,e){var r;let n=(r=e?.useReferences)!=null?r:!1;return UL(()=>H4(t,{$refStrategy:n?"root":"none"}),{validate:async o=>{let i=await t.safeParseAsync(o);return i.success?{success:!0,value:i.data}:{success:!1,error:i.error}}})}function G4(t,e){var r;let n=(r=e?.useReferences)!=null?r:!1;return UL(()=>$g(Kg.toJSONSchema(t,{target:"draft-7",io:"input",reused:n?"ref":"inline"})),{validate:async o=>{let i=await Kg.safeParseAsync(t,o);return i.success?{success:!0,value:i.data}:{success:!1,error:i.error}}})}function V4(t){return"_zod"in t}function me(t,e){return V4(t)?G4(t,e):j4(t,e)}var $4=Symbol.for("vercel.ai.schema");function Ft(t){let e;return()=>(e==null&&(e=t()),e)}function UL(t,{validate:e}={}){return{[$4]:!0,_type:void 0,[qg]:!0,get jsonSchema(){return typeof t=="function"&&(t=t()),t},validate:e}}var{btoa:W4,atob:q4}=globalThis;function FL(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=q4(e);return Uint8Array.from(r,n=>n.codePointAt(0))}function K4(t){let e="";for(let r=0;r<t.length;r++)e+=String.fromCodePoint(t[r]);return W4(e)}function Zi(t){return t instanceof Uint8Array?K4(t):t}function BL(t){return t?.replace(/\/$/,"")}import{InvalidResponseDataError as kE}from"@ai-sdk/provider";import{z as Qi}from"zod/v4";import{UnsupportedFunctionalityError as Yg}from"@ai-sdk/provider";import{z as H}from"zod/v4";import{z as Ct}from"zod/v4";import{UnsupportedFunctionalityError as Q4}from"@ai-sdk/provider";import{InvalidPromptError as r5,UnsupportedFunctionalityError as HL}from"@ai-sdk/provider";import{z as be}from"zod/v4";import{z as _o}from"zod/v4";import{TooManyEmbeddingValuesForCallError as s5}from"@ai-sdk/provider";import{z as FE}from"zod/v4";import{z as ds}from"zod/v4";import{z as yr}from"zod/v4";import{z as ar}from"zod/v4";import{z as qe}from"zod/v4";import{z as Pr}from"zod/v4";import{z as pn}from"zod/v4";import{z as tt}from"zod/v4";import{z as $t}from"zod/v4";import{APICallError as B5}from"@ai-sdk/provider";import{UnsupportedFunctionalityError as z5}from"@ai-sdk/provider";import{z as BE}from"zod/v4";import{z as E}from"zod/v4";import{z as Dt}from"zod/v4";import{UnsupportedFunctionalityError as q5}from"@ai-sdk/provider";import{z as zE}from"zod/v4";import{z as Bt}from"zod/v4";import{z as ea}from"zod/v4";var HE=Qi.object({error:Qi.object({message:Qi.string(),type:Qi.string().nullish(),param:Qi.any().nullish(),code:Qi.union([Qi.string(),Qi.number()]).nullish()})}),Io=ML({errorSchema:HE,errorToMessage:t=>t.error.message});function XL(t){let e=t.startsWith("o3")||t.startsWith("o4-mini")||t.startsWith("gpt-5")&&!t.startsWith("gpt-5-chat"),r=t.startsWith("gpt-4")||t.startsWith("gpt-5-mini")||t.startsWith("gpt-5")&&!t.startsWith("gpt-5-nano")&&!t.startsWith("gpt-5-chat")||t.startsWith("o3")||t.startsWith("o4-mini"),n=!(t.startsWith("gpt-3")||t.startsWith("gpt-4")||t.startsWith("chatgpt-4o")||t.startsWith("gpt-5-chat")),o=t.startsWith("gpt-5.1")||t.startsWith("gpt-5.2");return{supportsFlexProcessing:e,supportsPriorityProcessing:r,isReasoningModel:n,systemMessageMode:n?"developer":"system",supportsNonReasoningParameters:o}}function Y4({prompt:t,systemMessageMode:e="system"}){let r=[],n=[];for(let{role:o,content:i}of t)switch(o){case"system":{switch(e){case"system":{r.push({role:"system",content:i});break}case"developer":{r.push({role:"developer",content:i});break}case"remove":{n.push({type:"other",message:"system messages are removed for this model"});break}default:{let a=e;throw new Error(`Unsupported system message mode: ${a}`)}}break}case"user":{if(i.length===1&&i[0].type==="text"){r.push({role:"user",content:i[0].text});break}r.push({role:"user",content:i.map((a,s)=>{var c,l,u;switch(a.type){case"text":return{type:"text",text:a.text};case"file":if(a.mediaType.startsWith("image/")){let d=a.mediaType==="image/*"?"image/jpeg":a.mediaType;return{type:"image_url",image_url:{url:a.data instanceof URL?a.data.toString():`data:${d};base64,${Zi(a.data)}`,detail:(l=(c=a.providerOptions)==null?void 0:c.openai)==null?void 0:l.imageDetail}}}else if(a.mediaType.startsWith("audio/")){if(a.data instanceof URL)throw new Yg({functionality:"audio file parts with URLs"});switch(a.mediaType){case"audio/wav":return{type:"input_audio",input_audio:{data:Zi(a.data),format:"wav"}};case"audio/mp3":case"audio/mpeg":return{type:"input_audio",input_audio:{data:Zi(a.data),format:"mp3"}};default:throw new Yg({functionality:`audio content parts with media type ${a.mediaType}`})}}else if(a.mediaType==="application/pdf"){if(a.data instanceof URL)throw new Yg({functionality:"PDF file parts with URLs"});return{type:"file",file:typeof a.data=="string"&&a.data.startsWith("file-")?{file_id:a.data}:{filename:(u=a.filename)!=null?u:`part-${s}.pdf`,file_data:`data:application/pdf;base64,${Zi(a.data)}`}}}else throw new Yg({functionality:`file part media type ${a.mediaType}`})}})});break}case"assistant":{let a="",s=[];for(let c of i)switch(c.type){case"text":{a+=c.text;break}case"tool-call":{s.push({id:c.toolCallId,type:"function",function:{name:c.toolName,arguments:JSON.stringify(c.input)}});break}}r.push({role:"assistant",content:a,tool_calls:s.length>0?s:void 0});break}case"tool":{for(let a of i){let s=a.output,c;switch(s.type){case"text":case"error-text":c=s.value;break;case"content":case"json":case"error-json":c=JSON.stringify(s.value);break}r.push({role:"tool",tool_call_id:a.toolCallId,content:c})}break}default:{let a=o;throw new Error(`Unsupported role: ${a}`)}}return{messages:r,warnings:n}}function UE({id:t,model:e,created:r}){return{id:t??void 0,modelId:e??void 0,timestamp:r?new Date(r*1e3):void 0}}function zL(t){switch(t){case"stop":return"stop";case"length":return"length";case"content_filter":return"content-filter";case"function_call":case"tool_calls":return"tool-calls";default:return"unknown"}}var X4=bt(()=>me(H.object({id:H.string().nullish(),created:H.number().nullish(),model:H.string().nullish(),choices:H.array(H.object({message:H.object({role:H.literal("assistant").nullish(),content:H.string().nullish(),tool_calls:H.array(H.object({id:H.string().nullish(),type:H.literal("function"),function:H.object({name:H.string(),arguments:H.string()})})).nullish(),annotations:H.array(H.object({type:H.literal("url_citation"),url_citation:H.object({start_index:H.number(),end_index:H.number(),url:H.string(),title:H.string()})})).nullish()}),index:H.number(),logprobs:H.object({content:H.array(H.object({token:H.string(),logprob:H.number(),top_logprobs:H.array(H.object({token:H.string(),logprob:H.number()}))})).nullish()}).nullish(),finish_reason:H.string().nullish()})),usage:H.object({prompt_tokens:H.number().nullish(),completion_tokens:H.number().nullish(),total_tokens:H.number().nullish(),prompt_tokens_details:H.object({cached_tokens:H.number().nullish()}).nullish(),completion_tokens_details:H.object({reasoning_tokens:H.number().nullish(),accepted_prediction_tokens:H.number().nullish(),rejected_prediction_tokens:H.number().nullish()}).nullish()}).nullish()}))),J4=bt(()=>me(H.union([H.object({id:H.string().nullish(),created:H.number().nullish(),model:H.string().nullish(),choices:H.array(H.object({delta:H.object({role:H.enum(["assistant"]).nullish(),content:H.string().nullish(),tool_calls:H.array(H.object({index:H.number(),id:H.string().nullish(),type:H.literal("function").nullish(),function:H.object({name:H.string().nullish(),arguments:H.string().nullish()})})).nullish(),annotations:H.array(H.object({type:H.literal("url_citation"),url_citation:H.object({start_index:H.number(),end_index:H.number(),url:H.string(),title:H.string()})})).nullish()}).nullish(),logprobs:H.object({content:H.array(H.object({token:H.string(),logprob:H.number(),top_logprobs:H.array(H.object({token:H.string(),logprob:H.number()}))})).nullish()}).nullish(),finish_reason:H.string().nullish(),index:H.number()})),usage:H.object({prompt_tokens:H.number().nullish(),completion_tokens:H.number().nullish(),total_tokens:H.number().nullish(),prompt_tokens_details:H.object({cached_tokens:H.number().nullish()}).nullish(),completion_tokens_details:H.object({reasoning_tokens:H.number().nullish(),accepted_prediction_tokens:H.number().nullish(),rejected_prediction_tokens:H.number().nullish()}).nullish()}).nullish()}),HE]))),Z4=bt(()=>me(Ct.object({logitBias:Ct.record(Ct.coerce.number(),Ct.number()).optional(),logprobs:Ct.union([Ct.boolean(),Ct.number()]).optional(),parallelToolCalls:Ct.boolean().optional(),user:Ct.string().optional(),reasoningEffort:Ct.enum(["none","minimal","low","medium","high","xhigh"]).optional(),maxCompletionTokens:Ct.number().optional(),store:Ct.boolean().optional(),metadata:Ct.record(Ct.string().max(64),Ct.string().max(512)).optional(),prediction:Ct.record(Ct.string(),Ct.any()).optional(),structuredOutputs:Ct.boolean().optional(),serviceTier:Ct.enum(["auto","flex","priority","default"]).optional(),strictJsonSchema:Ct.boolean().optional(),textVerbosity:Ct.enum(["low","medium","high"]).optional(),promptCacheKey:Ct.string().optional(),promptCacheRetention:Ct.enum(["in_memory","24h"]).optional(),safetyIdentifier:Ct.string().optional()})));function e5({tools:t,toolChoice:e,structuredOutputs:r,strictJsonSchema:n}){t=t?.length?t:void 0;let o=[];if(t==null)return{tools:void 0,toolChoice:void 0,toolWarnings:o};let i=[];for(let s of t)switch(s.type){case"function":i.push({type:"function",function:{name:s.name,description:s.description,parameters:s.inputSchema,strict:r?n:void 0}});break;default:o.push({type:"unsupported-tool",tool:s});break}if(e==null)return{tools:i,toolChoice:void 0,toolWarnings:o};let a=e.type;switch(a){case"auto":case"none":case"required":return{tools:i,toolChoice:a,toolWarnings:o};case"tool":return{tools:i,toolChoice:{type:"function",function:{name:e.toolName}},toolWarnings:o};default:{let s=a;throw new Q4({functionality:`tool choice type: ${s}`})}}}var t5=class{constructor(t,e){this.specificationVersion="v2",this.supportedUrls={"image/*":[/^https?:\/\/.*$/]},this.modelId=t,this.config=e}get provider(){return this.config.provider}async getArgs({prompt:t,maxOutputTokens:e,temperature:r,topP:n,topK:o,frequencyPenalty:i,presencePenalty:a,stopSequences:s,responseFormat:c,seed:l,tools:u,toolChoice:d,providerOptions:p}){var m,g,h,f;let S=[],b=(m=await Gr({provider:"openai",providerOptions:p,schema:Z4}))!=null?m:{},y=(g=b.structuredOutputs)!=null?g:!0,T=XL(this.modelId);o!=null&&S.push({type:"unsupported-setting",setting:"topK"}),c?.type==="json"&&c.schema!=null&&!y&&S.push({type:"unsupported-setting",setting:"responseFormat",details:"JSON response format schema is only supported with structuredOutputs"});let{messages:w,warnings:P}=Y4({prompt:t,systemMessageMode:T.systemMessageMode});S.push(...P);let A=(h=b.strictJsonSchema)!=null?h:!1,x={model:this.modelId,logit_bias:b.logitBias,logprobs:b.logprobs===!0||typeof b.logprobs=="number"?!0:void 0,top_logprobs:typeof b.logprobs=="number"?b.logprobs:typeof b.logprobs=="boolean"&&b.logprobs?0:void 0,user:b.user,parallel_tool_calls:b.parallelToolCalls,max_tokens:e,temperature:r,top_p:n,frequency_penalty:i,presence_penalty:a,response_format:c?.type==="json"?y&&c.schema!=null?{type:"json_schema",json_schema:{schema:c.schema,strict:A,name:(f=c.name)!=null?f:"response",description:c.description}}:{type:"json_object"}:void 0,stop:s,seed:l,verbosity:b.textVerbosity,max_completion_tokens:b.maxCompletionTokens,store:b.store,metadata:b.metadata,prediction:b.prediction,reasoning_effort:b.reasoningEffort,service_tier:b.serviceTier,prompt_cache_key:b.promptCacheKey,prompt_cache_retention:b.promptCacheRetention,safety_identifier:b.safetyIdentifier,messages:w};T.isReasoningModel?((b.reasoningEffort!=="none"||!T.supportsNonReasoningParameters)&&(x.temperature!=null&&(x.temperature=void 0,S.push({type:"unsupported-setting",setting:"temperature",details:"temperature is not supported for reasoning models"})),x.top_p!=null&&(x.top_p=void 0,S.push({type:"unsupported-setting",setting:"topP",details:"topP is not supported for reasoning models"})),x.logprobs!=null&&(x.logprobs=void 0,S.push({type:"other",message:"logprobs is not supported for reasoning models"}))),x.frequency_penalty!=null&&(x.frequency_penalty=void 0,S.push({type:"unsupported-setting",setting:"frequencyPenalty",details:"frequencyPenalty is not supported for reasoning models"})),x.presence_penalty!=null&&(x.presence_penalty=void 0,S.push({type:"unsupported-setting",setting:"presencePenalty",details:"presencePenalty is not supported for reasoning models"})),x.logit_bias!=null&&(x.logit_bias=void 0,S.push({type:"other",message:"logitBias is not supported for reasoning models"})),x.top_logprobs!=null&&(x.top_logprobs=void 0,S.push({type:"other",message:"topLogprobs is not supported for reasoning models"})),x.max_tokens!=null&&(x.max_completion_tokens==null&&(x.max_completion_tokens=x.max_tokens),x.max_tokens=void 0)):(this.modelId.startsWith("gpt-4o-search-preview")||this.modelId.startsWith("gpt-4o-mini-search-preview"))&&x.temperature!=null&&(x.temperature=void 0,S.push({type:"unsupported-setting",setting:"temperature",details:"temperature is not supported for the search preview models and has been removed."})),b.serviceTier==="flex"&&!T.supportsFlexProcessing&&(S.push({type:"unsupported-setting",setting:"serviceTier",details:"flex processing is only available for o3, o4-mini, and gpt-5 models"}),x.service_tier=void 0),b.serviceTier==="priority"&&!T.supportsPriorityProcessing&&(S.push({type:"unsupported-setting",setting:"serviceTier",details:"priority processing is only available for supported models (gpt-4, gpt-5, gpt-5-mini, o3, o4-mini) and requires Enterprise access. gpt-5-nano is not supported"}),x.service_tier=void 0);let{tools:O,toolChoice:L,toolWarnings:N}=e5({tools:u,toolChoice:d,structuredOutputs:y,strictJsonSchema:A});return{args:{...x,tools:O,tool_choice:L},warnings:[...S,...N]}}async doGenerate(t){var e,r,n,o,i,a,s,c,l,u,d,p,m,g;let{args:h,warnings:f}=await this.getArgs(t),{responseHeaders:S,value:b,rawValue:y}=await Vr({url:this.config.url({path:"/chat/completions",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),body:h,failedResponseHandler:Io,successfulResponseHandler:Bn(X4),abortSignal:t.abortSignal,fetch:this.config.fetch}),T=b.choices[0],w=[],P=T.message.content;P!=null&&P.length>0&&w.push({type:"text",text:P});for(let L of(e=T.message.tool_calls)!=null?e:[])w.push({type:"tool-call",toolCallId:(r=L.id)!=null?r:dn(),toolName:L.function.name,input:L.function.arguments});for(let L of(n=T.message.annotations)!=null?n:[])w.push({type:"source",sourceType:"url",id:dn(),url:L.url_citation.url,title:L.url_citation.title});let A=(o=b.usage)==null?void 0:o.completion_tokens_details,x=(i=b.usage)==null?void 0:i.prompt_tokens_details,O={openai:{}};return A?.accepted_prediction_tokens!=null&&(O.openai.acceptedPredictionTokens=A?.accepted_prediction_tokens),A?.rejected_prediction_tokens!=null&&(O.openai.rejectedPredictionTokens=A?.rejected_prediction_tokens),((a=T.logprobs)==null?void 0:a.content)!=null&&(O.openai.logprobs=T.logprobs.content),{content:w,finishReason:zL(T.finish_reason),usage:{inputTokens:(c=(s=b.usage)==null?void 0:s.prompt_tokens)!=null?c:void 0,outputTokens:(u=(l=b.usage)==null?void 0:l.completion_tokens)!=null?u:void 0,totalTokens:(p=(d=b.usage)==null?void 0:d.total_tokens)!=null?p:void 0,reasoningTokens:(m=A?.reasoning_tokens)!=null?m:void 0,cachedInputTokens:(g=x?.cached_tokens)!=null?g:void 0},request:{body:h},response:{...UE(b),headers:S,body:y},warnings:f,providerMetadata:O}}async doStream(t){let{args:e,warnings:r}=await this.getArgs(t),n={...e,stream:!0,stream_options:{include_usage:!0}},{responseHeaders:o,value:i}=await Vr({url:this.config.url({path:"/chat/completions",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),body:n,failedResponseHandler:Io,successfulResponseHandler:Jl(J4),abortSignal:t.abortSignal,fetch:this.config.fetch}),a=[],s="unknown",c={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},l=!1,u=!1,d={openai:{}};return{stream:i.pipeThrough(new TransformStream({start(p){p.enqueue({type:"stream-start",warnings:r})},transform(p,m){var g,h,f,S,b,y,T,w,P,A,x,O,L,N,j,W,B,xe,F,z,ae,ue,_e,Se;if(t.includeRawChunks&&m.enqueue({type:"raw",rawValue:p.rawValue}),!p.success){s="error",m.enqueue({type:"error",error:p.error});return}let le=p.value;if("error"in le){s="error",m.enqueue({type:"error",error:le.error});return}if(!l){let Ae=UE(le);Object.values(Ae).some(Boolean)&&(l=!0,m.enqueue({type:"response-metadata",...UE(le)}))}le.usage!=null&&(c.inputTokens=(g=le.usage.prompt_tokens)!=null?g:void 0,c.outputTokens=(h=le.usage.completion_tokens)!=null?h:void 0,c.totalTokens=(f=le.usage.total_tokens)!=null?f:void 0,c.reasoningTokens=(b=(S=le.usage.completion_tokens_details)==null?void 0:S.reasoning_tokens)!=null?b:void 0,c.cachedInputTokens=(T=(y=le.usage.prompt_tokens_details)==null?void 0:y.cached_tokens)!=null?T:void 0,((w=le.usage.completion_tokens_details)==null?void 0:w.accepted_prediction_tokens)!=null&&(d.openai.acceptedPredictionTokens=(P=le.usage.completion_tokens_details)==null?void 0:P.accepted_prediction_tokens),((A=le.usage.completion_tokens_details)==null?void 0:A.rejected_prediction_tokens)!=null&&(d.openai.rejectedPredictionTokens=(x=le.usage.completion_tokens_details)==null?void 0:x.rejected_prediction_tokens));let Q=le.choices[0];if(Q?.finish_reason!=null&&(s=zL(Q.finish_reason)),((O=Q?.logprobs)==null?void 0:O.content)!=null&&(d.openai.logprobs=Q.logprobs.content),Q?.delta==null)return;let Te=Q.delta;if(Te.content!=null&&(u||(m.enqueue({type:"text-start",id:"0"}),u=!0),m.enqueue({type:"text-delta",id:"0",delta:Te.content})),Te.tool_calls!=null)for(let Ae of Te.tool_calls){let I=Ae.index;if(a[I]==null){if(Ae.type!=="function")throw new kE({data:Ae,message:"Expected 'function' type."});if(Ae.id==null)throw new kE({data:Ae,message:"Expected 'id' to be a string."});if(((L=Ae.function)==null?void 0:L.name)==null)throw new kE({data:Ae,message:"Expected 'function.name' to be a string."});m.enqueue({type:"tool-input-start",id:Ae.id,toolName:Ae.function.name}),a[I]={id:Ae.id,type:"function",function:{name:Ae.function.name,arguments:(N=Ae.function.arguments)!=null?N:""},hasFinished:!1};let ge=a[I];((j=ge.function)==null?void 0:j.name)!=null&&((W=ge.function)==null?void 0:W.arguments)!=null&&(ge.function.arguments.length>0&&m.enqueue({type:"tool-input-delta",id:ge.id,delta:ge.function.arguments}),DE(ge.function.arguments)&&(m.enqueue({type:"tool-input-end",id:ge.id}),m.enqueue({type:"tool-call",toolCallId:(B=ge.id)!=null?B:dn(),toolName:ge.function.name,input:ge.function.arguments}),ge.hasFinished=!0));continue}let oe=a[I];oe.hasFinished||(((xe=Ae.function)==null?void 0:xe.arguments)!=null&&(oe.function.arguments+=(z=(F=Ae.function)==null?void 0:F.arguments)!=null?z:""),m.enqueue({type:"tool-input-delta",id:oe.id,delta:(ae=Ae.function.arguments)!=null?ae:""}),((ue=oe.function)==null?void 0:ue.name)!=null&&((_e=oe.function)==null?void 0:_e.arguments)!=null&&DE(oe.function.arguments)&&(m.enqueue({type:"tool-input-end",id:oe.id}),m.enqueue({type:"tool-call",toolCallId:(Se=oe.id)!=null?Se:dn(),toolName:oe.function.name,input:oe.function.arguments}),oe.hasFinished=!0))}if(Te.annotations!=null)for(let Ae of Te.annotations)m.enqueue({type:"source",sourceType:"url",id:dn(),url:Ae.url_citation.url,title:Ae.url_citation.title})},flush(p){u&&p.enqueue({type:"text-end",id:"0"}),p.enqueue({type:"finish",finishReason:s,usage:c,...d!=null?{providerMetadata:d}:{}})}})),request:{body:n},response:{headers:o}}}};function n5({prompt:t,user:e="user",assistant:r="assistant"}){let n="";t[0].role==="system"&&(n+=`${t[0].content}
|
|
80
80
|
|
|
81
81
|
`,t=t.slice(1));for(let{role:o,content:i}of t)switch(o){case"system":throw new r5({message:"Unexpected system message in prompt: ${content}",prompt:t});case"user":{let a=i.map(s=>{switch(s.type){case"text":return s.text}}).filter(Boolean).join("");n+=`${e}:
|
|
82
82
|
${a}
|
|
@@ -86,8 +86,8 @@ ${a}
|
|
|
86
86
|
|
|
87
87
|
`;break}case"tool":throw new HL({functionality:"tool messages"});default:{let a=o;throw new Error(`Unsupported role: ${a}`)}}return n+=`${r}:
|
|
88
88
|
`,{prompt:n,stopSequences:[`
|
|
89
|
-
${e}:`]}}function jL({id:t,model:e,created:r}){return{id:t??void 0,modelId:e??void 0,timestamp:r!=null?new Date(r*1e3):void 0}}function GL(t){switch(t){case"stop":return"stop";case"length":return"length";case"content_filter":return"content-filter";case"function_call":case"tool_calls":return"tool-calls";default:return"unknown"}}var o5=bt(()=>me(Ee.object({id:Ee.string().nullish(),created:Ee.number().nullish(),model:Ee.string().nullish(),choices:Ee.array(Ee.object({text:Ee.string(),finish_reason:Ee.string(),logprobs:Ee.object({tokens:Ee.array(Ee.string()),token_logprobs:Ee.array(Ee.number()),top_logprobs:Ee.array(Ee.record(Ee.string(),Ee.number())).nullish()}).nullish()})),usage:Ee.object({prompt_tokens:Ee.number(),completion_tokens:Ee.number(),total_tokens:Ee.number()}).nullish()}))),i5=bt(()=>me(Ee.union([Ee.object({id:Ee.string().nullish(),created:Ee.number().nullish(),model:Ee.string().nullish(),choices:Ee.array(Ee.object({text:Ee.string(),finish_reason:Ee.string().nullish(),index:Ee.number(),logprobs:Ee.object({tokens:Ee.array(Ee.string()),token_logprobs:Ee.array(Ee.number()),top_logprobs:Ee.array(Ee.record(Ee.string(),Ee.number())).nullish()}).nullish()})),usage:Ee.object({prompt_tokens:Ee.number(),completion_tokens:Ee.number(),total_tokens:Ee.number()}).nullish()}),HE]))),VL=bt(()=>me(_o.object({echo:_o.boolean().optional(),logitBias:_o.record(_o.string(),_o.number()).optional(),suffix:_o.string().optional(),user:_o.string().optional(),logprobs:_o.union([_o.boolean(),_o.number()]).optional()}))),a5=class{constructor(t,e){this.specificationVersion="v2",this.supportedUrls={},this.modelId=t,this.config=e}get providerOptionsName(){return this.config.provider.split(".")[0].trim()}get provider(){return this.config.provider}async getArgs({prompt:t,maxOutputTokens:e,temperature:r,topP:n,topK:o,frequencyPenalty:i,presencePenalty:a,stopSequences:s,responseFormat:c,tools:l,toolChoice:u,seed:d,providerOptions:p}){let m=[],g={...await Gr({provider:"openai",providerOptions:p,schema:VL}),...await Gr({provider:this.providerOptionsName,providerOptions:p,schema:VL})};o!=null&&m.push({type:"unsupported-setting",setting:"topK"}),l?.length&&m.push({type:"unsupported-setting",setting:"tools"}),u!=null&&m.push({type:"unsupported-setting",setting:"toolChoice"}),c!=null&&c.type!=="text"&&m.push({type:"unsupported-setting",setting:"responseFormat",details:"JSON response format is not supported."});let{prompt:h,stopSequences:f}=n5({prompt:t}),S=[...f??[],...s??[]];return{args:{model:this.modelId,echo:g.echo,logit_bias:g.logitBias,logprobs:g?.logprobs===!0?0:g?.logprobs===!1?void 0:g?.logprobs,suffix:g.suffix,user:g.user,max_tokens:e,temperature:r,top_p:n,frequency_penalty:i,presence_penalty:a,seed:d,prompt:h,stop:S.length>0?S:void 0},warnings:m}}async doGenerate(t){var e,r,n;let{args:o,warnings:i}=await this.getArgs(t),{responseHeaders:a,value:s,rawValue:c}=await Vr({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),body:o,failedResponseHandler:Io,successfulResponseHandler:Bn(o5),abortSignal:t.abortSignal,fetch:this.config.fetch}),l=s.choices[0],u={openai:{}};return l.logprobs!=null&&(u.openai.logprobs=l.logprobs),{content:[{type:"text",text:l.text}],usage:{inputTokens:(e=s.usage)==null?void 0:e.prompt_tokens,outputTokens:(r=s.usage)==null?void 0:r.completion_tokens,totalTokens:(n=s.usage)==null?void 0:n.total_tokens},finishReason:GL(l.finish_reason),request:{body:o},response:{...jL(s),headers:a,body:c},providerMetadata:u,warnings:i}}async doStream(t){let{args:e,warnings:r}=await this.getArgs(t),n={...e,stream:!0,stream_options:{include_usage:!0}},{responseHeaders:o,value:i}=await Vr({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),body:n,failedResponseHandler:Io,successfulResponseHandler:Jl(i5),abortSignal:t.abortSignal,fetch:this.config.fetch}),a="unknown",s={openai:{}},c={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},l=!0;return{stream:i.pipeThrough(new TransformStream({start(u){u.enqueue({type:"stream-start",warnings:r})},transform(u,d){if(t.includeRawChunks&&d.enqueue({type:"raw",rawValue:u.rawValue}),!u.success){a="error",d.enqueue({type:"error",error:u.error});return}let p=u.value;if("error"in p){a="error",d.enqueue({type:"error",error:p.error});return}l&&(l=!1,d.enqueue({type:"response-metadata",...jL(p)}),d.enqueue({type:"text-start",id:"0"})),p.usage!=null&&(c.inputTokens=p.usage.prompt_tokens,c.outputTokens=p.usage.completion_tokens,c.totalTokens=p.usage.total_tokens);let m=p.choices[0];m?.finish_reason!=null&&(a=GL(m.finish_reason)),m?.logprobs!=null&&(s.openai.logprobs=m.logprobs),m?.text!=null&&m.text.length>0&&d.enqueue({type:"text-delta",id:"0",delta:m.text})},flush(u){l||u.enqueue({type:"text-end",id:"0"}),u.enqueue({type:"finish",finishReason:a,providerMetadata:s,usage:c})}})),request:{body:n},response:{headers:o}}}},l5=bt(()=>me(FE.object({dimensions:FE.number().optional(),user:FE.string().optional()}))),c5=bt(()=>me(ds.object({data:ds.array(ds.object({embedding:ds.array(ds.number())})),usage:ds.object({prompt_tokens:ds.number()}).nullish()}))),u5=class{constructor(t,e){this.specificationVersion="v2",this.maxEmbeddingsPerCall=2048,this.supportsParallelCalls=!0,this.modelId=t,this.config=e}get provider(){return this.config.provider}async doEmbed({values:t,headers:e,abortSignal:r,providerOptions:n}){var o;if(t.length>this.maxEmbeddingsPerCall)throw new s5({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:t});let i=(o=await Gr({provider:"openai",providerOptions:n,schema:l5}))!=null?o:{},{responseHeaders:a,value:s,rawValue:c}=await Vr({url:this.config.url({path:"/embeddings",modelId:this.modelId}),headers:Sr(this.config.headers(),e),body:{model:this.modelId,input:t,encoding_format:"float",dimensions:i.dimensions,user:i.user},failedResponseHandler:Io,successfulResponseHandler:Bn(c5),abortSignal:r,fetch:this.config.fetch});return{embeddings:s.data.map(l=>l.embedding),usage:s.usage?{tokens:s.usage.prompt_tokens}:void 0,response:{headers:a,body:c}}}},d5=bt(()=>me(yr.object({created:yr.number().nullish(),data:yr.array(yr.object({b64_json:yr.string(),revised_prompt:yr.string().nullish()})),background:yr.string().nullish(),output_format:yr.string().nullish(),size:yr.string().nullish(),quality:yr.string().nullish(),usage:yr.object({input_tokens:yr.number().nullish(),output_tokens:yr.number().nullish(),total_tokens:yr.number().nullish(),input_tokens_details:yr.object({image_tokens:yr.number().nullish(),text_tokens:yr.number().nullish()}).nullish()}).nullish()}))),p5={"dall-e-3":1,"dall-e-2":10,"gpt-image-1":10,"gpt-image-1-mini":10,"gpt-image-1.5":10},m5=new Set(["gpt-image-1","gpt-image-1-mini","gpt-image-1.5"]),g5=class{constructor(t,e){this.modelId=t,this.config=e,this.specificationVersion="v2"}get maxImagesPerCall(){var t;return(t=p5[this.modelId])!=null?t:1}get provider(){return this.config.provider}async doGenerate({prompt:t,n:e,size:r,aspectRatio:n,seed:o,providerOptions:i,headers:a,abortSignal:s}){var c,l,u,d;let p=[];n!=null&&p.push({type:"unsupported-setting",setting:"aspectRatio",details:"This model does not support aspect ratio. Use `size` instead."}),o!=null&&p.push({type:"unsupported-setting",setting:"seed"});let m=(u=(l=(c=this.config._internal)==null?void 0:c.currentDate)==null?void 0:l.call(c))!=null?u:new Date,{value:g,responseHeaders:h}=await Vr({url:this.config.url({path:"/images/generations",modelId:this.modelId}),headers:Sr(this.config.headers(),a),body:{model:this.modelId,prompt:t,n:e,size:r,...(d=i.openai)!=null?d:{},...m5.has(this.modelId)?{}:{response_format:"b64_json"}},failedResponseHandler:Io,successfulResponseHandler:Bn(d5),abortSignal:s,fetch:this.config.fetch});return{images:g.data.map(f=>f.b64_json),warnings:p,response:{timestamp:m,modelId:this.modelId,headers:h},providerMetadata:{openai:{images:g.data.map(f=>({...f.revised_prompt?{revisedPrompt:f.revised_prompt}:{},...g.created!=null?{created:g.created}:{},...g.size!=null?{size:g.size}:{},...g.quality!=null?{quality:g.quality}:{},...g.background!=null?{background:g.background}:{},...g.output_format!=null?{outputFormat:g.output_format}:{}}))}}}}},h5=Ft(()=>me(ar.object({code:ar.string().nullish(),containerId:ar.string()}))),f5=Ft(()=>me(ar.object({outputs:ar.array(ar.discriminatedUnion("type",[ar.object({type:ar.literal("logs"),logs:ar.string()}),ar.object({type:ar.literal("image"),url:ar.string()})])).nullish()}))),S5=Ft(()=>me(ar.object({container:ar.union([ar.string(),ar.object({fileIds:ar.array(ar.string()).optional()})]).optional()}))),y5=Fn({id:"openai.code_interpreter",name:"code_interpreter",inputSchema:h5,outputSchema:f5}),b5=(t={})=>y5(t),JL=qe.object({key:qe.string(),type:qe.enum(["eq","ne","gt","gte","lt","lte","in","nin"]),value:qe.union([qe.string(),qe.number(),qe.boolean(),qe.array(qe.string())])}),ZL=qe.object({type:qe.enum(["and","or"]),filters:qe.array(qe.union([JL,qe.lazy(()=>ZL)]))}),E5=Ft(()=>me(qe.object({vectorStoreIds:qe.array(qe.string()),maxNumResults:qe.number().optional(),ranking:qe.object({ranker:qe.string().optional(),scoreThreshold:qe.number().optional()}).optional(),filters:qe.union([JL,ZL]).optional()}))),T5=Ft(()=>me(qe.object({queries:qe.array(qe.string()),results:qe.array(qe.object({attributes:qe.record(qe.string(),qe.unknown()),fileId:qe.string(),filename:qe.string(),score:qe.number(),text:qe.string()})).nullable()}))),v5=Fn({id:"openai.file_search",name:"file_search",inputSchema:qe.object({}),outputSchema:T5}),A5=Ft(()=>me(Pr.object({background:Pr.enum(["auto","opaque","transparent"]).optional(),inputFidelity:Pr.enum(["low","high"]).optional(),inputImageMask:Pr.object({fileId:Pr.string().optional(),imageUrl:Pr.string().optional()}).optional(),model:Pr.string().optional(),moderation:Pr.enum(["auto"]).optional(),outputCompression:Pr.number().int().min(0).max(100).optional(),outputFormat:Pr.enum(["png","jpeg","webp"]).optional(),partialImages:Pr.number().int().min(0).max(3).optional(),quality:Pr.enum(["auto","low","medium","high"]).optional(),size:Pr.enum(["1024x1024","1024x1536","1536x1024","auto"]).optional()}).strict())),R5=Ft(()=>me(Pr.object({}))),C5=Ft(()=>me(Pr.object({result:Pr.string()}))),w5=Fn({id:"openai.image_generation",name:"image_generation",inputSchema:R5,outputSchema:C5}),x5=(t={})=>w5(t),QL=Ft(()=>me(pn.object({action:pn.object({type:pn.literal("exec"),command:pn.array(pn.string()),timeoutMs:pn.number().optional(),user:pn.string().optional(),workingDirectory:pn.string().optional(),env:pn.record(pn.string(),pn.string()).optional()})}))),eN=Ft(()=>me(pn.object({output:pn.string()}))),_5=Fn({id:"openai.local_shell",name:"local_shell",inputSchema:QL,outputSchema:eN}),I5=Ft(()=>me(tt.object({externalWebAccess:tt.boolean().optional(),filters:tt.object({allowedDomains:tt.array(tt.string()).optional()}).optional(),searchContextSize:tt.enum(["low","medium","high"]).optional(),userLocation:tt.object({type:tt.literal("approximate"),country:tt.string().optional(),city:tt.string().optional(),region:tt.string().optional(),timezone:tt.string().optional()}).optional()}))),P5=Ft(()=>me(tt.object({}))),M5=Ft(()=>me(tt.object({action:tt.discriminatedUnion("type",[tt.object({type:tt.literal("search"),query:tt.string().optional()}),tt.object({type:tt.literal("openPage"),url:tt.string().nullish()}),tt.object({type:tt.literal("findInPage"),url:tt.string().nullish(),pattern:tt.string().nullish()})]),sources:tt.array(tt.discriminatedUnion("type",[tt.object({type:tt.literal("url"),url:tt.string()}),tt.object({type:tt.literal("api"),name:tt.string()})])).optional()}))),O5=Fn({id:"openai.web_search",name:"web_search",inputSchema:P5,outputSchema:M5}),L5=(t={})=>O5(t),N5=Ft(()=>me($t.object({searchContextSize:$t.enum(["low","medium","high"]).optional(),userLocation:$t.object({type:$t.literal("approximate"),country:$t.string().optional(),city:$t.string().optional(),region:$t.string().optional(),timezone:$t.string().optional()}).optional()}))),D5=Ft(()=>me($t.object({}))),k5=Ft(()=>me($t.object({action:$t.discriminatedUnion("type",[$t.object({type:$t.literal("search"),query:$t.string().optional()}),$t.object({type:$t.literal("openPage"),url:$t.string().nullish()}),$t.object({type:$t.literal("findInPage"),url:$t.string().nullish(),pattern:$t.string().nullish()})])}))),U5=Fn({id:"openai.web_search_preview",name:"web_search_preview",inputSchema:D5,outputSchema:k5}),F5={codeInterpreter:b5,fileSearch:v5,imageGeneration:x5,localShell:_5,webSearchPreview:U5,webSearch:L5};function $L(t,e){return e?e.some(r=>t.startsWith(r)):!1}async function H5({prompt:t,systemMessageMode:e,fileIdPrefixes:r,store:n,hasLocalShellTool:o=!1}){var i,a,s,c;let l=[],u=[];for(let{role:d,content:p}of t)switch(d){case"system":{switch(e){case"system":{l.push({role:"system",content:p});break}case"developer":{l.push({role:"developer",content:p});break}case"remove":{u.push({type:"other",message:"system messages are removed for this model"});break}default:{let m=e;throw new Error(`Unsupported system message mode: ${m}`)}}break}case"user":{l.push({role:"user",content:p.map((m,g)=>{var h,f,S;switch(m.type){case"text":return{type:"input_text",text:m.text};case"file":if(m.mediaType.startsWith("image/")){let b=m.mediaType==="image/*"?"image/jpeg":m.mediaType;return{type:"input_image",...m.data instanceof URL?{image_url:m.data.toString()}:typeof m.data=="string"&&$L(m.data,r)?{file_id:m.data}:{image_url:`data:${b};base64,${Zi(m.data)}`},detail:(f=(h=m.providerOptions)==null?void 0:h.openai)==null?void 0:f.imageDetail}}else{if(m.mediaType==="application/pdf")return m.data instanceof URL?{type:"input_file",file_url:m.data.toString()}:{type:"input_file",...typeof m.data=="string"&&$L(m.data,r)?{file_id:m.data}:{filename:(S=m.filename)!=null?S:`part-${g}.pdf`,file_data:`data:application/pdf;base64,${Zi(m.data)}`}};throw new z5({functionality:`file part media type ${m.mediaType}`})}}})});break}case"assistant":{let m={},g={};for(let h of p)switch(h.type){case"text":{let f=(a=(i=h.providerOptions)==null?void 0:i.openai)==null?void 0:a.itemId;if(n&&f!=null){l.push({type:"item_reference",id:f});break}l.push({role:"assistant",content:[{type:"output_text",text:h.text}],id:f});break}case"tool-call":{if(g[h.toolCallId]=h,h.providerExecuted)break;let f=(c=(s=h.providerOptions)==null?void 0:s.openai)==null?void 0:c.itemId;if(n&&f!=null){l.push({type:"item_reference",id:f});break}if(o&&h.toolName==="local_shell"){let S=await xo({value:h.input,schema:QL});l.push({type:"local_shell_call",call_id:h.toolCallId,id:f,action:{type:"exec",command:S.action.command,timeout_ms:S.action.timeoutMs,user:S.action.user,working_directory:S.action.workingDirectory,env:S.action.env}});break}l.push({type:"function_call",call_id:h.toolCallId,name:h.toolName,arguments:JSON.stringify(h.input),id:f});break}case"tool-result":{n?l.push({type:"item_reference",id:h.toolCallId}):u.push({type:"other",message:`Results for OpenAI tool ${h.toolName} are not sent to the API when store is false`});break}case"reasoning":{let f=await Gr({provider:"openai",providerOptions:h.providerOptions,schema:j5}),S=f?.itemId;if(S!=null){let b=m[S];if(n)b===void 0&&(l.push({type:"item_reference",id:S}),m[S]={type:"reasoning",id:S,summary:[]});else{let y=[];h.text.length>0?y.push({type:"summary_text",text:h.text}):b!==void 0&&u.push({type:"other",message:`Cannot append empty reasoning part to existing reasoning sequence. Skipping reasoning part: ${JSON.stringify(h)}.`}),b===void 0?(m[S]={type:"reasoning",id:S,encrypted_content:f?.reasoningEncryptedContent,summary:y},l.push(m[S])):(b.summary.push(...y),f?.reasoningEncryptedContent!=null&&(b.encrypted_content=f.reasoningEncryptedContent))}}else u.push({type:"other",message:`Non-OpenAI reasoning parts are not supported. Skipping reasoning part: ${JSON.stringify(h)}.`});break}}break}case"tool":{for(let m of p){let g=m.output;if(o&&m.toolName==="local_shell"&&g.type==="json"){let f=await xo({value:g.value,schema:eN});l.push({type:"local_shell_call_output",call_id:m.toolCallId,output:f.output});break}let h;switch(g.type){case"text":case"error-text":h=g.value;break;case"json":case"error-json":h=JSON.stringify(g.value);break;case"content":h=g.value.map(f=>{switch(f.type){case"text":return{type:"input_text",text:f.text};case"media":return f.mediaType.startsWith("image/")?{type:"input_image",image_url:`data:${f.mediaType};base64,${f.data}`}:{type:"input_file",filename:"data",file_data:`data:${f.mediaType};base64,${f.data}`}}});break}l.push({type:"function_call_output",call_id:m.toolCallId,output:h})}break}default:{let m=d;throw new Error(`Unsupported role: ${m}`)}}return{input:l,warnings:u}}var j5=BE.object({itemId:BE.string().nullish(),reasoningEncryptedContent:BE.string().nullish()});function WL({finishReason:t,hasFunctionCall:e}){switch(t){case void 0:case null:return e?"tool-calls":"stop";case"max_output_tokens":return"length";case"content_filter":return"content-filter";default:return e?"tool-calls":"unknown"}}var G5=bt(()=>me(E.union([E.object({type:E.literal("response.output_text.delta"),item_id:E.string(),delta:E.string(),logprobs:E.array(E.object({token:E.string(),logprob:E.number(),top_logprobs:E.array(E.object({token:E.string(),logprob:E.number()}))})).nullish()}),E.object({type:E.enum(["response.completed","response.incomplete"]),response:E.object({incomplete_details:E.object({reason:E.string()}).nullish(),usage:E.object({input_tokens:E.number(),input_tokens_details:E.object({cached_tokens:E.number().nullish()}).nullish(),output_tokens:E.number(),output_tokens_details:E.object({reasoning_tokens:E.number().nullish()}).nullish()}),service_tier:E.string().nullish()})}),E.object({type:E.literal("response.created"),response:E.object({id:E.string(),created_at:E.number(),model:E.string(),service_tier:E.string().nullish()})}),E.object({type:E.literal("response.output_item.added"),output_index:E.number(),item:E.discriminatedUnion("type",[E.object({type:E.literal("message"),id:E.string()}),E.object({type:E.literal("reasoning"),id:E.string(),encrypted_content:E.string().nullish()}),E.object({type:E.literal("function_call"),id:E.string(),call_id:E.string(),name:E.string(),arguments:E.string()}),E.object({type:E.literal("web_search_call"),id:E.string(),status:E.string()}),E.object({type:E.literal("computer_call"),id:E.string(),status:E.string()}),E.object({type:E.literal("file_search_call"),id:E.string()}),E.object({type:E.literal("image_generation_call"),id:E.string()}),E.object({type:E.literal("code_interpreter_call"),id:E.string(),container_id:E.string(),code:E.string().nullable(),outputs:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("logs"),logs:E.string()}),E.object({type:E.literal("image"),url:E.string()})])).nullable(),status:E.string()})])}),E.object({type:E.literal("response.output_item.done"),output_index:E.number(),item:E.discriminatedUnion("type",[E.object({type:E.literal("message"),id:E.string()}),E.object({type:E.literal("reasoning"),id:E.string(),encrypted_content:E.string().nullish()}),E.object({type:E.literal("function_call"),id:E.string(),call_id:E.string(),name:E.string(),arguments:E.string(),status:E.literal("completed")}),E.object({type:E.literal("code_interpreter_call"),id:E.string(),code:E.string().nullable(),container_id:E.string(),outputs:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("logs"),logs:E.string()}),E.object({type:E.literal("image"),url:E.string()})])).nullable()}),E.object({type:E.literal("image_generation_call"),id:E.string(),result:E.string()}),E.object({type:E.literal("web_search_call"),id:E.string(),status:E.string(),action:E.discriminatedUnion("type",[E.object({type:E.literal("search"),query:E.string().nullish(),sources:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("url"),url:E.string()}),E.object({type:E.literal("api"),name:E.string()})])).nullish()}),E.object({type:E.literal("open_page"),url:E.string().nullish()}),E.object({type:E.literal("find_in_page"),url:E.string().nullish(),pattern:E.string().nullish()})])}),E.object({type:E.literal("file_search_call"),id:E.string(),queries:E.array(E.string()),results:E.array(E.object({attributes:E.record(E.string(),E.unknown()),file_id:E.string(),filename:E.string(),score:E.number(),text:E.string()})).nullish()}),E.object({type:E.literal("local_shell_call"),id:E.string(),call_id:E.string(),action:E.object({type:E.literal("exec"),command:E.array(E.string()),timeout_ms:E.number().optional(),user:E.string().optional(),working_directory:E.string().optional(),env:E.record(E.string(),E.string()).optional()})}),E.object({type:E.literal("computer_call"),id:E.string(),status:E.literal("completed")})])}),E.object({type:E.literal("response.function_call_arguments.delta"),item_id:E.string(),output_index:E.number(),delta:E.string()}),E.object({type:E.literal("response.image_generation_call.partial_image"),item_id:E.string(),output_index:E.number(),partial_image_b64:E.string()}),E.object({type:E.literal("response.code_interpreter_call_code.delta"),item_id:E.string(),output_index:E.number(),delta:E.string()}),E.object({type:E.literal("response.code_interpreter_call_code.done"),item_id:E.string(),output_index:E.number(),code:E.string()}),E.object({type:E.literal("response.output_text.annotation.added"),annotation:E.discriminatedUnion("type",[E.object({type:E.literal("url_citation"),start_index:E.number(),end_index:E.number(),url:E.string(),title:E.string()}),E.object({type:E.literal("file_citation"),file_id:E.string(),filename:E.string().nullish(),index:E.number().nullish(),start_index:E.number().nullish(),end_index:E.number().nullish(),quote:E.string().nullish()})])}),E.object({type:E.literal("response.reasoning_summary_part.added"),item_id:E.string(),summary_index:E.number()}),E.object({type:E.literal("response.reasoning_summary_text.delta"),item_id:E.string(),summary_index:E.number(),delta:E.string()}),E.object({type:E.literal("response.reasoning_summary_part.done"),item_id:E.string(),summary_index:E.number()}),E.object({type:E.literal("error"),sequence_number:E.number(),error:E.object({type:E.string(),code:E.string(),message:E.string(),param:E.string().nullish()})}),E.object({type:E.string()}).loose().transform(t=>({type:"unknown_chunk",message:t.type}))]))),V5=bt(()=>me(E.object({id:E.string().optional(),created_at:E.number().optional(),error:E.object({message:E.string(),type:E.string(),param:E.string().nullish(),code:E.string()}).nullish(),model:E.string().optional(),output:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("message"),role:E.literal("assistant"),id:E.string(),content:E.array(E.object({type:E.literal("output_text"),text:E.string(),logprobs:E.array(E.object({token:E.string(),logprob:E.number(),top_logprobs:E.array(E.object({token:E.string(),logprob:E.number()}))})).nullish(),annotations:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("url_citation"),start_index:E.number(),end_index:E.number(),url:E.string(),title:E.string()}),E.object({type:E.literal("file_citation"),file_id:E.string(),filename:E.string().nullish(),index:E.number().nullish(),start_index:E.number().nullish(),end_index:E.number().nullish(),quote:E.string().nullish()}),E.object({type:E.literal("container_file_citation"),container_id:E.string(),file_id:E.string(),filename:E.string().nullish(),start_index:E.number().nullish(),end_index:E.number().nullish(),index:E.number().nullish()}),E.object({type:E.literal("file_path"),file_id:E.string(),index:E.number().nullish()})]))}))}),E.object({type:E.literal("web_search_call"),id:E.string(),status:E.string(),action:E.discriminatedUnion("type",[E.object({type:E.literal("search"),query:E.string().nullish(),sources:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("url"),url:E.string()}),E.object({type:E.literal("api"),name:E.string()})])).nullish()}),E.object({type:E.literal("open_page"),url:E.string().nullish()}),E.object({type:E.literal("find_in_page"),url:E.string().nullish(),pattern:E.string().nullish()})])}),E.object({type:E.literal("file_search_call"),id:E.string(),queries:E.array(E.string()),results:E.array(E.object({attributes:E.record(E.string(),E.union([E.string(),E.number(),E.boolean()])),file_id:E.string(),filename:E.string(),score:E.number(),text:E.string()})).nullish()}),E.object({type:E.literal("code_interpreter_call"),id:E.string(),code:E.string().nullable(),container_id:E.string(),outputs:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("logs"),logs:E.string()}),E.object({type:E.literal("image"),url:E.string()})])).nullable()}),E.object({type:E.literal("image_generation_call"),id:E.string(),result:E.string()}),E.object({type:E.literal("local_shell_call"),id:E.string(),call_id:E.string(),action:E.object({type:E.literal("exec"),command:E.array(E.string()),timeout_ms:E.number().optional(),user:E.string().optional(),working_directory:E.string().optional(),env:E.record(E.string(),E.string()).optional()})}),E.object({type:E.literal("function_call"),call_id:E.string(),name:E.string(),arguments:E.string(),id:E.string()}),E.object({type:E.literal("computer_call"),id:E.string(),status:E.string().optional()}),E.object({type:E.literal("reasoning"),id:E.string(),encrypted_content:E.string().nullish(),summary:E.array(E.object({type:E.literal("summary_text"),text:E.string()}))})])).optional(),service_tier:E.string().nullish(),incomplete_details:E.object({reason:E.string()}).nullish(),usage:E.object({input_tokens:E.number(),input_tokens_details:E.object({cached_tokens:E.number().nullish()}).nullish(),output_tokens:E.number(),output_tokens_details:E.object({reasoning_tokens:E.number().nullish()}).nullish()}).optional()}))),tN=20,$5=["o1","o1-2024-12-17","o3","o3-2025-04-16","o3-deep-research","o3-deep-research-2025-06-26","o3-mini","o3-mini-2025-01-31","o4-mini","o4-mini-2025-04-16","o4-mini-deep-research","o4-mini-deep-research-2025-06-26","codex-mini-latest","computer-use-preview","gpt-5","gpt-5-2025-08-07","gpt-5-codex","gpt-5-mini","gpt-5-mini-2025-08-07","gpt-5-nano","gpt-5-nano-2025-08-07","gpt-5-pro","gpt-5-pro-2025-10-06","gpt-5.1","gpt-5.1-chat-latest","gpt-5.1-codex-mini","gpt-5.1-codex","gpt-5.1-codex-max","gpt-5.2","gpt-5.2-chat-latest","gpt-5.2-pro"],Rje=["gpt-4.1","gpt-4.1-2025-04-14","gpt-4.1-mini","gpt-4.1-mini-2025-04-14","gpt-4.1-nano","gpt-4.1-nano-2025-04-14","gpt-4o","gpt-4o-2024-05-13","gpt-4o-2024-08-06","gpt-4o-2024-11-20","gpt-4o-audio-preview","gpt-4o-audio-preview-2024-10-01","gpt-4o-audio-preview-2024-12-17","gpt-4o-search-preview","gpt-4o-search-preview-2025-03-11","gpt-4o-mini-search-preview","gpt-4o-mini-search-preview-2025-03-11","gpt-4o-mini","gpt-4o-mini-2024-07-18","gpt-4-turbo","gpt-4-turbo-2024-04-09","gpt-4-turbo-preview","gpt-4-0125-preview","gpt-4-1106-preview","gpt-4","gpt-4-0613","gpt-4.5-preview","gpt-4.5-preview-2025-02-27","gpt-3.5-turbo-0125","gpt-3.5-turbo","gpt-3.5-turbo-1106","chatgpt-4o-latest","gpt-5-chat-latest",...$5],W5=bt(()=>me(Dt.object({conversation:Dt.string().nullish(),include:Dt.array(Dt.enum(["reasoning.encrypted_content","file_search_call.results","message.output_text.logprobs"])).nullish(),instructions:Dt.string().nullish(),logprobs:Dt.union([Dt.boolean(),Dt.number().min(1).max(tN)]).optional(),maxToolCalls:Dt.number().nullish(),metadata:Dt.any().nullish(),parallelToolCalls:Dt.boolean().nullish(),previousResponseId:Dt.string().nullish(),promptCacheKey:Dt.string().nullish(),promptCacheRetention:Dt.enum(["in_memory","24h"]).nullish(),reasoningEffort:Dt.string().nullish(),reasoningSummary:Dt.string().nullish(),safetyIdentifier:Dt.string().nullish(),serviceTier:Dt.enum(["auto","flex","priority","default"]).nullish(),store:Dt.boolean().nullish(),strictJsonSchema:Dt.boolean().nullish(),textVerbosity:Dt.enum(["low","medium","high"]).nullish(),truncation:Dt.enum(["auto","disabled"]).nullish(),user:Dt.string().nullish()})));async function K5({tools:t,toolChoice:e,strictJsonSchema:r}){t=t?.length?t:void 0;let n=[];if(t==null)return{tools:void 0,toolChoice:void 0,toolWarnings:n};let o=[];for(let a of t)switch(a.type){case"function":o.push({type:"function",name:a.name,description:a.description,parameters:a.inputSchema,strict:r});break;case"provider-defined":{switch(a.id){case"openai.file_search":{let s=await xo({value:a.args,schema:E5});o.push({type:"file_search",vector_store_ids:s.vectorStoreIds,max_num_results:s.maxNumResults,ranking_options:s.ranking?{ranker:s.ranking.ranker,score_threshold:s.ranking.scoreThreshold}:void 0,filters:s.filters});break}case"openai.local_shell":{o.push({type:"local_shell"});break}case"openai.web_search_preview":{let s=await xo({value:a.args,schema:N5});o.push({type:"web_search_preview",search_context_size:s.searchContextSize,user_location:s.userLocation});break}case"openai.web_search":{let s=await xo({value:a.args,schema:I5});o.push({type:"web_search",filters:s.filters!=null?{allowed_domains:s.filters.allowedDomains}:void 0,external_web_access:s.externalWebAccess,search_context_size:s.searchContextSize,user_location:s.userLocation});break}case"openai.code_interpreter":{let s=await xo({value:a.args,schema:S5});o.push({type:"code_interpreter",container:s.container==null?{type:"auto",file_ids:void 0}:typeof s.container=="string"?s.container:{type:"auto",file_ids:s.container.fileIds}});break}case"openai.image_generation":{let s=await xo({value:a.args,schema:A5});o.push({type:"image_generation",background:s.background,input_fidelity:s.inputFidelity,input_image_mask:s.inputImageMask?{file_id:s.inputImageMask.fileId,image_url:s.inputImageMask.imageUrl}:void 0,model:s.model,size:s.size,quality:s.quality,moderation:s.moderation,output_format:s.outputFormat,output_compression:s.outputCompression});break}}break}default:n.push({type:"unsupported-tool",tool:a});break}if(e==null)return{tools:o,toolChoice:void 0,toolWarnings:n};let i=e.type;switch(i){case"auto":case"none":case"required":return{tools:o,toolChoice:i,toolWarnings:n};case"tool":return{tools:o,toolChoice:e.toolName==="code_interpreter"||e.toolName==="file_search"||e.toolName==="image_generation"||e.toolName==="web_search_preview"||e.toolName==="web_search"?{type:e.toolName}:{type:"function",name:e.toolName},toolWarnings:n};default:{let a=i;throw new q5({functionality:`tool choice type: ${a}`})}}}var Y5=class{constructor(t,e){this.specificationVersion="v2",this.supportedUrls={"image/*":[/^https?:\/\/.*$/],"application/pdf":[/^https?:\/\/.*$/]},this.modelId=t,this.config=e}get provider(){return this.config.provider}async getArgs({maxOutputTokens:t,temperature:e,stopSequences:r,topP:n,topK:o,presencePenalty:i,frequencyPenalty:a,seed:s,prompt:c,providerOptions:l,tools:u,toolChoice:d,responseFormat:p}){var m,g,h,f;let S=[],b=XL(this.modelId);o!=null&&S.push({type:"unsupported-setting",setting:"topK"}),s!=null&&S.push({type:"unsupported-setting",setting:"seed"}),i!=null&&S.push({type:"unsupported-setting",setting:"presencePenalty"}),a!=null&&S.push({type:"unsupported-setting",setting:"frequencyPenalty"}),r!=null&&S.push({type:"unsupported-setting",setting:"stopSequences"});let y=await Gr({provider:"openai",providerOptions:l,schema:W5});y?.conversation&&y?.previousResponseId&&S.push({type:"unsupported-setting",setting:"conversation",details:"conversation and previousResponseId cannot be used together"});let{input:T,warnings:w}=await H5({prompt:c,systemMessageMode:b.systemMessageMode,fileIdPrefixes:this.config.fileIdPrefixes,store:(m=y?.store)!=null?m:!0,hasLocalShellTool:O("openai.local_shell")});S.push(...w);let P=(g=y?.strictJsonSchema)!=null?g:!1,A=y?.include;function x(z){A==null?A=[z]:A.includes(z)||(A=[...A,z])}function O(z){return u?.find(ae=>ae.type==="provider-defined"&&ae.id===z)!=null}let L=typeof y?.logprobs=="number"?y?.logprobs:y?.logprobs===!0?tN:void 0;L&&x("message.output_text.logprobs");let N=(h=u?.find(z=>z.type==="provider-defined"&&(z.id==="openai.web_search"||z.id==="openai.web_search_preview")))==null?void 0:h.name;N&&x("web_search_call.action.sources"),O("openai.code_interpreter")&&x("code_interpreter_call.outputs");let j=y?.store;j===!1&&b.isReasoningModel&&x("reasoning.encrypted_content");let W={model:this.modelId,input:T,temperature:e,top_p:n,max_output_tokens:t,...(p?.type==="json"||y?.textVerbosity)&&{text:{...p?.type==="json"&&{format:p.schema!=null?{type:"json_schema",strict:P,name:(f=p.name)!=null?f:"response",description:p.description,schema:p.schema}:{type:"json_object"}},...y?.textVerbosity&&{verbosity:y.textVerbosity}}},conversation:y?.conversation,max_tool_calls:y?.maxToolCalls,metadata:y?.metadata,parallel_tool_calls:y?.parallelToolCalls,previous_response_id:y?.previousResponseId,store:j,user:y?.user,instructions:y?.instructions,service_tier:y?.serviceTier,include:A,prompt_cache_key:y?.promptCacheKey,prompt_cache_retention:y?.promptCacheRetention,safety_identifier:y?.safetyIdentifier,top_logprobs:L,truncation:y?.truncation,...b.isReasoningModel&&(y?.reasoningEffort!=null||y?.reasoningSummary!=null)&&{reasoning:{...y?.reasoningEffort!=null&&{effort:y.reasoningEffort},...y?.reasoningSummary!=null&&{summary:y.reasoningSummary}}}};b.isReasoningModel?y?.reasoningEffort==="none"&&b.supportsNonReasoningParameters||(W.temperature!=null&&(W.temperature=void 0,S.push({type:"unsupported-setting",setting:"temperature",details:"temperature is not supported for reasoning models"})),W.top_p!=null&&(W.top_p=void 0,S.push({type:"unsupported-setting",setting:"topP",details:"topP is not supported for reasoning models"}))):(y?.reasoningEffort!=null&&S.push({type:"unsupported-setting",setting:"reasoningEffort",details:"reasoningEffort is not supported for non-reasoning models"}),y?.reasoningSummary!=null&&S.push({type:"unsupported-setting",setting:"reasoningSummary",details:"reasoningSummary is not supported for non-reasoning models"})),y?.serviceTier==="flex"&&!b.supportsFlexProcessing&&(S.push({type:"unsupported-setting",setting:"serviceTier",details:"flex processing is only available for o3, o4-mini, and gpt-5 models"}),delete W.service_tier),y?.serviceTier==="priority"&&!b.supportsPriorityProcessing&&(S.push({type:"unsupported-setting",setting:"serviceTier",details:"priority processing is only available for supported models (gpt-4, gpt-5, gpt-5-mini, o3, o4-mini) and requires Enterprise access. gpt-5-nano is not supported"}),delete W.service_tier);let{tools:B,toolChoice:xe,toolWarnings:F}=await K5({tools:u,toolChoice:d,strictJsonSchema:P});return{webSearchToolName:N,args:{...W,tools:B,tool_choice:xe},warnings:[...S,...F],store:j}}async doGenerate(t){var e,r,n,o,i,a,s,c,l,u,d,p,m,g,h,f,S,b,y,T,w,P,A,x,O,L,N,j;let{args:W,warnings:B,webSearchToolName:xe}=await this.getArgs(t),F=this.config.url({path:"/responses",modelId:this.modelId}),z=this.config.provider.replace(".responses",""),{responseHeaders:ae,value:ue,rawValue:_e}=await Vr({url:F,headers:Sr(this.config.headers(),t.headers),body:W,failedResponseHandler:Io,successfulResponseHandler:Bn(V5),abortSignal:t.abortSignal,fetch:this.config.fetch});if(ue.error)throw new B5({message:ue.error.message,url:F,requestBodyValues:W,statusCode:400,responseHeaders:ae,responseBody:_e,isRetryable:!1});let ye=[],le=[],Q=!1;for(let I of ue.output)switch(I.type){case"reasoning":{I.summary.length===0&&I.summary.push({type:"summary_text",text:""});for(let oe of I.summary)ye.push({type:"reasoning",text:oe.text,providerMetadata:{[z]:{itemId:I.id,reasoningEncryptedContent:(e=I.encrypted_content)!=null?e:null}}});break}case"image_generation_call":{ye.push({type:"tool-call",toolCallId:I.id,toolName:"image_generation",input:"{}",providerExecuted:!0}),ye.push({type:"tool-result",toolCallId:I.id,toolName:"image_generation",result:{result:I.result},providerExecuted:!0});break}case"local_shell_call":{ye.push({type:"tool-call",toolCallId:I.call_id,toolName:"local_shell",input:JSON.stringify({action:I.action}),providerMetadata:{[z]:{itemId:I.id}}});break}case"message":{for(let oe of I.content){(n=(r=t.providerOptions)==null?void 0:r.openai)!=null&&n.logprobs&&oe.logprobs&&le.push(oe.logprobs),ye.push({type:"text",text:oe.text,providerMetadata:{[z]:{itemId:I.id}}});for(let ge of oe.annotations)ge.type==="url_citation"?ye.push({type:"source",sourceType:"url",id:(a=(i=(o=this.config).generateId)==null?void 0:i.call(o))!=null?a:dn(),url:ge.url,title:ge.title}):ge.type==="file_citation"?ye.push({type:"source",sourceType:"document",id:(l=(c=(s=this.config).generateId)==null?void 0:c.call(s))!=null?l:dn(),mediaType:"text/plain",title:(d=(u=ge.quote)!=null?u:ge.filename)!=null?d:"Document",filename:(p=ge.filename)!=null?p:ge.file_id,...ge.file_id?{providerMetadata:{[z]:{fileId:ge.file_id}}}:{}}):ge.type==="container_file_citation"?ye.push({type:"source",sourceType:"document",id:(h=(g=(m=this.config).generateId)==null?void 0:g.call(m))!=null?h:dn(),mediaType:"text/plain",title:(S=(f=ge.filename)!=null?f:ge.file_id)!=null?S:"Document",filename:(b=ge.filename)!=null?b:ge.file_id,providerMetadata:{[z]:{fileId:ge.file_id,containerId:ge.container_id,...ge.index!=null?{index:ge.index}:{}}}}):ge.type==="file_path"&&ye.push({type:"source",sourceType:"document",id:(w=(T=(y=this.config).generateId)==null?void 0:T.call(y))!=null?w:dn(),mediaType:"application/octet-stream",title:ge.file_id,filename:ge.file_id,providerMetadata:{[z]:{fileId:ge.file_id,...ge.index!=null?{index:ge.index}:{}}}})}break}case"function_call":{Q=!0,ye.push({type:"tool-call",toolCallId:I.call_id,toolName:I.name,input:I.arguments,providerMetadata:{[z]:{itemId:I.id}}});break}case"web_search_call":{ye.push({type:"tool-call",toolCallId:I.id,toolName:xe??"web_search",input:JSON.stringify({}),providerExecuted:!0}),ye.push({type:"tool-result",toolCallId:I.id,toolName:xe??"web_search",result:KL(I.action),providerExecuted:!0});break}case"computer_call":{ye.push({type:"tool-call",toolCallId:I.id,toolName:"computer_use",input:"",providerExecuted:!0}),ye.push({type:"tool-result",toolCallId:I.id,toolName:"computer_use",result:{type:"computer_use_tool_result",status:I.status||"completed"},providerExecuted:!0});break}case"file_search_call":{ye.push({type:"tool-call",toolCallId:I.id,toolName:"file_search",input:"{}",providerExecuted:!0}),ye.push({type:"tool-result",toolCallId:I.id,toolName:"file_search",result:{queries:I.queries,results:(A=(P=I.results)==null?void 0:P.map(oe=>({attributes:oe.attributes,fileId:oe.file_id,filename:oe.filename,score:oe.score,text:oe.text})))!=null?A:null},providerExecuted:!0});break}case"code_interpreter_call":{ye.push({type:"tool-call",toolCallId:I.id,toolName:"code_interpreter",input:JSON.stringify({code:I.code,containerId:I.container_id}),providerExecuted:!0}),ye.push({type:"tool-result",toolCallId:I.id,toolName:"code_interpreter",result:{outputs:I.outputs},providerExecuted:!0});break}}let Te={[z]:{...ue.id!=null?{responseId:ue.id}:{}}};le.length>0&&(Te[z].logprobs=le),typeof ue.service_tier=="string"&&(Te[z].serviceTier=ue.service_tier);let Ae=ue.usage;return{content:ye,finishReason:WL({finishReason:(x=ue.incomplete_details)==null?void 0:x.reason,hasFunctionCall:Q}),usage:{inputTokens:Ae.input_tokens,outputTokens:Ae.output_tokens,totalTokens:Ae.input_tokens+Ae.output_tokens,reasoningTokens:(L=(O=Ae.output_tokens_details)==null?void 0:O.reasoning_tokens)!=null?L:void 0,cachedInputTokens:(j=(N=Ae.input_tokens_details)==null?void 0:N.cached_tokens)!=null?j:void 0},request:{body:W},response:{id:ue.id,timestamp:new Date(ue.created_at*1e3),modelId:ue.model,headers:ae,body:_e},providerMetadata:Te,warnings:B}}async doStream(t){let{args:e,warnings:r,webSearchToolName:n,store:o}=await this.getArgs(t),{responseHeaders:i,value:a}=await Vr({url:this.config.url({path:"/responses",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),body:{...e,stream:!0},failedResponseHandler:Io,successfulResponseHandler:Jl(G5),abortSignal:t.abortSignal,fetch:this.config.fetch}),s=this,c=this.config.provider.replace(".responses",""),l="unknown",u={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},d=[],p=null,m={},g=[],h=!1,f={},S;return{stream:a.pipeThrough(new TransformStream({start(b){b.enqueue({type:"stream-start",warnings:r})},transform(b,y){var T,w,P,A,x,O,L,N,j,W,B,xe,F,z,ae,ue,_e,ye,le,Q,Te,Ae;if(t.includeRawChunks&&y.enqueue({type:"raw",rawValue:b.rawValue}),!b.success){l="error",y.enqueue({type:"error",error:b.error});return}let I=b.value;if(qL(I))I.item.type==="function_call"?(m[I.output_index]={toolName:I.item.name,toolCallId:I.item.call_id},y.enqueue({type:"tool-input-start",id:I.item.call_id,toolName:I.item.name})):I.item.type==="web_search_call"?(m[I.output_index]={toolName:n??"web_search",toolCallId:I.item.id},y.enqueue({type:"tool-input-start",id:I.item.id,toolName:n??"web_search",providerExecuted:!0}),y.enqueue({type:"tool-input-end",id:I.item.id}),y.enqueue({type:"tool-call",toolCallId:I.item.id,toolName:n??"web_search",input:JSON.stringify({}),providerExecuted:!0})):I.item.type==="computer_call"?(m[I.output_index]={toolName:"computer_use",toolCallId:I.item.id},y.enqueue({type:"tool-input-start",id:I.item.id,toolName:"computer_use",providerExecuted:!0})):I.item.type==="code_interpreter_call"?(m[I.output_index]={toolName:"code_interpreter",toolCallId:I.item.id,codeInterpreter:{containerId:I.item.container_id}},y.enqueue({type:"tool-input-start",id:I.item.id,toolName:"code_interpreter",providerExecuted:!0}),y.enqueue({type:"tool-input-delta",id:I.item.id,delta:`{"containerId":"${I.item.container_id}","code":"`})):I.item.type==="file_search_call"?y.enqueue({type:"tool-call",toolCallId:I.item.id,toolName:"file_search",input:"{}",providerExecuted:!0}):I.item.type==="image_generation_call"?y.enqueue({type:"tool-call",toolCallId:I.item.id,toolName:"image_generation",input:"{}",providerExecuted:!0}):I.item.type==="message"?(g.splice(0,g.length),y.enqueue({type:"text-start",id:I.item.id,providerMetadata:{[c]:{itemId:I.item.id}}})):qL(I)&&I.item.type==="reasoning"&&(f[I.item.id]={encryptedContent:I.item.encrypted_content,summaryParts:{0:"active"}},y.enqueue({type:"reasoning-start",id:`${I.item.id}:0`,providerMetadata:{[c]:{itemId:I.item.id,reasoningEncryptedContent:(T=I.item.encrypted_content)!=null?T:null}}}));else if(J5(I)){if(I.item.type==="message")y.enqueue({type:"text-end",id:I.item.id,providerMetadata:{[c]:{itemId:I.item.id,...g.length>0&&{annotations:g}}}});else if(I.item.type==="function_call")m[I.output_index]=void 0,h=!0,y.enqueue({type:"tool-input-end",id:I.item.call_id}),y.enqueue({type:"tool-call",toolCallId:I.item.call_id,toolName:I.item.name,input:I.item.arguments,providerMetadata:{[c]:{itemId:I.item.id}}});else if(I.item.type==="web_search_call")m[I.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:I.item.id,toolName:n??"web_search",result:KL(I.item.action),providerExecuted:!0});else if(I.item.type==="computer_call")m[I.output_index]=void 0,y.enqueue({type:"tool-input-end",id:I.item.id}),y.enqueue({type:"tool-call",toolCallId:I.item.id,toolName:"computer_use",input:"",providerExecuted:!0}),y.enqueue({type:"tool-result",toolCallId:I.item.id,toolName:"computer_use",result:{type:"computer_use_tool_result",status:I.item.status||"completed"},providerExecuted:!0});else if(I.item.type==="file_search_call")m[I.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:I.item.id,toolName:"file_search",result:{queries:I.item.queries,results:(P=(w=I.item.results)==null?void 0:w.map(oe=>({attributes:oe.attributes,fileId:oe.file_id,filename:oe.filename,score:oe.score,text:oe.text})))!=null?P:null},providerExecuted:!0});else if(I.item.type==="code_interpreter_call")m[I.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:I.item.id,toolName:"code_interpreter",result:{outputs:I.item.outputs},providerExecuted:!0});else if(I.item.type==="image_generation_call")y.enqueue({type:"tool-result",toolCallId:I.item.id,toolName:"image_generation",result:{result:I.item.result},providerExecuted:!0});else if(I.item.type==="local_shell_call")m[I.output_index]=void 0,y.enqueue({type:"tool-call",toolCallId:I.item.call_id,toolName:"local_shell",input:JSON.stringify({action:{type:"exec",command:I.item.action.command,timeoutMs:I.item.action.timeout_ms,user:I.item.action.user,workingDirectory:I.item.action.working_directory,env:I.item.action.env}}),providerMetadata:{[c]:{itemId:I.item.id}}});else if(I.item.type==="reasoning"){let oe=f[I.item.id],ge=Object.entries(oe.summaryParts).filter(([rn,Er])=>Er==="active"||Er==="can-conclude").map(([rn])=>rn);for(let rn of ge)y.enqueue({type:"reasoning-end",id:`${I.item.id}:${rn}`,providerMetadata:{[c]:{itemId:I.item.id,reasoningEncryptedContent:(A=I.item.encrypted_content)!=null?A:null}}});delete f[I.item.id]}}else if(e3(I)){let oe=m[I.output_index];oe!=null&&y.enqueue({type:"tool-input-delta",id:oe.toolCallId,delta:I.delta})}else if(t3(I)){let oe=m[I.output_index];oe!=null&&y.enqueue({type:"tool-input-delta",id:oe.toolCallId,delta:JSON.stringify(I.delta).slice(1,-1)})}else if(r3(I)){let oe=m[I.output_index];oe!=null&&(y.enqueue({type:"tool-input-delta",id:oe.toolCallId,delta:'"}'}),y.enqueue({type:"tool-input-end",id:oe.toolCallId}),y.enqueue({type:"tool-call",toolCallId:oe.toolCallId,toolName:"code_interpreter",input:JSON.stringify({code:I.code,containerId:oe.codeInterpreter.containerId}),providerExecuted:!0}))}else if(Q5(I))p=I.response.id,y.enqueue({type:"response-metadata",id:I.response.id,timestamp:new Date(I.response.created_at*1e3),modelId:I.response.model});else if(X5(I))y.enqueue({type:"text-delta",id:I.item_id,delta:I.delta}),(O=(x=t.providerOptions)==null?void 0:x.openai)!=null&&O.logprobs&&I.logprobs&&d.push(I.logprobs);else if(I.type==="response.reasoning_summary_part.added"){if(I.summary_index>0){let oe=f[I.item_id];oe.summaryParts[I.summary_index]="active";for(let ge of Object.keys(oe.summaryParts))oe.summaryParts[ge]==="can-conclude"&&(y.enqueue({type:"reasoning-end",id:`${I.item_id}:${ge}`,providerMetadata:{[c]:{itemId:I.item_id}}}),oe.summaryParts[ge]="concluded");y.enqueue({type:"reasoning-start",id:`${I.item_id}:${I.summary_index}`,providerMetadata:{[c]:{itemId:I.item_id,reasoningEncryptedContent:(N=(L=f[I.item_id])==null?void 0:L.encryptedContent)!=null?N:null}}})}}else I.type==="response.reasoning_summary_text.delta"?y.enqueue({type:"reasoning-delta",id:`${I.item_id}:${I.summary_index}`,delta:I.delta,providerMetadata:{[c]:{itemId:I.item_id}}}):I.type==="response.reasoning_summary_part.done"?o?(y.enqueue({type:"reasoning-end",id:`${I.item_id}:${I.summary_index}`,providerMetadata:{[c]:{itemId:I.item_id}}}),f[I.item_id].summaryParts[I.summary_index]="concluded"):f[I.item_id].summaryParts[I.summary_index]="can-conclude":Z5(I)?(l=WL({finishReason:(j=I.response.incomplete_details)==null?void 0:j.reason,hasFunctionCall:h}),u.inputTokens=I.response.usage.input_tokens,u.outputTokens=I.response.usage.output_tokens,u.totalTokens=I.response.usage.input_tokens+I.response.usage.output_tokens,u.reasoningTokens=(B=(W=I.response.usage.output_tokens_details)==null?void 0:W.reasoning_tokens)!=null?B:void 0,u.cachedInputTokens=(F=(xe=I.response.usage.input_tokens_details)==null?void 0:xe.cached_tokens)!=null?F:void 0,typeof I.response.service_tier=="string"&&(S=I.response.service_tier)):n3(I)?(g.push(I.annotation),I.annotation.type==="url_citation"?y.enqueue({type:"source",sourceType:"url",id:(ue=(ae=(z=s.config).generateId)==null?void 0:ae.call(z))!=null?ue:dn(),url:I.annotation.url,title:I.annotation.title}):I.annotation.type==="file_citation"&&y.enqueue({type:"source",sourceType:"document",id:(le=(ye=(_e=s.config).generateId)==null?void 0:ye.call(_e))!=null?le:dn(),mediaType:"text/plain",title:(Te=(Q=I.annotation.quote)!=null?Q:I.annotation.filename)!=null?Te:"Document",filename:(Ae=I.annotation.filename)!=null?Ae:I.annotation.file_id,...I.annotation.file_id?{providerMetadata:{[c]:{fileId:I.annotation.file_id}}}:{}})):o3(I)&&y.enqueue({type:"error",error:I})},flush(b){let y={[c]:{responseId:p}};d.length>0&&(y[c].logprobs=d),S!==void 0&&(y[c].serviceTier=S),b.enqueue({type:"finish",finishReason:l,usage:u,providerMetadata:y})}})),request:{body:e},response:{headers:i}}}};function X5(t){return t.type==="response.output_text.delta"}function J5(t){return t.type==="response.output_item.done"}function Z5(t){return t.type==="response.completed"||t.type==="response.incomplete"}function Q5(t){return t.type==="response.created"}function e3(t){return t.type==="response.function_call_arguments.delta"}function t3(t){return t.type==="response.code_interpreter_call_code.delta"}function r3(t){return t.type==="response.code_interpreter_call_code.done"}function qL(t){return t.type==="response.output_item.added"}function n3(t){return t.type==="response.output_text.annotation.added"}function o3(t){return t.type==="error"}function KL(t){var e;switch(t.type){case"search":return{action:{type:"search",query:(e=t.query)!=null?e:void 0},...t.sources!=null&&{sources:t.sources}};case"open_page":return{action:{type:"openPage",url:t.url}};case"find_in_page":return{action:{type:"findInPage",url:t.url,pattern:t.pattern}}}}var i3=bt(()=>me(zE.object({instructions:zE.string().nullish(),speed:zE.number().min(.25).max(4).default(1).nullish()}))),a3=class{constructor(t,e){this.modelId=t,this.config=e,this.specificationVersion="v2"}get provider(){return this.config.provider}async getArgs({text:t,voice:e="alloy",outputFormat:r="mp3",speed:n,instructions:o,language:i,providerOptions:a}){let s=[],c=await Gr({provider:"openai",providerOptions:a,schema:i3}),l={model:this.modelId,input:t,voice:e,response_format:"mp3",speed:n,instructions:o};if(r&&(["mp3","opus","aac","flac","wav","pcm"].includes(r)?l.response_format=r:s.push({type:"unsupported-setting",setting:"outputFormat",details:`Unsupported output format: ${r}. Using mp3 instead.`})),c){let u={};for(let d in u){let p=u[d];p!==void 0&&(l[d]=p)}}return i&&s.push({type:"unsupported-setting",setting:"language",details:`OpenAI speech models do not support language selection. Language parameter "${i}" was ignored.`}),{requestBody:l,warnings:s}}async doGenerate(t){var e,r,n;let o=(n=(r=(e=this.config._internal)==null?void 0:e.currentDate)==null?void 0:r.call(e))!=null?n:new Date,{requestBody:i,warnings:a}=await this.getArgs(t),{value:s,responseHeaders:c,rawValue:l}=await Vr({url:this.config.url({path:"/audio/speech",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),body:i,failedResponseHandler:Io,successfulResponseHandler:OL(),abortSignal:t.abortSignal,fetch:this.config.fetch});return{audio:s,warnings:a,request:{body:JSON.stringify(i)},response:{timestamp:o,modelId:this.modelId,headers:c,body:l}}}},s3=bt(()=>me(Bt.object({text:Bt.string(),language:Bt.string().nullish(),duration:Bt.number().nullish(),words:Bt.array(Bt.object({word:Bt.string(),start:Bt.number(),end:Bt.number()})).nullish(),segments:Bt.array(Bt.object({id:Bt.number(),seek:Bt.number(),start:Bt.number(),end:Bt.number(),text:Bt.string(),tokens:Bt.array(Bt.number()),temperature:Bt.number(),avg_logprob:Bt.number(),compression_ratio:Bt.number(),no_speech_prob:Bt.number()})).nullish()}))),l3=bt(()=>me(ea.object({include:ea.array(ea.string()).optional(),language:ea.string().optional(),prompt:ea.string().optional(),temperature:ea.number().min(0).max(1).default(0).optional(),timestampGranularities:ea.array(ea.enum(["word","segment"])).default(["segment"]).optional()}))),YL={afrikaans:"af",arabic:"ar",armenian:"hy",azerbaijani:"az",belarusian:"be",bosnian:"bs",bulgarian:"bg",catalan:"ca",chinese:"zh",croatian:"hr",czech:"cs",danish:"da",dutch:"nl",english:"en",estonian:"et",finnish:"fi",french:"fr",galician:"gl",german:"de",greek:"el",hebrew:"he",hindi:"hi",hungarian:"hu",icelandic:"is",indonesian:"id",italian:"it",japanese:"ja",kannada:"kn",kazakh:"kk",korean:"ko",latvian:"lv",lithuanian:"lt",macedonian:"mk",malay:"ms",marathi:"mr",maori:"mi",nepali:"ne",norwegian:"no",persian:"fa",polish:"pl",portuguese:"pt",romanian:"ro",russian:"ru",serbian:"sr",slovak:"sk",slovenian:"sl",spanish:"es",swahili:"sw",swedish:"sv",tagalog:"tl",tamil:"ta",thai:"th",turkish:"tr",ukrainian:"uk",urdu:"ur",vietnamese:"vi",welsh:"cy"},c3=class{constructor(t,e){this.modelId=t,this.config=e,this.specificationVersion="v2"}get provider(){return this.config.provider}async getArgs({audio:t,mediaType:e,providerOptions:r}){let n=[],o=await Gr({provider:"openai",providerOptions:r,schema:l3}),i=new FormData,a=t instanceof Uint8Array?new Blob([t]):new Blob([FL(t)]);i.append("model",this.modelId);let s=xL(e);if(i.append("file",new File([a],"audio",{type:e}),`audio.${s}`),o){let c={include:o.include,language:o.language,prompt:o.prompt,response_format:["gpt-4o-transcribe","gpt-4o-mini-transcribe"].includes(this.modelId)?"json":"verbose_json",temperature:o.temperature,timestamp_granularities:o.timestampGranularities};for(let[l,u]of Object.entries(c))if(u!=null)if(Array.isArray(u))for(let d of u)i.append(`${l}[]`,String(d));else i.append(l,String(u))}return{formData:i,warnings:n}}async doGenerate(t){var e,r,n,o,i,a,s,c;let l=(n=(r=(e=this.config._internal)==null?void 0:e.currentDate)==null?void 0:r.call(e))!=null?n:new Date,{formData:u,warnings:d}=await this.getArgs(t),{value:p,responseHeaders:m,rawValue:g}=await IL({url:this.config.url({path:"/audio/transcriptions",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),formData:u,failedResponseHandler:Io,successfulResponseHandler:Bn(s3),abortSignal:t.abortSignal,fetch:this.config.fetch}),h=p.language!=null&&p.language in YL?YL[p.language]:void 0;return{text:p.text,segments:(s=(a=(o=p.segments)==null?void 0:o.map(f=>({text:f.text,startSecond:f.start,endSecond:f.end})))!=null?a:(i=p.words)==null?void 0:i.map(f=>({text:f.word,startSecond:f.start,endSecond:f.end})))!=null?s:[],language:h,durationInSeconds:(c=p.duration)!=null?c:void 0,warnings:d,response:{timestamp:l,modelId:this.modelId,headers:m,body:g}}}},u3="2.0.89";function jE(t={}){var e,r;let n=(e=BL(wL({settingValue:t.baseURL,environmentVariableName:"OPENAI_BASE_URL"})))!=null?e:"https://api.openai.com/v1",o=(r=t.name)!=null?r:"openai",i=()=>OE({Authorization:`Bearer ${CL({apiKey:t.apiKey,environmentVariableName:"OPENAI_API_KEY",description:"OpenAI"})}`,"OpenAI-Organization":t.organization,"OpenAI-Project":t.project,...t.headers},`ai-sdk/openai/${u3}`),a=h=>new t5(h,{provider:`${o}.chat`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),s=h=>new a5(h,{provider:`${o}.completion`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),c=h=>new u5(h,{provider:`${o}.embedding`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),l=h=>new g5(h,{provider:`${o}.image`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),u=h=>new c3(h,{provider:`${o}.transcription`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),d=h=>new a3(h,{provider:`${o}.speech`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),p=h=>{if(new.target)throw new Error("The OpenAI model function cannot be called with the new keyword.");return m(h)},m=h=>new Y5(h,{provider:`${o}.responses`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch,fileIdPrefixes:["file-"]}),g=function(h){return p(h)};return g.languageModel=p,g.chat=a,g.completion=s,g.responses=m,g.embedding=c,g.textEmbedding=c,g.textEmbeddingModel=c,g.image=l,g.imageModel=l,g.transcription=u,g.transcriptionModel=u,g.speech=d,g.speechModel=d,g.tools=F5,g}var Dje=jE();function rN(t){let{apiKey:e,sessionId:r,extraHeaders:n,loggerTags:o}=t,i={Authorization:`Bearer ${e}`,[pm]:us??"",...r&&{[ax]:r},...n||{}};return o&&(i[ix]=JSON.stringify(o)),i}var hd=t=>e=>{let r=rN(t);return d3({baseURL:`${t.baseUrl}/v1/llm/anthropic/${e}`,headers:r,apiKey:t.apiKey})(e)},GE=t=>e=>{let r=rN(t);return jE({baseURL:`${t.baseUrl}/v1/llm/openai/${e}`,headers:r,apiKey:t.apiKey})(e)};var Po=class extends fr{agentConfig;constructor(e,r){let n={...Gp,...e};super(r),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,r){let n={...e,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:r.abortSignal});return AC.parse(o)}async rankChunksWithRag(e,r){let n=await this.sendRequest(`/${q}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:us,...e},signal:r.abortSignal});return vC.parse(n)}async getScreenshotFromS3(e){let r=await this.sendRequest(`/${q}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return p3.string().parse(r)}async getElementLocation(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${q}/web-agent/locate-element`,{method:"POST",body:n,signal:r.abortSignal});return px.parse(o)}async getAssertionResult(e,r){let n={...e,disableCache:!!r.disableCache,useConsensus:!!r.useConsensus,attemptNumber:r.attemptNumber,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.assertion},o=await this.sendRequest(`/${q}/web-agent/assertion`,{method:"POST",body:n,signal:r.abortSignal});return Iy.parse(o)}async getLintStepResult(e,r){let n={...e,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/lint/step`,{method:"POST",body:n,signal:r.abortSignal});return dx.parse(o)}async getLintMcpCopilotMessageResult(e,r){let n={message:e.message,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:r.abortSignal});return lx.parse(o)}async getMcpCopilotConversationEvaluation(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/mcp-copilot-conversation-evaluator`,{method:"POST",body:n,signal:r.abortSignal});return cx.parse(o)}async getMcpCopilotChatSummary(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/mcp-copilot-chat-summary`,{method:"POST",body:n,signal:r.abortSignal});return ux.parse(o)}async getVisualAssertionResult(e,r){let n={...e,disableCache:!!r.disableCache,useConsensus:!!r.useConsensus,attemptNumber:r.attemptNumber,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.["visual-assertion"]},o=await this.sendRequest(`/${q}/web-agent/visual-assertion`,{method:"POST",body:n,signal:r.abortSignal});return Iy.parse(o)}async getAiActionCommand(e,r){let n=await this.sendRequest(`/${q}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return sx.parse(n)}async getMultiturnAiActionCommand(e,r){return await this.sendRequest(`/${q}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal})}async getMultiturnAiActionEvaluation(e,r){let n=await this.sendRequest(`/${q}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return gS.parse(n)}async getReverseMappedDescription(e,r){let n=await this.sendRequest(`/${q}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return mx.parse(n)}async getTextExtraction(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${q}/web-agent/text-extraction`,{method:"POST",body:n,signal:r.abortSignal});return dS.parse(o)}async getPageSummary(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/page-summary`,{method:"POST",body:n,signal:r.abortSignal});return JR.parse(o)}async getSmartWaitingDecision(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/smart-waiting`,{method:"POST",body:n,signal:r.abortSignal});return ZR.parse(o)}async getTestResultClassification(e,r){let n=await this.sendRequest(`/${q}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return Wf.parse(n)}async getExtractedKeywords(e,r){let n=await this.sendRequest(`/${q}/web-agent/extract-keywords`,{method:"POST",body:e,signal:r.abortSignal});return UC.parse(n)}async getAutohealingProposal(e,r){let n=await this.sendRequest(`/${q}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return qR.parse(n)}async getFailureRecoveryProposal(e,r){let n=await this.sendRequest(`/${q}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return YR.parse(n)}async getFailureRecoveryPlan(e,r){let n=await this.sendRequest(`/${q}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return KR.parse(n)}async getIframeRegex(e,r){let n=await this.sendRequest(`/${q}/web-agent/iframe-regex`,{method:"POST",body:e,signal:r.abortSignal});return sA.parse(n)}getVercelAnthropicModelFactory(e){let{sessionId:r,logger:n}=e;return hd({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:et(n),sessionId:r})}getVercelOpenAIModelFactory(e){let{sessionId:r,logger:n}=e;return GE({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:et(n),sessionId:r})}};import{z as VE}from"zod";var pt=class extends fr{constructor(e){super({...e,mode:void 0})}getAppUrl(){return hl(this.baseUrl)}async getAuthInfo(){let e=await this.sendRequest(`/${q}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:r=>{v.warn(`API key check failed: ${r.message}`)}});return wx.parse(e)}async bulkGetRunStatus(e){let r=await this.sendRequest(`/${q}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return vx.parse(r)}async getTestYAMLExport(e){let r=await this.sendRequest(`/${q}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return hx.parse(r)}async updateStepCaches(e,r){await this.sendRequest(`/${q}/cache`,{method:"PATCH",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,r){let n=await this.sendRequest(`/${q}/cache`,{method:"POST",body:e,extraHeaders:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return Sx.parse(n)}async getWebStepCacheMemoryTraces(e){let r=await this.sendRequest(`/${q}/cache/traces`,{method:"POST",body:e,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return My.parse(r)}async getMobileStepCacheMemoryTraces(e){let r=await this.sendRequest(`/${q}/mobile-cache/traces`,{method:"POST",body:e,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return My.parse(r)}async updateMobileStepCaches(e,r){await this.sendRequest(`/${q}/mobile-cache`,{method:"PATCH",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest(e,r){let n=await this.sendRequest(`/${q}/mobile-cache`,{method:"POST",body:e,extraHeaders:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return yx.parse(n)}async queueTests(e){let r=await this.sendRequest(`/${q}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return gx.parse(r)}async uploadScreenshot(e){let r=await this.sendRequest(`/${q}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return Cx.parse(r)}async uploadOnDemandScreenshot(e){return await this.sendRequest(`/${q}/on-demand-screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3}),{apiServerUrl:`${this.baseUrl}/${q}/on-demand-screenshots/${e.id}`}}async fetchOnDemandScreenshot(e){let r={};return{data:await this.sendRequest(`/${q}/on-demand-screenshots/${encodeURIComponent(e)}`,{method:"GET",retries:3,requestTimeoutMs:5e3,responseType:"buffer",responseHeadersObject:r}),contentType:r["content-type"]??"image/jpeg"}}async getAllEnvironments(){let e=await this.sendRequest(`/${q}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return xx.parse(e)}async acquireCacheLock(e,r){let n=await this.sendRequest(`/${q}/result-cache/lock`,{method:"POST",body:e,signal:r,retries:3,requestTimeoutMs:3e4});return $x.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${q}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${q}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${q}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${q}/result-cache/entry`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(r){if(r instanceof Error&&r.message.includes("404"))return null;throw r}}async queueSuiteRuns(e){let r=await this.sendRequest(`/${q}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return _x.parse(r)}async bulkGetRunGroupStatus(e){let r={runGroupIds:e},n=await this.sendRequest(`/${q}/run-groups/status`,{method:"POST",body:r,retries:3,requestTimeoutMs:5e3});return SC.array().parse(n)}async uploadProposedSteps(e,r){try{await this.sendRequest(`/${q}/test-fragments/`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4})}catch(n){r.error({err:n},"Failed to upload proposed steps")}}async reportBillableEvents(e,r){try{await this.sendRequest(`/${q}/billing/events`,{method:"POST",body:r,retries:10,requestTimeoutMs:1e4})}catch(n){e.error({err:n},"Failed to report billable event")}}async fetchTestFragment(e){let r=await this.sendRequest(`/${q}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ix.parse(r)}async patchTestFragment(e,r){await this.sendRequest(`/${q}/test-fragments/${e}`,{method:"PATCH",body:r,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,r){let n=await this.sendRequest(`/${q}/results/tests/${e}`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return Px.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${q}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return Mx.parse(e)}async startProcessingResultsUpload(e,r){let n=await this.sendRequest(`/${q}/results/uploads/${e}/process`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return Ox.parse(n)}async fetchIconKnowledgeBase(e){try{let r=await this.sendRequest(`/${q}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Xx.parse(r)}catch(r){return e.error({err:r},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,r){try{await this.sendRequest(`/${q}/knowledge-base/icons`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(n){r.error({err:n},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,r,n,o){let i=new URLSearchParams;i.set("base",n),i.set("head",o);let a=await this.sendRequest(`/${q}/git/github/${e}/${r}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Cu.parse(a)}async getCommitFromGithub(e,r,n){let o=await this.sendRequest(`/${q}/git/github/${e}/${r}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Cu.parse(o)}async getMergedBranchFromGithub(e,r,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${q}/git/github/${e}/${r}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ny.parse(a)}async getMergeBaseCommitFromGitlab(e,r,n){let o=new URLSearchParams;o.set("base",r),o.set("head",n);let i=encodeURIComponent(e),a=await this.sendRequest(`/${q}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Cu.parse(a)}async getCommitFromGitlab(e,r){let n=encodeURIComponent(e),o=await this.sendRequest(`/${q}/git/gitlab/${n}/commits/${r}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Cu.parse(o)}async getMergedBranchFromGitlab(e,r,n){let o=encodeURIComponent(r),i=encodeURIComponent(e),a=await this.sendRequest(`/${q}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ny.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${q}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return VE.record(VE.string(),VE.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${q}/quarantine`,{method:"GET"});return Lx.parse(e)}async quarantineTest(e,r,n){await this.sendRequest(`/${q}/quarantine`,{method:"POST",body:{testId:e.id,testName:e.name,reason:r,...n??{}},retries:3,requestTimeoutMs:1e4})}async unquarantineTest(e,r,n){await this.sendRequest(`/${q}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:r,...n??{}},retries:3,requestTimeoutMs:1e4})}async createAndroidEmulator(e){let r=await this.sendRequest(`/${q}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return Nx.parse(r)}async extendAndroidEmulatorTtl(e){try{await this.sendRequest(`/${q}/limbar/android/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async generateAndroidAssetUrls({channel:e,tag:r,md5:n}){let o={channel:e,tag:r,md5:n},i=await this.sendRequest(`/${q}/limbar/android/upload-url`,{method:"POST",retries:3,body:o,requestTimeoutMs:15e3,logResponse:!0});return kx.parse(i)}async deleteAndroidEmulator(e){await this.sendRequest(`/${q}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getAndroidAssets(){let e=await this.sendRequest(`/${q}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ux.parse(e)}async getLimbarAssetDownloadUrl(e,r){let n=await this.sendRequest(`/${q}/limbar/assets/${e}/${r}/download-url`,{method:"GET",retries:2,requestTimeoutMs:3e4});return Fx.parse(n)}async deleteAndroidAsset(e,r){await this.sendRequest(`/${q}/limbar/assets/${e}/${r}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}async createIosEmulator(e){let r=await this.sendRequest(`/${q}/limbar/ios`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return Dx.parse(r)}async extendIosEmulatorTtl(e){try{await this.sendRequest(`/${q}/limbar/ios/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async deleteIosEmulator(e){await this.sendRequest(`/${q}/limbar/ios/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async generateMobileLogcatUploadUrl(e){let r=await this.sendRequest(`/${q}/logcat/mobile/upload`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return ww.parse(r)}};async function Xg(t){let e=process.versions.node,r=parseInt(e.split(".")[0]);(isNaN(r)||r<18)&&(v.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),v.debug(`Identified node version ${e}`);let n=await t.client.getAuthInfo();return v.debug("Got auth info from API"),n}var Jg=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,r){await this.apiClient.reportBillableEvents(e,r)}};var ta=class extends fr{generator;constructor(e,r){super(e),this.generator=r}async runTemplateMatching(e,r={}){let n=await this.sendRequest(`/${q}/web-agent/template-matching`,{method:"POST",body:e,signal:r?.signal});return lA.parse(n)}async constructIframeRegex(e,r={}){return this.generator.getIframeRegex(e,{abortSignal:r.signal})}};var Zl=class{constructor(e,r){this.client=e;this.orgId=r}getApiServerUrl(){return this.client.baseUrl}getAppServerUrl(){let e=this.getApiServerUrl();return hl(e)}async acquireCacheLock(e,r){return this.client.acquireCacheLock(e,r)}async createOnDemandScreenshot(e,r,n){let{apiServerUrl:o}=await this.client.uploadOnDemandScreenshot({id:e,screenshot:r.toString("base64"),contentType:n});return{apiServerUrl:o,appServerUrl:`${this.getAppServerUrl()}/api/on-demand-screenshots/${e}`,universalHandle:{id:e,contentType:n}}}async fetchOnDemandScreenshot(e){return this.client.fetchOnDemandScreenshot(e.id)}async releaseCacheLock(e){return this.client.releaseCacheLock(e)}async deleteCacheResult(e){return this.client.deleteCacheResult(e)}async setCacheResult(e){return this.client.setCacheResult(e)}async getCacheResult(e){return this.client.getCacheResult(e)}fetchIconKnowledgeBase(e){return this.client.fetchIconKnowledgeBase(e)}saveNewIcons(e,r){return this.client.saveNewIcons(e,r)}};import{Faker as m3,en as g3}from"@faker-js/faker";var Ql="v1",Mo=class{httpClient;fakerInstance;type="API_CLIENT";sms={send:this.sendSms.bind(this),fetchLatest:this.fetchLatestSms.bind(this)};email={send:this.sendEmail.bind(this),fetchLatest:this.fetchLatestEmail.bind(this),fetchAll:this.fetchAllEmails.bind(this)};ai={generate:this.sendAiGenerate.bind(this)};constructor(e){this.httpClient=e.httpClient,e.fakerSeed&&(this.fakerInstance=new m3({locale:g3}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let r=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${Ql}/tools/ai/generate`,{method:"POST",body:r}).catch(n=>{throw n instanceof no?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${Ql}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(r=>{throw r instanceof no?new Error(r.rawError):new Error(`Failed to send sms: ${r.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${Ql}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(r=>{throw r instanceof no?new Error(r.rawError):r})}async sendEmail(e){return this.httpClient.sendRequest(`/${Ql}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(r=>{throw r instanceof no?new Error(r.rawError):new Error(`Failed to send email: ${r.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${Ql}/tools/email/fetchAll`,{method:"POST",body:e}).catch(r=>{throw r instanceof no?new Error(r.rawError):new Error(`Failed to fetch all emails: ${r.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${Ql}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(r=>{throw r instanceof no?new Error(r.rawError):new Error(`Failed to fetch latest emails: ${r.message}`)})}};function nN(t,e,r){return fetch(t,{method:"PUT",body:r,headers:{"Content-Type":e}})}var Zg=class{constructor(e){this.client=e}async uploadResultsArchive(e,r){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await nN(n,"application/zip",r);if(!i.ok)throw new Error(`Failed to upload test results: ${await i.text()}`);let{runGroupId:a}=await this.client.startProcessingResultsUpload(o,{runGroupId:e});return a}};function Oo({logger:t,orgId:e,client:r,gitMetadata:n,regenerateCache:o,alwaysSaveCache:i,noCache:a,bustOldestCachePercentage:s}){return a?new mm:new $E(t,e,r,n,{regenerateCache:o,alwaysSaveCache:i,bustOldestCachePercentage:s})}var $E=class{constructor(e,r,n,o,i){this.orgId=r;this.client=n;let{regenerateCache:a,alwaysSaveCache:s,bustOldestCachePercentage:c}=i,{gitBranchName:l,gitProtectedBranches:u}=o;e.info({options:i,gitBranchName:l,gitProtectedBranches:u},"Cache storage initialization options"),this.cacheHeaders=Py(o),this.readCaches=!a;let d=l&&u.includes(l);s||!d?this.writeCaches=!0:this.writeCaches=!1,d||(this.bustOldestCachePercentage=c)}cacheHeaders;readCaches;writeCaches;bustOldestCachePercentage;async saveStepCacheEntries({entries:e,testId:r,logger:n}){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateStepCaches({entries:e,testId:r},this.cacheHeaders)}catch(o){n.error({err:o},"Failed to save step cache entries")}}async resolveStepCacheEntries(e){if(!this.readCaches){e.logger.debug("Skipping cache resolution because of regenerate flag");return}let{steps:r,beforeSteps:n,afterSteps:o}=e.stepLists,i=await this.client.getStepCacheForTest({testId:e.testId},this.cacheHeaders);if(this.bustOldestCachePercentage!==void 0){let s=Object.entries(i).map(([u,d])=>({key:u,time:d.value.cache?.updatedAt?.getTime()??0}));s.sort((u,d)=>u.time-d.time);let c=s.length,l=Math.max(1,Math.floor(c*this.bustOldestCachePercentage/100));s.slice(0,l).forEach(({key:u})=>{delete i[u]}),e.logger.info({nCachesToBust:l,bustOldestCachePercentage:this.bustOldestCachePercentage,totalCaches:c},"Busted oldest caches")}for(let s of[r,n,o])s&&Ul({steps:s,stepCacheEntries:i,logger:e.logger});if(!this.writeCaches){e.logger.debug("Skipping cache last used at update because branch is protected");return}let{cachesToSave:a}=await Pt({stepLists:e.stepLists,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateStepCaches({entries:a,testId:e.testId},this.cacheHeaders)}};import Qg from"path";function h3(t){let e=new oN,r=Qg.join(t,"metadata.json"),n=fl.parse(JSON.parse(WE.readFileSync(r,"utf-8")));e.addLocalFile(r);for(let o of WE.readdirSync(Qg.join(t,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new oN(Qg.join(t,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(Qg.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function eh(t){let{client:e,consoleLogger:r,resultsPath:n}=t;if(!WE.existsSync(n)){r.warn("Results path does not exist, skipping upload.");return}let o=new Zg(e);try{let{runGroupId:i,buffer:a}=h3(n),s=await o.uploadResultsArchive(i,a),c=`${e.getAppUrl()}/run-groups/${s}`;r.success(`Successfully uploaded test results. Once processed, your results can be found at ${c}`);return}catch(i){let a;i instanceof Error?a=i.message:typeof i=="string"?a=i:a="Unknown error",r.error(`Failed to upload test results: ${a}.`);return}}import f3 from"adm-zip";import Mr from"fs";import zn from"path";var fd=class t{constructor(e){this.filePath=e;Mr.rmSync(this.filePath,{recursive:!0,force:!0}),Mr.mkdirSync(this.filePath,{recursive:!0})}children=[];streams=[];close(){for(let e of this.children)e.close();for(let e of this.streams)e.end()}cd(e){let r=new t(zn.join(this.filePath,e));return this.children.push(r),r}cwd(){return this.filePath}mkdir(e){Mr.mkdirSync(zn.join(this.filePath,e),{recursive:!0})}readFile(e){let r=zn.join(this.filePath,e);if(Mr.existsSync(r))return Mr.readFileSync(r)}storeFile(e){let{name:r,contents:n}=e,o=zn.join(this.filePath,r);try{Mr.writeFileSync(o,n)}catch{}}createFileStream(e){let r=zn.join(this.filePath,e),n=Mr.createWriteStream(r);return this.streams.push(n),n}createRunArchive(e){let r=new qE(zn.join(this.filePath,"runs"),e);return this.children.push(r),r}},qE=class{children=[];tempPath;finalPath;constructor(e,r){this.tempPath=zn.join(e,`temp-storage-${r}`),this.finalPath=zn.join(e,`${r}.zip`),Mr.rmSync(this.tempPath,{recursive:!0,force:!0}),Mr.rmSync(this.finalPath,{recursive:!0,force:!0}),Mr.mkdirSync(this.tempPath,{recursive:!0})}readFile(e){let r=zn.join(this.tempPath,e);if(Mr.existsSync(r))return Mr.readFileSync(r)}mkdir(e){Mr.mkdirSync(zn.join(this.tempPath,e),{recursive:!0})}cd(e){let r=new fd(zn.join(this.tempPath,e));return this.children.push(r),r}cwd(){return this.tempPath}storeFile(e){let{name:r,contents:n}=e,o=zn.join(this.tempPath,r);Mr.writeFileSync(o,n)}close(){for(let n of this.children)n.close();let e=new f3;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let r=e.toBuffer();Mr.writeFileSync(this.finalPath,r),Mr.rmSync(this.tempPath,{recursive:!0,force:!0})}};import S3 from"adm-zip";import{randomUUID as y3}from"crypto";import Qt from"fs";import br from"path";function lN(t){try{return Qt.existsSync(t)?JSON.parse(Qt.readFileSync(t,"utf-8")):void 0}catch{return}}function iN(t){return Qt.existsSync(t)?Qt.readFileSync(t,"utf-8").split(`
|
|
90
|
-
`).map(r=>r.trim()).filter(r=>r.length>0):[]}function b3(t,e){let r=t.attemptIdToAttemptNumber.get(e);if(r)return br.join(t.inflatedPath,"attempts",r);let n=br.join(t.inflatedPath,"attempts");if(!Qt.existsSync(n))return;let o=Qt.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=br.join(n,i,"metadata.json"),s=lN(a);if(typeof s!="object"||s===null)continue;let c=s.id;if(typeof c=="string"&&c===e)return t.attemptIdToAttemptNumber.set(e,i),br.join(n,i)}}function aN(t,e,r){let n=br.join(t,"attempts");if(!Qt.existsSync(n))return;let o=Qt.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=br.join(n,i,"assets",`${e}.${r}`);if(Qt.existsSync(a))return a}}var th=class{constructor(e,r,n){this.outputDir=e;this.runId=r;this.runAttemptId=n;this.runsDir=br.join(e,"runs"),this.zipPath=br.join(this.runsDir,`${r}.zip`)}inflatedByRunId=new Map;zipPath;runsDir;ensureInflatedRun(e){let r=this.inflatedByRunId.get(e);if(r)return r;if(e!==this.runId||!Qt.existsSync(this.zipPath))return;let n=br.join(this.runsDir,`temp-unzipped-${e}-${y3()}`);Qt.mkdirSync(n,{recursive:!0}),new S3(this.zipPath).extractAllTo(n,!0);let i={runId:e,zipPath:this.zipPath,inflatedPath:n,attemptIdToAttemptNumber:new Map};return this.inflatedByRunId.set(e,i),i}close(){for(let e of this.inflatedByRunId.values())Qt.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return b3(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let r=br.join(e,"assets");return Qt.existsSync(r)?Qt.readdirSync(r,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>br.join(r,o.name)).filter(o=>{let i=br.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,r){let n=this.getAttemptDir();if(!n)return;let o=br.join(n,"assets",`${e}.${r}`);if(Qt.existsSync(o))try{return Qt.readFileSync(o,"utf-8")}catch{return}}async getConsoleLogsForRunAttempt(e,r,n){if(r!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=lN(br.join(o,"console.json")),a=by.safeParse(i);return a.success?a.data:void 0}async getNetworkLogsForRunAttempt(e,r,n){if(r!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=br.join(o,"assets","har-pages.log"),a=br.join(o,"assets","har-entries.log"),s={};for(let u of iN(i)){let d=Eu.safeParse(sN(u));d.success&&(s[d.data.id]=d.data)}let c={},l=iN(a);for(let u=0;u<l.length;u++){let d=l[u],p=Tu.safeParse(sN(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;c[m]=p.data}if(Object.keys(c).length!==0)return Ty(s,c)}async getHtmlSnapshot(e,r){let n=this.readAttemptAssetText(r,"html");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=aN(o.inflatedPath,r,"html");if(i)try{return Qt.readFileSync(i,"utf-8")}catch{return}}async getA11yTreeSnapshot(e,r){let n=this.readAttemptAssetText(r,"xml");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=aN(o.inflatedPath,r,"xml");if(i)try{return Qt.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,r){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),i=o?br.join(o,"assets",`${r}.jpeg`):void 0;if(i)try{return Qt.readFileSync(i)}catch{return}}};function sN(t){try{return JSON.parse(t)}catch{return}}function rh({test:t,envNameOverride:e,urlOverride:r,resolveEnv:n}){let o=e??E3(t),i,a={};if(o){try{i=n(o)}catch(c){throw new Error(`Failed to resolve environment ${o} for test ${t.name}: ${String(c)}`)}a=i.variables}let s=t.baseUrl;if(r)s=r;else if(!s){let c=a[nr];typeof c=="string"&&(s=c)}if(!s)throw new Error(`Cannot run test with no base URL and no ${nr} variable defined in its environment`);return{envName:o,resolvedEnv:i,environmentVariables:a,baseUrl:s}}function E3(t){for(let e of t.envs??[])if(e.default)return e.name}import nh from"fs";import T3 from"path";var v3=new vg(30,60*1e3),ih="https://api.momentic.ai",YE,cN,ah=t=>{ih=t},er=()=>ih,uN=()=>hl(ih),dN=t=>{cN=t},pN=()=>cN,tc=()=>YE;var ec,XE,oh,sh=async t=>{if(YE&&ec&&oh)return ec;let e=new pt({baseUrl:ih,apiKey:t,logger:v});YE=e;try{let r=await e.getAuthInfo();return ec=r.orgId,XE=r.userId,oh=t,ec}catch(r){throw new Error(`Error checking API key against server: ${r}`)}},zt=()=>{if(!ec)throw new Error("Your organization ID is invalid.");return ec},Lo=()=>{if(!XE)throw new Error("Your user ID is invalid.");return XE},$r=()=>{if(!oh)throw new Error("Your API key is invalid.");return oh},JE,KE,lh=(t,e)=>{JE=t,KE?.abort(),KE=new AbortController;let r=KE.signal,n=[t.configFilePath];t.config.environments?.forEach(o=>{if(!o.envFile)return;let i=T3.resolve(t.rootDir,o.envFile);try{if(nh.lstatSync(i).isSymbolicLink())return;nh.existsSync(i)&&n.push(i)}catch(a){v.warn({err:a},`Failed to check if env file ${i} exists`)}});try{A3({filesToWatch:n,revalidator:e,signal:r,project:t})}catch(o){v.error({err:o},"Failed to start config file watchers")}},fe=()=>JE;function A3({filesToWatch:t,revalidator:e,signal:r,project:n}){v.debug("Starting watch on the following files:"),t.forEach(o=>{v.debug(`- ${o}`)}),t.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(v3.increment("setLocalProject")&&v.warn(`A file change under the ${n.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),JE=await Promise.resolve(e(n.configFilePath)))};nh.watchFile(o,{persistent:!1},i);let a=()=>{nh.unwatchFile(o,i),r.removeEventListener("abort",a)};r.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Fe(t){return function(...e){let r=e[e.length-1],n=t(...e);Promise.resolve(n).catch(r)}}import{hostname as R3}from"os";var C3="2.46.2",ps=yl({app:"desktop-server",hostname:R3(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:C3});(async()=>{try{let t=await ci(ps);t.gitBranchName&&ps.addBinding("branch",t.gitBranchName)}catch{}})();var mN=w3();mN.get("/",async(t,e)=>{let r=fe(),n=tc();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await Ir(ps,n,r),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=pN(),c=!a&&(s||!i);e.status(200).json({saveCaches:c,checkedOutBranch:o?.gitBranchName})});var ZE=mN;import{Router as x3}from"express";import Wr from"fs";import{globSync as _3}from"glob";import sr from"path";var yd=x3();function Sd(t){let e=fe(),r=sr.dirname(e.configFilePath);return sr.join(r,...t)}function I3(t){let e=fe(),r=sr.dirname(e.configFilePath),n=sr.relative(r,t);return n?n.split(sr.sep):[]}function P3(t,e){let r=Wr.statSync(t),n=I3(t);return Ry.parse({name:e,absolutePath:t,relativePath:n.join(sr.sep),pathSegments:n,isDirectory:r.isDirectory(),size:r.size,createdAt:r.birthtime,modifiedAt:r.mtime,accessedAt:r.atime})}yd.post("/",Fe(async(t,e,r)=>{let n;try{n=Ww.parse(t.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Sd(n);if(!Wr.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(sr.sep)}`});return}if(!Wr.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(sr.sep)}`});return}let a=fe(),s=Array.from(a.config.exclude??[]).concat(sm),l=_3("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=sr.join(o,d);return P3(p,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));yd.put("/",Fe(async(t,e,r)=>{let n;try{n=qw.parse(t.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Sd(n);if(Wr.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(sr.sep)}`,pathSegments:n});return}Wr.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(sr.sep)}`,pathSegments:n};e.status(201).json(i)}));yd.patch("/",Fe(async(t,e,r)=>{let n,o;try{let l=Kw.parse(t.body);n=l.pathSegments,o=l.newPathSegments}catch(l){e.status(400).json({error:`Failed to parse folder update body: ${l}`});return}let i=Sd(n),a=Sd(o);if(!Wr.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(sr.sep)}`});return}if(Wr.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(sr.sep)}`});return}let s=sr.dirname(a);Wr.existsSync(s)||Wr.mkdirSync(s,{recursive:!0}),Wr.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(sr.sep)} to ${o.join(sr.sep)}`,pathSegments:o};e.status(200).json(c)}));yd.delete("/",Fe(async(t,e,r)=>{let n,o=!0;try{let c=Yw.parse(t.body);n=c.pathSegments,o=c.recursive??!0}catch(c){e.status(400).json({error:`Failed to parse folder delete body: ${c}`});return}let i=Sd(n);if(!Wr.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(sr.sep)}`,pathSegments:n});return}if(!Wr.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(sr.sep)}`});return}if(o)Wr.rmSync(i,{recursive:!0,force:!0});else{if(Wr.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}Wr.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var QE=yd;import{Router as M3}from"express";var gN=M3();gN.get("/",async(t,e)=>{let r=fe(),n=tc();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await Ir(ps,n,r);e.status(200).json(o)});var eT=gN;import $Z from"events";import iF,{Router as WZ}from"express";import qZ from"http";import KZ from"path";import{Server as H8}from"socket.io";var O3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async()=>{e.info({sessionId:n},"Cancel event received");let o=r.getSession(n);if(!o)throw new Error("No active session found");try{o.controller.setClosed()}catch{}}},hN={event:"cancel",createHandler:O3};var L3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async(o,i)=>{let a=r.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let l=(await s.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:l},"Fetched a11y tree from the browser"),i({a11yTree:l})}catch(c){e.error({err:c},"Error fetching a11y tree from the browser"),i({err:c.message})}}},fN={event:"fetchA11yTree",createHandler:L3};var N3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async(o,i)=>{let a=r.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let c=await s.html();i({html:c})}catch(c){e.error({err:c},"Error fetching DOM from the browser"),c.name==="TimeoutError"?i({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):i({err:c.message})}}},SN={event:"fetchDom",createHandler:N3};var D3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return o=>{e.info({sessionId:n,reason:o},`Disconnect event received (${o})`),r.removeSession(n,e)}},yN={event:"disconnect",createHandler:D3};function Hn(t){let{result:e,nestedResults:r}=t;if(!t.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=k3(r);U3(e,n,o);let i=[...t.asyncTasks];t.asyncTasks.push((async()=>{try{await F3(i,e,n,o)}catch(a){t.logger.error({result:t.result,err:a},"Error hoisting scalar result metadata")}})())}function k3(t){let e=t[0],r;for(;;){switch(e.type){case"PRESET_ACTION":{r=e;break}case"CONDITIONAL":r=t[0];break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":if(!e.results.length){r=e;break}e=e.results[0];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}if(r)break}let n=t[t.length-1],o;for(;;){switch(n.type){case"PRESET_ACTION":{o=n;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":if(!n.results.length){o=n;break}n=n.results[n.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}if(o)break}return{firstMetadata:r,lastMetadata:o}}function U3(t,e,r){e&&(t.beforeUrl=e.beforeUrl),r&&(t.afterUrl=r.afterUrl,t.data=r.data,r.status!=="SUCCESS"&&(t.message=r.message))}async function F3(t,e,r,n){await Promise.allSettled(t),r&&(e.beforeSnapshot=r.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as Y3}from"crypto";import{faker as B3}from"@faker-js/faker";import z3 from"assert";import H3 from"axios";import*as j3 from"child_process";import G3 from"moment";import*as V3 from"otpauth";import $3 from"pg";async function bN(t){let e;try{e=new URL(t.url).hostname}catch{}let r=[];return t.headers.getSetCookie()?.forEach(n=>{let o=Qp(n,e);r.push(...o)}),r}function W3(t,e){if(!t&&!e)return;let r;if(t){let{url:o,options:i}=t;r=new Request(o,i)}let n;if(e){let{body:o,options:i}=e;n=new Response(o??null,i)}return{request:r,response:n}}async function q3(t,e){switch(t){case"RAW":return e;case"RESPONSE":if(e instanceof Response){let r=[];return e.headers.forEach((o,i)=>{r.push([i,o])}),{status:e.status,headers:r,body:await e.text()}}else throw new Error("Result is not a Response object")}}var K3=Object.getPrototypeOf(async function(){}).constructor;async function EN(t,e,r){let n=e.code;e.options.fragment&&(n=`return ${e.code}`);let{env:o,additionalBindings:i,request:a,response:s}=e.bindings,c=e.tools,l={},u=(y,T)=>{o[y]=T,l[y]=T},d={},p=(y,T)=>{o[y]=T,d[y]=T},m;n.includes("Octokit")&&(m=(await import("@octokit/rest")).Octokit);let g;n.includes("createAppAuth")&&(g=(await import("@octokit/auth-app")).createAppAuth);let h=async()=>await Promise.resolve(new K3("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(H3,G3,c.fakerInstance??B3,z3,$3,m,g,V3,j3,bN,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,T=>c.sms.send(T),T=>c.sms.fetchLatest(T),c.email,c.sms,c.ai,W3(a,s),...Object.values(i??{}))),f=!0,S,b;try{let y=await X(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});S=await q3(e.options.responseSerialization??"RAW",y)}catch(y){r.error({err:y,env:o,evalCode:n},`[${t}] Error executing code: ${y}`),f=!1,y instanceof zi?b=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:b=y instanceof Error?y.message:`${y}`}return{result:S,variableUpdates:l,persistentVariableUpdates:d,success:f,error:b}}async function TN({code:t,fragment:e,context:r,localTools:n,logger:o,signal:i,timeoutMs:a=Ui,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=Y3(),p=await EN(d,{code:t,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...r.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return v.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as X3,randomUUID as J3}from"crypto";import Z3 from"fetch-retry";var Q3=Z3(global.fetch,{retries:3,retryOn:function(t,e,r){return!!(e!==null||r&&r.status>=500)},retryDelay:function(t){return Math.pow(2,t)*500}}),vN=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,AN=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function RN({orgId:t,code:e,fragment:r,context:n,timeoutMs:o=Ui,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!vN)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,g=0;if(!AN)throw new Error("Missing lambda auth secret.");let h=X3("sha256",AN).update(t).digest("hex");for(;g<=i;){g++,a?.throwIfAborted();let S={id:J3(),orgId:t,momenticLambdaAuthHash:h,code:e,fragment:r,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await X(Q3(vN,{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(b){m=b}}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 f;try{f=_w.parse(await p.json())}catch(S){throw new Error(`Code evaluation server returned invalid response: ${S}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function ra(t){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await RN(t);else if(t.localTools)e=await TN({...t,localTools:t.localTools});else throw new Error("No code evaluation environment available");if(e.error){let r=`Failed to evaluate code:
|
|
89
|
+
${e}:`]}}function jL({id:t,model:e,created:r}){return{id:t??void 0,modelId:e??void 0,timestamp:r!=null?new Date(r*1e3):void 0}}function GL(t){switch(t){case"stop":return"stop";case"length":return"length";case"content_filter":return"content-filter";case"function_call":case"tool_calls":return"tool-calls";default:return"unknown"}}var o5=bt(()=>me(be.object({id:be.string().nullish(),created:be.number().nullish(),model:be.string().nullish(),choices:be.array(be.object({text:be.string(),finish_reason:be.string(),logprobs:be.object({tokens:be.array(be.string()),token_logprobs:be.array(be.number()),top_logprobs:be.array(be.record(be.string(),be.number())).nullish()}).nullish()})),usage:be.object({prompt_tokens:be.number(),completion_tokens:be.number(),total_tokens:be.number()}).nullish()}))),i5=bt(()=>me(be.union([be.object({id:be.string().nullish(),created:be.number().nullish(),model:be.string().nullish(),choices:be.array(be.object({text:be.string(),finish_reason:be.string().nullish(),index:be.number(),logprobs:be.object({tokens:be.array(be.string()),token_logprobs:be.array(be.number()),top_logprobs:be.array(be.record(be.string(),be.number())).nullish()}).nullish()})),usage:be.object({prompt_tokens:be.number(),completion_tokens:be.number(),total_tokens:be.number()}).nullish()}),HE]))),VL=bt(()=>me(_o.object({echo:_o.boolean().optional(),logitBias:_o.record(_o.string(),_o.number()).optional(),suffix:_o.string().optional(),user:_o.string().optional(),logprobs:_o.union([_o.boolean(),_o.number()]).optional()}))),a5=class{constructor(t,e){this.specificationVersion="v2",this.supportedUrls={},this.modelId=t,this.config=e}get providerOptionsName(){return this.config.provider.split(".")[0].trim()}get provider(){return this.config.provider}async getArgs({prompt:t,maxOutputTokens:e,temperature:r,topP:n,topK:o,frequencyPenalty:i,presencePenalty:a,stopSequences:s,responseFormat:c,tools:l,toolChoice:u,seed:d,providerOptions:p}){let m=[],g={...await Gr({provider:"openai",providerOptions:p,schema:VL}),...await Gr({provider:this.providerOptionsName,providerOptions:p,schema:VL})};o!=null&&m.push({type:"unsupported-setting",setting:"topK"}),l?.length&&m.push({type:"unsupported-setting",setting:"tools"}),u!=null&&m.push({type:"unsupported-setting",setting:"toolChoice"}),c!=null&&c.type!=="text"&&m.push({type:"unsupported-setting",setting:"responseFormat",details:"JSON response format is not supported."});let{prompt:h,stopSequences:f}=n5({prompt:t}),S=[...f??[],...s??[]];return{args:{model:this.modelId,echo:g.echo,logit_bias:g.logitBias,logprobs:g?.logprobs===!0?0:g?.logprobs===!1?void 0:g?.logprobs,suffix:g.suffix,user:g.user,max_tokens:e,temperature:r,top_p:n,frequency_penalty:i,presence_penalty:a,seed:d,prompt:h,stop:S.length>0?S:void 0},warnings:m}}async doGenerate(t){var e,r,n;let{args:o,warnings:i}=await this.getArgs(t),{responseHeaders:a,value:s,rawValue:c}=await Vr({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),body:o,failedResponseHandler:Io,successfulResponseHandler:Bn(o5),abortSignal:t.abortSignal,fetch:this.config.fetch}),l=s.choices[0],u={openai:{}};return l.logprobs!=null&&(u.openai.logprobs=l.logprobs),{content:[{type:"text",text:l.text}],usage:{inputTokens:(e=s.usage)==null?void 0:e.prompt_tokens,outputTokens:(r=s.usage)==null?void 0:r.completion_tokens,totalTokens:(n=s.usage)==null?void 0:n.total_tokens},finishReason:GL(l.finish_reason),request:{body:o},response:{...jL(s),headers:a,body:c},providerMetadata:u,warnings:i}}async doStream(t){let{args:e,warnings:r}=await this.getArgs(t),n={...e,stream:!0,stream_options:{include_usage:!0}},{responseHeaders:o,value:i}=await Vr({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),body:n,failedResponseHandler:Io,successfulResponseHandler:Jl(i5),abortSignal:t.abortSignal,fetch:this.config.fetch}),a="unknown",s={openai:{}},c={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},l=!0;return{stream:i.pipeThrough(new TransformStream({start(u){u.enqueue({type:"stream-start",warnings:r})},transform(u,d){if(t.includeRawChunks&&d.enqueue({type:"raw",rawValue:u.rawValue}),!u.success){a="error",d.enqueue({type:"error",error:u.error});return}let p=u.value;if("error"in p){a="error",d.enqueue({type:"error",error:p.error});return}l&&(l=!1,d.enqueue({type:"response-metadata",...jL(p)}),d.enqueue({type:"text-start",id:"0"})),p.usage!=null&&(c.inputTokens=p.usage.prompt_tokens,c.outputTokens=p.usage.completion_tokens,c.totalTokens=p.usage.total_tokens);let m=p.choices[0];m?.finish_reason!=null&&(a=GL(m.finish_reason)),m?.logprobs!=null&&(s.openai.logprobs=m.logprobs),m?.text!=null&&m.text.length>0&&d.enqueue({type:"text-delta",id:"0",delta:m.text})},flush(u){l||u.enqueue({type:"text-end",id:"0"}),u.enqueue({type:"finish",finishReason:a,providerMetadata:s,usage:c})}})),request:{body:n},response:{headers:o}}}},l5=bt(()=>me(FE.object({dimensions:FE.number().optional(),user:FE.string().optional()}))),c5=bt(()=>me(ds.object({data:ds.array(ds.object({embedding:ds.array(ds.number())})),usage:ds.object({prompt_tokens:ds.number()}).nullish()}))),u5=class{constructor(t,e){this.specificationVersion="v2",this.maxEmbeddingsPerCall=2048,this.supportsParallelCalls=!0,this.modelId=t,this.config=e}get provider(){return this.config.provider}async doEmbed({values:t,headers:e,abortSignal:r,providerOptions:n}){var o;if(t.length>this.maxEmbeddingsPerCall)throw new s5({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:t});let i=(o=await Gr({provider:"openai",providerOptions:n,schema:l5}))!=null?o:{},{responseHeaders:a,value:s,rawValue:c}=await Vr({url:this.config.url({path:"/embeddings",modelId:this.modelId}),headers:Sr(this.config.headers(),e),body:{model:this.modelId,input:t,encoding_format:"float",dimensions:i.dimensions,user:i.user},failedResponseHandler:Io,successfulResponseHandler:Bn(c5),abortSignal:r,fetch:this.config.fetch});return{embeddings:s.data.map(l=>l.embedding),usage:s.usage?{tokens:s.usage.prompt_tokens}:void 0,response:{headers:a,body:c}}}},d5=bt(()=>me(yr.object({created:yr.number().nullish(),data:yr.array(yr.object({b64_json:yr.string(),revised_prompt:yr.string().nullish()})),background:yr.string().nullish(),output_format:yr.string().nullish(),size:yr.string().nullish(),quality:yr.string().nullish(),usage:yr.object({input_tokens:yr.number().nullish(),output_tokens:yr.number().nullish(),total_tokens:yr.number().nullish(),input_tokens_details:yr.object({image_tokens:yr.number().nullish(),text_tokens:yr.number().nullish()}).nullish()}).nullish()}))),p5={"dall-e-3":1,"dall-e-2":10,"gpt-image-1":10,"gpt-image-1-mini":10,"gpt-image-1.5":10},m5=new Set(["gpt-image-1","gpt-image-1-mini","gpt-image-1.5"]),g5=class{constructor(t,e){this.modelId=t,this.config=e,this.specificationVersion="v2"}get maxImagesPerCall(){var t;return(t=p5[this.modelId])!=null?t:1}get provider(){return this.config.provider}async doGenerate({prompt:t,n:e,size:r,aspectRatio:n,seed:o,providerOptions:i,headers:a,abortSignal:s}){var c,l,u,d;let p=[];n!=null&&p.push({type:"unsupported-setting",setting:"aspectRatio",details:"This model does not support aspect ratio. Use `size` instead."}),o!=null&&p.push({type:"unsupported-setting",setting:"seed"});let m=(u=(l=(c=this.config._internal)==null?void 0:c.currentDate)==null?void 0:l.call(c))!=null?u:new Date,{value:g,responseHeaders:h}=await Vr({url:this.config.url({path:"/images/generations",modelId:this.modelId}),headers:Sr(this.config.headers(),a),body:{model:this.modelId,prompt:t,n:e,size:r,...(d=i.openai)!=null?d:{},...m5.has(this.modelId)?{}:{response_format:"b64_json"}},failedResponseHandler:Io,successfulResponseHandler:Bn(d5),abortSignal:s,fetch:this.config.fetch});return{images:g.data.map(f=>f.b64_json),warnings:p,response:{timestamp:m,modelId:this.modelId,headers:h},providerMetadata:{openai:{images:g.data.map(f=>({...f.revised_prompt?{revisedPrompt:f.revised_prompt}:{},...g.created!=null?{created:g.created}:{},...g.size!=null?{size:g.size}:{},...g.quality!=null?{quality:g.quality}:{},...g.background!=null?{background:g.background}:{},...g.output_format!=null?{outputFormat:g.output_format}:{}}))}}}}},h5=Ft(()=>me(ar.object({code:ar.string().nullish(),containerId:ar.string()}))),f5=Ft(()=>me(ar.object({outputs:ar.array(ar.discriminatedUnion("type",[ar.object({type:ar.literal("logs"),logs:ar.string()}),ar.object({type:ar.literal("image"),url:ar.string()})])).nullish()}))),S5=Ft(()=>me(ar.object({container:ar.union([ar.string(),ar.object({fileIds:ar.array(ar.string()).optional()})]).optional()}))),y5=Fn({id:"openai.code_interpreter",name:"code_interpreter",inputSchema:h5,outputSchema:f5}),b5=(t={})=>y5(t),JL=qe.object({key:qe.string(),type:qe.enum(["eq","ne","gt","gte","lt","lte","in","nin"]),value:qe.union([qe.string(),qe.number(),qe.boolean(),qe.array(qe.string())])}),ZL=qe.object({type:qe.enum(["and","or"]),filters:qe.array(qe.union([JL,qe.lazy(()=>ZL)]))}),E5=Ft(()=>me(qe.object({vectorStoreIds:qe.array(qe.string()),maxNumResults:qe.number().optional(),ranking:qe.object({ranker:qe.string().optional(),scoreThreshold:qe.number().optional()}).optional(),filters:qe.union([JL,ZL]).optional()}))),T5=Ft(()=>me(qe.object({queries:qe.array(qe.string()),results:qe.array(qe.object({attributes:qe.record(qe.string(),qe.unknown()),fileId:qe.string(),filename:qe.string(),score:qe.number(),text:qe.string()})).nullable()}))),v5=Fn({id:"openai.file_search",name:"file_search",inputSchema:qe.object({}),outputSchema:T5}),A5=Ft(()=>me(Pr.object({background:Pr.enum(["auto","opaque","transparent"]).optional(),inputFidelity:Pr.enum(["low","high"]).optional(),inputImageMask:Pr.object({fileId:Pr.string().optional(),imageUrl:Pr.string().optional()}).optional(),model:Pr.string().optional(),moderation:Pr.enum(["auto"]).optional(),outputCompression:Pr.number().int().min(0).max(100).optional(),outputFormat:Pr.enum(["png","jpeg","webp"]).optional(),partialImages:Pr.number().int().min(0).max(3).optional(),quality:Pr.enum(["auto","low","medium","high"]).optional(),size:Pr.enum(["1024x1024","1024x1536","1536x1024","auto"]).optional()}).strict())),R5=Ft(()=>me(Pr.object({}))),C5=Ft(()=>me(Pr.object({result:Pr.string()}))),w5=Fn({id:"openai.image_generation",name:"image_generation",inputSchema:R5,outputSchema:C5}),x5=(t={})=>w5(t),QL=Ft(()=>me(pn.object({action:pn.object({type:pn.literal("exec"),command:pn.array(pn.string()),timeoutMs:pn.number().optional(),user:pn.string().optional(),workingDirectory:pn.string().optional(),env:pn.record(pn.string(),pn.string()).optional()})}))),eN=Ft(()=>me(pn.object({output:pn.string()}))),_5=Fn({id:"openai.local_shell",name:"local_shell",inputSchema:QL,outputSchema:eN}),I5=Ft(()=>me(tt.object({externalWebAccess:tt.boolean().optional(),filters:tt.object({allowedDomains:tt.array(tt.string()).optional()}).optional(),searchContextSize:tt.enum(["low","medium","high"]).optional(),userLocation:tt.object({type:tt.literal("approximate"),country:tt.string().optional(),city:tt.string().optional(),region:tt.string().optional(),timezone:tt.string().optional()}).optional()}))),P5=Ft(()=>me(tt.object({}))),M5=Ft(()=>me(tt.object({action:tt.discriminatedUnion("type",[tt.object({type:tt.literal("search"),query:tt.string().optional()}),tt.object({type:tt.literal("openPage"),url:tt.string().nullish()}),tt.object({type:tt.literal("findInPage"),url:tt.string().nullish(),pattern:tt.string().nullish()})]),sources:tt.array(tt.discriminatedUnion("type",[tt.object({type:tt.literal("url"),url:tt.string()}),tt.object({type:tt.literal("api"),name:tt.string()})])).optional()}))),O5=Fn({id:"openai.web_search",name:"web_search",inputSchema:P5,outputSchema:M5}),L5=(t={})=>O5(t),N5=Ft(()=>me($t.object({searchContextSize:$t.enum(["low","medium","high"]).optional(),userLocation:$t.object({type:$t.literal("approximate"),country:$t.string().optional(),city:$t.string().optional(),region:$t.string().optional(),timezone:$t.string().optional()}).optional()}))),D5=Ft(()=>me($t.object({}))),k5=Ft(()=>me($t.object({action:$t.discriminatedUnion("type",[$t.object({type:$t.literal("search"),query:$t.string().optional()}),$t.object({type:$t.literal("openPage"),url:$t.string().nullish()}),$t.object({type:$t.literal("findInPage"),url:$t.string().nullish(),pattern:$t.string().nullish()})])}))),U5=Fn({id:"openai.web_search_preview",name:"web_search_preview",inputSchema:D5,outputSchema:k5}),F5={codeInterpreter:b5,fileSearch:v5,imageGeneration:x5,localShell:_5,webSearchPreview:U5,webSearch:L5};function $L(t,e){return e?e.some(r=>t.startsWith(r)):!1}async function H5({prompt:t,systemMessageMode:e,fileIdPrefixes:r,store:n,hasLocalShellTool:o=!1}){var i,a,s,c;let l=[],u=[];for(let{role:d,content:p}of t)switch(d){case"system":{switch(e){case"system":{l.push({role:"system",content:p});break}case"developer":{l.push({role:"developer",content:p});break}case"remove":{u.push({type:"other",message:"system messages are removed for this model"});break}default:{let m=e;throw new Error(`Unsupported system message mode: ${m}`)}}break}case"user":{l.push({role:"user",content:p.map((m,g)=>{var h,f,S;switch(m.type){case"text":return{type:"input_text",text:m.text};case"file":if(m.mediaType.startsWith("image/")){let b=m.mediaType==="image/*"?"image/jpeg":m.mediaType;return{type:"input_image",...m.data instanceof URL?{image_url:m.data.toString()}:typeof m.data=="string"&&$L(m.data,r)?{file_id:m.data}:{image_url:`data:${b};base64,${Zi(m.data)}`},detail:(f=(h=m.providerOptions)==null?void 0:h.openai)==null?void 0:f.imageDetail}}else{if(m.mediaType==="application/pdf")return m.data instanceof URL?{type:"input_file",file_url:m.data.toString()}:{type:"input_file",...typeof m.data=="string"&&$L(m.data,r)?{file_id:m.data}:{filename:(S=m.filename)!=null?S:`part-${g}.pdf`,file_data:`data:application/pdf;base64,${Zi(m.data)}`}};throw new z5({functionality:`file part media type ${m.mediaType}`})}}})});break}case"assistant":{let m={},g={};for(let h of p)switch(h.type){case"text":{let f=(a=(i=h.providerOptions)==null?void 0:i.openai)==null?void 0:a.itemId;if(n&&f!=null){l.push({type:"item_reference",id:f});break}l.push({role:"assistant",content:[{type:"output_text",text:h.text}],id:f});break}case"tool-call":{if(g[h.toolCallId]=h,h.providerExecuted)break;let f=(c=(s=h.providerOptions)==null?void 0:s.openai)==null?void 0:c.itemId;if(n&&f!=null){l.push({type:"item_reference",id:f});break}if(o&&h.toolName==="local_shell"){let S=await xo({value:h.input,schema:QL});l.push({type:"local_shell_call",call_id:h.toolCallId,id:f,action:{type:"exec",command:S.action.command,timeout_ms:S.action.timeoutMs,user:S.action.user,working_directory:S.action.workingDirectory,env:S.action.env}});break}l.push({type:"function_call",call_id:h.toolCallId,name:h.toolName,arguments:JSON.stringify(h.input),id:f});break}case"tool-result":{n?l.push({type:"item_reference",id:h.toolCallId}):u.push({type:"other",message:`Results for OpenAI tool ${h.toolName} are not sent to the API when store is false`});break}case"reasoning":{let f=await Gr({provider:"openai",providerOptions:h.providerOptions,schema:j5}),S=f?.itemId;if(S!=null){let b=m[S];if(n)b===void 0&&(l.push({type:"item_reference",id:S}),m[S]={type:"reasoning",id:S,summary:[]});else{let y=[];h.text.length>0?y.push({type:"summary_text",text:h.text}):b!==void 0&&u.push({type:"other",message:`Cannot append empty reasoning part to existing reasoning sequence. Skipping reasoning part: ${JSON.stringify(h)}.`}),b===void 0?(m[S]={type:"reasoning",id:S,encrypted_content:f?.reasoningEncryptedContent,summary:y},l.push(m[S])):(b.summary.push(...y),f?.reasoningEncryptedContent!=null&&(b.encrypted_content=f.reasoningEncryptedContent))}}else u.push({type:"other",message:`Non-OpenAI reasoning parts are not supported. Skipping reasoning part: ${JSON.stringify(h)}.`});break}}break}case"tool":{for(let m of p){let g=m.output;if(o&&m.toolName==="local_shell"&&g.type==="json"){let f=await xo({value:g.value,schema:eN});l.push({type:"local_shell_call_output",call_id:m.toolCallId,output:f.output});break}let h;switch(g.type){case"text":case"error-text":h=g.value;break;case"json":case"error-json":h=JSON.stringify(g.value);break;case"content":h=g.value.map(f=>{switch(f.type){case"text":return{type:"input_text",text:f.text};case"media":return f.mediaType.startsWith("image/")?{type:"input_image",image_url:`data:${f.mediaType};base64,${f.data}`}:{type:"input_file",filename:"data",file_data:`data:${f.mediaType};base64,${f.data}`}}});break}l.push({type:"function_call_output",call_id:m.toolCallId,output:h})}break}default:{let m=d;throw new Error(`Unsupported role: ${m}`)}}return{input:l,warnings:u}}var j5=BE.object({itemId:BE.string().nullish(),reasoningEncryptedContent:BE.string().nullish()});function WL({finishReason:t,hasFunctionCall:e}){switch(t){case void 0:case null:return e?"tool-calls":"stop";case"max_output_tokens":return"length";case"content_filter":return"content-filter";default:return e?"tool-calls":"unknown"}}var G5=bt(()=>me(E.union([E.object({type:E.literal("response.output_text.delta"),item_id:E.string(),delta:E.string(),logprobs:E.array(E.object({token:E.string(),logprob:E.number(),top_logprobs:E.array(E.object({token:E.string(),logprob:E.number()}))})).nullish()}),E.object({type:E.enum(["response.completed","response.incomplete"]),response:E.object({incomplete_details:E.object({reason:E.string()}).nullish(),usage:E.object({input_tokens:E.number(),input_tokens_details:E.object({cached_tokens:E.number().nullish()}).nullish(),output_tokens:E.number(),output_tokens_details:E.object({reasoning_tokens:E.number().nullish()}).nullish()}),service_tier:E.string().nullish()})}),E.object({type:E.literal("response.created"),response:E.object({id:E.string(),created_at:E.number(),model:E.string(),service_tier:E.string().nullish()})}),E.object({type:E.literal("response.output_item.added"),output_index:E.number(),item:E.discriminatedUnion("type",[E.object({type:E.literal("message"),id:E.string()}),E.object({type:E.literal("reasoning"),id:E.string(),encrypted_content:E.string().nullish()}),E.object({type:E.literal("function_call"),id:E.string(),call_id:E.string(),name:E.string(),arguments:E.string()}),E.object({type:E.literal("web_search_call"),id:E.string(),status:E.string()}),E.object({type:E.literal("computer_call"),id:E.string(),status:E.string()}),E.object({type:E.literal("file_search_call"),id:E.string()}),E.object({type:E.literal("image_generation_call"),id:E.string()}),E.object({type:E.literal("code_interpreter_call"),id:E.string(),container_id:E.string(),code:E.string().nullable(),outputs:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("logs"),logs:E.string()}),E.object({type:E.literal("image"),url:E.string()})])).nullable(),status:E.string()})])}),E.object({type:E.literal("response.output_item.done"),output_index:E.number(),item:E.discriminatedUnion("type",[E.object({type:E.literal("message"),id:E.string()}),E.object({type:E.literal("reasoning"),id:E.string(),encrypted_content:E.string().nullish()}),E.object({type:E.literal("function_call"),id:E.string(),call_id:E.string(),name:E.string(),arguments:E.string(),status:E.literal("completed")}),E.object({type:E.literal("code_interpreter_call"),id:E.string(),code:E.string().nullable(),container_id:E.string(),outputs:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("logs"),logs:E.string()}),E.object({type:E.literal("image"),url:E.string()})])).nullable()}),E.object({type:E.literal("image_generation_call"),id:E.string(),result:E.string()}),E.object({type:E.literal("web_search_call"),id:E.string(),status:E.string(),action:E.discriminatedUnion("type",[E.object({type:E.literal("search"),query:E.string().nullish(),sources:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("url"),url:E.string()}),E.object({type:E.literal("api"),name:E.string()})])).nullish()}),E.object({type:E.literal("open_page"),url:E.string().nullish()}),E.object({type:E.literal("find_in_page"),url:E.string().nullish(),pattern:E.string().nullish()})])}),E.object({type:E.literal("file_search_call"),id:E.string(),queries:E.array(E.string()),results:E.array(E.object({attributes:E.record(E.string(),E.unknown()),file_id:E.string(),filename:E.string(),score:E.number(),text:E.string()})).nullish()}),E.object({type:E.literal("local_shell_call"),id:E.string(),call_id:E.string(),action:E.object({type:E.literal("exec"),command:E.array(E.string()),timeout_ms:E.number().optional(),user:E.string().optional(),working_directory:E.string().optional(),env:E.record(E.string(),E.string()).optional()})}),E.object({type:E.literal("computer_call"),id:E.string(),status:E.literal("completed")})])}),E.object({type:E.literal("response.function_call_arguments.delta"),item_id:E.string(),output_index:E.number(),delta:E.string()}),E.object({type:E.literal("response.image_generation_call.partial_image"),item_id:E.string(),output_index:E.number(),partial_image_b64:E.string()}),E.object({type:E.literal("response.code_interpreter_call_code.delta"),item_id:E.string(),output_index:E.number(),delta:E.string()}),E.object({type:E.literal("response.code_interpreter_call_code.done"),item_id:E.string(),output_index:E.number(),code:E.string()}),E.object({type:E.literal("response.output_text.annotation.added"),annotation:E.discriminatedUnion("type",[E.object({type:E.literal("url_citation"),start_index:E.number(),end_index:E.number(),url:E.string(),title:E.string()}),E.object({type:E.literal("file_citation"),file_id:E.string(),filename:E.string().nullish(),index:E.number().nullish(),start_index:E.number().nullish(),end_index:E.number().nullish(),quote:E.string().nullish()})])}),E.object({type:E.literal("response.reasoning_summary_part.added"),item_id:E.string(),summary_index:E.number()}),E.object({type:E.literal("response.reasoning_summary_text.delta"),item_id:E.string(),summary_index:E.number(),delta:E.string()}),E.object({type:E.literal("response.reasoning_summary_part.done"),item_id:E.string(),summary_index:E.number()}),E.object({type:E.literal("error"),sequence_number:E.number(),error:E.object({type:E.string(),code:E.string(),message:E.string(),param:E.string().nullish()})}),E.object({type:E.string()}).loose().transform(t=>({type:"unknown_chunk",message:t.type}))]))),V5=bt(()=>me(E.object({id:E.string().optional(),created_at:E.number().optional(),error:E.object({message:E.string(),type:E.string(),param:E.string().nullish(),code:E.string()}).nullish(),model:E.string().optional(),output:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("message"),role:E.literal("assistant"),id:E.string(),content:E.array(E.object({type:E.literal("output_text"),text:E.string(),logprobs:E.array(E.object({token:E.string(),logprob:E.number(),top_logprobs:E.array(E.object({token:E.string(),logprob:E.number()}))})).nullish(),annotations:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("url_citation"),start_index:E.number(),end_index:E.number(),url:E.string(),title:E.string()}),E.object({type:E.literal("file_citation"),file_id:E.string(),filename:E.string().nullish(),index:E.number().nullish(),start_index:E.number().nullish(),end_index:E.number().nullish(),quote:E.string().nullish()}),E.object({type:E.literal("container_file_citation"),container_id:E.string(),file_id:E.string(),filename:E.string().nullish(),start_index:E.number().nullish(),end_index:E.number().nullish(),index:E.number().nullish()}),E.object({type:E.literal("file_path"),file_id:E.string(),index:E.number().nullish()})]))}))}),E.object({type:E.literal("web_search_call"),id:E.string(),status:E.string(),action:E.discriminatedUnion("type",[E.object({type:E.literal("search"),query:E.string().nullish(),sources:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("url"),url:E.string()}),E.object({type:E.literal("api"),name:E.string()})])).nullish()}),E.object({type:E.literal("open_page"),url:E.string().nullish()}),E.object({type:E.literal("find_in_page"),url:E.string().nullish(),pattern:E.string().nullish()})])}),E.object({type:E.literal("file_search_call"),id:E.string(),queries:E.array(E.string()),results:E.array(E.object({attributes:E.record(E.string(),E.union([E.string(),E.number(),E.boolean()])),file_id:E.string(),filename:E.string(),score:E.number(),text:E.string()})).nullish()}),E.object({type:E.literal("code_interpreter_call"),id:E.string(),code:E.string().nullable(),container_id:E.string(),outputs:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("logs"),logs:E.string()}),E.object({type:E.literal("image"),url:E.string()})])).nullable()}),E.object({type:E.literal("image_generation_call"),id:E.string(),result:E.string()}),E.object({type:E.literal("local_shell_call"),id:E.string(),call_id:E.string(),action:E.object({type:E.literal("exec"),command:E.array(E.string()),timeout_ms:E.number().optional(),user:E.string().optional(),working_directory:E.string().optional(),env:E.record(E.string(),E.string()).optional()})}),E.object({type:E.literal("function_call"),call_id:E.string(),name:E.string(),arguments:E.string(),id:E.string()}),E.object({type:E.literal("computer_call"),id:E.string(),status:E.string().optional()}),E.object({type:E.literal("reasoning"),id:E.string(),encrypted_content:E.string().nullish(),summary:E.array(E.object({type:E.literal("summary_text"),text:E.string()}))})])).optional(),service_tier:E.string().nullish(),incomplete_details:E.object({reason:E.string()}).nullish(),usage:E.object({input_tokens:E.number(),input_tokens_details:E.object({cached_tokens:E.number().nullish()}).nullish(),output_tokens:E.number(),output_tokens_details:E.object({reasoning_tokens:E.number().nullish()}).nullish()}).optional()}))),tN=20,$5=["o1","o1-2024-12-17","o3","o3-2025-04-16","o3-deep-research","o3-deep-research-2025-06-26","o3-mini","o3-mini-2025-01-31","o4-mini","o4-mini-2025-04-16","o4-mini-deep-research","o4-mini-deep-research-2025-06-26","codex-mini-latest","computer-use-preview","gpt-5","gpt-5-2025-08-07","gpt-5-codex","gpt-5-mini","gpt-5-mini-2025-08-07","gpt-5-nano","gpt-5-nano-2025-08-07","gpt-5-pro","gpt-5-pro-2025-10-06","gpt-5.1","gpt-5.1-chat-latest","gpt-5.1-codex-mini","gpt-5.1-codex","gpt-5.1-codex-max","gpt-5.2","gpt-5.2-chat-latest","gpt-5.2-pro"],Rje=["gpt-4.1","gpt-4.1-2025-04-14","gpt-4.1-mini","gpt-4.1-mini-2025-04-14","gpt-4.1-nano","gpt-4.1-nano-2025-04-14","gpt-4o","gpt-4o-2024-05-13","gpt-4o-2024-08-06","gpt-4o-2024-11-20","gpt-4o-audio-preview","gpt-4o-audio-preview-2024-10-01","gpt-4o-audio-preview-2024-12-17","gpt-4o-search-preview","gpt-4o-search-preview-2025-03-11","gpt-4o-mini-search-preview","gpt-4o-mini-search-preview-2025-03-11","gpt-4o-mini","gpt-4o-mini-2024-07-18","gpt-4-turbo","gpt-4-turbo-2024-04-09","gpt-4-turbo-preview","gpt-4-0125-preview","gpt-4-1106-preview","gpt-4","gpt-4-0613","gpt-4.5-preview","gpt-4.5-preview-2025-02-27","gpt-3.5-turbo-0125","gpt-3.5-turbo","gpt-3.5-turbo-1106","chatgpt-4o-latest","gpt-5-chat-latest",...$5],W5=bt(()=>me(Dt.object({conversation:Dt.string().nullish(),include:Dt.array(Dt.enum(["reasoning.encrypted_content","file_search_call.results","message.output_text.logprobs"])).nullish(),instructions:Dt.string().nullish(),logprobs:Dt.union([Dt.boolean(),Dt.number().min(1).max(tN)]).optional(),maxToolCalls:Dt.number().nullish(),metadata:Dt.any().nullish(),parallelToolCalls:Dt.boolean().nullish(),previousResponseId:Dt.string().nullish(),promptCacheKey:Dt.string().nullish(),promptCacheRetention:Dt.enum(["in_memory","24h"]).nullish(),reasoningEffort:Dt.string().nullish(),reasoningSummary:Dt.string().nullish(),safetyIdentifier:Dt.string().nullish(),serviceTier:Dt.enum(["auto","flex","priority","default"]).nullish(),store:Dt.boolean().nullish(),strictJsonSchema:Dt.boolean().nullish(),textVerbosity:Dt.enum(["low","medium","high"]).nullish(),truncation:Dt.enum(["auto","disabled"]).nullish(),user:Dt.string().nullish()})));async function K5({tools:t,toolChoice:e,strictJsonSchema:r}){t=t?.length?t:void 0;let n=[];if(t==null)return{tools:void 0,toolChoice:void 0,toolWarnings:n};let o=[];for(let a of t)switch(a.type){case"function":o.push({type:"function",name:a.name,description:a.description,parameters:a.inputSchema,strict:r});break;case"provider-defined":{switch(a.id){case"openai.file_search":{let s=await xo({value:a.args,schema:E5});o.push({type:"file_search",vector_store_ids:s.vectorStoreIds,max_num_results:s.maxNumResults,ranking_options:s.ranking?{ranker:s.ranking.ranker,score_threshold:s.ranking.scoreThreshold}:void 0,filters:s.filters});break}case"openai.local_shell":{o.push({type:"local_shell"});break}case"openai.web_search_preview":{let s=await xo({value:a.args,schema:N5});o.push({type:"web_search_preview",search_context_size:s.searchContextSize,user_location:s.userLocation});break}case"openai.web_search":{let s=await xo({value:a.args,schema:I5});o.push({type:"web_search",filters:s.filters!=null?{allowed_domains:s.filters.allowedDomains}:void 0,external_web_access:s.externalWebAccess,search_context_size:s.searchContextSize,user_location:s.userLocation});break}case"openai.code_interpreter":{let s=await xo({value:a.args,schema:S5});o.push({type:"code_interpreter",container:s.container==null?{type:"auto",file_ids:void 0}:typeof s.container=="string"?s.container:{type:"auto",file_ids:s.container.fileIds}});break}case"openai.image_generation":{let s=await xo({value:a.args,schema:A5});o.push({type:"image_generation",background:s.background,input_fidelity:s.inputFidelity,input_image_mask:s.inputImageMask?{file_id:s.inputImageMask.fileId,image_url:s.inputImageMask.imageUrl}:void 0,model:s.model,size:s.size,quality:s.quality,moderation:s.moderation,output_format:s.outputFormat,output_compression:s.outputCompression});break}}break}default:n.push({type:"unsupported-tool",tool:a});break}if(e==null)return{tools:o,toolChoice:void 0,toolWarnings:n};let i=e.type;switch(i){case"auto":case"none":case"required":return{tools:o,toolChoice:i,toolWarnings:n};case"tool":return{tools:o,toolChoice:e.toolName==="code_interpreter"||e.toolName==="file_search"||e.toolName==="image_generation"||e.toolName==="web_search_preview"||e.toolName==="web_search"?{type:e.toolName}:{type:"function",name:e.toolName},toolWarnings:n};default:{let a=i;throw new q5({functionality:`tool choice type: ${a}`})}}}var Y5=class{constructor(t,e){this.specificationVersion="v2",this.supportedUrls={"image/*":[/^https?:\/\/.*$/],"application/pdf":[/^https?:\/\/.*$/]},this.modelId=t,this.config=e}get provider(){return this.config.provider}async getArgs({maxOutputTokens:t,temperature:e,stopSequences:r,topP:n,topK:o,presencePenalty:i,frequencyPenalty:a,seed:s,prompt:c,providerOptions:l,tools:u,toolChoice:d,responseFormat:p}){var m,g,h,f;let S=[],b=XL(this.modelId);o!=null&&S.push({type:"unsupported-setting",setting:"topK"}),s!=null&&S.push({type:"unsupported-setting",setting:"seed"}),i!=null&&S.push({type:"unsupported-setting",setting:"presencePenalty"}),a!=null&&S.push({type:"unsupported-setting",setting:"frequencyPenalty"}),r!=null&&S.push({type:"unsupported-setting",setting:"stopSequences"});let y=await Gr({provider:"openai",providerOptions:l,schema:W5});y?.conversation&&y?.previousResponseId&&S.push({type:"unsupported-setting",setting:"conversation",details:"conversation and previousResponseId cannot be used together"});let{input:T,warnings:w}=await H5({prompt:c,systemMessageMode:b.systemMessageMode,fileIdPrefixes:this.config.fileIdPrefixes,store:(m=y?.store)!=null?m:!0,hasLocalShellTool:O("openai.local_shell")});S.push(...w);let P=(g=y?.strictJsonSchema)!=null?g:!1,A=y?.include;function x(z){A==null?A=[z]:A.includes(z)||(A=[...A,z])}function O(z){return u?.find(ae=>ae.type==="provider-defined"&&ae.id===z)!=null}let L=typeof y?.logprobs=="number"?y?.logprobs:y?.logprobs===!0?tN:void 0;L&&x("message.output_text.logprobs");let N=(h=u?.find(z=>z.type==="provider-defined"&&(z.id==="openai.web_search"||z.id==="openai.web_search_preview")))==null?void 0:h.name;N&&x("web_search_call.action.sources"),O("openai.code_interpreter")&&x("code_interpreter_call.outputs");let j=y?.store;j===!1&&b.isReasoningModel&&x("reasoning.encrypted_content");let W={model:this.modelId,input:T,temperature:e,top_p:n,max_output_tokens:t,...(p?.type==="json"||y?.textVerbosity)&&{text:{...p?.type==="json"&&{format:p.schema!=null?{type:"json_schema",strict:P,name:(f=p.name)!=null?f:"response",description:p.description,schema:p.schema}:{type:"json_object"}},...y?.textVerbosity&&{verbosity:y.textVerbosity}}},conversation:y?.conversation,max_tool_calls:y?.maxToolCalls,metadata:y?.metadata,parallel_tool_calls:y?.parallelToolCalls,previous_response_id:y?.previousResponseId,store:j,user:y?.user,instructions:y?.instructions,service_tier:y?.serviceTier,include:A,prompt_cache_key:y?.promptCacheKey,prompt_cache_retention:y?.promptCacheRetention,safety_identifier:y?.safetyIdentifier,top_logprobs:L,truncation:y?.truncation,...b.isReasoningModel&&(y?.reasoningEffort!=null||y?.reasoningSummary!=null)&&{reasoning:{...y?.reasoningEffort!=null&&{effort:y.reasoningEffort},...y?.reasoningSummary!=null&&{summary:y.reasoningSummary}}}};b.isReasoningModel?y?.reasoningEffort==="none"&&b.supportsNonReasoningParameters||(W.temperature!=null&&(W.temperature=void 0,S.push({type:"unsupported-setting",setting:"temperature",details:"temperature is not supported for reasoning models"})),W.top_p!=null&&(W.top_p=void 0,S.push({type:"unsupported-setting",setting:"topP",details:"topP is not supported for reasoning models"}))):(y?.reasoningEffort!=null&&S.push({type:"unsupported-setting",setting:"reasoningEffort",details:"reasoningEffort is not supported for non-reasoning models"}),y?.reasoningSummary!=null&&S.push({type:"unsupported-setting",setting:"reasoningSummary",details:"reasoningSummary is not supported for non-reasoning models"})),y?.serviceTier==="flex"&&!b.supportsFlexProcessing&&(S.push({type:"unsupported-setting",setting:"serviceTier",details:"flex processing is only available for o3, o4-mini, and gpt-5 models"}),delete W.service_tier),y?.serviceTier==="priority"&&!b.supportsPriorityProcessing&&(S.push({type:"unsupported-setting",setting:"serviceTier",details:"priority processing is only available for supported models (gpt-4, gpt-5, gpt-5-mini, o3, o4-mini) and requires Enterprise access. gpt-5-nano is not supported"}),delete W.service_tier);let{tools:B,toolChoice:xe,toolWarnings:F}=await K5({tools:u,toolChoice:d,strictJsonSchema:P});return{webSearchToolName:N,args:{...W,tools:B,tool_choice:xe},warnings:[...S,...F],store:j}}async doGenerate(t){var e,r,n,o,i,a,s,c,l,u,d,p,m,g,h,f,S,b,y,T,w,P,A,x,O,L,N,j;let{args:W,warnings:B,webSearchToolName:xe}=await this.getArgs(t),F=this.config.url({path:"/responses",modelId:this.modelId}),z=this.config.provider.replace(".responses",""),{responseHeaders:ae,value:ue,rawValue:_e}=await Vr({url:F,headers:Sr(this.config.headers(),t.headers),body:W,failedResponseHandler:Io,successfulResponseHandler:Bn(V5),abortSignal:t.abortSignal,fetch:this.config.fetch});if(ue.error)throw new B5({message:ue.error.message,url:F,requestBodyValues:W,statusCode:400,responseHeaders:ae,responseBody:_e,isRetryable:!1});let Se=[],le=[],Q=!1;for(let I of ue.output)switch(I.type){case"reasoning":{I.summary.length===0&&I.summary.push({type:"summary_text",text:""});for(let oe of I.summary)Se.push({type:"reasoning",text:oe.text,providerMetadata:{[z]:{itemId:I.id,reasoningEncryptedContent:(e=I.encrypted_content)!=null?e:null}}});break}case"image_generation_call":{Se.push({type:"tool-call",toolCallId:I.id,toolName:"image_generation",input:"{}",providerExecuted:!0}),Se.push({type:"tool-result",toolCallId:I.id,toolName:"image_generation",result:{result:I.result},providerExecuted:!0});break}case"local_shell_call":{Se.push({type:"tool-call",toolCallId:I.call_id,toolName:"local_shell",input:JSON.stringify({action:I.action}),providerMetadata:{[z]:{itemId:I.id}}});break}case"message":{for(let oe of I.content){(n=(r=t.providerOptions)==null?void 0:r.openai)!=null&&n.logprobs&&oe.logprobs&&le.push(oe.logprobs),Se.push({type:"text",text:oe.text,providerMetadata:{[z]:{itemId:I.id}}});for(let ge of oe.annotations)ge.type==="url_citation"?Se.push({type:"source",sourceType:"url",id:(a=(i=(o=this.config).generateId)==null?void 0:i.call(o))!=null?a:dn(),url:ge.url,title:ge.title}):ge.type==="file_citation"?Se.push({type:"source",sourceType:"document",id:(l=(c=(s=this.config).generateId)==null?void 0:c.call(s))!=null?l:dn(),mediaType:"text/plain",title:(d=(u=ge.quote)!=null?u:ge.filename)!=null?d:"Document",filename:(p=ge.filename)!=null?p:ge.file_id,...ge.file_id?{providerMetadata:{[z]:{fileId:ge.file_id}}}:{}}):ge.type==="container_file_citation"?Se.push({type:"source",sourceType:"document",id:(h=(g=(m=this.config).generateId)==null?void 0:g.call(m))!=null?h:dn(),mediaType:"text/plain",title:(S=(f=ge.filename)!=null?f:ge.file_id)!=null?S:"Document",filename:(b=ge.filename)!=null?b:ge.file_id,providerMetadata:{[z]:{fileId:ge.file_id,containerId:ge.container_id,...ge.index!=null?{index:ge.index}:{}}}}):ge.type==="file_path"&&Se.push({type:"source",sourceType:"document",id:(w=(T=(y=this.config).generateId)==null?void 0:T.call(y))!=null?w:dn(),mediaType:"application/octet-stream",title:ge.file_id,filename:ge.file_id,providerMetadata:{[z]:{fileId:ge.file_id,...ge.index!=null?{index:ge.index}:{}}}})}break}case"function_call":{Q=!0,Se.push({type:"tool-call",toolCallId:I.call_id,toolName:I.name,input:I.arguments,providerMetadata:{[z]:{itemId:I.id}}});break}case"web_search_call":{Se.push({type:"tool-call",toolCallId:I.id,toolName:xe??"web_search",input:JSON.stringify({}),providerExecuted:!0}),Se.push({type:"tool-result",toolCallId:I.id,toolName:xe??"web_search",result:KL(I.action),providerExecuted:!0});break}case"computer_call":{Se.push({type:"tool-call",toolCallId:I.id,toolName:"computer_use",input:"",providerExecuted:!0}),Se.push({type:"tool-result",toolCallId:I.id,toolName:"computer_use",result:{type:"computer_use_tool_result",status:I.status||"completed"},providerExecuted:!0});break}case"file_search_call":{Se.push({type:"tool-call",toolCallId:I.id,toolName:"file_search",input:"{}",providerExecuted:!0}),Se.push({type:"tool-result",toolCallId:I.id,toolName:"file_search",result:{queries:I.queries,results:(A=(P=I.results)==null?void 0:P.map(oe=>({attributes:oe.attributes,fileId:oe.file_id,filename:oe.filename,score:oe.score,text:oe.text})))!=null?A:null},providerExecuted:!0});break}case"code_interpreter_call":{Se.push({type:"tool-call",toolCallId:I.id,toolName:"code_interpreter",input:JSON.stringify({code:I.code,containerId:I.container_id}),providerExecuted:!0}),Se.push({type:"tool-result",toolCallId:I.id,toolName:"code_interpreter",result:{outputs:I.outputs},providerExecuted:!0});break}}let Te={[z]:{...ue.id!=null?{responseId:ue.id}:{}}};le.length>0&&(Te[z].logprobs=le),typeof ue.service_tier=="string"&&(Te[z].serviceTier=ue.service_tier);let Ae=ue.usage;return{content:Se,finishReason:WL({finishReason:(x=ue.incomplete_details)==null?void 0:x.reason,hasFunctionCall:Q}),usage:{inputTokens:Ae.input_tokens,outputTokens:Ae.output_tokens,totalTokens:Ae.input_tokens+Ae.output_tokens,reasoningTokens:(L=(O=Ae.output_tokens_details)==null?void 0:O.reasoning_tokens)!=null?L:void 0,cachedInputTokens:(j=(N=Ae.input_tokens_details)==null?void 0:N.cached_tokens)!=null?j:void 0},request:{body:W},response:{id:ue.id,timestamp:new Date(ue.created_at*1e3),modelId:ue.model,headers:ae,body:_e},providerMetadata:Te,warnings:B}}async doStream(t){let{args:e,warnings:r,webSearchToolName:n,store:o}=await this.getArgs(t),{responseHeaders:i,value:a}=await Vr({url:this.config.url({path:"/responses",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),body:{...e,stream:!0},failedResponseHandler:Io,successfulResponseHandler:Jl(G5),abortSignal:t.abortSignal,fetch:this.config.fetch}),s=this,c=this.config.provider.replace(".responses",""),l="unknown",u={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},d=[],p=null,m={},g=[],h=!1,f={},S;return{stream:a.pipeThrough(new TransformStream({start(b){b.enqueue({type:"stream-start",warnings:r})},transform(b,y){var T,w,P,A,x,O,L,N,j,W,B,xe,F,z,ae,ue,_e,Se,le,Q,Te,Ae;if(t.includeRawChunks&&y.enqueue({type:"raw",rawValue:b.rawValue}),!b.success){l="error",y.enqueue({type:"error",error:b.error});return}let I=b.value;if(qL(I))I.item.type==="function_call"?(m[I.output_index]={toolName:I.item.name,toolCallId:I.item.call_id},y.enqueue({type:"tool-input-start",id:I.item.call_id,toolName:I.item.name})):I.item.type==="web_search_call"?(m[I.output_index]={toolName:n??"web_search",toolCallId:I.item.id},y.enqueue({type:"tool-input-start",id:I.item.id,toolName:n??"web_search",providerExecuted:!0}),y.enqueue({type:"tool-input-end",id:I.item.id}),y.enqueue({type:"tool-call",toolCallId:I.item.id,toolName:n??"web_search",input:JSON.stringify({}),providerExecuted:!0})):I.item.type==="computer_call"?(m[I.output_index]={toolName:"computer_use",toolCallId:I.item.id},y.enqueue({type:"tool-input-start",id:I.item.id,toolName:"computer_use",providerExecuted:!0})):I.item.type==="code_interpreter_call"?(m[I.output_index]={toolName:"code_interpreter",toolCallId:I.item.id,codeInterpreter:{containerId:I.item.container_id}},y.enqueue({type:"tool-input-start",id:I.item.id,toolName:"code_interpreter",providerExecuted:!0}),y.enqueue({type:"tool-input-delta",id:I.item.id,delta:`{"containerId":"${I.item.container_id}","code":"`})):I.item.type==="file_search_call"?y.enqueue({type:"tool-call",toolCallId:I.item.id,toolName:"file_search",input:"{}",providerExecuted:!0}):I.item.type==="image_generation_call"?y.enqueue({type:"tool-call",toolCallId:I.item.id,toolName:"image_generation",input:"{}",providerExecuted:!0}):I.item.type==="message"?(g.splice(0,g.length),y.enqueue({type:"text-start",id:I.item.id,providerMetadata:{[c]:{itemId:I.item.id}}})):qL(I)&&I.item.type==="reasoning"&&(f[I.item.id]={encryptedContent:I.item.encrypted_content,summaryParts:{0:"active"}},y.enqueue({type:"reasoning-start",id:`${I.item.id}:0`,providerMetadata:{[c]:{itemId:I.item.id,reasoningEncryptedContent:(T=I.item.encrypted_content)!=null?T:null}}}));else if(J5(I)){if(I.item.type==="message")y.enqueue({type:"text-end",id:I.item.id,providerMetadata:{[c]:{itemId:I.item.id,...g.length>0&&{annotations:g}}}});else if(I.item.type==="function_call")m[I.output_index]=void 0,h=!0,y.enqueue({type:"tool-input-end",id:I.item.call_id}),y.enqueue({type:"tool-call",toolCallId:I.item.call_id,toolName:I.item.name,input:I.item.arguments,providerMetadata:{[c]:{itemId:I.item.id}}});else if(I.item.type==="web_search_call")m[I.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:I.item.id,toolName:n??"web_search",result:KL(I.item.action),providerExecuted:!0});else if(I.item.type==="computer_call")m[I.output_index]=void 0,y.enqueue({type:"tool-input-end",id:I.item.id}),y.enqueue({type:"tool-call",toolCallId:I.item.id,toolName:"computer_use",input:"",providerExecuted:!0}),y.enqueue({type:"tool-result",toolCallId:I.item.id,toolName:"computer_use",result:{type:"computer_use_tool_result",status:I.item.status||"completed"},providerExecuted:!0});else if(I.item.type==="file_search_call")m[I.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:I.item.id,toolName:"file_search",result:{queries:I.item.queries,results:(P=(w=I.item.results)==null?void 0:w.map(oe=>({attributes:oe.attributes,fileId:oe.file_id,filename:oe.filename,score:oe.score,text:oe.text})))!=null?P:null},providerExecuted:!0});else if(I.item.type==="code_interpreter_call")m[I.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:I.item.id,toolName:"code_interpreter",result:{outputs:I.item.outputs},providerExecuted:!0});else if(I.item.type==="image_generation_call")y.enqueue({type:"tool-result",toolCallId:I.item.id,toolName:"image_generation",result:{result:I.item.result},providerExecuted:!0});else if(I.item.type==="local_shell_call")m[I.output_index]=void 0,y.enqueue({type:"tool-call",toolCallId:I.item.call_id,toolName:"local_shell",input:JSON.stringify({action:{type:"exec",command:I.item.action.command,timeoutMs:I.item.action.timeout_ms,user:I.item.action.user,workingDirectory:I.item.action.working_directory,env:I.item.action.env}}),providerMetadata:{[c]:{itemId:I.item.id}}});else if(I.item.type==="reasoning"){let oe=f[I.item.id],ge=Object.entries(oe.summaryParts).filter(([rn,Er])=>Er==="active"||Er==="can-conclude").map(([rn])=>rn);for(let rn of ge)y.enqueue({type:"reasoning-end",id:`${I.item.id}:${rn}`,providerMetadata:{[c]:{itemId:I.item.id,reasoningEncryptedContent:(A=I.item.encrypted_content)!=null?A:null}}});delete f[I.item.id]}}else if(e3(I)){let oe=m[I.output_index];oe!=null&&y.enqueue({type:"tool-input-delta",id:oe.toolCallId,delta:I.delta})}else if(t3(I)){let oe=m[I.output_index];oe!=null&&y.enqueue({type:"tool-input-delta",id:oe.toolCallId,delta:JSON.stringify(I.delta).slice(1,-1)})}else if(r3(I)){let oe=m[I.output_index];oe!=null&&(y.enqueue({type:"tool-input-delta",id:oe.toolCallId,delta:'"}'}),y.enqueue({type:"tool-input-end",id:oe.toolCallId}),y.enqueue({type:"tool-call",toolCallId:oe.toolCallId,toolName:"code_interpreter",input:JSON.stringify({code:I.code,containerId:oe.codeInterpreter.containerId}),providerExecuted:!0}))}else if(Q5(I))p=I.response.id,y.enqueue({type:"response-metadata",id:I.response.id,timestamp:new Date(I.response.created_at*1e3),modelId:I.response.model});else if(X5(I))y.enqueue({type:"text-delta",id:I.item_id,delta:I.delta}),(O=(x=t.providerOptions)==null?void 0:x.openai)!=null&&O.logprobs&&I.logprobs&&d.push(I.logprobs);else if(I.type==="response.reasoning_summary_part.added"){if(I.summary_index>0){let oe=f[I.item_id];oe.summaryParts[I.summary_index]="active";for(let ge of Object.keys(oe.summaryParts))oe.summaryParts[ge]==="can-conclude"&&(y.enqueue({type:"reasoning-end",id:`${I.item_id}:${ge}`,providerMetadata:{[c]:{itemId:I.item_id}}}),oe.summaryParts[ge]="concluded");y.enqueue({type:"reasoning-start",id:`${I.item_id}:${I.summary_index}`,providerMetadata:{[c]:{itemId:I.item_id,reasoningEncryptedContent:(N=(L=f[I.item_id])==null?void 0:L.encryptedContent)!=null?N:null}}})}}else I.type==="response.reasoning_summary_text.delta"?y.enqueue({type:"reasoning-delta",id:`${I.item_id}:${I.summary_index}`,delta:I.delta,providerMetadata:{[c]:{itemId:I.item_id}}}):I.type==="response.reasoning_summary_part.done"?o?(y.enqueue({type:"reasoning-end",id:`${I.item_id}:${I.summary_index}`,providerMetadata:{[c]:{itemId:I.item_id}}}),f[I.item_id].summaryParts[I.summary_index]="concluded"):f[I.item_id].summaryParts[I.summary_index]="can-conclude":Z5(I)?(l=WL({finishReason:(j=I.response.incomplete_details)==null?void 0:j.reason,hasFunctionCall:h}),u.inputTokens=I.response.usage.input_tokens,u.outputTokens=I.response.usage.output_tokens,u.totalTokens=I.response.usage.input_tokens+I.response.usage.output_tokens,u.reasoningTokens=(B=(W=I.response.usage.output_tokens_details)==null?void 0:W.reasoning_tokens)!=null?B:void 0,u.cachedInputTokens=(F=(xe=I.response.usage.input_tokens_details)==null?void 0:xe.cached_tokens)!=null?F:void 0,typeof I.response.service_tier=="string"&&(S=I.response.service_tier)):n3(I)?(g.push(I.annotation),I.annotation.type==="url_citation"?y.enqueue({type:"source",sourceType:"url",id:(ue=(ae=(z=s.config).generateId)==null?void 0:ae.call(z))!=null?ue:dn(),url:I.annotation.url,title:I.annotation.title}):I.annotation.type==="file_citation"&&y.enqueue({type:"source",sourceType:"document",id:(le=(Se=(_e=s.config).generateId)==null?void 0:Se.call(_e))!=null?le:dn(),mediaType:"text/plain",title:(Te=(Q=I.annotation.quote)!=null?Q:I.annotation.filename)!=null?Te:"Document",filename:(Ae=I.annotation.filename)!=null?Ae:I.annotation.file_id,...I.annotation.file_id?{providerMetadata:{[c]:{fileId:I.annotation.file_id}}}:{}})):o3(I)&&y.enqueue({type:"error",error:I})},flush(b){let y={[c]:{responseId:p}};d.length>0&&(y[c].logprobs=d),S!==void 0&&(y[c].serviceTier=S),b.enqueue({type:"finish",finishReason:l,usage:u,providerMetadata:y})}})),request:{body:e},response:{headers:i}}}};function X5(t){return t.type==="response.output_text.delta"}function J5(t){return t.type==="response.output_item.done"}function Z5(t){return t.type==="response.completed"||t.type==="response.incomplete"}function Q5(t){return t.type==="response.created"}function e3(t){return t.type==="response.function_call_arguments.delta"}function t3(t){return t.type==="response.code_interpreter_call_code.delta"}function r3(t){return t.type==="response.code_interpreter_call_code.done"}function qL(t){return t.type==="response.output_item.added"}function n3(t){return t.type==="response.output_text.annotation.added"}function o3(t){return t.type==="error"}function KL(t){var e;switch(t.type){case"search":return{action:{type:"search",query:(e=t.query)!=null?e:void 0},...t.sources!=null&&{sources:t.sources}};case"open_page":return{action:{type:"openPage",url:t.url}};case"find_in_page":return{action:{type:"findInPage",url:t.url,pattern:t.pattern}}}}var i3=bt(()=>me(zE.object({instructions:zE.string().nullish(),speed:zE.number().min(.25).max(4).default(1).nullish()}))),a3=class{constructor(t,e){this.modelId=t,this.config=e,this.specificationVersion="v2"}get provider(){return this.config.provider}async getArgs({text:t,voice:e="alloy",outputFormat:r="mp3",speed:n,instructions:o,language:i,providerOptions:a}){let s=[],c=await Gr({provider:"openai",providerOptions:a,schema:i3}),l={model:this.modelId,input:t,voice:e,response_format:"mp3",speed:n,instructions:o};if(r&&(["mp3","opus","aac","flac","wav","pcm"].includes(r)?l.response_format=r:s.push({type:"unsupported-setting",setting:"outputFormat",details:`Unsupported output format: ${r}. Using mp3 instead.`})),c){let u={};for(let d in u){let p=u[d];p!==void 0&&(l[d]=p)}}return i&&s.push({type:"unsupported-setting",setting:"language",details:`OpenAI speech models do not support language selection. Language parameter "${i}" was ignored.`}),{requestBody:l,warnings:s}}async doGenerate(t){var e,r,n;let o=(n=(r=(e=this.config._internal)==null?void 0:e.currentDate)==null?void 0:r.call(e))!=null?n:new Date,{requestBody:i,warnings:a}=await this.getArgs(t),{value:s,responseHeaders:c,rawValue:l}=await Vr({url:this.config.url({path:"/audio/speech",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),body:i,failedResponseHandler:Io,successfulResponseHandler:OL(),abortSignal:t.abortSignal,fetch:this.config.fetch});return{audio:s,warnings:a,request:{body:JSON.stringify(i)},response:{timestamp:o,modelId:this.modelId,headers:c,body:l}}}},s3=bt(()=>me(Bt.object({text:Bt.string(),language:Bt.string().nullish(),duration:Bt.number().nullish(),words:Bt.array(Bt.object({word:Bt.string(),start:Bt.number(),end:Bt.number()})).nullish(),segments:Bt.array(Bt.object({id:Bt.number(),seek:Bt.number(),start:Bt.number(),end:Bt.number(),text:Bt.string(),tokens:Bt.array(Bt.number()),temperature:Bt.number(),avg_logprob:Bt.number(),compression_ratio:Bt.number(),no_speech_prob:Bt.number()})).nullish()}))),l3=bt(()=>me(ea.object({include:ea.array(ea.string()).optional(),language:ea.string().optional(),prompt:ea.string().optional(),temperature:ea.number().min(0).max(1).default(0).optional(),timestampGranularities:ea.array(ea.enum(["word","segment"])).default(["segment"]).optional()}))),YL={afrikaans:"af",arabic:"ar",armenian:"hy",azerbaijani:"az",belarusian:"be",bosnian:"bs",bulgarian:"bg",catalan:"ca",chinese:"zh",croatian:"hr",czech:"cs",danish:"da",dutch:"nl",english:"en",estonian:"et",finnish:"fi",french:"fr",galician:"gl",german:"de",greek:"el",hebrew:"he",hindi:"hi",hungarian:"hu",icelandic:"is",indonesian:"id",italian:"it",japanese:"ja",kannada:"kn",kazakh:"kk",korean:"ko",latvian:"lv",lithuanian:"lt",macedonian:"mk",malay:"ms",marathi:"mr",maori:"mi",nepali:"ne",norwegian:"no",persian:"fa",polish:"pl",portuguese:"pt",romanian:"ro",russian:"ru",serbian:"sr",slovak:"sk",slovenian:"sl",spanish:"es",swahili:"sw",swedish:"sv",tagalog:"tl",tamil:"ta",thai:"th",turkish:"tr",ukrainian:"uk",urdu:"ur",vietnamese:"vi",welsh:"cy"},c3=class{constructor(t,e){this.modelId=t,this.config=e,this.specificationVersion="v2"}get provider(){return this.config.provider}async getArgs({audio:t,mediaType:e,providerOptions:r}){let n=[],o=await Gr({provider:"openai",providerOptions:r,schema:l3}),i=new FormData,a=t instanceof Uint8Array?new Blob([t]):new Blob([FL(t)]);i.append("model",this.modelId);let s=xL(e);if(i.append("file",new File([a],"audio",{type:e}),`audio.${s}`),o){let c={include:o.include,language:o.language,prompt:o.prompt,response_format:["gpt-4o-transcribe","gpt-4o-mini-transcribe"].includes(this.modelId)?"json":"verbose_json",temperature:o.temperature,timestamp_granularities:o.timestampGranularities};for(let[l,u]of Object.entries(c))if(u!=null)if(Array.isArray(u))for(let d of u)i.append(`${l}[]`,String(d));else i.append(l,String(u))}return{formData:i,warnings:n}}async doGenerate(t){var e,r,n,o,i,a,s,c;let l=(n=(r=(e=this.config._internal)==null?void 0:e.currentDate)==null?void 0:r.call(e))!=null?n:new Date,{formData:u,warnings:d}=await this.getArgs(t),{value:p,responseHeaders:m,rawValue:g}=await IL({url:this.config.url({path:"/audio/transcriptions",modelId:this.modelId}),headers:Sr(this.config.headers(),t.headers),formData:u,failedResponseHandler:Io,successfulResponseHandler:Bn(s3),abortSignal:t.abortSignal,fetch:this.config.fetch}),h=p.language!=null&&p.language in YL?YL[p.language]:void 0;return{text:p.text,segments:(s=(a=(o=p.segments)==null?void 0:o.map(f=>({text:f.text,startSecond:f.start,endSecond:f.end})))!=null?a:(i=p.words)==null?void 0:i.map(f=>({text:f.word,startSecond:f.start,endSecond:f.end})))!=null?s:[],language:h,durationInSeconds:(c=p.duration)!=null?c:void 0,warnings:d,response:{timestamp:l,modelId:this.modelId,headers:m,body:g}}}},u3="2.0.89";function jE(t={}){var e,r;let n=(e=BL(wL({settingValue:t.baseURL,environmentVariableName:"OPENAI_BASE_URL"})))!=null?e:"https://api.openai.com/v1",o=(r=t.name)!=null?r:"openai",i=()=>OE({Authorization:`Bearer ${CL({apiKey:t.apiKey,environmentVariableName:"OPENAI_API_KEY",description:"OpenAI"})}`,"OpenAI-Organization":t.organization,"OpenAI-Project":t.project,...t.headers},`ai-sdk/openai/${u3}`),a=h=>new t5(h,{provider:`${o}.chat`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),s=h=>new a5(h,{provider:`${o}.completion`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),c=h=>new u5(h,{provider:`${o}.embedding`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),l=h=>new g5(h,{provider:`${o}.image`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),u=h=>new c3(h,{provider:`${o}.transcription`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),d=h=>new a3(h,{provider:`${o}.speech`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),p=h=>{if(new.target)throw new Error("The OpenAI model function cannot be called with the new keyword.");return m(h)},m=h=>new Y5(h,{provider:`${o}.responses`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch,fileIdPrefixes:["file-"]}),g=function(h){return p(h)};return g.languageModel=p,g.chat=a,g.completion=s,g.responses=m,g.embedding=c,g.textEmbedding=c,g.textEmbeddingModel=c,g.image=l,g.imageModel=l,g.transcription=u,g.transcriptionModel=u,g.speech=d,g.speechModel=d,g.tools=F5,g}var Dje=jE();function rN(t){let{apiKey:e,sessionId:r,extraHeaders:n,loggerTags:o}=t,i={Authorization:`Bearer ${e}`,[pm]:us??"",...r&&{[ax]:r},...n||{}};return o&&(i[ix]=JSON.stringify(o)),i}var hd=t=>e=>{let r=rN(t);return d3({baseURL:`${t.baseUrl}/v1/llm/anthropic/${e}`,headers:r,apiKey:t.apiKey})(e)},GE=t=>e=>{let r=rN(t);return jE({baseURL:`${t.baseUrl}/v1/llm/openai/${e}`,headers:r,apiKey:t.apiKey})(e)};var Po=class extends fr{agentConfig;constructor(e,r){let n={...Gp,...e};super(r),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,r){let n={...e,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:r.abortSignal});return AC.parse(o)}async rankChunksWithRag(e,r){let n=await this.sendRequest(`/${q}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:us,...e},signal:r.abortSignal});return vC.parse(n)}async getScreenshotFromS3(e){let r=await this.sendRequest(`/${q}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return p3.string().parse(r)}async getElementLocation(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${q}/web-agent/locate-element`,{method:"POST",body:n,signal:r.abortSignal});return px.parse(o)}async getAssertionResult(e,r){let n={...e,disableCache:!!r.disableCache,useConsensus:!!r.useConsensus,attemptNumber:r.attemptNumber,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.assertion},o=await this.sendRequest(`/${q}/web-agent/assertion`,{method:"POST",body:n,signal:r.abortSignal});return Iy.parse(o)}async getLintStepResult(e,r){let n={...e,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/lint/step`,{method:"POST",body:n,signal:r.abortSignal});return dx.parse(o)}async getLintMcpCopilotMessageResult(e,r){let n={message:e.message,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:r.abortSignal});return lx.parse(o)}async getMcpCopilotConversationEvaluation(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/mcp-copilot-conversation-evaluator`,{method:"POST",body:n,signal:r.abortSignal});return cx.parse(o)}async getMcpCopilotChatSummary(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/mcp-copilot-chat-summary`,{method:"POST",body:n,signal:r.abortSignal});return ux.parse(o)}async getVisualAssertionResult(e,r){let n={...e,disableCache:!!r.disableCache,useConsensus:!!r.useConsensus,attemptNumber:r.attemptNumber,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.["visual-assertion"]},o=await this.sendRequest(`/${q}/web-agent/visual-assertion`,{method:"POST",body:n,signal:r.abortSignal});return Iy.parse(o)}async getAiActionCommand(e,r){let n=await this.sendRequest(`/${q}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return sx.parse(n)}async getMultiturnAiActionCommand(e,r){return await this.sendRequest(`/${q}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal})}async getMultiturnAiActionEvaluation(e,r){let n=await this.sendRequest(`/${q}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return gS.parse(n)}async getReverseMappedDescription(e,r){let n=await this.sendRequest(`/${q}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return mx.parse(n)}async getTextExtraction(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${q}/web-agent/text-extraction`,{method:"POST",body:n,signal:r.abortSignal});return dS.parse(o)}async getPageSummary(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/page-summary`,{method:"POST",body:n,signal:r.abortSignal});return JR.parse(o)}async getSmartWaitingDecision(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${q}/web-agent/smart-waiting`,{method:"POST",body:n,signal:r.abortSignal});return ZR.parse(o)}async getTestResultClassification(e,r){let n=await this.sendRequest(`/${q}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return Wf.parse(n)}async getExtractedKeywords(e,r){let n=await this.sendRequest(`/${q}/web-agent/extract-keywords`,{method:"POST",body:e,signal:r.abortSignal});return UC.parse(n)}async getAutohealingProposal(e,r){let n=await this.sendRequest(`/${q}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return qR.parse(n)}async getFailureRecoveryProposal(e,r){let n=await this.sendRequest(`/${q}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return YR.parse(n)}async getFailureRecoveryPlan(e,r){let n=await this.sendRequest(`/${q}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return KR.parse(n)}async getIframeRegex(e,r){let n=await this.sendRequest(`/${q}/web-agent/iframe-regex`,{method:"POST",body:e,signal:r.abortSignal});return sA.parse(n)}getVercelAnthropicModelFactory(e){let{sessionId:r,logger:n}=e;return hd({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:et(n),sessionId:r})}getVercelOpenAIModelFactory(e){let{sessionId:r,logger:n}=e;return GE({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:et(n),sessionId:r})}};import{z as VE}from"zod";var pt=class extends fr{constructor(e){super({...e,mode:void 0})}getAppUrl(){return hl(this.baseUrl)}async getAuthInfo(){let e=await this.sendRequest(`/${q}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:r=>{v.warn(`API key check failed: ${r.message}`)}});return wx.parse(e)}async bulkGetRunStatus(e){let r=await this.sendRequest(`/${q}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return vx.parse(r)}async getTestYAMLExport(e){let r=await this.sendRequest(`/${q}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return hx.parse(r)}async updateStepCaches(e,r){await this.sendRequest(`/${q}/cache`,{method:"PATCH",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,r){let n=await this.sendRequest(`/${q}/cache`,{method:"POST",body:e,extraHeaders:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return Sx.parse(n)}async getWebStepCacheMemoryTraces(e){let r=await this.sendRequest(`/${q}/cache/traces`,{method:"POST",body:e,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return My.parse(r)}async getMobileStepCacheMemoryTraces(e){let r=await this.sendRequest(`/${q}/mobile-cache/traces`,{method:"POST",body:e,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return My.parse(r)}async updateMobileStepCaches(e,r){await this.sendRequest(`/${q}/mobile-cache`,{method:"PATCH",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest(e,r){let n=await this.sendRequest(`/${q}/mobile-cache`,{method:"POST",body:e,extraHeaders:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return yx.parse(n)}async queueTests(e){let r=await this.sendRequest(`/${q}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return gx.parse(r)}async uploadScreenshot(e){let r=await this.sendRequest(`/${q}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return Cx.parse(r)}async uploadOnDemandScreenshot(e){return await this.sendRequest(`/${q}/on-demand-screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3}),{apiServerUrl:`${this.baseUrl}/${q}/on-demand-screenshots/${e.id}`}}async fetchOnDemandScreenshot(e){let r={};return{data:await this.sendRequest(`/${q}/on-demand-screenshots/${encodeURIComponent(e)}`,{method:"GET",retries:3,requestTimeoutMs:5e3,responseType:"buffer",responseHeadersObject:r}),contentType:r["content-type"]??"image/jpeg"}}async getAllEnvironments(){let e=await this.sendRequest(`/${q}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return xx.parse(e)}async acquireCacheLock(e,r){let n=await this.sendRequest(`/${q}/result-cache/lock`,{method:"POST",body:e,signal:r,retries:3,requestTimeoutMs:3e4});return $x.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${q}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${q}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${q}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${q}/result-cache/entry`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(r){if(r instanceof Error&&r.message.includes("404"))return null;throw r}}async queueSuiteRuns(e){let r=await this.sendRequest(`/${q}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return _x.parse(r)}async bulkGetRunGroupStatus(e){let r={runGroupIds:e},n=await this.sendRequest(`/${q}/run-groups/status`,{method:"POST",body:r,retries:3,requestTimeoutMs:5e3});return SC.array().parse(n)}async uploadProposedSteps(e,r){try{await this.sendRequest(`/${q}/test-fragments/`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4})}catch(n){r.error({err:n},"Failed to upload proposed steps")}}async reportBillableEvents(e,r){try{await this.sendRequest(`/${q}/billing/events`,{method:"POST",body:r,retries:10,requestTimeoutMs:1e4})}catch(n){e.error({err:n},"Failed to report billable event")}}async fetchTestFragment(e){let r=await this.sendRequest(`/${q}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ix.parse(r)}async patchTestFragment(e,r){await this.sendRequest(`/${q}/test-fragments/${e}`,{method:"PATCH",body:r,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,r){let n=await this.sendRequest(`/${q}/results/tests/${e}`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return Px.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${q}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return Mx.parse(e)}async startProcessingResultsUpload(e,r){let n=await this.sendRequest(`/${q}/results/uploads/${e}/process`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return Ox.parse(n)}async fetchIconKnowledgeBase(e){try{let r=await this.sendRequest(`/${q}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Xx.parse(r)}catch(r){return e.error({err:r},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,r){try{await this.sendRequest(`/${q}/knowledge-base/icons`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(n){r.error({err:n},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,r,n,o){let i=new URLSearchParams;i.set("base",n),i.set("head",o);let a=await this.sendRequest(`/${q}/git/github/${e}/${r}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Cu.parse(a)}async getCommitFromGithub(e,r,n){let o=await this.sendRequest(`/${q}/git/github/${e}/${r}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Cu.parse(o)}async getMergedBranchFromGithub(e,r,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${q}/git/github/${e}/${r}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ny.parse(a)}async getMergeBaseCommitFromGitlab(e,r,n){let o=new URLSearchParams;o.set("base",r),o.set("head",n);let i=encodeURIComponent(e),a=await this.sendRequest(`/${q}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Cu.parse(a)}async getCommitFromGitlab(e,r){let n=encodeURIComponent(e),o=await this.sendRequest(`/${q}/git/gitlab/${n}/commits/${r}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Cu.parse(o)}async getMergedBranchFromGitlab(e,r,n){let o=encodeURIComponent(r),i=encodeURIComponent(e),a=await this.sendRequest(`/${q}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ny.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${q}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return VE.record(VE.string(),VE.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${q}/quarantine`,{method:"GET"});return Lx.parse(e)}async quarantineTest(e,r,n){await this.sendRequest(`/${q}/quarantine`,{method:"POST",body:{testId:e.id,testName:e.name,reason:r,...n??{}},retries:3,requestTimeoutMs:1e4})}async unquarantineTest(e,r,n){await this.sendRequest(`/${q}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:r,...n??{}},retries:3,requestTimeoutMs:1e4})}async createAndroidEmulator(e){let r=await this.sendRequest(`/${q}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return Nx.parse(r)}async extendAndroidEmulatorTtl(e){try{await this.sendRequest(`/${q}/limbar/android/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async generateAndroidAssetUrls({channel:e,tag:r,md5:n}){let o={channel:e,tag:r,md5:n},i=await this.sendRequest(`/${q}/limbar/android/upload-url`,{method:"POST",retries:3,body:o,requestTimeoutMs:15e3,logResponse:!0});return kx.parse(i)}async deleteAndroidEmulator(e){await this.sendRequest(`/${q}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getAndroidAssets(){let e=await this.sendRequest(`/${q}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ux.parse(e)}async getLimbarAssetDownloadUrl(e,r){let n=await this.sendRequest(`/${q}/limbar/assets/${e}/${r}/download-url`,{method:"GET",retries:2,requestTimeoutMs:3e4});return Fx.parse(n)}async deleteAndroidAsset(e,r){await this.sendRequest(`/${q}/limbar/assets/${e}/${r}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}async createIosEmulator(e){let r=await this.sendRequest(`/${q}/limbar/ios`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return Dx.parse(r)}async extendIosEmulatorTtl(e){try{await this.sendRequest(`/${q}/limbar/ios/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async deleteIosEmulator(e){await this.sendRequest(`/${q}/limbar/ios/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async generateMobileLogcatUploadUrl(e){let r=await this.sendRequest(`/${q}/logcat/mobile/upload`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return ww.parse(r)}};async function Xg(t){let e=process.versions.node,r=parseInt(e.split(".")[0]);(isNaN(r)||r<18)&&(v.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),v.debug(`Identified node version ${e}`);let n=await t.client.getAuthInfo();return v.debug("Got auth info from API"),n}var Jg=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,r){await this.apiClient.reportBillableEvents(e,r)}};var ta=class extends fr{generator;constructor(e,r){super(e),this.generator=r}async runTemplateMatching(e,r={}){let n=await this.sendRequest(`/${q}/web-agent/template-matching`,{method:"POST",body:e,signal:r?.signal});return lA.parse(n)}async constructIframeRegex(e,r={}){return this.generator.getIframeRegex(e,{abortSignal:r.signal})}};var Zl=class{constructor(e,r){this.client=e;this.orgId=r}getApiServerUrl(){return this.client.baseUrl}getAppServerUrl(){let e=this.getApiServerUrl();return hl(e)}async acquireCacheLock(e,r){return this.client.acquireCacheLock(e,r)}async createOnDemandScreenshot(e,r,n){let{apiServerUrl:o}=await this.client.uploadOnDemandScreenshot({id:e,screenshot:r.toString("base64"),contentType:n});return{apiServerUrl:o,appServerUrl:`${this.getAppServerUrl()}/api/on-demand-screenshots/${e}`,universalHandle:{id:e,contentType:n}}}async fetchOnDemandScreenshot(e){return this.client.fetchOnDemandScreenshot(e.id)}async releaseCacheLock(e){return this.client.releaseCacheLock(e)}async deleteCacheResult(e){return this.client.deleteCacheResult(e)}async setCacheResult(e){return this.client.setCacheResult(e)}async getCacheResult(e){return this.client.getCacheResult(e)}fetchIconKnowledgeBase(e){return this.client.fetchIconKnowledgeBase(e)}saveNewIcons(e,r){return this.client.saveNewIcons(e,r)}};import{Faker as m3,en as g3}from"@faker-js/faker";var Ql="v1",Mo=class{httpClient;fakerInstance;type="API_CLIENT";sms={send:this.sendSms.bind(this),fetchLatest:this.fetchLatestSms.bind(this)};email={send:this.sendEmail.bind(this),fetchLatest:this.fetchLatestEmail.bind(this),fetchAll:this.fetchAllEmails.bind(this)};ai={generate:this.sendAiGenerate.bind(this)};constructor(e){this.httpClient=e.httpClient,e.fakerSeed&&(this.fakerInstance=new m3({locale:g3}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let r=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${Ql}/tools/ai/generate`,{method:"POST",body:r}).catch(n=>{throw n instanceof no?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${Ql}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(r=>{throw r instanceof no?new Error(r.rawError):new Error(`Failed to send sms: ${r.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${Ql}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(r=>{throw r instanceof no?new Error(r.rawError):r})}async sendEmail(e){return this.httpClient.sendRequest(`/${Ql}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(r=>{throw r instanceof no?new Error(r.rawError):new Error(`Failed to send email: ${r.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${Ql}/tools/email/fetchAll`,{method:"POST",body:e}).catch(r=>{throw r instanceof no?new Error(r.rawError):new Error(`Failed to fetch all emails: ${r.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${Ql}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(r=>{throw r instanceof no?new Error(r.rawError):new Error(`Failed to fetch latest emails: ${r.message}`)})}};function nN(t,e,r){return fetch(t,{method:"PUT",body:r,headers:{"Content-Type":e}})}var Zg=class{constructor(e){this.client=e}async uploadResultsArchive(e,r){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await nN(n,"application/zip",r);if(!i.ok)throw new Error(`Failed to upload test results: ${await i.text()}`);let{runGroupId:a}=await this.client.startProcessingResultsUpload(o,{runGroupId:e});return a}};function Oo({logger:t,orgId:e,client:r,gitMetadata:n,regenerateCache:o,alwaysSaveCache:i,noCache:a,bustOldestCachePercentage:s}){return a?new mm:new $E(t,e,r,n,{regenerateCache:o,alwaysSaveCache:i,bustOldestCachePercentage:s})}var $E=class{constructor(e,r,n,o,i){this.orgId=r;this.client=n;let{regenerateCache:a,alwaysSaveCache:s,bustOldestCachePercentage:c}=i,{gitBranchName:l,gitProtectedBranches:u}=o;e.info({options:i,gitBranchName:l,gitProtectedBranches:u},"Cache storage initialization options"),this.cacheHeaders=Py(o),this.readCaches=!a;let d=l&&u.includes(l);s||!d?this.writeCaches=!0:this.writeCaches=!1,d||(this.bustOldestCachePercentage=c)}cacheHeaders;readCaches;writeCaches;bustOldestCachePercentage;async saveStepCacheEntries({entries:e,testId:r,logger:n}){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateStepCaches({entries:e,testId:r},this.cacheHeaders)}catch(o){n.error({err:o},"Failed to save step cache entries")}}async resolveStepCacheEntries(e){if(!this.readCaches){e.logger.debug("Skipping cache resolution because of regenerate flag");return}let{steps:r,beforeSteps:n,afterSteps:o}=e.stepLists,i=await this.client.getStepCacheForTest({testId:e.testId},this.cacheHeaders);if(this.bustOldestCachePercentage!==void 0){let s=Object.entries(i).map(([u,d])=>({key:u,time:d.value.cache?.updatedAt?.getTime()??0}));s.sort((u,d)=>u.time-d.time);let c=s.length,l=Math.max(1,Math.floor(c*this.bustOldestCachePercentage/100));s.slice(0,l).forEach(({key:u})=>{delete i[u]}),e.logger.info({nCachesToBust:l,bustOldestCachePercentage:this.bustOldestCachePercentage,totalCaches:c},"Busted oldest caches")}for(let s of[r,n,o])s&&Ul({steps:s,stepCacheEntries:i,logger:e.logger});if(!this.writeCaches){e.logger.debug("Skipping cache last used at update because branch is protected");return}let{cachesToSave:a}=await Pt({stepLists:e.stepLists,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateStepCaches({entries:a,testId:e.testId},this.cacheHeaders)}};import Qg from"path";function h3(t){let e=new oN,r=Qg.join(t,"metadata.json"),n=fl.parse(JSON.parse(WE.readFileSync(r,"utf-8")));e.addLocalFile(r);for(let o of WE.readdirSync(Qg.join(t,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new oN(Qg.join(t,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(Qg.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function eh(t){let{client:e,consoleLogger:r,resultsPath:n}=t;if(!WE.existsSync(n)){r.warn("Results path does not exist, skipping upload.");return}let o=new Zg(e);try{let{runGroupId:i,buffer:a}=h3(n),s=await o.uploadResultsArchive(i,a),c=`${e.getAppUrl()}/run-groups/${s}`;r.success(`Successfully uploaded test results. Once processed, your results can be found at ${c}`);return}catch(i){let a;i instanceof Error?a=i.message:typeof i=="string"?a=i:a="Unknown error",r.error(`Failed to upload test results: ${a}.`);return}}import f3 from"adm-zip";import Mr from"fs";import zn from"path";var fd=class t{constructor(e){this.filePath=e;Mr.rmSync(this.filePath,{recursive:!0,force:!0}),Mr.mkdirSync(this.filePath,{recursive:!0})}children=[];streams=[];close(){for(let e of this.children)e.close();for(let e of this.streams)e.end()}cd(e){let r=new t(zn.join(this.filePath,e));return this.children.push(r),r}cwd(){return this.filePath}mkdir(e){Mr.mkdirSync(zn.join(this.filePath,e),{recursive:!0})}readFile(e){let r=zn.join(this.filePath,e);if(Mr.existsSync(r))return Mr.readFileSync(r)}storeFile(e){let{name:r,contents:n}=e,o=zn.join(this.filePath,r);try{Mr.writeFileSync(o,n)}catch{}}createFileStream(e){let r=zn.join(this.filePath,e),n=Mr.createWriteStream(r);return this.streams.push(n),n}createRunArchive(e){let r=new qE(zn.join(this.filePath,"runs"),e);return this.children.push(r),r}},qE=class{children=[];tempPath;finalPath;constructor(e,r){this.tempPath=zn.join(e,`temp-storage-${r}`),this.finalPath=zn.join(e,`${r}.zip`),Mr.rmSync(this.tempPath,{recursive:!0,force:!0}),Mr.rmSync(this.finalPath,{recursive:!0,force:!0}),Mr.mkdirSync(this.tempPath,{recursive:!0})}readFile(e){let r=zn.join(this.tempPath,e);if(Mr.existsSync(r))return Mr.readFileSync(r)}mkdir(e){Mr.mkdirSync(zn.join(this.tempPath,e),{recursive:!0})}cd(e){let r=new fd(zn.join(this.tempPath,e));return this.children.push(r),r}cwd(){return this.tempPath}storeFile(e){let{name:r,contents:n}=e,o=zn.join(this.tempPath,r);Mr.writeFileSync(o,n)}close(){for(let n of this.children)n.close();let e=new f3;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let r=e.toBuffer();Mr.writeFileSync(this.finalPath,r),Mr.rmSync(this.tempPath,{recursive:!0,force:!0})}};import S3 from"adm-zip";import{randomUUID as y3}from"crypto";import Qt from"fs";import br from"path";function lN(t){try{return Qt.existsSync(t)?JSON.parse(Qt.readFileSync(t,"utf-8")):void 0}catch{return}}function iN(t){return Qt.existsSync(t)?Qt.readFileSync(t,"utf-8").split(`
|
|
90
|
+
`).map(r=>r.trim()).filter(r=>r.length>0):[]}function b3(t,e){let r=t.attemptIdToAttemptNumber.get(e);if(r)return br.join(t.inflatedPath,"attempts",r);let n=br.join(t.inflatedPath,"attempts");if(!Qt.existsSync(n))return;let o=Qt.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=br.join(n,i,"metadata.json"),s=lN(a);if(typeof s!="object"||s===null)continue;let c=s.id;if(typeof c=="string"&&c===e)return t.attemptIdToAttemptNumber.set(e,i),br.join(n,i)}}function aN(t,e,r){let n=br.join(t,"attempts");if(!Qt.existsSync(n))return;let o=Qt.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=br.join(n,i,"assets",`${e}.${r}`);if(Qt.existsSync(a))return a}}var th=class{constructor(e,r,n){this.outputDir=e;this.runId=r;this.runAttemptId=n;this.runsDir=br.join(e,"runs"),this.zipPath=br.join(this.runsDir,`${r}.zip`)}inflatedByRunId=new Map;zipPath;runsDir;ensureInflatedRun(e){let r=this.inflatedByRunId.get(e);if(r)return r;if(e!==this.runId||!Qt.existsSync(this.zipPath))return;let n=br.join(this.runsDir,`temp-unzipped-${e}-${y3()}`);Qt.mkdirSync(n,{recursive:!0}),new S3(this.zipPath).extractAllTo(n,!0);let i={runId:e,zipPath:this.zipPath,inflatedPath:n,attemptIdToAttemptNumber:new Map};return this.inflatedByRunId.set(e,i),i}close(){for(let e of this.inflatedByRunId.values())Qt.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return b3(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let r=br.join(e,"assets");return Qt.existsSync(r)?Qt.readdirSync(r,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>br.join(r,o.name)).filter(o=>{let i=br.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,r){let n=this.getAttemptDir();if(!n)return;let o=br.join(n,"assets",`${e}.${r}`);if(Qt.existsSync(o))try{return Qt.readFileSync(o,"utf-8")}catch{return}}async getConsoleLogsForRunAttempt(e,r,n){if(r!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=lN(br.join(o,"console.json")),a=by.safeParse(i);return a.success?a.data:void 0}async getNetworkLogsForRunAttempt(e,r,n){if(r!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=br.join(o,"assets","har-pages.log"),a=br.join(o,"assets","har-entries.log"),s={};for(let u of iN(i)){let d=Eu.safeParse(sN(u));d.success&&(s[d.data.id]=d.data)}let c={},l=iN(a);for(let u=0;u<l.length;u++){let d=l[u],p=Tu.safeParse(sN(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;c[m]=p.data}if(Object.keys(c).length!==0)return Ty(s,c)}async getHtmlSnapshot(e,r){let n=this.readAttemptAssetText(r,"html");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=aN(o.inflatedPath,r,"html");if(i)try{return Qt.readFileSync(i,"utf-8")}catch{return}}async getA11yTreeSnapshot(e,r){let n=this.readAttemptAssetText(r,"xml");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=aN(o.inflatedPath,r,"xml");if(i)try{return Qt.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,r){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),i=o?br.join(o,"assets",`${r}.jpeg`):void 0;if(i)try{return Qt.readFileSync(i)}catch{return}}};function sN(t){try{return JSON.parse(t)}catch{return}}function rh({test:t,envNameOverride:e,urlOverride:r,resolveEnv:n}){let o=e??E3(t),i,a={};if(o){try{i=n(o)}catch(c){throw new Error(`Failed to resolve environment ${o} for test ${t.name}: ${String(c)}`)}a=i.variables}let s=t.baseUrl;if(r)s=r;else if(!s){let c=a[nr];typeof c=="string"&&(s=c)}if(!s)throw new Error(`Cannot run test with no base URL and no ${nr} variable defined in its environment`);return{envName:o,resolvedEnv:i,environmentVariables:a,baseUrl:s}}function E3(t){for(let e of t.envs??[])if(e.default)return e.name}import nh from"fs";import T3 from"path";var v3=new vg(30,60*1e3),ih="https://api.momentic.ai",YE,cN,ah=t=>{ih=t},er=()=>ih,uN=()=>hl(ih),dN=t=>{cN=t},pN=()=>cN,tc=()=>YE;var ec,XE,oh,sh=async t=>{if(YE&&ec&&oh)return ec;let e=new pt({baseUrl:ih,apiKey:t,logger:v});YE=e;try{let r=await e.getAuthInfo();return ec=r.orgId,XE=r.userId,oh=t,ec}catch(r){throw new Error(`Error checking API key against server: ${r}`)}},zt=()=>{if(!ec)throw new Error("Your organization ID is invalid.");return ec},Lo=()=>{if(!XE)throw new Error("Your user ID is invalid.");return XE},$r=()=>{if(!oh)throw new Error("Your API key is invalid.");return oh},JE,KE,lh=(t,e)=>{JE=t,KE?.abort(),KE=new AbortController;let r=KE.signal,n=[t.configFilePath];t.config.environments?.forEach(o=>{if(!o.envFile)return;let i=T3.resolve(t.rootDir,o.envFile);try{if(nh.lstatSync(i).isSymbolicLink())return;nh.existsSync(i)&&n.push(i)}catch(a){v.warn({err:a},`Failed to check if env file ${i} exists`)}});try{A3({filesToWatch:n,revalidator:e,signal:r,project:t})}catch(o){v.error({err:o},"Failed to start config file watchers")}},Ee=()=>JE;function A3({filesToWatch:t,revalidator:e,signal:r,project:n}){v.debug("Starting watch on the following files:"),t.forEach(o=>{v.debug(`- ${o}`)}),t.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(v3.increment("setLocalProject")&&v.warn(`A file change under the ${n.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),JE=await Promise.resolve(e(n.configFilePath)))};nh.watchFile(o,{persistent:!1},i);let a=()=>{nh.unwatchFile(o,i),r.removeEventListener("abort",a)};r.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Fe(t){return function(...e){let r=e[e.length-1],n=t(...e);Promise.resolve(n).catch(r)}}import{hostname as R3}from"os";var C3="2.46.3",ps=yl({app:"desktop-server",hostname:R3(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:C3});(async()=>{try{let t=await ci(ps);t.gitBranchName&&ps.addBinding("branch",t.gitBranchName)}catch{}})();var mN=w3();mN.get("/",async(t,e)=>{let r=Ee(),n=tc();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await Ir(ps,n,r),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=pN(),c=!a&&(s||!i);e.status(200).json({saveCaches:c,checkedOutBranch:o?.gitBranchName})});var ZE=mN;import{Router as x3}from"express";import Wr from"fs";import{globSync as _3}from"glob";import sr from"path";var yd=x3();function Sd(t){let e=Ee(),r=sr.dirname(e.configFilePath);return sr.join(r,...t)}function I3(t){let e=Ee(),r=sr.dirname(e.configFilePath),n=sr.relative(r,t);return n?n.split(sr.sep):[]}function P3(t,e){let r=Wr.statSync(t),n=I3(t);return Ry.parse({name:e,absolutePath:t,relativePath:n.join(sr.sep),pathSegments:n,isDirectory:r.isDirectory(),size:r.size,createdAt:r.birthtime,modifiedAt:r.mtime,accessedAt:r.atime})}yd.post("/",Fe(async(t,e,r)=>{let n;try{n=Ww.parse(t.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Sd(n);if(!Wr.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(sr.sep)}`});return}if(!Wr.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(sr.sep)}`});return}let a=Ee(),s=Array.from(a.config.exclude??[]).concat(sm),l=_3("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=sr.join(o,d);return P3(p,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));yd.put("/",Fe(async(t,e,r)=>{let n;try{n=qw.parse(t.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Sd(n);if(Wr.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(sr.sep)}`,pathSegments:n});return}Wr.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(sr.sep)}`,pathSegments:n};e.status(201).json(i)}));yd.patch("/",Fe(async(t,e,r)=>{let n,o;try{let l=Kw.parse(t.body);n=l.pathSegments,o=l.newPathSegments}catch(l){e.status(400).json({error:`Failed to parse folder update body: ${l}`});return}let i=Sd(n),a=Sd(o);if(!Wr.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(sr.sep)}`});return}if(Wr.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(sr.sep)}`});return}let s=sr.dirname(a);Wr.existsSync(s)||Wr.mkdirSync(s,{recursive:!0}),Wr.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(sr.sep)} to ${o.join(sr.sep)}`,pathSegments:o};e.status(200).json(c)}));yd.delete("/",Fe(async(t,e,r)=>{let n,o=!0;try{let c=Yw.parse(t.body);n=c.pathSegments,o=c.recursive??!0}catch(c){e.status(400).json({error:`Failed to parse folder delete body: ${c}`});return}let i=Sd(n);if(!Wr.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(sr.sep)}`,pathSegments:n});return}if(!Wr.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(sr.sep)}`});return}if(o)Wr.rmSync(i,{recursive:!0,force:!0});else{if(Wr.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}Wr.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var QE=yd;import{Router as M3}from"express";var gN=M3();gN.get("/",async(t,e)=>{let r=Ee(),n=tc();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await Ir(ps,n,r);e.status(200).json(o)});var eT=gN;import $Z from"events";import iF,{Router as WZ}from"express";import qZ from"http";import KZ from"path";import{Server as H8}from"socket.io";var O3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async()=>{e.info({sessionId:n},"Cancel event received");let o=r.getSession(n);if(!o)throw new Error("No active session found");try{o.controller.setClosed()}catch{}}},hN={event:"cancel",createHandler:O3};var L3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async(o,i)=>{let a=r.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let l=(await s.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:l},"Fetched a11y tree from the browser"),i({a11yTree:l})}catch(c){e.error({err:c},"Error fetching a11y tree from the browser"),i({err:c.message})}}},fN={event:"fetchA11yTree",createHandler:L3};var N3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async(o,i)=>{let a=r.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let c=await s.html();i({html:c})}catch(c){e.error({err:c},"Error fetching DOM from the browser"),c.name==="TimeoutError"?i({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):i({err:c.message})}}},SN={event:"fetchDom",createHandler:N3};var D3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return o=>{e.info({sessionId:n,reason:o},`Disconnect event received (${o})`),r.removeSession(n,e)}},yN={event:"disconnect",createHandler:D3};function Hn(t){let{result:e,nestedResults:r}=t;if(!t.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=k3(r);U3(e,n,o);let i=[...t.asyncTasks];t.asyncTasks.push((async()=>{try{await F3(i,e,n,o)}catch(a){t.logger.error({result:t.result,err:a},"Error hoisting scalar result metadata")}})())}function k3(t){let e=t[0],r;for(;;){switch(e.type){case"PRESET_ACTION":{r=e;break}case"CONDITIONAL":r=t[0];break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":if(!e.results.length){r=e;break}e=e.results[0];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}if(r)break}let n=t[t.length-1],o;for(;;){switch(n.type){case"PRESET_ACTION":{o=n;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":if(!n.results.length){o=n;break}n=n.results[n.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}if(o)break}return{firstMetadata:r,lastMetadata:o}}function U3(t,e,r){e&&(t.beforeUrl=e.beforeUrl),r&&(t.afterUrl=r.afterUrl,t.data=r.data,r.status!=="SUCCESS"&&(t.message=r.message))}async function F3(t,e,r,n){await Promise.allSettled(t),r&&(e.beforeSnapshot=r.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as Y3}from"crypto";import{faker as B3}from"@faker-js/faker";import z3 from"assert";import H3 from"axios";import*as j3 from"child_process";import G3 from"moment";import*as V3 from"otpauth";import $3 from"pg";async function bN(t){let e;try{e=new URL(t.url).hostname}catch{}let r=[];return t.headers.getSetCookie()?.forEach(n=>{let o=Qp(n,e);r.push(...o)}),r}function W3(t,e){if(!t&&!e)return;let r;if(t){let{url:o,options:i}=t;r=new Request(o,i)}let n;if(e){let{body:o,options:i}=e;n=new Response(o??null,i)}return{request:r,response:n}}async function q3(t,e){switch(t){case"RAW":return e;case"RESPONSE":if(e instanceof Response){let r=[];return e.headers.forEach((o,i)=>{r.push([i,o])}),{status:e.status,headers:r,body:await e.text()}}else throw new Error("Result is not a Response object")}}var K3=Object.getPrototypeOf(async function(){}).constructor;async function EN(t,e,r){let n=e.code;e.options.fragment&&(n=`return ${e.code}`);let{env:o,additionalBindings:i,request:a,response:s}=e.bindings,c=e.tools,l={},u=(y,T)=>{o[y]=T,l[y]=T},d={},p=(y,T)=>{o[y]=T,d[y]=T},m;n.includes("Octokit")&&(m=(await import("@octokit/rest")).Octokit);let g;n.includes("createAppAuth")&&(g=(await import("@octokit/auth-app")).createAppAuth);let h=async()=>await Promise.resolve(new K3("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(H3,G3,c.fakerInstance??B3,z3,$3,m,g,V3,j3,bN,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,T=>c.sms.send(T),T=>c.sms.fetchLatest(T),c.email,c.sms,c.ai,W3(a,s),...Object.values(i??{}))),f=!0,S,b;try{let y=await X(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});S=await q3(e.options.responseSerialization??"RAW",y)}catch(y){r.error({err:y,env:o,evalCode:n},`[${t}] Error executing code: ${y}`),f=!1,y instanceof zi?b=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:b=y instanceof Error?y.message:`${y}`}return{result:S,variableUpdates:l,persistentVariableUpdates:d,success:f,error:b}}async function TN({code:t,fragment:e,context:r,localTools:n,logger:o,signal:i,timeoutMs:a=Ui,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=Y3(),p=await EN(d,{code:t,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...r.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return v.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as X3,randomUUID as J3}from"crypto";import Z3 from"fetch-retry";var Q3=Z3(global.fetch,{retries:3,retryOn:function(t,e,r){return!!(e!==null||r&&r.status>=500)},retryDelay:function(t){return Math.pow(2,t)*500}}),vN=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,AN=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function RN({orgId:t,code:e,fragment:r,context:n,timeoutMs:o=Ui,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!vN)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,g=0;if(!AN)throw new Error("Missing lambda auth secret.");let h=X3("sha256",AN).update(t).digest("hex");for(;g<=i;){g++,a?.throwIfAborted();let S={id:J3(),orgId:t,momenticLambdaAuthHash:h,code:e,fragment:r,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await X(Q3(vN,{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(b){m=b}}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 f;try{f=_w.parse(await p.json())}catch(S){throw new Error(`Code evaluation server returned invalid response: ${S}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function ra(t){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await RN(t);else if(t.localTools)e=await TN({...t,localTools:t.localTools});else throw new Error("No code evaluation environment available");if(e.error){let r=`Failed to evaluate code:
|
|
91
91
|
${e.error}
|
|
92
92
|
Code received:
|
|
93
93
|
${t.code}`;throw t.logger.error({err:e.error,code:t.code,env:t.context.toObjectCopy()},r),new Error(r)}if(e.variableUpdates)for(let[r,n]of Object.entries(e.variableUpdates))t.context.setVariable(r,n);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await t.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[r,n]of Object.entries(e.persistentVariableUpdates))t.context.setVariable(r,n)}return e.result}import{set as eX}from"lodash-es";async function qr(t){let{orgId:e,s:r,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=Ui,allowUndefined:c=!1}=t,l=/{{(.*?)}}/g,u=r.matchAll(l),d=r;for(let p of u){if(p.length<2)continue;let m=p[1].trim(),g;try{g=await ra({orgId:e,code:m,fragment:!0,context:n,timeoutMs:s,logger:o,retries:a,localTools:t.localTools,signal:i})}catch(f){throw o.error({err:f,value:r},"Error evaluating template string"),f}if(g===void 0&&!c)throw new M("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 g=="string"?g:`${g}`;h=h.replaceAll(/\$/g,"$$$$"),d=d.replace(p[0],h)}return d}async function ch(t){return CN(t)}async function CN({obj:t,bannedKeys:e,allowList:r,context:n,prefixPath:o=[],replacements:i=[],...a}){for(let s in t){if(e.includes(s))continue;let c=!1;if(r)if(r.includes(s))c=!0;else continue;let l=t[s],u=[...o,s];if(typeof l=="string"&&l.includes("{{")){let d=await qr({s:l,context:n,...a});if(l===d)continue;i.push({path:u,original:l}),t[s]=d}else typeof l=="object"&&l!==null&&!Array.isArray(l)&&await CN({obj:l,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:r,...a})}return i}function wN(t,e){for(let{path:r,original:n}of e)eX(t,r,n)}import tX from"fetch-retry";var RKe=process.env.MAILINATOR_API_KEY,CKe=tX(global.fetch,{retryOn:function(t,e,r){return t>3?!1:!!(e!==null||r&&r.status>=400)},retryDelay:function(t){return 500}});import{hostname as B6}from"os";var tT={vimiumJs:'var D=Object.defineProperty;var P=(t,e,n)=>e in t?D(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>(P(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 T={_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 r of e)r();e=null}}),!0)}return function(n){t?n():e.push(n)}}(),createElement(t){let e=document.createElement(t);return e instanceof HTMLElement?(this.createElement=n=>document.createElement(n),e):(this.createElement=n=>document.createElementNS("http://www.w3.org/1999/xhtml",n),this.createElement(t))},addElementsToPage(t,e){let n=this.createElement("div");e.id!=null&&(n.id=e.id),e.className!=null&&(n.className=e.className);for(let o of t)n.appendChild(o);return document.body.appendChild(n),n},removeElement(t){return t.parentNode.removeChild(t)},isTopFrame(){return globalThis.top===globalThis.self},makeXPath(t){let e=[];for(let n of t)e.push(".//"+n,".//xhtml:"+n);return e.join(" | ")},evaluateXPath(t,e){let n=document.webkitIsFullScreen?document.webkitFullscreenElement:document.documentElement,o=function(r){return r==="xhtml"?"http://www.w3.org/1999/xhtml":null};return document.evaluate(t,n,o,e,null)},getVisibleClientRect(t,e){let n;e==null&&(e=!1);let o=(()=>{let i=[];for(n of t.getClientRects())i.push(E.copy(n));return i})(),r=function(){let i=window.getComputedStyle(t,null),h=i.getPropertyValue("display").indexOf("inline")===0&&i.getPropertyValue("font-size")==="0px";return r=()=>h,h};for(n of o){let i;if((n.width===0||n.height===0)&&e)for(let h of Array.from(t.children)){i=window.getComputedStyle(h,null);let m=i.getPropertyValue("position");if(i.getPropertyValue("float")==="none"&&!["absolute","fixed"].includes(m)&&!(n.height===0&&r()&&i.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||(i=window.getComputedStyle(t,null),i.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 r,i,h,m,s=o.coords.split(",").map(l=>parseInt(l,10)),a=o.shape.toLowerCase();if(["rect","rectangle"].includes(a))s.length==4&&([r,h,i,m]=s);else if(["circle","circ"].includes(a)){if(s.length==3){let[l,c,d]=s,p=d/Math.sqrt(2);r=l-p,i=l+p,h=c-p,m=c+p}}else a==="default"?s.length==2&&([r,h,i,m]=[0,0,t.width,t.height]):s.length>=4&&([r,h,i,m]=s);let u=E.translate(E.create(r,h,i,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 r of n){let i=this.simulateMouseEvent(r,t,e);o.push(i)}return o},simulateMouseEvent(t,e,n){if(n==null&&(n={}),t==="mouseout"){if(e==null&&(e=this.lastHoveredElement),this.lastHoveredElement=void 0,e==null)return}else t==="mouseover"&&(this.simulateMouseEvent("mouseout",void 0,n),this.lastHoveredElement=e);let o=new MouseEvent(t,{bubbles:!0,cancelable:!0,composed:!0,view:window,detail:1,ctrlKey:n.ctrlKey,altKey:n.altKey,shiftKey:n.shiftKey,metaKey:n.metaKey});return e.dispatchEvent(o)},simulateClickDefaultAction(t,e){let n;if(e==null&&(e={}),(t.tagName!=null?t.tagName.toLowerCase():void 0)!=="a"||!t.href)return;let{ctrlKey:o,shiftKey:r,metaKey:i,altKey:h}=e;KeyboardUtils.platform==="Mac"?n=i===!0&&o===!1:n=i===!1&&o===!0,n?chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:r===!0}):r===!0&&i===!1&&o===!1&&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),r=parseInt(e.marginLeft);return{top:-n.top+o,left:-n.left+r}}else{let o,r;return T.isFirefox()?(r=parseInt(e.borderTopWidth),o=parseInt(e.borderLeftWidth)):{clientTop:r,clientLeft:o}=t,{top:-n.top-r,left:-n.left-o}}},suppressPropagation(t){t.stopImmediatePropagation()},suppressEvent(t){t.preventDefault(),this.suppressPropagation(t)},consumeKeyup:function(){let t=null;return function(e,n=null,o){if(!e.repeat){t!=null&&handlerStack.remove(t);let{code:r}=e;t=handlerStack.push({_name:"dom_utils/consumeKeyup",keyup(i){return i.code!==r||(this.remove(),o?f.suppressPropagation(i):f.suppressEvent(i)),handlerStack.continueBubbling},blur(i){return i.target===window&&this.remove(),handlerStack.continueBubbling}})}return typeof n=="function"&&n(),o?(f.suppressPropagation(e),handlerStack.suppressPropagation):(f.suppressEvent(e),handlerStack.suppressEvent)}}(),getSelectionType(t){return t==null&&(t=document.getSelection()),t.type?t.type:t.rangeCount===0?"None":t.isCollapsed?"Caret":"Range"},getElementWithFocus(t,e){let n,o=n=t.getRangeAt(0);f.getSelectionType(t)==="Range"&&(o=n.cloneRange(),o.collapse(e)),n=o.startContainer,n.nodeType===1&&(n=n.childNodes[o.startOffset]);let r=n;for(;r&&r.nodeType!==1;)r=r.previousSibling;return n=r||n?.parentNode,n},getSelectionFocusElement(){let t=window.getSelection(),e=t.focusNode;return e==null?null:(e===t.anchorNode&&t.focusOffset===t.anchorOffset&&(e=e.childNodes[t.focusOffset]||e),e.nodeType!==Node.ELEMENT_NODE?e.parentElement:e)},getContainingElement(t){return(typeof t.getDestinationInsertionPoints=="function"?t.getDestinationInsertionPoints()[0]:void 0)||t.parentElement},windowIsTooSmall(){return window.innerWidth<3||window.innerHeight<3},injectUserCss(){let t=document.createElement("style");t.type="text/css",t.textContent=Settings.get("userDefinedLinkHintCss"),document.head.appendChild(t)}};var R={MAX_CONTENT_LENGTH:1e3,MAX_ATTRIBUTE_LENGTH:500,MAX_NUM_DATA_ATTRIBUTES:10,commonAttributes:["id","className","title","aria-label","aria-labelledby"],attributeNamesMapping:new Map([["a",["href","title","rel","target"]],["label",["for"]],["input",["type","name","placeholder","checked","maximumLength"]],["textarea",["placeholder","maximumLength"]],["button",["type"]],["select",["name","multiple"]],["div",["role"]],["iframe",["src"]],["img",["src","alt"]]]),describe(t){let e={};this.addAttributes(t,this.commonAttributes,e);let n=t.tagName.toLowerCase?.()||"";this.attributeNamesMapping.has(n)&&this.addAttributes(t,this.attributeNamesMapping.get(n),e),this.addDataAttrs(t,e);let o=this.getContent(t);return this.additionalHandling(t,{tag:n,attributes:e,...o&&{content:o}})},getContent(t){let e=t.tagName.toLowerCase?.()||"";return["input","textarea"].includes(e)?t.value:["div","iframe","img","body"].includes(e)?null:(["a","button","select","label"].includes(e),t.innerText)},additionalHandling(t,e){if((t.tagName.toLowerCase?.()||"")=="label"&&t.hasAttribute("for")){let o=t.getAttribute("for"),r=document.getElementById(o);r&&(e.target=this.describe(r))}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 C=null,k=()=>j()||document.scrollingElement||document.body,_=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(T.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,r=t[o];if(t.scrollBy){let i={behavior:"instant"};i[e==="x"?"left":"top"]=n,t.scrollBy(i)}else t[o]+=n;return t[o]!==r},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 r=o*O(t,e,n)||-1;return r=_(r),I(t,e,r)&&I(t,e,-r)},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,r)=>r.area-o.area)){let o=H(e.element);if(o)return o}return null}},M={init(){C=null},isScrollableElement(t){return C||(C=k()&&H()||k()),t!==C&&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.Scroller=M;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,r=!1,i=[],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(N=>Object.assign(N,{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,N]=d.length===1?["click",...d[0].trim().split("."),"_"]:[d[0],...d[1].trim().split("."),"_"];n||(n=p==="click"&&g!=="none"&&N!=="_")}}}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()&&M.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&&M.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,r=!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:r,reason:m}));i.push(...l)}else{let l=f.getVisibleClientRect(t,!0);if(l!==null){let c=new L({element:t,rect:l,secondClassCitizen:o,possibleFalsePositive:r,reason:m});i.push(c)}}return i},getElementFromPoint(t,e,n,o){n==null&&(n=document),o==null&&(o=[]);let r=n.elementsFromPoint?n.elementsFromPoint(t,e)[0]:n.elementFromPoint(t,e);return o.includes(r)?r:(o.push(r),r&&r.shadowRoot?S.getElementFromPoint(t,e,r.shadowRoot,o):r)},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 r=[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 r)if(l=l?.parentElement,l===s.element)return!1;w+=1}return!0});let i=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}});i.reverse();let{top:h,left:m}=f.getViewportTopLeft();for(let s of i)s.rect.top+=h,s.rect.left+=m;return i}};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"),r=e.element.attributes["data-momentic-id"]?.value??void 0;if(!r){console.warn(`[MOMENTIC] No data-momentic-id found for interactive element ${e.element.outerHTML}`);return}o.style.left=e.rect.left+"px",o.style.top=e.rect.top+"px",o.style.zIndex=214e7+n,o.className="vimiumReset internalVimiumHintMarker vimiumHintMarker",z(o,r),this.hintMarkers.set(r,{hint:e,marker:o})})}enrichMarkers(){if(this.hintMarkers){this.enrichedMarkers=[];for(let[e,n]of this.hintMarkers)this.enrichedMarkers.push(Object.assign(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.HintManager=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:`// src/html/constants.ts
|
|
@@ -4590,7 +4590,7 @@ ${c}`,{errOptions:{cause:t}})}if(i.includes("element is not visible")){let c="Th
|
|
|
4590
4590
|
writable: false,
|
|
4591
4591
|
configurable: false,
|
|
4592
4592
|
});`),`${r}
|
|
4593
|
-
//# sourceURL=momentic-injected/extra-scripts.js`}function RT(t){let e=[],r="";for(let n of t)n==="+"&&r?(e.push(r),r=""):r+=n;return e.push(r),e}var qX=["clipboard-read","clipboard-write","microphone","camera","geolocation","local-network-access"],KX=["local-network-access"];function cD(t){return Mn?t.filter(e=>!KX.includes(e)):t}function uD(t){return cD(t||qX)}var CT="__momentic_session_storage_initialized";function dD(t){return t.parentFrame!==void 0}async function pD(t,e,r){try{let n=await YX(t);if(n.entries.length===0)return;let o=e.origins?.find(i=>i.origin===n.origin);o?o.sessionStorage=n.entries:(e.origins=e.origins??[],e.origins.push({origin:n.origin,localStorage:[],sessionStorage:n.entries})),r.info(`Saved ${n.entries.length} session storage entries`)}catch(n){r.warn({err:n},"Failed to extract session storage, continuing...")}}async function YX(t){return t.evaluate(e=>{let r=[];for(let n=0;n<window.sessionStorage.length;n++){let o=window.sessionStorage.key(n);if(o&&o!==e){let i=window.sessionStorage.getItem(o);i!==null&&r.push({name:o,value:i})}}return{origin:window.location.origin,entries:r}},CT)}function mD(t,e){if(!t||!e)return;let r=t.x+t.width/2,n=t.y+t.height/2,o=e.x+e.width/2,i=e.y+e.height/2,a=o-r,s=i-n,c=Math.atan2(s,a);return c<0?c+2*Math.PI:c}function gD(t,e){if(!t||!e)return;let r=t.x+t.width/2,n=t.y+t.height/2,o=e.x+e.width/2,i=e.y+e.height/2,a=o-r,s=i-n;return Math.sqrt(a*a+s*s)}async function XX(t){let{initialLocationResult:e,cacheEvaluationParams:r,locator:n}=t;return n.evaluate((o,i)=>{let a=window,{initialLocationResult:s,cacheEvaluationParams:c}=i;if(!a.momenticConstants)throw new Error("Momentic constants not found");if(o.tagName.toLowerCase()!==s.tagName.toLowerCase())return"Tag name mismatch";let l=(o.textContent??"").slice(0,a.momenticConstants.serializedElementForCachingTruncateLength),u=(s.textContent??"").slice(0,a.momenticConstants.serializedElementForCachingTruncateLength);if(l!==u)return"Text content mismatch";for(let[m,g]of Object.entries(s.importantAttributes))if(o.getAttribute(m)!==g)return`Attribute ${m} mismatch`;let d=s.boundingBox.width*s.boundingBox.height,p=o.getBoundingClientRect().width*o.getBoundingClientRect().height;if(d===0||p===0){if(d!==p)return"Area mismatch"}else if(Math.abs(d-p)/d>.05)return"Area mismatch";if(s.identityHash&&a?.getElementIdentityHash&&s.identityHash!==a.getElementIdentityHash(o))return"Identity hash mismatch";if(c&&a.evaluatePrimaryCaches){let{css:m,hybrid:g}=a.evaluatePrimaryCaches(c);if(g?.result&&g.result.mPath&&s.mPath&&JSON.stringify(g.result.mPath)!==JSON.stringify(s.mPath))return"Hybrid selector returned a different element than the original";if(!g&&m&&m.result&&m.result.dataMomenticId!==s.dataMomenticId)return"CSS selector returned a different element than the original"}},{initialLocationResult:e,cacheEvaluationParams:r},{timeout:ie})}async function wT(t){let{logger:e}=t;try{let r=await XX(t);if(!r)return;throw e.warn({failReason:r},"Locator no longer matches cache, re-triggering evaluation"),new Ci("Locator no longer matches cache")}catch(r){if(r instanceof Ci)throw r;e.warn({err:r},"Failed to check whether locator has drifted from cache")}}import hD from"jpeg-js";import JX from"pixelmatch";function fD(t,e,r=.01){if(t.equals(e))return 0;let n=hD.decode(t),o=hD.decode(e);if(n.width!==o.width||n.height!==o.height)return 100;let i=n.width,a=n.height,s=Buffer.alloc(i*a*4);return JX(n.data,o.data,s,i,a,{threshold:r})/(i*a)*100}var yD=["date","datetime-local","month","time","week"],SD={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function bD(t){try{await X(ZX(t),{milliseconds:ie})}catch(e){t.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function ZX({root:t,text:e,options:r,logger:n,callbacks:o}){let i=(await Yt({root:t,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:Ke,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!SD[i])return;SD[i].test(e)&&n.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),r.clearContent=!1,n.info("Transforming datetime input to use sequential key presses")}import{z as Kr}from"zod";var ED=Kr.object({doubleClick:Kr.boolean().optional(),rightClick:Kr.boolean().optional(),force:Kr.boolean().optional(),waitForDownload:Kr.boolean().optional(),delayMs:Kr.number().optional(),downloadTimeoutMs:Kr.number().optional(),relativePosition:Kr.object({x:Kr.number(),y:Kr.number()}).optional(),iterations:Kr.number().optional()}),U4e=Kr.object({repeat:Kr.number().optional(),convertMeta:Kr.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:Kr.number().optional()});async function hh({locator:t,callbacks:e,logger:r,timeoutMs:n=Ke}){try{await xT(e,n);let o=t.evaluate(a=>{let s=window;s.momenticIsEligible=p=>{let g=window.getComputedStyle(p,null).getPropertyValue("display");if(g==="none"||g==="contents")return!1;let h=p.getBoundingClientRect();return!(!h.height||!h.width)},s.removeHighlightTimers=s.removeHighlightTimers||[],s.removeHighlightFunctions=s.removeHighlightFunctions||{};let c=0;for(;!s.momenticIsEligible(a)&&c<3;){if(!a.parentElement)throw new Error("No eligible non-empty parent found for highlighting");a=a.parentElement,c++}let l=a.style.getPropertyValue("outline"),u=a.style.getPropertyPriority("outline");a.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let d=`momentic${Math.floor(Math.random()*1e7)}`;s[d]=()=>{a.style.removeProperty("outline"),a.style.setProperty("outline",l,u),a.getAttribute("style")||a.removeAttribute("style")},s.removeHighlightTimers.push(setTimeout(()=>{s[d](),s.removeHighlightFunctions?.[d]&&delete s.removeHighlightFunctions[d]},5e3)),s.removeHighlightFunctions[d]=s[d]},void 0,{timeout:n}).then(()=>!0).catch(a=>(r.debug({err:a},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1));return await X(o,{milliseconds:n})}catch(o){return r.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function xT(t,e=Ke){let r=await t.state.getRoot();await Yt({root:r,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let a=i.pop();clearTimeout(a)}Object.values(o.removeHighlightFunctions??{}).forEach(a=>{a()})},timeout:e,arg:void 0,waitForPageLoad:t.waitForPageLoad,codePath:"removing element highlights"})}async function _T(t){let e=!!t.browserCallbacks.state.userBrowserSettings.visualActions;return hs({action:"clicking element",targetingResult:t.targetingResult,logger:t.logger,retryTimeoutMs:t.retryTimeoutMs,callbacks:t.browserCallbacks,func:async r=>vD({...t,targetingResult:r,useVisualClick:e})})}async function rJ({actionSource:t,position:e,targetingResult:r,logger:n}){let{locator:o}=r;if(t!=="click"||e)return{locator:o,position:e,redirected:!1};let i=await FN({targetingResult:r,logger:n});return i?{locator:i.locator,position:i.relativePoint,redirected:!0}:{locator:o,position:e,redirected:!1}}async function nJ(t,e){try{return await oJ(t,e)}catch(r){throw e.logger.warn({redirectionAttemptError:r,originalError:t},"Error handling click error, rethrowing original error"),t}}async function oJ(t,e){let{logger:r,redirectionAttempts:n=0}=e,o=e.targetingResult.locator;if(t.message.includes("label")&&t.message.includes("for=")&&t.message.includes("intercepts pointer events")){let i=await o.getAttribute("id",{timeout:Ke});if(!i)throw t;let a=o.page().locator(`[for=${JSON.stringify(i)}]`),s=await a.boundingBox({timeout:Ke});if(!s||s.width===0||s.height===0)throw r.warn("Label element has no bounding box, throwing original error..."),t;return r.warn({err:t},"Attempting locator redirection due to input being covered by label"),vD({...e,targetingResult:{locator:a,originalElementLocationResult:void 0,serverSideBoundingBox:s},redirectionAttempts:n+1})}else throw r.warn({err:t},"Click error does not match any known recoverable patterns, rethrowing"),t}async function iJ(t){let{logger:e,targetingResult:r,position:n,options:o}=t,i=ED.safeParse(o),a=Date.now(),{clickX:s,clickY:c,reason:l}=await lJ({targetingResult:r,position:n,options:o,logger:e,isAndroid:t.isAndroid});return e.info({position:n,options:i.success?i.data:void 0,clickLocation:{clickX:s,clickY:c,reason:l},duration:Date.now()-a},"Visual click"),{x:s,y:c}}async function aJ(t){let{actionSource:e,targetingResult:r,options:n,logger:o}=t,i=t.targetingResult.locator,a=n?.relativePosition??t.position;({locator:i,position:a}=await rJ({actionSource:e,position:a,targetingResult:r,logger:o}));let s=n?.force||r.hints?.force||!1;s&&!a&&r.hints?.relativeXYToLocator&&(a=r.hints.relativeXYToLocator);let c=i.toString();o.info({locator:c,position:a},"Locator click");try{n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:ie,position:a,delay:n?.delayMs??25,force:s}):await i.click({button:n?.rightClick?"right":"left",timeout:ie,position:a,delay:n?.delayMs??25,force:s,clickCount:n?.iterations})}catch(l){if(uJ(l))o.warn({err:l},"Click action timed out while waiting for navigation after completion, continuing...");else{if((t.redirectionAttempts??0)<1)return o.warn({err:l},"Error clicking on locator, attempting to recover..."),nJ(l,{...t,targetingResult:r});throw l}}return{locatorSource:c}}async function vD(t){let{options:e,logger:r,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=t,s;e?.waitForDownload&&(s=(async()=>{let u=e.downloadTimeoutMs??nT;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof tJ.TimeoutError?new M("ActionFailureError",`Download did not complete in ${u}ms`):new M("ActionFailureError",`Download failed: ${d.message}`)}})());try{await hh({locator:a.locator,callbacks:n,logger:r,timeoutMs:Ke})}catch(u){r.warn({err:u},"Error highlighting locator in click, continuing...")}let c,l;if(i?c=await iJ(t):l=(await aJ(t)).locatorSource,e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new M("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");r.info("Waiting for download to start and complete");let u=await X(s,{milliseconds:e.downloadTimeoutMs??nT});if(u instanceof Error)throw u;return{downloadedFile:await cJ(u,o.createIsolatedFolder,r),coordinates:c,locatorSource:l}}else throw new Error("No download promise or error but the step requested to wait for a download");return{coordinates:c,locatorSource:l}}async function sJ(t,e){let r=t.serverSideBoundingBox??await t.locator.boundingBox({timeout:ie});if(!r){let i=t.originalElementLocationResult?.serializedElement;throw new M("ActionFailureError",`${qf}${i?`: ${i}`:""}`)}if(t.hints?.relativeXYToLocator){let i=r.x+t.hints.relativeXYToLocator.x,a=r.y+t.hints.relativeXYToLocator.y;return[{x:i,y:a},"targeting hint"]}let n=r.x+r.width/2,o=r.y+r.height/2;return[{x:n,y:o},"halfway point"]}async function lJ({options:t,targetingResult:e,position:r,logger:n}){let o,i,a;if(t?.relativePosition){let u=e.serverSideBoundingBox??await e.locator.boundingBox({timeout:ie}),d=t.relativePosition.x,p=t.relativePosition.y;u?.width&&(d=Math.max(0,Math.min(t.relativePosition.x,u.width))),u?.height&&(p=Math.max(0,Math.min(t.relativePosition.y,u.height))),o=(u?.x??0)+d,i=(u?.y??0)+p,a="relative position from user"}else if(r){let u=e.serverSideBoundingBox??await e.locator.boundingBox({timeout:ie});o=(u?.x??0)+r.x,i=(u?.y??0)+r.y,a="predefined position"}else{let[u,d]=await sJ(e,n);o=u.x,i=u.y,a=d}let s=e.locator.page(),c=t?.rightClick?"right":"left",l=t?.delayMs??25;return t?.doubleClick?await s.mouse.dblclick(o,i,{button:c,delay:l}):await s.mouse.click(o,i,{button:c,delay:l,clickCount:t?.iterations}),{clickX:o,clickY:i,reason:a}}async function cJ(t,e,r){r.info("Download detected, saving file to disk");let n=await t.path(),o=mT(t.suggestedFilename()),i=e();await t.saveAs(eJ(i,o)),TD(n,{force:!0}),setTimeout(()=>{TD(i,{recursive:!0,force:!0})},5*60*1e3);let a=HN(QX(i),o);return r.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function uJ(t){return t.message.includes("locator.click: Timeout")&&t.message.includes("click action done")}import{platform as dJ}from"os";var pJ={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function mJ(){let t=dJ();return t==="win32"?"win32":t==="darwin"?"darwin":"linux"}function AD(t){return JSON.stringify(t.split("+").sort())}function fh(t,e){let r=mJ(),n=AD(t);for(let o of Object.values(pJ))if(Object.values(o).some(i=>AD(i)===n))return o[r];return process.platform==="darwin"&&!e?t=t.replaceAll("Control","Meta"):t=t.replaceAll("Meta","Control"),t}async function IT({frame:t,page:e,deltaX:r,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:s,logger:c}){if(!r&&!o)return;let l=n==="left"?-1:1,u=i==="up"?-1:1;if(t)await Yt({root:t,fn:([d,p,m,g])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*m,window.scrollY+(p??window.innerHeight)*g),arg:[r,o,l,u],waitForPageLoad:s.waitForPageLoad,timeout:rt,codePath:"scrolling page"});else{let d=e.viewportSize()||Ar,p=await Yt({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:rt,codePath:"computing page height"}),[m,g,h]=await Yt({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let S=f.getBoundingClientRect();return[f.scrollTop,S.x,S.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:rt,codePath:"computing active element position"});await e.mouse.wheel((r??d.width)*l,(o??d.height)*u);try{let f=Date.now();for(;Date.now()-f<rt;){a?.throwIfAborted();let S=await X(e.evaluate(()=>document.body.scrollHeight),{milliseconds:Ke}),[b,y,T]=await X(e.evaluate(()=>{let w=document.activeElement;if(!w)return[void 0,void 0,void 0];let P=w.getBoundingClientRect();return[w.scrollTop,P.x,P.y]}),{milliseconds:Ke});if(S===p&&b===m&&y===g&&T===h)break;p=S,m=b,g=y,h=T,await Se(lr)}}catch(f){c.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function PT(t,e){let r,n;for(let o=0;o<4;o++)try{return r=t.pages(),await Promise.all(r.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await Se(lr)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}async function MT(t){let{page:e,deltaX:r,deltaY:n,steps:o,visualTarget:i,isAndroid:a,hoverDurationMs:s}=t;if(a){await gJ(t);return}await e.mouse.move(i.x,i.y),await e.mouse.down(),await e.mouse.move(r+i.x,n+i.y,{steps:o}),await Se(s??na),await e.mouse.up()}async function RD({page:t,fromLocator:e,toLocator:r,stepCount:n,dragDurationMs:o,hoverDurationMs:i}){let a=await r.boundingBox({timeout:ie});if(!a)throw new M("ActionFailureError","Could not get bounding box of 'to' target element");let s=await e.boundingBox({timeout:ie});if(!s)throw new M("ActionFailureError","Could not get bounding box of 'from' target element");let c=a.x+a.width/2,l=a.y+a.height/2,u=s.x+s.width/2,d=s.y+s.height/2;await MT({page:t,deltaX:c-u,deltaY:l-d,steps:n,dragDurationMs:o,hoverDurationMs:i,visualTarget:{x:u,y:d},isAndroid:!0})}async function CD(t,e,r,n){await t.mouse.move(e.x,e.y,{steps:3}),await t.mouse.down(),await t.mouse.move(r.x,r.y,{steps:3}),await Se(Math.min(n.hoverDurationMs??500,uh)),await t.mouse.up()}async function gJ(t){let{page:e,deltaX:r,deltaY:n,steps:o,visualTarget:i,dragDurationMs:a,hoverDurationMs:s}=t,c=Math.max(1,o??1),l=i.x,u=i.y,d=i.x+r,p=i.y+n;await e.evaluate(async({startX:m,startY:g,endX:h,endY:f,stepCount:S,dragDurationMs:b,hoverDurationMs:y})=>{let T=document.elementFromPoint(m,g)??document.body??document.documentElement,P=window._momenticMobileUtilities.dispatchTouch;P(T,"touchstart",m,g);for(let A=1;A<=S;A+=1){let x=m+(h-m)*A/S,O=g+(f-g)*A/S;P(T,"touchmove",x,O),await new Promise(L=>setTimeout(L,Math.floor((b??500)/S)))}y&&await new Promise(A=>setTimeout(A,y)),P(T,"touchend",h,f)},{startX:l,startY:u,endX:d,endY:p,stepCount:c,dragDurationMs:a,hoverDurationMs:s})}import{randomUUID as vJ}from"crypto";import{cloneDeep as NT}from"lodash-es";function sa(t,e){let r=t.findIndex(n=>n===e);if(!(r===-1||!t[r+1]))return t[r+1]}import{createHash as hJ}from"crypto";var fJ="v1";function OT(t,e){if(t.tagName.toLowerCase()==="svg"&&!yJ(t))try{let r=wD(t,e),n=SJ(JSON.stringify(r));return{version:fJ,json:r,hash:n}}catch{return}}function SJ(t){return hJ("md5").update(t).digest("hex")}function wD(t,e){let r=t.tagName.toLowerCase(),n=bJ(t);if(r==="image"&&n["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:r,props:n,children:[]};for(let i of t.childrenBackendIds){let a=e.backendIdToNode[i];if(a&&a.nodeType===1){let s=wD(a,e);s&&o.children.push(s)}}return o}function yJ(t){let e=t.computedStyles.display,r=t.computedStyles.visibility,n=t.computedStyles.opacity;return e==="none"||r==="hidden"||n==="0"}function bJ(t){let e={},r=t.attributes;for(let n of Object.keys(r))mn.visualAttributesForSvgSerialization.includes(n)&&(e[n]=r[n]);return r.id&&t.tagName.toLowerCase()!=="svg"&&(e.id=r.id),e}var fs={r:147,g:196,b:125,a:.55},_D={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:fs,paddingColor:fs,borderColor:fs,marginColor:fs,eventTargetColor:fs,shapeColor:fs,shapeMarginColor:fs,showInfo:!0,showAccessibilityInfo:!0};function ID({snapshot:t,devicePixelRatio:e,computedStylesToFetch:r,logger:n}){let o=t.strings,i=t.documents,a={},s={},c={roots:[],backendIdToNode:a,frameIndexToIframeNode:s};return i.forEach((l,u)=>{let d=EJ({allDocuments:i,stringConstants:o,computedStylesToFetch:r,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:s,logger:n});c.roots.push(d)}),c}function EJ({allDocuments:t,stringConstants:e,computedStylesToFetch:r,devicePixelRatio:n,frameIndex:o,frameIndexToIframeNode:i,backendIdToNode:a,logger:s}){let c=t[o],l=c.layout,u={};l.nodeIndex.forEach((A,x)=>{u[A]=x});let d=l.styles,p=l.bounds??[],m=c.nodes,g=m.contentDocumentIndex??{index:[],value:[]},h=m.backendNodeId??[],f=m.attributes??[],S=m.parentIndex??[],b=m.nodeName??[],y=m.nodeType??[],T=m.pseudoType??{index:[],value:[]},w=m.inputChecked??{index:[]},P=e[c.frameId];for(let A=0;A<h.length;A++){let x=h[A],O=y[A],L=f[A]??[],N=S[A]!==void 0&&S[A]>=0?S[A]:void 0,j=N!==void 0?h[N]:void 0,W=j!==void 0?a[j]:void 0,B=T.index.indexOf(A),xe=B!==-1?e[T.value[B]]:void 0,F=u[A],z;F?z=p[F]??[]:z=[];let ae=b[A]!==void 0?e[b[A]]?.toLowerCase():void 0;if(!ae){s.warn({backendNodeId:x,frameId:P,frameIndex:o,nodeBounds:z},"DOM node has no tag name");continue}let ue={backendNodeId:x,psuedoType:xe,nodeType:O,frameIndex:o,parentFrameId:P,ownedFrameId:void 0,bounds:{x:z[0]??null,y:z[1]??null,width:z[2]??null,height:z[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:j??null,tagName:ae,parent:W??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};W&&W.childrenBackendIds.push(x);let _e=g.index.indexOf(A);if(_e!==-1){let le=g.value[_e];i[le]=ue;let Q=t[le]?.frameId;ue.ownedFrameId=Q!==void 0?e[Q]:void 0}for(let le of Object.keys(ue.bounds)){let Q=le;ue.bounds[Q]!==null&&(ue.bounds[Q]/=n)}let ye=F!==void 0?d[F]??[]:[];for(let le=0;le<ye.length&&!(le>=r.length);le++){let Q=ye[le];if(Q===void 0||isNaN(Q))continue;let Te=e[Q];if(Te===void 0)continue;let Ae=r[le];ue.computedStyles[Ae]=Te}for(let le=0;le<L.length;le+=2){let Q=L[le],Te=L[le+1];if(!Q||!Te)continue;let Ae=e[Q],I=e[Te];!Ae||!I||(ue.attributes[Ae]=I)}w.index.includes(A)&&(ue.attributes.checked="true"),a[ue.backendNodeId]=ue}return a[h[0]]}function LT(t,e){if(t.mPathSelector)return t.mPathSelector;let r=t.parent,n;if(!r)n=t.tagName;else if(t.tagName==="body")n="body";else{let i=r.childrenBackendIds.filter(c=>e.backendIdToNode[c]?.nodeType===1&&!e.backendIdToNode[c]?.psuedoType).indexOf(t.backendNodeId),a=` > ${t.tagName}:nth-child(${i+1})`;n=`${LT(r,e)}${a}`}return t.mPathSelector=n,n}function xD(t,e){return t.parentBackendNodeId!==null?e.backendIdToNode[t.parentBackendNodeId]:t.frameIndex===0?void 0:e.frameIndexToIframeNode[t.frameIndex]}var TJ=["html","#document","#document-fragment"];function PD({node:t,domGraph:e}){let r=[],n=t,o=xD(t,e);if(!o)return[t.tagName];let i=()=>{if(n=o,o=xD(o,e),!o&&n.frameIndex!==0)throw new Error("No parent node but not in main frame")},a=0;for(;o&&a<1e6;){if(a++,TJ.includes(n.tagName)){i();continue}if(n.tagName==="body")r.push("body");else{let c=!1,l=1;for(let u=0;u<o.childrenBackendIds.length;u++){let d=o.childrenBackendIds[u],p=e.backendIdToNode[d];if(d===n.backendNodeId){r.push(`${n.tagName}:nth-child(${l})`),c=!0;break}else p?.nodeType===1&&!p.psuedoType&&l++}if(!c)throw new Error(`Could not find child (${n.tagName}) in parent's children list (${o.tagName})`)}i()}return r.reverse()}function MD(t,e){let r=t.locator("html"),n=[];for(let o=0;o<e.length;o++){let i=e[o];if(n.push(i),i.startsWith("iframe")){let a=n.join(" > ");n=[],o<e.length-1?r=r.frameLocator(a):r=r.locator(a)}}if(n.length&&(r=r.locator(n.join(" > "))),"owner"in r)throw new Error("Final locator from mpath is a frame locator");return r}async function OD(t,e){await t.send({method:"DOM.getDocument",params:{depth:0},timeout:rt});let r=await t.send({method:"DOM.requestNode",params:{objectId:e},timeout:rt}),o=(await t.send({method:"DOM.getAttributes",params:{nodeId:r.nodeId},timeout:rt})).attributes,i=sa(o,ms);if(!i)throw new Error(`Could not find attribute ${ms} for object ${e}`);return i}var AJ=["focusable","keyshortcuts","controls","live","relevant","orientation"],RJ=["selected","readonly","modal","required","invalid"],CJ=["id","name","role","content"],LD=["absolute","fixed","sticky"],wJ=["i","label"],xJ=["path"],_J=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator","LabelText"],kD=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],UD=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],IJ=["menulistpopup","statictext","inlinetextbox"],PJ=80,ND=100,FD=50,UT=["StaticText","ListMarker","RootWebArea","LineBreak","::before","::after"],MJ=["cite"],OJ={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"],emphasis:["em"]},LJ={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},DD={indentLevel:0},DT=class t{id;role;name;nameSources;tagName;content;properties;internalProperties;ignoredReasons;dataMomenticId;importantProperties;pathFromRoot;mPathSelector;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;flagNotActionableNodes;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,this.ignoredReasons=e.ignoredReasons,this.importantProperties=e.importantProperties,this.flagNotActionableNodes=e.flagNotActionableNodes,e.properties&&e.properties.forEach(r=>{r.name==="keyshortcuts"?this.dataMomenticId=parseInt(r.value.value):this.properties[r.name]=r.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let r=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(r&&r.length<FD?r:""),this.role=this.role||(e.domNode.attributes.role??""),UJ(this.properties,e.domNode,e.importantProperties)}BJ(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(e){if(this.domNode&&xJ.includes(this.domNode.tagName)&&!this.domNode.attributes["aria-label"]||this.ignoredReasons.some(n=>UD.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>GD(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>VD(o,e))||e.styles?.some(o=>{let i=o.split(":");if(i.length!==2)return!1;let a=i[0]?.trim(),s=i[1]?.trim();if(a===void 0||s===void 0)return!1;let c=this.domNode?.computedStyles[a];return c!==void 0&&(c===s||s==="*")}))return!0}if(this.domNode&&wJ.includes(this.domNode.tagName)||_J.includes(this.role.toLowerCase())||this.domNode?.computedStyles["background-image"]&&this.domNode?.computedStyles["background-image"]!=="none"&&this.children.length===0||this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||mn.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let r=this.properties.class;return typeof r=="string"&&r.split(" ").some(n=>jD(n))?!0:this.children.every(n=>n.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(n=>n.role==="StaticText")||this.children.length>1&&this.children.some(n=>n.tagName==="input")||this.children.some(n=>n.isIneligible())?!0:this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height)?!1:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(n=>n.startsWith("data"))}shouldSerializeBounds(){let e=this.domNode?.computedStyles.position;return!!(e&&(e==="absolute"||e==="fixed"||e==="sticky"))}isIneligible(){return!!(this.domNode?.computedStyles.display==="contents"||this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height))}canRedirectFromIneligibleTag(){if(!this.domNode)return!1;let e=this.internalProperties.hasExplicitPointingLabel===!0;return UN({tagName:this.domNode.tagName,width:this.domNode.bounds.width,height:this.domNode.bounds.height})&&e}serialize(e=DD){let r=Object.assign({},DD,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:c}=r,l=NT(this.properties),u=" ".repeat(n),d=this.role||"",p=this.tagName??"unknown",m=this.name;d==="heading"&&m==="heading"&&(m=""),this.nameSources?.find(A=>!A.superseded&&A.type==="contents")&&this.children.length>0&&(m="");let h=this.nameSources?.find(A=>!A.superseded);if(h&&!h.nativeSource&&h.type==="relatedElement"){let A=h.attributeValue?.relatedNodes??[];A.length===1&&A[0].text&&A[0].text===m&&(m="")}let f=UT.includes(this.role)||MJ.includes(this.tagName||"");if(this.role==="StaticText")return`${u}${m}
|
|
4593
|
+
//# sourceURL=momentic-injected/extra-scripts.js`}function RT(t){let e=[],r="";for(let n of t)n==="+"&&r?(e.push(r),r=""):r+=n;return e.push(r),e}var qX=["clipboard-read","clipboard-write","microphone","camera","geolocation","local-network-access"],KX=["local-network-access"];function cD(t){return Mn?t.filter(e=>!KX.includes(e)):t}function uD(t){return cD(t||qX)}var CT="__momentic_session_storage_initialized";function dD(t){return t.parentFrame!==void 0}async function pD(t,e,r){try{let n=await YX(t);if(n.entries.length===0)return;let o=e.origins?.find(i=>i.origin===n.origin);o?o.sessionStorage=n.entries:(e.origins=e.origins??[],e.origins.push({origin:n.origin,localStorage:[],sessionStorage:n.entries})),r.info(`Saved ${n.entries.length} session storage entries`)}catch(n){r.warn({err:n},"Failed to extract session storage, continuing...")}}async function YX(t){return t.evaluate(e=>{let r=[];for(let n=0;n<window.sessionStorage.length;n++){let o=window.sessionStorage.key(n);if(o&&o!==e){let i=window.sessionStorage.getItem(o);i!==null&&r.push({name:o,value:i})}}return{origin:window.location.origin,entries:r}},CT)}function mD(t,e){if(!t||!e)return;let r=t.x+t.width/2,n=t.y+t.height/2,o=e.x+e.width/2,i=e.y+e.height/2,a=o-r,s=i-n,c=Math.atan2(s,a);return c<0?c+2*Math.PI:c}function gD(t,e){if(!t||!e)return;let r=t.x+t.width/2,n=t.y+t.height/2,o=e.x+e.width/2,i=e.y+e.height/2,a=o-r,s=i-n;return Math.sqrt(a*a+s*s)}async function XX(t){let{initialLocationResult:e,cacheEvaluationParams:r,locator:n}=t;return n.evaluate((o,i)=>{let a=window,{initialLocationResult:s,cacheEvaluationParams:c}=i;if(!a.momenticConstants)throw new Error("Momentic constants not found");if(o.tagName.toLowerCase()!==s.tagName.toLowerCase())return"Tag name mismatch";let l=(o.textContent??"").slice(0,a.momenticConstants.serializedElementForCachingTruncateLength),u=(s.textContent??"").slice(0,a.momenticConstants.serializedElementForCachingTruncateLength);if(l!==u)return"Text content mismatch";for(let[m,g]of Object.entries(s.importantAttributes))if(o.getAttribute(m)!==g)return`Attribute ${m} mismatch`;let d=s.boundingBox.width*s.boundingBox.height,p=o.getBoundingClientRect().width*o.getBoundingClientRect().height;if(d===0||p===0){if(d!==p)return"Area mismatch"}else if(Math.abs(d-p)/d>.05)return"Area mismatch";if(s.identityHash&&a?.getElementIdentityHash&&s.identityHash!==a.getElementIdentityHash(o))return"Identity hash mismatch";if(c&&a.evaluatePrimaryCaches){let{css:m,hybrid:g}=a.evaluatePrimaryCaches(c);if(g?.result&&g.result.mPath&&s.mPath&&JSON.stringify(g.result.mPath)!==JSON.stringify(s.mPath))return"Hybrid selector returned a different element than the original";if(!g&&m&&m.result&&m.result.dataMomenticId!==s.dataMomenticId)return"CSS selector returned a different element than the original"}},{initialLocationResult:e,cacheEvaluationParams:r},{timeout:ie})}async function wT(t){let{logger:e}=t;try{let r=await XX(t);if(!r)return;throw e.warn({failReason:r},"Locator no longer matches cache, re-triggering evaluation"),new Ci("Locator no longer matches cache")}catch(r){if(r instanceof Ci)throw r;e.warn({err:r},"Failed to check whether locator has drifted from cache")}}import hD from"jpeg-js";import JX from"pixelmatch";function fD(t,e,r=.01){if(t.equals(e))return 0;let n=hD.decode(t),o=hD.decode(e);if(n.width!==o.width||n.height!==o.height)return 100;let i=n.width,a=n.height,s=Buffer.alloc(i*a*4);return JX(n.data,o.data,s,i,a,{threshold:r})/(i*a)*100}var yD=["date","datetime-local","month","time","week"],SD={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function bD(t){try{await X(ZX(t),{milliseconds:ie})}catch(e){t.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function ZX({root:t,text:e,options:r,logger:n,callbacks:o}){let i=(await Yt({root:t,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:Ke,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!SD[i])return;SD[i].test(e)&&n.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),r.clearContent=!1,n.info("Transforming datetime input to use sequential key presses")}import{z as Kr}from"zod";var ED=Kr.object({doubleClick:Kr.boolean().optional(),rightClick:Kr.boolean().optional(),force:Kr.boolean().optional(),waitForDownload:Kr.boolean().optional(),delayMs:Kr.number().optional(),downloadTimeoutMs:Kr.number().optional(),relativePosition:Kr.object({x:Kr.number(),y:Kr.number()}).optional(),iterations:Kr.number().optional()}),U4e=Kr.object({repeat:Kr.number().optional(),convertMeta:Kr.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:Kr.number().optional()});async function hh({locator:t,callbacks:e,logger:r,timeoutMs:n=Ke}){try{await xT(e,n);let o=t.evaluate(a=>{let s=window;s.momenticIsEligible=p=>{let g=window.getComputedStyle(p,null).getPropertyValue("display");if(g==="none"||g==="contents")return!1;let h=p.getBoundingClientRect();return!(!h.height||!h.width)},s.removeHighlightTimers=s.removeHighlightTimers||[],s.removeHighlightFunctions=s.removeHighlightFunctions||{};let c=0;for(;!s.momenticIsEligible(a)&&c<3;){if(!a.parentElement)throw new Error("No eligible non-empty parent found for highlighting");a=a.parentElement,c++}let l=a.style.getPropertyValue("outline"),u=a.style.getPropertyPriority("outline");a.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let d=`momentic${Math.floor(Math.random()*1e7)}`;s[d]=()=>{a.style.removeProperty("outline"),a.style.setProperty("outline",l,u),a.getAttribute("style")||a.removeAttribute("style")},s.removeHighlightTimers.push(setTimeout(()=>{s[d](),s.removeHighlightFunctions?.[d]&&delete s.removeHighlightFunctions[d]},5e3)),s.removeHighlightFunctions[d]=s[d]},void 0,{timeout:n}).then(()=>!0).catch(a=>(r.debug({err:a},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1));return await X(o,{milliseconds:n})}catch(o){return r.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function xT(t,e=Ke){let r=await t.state.getRoot();await Yt({root:r,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let a=i.pop();clearTimeout(a)}Object.values(o.removeHighlightFunctions??{}).forEach(a=>{a()})},timeout:e,arg:void 0,waitForPageLoad:t.waitForPageLoad,codePath:"removing element highlights"})}async function _T(t){let e=!!t.browserCallbacks.state.userBrowserSettings.visualActions;return hs({action:"clicking element",targetingResult:t.targetingResult,logger:t.logger,retryTimeoutMs:t.retryTimeoutMs,callbacks:t.browserCallbacks,func:async r=>vD({...t,targetingResult:r,useVisualClick:e})})}async function rJ({actionSource:t,position:e,targetingResult:r,logger:n}){let{locator:o}=r;if(t!=="click"||e)return{locator:o,position:e,redirected:!1};let i=await FN({targetingResult:r,logger:n});return i?{locator:i.locator,position:i.relativePoint,redirected:!0}:{locator:o,position:e,redirected:!1}}async function nJ(t,e){try{return await oJ(t,e)}catch(r){throw e.logger.warn({redirectionAttemptError:r,originalError:t},"Error handling click error, rethrowing original error"),t}}async function oJ(t,e){let{logger:r,redirectionAttempts:n=0}=e,o=e.targetingResult.locator;if(t.message.includes("label")&&t.message.includes("for=")&&t.message.includes("intercepts pointer events")){let i=await o.getAttribute("id",{timeout:Ke});if(!i)throw t;let a=o.page().locator(`[for=${JSON.stringify(i)}]`),s=await a.boundingBox({timeout:Ke});if(!s||s.width===0||s.height===0)throw r.warn("Label element has no bounding box, throwing original error..."),t;return r.warn({err:t},"Attempting locator redirection due to input being covered by label"),vD({...e,targetingResult:{locator:a,originalElementLocationResult:void 0,serverSideBoundingBox:s},redirectionAttempts:n+1})}else throw r.warn({err:t},"Click error does not match any known recoverable patterns, rethrowing"),t}async function iJ(t){let{logger:e,targetingResult:r,position:n,options:o}=t,i=ED.safeParse(o),a=Date.now(),{clickX:s,clickY:c,reason:l}=await lJ({targetingResult:r,position:n,options:o,logger:e,isAndroid:t.isAndroid});return e.info({position:n,options:i.success?i.data:void 0,clickLocation:{clickX:s,clickY:c,reason:l},duration:Date.now()-a},"Visual click"),{x:s,y:c}}async function aJ(t){let{actionSource:e,targetingResult:r,options:n,logger:o}=t,i=t.targetingResult.locator,a=n?.relativePosition??t.position;({locator:i,position:a}=await rJ({actionSource:e,position:a,targetingResult:r,logger:o}));let s=n?.force||r.hints?.force||!1;s&&!a&&r.hints?.relativeXYToLocator&&(a=r.hints.relativeXYToLocator);let c=i.toString();o.info({locator:c,position:a},"Locator click");try{n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:ie,position:a,delay:n?.delayMs??25,force:s}):await i.click({button:n?.rightClick?"right":"left",timeout:ie,position:a,delay:n?.delayMs??25,force:s,clickCount:n?.iterations})}catch(l){if(uJ(l))o.warn({err:l},"Click action timed out while waiting for navigation after completion, continuing...");else{if((t.redirectionAttempts??0)<1)return o.warn({err:l},"Error clicking on locator, attempting to recover..."),nJ(l,{...t,targetingResult:r});throw l}}return{locatorSource:c}}async function vD(t){let{options:e,logger:r,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=t,s;e?.waitForDownload&&(s=(async()=>{let u=e.downloadTimeoutMs??nT;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof tJ.TimeoutError?new M("ActionFailureError",`Download did not complete in ${u}ms`):new M("ActionFailureError",`Download failed: ${d.message}`)}})());try{await hh({locator:a.locator,callbacks:n,logger:r,timeoutMs:Ke})}catch(u){r.warn({err:u},"Error highlighting locator in click, continuing...")}let c,l;if(i?c=await iJ(t):l=(await aJ(t)).locatorSource,e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new M("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");r.info("Waiting for download to start and complete");let u=await X(s,{milliseconds:e.downloadTimeoutMs??nT});if(u instanceof Error)throw u;return{downloadedFile:await cJ(u,o.createIsolatedFolder,r),coordinates:c,locatorSource:l}}else throw new Error("No download promise or error but the step requested to wait for a download");return{coordinates:c,locatorSource:l}}async function sJ(t,e){let r=t.serverSideBoundingBox??await t.locator.boundingBox({timeout:ie});if(!r){let i=t.originalElementLocationResult?.serializedElement;throw new M("ActionFailureError",`${qf}${i?`: ${i}`:""}`)}if(t.hints?.relativeXYToLocator){let i=r.x+t.hints.relativeXYToLocator.x,a=r.y+t.hints.relativeXYToLocator.y;return[{x:i,y:a},"targeting hint"]}let n=r.x+r.width/2,o=r.y+r.height/2;return[{x:n,y:o},"halfway point"]}async function lJ({options:t,targetingResult:e,position:r,logger:n}){let o,i,a;if(t?.relativePosition){let u=e.serverSideBoundingBox??await e.locator.boundingBox({timeout:ie}),d=t.relativePosition.x,p=t.relativePosition.y;u?.width&&(d=Math.max(0,Math.min(t.relativePosition.x,u.width))),u?.height&&(p=Math.max(0,Math.min(t.relativePosition.y,u.height))),o=(u?.x??0)+d,i=(u?.y??0)+p,a="relative position from user"}else if(r){let u=e.serverSideBoundingBox??await e.locator.boundingBox({timeout:ie});o=(u?.x??0)+r.x,i=(u?.y??0)+r.y,a="predefined position"}else{let[u,d]=await sJ(e,n);o=u.x,i=u.y,a=d}let s=e.locator.page(),c=t?.rightClick?"right":"left",l=t?.delayMs??25;return t?.doubleClick?await s.mouse.dblclick(o,i,{button:c,delay:l}):await s.mouse.click(o,i,{button:c,delay:l,clickCount:t?.iterations}),{clickX:o,clickY:i,reason:a}}async function cJ(t,e,r){r.info("Download detected, saving file to disk");let n=await t.path(),o=mT(t.suggestedFilename()),i=e();await t.saveAs(eJ(i,o)),TD(n,{force:!0}),setTimeout(()=>{TD(i,{recursive:!0,force:!0})},5*60*1e3);let a=HN(QX(i),o);return r.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function uJ(t){return t.message.includes("locator.click: Timeout")&&t.message.includes("click action done")}import{platform as dJ}from"os";var pJ={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function mJ(){let t=dJ();return t==="win32"?"win32":t==="darwin"?"darwin":"linux"}function AD(t){return JSON.stringify(t.split("+").sort())}function fh(t,e){let r=mJ(),n=AD(t);for(let o of Object.values(pJ))if(Object.values(o).some(i=>AD(i)===n))return o[r];return process.platform==="darwin"&&!e?t=t.replaceAll("Control","Meta"):t=t.replaceAll("Meta","Control"),t}async function IT({frame:t,page:e,deltaX:r,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:s,logger:c}){if(!r&&!o)return;let l=n==="left"?-1:1,u=i==="up"?-1:1;if(t)await Yt({root:t,fn:([d,p,m,g])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*m,window.scrollY+(p??window.innerHeight)*g),arg:[r,o,l,u],waitForPageLoad:s.waitForPageLoad,timeout:rt,codePath:"scrolling page"});else{let d=e.viewportSize()||Ar,p=await Yt({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:rt,codePath:"computing page height"}),[m,g,h]=await Yt({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let S=f.getBoundingClientRect();return[f.scrollTop,S.x,S.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:rt,codePath:"computing active element position"});await e.mouse.wheel((r??d.width)*l,(o??d.height)*u);try{let f=Date.now();for(;Date.now()-f<rt;){a?.throwIfAborted();let S=await X(e.evaluate(()=>document.body.scrollHeight),{milliseconds:Ke}),[b,y,T]=await X(e.evaluate(()=>{let w=document.activeElement;if(!w)return[void 0,void 0,void 0];let P=w.getBoundingClientRect();return[w.scrollTop,P.x,P.y]}),{milliseconds:Ke});if(S===p&&b===m&&y===g&&T===h)break;p=S,m=b,g=y,h=T,await fe(lr)}}catch(f){c.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function PT(t,e){let r,n;for(let o=0;o<4;o++)try{return r=t.pages(),await Promise.all(r.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await fe(lr)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}async function MT(t){let{page:e,deltaX:r,deltaY:n,steps:o,visualTarget:i,isAndroid:a,hoverDurationMs:s}=t;if(a){await gJ(t);return}await e.mouse.move(i.x,i.y),await e.mouse.down(),await e.mouse.move(r+i.x,n+i.y,{steps:o}),await fe(s??na),await e.mouse.up()}async function RD({page:t,fromLocator:e,toLocator:r,stepCount:n,dragDurationMs:o,hoverDurationMs:i}){let a=await r.boundingBox({timeout:ie});if(!a)throw new M("ActionFailureError","Could not get bounding box of 'to' target element");let s=await e.boundingBox({timeout:ie});if(!s)throw new M("ActionFailureError","Could not get bounding box of 'from' target element");let c=a.x+a.width/2,l=a.y+a.height/2,u=s.x+s.width/2,d=s.y+s.height/2;await MT({page:t,deltaX:c-u,deltaY:l-d,steps:n,dragDurationMs:o,hoverDurationMs:i,visualTarget:{x:u,y:d},isAndroid:!0})}async function CD(t,e,r,n){await t.mouse.move(e.x,e.y,{steps:3}),await t.mouse.down(),await t.mouse.move(r.x,r.y,{steps:3}),await fe(Math.min(n.hoverDurationMs??500,uh)),await t.mouse.up()}async function gJ(t){let{page:e,deltaX:r,deltaY:n,steps:o,visualTarget:i,dragDurationMs:a,hoverDurationMs:s}=t,c=Math.max(1,o??1),l=i.x,u=i.y,d=i.x+r,p=i.y+n;await e.evaluate(async({startX:m,startY:g,endX:h,endY:f,stepCount:S,dragDurationMs:b,hoverDurationMs:y})=>{let T=document.elementFromPoint(m,g)??document.body??document.documentElement,P=window._momenticMobileUtilities.dispatchTouch;P(T,"touchstart",m,g);for(let A=1;A<=S;A+=1){let x=m+(h-m)*A/S,O=g+(f-g)*A/S;P(T,"touchmove",x,O),await new Promise(L=>setTimeout(L,Math.floor((b??500)/S)))}y&&await new Promise(A=>setTimeout(A,y)),P(T,"touchend",h,f)},{startX:l,startY:u,endX:d,endY:p,stepCount:c,dragDurationMs:a,hoverDurationMs:s})}import{randomUUID as vJ}from"crypto";import{cloneDeep as NT}from"lodash-es";function sa(t,e){let r=t.findIndex(n=>n===e);if(!(r===-1||!t[r+1]))return t[r+1]}import{createHash as hJ}from"crypto";var fJ="v1";function OT(t,e){if(t.tagName.toLowerCase()==="svg"&&!yJ(t))try{let r=wD(t,e),n=SJ(JSON.stringify(r));return{version:fJ,json:r,hash:n}}catch{return}}function SJ(t){return hJ("md5").update(t).digest("hex")}function wD(t,e){let r=t.tagName.toLowerCase(),n=bJ(t);if(r==="image"&&n["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:r,props:n,children:[]};for(let i of t.childrenBackendIds){let a=e.backendIdToNode[i];if(a&&a.nodeType===1){let s=wD(a,e);s&&o.children.push(s)}}return o}function yJ(t){let e=t.computedStyles.display,r=t.computedStyles.visibility,n=t.computedStyles.opacity;return e==="none"||r==="hidden"||n==="0"}function bJ(t){let e={},r=t.attributes;for(let n of Object.keys(r))mn.visualAttributesForSvgSerialization.includes(n)&&(e[n]=r[n]);return r.id&&t.tagName.toLowerCase()!=="svg"&&(e.id=r.id),e}var fs={r:147,g:196,b:125,a:.55},_D={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:fs,paddingColor:fs,borderColor:fs,marginColor:fs,eventTargetColor:fs,shapeColor:fs,shapeMarginColor:fs,showInfo:!0,showAccessibilityInfo:!0};function ID({snapshot:t,devicePixelRatio:e,computedStylesToFetch:r,logger:n}){let o=t.strings,i=t.documents,a={},s={},c={roots:[],backendIdToNode:a,frameIndexToIframeNode:s};return i.forEach((l,u)=>{let d=EJ({allDocuments:i,stringConstants:o,computedStylesToFetch:r,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:s,logger:n});c.roots.push(d)}),c}function EJ({allDocuments:t,stringConstants:e,computedStylesToFetch:r,devicePixelRatio:n,frameIndex:o,frameIndexToIframeNode:i,backendIdToNode:a,logger:s}){let c=t[o],l=c.layout,u={};l.nodeIndex.forEach((A,x)=>{u[A]=x});let d=l.styles,p=l.bounds??[],m=c.nodes,g=m.contentDocumentIndex??{index:[],value:[]},h=m.backendNodeId??[],f=m.attributes??[],S=m.parentIndex??[],b=m.nodeName??[],y=m.nodeType??[],T=m.pseudoType??{index:[],value:[]},w=m.inputChecked??{index:[]},P=e[c.frameId];for(let A=0;A<h.length;A++){let x=h[A],O=y[A],L=f[A]??[],N=S[A]!==void 0&&S[A]>=0?S[A]:void 0,j=N!==void 0?h[N]:void 0,W=j!==void 0?a[j]:void 0,B=T.index.indexOf(A),xe=B!==-1?e[T.value[B]]:void 0,F=u[A],z;F?z=p[F]??[]:z=[];let ae=b[A]!==void 0?e[b[A]]?.toLowerCase():void 0;if(!ae){s.warn({backendNodeId:x,frameId:P,frameIndex:o,nodeBounds:z},"DOM node has no tag name");continue}let ue={backendNodeId:x,psuedoType:xe,nodeType:O,frameIndex:o,parentFrameId:P,ownedFrameId:void 0,bounds:{x:z[0]??null,y:z[1]??null,width:z[2]??null,height:z[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:j??null,tagName:ae,parent:W??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};W&&W.childrenBackendIds.push(x);let _e=g.index.indexOf(A);if(_e!==-1){let le=g.value[_e];i[le]=ue;let Q=t[le]?.frameId;ue.ownedFrameId=Q!==void 0?e[Q]:void 0}for(let le of Object.keys(ue.bounds)){let Q=le;ue.bounds[Q]!==null&&(ue.bounds[Q]/=n)}let Se=F!==void 0?d[F]??[]:[];for(let le=0;le<Se.length&&!(le>=r.length);le++){let Q=Se[le];if(Q===void 0||isNaN(Q))continue;let Te=e[Q];if(Te===void 0)continue;let Ae=r[le];ue.computedStyles[Ae]=Te}for(let le=0;le<L.length;le+=2){let Q=L[le],Te=L[le+1];if(!Q||!Te)continue;let Ae=e[Q],I=e[Te];!Ae||!I||(ue.attributes[Ae]=I)}w.index.includes(A)&&(ue.attributes.checked="true"),a[ue.backendNodeId]=ue}return a[h[0]]}function LT(t,e){if(t.mPathSelector)return t.mPathSelector;let r=t.parent,n;if(!r)n=t.tagName;else if(t.tagName==="body")n="body";else{let i=r.childrenBackendIds.filter(c=>e.backendIdToNode[c]?.nodeType===1&&!e.backendIdToNode[c]?.psuedoType).indexOf(t.backendNodeId),a=` > ${t.tagName}:nth-child(${i+1})`;n=`${LT(r,e)}${a}`}return t.mPathSelector=n,n}function xD(t,e){return t.parentBackendNodeId!==null?e.backendIdToNode[t.parentBackendNodeId]:t.frameIndex===0?void 0:e.frameIndexToIframeNode[t.frameIndex]}var TJ=["html","#document","#document-fragment"];function PD({node:t,domGraph:e}){let r=[],n=t,o=xD(t,e);if(!o)return[t.tagName];let i=()=>{if(n=o,o=xD(o,e),!o&&n.frameIndex!==0)throw new Error("No parent node but not in main frame")},a=0;for(;o&&a<1e6;){if(a++,TJ.includes(n.tagName)){i();continue}if(n.tagName==="body")r.push("body");else{let c=!1,l=1;for(let u=0;u<o.childrenBackendIds.length;u++){let d=o.childrenBackendIds[u],p=e.backendIdToNode[d];if(d===n.backendNodeId){r.push(`${n.tagName}:nth-child(${l})`),c=!0;break}else p?.nodeType===1&&!p.psuedoType&&l++}if(!c)throw new Error(`Could not find child (${n.tagName}) in parent's children list (${o.tagName})`)}i()}return r.reverse()}function MD(t,e){let r=t.locator("html"),n=[];for(let o=0;o<e.length;o++){let i=e[o];if(n.push(i),i.startsWith("iframe")){let a=n.join(" > ");n=[],o<e.length-1?r=r.frameLocator(a):r=r.locator(a)}}if(n.length&&(r=r.locator(n.join(" > "))),"owner"in r)throw new Error("Final locator from mpath is a frame locator");return r}async function OD(t,e){await t.send({method:"DOM.getDocument",params:{depth:0},timeout:rt});let r=await t.send({method:"DOM.requestNode",params:{objectId:e},timeout:rt}),o=(await t.send({method:"DOM.getAttributes",params:{nodeId:r.nodeId},timeout:rt})).attributes,i=sa(o,ms);if(!i)throw new Error(`Could not find attribute ${ms} for object ${e}`);return i}var AJ=["focusable","keyshortcuts","controls","live","relevant","orientation"],RJ=["selected","readonly","modal","required","invalid"],CJ=["id","name","role","content"],LD=["absolute","fixed","sticky"],wJ=["i","label"],xJ=["path"],_J=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator","LabelText"],kD=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],UD=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],IJ=["menulistpopup","statictext","inlinetextbox"],PJ=80,ND=100,FD=50,UT=["StaticText","ListMarker","RootWebArea","LineBreak","::before","::after"],MJ=["cite"],OJ={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"],emphasis:["em"]},LJ={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},DD={indentLevel:0},DT=class t{id;role;name;nameSources;tagName;content;properties;internalProperties;ignoredReasons;dataMomenticId;importantProperties;pathFromRoot;mPathSelector;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;flagNotActionableNodes;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,this.ignoredReasons=e.ignoredReasons,this.importantProperties=e.importantProperties,this.flagNotActionableNodes=e.flagNotActionableNodes,e.properties&&e.properties.forEach(r=>{r.name==="keyshortcuts"?this.dataMomenticId=parseInt(r.value.value):this.properties[r.name]=r.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let r=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(r&&r.length<FD?r:""),this.role=this.role||(e.domNode.attributes.role??""),UJ(this.properties,e.domNode,e.importantProperties)}BJ(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(e){if(this.domNode&&xJ.includes(this.domNode.tagName)&&!this.domNode.attributes["aria-label"]||this.ignoredReasons.some(n=>UD.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>GD(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>VD(o,e))||e.styles?.some(o=>{let i=o.split(":");if(i.length!==2)return!1;let a=i[0]?.trim(),s=i[1]?.trim();if(a===void 0||s===void 0)return!1;let c=this.domNode?.computedStyles[a];return c!==void 0&&(c===s||s==="*")}))return!0}if(this.domNode&&wJ.includes(this.domNode.tagName)||_J.includes(this.role.toLowerCase())||this.domNode?.computedStyles["background-image"]&&this.domNode?.computedStyles["background-image"]!=="none"&&this.children.length===0||this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||mn.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let r=this.properties.class;return typeof r=="string"&&r.split(" ").some(n=>jD(n))?!0:this.children.every(n=>n.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(n=>n.role==="StaticText")||this.children.length>1&&this.children.some(n=>n.tagName==="input")||this.children.some(n=>n.isIneligible())?!0:this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height)?!1:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(n=>n.startsWith("data"))}shouldSerializeBounds(){let e=this.domNode?.computedStyles.position;return!!(e&&(e==="absolute"||e==="fixed"||e==="sticky"))}isIneligible(){return!!(this.domNode?.computedStyles.display==="contents"||this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height))}canRedirectFromIneligibleTag(){if(!this.domNode)return!1;let e=this.internalProperties.hasExplicitPointingLabel===!0;return UN({tagName:this.domNode.tagName,width:this.domNode.bounds.width,height:this.domNode.bounds.height})&&e}serialize(e=DD){let r=Object.assign({},DD,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:c}=r,l=NT(this.properties),u=" ".repeat(n),d=this.role||"",p=this.tagName??"unknown",m=this.name;d==="heading"&&m==="heading"&&(m=""),this.nameSources?.find(A=>!A.superseded&&A.type==="contents")&&this.children.length>0&&(m="");let h=this.nameSources?.find(A=>!A.superseded);if(h&&!h.nativeSource&&h.type==="relatedElement"){let A=h.attributeValue?.relatedNodes??[];A.length===1&&A[0].text&&A[0].text===m&&(m="")}let f=UT.includes(this.role)||MJ.includes(this.tagName||"");if(this.role==="StaticText")return`${u}${m}
|
|
4594
4594
|
`;let S=`${u}<${p}`;!a&&!f&&(S+=` id="${this.id}"`);let b=s??!1;(l.multiline||l.contenteditable)&&this.children.length>0&&(b=!0),d&&d!=="generic"&&d!==p&&!(OJ[d]??[]).includes(p)&&(S+=` role=${JSON.stringify(d)}`),m&&(S+=` name=${JSON.stringify(m)}`),this.content&&!b&&(S+=` content=${JSON.stringify(this.content)}`);let y=this.isIneligible(),T=y&&this.canRedirectFromIneligibleTag();if(this.flagNotActionableNodes&&this.tagName!=="#document"&&y&&!T&&(S+=` ${mn.ineligibleElementAttribute}`),this.shouldSerializeBounds()&&this.domNode?.bounds){let A=this.domNode.bounds,x=Math.round(A.x??0),O=Math.round(A.y??0),L=Math.round((A.x??0)+(A.width??0)),N=Math.round((A.y??0)+(A.height??0));S+=` bounds=[${x} ${O} ${L} ${N}]`}let w=Date.now();if(Object.keys(l).length>0&&!i){if(Date.now()-w>1e3)throw new Error(`Serialization for the HTML element with tag ${p} and internal ID ${this.id} took too long. Please ensure your machine has enough resources to run Momentic.`);Object.entries(l).forEach(([A,x])=>{if(!AJ.includes(A)){{if(RJ.includes(A)&&(!x||x==="false"))return;if(A==="value"&&b&&(l.type==="text"||this.role==="textbox"))return;if(A==="level"&&`${x}`=="1")return;if(A==="url"&&l.src&&p==="img")return;if(A==="url"&&l.href&&p==="a")return;if(A==="editable"&&x==="plaintext")return;if(A==="type"&&x===p)return;if(c&&!LJ[A])return}typeof x=="string"?S+=` ${A}="${Tt(x,ND,!0)}"`:typeof x=="boolean"?x?S+=` ${A}`:S+=` ${A}={false}`:typeof x<"u"&&(S+=` ${A}={${Tt(JSON.stringify(x),ND,!0)}}`)}})}if(p==="::before"||p==="::after"){let A="";for(let x of this.children)A+=x.serialize({...e,indentLevel:n,neighbors:0});return A}let P=e.maxLevel!==void 0&&n/2>=e.maxLevel;if(this.children.length===0||o||P)S+=` />
|
|
4595
4595
|
`;else{let A="";for(let O of this.children)A+=O.serialize({...e,indentLevel:n+2,neighbors:0});let x=A.trim();x.length<=PJ&&!x.includes(`
|
|
4596
4596
|
`)?S+=`>${x}</${p}>
|
|
@@ -4598,16 +4598,16 @@ ${c}`,{errOptions:{cause:t}})}if(i.includes("element is not visible")){let c="Th
|
|
|
4598
4598
|
${A}${u}</${p}>
|
|
4599
4599
|
`}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let A=this.parent.children.findIndex(L=>L.id===this.id),x=A>0?this.parent.children[A-1]?.serialize({...e,neighbors:0}):"",O=A<this.parent.children.length-1?this.parent.children[A+1]?.serialize({...e,neighbors:0}):"";return`${x||""}
|
|
4600
4600
|
${S}
|
|
4601
|
-
${O||""}`}return S}shallowClone(){let e=new t({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],ignoredReasons:this.ignoredReasons,backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:NT(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=NT(this.properties),e}},kT=class t{constructor(e,r,n,o,i={}){this.root=e;this.a11yIdNodeMap=r;this.dataMomenticIdMap=n;this.selectorToNodeMap=o;this.nodeIdHasPointingLabelMap=i}serialize(e){return this.root.serialize(e)}pruneUsingSummaries(e){let r=this.root;if(!r)throw new Error("Cannot prune a11y tree with no root");let n={},o={},i={},a=c=>{let l=c.shallowClone();if(e[c.id])return l.properties["data-momentic-summary"]=e[c.id],n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l;let u=[];for(let d of c.children){let p=a(d);p&&(u.push(p),p.parent=l)}return l.children=u,n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l},s=a(r);return new t(s,n,o,i,this.nodeIdHasPointingLabelMap)}pruneUsingRelevantIds(e){let r=this.root;if(!r)throw new Error("Cannot prune a11y tree with no root");function n(i,a=!1){let s=e.has(`${i.id}`)||i.id===r?.id,c=i.shallowClone(),l=i.children,u=!1,d=[];for(let p of l){let m=n(p,s||u);m&&(d.push(m),m.parent=c,u=!0)}if(c.children=d,s||u)return c;if(UT.includes(i.role)&&a)return c}let o=n(r);return new t(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap,this.nodeIdHasPointingLabelMap)}pruneToSerializedCharLimit(e){let r=this.root;if(!r)throw new Error("Cannot prune a11y tree with no root");let n=new WeakMap,o=(s,c)=>{if(n.has(s))return n.get(s);let l=s.serialize({indentLevel:c,noChildren:!0});return n.set(s,l),l},i=(s,c,l)=>{let u=s.shallowClone();u.children=[];let d=o(s,c).length;if(l<=d)return{clone:u,used:d};if(s.role==="StaticText"||s.children.length===0)return{clone:u,used:d};let p=d,m=l-p;for(let g of s.children){let h=c+2,f=o(g,h).length;if(m<f)break;let{clone:S,used:b}=i(g,h,m);if(b>m)break;u.children.push(S),S.parent=u,p+=b,m-=b}return{clone:u,used:p}},{clone:a}=i(r,0,Math.max(1e4,e));return new t(a,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap,this.nodeIdHasPointingLabelMap)}};function NJ(t){return t.name?.value?`"${t.name.value}"`:t.role?.value&&t.role.value!=="none"&&t.role.value!=="generic"?`"${t.role.value}"`:`"${t.nodeId}"`}function DJ(t,e,r,n){return t.bounds.x===null||t.bounds.y===null||t.bounds.height===null||t.bounds.width===null||t.bounds.width===0||t.bounds.height===0?!0:t.bounds.x+t.bounds.width<e.leftBound||t.bounds.x>e.rightBound?(um({logger:r,logKey:n,maxCount:5,intervalMs:3e3},{domNode:t,logKey:n},"Filtering out node since it is not in the viewport horizontally"),!1):t.bounds.y+t.bounds.height<e.upperBound||t.bounds.y>e.lowerBound?(um({logger:r,logKey:n,maxCount:5,intervalMs:3e3},{domNode:t,logKey:n},"Filtering out node since it is not in the viewport vertically"),!1):t.computedStyles.display==="none"?(r.debug({domNode:t},"Filtering out node since it has display none"),!1):!0}async function BD({node:t,parent:e,frameId:r,frameContext:n,axGraph:o,domGraph:i,inputNodeMap:a,explicitLabelTargetDomIds:s,flagNotActionableNodes:c,showZeroOpacityElements:l,filterByViewport:u,viewportDetails:d,useMPaths:p,importantProperties:m,allowedA11yIgnoreReasonsOverride:g,cdpClient:h,logger:f,callId:S}){if(!e&&t.parentId)throw new Error(`Got no parent for accessibility node ${t.nodeId}: ${JSON.stringify(t)}`);let b=(F,z={})=>{},y=t.backendDOMNodeId,T=IJ.includes(t.role?.value?.toLowerCase()??"");if(!T&&y===void 0)return b("Filtering out node since it doesn't exist in the DOM"),[];let w=y?i.backendIdToNode[y]:void 0;if(!T&&!w)try{let F=await X(h.send({method:"DOM.describeNode",params:{backendNodeId:y}}),{milliseconds:750,fallback:()=>{f.debug("Timeout getting node from CDP while processing a11y tree")}});if(F&&F.node.nodeName.toLowerCase()==="slot"&&F.node.distributedNodes?.length)f.debug({parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNodeName:t.name?.value},"Redirecting node to assigned slot");else return b("Filtering out node since it doesn't exist in the DOM",{cdpResult:F?.node.name??F?.node.nodeName}),[]}catch(F){return b("Filtering out node since it doesn't exist in the DOM",{err:F}),[]}if(w&&e&&u&&d&&t.backendDOMNodeId&&!DJ(w,d,f,S))return w.momenticIgnored=!0,[];if(w&&w.computedStyles.display==="none")return w.momenticIgnored=!0,[];if(w&&w.computedStyles.opacity==="0"&&l!==!0){if(l==="inputs-only"&&w.tagName.toLowerCase()!=="input")return w.momenticIgnored=!0,[];if(l===!1)return w.momenticIgnored=!0,[]}let P=t.name?.value?typeof t.name.value=="string"?t.name.value:`${t.name.value}`:"",A=t.value?.value?typeof t.value.value=="string"?t.value.value:`${t.value.value}`:"",x=new DT({domNode:w,id:parseInt(t.nodeId),role:t.role?.value||"",name:P,nameSources:t.name?.sources,content:A,properties:t.properties,children:[],ignoredReasons:t.ignoredReasons?.filter(F=>(g??kD).includes(F.name)||UD.includes(F.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+NJ(t),backendNodeID:t.backendDOMNodeId,ignoredByCDP:t.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},importantProperties:m,parentFrame:n.type==="root"?void 0:n,flagNotActionableNodes:c}),O=n,L=a[r],N=r;if(w?.tagName.toLowerCase()==="iframe"&&w.ownedFrameId){let F=n.childFrames.find(ue=>ue.frameId===w.ownedFrameId),z=o[F?.frameId??""]?.root,ae=a[F?.frameId??""];if(F&&z&&ae){t.childIds&&t.childIds.length>0&&f.debug("Replacing existing node's children with children from the iframe");let ue=z;t.childIds=ue.childIds,O=F,L=ae,N=F.frameId}}let j=w?.childrenBackendIds?.length??0,W=(t.childIds??[]).filter(F=>!!L.get(parseInt(F))).length;if(j>W){let F=t.childIds?.map(ae=>L.get(parseInt(ae))).filter(Boolean).map(ae=>ae?.backendDOMNodeId).filter(ae=>ae!==void 0)??[],z=0;for(let ae of w?.childrenBackendIds??[]){if(F.includes(ae)){z=(t.childIds?.findIndex(Q=>L.get(parseInt(Q))?.backendDOMNodeId===ae)??0)+1;continue}let ue=i.backendIdToNode[ae];if(!ue||ue?.tagName.toLowerCase()!=="svg")continue;let _e=Math.floor(-1*Math.random()*1e7),ye={nodeId:_e.toString(),parentId:t.nodeId,ignored:!1,backendDOMNodeId:ae,frameId:N,role:{type:"string",value:"graphics-symbol"}};L.set(_e,ye),t.childIds||(t.childIds=[]),t.childIds.splice(z,0,_e.toString()),z++}}if(t.childIds?.length===1&&w){let F=L.get(parseInt(t.childIds[0])),z=F?.role?.value,ae=w.childrenBackendIds;if(F&&z==="StaticText"&&ae.length===1){let ue=i.backendIdToNode[ae[0]];if(ue?.tagName?.toLowerCase()==="span"){let _e=Math.floor(-1*Math.random()*1e7).toString(),ye={nodeId:_e,parentId:t.nodeId,ignored:!1,backendDOMNodeId:ue.backendNodeId,frameId:N,childIds:[F.nodeId]};F.parentId=_e,L.set(parseInt(_e),ye),t.childIds=[_e]}}}if(w?.tagName.toLowerCase()==="label"){let F=w.attributes.for?.trim();F&&s.add(F)}for(let F of t.childIds??[]){if(!F)continue;let z=L.get(parseInt(F));if(!z)continue;let ae=await BD({node:z,parent:x,domGraph:i,explicitLabelTargetDomIds:s,axGraph:o,frameId:N,frameContext:O,inputNodeMap:a,cdpClient:h,logger:f,callId:S,filterByViewport:u,showZeroOpacityElements:l,importantProperties:m,viewportDetails:d,useMPaths:p,flagNotActionableNodes:c});ae.length&&(x.children=x.children.concat(ae))}if(x.role==="StaticText"&&(x.children=[]),x.role==="ListMarker")if(x.children.length!==1||x.children[0].role!=="StaticText")f.debug({childLen:x.children.length,childRoles:x.children.map(F=>F.role),childTags:x.children.map(F=>F.tagName),currentTag:x.tagName,currentName:x.name},"Unexpected ListMarker structure (processA11yTreeDFS)");else return x.children;if(x.children.length===1&&x.children[0].role==="StaticText"){let F=x.name,ae=x.children[0].name;(F===ae||!ae)&&(x.name="")}let B=[];for(let F=x.children.length-1;F>=0;F--){let z=x.children[F];if(z.role!=="StaticText"){B.push(z);continue}if(F===0||x.children[F-1].role!=="StaticText"){B.push(z);continue}x.children[F-1].name+=z.name}if(x.children=B.reverse(),!x.isInteresting(m)&&t.parentId)return w&&(w.momenticIgnored=!0),x.children;for(let F of x.children)F.parent=x;return FJ(x),w&&p&<(w,i),[x]}function zD({node:t,a11yIdNodeMap:e,dataMomenticIdMap:r,logger:n,callId:o,domGraph:i,useMPaths:a,selectorToNodeMap:s,nodeIdHasPointingLabelMap:c,explicitLabelTargetDomIds:l,iconKnowledgeBase:u,startId:d=1}){t.id=d,d+=1,e[t.id]=t,t.dataMomenticId?r[t.dataMomenticId]=t:UT.includes(t.role);let p=t.backendNodeId,m=p!==void 0?i.backendIdToNode[p]:void 0;a&&m&&m.mPathSelector&&(s[m.mPathSelector]=t,t.mPathSelector=m.mPathSelector);let g=m?.attributes.id?.trim();if(g&&l.has(g)&&(t.internalProperties.hasExplicitPointingLabel=!0,c[t.id]=!0),u&&m&&m.tagName?.toLowerCase()==="svg"){let h=OT(m,i),f=h?u[h.hash]:void 0,S=f?f.description:void 0;f&&(t.properties["data-momentic-description"]=S)}for(let h of t.children)d=zD({node:h,a11yIdNodeMap:e,dataMomenticIdMap:r,logger:n,callId:o,startId:d,useMPaths:a,domGraph:i,selectorToNodeMap:s,nodeIdHasPointingLabelMap:c,explicitLabelTargetDomIds:l,iconKnowledgeBase:u});return d}async function HD({rawA11yGraph:t,domGraph:e,startingFrameId:r,logger:n,cdpClient:o,filterByViewport:i,showZeroOpacityElements:a,flagNotActionableNodes:s,importantProperties:c,viewportDetails:l,useMPaths:u,frameContext:d,iconKnowledgeBase:p,allowedA11yIgnoreReasonsOverride:m}){let g=r??"root",h=t[g]?.root;if(!h)throw new Error("A11y tree has no root");let f=vJ(),S=new Set,b=O=>{let L=O.allNodes.filter(j=>!j.ignoredReasons?.find(B=>(m??kD).includes(B.name))),N=new Map;return L.forEach(j=>{N.set(parseInt(j.nodeId),j)}),N},y={};Object.entries(t).forEach(([O,L])=>{y[O]=b(L)});let T=await BD({node:h,domGraph:e,explicitLabelTargetDomIds:S,parent:null,inputNodeMap:y,axGraph:t,frameId:g,frameContext:d,cdpClient:o,logger:n,callId:f,showZeroOpacityElements:a,importantProperties:c,filterByViewport:i,viewportDetails:l,useMPaths:u,flagNotActionableNodes:s,allowedA11yIgnoreReasonsOverride:m});if(T.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(T)}`);if(T.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let w={},P={},A={},x={};return zD({node:T[0],a11yIdNodeMap:w,dataMomenticIdMap:P,selectorToNodeMap:A,nodeIdHasPointingLabelMap:x,explicitLabelTargetDomIds:S,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:p}),new kT(T[0],w,P,A,x)}function kJ(t,e,r,n){if(t==="class"){if(r.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<FD&&!mn.bannedClassSubstrings.some(s=>a.includes(s))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(jD(a,n)){i.push(a);continue}return i.length?i.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let o=Number(e);if(!Number.isNaN(o))return o}catch{}return t==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function UJ(t,e,r){if(!e)return;Object.entries(e.attributes).forEach(([a,s])=>{let c=t[a]||a.startsWith("aria")||CJ.includes(a);if((mn.relevantElementAttributes.includes(a)||GD(a,r))&&!c){let u=kJ(a,s,e,r);u!==null&&(t[a]=u)}});let n,o=[];if(e.computedStyles.position&&LD.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of LD)if(e.attributes.style.includes(`position: ${a}`)){n=a;break}}n&&o.push(`position: ${n}`);let i;e.computedStyles.opacity&&e.computedStyles.opacity==="0"&&(i="opacity: 0"),i&&o.push(i);for(let a of r?.styles??[]){let s=a.split(":"),c=s[0]?.trim(),l=s[1]?.trim(),u=e.computedStyles[c??""];if(c!==void 0&&l!==void 0&&u!==void 0&&(l==="*"||u===l)){let d=e.computedStyles[c],p=`${c}: ${d}`;o.includes(p)||o.push(p)}}o.length>0&&(t.style=o.join("; "))}function FJ(t){let e=t.properties.class;if(typeof e=="string"&&e.includes("cm-content")){t.children.forEach((i,a)=>{i.properties["cm-line-number"]=`${a+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){t.children.forEach((i,a)=>{i.properties["block-number"]=`${a+1}`}),t.children.length>0&&(t.children[t.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(t.tagName==="table"){let i=[],a=t.children.find(c=>c.tagName==="thead");if(a){let c=a.children.find(l=>l.tagName==="tr");if(c){let l=c.children.filter(u=>u.tagName==="th");l.forEach((u,d)=>{u.properties["col-index"]||(u.properties["col-index"]=d+1),i?.push(Tt(u.name,100,!1))}),i?.length!==l.length&&(i=void 0)}}let s=0;for(let c of t.children)if(c.tagName==="tbody")for(let l=0;l<c.children.length;l++){let u=c.children[l];if(u.tagName!=="tr")continue;if(l===0&&!i?.length){let m=u.children.filter(g=>g.tagName==="th");if(m.length){if(i=m.map(g=>Tt(g.name,100,!1)),i.length===m.length)continue;i=void 0}}s+=1,u.properties["row-index"]||(u.properties["row-index"]=s);let d=u.children.filter(m=>m.tagName==="td"||m.tagName==="th"),p=d.length===i?.length;d.forEach((m,g)=>{m.tagName!=="th"&&(m.properties["col-index"]||(m.properties["col-index"]=g+1),p&&(m.properties.col||(m.properties.col=i[g])))})}}}function BJ(t){let e=t.properties.class,r=typeof e=="string"&&e.includes("cm-content");t.internalProperties.inCodeMirrorEditor=t.internalProperties?.inCodeMirrorEditor||r}function jD(t,e){if(e&&VD(t,e))return!0;if(mn.bannedClassSubstrings.some(r=>t.includes(r)))return!1;if(mn.alwaysInterestingClassNames.includes(t))return!0;for(let r of mn.alwaysInterestingClassPrefixes)if(t.startsWith(r))return!0;return!1}function GD(t,e){if(e?.attributes?.includes(t))return!0;for(let r of e?.attributes??[])if(r.endsWith("*")){let n=r.slice(0,-1);if(t.startsWith(n))return!0}return!1}function VD(t,e){if(e?.classes?.includes(t))return!0;for(let r of e?.classes??[])if(r.endsWith("*")){let n=r.slice(0,-1);if(t.startsWith(n))return!0}return!1}var Sh=class t{constructor(e,r,n,o,i){this.session=e;this.logger=r;this.contextGetter=n;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;loadEventLogs=[];static async init({logger:e,contextGetter:r,pageGetter:n,defaultTimeoutMs:o}){let i=r(),a=n(),s,c;for(let u=0;u<2;u++)try{s=await X(i.newCDPSession(a),{milliseconds:o*u,fallback:()=>{throw new M("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await Se(lr),c=d}if(!s)throw c;let l=new t(s,e,r,n,o);try{await X(l.registerHandlers(s),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(u){throw l.cdpFullyDead=!0,new M("UserInfrastructureError",`Failed to initialize CDP client: ${u}`)}return l}async registerHandlers(e){e.on("Target.attachedToTarget",async()=>{try{await e.send("Runtime.runIfWaitingForDebugger")}catch(r){this.logger.warn({err:r},"Failed to run Runtime.runIfWaitingForDebugger")}}),e.on("Target.targetCrashed",r=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},targetCrashDetails:JSON.stringify(r)},this.logger.error({payload:r},"CDP session crashed, Momentic will likely not function correctly")}),e.on("Inspector.targetCrashed",r=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},inspectorCrashDetails:JSON.stringify(r)},this.logger.error({payload:r},"CDP inspector session crashed, Momentic will likely not function correctly")}),e.on("Page.frameRequestedNavigation",r=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Frame requested navigation: ${JSON.stringify(r)}`)}),e.on("Page.navigatedWithinDocument",r=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Navigated within document: ${JSON.stringify(r)}`)}),e.on("Page.lifecycleEvent",r=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page lifecycle event: ${JSON.stringify(r)}`)}),e.on("Page.loadEventFired",()=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page load event fired`)}),await Promise.all([e.send("Accessibility.enable"),e.send("Page.enable"),e.send("DOM.enable"),e.send("Overlay.enable"),e.send("DOMSnapshot.enable"),e.send("CSS.enable")])}async send({method:e,params:r,timeout:n=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await X(this.cdpInitializingPromise,{milliseconds:n});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new M("UserInfrastructureError",`The browser inspector session encountered a critical crash: ${JSON.stringify(this.cdpCrashDetails)}`);this.logger.warn(`Detected crashed CDP client before method ${e}, reinitializing before proceeding...`),await this.reinitialize()}try{return await X(this.session.send(e,r),{milliseconds:n,message:o??`Chrome command ${e} timed out after ${n}ms. This is likely an infrastructure issue caused by a lack of compute resources or a crash at the browser level.`})}catch(i){throw["Internal error","Target crashed"].some(a=>i.message.includes(a))&&!this.cdpInitializingPromise&&(this.logger.warn({err:i},`CDP crashed during CDP method ${e}, re-initializing client`),await this.reinitialize()),i}}async createRawCDPSession(e=this.defaultTimeoutMs){let r=e,n=this.pageGetter(),o=await X(this.contextGetter().newCDPSession(n),{milliseconds:r,fallback:()=>{throw this.logger.warn(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new M("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${n.url()})`)}});return this.logger.debug(`Created new CDP session for ${n.url()}`),o}async reinitialize(e=this.defaultTimeoutMs){await this.cdpInitializingPromise,this.cdpInitializingPromise=(async()=>{try{let r=this.session;this.session=await this.createRawCDPSession(e),await X(this.registerHandlers(this.session),{milliseconds:e,message:`Failed to register CDP handlers within ${e}ms`}),this.logger.debug("Successfully reinitialized and attached new handlers to CDP session");try{await X(r.detach(),{milliseconds:1e3})}catch(n){this.logger.warn({err:n},"Failed to detach old CDP session after reinitialization, continuing...")}this.cdpCrashDetails=void 0,this.cdpFullyDead=!1}catch(r){this.cdpCrashDetails={...this.cdpCrashDetails??{},reinitializeError:`${r}`},this.cdpFullyDead=!0}finally{this.cdpInitializingPromise=void 0}})(),await this.cdpInitializingPromise}on(e,r){return this.session.on(e,r),this.session}off(e,r){return this.session.off(e,r),this.session}addListener(e,r){return this.session.addListener(e,r),this.session}removeListener(e,r){return this.session.removeListener(e,r),this.session}};var nc="<empty>";function zJ(t){return t.includes("doubleclick.net")||t.includes("googletagmanager.com")||t.includes("googlesyndication.com")||t.includes("s.amazon-adsystem.com")||t.includes("smartadserver.com")||t.includes("omnitagjs.com")||t.includes("x.adroll.com")}function qD(t){let e=t.adFrameStatus?.adFrameType;return e==="child"||e==="root"||zJ(t.url)}async function HJ(t,e){let r=await t.send({timeout:ie,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await t.send({timeout:ie,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[r.backendNodeId]}})).nodeIds[0],a=(await t.send({timeout:ie,method:"DOM.describeNode",params:{backendNodeId:r.backendNodeId}})).node;return a.nodeId=o,a}async function oc({cdpClient:t,page:e,logger:r}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([t.send({timeout:rc,method:"Page.getFrameTree",params:{}}),t.send({timeout:rc,method:"DOM.getDocument",params:{depth:0}})]),l=(i.frameTree.childFrames??[]).map(async(d,p)=>{if(qD(d.frame))return null;try{return await KD({cdpClient:t,rawFrameTree:d,indices:[p],parent:n,warnings:o,logger:r})}catch(m){return o.push(`Failed to get child frame: ${m}`),null}}),u=await Promise.all(l);return n.childFrames=u.filter(d=>d!==null),o.length&&r?.warn({warnings:o},"Got warnings when fetching frame tree"),n}async function KD({cdpClient:t,rawFrameTree:e,indices:r,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await HJ(t,a),c=s.attributes??[],l=null,u=[];for(let g of["src","name","id","title","srcdoc","sandbox"]){let h=sa(c,g);h&&(u.push(`${g}=${JSON.stringify(h)}`),g==="src"&&(l=h))}let d={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:a,locationData:{indices:r,attributeSelectors:u},src:l,childFrames:[],parent:n,domNode:s},m=(e.childFrames??[]).map(async(g,h)=>{if(qD(g.frame))return null;try{return await KD({cdpClient:t,rawFrameTree:g,indices:[...r,h],parent:d,warnings:o,logger:i})}catch(f){return o.push(`Failed to get child frame (child ${h} of frame with url ${e.frame.url}): ${f}`),null}});return d.childFrames=(await Promise.all(m)).filter(g=>g!==null),d}async function jJ(t){try{return await t.owner().count()===1}catch{return!1}}async function GJ(t){try{return await t.count()===1}catch{return!1}}async function Do(t,e){let r=[],n=t;for(;n.parent.type==="frame";)r.push(n.parent),n=n.parent;r.reverse();let o=e,i=[];for(let l of r){let u=!1;for(let d of[...l.locationData.attributeSelectors,nc]){let p=o.frameLocator(d===nc?"iframe":`iframe[${d}]`);if(await jJ(p)){u=!0,o=p,i.push(d);break}}if(!u)throw new M("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${l.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let a;for(let l of[...t.locationData.attributeSelectors,nc]){let u=o.locator(l===nc?"iframe":`iframe[${l}]`);if(await GJ(u)){a=u,i.push(l);break}}if(!a)throw new M("ActionFailureError",`Failed to find a unique attribute to identify target frame with url matching '${t.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`);let s=await a.evaluateHandle(l=>l),c=await s.asElement().contentFrame();if(!c)throw new M("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${t.url}'`);return await s.dispose(),{frame:c,mPathSelectorTokens:i}}function $D(t,e){let r=[...t],n=[];for(;r.length;){let o=r.shift();e(o)&&n.push(o),r.push(...o.childFrames)}return n}async function YD({page:t,frameTree:e,cache:r}){let n,o=e.childFrames,i=[];if(r.mPathSelectorTokens.length){let s=o;for(let u=0;u<r.mPathSelectorTokens.length-1;u++){let d=r.mPathSelectorTokens[u];d===nc?s=s.length===1?s[0].childFrames:[]:s=s.filter(p=>p.locationData.attributeSelectors.includes(d)).map(p=>p.childFrames).flat()}let c=[],l=r.mPathSelectorTokens[r.mPathSelectorTokens.length-1];if(l===nc?c=s:c=s.filter(u=>u.locationData.attributeSelectors.includes(l)),c.length===1)return n=c[0],i.push(`Found unique frame with mpath ${r.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await Do(n,t)).frame,handle:n,mPathSelectorTokens:r.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with mpath ${r.mPathSelectorTokens.join(" > ")}`)}if(r.frameSrcRegex){let s=new RegExp(r.frameSrcRegex),c=$D(o,l=>!!l.src&&s.test(l.src));if(c.length===1)return n=c[0],i.push(`Found unique frame with src regex ${r.frameSrcRegex}`),{resolution:{type:"auto",frame:(await Do(n,t)).frame,handle:n,mPathSelectorTokens:r.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with src regex ${r.frameSrcRegex}`),r.frameSrcRegex=void 0}if(r.frameUrlRegex){let s=new RegExp(r.frameUrlRegex),c=$D(o,l=>!!l.url&&s.test(l.url));if(c.length===1)return n=c[0],i.push(`Found unique frame with url regex ${r.frameUrlRegex}`),{resolution:{type:"auto",frame:(await Do(n,t)).frame,handle:n,mPathSelectorTokens:r.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with url regex ${r.frameUrlRegex}`),r.frameUrlRegex=void 0}let a=o;for(let s=0;s<r.indices.length-1;s++)a=a[r.indices[s]]?.childFrames??[];if(n=a[r.indices[r.indices.length-1]],n)return i.push(`Found unique frame with indices ${r.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await Do(n,t)).frame,handle:n,mPathSelectorTokens:r.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${r.indices}`),new vn("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}],"could-not-find-iframe")}function yh(t){return t.type==="auto"?JSON.stringify({type:"auto",frameId:t.handle.frameId}):JSON.stringify(t)}function FT(t){for(;t.parent.type==="frame";)t=t.parent;return t.parent}function XD(t){let e=FT(t),r=t.src??"",n=t.url??"",o=[],i=[],a=[...e.childFrames];for(;a.length;){let s=a.shift();s.src&&o.push(s.src),s.url&&i.push(s.url),a.push(...s.childFrames)}return{srcs:o,urls:i,desiredSrc:r,desiredUrl:n}}function JD(t){return t.type==="auto"?{type:"auto",frameId:t.handle.frameId,url:t.handle.url,src:t.handle.src??"",mPathSelectorTokens:t.mPathSelectorTokens.join(" > ")}:{type:"url",url:t.url}}async function ZD({frame:t,logger:e,signal:r}){let n;try{n=await t.frameElement(),await VJ({frameElementHandle:n,logger:e,signal:r})}catch(o){n?e.warn({err:o},"Failed to scroll iframe into view, trying with raw JS"):e.warn("Failed to scroll iframe into view - no frame element")}finally{await n?.dispose()}}async function VJ({frameElementHandle:t,logger:e,signal:r}){let n=await t.boundingBox(),i=await cd({promiseGenerator:async()=>t.evaluate(async a=>{let s=a.scrollTop,c=a.getBoundingClientRect(),l=0,u=0,d=window.innerWidth,p=window.innerHeight;if(c.top>=l&&c.left>=u&&c.bottom<=p&&c.right<=d)return{didScroll:!1,reason:"already-fully-visible"};a.scrollIntoView({behavior:"instant",block:"center",inline:"center"}),await new Promise(S=>setTimeout(S,250));let g=Date.now();for(;Date.now()-g<1e3;){let S=a.scrollTop;if(S===s)break;s=S,await new Promise(b=>setTimeout(b,250))}let h=a.getBoundingClientRect();return h.top!==c.top||h.left!==c.left||h.right!==c.right||h.bottom!==c.bottom?{didScroll:!0,reason:"scrolled",afterRect:h}:{didScroll:!1,reason:"no-more-scroll-possible",afterRect:h}}),timeoutMs:rt,codePath:"scrollIframeIntoView",signal:r});i.didScroll&&e.info({oldBb:n,newBb:await t.boundingBox(),evalResult:i},"Successfully scrolled iframe into view")}var BT=()=>{let t,e,r=new Promise((n,o)=>{t=n,e=o});return{resolve:t,reject:e,value:r}};var QD=(t,e)=>{let r=t.name??`batcher:${Math.random().toString(16).slice(2)})`,n=t.scheduler??$J(10),o=globalThis.__BATSHIT_DEVTOOLS__?.for(r),i=e??{seq:0,batch:new Set,currentRequest:BT(),timer:void 0,start:null,latest:null,abortController:new AbortController};o?.create({seq:i.seq});let a=()=>{i.batch=new Set,i.currentRequest=BT(),i.timer=void 0,i.start=null,i.latest=null,i.abortController=new AbortController},s=()=>{let d=i.seq,p=t.fetcher([...i.batch],i.abortController.signal),m=i.currentRequest;return o?.fetch({seq:d,batch:[...i.batch]}),a(),p.then(g=>{o?.data({seq:d,data:g}),m.resolve(g)}).catch(g=>{o?.error({seq:d,error:g}),m.reject(g)}),i.seq++,p};return{fetch:d=>{i.start||(i.start=Date.now()),i.latest=Date.now(),i.batch.add(d),clearTimeout(i.timer);let p=n(i.start,i.latest,i.batch.size);if(o?.queue({seq:i.seq,query:d,batch:[...i.batch],scheduled:p,latest:i.latest,start:i.start}),p==="immediate"){let m=i.currentRequest;return s(),m.value.then(g=>t.resolver(g,d))}else return p==="never"?i.currentRequest.value.then(m=>t.resolver(m,d)):(i.timer=setTimeout(s,p),i.currentRequest.value.then(m=>t.resolver(m,d)))},next:()=>{s()},abort:()=>{i.abortController.abort(),i.currentRequest.reject(new DOMException("Aborted","AbortError")),a()}}};var $J=t=>(e,r)=>{let n=r-e;return t-n};var e0=({windowMs:t,maxBatchSize:e})=>(r,n,o)=>{if(o>=e)return"immediate";let i=n-r;return t-i};import{reduce as WJ}from"lodash-es";var qJ=100,KJ=2e3;function t0(t){return QD({fetcher:async r=>{t(WJ(r,(n,o)=>({...n,...o}),{}))},resolver:()=>{},scheduler:e0({windowMs:KJ,maxBatchSize:qJ})})}async function r0({event:t,transformer:e,enricher:r,frame:n,lastScreenshotForRecording:o,logger:i}){let{warnings:a,error:s,properties:c}=t.target;if(s){i.error({error:s,warnings:a},"Error while capturing passive click");return}if(a.length&&i.warn({warnings:a},"Warnings while capturing passive click"),!c)return;let l=n.parentFrame()?n.url():void 0,d=n.page().frames().map(g=>g.url());i.debug({frameUrl:l,...t},"Passive click event captured on element");let p,m;if(l)try{let g=await n.frameElement();p=await X(g?.boundingBox(),{milliseconds:ie})??void 0;let h=await r.constructIframeRegex({urls:d,srcs:[],desiredUrl:l});if(h.urlRegex)m={type:"url",url:`/${h.urlRegex}/`};else throw new Error(`Got no url regex options: ${JSON.stringify(h)}`)}catch(g){i.warn({err:g},"Failed to construct iframe details for recorded action, using hardcoded URL only"),m={type:"url",url:l}}(async()=>{try{await e.recordElementAction({...t,screenshotBase64:o,frameConfig:m,frameBoundingBox:p})}catch(g){i.error({err:g},"Failed to transform passive click action")}})()}import{randomUUID as ko}from"crypto";import YJ from"js-beautify";var XJ=["Dead"],bh=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:r,generator:n,testId:o,orgId:i,logger:a}){this.signal=e,this.logger=a,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(s,c)=>{this.recordedSteps.set(c,{step:s}),r.onStepRecorded(s,c)},onActionReceived:(s,c)=>{this.recordedSteps.set(c,{step:s}),r.onActionReceived?.(s,c)}},this.generator=n}reserveIndexForCommand(e){let r=this.nextStepOffset;return this.recordedSteps.set(r,{step:{id:ko(),type:"PRESET_ACTION",command:Wo(e)}}),this.nextStepOffset++,r}async recordElementAction(e){let{type:r,target:n,frameConfig:o}=e;if(this.signal.aborted){this.logger.debug("Transformer was already cleaned up, ignoring click...");return}let i,a,s=n.properties.attributes.nodeOnlySerializedHtml.trim(),c=s,l;switch(e.frameConfig?e.frameBoundingBox?l={x:e.frameBoundingBox.x+n.properties.boundingBox.x,y:e.frameBoundingBox.y+n.properties.boundingBox.y,width:n.properties.boundingBox.width,height:n.properties.boundingBox.height}:this.logger.warn(e,"No frame bounding box found, refusing to write bounding box"):l=n.properties.boundingBox,r){case"CLICK":{i="CLICK";let h=Wo(i);a={id:ko(),type:"PRESET_ACTION",command:{...h,target:{type:"description",elementDescriptor:c},iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}}}};break}case"SELECT":{i="SELECT_OPTION";let h=Wo(i);a={id:ko(),type:"PRESET_ACTION",command:{...h,type:"SELECT_OPTION",iframeUrl:o?.url,target:{type:"description",elementDescriptor:c},cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let h=Wo(i);a={id:ko(),type:"PRESET_ACTION",command:{...h,target:{type:"description",elementDescriptor:c},deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),targetUpdateLoggerTags:et(this.logger),boundingBox:l}}}};break}default:throw new Error(`Unknown action type: ${r}`)}let u;e.offset===void 0?(u=this.nextStepOffset,this.nextStepOffset++):u=e.offset,this.callbacks.onActionReceived?.(a,u);let d=e.target.browserState;try{d=YJ.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=PN(d,"data-momentic-interacted",4e4)}catch{}let p;try{p=(await this.generator.getReverseMappedDescription({target:d,screenshot:e.screenshotBase64?`data:image/jpeg;base64,${e.screenshotBase64}`:void 0,boundingBox:n.properties.boundingBox},{disableCache:!1,loggerTags:{testId:this.testId,...et(this.logger)}})).phrase}catch(h){this.logger.error({err:h},"Error generating reverse mapping description"),p=s}let m=this.recordedSteps.get(u)?.step??a,g=m?.command;g&&"target"in g&&g.target?(g.target={type:"description",elementDescriptor:p},this.callbacks.onStepRecorded({...m,command:g},u)):this.logger.warn("Could not find existing command to update after description mapping")}recordKeystroke(e){let{key:r,combinable:n}=e;if(XJ.includes(r)||this.signal.aborted)return;let o="normal";r.length>1&&(o="special");let i;if(o==="normal"){let d=Wo("TYPE");i={id:ko(),type:"PRESET_ACTION",command:{...d,target:void 0,value:r,clearContent:!1}}}else{let d=Wo("PRESS");i={id:ko(),type:"PRESET_ACTION",command:{...d,value:r}}}let a,s=this.nextStepOffset-1,c=this.recordedSteps.get(s),l=c?.step,u=l?.command;if(n){if(u?.type===i.command.type){let d=u.value,p=i.command.value;i={id:ko(),type:"PRESET_ACTION",command:{...u,value:i.command.type==="PRESS"?`${d}+${p}`:`${d}${p}`}},a=s}else if(u?.type==="CLICK"&&i.command.type==="TYPE")l.command={...i.command,target:u.target,cache:u.cache},i=c.step,a=s;else if(u?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let d=u.value;i={id:ko(),type:"PRESET_ACTION",command:{...u,value:d.slice(0,d.length-1)}},a=s}}a===void 0&&(a=this.nextStepOffset,this.nextStepOffset++),this.callbacks.onStepRecorded(i,a)}recordScroll(e){if(this.signal.aborted)return;let r=()=>{let{deltaY:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_DOWN"&&s.deltaY?(i+=s.deltaY,c=a):s?.type==="SCROLL_UP"&&s.deltaY?(i-=s.deltaY,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_DOWN":"SCROLL_UP",u=Wo(l);u.deltaY=Math.abs(i);let d={id:ko(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},n=()=>{let{deltaX:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_RIGHT"&&s.deltaX?(i+=s.deltaX,c=a):s?.type==="SCROLL_LEFT"&&s.deltaX?(i-=s.deltaX,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",u=Wo(l);u.deltaX=Math.abs(i);let d={id:ko(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},o=this.recordedSteps.get(this.nextStepOffset-1);o?.step.command.type==="SCROLL_LEFT"||o?.step.command.type==="SCROLL_RIGHT"?(n(),e.deltaY>=20&&r()):(r(),e.deltaX>=20&&n())}};import{z as zT}from"zod";var eXe=zT.object({type:zT.literal("url"),url:zT.string()});var Eh=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;userControlledBrowserSettings;enricher;iconKnowledgeBase;computedStylesToFetch=["display","opacity","visibility","height","position","background-image"];activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeMap={};lastA11yTreeRoot;lastDomGraph;allowedA11yIgnoreReasonsOverride;constructor({smartWaitingTimeoutMs:e,pageLoadTimeoutMs:r,allowPartialAccessibilityTree:n,logger:o,cdpClient:i,pageGetter:a,abortSignalGetter:s,enricher:c,iconKnowledgeBase:l,userBrowserSettings:u,allowedA11yIgnoreReasonsOverride:d}){if(this.smartWaitingTimeoutMs=e,this.pageLoadTimeoutMs=r,this.allowPartialAccessibilityTree=n,this.logger=o,this.cdpClient=i,this.pageGetter=a,this.abortSignalGetter=s,this.enricher=c,this.iconKnowledgeBase=l,this.userControlledBrowserSettings=u,this.allowedA11yIgnoreReasonsOverride=d,this.userControlledBrowserSettings.importantStyles)for(let p of this.userControlledBrowserSettings.importantStyles){let m=p.split(":");if(m.length!==2){this.logger.warn({style:p},"Invalid style property passed to importantStyles");continue}let g=m[0]?.trim(),h=m[1]?.trim();if(g===void 0||h===void 0){this.logger.warn({style:p},"Invalid style property passed to importantStyles");continue}this.computedStylesToFetch.includes(g)||this.computedStylesToFetch.push(g)}}get frameConfig(){return this.activeFrameConfig}get domGraph(){return this.lastDomGraph}get selectorToNodeMap(){return this.lastSelectorToNodeMap}get dataMomenticIdToNodeMap(){return this.lastDataMomenticIdToNodeMap}get a11yIdToNodeMap(){return this.lastA11yIdToNodeMap}get a11yTreeRoot(){return this.lastA11yTreeRoot}setActiveFrameConfig(e){e?(this.activeFrameConfig=e,this.activeFrameCache=void 0):(this.activeFrameConfig=void 0,this.activeFrameCache=void 0)}reset(){this.activeFrameCache=void 0,this.activeFrameConfig=void 0,this.lastA11yIdToNodeMap={},this.lastDataMomenticIdToNodeMap={},this.lastSelectorToNodeMap={},this.lastA11yTreeRoot=void 0,this.lastDomGraph=void 0}saveAutoFrameCacheDetails(e){if(!this.activeFrameConfig||this.activeFrameConfig.type!=="auto"||!this.userControlledBrowserSettings.autoExpandIframes)return;let r={...e,indices:this.activeFrameConfig.handle.locationData.indices,mPathSelectorTokens:this.activeFrameConfig.mPathSelectorTokens};return this.constructIframeRegexAsync(this.activeFrameConfig.handle,r),r}async getAutoFrameDetailsFromHandle(e){let r=this.pageGetter(),n=FT(e),{frame:o,mPathSelectorTokens:i}=await Do(e,r),a={indices:e.locationData.indices,mPathSelectorTokens:i};return this.constructIframeRegexAsync(e,a),{cache:a,config:{type:"auto",frame:o,handle:e,mPathSelectorTokens:i,frameTree:n,cache:a}}}async resolveAutoFrameCache(e){let r=this.pageGetter(),n=await oc({cdpClient:this.cdpClient,page:r,logger:this.logger}),{resolution:o,logs:i}=await YD({page:r,frameTree:n,cache:e});return this.logger.info({logs:i},"Resolved auto frame cache"),{...o,cache:e}}async resolveActiveFrameConfig({logger:e=this.logger,signal:r=this.abortSignalGetter()}){if(!this.frameConfig)return null;if(this.activeFrameCache)if(yh(this.frameConfig)!==this.activeFrameCache.frameIdentifierStringified)this.activeFrameCache=void 0;else if(this.activeFrameCache.frame&&"isDetached"in this.activeFrameCache.frame&&this.activeFrameCache.frame.isDetached())this.activeFrameCache=void 0;else return this.activeFrameCache;let n;return this.frameConfig.type==="url"?n=await this.resolveUrlMatcherFrameConfig({config:this.frameConfig,logger:e,signal:r}):n={source:"auto",frame:this.frameConfig.frame,handle:this.frameConfig.handle,frameIdentifierStringified:yh(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await ZD({frame:n.frame,logger:e,signal:r}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,r){let n=this.pageGetter(),o=await oc({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[X(n.evaluate(e,r),{milliseconds:rt})],a=Array.from(o.childFrames);for(;a.length>0;){let c=a.shift(),l=c.url;l==="about:blank"||l.startsWith("chrome-error://")||(a.push(...c.childFrames),i.push(Do(c,n).then(({frame:u})=>X(u.evaluate(e,r),{milliseconds:rt})).catch(u=>(this.logger.warn({err:u,frameUrl:c.url},"Failed to evaluate function in frame"),"MOMENTIC_FRAME_EVAL_ERROR"))))}return(await Promise.all(i)).filter(c=>c!=="MOMENTIC_FRAME_EVAL_ERROR")}async getAllChildFrameUrls(){let e=this.pageGetter(),r=await oc({cdpClient:this.cdpClient,page:e,logger:this.logger}),n=Array.from(r.childFrames),o=[];for(;n.length>0;){let i=n.shift();n.push(...i.childFrames),o.push(i.src??i.url)}return o}async getDomGraph({devicePixelRatio:e,signal:r,logger:n}){return this.getDOMTree({devicePixelRatio:e??1,signal:r,logger:n??this.logger})}async getA11yTree(e){let r={},n=e.logger??this.logger,o=e.abortSignal??this.abortSignalGetter(),i=this.pageGetter();if(!e.skipPageLoad)try{await i.waitForLoadState("load",{timeout:this.pageLoadTimeoutMs})}catch(p){n.warn({err:p},"Failed to wait for page load event before a11y tree fetch, attempting to continue without it..."),await this.cdpClient.reinitialize()}let a,s,c=null;if(this.frameConfig?.type==="url"){if(a=await jn({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:r,signal:o,logger:n})??void 0,!a)throw new M("ActionFailureError","Got null frame details despite active frame config");s=a.handle,c=s.frameId}else this.userControlledBrowserSettings.autoExpandIframes?(s=await jn({fn:()=>oc({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),codePath:"getMomenticFrameTree",logObject:r,signal:o,logger:n}),c=null):(s={type:"root",page:i,childFrames:[]},c=null);await jn({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:s.childFrames,frameFilter:a?.frame,logger:n}),codePath:"addIdsToElement",logObject:r,signal:o,logger:n});let l=await jn({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:r,signal:o,logger:n}),u=await jn({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:c,childFrames:s.childFrames,logTimings:r,logger:n,signal:o}),codePath:"totalA11yFetch",logObject:r,signal:o,logger:n}),{tree:d}=await jn({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:u,domGraph:l,startingFrameId:c,frameContext:s,logger:n,iconKnowledgeBase:this.iconKnowledgeBase,showZeroOpacityElements:e.showZeroOpacityElements,flagNotActionableNodes:e.flagNotActionableNodes}),codePath:"a11yProcess",logObject:r,signal:o,logger:n});return Object.values(r).some(p=>p>750)&&n.warn({logTimings:r},"A11y tree fetch component took a long time"),this.lastA11yIdToNodeMap=d.a11yIdNodeMap,this.lastDataMomenticIdToNodeMap=d.dataMomenticIdMap,this.lastA11yTreeRoot=d.root,this.lastDomGraph=l,this.lastSelectorToNodeMap=d.selectorToNodeMap,d}async fetchA11yTreeForRecording(e,r){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:r,logger:Eo,filterByViewport:!1,flagNotActionableNodes:!1,skipPageLoad:!0}),Math.random()<.1){let n=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:n&&n.length>4e5?"REDACTED_DUE_TO_SIZE":n},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:r,node:n}){if(n.backendNodeId===void 0)throw new Error(`Node with a11y id ${n.id} has no backend node ID: ${n.getNodeOnlySerializedForm()}`);if(this.userControlledBrowserSettings.visualActions){let o=this.domGraph?.backendIdToNode[n.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${n.backendNodeId}`);let i=PD({node:o,domGraph:this.domGraph});return MD(e,i)}else return n.domNode||this.logger.warn({a11yRole:n.role,content:n.content},"Attempting to get locator from a11y node with no DOM node"),this.getLocatorFromBackendId(r,n.backendNodeId)}async getLocatorFromBackendId(e,r){let n=await this.cdpClient.send({method:"DOM.resolveNode",params:{backendNodeId:r},timeout:rt});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${r}`);let o;try{o=await OD(this.cdpClient,n.object.objectId)}catch(i){throw this.logger.debug({err:i,object:JSON.stringify(n.object)},"Failed to get ID attribute for target"),i}return e.locator(ui(o))}getNodeUsingMPathSelector(e){let r=this.selectorToNodeMap[e];if(r)return r;let n=e.split(" > "),o="";for(let i=n.length-1;i>=0;i--){let a=n.slice(i).join(" > ");if(this.selectorToNodeMap[a]){o=a;break}}this.logger.warn({selectorMapSize:Object.keys(this.selectorToNodeMap).length,selector:e,closestSelector:o},"Could not find a11y node using mpath selector")}async resolveUrlMatcherFrameConfig({config:e,signal:r=this.abortSignalGetter(),logger:n=this.logger}){let o=Date.now(),i,a,s,c=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await oc({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),a=await this.getMatchingFrameByUrlWithCdp(i,e),n.info({frameId:a.handle.frameId,url:a.handle.url,src:a.handle.src,locationData:a.handle.locationData},`Found matching frame using ${a.matchType}`);break}catch(l){if(s=l,l instanceof M&&l.reason==="UserInfrastructureError")throw l;c%3===0&&this.logger.warn({attempt:c,err:l},"Failed to resolve active frame, retrying..."),await Se(lr,r)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:yh(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw s}async getMatchingFrameByUrlWithCdp(e,r){let n=r.url,o=this.pageGetter(),i=Array.from(e.childFrames),a=[];for(;i.length>0;){let s=i.shift(),c=s.domNode;i.push(...s.childFrames);let l=sa(c.attributes??[],"src"),u=c.contentDocument?.documentURL;if(!l&&!u){this.logger.debug("Skipping frame with no URL or src");continue}for(let d of[l,u])if(d){if(n.startsWith("/")&&n.endsWith("/")){if(new RegExp(n.slice(1,-1)).test(d)){a.push({handle:s,matchType:"regex",...await Do(s,o)});break}}else if(n.trim()===d.trim()){a.push({handle:s,matchType:"url",...await Do(s,o)});break}}}if(a.length===1){let s=a[0];return this.userControlledBrowserSettings.autoExpandIframes||(s.handle.childFrames=[]),s}else throw a.length>1?new Error(`Found multiple frames with src matching '${n}'. Please use a more specific selector.`):new M("ActionFailureError",`Failed to find frame with src matching: ${n}`)}async composeA11yDomGraph({opts:e,a11yGraph:r,domGraph:n,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:s,showZeroOpacityElements:c,flagNotActionableNodes:l}){let u=await HD({rawA11yGraph:r,startingFrameId:o,frameContext:i,domGraph:n,logger:a,cdpClient:this.cdpClient,showZeroOpacityElements:c,flagNotActionableNodes:l,filterByViewport:e.filterByViewport,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles},viewportDetails:void 0,iconKnowledgeBase:s,useMPaths:this.userControlledBrowserSettings.visualActions,allowedA11yIgnoreReasonsOverride:this.allowedA11yIgnoreReasonsOverride});if(!u||!u.root)throw new Error("Accessibility tree appears empty");return{tree:u}}async addMomenticIds({rootPage:e,childFrames:r,frameFilter:n,logger:o}){if(this.userControlledBrowserSettings.visualActions)return;let i=await this.addMomenticIdsHelper(n??e,1);if(!this.userControlledBrowserSettings.autoExpandIframes||n)return;let a=Array.from(r),s=[];for(;a.length>0;){let c=a.shift();a.push(...c.childFrames);let l=async()=>{try{let{frame:u}=await Do(c,e);i=await this.addMomenticIdsHelper(u,i)}catch(u){c.url!=="about:blank"&&o.warn({err:u},"Error adding momentic IDs to child frame, continuing...")}};s.push(l())}await Promise.all(s)}async addMomenticIdsHelper(e,r){if(this.userControlledBrowserSettings.visualActions)return r;let n=this.logger;return await Yt({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:r,timeout:rt,waitForPageLoad:async()=>{try{await e.waitForLoadState("domcontentloaded",{timeout:this.smartWaitingTimeoutMs})}catch(i){n.warn({err:i},"Error loading frame root adding momentic ids, continuing...")}},codePath:"adding Momentic element IDs to the page"})??r}getPageDomain(e){try{let r=new URL(e);if(!r.hostname)return null;let n=r.hostname.split("."),o=n.length>2?n.slice(-2).join("."):r.hostname;return`${r.protocol}//${o}`}catch{return null}}async decideChildFrameUnrollEligibility({logger:e,warnings:r,handle:n}){try{let{shouldUnroll:o,reason:i}=await this.decideChildFrameUnrollEligibilityHelper({domNode:n.domNode});return{shouldUnroll:o,reason:i}}catch(o){if(o.message.includes("Could not compute box model"))return{shouldUnroll:!1};let i=`Got error when determining whether to filter frame ${n.frameId} with url ${n.url}, allowing it to be fetched: ${o}`;return r?.push(i),e?.warn({err:o},i),{shouldUnroll:!0}}}async decideChildFrameUnrollEligibilityHelper({domNode:e}){let r=e.attributes??[];if(sa(r,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=sa(r,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:ie,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:ie,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:ie,method:"CSS.getComputedStyleForNode",params:{nodeId:e.nodeId}})]);if(!o.model||!o.model.height||!o.model.width)return{shouldUnroll:!1,reason:"no bounding box"};if(o.model.height<10||o.model.width<10)return{shouldUnroll:!1,reason:"small bounding box"};for(let a of i.computedStyle){if(a.name==="display"&&a.value==="none")return{shouldUnroll:!1,reason:"display: none"};if(a.name==="visibility"&&a.value==="hidden")return{shouldUnroll:!1,reason:"visibility: hidden"};if(a.name==="opacity"&&a.value==="0")return{shouldUnroll:!1,reason:"opacity: 0"}}return{shouldUnroll:!0}}async getRawA11yGraph({cdpClient:e,frameId:r,childFrames:n,logTimings:o,logger:i=this.logger,signal:a=this.abortSignalGetter()}){let s=[],c,l;for(let m=0;m<3;m++)try{l=await jn({fn:()=>this.getRawA11yTreeForFrame({frameId:r,timeoutMs:this.pageLoadTimeoutMs,logTimings:o}),codePath:"a11y-tree-fetch-root",logObject:o,logger:i});break}catch(g){c=g,i.warn({err:g},"Reinitializing CDP client before retrying a11y graph fetch"),await this.cdpClient.reinitialize()}if(!l)throw new Error(`Failed to fetch accessibility tree for root page: ${c}`);let u={};if(u[r??"root"]=l,!this.userControlledBrowserSettings.autoExpandIframes)return u;let d=Array.from(n),p=[];for(;d.length>0;){let m=d.shift();try{let{shouldUnroll:h}=await this.decideChildFrameUnrollEligibility({handle:m,warnings:s});if(!h)continue}catch(h){if(h.message.includes("Could not compute box model"))continue;s.push(`Got error when determining whether to filter frame ${m.frameId} with url ${m.url}, allowing it to be fetched: ${h}`)}d.push(...m.childFrames);let g=async()=>{try{let h=await jn({fn:()=>this.getRawA11yTreeForFrame({frameId:m.frameId,timeoutMs:this.smartWaitingTimeoutMs,logTimings:o}),codePath:`a11y-tree-fetch-child-${m.frameId}`,logObject:o,logger:i});u[m.frameId]=h}catch(h){i.warn({err:h,url:m.url,src:m.src},`Error getting raw a11y tree for child frame ${m.frameId}, continuing...`)}};p.push(g())}return await Promise.all(p),s.length>0&&this.logger.warn({warnings:s},"Got warnings when fetching the raw a11y graph"),u}async getRawA11yTreeForFrame({frameId:e,timeoutMs:r,logTimings:n}){let o;if(this.allowPartialAccessibilityTree)o=(await jn({fn:()=>this.cdpClient.send({method:"Accessibility.getFullAXTree",params:{frameId:e??void 0},timeout:r,timeoutMsg:`Fetching the document tree took over ${r}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes;else{let a=(await jn({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:rt}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await jn({fn:()=>this.cdpClient.send({method:"Accessibility.queryAXTree",params:{backendNodeId:a},timeout:r,timeoutMsg:`Fetching the document tree took over ${r}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes}if(!o||o.length<=1)throw new Error("Document is entirely empty");return{root:o[0],allNodes:o}}async getDOMTree({devicePixelRatio:e,signal:r,logger:n}){let o,i=0,a;for(;!o&&i<3;)try{if(o=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:this.computedStylesToFetch},timeout:ie}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await Se(lr,r),i++,a=s}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new M("UserInfrastructureError",`Received an empty HTML snapshot from the browser. This usually indicates the page has crashed due to resource consumption issues or hanging client-side JavaScript code: ${a?.message}`);return ID({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,r){if(r.frameSrcRegex||r.frameUrlRegex)return;let n=XD(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(n);o?.srcRegex&&(r.frameSrcRegex=o.srcRegex),o?.urlRegex&&(r.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:n},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};var Gn=class t{static USER_AGENT=dh;abortSignal=void 0;contextInitialized=!1;cleanedUp=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;pageLoadAbortControllers=new Set;pageLoadAbortListenerCleanup;clientCallbacks;harBatcher;iconKnowledgeBase;cdpClient;debugData={logsPerPage:[]};recentFrameNavigations={};requestRecorders={};mocks={};customHeaders=[];enricher;storage;logger;stateManager;transformer;lastScreenshotForRecording=void 0;originsVisited=new Set;viewport;onVideoPageChange;baseUrl;constructor({storage:e,enricher:r,browser:n,context:o,page:i,baseUrl:a,logger:s,userBrowserSettings:c,viewport:l,properties:u,clientCallbacks:d,iconKnowledgeBase:p,onVideoPageChange:m}){r_(c),this.storage=e,this.enricher=r,this.browser=n,this.context=o,this.page=i,this.baseUrl=a,this.logger=s,this.userControlledBrowserSettings=c,this.viewport=l,this.properties=u,this.clientCallbacks=d,this.iconKnowledgeBase=p,this.onVideoPageChange=m}registerAbortSignal(e){if(this.pageLoadAbortListenerCleanup&&(this.pageLoadAbortListenerCleanup(),this.pageLoadAbortListenerCleanup=void 0),this.abortSignal=e,!this.abortSignal)return;let r=()=>{for(let n of this.pageLoadAbortControllers)n.abort();this.pageLoadAbortControllers.clear()};if(this.abortSignal.aborted){r();return}this.abortSignal.addEventListener("abort",r),this.pageLoadAbortListenerCleanup=()=>{this.abortSignal?.removeEventListener("abort",r)}}async initialize({grantPermissions:e,permissionsToGrant:r,runInitScripts:n,timingRecorder:o}){if(this.contextInitialized)return;let i={[IN]:this.userBrowserSettings.visualActions},a=[];this.userControlledBrowserSettings.extraHeaders&&a.push(this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders)),e&&a.push(this.context.grantPermissions(uD(r))),a.push(this.context.addInitScript({content:`${tT.htmlUtilsLibJs}
|
|
4601
|
+
${O||""}`}return S}shallowClone(){let e=new t({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],ignoredReasons:this.ignoredReasons,backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:NT(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=NT(this.properties),e}},kT=class t{constructor(e,r,n,o,i={}){this.root=e;this.a11yIdNodeMap=r;this.dataMomenticIdMap=n;this.selectorToNodeMap=o;this.nodeIdHasPointingLabelMap=i}serialize(e){return this.root.serialize(e)}pruneUsingSummaries(e){let r=this.root;if(!r)throw new Error("Cannot prune a11y tree with no root");let n={},o={},i={},a=c=>{let l=c.shallowClone();if(e[c.id])return l.properties["data-momentic-summary"]=e[c.id],n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l;let u=[];for(let d of c.children){let p=a(d);p&&(u.push(p),p.parent=l)}return l.children=u,n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l},s=a(r);return new t(s,n,o,i,this.nodeIdHasPointingLabelMap)}pruneUsingRelevantIds(e){let r=this.root;if(!r)throw new Error("Cannot prune a11y tree with no root");function n(i,a=!1){let s=e.has(`${i.id}`)||i.id===r?.id,c=i.shallowClone(),l=i.children,u=!1,d=[];for(let p of l){let m=n(p,s||u);m&&(d.push(m),m.parent=c,u=!0)}if(c.children=d,s||u)return c;if(UT.includes(i.role)&&a)return c}let o=n(r);return new t(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap,this.nodeIdHasPointingLabelMap)}pruneToSerializedCharLimit(e){let r=this.root;if(!r)throw new Error("Cannot prune a11y tree with no root");let n=new WeakMap,o=(s,c)=>{if(n.has(s))return n.get(s);let l=s.serialize({indentLevel:c,noChildren:!0});return n.set(s,l),l},i=(s,c,l)=>{let u=s.shallowClone();u.children=[];let d=o(s,c).length;if(l<=d)return{clone:u,used:d};if(s.role==="StaticText"||s.children.length===0)return{clone:u,used:d};let p=d,m=l-p;for(let g of s.children){let h=c+2,f=o(g,h).length;if(m<f)break;let{clone:S,used:b}=i(g,h,m);if(b>m)break;u.children.push(S),S.parent=u,p+=b,m-=b}return{clone:u,used:p}},{clone:a}=i(r,0,Math.max(1e4,e));return new t(a,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap,this.nodeIdHasPointingLabelMap)}};function NJ(t){return t.name?.value?`"${t.name.value}"`:t.role?.value&&t.role.value!=="none"&&t.role.value!=="generic"?`"${t.role.value}"`:`"${t.nodeId}"`}function DJ(t,e,r,n){return t.bounds.x===null||t.bounds.y===null||t.bounds.height===null||t.bounds.width===null||t.bounds.width===0||t.bounds.height===0?!0:t.bounds.x+t.bounds.width<e.leftBound||t.bounds.x>e.rightBound?(um({logger:r,logKey:n,maxCount:5,intervalMs:3e3},{domNode:t,logKey:n},"Filtering out node since it is not in the viewport horizontally"),!1):t.bounds.y+t.bounds.height<e.upperBound||t.bounds.y>e.lowerBound?(um({logger:r,logKey:n,maxCount:5,intervalMs:3e3},{domNode:t,logKey:n},"Filtering out node since it is not in the viewport vertically"),!1):t.computedStyles.display==="none"?(r.debug({domNode:t},"Filtering out node since it has display none"),!1):!0}async function BD({node:t,parent:e,frameId:r,frameContext:n,axGraph:o,domGraph:i,inputNodeMap:a,explicitLabelTargetDomIds:s,flagNotActionableNodes:c,showZeroOpacityElements:l,filterByViewport:u,viewportDetails:d,useMPaths:p,importantProperties:m,allowedA11yIgnoreReasonsOverride:g,cdpClient:h,logger:f,callId:S}){if(!e&&t.parentId)throw new Error(`Got no parent for accessibility node ${t.nodeId}: ${JSON.stringify(t)}`);let b=(F,z={})=>{},y=t.backendDOMNodeId,T=IJ.includes(t.role?.value?.toLowerCase()??"");if(!T&&y===void 0)return b("Filtering out node since it doesn't exist in the DOM"),[];let w=y?i.backendIdToNode[y]:void 0;if(!T&&!w)try{let F=await X(h.send({method:"DOM.describeNode",params:{backendNodeId:y}}),{milliseconds:750,fallback:()=>{f.debug("Timeout getting node from CDP while processing a11y tree")}});if(F&&F.node.nodeName.toLowerCase()==="slot"&&F.node.distributedNodes?.length)f.debug({parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNodeName:t.name?.value},"Redirecting node to assigned slot");else return b("Filtering out node since it doesn't exist in the DOM",{cdpResult:F?.node.name??F?.node.nodeName}),[]}catch(F){return b("Filtering out node since it doesn't exist in the DOM",{err:F}),[]}if(w&&e&&u&&d&&t.backendDOMNodeId&&!DJ(w,d,f,S))return w.momenticIgnored=!0,[];if(w&&w.computedStyles.display==="none")return w.momenticIgnored=!0,[];if(w&&w.computedStyles.opacity==="0"&&l!==!0){if(l==="inputs-only"&&w.tagName.toLowerCase()!=="input")return w.momenticIgnored=!0,[];if(l===!1)return w.momenticIgnored=!0,[]}let P=t.name?.value?typeof t.name.value=="string"?t.name.value:`${t.name.value}`:"",A=t.value?.value?typeof t.value.value=="string"?t.value.value:`${t.value.value}`:"",x=new DT({domNode:w,id:parseInt(t.nodeId),role:t.role?.value||"",name:P,nameSources:t.name?.sources,content:A,properties:t.properties,children:[],ignoredReasons:t.ignoredReasons?.filter(F=>(g??kD).includes(F.name)||UD.includes(F.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+NJ(t),backendNodeID:t.backendDOMNodeId,ignoredByCDP:t.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},importantProperties:m,parentFrame:n.type==="root"?void 0:n,flagNotActionableNodes:c}),O=n,L=a[r],N=r;if(w?.tagName.toLowerCase()==="iframe"&&w.ownedFrameId){let F=n.childFrames.find(ue=>ue.frameId===w.ownedFrameId),z=o[F?.frameId??""]?.root,ae=a[F?.frameId??""];if(F&&z&&ae){t.childIds&&t.childIds.length>0&&f.debug("Replacing existing node's children with children from the iframe");let ue=z;t.childIds=ue.childIds,O=F,L=ae,N=F.frameId}}let j=w?.childrenBackendIds?.length??0,W=(t.childIds??[]).filter(F=>!!L.get(parseInt(F))).length;if(j>W){let F=t.childIds?.map(ae=>L.get(parseInt(ae))).filter(Boolean).map(ae=>ae?.backendDOMNodeId).filter(ae=>ae!==void 0)??[],z=0;for(let ae of w?.childrenBackendIds??[]){if(F.includes(ae)){z=(t.childIds?.findIndex(Q=>L.get(parseInt(Q))?.backendDOMNodeId===ae)??0)+1;continue}let ue=i.backendIdToNode[ae];if(!ue||ue?.tagName.toLowerCase()!=="svg")continue;let _e=Math.floor(-1*Math.random()*1e7),Se={nodeId:_e.toString(),parentId:t.nodeId,ignored:!1,backendDOMNodeId:ae,frameId:N,role:{type:"string",value:"graphics-symbol"}};L.set(_e,Se),t.childIds||(t.childIds=[]),t.childIds.splice(z,0,_e.toString()),z++}}if(t.childIds?.length===1&&w){let F=L.get(parseInt(t.childIds[0])),z=F?.role?.value,ae=w.childrenBackendIds;if(F&&z==="StaticText"&&ae.length===1){let ue=i.backendIdToNode[ae[0]];if(ue?.tagName?.toLowerCase()==="span"){let _e=Math.floor(-1*Math.random()*1e7).toString(),Se={nodeId:_e,parentId:t.nodeId,ignored:!1,backendDOMNodeId:ue.backendNodeId,frameId:N,childIds:[F.nodeId]};F.parentId=_e,L.set(parseInt(_e),Se),t.childIds=[_e]}}}if(w?.tagName.toLowerCase()==="label"){let F=w.attributes.for?.trim();F&&s.add(F)}for(let F of t.childIds??[]){if(!F)continue;let z=L.get(parseInt(F));if(!z)continue;let ae=await BD({node:z,parent:x,domGraph:i,explicitLabelTargetDomIds:s,axGraph:o,frameId:N,frameContext:O,inputNodeMap:a,cdpClient:h,logger:f,callId:S,filterByViewport:u,showZeroOpacityElements:l,importantProperties:m,viewportDetails:d,useMPaths:p,flagNotActionableNodes:c});ae.length&&(x.children=x.children.concat(ae))}if(x.role==="StaticText"&&(x.children=[]),x.role==="ListMarker")if(x.children.length!==1||x.children[0].role!=="StaticText")f.debug({childLen:x.children.length,childRoles:x.children.map(F=>F.role),childTags:x.children.map(F=>F.tagName),currentTag:x.tagName,currentName:x.name},"Unexpected ListMarker structure (processA11yTreeDFS)");else return x.children;if(x.children.length===1&&x.children[0].role==="StaticText"){let F=x.name,ae=x.children[0].name;(F===ae||!ae)&&(x.name="")}let B=[];for(let F=x.children.length-1;F>=0;F--){let z=x.children[F];if(z.role!=="StaticText"){B.push(z);continue}if(F===0||x.children[F-1].role!=="StaticText"){B.push(z);continue}x.children[F-1].name+=z.name}if(x.children=B.reverse(),!x.isInteresting(m)&&t.parentId)return w&&(w.momenticIgnored=!0),x.children;for(let F of x.children)F.parent=x;return FJ(x),w&&p&<(w,i),[x]}function zD({node:t,a11yIdNodeMap:e,dataMomenticIdMap:r,logger:n,callId:o,domGraph:i,useMPaths:a,selectorToNodeMap:s,nodeIdHasPointingLabelMap:c,explicitLabelTargetDomIds:l,iconKnowledgeBase:u,startId:d=1}){t.id=d,d+=1,e[t.id]=t,t.dataMomenticId?r[t.dataMomenticId]=t:UT.includes(t.role);let p=t.backendNodeId,m=p!==void 0?i.backendIdToNode[p]:void 0;a&&m&&m.mPathSelector&&(s[m.mPathSelector]=t,t.mPathSelector=m.mPathSelector);let g=m?.attributes.id?.trim();if(g&&l.has(g)&&(t.internalProperties.hasExplicitPointingLabel=!0,c[t.id]=!0),u&&m&&m.tagName?.toLowerCase()==="svg"){let h=OT(m,i),f=h?u[h.hash]:void 0,S=f?f.description:void 0;f&&(t.properties["data-momentic-description"]=S)}for(let h of t.children)d=zD({node:h,a11yIdNodeMap:e,dataMomenticIdMap:r,logger:n,callId:o,startId:d,useMPaths:a,domGraph:i,selectorToNodeMap:s,nodeIdHasPointingLabelMap:c,explicitLabelTargetDomIds:l,iconKnowledgeBase:u});return d}async function HD({rawA11yGraph:t,domGraph:e,startingFrameId:r,logger:n,cdpClient:o,filterByViewport:i,showZeroOpacityElements:a,flagNotActionableNodes:s,importantProperties:c,viewportDetails:l,useMPaths:u,frameContext:d,iconKnowledgeBase:p,allowedA11yIgnoreReasonsOverride:m}){let g=r??"root",h=t[g]?.root;if(!h)throw new Error("A11y tree has no root");let f=vJ(),S=new Set,b=O=>{let L=O.allNodes.filter(j=>!j.ignoredReasons?.find(B=>(m??kD).includes(B.name))),N=new Map;return L.forEach(j=>{N.set(parseInt(j.nodeId),j)}),N},y={};Object.entries(t).forEach(([O,L])=>{y[O]=b(L)});let T=await BD({node:h,domGraph:e,explicitLabelTargetDomIds:S,parent:null,inputNodeMap:y,axGraph:t,frameId:g,frameContext:d,cdpClient:o,logger:n,callId:f,showZeroOpacityElements:a,importantProperties:c,filterByViewport:i,viewportDetails:l,useMPaths:u,flagNotActionableNodes:s,allowedA11yIgnoreReasonsOverride:m});if(T.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(T)}`);if(T.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let w={},P={},A={},x={};return zD({node:T[0],a11yIdNodeMap:w,dataMomenticIdMap:P,selectorToNodeMap:A,nodeIdHasPointingLabelMap:x,explicitLabelTargetDomIds:S,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:p}),new kT(T[0],w,P,A,x)}function kJ(t,e,r,n){if(t==="class"){if(r.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<FD&&!mn.bannedClassSubstrings.some(s=>a.includes(s))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(jD(a,n)){i.push(a);continue}return i.length?i.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let o=Number(e);if(!Number.isNaN(o))return o}catch{}return t==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function UJ(t,e,r){if(!e)return;Object.entries(e.attributes).forEach(([a,s])=>{let c=t[a]||a.startsWith("aria")||CJ.includes(a);if((mn.relevantElementAttributes.includes(a)||GD(a,r))&&!c){let u=kJ(a,s,e,r);u!==null&&(t[a]=u)}});let n,o=[];if(e.computedStyles.position&&LD.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of LD)if(e.attributes.style.includes(`position: ${a}`)){n=a;break}}n&&o.push(`position: ${n}`);let i;e.computedStyles.opacity&&e.computedStyles.opacity==="0"&&(i="opacity: 0"),i&&o.push(i);for(let a of r?.styles??[]){let s=a.split(":"),c=s[0]?.trim(),l=s[1]?.trim(),u=e.computedStyles[c??""];if(c!==void 0&&l!==void 0&&u!==void 0&&(l==="*"||u===l)){let d=e.computedStyles[c],p=`${c}: ${d}`;o.includes(p)||o.push(p)}}o.length>0&&(t.style=o.join("; "))}function FJ(t){let e=t.properties.class;if(typeof e=="string"&&e.includes("cm-content")){t.children.forEach((i,a)=>{i.properties["cm-line-number"]=`${a+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){t.children.forEach((i,a)=>{i.properties["block-number"]=`${a+1}`}),t.children.length>0&&(t.children[t.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(t.tagName==="table"){let i=[],a=t.children.find(c=>c.tagName==="thead");if(a){let c=a.children.find(l=>l.tagName==="tr");if(c){let l=c.children.filter(u=>u.tagName==="th");l.forEach((u,d)=>{u.properties["col-index"]||(u.properties["col-index"]=d+1),i?.push(Tt(u.name,100,!1))}),i?.length!==l.length&&(i=void 0)}}let s=0;for(let c of t.children)if(c.tagName==="tbody")for(let l=0;l<c.children.length;l++){let u=c.children[l];if(u.tagName!=="tr")continue;if(l===0&&!i?.length){let m=u.children.filter(g=>g.tagName==="th");if(m.length){if(i=m.map(g=>Tt(g.name,100,!1)),i.length===m.length)continue;i=void 0}}s+=1,u.properties["row-index"]||(u.properties["row-index"]=s);let d=u.children.filter(m=>m.tagName==="td"||m.tagName==="th"),p=d.length===i?.length;d.forEach((m,g)=>{m.tagName!=="th"&&(m.properties["col-index"]||(m.properties["col-index"]=g+1),p&&(m.properties.col||(m.properties.col=i[g])))})}}}function BJ(t){let e=t.properties.class,r=typeof e=="string"&&e.includes("cm-content");t.internalProperties.inCodeMirrorEditor=t.internalProperties?.inCodeMirrorEditor||r}function jD(t,e){if(e&&VD(t,e))return!0;if(mn.bannedClassSubstrings.some(r=>t.includes(r)))return!1;if(mn.alwaysInterestingClassNames.includes(t))return!0;for(let r of mn.alwaysInterestingClassPrefixes)if(t.startsWith(r))return!0;return!1}function GD(t,e){if(e?.attributes?.includes(t))return!0;for(let r of e?.attributes??[])if(r.endsWith("*")){let n=r.slice(0,-1);if(t.startsWith(n))return!0}return!1}function VD(t,e){if(e?.classes?.includes(t))return!0;for(let r of e?.classes??[])if(r.endsWith("*")){let n=r.slice(0,-1);if(t.startsWith(n))return!0}return!1}var Sh=class t{constructor(e,r,n,o,i){this.session=e;this.logger=r;this.contextGetter=n;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;loadEventLogs=[];static async init({logger:e,contextGetter:r,pageGetter:n,defaultTimeoutMs:o}){let i=r(),a=n(),s,c;for(let u=0;u<2;u++)try{s=await X(i.newCDPSession(a),{milliseconds:o*u,fallback:()=>{throw new M("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await fe(lr),c=d}if(!s)throw c;let l=new t(s,e,r,n,o);try{await X(l.registerHandlers(s),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(u){throw l.cdpFullyDead=!0,new M("UserInfrastructureError",`Failed to initialize CDP client: ${u}`)}return l}async registerHandlers(e){e.on("Target.attachedToTarget",async()=>{try{await e.send("Runtime.runIfWaitingForDebugger")}catch(r){this.logger.warn({err:r},"Failed to run Runtime.runIfWaitingForDebugger")}}),e.on("Target.targetCrashed",r=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},targetCrashDetails:JSON.stringify(r)},this.logger.error({payload:r},"CDP session crashed, Momentic will likely not function correctly")}),e.on("Inspector.targetCrashed",r=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},inspectorCrashDetails:JSON.stringify(r)},this.logger.error({payload:r},"CDP inspector session crashed, Momentic will likely not function correctly")}),e.on("Page.frameRequestedNavigation",r=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Frame requested navigation: ${JSON.stringify(r)}`)}),e.on("Page.navigatedWithinDocument",r=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Navigated within document: ${JSON.stringify(r)}`)}),e.on("Page.lifecycleEvent",r=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page lifecycle event: ${JSON.stringify(r)}`)}),e.on("Page.loadEventFired",()=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page load event fired`)}),await Promise.all([e.send("Accessibility.enable"),e.send("Page.enable"),e.send("DOM.enable"),e.send("Overlay.enable"),e.send("DOMSnapshot.enable"),e.send("CSS.enable")])}async send({method:e,params:r,timeout:n=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await X(this.cdpInitializingPromise,{milliseconds:n});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new M("UserInfrastructureError",`The browser inspector session encountered a critical crash: ${JSON.stringify(this.cdpCrashDetails)}`);this.logger.warn(`Detected crashed CDP client before method ${e}, reinitializing before proceeding...`),await this.reinitialize()}try{return await X(this.session.send(e,r),{milliseconds:n,message:o??`Chrome command ${e} timed out after ${n}ms. This is likely an infrastructure issue caused by a lack of compute resources or a crash at the browser level.`})}catch(i){throw["Internal error","Target crashed"].some(a=>i.message.includes(a))&&!this.cdpInitializingPromise&&(this.logger.warn({err:i},`CDP crashed during CDP method ${e}, re-initializing client`),await this.reinitialize()),i}}async createRawCDPSession(e=this.defaultTimeoutMs){let r=e,n=this.pageGetter(),o=await X(this.contextGetter().newCDPSession(n),{milliseconds:r,fallback:()=>{throw this.logger.warn(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new M("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${n.url()})`)}});return this.logger.debug(`Created new CDP session for ${n.url()}`),o}async reinitialize(e=this.defaultTimeoutMs){await this.cdpInitializingPromise,this.cdpInitializingPromise=(async()=>{try{let r=this.session;this.session=await this.createRawCDPSession(e),await X(this.registerHandlers(this.session),{milliseconds:e,message:`Failed to register CDP handlers within ${e}ms`}),this.logger.debug("Successfully reinitialized and attached new handlers to CDP session");try{await X(r.detach(),{milliseconds:1e3})}catch(n){this.logger.warn({err:n},"Failed to detach old CDP session after reinitialization, continuing...")}this.cdpCrashDetails=void 0,this.cdpFullyDead=!1}catch(r){this.cdpCrashDetails={...this.cdpCrashDetails??{},reinitializeError:`${r}`},this.cdpFullyDead=!0}finally{this.cdpInitializingPromise=void 0}})(),await this.cdpInitializingPromise}on(e,r){return this.session.on(e,r),this.session}off(e,r){return this.session.off(e,r),this.session}addListener(e,r){return this.session.addListener(e,r),this.session}removeListener(e,r){return this.session.removeListener(e,r),this.session}};var nc="<empty>";function zJ(t){return t.includes("doubleclick.net")||t.includes("googletagmanager.com")||t.includes("googlesyndication.com")||t.includes("s.amazon-adsystem.com")||t.includes("smartadserver.com")||t.includes("omnitagjs.com")||t.includes("x.adroll.com")}function qD(t){let e=t.adFrameStatus?.adFrameType;return e==="child"||e==="root"||zJ(t.url)}async function HJ(t,e){let r=await t.send({timeout:ie,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await t.send({timeout:ie,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[r.backendNodeId]}})).nodeIds[0],a=(await t.send({timeout:ie,method:"DOM.describeNode",params:{backendNodeId:r.backendNodeId}})).node;return a.nodeId=o,a}async function oc({cdpClient:t,page:e,logger:r}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([t.send({timeout:rc,method:"Page.getFrameTree",params:{}}),t.send({timeout:rc,method:"DOM.getDocument",params:{depth:0}})]),l=(i.frameTree.childFrames??[]).map(async(d,p)=>{if(qD(d.frame))return null;try{return await KD({cdpClient:t,rawFrameTree:d,indices:[p],parent:n,warnings:o,logger:r})}catch(m){return o.push(`Failed to get child frame: ${m}`),null}}),u=await Promise.all(l);return n.childFrames=u.filter(d=>d!==null),o.length&&r?.warn({warnings:o},"Got warnings when fetching frame tree"),n}async function KD({cdpClient:t,rawFrameTree:e,indices:r,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await HJ(t,a),c=s.attributes??[],l=null,u=[];for(let g of["src","name","id","title","srcdoc","sandbox"]){let h=sa(c,g);h&&(u.push(`${g}=${JSON.stringify(h)}`),g==="src"&&(l=h))}let d={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:a,locationData:{indices:r,attributeSelectors:u},src:l,childFrames:[],parent:n,domNode:s},m=(e.childFrames??[]).map(async(g,h)=>{if(qD(g.frame))return null;try{return await KD({cdpClient:t,rawFrameTree:g,indices:[...r,h],parent:d,warnings:o,logger:i})}catch(f){return o.push(`Failed to get child frame (child ${h} of frame with url ${e.frame.url}): ${f}`),null}});return d.childFrames=(await Promise.all(m)).filter(g=>g!==null),d}async function jJ(t){try{return await t.owner().count()===1}catch{return!1}}async function GJ(t){try{return await t.count()===1}catch{return!1}}async function Do(t,e){let r=[],n=t;for(;n.parent.type==="frame";)r.push(n.parent),n=n.parent;r.reverse();let o=e,i=[];for(let l of r){let u=!1;for(let d of[...l.locationData.attributeSelectors,nc]){let p=o.frameLocator(d===nc?"iframe":`iframe[${d}]`);if(await jJ(p)){u=!0,o=p,i.push(d);break}}if(!u)throw new M("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${l.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let a;for(let l of[...t.locationData.attributeSelectors,nc]){let u=o.locator(l===nc?"iframe":`iframe[${l}]`);if(await GJ(u)){a=u,i.push(l);break}}if(!a)throw new M("ActionFailureError",`Failed to find a unique attribute to identify target frame with url matching '${t.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`);let s=await a.evaluateHandle(l=>l),c=await s.asElement().contentFrame();if(!c)throw new M("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${t.url}'`);return await s.dispose(),{frame:c,mPathSelectorTokens:i}}function $D(t,e){let r=[...t],n=[];for(;r.length;){let o=r.shift();e(o)&&n.push(o),r.push(...o.childFrames)}return n}async function YD({page:t,frameTree:e,cache:r}){let n,o=e.childFrames,i=[];if(r.mPathSelectorTokens.length){let s=o;for(let u=0;u<r.mPathSelectorTokens.length-1;u++){let d=r.mPathSelectorTokens[u];d===nc?s=s.length===1?s[0].childFrames:[]:s=s.filter(p=>p.locationData.attributeSelectors.includes(d)).map(p=>p.childFrames).flat()}let c=[],l=r.mPathSelectorTokens[r.mPathSelectorTokens.length-1];if(l===nc?c=s:c=s.filter(u=>u.locationData.attributeSelectors.includes(l)),c.length===1)return n=c[0],i.push(`Found unique frame with mpath ${r.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await Do(n,t)).frame,handle:n,mPathSelectorTokens:r.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with mpath ${r.mPathSelectorTokens.join(" > ")}`)}if(r.frameSrcRegex){let s=new RegExp(r.frameSrcRegex),c=$D(o,l=>!!l.src&&s.test(l.src));if(c.length===1)return n=c[0],i.push(`Found unique frame with src regex ${r.frameSrcRegex}`),{resolution:{type:"auto",frame:(await Do(n,t)).frame,handle:n,mPathSelectorTokens:r.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with src regex ${r.frameSrcRegex}`),r.frameSrcRegex=void 0}if(r.frameUrlRegex){let s=new RegExp(r.frameUrlRegex),c=$D(o,l=>!!l.url&&s.test(l.url));if(c.length===1)return n=c[0],i.push(`Found unique frame with url regex ${r.frameUrlRegex}`),{resolution:{type:"auto",frame:(await Do(n,t)).frame,handle:n,mPathSelectorTokens:r.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with url regex ${r.frameUrlRegex}`),r.frameUrlRegex=void 0}let a=o;for(let s=0;s<r.indices.length-1;s++)a=a[r.indices[s]]?.childFrames??[];if(n=a[r.indices[r.indices.length-1]],n)return i.push(`Found unique frame with indices ${r.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await Do(n,t)).frame,handle:n,mPathSelectorTokens:r.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${r.indices}`),new vn("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}],"could-not-find-iframe")}function yh(t){return t.type==="auto"?JSON.stringify({type:"auto",frameId:t.handle.frameId}):JSON.stringify(t)}function FT(t){for(;t.parent.type==="frame";)t=t.parent;return t.parent}function XD(t){let e=FT(t),r=t.src??"",n=t.url??"",o=[],i=[],a=[...e.childFrames];for(;a.length;){let s=a.shift();s.src&&o.push(s.src),s.url&&i.push(s.url),a.push(...s.childFrames)}return{srcs:o,urls:i,desiredSrc:r,desiredUrl:n}}function JD(t){return t.type==="auto"?{type:"auto",frameId:t.handle.frameId,url:t.handle.url,src:t.handle.src??"",mPathSelectorTokens:t.mPathSelectorTokens.join(" > ")}:{type:"url",url:t.url}}async function ZD({frame:t,logger:e,signal:r}){let n;try{n=await t.frameElement(),await VJ({frameElementHandle:n,logger:e,signal:r})}catch(o){n?e.warn({err:o},"Failed to scroll iframe into view, trying with raw JS"):e.warn("Failed to scroll iframe into view - no frame element")}finally{await n?.dispose()}}async function VJ({frameElementHandle:t,logger:e,signal:r}){let n=await t.boundingBox(),i=await cd({promiseGenerator:async()=>t.evaluate(async a=>{let s=a.scrollTop,c=a.getBoundingClientRect(),l=0,u=0,d=window.innerWidth,p=window.innerHeight;if(c.top>=l&&c.left>=u&&c.bottom<=p&&c.right<=d)return{didScroll:!1,reason:"already-fully-visible"};a.scrollIntoView({behavior:"instant",block:"center",inline:"center"}),await new Promise(S=>setTimeout(S,250));let g=Date.now();for(;Date.now()-g<1e3;){let S=a.scrollTop;if(S===s)break;s=S,await new Promise(b=>setTimeout(b,250))}let h=a.getBoundingClientRect();return h.top!==c.top||h.left!==c.left||h.right!==c.right||h.bottom!==c.bottom?{didScroll:!0,reason:"scrolled",afterRect:h}:{didScroll:!1,reason:"no-more-scroll-possible",afterRect:h}}),timeoutMs:rt,codePath:"scrollIframeIntoView",signal:r});i.didScroll&&e.info({oldBb:n,newBb:await t.boundingBox(),evalResult:i},"Successfully scrolled iframe into view")}var BT=()=>{let t,e,r=new Promise((n,o)=>{t=n,e=o});return{resolve:t,reject:e,value:r}};var QD=(t,e)=>{let r=t.name??`batcher:${Math.random().toString(16).slice(2)})`,n=t.scheduler??$J(10),o=globalThis.__BATSHIT_DEVTOOLS__?.for(r),i=e??{seq:0,batch:new Set,currentRequest:BT(),timer:void 0,start:null,latest:null,abortController:new AbortController};o?.create({seq:i.seq});let a=()=>{i.batch=new Set,i.currentRequest=BT(),i.timer=void 0,i.start=null,i.latest=null,i.abortController=new AbortController},s=()=>{let d=i.seq,p=t.fetcher([...i.batch],i.abortController.signal),m=i.currentRequest;return o?.fetch({seq:d,batch:[...i.batch]}),a(),p.then(g=>{o?.data({seq:d,data:g}),m.resolve(g)}).catch(g=>{o?.error({seq:d,error:g}),m.reject(g)}),i.seq++,p};return{fetch:d=>{i.start||(i.start=Date.now()),i.latest=Date.now(),i.batch.add(d),clearTimeout(i.timer);let p=n(i.start,i.latest,i.batch.size);if(o?.queue({seq:i.seq,query:d,batch:[...i.batch],scheduled:p,latest:i.latest,start:i.start}),p==="immediate"){let m=i.currentRequest;return s(),m.value.then(g=>t.resolver(g,d))}else return p==="never"?i.currentRequest.value.then(m=>t.resolver(m,d)):(i.timer=setTimeout(s,p),i.currentRequest.value.then(m=>t.resolver(m,d)))},next:()=>{s()},abort:()=>{i.abortController.abort(),i.currentRequest.reject(new DOMException("Aborted","AbortError")),a()}}};var $J=t=>(e,r)=>{let n=r-e;return t-n};var e0=({windowMs:t,maxBatchSize:e})=>(r,n,o)=>{if(o>=e)return"immediate";let i=n-r;return t-i};import{reduce as WJ}from"lodash-es";var qJ=100,KJ=2e3;function t0(t){return QD({fetcher:async r=>{t(WJ(r,(n,o)=>({...n,...o}),{}))},resolver:()=>{},scheduler:e0({windowMs:KJ,maxBatchSize:qJ})})}async function r0({event:t,transformer:e,enricher:r,frame:n,lastScreenshotForRecording:o,logger:i}){let{warnings:a,error:s,properties:c}=t.target;if(s){i.error({error:s,warnings:a},"Error while capturing passive click");return}if(a.length&&i.warn({warnings:a},"Warnings while capturing passive click"),!c)return;let l=n.parentFrame()?n.url():void 0,d=n.page().frames().map(g=>g.url());i.debug({frameUrl:l,...t},"Passive click event captured on element");let p,m;if(l)try{let g=await n.frameElement();p=await X(g?.boundingBox(),{milliseconds:ie})??void 0;let h=await r.constructIframeRegex({urls:d,srcs:[],desiredUrl:l});if(h.urlRegex)m={type:"url",url:`/${h.urlRegex}/`};else throw new Error(`Got no url regex options: ${JSON.stringify(h)}`)}catch(g){i.warn({err:g},"Failed to construct iframe details for recorded action, using hardcoded URL only"),m={type:"url",url:l}}(async()=>{try{await e.recordElementAction({...t,screenshotBase64:o,frameConfig:m,frameBoundingBox:p})}catch(g){i.error({err:g},"Failed to transform passive click action")}})()}import{randomUUID as ko}from"crypto";import YJ from"js-beautify";var XJ=["Dead"],bh=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:r,generator:n,testId:o,orgId:i,logger:a}){this.signal=e,this.logger=a,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(s,c)=>{this.recordedSteps.set(c,{step:s}),r.onStepRecorded(s,c)},onActionReceived:(s,c)=>{this.recordedSteps.set(c,{step:s}),r.onActionReceived?.(s,c)}},this.generator=n}reserveIndexForCommand(e){let r=this.nextStepOffset;return this.recordedSteps.set(r,{step:{id:ko(),type:"PRESET_ACTION",command:Wo(e)}}),this.nextStepOffset++,r}async recordElementAction(e){let{type:r,target:n,frameConfig:o}=e;if(this.signal.aborted){this.logger.debug("Transformer was already cleaned up, ignoring click...");return}let i,a,s=n.properties.attributes.nodeOnlySerializedHtml.trim(),c=s,l;switch(e.frameConfig?e.frameBoundingBox?l={x:e.frameBoundingBox.x+n.properties.boundingBox.x,y:e.frameBoundingBox.y+n.properties.boundingBox.y,width:n.properties.boundingBox.width,height:n.properties.boundingBox.height}:this.logger.warn(e,"No frame bounding box found, refusing to write bounding box"):l=n.properties.boundingBox,r){case"CLICK":{i="CLICK";let h=Wo(i);a={id:ko(),type:"PRESET_ACTION",command:{...h,target:{type:"description",elementDescriptor:c},iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}}}};break}case"SELECT":{i="SELECT_OPTION";let h=Wo(i);a={id:ko(),type:"PRESET_ACTION",command:{...h,type:"SELECT_OPTION",iframeUrl:o?.url,target:{type:"description",elementDescriptor:c},cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let h=Wo(i);a={id:ko(),type:"PRESET_ACTION",command:{...h,target:{type:"description",elementDescriptor:c},deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),targetUpdateLoggerTags:et(this.logger),boundingBox:l}}}};break}default:throw new Error(`Unknown action type: ${r}`)}let u;e.offset===void 0?(u=this.nextStepOffset,this.nextStepOffset++):u=e.offset,this.callbacks.onActionReceived?.(a,u);let d=e.target.browserState;try{d=YJ.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=PN(d,"data-momentic-interacted",4e4)}catch{}let p;try{p=(await this.generator.getReverseMappedDescription({target:d,screenshot:e.screenshotBase64?`data:image/jpeg;base64,${e.screenshotBase64}`:void 0,boundingBox:n.properties.boundingBox},{disableCache:!1,loggerTags:{testId:this.testId,...et(this.logger)}})).phrase}catch(h){this.logger.error({err:h},"Error generating reverse mapping description"),p=s}let m=this.recordedSteps.get(u)?.step??a,g=m?.command;g&&"target"in g&&g.target?(g.target={type:"description",elementDescriptor:p},this.callbacks.onStepRecorded({...m,command:g},u)):this.logger.warn("Could not find existing command to update after description mapping")}recordKeystroke(e){let{key:r,combinable:n}=e;if(XJ.includes(r)||this.signal.aborted)return;let o="normal";r.length>1&&(o="special");let i;if(o==="normal"){let d=Wo("TYPE");i={id:ko(),type:"PRESET_ACTION",command:{...d,target:void 0,value:r,clearContent:!1}}}else{let d=Wo("PRESS");i={id:ko(),type:"PRESET_ACTION",command:{...d,value:r}}}let a,s=this.nextStepOffset-1,c=this.recordedSteps.get(s),l=c?.step,u=l?.command;if(n){if(u?.type===i.command.type){let d=u.value,p=i.command.value;i={id:ko(),type:"PRESET_ACTION",command:{...u,value:i.command.type==="PRESS"?`${d}+${p}`:`${d}${p}`}},a=s}else if(u?.type==="CLICK"&&i.command.type==="TYPE")l.command={...i.command,target:u.target,cache:u.cache},i=c.step,a=s;else if(u?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let d=u.value;i={id:ko(),type:"PRESET_ACTION",command:{...u,value:d.slice(0,d.length-1)}},a=s}}a===void 0&&(a=this.nextStepOffset,this.nextStepOffset++),this.callbacks.onStepRecorded(i,a)}recordScroll(e){if(this.signal.aborted)return;let r=()=>{let{deltaY:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_DOWN"&&s.deltaY?(i+=s.deltaY,c=a):s?.type==="SCROLL_UP"&&s.deltaY?(i-=s.deltaY,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_DOWN":"SCROLL_UP",u=Wo(l);u.deltaY=Math.abs(i);let d={id:ko(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},n=()=>{let{deltaX:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_RIGHT"&&s.deltaX?(i+=s.deltaX,c=a):s?.type==="SCROLL_LEFT"&&s.deltaX?(i-=s.deltaX,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",u=Wo(l);u.deltaX=Math.abs(i);let d={id:ko(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},o=this.recordedSteps.get(this.nextStepOffset-1);o?.step.command.type==="SCROLL_LEFT"||o?.step.command.type==="SCROLL_RIGHT"?(n(),e.deltaY>=20&&r()):(r(),e.deltaX>=20&&n())}};import{z as zT}from"zod";var eXe=zT.object({type:zT.literal("url"),url:zT.string()});var Eh=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;userControlledBrowserSettings;enricher;iconKnowledgeBase;computedStylesToFetch=["display","opacity","visibility","height","position","background-image"];activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeMap={};lastA11yTreeRoot;lastDomGraph;allowedA11yIgnoreReasonsOverride;constructor({smartWaitingTimeoutMs:e,pageLoadTimeoutMs:r,allowPartialAccessibilityTree:n,logger:o,cdpClient:i,pageGetter:a,abortSignalGetter:s,enricher:c,iconKnowledgeBase:l,userBrowserSettings:u,allowedA11yIgnoreReasonsOverride:d}){if(this.smartWaitingTimeoutMs=e,this.pageLoadTimeoutMs=r,this.allowPartialAccessibilityTree=n,this.logger=o,this.cdpClient=i,this.pageGetter=a,this.abortSignalGetter=s,this.enricher=c,this.iconKnowledgeBase=l,this.userControlledBrowserSettings=u,this.allowedA11yIgnoreReasonsOverride=d,this.userControlledBrowserSettings.importantStyles)for(let p of this.userControlledBrowserSettings.importantStyles){let m=p.split(":");if(m.length!==2){this.logger.warn({style:p},"Invalid style property passed to importantStyles");continue}let g=m[0]?.trim(),h=m[1]?.trim();if(g===void 0||h===void 0){this.logger.warn({style:p},"Invalid style property passed to importantStyles");continue}this.computedStylesToFetch.includes(g)||this.computedStylesToFetch.push(g)}}get frameConfig(){return this.activeFrameConfig}get domGraph(){return this.lastDomGraph}get selectorToNodeMap(){return this.lastSelectorToNodeMap}get dataMomenticIdToNodeMap(){return this.lastDataMomenticIdToNodeMap}get a11yIdToNodeMap(){return this.lastA11yIdToNodeMap}get a11yTreeRoot(){return this.lastA11yTreeRoot}setActiveFrameConfig(e){e?(this.activeFrameConfig=e,this.activeFrameCache=void 0):(this.activeFrameConfig=void 0,this.activeFrameCache=void 0)}reset(){this.activeFrameCache=void 0,this.activeFrameConfig=void 0,this.lastA11yIdToNodeMap={},this.lastDataMomenticIdToNodeMap={},this.lastSelectorToNodeMap={},this.lastA11yTreeRoot=void 0,this.lastDomGraph=void 0}saveAutoFrameCacheDetails(e){if(!this.activeFrameConfig||this.activeFrameConfig.type!=="auto"||!this.userControlledBrowserSettings.autoExpandIframes)return;let r={...e,indices:this.activeFrameConfig.handle.locationData.indices,mPathSelectorTokens:this.activeFrameConfig.mPathSelectorTokens};return this.constructIframeRegexAsync(this.activeFrameConfig.handle,r),r}async getAutoFrameDetailsFromHandle(e){let r=this.pageGetter(),n=FT(e),{frame:o,mPathSelectorTokens:i}=await Do(e,r),a={indices:e.locationData.indices,mPathSelectorTokens:i};return this.constructIframeRegexAsync(e,a),{cache:a,config:{type:"auto",frame:o,handle:e,mPathSelectorTokens:i,frameTree:n,cache:a}}}async resolveAutoFrameCache(e){let r=this.pageGetter(),n=await oc({cdpClient:this.cdpClient,page:r,logger:this.logger}),{resolution:o,logs:i}=await YD({page:r,frameTree:n,cache:e});return this.logger.info({logs:i},"Resolved auto frame cache"),{...o,cache:e}}async resolveActiveFrameConfig({logger:e=this.logger,signal:r=this.abortSignalGetter()}){if(!this.frameConfig)return null;if(this.activeFrameCache)if(yh(this.frameConfig)!==this.activeFrameCache.frameIdentifierStringified)this.activeFrameCache=void 0;else if(this.activeFrameCache.frame&&"isDetached"in this.activeFrameCache.frame&&this.activeFrameCache.frame.isDetached())this.activeFrameCache=void 0;else return this.activeFrameCache;let n;return this.frameConfig.type==="url"?n=await this.resolveUrlMatcherFrameConfig({config:this.frameConfig,logger:e,signal:r}):n={source:"auto",frame:this.frameConfig.frame,handle:this.frameConfig.handle,frameIdentifierStringified:yh(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await ZD({frame:n.frame,logger:e,signal:r}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,r){let n=this.pageGetter(),o=await oc({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[X(n.evaluate(e,r),{milliseconds:rt})],a=Array.from(o.childFrames);for(;a.length>0;){let c=a.shift(),l=c.url;l==="about:blank"||l.startsWith("chrome-error://")||(a.push(...c.childFrames),i.push(Do(c,n).then(({frame:u})=>X(u.evaluate(e,r),{milliseconds:rt})).catch(u=>(this.logger.warn({err:u,frameUrl:c.url},"Failed to evaluate function in frame"),"MOMENTIC_FRAME_EVAL_ERROR"))))}return(await Promise.all(i)).filter(c=>c!=="MOMENTIC_FRAME_EVAL_ERROR")}async getAllChildFrameUrls(){let e=this.pageGetter(),r=await oc({cdpClient:this.cdpClient,page:e,logger:this.logger}),n=Array.from(r.childFrames),o=[];for(;n.length>0;){let i=n.shift();n.push(...i.childFrames),o.push(i.src??i.url)}return o}async getDomGraph({devicePixelRatio:e,signal:r,logger:n}){return this.getDOMTree({devicePixelRatio:e??1,signal:r,logger:n??this.logger})}async getA11yTree(e){let r={},n=e.logger??this.logger,o=e.abortSignal??this.abortSignalGetter(),i=this.pageGetter();if(!e.skipPageLoad)try{await i.waitForLoadState("load",{timeout:this.pageLoadTimeoutMs})}catch(p){n.warn({err:p},"Failed to wait for page load event before a11y tree fetch, attempting to continue without it..."),await this.cdpClient.reinitialize()}let a,s,c=null;if(this.frameConfig?.type==="url"){if(a=await jn({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:r,signal:o,logger:n})??void 0,!a)throw new M("ActionFailureError","Got null frame details despite active frame config");s=a.handle,c=s.frameId}else this.userControlledBrowserSettings.autoExpandIframes?(s=await jn({fn:()=>oc({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),codePath:"getMomenticFrameTree",logObject:r,signal:o,logger:n}),c=null):(s={type:"root",page:i,childFrames:[]},c=null);await jn({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:s.childFrames,frameFilter:a?.frame,logger:n}),codePath:"addIdsToElement",logObject:r,signal:o,logger:n});let l=await jn({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:r,signal:o,logger:n}),u=await jn({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:c,childFrames:s.childFrames,logTimings:r,logger:n,signal:o}),codePath:"totalA11yFetch",logObject:r,signal:o,logger:n}),{tree:d}=await jn({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:u,domGraph:l,startingFrameId:c,frameContext:s,logger:n,iconKnowledgeBase:this.iconKnowledgeBase,showZeroOpacityElements:e.showZeroOpacityElements,flagNotActionableNodes:e.flagNotActionableNodes}),codePath:"a11yProcess",logObject:r,signal:o,logger:n});return Object.values(r).some(p=>p>750)&&n.warn({logTimings:r},"A11y tree fetch component took a long time"),this.lastA11yIdToNodeMap=d.a11yIdNodeMap,this.lastDataMomenticIdToNodeMap=d.dataMomenticIdMap,this.lastA11yTreeRoot=d.root,this.lastDomGraph=l,this.lastSelectorToNodeMap=d.selectorToNodeMap,d}async fetchA11yTreeForRecording(e,r){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:r,logger:Eo,filterByViewport:!1,flagNotActionableNodes:!1,skipPageLoad:!0}),Math.random()<.1){let n=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:n&&n.length>4e5?"REDACTED_DUE_TO_SIZE":n},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:r,node:n}){if(n.backendNodeId===void 0)throw new Error(`Node with a11y id ${n.id} has no backend node ID: ${n.getNodeOnlySerializedForm()}`);if(this.userControlledBrowserSettings.visualActions){let o=this.domGraph?.backendIdToNode[n.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${n.backendNodeId}`);let i=PD({node:o,domGraph:this.domGraph});return MD(e,i)}else return n.domNode||this.logger.warn({a11yRole:n.role,content:n.content},"Attempting to get locator from a11y node with no DOM node"),this.getLocatorFromBackendId(r,n.backendNodeId)}async getLocatorFromBackendId(e,r){let n=await this.cdpClient.send({method:"DOM.resolveNode",params:{backendNodeId:r},timeout:rt});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${r}`);let o;try{o=await OD(this.cdpClient,n.object.objectId)}catch(i){throw this.logger.debug({err:i,object:JSON.stringify(n.object)},"Failed to get ID attribute for target"),i}return e.locator(ui(o))}getNodeUsingMPathSelector(e){let r=this.selectorToNodeMap[e];if(r)return r;let n=e.split(" > "),o="";for(let i=n.length-1;i>=0;i--){let a=n.slice(i).join(" > ");if(this.selectorToNodeMap[a]){o=a;break}}this.logger.warn({selectorMapSize:Object.keys(this.selectorToNodeMap).length,selector:e,closestSelector:o},"Could not find a11y node using mpath selector")}async resolveUrlMatcherFrameConfig({config:e,signal:r=this.abortSignalGetter(),logger:n=this.logger}){let o=Date.now(),i,a,s,c=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await oc({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),a=await this.getMatchingFrameByUrlWithCdp(i,e),n.info({frameId:a.handle.frameId,url:a.handle.url,src:a.handle.src,locationData:a.handle.locationData},`Found matching frame using ${a.matchType}`);break}catch(l){if(s=l,l instanceof M&&l.reason==="UserInfrastructureError")throw l;c%3===0&&this.logger.warn({attempt:c,err:l},"Failed to resolve active frame, retrying..."),await fe(lr,r)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:yh(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw s}async getMatchingFrameByUrlWithCdp(e,r){let n=r.url,o=this.pageGetter(),i=Array.from(e.childFrames),a=[];for(;i.length>0;){let s=i.shift(),c=s.domNode;i.push(...s.childFrames);let l=sa(c.attributes??[],"src"),u=c.contentDocument?.documentURL;if(!l&&!u){this.logger.debug("Skipping frame with no URL or src");continue}for(let d of[l,u])if(d){if(n.startsWith("/")&&n.endsWith("/")){if(new RegExp(n.slice(1,-1)).test(d)){a.push({handle:s,matchType:"regex",...await Do(s,o)});break}}else if(n.trim()===d.trim()){a.push({handle:s,matchType:"url",...await Do(s,o)});break}}}if(a.length===1){let s=a[0];return this.userControlledBrowserSettings.autoExpandIframes||(s.handle.childFrames=[]),s}else throw a.length>1?new Error(`Found multiple frames with src matching '${n}'. Please use a more specific selector.`):new M("ActionFailureError",`Failed to find frame with src matching: ${n}`)}async composeA11yDomGraph({opts:e,a11yGraph:r,domGraph:n,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:s,showZeroOpacityElements:c,flagNotActionableNodes:l}){let u=await HD({rawA11yGraph:r,startingFrameId:o,frameContext:i,domGraph:n,logger:a,cdpClient:this.cdpClient,showZeroOpacityElements:c,flagNotActionableNodes:l,filterByViewport:e.filterByViewport,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles},viewportDetails:void 0,iconKnowledgeBase:s,useMPaths:this.userControlledBrowserSettings.visualActions,allowedA11yIgnoreReasonsOverride:this.allowedA11yIgnoreReasonsOverride});if(!u||!u.root)throw new Error("Accessibility tree appears empty");return{tree:u}}async addMomenticIds({rootPage:e,childFrames:r,frameFilter:n,logger:o}){if(this.userControlledBrowserSettings.visualActions)return;let i=await this.addMomenticIdsHelper(n??e,1);if(!this.userControlledBrowserSettings.autoExpandIframes||n)return;let a=Array.from(r),s=[];for(;a.length>0;){let c=a.shift();a.push(...c.childFrames);let l=async()=>{try{let{frame:u}=await Do(c,e);i=await this.addMomenticIdsHelper(u,i)}catch(u){c.url!=="about:blank"&&o.warn({err:u},"Error adding momentic IDs to child frame, continuing...")}};s.push(l())}await Promise.all(s)}async addMomenticIdsHelper(e,r){if(this.userControlledBrowserSettings.visualActions)return r;let n=this.logger;return await Yt({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:r,timeout:rt,waitForPageLoad:async()=>{try{await e.waitForLoadState("domcontentloaded",{timeout:this.smartWaitingTimeoutMs})}catch(i){n.warn({err:i},"Error loading frame root adding momentic ids, continuing...")}},codePath:"adding Momentic element IDs to the page"})??r}getPageDomain(e){try{let r=new URL(e);if(!r.hostname)return null;let n=r.hostname.split("."),o=n.length>2?n.slice(-2).join("."):r.hostname;return`${r.protocol}//${o}`}catch{return null}}async decideChildFrameUnrollEligibility({logger:e,warnings:r,handle:n}){try{let{shouldUnroll:o,reason:i}=await this.decideChildFrameUnrollEligibilityHelper({domNode:n.domNode});return{shouldUnroll:o,reason:i}}catch(o){if(o.message.includes("Could not compute box model"))return{shouldUnroll:!1};let i=`Got error when determining whether to filter frame ${n.frameId} with url ${n.url}, allowing it to be fetched: ${o}`;return r?.push(i),e?.warn({err:o},i),{shouldUnroll:!0}}}async decideChildFrameUnrollEligibilityHelper({domNode:e}){let r=e.attributes??[];if(sa(r,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=sa(r,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:ie,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:ie,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:ie,method:"CSS.getComputedStyleForNode",params:{nodeId:e.nodeId}})]);if(!o.model||!o.model.height||!o.model.width)return{shouldUnroll:!1,reason:"no bounding box"};if(o.model.height<10||o.model.width<10)return{shouldUnroll:!1,reason:"small bounding box"};for(let a of i.computedStyle){if(a.name==="display"&&a.value==="none")return{shouldUnroll:!1,reason:"display: none"};if(a.name==="visibility"&&a.value==="hidden")return{shouldUnroll:!1,reason:"visibility: hidden"};if(a.name==="opacity"&&a.value==="0")return{shouldUnroll:!1,reason:"opacity: 0"}}return{shouldUnroll:!0}}async getRawA11yGraph({cdpClient:e,frameId:r,childFrames:n,logTimings:o,logger:i=this.logger,signal:a=this.abortSignalGetter()}){let s=[],c,l;for(let m=0;m<3;m++)try{l=await jn({fn:()=>this.getRawA11yTreeForFrame({frameId:r,timeoutMs:this.pageLoadTimeoutMs,logTimings:o}),codePath:"a11y-tree-fetch-root",logObject:o,logger:i});break}catch(g){c=g,i.warn({err:g},"Reinitializing CDP client before retrying a11y graph fetch"),await this.cdpClient.reinitialize()}if(!l)throw new Error(`Failed to fetch accessibility tree for root page: ${c}`);let u={};if(u[r??"root"]=l,!this.userControlledBrowserSettings.autoExpandIframes)return u;let d=Array.from(n),p=[];for(;d.length>0;){let m=d.shift();try{let{shouldUnroll:h}=await this.decideChildFrameUnrollEligibility({handle:m,warnings:s});if(!h)continue}catch(h){if(h.message.includes("Could not compute box model"))continue;s.push(`Got error when determining whether to filter frame ${m.frameId} with url ${m.url}, allowing it to be fetched: ${h}`)}d.push(...m.childFrames);let g=async()=>{try{let h=await jn({fn:()=>this.getRawA11yTreeForFrame({frameId:m.frameId,timeoutMs:this.smartWaitingTimeoutMs,logTimings:o}),codePath:`a11y-tree-fetch-child-${m.frameId}`,logObject:o,logger:i});u[m.frameId]=h}catch(h){i.warn({err:h,url:m.url,src:m.src},`Error getting raw a11y tree for child frame ${m.frameId}, continuing...`)}};p.push(g())}return await Promise.all(p),s.length>0&&this.logger.warn({warnings:s},"Got warnings when fetching the raw a11y graph"),u}async getRawA11yTreeForFrame({frameId:e,timeoutMs:r,logTimings:n}){let o;if(this.allowPartialAccessibilityTree)o=(await jn({fn:()=>this.cdpClient.send({method:"Accessibility.getFullAXTree",params:{frameId:e??void 0},timeout:r,timeoutMsg:`Fetching the document tree took over ${r}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes;else{let a=(await jn({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:rt}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await jn({fn:()=>this.cdpClient.send({method:"Accessibility.queryAXTree",params:{backendNodeId:a},timeout:r,timeoutMsg:`Fetching the document tree took over ${r}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes}if(!o||o.length<=1)throw new Error("Document is entirely empty");return{root:o[0],allNodes:o}}async getDOMTree({devicePixelRatio:e,signal:r,logger:n}){let o,i=0,a;for(;!o&&i<3;)try{if(o=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:this.computedStylesToFetch},timeout:ie}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await fe(lr,r),i++,a=s}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new M("UserInfrastructureError",`Received an empty HTML snapshot from the browser. This usually indicates the page has crashed due to resource consumption issues or hanging client-side JavaScript code: ${a?.message}`);return ID({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,r){if(r.frameSrcRegex||r.frameUrlRegex)return;let n=XD(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(n);o?.srcRegex&&(r.frameSrcRegex=o.srcRegex),o?.urlRegex&&(r.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:n},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};var Gn=class t{static USER_AGENT=dh;abortSignal=void 0;contextInitialized=!1;cleanedUp=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;pageLoadAbortControllers=new Set;pageLoadAbortListenerCleanup;clientCallbacks;harBatcher;iconKnowledgeBase;cdpClient;debugData={logsPerPage:[]};recentFrameNavigations={};requestRecorders={};mocks={};customHeaders=[];enricher;storage;logger;stateManager;transformer;lastScreenshotForRecording=void 0;originsVisited=new Set;viewport;onVideoPageChange;baseUrl;constructor({storage:e,enricher:r,browser:n,context:o,page:i,baseUrl:a,logger:s,userBrowserSettings:c,viewport:l,properties:u,clientCallbacks:d,iconKnowledgeBase:p,onVideoPageChange:m}){r_(c),this.storage=e,this.enricher=r,this.browser=n,this.context=o,this.page=i,this.baseUrl=a,this.logger=s,this.userControlledBrowserSettings=c,this.viewport=l,this.properties=u,this.clientCallbacks=d,this.iconKnowledgeBase=p,this.onVideoPageChange=m}registerAbortSignal(e){if(this.pageLoadAbortListenerCleanup&&(this.pageLoadAbortListenerCleanup(),this.pageLoadAbortListenerCleanup=void 0),this.abortSignal=e,!this.abortSignal)return;let r=()=>{for(let n of this.pageLoadAbortControllers)n.abort();this.pageLoadAbortControllers.clear()};if(this.abortSignal.aborted){r();return}this.abortSignal.addEventListener("abort",r),this.pageLoadAbortListenerCleanup=()=>{this.abortSignal?.removeEventListener("abort",r)}}async initialize({grantPermissions:e,permissionsToGrant:r,runInitScripts:n,timingRecorder:o}){if(this.contextInitialized)return;let i={[IN]:this.userBrowserSettings.visualActions},a=[];this.userControlledBrowserSettings.extraHeaders&&a.push(this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders)),e&&a.push(this.context.grantPermissions(uD(r))),a.push(this.context.addInitScript({content:`${tT.htmlUtilsLibJs}
|
|
4602
4602
|
//# sourceURL=momentic-injected/browser-scripts.js`}),this.context.addInitScript({content:AT(i,this.userBrowserSettings.disableFullStory)}),this.exposeRecordingBindings());let s=d=>this.handleNewPageEvent(d);this.context.on("page",s),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",s)});let c=!1;if(n){let d=async()=>{let p=Date.now();try{await Promise.all([this.page.addScriptTag({content:`${tT.htmlUtilsLibJs}
|
|
4603
|
-
//# sourceURL=momentic-injected/browser-scripts.js`}),this.page.addScriptTag({content:AT(i,this.userBrowserSettings.disableFullStory)})])}catch(m){if(m instanceof Error&&m.message.includes("Content Security Policy"))this.logger.warn({err:m},"Content Security Policy error from adding Momentic scripts, reloading page instead"),c=!0;else throw m}(o??{})["add-init-scripts"]=Date.now()-p};a.push(d())}if(!this.properties.systemDevicePixelRatio)if(process.env.MOMENTIC_LOCAL_DEV==="1"&&o6()==="darwin"&&ZJ("system_profiler SPDisplaysDataType").toString().includes("Retina"))v.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2;else{let d=async()=>{let p=Date.now();this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio),(o??{})["fetch-dpr"]=Date.now()-p};a.push(d())}let l=Date.now();await X(Promise.all(a),{milliseconds:this.pageLoadTimeout,message:"Timed out attaching Chrome permissions and initialization scripts",signal:this.abortSignal});let u=Date.now();(o??{})["ops-attach"]=u-l,c&&await this.page.reload(),this.cdpClient=await Sh.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),(o??{})["cdp-init"]=Date.now()-u,await this.initializeScreencast(),this.stateManager=new Eh({smartWaitingTimeoutMs:this.smartWaitingTimeout,pageLoadTimeoutMs:this.pageLoadTimeout,allowPartialAccessibilityTree:this.userControlledBrowserSettings.allowPartialAccessibilityTree??!1,logger:this.logger,cdpClient:this.cdpClient,pageGetter:()=>this.page,abortSignalGetter:()=>this.abortSignal,enricher:this.enricher,iconKnowledgeBase:this.iconKnowledgeBase,userBrowserSettings:this.userBrowserSettings,allowedA11yIgnoreReasonsOverride:this.properties.allowedA11yIgnoreReasonsOverride}),this.contextInitialized=!0}async fixViewportForNewHeadless(){this.properties.isNewHeadless&&this.viewport&&await this.cdpClient.send({method:"Emulation.setDeviceMetricsOverride",params:{width:this.viewport.width,height:this.viewport.height,deviceScaleFactor:0,mobile:this.viewport.width<1e3}})}async initializeScreencast(){await this.fixViewportForNewHeadless(),this.clientCallbacks?.onScreencastFrame&&this.viewport&&(await this.cdpClient.send({method:"Page.startScreencast",params:{format:"jpeg",quality:75,maxWidth:this.viewport.width,maxHeight:this.viewport.height}}),this.cdpClient.on("Page.screencastFrame",e=>{let r=e.sessionId,n=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=n,this.clientCallbacks?.onScreencastFrame?.(n,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:r}})}catch{}})()})}))}static async init(e){let r=await lD(e),n=new t(r);return await n.initialize({grantPermissions:!0,permissionsToGrant:e.userBrowserSettings.grantedPermissions,runInitScripts:!1}),n}static async fromExistingContext({context:e,storage:r,enricher:n,userBrowserSettings:o,properties:i,logger:a,timingRecorder:s}){let c=e.pages()[0];if(!c)throw new Error("No page found in existing context");let l=c.viewportSize();if(!l){let p=Date.now();l=await c.evaluate(()=>({width:window.innerWidth,height:window.innerHeight})),s["eval-viewport"]=Date.now()-p}let u=c?.url(),d=new t({browser:e.browser(),context:e,page:c,baseUrl:u,logger:a,storage:r,enricher:n,userBrowserSettings:o,viewport:l,properties:i,clientCallbacks:void 0,iconKnowledgeBase:null});return await d.initialize({grantPermissions:!1,runInitScripts:!0,timingRecorder:s}),d}async handleAvailableTabsChangeHelper(){try{let e=await PT(this.context,{getTitles:!0}),r=this.page.url();this.clientCallbacks?.onTabsChange?.(e,r)}catch(e){this.logger.error({err:e},"Error sending available tabs to frontend")}}handleAvailableTabsChange(){try{clearTimeout(this.lastTabChangeEventTimeout),this.lastTabChangeEventTimeout=setTimeout(()=>this.handleAvailableTabsChangeHelper(),500)}catch(e){this.logger.warn({err:e},"Error handling available tabs change")}}addToPageLoadPromises(e,r){let n=Th(),o=`${e}-${n}`,i=Date.now(),a=!1,s=new AbortController;this.pageLoadAbortControllers.add(s);let c=async()=>{try{await X(r(),{signal:s.signal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(l){l.name!=="AbortError"&&!this.closed&&this.logger.error({err:l,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],this.pageLoadAbortControllers.delete(s),a=!0}};this.pageLoadPromises[o]=c().catch(()=>{}),a&&delete this.pageLoadPromises[o]}handlePageClosedEvent(e){if(this.page!==e){this.logger.debug({url:e.url()},"Detected background page was closed, just updating available tabs only"),this.handleAvailableTabsChange();return}let r=async()=>{if(this.closed)return;this.logger.info({url:e.url()},"Detected active page was closed, switching to another tab");let n=this.context.pages();for(let o=n.length-1;o>=0;o--){let i=n[o];if(!(!i||i.isClosed()||!is(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:String(o)});break}}};this.addToPageLoadPromises("page closed handler",async()=>r())}handleNewPageEvent(e){let r=e.url();this.logger.info({url:r},"Detected new page event, registering handlers and waiting for load to complete");try{this.handleNewPageEventHelper(e)}catch(n){this.logger.warn({err:n},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let r=Th(),n="new-page-load-handler";e.on("close",a=>this.handlePageClosedEvent(a)),e.on("framenavigated",a=>this.handleFrameNavigationEvent(a)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableConsoleLogs&&e.on("console",a=>{$N(e,o,this.debugData,a,this.logger)});let i=async()=>{!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableNetworkLogs&&(KN(this.logger,r,this.clientCallbacks?.onNetworkPage,e),!this.harBatcher&&this.clientCallbacks?.onNetworkLogs&&(this.harBatcher=t0(this.clientCallbacks.onNetworkLogs)),await e.route("**/*",async(a,s)=>{await fT({pageId:r,route:a,request:s,onHarEntry:(c,l)=>{this.harBatcher?.fetch({[c]:l}).catch(()=>{})},logger:this.logger,requestRecorders:this.requestRecorders,mocks:this.mocks,isBrowserClosed:()=>this.closed})}),await e.route("**/*",eD(this.customHeaders,this.logger))),Mn&&await e.route("**/*",Ed),await this.loadFrameAndRecordUrl({root:e,codePath:n}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(n,async()=>i())}async handleCollectSvgs(e){}handleFrameNavigationEvent(e){let r=e.url(),n=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${r.slice(0,50)} (${n})`;if(!r||r==="about:blank"||!is(r))return;let i=this.recentFrameNavigations[o];if(i&&Date.now()-i<1e3)return;this.recentFrameNavigations[o]=Date.now();let a=async()=>{try{if(e.isDetached())return;await this.loadFrameAndRecordUrl({root:e,codePath:o}),this.handleAvailableTabsChange(),!e.parentFrame()&&!e.isDetached()&&this.clientCallbacks?.onSvgsCollected&&(setTimeout(()=>{(async()=>{try{await this.handleCollectSvgs(e)}catch(c){this.logger.warn({err:c},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(s){s.name!=="AbortError"&&this.logger.warn({err:s,url:r,codePath:o},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>a())}async injectKnowledgeBaseIntoBrowser(e){try{if(!this.iconKnowledgeBase||await e.evaluate(()=>!!window._MOMENTIC_ICON_KNOWLEDGE_BASE))return;let n={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(n[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},n)}catch(r){this.logger.warn({err:r},"Failed to inject icon knowledge base into browser, continuing...")}}getBrowserCallbacks(){return{waitForPageLoad:()=>this.waitForPageLoad(),waitForUrl:e=>this.waitForUrl(e),getBrowserState:e=>this.getBrowserState(e),waitForStability:e=>this.waitForStability(e),state:{url:()=>this.url(),getDomGraph:()=>this.stateManager.domGraph,getOpenPages:()=>this.getOpenPages(),getRoot:()=>this.getActivePageOrFrame(),userBrowserSettings:this.userBrowserSettings},pageLoadTimeoutMs:this.pageLoadTimeout,signal:this.abortSignal}}ping(){if(this.closed)throw new Error("Page has been closed")}setActiveFrameConfig(e){this.stateManager.setActiveFrameConfig(e)}async reset(e){this.abortSignal=void 0,this.debugData.logsPerPage=[],this.pageLoadPromises={},await this.clearAuthState({closeNonActiveTabs:!0}),await this.stopScreencast(),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await X(xT(this.getBrowserCallbacks()),{milliseconds:Ke})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0,this.cleanedUp=!0;try{this.pageLoadAbortListenerCleanup?.(),this.pageLoadAbortListenerCleanup=void 0,this.pageLoadAbortControllers.forEach(e=>e.abort()),this.pageLoadAbortControllers.clear(),this.originsVisited.clear(),await this.context.close(),await this.browser?.close(),this.browser=null}catch(e){this.logger.warn({err:e},"Error cleaning up browser, continuing...")}finally{this.browser=null}}get closed(){return this.cleanedUp||this.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,r,n){let o=Date.now(),i=0,a=0;for(;Date.now()-o<rc;){a++,n?.throwIfAborted();try{if(await Yt({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:Ke,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),root:e,codePath:"ensuring Momentic system scripts are loaded"}))return}catch(s){if(i++,i>=3){r.warn({err:s},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await Se(lr),a%2===0&&r.warn("Still waiting for momentic browser scripts to load...")}throw new Error(`Failed to load momentic browser scripts on page ${e.url()}`)}async html(){let e=await this.getActivePageOrFrame();return await this.ensureMomenticBrowserScriptsLoaded(e,this.logger),Yt({root:e,fn:()=>{let r=window;if(!r?.getFullHtmlTree)throw new Error("Missing Momentic HTML library when fetching page HTML");return r.getFullHtmlTree()},arg:void 0,timeout:ie,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the full HTML tree"})}url(){return this.page.url()}async stabilizePageForScreenshot(){try{await this.evaluateFunctionInPage(()=>{let e=window,r=[],n=new Map;document.querySelectorAll("input,textarea,[contenteditable]").forEach(o=>{n.set(o,{value:o.style.getPropertyValue("caret-color"),priority:o.style.getPropertyPriority("caret-color")}),o.style.setProperty("caret-color","transparent","important")}),r.push(()=>{for(let[o,i]of n)o.style.setProperty("caret-color",i.value,i.priority)}),e._MOMENTIC_SCREENSHOT_CLEANUP=()=>{for(let o of r)o();delete e._MOMENTIC_SCREENSHOT_CLEANUP}},void 0,"stabilizing page for screenshot")}catch(e){(!(e instanceof Error)||!e.message.includes("Execution context was destroyed"))&&this.logger.warn({err:e},"Failed to stabilize page before screenshot, continuing...")}}async removeScreenshotStabilization(){try{await this.evaluateFunctionInPage(()=>{window._MOMENTIC_SCREENSHOT_CLEANUP?.()},void 0,"removing screenshot stabilization")}catch{}}async screenshot(e){let{retries:r=1,stabilizeBeforeScreenshot:n=!1}=e,o=this.page.url();n&&await this.stabilizePageForScreenshot();let i=Date.now();try{await this.fixViewportForNewHeadless();let a=await this.screenshotHelper({...e,retries:r});if(a.byteLength>5e6)this.logger.warn("Page screenshot is greater than 5MB, which may cause performance issues with some AI models");else if(a.length===0)throw new Error("Got empty screenshot");return a}catch(a){if(r<=0||a.message.includes("has been closed"))throw a;return this.logger.warn({err:a,pageUrl:o},"Failed taking screenshot, retrying..."),await Se(na),this.screenshot({...e,retries:r-1})}finally{Date.now()-i>1e3&&this.logger.warn({pageUrl:o,duration:Date.now()-i},"Screenshot took longer than expected"),n&&await this.removeScreenshotStabilization()}}async screenshotHelper({locator:e,quality:r,saveToDiskPath:n,timeout:o,respectActiveFrame:i,clearHighlights:a=!1}){a&&await this.clearHighlights(),i&&this.stateManager.frameConfig&&(e=await(await this.getActivePageOrFrame()).frameElement());let s=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:r,optimizeForSpeed:!0},timeout:o??rt}),c=Buffer.from(s.data,"base64"),l=await o0.fromBuffer(c),{width:u,height:d}=this.getViewport()??{};if(u&&d&&(l.bitmap.width!==u||l.bitmap.height!==d)&&(c=await l.resize({w:u,h:d}).getBuffer("image/jpeg")),n&&t6(n,c),this.lastScreenshotForRecording=c,!e)return c;let p=await e.boundingBox({timeout:ie});if(!p)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:m,y:g,width:h,height:f}=p;if(!h||!f)throw new Error("Attempted to screenshot an element with zero width or height");m=Math.floor(m),g=Math.floor(g),h=Math.floor(h),f=Math.floor(f);try{let S=await o0.fromBuffer(c),b=S.bitmap.width,y=S.bitmap.height;m=Math.max(0,Math.min(m,b-1)),g=Math.max(0,Math.min(g,y-1)),h=Math.max(1,Math.min(h,b-m)),f=Math.max(1,Math.min(f,y-g)),c=await S.crop({x:m,y:g,w:h,h:f}).getBuffer("image/jpeg")}catch(S){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${g}) with size (${h}, ${f}): ${S}`)}finally{"dispose"in e&&await e?.dispose()}return c}getViewport(){if(this.viewport)return this.viewport;let e=this.page.viewportSize();return e||null}async navigate({url:e,initialNavigation:r=!1,loadTimeoutMs:n=this.pageLoadTimeout}){YO(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();r||(await this.waitForPageLoad(),await this.waitForStability());let i=!1,a;for(let c=0;c<3;c++)try{await this.page.goto(e,{timeout:n,waitUntil:"domcontentloaded"}),i=!0;break}catch(l){if(a=l,this.abortSignal?.throwIfAborted(),this.logger.warn({err:l},`Error occurred during navigation${c===0?", retrying...":" (fatal)"}`),await Se(lr),a.message.includes("Timeout")&&a.message.includes("exceeded")||a.message.includes("net::ERR_CONNECTION_REFUSED"))break;await this.cdpClient.send({method:"Page.stopLoading",params:{},timeout:Ke})}if(!i)throw new M("UserInfrastructureError",a?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step-wait-for-load"}),this.logger.info({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let s=this.url();if(DN.has(s))throw new M("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);await this.fixViewportForNewHeadless()}async type(e,r={},n=!1){await this.directTypeHelper(e,r,n)}async getActiveElementHandle(e){return e.evaluateHandle(()=>document.activeElement)}async getActiveElement(e){try{return await Yt({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]");let o=!1,i=window.getSelection();i&&!i.isCollapsed&&i.toString().trim().length>0&&(o=!0);let a=document.activeElement;return a&&"selectionStart"in a&&typeof a.selectionStart=="number"&&typeof a.selectionEnd=="number"&&a.selectionStart!==a.selectionEnd&&(o=!0),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n,hasTextSelected:o}:{hasTextSelected:o}},arg:void 0,timeout:Ke,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the active element"})}catch(r){this.logger.warn({err:r},"Failed to get active element");return}}async directTypeHelper(e,r={},n=!1){let o=await this.getActivePageOrFrame();await bD({root:o,text:e,options:r,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(n){let s=Date.now();for(;Date.now()-s<this.smartWaitingTimeout&&(!i||i.tag==="body");)await Se(na),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}let a=i?.tag==="input"||i?.tag==="textarea";if(r.clearContent)if(a||r.forceClearContent)if(this.properties.isAndroid&&!a&&i?.textContent){this.logger.info("Clearing content using backspaces");let s=0,c=i.textContent?.length;for(;c&&s<50;){s++;let l=[...Array(c)].map(()=>"Backspace").join("+");await this.page.keyboard.press(l),i=await this.getActiveElement(o),c=i?.textContent?.length}c&&this.logger.warn("Content still remains after clearing existing")}else this.properties.isAndroid?await this.page.keyboard.press("Control+A"):process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25);else this.logger.info({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...");await this.page.keyboard.type(e,{delay:r.delay??RA}),r.pressEnter&&await this.press("Enter",{}),await this.waitForStability()}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:rt})}catch(r){this.logger.warn({err:r},"Failed to scroll into view, trying with raw JS");try{await e.evaluate(async n=>{let o=n.scrollTop;n.scrollIntoView({block:"nearest"}),await new Promise(a=>setTimeout(a,250));let i=Date.now();for(;Date.now()-i<1e3;){let a=n.scrollTop;if(a===o)break;o=a,await new Promise(s=>setTimeout(s,250))}},void 0,{timeout:rt})}catch(n){this.logger.warn({err:n},"Failed to scroll into view using JS, continuing...")}}}async highlightA11yId(e){try{let{resolution:r}=await this.createTargetFromA11yId({id:e,description:null,targetSource:"AI",skipSaveToCache:!0});return await this.highlight(r.locator),!0}catch(r){return this.logger.debug({err:r,id:e},"Failed to highlight target"),!1}}async highlight(e){return hh({locator:e,callbacks:this.getBrowserCallbacks(),logger:this.logger})}recordUrlVisited(e){try{let r=new URL(e).origin;if(r==="null")return;this.originsVisited.add(r)}catch(r){this.logger.warn({err:r},"Failed to record origin visited")}}async waitForPageLoad(){let e=Date.now(),r=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises),o=-1,i=0;for(;r.length!==0;){if(Date.now()-e>this.pageLoadTimeout&&this.logger.warn({outstandingPromiseKeys:n,outstandingPromises:r},"Still waiting on page load promises"),Date.now()-o<20&&(i++,i>2)){this.logger.error({outstandingPromiseKeys:n,outstandingPromises:r},"Synchronous waiting loop detected, exiting page load wait");return}o=Date.now(),await Promise.allSettled(r),r=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises)}}async clearAuthState(e){await this.context.clearCookies();for(let o of this.originsVisited)this.logger.debug({origin:o},`Clearing data using CDP for origin ${o}`),await this.cdpClient.send({method:"Storage.clearDataForOrigin",params:{origin:o,storageTypes:"all"},timeout:Ke}),this.originsVisited.delete(o);let r=this.context.pages().indexOf(this.page),n=[...this.context.pages()];for(let o=0;o<n.length;o++){let i=n[o];if(i.isClosed())continue;let a=i.url();try{this.originsVisited.delete(new URL(a).origin)}catch{}await VN(i,this.logger),o!==r&&e.closeNonActiveTabs&&(this.logger.info(`Closing tab ${o} with URL ${a}`),await i.close())}}async loadAuthState(e){await this.waitForPageLoad(),await this.waitForStability(),!e||Object.keys(e).length===0?await this.clearAuthState({closeNonActiveTabs:!1}):await this.loadAuthStateHelper(e),await this.refresh(),await this.waitForStability()}async loadAuthStateHelper(e){let r=[];for(let c of e.cookies??[]){let l=await this.setCookie(c);r=r.concat(l)}this.logger.info(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:Ke});let n=0,o=[];for(let c of e.origins??[])for(let l of c.localStorage)try{await this.cdpClient.send({timeout:Ke,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(c.origin).origin,isLocalStorage:!0},key:l.name,value:l.value}}),n++}catch(u){o.some(d=>d.origin===c.origin&&d.key===l.name)||o.push({key:l.name,origin:c.origin,err:u});continue}o.length>0&&this.logger.warn({failedOrigins:o,currentPageUrl:this.page.url()},"Failed to set localStorage for entries, continuing..."),this.logger.info(`Loaded ${n} local storage entries`);let i={},a=0;for(let c of e.origins??[])if(c.sessionStorage&&c.sessionStorage.length>0){let l={};for(let u of c.sessionStorage)l[u.name]=u.value,a++;i[new URL(c.origin).origin]=l}a>0&&await this.context.addInitScript(({storageByOrigin:c,markerKey:l})=>{let u=window.location.origin,d=c[u];if(d&&!window.sessionStorage.getItem(l)){for(let[p,m]of Object.entries(d))window.sessionStorage.setItem(p,m);window.sessionStorage.setItem(l,"1")}},{storageByOrigin:i,markerKey:CT}),this.logger.info(`Loaded ${a} session storage entries`);let s=e.idb;s&&Object.keys(s).length>0&&(await GN(this.page,s,this.logger),this.logger.info(`Loaded ${Object.keys(s??{}).length} indexedDB databases`))}async saveAuthState(){let r=0,n=null;for(;r<=2;)try{await this.waitForPageLoad(),await this.waitForStability();let o=await this.context.storageState();return o.idb=await jN(this.page,this.logger),await pD(this.page,o,this.logger),o}catch(o){if(n=o,r++,r<=2){this.logger.warn({err:o,retryCount:r,maxRetries:2},`Error saving auth state, retrying (${r}/2)...`);let i=Math.pow(2,r)*100;await new Promise(a=>setTimeout(a,i))}}throw this.logger.error({err:n},"Failed to save auth state after 2 retries"),new M("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return PT(this.context,e)}saveA11yDetailsToCache(e,r){r.content=e.content,r.name=e.name,r.role=e.role,r.numChildren=e.children.length,delete r.serializedForm,delete r.nodeOnlySerializedForm}async updateCacheWithNewNodeDetails({node:e,target:r,locator:n,originalElementLocationResult:o,allowNotActionableNodesOverride:i,logger:a=this.logger,skipSavingVisualAttributes:s=!1}){if(e&&this.saveA11yDetailsToCache(e,r),r.frameCache=this.stateManager.saveAutoFrameCacheDetails(r.frameCache),n)try{let c=await this.fetchHtmlAttributes({locator:n,logger:a,originalElementLocationResult:o,allowNotActionableNodesOverride:i});c?(r.generatedSelectors=c.generatedSelectors,r.serializedHtml=c.serializedHtml,r.nodeOnlySerializedHtml=c.nodeOnlySerializedHtml,r.hybridSelector=c.hybridSelector):a.warn("Got undefined HTML attributes when trying to update cache")}catch(c){if(c instanceof Ks)throw a.warn({err:c},"Error while fetching HTML attributes triggering retry"),c;a.warn({err:c},"Failed to fetch HTML attributes for target, continuing...")}try{s||await this.saveElementVisualAttributes({target:r,locator:n,logger:a})}catch(c){a.debug({err:c},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes({target:e,locator:r,logger:n}){if(!r||!oT.includes(e?.role??""))return;let o=await r.boundingBox({timeout:Ke});if(!o||!o.width||!o.height){n.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0;return}let i=this.getViewport();if(o.x<0||o.y<0||!i||o.x+o.width>i.width||o.y+o.height>i.height)return;let{x:a=0,y:s=0,width:c=0,height:l=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-c)<1&&Math.abs(e.boundingBox.height-l)<1&&Math.abs((e.boundingBox.x??0)-a)<1&&Math.abs((e.boundingBox.y??0)-s)<1)return;e.boundingBox=o;let u=await this.screenshot({locator:r,quality:75,retries:0}),d=Th(),p="image/jpeg";(async()=>{try{await this.storage.createOnDemandScreenshot(d,u,p)}catch(m){this.logger.warn({err:m,screenshotId:d},"Failed to persist on-demand screenshot")}})(),e.screenshotUrl={id:d,contentType:"image/jpeg"}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async getElementRequiredValues({logger:e,boundingBox:r,locator:n,requirements:o}){let i={},a=!!o?.position&&o.position!=="irrelevant",s=!!o?.shape&&o.shape!=="irrelevant";if(a||s){if(!r||!r.width||!r.height)throw new M("ActionFailureError","Element does not have a bounding box as required");s&&(i.shape={width:r.width,height:r.height,tolerance:o.shape}),a&&(i.position={x1:r.x,y1:r.y,x2:r.x+r.width,y2:r.y+r.height,tolerance:o.position})}if(o?.text){let c=await n.textContent({timeout:ie});i.text=c?.trim().slice(0,mn.serializedElementForCachingTruncateLength)}if(o?.attributes&&o.attributes.length>0){let c={};for(let l of o.attributes){let u=l.trim().toLowerCase();if(!(!u||mn.bannedAiRequiredCacheAttributes.includes(u)))try{let d=await n.getAttribute(u,{timeout:ie});d!==null&&(c[l]=d)}catch(d){e.warn({err:d,attr:l},"Failed to fetch required attribute, continuing...")}}i.attributes=c}return i}async getAdditionalDetailsForElement({mainLocator:e,mainBoundingBox:r,additionalElement:n,root:o,logger:i}){let a=this.stateManager.a11yIdToNodeMap[n.id];if(!a)return;let s=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:o,node:a});if(e.contentFrame!==s.contentFrame)return;let c=await this.fetchHtmlAttributes({locator:s,logger:i});if(!c?.generatedSelectors||c.generatedSelectors.length===0)return;let l=await s.boundingBox({timeout:ie}),u={selectors:c.generatedSelectors,relativeAngleRadians:mD(r,l),relativeDistance:gD(r,l)};return n.requirements&&(u.requirements=await this.getElementRequiredValues({logger:i,locator:s,boundingBox:l,requirements:n.requirements})),u}async getAllAdditionalElementsDetails({mainElementId:e,mainLocator:r,mainBoundingBox:n,additionalElements:o,root:i,logger:a}){let s=new Set,c=[];for(let d of o)d.id!==e&&(s.has(d.id)||(s.add(d.id),c.push(d)));let l=await Promise.allSettled(c.map(d=>this.getAdditionalDetailsForElement({mainLocator:r,mainBoundingBox:n,additionalElement:d,root:i,logger:a}))),u=[];for(let[d,p]of l.entries()){let m=c[d];if(m){if(p.status==="fulfilled"){let g=p.value;if(!g)continue;u.push(g);continue}this.logger.warn({err:p.reason,additionalElement:m},"Failed to fetch additional element details, continuing...")}}return u}async updateCacheWithAdditionalRequirements({mainElementId:e,requirements:r,additionalElements:n,target:o,locator:i,root:a,logger:s}){let c=await i.boundingBox({timeout:ie});if(r)try{o.requirements=await this.getElementRequiredValues({logger:s,boundingBox:c,locator:i,requirements:r})}catch(l){s.warn({err:l},"Failed to generate required values for target")}n&&n.length>0&&(o.additionalElements=await this.getAllAdditionalElementsDetails({mainElementId:e,mainBoundingBox:c,mainLocator:i,additionalElements:n,root:a,logger:s}))}async createTargetFromA11yId({id:e,description:r,targetSource:n,skipSaveToCache:o,skipSavingVisualAttributes:i,logger:a=this.logger,requirements:s,additionalElements:c}){if(e<0)throw new M("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let l=this.stateManager.a11yIdToNodeMap[e];if(!l)throw new M("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let u=this.stateManager.frameConfig,d,p,m,g;if(this.userBrowserSettings.autoExpandIframes&&!u&&l.parentFrame){let T=l.parentFrame,{cache:w,config:P}=await this.stateManager.getAutoFrameDetailsFromHandle(T);p=w,m=P,d=P.frame,g="auto iframe"}else l.parentFrame&&u?(m=u,d=await this.getActivePageOrFrame(),g="hardcoded url already on the state manager"):(d=await this.getActivePageOrFrame(),g="should not be possible");let h=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:d,node:l}),f=await h.evaluate(T=>window.generateCommonLocationResultMetadata(T),void 0,{timeout:rt}),S={id:e,inputDescription:r??void 0,targetSource:n,targetUpdateTime:new Date().toISOString(),targetUpdateLoggerTags:et(a),frameCache:p},b,y=!1;o||(m&&(a.info({frameConfigSource:g,frameConfig:JD(m)},"A11y node was resolved to a target within an iframe"),b=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(m),y=!0),await this.updateCacheWithAdditionalRequirements({mainElementId:e,requirements:s,additionalElements:c,target:S,root:d,locator:h,logger:a}),await this.updateCacheWithNewNodeDetails({node:l,target:S,locator:h,logger:a,allowNotActionableNodesOverride:!0,skipSavingVisualAttributes:i,originalElementLocationResult:f}));try{return{resolution:{locator:h,a11yNode:l,displayString:l.getNodeOnlySerializedForm(),originalElementLocationResult:f,decisions:[]},target:S,frameConfig:m,frameConfigSource:g}}finally{y&&this.stateManager.setActiveFrameConfig(b)}}async resolveTarget(e,r,n={}){let{logger:o=this.logger,signal:i=this.abortSignal,allowNotActionableNodesOverride:a,skipWaitForPageLoad:s}=n;if(r.frameCache&&this.userBrowserSettings.autoExpandIframes){let p,m=!1,g=Date.now();for(;Date.now()-g<this.smartWaitingTimeout;)try{let h=await this.stateManager.resolveAutoFrameCache(r.frameCache);this.setActiveFrameConfig(h),m=!0;break}catch(h){p=h,await Se(lr,i)}if(!m)throw p}let c=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(c,o,i);let l=Date.now(),u=0,d;for(;Date.now()-l<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),u++;let p=u===2||Date.now()-l>this.smartWaitingTimeout-2e3&&u%2===0;try{d=await this.resolveTargetHelper({root:c,target:r,primaryOnly:!0,shouldLogOnFailure:p,logger:o,allowNotActionableNodesOverride:a,signal:i,skipWaitForPageLoad:s});break}catch(m){if(m instanceof jc)break;i?.throwIfAborted(),p&&o.warn({err:m},`Could not resolve target using primary cache only (x${u})`),await Se(lr,i)}}return d||(d=await this.resolveTargetHelper({root:c,target:r,primaryOnly:!1,logger:o,signal:i,allowNotActionableNodesOverride:a}),o.info({decisions:d.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",elementLocationDecisions:d?.decisions??[],pageState:void 0,targetSource:r.targetSource,targetUpdateTime:r.targetUpdateTime}),d}async resolveTargetHelper({root:e,target:r,primaryOnly:n,logger:o,signal:i,allowNotActionableNodesOverride:a,shouldLogOnFailure:s,skipWaitForPageLoad:c,skipSavingVisualAttributes:l}){let u=[],d;await this.getBrowserState({logger:o,abortSignal:i,skipWait:!this.userBrowserSettings.visualActions,skipWaitForPageLoad:c,allowNotActionableNodesOverride:a});let p;if(r.generatedSelectors||r.hybridSelector){let m;try{m=await this.resolveTargetWithPrimaryMethods({root:e,target:r,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s,skipSavingVisualAttributes:l})}catch(g){p=g,g instanceof vn&&(u.push(...g.decisions),d=g.cacheMissReason)}if(m)return{...m,decisions:[...u,...m.decisions]};n||(u.push({type:"CSS_SELECTOR",matched:!1,reason:p?.message,selectors:vd(r.generatedSelectors??[])}),r.generatedSelectors=void 0,r.hybridSelector=void 0)}if(n)throw p;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let m=await this.resolveTargetWithSecondaryMethods({root:e,target:r,decisions:u,logger:o,signal:i,allowNotActionableNodesOverride:a,skipSavingVisualAttributes:l});if(m)return r.targetSource="HEURISTIC_HEALED",r.targetUpdateTime=new Date().toISOString(),r.targetUpdateLoggerTags=et(o),m;d=d??"secondary-resolution-failed"}throw new vn("Could not find any relevant node given target",u,d)}async resolveTargetWithPrimaryMethods({root:e,target:r,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i,skipSavingVisualAttributes:a}){if(!r.nodeOnlySerializedHtml)throw new jc("Insufficient data to resolve target using primary methods (missing node HTML)");let s={x:0,y:0};if(dD(e)){let L=await(await e.frameElement()).boundingBox();L&&(s=L)}let c=i?n:Eo,l=this.userControlledBrowserSettings.hybridSelectorMode,u=r.boundingBox,d=!!u?.width&&!!u?.height,p=!o&&d,m=this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange&&d?u:void 0,g={ldistThreshold:NN,requireBoundingBox:p,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:m,requirements:r.requirements,additionalElements:r.additionalElements,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles},rootBoundingBox:s},h={cssParams:{selectors:r.generatedSelectors??[],cachedElementSerialized:r.nodeOnlySerializedHtml,opts:g},hybridParams:l&&r.hybridSelector?{nodes:r.hybridSelector,cachedElementSerialized:r.nodeOnlySerializedHtml,opts:g}:void 0},{css:f,hybrid:S}=await Yt({fn:L=>window.evaluatePrimaryCaches(L),arg:h,root:e,timeout:ie,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),b,y,T=[];if(l==="prefer"&&S?.result){b=S.result;let L={type:"HYBRID_SELECTOR",matched:!0,logs:S.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};T.push(L),y="HYBRID_SELECTOR"}else if(f?.result){b=f.result;let L=`${b.workingSelectors.length} CSS selectors matched the following element: ${b.serializedElement}`,N=b.workingSelectors.slice(0,5);T.push({type:"CSS_SELECTOR",matched:!0,logs:f.logs,reason:L,selectors:N}),n.debug({reason:L,workingSelectors:N},"Resolved with CSS selectors"),y="CSS_SELECTOR"}else throw T.push({type:"CSS_SELECTOR",matched:!1,reason:f.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:f.logs}),S&&T.push({type:"HYBRID_SELECTOR",matched:!1,reason:S.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:S.logs}),f?.error&&n.error({err:new Error(f.error)},"Cache evaluation errored unexpectedly (CSS)"),S?.error&&n.error({err:new Error(S.error)},"Cache evaluation errored unexpectedly (Hybrid)"),new vn("Cache evaluation failed",T,f.cacheMissReason);let w,P,A;if(this.userBrowserSettings.visualActions){let L=b.mPath;if(!L)throw new Error("Found element did not have an mPath despite using visual actions");let N=L.join(" > ");w=e.locator(N),P=this.stateManager.getNodeUsingMPathSelector(N)}else if(b.dataMomenticId!==void 0)A=parseInt(b.dataMomenticId),P=this.stateManager.dataMomenticIdToNodeMap[A],"workingSelectors"in b?w=e.locator(b.workingSelectors[0]):w=e.locator(ui(A));else throw new M("InternalWebAgentError","Received an element resolution result with no identifying attributes");l&&r.hybridSelector&&(S?.logs.length===1?c.warn({hybridResult:S,cssResult:f,hybridMode:l},"Hybrid selector resolution rejected, continuing..."):S?.result?f?.result&&S?.result&&S.result.serializedElement!==f.result.serializedElement&&(this.userBrowserSettings.visualActions&&JSON.stringify(f.result.mPath)!==JSON.stringify(S.result.mPath)?n.warn({originalCache:r,hybridResult:S,cssResult:f,hybridMode:l,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):f.result.dataMomenticId!==S.result.dataMomenticId&&n.warn({originalCache:r,hybridResult:S,cssResult:f,hybridMode:l,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):c.warn({originalCache:r,hybridResult:S,cssResult:f,hybridMode:l},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing..."));let x=vd(r);await this.updateCacheWithNewNodeDetails({node:P,target:r,locator:w,logger:n,originalElementLocationResult:b,allowNotActionableNodesOverride:o,skipSavingVisualAttributes:a});let O=HT(x,r);return O&&Object.keys(O).length>0&&(r.cacheResolutionUpdateTime=new Date().toISOString(),r.cacheResolutionUpdateLoggerTags=et(n),r.cacheResolutionUpdateSource=y),{a11yNode:P,displayString:b.serializedElement,locator:w,decisions:T,originalElementLocationResult:b,revalidator:async()=>{await wT({initialLocationResult:b,cacheEvaluationParams:h,locator:w,logger:n})}}}async resolveHardcodedCssSelector(e){let{ctx:r,selector:n,signal:o=this.abortSignal,timeoutMs:i=this.smartWaitingTimeout}=e,a=await this.getActivePageOrFrame(),s=Date.now(),c=0,l,u=[];for(;Date.now()-s<i;){o?.throwIfAborted(),c++;let d=a.locator(n),p;try{await d.waitFor({state:"attached",timeout:Ke});let m=await d.evaluate(g=>window.generateCommonLocationResultMetadata?.(g),void 0,{timeout:rt});return p=m?.serializedElement??"unknown element",u.push({type:"USER_SELECTOR",matched:!0,reason:`The user-provided CSS selector ${n} matched an element on the page.`}),r?.details?.push({type:"TARGETING",elementLocationDecisions:u,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toISOString()}),{locator:d,originalElementLocationResult:m,displayString:p,decisions:u}}catch(m){let g=m.message;l=new M("ActionFailureError",`CSS selector '${n}' failed to resolve after ${c} attempts: ${g.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":g}`),await Se(lr,o)}}throw l}async resolveTargetWithSecondaryMethods(e){if(!e.target.boundingBox)return;let{x:r,y:n,width:o,height:i}=e.target.boundingBox,a=await this.resolveTargetWithSecondaryMethodsHelper(e);if(!a)return;let s=await a.locator.boundingBox({timeout:ie});if(!s){this.logger.debug({proposedNode:a.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:c,y:l,width:u,height:d}=s;if(Math.abs(u-o)>10||Math.abs(d-i)>10){this.logger.debug({newW:u,oldW:o,newH:d,oldH:i,proposedNode:a.displayString},"Rejecting secondary matching result due to difference in dimensions");return}else if(!r||!n||!c||!l){this.logger.debug({oldX:r,oldY:n,newX:c,newY:l,proposedNode:a.displayString},"Rejecting secondary matching result due to missing x/y coords");return}else if(Math.abs(c-r)>100||Math.abs(l-n)>100){this.logger.debug({newX:c,newY:l,oldX:r,oldY:n,proposedNode:a.displayString},"Rejecting secondary matching result due to large difference in x/y coords");return}return a}async resolveTargetWithSecondaryMethodsHelper({root:e,target:r,decisions:n,logger:o,signal:i,allowNotActionableNodesOverride:a,skipSavingVisualAttributes:s}){if(r.nodeOnlySerializedHtml&&r.nodeOnlySerializedHtml.trim().length<LN){let u="Refusing to attempt HTML comparison since the saved element is too short.";n.push({type:"HTML_DISTANCE",matched:!1,reason:u})}else if(r.nodeOnlySerializedHtml&&r.nodeOnlySerializedHtml.length>50)try{let u=await Yt({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:r.nodeOnlySerializedHtml},timeout:rt,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"});if(!u)throw new Error(`Got invalid HTML evaluation result: ${JSON.stringify(u)}`);if("closestDistance"in u&&("dataMomenticId"in u&&u?.dataMomenticId||"mPath"in u&&u?.mPath)){let d=u.dataMomenticId?parseInt(u.dataMomenticId):void 0,p,m;if(d)p=this.stateManager.dataMomenticIdToNodeMap[d],m=e.locator(ui(d));else if(u.mPath){let S=u.mPath.join(" > ");p=this.stateManager.getNodeUsingMPathSelector(S),m=e.locator(S)}else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let g=u.serializedElement;o.warn({result:u,originalTarget:r,displayString:g},"Resolved cached target to new node with pure html levenshtein distance");let h=vd(r);await this.updateCacheWithNewNodeDetails({node:p,target:r,locator:m,logger:o,originalElementLocationResult:u,allowNotActionableNodesOverride:a,skipSavingVisualAttributes:s});let f=HT(h,r);return f&&Object.keys(f).length>0&&(r.cacheResolutionUpdateTime=new Date().toISOString(),r.cacheResolutionUpdateLoggerTags=et(o),r.cacheResolutionUpdateSource="HTML_DISTANCE",o.info({diffs:f,result:u},"Updated cache after l-dist resolution")),n.push({type:"HTML_DISTANCE",matched:!0,reason:"Found an element on the page with the same string representation as the saved element.",logs:u.logs,distance:u.closestDistance,closestElement:g,savedElement:r.nodeOnlySerializedHtml}),{locator:m,a11yNode:p,displayString:g,decisions:n,originalElementLocationResult:u,revalidator:async()=>{await wT({initialLocationResult:u,locator:m,logger:o})}}}else if("cacheMissReason"in u)throw new Error(u.error??u.cacheMissReason)}catch(u){o.info({err:u},"Failed to find closest HTML node using levenshtein distance"),n.push({type:"HTML_DISTANCE",matched:!1,reason:`Error finding closest HTML node by string distance: ${u}`})}let c=r.screenshotUrl,l=r.role??"";if(c&&oT.includes(l))try{let u=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:r,screenshot:c,signal:i,allowNotActionableNodesOverride:a});return{...u,decisions:[...n,...u.decisions]}}catch(u){i?.throwIfAborted(),n.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${u}`}),o.warn({err:u},"Did not find any close element using saved screenshot")}}async resolveTargetWithTemplateMatching({screenshot:e,oldTarget:r,signal:n,allowNotActionableNodesOverride:o}){let i;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let a=await this.screenshot({retries:0}),s;if(typeof e=="string"){let b=await fetch(e);s=Buffer.from(await b.arrayBuffer())}else({data:s}=await this.storage.fetchOnDemandScreenshot(e));let c=s6(),l=await this.enricher.runTemplateMatching({id:c,searchImageBase64String:s.toString("base64"),pageImageBase64String:a.toString("base64")},{signal:n}),{target:u,locator:d}=await this.getTargetFromPositionPercentages({percentX:l.x,percentY:l.y,allowNotActionableNodesOverride:o}),p=u.boundingBox?.width,m=u.boundingBox?.height;if(!p||!m)throw i="Rejecting target from screenshot due to no bounding box",new Error(i);let g=u.id,h=this.stateManager.a11yIdToNodeMap[g],f=vd(r);await this.updateCacheWithNewNodeDetails({target:r,node:h,locator:d,allowNotActionableNodesOverride:o});let S=HT(f,r);return S&&Object.keys(S).length>0&&(r.cacheResolutionUpdateTime=new Date().toISOString(),r.cacheResolutionUpdateLoggerTags=et(this.logger),r.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:c,diffs:S,templateMatch:l},"Updated cache after template matching resolution")),{locator:d,originalElementLocationResult:void 0,a11yNode:h,displayString:u.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot"}]}}async typeIntoTarget(e,r,n={}){await this.highlight(r.locator);let o;r.originalElementLocationResult?o=r.originalElementLocationResult.importantAttributes.type??"":o=await r.locator.getAttribute("type",{timeout:Ke})??"";let i=yD.some(a=>a===o.toLowerCase());return await _T({targetingResult:r,options:{force:n.force,relativePosition:n.relativePosition},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1}),await this.page.waitForTimeout(150),this.directTypeHelper(e,n)}async click(e,r,n={}){return _T({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:r,browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1})}async waitForUrl({beforeUrl:e,matcher:r},n){let o=n?.timeout??this.pageLoadTimeout,i=Date.now(),a=!1,s=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),s=this.url(),Pg(s,r,n)){a=!0;break}await Se(lr,this.abortSignal)}if(!a)throw new M("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${gg(r)} in ${o}ms.
|
|
4604
|
-
Current tab: ${s}`);try{await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"wait-for-url-step"})}catch(c){this.logger.warn({err:c},"Failed waiting for page load after URL change, continuing...")}}async dragAndDrop(e,r,n={}){let o=n.steps??5,i=Math.min(n.hoverDurationMs??500,rt);if(await this.highlight(e.locator),this.properties.isAndroid){await RD({page:this.page,fromLocator:e.locator,toLocator:r.locator,stepCount:o,dragDurationMs:n.dragDurationMs??1e3,hoverDurationMs:i}),await this.highlight(r.locator);return}await this.hover(e),await this.page.mouse.down();let a=await r.locator.boundingBox({timeout:ie});if(!a)throw new M("ActionFailureError","Could not get bounding box of target element");let s=a.x+a.width/2,c=a.y+a.height/2;await this.page.mouse.move(s,c,{steps:o}),await Se(i),await this.highlight(r.locator),await this.page.mouse.up()}async mouseDrag(e,r,n,o){o&&await this.hover({locator:o,originalElementLocationResult:void 0,serverSideBoundingBox:null}),await this.page.mouse.down();let i;if(o){let a=await o.boundingBox({timeout:ie});a&&(i={x:a.x+a.width/2,y:a.y+a.height/2})}i||(this.logger.warn("Could not get starting position from fromTarget, falling back to (0,0)"),i={x:0,y:0}),await this.page.mouse.move(i.x+e,i.y+r,{steps:n}),await Se(na),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await hs({func:async r=>{await this.scrollIntoViewIfNeeded(r.locator);let n=await r.locator.boundingBox({timeout:ie});if(!n)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(n.x+n.width/2,n.y+n.height/2,{steps:3})},action:"hovering over element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,targetingResult:e,callbacks:this.getBrowserCallbacks()})}async focus(e){await this.highlight(e.locator),await hs({func:r=>r.locator.focus({timeout:rt}),action:"focusing element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async blur(e){if(!e){let r=await this.getActivePageOrFrame();await Yt({fn:()=>{let n=document.activeElement;n&&n.nodeType===1&&n.blur()},root:r,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:Ke,codePath:"blurring the active element"});return}await this.highlight(e.locator),await hs({func:r=>r.locator.blur({timeout:rt}),action:"blurring element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async selectOption(e,r,n=!1){await this.highlight(e.locator),await hs({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{if(r.type==="INDEX"){let i=Number(r.index);if(isNaN(i))throw new M("UserConfigurationError",`Page index ${r.index} is not a number`)}await o.locator.selectOption({value:r.type==="VALUE"?r.value:void 0,label:r.type==="LABEL"?r.label:void 0,index:r.type==="INDEX"?Number(r.index):void 0},{force:n,timeout:ie})},targetingResult:e})}async press(e,r){let n=r.repeat??1;if(r.convertMeta){let o=fh(e,this.properties.isAndroid);o!==e&&(this.logger.info({key:e,convertedKey:o},"Converted platform dependent keys"),e=o)}for(let o=0;o<n;o++)await this.page.keyboard.press(e,{delay:r.delayMs??0});await this.waitForStability()}async keyDown(e,r){if(r.convertMeta){let n=fh(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of RT(e))await this.page.keyboard.down(n)}async keyUp(e,r){if(r.convertMeta){let n=fh(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of RT(e))await this.page.keyboard.up(n)}async refresh(e){let r=e?.loadTimeoutMs??this.pageLoadTimeout;await this.waitForPageLoad();let n=0,o=2;for(;n<o;){n++;try{await this.page.reload({waitUntil:"domcontentloaded",timeout:r});break}catch(i){this.logger.warn({err:i,attempt:n},`Failed to reload page${n<o?", retrying...":", continuing..."}`)}}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"reload-step"}),await this.waitForStability()}async getBrowserState(e){let{maxAttempts:r=2,logger:n=this.logger,skipWaitForPageLoad:o,allowNotActionableNodesOverride:i,shouldLogOnFailure:a}=e,s=e.abortSignal??this.abortSignal,c=!i,l=i?!0:this.userControlledBrowserSettings.showZeroOpacityElements,u=a?n:Eo;o||await this.waitForPageLoad(),e.skipWait||await this.waitForStability({logger:n,signal:s});let d=0,p;for(;d<r;){d++;try{return await X(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:s,logger:n,filterByViewport:e.filterByViewport,showZeroOpacityElements:l,flagNotActionableNodes:c,skipPageLoad:e.skipWaitForPageLoad}),{milliseconds:this.pageLoadTimeout*d,signal:s,message:"Getting browser state took too long"})}catch(m){if(s?.throwIfAborted(),p=m instanceof Error?m.message:`${m}`,d>=r)throw m;u.warn({err:m,url:this.url()},"Error getting a11y tree, retrying...")}}throw new M("ActionFailureError",`Getting page content failed after ${r} attempts. Error: ${p}`)}async getViewportOffsetDetails(e){let[r,n,o,i,a]=await Yt({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:ie,waitForPageLoad:async()=>{},codePath:"getting current viewport details"});return{upperBound:r,lowerBound:r+i,leftBound:n,rightBound:n+o,width:o,height:i,devicePixelRatio:this.properties.systemDevicePixelRatio??a}}async waitForStability(e){let{logger:r=this.logger,timeout:n=this.smartWaitingTimeout,signal:o}=e??{},i={value:Date.now()},a=p=>{i.value=Date.now()},s=()=>a("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",s);let c=()=>a("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",c);let l=()=>a("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",l);let u=()=>a("Page.navigatedWithinDocument");this.cdpClient.addListener("Page.navigatedWithinDocument",u);let d=()=>a("frameRequestedNavListener");this.cdpClient.addListener("Page.frameRequestedNavigation",d);try{await this.waitForStabilityHelper(i,r,n,o)}finally{this.cdpClient.removeListener("DOM.documentUpdated",s),this.cdpClient.removeListener("Page.frameDetached",c),this.cdpClient.removeListener("Page.frameStartedLoading",l),this.cdpClient.removeListener("Page.navigatedWithinDocument",u),this.cdpClient.removeListener("Page.frameRequestedNavigation",d)}}async waitForStabilityHelper(e,r,n,o=this.abortSignal){let i=!1,a=Date.now(),s,c={quality:25,retries:0,stabilizeBeforeScreenshot:!0},l=!1,u=0,d;for(;Date.now()-a<n;){o?.throwIfAborted();let p=Date.now();if(d!==void 0&&p-d<na&&await Se(na-(p-d),o),d=Date.now(),!(Date.now()-e.value<rT)){if(s)try{let m=await this.screenshot(c);if(fD(s,m)>1){s=m,l=!1;continue}l=!0}catch(m){u++,u%3===0&&r.warn({err:m,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}else try{s=await this.screenshot(c)}catch(m){u++,u%3===0&&r.warn({err:m,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}if(!(Date.now()-e.value<rT)){i=!0;break}}}i||r.warn({duration:Date.now()-a,stable:{a11y:i,screenshot:l}},"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,r){let{x:n,y:o}=e;this.logger.debug({x:n,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(n,o,{button:r.rightClick?"right":"left",clickCount:r.doubleClick?2:1})}async dragAndDropUsingVisualCoordinates(e,r,n){await CD(this.page,e,r,n)}async mouseDragUsingVisualCoordinates(e){let{fromTarget:r,...n}=e;await MT({...n,page:this.page,visualTarget:r,isAndroid:this.properties.isAndroid??!1})}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y,{steps:3})}async getElementLocation(e){let r=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:ie}),n=await X(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:rt});process.platform==="darwin"&&n===1&&(n=MN);let o=r.documents[0],i=o.layout,a=o.nodes,s=a.nodeName||[],c=a.backendNodeId||[],l=i.nodeIndex,u=i.bounds,d=-1;for(let b=0;b<s.length;b++)if(c[b]===e){d=l.indexOf(b);break}if(d===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[p=0,m=0,g=0,h=0]=u[d];p/=n,m/=n,g/=n,h/=n;let f=p+g/2,S=m+h/2;return{centerX:f,centerY:S}}async scrollVertical(e){return IT({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:0,directionX:null,deltaY:e?Math.abs(e):null,directionY:e&&e>0?"down":"up",signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async scrollHorizontal(e){return IT({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:e?Math.abs(e):null,directionX:e&&e>0?"right":"left",deltaY:0,directionY:null,signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async goForward(){await this.waitForPageLoad(),await this.page.goForward({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout}),await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-forward"})}async goBack(){await this.waitForPageLoad(),await this.page.goBack({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout}),await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-back"})}async reinitializeCDPClient(e){await this.cdpClient.reinitialize(e),await this.initializeScreencast()}async stopScreencast(){if(this.clientCallbacks?.onScreencastFrame)try{await this.cdpClient.send({method:"Page.stopScreencast",params:{}})}catch{}}async changeActivePage(e,r){if(await this.stopScreencast(),this.recordUrlVisited(e.url()),this.onVideoPageChange){let n=await e.video()?.path();if(n){let o=i0(n);this.onVideoPageChange({videoName:o})}}this.page=e,await this.reinitializeCDPClient(r??this.pageLoadTimeout)}async createNewTab(e,r){let n=await this.context.newPage();await this.changeActivePage(n,r?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...r}),this.handleAvailableTabsChange()}async switchToPage(e,r){let n=!0,o,i=Date.now();for(;n||r?.retry&&Date.now()-i<this.smartWaitingTimeout;){n=!1;try{await this.switchToPageHelper(e,r);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),o=a,await Se(lr)}}throw o}async switchToPageHelper(e,r){let n=this.context.pages().map((i,a)=>({page:i,url:i.url(),index:a})),o;if(e.type==="INDEX"){let i=Number(e.index);if(isNaN(i))throw new M("UserConfigurationError",`Page index ${e.index} is not a number`);if(i<0||i>=n.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(n.map(a=>a.url))}`);o=n[i]}else{let i=n.filter(a=>e.type==="SUBSTRING"?a.url.includes(e.substring):a.url.match(e.pattern));i.length>1&&this.logger.warn(`More than one page matches the page switch criteria: ${JSON.stringify(i.map(a=>a.url))}`),o=i[i.length-1]}if(!o)throw new Error(`Could not find matching page using criteria: ${JSON.stringify(e)}.
|
|
4603
|
+
//# sourceURL=momentic-injected/browser-scripts.js`}),this.page.addScriptTag({content:AT(i,this.userBrowserSettings.disableFullStory)})])}catch(m){if(m instanceof Error&&m.message.includes("Content Security Policy"))this.logger.warn({err:m},"Content Security Policy error from adding Momentic scripts, reloading page instead"),c=!0;else throw m}(o??{})["add-init-scripts"]=Date.now()-p};a.push(d())}if(!this.properties.systemDevicePixelRatio)if(process.env.MOMENTIC_LOCAL_DEV==="1"&&o6()==="darwin"&&ZJ("system_profiler SPDisplaysDataType").toString().includes("Retina"))v.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2;else{let d=async()=>{let p=Date.now();this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio),(o??{})["fetch-dpr"]=Date.now()-p};a.push(d())}let l=Date.now();await X(Promise.all(a),{milliseconds:this.pageLoadTimeout,message:"Timed out attaching Chrome permissions and initialization scripts",signal:this.abortSignal});let u=Date.now();(o??{})["ops-attach"]=u-l,c&&await this.page.reload(),this.cdpClient=await Sh.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),(o??{})["cdp-init"]=Date.now()-u,await this.initializeScreencast(),this.stateManager=new Eh({smartWaitingTimeoutMs:this.smartWaitingTimeout,pageLoadTimeoutMs:this.pageLoadTimeout,allowPartialAccessibilityTree:this.userControlledBrowserSettings.allowPartialAccessibilityTree??!1,logger:this.logger,cdpClient:this.cdpClient,pageGetter:()=>this.page,abortSignalGetter:()=>this.abortSignal,enricher:this.enricher,iconKnowledgeBase:this.iconKnowledgeBase,userBrowserSettings:this.userBrowserSettings,allowedA11yIgnoreReasonsOverride:this.properties.allowedA11yIgnoreReasonsOverride}),this.contextInitialized=!0}async fixViewportForNewHeadless(){this.properties.isNewHeadless&&this.viewport&&await this.cdpClient.send({method:"Emulation.setDeviceMetricsOverride",params:{width:this.viewport.width,height:this.viewport.height,deviceScaleFactor:0,mobile:this.viewport.width<1e3}})}async initializeScreencast(){await this.fixViewportForNewHeadless(),this.clientCallbacks?.onScreencastFrame&&this.viewport&&(await this.cdpClient.send({method:"Page.startScreencast",params:{format:"jpeg",quality:75,maxWidth:this.viewport.width,maxHeight:this.viewport.height}}),this.cdpClient.on("Page.screencastFrame",e=>{let r=e.sessionId,n=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=n,this.clientCallbacks?.onScreencastFrame?.(n,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:r}})}catch{}})()})}))}static async init(e){let r=await lD(e),n=new t(r);return await n.initialize({grantPermissions:!0,permissionsToGrant:e.userBrowserSettings.grantedPermissions,runInitScripts:!1}),n}static async fromExistingContext({context:e,storage:r,enricher:n,userBrowserSettings:o,properties:i,logger:a,timingRecorder:s}){let c=e.pages()[0];if(!c)throw new Error("No page found in existing context");let l=c.viewportSize();if(!l){let p=Date.now();l=await c.evaluate(()=>({width:window.innerWidth,height:window.innerHeight})),s["eval-viewport"]=Date.now()-p}let u=c?.url(),d=new t({browser:e.browser(),context:e,page:c,baseUrl:u,logger:a,storage:r,enricher:n,userBrowserSettings:o,viewport:l,properties:i,clientCallbacks:void 0,iconKnowledgeBase:null});return await d.initialize({grantPermissions:!1,runInitScripts:!0,timingRecorder:s}),d}async handleAvailableTabsChangeHelper(){try{let e=await PT(this.context,{getTitles:!0}),r=this.page.url();this.clientCallbacks?.onTabsChange?.(e,r)}catch(e){this.logger.error({err:e},"Error sending available tabs to frontend")}}handleAvailableTabsChange(){try{clearTimeout(this.lastTabChangeEventTimeout),this.lastTabChangeEventTimeout=setTimeout(()=>this.handleAvailableTabsChangeHelper(),500)}catch(e){this.logger.warn({err:e},"Error handling available tabs change")}}addToPageLoadPromises(e,r){let n=Th(),o=`${e}-${n}`,i=Date.now(),a=!1,s=new AbortController;this.pageLoadAbortControllers.add(s);let c=async()=>{try{await X(r(),{signal:s.signal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(l){l.name!=="AbortError"&&!this.closed&&this.logger.error({err:l,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],this.pageLoadAbortControllers.delete(s),a=!0}};this.pageLoadPromises[o]=c().catch(()=>{}),a&&delete this.pageLoadPromises[o]}handlePageClosedEvent(e){if(this.page!==e){this.logger.debug({url:e.url()},"Detected background page was closed, just updating available tabs only"),this.handleAvailableTabsChange();return}let r=async()=>{if(this.closed)return;this.logger.info({url:e.url()},"Detected active page was closed, switching to another tab");let n=this.context.pages();for(let o=n.length-1;o>=0;o--){let i=n[o];if(!(!i||i.isClosed()||!is(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:String(o)});break}}};this.addToPageLoadPromises("page closed handler",async()=>r())}handleNewPageEvent(e){let r=e.url();this.logger.info({url:r},"Detected new page event, registering handlers and waiting for load to complete");try{this.handleNewPageEventHelper(e)}catch(n){this.logger.warn({err:n},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let r=Th(),n="new-page-load-handler";e.on("close",a=>this.handlePageClosedEvent(a)),e.on("framenavigated",a=>this.handleFrameNavigationEvent(a)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableConsoleLogs&&e.on("console",a=>{$N(e,o,this.debugData,a,this.logger)});let i=async()=>{!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableNetworkLogs&&(KN(this.logger,r,this.clientCallbacks?.onNetworkPage,e),!this.harBatcher&&this.clientCallbacks?.onNetworkLogs&&(this.harBatcher=t0(this.clientCallbacks.onNetworkLogs)),await e.route("**/*",async(a,s)=>{await fT({pageId:r,route:a,request:s,onHarEntry:(c,l)=>{this.harBatcher?.fetch({[c]:l}).catch(()=>{})},logger:this.logger,requestRecorders:this.requestRecorders,mocks:this.mocks,isBrowserClosed:()=>this.closed})}),await e.route("**/*",eD(this.customHeaders,this.logger))),Mn&&await e.route("**/*",Ed),await this.loadFrameAndRecordUrl({root:e,codePath:n}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(n,async()=>i())}async handleCollectSvgs(e){}handleFrameNavigationEvent(e){let r=e.url(),n=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${r.slice(0,50)} (${n})`;if(!r||r==="about:blank"||!is(r))return;let i=this.recentFrameNavigations[o];if(i&&Date.now()-i<1e3)return;this.recentFrameNavigations[o]=Date.now();let a=async()=>{try{if(e.isDetached())return;await this.loadFrameAndRecordUrl({root:e,codePath:o}),this.handleAvailableTabsChange(),!e.parentFrame()&&!e.isDetached()&&this.clientCallbacks?.onSvgsCollected&&(setTimeout(()=>{(async()=>{try{await this.handleCollectSvgs(e)}catch(c){this.logger.warn({err:c},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(s){s.name!=="AbortError"&&this.logger.warn({err:s,url:r,codePath:o},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>a())}async injectKnowledgeBaseIntoBrowser(e){try{if(!this.iconKnowledgeBase||await e.evaluate(()=>!!window._MOMENTIC_ICON_KNOWLEDGE_BASE))return;let n={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(n[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},n)}catch(r){this.logger.warn({err:r},"Failed to inject icon knowledge base into browser, continuing...")}}getBrowserCallbacks(){return{waitForPageLoad:()=>this.waitForPageLoad(),waitForUrl:e=>this.waitForUrl(e),getBrowserState:e=>this.getBrowserState(e),waitForStability:e=>this.waitForStability(e),state:{url:()=>this.url(),getDomGraph:()=>this.stateManager.domGraph,getOpenPages:()=>this.getOpenPages(),getRoot:()=>this.getActivePageOrFrame(),userBrowserSettings:this.userBrowserSettings},pageLoadTimeoutMs:this.pageLoadTimeout,signal:this.abortSignal}}ping(){if(this.closed)throw new Error("Page has been closed")}setActiveFrameConfig(e){this.stateManager.setActiveFrameConfig(e)}async reset(e){this.abortSignal=void 0,this.debugData.logsPerPage=[],this.pageLoadPromises={},await this.clearAuthState({closeNonActiveTabs:!0}),await this.stopScreencast(),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await X(xT(this.getBrowserCallbacks()),{milliseconds:Ke})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0,this.cleanedUp=!0;try{this.pageLoadAbortListenerCleanup?.(),this.pageLoadAbortListenerCleanup=void 0,this.pageLoadAbortControllers.forEach(e=>e.abort()),this.pageLoadAbortControllers.clear(),this.originsVisited.clear(),await this.context.close(),await this.browser?.close(),this.browser=null}catch(e){this.logger.warn({err:e},"Error cleaning up browser, continuing...")}finally{this.browser=null}}get closed(){return this.cleanedUp||this.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,r,n){let o=Date.now(),i=0,a=0;for(;Date.now()-o<rc;){a++,n?.throwIfAborted();try{if(await Yt({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:Ke,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),root:e,codePath:"ensuring Momentic system scripts are loaded"}))return}catch(s){if(i++,i>=3){r.warn({err:s},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await fe(lr),a%2===0&&r.warn("Still waiting for momentic browser scripts to load...")}throw new Error(`Failed to load momentic browser scripts on page ${e.url()}`)}async html(){let e=await this.getActivePageOrFrame();return await this.ensureMomenticBrowserScriptsLoaded(e,this.logger),Yt({root:e,fn:()=>{let r=window;if(!r?.getFullHtmlTree)throw new Error("Missing Momentic HTML library when fetching page HTML");return r.getFullHtmlTree()},arg:void 0,timeout:ie,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the full HTML tree"})}url(){return this.page.url()}async stabilizePageForScreenshot(){try{await this.evaluateFunctionInPage(()=>{let e=window,r=[],n=new Map;document.querySelectorAll("input,textarea,[contenteditable]").forEach(o=>{n.set(o,{value:o.style.getPropertyValue("caret-color"),priority:o.style.getPropertyPriority("caret-color")}),o.style.setProperty("caret-color","transparent","important")}),r.push(()=>{for(let[o,i]of n)o.style.setProperty("caret-color",i.value,i.priority)}),e._MOMENTIC_SCREENSHOT_CLEANUP=()=>{for(let o of r)o();delete e._MOMENTIC_SCREENSHOT_CLEANUP}},void 0,"stabilizing page for screenshot")}catch(e){(!(e instanceof Error)||!e.message.includes("Execution context was destroyed"))&&this.logger.warn({err:e},"Failed to stabilize page before screenshot, continuing...")}}async removeScreenshotStabilization(){try{await this.evaluateFunctionInPage(()=>{window._MOMENTIC_SCREENSHOT_CLEANUP?.()},void 0,"removing screenshot stabilization")}catch{}}async screenshot(e){let{retries:r=1,stabilizeBeforeScreenshot:n=!1}=e,o=this.page.url();n&&await this.stabilizePageForScreenshot();let i=Date.now();try{await this.fixViewportForNewHeadless();let a=await this.screenshotHelper({...e,retries:r});if(a.byteLength>5e6)this.logger.warn("Page screenshot is greater than 5MB, which may cause performance issues with some AI models");else if(a.length===0)throw new Error("Got empty screenshot");return a}catch(a){if(r<=0||a.message.includes("has been closed"))throw a;return this.logger.warn({err:a,pageUrl:o},"Failed taking screenshot, retrying..."),await fe(na),this.screenshot({...e,retries:r-1})}finally{Date.now()-i>1e3&&this.logger.warn({pageUrl:o,duration:Date.now()-i},"Screenshot took longer than expected"),n&&await this.removeScreenshotStabilization()}}async screenshotHelper({locator:e,quality:r,saveToDiskPath:n,timeout:o,respectActiveFrame:i,clearHighlights:a=!1}){a&&await this.clearHighlights(),i&&this.stateManager.frameConfig&&(e=await(await this.getActivePageOrFrame()).frameElement());let s=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:r,optimizeForSpeed:!0},timeout:o??rt}),c=Buffer.from(s.data,"base64"),l=await o0.fromBuffer(c),{width:u,height:d}=this.getViewport()??{};if(u&&d&&(l.bitmap.width!==u||l.bitmap.height!==d)&&(c=await l.resize({w:u,h:d}).getBuffer("image/jpeg")),n&&t6(n,c),this.lastScreenshotForRecording=c,!e)return c;let p=await e.boundingBox({timeout:ie});if(!p)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:m,y:g,width:h,height:f}=p;if(!h||!f)throw new Error("Attempted to screenshot an element with zero width or height");m=Math.floor(m),g=Math.floor(g),h=Math.floor(h),f=Math.floor(f);try{let S=await o0.fromBuffer(c),b=S.bitmap.width,y=S.bitmap.height;m=Math.max(0,Math.min(m,b-1)),g=Math.max(0,Math.min(g,y-1)),h=Math.max(1,Math.min(h,b-m)),f=Math.max(1,Math.min(f,y-g)),c=await S.crop({x:m,y:g,w:h,h:f}).getBuffer("image/jpeg")}catch(S){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${g}) with size (${h}, ${f}): ${S}`)}finally{"dispose"in e&&await e?.dispose()}return c}getViewport(){if(this.viewport)return this.viewport;let e=this.page.viewportSize();return e||null}async navigate({url:e,initialNavigation:r=!1,loadTimeoutMs:n=this.pageLoadTimeout}){YO(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();r||(await this.waitForPageLoad(),await this.waitForStability());let i=!1,a;for(let c=0;c<3;c++)try{await this.page.goto(e,{timeout:n,waitUntil:"domcontentloaded"}),i=!0;break}catch(l){if(a=l,this.abortSignal?.throwIfAborted(),this.logger.warn({err:l},`Error occurred during navigation${c===0?", retrying...":" (fatal)"}`),await fe(lr),a.message.includes("Timeout")&&a.message.includes("exceeded")||a.message.includes("net::ERR_CONNECTION_REFUSED"))break;await this.cdpClient.send({method:"Page.stopLoading",params:{},timeout:Ke})}if(!i)throw new M("UserInfrastructureError",a?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step-wait-for-load"}),this.logger.info({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let s=this.url();if(DN.has(s))throw new M("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);await this.fixViewportForNewHeadless()}async type(e,r={},n=!1){await this.directTypeHelper(e,r,n)}async getActiveElementHandle(e){return e.evaluateHandle(()=>document.activeElement)}async getActiveElement(e){try{return await Yt({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]");let o=!1,i=window.getSelection();i&&!i.isCollapsed&&i.toString().trim().length>0&&(o=!0);let a=document.activeElement;return a&&"selectionStart"in a&&typeof a.selectionStart=="number"&&typeof a.selectionEnd=="number"&&a.selectionStart!==a.selectionEnd&&(o=!0),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n,hasTextSelected:o}:{hasTextSelected:o}},arg:void 0,timeout:Ke,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the active element"})}catch(r){this.logger.warn({err:r},"Failed to get active element");return}}async directTypeHelper(e,r={},n=!1){let o=await this.getActivePageOrFrame();await bD({root:o,text:e,options:r,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(n){let s=Date.now();for(;Date.now()-s<this.smartWaitingTimeout&&(!i||i.tag==="body");)await fe(na),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}let a=i?.tag==="input"||i?.tag==="textarea";if(r.clearContent)if(a||r.forceClearContent)if(this.properties.isAndroid&&!a&&i?.textContent){this.logger.info("Clearing content using backspaces");let s=0,c=i.textContent?.length;for(;c&&s<50;){s++;let l=[...Array(c)].map(()=>"Backspace").join("+");await this.page.keyboard.press(l),i=await this.getActiveElement(o),c=i?.textContent?.length}c&&this.logger.warn("Content still remains after clearing existing")}else this.properties.isAndroid?await this.page.keyboard.press("Control+A"):process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25);else this.logger.info({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...");await this.page.keyboard.type(e,{delay:r.delay??RA}),r.pressEnter&&await this.press("Enter",{}),await this.waitForStability()}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:rt})}catch(r){this.logger.warn({err:r},"Failed to scroll into view, trying with raw JS");try{await e.evaluate(async n=>{let o=n.scrollTop;n.scrollIntoView({block:"nearest"}),await new Promise(a=>setTimeout(a,250));let i=Date.now();for(;Date.now()-i<1e3;){let a=n.scrollTop;if(a===o)break;o=a,await new Promise(s=>setTimeout(s,250))}},void 0,{timeout:rt})}catch(n){this.logger.warn({err:n},"Failed to scroll into view using JS, continuing...")}}}async highlightA11yId(e){try{let{resolution:r}=await this.createTargetFromA11yId({id:e,description:null,targetSource:"AI",skipSaveToCache:!0});return await this.highlight(r.locator),!0}catch(r){return this.logger.debug({err:r,id:e},"Failed to highlight target"),!1}}async highlight(e){return hh({locator:e,callbacks:this.getBrowserCallbacks(),logger:this.logger})}recordUrlVisited(e){try{let r=new URL(e).origin;if(r==="null")return;this.originsVisited.add(r)}catch(r){this.logger.warn({err:r},"Failed to record origin visited")}}async waitForPageLoad(){let e=Date.now(),r=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises),o=-1,i=0;for(;r.length!==0;){if(Date.now()-e>this.pageLoadTimeout&&this.logger.warn({outstandingPromiseKeys:n,outstandingPromises:r},"Still waiting on page load promises"),Date.now()-o<20&&(i++,i>2)){this.logger.error({outstandingPromiseKeys:n,outstandingPromises:r},"Synchronous waiting loop detected, exiting page load wait");return}o=Date.now(),await Promise.allSettled(r),r=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises)}}async clearAuthState(e){await this.context.clearCookies();for(let o of this.originsVisited)this.logger.debug({origin:o},`Clearing data using CDP for origin ${o}`),await this.cdpClient.send({method:"Storage.clearDataForOrigin",params:{origin:o,storageTypes:"all"},timeout:Ke}),this.originsVisited.delete(o);let r=this.context.pages().indexOf(this.page),n=[...this.context.pages()];for(let o=0;o<n.length;o++){let i=n[o];if(i.isClosed())continue;let a=i.url();try{this.originsVisited.delete(new URL(a).origin)}catch{}await VN(i,this.logger),o!==r&&e.closeNonActiveTabs&&(this.logger.info(`Closing tab ${o} with URL ${a}`),await i.close())}}async loadAuthState(e){await this.waitForPageLoad(),await this.waitForStability(),!e||Object.keys(e).length===0?await this.clearAuthState({closeNonActiveTabs:!1}):await this.loadAuthStateHelper(e),await this.refresh(),await this.waitForStability()}async loadAuthStateHelper(e){let r=[];for(let c of e.cookies??[]){let l=await this.setCookie(c);r=r.concat(l)}this.logger.info(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:Ke});let n=0,o=[];for(let c of e.origins??[])for(let l of c.localStorage)try{await this.cdpClient.send({timeout:Ke,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(c.origin).origin,isLocalStorage:!0},key:l.name,value:l.value}}),n++}catch(u){o.some(d=>d.origin===c.origin&&d.key===l.name)||o.push({key:l.name,origin:c.origin,err:u});continue}o.length>0&&this.logger.warn({failedOrigins:o,currentPageUrl:this.page.url()},"Failed to set localStorage for entries, continuing..."),this.logger.info(`Loaded ${n} local storage entries`);let i={},a=0;for(let c of e.origins??[])if(c.sessionStorage&&c.sessionStorage.length>0){let l={};for(let u of c.sessionStorage)l[u.name]=u.value,a++;i[new URL(c.origin).origin]=l}a>0&&await this.context.addInitScript(({storageByOrigin:c,markerKey:l})=>{let u=window.location.origin,d=c[u];if(d&&!window.sessionStorage.getItem(l)){for(let[p,m]of Object.entries(d))window.sessionStorage.setItem(p,m);window.sessionStorage.setItem(l,"1")}},{storageByOrigin:i,markerKey:CT}),this.logger.info(`Loaded ${a} session storage entries`);let s=e.idb;s&&Object.keys(s).length>0&&(await GN(this.page,s,this.logger),this.logger.info(`Loaded ${Object.keys(s??{}).length} indexedDB databases`))}async saveAuthState(){let r=0,n=null;for(;r<=2;)try{await this.waitForPageLoad(),await this.waitForStability();let o=await this.context.storageState();return o.idb=await jN(this.page,this.logger),await pD(this.page,o,this.logger),o}catch(o){if(n=o,r++,r<=2){this.logger.warn({err:o,retryCount:r,maxRetries:2},`Error saving auth state, retrying (${r}/2)...`);let i=Math.pow(2,r)*100;await new Promise(a=>setTimeout(a,i))}}throw this.logger.error({err:n},"Failed to save auth state after 2 retries"),new M("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return PT(this.context,e)}saveA11yDetailsToCache(e,r){r.content=e.content,r.name=e.name,r.role=e.role,r.numChildren=e.children.length,delete r.serializedForm,delete r.nodeOnlySerializedForm}async updateCacheWithNewNodeDetails({node:e,target:r,locator:n,originalElementLocationResult:o,allowNotActionableNodesOverride:i,logger:a=this.logger,skipSavingVisualAttributes:s=!1}){if(e&&this.saveA11yDetailsToCache(e,r),r.frameCache=this.stateManager.saveAutoFrameCacheDetails(r.frameCache),n)try{let c=await this.fetchHtmlAttributes({locator:n,logger:a,originalElementLocationResult:o,allowNotActionableNodesOverride:i});c?(r.generatedSelectors=c.generatedSelectors,r.serializedHtml=c.serializedHtml,r.nodeOnlySerializedHtml=c.nodeOnlySerializedHtml,r.hybridSelector=c.hybridSelector):a.warn("Got undefined HTML attributes when trying to update cache")}catch(c){if(c instanceof Ks)throw a.warn({err:c},"Error while fetching HTML attributes triggering retry"),c;a.warn({err:c},"Failed to fetch HTML attributes for target, continuing...")}try{s||await this.saveElementVisualAttributes({target:r,locator:n,logger:a})}catch(c){a.debug({err:c},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes({target:e,locator:r,logger:n}){if(!r||!oT.includes(e?.role??""))return;let o=await r.boundingBox({timeout:Ke});if(!o||!o.width||!o.height){n.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0;return}let i=this.getViewport();if(o.x<0||o.y<0||!i||o.x+o.width>i.width||o.y+o.height>i.height)return;let{x:a=0,y:s=0,width:c=0,height:l=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-c)<1&&Math.abs(e.boundingBox.height-l)<1&&Math.abs((e.boundingBox.x??0)-a)<1&&Math.abs((e.boundingBox.y??0)-s)<1)return;e.boundingBox=o;let u=await this.screenshot({locator:r,quality:75,retries:0}),d=Th(),p="image/jpeg";(async()=>{try{await this.storage.createOnDemandScreenshot(d,u,p)}catch(m){this.logger.warn({err:m,screenshotId:d},"Failed to persist on-demand screenshot")}})(),e.screenshotUrl={id:d,contentType:"image/jpeg"}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async getElementRequiredValues({logger:e,boundingBox:r,locator:n,requirements:o}){let i={},a=!!o?.position&&o.position!=="irrelevant",s=!!o?.shape&&o.shape!=="irrelevant";if(a||s){if(!r||!r.width||!r.height)throw new M("ActionFailureError","Element does not have a bounding box as required");s&&(i.shape={width:r.width,height:r.height,tolerance:o.shape}),a&&(i.position={x1:r.x,y1:r.y,x2:r.x+r.width,y2:r.y+r.height,tolerance:o.position})}if(o?.text){let c=await n.textContent({timeout:ie});i.text=c?.trim().slice(0,mn.serializedElementForCachingTruncateLength)}if(o?.attributes&&o.attributes.length>0){let c={};for(let l of o.attributes){let u=l.trim().toLowerCase();if(!(!u||mn.bannedAiRequiredCacheAttributes.includes(u)))try{let d=await n.getAttribute(u,{timeout:ie});d!==null&&(c[l]=d)}catch(d){e.warn({err:d,attr:l},"Failed to fetch required attribute, continuing...")}}i.attributes=c}return i}async getAdditionalDetailsForElement({mainLocator:e,mainBoundingBox:r,additionalElement:n,root:o,logger:i}){let a=this.stateManager.a11yIdToNodeMap[n.id];if(!a)return;let s=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:o,node:a});if(e.contentFrame!==s.contentFrame)return;let c=await this.fetchHtmlAttributes({locator:s,logger:i});if(!c?.generatedSelectors||c.generatedSelectors.length===0)return;let l=await s.boundingBox({timeout:ie}),u={selectors:c.generatedSelectors,relativeAngleRadians:mD(r,l),relativeDistance:gD(r,l)};return n.requirements&&(u.requirements=await this.getElementRequiredValues({logger:i,locator:s,boundingBox:l,requirements:n.requirements})),u}async getAllAdditionalElementsDetails({mainElementId:e,mainLocator:r,mainBoundingBox:n,additionalElements:o,root:i,logger:a}){let s=new Set,c=[];for(let d of o)d.id!==e&&(s.has(d.id)||(s.add(d.id),c.push(d)));let l=await Promise.allSettled(c.map(d=>this.getAdditionalDetailsForElement({mainLocator:r,mainBoundingBox:n,additionalElement:d,root:i,logger:a}))),u=[];for(let[d,p]of l.entries()){let m=c[d];if(m){if(p.status==="fulfilled"){let g=p.value;if(!g)continue;u.push(g);continue}this.logger.warn({err:p.reason,additionalElement:m},"Failed to fetch additional element details, continuing...")}}return u}async updateCacheWithAdditionalRequirements({mainElementId:e,requirements:r,additionalElements:n,target:o,locator:i,root:a,logger:s}){let c=await i.boundingBox({timeout:ie});if(r)try{o.requirements=await this.getElementRequiredValues({logger:s,boundingBox:c,locator:i,requirements:r})}catch(l){s.warn({err:l},"Failed to generate required values for target")}n&&n.length>0&&(o.additionalElements=await this.getAllAdditionalElementsDetails({mainElementId:e,mainBoundingBox:c,mainLocator:i,additionalElements:n,root:a,logger:s}))}async createTargetFromA11yId({id:e,description:r,targetSource:n,skipSaveToCache:o,skipSavingVisualAttributes:i,logger:a=this.logger,requirements:s,additionalElements:c}){if(e<0)throw new M("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let l=this.stateManager.a11yIdToNodeMap[e];if(!l)throw new M("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let u=this.stateManager.frameConfig,d,p,m,g;if(this.userBrowserSettings.autoExpandIframes&&!u&&l.parentFrame){let T=l.parentFrame,{cache:w,config:P}=await this.stateManager.getAutoFrameDetailsFromHandle(T);p=w,m=P,d=P.frame,g="auto iframe"}else l.parentFrame&&u?(m=u,d=await this.getActivePageOrFrame(),g="hardcoded url already on the state manager"):(d=await this.getActivePageOrFrame(),g="should not be possible");let h=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:d,node:l}),f=await h.evaluate(T=>window.generateCommonLocationResultMetadata(T),void 0,{timeout:rt}),S={id:e,inputDescription:r??void 0,targetSource:n,targetUpdateTime:new Date().toISOString(),targetUpdateLoggerTags:et(a),frameCache:p},b,y=!1;o||(m&&(a.info({frameConfigSource:g,frameConfig:JD(m)},"A11y node was resolved to a target within an iframe"),b=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(m),y=!0),await this.updateCacheWithAdditionalRequirements({mainElementId:e,requirements:s,additionalElements:c,target:S,root:d,locator:h,logger:a}),await this.updateCacheWithNewNodeDetails({node:l,target:S,locator:h,logger:a,allowNotActionableNodesOverride:!0,skipSavingVisualAttributes:i,originalElementLocationResult:f}));try{return{resolution:{locator:h,a11yNode:l,displayString:l.getNodeOnlySerializedForm(),originalElementLocationResult:f,decisions:[]},target:S,frameConfig:m,frameConfigSource:g}}finally{y&&this.stateManager.setActiveFrameConfig(b)}}async resolveTarget(e,r,n={}){let{logger:o=this.logger,signal:i=this.abortSignal,allowNotActionableNodesOverride:a,skipWaitForPageLoad:s}=n;if(r.frameCache&&this.userBrowserSettings.autoExpandIframes){let p,m=!1,g=Date.now();for(;Date.now()-g<this.smartWaitingTimeout;)try{let h=await this.stateManager.resolveAutoFrameCache(r.frameCache);this.setActiveFrameConfig(h),m=!0;break}catch(h){p=h,await fe(lr,i)}if(!m)throw p}let c=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(c,o,i);let l=Date.now(),u=0,d;for(;Date.now()-l<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),u++;let p=u===2||Date.now()-l>this.smartWaitingTimeout-2e3&&u%2===0;try{d=await this.resolveTargetHelper({root:c,target:r,primaryOnly:!0,shouldLogOnFailure:p,logger:o,allowNotActionableNodesOverride:a,signal:i,skipWaitForPageLoad:s});break}catch(m){if(m instanceof jc)break;i?.throwIfAborted(),p&&o.warn({err:m},`Could not resolve target using primary cache only (x${u})`),await fe(lr,i)}}return d||(d=await this.resolveTargetHelper({root:c,target:r,primaryOnly:!1,logger:o,signal:i,allowNotActionableNodesOverride:a}),o.info({decisions:d.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",elementLocationDecisions:d?.decisions??[],pageState:void 0,targetSource:r.targetSource,targetUpdateTime:r.targetUpdateTime}),d}async resolveTargetHelper({root:e,target:r,primaryOnly:n,logger:o,signal:i,allowNotActionableNodesOverride:a,shouldLogOnFailure:s,skipWaitForPageLoad:c,skipSavingVisualAttributes:l}){let u=[],d;await this.getBrowserState({logger:o,abortSignal:i,skipWait:!this.userBrowserSettings.visualActions,skipWaitForPageLoad:c,allowNotActionableNodesOverride:a});let p;if(r.generatedSelectors||r.hybridSelector){let m;try{m=await this.resolveTargetWithPrimaryMethods({root:e,target:r,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s,skipSavingVisualAttributes:l})}catch(g){p=g,g instanceof vn&&(u.push(...g.decisions),d=g.cacheMissReason)}if(m)return{...m,decisions:[...u,...m.decisions]};n||(u.push({type:"CSS_SELECTOR",matched:!1,reason:p?.message,selectors:vd(r.generatedSelectors??[])}),r.generatedSelectors=void 0,r.hybridSelector=void 0)}if(n)throw p;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let m=await this.resolveTargetWithSecondaryMethods({root:e,target:r,decisions:u,logger:o,signal:i,allowNotActionableNodesOverride:a,skipSavingVisualAttributes:l});if(m)return r.targetSource="HEURISTIC_HEALED",r.targetUpdateTime=new Date().toISOString(),r.targetUpdateLoggerTags=et(o),m;d=d??"secondary-resolution-failed"}throw new vn("Could not find any relevant node given target",u,d)}async resolveTargetWithPrimaryMethods({root:e,target:r,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i,skipSavingVisualAttributes:a}){if(!r.nodeOnlySerializedHtml)throw new jc("Insufficient data to resolve target using primary methods (missing node HTML)");let s={x:0,y:0};if(dD(e)){let L=await(await e.frameElement()).boundingBox();L&&(s=L)}let c=i?n:Eo,l=this.userControlledBrowserSettings.hybridSelectorMode,u=r.boundingBox,d=!!u?.width&&!!u?.height,p=!o&&d,m=this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange&&d?u:void 0,g={ldistThreshold:NN,requireBoundingBox:p,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:m,requirements:r.requirements,additionalElements:r.additionalElements,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles},rootBoundingBox:s},h={cssParams:{selectors:r.generatedSelectors??[],cachedElementSerialized:r.nodeOnlySerializedHtml,opts:g},hybridParams:l&&r.hybridSelector?{nodes:r.hybridSelector,cachedElementSerialized:r.nodeOnlySerializedHtml,opts:g}:void 0},{css:f,hybrid:S}=await Yt({fn:L=>window.evaluatePrimaryCaches(L),arg:h,root:e,timeout:ie,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),b,y,T=[];if(l==="prefer"&&S?.result){b=S.result;let L={type:"HYBRID_SELECTOR",matched:!0,logs:S.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};T.push(L),y="HYBRID_SELECTOR"}else if(f?.result){b=f.result;let L=`${b.workingSelectors.length} CSS selectors matched the following element: ${b.serializedElement}`,N=b.workingSelectors.slice(0,5);T.push({type:"CSS_SELECTOR",matched:!0,logs:f.logs,reason:L,selectors:N}),n.debug({reason:L,workingSelectors:N},"Resolved with CSS selectors"),y="CSS_SELECTOR"}else throw T.push({type:"CSS_SELECTOR",matched:!1,reason:f.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:f.logs}),S&&T.push({type:"HYBRID_SELECTOR",matched:!1,reason:S.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:S.logs}),f?.error&&n.error({err:new Error(f.error)},"Cache evaluation errored unexpectedly (CSS)"),S?.error&&n.error({err:new Error(S.error)},"Cache evaluation errored unexpectedly (Hybrid)"),new vn("Cache evaluation failed",T,f.cacheMissReason);let w,P,A;if(this.userBrowserSettings.visualActions){let L=b.mPath;if(!L)throw new Error("Found element did not have an mPath despite using visual actions");let N=L.join(" > ");w=e.locator(N),P=this.stateManager.getNodeUsingMPathSelector(N)}else if(b.dataMomenticId!==void 0)A=parseInt(b.dataMomenticId),P=this.stateManager.dataMomenticIdToNodeMap[A],"workingSelectors"in b?w=e.locator(b.workingSelectors[0]):w=e.locator(ui(A));else throw new M("InternalWebAgentError","Received an element resolution result with no identifying attributes");l&&r.hybridSelector&&(S?.logs.length===1?c.warn({hybridResult:S,cssResult:f,hybridMode:l},"Hybrid selector resolution rejected, continuing..."):S?.result?f?.result&&S?.result&&S.result.serializedElement!==f.result.serializedElement&&(this.userBrowserSettings.visualActions&&JSON.stringify(f.result.mPath)!==JSON.stringify(S.result.mPath)?n.warn({originalCache:r,hybridResult:S,cssResult:f,hybridMode:l,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):f.result.dataMomenticId!==S.result.dataMomenticId&&n.warn({originalCache:r,hybridResult:S,cssResult:f,hybridMode:l,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):c.warn({originalCache:r,hybridResult:S,cssResult:f,hybridMode:l},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing..."));let x=vd(r);await this.updateCacheWithNewNodeDetails({node:P,target:r,locator:w,logger:n,originalElementLocationResult:b,allowNotActionableNodesOverride:o,skipSavingVisualAttributes:a});let O=HT(x,r);return O&&Object.keys(O).length>0&&(r.cacheResolutionUpdateTime=new Date().toISOString(),r.cacheResolutionUpdateLoggerTags=et(n),r.cacheResolutionUpdateSource=y),{a11yNode:P,displayString:b.serializedElement,locator:w,decisions:T,originalElementLocationResult:b,revalidator:async()=>{await wT({initialLocationResult:b,cacheEvaluationParams:h,locator:w,logger:n})}}}async resolveHardcodedCssSelector(e){let{ctx:r,selector:n,signal:o=this.abortSignal,timeoutMs:i=this.smartWaitingTimeout}=e,a=await this.getActivePageOrFrame(),s=Date.now(),c=0,l,u=[];for(;Date.now()-s<i;){o?.throwIfAborted(),c++;let d=a.locator(n),p;try{await d.waitFor({state:"attached",timeout:Ke});let m=await d.evaluate(g=>window.generateCommonLocationResultMetadata?.(g),void 0,{timeout:rt});return p=m?.serializedElement??"unknown element",u.push({type:"USER_SELECTOR",matched:!0,reason:`The user-provided CSS selector ${n} matched an element on the page.`}),r?.details?.push({type:"TARGETING",elementLocationDecisions:u,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toISOString()}),{locator:d,originalElementLocationResult:m,displayString:p,decisions:u}}catch(m){let g=m.message;l=new M("ActionFailureError",`CSS selector '${n}' failed to resolve after ${c} attempts: ${g.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":g}`),await fe(lr,o)}}throw l}async resolveTargetWithSecondaryMethods(e){if(!e.target.boundingBox)return;let{x:r,y:n,width:o,height:i}=e.target.boundingBox,a=await this.resolveTargetWithSecondaryMethodsHelper(e);if(!a)return;let s=await a.locator.boundingBox({timeout:ie});if(!s){this.logger.debug({proposedNode:a.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:c,y:l,width:u,height:d}=s;if(Math.abs(u-o)>10||Math.abs(d-i)>10){this.logger.debug({newW:u,oldW:o,newH:d,oldH:i,proposedNode:a.displayString},"Rejecting secondary matching result due to difference in dimensions");return}else if(!r||!n||!c||!l){this.logger.debug({oldX:r,oldY:n,newX:c,newY:l,proposedNode:a.displayString},"Rejecting secondary matching result due to missing x/y coords");return}else if(Math.abs(c-r)>100||Math.abs(l-n)>100){this.logger.debug({newX:c,newY:l,oldX:r,oldY:n,proposedNode:a.displayString},"Rejecting secondary matching result due to large difference in x/y coords");return}return a}async resolveTargetWithSecondaryMethodsHelper({root:e,target:r,decisions:n,logger:o,signal:i,allowNotActionableNodesOverride:a,skipSavingVisualAttributes:s}){if(r.nodeOnlySerializedHtml&&r.nodeOnlySerializedHtml.trim().length<LN){let u="Refusing to attempt HTML comparison since the saved element is too short.";n.push({type:"HTML_DISTANCE",matched:!1,reason:u})}else if(r.nodeOnlySerializedHtml&&r.nodeOnlySerializedHtml.length>50)try{let u=await Yt({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:r.nodeOnlySerializedHtml},timeout:rt,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"});if(!u)throw new Error(`Got invalid HTML evaluation result: ${JSON.stringify(u)}`);if("closestDistance"in u&&("dataMomenticId"in u&&u?.dataMomenticId||"mPath"in u&&u?.mPath)){let d=u.dataMomenticId?parseInt(u.dataMomenticId):void 0,p,m;if(d)p=this.stateManager.dataMomenticIdToNodeMap[d],m=e.locator(ui(d));else if(u.mPath){let S=u.mPath.join(" > ");p=this.stateManager.getNodeUsingMPathSelector(S),m=e.locator(S)}else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let g=u.serializedElement;o.warn({result:u,originalTarget:r,displayString:g},"Resolved cached target to new node with pure html levenshtein distance");let h=vd(r);await this.updateCacheWithNewNodeDetails({node:p,target:r,locator:m,logger:o,originalElementLocationResult:u,allowNotActionableNodesOverride:a,skipSavingVisualAttributes:s});let f=HT(h,r);return f&&Object.keys(f).length>0&&(r.cacheResolutionUpdateTime=new Date().toISOString(),r.cacheResolutionUpdateLoggerTags=et(o),r.cacheResolutionUpdateSource="HTML_DISTANCE",o.info({diffs:f,result:u},"Updated cache after l-dist resolution")),n.push({type:"HTML_DISTANCE",matched:!0,reason:"Found an element on the page with the same string representation as the saved element.",logs:u.logs,distance:u.closestDistance,closestElement:g,savedElement:r.nodeOnlySerializedHtml}),{locator:m,a11yNode:p,displayString:g,decisions:n,originalElementLocationResult:u,revalidator:async()=>{await wT({initialLocationResult:u,locator:m,logger:o})}}}else if("cacheMissReason"in u)throw new Error(u.error??u.cacheMissReason)}catch(u){o.info({err:u},"Failed to find closest HTML node using levenshtein distance"),n.push({type:"HTML_DISTANCE",matched:!1,reason:`Error finding closest HTML node by string distance: ${u}`})}let c=r.screenshotUrl,l=r.role??"";if(c&&oT.includes(l))try{let u=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:r,screenshot:c,signal:i,allowNotActionableNodesOverride:a});return{...u,decisions:[...n,...u.decisions]}}catch(u){i?.throwIfAborted(),n.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${u}`}),o.warn({err:u},"Did not find any close element using saved screenshot")}}async resolveTargetWithTemplateMatching({screenshot:e,oldTarget:r,signal:n,allowNotActionableNodesOverride:o}){let i;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let a=await this.screenshot({retries:0}),s;if(typeof e=="string"){let b=await fetch(e);s=Buffer.from(await b.arrayBuffer())}else({data:s}=await this.storage.fetchOnDemandScreenshot(e));let c=s6(),l=await this.enricher.runTemplateMatching({id:c,searchImageBase64String:s.toString("base64"),pageImageBase64String:a.toString("base64")},{signal:n}),{target:u,locator:d}=await this.getTargetFromPositionPercentages({percentX:l.x,percentY:l.y,allowNotActionableNodesOverride:o}),p=u.boundingBox?.width,m=u.boundingBox?.height;if(!p||!m)throw i="Rejecting target from screenshot due to no bounding box",new Error(i);let g=u.id,h=this.stateManager.a11yIdToNodeMap[g],f=vd(r);await this.updateCacheWithNewNodeDetails({target:r,node:h,locator:d,allowNotActionableNodesOverride:o});let S=HT(f,r);return S&&Object.keys(S).length>0&&(r.cacheResolutionUpdateTime=new Date().toISOString(),r.cacheResolutionUpdateLoggerTags=et(this.logger),r.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:c,diffs:S,templateMatch:l},"Updated cache after template matching resolution")),{locator:d,originalElementLocationResult:void 0,a11yNode:h,displayString:u.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot"}]}}async typeIntoTarget(e,r,n={}){await this.highlight(r.locator);let o;r.originalElementLocationResult?o=r.originalElementLocationResult.importantAttributes.type??"":o=await r.locator.getAttribute("type",{timeout:Ke})??"";let i=yD.some(a=>a===o.toLowerCase());return await _T({targetingResult:r,options:{force:n.force,relativePosition:n.relativePosition},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1}),await this.page.waitForTimeout(150),this.directTypeHelper(e,n)}async click(e,r,n={}){return _T({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:r,browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1})}async waitForUrl({beforeUrl:e,matcher:r},n){let o=n?.timeout??this.pageLoadTimeout,i=Date.now(),a=!1,s=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),s=this.url(),Pg(s,r,n)){a=!0;break}await fe(lr,this.abortSignal)}if(!a)throw new M("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${gg(r)} in ${o}ms.
|
|
4604
|
+
Current tab: ${s}`);try{await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"wait-for-url-step"})}catch(c){this.logger.warn({err:c},"Failed waiting for page load after URL change, continuing...")}}async dragAndDrop(e,r,n={}){let o=n.steps??5,i=Math.min(n.hoverDurationMs??500,rt);if(await this.highlight(e.locator),this.properties.isAndroid){await RD({page:this.page,fromLocator:e.locator,toLocator:r.locator,stepCount:o,dragDurationMs:n.dragDurationMs??1e3,hoverDurationMs:i}),await this.highlight(r.locator);return}await this.hover(e),await this.page.mouse.down();let a=await r.locator.boundingBox({timeout:ie});if(!a)throw new M("ActionFailureError","Could not get bounding box of target element");let s=a.x+a.width/2,c=a.y+a.height/2;await this.page.mouse.move(s,c,{steps:o}),await fe(i),await this.highlight(r.locator),await this.page.mouse.up()}async mouseDrag(e,r,n,o){o&&await this.hover({locator:o,originalElementLocationResult:void 0,serverSideBoundingBox:null}),await this.page.mouse.down();let i;if(o){let a=await o.boundingBox({timeout:ie});a&&(i={x:a.x+a.width/2,y:a.y+a.height/2})}i||(this.logger.warn("Could not get starting position from fromTarget, falling back to (0,0)"),i={x:0,y:0}),await this.page.mouse.move(i.x+e,i.y+r,{steps:n}),await fe(na),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await hs({func:async r=>{await this.scrollIntoViewIfNeeded(r.locator);let n=await r.locator.boundingBox({timeout:ie});if(!n)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(n.x+n.width/2,n.y+n.height/2,{steps:3})},action:"hovering over element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,targetingResult:e,callbacks:this.getBrowserCallbacks()})}async focus(e){await this.highlight(e.locator),await hs({func:r=>r.locator.focus({timeout:rt}),action:"focusing element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async blur(e){if(!e){let r=await this.getActivePageOrFrame();await Yt({fn:()=>{let n=document.activeElement;n&&n.nodeType===1&&n.blur()},root:r,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:Ke,codePath:"blurring the active element"});return}await this.highlight(e.locator),await hs({func:r=>r.locator.blur({timeout:rt}),action:"blurring element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async selectOption(e,r,n=!1){await this.highlight(e.locator),await hs({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{if(r.type==="INDEX"){let i=Number(r.index);if(isNaN(i))throw new M("UserConfigurationError",`Page index ${r.index} is not a number`)}await o.locator.selectOption({value:r.type==="VALUE"?r.value:void 0,label:r.type==="LABEL"?r.label:void 0,index:r.type==="INDEX"?Number(r.index):void 0},{force:n,timeout:ie})},targetingResult:e})}async press(e,r){let n=r.repeat??1;if(r.convertMeta){let o=fh(e,this.properties.isAndroid);o!==e&&(this.logger.info({key:e,convertedKey:o},"Converted platform dependent keys"),e=o)}for(let o=0;o<n;o++)await this.page.keyboard.press(e,{delay:r.delayMs??0});await this.waitForStability()}async keyDown(e,r){if(r.convertMeta){let n=fh(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of RT(e))await this.page.keyboard.down(n)}async keyUp(e,r){if(r.convertMeta){let n=fh(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of RT(e))await this.page.keyboard.up(n)}async refresh(e){let r=e?.loadTimeoutMs??this.pageLoadTimeout;await this.waitForPageLoad();let n=0,o=2;for(;n<o;){n++;try{await this.page.reload({waitUntil:"domcontentloaded",timeout:r});break}catch(i){this.logger.warn({err:i,attempt:n},`Failed to reload page${n<o?", retrying...":", continuing..."}`)}}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"reload-step"}),await this.waitForStability()}async getBrowserState(e){let{maxAttempts:r=2,logger:n=this.logger,skipWaitForPageLoad:o,allowNotActionableNodesOverride:i,shouldLogOnFailure:a}=e,s=e.abortSignal??this.abortSignal,c=!i,l=i?!0:this.userControlledBrowserSettings.showZeroOpacityElements,u=a?n:Eo;o||await this.waitForPageLoad(),e.skipWait||await this.waitForStability({logger:n,signal:s});let d=0,p;for(;d<r;){d++;try{return await X(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:s,logger:n,filterByViewport:e.filterByViewport,showZeroOpacityElements:l,flagNotActionableNodes:c,skipPageLoad:e.skipWaitForPageLoad}),{milliseconds:this.pageLoadTimeout*d,signal:s,message:"Getting browser state took too long"})}catch(m){if(s?.throwIfAborted(),p=m instanceof Error?m.message:`${m}`,d>=r)throw m;u.warn({err:m,url:this.url()},"Error getting a11y tree, retrying...")}}throw new M("ActionFailureError",`Getting page content failed after ${r} attempts. Error: ${p}`)}async getViewportOffsetDetails(e){let[r,n,o,i,a]=await Yt({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:ie,waitForPageLoad:async()=>{},codePath:"getting current viewport details"});return{upperBound:r,lowerBound:r+i,leftBound:n,rightBound:n+o,width:o,height:i,devicePixelRatio:this.properties.systemDevicePixelRatio??a}}async waitForStability(e){let{logger:r=this.logger,timeout:n=this.smartWaitingTimeout,signal:o}=e??{},i={value:Date.now()},a=p=>{i.value=Date.now()},s=()=>a("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",s);let c=()=>a("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",c);let l=()=>a("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",l);let u=()=>a("Page.navigatedWithinDocument");this.cdpClient.addListener("Page.navigatedWithinDocument",u);let d=()=>a("frameRequestedNavListener");this.cdpClient.addListener("Page.frameRequestedNavigation",d);try{await this.waitForStabilityHelper(i,r,n,o)}finally{this.cdpClient.removeListener("DOM.documentUpdated",s),this.cdpClient.removeListener("Page.frameDetached",c),this.cdpClient.removeListener("Page.frameStartedLoading",l),this.cdpClient.removeListener("Page.navigatedWithinDocument",u),this.cdpClient.removeListener("Page.frameRequestedNavigation",d)}}async waitForStabilityHelper(e,r,n,o=this.abortSignal){let i=!1,a=Date.now(),s,c={quality:25,retries:0,stabilizeBeforeScreenshot:!0},l=!1,u=0,d;for(;Date.now()-a<n;){o?.throwIfAborted();let p=Date.now();if(d!==void 0&&p-d<na&&await fe(na-(p-d),o),d=Date.now(),!(Date.now()-e.value<rT)){if(s)try{let m=await this.screenshot(c);if(fD(s,m)>1){s=m,l=!1;continue}l=!0}catch(m){u++,u%3===0&&r.warn({err:m,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}else try{s=await this.screenshot(c)}catch(m){u++,u%3===0&&r.warn({err:m,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}if(!(Date.now()-e.value<rT)){i=!0;break}}}i||r.warn({duration:Date.now()-a,stable:{a11y:i,screenshot:l}},"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,r){let{x:n,y:o}=e;this.logger.debug({x:n,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(n,o,{button:r.rightClick?"right":"left",clickCount:r.doubleClick?2:1})}async dragAndDropUsingVisualCoordinates(e,r,n){await CD(this.page,e,r,n)}async mouseDragUsingVisualCoordinates(e){let{fromTarget:r,...n}=e;await MT({...n,page:this.page,visualTarget:r,isAndroid:this.properties.isAndroid??!1})}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y,{steps:3})}async getElementLocation(e){let r=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:ie}),n=await X(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:rt});process.platform==="darwin"&&n===1&&(n=MN);let o=r.documents[0],i=o.layout,a=o.nodes,s=a.nodeName||[],c=a.backendNodeId||[],l=i.nodeIndex,u=i.bounds,d=-1;for(let b=0;b<s.length;b++)if(c[b]===e){d=l.indexOf(b);break}if(d===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[p=0,m=0,g=0,h=0]=u[d];p/=n,m/=n,g/=n,h/=n;let f=p+g/2,S=m+h/2;return{centerX:f,centerY:S}}async scrollVertical(e){return IT({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:0,directionX:null,deltaY:e?Math.abs(e):null,directionY:e&&e>0?"down":"up",signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async scrollHorizontal(e){return IT({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:e?Math.abs(e):null,directionX:e&&e>0?"right":"left",deltaY:0,directionY:null,signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async goForward(){await this.waitForPageLoad(),await this.page.goForward({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout}),await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-forward"})}async goBack(){await this.waitForPageLoad(),await this.page.goBack({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout}),await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-back"})}async reinitializeCDPClient(e){await this.cdpClient.reinitialize(e),await this.initializeScreencast()}async stopScreencast(){if(this.clientCallbacks?.onScreencastFrame)try{await this.cdpClient.send({method:"Page.stopScreencast",params:{}})}catch{}}async changeActivePage(e,r){if(await this.stopScreencast(),this.recordUrlVisited(e.url()),this.onVideoPageChange){let n=await e.video()?.path();if(n){let o=i0(n);this.onVideoPageChange({videoName:o})}}this.page=e,await this.reinitializeCDPClient(r??this.pageLoadTimeout)}async createNewTab(e,r){let n=await this.context.newPage();await this.changeActivePage(n,r?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...r}),this.handleAvailableTabsChange()}async switchToPage(e,r){let n=!0,o,i=Date.now();for(;n||r?.retry&&Date.now()-i<this.smartWaitingTimeout;){n=!1;try{await this.switchToPageHelper(e,r);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),o=a,await fe(lr)}}throw o}async switchToPageHelper(e,r){let n=this.context.pages().map((i,a)=>({page:i,url:i.url(),index:a})),o;if(e.type==="INDEX"){let i=Number(e.index);if(isNaN(i))throw new M("UserConfigurationError",`Page index ${e.index} is not a number`);if(i<0||i>=n.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(n.map(a=>a.url))}`);o=n[i]}else{let i=n.filter(a=>e.type==="SUBSTRING"?a.url.includes(e.substring):a.url.match(e.pattern));i.length>1&&this.logger.warn(`More than one page matches the page switch criteria: ${JSON.stringify(i.map(a=>a.url))}`),o=i[i.length-1]}if(!o)throw new Error(`Could not find matching page using criteria: ${JSON.stringify(e)}.
|
|
4605
4605
|
Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!is(o.url,this.logger)){this.logger.warn(`Refusing to switch to page with invalid URL: ${o.url}`);return}this.logger.info(`Switching to tab ${o.index} with url ${o.url}`),await this.changeActivePage(o.page,r?.loadTimeoutMs),await this.loadFrameAndRecordUrl({root:o.page,signal:this.abortSignal,codePath:"switch-to-tab-step"}),this.handleAvailableTabsChange()}async setCookie(e){let r;return typeof e=="string"?r=Qp(e):r=[e],await this.context.addCookies(r),r}async setLocalStorage(e,r){let n;for(let o=0;o<2;o++)try{await this.evaluateFunctionInPage(([i,a])=>{i&&localStorage.setItem(i,a||"")},[e,r],`setting local storage key ${e}`);return}catch(i){n=i}if(n)throw n}getActiveFrameConfig(){return this.stateManager.frameConfig}async exposeRecordingBindings(){try{await X(this.exposeRecordingBindingsHelper(),{milliseconds:this.pageLoadTimeout})}catch(e){e instanceof Error&&e.message.includes("already registered")||this.logger.error({err:e},"Failed to install Momentic libraries for action recording")}}async exposeRecordingBindingsHelper(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},r)=>{this.transformer&&r0({event:r,frame:e,transformer:this.transformer,enricher:this.enricher,lastScreenshotForRecording:this.lastScreenshotForRecording?.toString("base64"),logger:this.logger})},{handle:!1}),await this.context.exposeBinding("captureKeystroke",async(e,r)=>{this.transformer&&this.transformer.recordKeystroke(r)})}async startRecordingCrons(e){if(e.aborted)return;let r,n=(await this.getOpenPages()).map(c=>c.url),o=0,i=!1,a=async()=>{if(e.aborted||o>8){clearTimeout(r);return}i=!0;let c;try{c=(await this.getOpenPages()).map(u=>u.url),o=0}catch(u){this.logger.debug({err:u},"Failed getting new open pages during recording tab switch cron, skipping..."),o++;return}let l=this.url();for(let u=c.length-1;u>=n.length;u--){let d=c[u];is(d,this.logger)&&d!==l&&this.logger.info({lastActivePages:n,currentUrl:l,newOpenPages:c},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:String(u)});break}n=c};r=setInterval(async()=>{if(!i){i=!0;try{await a()}catch(c){this.logger.error({err:c},"Error while checking pages during recording")}finally{i=!1}}},lr);let s=async()=>{clearInterval(r)};e.addEventListener("abort",s,{once:!0})}async startRecording(e,r,n){this.logger.debug({isClickToRecord:n},"Starting recording mode in Chrome browser"),await this.startRecordingCrons(e),await this.page.evaluate(i=>{let a=window;a._MOMENTIC_RECORDING_ACTIVE=!0,a._MOMENTIC_CLICK_RECORD_ACTIVE=i},n),this.transformer=r,await this.injectKnowledgeBaseIntoBrowser(this.page);let o=async()=>{this.transformer=void 0,this.lastScreenshotForRecording=void 0;try{await this.page.evaluate(()=>{let i=window;i._MOMENTIC_RECORDING_ACTIVE=!1,i._MOMENTIC_CLICK_RECORD_ACTIVE=!1})}catch{}};e.addEventListener("abort",o,{once:!0})}async getSelectOptions(e){return await e.evaluate(n=>Array.from(n.querySelectorAll("option")).map(i=>({value:i.value,label:i.label})),void 0,{timeout:Ke})}getActivePage(){return this.page}async getActivePageOrFrame(){let e=await this.stateManager.resolveActiveFrameConfig({});return e?(await this.loadFrameAndRecordUrl({root:e.frame,signal:this.abortSignal,codePath:"get-active-frame-locator"}),e.frame):this.page}async loadFrameAndRecordUrl({root:e,signal:r,codePath:n}){let o=this.pageLoadTimeout,i=e.url();if(!i.includes("chrome-error://")){try{await cd({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:r,codePath:`loadFrameAndRecordUrlDomContentLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let s=a;if(s.name==="AbortError")throw new M("UserInfrastructureError",`The page with URL ${Tt(i,50)} did not load within the configured timeout (${o}ms): ${s}`);if(!s.message.includes("detached"))throw s}try{await cd({promiseGenerator:async()=>e.waitForLoadState("load",{timeout:o}),signal:r,codePath:`loadFrameAndRecordUrlPageLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){this.logger.warn({err:a,codePath:n,url:i},"Failed waiting for current frame to load, continuing...")}this.recordUrlVisited(e.url())}}async getCondensedHtml(e){let{skipWait:r=!1}=e??{};return r||(await this.waitForPageLoad(),await this.waitForStability()),this.getCondensedHtmlHelper()}async getCondensedHtmlHelper(){let e=await this.getRawCondensedHtml();return r6.html(e,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1})}async getRawCondensedHtml(){let e=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(e,this.logger,this.abortSignal);let{result:r,error:n}=await Yt({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:rt,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!r)throw new M("InternalWebAgentError","Got empty HTML tree - are you sure the page is fully loaded?");return r}registerDialogHandler(e){let r=async n=>{try{e==="ACCEPT"?await n.accept():await n.dismiss()}catch(o){this.logger.warn({err:o},"Failed to handle dialog")}};this.page.once("dialog",r)}async evaluateFunctionInAllFrames(e,r){return this.stateManager.executeFunctionInAllFrames(e,r)}async evaluateFunctionInPage(e,r,n,o=rt){let i=await this.getActivePageOrFrame();return Yt({root:i,fn:e,arg:r,timeout:o,waitForPageLoad:()=>this.waitForPageLoad(),codePath:n})}async evaluateCodeInPage({code:e,fragment:r,context:n,timeoutMs:o=Ui}){let i=ZN(),a={code:e,fragment:r,context:n},{result:s}=await X(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new M("ActionFailureError",`Code evaluation in browser exceeded the allowed timeout of ${o/1e3} seconds`)},signal:this.abortSignal});return s}async getDomNodeFromPixelPosition(e,r){await this.cdpClient.send({method:"DOM.getDocument",params:{depth:0},timeout:rt});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:r},timeout:Ke})}catch(o){throw this.logger.warn({err:o,x:e,y:r},"Failed to get DOM node from position percents"),new Error("No element was found at the given location")}return n}async getDomNodeFromPositionPercentages(e,{percentX:r,percentY:n}){if(r<0||r>1||n<0||n>1)throw new M("UserConfigurationError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:a,leftBound:s}=await this.getViewportOffsetDetails(e),c=Math.round(a),l=Math.round(s),u=Math.ceil(o*r),d=Math.ceil(i*n),p=u+l,m=d+c;return this.getDomNodeFromPixelPosition(p,m)}async highlightFromPositionPercentages(e){let r=await this.getActivePageOrFrame(),n;try{n=await this.getDomNodeFromPositionPercentages(r,e)}catch{}return n?(await this.cdpClient.send({method:"Overlay.highlightNode",timeout:Ke,params:{highlightConfig:_D,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:Ke,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:Ke})}catch{}}async getTargetFromPositionPercentages(e){let r=await this.getActivePageOrFrame(),n=await this.getDomNodeFromPositionPercentages(r,e);return this.getTargetFromBackendNodeId({root:r,backendNodeId:n.backendNodeId,allowNotActionableNodesOverride:e.allowNotActionableNodesOverride})}async getTargetFromBackendNodeId({root:e,backendNodeId:r,allowNotActionableNodesOverride:n}){let o=this.stateManager.domGraph?.backendIdToNode[r];if(!o)throw new Error("No DOM node was found with the given backend ID");let i=o?.attributes[ms],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(ui(a)),c=await this.fetchHtmlAttributes({locator:s,logger:this.logger,allowNotActionableNodesOverride:n}),l={id:-1,dataMomenticId:a,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...c};return this.logger.debug({target:l},"Tied backend ID to HTML node"),{target:l,locator:s}}async performTargetRedirection(e,r){try{return await X(this.performTargetRedirectionHelper(e,r),{milliseconds:ie})}catch(n){r.warn({err:n},"Error performing target redirection, using original element");return}}async performTargetRedirectionHelper(e,r){let n=Date.now(),{locator:o,originalElementLocationResult:i}=e,a=await o.boundingBox({timeout:ie});if(!a){r.warn(`Attempted to click on element with no bounding box: ${i?.serializedElement}`);return}let{x:s,y:c,width:l,height:u}=a,d=this.getViewport();if(s<0||c<0||!d||s+l>d.width||c+u>d.height){r.info("Skipping locator redirection because the element is outside the viewport");return}let p=await this.getActivePageOrFrame(),{dataMomenticId:m,mPathSelector:g,error:h,serializedElement:f,foundElementRelativePoint:S,force:b,logs:y}=await o.evaluate(w=>{let P=window;if(!P.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return P.performTargetRedirection(w)},void 0,{timeout:Ke}),T=Date.now()-n;if(h){r.warn({error:h,serializedElement:f,duration:T,force:b,logs:y},"Got error from target redirection with bounding box");return}else{if(m)return r.info({newDataMomenticId:m,serializedElement:f,duration:T,force:b,logs:y},"Redirected target to new element with bounding box with data-momentic-id"),{locator:p.locator(ui(m)),originalElementLocationResult:void 0,serverSideBoundingBox:null,hints:{relativeXYToLocator:S,force:b}};if(g)return r.info({newMPathSelector:g,serializedElement:f,duration:T,force:b,logs:y},"Redirected target to new element with bounding box with mPath"),{locator:p.locator(g),originalElementLocationResult:void 0,serverSideBoundingBox:null,hints:{relativeXYToLocator:S,force:b}};if(S)return r.info({foundElementRelativePoint:S,serializedElement:f,duration:T,force:b,logs:y},"Chose specific visible point on original element"),{locator:o,originalElementLocationResult:i,serverSideBoundingBox:await o.boundingBox({timeout:ie}),hints:{relativeXYToLocator:S,force:b}};if(b)return r.info({serializedElement:f,duration:T,force:b,logs:y},"Forcing click on original element"),{locator:o,serverSideBoundingBox:await o.boundingBox({timeout:ie}),originalElementLocationResult:i,hints:{force:b}}}}async fetchHtmlAttributes({locator:e,logger:r=this.logger,originalElementLocationResult:n,allowNotActionableNodesOverride:o}){let{hybridSelectorMode:i,showZeroOpacityElements:a}=this.userControlledBrowserSettings,s=await e.evaluate((c,l)=>{let u=window;return u.generateHtmlCacheAttributes?u.generateHtmlCacheAttributes(c,l):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},{generateHybridSelector:i==="test"||i==="prefer",originalElementLocationResult:n,showZeroOpacityElements:o?!0:a},{timeout:rt});if("error"in s&&s.error)throw s.error.startsWith(xN)?new Ci(s.error):s.error.startsWith(_N)?new vp(s.error):new Error(s.error);return s.warnings.length&&r.warn(s,"Got warnings while generating HTML attributes for target"),s.attributes}async moveMouseFromPositionPercentages(e,r){let n=this.getViewport();if(!n)throw new Error("Cannot move mouse using percentages without viewport");let o=Math.ceil(n.width*e),i=Math.ceil(n.height*r);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseMoved",x:o,y:i,button:"left",clickCount:0}}),{x:o,y:i}}async clickMouseFromPositionPercentages(e,r,n){let o=this.getViewport();if(!o)throw new Error("Cannot click mouse using percentages without viewport");let i=Math.ceil(o.width*r),a=Math.ceil(o.height*n);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:e==="down"?"mousePressed":"mouseReleased",x:i,y:a,button:"left",clickCount:e==="down"?1:0},timeout:Ke})}async scrollFromPositionPercentages(e,r,n,o){let i=this.getViewport();if(!i)throw new Error("Cannot scroll using percentages without viewport");let a=Math.ceil(i.width*e),s=Math.ceil(i.height*r);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseWheel",deltaX:a,deltaY:s,x:n,y:o}}),{deltaX:a,deltaY:s}}canSolveCaptchas(){return!!kN}async getAllFrameUrls(){return await this.stateManager.getAllChildFrameUrls()}async setFileChooserHandler(e){setTimeout(()=>{try{e.cleanup()}catch(r){this.logger.debug({err:r,filePath:e.filePath},"Failed cleaning up file after upload")}},3e4),await this.setFileChooserHandlerHelper(e)}logToUserConsole(e,r,n,...o){let i=this.context.pages().indexOf(e);i=i===-1?0:i,gT(e,this.debugData,i,{type:r,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:r}){if(!vh(e)){let c=`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`;this.logger.warn(c),this.logToUserConsole(this.page,"error",c);return}let n=r?.trim()||i0(e),o=QJ(e),i=i6(e),a=Au[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!vh(e))throw new Error(`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`);await c.setFiles({name:n,buffer:o,mimeType:n6.getType(e)||"application/octet-stream"},{timeout:uh})}catch(l){this.logger.error({err:l},"Error handling file chooser"),this.logToUserConsole(this.page,"error",l.message)}});let s=o.toString("base64");await this.evaluateFunctionInPage(({fileName:c,base64Data:l,mimeType:u})=>{let d=window;d.momenticFileName=c,d.momenticFileBase64=l;let p=atob(l),m=new Array(p.length);for(let h=0;h<p.length;h++)m[h]=p.charCodeAt(h);let g=new Uint8Array(m);d.MomenticFile=class extends Blob{kind="file";name=d.momenticFileName;constructor(){super([g],{type:u})}isSameEntry(h){return h.name===this.name}queryPermission(h){return console.info("[MOMENTIC] MomenticFile.queryPermission called"),Promise.resolve("granted")}remove(){return console.info("[MOMENTIC] MomenticFile.remove called"),Promise.resolve()}async requestPermission(h){return console.info("[MOMENTIC] MomenticFile.requestPermission called"),Promise.resolve("granted")}async getFile(){console.info("[MOMENTIC] MomenticFile.getFile called");let h=new Blob([g]);return new File([h],d.momenticFileName,{type:u})}async createSyncAccessHandle(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}async createWritable(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}},d.showOpenFilePicker=async()=>(console.info("[MOMENTIC] showOpenFilePicker called"),[new d.MomenticFile])},{fileName:n,base64Data:s,mimeType:a},"set-file-chooser-handler",5e3)}getSerializedFormFromA11yId(e){return this.stateManager.a11yIdToNodeMap[e]?.getNodeOnlySerializedForm()}retrieveAndClearDebugData(){this.cdpClient.loadEventLogs.length>0&&(this.cdpClient.loadEventLogs=[]);let r={...this.debugData};return this.debugData={logsPerPage:[]},r}async copy(e){try{await this.evaluateFunctionInPage(r=>navigator.clipboard.writeText(r),e,"copying text to clipboard")}catch(r){if(r instanceof Error&&r.message.includes("Document is not focused")){await this.evaluateFunctionInPage(()=>{document.activeElement||document.body.focus()},void 0,"focusing on body element before copying to clipboard"),await this.press("Tab",{}),await this.press("Shift+Tab",{}),await this.evaluateFunctionInPage(n=>navigator.clipboard.writeText(n),e,"copying text to clipboard");return}throw r}}async paste(){await this.waitForPageLoad(),await this.press("Meta+V",{convertMeta:!0})}async registerRequestListener(e){return this.page.waitForResponse(r=>{let n=r.request();return e.matches({url:n.url(),method:n.method()})})}registerRequestRecorder(e,r){this.requestRecorders[e]=r}removeRequestRecorder(e){delete this.requestRecorders[e]}setHeader(e,r,n){this.customHeaders.push({key:e.toLowerCase(),value:r,matcher:n})}registerMock(e,r,n,o){let i=e??Th();return this.mocks[i]={matcher:r,generateResponse:n,fetchOriginalResponse:o},i}removeMock(e){if(!e){this.mocks={};return}delete this.mocks[e]}async setOfflineMode(e){await this.context.setOffline(e)}get smartWaitingTimeout(){return this.userControlledBrowserSettings.smartWaitingTimeoutMs??ON}get userBrowserSettings(){return vd(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??rc}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=gh();for(let r of e)if(!(!vh(r)||!n0(r).isDirectory()||!["new","pending","completed"].some(o=>{let i=a6(r,o);return vh(i)&&n0(i).isDirectory()&&e6(i).length>0})))return r}};import U6 from"fetch-cookie";import{cloneDeep as k0}from"lodash-es";import{CookieJar as F6}from"tough-cookie";import{AsyncLocalStorage as l6}from"async_hooks";function Ah(){let t=new l6;function e(s){t.enterWith({activeTracers:[s]})}function r(s,c){return t.run({activeTracers:[s]},c)}async function n(s,c){return t.run({activeTracers:[s]},c)}function o(s,c){let l=t.getStore()?.activeTracers;if(!l)return c();l.push(s);try{return c()}finally{l.pop()}}async function i(s,c){let l=t.getStore()?.activeTracers;if(!l)return c();let u=[...l,s];return t.run({activeTracers:u},c)}function a(s){let c=t.getStore()?.activeTracers;return(c?.length?c[c.length-1]:void 0)??s()}return{globalAls:t,initializeRootTracerContext:e,runWithRootTracer:r,runWithRootTracerAsync:n,withChildTracer:o,withChildTracerAsync:i,getActiveTracer:a}}var a0=Ah();var di=Ah();var s0=["signal","timeoutMs","timeoutMsg"],pi=class t{spans;parentSection;finished=!1;startTime;endTime;constructor(e){this.startTime=e?.startTime??Date.now(),this.spans=e?.subSpans??[],this.parentSection=e}finish(){if(!this.finished){this.endTime=Date.now();for(let e of this.spans)e.endTime||(e.endTime=this.endTime,e.durationMs=e.endTime-e.startTime);this.parentSection&&(this.parentSection.endTime=this.endTime,this.parentSection.durationMs=this.parentSection.endTime-this.parentSection.startTime),this.finished=!0}}addSpan(e){this.spans.push(e)}startSpan(e,r,...n){let o={type:e,startTime:Date.now(),endTime:void 0,attributes:{}},i=n[0]??void 0;Object.assign(o,i??{});for(let a of s0)a in o&&delete o[a];this.addSpan(o);try{let a=r(o);return o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,a}catch(a){throw o.error=a instanceof Error?a.message:String(a),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,a}}async startAsyncSpan(e,r,...n){let o={type:e,startTime:Date.now(),endTime:void 0,attributes:{},subSpans:[]},i=n[0]??void 0;Object.assign(o,i??{});for(let s of s0)s in o&&delete o[s];this.addSpan(o);let a=new t(o);try{let s=await di.withChildTracerAsync(a,()=>r(o));return o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,s}catch(s){throw o.error=s instanceof Error?s.message:String(s),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,s}}getRootSpan(){return this.finished||this.finish(),{type:"SECTION",name:"root step span",startTime:this.startTime,endTime:this.endTime,subSpans:this.spans,attributes:{},durationMs:this.endTime?this.endTime-this.startTime:void 0}}};function Ss(){return di.getActiveTracer(()=>new pi)}import{randomUUID as c6}from"crypto";async function c0({codePath:t,screenshotBuff:e,storage:r,logger:n}){if(e)try{let o=c6(),i=await r.createOnDemandScreenshot(o,e,"image/jpeg");return n.info({screenshotUrl:i.appServerUrl,codePath:t},"Saved screenshot for debugging"),i.appServerUrl}catch(o){n.error({err:o,codePath:t},"Failed to save screenshot for debugging")}}var u6=["Element exactly matching the description below. Interpret the description narrowly and do not assume there are any typos or errors. Err on the side of returning -1 unless there is a perfect match. Description:","Element closely matching the description below. Interpret the description narrowly and do not return elements that are merely loosely related. Description:","Element matching the description below. This element is being located as part of a negative check step (i.e. we are trying to verify the element does not exist). Therefore, interpret the description narrowly, do not assume there are typos, and err on the side of returning -1 unless there is a perfect match. Description:"],u0="<select> element:",d0="text input or contenteditable element:",p0="Element matching the description below. It is possible the element is hidden or doesn't exist. Interpret the description narrowly and do not assume there are typos. Return -1 unless there is an straightforward match. Description:",m0="Element matching the description below. This element is being located as part of a check step (i.e. we are trying to verify certain properties about the element). Interpret the description narrowly and do not return elements that are merely loosely related. Description:",jT=[u0,d0,p0,m0,...u6];function g0(t,e){if(t===e)return!0;for(let r of jT){if(!t.startsWith(r))continue;let n=t.slice(r.length).trim();if(jT.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!jT.some(r=>e.startsWith(r)&&e.slice(r.length).trim()===t.trim())}function h0(t,e){if(!t||!e)return t;switch(e){case"SELECT_OPTION":return`${u0} ${t}`;case"TYPE":return`${d0} ${t}`;case"NEGATED_ELEMENT_VISIBLE_CHECK":return`${p0}
|
|
4606
4606
|
${t}`;case"ELEMENT_CHECK":return`${m0}
|
|
4607
|
-
${t}`;default:return t}}async function Vn({frameConfig:t,action:e,browser:r}){let n=r.getActiveFrameConfig();t?r.setActiveFrameConfig(t):n?.type==="auto"&&r.setActiveFrameConfig(void 0);try{return await e()}finally{r.setActiveFrameConfig(n)}}var d6=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function f0({beforeUrl:t,beforePages:e,browser:r,command:n,logger:o}){if(d6.includes(n.type))return;let s=("cache"in n&&n.cache&&"target"in n.cache?n.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??!1?300:3e3,c=Date.now(),l=0;for(;l===0||Date.now()-c<s;){await
|
|
4607
|
+
${t}`;default:return t}}async function Vn({frameConfig:t,action:e,browser:r}){let n=r.getActiveFrameConfig();t?r.setActiveFrameConfig(t):n?.type==="auto"&&r.setActiveFrameConfig(void 0);try{return await e()}finally{r.setActiveFrameConfig(n)}}var d6=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function f0({beforeUrl:t,beforePages:e,browser:r,command:n,logger:o}){if(d6.includes(n.type))return;let s=("cache"in n&&n.cache&&"target"in n.cache?n.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??!1?300:3e3,c=Date.now(),l=0;for(;l===0||Date.now()-c<s;){await fe(250),l++;let u=(await r.getOpenPages()).map(p=>p.url),d=r.url();if(u.length!==e.length)for(let p=u.length-1;p>=e.length;p--){let m=u[p];if(is(m,o)&&m!==t&&m!==d){o.info({beforePages:e,afterPages:u,beforeUrl:t},"Auto-following new tab after preset action"),await r.switchToPage({type:"INDEX",index:String(p)});break}}}}async function Uo(t,e={}){let r=await t.getBrowserState(e);return{serializedTree:r.serialize(e.serializationOpts),tree:r}}var S0=t=>!!t&&Ds(t),y0=t=>{let{cache:e,description:r,disableSecondaryCacheResolution:n,logger:o}=t,i=e,a=!1;return i&&n&&i.targetSource==="HEURISTIC_HEALED"&&(a=!0,i=void 0),i?.inputDescription&&!g0(r,i.inputDescription)&&(o.warn({old:i.inputDescription,new:r},"Target cache was generated with a different description, clearing it automatically"),a=!0,i=void 0),{cache:i,cacheBustedBeforeAction:a}};import{randomUUID as S6}from"crypto";var E0={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},T0={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},b0=/<(\S+) id="(\d+)".*?>/g,p6=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,v0=["h1","h2","section","footer","nav","aside","form","label","dialog"],m6=[...v0,"span","div","h3"],g6=["table","select","form","ul","ol","menu","pre","code","dialog"],h6=["table","form","dialog","nav","section","ul","select"];function Rh(t){return f6(t)}function f6({logger:t,serializedTree:e,options:r}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=r,s=[],c=e.split(`
|
|
4608
4608
|
`),l=0,u=[],d=0,p=[],m=[],g=!1;for(;l<c.length;){g&&(s.push({ids:p,content:u.join(`
|
|
4609
4609
|
`),tokenLength:d}),u=[],d=0,p=m.length?[m[m.length-1].id]:[],g=!1);let h=c[l],f=We(h);d+=f,h.length>a&&(h=h.slice(0,a));let y=Array.from(h.matchAll(b0)).map(B=>B&&B.length>=3?{tagName:B[1],id:B[2]}:void 0).filter(B=>!!B),w=Array.from(h.matchAll(p6)).map(B=>B&&(B[2]||B[4])).filter(B=>!!B);w.reverse();let P=h.replace(/ id="[0-9]+"/g,"");u.push(P);for(let B of y)p.push(B.id),m.push(B);for(let B of w){let xe=m[m.length-1];xe&&xe.tagName===B&&m.pop()}let A=m.some(B=>g6.includes(B.tagName)),x=c[l+1]??"",O=We(x),N=Array.from(x.matchAll(b0)).map(B=>B&&B.length>2?B[1]:void 0).filter(B=>!!B),j=N.some(B=>v0.includes(B)),W=N.some(B=>m6.includes(B));d+O>=i&&(g=!0),d>=n&&(j&&!A||w.some(B=>h6.includes(B)))&&(g=!0),d>=o&&W&&!A&&(g=!0),l++}return u.length&&s.push({ids:p,content:u.join(`
|
|
4610
|
-
`),tokenLength:d}),s.forEach((h,f)=>{let S=h.ids[0],b=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:S,maxId:b},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var y6=75e4,Ch=3e5;async function ys(t){let{options:e,fixtures:r,screenshot:n}=t,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:s,signal:c}=r,l=t.tree,u=t.serializedTree,d=We(u);if(d>y6)try{let p=Rh({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await E6({...t,tokenLimit:Ch-1e4,chunks:p.chunks}),u=l.serialize();let m=We(u);i.info({oldTokens:d,newTokens:m},"Filtered page using keywords"),d=m}catch(p){i.warn({err:p},"Error filtering page using keyword matching, using naive truncation"),l=l.pruneToSerializedCharLimit(Ch*qi),u=l.serialize();let m=We(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>Ch)try{if(o){let p=Rh({serializedTree:u,options:T0,logger:i}),m=S6();l=await X(b6({...t,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let g=We(u);i.info({oldTokens:d,newTokens:g,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=g}else{let p=Rh({serializedTree:u,options:E0,logger:i});l=await X(T6({...t,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=We(u);i.info({oldTokens:d,newTokens:m},"Filtered page using RAG"),d=m}}catch(p){i.warn({err:p},"Error filtering page using RAG/AI, using naive truncation"),l=l.pruneToSerializedCharLimit(Ch*qi),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function b6({type:t,callId:e,chunks:r,description:n,fixtures:o,tree:i}){let{generator:a,signal:s,logger:c}=o,l=await a.rankChunksWithAi({chunks:r,description:n,type:t,softTokenLimit:4e4,hardTokenLimit:8e4,callId:e},{abortSignal:s,logger:c,loggerTags:et(c)}),u=[];return r.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function E6(t){let{description:e,fixtures:r,tree:n}=t,{generator:o,logger:i,signal:a}=r;if(!e.trim())throw new Error("Empty description passed to page filtering");let s=await o.getExtractedKeywords({goal:e},{logger:i,loggerTags:et(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let c of s.keywords){let l=t.chunks.filter(m=>m.content.toLowerCase().includes(c.toLowerCase()));if(!l.length||l.reduce((m,g)=>m+g.tokenLength,0)>t.tokenLimit&&l.length>1)continue;let d=l.flatMap(m=>m.ids);return n.pruneUsingRelevantIds(new Set(d))}throw new Error("No keywords were unique enough for page filtering")}async function T6(t){let{description:e,fixtures:r,chunkResult:n,tokenLimit:o,tree:i}=t,{generator:a,logger:s,signal:c}=r,l=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:c,logger:s,loggerTags:et(s)});if(l.ids.length===0)throw new Error("RAG returned no important ids");return i.pruneUsingRelevantIds(new Set(l.ids.map(d=>`${d}`)))}async function GT(t,e){if(!t.description)throw new M("UserConfigurationError","Cannot locate element with empty description");return Vn({action:async()=>v6(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function v6(t,e){let{disableCache:r,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:c,logger:l,allowNotActionableNodesOverride:u,skipSavingVisualAttributes:d}=t,{orgId:p,browser:m,localCodeEvalTools:g,generator:h,abortSignal:f}=e,S=t.description,b=Ss(),y=t.useMemory&&!r;n&&(S=await qr({orgId:p,s:S,context:n,localTools:g,signal:f,logger:l})),a&&(S=h0(S,a));let{serializedTree:T,tree:w}=await b.startAsyncSpan("GET_PAGE_STATE",async()=>Uo(m,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),{}),P=await b.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let F,z=Date.now(),ae;for(;!F&&Date.now()-z<3e3;){f.throwIfAborted();try{F=await m.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(ue){ae=ue}}if(!F)throw new M("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${ae?.message}`);return F}),A=T,x=!1,L=`data:image/jpeg;base64,${P.toString("base64")}`;A=await ys({type:"locator",description:S,screenshot:L,serializedTree:T,options:{aiPageFiltering:c},tree:w,fixtures:{generator:h,signal:f,logger:l,orgId:p}}),A!==T&&(x=!0);let N=await b.startAsyncSpan("AI_LOCATOR_CALL",async F=>{let z=await h.getElementLocation({browserState:A,goal:S,screenshot:L,source:a,memory:y?s:void 0},{disableCache:r,abortSignal:f,loggerTags:et(l),useMemory:y});return F.result=z,z});if(l.debug({usedRag:x,result:N},"Got locator result"),!(N.id>0))throw new qs(`Could not find any relevant element: ${N.thoughts}`,N.updatedMemory?{type:"GCS_TRACES",traces:N.updatedMemory}:void 0);let{resolution:W,target:B,frameConfig:xe}=await b.startAsyncSpan("TARGET_RESOLUTION",async F=>{let z=await m.createTargetFromA11yId({id:N.id,requirements:N.requirements,additionalElements:N.additionalElements,description:S,targetSource:"AI",logger:l,skipSavingVisualAttributes:d});return F.result={serializedElement:z.target.nodeOnlySerializedHtml??"Unknown HTML element"},z});if(W.a11yNode?.properties?.hidden&&W.a11yNode?.properties?.hidden!=="false")throw new M("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${W.displayString}`);return y&&(N.updatedMemory?B.memory={type:"GCS_TRACES",traces:N.updatedMemory}:s&&(B.memory=s)),{thoughts:N.thoughts,target:B,resolution:W,frameConfig:xe,screenshot:L}}var A6=15;async function wh({command:t,aiPageFiltering:e,logger:r,fixtures:n,useMemory:o,maxRetries:i=A6}){if(!t.assertion.trim())throw new M("ActionFailureError","Assertion command is missing the assertion content");let a=wS.optional().catch(void 0).parse(t.source);t.source&&!a&&r.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let{browser:s}=n,c=t.timeout?t.timeout*1e3:s.smartWaitingTimeout,l=KO(c,i-1),u=0,d=Date.now(),p=d+c,m=d,g,h,f;try{await Vn({action:()=>s.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:s,logger:r})}catch(S){r.warn({err:S},"Failed to clear highlights before AI check, continuing...")}for(;u<i;){n.abortSignal.throwIfAborted();let S=Date.now();if(u>0){if(S>=p)break;let T=p-S,w=m-S,P=Math.min(w,T);P>0&&await Se(P,n.abortSignal)}let b=Date.now();if(u>0&&b>=p)break;let y=!1;try{if(g=await Vn({action:async()=>{let w=await A0(s,r,n.abortSignal);return h&&h.serializedTree===w.serializedTree&&h.screenshotBuff.equals(w.screenshotBuff)?(y=!0,g):(h=w,R0({command:t,state:w,fixtures:n,useMemory:o,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:r,source:a}))},frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:s}),g?.success){g?.updatedMemory&&od(t,g.updatedMemory,r);break}else throw g?.thoughts?new M("AssertionFailureError",g.thoughts):new M("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(T){n.abortSignal.throwIfAborted(),f=T instanceof Error?T:new Error(`${T}`),y?r.info(`AI check attempt ${u} failed (re-used previous result)`):r.info({err:T},`AI check assert attempt ${u} failed, retrying...`)}finally{u++,m=b+l}}if(!g?.success){let S=p-Date.now();S>0&&await Se(S,n.abortSignal)}if(!g?.success)try{g=await Vn({action:async()=>R0({command:t,state:await A0(s,r,n.abortSignal),fixtures:n,useMemory:o,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:r}),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:s})}catch(S){n.abortSignal.throwIfAborted(),f=S instanceof Error?S:new Error(`${S}`)}finally{u++}if(g?.updatedMemory&&od(t,g.updatedMemory,r),!g?.success){let S=`AI check still failing after ${u} attempts.`;throw f&&(S+=` Latest result: ${f.message}`),new M("AssertionFailureError",S)}return{...g,succeedImmediately:!1,urlAfterCommand:s.url()}}async function A0(t,e,r){let[n,o]=await Promise.all([Uo(t,{abortSignal:r,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),t.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function R0({command:t,state:e,fixtures:r,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:p}=r,m={type:"ASSERTION"},{serializedTree:g,tree:h}=e,f=e.screenshotBuff,S=f.toString("base64"),b=u.url(),y=t.contextChoice??"MULTIMODAL",T=g;y!=="VISION_ONLY"&&(T=await ys({type:"assertion",serializedTree:g,tree:h,description:t.assertion,screenshot:S,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:r.orgId}}),T!==g&&(m.ragUsed=!0),m.pageState=T);let w={goal:t.assertion,url:b,memory:o?t.cache?.memory:void 0,browserState:T,screenshot:S,contextChoice:y,source:c},A=await(y==="VISION_ONLY"?(x,O)=>d.getVisualAssertionResult(x,O):(x,O)=>d.getAssertionResult(x,O))(w,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!t.disableCache,abortSignal:p,logger:l,loggerTags:et(l)});return(A.result||i)&&A.relevantElements&&(m.relevantElementsSerialized=A.relevantElements.map(x=>u.getSerializedFormFromA11yId(x)).filter(x=>!!x),await R6(A.relevantElements,u,l)),{success:A.result,thoughts:A.thoughts,afterScreenshotOverride:f,updatedMemory:o?A.updatedMemory:void 0}}async function R6(t,e,r){let n=Date.now();for(let o of t){if(Date.now()-n>2e3){r.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await X(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){r.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var C6=1e5,xh=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function C0(t,e){let{logger:r}=t,{abortSignal:n,browser:o}=e,i=Date.now();try{await w6(i,t,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof xh?r.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):r.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await Se(s,n)}finally{r.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function w6(t,e,r){let{abortSignal:n,browser:o}=r;if(o.smartWaitingTimeout<3e3){await Se(o.smartWaitingTimeout,n);return}if(!e.description)throw new M("UserConfigurationError","Cannot locate element with empty description");await X(x6(t,e,r),{milliseconds:o.smartWaitingTimeout})}async function x6(t,e,r){let{logger:n,iframeUrl:o}=e,{browser:i}=r;for(;Date.now()-t<i.smartWaitingTimeout;)if(await Vn({action:async()=>_6(e,r),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function _6(t,e){let{testContext:r,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=t,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=t.description;r&&(d=await qr({orgId:l,s:d,context:r,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await Uo(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(We(p)>C6)throw new xh;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(b){throw new M("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: ${b instanceof Error?b.message:b}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let S=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:et(n)});return n.debug({result:S},"Got smart waiting result"),S.isPageReady}import{cloneDeep as x0}from"lodash-es";async function _0(t){let{command:e,timeoutMs:r,fixtures:n}=t,{abortSignal:o}=n,i=()=>cp(e.cache)?e.cache:void 0,a=i(),s=x0(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=nE(s,a);a.target=f.target,a.updatedAt=f.updatedAt}else{if(!s){a=void 0;return}a.target=s.target,a.updatedAt=s.updatedAt}},l=Date.now(),u=0,d,p=500,m=!1;for(;u<2||Date.now()-l<r;){u++,u>1&&await Se(p,o),o?.throwIfAborted(),a=i();let{result:h,elementWasFound:f}=await w0({cacheToUse:a,params:t});if(d=h,m=f,h.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new M("InternalPlatformError",`Failed to evaluate manual element assertion in ${r}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&Ds(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await w0({cacheToUse:h,params:t});d=f,d.success||c(!0)}let g=i();return d.success&&g?.target&&!m&&(g.target=nd(g.target),g.updatedAt=new Date),d}async function w0({cacheToUse:t,params:e}){let{command:r,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(r.target&&!vi(r.target))throw new Error("Element assertion with x/y is not supported yet");let c=HM(r.assertion),l,u=!1,d=x0(t);try{let{elementInteractedDisplayString:p,result:m,thoughts:g}=await a({ctx:o.ctx,tracer:i,command:r,target:r.target,cache:d?.target,action:async h=>I6(h.locator,e),options:{...r,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Oa(r),targetName:"target"}});return l={success:m.success,data:m.data,err:m.err,elementInteractedDisplayString:p,thoughts:g},u=!0,m.success||(s.warn({aiThoughts:g,elementString:p,err:m.err},"Element check found an element but failed"),l={...m,thoughts:g}),{result:l,elementWasFound:u}}catch(p){if(c)return l={success:!0,thoughts:`The element described does not exist on the page: ${p.message}`,err:void 0,data:void 0},{result:l,elementWasFound:u};if(!(p instanceof M)||p.reason!="ActionFailureError")throw p;return l={success:!1,err:p,data:void 0,thoughts:void 0},s.warn({err:p},"Element check did not find an element and failed"),{result:l,elementWasFound:u}}}async function I6(t,{command:e,fixtures:r}){return await r.browser.highlight(t),await P6(t,e.assertion)}async function P6(t,e){let r=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await t.textContent()??"";if(o={elementTextContent:Tt(a,500,!0)},!td(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Dl(e);r=!1,n=new M("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:Tt(await t.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a=null;try{a=await t.getAttribute(e.attr,{timeout:3e3})}catch(s){n=new M("AssertionFailureError",s instanceof Error?s.message:String(s)),r=!1;break}if(!td(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Dl(e);r=!1,e.operation==="EXISTS"?n=new M("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new M("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{r=await t.evaluate(async(s,c)=>{let l=Date.now();for(;Date.now()-l<c;){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},mo*1e3);break}case"EDITABLE":{r=await t.isEditable({timeout:mo*1e3});break}case"EXISTS":{r=!0;break}case"ENABLED":{r=await t.isEnabled({timeout:mo*1e3});break}case"FOCUSED":{r=await t.evaluate(s=>s===document.activeElement);break}default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.condition)}if(r=e.negated?!r:r,!r){let a=Dl(e);n=new M("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!td(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=Dl(e);r=!1,n=new M("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await t.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!td(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Dl(e);r=!1,e.operation==="EXISTS"?n=new M("AssertionFailureError",`The style property ${e.property} ${s}`):n=new M("AssertionFailureError",`The style property ${e.property} ${s} '${e.value}': ${a}`)}break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}return{thoughts:void 0,success:r,data:o,err:n}}function I0(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}import{Jimp as M6}from"jimp";async function Ad(t,e){let r=await t.screenshot(e),n=await M6.fromBuffer(r);return{buffer:r,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as P0}from"jimp";import VT from"jpeg-js";import O6 from"pixelmatch";async function M0({ctx:t,tracer:e,command:r,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(r.target&&!vi(r.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForStability({logger:a});let c={clearHighlights:!0,hideCaret:!0},l;r.target?.elementDescriptor?l=(await i({ctx:t,tracer:e,command:r,target:r.target,cache:r.cache?.target,action:async N=>Ad(o,{locator:N.locator,...c}),options:{...r,disableCache:n,disableGlobalLocatorRedirect:!0,memory:r.cache?.target?.memory,targetName:"target"}})).result:l=await Ad(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,r,l);if((l.height!==u.height||l.width!==u.width)&&a.warn({currHeight:l.height,currWidth:l.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-u.height)>10||Math.abs(l.width-u.width)>10){let L=`${l.width}x${l.height}`,N=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${L}) does not match saved screenshot dimensions (${N}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await P0.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await P0.fromBuffer(u.buffer),g={width:u.width,height:u.height},h,f=p.width*p.height,S=g.width*g.height,b=Math.abs(p.height-g.height),y=Math.abs(p.width-g.width);if(f>S){let L=d.cover({w:g.width,h:g.height});l.buffer=await L.getBuffer("image/jpeg"),h="current",l.width=g.width,l.height=g.height}else if(S>f){let L=m.cover({w:p.width,h:p.height});u.buffer=await L.getBuffer("image/jpeg"),h="saved"}let T={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},w=r.threshold??.1,A=O6(VT.decode(u.buffer).data,VT.decode(l.buffer).data,T.data,l.width,l.height,{threshold:w,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,x=A>w*100,O=`Visual diff of ${A.toFixed(2)}% detected, which is ${x?"over":"under"} the threshold of ${w*100}%.`;if(h&&(O+=` The ${h} screenshot was cropped since it was taller by ${b} pixels and wider by ${y} pixels.`),x)throw new M("ActionFailureError",O);return{fail:x,thoughts:O,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:VT.encode(T,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var L6=3e4;function N6(t){if(!t.body)return{};switch(t.body.type){case"json":return{content:t.body.content,contentType:"application/json"};case"form-urlencoded":{let e=new URLSearchParams;return Object.entries(t.body.content).forEach(([r,n])=>{e.append(r,n)}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function O0({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??L6/1e3,i=Object.fromEntries(Object.entries(t.headers||{}).filter(([g,h])=>g&&h)),a=new URLSearchParams;Object.entries(t.params||{}).filter(([g,h])=>g&&h).forEach(([g,h])=>{a.append(g,h)});let s=a.toString(),c;if(Gl(t.url)&&(c=t.url),r&&Vl(t.url,r)&&(c=new URL(t.url,r).toString()),!c)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let l=c;e.info({url:l,searchParams:s,headers:i,body:t.body,method:t.method},"Making HTTP request");let d=await X((async()=>{let g=s?`${l}?${s}`:l;try{let h=N6(t),f=new Headers(i);return h.contentType&&!f.has("Content-Type")&&f.set("Content-Type",h.contentType),await n(g,{headers:f,method:t.method,body:h.content})}catch(h){throw new Error(`Failed to make HTTP request: ${h}`,{cause:h})}})(),{milliseconds:o*1e3,fallback:()=>{throw new M("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let g;try{g=await d.text()}catch(h){g=`Failed to read response body: ${h}`}throw new M("ActionFailureError",`Fetch request failed with status ${d.status}: ${g}`)}let p={};d.headers.forEach((g,h)=>{p[h]=g});let m={status:d.status,headers:p,request:{url:d.url,method:t.method,headers:i}};if(t.body?.type==="json"&&t.body.content)try{m.request.json=JSON.parse(t.body.content)}catch{}if(d.headers.get("content-type")?.includes("json"))try{m.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(m.text=await d.text());return m}var D6=5e3;async function _h({timeout:t=mo,...e}){let r=Date.now(),n=t*1e3,o=n+1e4,i,a=0,s=500;for(;a-r<n;){if(Date.now()-r>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await L0(e),a=Date.now();let l=a-c;if(l>1e3&&e.logger.warn({pageAssertDuration:l},"Page assertion took longer than expected"),!i.success)await Se(s,e.signal),s=Math.min(Math.floor(s*1.5),D6);else return i}return i=await L0(e),i}async function L0({assertion:t,browser:e,autoExpandIframes:r}){switch(t.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(r){let c=await e.evaluateFunctionInAllFrames(N0,{value:t.value,negated:!!t.negated,returnHtml:!1});i=t.negated?c.every(l=>l.evaluation):c.some(l=>l.evaluation),s=c.find(l=>l.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(N0,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let c=t.negated?ti.CONTAINS:ri.CONTAINS;a=new M("AssertionFailureError",`The page ${c} '${t.value}'.`),o=s}}catch(s){a=new M("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`)}return{success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}function N0({value:t,negated:e,returnHtml:r}){let n=document.body.innerHTML,o=n.includes(t)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&r?n:void 0}}var k6=3e4;async function D0({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??k6/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Gl(t.url)&&(s=t.url),r&&Vl(t.url,r)&&(s=new URL(t.url,r).toString()),!s)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let l=await X((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:t.query,variables:t.variables?JSON.parse(t.variables):void 0}),signal:i.signal})}catch(d){throw new Error(`Failed to make HTTP request: ${d}`,{cause:d})}})(),{milliseconds:o*1e3});if(!l)throw new M("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!l.ok){let d,p=await l.text();try{d=JSON.parse(p)}catch{throw new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}let u={};return l.headers.forEach((d,p)=>{u[p]=d}),{status:l.status,headers:u,json:await l.json()}}var la=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:r,logger:n,storage:o,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:c,options:l}){this.orgId=i,this.options=l,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=c,this.localCodeEvalTools=a,this.generator=r,this.logger=n}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal)}setClosed(){this.executeAbortController.abort()}throwIfClosed(){this.executeAbortController.signal.throwIfAborted()}get closed(){return this.executeAbortController.signal.aborted}async evaluateAiAction({goal:e,startingScreenshot:r,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([Uo(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${l.toString("base64")}`,d=await ys({type:"ai-action",description:e,screenshot:u,serializedTree:c.serializedTree,tree:c.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),p={url:this.browser.url(),browserState:d,startingScreenshot:r,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...et(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:r,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([Uo(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 ys({type:"ai-action",description:e,screenshot:d,serializedTree:l.serializedTree,tree:l.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),m={url:c,browserState:p,startingScreenshot:r,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...et(a)},langfuseSessionId:s})}catch(g){throw new M("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return Uo(this.browser,e)}async locateElement(e){return await GT({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,r){return Vn({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:n}},frameConfig:r?{type:"url",url:r}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??(this.orgId==="org_01HMSCJQBCCG51M2ZF65YC5B8W"||this.orgId==="org_01HMJTX4GT1KG94KZRCT8MZ6YB")}async wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:o,descriptions:i,caches:a,action:s,options:c,retriesWithAI:l=1}){let u=[];for(let d=0;d<i.length;d++){let p=i[d],m=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:p,cache:a[d],action:async g=>g,options:{...c,targetName:o[d]}});u.push(m)}try{let d=await s(...u.map(g=>g.result)),p=g=>g==="fromTarget"?"From Target":g==="toTarget"?"To Target":"Target",m=u.map((g,h)=>g.thoughts?`${p(o[h])}: ${g.thoughts}`:void 0).filter(g=>!!g).join(" -------------- ")||void 0;return{result:d,elementInteractedDisplayStrings:u.map(g=>g.elementInteractedDisplayString),thoughts:m}}catch(d){if(this.throwIfClosed(),l>0)return this.logger.warn({err:d},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new M("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:r,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(r.type!=="description")throw new M("ActionFailureError","Cannot use selector with non-description target");let c,l=Date.now(),u=Date.now();for(;Date.now()-u<this.browser.smartWaitingTimeout;){l=Date.now();try{let d=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:r.elementDescriptor,targetName:s,logger:a});return{result:await n({locator:d.locator,originalElementLocationResult:void 0,serverSideBoundingBox:null}),elementInteractedDisplayString:d.displayString}}catch(d){if(d.name==="AbortError")throw d;c=d,a.warn({err:d},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await Se(500)}}throw c}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:r,disableGlobalLocatorRedirect:n,logger:o}=e,i=Ss(),a=!n&&this.browser.userBrowserSettings.globalLocatorRedirect!==!1;(this.browser.userBrowserSettings.visualActions||a)&&await i.startAsyncSpan("SCROLL_ELEMENT_INTO_VIEW",async()=>{await this.browser.scrollIntoViewIfNeeded(r.locator)});let s;return a&&(s=await i.startAsyncSpan("LOCATOR_REDIRECT",async()=>this.browser.performTargetRedirection(r,o))),s||(s={locator:r.locator,serverSideBoundingBox:await r.locator.boundingBox({timeout:ie}),originalElementLocationResult:r.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{ctx:r,cache:n,options:o,logger:i}=e,s=await Ss().startAsyncSpan("CACHE_RESOLUTION",async l=>{let u=await this.browser.resolveTarget(r,n,{allowNotActionableNodesOverride:o.allowNotActionableNodesOverride,logger:i,signal:this.executeAbortController.signal,...o.resolveTargetOptions});return l.attributes.targetDisplayString=u.displayString,u}),c=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:s,disableGlobalLocatorRedirect:o.disableGlobalLocatorRedirect,logger:i});return await s.revalidator?.(),{resolutionResult:s,finalTarget:c}}async wrapElementTargetingCommand(e){return await Vn({action:()=>this.wrapElementTargetingCommandHelper(e),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:this.logger})}async wrapElementTargetingCommandHelper(e){let{ctx:r,tracer:n,target:o,action:i,options:a,command:s,finalAttempt:c=!1,originalCache:l=e.cache}=e,{retriesWithAI:u=1}=e,{disableCache:d,useSelector:p,targetName:m}=a,g=Ss(),h=this.logger.child({commandId:s.id}),f=this.shouldUseMemory(),S=k0(e.cache);if((!S||d)&&!Nf(o))throw new M("ActionFailureError","Cannot target element with no cached data or element descriptor");if(p)return this.wrapHardcodedCssTargetingCommandHelper(e);let b=!1;d&&(h.info("Cache explicitly disabled for this step"),b=!0,S=void 0);let y=y0({cache:S,description:o.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:h});S=y.cache,b=b||y.cacheBustedBeforeAction;let T=!0;if(!S0(S))return u--,T=!1,this.executeTargetingCommandWithAI({ctx:r,tracer:g,stepTracer:n,target:o,options:a,command:s,action:i,originalCache:l,logger:h,useMemory:f,cacheBustedBeforeAction:b});try{let{resolutionResult:w,finalTarget:P}=await this.resolveCachedTargetForAction({ctx:r,cache:S,options:a,logger:h}),A=await i(P);if(ir.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.46.2"]),bg({cmd:s,key:m,newTarget:S,logger:h,updatedWithAI:!1}),T){let x=w.decisions.filter(O=>O.matched);if(x.length!==1)h.warn({decisions:w.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let O=x[0].type;n.recordTargetAutoHeal({healType:O})}}return{result:A,elementInteractedDisplayString:w.displayString}}catch(w){this.throwIfClosed();let P=Kf(w);if(P&&!c)return h.warn({err:w},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({ctx:r,tracer:n,command:s,target:o,action:i,cache:l,originalCache:l,retriesWithAI:u,finalAttempt:!0,options:a});if(w instanceof M&&!P)throw h.warn({err:w},"Failed to execute command with target (fatal)"),w;if(u>0&&o){h.info({err:w},"Failed to execute action with cached target, retrying with AI"),ir.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.46.2",`missReason:${w instanceof vn?w.cacheMissReason:"unknown"}`]);let A;return S.memory&&ip(S.memory)&&(A=S.memory),this.wrapElementTargetingCommandHelper({ctx:r,tracer:n,command:s,target:o,cache:void 0,action:i,originalCache:l,retriesWithAI:u,finalAttempt:!0,options:{...a,memory:A,targetHealingInProgress:!0}})}throw new M("ActionFailureError",`Failed to execute interactive command: ${w instanceof Error?w.message:`${w}`}`,{errOptions:{cause:w}})}}async executeTargetingCommandWithAI(e){let{ctx:r,tracer:n,stepTracer:o,target:i,options:a,command:s,action:c,originalCache:l,logger:u,useMemory:d,cacheBustedBeforeAction:p}=e;u.info({description:i.elementDescriptor,targetHealingInProgress:a.targetHealingInProgress,cacheBustedBeforeAction:p,memory:a.memory,useMemory:d},"Prompting AI for an updated element location"),(p||!l)&&await n.startAsyncSpan("SMART_WAITING",async()=>await C0({description:i.elementDescriptor,iframeUrl:a.iframeUrl,source:a.source,logger:u,allowNotActionableNodesOverride:a.allowNotActionableNodesOverride},this.getControllerFixtures(r)));let m=2;for(let g=1;g<=m;g++){let h=!1,f=this.browser.getActiveFrameConfig();try{let S;try{S=await GT({description:i.elementDescriptor,disableCache:!!a.disableCache,iframeUrl:a.iframeUrl,source:a.source,useMemory:d,memory:d?a.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:a.allowNotActionableNodesOverride,logger:u},this.getControllerFixtures(r))}catch(T){if(T instanceof qs&&T.updatedLocatorMemory){let w={id:-1,...l,memory:T.updatedLocatorMemory};bg({cmd:s,key:a.targetName,newTarget:w,logger:u,updatedWithAI:!0})}throw T}S.frameConfig&&(this.browser.setActiveFrameConfig(S.frameConfig),h=!0);let b=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:S.resolution,disableGlobalLocatorRedirect:a.disableGlobalLocatorRedirect,logger:u}),y=await c(b);return bg({cmd:s,key:a.targetName,newTarget:S.target,logger:u,updatedWithAI:!0}),a.targetHealingInProgress&&(o.recordTargetAutoHeal({healType:"AI"}),S.target.targetSource="AI_HEALED",S.target.targetUpdateTime=new Date().toUTCString(),S.target.targetUpdateLoggerTags=et(u)),{result:y,elementInteractedDisplayString:S.resolution.displayString,thoughts:S.thoughts}}catch(S){if(h&&this.browser.setActiveFrameConfig(f),this.throwIfClosed(),g<m&&Kf(S)){u.warn({err:S,aiAttempt:g},"Encountered retryable AI targeting error; retrying with AI once");continue}throw S instanceof M?S:new M("ActionFailureError",S.message)}}throw new M("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return Ad(this.browser,e)}async executePresetCommand(e,r,n,o,i){this.options?.slowMoMs&&await Se(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),c;try{c=await this.resolveCommandTemplateStrings(n,o)}catch(l){throw this.throwIfClosed(),new M("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,r,n,o,i);return this.options?.autoFollowNewTabs&&await f0({beforeUrl:s,command:n,beforePages:a.map(u=>u.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{wN(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>pT(e)}}async resolveCommandTemplateStrings(e,r){return ch({obj:e,context:r,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,r,n,o,i){i=i||"disableCache"in n&&!!n.disableCache;let a=this.logger.child({commandId:n.id});switch(n.type){case"SUCCESS":let s=n.condition;return s?.assertion.trim()?wh({command:s,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!n.assertion.trim())throw new M("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new M("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return wh({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new M("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let h=t_(n.schema);if(h)throw new M("UserConfigurationError",h)}let m=await this.browser.getCondensedHtml(),g=await this.browser.screenshot({retries:2});try{let h=await this.generator.getTextExtraction({goal:n.goal,browserState:m,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${g.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:et(a)});if(h.result==="NOT_FOUND")throw new M("ActionFailureError","No relevant data found for extraction goal on this page");if(h.thoughts?.includes("MaxGenerationLengthExceededError"))throw new M("UserConfigurationError",h.thoughts);return{thoughts:h.thoughts||void 0,data:h.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(h){let f=h.message;throw f.includes("MaxGenerationLengthExceededError")?new M("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new M("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:h}}):h}}case"NAVIGATE":if(!Gl(n.url)&&!Vl(n.url,this.browser.baseUrl))throw new M("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await 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 M("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let m,g;if(n.target&&uo(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:S,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:y=>this.browser.hover(y),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});m=S,g=b}let h=this.browser.getViewport()?.height??Ar.height,f=this.browser.getViewport()?.width??Ar.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??h));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??h);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??f));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??f);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new M("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new M("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let c=n.delay*1e3;await Se(c,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(uo(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let m=this.browser.url(),{elementInteractedDisplayString:g,result:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,target:n.target,command:n,cache:n.cache?.target,action:b=>this.browser.click(b,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f,data:h.downloadedFile?{downloadedFile:h.downloadedFile}:void 0};return Mg(m,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}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(uo(n.fromTarget)&&uo(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0});break}if(uo(n.fromTarget)||uo(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:m,thoughts:g}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(h,f)=>this.browser.dragAndDrop(h,f,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m[0],thoughts:g}}case"MOUSE_DRAG":{let m=parseInt(n.deltaX),g=parseInt(n.deltaY),h=n.steps??5;if(isNaN(m)||isNaN(g))throw new M("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&uo(n.target)){await this.browser.mouseDragUsingVisualCoordinates({deltaX:m,deltaY:g,steps:h,fromTarget:n.target.pixels});break}let f,S;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:b,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:async T=>this.browser.mouseDrag(m,g,h,T.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=b,S=y}else await this.browser.mouseDrag(m,g,h,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:S}}case"SELECT_OPTION":{if(!vi(n.target))throw new Error("Select with x/y is not supported yet");let m=n.target.elementDescriptor,g=n.choice,{elementInteractedDisplayString:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:{type:"description",elementDescriptor:m},cache:n.cache?.target,action:S=>this.browser.selectOption(S,g,n.force),options:{...n,targetName:"target",disableCache:i,source:Oa(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:f}}case"TAB":{let m={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,m);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"COOKIE":if(!n.value)break;let l=await this.browser.setCookie(n.value);a.debug({results:l},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let m;try{n.environment==="BROWSER"?(m=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:o.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),a.info({result:m},"Executed JavaScript in browser")):m=await ra({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:o,timeoutMs:n.timeout?n.timeout*1e3:void 0,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async g=>{if(!this.options?.scratchPadId){a.warn({updates:g},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:g,logger:a})}}})}catch(g){throw this.throwIfClosed(),new M("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(m)}catch(g){throw new M("ActionFailureError",`Return value is not serializable: ${g instanceof Error?g.message:`${g}`}`,{errOptions:{cause:g}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(n.target&&uo(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n),await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);break}let m=this.browser.url(),g,h,f=k0(n.target),S=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:y,thoughts:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:f,cache:n.cache?.target,action:w=>this.browser.typeIntoTarget(n.value,w,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),options:{...n,targetName:"target",disableCache:i,disableGlobalLocatorRedirect:!S,source:Oa(n)}});g=y,h=T}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let b={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:h};return Mg(m,b.urlAfterCommand)&&(b.succeedImmediately=!0,b.succeedImmediatelyReason="URL changed"),b}case"HOVER":{if(uo(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:h=>this.browser.hover(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"FOCUS":{if(!vi(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:h=>this.browser.focus(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"BLUR":{if(n.target&&!vi(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:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,target:n.target,command:n,cache:n.cache?.target,action:h=>this.browser.blur(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"PRESS":let u=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return Mg(u,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d;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 m=new F6,g=U6(fetch,m),h;try{h=new URL(n.url).hostname}catch{}let f=await O0({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g});return{data:Lc.parse({...f,cookies:cw(m,h)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await D0({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return M0({ctx:e,tracer:r,command:n,disableCache:i,browser:this.browser,logger:a,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,g;if(n.fileSource.type==="URL"?(g=n.fileSource.url,m=await zN({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(g=n.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!m)throw new M("UserConfigurationError",`Attempted to use non-existent file for upload step: ${g}`);await this.browser.setFileChooserHandler({...m,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!n.storageState.trim())m=void 0;else if(m=await ra({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof m!="object")throw new M("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let g;try{g=em.optional().parse(m)}catch(h){throw new M("ActionFailureError",`Credentials provided do not follow the required format: ${h}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let m=(n.timeout??mo)*1e3,g=this.generator.getAgentConfig()?.assertion;if(I0(n.assertion)&&!n.useSelector&&n.target.type==="description"&&g&&g!=="v1"){let f={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 S=await wh({command:f,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory()});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${S.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:S.afterScreenshotOverride}}finally{f.cache?.memory&&od(n,f.cache?.memory.traces,a)}}let h=await _0({command:n,tracer:r,timeoutMs:m,targetingWrapper:f=>this.wrapElementTargetingCommand(f),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!h.success,data:h.data,elementInteracted:h.elementInteractedDisplayString,thoughts:h.err?.message??h.thoughts??`Element assertion ${h.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let m=await Vn({action:async()=>_h({assertion:n.assertion,browser:this.browser,logger:a,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:a});return{fail:!m.success,data:m.data,thoughts:m.success?"Page assertion passed.":m.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let m=new ia(n.requestMatcher),g=this.browser.registerRequestListener(m);return this.registeredListeners[n.key]=g.then(async h=>await ST(h)).catch(h=>{a.error({err:h},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let m=this.registeredListeners[n.key];if(!m)throw new M("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await X(m,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=new ia(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:g=>m.matches({url:g.request.url,method:g.request.method}),onRequestStart:(g,h)=>{this.recordedRequests[n.key][g]=mh(h)},onRequestComplete:(g,h)=>{this.recordedRequests[n.key]?.[g]&&(this.recordedRequests[n.key][g]=mh(h))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[n.key];if(!m)throw new M("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(m),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let m;return n.requestMatcher&&(m=new ia(n.requestMatcher)),this.browser.setHeader(n.name,n.value,m),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new ia(n.requestMatcher),async(g,h)=>{let f=await ra({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:g,response:h},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),S=xw.parse(f);return new Response(S.body,{status:S.status,headers:S.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(m=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:r,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:r,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:et(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:r,isClickToRecord:n}){this.recordAbortController=r;let o=new bh({signal:r.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:et(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:et(this.logger)})}};var $T=async t=>{let{step:e,resolvedInputs:r}=t.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:s}=t.fixtures,c=s.browser,{orgId:l,runId:u}=t.inputs,d=s.executeAbortController.signal;Object.keys(r).length>0&&(o.setInputs(r),n.info(Ki({json:{inputs:r,moduleId:e.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,g,h;if(e.cacheConfig||e.defaultCacheAllInvocations){let f=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await qr({orgId:l,s:f,context:o,logger:n,localTools:a,signal:d});h={orgId:l,cacheKeys:[S,...Object.entries(r).map(([y,T])=>`${y}:${T}`)]},n.info({original:f,keyParams:h},"Module cache key params");let b=Date.now();for(;Date.now()-b<tx;){d?.throwIfAborted();let y=await i.getCacheResult(h);if(y){n.info({cacheResult:Tt(y,1e3,!0)},"Got result from module execution cache"),p=Ih(e,r,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(y),m=!0;break}else n.info({cacheKey:f,keyParams:h},"No cache result found, continuing with lock acquisition");let T=await i.acquireCacheLock({keyParams:h,clientMetadata:`hostName:${B6()};runId:${u}`},d);if(T.acquired){g=T.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:g,cacheKey:f,keyParams:h},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:g,cacheKey:f,keyParams:h},"Failed to acquire cache lock, retrying...");await Se(2500+Math.random()*1e4,d)}}try{if(!p)p=await z6(t);else if(e.autoAuth){let f=em.safeParse(p.data);if(!f.success)throw new M("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);n.debug("Automatically loading auth state after cached module result"),await c.loadAuthState(f.data);let S=!1,b=e.advanced?.cacheInvalidation;if(b&&b.type==="PAGE_CHECK"){let y={type:"CONTENT",value:b.substring},T=await _h({timeout:mo,assertion:y,browser:c,logger:n,signal:d,autoExpandIframes:!!c.userBrowserSettings.autoExpandIframes});T.success?n.debug({invalResult:T},"Cached result still valid after page check, continuing..."):(n.info({invalResult:T},"Invalidating cached result due to page check failure"),S=!0)}if(h&&S)return await i.deleteCacheResult(h),$T(t)}}finally{try{g!==void 0&&!m&&p?.status==="SUCCESS"&&await H6({step:e,result:p,browser:s.browser,cacheKeyPrefix:g,logger:n,storage:i})}finally{g!==void 0&&await i.releaseCacheLock(g)}}return p},z6=async t=>{let{step:e,tracer:r}=t.moduleParams,n=Ih(e,t.moduleParams.resolvedInputs,"SUCCESS"),o=await r.startSubSteps(),{status:i,results:a}=await t.executeStepList({...t,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}});return n.results=a,n.status=i,n.finishedAt=new Date,Hn({asyncTasks:t.work.asyncTasks,nestedResults:a,result:n,logger:t.fixtures.logger}),n};function Ih(t,e,r){let n={};return Object.entries(e).forEach(([i,a])=>{n[i]=JSON.stringify(a)}),{type:"MODULE",id:t.id,moduleId:t.moduleId,moduleName:t.name,startedAt:new Date,cacheConfig:t.cacheConfig,inputs:n,results:[],finishedAt:new Date,status:r}}async function U0({orgId:t,step:e,context:r,logger:n,codeEvalTools:o,signal:i}){let a={};try{for(let s of e.parameters??[]){let c=e.inputs?.[s]??e.defaultParameters?.[s];if(!c){n.warn(`No value or default found for parameter '${s}' that is required by module '${e.name}'`);continue}a[s]=await ra({orgId:t,code:c,fragment:!0,context:r,logger:n,localTools:o,signal:i})}return a}catch(s){throw i?.throwIfAborted(),new M("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function H6({step:t,result:e,browser:r,cacheKeyPrefix:n,logger:o,storage:i}){let a=t.cacheConfig?.cacheExpiryMs;(!a||a===Wx)&&(a=t.defaultCacheTtl??qx);let s;t.autoAuth?s=JSON.stringify(await r.saveAuthState()):e.data!==void 0?s=JSON.stringify(e.data):s='""',o.debug({cacheKeyPrefix:n,ttlMs:a,truncatedCacheResultJson:Ki({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function bs(t,e,r){return j6(t,e,r)}async function j6(t,e,r){let n=new Date;try{return r.throwIfAborted(),await e()}catch(o){let i=new Date,a="FAILED",s;if(r.aborted||o instanceof DOMException&&o.name==="AbortError"?(s="Step aborted by user.",a="CANCELLED"):o instanceof M?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,t.type==="RESOLVED_MODULE"){let c=Ih(t,{},"FAILED");return c.message=s,c.startedAt=n,c.finishedAt=i,c}return{...Ig(t),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function ic(t,e){let r=!1;try{return t&&!t.state.failureRecoveryDisabled&&(t.state.failureRecoveryDisabled=!0,r=!0),await e()}finally{t&&r&&(t.state.failureRecoveryDisabled=void 0)}}import{cloneDeep as h8}from"lodash-es";import{randomUUID as F0}from"crypto";import{diff as G6}from"deep-object-diff";import{cloneDeep as B0}from"lodash-es";var Ph=async t=>{let{step:e,tracer:r}=t.presetParams,{logger:n,controller:o,context:i}=t.fixtures,{collectDebugData:a}=t.options,{testMetadata:s}=t.inputs,c=e.command.type,l=n.child({commandType:c,stepId:e.id,commandId:e.command.id}),u="cache"in e.command&&e.command.cache?B0(e.command.cache):{},d=o.browser.url(),p=new Date,m,g=F0(),h=F0();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();r.attachBeforeHtmlSnapshot({logger:l,snapshotId:g,html:T})}}catch(T){l.debug({err:T},"Failed to take before screenshot, continuing...")}let f,S,b,y=jp();try{let T=await o.executePresetCommand(y,r,e.command,i,s?.advanced.disableAICaching??!1);T.beforeScreenshotOverride&&(m=T.beforeScreenshotOverride),b=T.afterScreenshotOverride;let w=new Date,P=o.browser.url();S={beforeUrl:d,afterUrl:P,startedAt:p,finishedAt:w,viewport:o.browser.getViewport(),status:T.fail?"FAILED":"SUCCESS",elementInteracted:T.elementInteracted},f={...e,message:T.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:P,finishedAt:w,startedAt:p,status:T.fail?"FAILED":"SUCCESS",data:T.data,results:[S]},"assertion"in e.command&&(f.message=T.thoughts||"Assertion passed.")}catch(T){l.error({message:T.message,stack:T.stack},`Failed executing preset step ${ni(e.command)}`);let w=o.browser.url(),P=new Date,A=T instanceof Error?T.message:`${T}`;S={beforeUrl:d,afterUrl:w,startedAt:p,finishedAt:P,viewport:o.browser.getViewport(),status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:A},f={...e,startedAt:p,finishedAt:P,beforeUrl:d,afterUrl:w,status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:A,failureReason:T instanceof M?T.reason:void 0,results:[S]}}finally{let T="cache"in e.command&&e.command.cache?B0(e.command.cache):{},w=G6(u,T);w&&Object.keys(w).length>0&&l.info({diffs:rm(w)},"Updated cache")}if(a)try{if(b||(b=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();r.attachAfterHtmlSnapshot({logger:l,snapshotId:h,html:T})}}catch(T){l.debug({err:T},"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=g,f.beforeSnapshot=g,S.afterSnapshot=h,f.afterSnapshot=h,m&&r.attachBeforeScreenshot({snapshotId:g,screenshot:m}),b&&r.attachAfterScreenshot({snapshotId:h,screenshot:b}),f};async function V6(t,e,r){let{tracer:n}=t.conditionalParams,{logger:o,controller:i}=t.fixtures,a=e.assertion.command;a.type==="AI_ASSERTION"&&(a.source="CONDITIONAL_CHECK");try{let s=await Ph({...t,presetParams:{tracer:n,step:e.assertion}});switch(a.type){case"AI_ASSERTION":case"PAGE_CHECK":return s.status==="SUCCESS"?{type:"passed",conditionResult:s,steps:e.steps}:(o.info(s.message,`${a.type} condition ${r} resolved to false`),{type:"failed",conditionResult:s});case"JAVASCRIPT":{if(s.status==="FAILED")return{type:"execution_error",conditionResult:s};let c=!!s.data;return s.status=c?"SUCCESS":"FAILED",s.message=c?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,o.info({returnValue:s.data,conditionPassed:c},`JavaScript condition ${r} evaluated`),c?{type:"passed",conditionResult:s,steps:e.steps}:{type:"failed",conditionResult:s}}default:return(l=>{throw new Error(`Unsupported conditional command type: ${l}`)})(a.type)}}catch(s){o.error({err:s},`Condition ${r} failed with error`);let c=s instanceof Error?s.message:"Unknown error during condition evaluation";return{type:"execution_error",conditionResult:{...e.assertion,status:"FAILED",message:c,startedAt:new Date,finishedAt:new Date,results:[]}}}finally{a.type==="AI_ASSERTION"&&delete a.source,i.throwIfClosed()}}function $6(t,e,r,n){let o=n.slice(r.length);for(let i=0;i<t.blocks.length;i++){let a=t.blocks[i],{result:s}=kl(a.steps,e,o);if(s)return i}return-1}async function z0(t){let{step:e,tracer:r}=t.conditionalParams,{logger:n}=t.fixtures,{fromStep:o}=t.inputs,i=new Date,a=Ig(e),s=r.getParentStepIdChain().concat(e.id),c=!!o&&rd(s,o.parentStepIdChain),l=e.elseSteps,u=!0,d=[],p,m=jp(),g=!1;if(c&&o){let y=$6(e,o.fromStepId,s,o.parentStepIdChain);y>=0&&(l=e.blocks[y].steps,u=!1,g=!0,n.info(`Skipping conditional assertion (execution starts from step within block ${y}), running ${l.length} steps`))}if(!g)for(let y=0;y<e.blocks.length;y++){n.info(`Evaluating condition ${y} in conditional step`);let T=e.blocks[y],w=await V6(t,T,y);if(d.push(w.conditionResult),p=w.conditionResult,w.type==="execution_error"){let P={...a,assertionResult:w.conditionResult,status:"FAILED",startedAt:i,finishedAt:new Date,message:w.conditionResult.message,results:[],details:m.details};return Hn({asyncTasks:t.work.asyncTasks,nestedResults:d,result:P,logger:n}),P}if(w.type==="passed"){n.info(`Condition ${y} resolved to true, executing the corresponding ${w.steps.length} steps`),u=!1,l=w.steps;break}}if(l)u&&n.info("No conditions resolved to true, executing the else block steps");else{n.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped");let y={...a,assertionResult:p,status:"SUCCESS",startedAt:i,data:d[d.length-1]?.data,message:d[d.length-1]?.message,results:[],finishedAt:new Date,details:m.details};return Hn({asyncTasks:t.work.asyncTasks,nestedResults:[...d],result:y,logger:n}),y}n.info(`Executing ${l.length} steps in the selected conditional block`);let h=await t.conditionalParams.tracer.startSubSteps(),f=await t.executeStepList({...t,listParams:{steps:l,containerName:"conditional block",tracer:h}}),b={...a,assertionResult:p,...f,startedAt:i,finishedAt:new Date};return Hn({asyncTasks:t.work.asyncTasks,nestedResults:[...d,...f.results],result:b,logger:n}),b}import{randomUUID as H0}from"crypto";var j0=async t=>{let{tracer:e}=t.aiStepParams,{controller:r}=t.fixtures;await r.browser.waitForStability();let n=await r.browser.screenshot({}),o=await W6(t);o.finishedAt=new Date,Hn({asyncTasks:t.work.asyncTasks,result:o,nestedResults:o.results,logger:t.fixtures.logger});let i=await r.browser.screenshot({}),a=H0();o.beforeSnapshot=a,e.attachBeforeScreenshot({snapshotId:a,screenshot:n});let s=H0();return o.afterSnapshot=s,e.attachAfterScreenshot({snapshotId:s,screenshot:i}),o},W6=async t=>{let{step:e,tracer:r}=t.aiStepParams,{controller:n,context:o,logger:i}=t.fixtures,a={...e,startedAt:new Date,beforeTestContext:o.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in e&&e.steps&&e.steps.length>0&&e.steps[e.steps.length-1]?.command.type==="SUCCESS"))throw new M("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await r.startSubSteps(),{status:l}=await t.executeStepList({...t,listParams:{steps:e.steps,containerName:"AI action",results:a.results,tracer:c}});return a.finishedAt=new Date,a.status=l,a}catch(c){i.warn({err:c},"Failed executing saved deprecated AI action steps");let l=n.executeAbortController.signal.aborted;a.message=c instanceof Error?c.message:`${c}`,a.status=l?"CANCELLED":"FAILED"}return a};import{randomUUID as YT}from"crypto";var G0=t=>{throw new Error(`Exhaustive check failed for value: ${t}`)};import{streamText as n8}from"ai";var Mh=class{controller;logger;rootStep;subStepIndex=0;callbacks;results=[];constructor(e){this.controller=e.controller,this.logger=e.logger,this.rootStep=e.rootStep,this.callbacks=e.callbacks}finalState=void 0;async createAndExecuteStep(e){this.callbacks.onAiActionEvent?.({type:"SUBSTEP_CREATED",rootStep:this.rootStep,step:e});let r=this.subStepIndex++,n=await this.callbacks.executeStep(e,r);return this.results.push(n),n}recordGenericToolCall(e){this.callbacks.onAiActionEvent?.({type:"GENERIC_TOOL_CALLED",toolName:e,rootStep:this.rootStep})}};import{hasToolCall as t8,stepCountIs as r8}from"ai";import V0 from"dedent";var K6=V0`
|
|
4610
|
+
`),tokenLength:d}),s.forEach((h,f)=>{let S=h.ids[0],b=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:S,maxId:b},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var y6=75e4,Ch=3e5;async function ys(t){let{options:e,fixtures:r,screenshot:n}=t,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:s,signal:c}=r,l=t.tree,u=t.serializedTree,d=We(u);if(d>y6)try{let p=Rh({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await E6({...t,tokenLimit:Ch-1e4,chunks:p.chunks}),u=l.serialize();let m=We(u);i.info({oldTokens:d,newTokens:m},"Filtered page using keywords"),d=m}catch(p){i.warn({err:p},"Error filtering page using keyword matching, using naive truncation"),l=l.pruneToSerializedCharLimit(Ch*qi),u=l.serialize();let m=We(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>Ch)try{if(o){let p=Rh({serializedTree:u,options:T0,logger:i}),m=S6();l=await X(b6({...t,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let g=We(u);i.info({oldTokens:d,newTokens:g,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=g}else{let p=Rh({serializedTree:u,options:E0,logger:i});l=await X(T6({...t,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=We(u);i.info({oldTokens:d,newTokens:m},"Filtered page using RAG"),d=m}}catch(p){i.warn({err:p},"Error filtering page using RAG/AI, using naive truncation"),l=l.pruneToSerializedCharLimit(Ch*qi),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function b6({type:t,callId:e,chunks:r,description:n,fixtures:o,tree:i}){let{generator:a,signal:s,logger:c}=o,l=await a.rankChunksWithAi({chunks:r,description:n,type:t,softTokenLimit:4e4,hardTokenLimit:8e4,callId:e},{abortSignal:s,logger:c,loggerTags:et(c)}),u=[];return r.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function E6(t){let{description:e,fixtures:r,tree:n}=t,{generator:o,logger:i,signal:a}=r;if(!e.trim())throw new Error("Empty description passed to page filtering");let s=await o.getExtractedKeywords({goal:e},{logger:i,loggerTags:et(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let c of s.keywords){let l=t.chunks.filter(m=>m.content.toLowerCase().includes(c.toLowerCase()));if(!l.length||l.reduce((m,g)=>m+g.tokenLength,0)>t.tokenLimit&&l.length>1)continue;let d=l.flatMap(m=>m.ids);return n.pruneUsingRelevantIds(new Set(d))}throw new Error("No keywords were unique enough for page filtering")}async function T6(t){let{description:e,fixtures:r,chunkResult:n,tokenLimit:o,tree:i}=t,{generator:a,logger:s,signal:c}=r,l=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:c,logger:s,loggerTags:et(s)});if(l.ids.length===0)throw new Error("RAG returned no important ids");return i.pruneUsingRelevantIds(new Set(l.ids.map(d=>`${d}`)))}async function GT(t,e){if(!t.description)throw new M("UserConfigurationError","Cannot locate element with empty description");return Vn({action:async()=>v6(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function v6(t,e){let{disableCache:r,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:c,logger:l,allowNotActionableNodesOverride:u,skipSavingVisualAttributes:d}=t,{orgId:p,browser:m,localCodeEvalTools:g,generator:h,abortSignal:f}=e,S=t.description,b=Ss(),y=t.useMemory&&!r;n&&(S=await qr({orgId:p,s:S,context:n,localTools:g,signal:f,logger:l})),a&&(S=h0(S,a));let{serializedTree:T,tree:w}=await b.startAsyncSpan("GET_PAGE_STATE",async()=>Uo(m,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),{}),P=await b.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let F,z=Date.now(),ae;for(;!F&&Date.now()-z<3e3;){f.throwIfAborted();try{F=await m.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(ue){ae=ue}}if(!F)throw new M("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${ae?.message}`);return F}),A=T,x=!1,L=`data:image/jpeg;base64,${P.toString("base64")}`;A=await ys({type:"locator",description:S,screenshot:L,serializedTree:T,options:{aiPageFiltering:c},tree:w,fixtures:{generator:h,signal:f,logger:l,orgId:p}}),A!==T&&(x=!0);let N=await b.startAsyncSpan("AI_LOCATOR_CALL",async F=>{let z=await h.getElementLocation({browserState:A,goal:S,screenshot:L,source:a,memory:y?s:void 0},{disableCache:r,abortSignal:f,loggerTags:et(l),useMemory:y});return F.result=z,z});if(l.debug({usedRag:x,result:N},"Got locator result"),!(N.id>0))throw new qs(`Could not find any relevant element: ${N.thoughts}`,N.updatedMemory?{type:"GCS_TRACES",traces:N.updatedMemory}:void 0);let{resolution:W,target:B,frameConfig:xe}=await b.startAsyncSpan("TARGET_RESOLUTION",async F=>{let z=await m.createTargetFromA11yId({id:N.id,requirements:N.requirements,additionalElements:N.additionalElements,description:S,targetSource:"AI",logger:l,skipSavingVisualAttributes:d});return F.result={serializedElement:z.target.nodeOnlySerializedHtml??"Unknown HTML element"},z});if(W.a11yNode?.properties?.hidden&&W.a11yNode?.properties?.hidden!=="false")throw new M("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${W.displayString}`);return y&&(N.updatedMemory?B.memory={type:"GCS_TRACES",traces:N.updatedMemory}:s&&(B.memory=s)),{thoughts:N.thoughts,target:B,resolution:W,frameConfig:xe,screenshot:L}}var A6=15;async function wh({command:t,aiPageFiltering:e,logger:r,fixtures:n,useMemory:o,maxRetries:i=A6}){if(!t.assertion.trim())throw new M("ActionFailureError","Assertion command is missing the assertion content");let a=wS.optional().catch(void 0).parse(t.source);t.source&&!a&&r.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let{browser:s}=n,c=t.timeout?t.timeout*1e3:s.smartWaitingTimeout,l=KO(c,i-1),u=0,d=Date.now(),p=d+c,m=d,g,h,f;try{await Vn({action:()=>s.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:s,logger:r})}catch(S){r.warn({err:S},"Failed to clear highlights before AI check, continuing...")}for(;u<i;){n.abortSignal.throwIfAborted();let S=Date.now();if(u>0){if(S>=p)break;let T=p-S,w=m-S,P=Math.min(w,T);P>0&&await fe(P,n.abortSignal)}let b=Date.now();if(u>0&&b>=p)break;let y=!1;try{if(g=await Vn({action:async()=>{let w=await A0(s,r,n.abortSignal);return h&&h.serializedTree===w.serializedTree&&h.screenshotBuff.equals(w.screenshotBuff)?(y=!0,g):(h=w,R0({command:t,state:w,fixtures:n,useMemory:o,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:r,source:a}))},frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:s}),g?.success){g?.updatedMemory&&od(t,g.updatedMemory,r);break}else throw g?.thoughts?new M("AssertionFailureError",g.thoughts):new M("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(T){n.abortSignal.throwIfAborted(),f=T instanceof Error?T:new Error(`${T}`),y?r.info(`AI check attempt ${u} failed (re-used previous result)`):r.info({err:T},`AI check assert attempt ${u} failed, retrying...`)}finally{u++,m=b+l}}if(!g?.success){let S=p-Date.now();S>0&&await fe(S,n.abortSignal)}if(!g?.success)try{g=await Vn({action:async()=>R0({command:t,state:await A0(s,r,n.abortSignal),fixtures:n,useMemory:o,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:r}),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:s})}catch(S){n.abortSignal.throwIfAborted(),f=S instanceof Error?S:new Error(`${S}`)}finally{u++}if(g?.updatedMemory&&od(t,g.updatedMemory,r),!g?.success){let S=`AI check still failing after ${u} attempts.`;throw f&&(S+=` Latest result: ${f.message}`),new M("AssertionFailureError",S)}return{...g,succeedImmediately:!1,urlAfterCommand:s.url()}}async function A0(t,e,r){let[n,o]=await Promise.all([Uo(t,{abortSignal:r,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),t.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function R0({command:t,state:e,fixtures:r,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:p}=r,m={type:"ASSERTION"},{serializedTree:g,tree:h}=e,f=e.screenshotBuff,S=f.toString("base64"),b=u.url(),y=t.contextChoice??"MULTIMODAL",T=g;y!=="VISION_ONLY"&&(T=await ys({type:"assertion",serializedTree:g,tree:h,description:t.assertion,screenshot:S,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:r.orgId}}),T!==g&&(m.ragUsed=!0),m.pageState=T);let w={goal:t.assertion,url:b,memory:o?t.cache?.memory:void 0,browserState:T,screenshot:S,contextChoice:y,source:c},A=await(y==="VISION_ONLY"?(x,O)=>d.getVisualAssertionResult(x,O):(x,O)=>d.getAssertionResult(x,O))(w,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!t.disableCache,abortSignal:p,logger:l,loggerTags:et(l)});return(A.result||i)&&A.relevantElements&&(m.relevantElementsSerialized=A.relevantElements.map(x=>u.getSerializedFormFromA11yId(x)).filter(x=>!!x),await R6(A.relevantElements,u,l)),{success:A.result,thoughts:A.thoughts,afterScreenshotOverride:f,updatedMemory:o?A.updatedMemory:void 0}}async function R6(t,e,r){let n=Date.now();for(let o of t){if(Date.now()-n>2e3){r.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await X(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){r.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var C6=1e5,xh=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function C0(t,e){let{logger:r}=t,{abortSignal:n,browser:o}=e,i=Date.now();try{await w6(i,t,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof xh?r.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):r.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await fe(s,n)}finally{r.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function w6(t,e,r){let{abortSignal:n,browser:o}=r;if(o.smartWaitingTimeout<3e3){await fe(o.smartWaitingTimeout,n);return}if(!e.description)throw new M("UserConfigurationError","Cannot locate element with empty description");await X(x6(t,e,r),{milliseconds:o.smartWaitingTimeout})}async function x6(t,e,r){let{logger:n,iframeUrl:o}=e,{browser:i}=r;for(;Date.now()-t<i.smartWaitingTimeout;)if(await Vn({action:async()=>_6(e,r),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function _6(t,e){let{testContext:r,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=t,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=t.description;r&&(d=await qr({orgId:l,s:d,context:r,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await Uo(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(We(p)>C6)throw new xh;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(b){throw new M("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: ${b instanceof Error?b.message:b}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let S=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:et(n)});return n.debug({result:S},"Got smart waiting result"),S.isPageReady}import{cloneDeep as x0}from"lodash-es";async function _0(t){let{command:e,timeoutMs:r,fixtures:n}=t,{abortSignal:o}=n,i=()=>cp(e.cache)?e.cache:void 0,a=i(),s=x0(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=nE(s,a);a.target=f.target,a.updatedAt=f.updatedAt}else{if(!s){a=void 0;return}a.target=s.target,a.updatedAt=s.updatedAt}},l=Date.now(),u=0,d,p=500,m=!1;for(;u<2||Date.now()-l<r;){u++,u>1&&await fe(p,o),o?.throwIfAborted(),a=i();let{result:h,elementWasFound:f}=await w0({cacheToUse:a,params:t});if(d=h,m=f,h.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new M("InternalPlatformError",`Failed to evaluate manual element assertion in ${r}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&Ds(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await w0({cacheToUse:h,params:t});d=f,d.success||c(!0)}let g=i();return d.success&&g?.target&&!m&&(g.target=nd(g.target),g.updatedAt=new Date),d}async function w0({cacheToUse:t,params:e}){let{command:r,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(r.target&&!vi(r.target))throw new Error("Element assertion with x/y is not supported yet");let c=HM(r.assertion),l,u=!1,d=x0(t);try{let{elementInteractedDisplayString:p,result:m,thoughts:g}=await a({ctx:o.ctx,tracer:i,command:r,target:r.target,cache:d?.target,action:async h=>I6(h.locator,e),options:{...r,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Oa(r),targetName:"target"}});return l={success:m.success,data:m.data,err:m.err,elementInteractedDisplayString:p,thoughts:g},u=!0,m.success||(s.warn({aiThoughts:g,elementString:p,err:m.err},"Element check found an element but failed"),l={...m,thoughts:g}),{result:l,elementWasFound:u}}catch(p){if(c)return l={success:!0,thoughts:`The element described does not exist on the page: ${p.message}`,err:void 0,data:void 0},{result:l,elementWasFound:u};if(!(p instanceof M)||p.reason!="ActionFailureError")throw p;return l={success:!1,err:p,data:void 0,thoughts:void 0},s.warn({err:p},"Element check did not find an element and failed"),{result:l,elementWasFound:u}}}async function I6(t,{command:e,fixtures:r}){return await r.browser.highlight(t),await P6(t,e.assertion)}async function P6(t,e){let r=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await t.textContent()??"";if(o={elementTextContent:Tt(a,500,!0)},!td(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Dl(e);r=!1,n=new M("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:Tt(await t.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a=null;try{a=await t.getAttribute(e.attr,{timeout:3e3})}catch(s){n=new M("AssertionFailureError",s instanceof Error?s.message:String(s)),r=!1;break}if(!td(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Dl(e);r=!1,e.operation==="EXISTS"?n=new M("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new M("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{r=await t.evaluate(async(s,c)=>{let l=Date.now();for(;Date.now()-l<c;){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},mo*1e3);break}case"EDITABLE":{r=await t.isEditable({timeout:mo*1e3});break}case"EXISTS":{r=!0;break}case"ENABLED":{r=await t.isEnabled({timeout:mo*1e3});break}case"FOCUSED":{r=await t.evaluate(s=>s===document.activeElement);break}default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.condition)}if(r=e.negated?!r:r,!r){let a=Dl(e);n=new M("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!td(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=Dl(e);r=!1,n=new M("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await t.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!td(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Dl(e);r=!1,e.operation==="EXISTS"?n=new M("AssertionFailureError",`The style property ${e.property} ${s}`):n=new M("AssertionFailureError",`The style property ${e.property} ${s} '${e.value}': ${a}`)}break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}return{thoughts:void 0,success:r,data:o,err:n}}function I0(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}import{Jimp as M6}from"jimp";async function Ad(t,e){let r=await t.screenshot(e),n=await M6.fromBuffer(r);return{buffer:r,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as P0}from"jimp";import VT from"jpeg-js";import O6 from"pixelmatch";async function M0({ctx:t,tracer:e,command:r,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(r.target&&!vi(r.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForStability({logger:a});let c={clearHighlights:!0,hideCaret:!0},l;r.target?.elementDescriptor?l=(await i({ctx:t,tracer:e,command:r,target:r.target,cache:r.cache?.target,action:async N=>Ad(o,{locator:N.locator,...c}),options:{...r,disableCache:n,disableGlobalLocatorRedirect:!0,memory:r.cache?.target?.memory,targetName:"target"}})).result:l=await Ad(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,r,l);if((l.height!==u.height||l.width!==u.width)&&a.warn({currHeight:l.height,currWidth:l.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-u.height)>10||Math.abs(l.width-u.width)>10){let L=`${l.width}x${l.height}`,N=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${L}) does not match saved screenshot dimensions (${N}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await P0.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await P0.fromBuffer(u.buffer),g={width:u.width,height:u.height},h,f=p.width*p.height,S=g.width*g.height,b=Math.abs(p.height-g.height),y=Math.abs(p.width-g.width);if(f>S){let L=d.cover({w:g.width,h:g.height});l.buffer=await L.getBuffer("image/jpeg"),h="current",l.width=g.width,l.height=g.height}else if(S>f){let L=m.cover({w:p.width,h:p.height});u.buffer=await L.getBuffer("image/jpeg"),h="saved"}let T={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},w=r.threshold??.1,A=O6(VT.decode(u.buffer).data,VT.decode(l.buffer).data,T.data,l.width,l.height,{threshold:w,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,x=A>w*100,O=`Visual diff of ${A.toFixed(2)}% detected, which is ${x?"over":"under"} the threshold of ${w*100}%.`;if(h&&(O+=` The ${h} screenshot was cropped since it was taller by ${b} pixels and wider by ${y} pixels.`),x)throw new M("ActionFailureError",O);return{fail:x,thoughts:O,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:VT.encode(T,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var L6=3e4;function N6(t){if(!t.body)return{};switch(t.body.type){case"json":return{content:t.body.content,contentType:"application/json"};case"form-urlencoded":{let e=new URLSearchParams;return Object.entries(t.body.content).forEach(([r,n])=>{e.append(r,n)}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function O0({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??L6/1e3,i=Object.fromEntries(Object.entries(t.headers||{}).filter(([g,h])=>g&&h)),a=new URLSearchParams;Object.entries(t.params||{}).filter(([g,h])=>g&&h).forEach(([g,h])=>{a.append(g,h)});let s=a.toString(),c;if(Gl(t.url)&&(c=t.url),r&&Vl(t.url,r)&&(c=new URL(t.url,r).toString()),!c)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let l=c;e.info({url:l,searchParams:s,headers:i,body:t.body,method:t.method},"Making HTTP request");let d=await X((async()=>{let g=s?`${l}?${s}`:l;try{let h=N6(t),f=new Headers(i);return h.contentType&&!f.has("Content-Type")&&f.set("Content-Type",h.contentType),await n(g,{headers:f,method:t.method,body:h.content})}catch(h){throw new Error(`Failed to make HTTP request: ${h}`,{cause:h})}})(),{milliseconds:o*1e3,fallback:()=>{throw new M("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let g;try{g=await d.text()}catch(h){g=`Failed to read response body: ${h}`}throw new M("ActionFailureError",`Fetch request failed with status ${d.status}: ${g}`)}let p={};d.headers.forEach((g,h)=>{p[h]=g});let m={status:d.status,headers:p,request:{url:d.url,method:t.method,headers:i}};if(t.body?.type==="json"&&t.body.content)try{m.request.json=JSON.parse(t.body.content)}catch{}if(d.headers.get("content-type")?.includes("json"))try{m.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(m.text=await d.text());return m}var D6=5e3;async function _h({timeout:t=mo,...e}){let r=Date.now(),n=t*1e3,o=n+1e4,i,a=0,s=500;for(;a-r<n;){if(Date.now()-r>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await L0(e),a=Date.now();let l=a-c;if(l>1e3&&e.logger.warn({pageAssertDuration:l},"Page assertion took longer than expected"),!i.success)await fe(s,e.signal),s=Math.min(Math.floor(s*1.5),D6);else return i}return i=await L0(e),i}async function L0({assertion:t,browser:e,autoExpandIframes:r}){switch(t.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(r){let c=await e.evaluateFunctionInAllFrames(N0,{value:t.value,negated:!!t.negated,returnHtml:!1});i=t.negated?c.every(l=>l.evaluation):c.some(l=>l.evaluation),s=c.find(l=>l.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(N0,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let c=t.negated?ti.CONTAINS:ri.CONTAINS;a=new M("AssertionFailureError",`The page ${c} '${t.value}'.`),o=s}}catch(s){a=new M("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`)}return{success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}function N0({value:t,negated:e,returnHtml:r}){let n=document.body.innerHTML,o=n.includes(t)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&r?n:void 0}}var k6=3e4;async function D0({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??k6/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Gl(t.url)&&(s=t.url),r&&Vl(t.url,r)&&(s=new URL(t.url,r).toString()),!s)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let l=await X((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:t.query,variables:t.variables?JSON.parse(t.variables):void 0}),signal:i.signal})}catch(d){throw new Error(`Failed to make HTTP request: ${d}`,{cause:d})}})(),{milliseconds:o*1e3});if(!l)throw new M("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!l.ok){let d,p=await l.text();try{d=JSON.parse(p)}catch{throw new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}let u={};return l.headers.forEach((d,p)=>{u[p]=d}),{status:l.status,headers:u,json:await l.json()}}var la=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:r,logger:n,storage:o,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:c,options:l}){this.orgId=i,this.options=l,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=c,this.localCodeEvalTools=a,this.generator=r,this.logger=n}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal)}setClosed(){this.executeAbortController.abort()}throwIfClosed(){this.executeAbortController.signal.throwIfAborted()}get closed(){return this.executeAbortController.signal.aborted}async evaluateAiAction({goal:e,startingScreenshot:r,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([Uo(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${l.toString("base64")}`,d=await ys({type:"ai-action",description:e,screenshot:u,serializedTree:c.serializedTree,tree:c.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),p={url:this.browser.url(),browserState:d,startingScreenshot:r,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...et(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:r,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([Uo(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 ys({type:"ai-action",description:e,screenshot:d,serializedTree:l.serializedTree,tree:l.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),m={url:c,browserState:p,startingScreenshot:r,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...et(a)},langfuseSessionId:s})}catch(g){throw new M("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return Uo(this.browser,e)}async locateElement(e){return await GT({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,r){return Vn({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:n}},frameConfig:r?{type:"url",url:r}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??(this.orgId==="org_01HMSCJQBCCG51M2ZF65YC5B8W"||this.orgId==="org_01HMJTX4GT1KG94KZRCT8MZ6YB")}async wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:o,descriptions:i,caches:a,action:s,options:c,retriesWithAI:l=1}){let u=[];for(let d=0;d<i.length;d++){let p=i[d],m=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:p,cache:a[d],action:async g=>g,options:{...c,targetName:o[d]}});u.push(m)}try{let d=await s(...u.map(g=>g.result)),p=g=>g==="fromTarget"?"From Target":g==="toTarget"?"To Target":"Target",m=u.map((g,h)=>g.thoughts?`${p(o[h])}: ${g.thoughts}`:void 0).filter(g=>!!g).join(" -------------- ")||void 0;return{result:d,elementInteractedDisplayStrings:u.map(g=>g.elementInteractedDisplayString),thoughts:m}}catch(d){if(this.throwIfClosed(),l>0)return this.logger.warn({err:d},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new M("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:r,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(r.type!=="description")throw new M("ActionFailureError","Cannot use selector with non-description target");let c,l=Date.now(),u=Date.now();for(;Date.now()-u<this.browser.smartWaitingTimeout;){l=Date.now();try{let d=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:r.elementDescriptor,targetName:s,logger:a});return{result:await n({locator:d.locator,originalElementLocationResult:void 0,serverSideBoundingBox:null}),elementInteractedDisplayString:d.displayString}}catch(d){if(d.name==="AbortError")throw d;c=d,a.warn({err:d},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await fe(500)}}throw c}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:r,disableGlobalLocatorRedirect:n,logger:o}=e,i=Ss(),a=!n&&this.browser.userBrowserSettings.globalLocatorRedirect!==!1;(this.browser.userBrowserSettings.visualActions||a)&&await i.startAsyncSpan("SCROLL_ELEMENT_INTO_VIEW",async()=>{await this.browser.scrollIntoViewIfNeeded(r.locator)});let s;return a&&(s=await i.startAsyncSpan("LOCATOR_REDIRECT",async()=>this.browser.performTargetRedirection(r,o))),s||(s={locator:r.locator,serverSideBoundingBox:await r.locator.boundingBox({timeout:ie}),originalElementLocationResult:r.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{ctx:r,cache:n,options:o,logger:i}=e,s=await Ss().startAsyncSpan("CACHE_RESOLUTION",async l=>{let u=await this.browser.resolveTarget(r,n,{allowNotActionableNodesOverride:o.allowNotActionableNodesOverride,logger:i,signal:this.executeAbortController.signal,...o.resolveTargetOptions});return l.attributes.targetDisplayString=u.displayString,u}),c=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:s,disableGlobalLocatorRedirect:o.disableGlobalLocatorRedirect,logger:i});return await s.revalidator?.(),{resolutionResult:s,finalTarget:c}}async wrapElementTargetingCommand(e){return await Vn({action:()=>this.wrapElementTargetingCommandHelper(e),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:this.logger})}async wrapElementTargetingCommandHelper(e){let{ctx:r,tracer:n,target:o,action:i,options:a,command:s,finalAttempt:c=!1,originalCache:l=e.cache}=e,{retriesWithAI:u=1}=e,{disableCache:d,useSelector:p,targetName:m}=a,g=Ss(),h=this.logger.child({commandId:s.id}),f=this.shouldUseMemory(),S=k0(e.cache);if((!S||d)&&!Nf(o))throw new M("ActionFailureError","Cannot target element with no cached data or element descriptor");if(p)return this.wrapHardcodedCssTargetingCommandHelper(e);let b=!1;d&&(h.info("Cache explicitly disabled for this step"),b=!0,S=void 0);let y=y0({cache:S,description:o.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:h});S=y.cache,b=b||y.cacheBustedBeforeAction;let T=!0;if(!S0(S))return u--,T=!1,this.executeTargetingCommandWithAI({ctx:r,tracer:g,stepTracer:n,target:o,options:a,command:s,action:i,originalCache:l,logger:h,useMemory:f,cacheBustedBeforeAction:b});try{let{resolutionResult:w,finalTarget:P}=await this.resolveCachedTargetForAction({ctx:r,cache:S,options:a,logger:h}),A=await i(P);if(ir.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.46.3"]),bg({cmd:s,key:m,newTarget:S,logger:h,updatedWithAI:!1}),T){let x=w.decisions.filter(O=>O.matched);if(x.length!==1)h.warn({decisions:w.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let O=x[0].type;n.recordTargetAutoHeal({healType:O})}}return{result:A,elementInteractedDisplayString:w.displayString}}catch(w){this.throwIfClosed();let P=Kf(w);if(P&&!c)return h.warn({err:w},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({ctx:r,tracer:n,command:s,target:o,action:i,cache:l,originalCache:l,retriesWithAI:u,finalAttempt:!0,options:a});if(w instanceof M&&!P)throw h.warn({err:w},"Failed to execute command with target (fatal)"),w;if(u>0&&o){h.info({err:w},"Failed to execute action with cached target, retrying with AI"),ir.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.46.3",`missReason:${w instanceof vn?w.cacheMissReason:"unknown"}`]);let A;return S.memory&&ip(S.memory)&&(A=S.memory),this.wrapElementTargetingCommandHelper({ctx:r,tracer:n,command:s,target:o,cache:void 0,action:i,originalCache:l,retriesWithAI:u,finalAttempt:!0,options:{...a,memory:A,targetHealingInProgress:!0}})}throw new M("ActionFailureError",`Failed to execute interactive command: ${w instanceof Error?w.message:`${w}`}`,{errOptions:{cause:w}})}}async executeTargetingCommandWithAI(e){let{ctx:r,tracer:n,stepTracer:o,target:i,options:a,command:s,action:c,originalCache:l,logger:u,useMemory:d,cacheBustedBeforeAction:p}=e;u.info({description:i.elementDescriptor,targetHealingInProgress:a.targetHealingInProgress,cacheBustedBeforeAction:p,memory:a.memory,useMemory:d},"Prompting AI for an updated element location"),(p||!l)&&await n.startAsyncSpan("SMART_WAITING",async()=>await C0({description:i.elementDescriptor,iframeUrl:a.iframeUrl,source:a.source,logger:u,allowNotActionableNodesOverride:a.allowNotActionableNodesOverride},this.getControllerFixtures(r)));let m=2;for(let g=1;g<=m;g++){let h=!1,f=this.browser.getActiveFrameConfig();try{let S;try{S=await GT({description:i.elementDescriptor,disableCache:!!a.disableCache,iframeUrl:a.iframeUrl,source:a.source,useMemory:d,memory:d?a.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:a.allowNotActionableNodesOverride,logger:u},this.getControllerFixtures(r))}catch(T){if(T instanceof qs&&T.updatedLocatorMemory){let w={id:-1,...l,memory:T.updatedLocatorMemory};bg({cmd:s,key:a.targetName,newTarget:w,logger:u,updatedWithAI:!0})}throw T}S.frameConfig&&(this.browser.setActiveFrameConfig(S.frameConfig),h=!0);let b=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:S.resolution,disableGlobalLocatorRedirect:a.disableGlobalLocatorRedirect,logger:u}),y=await c(b);return bg({cmd:s,key:a.targetName,newTarget:S.target,logger:u,updatedWithAI:!0}),a.targetHealingInProgress&&(o.recordTargetAutoHeal({healType:"AI"}),S.target.targetSource="AI_HEALED",S.target.targetUpdateTime=new Date().toUTCString(),S.target.targetUpdateLoggerTags=et(u)),{result:y,elementInteractedDisplayString:S.resolution.displayString,thoughts:S.thoughts}}catch(S){if(h&&this.browser.setActiveFrameConfig(f),this.throwIfClosed(),g<m&&Kf(S)){u.warn({err:S,aiAttempt:g},"Encountered retryable AI targeting error; retrying with AI once");continue}throw S instanceof M?S:new M("ActionFailureError",S.message)}}throw new M("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return Ad(this.browser,e)}async executePresetCommand(e,r,n,o,i){this.options?.slowMoMs&&await fe(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),c;try{c=await this.resolveCommandTemplateStrings(n,o)}catch(l){throw this.throwIfClosed(),new M("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,r,n,o,i);return this.options?.autoFollowNewTabs&&await f0({beforeUrl:s,command:n,beforePages:a.map(u=>u.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{wN(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>pT(e)}}async resolveCommandTemplateStrings(e,r){return ch({obj:e,context:r,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,r,n,o,i){i=i||"disableCache"in n&&!!n.disableCache;let a=this.logger.child({commandId:n.id});switch(n.type){case"SUCCESS":let s=n.condition;return s?.assertion.trim()?wh({command:s,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!n.assertion.trim())throw new M("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new M("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return wh({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new M("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let h=t_(n.schema);if(h)throw new M("UserConfigurationError",h)}let m=await this.browser.getCondensedHtml(),g=await this.browser.screenshot({retries:2});try{let h=await this.generator.getTextExtraction({goal:n.goal,browserState:m,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${g.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:et(a)});if(h.result==="NOT_FOUND")throw new M("ActionFailureError","No relevant data found for extraction goal on this page");if(h.thoughts?.includes("MaxGenerationLengthExceededError"))throw new M("UserConfigurationError",h.thoughts);return{thoughts:h.thoughts||void 0,data:h.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(h){let f=h.message;throw f.includes("MaxGenerationLengthExceededError")?new M("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new M("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:h}}):h}}case"NAVIGATE":if(!Gl(n.url)&&!Vl(n.url,this.browser.baseUrl))throw new M("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await 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 M("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let m,g;if(n.target&&uo(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:S,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:y=>this.browser.hover(y),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});m=S,g=b}let h=this.browser.getViewport()?.height??Ar.height,f=this.browser.getViewport()?.width??Ar.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??h));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??h);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??f));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??f);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new M("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new M("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let c=n.delay*1e3;await fe(c,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(uo(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let m=this.browser.url(),{elementInteractedDisplayString:g,result:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,target:n.target,command:n,cache:n.cache?.target,action:b=>this.browser.click(b,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f,data:h.downloadedFile?{downloadedFile:h.downloadedFile}:void 0};return Mg(m,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}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(uo(n.fromTarget)&&uo(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0});break}if(uo(n.fromTarget)||uo(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:m,thoughts:g}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(h,f)=>this.browser.dragAndDrop(h,f,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m[0],thoughts:g}}case"MOUSE_DRAG":{let m=parseInt(n.deltaX),g=parseInt(n.deltaY),h=n.steps??5;if(isNaN(m)||isNaN(g))throw new M("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&uo(n.target)){await this.browser.mouseDragUsingVisualCoordinates({deltaX:m,deltaY:g,steps:h,fromTarget:n.target.pixels});break}let f,S;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:b,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:async T=>this.browser.mouseDrag(m,g,h,T.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=b,S=y}else await this.browser.mouseDrag(m,g,h,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:S}}case"SELECT_OPTION":{if(!vi(n.target))throw new Error("Select with x/y is not supported yet");let m=n.target.elementDescriptor,g=n.choice,{elementInteractedDisplayString:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:{type:"description",elementDescriptor:m},cache:n.cache?.target,action:S=>this.browser.selectOption(S,g,n.force),options:{...n,targetName:"target",disableCache:i,source:Oa(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:f}}case"TAB":{let m={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,m);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"COOKIE":if(!n.value)break;let l=await this.browser.setCookie(n.value);a.debug({results:l},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let m;try{n.environment==="BROWSER"?(m=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:o.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),a.info({result:m},"Executed JavaScript in browser")):m=await ra({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:o,timeoutMs:n.timeout?n.timeout*1e3:void 0,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async g=>{if(!this.options?.scratchPadId){a.warn({updates:g},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:g,logger:a})}}})}catch(g){throw this.throwIfClosed(),new M("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(m)}catch(g){throw new M("ActionFailureError",`Return value is not serializable: ${g instanceof Error?g.message:`${g}`}`,{errOptions:{cause:g}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(n.target&&uo(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n),await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);break}let m=this.browser.url(),g,h,f=k0(n.target),S=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:y,thoughts:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:f,cache:n.cache?.target,action:w=>this.browser.typeIntoTarget(n.value,w,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),options:{...n,targetName:"target",disableCache:i,disableGlobalLocatorRedirect:!S,source:Oa(n)}});g=y,h=T}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let b={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:h};return Mg(m,b.urlAfterCommand)&&(b.succeedImmediately=!0,b.succeedImmediatelyReason="URL changed"),b}case"HOVER":{if(uo(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:h=>this.browser.hover(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"FOCUS":{if(!vi(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:h=>this.browser.focus(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"BLUR":{if(n.target&&!vi(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:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,target:n.target,command:n,cache:n.cache?.target,action:h=>this.browser.blur(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"PRESS":let u=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return Mg(u,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d;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 m=new F6,g=U6(fetch,m),h;try{h=new URL(n.url).hostname}catch{}let f=await O0({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g});return{data:Lc.parse({...f,cookies:cw(m,h)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await D0({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return M0({ctx:e,tracer:r,command:n,disableCache:i,browser:this.browser,logger:a,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,g;if(n.fileSource.type==="URL"?(g=n.fileSource.url,m=await zN({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(g=n.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!m)throw new M("UserConfigurationError",`Attempted to use non-existent file for upload step: ${g}`);await this.browser.setFileChooserHandler({...m,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!n.storageState.trim())m=void 0;else if(m=await ra({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof m!="object")throw new M("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let g;try{g=em.optional().parse(m)}catch(h){throw new M("ActionFailureError",`Credentials provided do not follow the required format: ${h}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let m=(n.timeout??mo)*1e3,g=this.generator.getAgentConfig()?.assertion;if(I0(n.assertion)&&!n.useSelector&&n.target.type==="description"&&g&&g!=="v1"){let f={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 S=await wh({command:f,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory()});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${S.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:S.afterScreenshotOverride}}finally{f.cache?.memory&&od(n,f.cache?.memory.traces,a)}}let h=await _0({command:n,tracer:r,timeoutMs:m,targetingWrapper:f=>this.wrapElementTargetingCommand(f),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!h.success,data:h.data,elementInteracted:h.elementInteractedDisplayString,thoughts:h.err?.message??h.thoughts??`Element assertion ${h.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let m=await Vn({action:async()=>_h({assertion:n.assertion,browser:this.browser,logger:a,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:a});return{fail:!m.success,data:m.data,thoughts:m.success?"Page assertion passed.":m.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let m=new ia(n.requestMatcher),g=this.browser.registerRequestListener(m);return this.registeredListeners[n.key]=g.then(async h=>await ST(h)).catch(h=>{a.error({err:h},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let m=this.registeredListeners[n.key];if(!m)throw new M("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await X(m,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=new ia(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:g=>m.matches({url:g.request.url,method:g.request.method}),onRequestStart:(g,h)=>{this.recordedRequests[n.key][g]=mh(h)},onRequestComplete:(g,h)=>{this.recordedRequests[n.key]?.[g]&&(this.recordedRequests[n.key][g]=mh(h))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[n.key];if(!m)throw new M("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(m),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let m;return n.requestMatcher&&(m=new ia(n.requestMatcher)),this.browser.setHeader(n.name,n.value,m),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new ia(n.requestMatcher),async(g,h)=>{let f=await ra({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:g,response:h},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),S=xw.parse(f);return new Response(S.body,{status:S.status,headers:S.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(m=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:r,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:r,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:et(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:r,isClickToRecord:n}){this.recordAbortController=r;let o=new bh({signal:r.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:et(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:et(this.logger)})}};var $T=async t=>{let{step:e,resolvedInputs:r}=t.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:s}=t.fixtures,c=s.browser,{orgId:l,runId:u}=t.inputs,d=s.executeAbortController.signal;Object.keys(r).length>0&&(o.setInputs(r),n.info(Ki({json:{inputs:r,moduleId:e.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,g,h;if(e.cacheConfig||e.defaultCacheAllInvocations){let f=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await qr({orgId:l,s:f,context:o,logger:n,localTools:a,signal:d});h={orgId:l,cacheKeys:[S,...Object.entries(r).map(([y,T])=>`${y}:${T}`)]},n.info({original:f,keyParams:h},"Module cache key params");let b=Date.now();for(;Date.now()-b<tx;){d?.throwIfAborted();let y=await i.getCacheResult(h);if(y){n.info({cacheResult:Tt(y,1e3,!0)},"Got result from module execution cache"),p=Ih(e,r,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(y),m=!0;break}else n.info({cacheKey:f,keyParams:h},"No cache result found, continuing with lock acquisition");let T=await i.acquireCacheLock({keyParams:h,clientMetadata:`hostName:${B6()};runId:${u}`},d);if(T.acquired){g=T.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:g,cacheKey:f,keyParams:h},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:g,cacheKey:f,keyParams:h},"Failed to acquire cache lock, retrying...");await fe(2500+Math.random()*1e4,d)}}try{if(!p)p=await z6(t);else if(e.autoAuth){let f=em.safeParse(p.data);if(!f.success)throw new M("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);n.debug("Automatically loading auth state after cached module result"),await c.loadAuthState(f.data);let S=!1,b=e.advanced?.cacheInvalidation;if(b&&b.type==="PAGE_CHECK"){let y={type:"CONTENT",value:b.substring},T=await _h({timeout:mo,assertion:y,browser:c,logger:n,signal:d,autoExpandIframes:!!c.userBrowserSettings.autoExpandIframes});T.success?n.debug({invalResult:T},"Cached result still valid after page check, continuing..."):(n.info({invalResult:T},"Invalidating cached result due to page check failure"),S=!0)}if(h&&S)return await i.deleteCacheResult(h),$T(t)}}finally{try{g!==void 0&&!m&&p?.status==="SUCCESS"&&await H6({step:e,result:p,browser:s.browser,cacheKeyPrefix:g,logger:n,storage:i})}finally{g!==void 0&&await i.releaseCacheLock(g)}}return p},z6=async t=>{let{step:e,tracer:r}=t.moduleParams,n=Ih(e,t.moduleParams.resolvedInputs,"SUCCESS"),o=await r.startSubSteps(),{status:i,results:a}=await t.executeStepList({...t,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}});return n.results=a,n.status=i,n.finishedAt=new Date,Hn({asyncTasks:t.work.asyncTasks,nestedResults:a,result:n,logger:t.fixtures.logger}),n};function Ih(t,e,r){let n={};return Object.entries(e).forEach(([i,a])=>{n[i]=JSON.stringify(a)}),{type:"MODULE",id:t.id,moduleId:t.moduleId,moduleName:t.name,startedAt:new Date,cacheConfig:t.cacheConfig,inputs:n,results:[],finishedAt:new Date,status:r}}async function U0({orgId:t,step:e,context:r,logger:n,codeEvalTools:o,signal:i}){let a={};try{for(let s of e.parameters??[]){let c=e.inputs?.[s]??e.defaultParameters?.[s];if(!c){n.warn(`No value or default found for parameter '${s}' that is required by module '${e.name}'`);continue}a[s]=await ra({orgId:t,code:c,fragment:!0,context:r,logger:n,localTools:o,signal:i})}return a}catch(s){throw i?.throwIfAborted(),new M("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function H6({step:t,result:e,browser:r,cacheKeyPrefix:n,logger:o,storage:i}){let a=t.cacheConfig?.cacheExpiryMs;(!a||a===Wx)&&(a=t.defaultCacheTtl??qx);let s;t.autoAuth?s=JSON.stringify(await r.saveAuthState()):e.data!==void 0?s=JSON.stringify(e.data):s='""',o.debug({cacheKeyPrefix:n,ttlMs:a,truncatedCacheResultJson:Ki({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function bs(t,e,r){return j6(t,e,r)}async function j6(t,e,r){let n=new Date;try{return r.throwIfAborted(),await e()}catch(o){let i=new Date,a="FAILED",s;if(r.aborted||o instanceof DOMException&&o.name==="AbortError"?(s="Step aborted by user.",a="CANCELLED"):o instanceof M?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,t.type==="RESOLVED_MODULE"){let c=Ih(t,{},"FAILED");return c.message=s,c.startedAt=n,c.finishedAt=i,c}return{...Ig(t),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function ic(t,e){let r=!1;try{return t&&!t.state.failureRecoveryDisabled&&(t.state.failureRecoveryDisabled=!0,r=!0),await e()}finally{t&&r&&(t.state.failureRecoveryDisabled=void 0)}}import{cloneDeep as h8}from"lodash-es";import{randomUUID as F0}from"crypto";import{diff as G6}from"deep-object-diff";import{cloneDeep as B0}from"lodash-es";var Ph=async t=>{let{step:e,tracer:r}=t.presetParams,{logger:n,controller:o,context:i}=t.fixtures,{collectDebugData:a}=t.options,{testMetadata:s}=t.inputs,c=e.command.type,l=n.child({commandType:c,stepId:e.id,commandId:e.command.id}),u="cache"in e.command&&e.command.cache?B0(e.command.cache):{},d=o.browser.url(),p=new Date,m,g=F0(),h=F0();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();r.attachBeforeHtmlSnapshot({logger:l,snapshotId:g,html:T})}}catch(T){l.debug({err:T},"Failed to take before screenshot, continuing...")}let f,S,b,y=jp();try{let T=await o.executePresetCommand(y,r,e.command,i,s?.advanced.disableAICaching??!1);T.beforeScreenshotOverride&&(m=T.beforeScreenshotOverride),b=T.afterScreenshotOverride;let w=new Date,P=o.browser.url();S={beforeUrl:d,afterUrl:P,startedAt:p,finishedAt:w,viewport:o.browser.getViewport(),status:T.fail?"FAILED":"SUCCESS",elementInteracted:T.elementInteracted},f={...e,message:T.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:P,finishedAt:w,startedAt:p,status:T.fail?"FAILED":"SUCCESS",data:T.data,results:[S]},"assertion"in e.command&&(f.message=T.thoughts||"Assertion passed.")}catch(T){l.error({message:T.message,stack:T.stack},`Failed executing preset step ${ni(e.command)}`);let w=o.browser.url(),P=new Date,A=T instanceof Error?T.message:`${T}`;S={beforeUrl:d,afterUrl:w,startedAt:p,finishedAt:P,viewport:o.browser.getViewport(),status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:A},f={...e,startedAt:p,finishedAt:P,beforeUrl:d,afterUrl:w,status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:A,failureReason:T instanceof M?T.reason:void 0,results:[S]}}finally{let T="cache"in e.command&&e.command.cache?B0(e.command.cache):{},w=G6(u,T);w&&Object.keys(w).length>0&&l.info({diffs:rm(w)},"Updated cache")}if(a)try{if(b||(b=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();r.attachAfterHtmlSnapshot({logger:l,snapshotId:h,html:T})}}catch(T){l.debug({err:T},"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=g,f.beforeSnapshot=g,S.afterSnapshot=h,f.afterSnapshot=h,m&&r.attachBeforeScreenshot({snapshotId:g,screenshot:m}),b&&r.attachAfterScreenshot({snapshotId:h,screenshot:b}),f};async function V6(t,e,r){let{tracer:n}=t.conditionalParams,{logger:o,controller:i}=t.fixtures,a=e.assertion.command;a.type==="AI_ASSERTION"&&(a.source="CONDITIONAL_CHECK");try{let s=await Ph({...t,presetParams:{tracer:n,step:e.assertion}});switch(a.type){case"AI_ASSERTION":case"PAGE_CHECK":return s.status==="SUCCESS"?{type:"passed",conditionResult:s,steps:e.steps}:(o.info(s.message,`${a.type} condition ${r} resolved to false`),{type:"failed",conditionResult:s});case"JAVASCRIPT":{if(s.status==="FAILED")return{type:"execution_error",conditionResult:s};let c=!!s.data;return s.status=c?"SUCCESS":"FAILED",s.message=c?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,o.info({returnValue:s.data,conditionPassed:c},`JavaScript condition ${r} evaluated`),c?{type:"passed",conditionResult:s,steps:e.steps}:{type:"failed",conditionResult:s}}default:return(l=>{throw new Error(`Unsupported conditional command type: ${l}`)})(a.type)}}catch(s){o.error({err:s},`Condition ${r} failed with error`);let c=s instanceof Error?s.message:"Unknown error during condition evaluation";return{type:"execution_error",conditionResult:{...e.assertion,status:"FAILED",message:c,startedAt:new Date,finishedAt:new Date,results:[]}}}finally{a.type==="AI_ASSERTION"&&delete a.source,i.throwIfClosed()}}function $6(t,e,r,n){let o=n.slice(r.length);for(let i=0;i<t.blocks.length;i++){let a=t.blocks[i],{result:s}=kl(a.steps,e,o);if(s)return i}return-1}async function z0(t){let{step:e,tracer:r}=t.conditionalParams,{logger:n}=t.fixtures,{fromStep:o}=t.inputs,i=new Date,a=Ig(e),s=r.getParentStepIdChain().concat(e.id),c=!!o&&rd(s,o.parentStepIdChain),l=e.elseSteps,u=!0,d=[],p,m=jp(),g=!1;if(c&&o){let y=$6(e,o.fromStepId,s,o.parentStepIdChain);y>=0&&(l=e.blocks[y].steps,u=!1,g=!0,n.info(`Skipping conditional assertion (execution starts from step within block ${y}), running ${l.length} steps`))}if(!g)for(let y=0;y<e.blocks.length;y++){n.info(`Evaluating condition ${y} in conditional step`);let T=e.blocks[y],w=await V6(t,T,y);if(d.push(w.conditionResult),p=w.conditionResult,w.type==="execution_error"){let P={...a,assertionResult:w.conditionResult,status:"FAILED",startedAt:i,finishedAt:new Date,message:w.conditionResult.message,results:[],details:m.details};return Hn({asyncTasks:t.work.asyncTasks,nestedResults:d,result:P,logger:n}),P}if(w.type==="passed"){n.info(`Condition ${y} resolved to true, executing the corresponding ${w.steps.length} steps`),u=!1,l=w.steps;break}}if(l)u&&n.info("No conditions resolved to true, executing the else block steps");else{n.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped");let y={...a,assertionResult:p,status:"SUCCESS",startedAt:i,data:d[d.length-1]?.data,message:d[d.length-1]?.message,results:[],finishedAt:new Date,details:m.details};return Hn({asyncTasks:t.work.asyncTasks,nestedResults:[...d],result:y,logger:n}),y}n.info(`Executing ${l.length} steps in the selected conditional block`);let h=await t.conditionalParams.tracer.startSubSteps(),f=await t.executeStepList({...t,listParams:{steps:l,containerName:"conditional block",tracer:h}}),b={...a,assertionResult:p,...f,startedAt:i,finishedAt:new Date};return Hn({asyncTasks:t.work.asyncTasks,nestedResults:[...d,...f.results],result:b,logger:n}),b}import{randomUUID as H0}from"crypto";var j0=async t=>{let{tracer:e}=t.aiStepParams,{controller:r}=t.fixtures;await r.browser.waitForStability();let n=await r.browser.screenshot({}),o=await W6(t);o.finishedAt=new Date,Hn({asyncTasks:t.work.asyncTasks,result:o,nestedResults:o.results,logger:t.fixtures.logger});let i=await r.browser.screenshot({}),a=H0();o.beforeSnapshot=a,e.attachBeforeScreenshot({snapshotId:a,screenshot:n});let s=H0();return o.afterSnapshot=s,e.attachAfterScreenshot({snapshotId:s,screenshot:i}),o},W6=async t=>{let{step:e,tracer:r}=t.aiStepParams,{controller:n,context:o,logger:i}=t.fixtures,a={...e,startedAt:new Date,beforeTestContext:o.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in e&&e.steps&&e.steps.length>0&&e.steps[e.steps.length-1]?.command.type==="SUCCESS"))throw new M("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await r.startSubSteps(),{status:l}=await t.executeStepList({...t,listParams:{steps:e.steps,containerName:"AI action",results:a.results,tracer:c}});return a.finishedAt=new Date,a.status=l,a}catch(c){i.warn({err:c},"Failed executing saved deprecated AI action steps");let l=n.executeAbortController.signal.aborted;a.message=c instanceof Error?c.message:`${c}`,a.status=l?"CANCELLED":"FAILED"}return a};import{randomUUID as YT}from"crypto";var G0=t=>{throw new Error(`Exhaustive check failed for value: ${t}`)};import{streamText as n8}from"ai";var Mh=class{controller;logger;rootStep;subStepIndex=0;callbacks;results=[];constructor(e){this.controller=e.controller,this.logger=e.logger,this.rootStep=e.rootStep,this.callbacks=e.callbacks}finalState=void 0;async createAndExecuteStep(e){this.callbacks.onAiActionEvent?.({type:"SUBSTEP_CREATED",rootStep:this.rootStep,step:e});let r=this.subStepIndex++,n=await this.callbacks.executeStep(e,r);return this.results.push(n),n}recordGenericToolCall(e){this.callbacks.onAiActionEvent?.({type:"GENERIC_TOOL_CALLED",toolName:e,rootStep:this.rootStep})}};import{hasToolCall as t8,stepCountIs as r8}from"ai";import V0 from"dedent";var K6=V0`
|
|
4611
4611
|
You cannot interact with the user directly. If you feel like you need to ask the user for clarification, or you are stuck, call the "finish" tool with success=false. Never output text without calling a tool.
|
|
4612
4612
|
`,$0=t=>V0`
|
|
4613
4613
|
<background>
|
|
@@ -4644,7 +4644,7 @@ Momentic users value the following:
|
|
|
4644
4644
|
${A}`}),p;case"RIGHT_TRACK":{y=void 0,S===0?l.onDynamicAIActionEvaluatingEvent?.({stepId:e.id,status:"RUNNING",message:A}):O&&l.onDynamicAIActionEvaluatingEvent?.({stepId:O,status:"SUCCESS",message:A});break}case"WRONG_TRACK":{if(y=`${A}
|
|
4645
4645
|
${P.feedback}`,b++,b>=i8)return p.message=`Our AI agent requires additional information to achieve this goal:
|
|
4646
4646
|
${A}
|
|
4647
|
-
${P.feedback}`,p.status="FAILED",l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:p.message}),p;O&&l.onDynamicAIActionEvaluatingEvent?.({stepId:O,status:"FAILED",message:P.feedback});break}case"IMPOSSIBLE":return p.message=`Our AI evaluator determined this task cannot be achieved: ${A}`,p.status="FAILED",l.onDynamicAIActionEvaluatingEvent?.({stepId:O??e.id,status:"FAILED",message:p.message}),p}let L=setTimeout(()=>{l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:S,lastActionHint:y},`Generating new sub-command ${S} within AI action`);let N,j;try{({command:N,reasoning:j}=await i.promptToCommand({goal:m,history:f,startingScreenshot:h,disableCache:n?.advanced.disableAICaching??!1,logger:d,actionHint:y,langfuseSessionId:u})),d.info({command:N,reasoning:j},"Got proposed command")}finally{clearTimeout(L)}if(N.type==="FAILURE")return clearTimeout(L),p.status="FAILED",p.message=`Our AI agent determined that no supported actions can fulfill the goals: ${j}`,p;let W={id:YT(),type:"PRESET_ACTION",command:N},B={substepIndex:S+1,message:j||"Generated new command."};l.onDynamicCommandGenerated?.({...B,step:W,parentStepId:e.id}),d.info({commandId:N.id},`Executing sub-command ${S} within AI step: ${ni(N)}`);let xe=await r.startSubSteps(),z=(await t.executeStepList({...t,options:{...t.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[W],tracer:xe}})).results[0];l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForStability({logger:d});let ae=await i.browser.screenshot({clearHighlights:!0,retries:1});p.results.push(z),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${ae.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:ni(N),elementInteracted:z.results[0]?.elementInteracted,thoughts:j});let ue={substepIndex:S,output:{...z,message:z.message??"Successfully executed preset action."},step:W,parentStepId:e.id};if(l.onDynamicCommandExecuted?.(ue),await r.finish({output:Dp.parse(z),step:z,message:z.message,attempt:1}),z.status==="FAILED")if(p.status="FAILED",p.message=z.message,b<3)b++,T=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${z.message}`;else return p;else if(z.status==="CANCELLED")return p.status="CANCELLED",p.message=z.message,p;S++}};import{randomUUID as l8}from"crypto";var c8=3;async function tk(t){let{logger:e}=t.fixtures,{results:r}=t.failureRecoveryParams,n=r[r.length-1],o=d8(t.work,n);if(o)return e.info({failedResult:n,isNotEligible:o},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${o}`};e.info({failedResult:n},"Attempting failure recovery"),t.work.state.failureRecoveryAttempts=(t.work.state.failureRecoveryAttempts??0)+1;try{return await u8(t)}catch(i){return e.warn({err:i},"Error during failure recovery attempt, continuing..."),null}}async function u8(t){let{fixtures:e,work:r,failureRecoveryParams:n}=t,{controller:o,logger:i}=e,{testMetadata:a}=t.inputs,{results:s,failedStep:c,nextSteps:l,tracer:u}=n;if(!s.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(r.asyncTasks??[]);let d=o.browser.url(),p=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,m=(await o.browser.getBrowserState({})).serialize(),{results:g}=await zl(i,u,s,{numStepsWithScreenshots:8,addIndices:!0,includeBeforeScreenshots:!1}),h=l.map(x=>ii(x)),f=a?.description?.trim(),S=a?.advanced?.failureRecoveryInstructions?.trim(),{scenario:b,thoughts:y,instructions:T}=await o.getFailureRecoveryPlan({currentUrl:d,currentScreenshot:p,failedResults:g,currentPageState:m,nextStepsSerialized:h,testDescription:f||void 0,customInstructions:S||void 0});if(b!=="RECOVERABLE")return i.info({scenario:b,thoughts:y,instructions:T},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${y}`};if(!T)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let w={id:l8(),type:"AI_ACTION_DYNAMIC",text:T},P=await ic(t.work,()=>t.executeStepList({...t,fixtures:{...t.fixtures},listParams:{steps:[w,c],containerName:"AI-recovered step list",tracer:u}})),A=P.results[0];if(A&&A.type==="AI_ACTION_DYNAMIC")if(fg({results:P.results,onPresetAction:x=>{x.aiSuggested=!0},onSimpleStepContainer:x=>{x.aiSuggested=!0}}),P.status==="SUCCESS"){let x=`The following steps were automatically executed by the failure recovery agent. Analysis: ${y}`;return A.message=x,ir.increment("test_event",1,["name:failure_recovery_success",`orgId:${t.inputs.orgId}`]),i.info({thoughts:y},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:P,message:x}}else{ir.increment("test_event",1,["name:failure_recovery_failure",`orgId:${t.inputs.orgId}`]);let x=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${y}`;return A.message=x,i.info({thoughts:y},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:P,message:x}}return null}function d8(t,e){if(!e)return"There is no failed result";if(e.type!=="PRESET_ACTION")return"The failed step is not a preset action";let r=e.message;return r?r.includes("AbortError:")?"The user aborted the test":TR.some(n=>r.includes(n))?"The failed step is an irrecoverable configuration error":(t.state.failureRecoveryAttempts??0)>c8?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}import{randomUUID as Oh}from"crypto";import p8 from"fast-json-patch";import{cloneDeep as m8}from"lodash-es";async function rk(t){let e=t.failedResults,r=[],{sectionParams:n,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:s,tracer:c}=t,{step:l}=n,{controller:u,logger:d}=o,p=l?.autohealingConfig,m=p?.restartBehavior??{type:"GO_TO_SECTION_START"},g=p?.attempts??1;for(let h=0;h<g;h++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let f=m8(l.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:S}=await zl(d,c,e.results,{numStepsWithScreenshots:4}),b=await u.runSectionAutohealing({results:S,errorMessage:e.terminalResult?.message,goal:l.description});f=p8.applyPatch(f,b.patches).newDocument;let y=zr.fromSnapshot({snapshot:s,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await g8({logger:d,controller:u,tracer:c,context:y,restartConfig:m,startingUrl:a});let T=await ic(t.work,()=>t.executeStepList({...t,fixtures:{...t.fixtures,context:y},listParams:{steps:f,containerName:"auto-healed step list",tracer:c}}));if(r.push(T.results),T.status==="SUCCESS")return{successfulHealing:{proposedStep:{...l,steps:f},listResult:T,context:y},healingAttempts:r};e=T}return{healingAttempts:r}}async function g8({logger:t,controller:e,tracer:r,restartConfig:n,context:o,startingUrl:i}){switch(n.type){case"NAVIGATE_URL":{let a={id:Oh(),type:"PRESET_ACTION",command:{id:Oh(),type:"NAVIGATE",url:n.url}},s=await r.startStep({logger:t,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}case"GO_TO_SECTION_START":{let a={id:Oh(),type:"PRESET_ACTION",command:{id:Oh(),type:"NAVIGATE",url:i}},s=await r.startStep({logger:t,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}}}function nk(t,e){switch(t||(t="ON_FAILURE"),t){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&zA(e.command.type))}}async function ok(t){let{step:e,tracer:r}=t.sectionParams,{logger:n,controller:o,context:i}=t.fixtures,a=new Date,s=o.browser.url(),c=i.toObjectCopy(),l=await r.startSubSteps(),u=async()=>t.executeStepList({...t,listParams:{steps:e.steps,containerName:"section step list",tracer:l}}),d=e.autohealingConfig?await ic(t.work,u):await u(),p,m;if(d.status==="FAILED"&&e.autohealingConfig&&!t.work.state.autoHealingDisabled&&nk(e.autohealingConfig.trigger,d.terminalResult)){let h=await r.startSubSteps(),f=await rk({...t,startingContextSnapshot:c,startingUrl:s,failedResults:d,tracer:h});f.successfulHealing&&(p=f.successfulHealing.proposedStep,d=f.successfulHealing.listResult,t.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let g={...e,...d,startedAt:a,finishedAt:new Date,proposedStep:p,healingAttempts:m};return Hn({asyncTasks:t.work.asyncTasks,nestedResults:d.results,result:g,logger:n}),g}var f8=60*60*1e3;async function ao(t){let{results:e=[],containerName:r,steps:n,tracer:o}=t.listParams,{logger:i}=t.fixtures,a=o.getParentStepIdChain(),{fromStep:s,toStep:c}=t.inputs,l="SUCCESS",u,d=0;for(d;d<n.length;d++){let p=n[d];if(p.skipped)continue;if(t.work.fastForwardingToStep&&s){let b=JSON.stringify(a);if(p.id===s.fromStepId&&b===JSON.stringify(s.parentStepIdChain))t.work.fastForwardingToStep=!1;else if(!jM(p,a,s.fromStepId,s.parentStepIdChain))continue}let m=ii(p),g=0,h=1,f=Date.now();"retries"in p&&p.retries&&p.retries>0&&(h+=p.retries);let S;for(;g<h&&Date.now()-f<f8;){g++,i.info({step:IO(p),currentAttempt:g},`Executing step ${d+1}/${n.length} in ${r}: ${m}`);let b=Date.now(),{stepResult:y,status:T,failureRecoveryResults:w,shouldStopExecuting:P}=await S8({attempt:g,params:t,step:p,i:d,steps:n,results:e,currentParentIdChain:a,fromStep:s,toStep:c,lastRetry:g===h});if(T==="FAILED"&&g<h){S=[...S??[],y],Date.now()-b<1e3&&await Se(1e3-(Date.now()-b));continue}else e.push(y),S&&(y.previousAttempts=S);if(w&&e.push(...w),P)return l=T,u=y,{status:l,results:e,terminalResult:u};break}}return{status:l,results:e,terminalResult:u}}async function S8({attempt:t,params:e,step:r,i:n,steps:o,results:i,currentParentIdChain:a,fromStep:s,toStep:c,lastRetry:l}){let{tracer:u}=e.listParams,{logger:d,context:p,controller:m,codeEvalTools:g,usageTracker:h}=e.fixtures,{orgId:f}=e.inputs,S=new Date,b=!!s&&rd(a.concat(r.id),s.parentStepIdChain),y=await u.startStep({logger:d,step:r,attempt:t,skipStatusEvents:b}),T=h8(r),w=p.toRedactedDisplayCopy(),P=m.browser.url(),A=m.executeAbortController.signal;h.trackStepExecution(r);let x,O;switch(r.type){case"PRESET_ACTION":{x="Preset action",O=await bs(r,async()=>await Ph({...e,presetParams:{tracer:y,step:r}}),A);break}case"AI_ACTION":{x="AI action",O=await bs(r,()=>j0({...e,aiStepParams:{step:r,tracer:y},executeStepList:ao}),A);break}case"AI_ACTION_DYNAMIC":{x="AI action",O=await bs(r,()=>Q0({...e,aiStepParams:{step:r,tracer:y},executeStepList:ao}),A);break}case"RESOLVED_MODULE":{x=`Module (${r.name})`,O=await bs(r,async()=>{let B=await U0({orgId:f,step:r,context:p,logger:d,codeEvalTools:g,signal:A});return $T({...e,executeStepList:ao,moduleParams:{step:r,resolvedInputs:B,tracer:y}})},A);break}case"CONDITIONAL":{x="Conditional step",O=await bs(r,()=>z0({...e,conditionalParams:{step:r,tracer:y},executeStepList:ao}),A);break}case"SECTION":{x="Section",O=await bs(r,()=>ok({...e,sectionParams:{step:r,tracer:y},executeStepList:ao}),A);break}default:return(xe=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}O.beforeUrl=O.beforeUrl??P,O.beforeTestContext=w,r.envKey&&p.setVariable(r.envKey,O.data);let L=m.browser.url();p.setCurrentUrl(L),O.afterUrl=O.afterUrl??L,O.afterTestContext=p.toRedactedDisplayCopy(),await y8({step:r,startedAt:S,stepTypeName:x,result:O,callbacks:e.callbacks,globalWorkRef:e.work,tracer:y,attempt:t});let N,j;if(l&&O.status==="FAILED"&&!e.work.state.failureRecoveryDisabled&&s?.fromStepId===void 0&&c?.toStepId===void 0){let B=await tk({...e,executeStepList:ao,failureRecoveryParams:{failedStep:T,nextSteps:o.slice(n+1),results:i.concat(O),tracer:u}});B&&(B.type==="ATTEMPTED"?(N=B.result.results,j=B.status):B.type==="NOT_ELIGIBLE"&&(O.message=O.message?`${O.message} ${B.message}`:B.message),O.type==="PRESET_ACTION"&&(O.failureRecoveryStatus={type:B.type,message:B.message}))}return e.work.fastForwardingToStep&&s&&(s.fromStepId===r.id&&JSON.stringify(a)===JSON.stringify(s.parentStepIdChain)&&(e.work.fastForwardingToStep=!1),r.type==="RESOLVED_MODULE"&&rd(a,s.parentStepIdChain)&&(e.work.fastForwardingToStep=!1)),O.status!=="SUCCESS"&&j!=="SUCCESS"||m.closed?{shouldStopExecuting:!0,status:O.status,stepResult:O,failureRecoveryResults:N}:c&&r.id===c.toStepId&&JSON.stringify(a)===JSON.stringify(c.parentStepIdChain)?(m.setClosed(),{shouldStopExecuting:!0,status:"SUCCESS",stepResult:O,failureRecoveryResults:N}):{shouldStopExecuting:!1,status:"SUCCESS",stepResult:O,failureRecoveryResults:N}}async function y8({stepTypeName:t,step:e,result:r,tracer:n,attempt:o,startedAt:i}){let a=t.toLowerCase(),s=t.charAt(0).toUpperCase()+t.slice(1);n.recordStepDuration({step:e,durationMs:Date.now()-i.getTime()});let c="";switch(r.status){case"SUCCESS":c=r.message??`${s} executed successfully.`;break;case"FAILED":c=r.message??`${s} failed.`;break;case"CANCELLED":c=r.message??`${s} cancelled.`;break;default:throw new Error(`Unexpected ${a} status: ${r.status}`)}await n.finish({step:r,message:c,output:Dp.parse(r),attempt:o})}var ik="MOMENTIC_RUN_ID",ak="FINAL_SCREENSHOT_URL";import{randomUUID as sk}from"crypto";async function lk({browser:t,signal:e}){let r=new Date;try{return await t.navigate({url:t.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(n){let o={id:sk(),type:"PRESET_ACTION",status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:n.message,startedAt:r,finishedAt:new Date,results:[],command:{id:sk(),type:"NAVIGATE",url:t.baseUrl}};return{status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var Lh=async t=>{let{orgId:e,runId:r,testMetadata:n,steps:o,beforeSteps:i,afterSteps:a}=t.inputs;t.fixtures.logger=t.fixtures.logger.child({orgId:e,runId:r,testId:n?.id});let{logger:s,controller:c}=t.fixtures,{onTestComplete:l,onTestSuccess:u,onTestFailure:d}=t.callbacks.test,p=E_(s);if(t.options.reinitializeBrowser){let g=await lk({browser:c.browser,signal:c.executeAbortController.signal});if(g.status!=="PASSED")return await l?.(),clearInterval(p?.interval),g}let m;try{return s.info({platform:p?.platform,cpuMetadata:p?.cpuMetadata,labels:n?.labels,orgSettings:mC.parse(t.inputs.orgSettings)},`Starting run for Momentic test '${n?.name??"Unnamed test"}'`),m=await E8(t),m}finally{s.info({status:m?.status,labels:n?.labels},"Momentic test final result"),clearInterval(p?.interval),await l?.(),m?.status==="PASSED"?await u?.({steps:o,beforeSteps:i,afterSteps:a}):m?.status==="FAILED"&&await d?.({steps:o,beforeSteps:i,afterSteps:a})}};function b8({beforeStatus:t,mainStatus:e,afterStatus:r}){return t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":r==="FAILED"?"FAILED":r==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}var E8=async t=>{let{tracer:e}=t.testParams,{fromStep:r,toStep:n,steps:o,beforeSteps:i,afterSteps:a}=t.inputs,{logger:s,controller:c,context:l,storage:u}=t.fixtures,{collectDebugData:d,disableHealing:p}=t.options;l.setCurrentUrl(c.browser.url());let m="test",g=o,h=[],f=p||r!==void 0||n!==void 0||void 0,S={results:h,state:{autoHealingDisabled:f,failureRecoveryDisabled:f,failureRecoveryAttempts:0},asyncTasks:[]},b=!1;r?.fromStepId&&r.fromStepId===n?.toStepId?(m="filtered step",S.fastForwardingToStep=!0):r?.fromStepId?(m="partial steps list from step",S.fastForwardingToStep=!0):n?m="partial steps list until step":(m="entire test",b=!0);let y,T,w;if(b&&i&&i.length>0){let j=await ck(i,"beforeSteps",t);y=j.status,T=j.results,w=j.terminalResult?{...j.terminalResult,failureReason:"SetupFailureError"}:void 0,S.state.failureRecoveryAttempts=(S.state.failureRecoveryAttempts??0)+(j.failureRecoveryAttempts??0)}let P,A;if(y===void 0||y==="PASSED"){s.info({fromStep:r,toStep:n},`Starting execution of ${m}`);let j=await e.startMainStepList(),W=await ao({...t,work:S,listParams:{steps:g,containerName:m,results:h,tracer:j}});P=W.status,A=W.terminalResult}let x,O,L;if(b&&a&&a.length>0){let j=await ck(a,"afterSteps",t);x=j.status,O=j.results,L=j.terminalResult?{...j.terminalResult,failureReason:"TeardownFailureError"}:void 0,S.state.failureRecoveryAttempts=(S.state.failureRecoveryAttempts??0)+(j.failureRecoveryAttempts??0)}let N=b8({beforeStatus:y,mainStatus:P,afterStatus:x});if(d&&T8({tracer:e,work:S,controller:c,storage:u,context:l,logger:s,status:N}),await Promise.allSettled(S.asyncTasks),S.asyncTasks.push(Promise.resolve(t.callbacks.test.onSaveFinalRunResults?.({results:h,beforeResults:T,afterResults:O}))),N==="FAILED"){let j=y==="FAILED"?w:void 0,W=x==="FAILED"?L:void 0;return{status:"FAILED",results:h,beforeResults:T,afterResults:O,failedStepResult:j??A??W}}else if(N==="CANCELLED")return{status:"CANCELLED",results:h,beforeResults:T,afterResults:O};return{status:"PASSED",failureRecoveryDetails:S.state.failureRecoveryAttempts?{attempts:S.state.failureRecoveryAttempts}:void 0,results:h,beforeResults:T,afterResults:O}};async function ck(t,e,r){let n=r.fixtures.logger,o=e==="beforeSteps"?await r.testParams.tracer.startBeforeStepList():await r.testParams.tracer.startAfterStepList();n.info(`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{}},a={...r.callbacks,test:{...r.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0}},{status:s,results:c,terminalResult:l}=await ao({...r,work:i,callbacks:a,listParams:{steps:t,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let u;return s==="SUCCESS"?u="PASSED":s==="CANCELLED"?u="CANCELLED":u="FAILED",{status:u,results:c,terminalResult:l,failureRecoveryAttempts:i.state.failureRecoveryAttempts}}function T8({tracer:t,work:e,controller:r,storage:n,logger:o,context:i,status:a}){let s=r.browser,c=s.retrieveAndClearDebugData(),l=XM(c.logsPerPage);t.attachConsoleLogs({logger:o,logs:l}),a!=="PASSED"&&a!=="SUCCESS"&&(t.attachBrowserCrashDump({crashReportDirFetcher:()=>s.browserCrashDumpDir,logger:o}),e.asyncTasks.push((async()=>{try{let u=await s.screenshot({quality:75}),d=await c0({codePath:"test-complete-final",storage:n,screenshotBuff:u,logger:o}),p=await X(s.html(),{milliseconds:2e3});i.setVariable(ak,d),o.debug({finalPageHtml:p.slice(0,1e4)},"Final page state HTML"),o.debug({finalScreenshotUrl:d},"Uploaded final screenshot URL")}catch{}})()))}import{z as ca}from"zod";var Nh=ca.object({fromStepId:ca.string(),parentStepIdChain:ca.array(ca.string())}),Dh=ca.object({toStepId:ca.string(),parentStepIdChain:ca.array(ca.string())});async function kh({settings:t,customHeaders:e,envVariables:r,envName:n,testName:o,baseUrl:i,logger:a,localTools:s,orgId:c}){let l=Qs.parse(t);e&&(l.extraHeaders={...l.extraHeaders,...e});let u=new zr({baseUrl:i,envName:n,testName:o,variablesFromEnvironment:r,currentUrl:i});await ch({obj:l,context:u,bannedKeys:[],allowList:dC,localTools:s,logger:a,orgId:c});try{return Qs.parse(l)}catch(d){throw new M("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${d.message}`)}}async function uk({orgId:t,testName:e,envName:r,baseEnvVariables:n,parameters:o,logger:i,localTools:a}){if(!o||o.length===0)return{...n};let s={...n};return await Promise.all(o.map(async c=>{let l=await qr({orgId:t,s:c.defaultValue,context:zr.dummyContext(e,r,s),logger:i,localTools:a});s[c.name]=l})),s}import{cloneDeep as w8}from"lodash-es";import{cloneDeep as v8}from"lodash-es";var A8={showOverlay:!1},Uh=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:r,cleanup:n,clientIp:o,sessionId:i,socket:a}){return this.sessions.set(i,{controller:e,context:r,cleanup:n,clientIp:o,browserBehavior:v8(A8),socket:a}),i}removeSession(e,r){(async()=>{let o=this.sessions.get(e);if(!o)return;this.releaseCapacityByIp(o.clientIp);let{controller:i}=o;try{i.setClosed(),await i.browser.cleanup()}catch(a){r.error({err:a},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(a){r.error({err:a},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}};function dk(t,e,r,n){let o=Date.now(),i=Date.now(),a,s,c,l,u=!1,d=async(h,f)=>{if(!h.closed&&!h.isInPageLoad)try{let S=c;c=void 0;let b=h.url(),y=f.toEditorDisplayCopy();JSON.stringify(y)===JSON.stringify(a)&&b===l&&o>i||(t.emit("browserState",{logsPerPage:S?.logsPerPage,viewport:h.getViewport(),url:b,iframeSrcUrls:s??[],context:y,isInPageLoad:h.isInPageLoad}),o=Date.now()),l=b,a=y}catch(S){if(!t.connected)return;let b=S instanceof Error?S.message:`${S}`;if(b.includes("Frame was detached")||b.includes("Not attached to an active page")||b.includes("browser has been closed")||b.includes("UserInfrastructureError"))return;r.error({err:S,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let h=n.getSession(e),f=h?.controller?.browser;if(!f||f.closed){r.debug("Clearing browser state socket cron due to the browser being closed"),clearInterval(p);return}d(f,h.context)},1e3),m=(h,f)=>!!(JSON.stringify(h)!==JSON.stringify(s)||f.logsPerPage.some(S=>S.length>0)),g=setInterval(async()=>{let f=n.getSession(e)?.controller?.browser;if(!f||f.closed){clearInterval(g);return}else if(u)return;u=!0;try{let S=await f.getAllFrameUrls(),b=f.retrieveAndClearDebugData();m(S,b)&&(s=S,c=b,i=Date.now())}catch(S){r.warn({err:S},"Failed to fetch extended details")}finally{u=!1}},2500);return{timers:[p,g]}}async function ac({controller:t,context:e,baseUrl:r,envName:n,testName:o,environmentVariables:i}){await t.browser.reset({newUrl:r});let a=t.browser.baseUrl,s=t.browser.url();return e.reset({baseUrl:a,currentUrl:s,variablesFromEnvironment:i,envName:n,testName:o}),{baseUrl:a,currentUrl:s}}var R8=3;async function pk({socket:t,logger:e,storageFactory:r,uploadedFileStorage:n,visualDiffStorageFactory:o,devicePixelRatio:i,generatorFactory:a,enricherFactory:s,authorization:c,settingsFactory:l,getOrgId:u,branchGetter:d,globalE2eStateManager:p}){let m=t.id,g=t.handshake.query.testId;if(!g)throw new Error("Socket connection request is missing testId");let h=await u({type:"e2e",testId:g}),f=await d?.();e=e.child({testId:g,orgId:h,sessionId:m,branch:f});let S=await a(h,e),b=await s(h,e),y=await l(h,e),T=await r(h),{testMetadata:w,baseUrl:P,envName:A,browserConfig:x,aiSettings:O,environmentVariables:L,localCodeEvalTools:N}=await Fo({testId:g,orgId:h,logger:e,storage:T,authorization:c,settings:y}),j=p.getSession(m);if(j)return e.info("Associating connection with existing session (likely reconnect)"),await j.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:h,testId:g};let W=t.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:W,event:"connect",args:t.handshake.query},"Websocket event (connect)"),W&&p.getCurrentConnectionsByIp(W)>=R8)throw e.error({clientIp:W,sessions:p.getCurrentSessionsByIp(),...t.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");p.reserveCapacityByIp(W);try{await C8({socket:t,baseUrl:P,envName:A,testMetadata:w,orgId:h,sessionId:m,logger:e,environmentVariables:L,clientIp:W,devicePixelRatio:i,storage:T,uploadedFileStorage:n,visualDiffScreenshotStorage:await o(h),localCodeEvalTools:N,generator:S,enricher:b,browserConfig:x,aiSettings:O,globalE2eStateManager:p})}catch(B){throw e.warn({err:B},"Error setting up socket session, possibly due to client closing the connection"),p.releaseCapacityByIp(W),B}return{type:"e2e",sessionId:m,testId:g,orgId:h}}async function C8({socket:t,baseUrl:e,envName:r,devicePixelRatio:n,testMetadata:o,orgId:i,sessionId:a,logger:s,storage:c,uploadedFileStorage:l,visualDiffScreenshotStorage:u,localCodeEvalTools:d,generator:p,environmentVariables:m,browserConfig:g,aiSettings:h,clientIp:f,enricher:S,globalE2eStateManager:b}){let y={viewport:o.advanced?.viewport??Ar,locale:o.advanced?.locale??Pi,timezoneId:o.advanced?.timezone??Mi,geolocation:o.advanced?.geolocation??Oi,colorScheme:o.advanced?.colorScheme};n&&(y.deviceScaleFactor=n);let T=o.id,w=await kh({settings:g,orgId:i,baseUrl:e,envName:r,testName:o.name,localTools:d,envVariables:m,logger:s,customHeaders:void 0});s=s.child({orgId:i,sessionId:a,testId:T});let P=await Gn.init({baseUrl:e,userBrowserSettings:w,enricher:S,storage:c,logger:s,contextArgs:y,iconKnowledgeBase:null,callbacks:{onTabsChange:(N,j)=>{t.emit("tabs",{tabs:N,activeTab:j})},onScreencastFrame:(N,j)=>{let W=t;Mn&&(W=t.compress(!0)),W.emit("screenshot",{buffer:N},()=>{j()})},onSvgsCollected:N=>{t.emit("newIconDetected",{numIcons:N.newSvgs.length}),c.saveNewIcons(N,s)},onNetworkLogs:N=>{t.emit("networkLogs",{harEntries:N})}}});await P.navigate({url:e,initialNavigation:!0});let A=new la({browser:P,generator:p,logger:s,orgId:i,options:{scratchPadId:void 0,slowMoMs:w.slowMoMs,autoFollowNewTabs:w.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:c,localCodeEvalTools:d,uploadedFileStorage:l,visualDiffScreenshotStorage:u}),x=dk(t,a,s,b),O=async()=>{x.timers.forEach(N=>clearInterval(N))},L=new zr({baseUrl:e,testName:o.name,currentUrl:A.browser.url(),variablesFromEnvironment:m,envName:r});if(!t.connected)throw await P.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");t.emit("session",{url:e,userAgent:Gn.USER_AGENT,viewport:A.browser.getViewport(),sessionId:a}),b.registerSession({controller:A,context:L,sessionId:a,cleanup:O,clientIp:f,socket:t})}async function Fo({testId:t,orgId:e,logger:r,storage:n,authorization:o,settings:i}){let a=await n.fetchTestMetadata(t,r);if(!a)throw new Error(`Test metadata could not be found for test ${t}`);let s;o?.type==="API_KEY"&&(s=new Mo({httpClient:new fr({...o,logger:r,mode:"interactive"}),fakerSeed:void 0}));let c=a.envs?.find(h=>h.default),l;c&&(l=await n.fetchEnvironment(c.name,r));let u=l&&"browser"in l?l.browser:void 0,d={...i.browser,...u,...a.advanced};d.browserType=Pp({browserType:d.browserType,orgDefaultBrowserType:i.browser?.defaultBrowserType});let p=a.baseUrl||l?.variables?.[nr];if(!p)throw new Error("Base URL is empty in both test options and the configured environment");let m={...l?.variables};m=await uk({orgId:e,testName:a.name,envName:l?.name,baseEnvVariables:m,parameters:a.parameters,logger:r,localTools:s});let g={...i.ai,...a.advanced};return{localCodeEvalTools:s,baseUrl:p,envName:l?.name,testName:a.name,browserConfig:d,environmentVariables:m,testMetadata:a,aiSettings:g}}var XT=class{parentTracer=null;socket;step;orgId;interactionTracer;skipStatusEvents;constructor({step:e,socket:r,parentTracer:n,orgId:o,skipStatusEvents:i=!1}){this.socket=r,this.parentTracer=n,this.step=e,this.orgId=o,this.skipStatusEvents=i,this.interactionTracer=new pi,di.initializeRootTracerContext(this.interactionTracer)}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}recordStepDuration(e){let r=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;ir.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}recordTargetAutoHeal(){}async finish(e){if(this.interactionTracer.finish(),e.step.trace=this.interactionTracer.getRootSpan(),!this.skipStatusEvents)switch(e.step.status){case"SUCCESS":this.socket.emit("success",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"FAILED":this.socket.emit("failure",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"CANCELLED":this.socket.emit("cancelled",{...e,parentStepIdChain:this.getParentStepIdChain()});return}}async startSubSteps(){return new mi({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},mi=class{stepFrequenciesByType={};parentTracer;parentStep;socket;orgId;recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))ir.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}constructor({parentStep:e,socket:r,parentTracer:n,orgId:o}){this.parentTracer=n,this.parentStep=e,this.socket=r,this.orgId=o}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.recordStepStat(e.step),e.skipStatusEvents||this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain(),attempt:e.attempt}),new XT({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId,skipStatusEvents:e.skipStatusEvents})}async finish(){this.sendFinalizedStepStats()}},Fh=class{constructor(e,r,n,o){this.socket=e;this.storage=r;this.orgId=n;this.testId=o}children=[];loggerBindings;setActiveVideo(){}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}onNetworkPage(){}onNetworkLogs(){}attachConsoleLogs(){}attachBrowserCrashDump(){}async finish(){this.socket.emit("finished"),await Promise.all(this.children.map(e=>e.finish()))}async startBeforeStepList(){let e=new mi({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startMainStepList(){let e=new mi({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startAfterStepList(){let e=new mi({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}};var JT={currentlyExecutingRequests:{}},x8=t=>async(e,r)=>{let{testId:n,orgId:o}=t.metadata,i=await t.settingsFactory(o,t.logger),a=await t.storageFactory(o),s,c=await Fo({testId:n,orgId:o,logger:t.logger,storage:a,authorization:t.authorization,settings:i}),l=`${n}|${c.baseUrl}`;try{let u=JT.currentlyExecutingRequests[l]??0;JT.currentlyExecutingRequests[l]=u+1,s=await _8({...t,...e,...c,done:r})}finally{t.logger.info({result:s,sessionId:t.metadata.sessionId},"Test execution complete"),JT.currentlyExecutingRequests[l]--}},_8=async({socket:t,steps:e,baseUrl:r,testMetadata:n,reInitialize:o,toStep:i,fromStep:a,storageFactory:s,aiSettings:c,browserConfig:l,metadata:u,logger:d,envName:p,testName:m,environmentVariables:g,localCodeEvalTools:h,done:f,cacheStorageFactory:S,globalE2eStateManager:b})=>{let{testId:y,sessionId:T,orgId:w}=u,P=T,A=b.getSession(T);if(!A)throw new Error("No active session found");let{controller:x,context:O}=A;x.setOpen(),d=d.child({testId:y,orgId:w,sessionId:T,runId:P}),d.info({steps:e.map(Q=>`${Q.type}${"command"in Q?` - ${Q.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,testName:m,baseUrl:r,truncatedContext:Ki({json:O,maxJsonStringSize:1e3}),browserConfig:l,aiSettings:c},"Socket execution parameters");let L=g??{},N=async()=>{o&&await ac({controller:x,context:O,baseUrl:r,envName:p,testName:m,environmentVariables:L})},j=await s(w),W=await S(w),B=async()=>{let Q=Date.now();try{await W.resolveStepCacheEntries({schemaVersion:n.schemaVersion,testId:y,stepLists:{steps:e},logger:d})}catch(Te){d.error({err:Te},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}finally{ir.distribution("cache-resolution",Date.now()-Q,["executor:editor"])}};try{await ld({promiseGenerator:async()=>Promise.all([N(),B()]),signal:x.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),x.setOpen()}catch(Q){if(t.emit("finished"),Q.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${Q}`)}let xe=w8(e),F={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},z={orgId:w,runId:P,testMetadata:n,steps:e,fromStep:a,toStep:i,orgSettings:{ai:c,browser:l}},ae={controller:x,context:O,storage:j,codeEvalTools:h,usageTracker:new cl,logger:d},ue={test:{},step:{onDynamicAIActionStatusUpdateEvent:Q=>{t.emit("dynamicCommandStatusUpdate",Q)},onDynamicAIActionEvaluatingEvent:Q=>{t.emit("dynamicCommandEvaluating",Q)},onDynamicCommandGenerated:Q=>{t.emit("dynamicCommandGenerated",Q)},onDynamicCommandExecuted:Q=>{t.emit("dynamicCommandExecuted",Q)}}},_e=new Fh(t,j,w,y),ye=await Lh({fixtures:ae,options:F,callbacks:ue,inputs:z,testParams:{tracer:_e}}),le={logger:d,cacheStorage:W,orgId:w,testId:y,originalStepsWithCaches:{steps:xe},updatedStepsWithCaches:{steps:e}};return ye?.status==="PASSED"?await Hl(le):ye?.status==="FAILED"&&await jl(le),await _e.finish(),f?.(ye),ye.status};var mk={event:"execute",createHandler:x8};import{randomUUID as I8}from"crypto";var P8=({metadata:t,logger:e,storageFactory:r,globalE2eStateManager:n})=>{let{sessionId:o,orgId:i}=t;return async(a,s)=>{let{description:c,command:l,testMetadata:u,returnScreenshot:d}=a;e.info({params:a},`Locate handler called - ${c}`);let p=n.getSession(o);if(!p)throw new Error("No active session found");let{controller:m,context:g}=p;m.setOpen();let h=await r(i),f=Fa.parse(u.advanced??{}),S={},b;if(c){if("useSelector"in l&&l.useSelector)try{let y=await m.locateElementWithSelector(c,"iframeUrl"in l?l.iframeUrl:void 0);b=y.resolution.locator,S={target:y.target,thoughts:y.thoughts}}catch(y){e.warn({err:y},"Failed resolving target with selector"),s({err:`Failed locating element: ${y.message}`,decisions:y instanceof vn?y.decisions:void 0});return}else try{let y=await m.locateElement({description:c,disableCache:f.disableAICaching??!1,skipWait:!0,testContext:g,source:Oa(l),iframeUrl:"iframeUrl"in l?l.iframeUrl:void 0,memory:"cache"in l&&l.cache&&"target"in l.cache&&ip(l.cache.target.memory)?l.cache.target.memory:void 0,logger:e});S={target:y.target,thoughts:y.thoughts},b=y.resolution.locator}catch(y){(async()=>{try{let T=await m.browser.getCondensedHtml({skipWait:!0});e.warn({err:y,html:T.slice(0,1e5)},"Failed locating element with AI")}catch(T){e.warn({err:T},"Failed grabbing HTML after trying to locate element with AI")}})(),s({err:`${y.message}`});return}if(l.type==="SELECT_OPTION"&&b)try{S.options=await m.browser.getSelectOptions(b)}catch(y){e.warn({err:y},"Failed getting select options"),s({err:`Failed getting select options: ${y.message}`});return}e.info({result:S},"Locate handler result")}if(d)try{let{buffer:y,width:T,height:w}=await m.screenshotWithDimensions({clearHighlights:!0,locator:b}),P=I8(),{universalHandle:A,appServerUrl:x}=await h.createOnDemandScreenshot(P,y,"image/jpeg");S.screenshot={data:A,width:T,height:w},e.info({width:T,height:w,appServerUrl:x,universalHandle:A},"Captured screenshot during locate")}catch(y){e.error({err:y},"Error capturing screenshot during locate"),s({err:`Error taking screenshot: ${y.message}`});return}if(s({result:S}),b)try{await Promise.all([m.browser.scrollIntoViewIfNeeded(b),m.browser.highlight(b)])}catch(y){e.warn({err:y},"Error highlighting element, continuing...")}}},gk={event:"locate",createHandler:P8};var M8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({event:o,percentX:i,percentY:a})=>{let s=r.getSession(n);if(!s)throw new Error("No active session found");let c=s.controller.browser;if(c.closed||c.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await c.clickMouseFromPositionPercentages(o,i,a)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},hk={event:"mouseClickEvent",createHandler:M8};var O8=({metadata:t,generatorFactory:e,logger:r,socket:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=t;return async({stepId:c,parentStepIdChain:l,attribute:u})=>{let d=o.getSession(i);if(!d)throw new Error("No active session found");let{controller:p}=d,m=await e(a,r);p.setOpen(),d.browserBehavior.showOverlay=!0;let g=new AbortController;g.signal.addEventListener("abort",async()=>{try{d.browserBehavior.showOverlay=!1,await p.stopRecordMode()}catch(S){r.warn({err:S},"Failed to stop record mode in target click socket handler")}},{once:!0});let h=!1,f=(S,b)=>{b.type!=="PRESET_ACTION"||b.command.type!=="CLICK"||(n.emit("targetRecordingUpdate",{type:S,stepId:c,parentStepIdChain:l,command:b.command,attribute:u}),g.abort(),h=!0)};setTimeout(()=>{h||(g.abort(),n.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:c,parentStepIdChain:l,attribute:u}))},1e4),await p.startRecordMode({params:{generator:m,logger:r,testId:s,orgId:a,callbacks:{onActionReceived:S=>f("clickReceived",S),onStepRecorded:S=>f("descriptionGenerated",S)}},abortController:g,isClickToRecord:!0}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:c,parentStepIdChain:l,attribute:u})}},fk={event:"recordTargetClick",createHandler:O8};var L8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({key:o})=>{let i=r.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyDown(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key down socket event error");return}throw s}}},Sk={event:"keyDownEvent",createHandler:L8};var N8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({key:o})=>{let i=r.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyUp(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key up socket event error");return}throw s}}},yk={event:"keyUpEvent",createHandler:N8};var D8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t,o,i=0,a=(l,u)=>{let d=async()=>{o=void 0};clearTimeout(o),o=setTimeout(d,Math.min(1e3,250*(i+1)))},s,c=0;return async l=>{let u=r.getSession(n);if(!u)throw new Error("No active session found");let{controller:d,browserBehavior:p}=u,m=d.browser;if(m.closed||m.getActivePage().isClosed()){e.warn("Ignoring mouse move because the page is closed");return}if(l.event==="scroll"){let g=await m.scrollFromPositionPercentages(l.percentX,l.percentY,s?.x??0,s?.y??0),h=u.browserBehavior.recordingState?.transformer;h&&g&&h.recordScroll(g);return}p.showOverlay&&a(m,l);try{let g=await m.moveMouseFromPositionPercentages(l.percentX,l.percentY);c=0,s=g}catch(g){c++,c%5===0&&e.warn({err:g,mouseErrors:c},"Error in socket mouse move handler")}}},bk={event:"mouseMoveEvent",createHandler:D8};var k8=({metadata:t,generatorFactory:e,socket:r,logger:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=t;return async({stepId:c})=>{let l=o.getSession(i);if(!l)throw new Error("No active session found");let{controller:u,browserBehavior:d}=l,p=await e(a,n);n.info("Starting cloud recording");let m=new AbortController,g=await u.startRecordMode({params:{generator:p,logger:n,testId:s,orgId:a,callbacks:{onActionReceived:(h,f)=>{r.emit("stepRecorded",{stepId:c,step:h,offset:f})},onStepRecorded:(h,f)=>{r.emit("stepRecorded",{stepId:c,step:h,offset:f})}}},abortController:m,isClickToRecord:!1});d.recordingState={transformer:g}}},Ek={event:"recordingStart",createHandler:k8};var U8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async()=>{let o=r.getSession(n);if(!o)throw new Error("No active session found");e.info("Stopping cloud recording"),await o.controller.stopRecordMode(),o.browserBehavior.recordingState=void 0,o.browserBehavior.showOverlay=!1}},Tk={event:"recordingStop",createHandler:U8};var F8=({socket:t,metadata:e,logger:r,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async(s,c)=>{let{testId:l,sessionId:u,orgId:d}=e;r.info({testId:l,sessionId:u},"Refresh event received");let p=await i(d,r),m=await n(d),{baseUrl:g}=await Fo({testId:l,orgId:d,logger:r,storage:m,authorization:o,settings:p}),h=a.getSession(u);if(!h){t.emit("error",{message:"No session to refresh"});return}let{controller:f}=h;f.setOpen(),await f.browser.refresh();let S=f.browser.getViewport();r.info({baseUrl:g,viewport:S},`Session refreshed for test ${l} at ${g}`),c()},vk={event:"refresh",createHandler:F8};var B8=({socket:t,metadata:e,logger:r,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async()=>{let{testId:s,sessionId:c,orgId:l}=e;r.info({testId:s,sessionId:c},"Reset event received");let u=await i(l,r),d=await n(l),{baseUrl:p,envName:m,testName:g,environmentVariables:h}=await Fo({testId:s,orgId:l,logger:r,storage:d,authorization:o,settings:u}),f=a.getSession(c);if(!f){t.emit("error",{message:"No session to reset"});return}let{controller:S,context:b}=f,{baseUrl:y}=await ac({controller:S,context:b,baseUrl:p,envName:m,testName:g,environmentVariables:h}),T=S.browser.getViewport(),w=Gn.USER_AGENT;r.info({baseUrl:p,viewport:T},`Session reset for test ${s} at ${y}`),t.emit("session",{url:y,userAgent:w,viewport:T,sessionId:c})},Ak={event:"reset",createHandler:B8};var z8=({metadata:t,globalE2eStateManager:e})=>{let{sessionId:r}=t;return async({url:n})=>{let o=e.getSession(r);if(!o)throw new Error("No active session found");await o.controller.browser.switchToPage({type:"SUBSTRING",substring:n})}},Rk={event:"switchTab",createHandler:z8};async function Ck(t){return pk(t)}var wk=[yN,mk,gk,Ak,vk,hN,Rk,fk,Ek,Tk,bk,hk,Sk,yk,SN,fN];var xk=t=>{let{logger:e}=t,r=new H8(t.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return r.on("connection",async n=>{let o;try{e.info({event:"connection",transport:n.conn.transport.name},"Websocket connection established"),o=await Ck({...t,socket:n,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),n.emit("error",{message:i instanceof Error?i.message:`${i}`}),n.disconnect(!0);return}wk.forEach(i=>j8(i,{...t,socket:n,metadata:o,logger:e}))}),r},j8=(t,e)=>{let r=t.createHandler(e),n=(...o)=>{["mouseMoveEvent","keyDownEvent","keyUpEvent","mouseClickEvent"].includes(t.event)||e.logger.debug({...e.metadata,event:t.event},`Websocket event (${t.event})`);let i=a=>{e.logger.error({event:t.event,type:"websocket",err:a instanceof Error?a:new Error(`${a}`)},"Unhandled exception in socket handler"),e.socket.emit("error",{message:a instanceof Error?a.message:`${a}`})};try{let a=r.apply(void 0,o);a&&typeof a.catch=="function"&&a.catch(i)}catch(a){i(a)}};e.socket.on(t.event,n)};import{Router as q8}from"express";import{Router as V8}from"express";import wd from"fs";import Cd from"path";import{v4 as $8}from"uuid";import W8 from"yaml";import{hostname as G8}from"os";var Rd="2.46.2",ct=yl({app:"desktop-server",hostname:G8(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:Rd});(async()=>{try{let t=await ci(ct);t.gitBranchName&&ct.addBinding("branch",t.gitBranchName)}catch{}})();var Es=V8();async function Bh(t){return(await Dg(t,ct)).map(n=>{let o=t.modules[n.moduleId];if(!o){v.warn(`Found a dangling module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}Es.get("/",Fe(async(t,e)=>{let r=fe(),n=await ce(r),o=await Bh(n);e.status(200).json(o)}));Es.get("/tests-join",Fe(async(t,e)=>{let r=fe(),n=await ce(r),o=await Bh(n),i={};for(let s of o)i[s.id]={...s,tests:[]};let a=await Promise.all(Object.values(n.tests).map(async s=>({id:s.id,name:s.name,relativePath:s.relativePath,test:await St(s.fullFilePath,ct,n)})));for(let{id:s,name:c,relativePath:l,test:u}of a){let d=new Set,p=[u.steps,u.beforeSteps,u.afterSteps];for(let m of p)kn({steps:m??[],onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:g=>{nS(g)&&d.add(g.moduleId)}});for(let m of d){let g=i[m];g&&g.tests.push({id:s,name:c,relativePath:l})}}e.status(200).json(i)}));Es.post("/",Fe(async(t,e)=>{let r;try{r=jw.parse(t.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{_i(r.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=fe(),o=(await ce(n)).modules;if(Object.values(o).find(s=>s.name===r.name)){e.status(400).send(`A module with the name "${r.name}" already exists. Please choose a different name.`);return}let i=Cd.join(n.rootDir,r.folderPath??"");if(!wd.existsSync(i)||!wd.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await Ng({...r,folder:i,project:n});e.status(201).json(a)}));Es.get("/:moduleId",Fe(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r=await ce(fe()),n=r.modules[t.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await to(n,r,v);e.json(o)}catch(o){e.status(400).json({err:o})}}));Es.post("/:moduleId/duplicate",Fe(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=Hw.parse(t.body)}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{_i(r.name)}catch(h){e.status(400).json({error:h.message});return}let n=fe(),o=await ce(n),i=o.modules[t.params.moduleId];if(!i){e.status(404).json({error:"Module not found."});return}if(Object.values(o.modules).find(h=>h.name===r.name)){e.status(400).send(`A module with the name "${r.name}" already exists. Please choose a different name.`);return}let a=await to(i,o,v),s=Cd.join(n.rootDir,Cd.dirname(i.relativePath));if(!wd.existsSync(s)||!wd.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let c=st(r.name),l=Cd.join(s,`${c}.module.yaml`),u=$8(),{stepsToSave:d}=await Pt({stepLists:{steps:a.steps},createNewCacheIds:!0,cacheCreationParams:{orgId:zt()}}),p={fileType:De.MODULE,schemaVersion:Qe,moduleId:u,name:r.name,description:"",enabled:!0,steps:d.steps,parameters:a.parameters,defaultParameters:a.defaultParameters,parameterEnums:a.parameterEnums,defaultCacheKey:a.defaultCacheKey,defaultCacheTtl:a.defaultCacheTtl,defaultCacheAllInvocations:a.defaultCacheAllInvocations,autoAuth:a.autoAuth,advanced:a.advanced},m=W8.stringify(p);wd.writeFileSync(l,m,"utf-8");let g={relativeFilePath:Cd.relative(n.rootDir,l)};e.status(201).json(g)}));Es.patch("/:moduleId/metadata",Fe(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=Gw.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=fe(),o=await ce(n);eL({moduleId:t.params.moduleId,content:r,momenticFiles:o,logger:v,project:n}),e.status(201).json({message:"ok"})}));var _k=Es;var Ik=q8();Ik.get("/",Fe(async(t,e)=>{let r=fe(),n=await ce(r),o=new Set;n?.tests&&Object.values(n.tests).forEach(l=>{l.labels?.forEach(u=>o.add(u))});let i=Array.from(o).sort(),a=Object.values(n.tests),s=await Bh(n),c={labels:i,tests:a,modules:s};e.status(200).json(c)}));var Pk=Ik;import{Router as K8}from"express";var ZT=K8();ZT.get("/",Fe((t,e)=>{let r=kg(fe(),ct);e.status(200).json(r)}));ZT.get("/names",Fe((t,e)=>{let n=fe().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var Mk=ZT;import{Router as Y8}from"express";var Ok=Y8();Ok.get("/",Fe((t,e)=>{let r={userId:Lo(),orgId:zt(),cliVersion:Rd??"0.0.0"};e.status(200).json(r)}));var Lk=Ok;import{StreamableHTTPServerTransport as MZ}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as OZ}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as LZ}from"crypto";import{Router as NZ}from"express";import{randomUUID as QT}from"crypto";import{existsSync as X8,mkdirSync as J8}from"fs";import{writeFile as ev}from"fs/promises";import{tmpdir as Z8}from"os";import gi from"path";var Q8="file",e9="MOMENTIC_MCP_OUTPUT_MODE";function Nk(){let t=process.env[e9];return t==="inline"||t==="file"?t:Q8}var zh=gi.join(Z8(),"momentic-mcp"),Dk=gi.join(zh,"browser-state"),kk=gi.join(zh,"screenshot"),Uk=gi.join(zh,"environment-variables"),tv=gi.join(zh,"tests"),t9=[Dk,kk,Uk,tv];function xd(){for(let t of t9)X8(t)||J8(t,{recursive:!0})}function Fk(t){return t.map(e=>{switch(e.type){case"text":return e;case"media":return{type:"image",data:e.data,mimeType:e.mediaType};default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}})}function Bk(t,e){return e?[{type:"text",text:`<${e}>`},...t,{type:"text",text:`</${e}>`}]:t}function se({text:t,xmlTag:e}){return Bk([{type:"text",text:t}],e)}function r9({imageDataUri:t,xmlTag:e}){return Bk([{type:"media",data:t,mediaType:"image/jpeg"}],e)}function at(t){if(t.length===0)throw new At("No content parts provided to construct the tool response content.");return{type:"content",value:t}}async function n9({browser:t,outputMode:e="inline",returnSnapshot:r=!0,tokenLimit:n}){let o=t.getActivePage(),i=[];if(r){let s=await t.getBrowserState({skipWait:!1});i.push("- Page Snapshot:","```xml",s.serialize(),"```")}let a=["### Page state",`- Page URL: ${o.url()}`,`- Page Title: ${await o.title()}`,...i].join(`
|
|
4647
|
+
${P.feedback}`,p.status="FAILED",l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:p.message}),p;O&&l.onDynamicAIActionEvaluatingEvent?.({stepId:O,status:"FAILED",message:P.feedback});break}case"IMPOSSIBLE":return p.message=`Our AI evaluator determined this task cannot be achieved: ${A}`,p.status="FAILED",l.onDynamicAIActionEvaluatingEvent?.({stepId:O??e.id,status:"FAILED",message:p.message}),p}let L=setTimeout(()=>{l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:S,lastActionHint:y},`Generating new sub-command ${S} within AI action`);let N,j;try{({command:N,reasoning:j}=await i.promptToCommand({goal:m,history:f,startingScreenshot:h,disableCache:n?.advanced.disableAICaching??!1,logger:d,actionHint:y,langfuseSessionId:u})),d.info({command:N,reasoning:j},"Got proposed command")}finally{clearTimeout(L)}if(N.type==="FAILURE")return clearTimeout(L),p.status="FAILED",p.message=`Our AI agent determined that no supported actions can fulfill the goals: ${j}`,p;let W={id:YT(),type:"PRESET_ACTION",command:N},B={substepIndex:S+1,message:j||"Generated new command."};l.onDynamicCommandGenerated?.({...B,step:W,parentStepId:e.id}),d.info({commandId:N.id},`Executing sub-command ${S} within AI step: ${ni(N)}`);let xe=await r.startSubSteps(),z=(await t.executeStepList({...t,options:{...t.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[W],tracer:xe}})).results[0];l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForStability({logger:d});let ae=await i.browser.screenshot({clearHighlights:!0,retries:1});p.results.push(z),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${ae.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:ni(N),elementInteracted:z.results[0]?.elementInteracted,thoughts:j});let ue={substepIndex:S,output:{...z,message:z.message??"Successfully executed preset action."},step:W,parentStepId:e.id};if(l.onDynamicCommandExecuted?.(ue),await r.finish({output:Dp.parse(z),step:z,message:z.message,attempt:1}),z.status==="FAILED")if(p.status="FAILED",p.message=z.message,b<3)b++,T=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${z.message}`;else return p;else if(z.status==="CANCELLED")return p.status="CANCELLED",p.message=z.message,p;S++}};import{randomUUID as l8}from"crypto";var c8=3;async function tk(t){let{logger:e}=t.fixtures,{results:r}=t.failureRecoveryParams,n=r[r.length-1],o=d8(t.work,n);if(o)return e.info({failedResult:n,isNotEligible:o},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${o}`};e.info({failedResult:n},"Attempting failure recovery"),t.work.state.failureRecoveryAttempts=(t.work.state.failureRecoveryAttempts??0)+1;try{return await u8(t)}catch(i){return e.warn({err:i},"Error during failure recovery attempt, continuing..."),null}}async function u8(t){let{fixtures:e,work:r,failureRecoveryParams:n}=t,{controller:o,logger:i}=e,{testMetadata:a}=t.inputs,{results:s,failedStep:c,nextSteps:l,tracer:u}=n;if(!s.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(r.asyncTasks??[]);let d=o.browser.url(),p=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,m=(await o.browser.getBrowserState({})).serialize(),{results:g}=await zl(i,u,s,{numStepsWithScreenshots:8,addIndices:!0,includeBeforeScreenshots:!1}),h=l.map(x=>ii(x)),f=a?.description?.trim(),S=a?.advanced?.failureRecoveryInstructions?.trim(),{scenario:b,thoughts:y,instructions:T}=await o.getFailureRecoveryPlan({currentUrl:d,currentScreenshot:p,failedResults:g,currentPageState:m,nextStepsSerialized:h,testDescription:f||void 0,customInstructions:S||void 0});if(b!=="RECOVERABLE")return i.info({scenario:b,thoughts:y,instructions:T},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${y}`};if(!T)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let w={id:l8(),type:"AI_ACTION_DYNAMIC",text:T},P=await ic(t.work,()=>t.executeStepList({...t,fixtures:{...t.fixtures},listParams:{steps:[w,c],containerName:"AI-recovered step list",tracer:u}})),A=P.results[0];if(A&&A.type==="AI_ACTION_DYNAMIC")if(fg({results:P.results,onPresetAction:x=>{x.aiSuggested=!0},onSimpleStepContainer:x=>{x.aiSuggested=!0}}),P.status==="SUCCESS"){let x=`The following steps were automatically executed by the failure recovery agent. Analysis: ${y}`;return A.message=x,ir.increment("test_event",1,["name:failure_recovery_success",`orgId:${t.inputs.orgId}`]),i.info({thoughts:y},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:P,message:x}}else{ir.increment("test_event",1,["name:failure_recovery_failure",`orgId:${t.inputs.orgId}`]);let x=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${y}`;return A.message=x,i.info({thoughts:y},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:P,message:x}}return null}function d8(t,e){if(!e)return"There is no failed result";if(e.type!=="PRESET_ACTION")return"The failed step is not a preset action";let r=e.message;return r?r.includes("AbortError:")?"The user aborted the test":TR.some(n=>r.includes(n))?"The failed step is an irrecoverable configuration error":(t.state.failureRecoveryAttempts??0)>c8?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}import{randomUUID as Oh}from"crypto";import p8 from"fast-json-patch";import{cloneDeep as m8}from"lodash-es";async function rk(t){let e=t.failedResults,r=[],{sectionParams:n,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:s,tracer:c}=t,{step:l}=n,{controller:u,logger:d}=o,p=l?.autohealingConfig,m=p?.restartBehavior??{type:"GO_TO_SECTION_START"},g=p?.attempts??1;for(let h=0;h<g;h++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let f=m8(l.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:S}=await zl(d,c,e.results,{numStepsWithScreenshots:4}),b=await u.runSectionAutohealing({results:S,errorMessage:e.terminalResult?.message,goal:l.description});f=p8.applyPatch(f,b.patches).newDocument;let y=zr.fromSnapshot({snapshot:s,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await g8({logger:d,controller:u,tracer:c,context:y,restartConfig:m,startingUrl:a});let T=await ic(t.work,()=>t.executeStepList({...t,fixtures:{...t.fixtures,context:y},listParams:{steps:f,containerName:"auto-healed step list",tracer:c}}));if(r.push(T.results),T.status==="SUCCESS")return{successfulHealing:{proposedStep:{...l,steps:f},listResult:T,context:y},healingAttempts:r};e=T}return{healingAttempts:r}}async function g8({logger:t,controller:e,tracer:r,restartConfig:n,context:o,startingUrl:i}){switch(n.type){case"NAVIGATE_URL":{let a={id:Oh(),type:"PRESET_ACTION",command:{id:Oh(),type:"NAVIGATE",url:n.url}},s=await r.startStep({logger:t,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}case"GO_TO_SECTION_START":{let a={id:Oh(),type:"PRESET_ACTION",command:{id:Oh(),type:"NAVIGATE",url:i}},s=await r.startStep({logger:t,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}}}function nk(t,e){switch(t||(t="ON_FAILURE"),t){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&zA(e.command.type))}}async function ok(t){let{step:e,tracer:r}=t.sectionParams,{logger:n,controller:o,context:i}=t.fixtures,a=new Date,s=o.browser.url(),c=i.toObjectCopy(),l=await r.startSubSteps(),u=async()=>t.executeStepList({...t,listParams:{steps:e.steps,containerName:"section step list",tracer:l}}),d=e.autohealingConfig?await ic(t.work,u):await u(),p,m;if(d.status==="FAILED"&&e.autohealingConfig&&!t.work.state.autoHealingDisabled&&nk(e.autohealingConfig.trigger,d.terminalResult)){let h=await r.startSubSteps(),f=await rk({...t,startingContextSnapshot:c,startingUrl:s,failedResults:d,tracer:h});f.successfulHealing&&(p=f.successfulHealing.proposedStep,d=f.successfulHealing.listResult,t.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let g={...e,...d,startedAt:a,finishedAt:new Date,proposedStep:p,healingAttempts:m};return Hn({asyncTasks:t.work.asyncTasks,nestedResults:d.results,result:g,logger:n}),g}var f8=60*60*1e3;async function ao(t){let{results:e=[],containerName:r,steps:n,tracer:o}=t.listParams,{logger:i}=t.fixtures,a=o.getParentStepIdChain(),{fromStep:s,toStep:c}=t.inputs,l="SUCCESS",u,d=0;for(d;d<n.length;d++){let p=n[d];if(p.skipped)continue;if(t.work.fastForwardingToStep&&s){let b=JSON.stringify(a);if(p.id===s.fromStepId&&b===JSON.stringify(s.parentStepIdChain))t.work.fastForwardingToStep=!1;else if(!jM(p,a,s.fromStepId,s.parentStepIdChain))continue}let m=ii(p),g=0,h=1,f=Date.now();"retries"in p&&p.retries&&p.retries>0&&(h+=p.retries);let S;for(;g<h&&Date.now()-f<f8;){g++,i.info({step:IO(p),currentAttempt:g},`Executing step ${d+1}/${n.length} in ${r}: ${m}`);let b=Date.now(),{stepResult:y,status:T,failureRecoveryResults:w,shouldStopExecuting:P}=await S8({attempt:g,params:t,step:p,i:d,steps:n,results:e,currentParentIdChain:a,fromStep:s,toStep:c,lastRetry:g===h});if(T==="FAILED"&&g<h){S=[...S??[],y],Date.now()-b<1e3&&await fe(1e3-(Date.now()-b));continue}else e.push(y),S&&(y.previousAttempts=S);if(w&&e.push(...w),P)return l=T,u=y,{status:l,results:e,terminalResult:u};break}}return{status:l,results:e,terminalResult:u}}async function S8({attempt:t,params:e,step:r,i:n,steps:o,results:i,currentParentIdChain:a,fromStep:s,toStep:c,lastRetry:l}){let{tracer:u}=e.listParams,{logger:d,context:p,controller:m,codeEvalTools:g,usageTracker:h}=e.fixtures,{orgId:f}=e.inputs,S=new Date,b=!!s&&rd(a.concat(r.id),s.parentStepIdChain),y=await u.startStep({logger:d,step:r,attempt:t,skipStatusEvents:b}),T=h8(r),w=p.toRedactedDisplayCopy(),P=m.browser.url(),A=m.executeAbortController.signal;h.trackStepExecution(r);let x,O;switch(r.type){case"PRESET_ACTION":{x="Preset action",O=await bs(r,async()=>await Ph({...e,presetParams:{tracer:y,step:r}}),A);break}case"AI_ACTION":{x="AI action",O=await bs(r,()=>j0({...e,aiStepParams:{step:r,tracer:y},executeStepList:ao}),A);break}case"AI_ACTION_DYNAMIC":{x="AI action",O=await bs(r,()=>Q0({...e,aiStepParams:{step:r,tracer:y},executeStepList:ao}),A);break}case"RESOLVED_MODULE":{x=`Module (${r.name})`,O=await bs(r,async()=>{let B=await U0({orgId:f,step:r,context:p,logger:d,codeEvalTools:g,signal:A});return $T({...e,executeStepList:ao,moduleParams:{step:r,resolvedInputs:B,tracer:y}})},A);break}case"CONDITIONAL":{x="Conditional step",O=await bs(r,()=>z0({...e,conditionalParams:{step:r,tracer:y},executeStepList:ao}),A);break}case"SECTION":{x="Section",O=await bs(r,()=>ok({...e,sectionParams:{step:r,tracer:y},executeStepList:ao}),A);break}default:return(xe=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}O.beforeUrl=O.beforeUrl??P,O.beforeTestContext=w,r.envKey&&p.setVariable(r.envKey,O.data);let L=m.browser.url();p.setCurrentUrl(L),O.afterUrl=O.afterUrl??L,O.afterTestContext=p.toRedactedDisplayCopy(),await y8({step:r,startedAt:S,stepTypeName:x,result:O,callbacks:e.callbacks,globalWorkRef:e.work,tracer:y,attempt:t});let N,j;if(l&&O.status==="FAILED"&&!e.work.state.failureRecoveryDisabled&&s?.fromStepId===void 0&&c?.toStepId===void 0){let B=await tk({...e,executeStepList:ao,failureRecoveryParams:{failedStep:T,nextSteps:o.slice(n+1),results:i.concat(O),tracer:u}});B&&(B.type==="ATTEMPTED"?(N=B.result.results,j=B.status):B.type==="NOT_ELIGIBLE"&&(O.message=O.message?`${O.message} ${B.message}`:B.message),O.type==="PRESET_ACTION"&&(O.failureRecoveryStatus={type:B.type,message:B.message}))}return e.work.fastForwardingToStep&&s&&(s.fromStepId===r.id&&JSON.stringify(a)===JSON.stringify(s.parentStepIdChain)&&(e.work.fastForwardingToStep=!1),r.type==="RESOLVED_MODULE"&&rd(a,s.parentStepIdChain)&&(e.work.fastForwardingToStep=!1)),O.status!=="SUCCESS"&&j!=="SUCCESS"||m.closed?{shouldStopExecuting:!0,status:O.status,stepResult:O,failureRecoveryResults:N}:c&&r.id===c.toStepId&&JSON.stringify(a)===JSON.stringify(c.parentStepIdChain)?(m.setClosed(),{shouldStopExecuting:!0,status:"SUCCESS",stepResult:O,failureRecoveryResults:N}):{shouldStopExecuting:!1,status:"SUCCESS",stepResult:O,failureRecoveryResults:N}}async function y8({stepTypeName:t,step:e,result:r,tracer:n,attempt:o,startedAt:i}){let a=t.toLowerCase(),s=t.charAt(0).toUpperCase()+t.slice(1);n.recordStepDuration({step:e,durationMs:Date.now()-i.getTime()});let c="";switch(r.status){case"SUCCESS":c=r.message??`${s} executed successfully.`;break;case"FAILED":c=r.message??`${s} failed.`;break;case"CANCELLED":c=r.message??`${s} cancelled.`;break;default:throw new Error(`Unexpected ${a} status: ${r.status}`)}await n.finish({step:r,message:c,output:Dp.parse(r),attempt:o})}var ik="MOMENTIC_RUN_ID",ak="FINAL_SCREENSHOT_URL";import{randomUUID as sk}from"crypto";async function lk({browser:t,signal:e}){let r=new Date;try{return await t.navigate({url:t.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(n){let o={id:sk(),type:"PRESET_ACTION",status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:n.message,startedAt:r,finishedAt:new Date,results:[],command:{id:sk(),type:"NAVIGATE",url:t.baseUrl}};return{status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var Lh=async t=>{let{orgId:e,runId:r,testMetadata:n,steps:o,beforeSteps:i,afterSteps:a}=t.inputs;t.fixtures.logger=t.fixtures.logger.child({orgId:e,runId:r,testId:n?.id});let{logger:s,controller:c}=t.fixtures,{onTestComplete:l,onTestSuccess:u,onTestFailure:d}=t.callbacks.test,p=E_(s);if(t.options.reinitializeBrowser){let g=await lk({browser:c.browser,signal:c.executeAbortController.signal});if(g.status!=="PASSED")return await l?.(),clearInterval(p?.interval),g}let m;try{return s.info({platform:p?.platform,cpuMetadata:p?.cpuMetadata,labels:n?.labels,orgSettings:mC.parse(t.inputs.orgSettings)},`Starting run for Momentic test '${n?.name??"Unnamed test"}'`),m=await E8(t),m}finally{s.info({status:m?.status,labels:n?.labels},"Momentic test final result"),clearInterval(p?.interval),await l?.(),m?.status==="PASSED"?await u?.({steps:o,beforeSteps:i,afterSteps:a}):m?.status==="FAILED"&&await d?.({steps:o,beforeSteps:i,afterSteps:a})}};function b8({beforeStatus:t,mainStatus:e,afterStatus:r}){return t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":r==="FAILED"?"FAILED":r==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}var E8=async t=>{let{tracer:e}=t.testParams,{fromStep:r,toStep:n,steps:o,beforeSteps:i,afterSteps:a}=t.inputs,{logger:s,controller:c,context:l,storage:u}=t.fixtures,{collectDebugData:d,disableHealing:p}=t.options;l.setCurrentUrl(c.browser.url());let m="test",g=o,h=[],f=p||r!==void 0||n!==void 0||void 0,S={results:h,state:{autoHealingDisabled:f,failureRecoveryDisabled:f,failureRecoveryAttempts:0},asyncTasks:[]},b=!1;r?.fromStepId&&r.fromStepId===n?.toStepId?(m="filtered step",S.fastForwardingToStep=!0):r?.fromStepId?(m="partial steps list from step",S.fastForwardingToStep=!0):n?m="partial steps list until step":(m="entire test",b=!0);let y,T,w;if(b&&i&&i.length>0){let j=await ck(i,"beforeSteps",t);y=j.status,T=j.results,w=j.terminalResult?{...j.terminalResult,failureReason:"SetupFailureError"}:void 0,S.state.failureRecoveryAttempts=(S.state.failureRecoveryAttempts??0)+(j.failureRecoveryAttempts??0)}let P,A;if(y===void 0||y==="PASSED"){s.info({fromStep:r,toStep:n},`Starting execution of ${m}`);let j=await e.startMainStepList(),W=await ao({...t,work:S,listParams:{steps:g,containerName:m,results:h,tracer:j}});P=W.status,A=W.terminalResult}let x,O,L;if(b&&a&&a.length>0){let j=await ck(a,"afterSteps",t);x=j.status,O=j.results,L=j.terminalResult?{...j.terminalResult,failureReason:"TeardownFailureError"}:void 0,S.state.failureRecoveryAttempts=(S.state.failureRecoveryAttempts??0)+(j.failureRecoveryAttempts??0)}let N=b8({beforeStatus:y,mainStatus:P,afterStatus:x});if(d&&T8({tracer:e,work:S,controller:c,storage:u,context:l,logger:s,status:N}),await Promise.allSettled(S.asyncTasks),S.asyncTasks.push(Promise.resolve(t.callbacks.test.onSaveFinalRunResults?.({results:h,beforeResults:T,afterResults:O}))),N==="FAILED"){let j=y==="FAILED"?w:void 0,W=x==="FAILED"?L:void 0;return{status:"FAILED",results:h,beforeResults:T,afterResults:O,failedStepResult:j??A??W}}else if(N==="CANCELLED")return{status:"CANCELLED",results:h,beforeResults:T,afterResults:O};return{status:"PASSED",failureRecoveryDetails:S.state.failureRecoveryAttempts?{attempts:S.state.failureRecoveryAttempts}:void 0,results:h,beforeResults:T,afterResults:O}};async function ck(t,e,r){let n=r.fixtures.logger,o=e==="beforeSteps"?await r.testParams.tracer.startBeforeStepList():await r.testParams.tracer.startAfterStepList();n.info(`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{}},a={...r.callbacks,test:{...r.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0}},{status:s,results:c,terminalResult:l}=await ao({...r,work:i,callbacks:a,listParams:{steps:t,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let u;return s==="SUCCESS"?u="PASSED":s==="CANCELLED"?u="CANCELLED":u="FAILED",{status:u,results:c,terminalResult:l,failureRecoveryAttempts:i.state.failureRecoveryAttempts}}function T8({tracer:t,work:e,controller:r,storage:n,logger:o,context:i,status:a}){let s=r.browser,c=s.retrieveAndClearDebugData(),l=XM(c.logsPerPage);t.attachConsoleLogs({logger:o,logs:l}),a!=="PASSED"&&a!=="SUCCESS"&&(t.attachBrowserCrashDump({crashReportDirFetcher:()=>s.browserCrashDumpDir,logger:o}),e.asyncTasks.push((async()=>{try{let u=await s.screenshot({quality:75}),d=await c0({codePath:"test-complete-final",storage:n,screenshotBuff:u,logger:o}),p=await X(s.html(),{milliseconds:2e3});i.setVariable(ak,d),o.debug({finalPageHtml:p.slice(0,1e4)},"Final page state HTML"),o.debug({finalScreenshotUrl:d},"Uploaded final screenshot URL")}catch{}})()))}import{z as ca}from"zod";var Nh=ca.object({fromStepId:ca.string(),parentStepIdChain:ca.array(ca.string())}),Dh=ca.object({toStepId:ca.string(),parentStepIdChain:ca.array(ca.string())});async function kh({settings:t,customHeaders:e,envVariables:r,envName:n,testName:o,baseUrl:i,logger:a,localTools:s,orgId:c}){let l=Qs.parse(t);e&&(l.extraHeaders={...l.extraHeaders,...e});let u=new zr({baseUrl:i,envName:n,testName:o,variablesFromEnvironment:r,currentUrl:i});await ch({obj:l,context:u,bannedKeys:[],allowList:dC,localTools:s,logger:a,orgId:c});try{return Qs.parse(l)}catch(d){throw new M("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${d.message}`)}}async function uk({orgId:t,testName:e,envName:r,baseEnvVariables:n,parameters:o,logger:i,localTools:a}){if(!o||o.length===0)return{...n};let s={...n};return await Promise.all(o.map(async c=>{let l=await qr({orgId:t,s:c.defaultValue,context:zr.dummyContext(e,r,s),logger:i,localTools:a});s[c.name]=l})),s}import{cloneDeep as w8}from"lodash-es";import{cloneDeep as v8}from"lodash-es";var A8={showOverlay:!1},Uh=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:r,cleanup:n,clientIp:o,sessionId:i,socket:a}){return this.sessions.set(i,{controller:e,context:r,cleanup:n,clientIp:o,browserBehavior:v8(A8),socket:a}),i}removeSession(e,r){(async()=>{let o=this.sessions.get(e);if(!o)return;this.releaseCapacityByIp(o.clientIp);let{controller:i}=o;try{i.setClosed(),await i.browser.cleanup()}catch(a){r.error({err:a},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(a){r.error({err:a},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}};function dk(t,e,r,n){let o=Date.now(),i=Date.now(),a,s,c,l,u=!1,d=async(h,f)=>{if(!h.closed&&!h.isInPageLoad)try{let S=c;c=void 0;let b=h.url(),y=f.toEditorDisplayCopy();JSON.stringify(y)===JSON.stringify(a)&&b===l&&o>i||(t.emit("browserState",{logsPerPage:S?.logsPerPage,viewport:h.getViewport(),url:b,iframeSrcUrls:s??[],context:y,isInPageLoad:h.isInPageLoad}),o=Date.now()),l=b,a=y}catch(S){if(!t.connected)return;let b=S instanceof Error?S.message:`${S}`;if(b.includes("Frame was detached")||b.includes("Not attached to an active page")||b.includes("browser has been closed")||b.includes("UserInfrastructureError"))return;r.error({err:S,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let h=n.getSession(e),f=h?.controller?.browser;if(!f||f.closed){r.debug("Clearing browser state socket cron due to the browser being closed"),clearInterval(p);return}d(f,h.context)},1e3),m=(h,f)=>!!(JSON.stringify(h)!==JSON.stringify(s)||f.logsPerPage.some(S=>S.length>0)),g=setInterval(async()=>{let f=n.getSession(e)?.controller?.browser;if(!f||f.closed){clearInterval(g);return}else if(u)return;u=!0;try{let S=await f.getAllFrameUrls(),b=f.retrieveAndClearDebugData();m(S,b)&&(s=S,c=b,i=Date.now())}catch(S){r.warn({err:S},"Failed to fetch extended details")}finally{u=!1}},2500);return{timers:[p,g]}}async function ac({controller:t,context:e,baseUrl:r,envName:n,testName:o,environmentVariables:i}){await t.browser.reset({newUrl:r});let a=t.browser.baseUrl,s=t.browser.url();return e.reset({baseUrl:a,currentUrl:s,variablesFromEnvironment:i,envName:n,testName:o}),{baseUrl:a,currentUrl:s}}var R8=3;async function pk({socket:t,logger:e,storageFactory:r,uploadedFileStorage:n,visualDiffStorageFactory:o,devicePixelRatio:i,generatorFactory:a,enricherFactory:s,authorization:c,settingsFactory:l,getOrgId:u,branchGetter:d,globalE2eStateManager:p}){let m=t.id,g=t.handshake.query.testId;if(!g)throw new Error("Socket connection request is missing testId");let h=await u({type:"e2e",testId:g}),f=await d?.();e=e.child({testId:g,orgId:h,sessionId:m,branch:f});let S=await a(h,e),b=await s(h,e),y=await l(h,e),T=await r(h),{testMetadata:w,baseUrl:P,envName:A,browserConfig:x,aiSettings:O,environmentVariables:L,localCodeEvalTools:N}=await Fo({testId:g,orgId:h,logger:e,storage:T,authorization:c,settings:y}),j=p.getSession(m);if(j)return e.info("Associating connection with existing session (likely reconnect)"),await j.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:h,testId:g};let W=t.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:W,event:"connect",args:t.handshake.query},"Websocket event (connect)"),W&&p.getCurrentConnectionsByIp(W)>=R8)throw e.error({clientIp:W,sessions:p.getCurrentSessionsByIp(),...t.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");p.reserveCapacityByIp(W);try{await C8({socket:t,baseUrl:P,envName:A,testMetadata:w,orgId:h,sessionId:m,logger:e,environmentVariables:L,clientIp:W,devicePixelRatio:i,storage:T,uploadedFileStorage:n,visualDiffScreenshotStorage:await o(h),localCodeEvalTools:N,generator:S,enricher:b,browserConfig:x,aiSettings:O,globalE2eStateManager:p})}catch(B){throw e.warn({err:B},"Error setting up socket session, possibly due to client closing the connection"),p.releaseCapacityByIp(W),B}return{type:"e2e",sessionId:m,testId:g,orgId:h}}async function C8({socket:t,baseUrl:e,envName:r,devicePixelRatio:n,testMetadata:o,orgId:i,sessionId:a,logger:s,storage:c,uploadedFileStorage:l,visualDiffScreenshotStorage:u,localCodeEvalTools:d,generator:p,environmentVariables:m,browserConfig:g,aiSettings:h,clientIp:f,enricher:S,globalE2eStateManager:b}){let y={viewport:o.advanced?.viewport??Ar,locale:o.advanced?.locale??Pi,timezoneId:o.advanced?.timezone??Mi,geolocation:o.advanced?.geolocation??Oi,colorScheme:o.advanced?.colorScheme};n&&(y.deviceScaleFactor=n);let T=o.id,w=await kh({settings:g,orgId:i,baseUrl:e,envName:r,testName:o.name,localTools:d,envVariables:m,logger:s,customHeaders:void 0});s=s.child({orgId:i,sessionId:a,testId:T});let P=await Gn.init({baseUrl:e,userBrowserSettings:w,enricher:S,storage:c,logger:s,contextArgs:y,iconKnowledgeBase:null,callbacks:{onTabsChange:(N,j)=>{t.emit("tabs",{tabs:N,activeTab:j})},onScreencastFrame:(N,j)=>{let W=t;Mn&&(W=t.compress(!0)),W.emit("screenshot",{buffer:N},()=>{j()})},onSvgsCollected:N=>{t.emit("newIconDetected",{numIcons:N.newSvgs.length}),c.saveNewIcons(N,s)},onNetworkLogs:N=>{t.emit("networkLogs",{harEntries:N})}}});await P.navigate({url:e,initialNavigation:!0});let A=new la({browser:P,generator:p,logger:s,orgId:i,options:{scratchPadId:void 0,slowMoMs:w.slowMoMs,autoFollowNewTabs:w.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:c,localCodeEvalTools:d,uploadedFileStorage:l,visualDiffScreenshotStorage:u}),x=dk(t,a,s,b),O=async()=>{x.timers.forEach(N=>clearInterval(N))},L=new zr({baseUrl:e,testName:o.name,currentUrl:A.browser.url(),variablesFromEnvironment:m,envName:r});if(!t.connected)throw await P.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");t.emit("session",{url:e,userAgent:Gn.USER_AGENT,viewport:A.browser.getViewport(),sessionId:a}),b.registerSession({controller:A,context:L,sessionId:a,cleanup:O,clientIp:f,socket:t})}async function Fo({testId:t,orgId:e,logger:r,storage:n,authorization:o,settings:i}){let a=await n.fetchTestMetadata(t,r);if(!a)throw new Error(`Test metadata could not be found for test ${t}`);let s;o?.type==="API_KEY"&&(s=new Mo({httpClient:new fr({...o,logger:r,mode:"interactive"}),fakerSeed:void 0}));let c=a.envs?.find(h=>h.default),l;c&&(l=await n.fetchEnvironment(c.name,r));let u=l&&"browser"in l?l.browser:void 0,d={...i.browser,...u,...a.advanced};d.browserType=Pp({browserType:d.browserType,orgDefaultBrowserType:i.browser?.defaultBrowserType});let p=a.baseUrl||l?.variables?.[nr];if(!p)throw new Error("Base URL is empty in both test options and the configured environment");let m={...l?.variables};m=await uk({orgId:e,testName:a.name,envName:l?.name,baseEnvVariables:m,parameters:a.parameters,logger:r,localTools:s});let g={...i.ai,...a.advanced};return{localCodeEvalTools:s,baseUrl:p,envName:l?.name,testName:a.name,browserConfig:d,environmentVariables:m,testMetadata:a,aiSettings:g}}var XT=class{parentTracer=null;socket;step;orgId;interactionTracer;skipStatusEvents;constructor({step:e,socket:r,parentTracer:n,orgId:o,skipStatusEvents:i=!1}){this.socket=r,this.parentTracer=n,this.step=e,this.orgId=o,this.skipStatusEvents=i,this.interactionTracer=new pi,di.initializeRootTracerContext(this.interactionTracer)}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}recordStepDuration(e){let r=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;ir.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}recordTargetAutoHeal(){}async finish(e){if(this.interactionTracer.finish(),e.step.trace=this.interactionTracer.getRootSpan(),!this.skipStatusEvents)switch(e.step.status){case"SUCCESS":this.socket.emit("success",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"FAILED":this.socket.emit("failure",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"CANCELLED":this.socket.emit("cancelled",{...e,parentStepIdChain:this.getParentStepIdChain()});return}}async startSubSteps(){return new mi({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},mi=class{stepFrequenciesByType={};parentTracer;parentStep;socket;orgId;recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))ir.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}constructor({parentStep:e,socket:r,parentTracer:n,orgId:o}){this.parentTracer=n,this.parentStep=e,this.socket=r,this.orgId=o}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.recordStepStat(e.step),e.skipStatusEvents||this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain(),attempt:e.attempt}),new XT({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId,skipStatusEvents:e.skipStatusEvents})}async finish(){this.sendFinalizedStepStats()}},Fh=class{constructor(e,r,n,o){this.socket=e;this.storage=r;this.orgId=n;this.testId=o}children=[];loggerBindings;setActiveVideo(){}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}onNetworkPage(){}onNetworkLogs(){}attachConsoleLogs(){}attachBrowserCrashDump(){}async finish(){this.socket.emit("finished"),await Promise.all(this.children.map(e=>e.finish()))}async startBeforeStepList(){let e=new mi({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startMainStepList(){let e=new mi({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startAfterStepList(){let e=new mi({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}};var JT={currentlyExecutingRequests:{}},x8=t=>async(e,r)=>{let{testId:n,orgId:o}=t.metadata,i=await t.settingsFactory(o,t.logger),a=await t.storageFactory(o),s,c=await Fo({testId:n,orgId:o,logger:t.logger,storage:a,authorization:t.authorization,settings:i}),l=`${n}|${c.baseUrl}`;try{let u=JT.currentlyExecutingRequests[l]??0;JT.currentlyExecutingRequests[l]=u+1,s=await _8({...t,...e,...c,done:r})}finally{t.logger.info({result:s,sessionId:t.metadata.sessionId},"Test execution complete"),JT.currentlyExecutingRequests[l]--}},_8=async({socket:t,steps:e,baseUrl:r,testMetadata:n,reInitialize:o,toStep:i,fromStep:a,storageFactory:s,aiSettings:c,browserConfig:l,metadata:u,logger:d,envName:p,testName:m,environmentVariables:g,localCodeEvalTools:h,done:f,cacheStorageFactory:S,globalE2eStateManager:b})=>{let{testId:y,sessionId:T,orgId:w}=u,P=T,A=b.getSession(T);if(!A)throw new Error("No active session found");let{controller:x,context:O}=A;x.setOpen(),d=d.child({testId:y,orgId:w,sessionId:T,runId:P}),d.info({steps:e.map(Q=>`${Q.type}${"command"in Q?` - ${Q.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,testName:m,baseUrl:r,truncatedContext:Ki({json:O,maxJsonStringSize:1e3}),browserConfig:l,aiSettings:c},"Socket execution parameters");let L=g??{},N=async()=>{o&&await ac({controller:x,context:O,baseUrl:r,envName:p,testName:m,environmentVariables:L})},j=await s(w),W=await S(w),B=async()=>{let Q=Date.now();try{await W.resolveStepCacheEntries({schemaVersion:n.schemaVersion,testId:y,stepLists:{steps:e},logger:d})}catch(Te){d.error({err:Te},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}finally{ir.distribution("cache-resolution",Date.now()-Q,["executor:editor"])}};try{await ld({promiseGenerator:async()=>Promise.all([N(),B()]),signal:x.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),x.setOpen()}catch(Q){if(t.emit("finished"),Q.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${Q}`)}let xe=w8(e),F={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},z={orgId:w,runId:P,testMetadata:n,steps:e,fromStep:a,toStep:i,orgSettings:{ai:c,browser:l}},ae={controller:x,context:O,storage:j,codeEvalTools:h,usageTracker:new cl,logger:d},ue={test:{},step:{onDynamicAIActionStatusUpdateEvent:Q=>{t.emit("dynamicCommandStatusUpdate",Q)},onDynamicAIActionEvaluatingEvent:Q=>{t.emit("dynamicCommandEvaluating",Q)},onDynamicCommandGenerated:Q=>{t.emit("dynamicCommandGenerated",Q)},onDynamicCommandExecuted:Q=>{t.emit("dynamicCommandExecuted",Q)}}},_e=new Fh(t,j,w,y),Se=await Lh({fixtures:ae,options:F,callbacks:ue,inputs:z,testParams:{tracer:_e}}),le={logger:d,cacheStorage:W,orgId:w,testId:y,originalStepsWithCaches:{steps:xe},updatedStepsWithCaches:{steps:e}};return Se?.status==="PASSED"?await Hl(le):Se?.status==="FAILED"&&await jl(le),await _e.finish(),f?.(Se),Se.status};var mk={event:"execute",createHandler:x8};import{randomUUID as I8}from"crypto";var P8=({metadata:t,logger:e,storageFactory:r,globalE2eStateManager:n})=>{let{sessionId:o,orgId:i}=t;return async(a,s)=>{let{description:c,command:l,testMetadata:u,returnScreenshot:d}=a;e.info({params:a},`Locate handler called - ${c}`);let p=n.getSession(o);if(!p)throw new Error("No active session found");let{controller:m,context:g}=p;m.setOpen();let h=await r(i),f=Fa.parse(u.advanced??{}),S={},b;if(c){if("useSelector"in l&&l.useSelector)try{let y=await m.locateElementWithSelector(c,"iframeUrl"in l?l.iframeUrl:void 0);b=y.resolution.locator,S={target:y.target,thoughts:y.thoughts}}catch(y){e.warn({err:y},"Failed resolving target with selector"),s({err:`Failed locating element: ${y.message}`,decisions:y instanceof vn?y.decisions:void 0});return}else try{let y=await m.locateElement({description:c,disableCache:f.disableAICaching??!1,skipWait:!0,testContext:g,source:Oa(l),iframeUrl:"iframeUrl"in l?l.iframeUrl:void 0,memory:"cache"in l&&l.cache&&"target"in l.cache&&ip(l.cache.target.memory)?l.cache.target.memory:void 0,logger:e});S={target:y.target,thoughts:y.thoughts},b=y.resolution.locator}catch(y){(async()=>{try{let T=await m.browser.getCondensedHtml({skipWait:!0});e.warn({err:y,html:T.slice(0,1e5)},"Failed locating element with AI")}catch(T){e.warn({err:T},"Failed grabbing HTML after trying to locate element with AI")}})(),s({err:`${y.message}`});return}if(l.type==="SELECT_OPTION"&&b)try{S.options=await m.browser.getSelectOptions(b)}catch(y){e.warn({err:y},"Failed getting select options"),s({err:`Failed getting select options: ${y.message}`});return}e.info({result:S},"Locate handler result")}if(d)try{let{buffer:y,width:T,height:w}=await m.screenshotWithDimensions({clearHighlights:!0,locator:b}),P=I8(),{universalHandle:A,appServerUrl:x}=await h.createOnDemandScreenshot(P,y,"image/jpeg");S.screenshot={data:A,width:T,height:w},e.info({width:T,height:w,appServerUrl:x,universalHandle:A},"Captured screenshot during locate")}catch(y){e.error({err:y},"Error capturing screenshot during locate"),s({err:`Error taking screenshot: ${y.message}`});return}if(s({result:S}),b)try{await Promise.all([m.browser.scrollIntoViewIfNeeded(b),m.browser.highlight(b)])}catch(y){e.warn({err:y},"Error highlighting element, continuing...")}}},gk={event:"locate",createHandler:P8};var M8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({event:o,percentX:i,percentY:a})=>{let s=r.getSession(n);if(!s)throw new Error("No active session found");let c=s.controller.browser;if(c.closed||c.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await c.clickMouseFromPositionPercentages(o,i,a)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},hk={event:"mouseClickEvent",createHandler:M8};var O8=({metadata:t,generatorFactory:e,logger:r,socket:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=t;return async({stepId:c,parentStepIdChain:l,attribute:u})=>{let d=o.getSession(i);if(!d)throw new Error("No active session found");let{controller:p}=d,m=await e(a,r);p.setOpen(),d.browserBehavior.showOverlay=!0;let g=new AbortController;g.signal.addEventListener("abort",async()=>{try{d.browserBehavior.showOverlay=!1,await p.stopRecordMode()}catch(S){r.warn({err:S},"Failed to stop record mode in target click socket handler")}},{once:!0});let h=!1,f=(S,b)=>{b.type!=="PRESET_ACTION"||b.command.type!=="CLICK"||(n.emit("targetRecordingUpdate",{type:S,stepId:c,parentStepIdChain:l,command:b.command,attribute:u}),g.abort(),h=!0)};setTimeout(()=>{h||(g.abort(),n.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:c,parentStepIdChain:l,attribute:u}))},1e4),await p.startRecordMode({params:{generator:m,logger:r,testId:s,orgId:a,callbacks:{onActionReceived:S=>f("clickReceived",S),onStepRecorded:S=>f("descriptionGenerated",S)}},abortController:g,isClickToRecord:!0}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:c,parentStepIdChain:l,attribute:u})}},fk={event:"recordTargetClick",createHandler:O8};var L8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({key:o})=>{let i=r.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyDown(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key down socket event error");return}throw s}}},Sk={event:"keyDownEvent",createHandler:L8};var N8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({key:o})=>{let i=r.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyUp(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key up socket event error");return}throw s}}},yk={event:"keyUpEvent",createHandler:N8};var D8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t,o,i=0,a=(l,u)=>{let d=async()=>{o=void 0};clearTimeout(o),o=setTimeout(d,Math.min(1e3,250*(i+1)))},s,c=0;return async l=>{let u=r.getSession(n);if(!u)throw new Error("No active session found");let{controller:d,browserBehavior:p}=u,m=d.browser;if(m.closed||m.getActivePage().isClosed()){e.warn("Ignoring mouse move because the page is closed");return}if(l.event==="scroll"){let g=await m.scrollFromPositionPercentages(l.percentX,l.percentY,s?.x??0,s?.y??0),h=u.browserBehavior.recordingState?.transformer;h&&g&&h.recordScroll(g);return}p.showOverlay&&a(m,l);try{let g=await m.moveMouseFromPositionPercentages(l.percentX,l.percentY);c=0,s=g}catch(g){c++,c%5===0&&e.warn({err:g,mouseErrors:c},"Error in socket mouse move handler")}}},bk={event:"mouseMoveEvent",createHandler:D8};var k8=({metadata:t,generatorFactory:e,socket:r,logger:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=t;return async({stepId:c})=>{let l=o.getSession(i);if(!l)throw new Error("No active session found");let{controller:u,browserBehavior:d}=l,p=await e(a,n);n.info("Starting cloud recording");let m=new AbortController,g=await u.startRecordMode({params:{generator:p,logger:n,testId:s,orgId:a,callbacks:{onActionReceived:(h,f)=>{r.emit("stepRecorded",{stepId:c,step:h,offset:f})},onStepRecorded:(h,f)=>{r.emit("stepRecorded",{stepId:c,step:h,offset:f})}}},abortController:m,isClickToRecord:!1});d.recordingState={transformer:g}}},Ek={event:"recordingStart",createHandler:k8};var U8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async()=>{let o=r.getSession(n);if(!o)throw new Error("No active session found");e.info("Stopping cloud recording"),await o.controller.stopRecordMode(),o.browserBehavior.recordingState=void 0,o.browserBehavior.showOverlay=!1}},Tk={event:"recordingStop",createHandler:U8};var F8=({socket:t,metadata:e,logger:r,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async(s,c)=>{let{testId:l,sessionId:u,orgId:d}=e;r.info({testId:l,sessionId:u},"Refresh event received");let p=await i(d,r),m=await n(d),{baseUrl:g}=await Fo({testId:l,orgId:d,logger:r,storage:m,authorization:o,settings:p}),h=a.getSession(u);if(!h){t.emit("error",{message:"No session to refresh"});return}let{controller:f}=h;f.setOpen(),await f.browser.refresh();let S=f.browser.getViewport();r.info({baseUrl:g,viewport:S},`Session refreshed for test ${l} at ${g}`),c()},vk={event:"refresh",createHandler:F8};var B8=({socket:t,metadata:e,logger:r,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async()=>{let{testId:s,sessionId:c,orgId:l}=e;r.info({testId:s,sessionId:c},"Reset event received");let u=await i(l,r),d=await n(l),{baseUrl:p,envName:m,testName:g,environmentVariables:h}=await Fo({testId:s,orgId:l,logger:r,storage:d,authorization:o,settings:u}),f=a.getSession(c);if(!f){t.emit("error",{message:"No session to reset"});return}let{controller:S,context:b}=f,{baseUrl:y}=await ac({controller:S,context:b,baseUrl:p,envName:m,testName:g,environmentVariables:h}),T=S.browser.getViewport(),w=Gn.USER_AGENT;r.info({baseUrl:p,viewport:T},`Session reset for test ${s} at ${y}`),t.emit("session",{url:y,userAgent:w,viewport:T,sessionId:c})},Ak={event:"reset",createHandler:B8};var z8=({metadata:t,globalE2eStateManager:e})=>{let{sessionId:r}=t;return async({url:n})=>{let o=e.getSession(r);if(!o)throw new Error("No active session found");await o.controller.browser.switchToPage({type:"SUBSTRING",substring:n})}},Rk={event:"switchTab",createHandler:z8};async function Ck(t){return pk(t)}var wk=[yN,mk,gk,Ak,vk,hN,Rk,fk,Ek,Tk,bk,hk,Sk,yk,SN,fN];var xk=t=>{let{logger:e}=t,r=new H8(t.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return r.on("connection",async n=>{let o;try{e.info({event:"connection",transport:n.conn.transport.name},"Websocket connection established"),o=await Ck({...t,socket:n,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),n.emit("error",{message:i instanceof Error?i.message:`${i}`}),n.disconnect(!0);return}wk.forEach(i=>j8(i,{...t,socket:n,metadata:o,logger:e}))}),r},j8=(t,e)=>{let r=t.createHandler(e),n=(...o)=>{["mouseMoveEvent","keyDownEvent","keyUpEvent","mouseClickEvent"].includes(t.event)||e.logger.debug({...e.metadata,event:t.event},`Websocket event (${t.event})`);let i=a=>{e.logger.error({event:t.event,type:"websocket",err:a instanceof Error?a:new Error(`${a}`)},"Unhandled exception in socket handler"),e.socket.emit("error",{message:a instanceof Error?a.message:`${a}`})};try{let a=r.apply(void 0,o);a&&typeof a.catch=="function"&&a.catch(i)}catch(a){i(a)}};e.socket.on(t.event,n)};import{Router as q8}from"express";import{Router as V8}from"express";import wd from"fs";import Cd from"path";import{v4 as $8}from"uuid";import W8 from"yaml";import{hostname as G8}from"os";var Rd="2.46.3",ct=yl({app:"desktop-server",hostname:G8(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:Rd});(async()=>{try{let t=await ci(ct);t.gitBranchName&&ct.addBinding("branch",t.gitBranchName)}catch{}})();var Es=V8();async function Bh(t){return(await Dg(t,ct)).map(n=>{let o=t.modules[n.moduleId];if(!o){v.warn(`Found a dangling module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}Es.get("/",Fe(async(t,e)=>{let r=Ee(),n=await ce(r),o=await Bh(n);e.status(200).json(o)}));Es.get("/tests-join",Fe(async(t,e)=>{let r=Ee(),n=await ce(r),o=await Bh(n),i={};for(let s of o)i[s.id]={...s,tests:[]};let a=await Promise.all(Object.values(n.tests).map(async s=>({id:s.id,name:s.name,relativePath:s.relativePath,test:await St(s.fullFilePath,ct,n)})));for(let{id:s,name:c,relativePath:l,test:u}of a){let d=new Set,p=[u.steps,u.beforeSteps,u.afterSteps];for(let m of p)kn({steps:m??[],onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:g=>{nS(g)&&d.add(g.moduleId)}});for(let m of d){let g=i[m];g&&g.tests.push({id:s,name:c,relativePath:l})}}e.status(200).json(i)}));Es.post("/",Fe(async(t,e)=>{let r;try{r=jw.parse(t.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{_i(r.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=Ee(),o=(await ce(n)).modules;if(Object.values(o).find(s=>s.name===r.name)){e.status(400).send(`A module with the name "${r.name}" already exists. Please choose a different name.`);return}let i=Cd.join(n.rootDir,r.folderPath??"");if(!wd.existsSync(i)||!wd.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await Ng({...r,folder:i,project:n});e.status(201).json(a)}));Es.get("/:moduleId",Fe(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r=await ce(Ee()),n=r.modules[t.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await to(n,r,v);e.json(o)}catch(o){e.status(400).json({err:o})}}));Es.post("/:moduleId/duplicate",Fe(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=Hw.parse(t.body)}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{_i(r.name)}catch(h){e.status(400).json({error:h.message});return}let n=Ee(),o=await ce(n),i=o.modules[t.params.moduleId];if(!i){e.status(404).json({error:"Module not found."});return}if(Object.values(o.modules).find(h=>h.name===r.name)){e.status(400).send(`A module with the name "${r.name}" already exists. Please choose a different name.`);return}let a=await to(i,o,v),s=Cd.join(n.rootDir,Cd.dirname(i.relativePath));if(!wd.existsSync(s)||!wd.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let c=st(r.name),l=Cd.join(s,`${c}.module.yaml`),u=$8(),{stepsToSave:d}=await Pt({stepLists:{steps:a.steps},createNewCacheIds:!0,cacheCreationParams:{orgId:zt()}}),p={fileType:De.MODULE,schemaVersion:Qe,moduleId:u,name:r.name,description:"",enabled:!0,steps:d.steps,parameters:a.parameters,defaultParameters:a.defaultParameters,parameterEnums:a.parameterEnums,defaultCacheKey:a.defaultCacheKey,defaultCacheTtl:a.defaultCacheTtl,defaultCacheAllInvocations:a.defaultCacheAllInvocations,autoAuth:a.autoAuth,advanced:a.advanced},m=W8.stringify(p);wd.writeFileSync(l,m,"utf-8");let g={relativeFilePath:Cd.relative(n.rootDir,l)};e.status(201).json(g)}));Es.patch("/:moduleId/metadata",Fe(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=Gw.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Ee(),o=await ce(n);eL({moduleId:t.params.moduleId,content:r,momenticFiles:o,logger:v,project:n}),e.status(201).json({message:"ok"})}));var _k=Es;var Ik=q8();Ik.get("/",Fe(async(t,e)=>{let r=Ee(),n=await ce(r),o=new Set;n?.tests&&Object.values(n.tests).forEach(l=>{l.labels?.forEach(u=>o.add(u))});let i=Array.from(o).sort(),a=Object.values(n.tests),s=await Bh(n),c={labels:i,tests:a,modules:s};e.status(200).json(c)}));var Pk=Ik;import{Router as K8}from"express";var ZT=K8();ZT.get("/",Fe((t,e)=>{let r=kg(Ee(),ct);e.status(200).json(r)}));ZT.get("/names",Fe((t,e)=>{let n=Ee().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var Mk=ZT;import{Router as Y8}from"express";var Ok=Y8();Ok.get("/",Fe((t,e)=>{let r={userId:Lo(),orgId:zt(),cliVersion:Rd??"0.0.0"};e.status(200).json(r)}));var Lk=Ok;import{StreamableHTTPServerTransport as MZ}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as OZ}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as LZ}from"crypto";import{Router as NZ}from"express";import{randomUUID as QT}from"crypto";import{existsSync as X8,mkdirSync as J8}from"fs";import{writeFile as ev}from"fs/promises";import{tmpdir as Z8}from"os";import gi from"path";var Q8="file",e9="MOMENTIC_MCP_OUTPUT_MODE";function Nk(){let t=process.env[e9];return t==="inline"||t==="file"?t:Q8}var zh=gi.join(Z8(),"momentic-mcp"),Dk=gi.join(zh,"browser-state"),kk=gi.join(zh,"screenshot"),Uk=gi.join(zh,"environment-variables"),tv=gi.join(zh,"tests"),t9=[Dk,kk,Uk,tv];function xd(){for(let t of t9)X8(t)||J8(t,{recursive:!0})}function Fk(t){return t.map(e=>{switch(e.type){case"text":return e;case"media":return{type:"image",data:e.data,mimeType:e.mediaType};default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}})}function Bk(t,e){return e?[{type:"text",text:`<${e}>`},...t,{type:"text",text:`</${e}>`}]:t}function se({text:t,xmlTag:e}){return Bk([{type:"text",text:t}],e)}function r9({imageDataUri:t,xmlTag:e}){return Bk([{type:"media",data:t,mediaType:"image/jpeg"}],e)}function at(t){if(t.length===0)throw new At("No content parts provided to construct the tool response content.");return{type:"content",value:t}}async function n9({browser:t,outputMode:e="inline",returnSnapshot:r=!0,tokenLimit:n}){let o=t.getActivePage(),i=[];if(r){let s=await t.getBrowserState({skipWait:!1});i.push("- Page Snapshot:","```xml",s.serialize(),"```")}let a=["### Page state",`- Page URL: ${o.url()}`,`- Page Title: ${await o.title()}`,...i].join(`
|
|
4648
4648
|
`);if(n!==void 0&&We(a)>n)return se({text:["### Page state",`- Page URL: ${o.url()}`,`- Page Title: ${await o.title()}`,"- Page Snapshot:","<WARNING>","The page state was too long and we had to truncate the page state.","</WARNING>"].join(`
|
|
4649
4649
|
`),xmlTag:"PageState"});if(e==="file"){xd();let s=gi.join(Dk,`${QT()}.txt`);return await ev(s,a,"utf8"),se({text:s,xmlTag:"PageState"})}return se({text:a,xmlTag:"PageState"})}async function gn({browser:t,outputMode:e="inline"}){let r=await t.screenshot({retries:2});if(e==="file"){xd();let o=gi.join(kk,`${QT()}.jpeg`);return await ev(o,r),se({text:o,xmlTag:"Screenshot"})}let n=r.toString("base64");return r9({imageDataUri:n,xmlTag:"Screenshot"})}async function o9(t,e,r){let n=await ce(t),o=await St(gi.join(t.rootDir,e),r,n);try{let a=new pt({baseUrl:er(),apiKey:$r(),logger:r}),s=await Ir(r,a,t),c=Oo({logger:r,orgId:zt(),client:a,gitMetadata:s,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1,bustOldestCachePercentage:void 0}),{steps:l,beforeSteps:u,afterSteps:d}=await Eg({cacheStorage:c,logger:r,schemaVersion:o.schemaVersion,stepLists:{steps:o.steps,beforeSteps:o.beforeSteps,afterSteps:o.afterSteps},testId:o.id});o.beforeSteps=u,o.steps=l,o.afterSteps=d}catch(a){r.error({err:a},"Failed to resolve step cache entries for agent test view")}let i=[];return i.push("### Test"),i.push(`Name: ${o.name}`),o.description&&i.push(`Description: ${o.description}`),i.push(""),o.beforeSteps&&o.beforeSteps.length>0&&(i.push(Lg(o.beforeSteps,"Setup Steps")),i.push("")),i.push(Lg(o.steps,"Main Steps")),o.afterSteps&&o.afterSteps.length>0&&(i.push(""),i.push(Lg(o.afterSteps,"Teardown Steps"))),se({text:i.join(`
|
|
4650
4650
|
`),xmlTag:"TestContent"})}async function rv({browser:t,tokenLimit:e,returnBrowserState:r=!0,returnScreenshot:n=!0,outputMode:o="inline"}){let[i,a]=await Promise.all([n9({browser:t,outputMode:o,returnSnapshot:r,tokenLimit:e}),n===!1?Promise.resolve([]):gn({browser:t,outputMode:o})]);return[...i,...a]}async function zk(t){return at(await rv(t))}async function Hh(t,e,r){return at(await o9(t,e,r))}function i9(t,e=2e4){let r={};for(let[n,o]of Object.entries(t)){if(typeof o=="object"&&o!==null){let i=JSON.stringify(o,null,2);if(We(i)>e){r[n]="[too large truncated]";continue}r[n]=o;continue}r[n]=o}return r}function a9(t,e){let r={},n=0,o=Object.entries(t).map(([i,a])=>{let s=JSON.stringify(a,null,2),c=We(s);return{key:i,value:a,tokens:c}}).sort((i,a)=>i.tokens-a.tokens);for(let{key:i,value:a,tokens:s}of o)n+s<=e&&(r[i]=a,n+=s);return r}async function so({testContext:t,outputMode:e="inline",limits:r}){let n=r?.tokenLimit,o=r?.perItemLimit??2e4,i=t.toObjectCopy(),a=JSON.stringify(i,null,2);if(e==="file"){xd();let p=gi.join(Uk,`${QT()}.json`);return await ev(p,a,"utf8"),se({text:p,xmlTag:"EnvironmentVariables"})}if(n===void 0)return se({text:a,xmlTag:"EnvironmentVariables"});if(We(a)<=n)return se({text:a,xmlTag:"EnvironmentVariables"});let c=i9(i,o),l=JSON.stringify(c,null,2);if(We(l)<=n)return se({text:l,xmlTag:"EnvironmentVariables"});let d=a9(c,n);return se({text:JSON.stringify(d,null,2),xmlTag:"EnvironmentVariables"})}async function Hk({testContext:t,limits:e,outputMode:r="inline"}){return at(await so({testContext:t,outputMode:r,limits:e}))}import{McpServer as _Z}from"@modelcontextprotocol/sdk/server/mcp.js";import{SSEServerTransport as IZ}from"@modelcontextprotocol/sdk/server/sse.js";import{StdioServerTransport as PZ}from"@modelcontextprotocol/sdk/server/stdio.js";import{streamObject as d9}from"ai";import Xh from"dedent";import p9 from"path";import{z as da}from"zod";import{tool as s9}from"ai";import{z as l9}from"zod";var jk=(t,e)=>({builder:n=>s9({description:t.schema.description,inputSchema:l9.object(t.schema.inputSchema),execute:async o=>{let i=e(n);n.logger.info({input:o},`Executing tool ${t.schema.name}`);try{await t.handle(n,o,i,void 0)}catch(s){i.addError(String(s))}let a=await i.serialize();return a.isError?n.logger.warn({toolName:t.schema.name,input:o,err:a.content.map(s=>"text"in s?s.text:"").join(`
|
|
@@ -4721,7 +4721,7 @@ with this test we are editing:
|
|
|
4721
4721
|
|
|
4722
4722
|
to pick which of these modules are relevant:
|
|
4723
4723
|
|
|
4724
|
-
`;let m=S9(u);p+=m;let g=d9({schema:ov,model:d("claude-sonnet-4-5-20250929"),system:f9,messages:[{role:"user",content:p}]}),h=[];for await(let T of g.textStream)h.push(T);let f=h.join(""),S;try{let T=JSON.parse(f);S=ov.parse(T)}catch(T){i.error({rawResponse:f,parseError:T},"Failed to parse AI response as JSON"),r.addError(`Failed to parse AI response: ${String(T)}. Raw response: ${f}`);return}let b=new Set(u.map(T=>T.moduleId)),y=S.recommendations.filter(T=>b.has(T.moduleId)?!0:(i.warn({moduleId:T.moduleId,moduleName:T.moduleName},"AI recommended a module that doesn't exist"),!1));r.addPartFromText(JSON.stringify({recommendations:y,totalModulesAnalyzed:u.length},null,2))}catch(c){i.error({err:c},"Error in module recommendation"),r.addError(`Failed to recommend modules: ${String(c)}`)}}}),Jh=[b9,m9,g9];import{z as ef}from"zod";import{randomUUID as T9}from"crypto";import E9 from"path";var Zh=new Uh;var pa=class extends Zl{constructor(r,n){super(r,n);this.client=r;this.orgId=n}getApiServerUrl(){return er()}getAppServerUrl(){return uN()}async fetchTestMetadata(r){let
|
|
4724
|
+
`;let m=S9(u);p+=m;let g=d9({schema:ov,model:d("claude-sonnet-4-5-20250929"),system:f9,messages:[{role:"user",content:p}]}),h=[];for await(let T of g.textStream)h.push(T);let f=h.join(""),S;try{let T=JSON.parse(f);S=ov.parse(T)}catch(T){i.error({rawResponse:f,parseError:T},"Failed to parse AI response as JSON"),r.addError(`Failed to parse AI response: ${String(T)}. Raw response: ${f}`);return}let b=new Set(u.map(T=>T.moduleId)),y=S.recommendations.filter(T=>b.has(T.moduleId)?!0:(i.warn({moduleId:T.moduleId,moduleName:T.moduleName},"AI recommended a module that doesn't exist"),!1));r.addPartFromText(JSON.stringify({recommendations:y,totalModulesAnalyzed:u.length},null,2))}catch(c){i.error({err:c},"Error in module recommendation"),r.addError(`Failed to recommend modules: ${String(c)}`)}}}),Jh=[b9,m9,g9];import{z as ef}from"zod";import{randomUUID as T9}from"crypto";import E9 from"path";var Zh=new Uh;var pa=class extends Zl{constructor(r,n,o){super(r,n);this.client=r;this.orgId=n;this.project=o}project;getApiServerUrl(){return er()}getAppServerUrl(){return uN()}async fetchTestMetadata(r){let o=(await ce(this.project)).tests[r];if(o)return pd(o.relativePath,this.project)}async fetchApiTestMetadata(){throw new Error("API tests are not available in the desktop app")}async fetchEnvironment(r,n){return ls(r,this.project,Eo)}async fetchIconKnowledgeBase(r){try{return await this.client.fetchIconKnowledgeBase(r)}catch(n){return r.error({err:n},"Failed to fetch icon knowledge base"),null}}};var Ts=class{constructor(e){this.apiClient=e}async prepareGoldenScreenshotForComparison(e,r,n){return await new Kl(Ee(),this.apiClient,!1).prepareGoldenScreenshotForComparison(e,r,n)}};async function Md({logger:t,project:e,entity:r,headfulOverride:n,resolvedTest:o,envName:i}){let a=$r(),s=zt(),c=er(),l=new pt({apiKey:a,baseUrl:c,logger:t}),u=new Ts(l),d=new pa(l,s,e),p=new Mo({httpClient:new fr({baseUrl:c,apiKey:a,logger:t,mode:"interactive"}),fakerSeed:e.config.advanced?.fakerConstantSeed?ml:void 0}),m=o??await St(r.fullFilePath,t,await ce(e)),g=m.advanced?.viewport??Ar,{envName:h,environmentVariables:f,baseUrl:S}=rh({test:m,envNameOverride:i,resolveEnv:A=>ls(A,e,t)}),b=new Po(e.config.ai?.agentConfig,{baseUrl:c,apiKey:a,logger:t,mode:"interactive"}),y=new ta({baseUrl:c,apiKey:a,logger:t,mode:"interactive"},b),T=await Gn.init({baseUrl:S,userBrowserSettings:{},enricher:y,storage:d,logger:t,contextArgs:{viewport:g,locale:Pi,timezoneId:Mi,geolocation:Oi},iconKnowledgeBase:null,callbacks:{},headfulOverride:n});await T.navigate({url:S,initialNavigation:!0});let w=new la({browser:T,generator:b,logger:t,orgId:s,options:{scratchPadId:void 0,slowMoMs:void 0,autoFollowNewTabs:!0,useMemory:e.config.ai?.useMemory,aiPageFiltering:!0},storage:d,localCodeEvalTools:p,visualDiffScreenshotStorage:u}),P=new zr({baseUrl:S,currentUrl:T.url(),variablesFromEnvironment:f,envName:h,testName:m.name});return{controller:w,context:P,baseUrl:S,envName:h,storage:d,codeEvalTools:p,orgId:s}}async function Qh({project:t,logger:e,testPath:r,orgId:n,storage:o,apiKey:i,baseUrl:a,controller:s,testContext:c,outputMode:l}){let u=await ce(t),d=await St(E9.join(t.rootDir,r),e,u),p={ai:t.config.ai??{},browser:t.config.browser??{}},{baseUrl:m,envName:g,environmentVariables:h,testName:f}=await Fo({testId:d.id,orgId:n,logger:e,storage:o,authorization:{type:"API_KEY",apiKey:i,baseUrl:a},settings:p}),{baseUrl:S}=await ac({controller:s,context:c,baseUrl:m,envName:g,testName:f,environmentVariables:h}),[b,y]=await Promise.all([gn({browser:s.browser,outputMode:l}),so({testContext:c,outputMode:l})]),T=[...se({text:`Session reset to ${S}.`,xmlTag:"Result"}),...b,...y];return at(T)}var Od=5*60*1e3,iv=class{sessions=new Map;async startSession({logger:e,testId:r,headfulOverride:n,envName:o,projectConfigPath:i,projectNameFilter:a}){let s=await Nt({configFilePath:i,nameFilter:a}),{entity:c,momenticFiles:l}=await en(s,{id:r},"test"),u=c,d=await St(u.fullFilePath,e,l),{controller:p,context:m,baseUrl:g,envName:h,storage:f,codeEvalTools:S,orgId:b}=await Md({logger:e,project:s,entity:u,headfulOverride:n,resolvedTest:d,envName:o}),y=T9(),T=Date.now(),w={sessionId:y,testId:u.id,controller:p,context:m,storage:f,codeEvalTools:S,orgId:b,createdAt:T,lastAccessedAt:T,timeoutHandle:setTimeout(()=>{this.killSession(y,"idle timeout").catch(P=>{w.logger.error({err:P,sessionId:y},"Failed to clean up granular session")})},Od),logger:e};return this.sessions.set(y,w),{session:w,baseUrl:g,envName:h}}getSession(e){return this.sessions.get(e)}listSessionIds(){return Array.from(this.sessions.keys())}touchSession(e){let r=this.sessions.get(e);if(r)return r.lastAccessedAt=Date.now(),this.resetTimeout(r),r}async killSession(e,r){let n=this.sessions.get(e);if(!n)return!1;if(n.cleanupInProgress)throw new Error(`Cleanup already in progress for session '${e}'.`);n.cleanupInProgress=!0;try{n.controller.setClosed(),await n.controller.browser.cleanup(),this.sessions.delete(e),clearTimeout(n.timeoutHandle)}catch(o){return n.cleanupInProgress=!1,n.logger.error({err:o,sessionId:e,reason:r},"Failed to clean up granular session"),!1}return!0}resetTimeout(e){clearTimeout(e.timeoutHandle),e.timeoutHandle=setTimeout(()=>{this.killSession(e.sessionId,"idle timeout")},Od)}},vs=new iv;var As=(t,e)=>{let r=vs.touchSession(e);if(r)return r;t.addError(JSON.stringify({message:`No active session found for id '${e}'.`,availableSessionIds:vs.listSessionIds()},null,2))};var eU=cr({schema:{name:Jk,description:"Get the current browser state for a granular session (a11y tree + screenshot).",inputSchema:{sessionId:ef.string().describe("The session id to query."),returnBrowserState:ef.boolean().default(!0).describe("If you want to include the serialized accessibility snapshot."),returnScreenshot:ef.boolean().default(!1).describe("If you want to include a screenshot")}},handle:async(t,e,r)=>{let n=As(r,e.sessionId);if(!n)return;n.controller.setOpen();let o=await rv({browser:n.controller.browser,outputMode:t.outputMode,returnBrowserState:e.returnBrowserState,returnScreenshot:e.returnScreenshot});r.addContentParts(o)}}),tU=cr({schema:{name:Zk,description:"Get the current environment variables for a session.",inputSchema:{sessionId:ef.string()}},handle:async(t,e,r)=>{let n=As(r,e.sessionId);if(!n)return;let o=await so({testContext:n.context,outputMode:t.outputMode});r.addContentParts(o)}});import{z as lc}from"zod";var rU=cr({schema:{name:Yk,description:"Start a granular browser session for a specific test. Requires a testId.",inputSchema:{testId:lc.string().describe("The test id to target when starting a session."),envName:lc.string().optional().describe("Optional environment override (matches CLI --env behavior). Defaults to the test's default env when omitted."),projectConfigPath:lc.string().optional().describe("Optional path to a momentic.config.yaml file (matches CLI --config)."),projectNameFilter:lc.string().optional().describe("Optional project name filter for workspace configs (matches CLI --filter)."),headfulBrowser:lc.boolean().optional().describe("Whether to launch a headful browser for the session. When omitted, uses the MCP server default if configured.")}},handle:async(t,e,r)=>{let{logger:n}=t;try{let{session:o,baseUrl:i,envName:a}=await vs.startSession({logger:n,testId:e.testId,envName:e.envName,projectConfigPath:e.projectConfigPath??t.project.configFilePath,projectNameFilter:e.projectNameFilter,headfulOverride:e.headfulBrowser??t.headfulBrowserDefault});r.addPartFromText(JSON.stringify({sessionId:o.sessionId,testId:o.testId,createdAt:o.createdAt,expiresAt:o.lastAccessedAt+Od,idleTimeoutMs:Od,envName:a,baseUrl:i},null,2))}catch(o){r.addError(String(o))}}}),nU=cr({schema:{name:Xk,description:"Kill a granular browser session by sessionId. Returns available session ids if the target is missing.",inputSchema:{sessionId:lc.string().describe("The session id to terminate.")}},handle:async(t,e,r)=>{try{if(!await vs.killSession(e.sessionId,"explicit kill")){r.addError(JSON.stringify({message:`No active session found for id '${e.sessionId}'.`,availableSessionIds:vs.listSessionIds()},null,2));return}r.addPartFromText(JSON.stringify({sessionId:e.sessionId,killed:!0},null,2))}catch(n){r.addError(String(n))}}});import{streamText as hZ}from"ai";import{randomUUID as fZ}from"crypto";import{writeFile as SZ}from"fs/promises";import yZ from"path";import{z as hi}from"zod";import oU from"path";import{v4 as v9}from"uuid";async function Ld({project:t,input:e}){try{_i(e.name)}catch(l){throw new At(`${l} when validating the test entity name`)}if(!e.baseUrl&&!e.environment)throw new At("Either 'baseUrl' or 'environment' must be provided when creating a test.");let r=await ce(t);if(Object.values(r.tests).find(l=>l.name===e.name))throw new At(`A test with the name "${e.name}" already exists. Please use a different name.`);let i={id:v9(),name:e.name,description:e.description,baseUrl:e.baseUrl,schemaVersion:Qe,advanced:{browserType:e.browserType??"Chromium",viewport:e.viewport??Ar},retries:1,steps:[]};e.environment&&(i.envs=[{name:e.environment,default:!0}]);let a=oU.join(t.rootDir,...e.pathSegments||[]),s=await rL({test:i,name:e.name,folder:a});return{...i,relativeFilePath:oU.relative(t.rootDir,s)}}import{convertToModelMessages as X9,pruneMessages as J9,stepCountIs as Z9}from"ai";import tf from"dedent";var cc="3",A9=tf`
|
|
4725
4725
|
<ai-actions>
|
|
4726
4726
|
AI actions (type: AI_ACTION_DYNAMIC) are special steps that dynamically generate up to 15 sub-steps to achieve a complex goal. They are useful for:
|
|
4727
4727
|
- Multi-step workflows that require decision-making (e.g., "Find and click the first available appointment slot")
|
|
@@ -5004,7 +5004,7 @@ ${n}`:`${e}
|
|
|
5004
5004
|
|
|
5005
5005
|
${iU}
|
|
5006
5006
|
|
|
5007
|
-
${n}`}import{tool as R9}from"ai";import{z as C9}from"zod";var w9=1,sU=t=>{let e=R9({description:"Return the current browser state, including URL, title, and serialized accessibility snapshot.",inputSchema:C9.object({}),toModelOutput:r=>r,execute:async()=>{t.controller.setOpen();let r=t.controller.browser,n=t.conversationTokenTarget/w9;return zk({browser:r,outputMode:"inline",returnScreenshot:!0,returnBrowserState:!0,tokenLimit:n})}});return{name:hn,tool:e}};import{tool as TU}from"ai";import B9 from"fs";import sf from"path";import{z as mt}from"zod";var hv=Symbol.for("immer-nothing"),Nd=Symbol.for("immer-draftable"),fn=Symbol.for("immer-state");function Lr(t,...e){throw new Error(`[Immer] minified error nr: ${t}. Full error at: https://bit.ly/3cXEKWf`)}var Cs=Object.getPrototypeOf;function ws(t){return!!t&&!!t[fn]}function ma(t){return t?pU(t)||Array.isArray(t)||!!t[Nd]||!!t.constructor?.[Nd]||Bd(t)||zd(t):!1}var x9=Object.prototype.constructor.toString();function pU(t){if(!t||typeof t!="object")return!1;let e=Cs(t);if(e===null)return!0;let r=Object.hasOwnProperty.call(e,"constructor")&&e.constructor;return r===Object?!0:typeof r=="function"&&Function.toString.call(r)===x9}function Dd(t,e){xs(t)===0?Reflect.ownKeys(t).forEach(r=>{e(r,t[r],t)}):t.forEach((r,n)=>e(n,r,t))}function xs(t){let e=t[fn];return e?e.type_:Array.isArray(t)?1:Bd(t)?2:zd(t)?3:0}function kd(t,e){return xs(t)===2?t.has(e):Object.prototype.hasOwnProperty.call(t,e)}function av(t,e){return xs(t)===2?t.get(e):t[e]}function mU(t,e,r){let n=xs(t);n===2?t.set(e,r):n===3?t.add(r):t[e]=r}function _9(t,e){return t===e?t!==0||1/t===1/e:t!==t&&e!==e}function Bd(t){return t instanceof Map}function zd(t){return t instanceof Set}function Rs(t){return t.copy_||t.base_}function cv(t,e){if(Bd(t))return new Map(t);if(zd(t))return new Set(t);if(Array.isArray(t))return Array.prototype.slice.call(t);let r=pU(t);if(e===!0||e==="class_only"&&!r){let n=Object.getOwnPropertyDescriptors(t);delete n[fn];let o=Reflect.ownKeys(n);for(let i=0;i<o.length;i++){let a=o[i],s=n[a];s.writable===!1&&(s.writable=!0,s.configurable=!0),(s.get||s.set)&&(n[a]={configurable:!0,writable:!0,enumerable:s.enumerable,value:t[a]})}return Object.create(Cs(t),n)}else{let n=Cs(t);if(n!==null&&r)return{...t};let o=Object.create(n);return Object.assign(o,t)}}function fv(t,e=!1){return of(t)||ws(t)||!ma(t)||(xs(t)>1&&(t.set=t.add=t.clear=t.delete=I9),Object.freeze(t),e&&Object.entries(t).forEach(([r,n])=>fv(n,!0))),t}function I9(){Lr(2)}function of(t){return Object.isFrozen(t)}var uv={};function _s(t){let e=uv[t];return e||Lr(0,t),e}function P9(t,e){uv[t]||(uv[t]=e)}var Ud;function gU(){return Ud}function M9(t,e){return{drafts_:[],parent_:t,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function lU(t,e){e&&(_s("Patches"),t.patches_=[],t.inversePatches_=[],t.patchListener_=e)}function dv(t){pv(t),t.drafts_.forEach(O9),t.drafts_=null}function pv(t){t===Ud&&(Ud=t.parent_)}function cU(t){return Ud=M9(Ud,t)}function O9(t){let e=t[fn];e.type_===0||e.type_===1?e.revoke_():e.revoked_=!0}function uU(t,e){e.unfinalizedDrafts_=e.drafts_.length;let r=e.drafts_[0];return t!==void 0&&t!==r?(r[fn].modified_&&(dv(e),Lr(4)),ma(t)&&(t=rf(e,t),e.parent_||nf(e,t)),e.patches_&&_s("Patches").generateReplacementPatches_(r[fn].base_,t,e.patches_,e.inversePatches_)):t=rf(e,r,[]),dv(e),e.patches_&&e.patchListener_(e.patches_,e.inversePatches_),t!==hv?t:void 0}function rf(t,e,r){if(of(e))return e;let n=e[fn];if(!n)return Dd(e,(o,i)=>dU(t,n,e,o,i,r)),e;if(n.scope_!==t)return e;if(!n.modified_)return nf(t,n.base_,!0),n.base_;if(!n.finalized_){n.finalized_=!0,n.scope_.unfinalizedDrafts_--;let o=n.copy_,i=o,a=!1;n.type_===3&&(i=new Set(o),o.clear(),a=!0),Dd(i,(s,c)=>dU(t,n,o,s,c,r,a)),nf(t,o,!1),r&&t.patches_&&_s("Patches").generatePatches_(n,r,t.patches_,t.inversePatches_)}return n.copy_}function dU(t,e,r,n,o,i,a){if(ws(o)){let s=i&&e&&e.type_!==3&&!kd(e.assigned_,n)?i.concat(n):void 0,c=rf(t,o,s);if(mU(r,n,c),ws(c))t.canAutoFreeze_=!1;else return}else a&&r.add(o);if(ma(o)&&!of(o)){if(!t.immer_.autoFreeze_&&t.unfinalizedDrafts_<1)return;rf(t,o),(!e||!e.scope_.parent_)&&typeof n!="symbol"&&Object.prototype.propertyIsEnumerable.call(r,n)&&nf(t,o)}}function nf(t,e,r=!1){!t.parent_&&t.immer_.autoFreeze_&&t.canAutoFreeze_&&fv(e,r)}function L9(t,e){let r=Array.isArray(t),n={type_:r?1:0,scope_:e?e.scope_:gU(),modified_:!1,finalized_:!1,assigned_:{},parent_:e,base_:t,draft_:null,copy_:null,revoke_:null,isManual_:!1},o=n,i=Sv;r&&(o=[n],i=Fd);let{revoke:a,proxy:s}=Proxy.revocable(o,i);return n.draft_=s,n.revoke_=a,s}var Sv={get(t,e){if(e===fn)return t;let r=Rs(t);if(!kd(r,e))return N9(t,r,e);let n=r[e];return t.finalized_||!ma(n)?n:n===sv(t.base_,e)?(lv(t),t.copy_[e]=gv(n,t)):n},has(t,e){return e in Rs(t)},ownKeys(t){return Reflect.ownKeys(Rs(t))},set(t,e,r){let n=hU(Rs(t),e);if(n?.set)return n.set.call(t.draft_,r),!0;if(!t.modified_){let o=sv(Rs(t),e),i=o?.[fn];if(i&&i.base_===r)return t.copy_[e]=r,t.assigned_[e]=!1,!0;if(_9(r,o)&&(r!==void 0||kd(t.base_,e)))return!0;lv(t),mv(t)}return t.copy_[e]===r&&(r!==void 0||e in t.copy_)||Number.isNaN(r)&&Number.isNaN(t.copy_[e])||(t.copy_[e]=r,t.assigned_[e]=!0),!0},deleteProperty(t,e){return sv(t.base_,e)!==void 0||e in t.base_?(t.assigned_[e]=!1,lv(t),mv(t)):delete t.assigned_[e],t.copy_&&delete t.copy_[e],!0},getOwnPropertyDescriptor(t,e){let r=Rs(t),n=Reflect.getOwnPropertyDescriptor(r,e);return n&&{writable:!0,configurable:t.type_!==1||e!=="length",enumerable:n.enumerable,value:r[e]}},defineProperty(){Lr(11)},getPrototypeOf(t){return Cs(t.base_)},setPrototypeOf(){Lr(12)}},Fd={};Dd(Sv,(t,e)=>{Fd[t]=function(){return arguments[0]=arguments[0][0],e.apply(this,arguments)}});Fd.deleteProperty=function(t,e){return Fd.set.call(this,t,e,void 0)};Fd.set=function(t,e,r){return Sv.set.call(this,t[0],e,r,t[0])};function sv(t,e){let r=t[fn];return(r?Rs(r):t)[e]}function N9(t,e,r){let n=hU(e,r);return n?"value"in n?n.value:n.get?.call(t.draft_):void 0}function hU(t,e){if(!(e in t))return;let r=Cs(t);for(;r;){let n=Object.getOwnPropertyDescriptor(r,e);if(n)return n;r=Cs(r)}}function mv(t){t.modified_||(t.modified_=!0,t.parent_&&mv(t.parent_))}function lv(t){t.copy_||(t.copy_=cv(t.base_,t.scope_.immer_.useStrictShallowCopy_))}var D9=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.produce=(e,r,n)=>{if(typeof e=="function"&&typeof r!="function"){let i=r;r=e;let a=this;return function(c=i,...l){return a.produce(c,u=>r.call(this,u,...l))}}typeof r!="function"&&Lr(6),n!==void 0&&typeof n!="function"&&Lr(7);let o;if(ma(e)){let i=cU(this),a=gv(e,void 0),s=!0;try{o=r(a),s=!1}finally{s?dv(i):pv(i)}return lU(i,n),uU(o,i)}else if(!e||typeof e!="object"){if(o=r(e),o===void 0&&(o=e),o===hv&&(o=void 0),this.autoFreeze_&&fv(o,!0),n){let i=[],a=[];_s("Patches").generateReplacementPatches_(e,o,i,a),n(i,a)}return o}else Lr(1,e)},this.produceWithPatches=(e,r)=>{if(typeof e=="function")return(a,...s)=>this.produceWithPatches(a,c=>e(c,...s));let n,o;return[this.produce(e,r,(a,s)=>{n=a,o=s}),n,o]},typeof t?.autoFreeze=="boolean"&&this.setAutoFreeze(t.autoFreeze),typeof t?.useStrictShallowCopy=="boolean"&&this.setUseStrictShallowCopy(t.useStrictShallowCopy)}createDraft(t){ma(t)||Lr(8),ws(t)&&(t=k9(t));let e=cU(this),r=gv(t,void 0);return r[fn].isManual_=!0,pv(e),r}finishDraft(t,e){let r=t&&t[fn];(!r||!r.isManual_)&&Lr(9);let{scope_:n}=r;return lU(n,e),uU(void 0,n)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}applyPatches(t,e){let r;for(r=e.length-1;r>=0;r--){let o=e[r];if(o.path.length===0&&o.op==="replace"){t=o.value;break}}r>-1&&(e=e.slice(r+1));let n=_s("Patches").applyPatches_;return ws(t)?n(t,e):this.produce(t,o=>n(o,e))}};function gv(t,e){let r=Bd(t)?_s("MapSet").proxyMap_(t,e):zd(t)?_s("MapSet").proxySet_(t,e):L9(t,e);return(e?e.scope_:gU()).drafts_.push(r),r}function k9(t){return ws(t)||Lr(10,t),fU(t)}function fU(t){if(!ma(t)||of(t))return t;let e=t[fn],r;if(e){if(!e.modified_)return e.base_;e.finalized_=!0,r=cv(t,e.scope_.immer_.useStrictShallowCopy_)}else r=cv(t,!0);return Dd(r,(n,o)=>{mU(r,n,fU(o))}),e&&(e.finalized_=!1),r}function SU(){let e="replace",r="add",n="remove";function o(p,m,g,h){switch(p.type_){case 0:case 2:return a(p,m,g,h);case 1:return i(p,m,g,h);case 3:return s(p,m,g,h)}}function i(p,m,g,h){let{base_:f,assigned_:S}=p,b=p.copy_;b.length<f.length&&([f,b]=[b,f],[g,h]=[h,g]);for(let y=0;y<f.length;y++)if(S[y]&&b[y]!==f[y]){let T=m.concat([y]);g.push({op:e,path:T,value:d(b[y])}),h.push({op:e,path:T,value:d(f[y])})}for(let y=f.length;y<b.length;y++){let T=m.concat([y]);g.push({op:r,path:T,value:d(b[y])})}for(let y=b.length-1;f.length<=y;--y){let T=m.concat([y]);h.push({op:n,path:T})}}function a(p,m,g,h){let{base_:f,copy_:S}=p;Dd(p.assigned_,(b,y)=>{let T=av(f,b),w=av(S,b),P=y?kd(f,b)?e:r:n;if(T===w&&P===e)return;let A=m.concat(b);g.push(P===n?{op:P,path:A}:{op:P,path:A,value:w}),h.push(P===r?{op:n,path:A}:P===n?{op:r,path:A,value:d(T)}:{op:e,path:A,value:d(T)})})}function s(p,m,g,h){let{base_:f,copy_:S}=p,b=0;f.forEach(y=>{if(!S.has(y)){let T=m.concat([b]);g.push({op:n,path:T,value:y}),h.unshift({op:r,path:T,value:y})}b++}),b=0,S.forEach(y=>{if(!f.has(y)){let T=m.concat([b]);g.push({op:r,path:T,value:y}),h.unshift({op:n,path:T,value:y})}b++})}function c(p,m,g,h){g.push({op:e,path:[],value:m===hv?void 0:m}),h.push({op:e,path:[],value:p})}function l(p,m){return m.forEach(g=>{let{path:h,op:f}=g,S=p;for(let w=0;w<h.length-1;w++){let P=xs(S),A=h[w];typeof A!="string"&&typeof A!="number"&&(A=""+A),(P===0||P===1)&&(A==="__proto__"||A==="constructor")&&Lr(19),typeof S=="function"&&A==="prototype"&&Lr(19),S=av(S,A),typeof S!="object"&&Lr(18,h.join("/"))}let b=xs(S),y=u(g.value),T=h[h.length-1];switch(f){case e:switch(b){case 2:return S.set(T,y);case 3:Lr(16);default:return S[T]=y}case r:switch(b){case 1:return T==="-"?S.push(y):S.splice(T,0,y);case 2:return S.set(T,y);case 3:return S.add(y);default:return S[T]=y}case n:switch(b){case 1:return S.splice(T,1);case 2:return S.delete(T);case 3:return S.delete(g.value);default:return delete S[T]}default:Lr(17,f)}}),p}function u(p){if(!ma(p))return p;if(Array.isArray(p))return p.map(u);if(Bd(p))return new Map(Array.from(p.entries()).map(([g,h])=>[g,u(h)]));if(zd(p))return new Set(Array.from(p).map(u));let m=Object.create(Cs(p));for(let g in p)m[g]=u(p[g]);return kd(p,Nd)&&(m[Nd]=p[Nd]),m}function d(p){return ws(p)?u(p):p}P9("Patches",{applyPatches_:l,generatePatches_:o,generateReplacementPatches_:c})}var Sn=new D9,ilt=Sn.produce,yU=Sn.produceWithPatches.bind(Sn),alt=Sn.setAutoFreeze.bind(Sn),slt=Sn.setUseStrictShallowCopy.bind(Sn),llt=Sn.applyPatches.bind(Sn),clt=Sn.createDraft.bind(Sn),ult=Sn.finishDraft.bind(Sn);import{v4 as U9}from"uuid";SU();function Hd({logger:t,socket:e,baseState:r,recipe:n,description:o}){let[i,a,s]=yU(r,n),c={id:U9(),patches:a,inversePatches:s,description:o,timestamp:Date.now()};return e?.emit("copilotPatch",c),t.info({description:o},"Emitting copilot patch"),{patch:c,newState:i}}import F9 from"fs";import uc from"path";function bU(t){let e=t.subDir?uc.join(t.project.rootDir,t.subDir):t.project.rootDir,r=`${st(t.name)}.module.yaml`,n=uc.join(e,r),o=uc.relative(t.project.rootDir,n),i=F9.statSync(n);return{type:De.MODULE,name:t.name,id:t.moduleId,description:t.description??void 0,relativePath:o,fullFilePath:n,platformSep:uc.sep,fullPathSegments:n.split(uc.sep),relativePathSegments:o.split(uc.sep),fileName:r,lastModified:i.mtime,createdAt:i.birthtime}}import{randomUUID as yv}from"crypto";import{z as EU}from"zod";function af(t){let e=t.config.ai?.aiAction??!1,r=e?"The step types that can be ingested for a test change. The PRESET_ACTION's action can be seen as a single step command. The MODULE is a module step to use. The AI_ACTION_DYNAMIC is an AI action that will dynamically generate up to 15 steps to achieve a goal.":"The step types that can be ingested for a test change. The PRESET_ACTION's action can be seen as a single step command. The MODULE is a module step to use.";return e?EU.discriminatedUnion("type",[wp,xp,uS]).describe(r):EU.discriminatedUnion("type",[wp,xp]).describe(r)}async function jd(t,e,r){switch(t.type){case"PRESET_ACTION":{let n=Ys(t.action);if(n.type==="SUCCESS"||n.type==="FAILURE")throw new Error("Cannot create a step with a SUCCESS or FAILURE command");let o=t.envKey&&cS.includes(n.type)?t.envKey:void 0;return{type:"PRESET_ACTION",command:n,id:yv(),envKey:o}}case"MODULE":{let{selector:n,inputs:o}=t.module,{entity:i,momenticFiles:a}=await en(e,n,"module"),s=await to(i,a,r);BR(o,s);let l=Object.keys(o??{}).length>0?o??{}:(s.parameters?.length??0)>0?{}:void 0,u={id:yv(),inputs:l};return{...s,...u,type:"RESOLVED_MODULE"}}case"AI_ACTION_DYNAMIC":{if(!(e.config.ai?.aiAction??!1))throw new Error("AI actions are disabled. Enable AI actions in your momentic.config.yaml by setting 'ai.aiAction: true' to use this feature.");return{type:"AI_ACTION_DYNAMIC",text:t.text,id:yv()}}default:return(o=>{throw new Error("You missed a case in the switch above")})(t)}}async function vU({moduleMetadata:t,steps:e,momenticFiles:r,project:n}){let{stepsToSave:o}=await Pt({stepLists:{steps:e}});Un({content:{...t,steps:o.steps},schemaVersion:Qe,momenticFiles:r,project:n})}function z9({step:t,moduleMetadata:e,updatedSteps:r}){if(t.type!=="RESOLVED_MODULE")return;let{moduleId:n,...o}=e;Object.assign(t,o),t.steps=r}var H9=(t,e)=>{let r=!1,n=o=>o.type!=="RESOLVED_MODULE"||o.moduleId!==e?!1:(r=!0,!0);return kn({steps:t,earlyStop:!0,onPresetAction:n,onConditional:n,onSimpleStepContainer:n}),r},j9=(t,e,r,n)=>{let o=i=>{i.type==="RESOLVED_MODULE"&&i.moduleId===e&&z9({step:i,moduleMetadata:r,updatedSteps:n})};kn({steps:t,onPresetAction:o,onConditional:o,onSimpleStepContainer:o})},AU=t=>{let e=TU({description:"Create a module. If startIndex is provided, the steps will be extracted from the current test, a module will be created with those steps, and the test will be updated to reference the new module. If no startIndex is provided, an unreferenced module will be created. Automatically splices and repairs the test to reference the new module.",inputSchema:mt.object({name:mt.string(),description:mt.string(),enabled:mt.boolean().default(!0),parameters:mt.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:mt.record(mt.string(),mt.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:mt.record(mt.string(),mt.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:mt.record(mt.string(),mt.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 if startIndex is provided."),subDir:mt.string().optional().describe("sub directory to create the module in. If not provided, the module will be created in the project's root directory."),startIndex:mt.number().optional().describe("Start index of steps to extract from the current test (0-based)."),endIndex:mt.number().optional().describe("End index of steps to extract from the current test (exclusive). If not provided, extracts just the startIndex.")}),execute:async r=>{let{project:n,logger:o,testPath:i,socket:a,saveChangesToDisk:s}=t,c=r.startIndex??0,l=r.endIndex??c+1,u=await ce(n);if(Object.values(u.modules).find(f=>f.name===r.name))return at(se({text:`Error: A module with the name "${r.name}" already exists. Please use a different name.`,xmlTag:"Error"}));if(r.parameters!==void 0){let f=r.defaultParameters?Object.keys(r.defaultParameters):[],S=r.parameterEnums?Object.keys(r.parameterEnums):[],b=new Set([...f,...S]);for(let y of b)if(!r.parameters.includes(y))return at(se({text:`Error: Default parameter "${y}" is not defined in parameters array. Available parameters: ${r.parameters.join(", ")}`,xmlTag:"Error"}))}let p=[];if(r.startIndex!==void 0){if(!i)return at(se({text:"Error: testPath is required when extracting steps from the current test.",xmlTag:"Error"}));let f=await St(sf.join(n.rootDir,i),o,u);if(c<0||c>=f.steps.length)return at(se({text:`Error: startIndex ${c} is out of bounds. Test has ${f.steps.length} steps.`,xmlTag:"Error"}));if(l<=c||l>f.steps.length)return at(se({text:`Error: endIndex ${l} is out of bounds. Must be between ${c+1} and ${f.steps.length}.`,xmlTag:"Error"}));p=f.steps.slice(c,l);for(let S of p)if(S.type==="RESOLVED_MODULE")return at(se({text:"Error: Modules cannot be nested. Please select steps that do not include module references.",xmlTag:"Error"}))}let m=r.subDir?sf.join(n.rootDir,r.subDir):n.rootDir;r.subDir&&B9.mkdirSync(m,{recursive:!0});let g=await Ng({name:r.name,description:r.description??"",enabled:r.enabled??!0,steps:p,folder:m,project:n}),h=bU({project:n,name:r.name,moduleId:g.moduleId,subDir:r.subDir,description:g.description??void 0});if(u.modules[g.moduleId]=h,r.parameters!==void 0||r.defaultParameters!==void 0||r.parameterEnums!==void 0){let f={moduleId:g.moduleId,name:r.name,description:r.description??g.description,enabled:r.enabled??g.enabled,parameters:r.parameters??[],defaultParameters:r.defaultParameters,parameterEnums:r.parameterEnums};await vU({moduleMetadata:f,steps:p,momenticFiles:u,project:n}),g={...g,name:r.name,description:r.description??g.description,enabled:r.enabled??g.enabled,parameters:r.parameters??[],defaultParameters:r.defaultParameters,parameterEnums:r.parameterEnums}}if(r.startIndex!==void 0){let f=await St(sf.join(n.rootDir,i),o,u),S={steps:f.steps??[],beforeSteps:f.beforeSteps??[],afterSteps:f.afterSteps??[]},b={type:"MODULE",module:{selector:{id:g.moduleId},inputs:r.moduleInputs??{}}},y;try{y=await jd(b,n,o)}catch(P){return at(se({text:`Module "${r.name}" was created successfully, but could not be added to the test. ${String(P)}`,xmlTag:"Error"}))}let T=P=>{P.steps.splice(c,l-c,y)},{newState:w}=Hd({logger:o,socket:a,baseState:S,recipe:T,description:`Create module "${r.name}" from steps ${c}-${l-1}`});if(s){let{stepsToSave:P,moduleUpdates:A}=await Pt({stepLists:w});A.forEach(x=>{Un({content:x,schemaVersion:Qe,momenticFiles:u,project:n})}),cn({relativeTestPath:i,steps:P,schemaVersion:Qe,project:n})}}return at(se({text:JSON.stringify(g,null,2),xmlTag:"ModuleResult"}))}});return{name:$h,tool:e}};function G9(t,e,r,n,o){if(t===void 0&&e!==void 0)throw new At("Validation Error: startIndex is required when endIndex is provided.");if(t!==void 0&&e===void 0&&r===0)throw new At("Validation Error: steps are required when startIndex is provided without an endIndex.");if(t!==void 0&&(t>n||t<0))throw new At(`Validation Error: startIndex is out of bounds for module with ${n} steps.`);if(e!==void 0&&t===void 0)throw new At("Validation Error: startIndex is required when endIndex is provided.");if(e!==void 0&&t!==void 0&&e<t)throw new At("Validation Error: endIndex must be greater than or equal to startIndex.");if(e!==void 0&&(e>n||e<0))throw new At(`Validation Error: endIndex ${e} is out of bounds for module with ${n} steps.`);let i=t??n;if((e??i)===i&&r===0&&!o)throw new At("Validation Error: Nothing to change. Provide steps, a valid delete range, or metadata updates.")}var RU=t=>{let e=af(t.project),r=TU({description:"Edit a module's steps and/or metadata. Provide startIndex (and optional endIndex) to replace or remove that range; omit endIndex to insert at startIndex; omit both indices to append new steps. Use an empty steps array with both indices to delete the range. Optionally update metadata like parameters. Omit both indices and steps to only update metadata.",inputSchema:mt.object({selector:Ii,steps:e.array(),startIndex:mt.number().optional(),endIndex:mt.number().optional(),description:mt.string().optional().describe("New description for the module."),enabled:mt.boolean().optional().describe("New enabled state for the module."),parameters:mt.string().array().optional().describe("New array of parameter names, e.g., ['apiKey', 'userId']. Replaces all existing parameters, resets default parameters and parameter enums if set."),defaultParameters:mt.record(mt.string(),mt.string()).optional().describe("New default values, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:mt.record(mt.string(),mt.string().array()).optional().describe("New enum options, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters.")}),execute:async n=>{let{project:o,logger:i,socket:a,testPath:s,saveChangesToDisk:c}=t,l=await Promise.all(n.steps.map(T=>jd(T,o,i))),{entity:u,momenticFiles:d}=await en(o,n.selector,"module"),p=await to(u,d,i),m=l.find(T=>!oS(T));if(m)return at(se({text:`Error: step type ${m.type} cannot be added to a module.`,xmlTag:"Error"}));let g=n.description!==void 0||n.enabled!==void 0||n.parameters!==void 0||n.defaultParameters!==void 0||n.parameterEnums!==void 0;try{G9(n.startIndex,n.endIndex,n.steps.length,p.steps.length,g)}catch(T){return at(se({text:String(T),xmlTag:"Error"}))}let h=p.steps;if(n.steps.length>0||n.startIndex!==void 0||n.endIndex!==void 0){h=[...p.steps];let T=n.startIndex!==void 0?n.startIndex:h.length,w=n.endIndex!==void 0?n.endIndex:T;h.splice(T,w-T,...l)}let f={moduleId:p.moduleId,name:p.name,description:n.description??p.description,enabled:n.enabled??p.enabled,parameters:n.parameters??p.parameters,defaultParameters:n.defaultParameters??p.defaultParameters,parameterEnums:n.parameterEnums??p.parameterEnums};n.parameters!==void 0&&(f.defaultParameters=n.defaultParameters??{},f.parameterEnums=n.parameterEnums??{});let S=null;if(s){let T=await St(sf.join(o.rootDir,s),i,d);S={steps:T.steps??[],beforeSteps:T.beforeSteps??[],afterSteps:T.afterSteps??[]}}let b=S?[S.steps,S.beforeSteps,S.afterSteps].some(T=>H9(T,p.moduleId)):!1;(c||!b)&&await vU({moduleMetadata:f,steps:h,momenticFiles:d,project:o}),s&&S&&b&&Hd({logger:i,socket:a,baseState:S,recipe:w=>{let P=A=>{j9(A,p.moduleId,f,h)};P(w.steps),P(w.beforeSteps),P(w.afterSteps)},description:`Update module "${p.name}"`});let y={...f,stepCount:h.length};return at(se({text:JSON.stringify(y,null,2),xmlTag:"ModuleResult"}))}});return{name:Wh,tool:r}};import{tool as bv}from"ai";import{randomUUID as wU}from"crypto";import{z as dc}from"zod";import{randomUUID as CU}from"crypto";async function lf({step:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,outputMode:c="inline"}){switch(t.type){case"PRESET_ACTION":return V9({command:t.command,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,outputMode:c});case"AI_ACTION_DYNAMIC":return $9({text:t.text,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,outputMode:c});default:{let[l,u]=await Promise.all([gn({browser:n.browser,outputMode:c}),so({testContext:s,outputMode:c})]);return[...se({text:`Preview for step type ${t.type} is not supported. Only PRESET_ACTION and AI_ACTION_DYNAMIC are supported.`,xmlTag:"Error"}),...l,...u]}}}async function V9({command:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,outputMode:c="inline"}){let l=Ys(t);if(l.type==="SUCCESS"||l.type==="FAILURE")throw new Error("Cannot create a step with a SUCCESS or FAILURE command");let u={type:"PRESET_ACTION",command:l,id:CU()},d=await Pd({step:u,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s}),p=[];d?d.status==="SUCCESS"?p.push(...se({text:`Step Execution successful: ${d.message}`,xmlTag:"SuccessfulResult"})):p.push(...se({text:`Step Execution failed: ${d.message}`,xmlTag:"Error"})):p.push(...se({text:"Step Execution errored for an unknown reason.",xmlTag:"Error"}));let[m,g]=await Promise.all([gn({browser:n.browser,outputMode:c}),so({testContext:s,outputMode:c})]);return p.push(...m,...g),p}async function $9({text:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,outputMode:c="inline"}){let l={type:"AI_ACTION_DYNAMIC",text:t,id:CU()},u=await Pd({step:l,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s}),d=[];u?u.status==="SUCCESS"?d.push(...se({text:`AI action completed successfully: ${u.message??"Goal achieved"}`,xmlTag:"SuccessfulResult"})):d.push(...se({text:`AI action failed: ${u.message??"Unknown error while previewing AI action"}`,xmlTag:"Error"})):d.push(...se({text:"AI action executed with unknown result.",xmlTag:"Error"}));let[p,m]=await Promise.all([gn({browser:n.browser,outputMode:c}),so({testContext:s,outputMode:c})]);return d.push(...p,...m),d}var W9=t=>{let e=bv({description:"Resolve and validate locators without changing the page. If found, it will return the locator ID and HTML.",inputSchema:dc.object({description:dc.string().describe("Description of the element to preview.")}),toModelOutput:r=>r,execute:async({description:r})=>{t.controller.setOpen();let{controller:n,logger:o,testContext:i}=t;try{let a=await n.locateElement({description:r,disableCache:!0,skipWait:!0,logger:o,testContext:i});a.resolution.locator&&await Promise.all([n.browser.scrollIntoViewIfNeeded(a.resolution.locator),n.browser.highlight(a.resolution.locator)]);let s=[...se({text:`Found element matching description: ${a.target.id}`,xmlTag:"Result"})];return a.target.nodeOnlySerializedHtml&&s.push(...se({text:`HTML: ${a.target.nodeOnlySerializedHtml}`})),s.push(...await gn({browser:n.browser})),at(s)}catch(a){let s=[...se({text:`Failed to find any element matching description: ${a}`,xmlTag:"Error"}),...await gn({browser:n.browser})];return at(s)}}});return{name:$n,tool:e}},q9=t=>{let e=bv({description:"Confirm page state.",inputSchema:dc.object({assertion:dc.string().describe("Assertion to confirm page state.")}),toModelOutput:r=>r,execute:async({assertion:r})=>{t.controller.setOpen();let{logger:n,storage:o,controller:i,codeEvalTools:a,socket:s,orgId:c,testContext:l}=t,u={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:r,id:wU()},id:wU()},d=await Pd({step:u,controller:i,storage:o,codeEvalTools:a,logger:n,socket:s,orgId:c,testContext:l}),p=[];return d?d.status==="SUCCESS"?p.push(...se({text:`Assertion is true: ${d.message}`,xmlTag:"SuccessfulResult"})):p.push(...se({text:`Assertion is false: ${d.message}`,xmlTag:"Error"})):p.push(...se({text:"Assertion executed with unknown result.",xmlTag:"Error"})),p.push(...await gn({browser:i.browser})),at(p)}});return{name:Gk,tool:e}},K9=t=>{let{project:e}=t,n=e.config.ai?.aiAction??!1?dc.union([Gc,Rp]):Gc,o=bv({description:"Execute a step without adding it to the test.",inputSchema:dc.object({step:n}),toModelOutput:i=>i,execute:async({step:i})=>{t.controller.setOpen();let{logger:a,storage:s,controller:c,codeEvalTools:l,socket:u,orgId:d,testContext:p}=t,m=await lf({step:i,logger:a,storage:s,controller:c,codeEvalTools:l,socket:u,orgId:d,testContext:p});return at(m)}});return{name:Or,tool:o}},xU=[W9,q9,K9];import{tool as Ev}from"ai";import{z as Tv}from"zod";import{cloneDeep as Y9}from"lodash-es";import _U from"path";var IU=t=>{throw new Error(`Unknown test section: ${t}`)};function PU(t,e){switch(e){case"setup":return t.beforeSteps??[];case"teardown":return t.afterSteps??[];case"main":return t.steps;default:return IU(e)}}async function cf({project:t,logger:e,testPath:r,socket:n,saveChangesToDisk:o,params:i}){let a=await ce(t),s=await St(_U.join(t.rootDir,r),e,a),c={steps:s.steps??[],beforeSteps:s.beforeSteps??[],afterSteps:s.afterSteps??[]},l=PU(c,i.targetSection);if(i.startIndex<0||i.startIndex>l.length)return at(se({text:`Error: Invalid startIndex ${i.startIndex} for splicing ${i.targetSection} section with ${l.length} steps (must be 0-${l.length})`,xmlTag:"Error"}));let u=await Promise.all(i.steps.map(f=>jd(f,t,e))),d=f=>{switch(i.targetSection){case"setup":f.beforeSteps.splice(i.startIndex,i.deleteCount,...u);break;case"teardown":f.afterSteps.splice(i.startIndex,i.deleteCount,...u);break;case"main":f.steps.splice(i.startIndex,i.deleteCount,...u);break;default:IU(i.targetSection)}},p=i.steps.length,m=i.deleteCount,{newState:g}=Hd({logger:e,socket:n,baseState:c,recipe:d,description:`Splice ${p} step(s) at index ${i.startIndex} in ${i.targetSection}, removing ${m}`});if(o){let{stepsToSave:f,moduleUpdates:S}=await Pt({stepLists:g});S.forEach(b=>{Un({content:b,schemaVersion:Qe,momenticFiles:a,project:t})}),cn({relativeTestPath:r,steps:f,schemaVersion:Qe,project:t})}let h=[...se({text:`Successfully spliced ${p} step(s) at index ${i.startIndex} in the ${i.targetSection} section, removing ${m} step(s).`,xmlTag:"Result"})];return i.returnTest&&h.push(...se({text:JSON.stringify(await Hh(t,r,e),null,2),xmlTag:"TestContent"})),at(h)}async function uf({project:t,logger:e,testPath:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:c,params:l,tokenLimit:u,outputMode:d="inline"}){let{fromStep:p,toStep:m,targetSection:g}=l,h=await ce(t),f=await St(_U.join(t.rootDir,r),e,h),S=new pt({baseUrl:er(),apiKey:$r(),logger:e}),b=await Ir(e,S,t),y=Oo({logger:e,orgId:s,client:S,gitMetadata:b,regenerateCache:!1,alwaysSaveCache:!0,noCache:!1,bustOldestCachePercentage:void 0}),T=[];try{await y.resolveStepCacheEntries({logger:e,schemaVersion:f.schemaVersion,stepLists:{beforeSteps:f.beforeSteps??[],afterSteps:f.afterSteps??[],steps:f.steps},testId:f.id})}catch(F){e.warn({err:F},"Failed to resolve step cache entries, continuing without cache")}T=PU(f,g);let w=Y9({steps:f.steps,beforeSteps:f.beforeSteps,afterSteps:f.afterSteps}),{result:P}=kl(T,p.fromStepId,p.parentStepIdChain);if(!P)return at(se({text:`Error: No step found with id "${p.fromStepId}" and parent chain [${p.parentStepIdChain.join(", ")}] in ${g} section.`,xmlTag:"Error"}));if(m){let{result:F}=kl(T,m.toStepId,m.parentStepIdChain);if(!F)return at(se({text:`Error: No step found with id "${m.toStepId}" and parent chain [${m.parentStepIdChain.join(", ")}] in ${g} section.`,xmlTag:"Error"}))}o.setOpen();let{results:A}=await nv({steps:T,controller:o,storage:n,codeEvalTools:i,logger:e,socket:a,orgId:s,testContext:c,fromStep:p,toStep:m});if(!A||A.length===0)return at(se({text:"Error: No steps were executed.",xmlTag:"Error"}));let x=A.at(-1);if(!x)return at(se({text:"Error: No steps were executed.",xmlTag:"Error"}));let O={logger:e,cacheStorage:y,orgId:s,testId:f.id,originalStepsWithCaches:w,updatedStepsWithCaches:{steps:f.steps,beforeSteps:f.beforeSteps??[],afterSteps:f.afterSteps??[]}};if(x.status!=="SUCCESS")return x.status==="FAILED"&&await jl(O),at(se({text:`Error: step with id ${x.id} failed: ${x.message}`,xmlTag:"Error"}));try{await Hl(O)}catch(F){e.warn({err:F},"Failed to save step cache after execution, future runs may be slower")}let L=g==="main"?"":` in ${g}`,N=F=>{let z="fromStepId"in F?F.fromStepId:F.toStepId;return F.parentStepIdChain.length>0?`id "${z}" (parent chain [${F.parentStepIdChain.join(", ")}])`:`id "${z}"`},j=m?`Steps from ${N(p)} through ${N(m)}${L}`:`Steps from ${N(p)} to end${L}`,W=[];if(x.status==="SUCCESS"){o.setOpen();let F=`${j} executed successfully.`;W.push(...se({text:F,xmlTag:"Result"})),x.data&&W.push(...se({text:`Data: ${JSON.stringify(x.data,null,2)}`,xmlTag:"ResultData"}))}let[B,xe]=await Promise.all([gn({browser:o.browser,outputMode:d}),so({testContext:c,outputMode:d,limits:{tokenLimit:u}})]);return at([...W,...B,...xe])}var MU=3,OU=t=>{let e=Ev({description:"Get the current environment variables.",inputSchema:Tv.object({}),toModelOutput:r=>r,execute:async()=>{let r=t.conversationTokenTarget/MU;return Hk({testContext:t.testContext,limits:{tokenLimit:r}})}});return{name:jh,tool:e}},LU=t=>{let e=Ev({description:"Reset the browser session. This will clear any authentication state and also navigate to the starting URL of the test.",inputSchema:Tv.object({}),toModelOutput:r=>r,execute:async()=>{t.controller.setOpen();let{project:r,logger:n,testPath:o,orgId:i,storage:a,apiKey:s,baseUrl:c,controller:l,testContext:u}=t;return Qh({project:r,logger:n,testPath:o,orgId:i,storage:a,apiKey:s,baseUrl:c,controller:l,testContext:u,outputMode:t.outputMode})}});return{name:Gh,tool:e}},NU=t=>{let e=Ev({description:"Run steps from a given step to the end (or to an optional end step). Use the same stepId and parentStepIdChain when running to/from specific steps. parentStepIdChain is the list of parent step ids from root to the step's immediate parent (empty for top-level steps).",inputSchema:Tv.object({fromStep:Nh,toStep:Dh.optional(),targetSection:Ma.default("main")}),toModelOutput:r=>r,execute:async({fromStep:r,toStep:n,targetSection:o})=>{t.controller.setOpen();let i=t.conversationTokenTarget/MU;return uf({project:t.project,logger:t.logger,testPath:t.testPath,storage:t.storage,controller:t.controller,codeEvalTools:t.codeEvalTools,socket:t.socket,orgId:t.orgId,testContext:t.testContext,params:{fromStep:r,toStep:n,targetSection:o},tokenLimit:i})}});return{name:Bo,tool:e}};import{tool as DU}from"ai";import{z as Gd}from"zod";var kU=t=>{let e=af(t.project),r=DU({description:`Splice steps in the test. This is the primary tool for replacing, removing, or bulk inserting steps. Never use this as a means to bypass a failure. Examples: Replace step at index 5: ${tr}(startIndex=5, deleteCount=1, steps=[newStep]). Delete step at index 5: ${tr}(startIndex=5, deleteCount=1, steps=[]). Insert multiple steps at index 5: ${tr}(startIndex=5, deleteCount=0, steps=[step1, step2]).`,inputSchema:Gd.object({startIndex:Gd.number(),deleteCount:Gd.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:e.array(),targetSection:Ma.default("main"),returnTest:Gd.boolean().default(!1).describe("Whether or not you want to see the full test after the splice is complete")}),execute:async n=>{let{project:o,logger:i,testPath:a,socket:s,saveChangesToDisk:c}=t;return cf({project:o,logger:i,testPath:a,socket:s,saveChangesToDisk:c,params:n})}});return{name:tr,tool:r}},UU=t=>{let e=DU({description:"Retrieve the full test contents, including simplified cache data on some steps enabling you to inspect resolved locators and debug targeting issues. For context, the caches are just simplified targeting information",inputSchema:Gd.object({}),execute:async()=>Hh(t.project,t.testPath,t.logger)});return{name:Vh,tool:e}};var FU=[sU,OU,NU,UU,LU,kU,AU,RU,...xU];var Q9=1e5,BU=8e4,vv=2,Av="[trimmed: omitted due to context budget]",Rv=50,eZ=1600;function tZ(t,e){return typeof t=="object"&&t!==null&&t.type===e}function rZ(t,e,r){let n=0,o=[];for(let i of t){let a=i.content;if(!Array.isArray(a)){o.push(i);continue}let s=[];for(let c of a){if(n>=e){s.push(c);continue}if(!tZ(c,r)){s.push(c);continue}if(r==="image"){n>=e?s.push(c):n+=eZ;continue}let l=r==="tool-result"?"output":"input",u=r==="tool-result"?c.output:c.input;if(u===void 0||u===Av){s.push(c);continue}let d=We(u);n+=d;let p=r==="tool-call"?{_trimmed:Av}:{type:"text",value:Av};s.push({...c,[l]:p})}s.length!==0&&o.push({...i,content:s})}return{messages:o,trimmedTokens:n}}function nZ(t){let e=t[0];return e?"parts"in e&&Array.isArray(e.parts):!1}function oZ(t){return J9({messages:t,reasoning:"before-last-message",toolCalls:[{type:"before-last-10-messages",tools:[sc,ua,jh]},{type:"before-last-5-messages",tools:[Bo]},{type:"before-last-4-messages",tools:[Vh,Gh,tr,$h,$n,Or]},{type:"before-last-3-messages",tools:[hn,qh,Wh]}],emptyMessages:"remove"})}var iZ=["tool-result","image","tool-call"],aZ=.3;function Vd(t,e,r){let n=[...t];for(let o of iZ){let i=We(n);if(i<=e)break;let a=i-e,s=rZ(n,a,o);n=s.messages,s.trimmedTokens>0&&r.debug({contentType:o,trimmedTokens:s.trimmedTokens,newTokenCount:We(n)},"Trimmed content")}return n}function sZ(t,e,r){let n=We(t);if(n<=e||t.length<=1)return t;let o=t[0],i=[],a=[];if(t.length>vv+1?(i=t.slice(1,t.length-vv),a=t.slice(t.length-vv)):a=t.slice(1),i.length>0){i=Vd(i,e,r);let u=[o,...i,...a];if(n=We(u),n<=e)return u}let s=We(i),c=s/e;if(c<aZ){if(a.length>1){let u=a[a.length-1],d=[...i,...a.slice(0,-1)],p=Vd(d,e,r),m=[o,...p,u];if(n=We(m),n<=e)return m;let g=Vd([...p,u],e,r),h=[o,...g];if(n=We(h),n<=e)return h}else if(a.length===1){let u=[...i,...a],d=Vd(u,e,r),p=[o,...d];if(n=We(p),n<=e)return p}}else for(r.debug({headBudgetRatio:c,middleMsgTokens:s,targetTokens:e},"Middle exceeds 30% budget, removing messages");i.length>0;){i.shift();let u=[o,...i,...a];if(n=We(u),n<=e)return u}a=Vd(a,e,r);let l=[o,...i,...a];if(n=We(l),n<=e)return l;for(;a.length>0;)if(a.shift(),l=[o,...i,...a],n=We(l),n<=e)return l;return n>e&&r.warn({targetTokens:e,finalTokenCount:n,remainingMessages:l.length},"Unable to meet token target after all pruning phases"),l}function lZ(t,e,r,n){let o=oZ(t),i=We(o);return i>e&&(n.debug({projected:i,threshold:e,target:r},"Context exceeds threshold, pruning messages"),o=sZ(o,r,n)),o}function $d(t){let{testPath:e,messages:r,logger:n,session:o,sessionId:i,hooks:a={},saveChangesToDisk:s=!1,outputMode:c="inline"}=t,{onStepFinish:l,onPrepareStep:u,onChunk:d,onError:p,onFinish:m}=a,g=$r(),h=zt(),f=er(),S=fe(),b=new pt({apiKey:g,baseUrl:f,logger:n}),y=new pa(b,h),T=new Mo({httpClient:new fr({baseUrl:b.baseUrl,apiKey:b.apiKey,logger:n,mode:"interactive"}),fakerSeed:S.config.advanced?.fakerConstantSeed?ml:void 0}),w={project:S,apiKey:g,orgId:h,baseUrl:f,sessionId:i,logger:n,storage:y,codeEvalTools:T,saveChangesToDisk:s,outputMode:"inline",testPath:e,testContext:o.context,controller:o.controller,socket:o.socket,conversationTokenTarget:BU},P=Jh.reduce((W,{name:B,builder:xe})=>(W[B]=xe(w),W),{}),A={};for(let W of FU){let B=W(w);B&&(A[B.name]=B.tool)}let x={...P,...A},O=Kh(i),L=async W=>{let{messages:B}=W;u&&await u(B);let xe=lZ(B,Q9,BU,n),F=We(B);return F>Jw&&n.debug({originalCount:B.length,prunedCount:xe.length,originalTokens:F,prunedTokens:We(xe)},"Prepared messages for copilot step"),{...W,messages:xe}},N={model:O("claude-sonnet-4-5-20250929"),stopWhen:Z9(Rv),maxRetries:4,system:aU(S),tools:x,prepareStep:L,onStepFinish:l,onChunk:d,onError:p,onFinish:async({finishReason:W,usage:B,text:xe,response:F})=>{n.info({finishReason:W,usage:B,sessionId:i},"Full copilot turn finished"),m&&await m({finishReason:W,usage:B,text:xe,response:F})}},j=nZ(r)?X9(r,{tools:N.tools}):r;return{...N,messages:j}}import{Mutex as cZ}from"async-mutex";var Cv=class{mutexes=new Map;activeControllers=new Map;async startOrReplace(e,r){r.throwIfAborted(),this.mutexes.has(e)||this.mutexes.set(e,new cZ);let o=await this.mutexes.get(e).acquire();try{let i=this.activeControllers.get(e);i&&!i.signal.aborted&&i.abort(new Error(`Superseded by newer ${Id} invocation. Stop executing edit_test requests to this test and ask the user what to do next.`));let a=new AbortController;return this.activeControllers.set(e,a),{signal:AbortSignal.any([r,a.signal]),release:()=>{this.activeControllers.get(e)===a&&this.activeControllers.delete(e),this.activeControllers.has(e)||this.mutexes.delete(e)}}}finally{o()}}},zU=new Cv;import pc from"dedent";function uZ(){let t=Object.entries(Yf).map(([e,r])=>`- **${e}**: ${r}`).join(`
|
|
5007
|
+
${n}`}import{tool as R9}from"ai";import{z as C9}from"zod";var w9=1,sU=t=>{let e=R9({description:"Return the current browser state, including URL, title, and serialized accessibility snapshot.",inputSchema:C9.object({}),toModelOutput:r=>r,execute:async()=>{t.controller.setOpen();let r=t.controller.browser,n=t.conversationTokenTarget/w9;return zk({browser:r,outputMode:"inline",returnScreenshot:!0,returnBrowserState:!0,tokenLimit:n})}});return{name:hn,tool:e}};import{tool as TU}from"ai";import B9 from"fs";import sf from"path";import{z as mt}from"zod";var hv=Symbol.for("immer-nothing"),Nd=Symbol.for("immer-draftable"),fn=Symbol.for("immer-state");function Lr(t,...e){throw new Error(`[Immer] minified error nr: ${t}. Full error at: https://bit.ly/3cXEKWf`)}var Cs=Object.getPrototypeOf;function ws(t){return!!t&&!!t[fn]}function ma(t){return t?pU(t)||Array.isArray(t)||!!t[Nd]||!!t.constructor?.[Nd]||Bd(t)||zd(t):!1}var x9=Object.prototype.constructor.toString();function pU(t){if(!t||typeof t!="object")return!1;let e=Cs(t);if(e===null)return!0;let r=Object.hasOwnProperty.call(e,"constructor")&&e.constructor;return r===Object?!0:typeof r=="function"&&Function.toString.call(r)===x9}function Dd(t,e){xs(t)===0?Reflect.ownKeys(t).forEach(r=>{e(r,t[r],t)}):t.forEach((r,n)=>e(n,r,t))}function xs(t){let e=t[fn];return e?e.type_:Array.isArray(t)?1:Bd(t)?2:zd(t)?3:0}function kd(t,e){return xs(t)===2?t.has(e):Object.prototype.hasOwnProperty.call(t,e)}function av(t,e){return xs(t)===2?t.get(e):t[e]}function mU(t,e,r){let n=xs(t);n===2?t.set(e,r):n===3?t.add(r):t[e]=r}function _9(t,e){return t===e?t!==0||1/t===1/e:t!==t&&e!==e}function Bd(t){return t instanceof Map}function zd(t){return t instanceof Set}function Rs(t){return t.copy_||t.base_}function cv(t,e){if(Bd(t))return new Map(t);if(zd(t))return new Set(t);if(Array.isArray(t))return Array.prototype.slice.call(t);let r=pU(t);if(e===!0||e==="class_only"&&!r){let n=Object.getOwnPropertyDescriptors(t);delete n[fn];let o=Reflect.ownKeys(n);for(let i=0;i<o.length;i++){let a=o[i],s=n[a];s.writable===!1&&(s.writable=!0,s.configurable=!0),(s.get||s.set)&&(n[a]={configurable:!0,writable:!0,enumerable:s.enumerable,value:t[a]})}return Object.create(Cs(t),n)}else{let n=Cs(t);if(n!==null&&r)return{...t};let o=Object.create(n);return Object.assign(o,t)}}function fv(t,e=!1){return of(t)||ws(t)||!ma(t)||(xs(t)>1&&(t.set=t.add=t.clear=t.delete=I9),Object.freeze(t),e&&Object.entries(t).forEach(([r,n])=>fv(n,!0))),t}function I9(){Lr(2)}function of(t){return Object.isFrozen(t)}var uv={};function _s(t){let e=uv[t];return e||Lr(0,t),e}function P9(t,e){uv[t]||(uv[t]=e)}var Ud;function gU(){return Ud}function M9(t,e){return{drafts_:[],parent_:t,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function lU(t,e){e&&(_s("Patches"),t.patches_=[],t.inversePatches_=[],t.patchListener_=e)}function dv(t){pv(t),t.drafts_.forEach(O9),t.drafts_=null}function pv(t){t===Ud&&(Ud=t.parent_)}function cU(t){return Ud=M9(Ud,t)}function O9(t){let e=t[fn];e.type_===0||e.type_===1?e.revoke_():e.revoked_=!0}function uU(t,e){e.unfinalizedDrafts_=e.drafts_.length;let r=e.drafts_[0];return t!==void 0&&t!==r?(r[fn].modified_&&(dv(e),Lr(4)),ma(t)&&(t=rf(e,t),e.parent_||nf(e,t)),e.patches_&&_s("Patches").generateReplacementPatches_(r[fn].base_,t,e.patches_,e.inversePatches_)):t=rf(e,r,[]),dv(e),e.patches_&&e.patchListener_(e.patches_,e.inversePatches_),t!==hv?t:void 0}function rf(t,e,r){if(of(e))return e;let n=e[fn];if(!n)return Dd(e,(o,i)=>dU(t,n,e,o,i,r)),e;if(n.scope_!==t)return e;if(!n.modified_)return nf(t,n.base_,!0),n.base_;if(!n.finalized_){n.finalized_=!0,n.scope_.unfinalizedDrafts_--;let o=n.copy_,i=o,a=!1;n.type_===3&&(i=new Set(o),o.clear(),a=!0),Dd(i,(s,c)=>dU(t,n,o,s,c,r,a)),nf(t,o,!1),r&&t.patches_&&_s("Patches").generatePatches_(n,r,t.patches_,t.inversePatches_)}return n.copy_}function dU(t,e,r,n,o,i,a){if(ws(o)){let s=i&&e&&e.type_!==3&&!kd(e.assigned_,n)?i.concat(n):void 0,c=rf(t,o,s);if(mU(r,n,c),ws(c))t.canAutoFreeze_=!1;else return}else a&&r.add(o);if(ma(o)&&!of(o)){if(!t.immer_.autoFreeze_&&t.unfinalizedDrafts_<1)return;rf(t,o),(!e||!e.scope_.parent_)&&typeof n!="symbol"&&Object.prototype.propertyIsEnumerable.call(r,n)&&nf(t,o)}}function nf(t,e,r=!1){!t.parent_&&t.immer_.autoFreeze_&&t.canAutoFreeze_&&fv(e,r)}function L9(t,e){let r=Array.isArray(t),n={type_:r?1:0,scope_:e?e.scope_:gU(),modified_:!1,finalized_:!1,assigned_:{},parent_:e,base_:t,draft_:null,copy_:null,revoke_:null,isManual_:!1},o=n,i=Sv;r&&(o=[n],i=Fd);let{revoke:a,proxy:s}=Proxy.revocable(o,i);return n.draft_=s,n.revoke_=a,s}var Sv={get(t,e){if(e===fn)return t;let r=Rs(t);if(!kd(r,e))return N9(t,r,e);let n=r[e];return t.finalized_||!ma(n)?n:n===sv(t.base_,e)?(lv(t),t.copy_[e]=gv(n,t)):n},has(t,e){return e in Rs(t)},ownKeys(t){return Reflect.ownKeys(Rs(t))},set(t,e,r){let n=hU(Rs(t),e);if(n?.set)return n.set.call(t.draft_,r),!0;if(!t.modified_){let o=sv(Rs(t),e),i=o?.[fn];if(i&&i.base_===r)return t.copy_[e]=r,t.assigned_[e]=!1,!0;if(_9(r,o)&&(r!==void 0||kd(t.base_,e)))return!0;lv(t),mv(t)}return t.copy_[e]===r&&(r!==void 0||e in t.copy_)||Number.isNaN(r)&&Number.isNaN(t.copy_[e])||(t.copy_[e]=r,t.assigned_[e]=!0),!0},deleteProperty(t,e){return sv(t.base_,e)!==void 0||e in t.base_?(t.assigned_[e]=!1,lv(t),mv(t)):delete t.assigned_[e],t.copy_&&delete t.copy_[e],!0},getOwnPropertyDescriptor(t,e){let r=Rs(t),n=Reflect.getOwnPropertyDescriptor(r,e);return n&&{writable:!0,configurable:t.type_!==1||e!=="length",enumerable:n.enumerable,value:r[e]}},defineProperty(){Lr(11)},getPrototypeOf(t){return Cs(t.base_)},setPrototypeOf(){Lr(12)}},Fd={};Dd(Sv,(t,e)=>{Fd[t]=function(){return arguments[0]=arguments[0][0],e.apply(this,arguments)}});Fd.deleteProperty=function(t,e){return Fd.set.call(this,t,e,void 0)};Fd.set=function(t,e,r){return Sv.set.call(this,t[0],e,r,t[0])};function sv(t,e){let r=t[fn];return(r?Rs(r):t)[e]}function N9(t,e,r){let n=hU(e,r);return n?"value"in n?n.value:n.get?.call(t.draft_):void 0}function hU(t,e){if(!(e in t))return;let r=Cs(t);for(;r;){let n=Object.getOwnPropertyDescriptor(r,e);if(n)return n;r=Cs(r)}}function mv(t){t.modified_||(t.modified_=!0,t.parent_&&mv(t.parent_))}function lv(t){t.copy_||(t.copy_=cv(t.base_,t.scope_.immer_.useStrictShallowCopy_))}var D9=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.produce=(e,r,n)=>{if(typeof e=="function"&&typeof r!="function"){let i=r;r=e;let a=this;return function(c=i,...l){return a.produce(c,u=>r.call(this,u,...l))}}typeof r!="function"&&Lr(6),n!==void 0&&typeof n!="function"&&Lr(7);let o;if(ma(e)){let i=cU(this),a=gv(e,void 0),s=!0;try{o=r(a),s=!1}finally{s?dv(i):pv(i)}return lU(i,n),uU(o,i)}else if(!e||typeof e!="object"){if(o=r(e),o===void 0&&(o=e),o===hv&&(o=void 0),this.autoFreeze_&&fv(o,!0),n){let i=[],a=[];_s("Patches").generateReplacementPatches_(e,o,i,a),n(i,a)}return o}else Lr(1,e)},this.produceWithPatches=(e,r)=>{if(typeof e=="function")return(a,...s)=>this.produceWithPatches(a,c=>e(c,...s));let n,o;return[this.produce(e,r,(a,s)=>{n=a,o=s}),n,o]},typeof t?.autoFreeze=="boolean"&&this.setAutoFreeze(t.autoFreeze),typeof t?.useStrictShallowCopy=="boolean"&&this.setUseStrictShallowCopy(t.useStrictShallowCopy)}createDraft(t){ma(t)||Lr(8),ws(t)&&(t=k9(t));let e=cU(this),r=gv(t,void 0);return r[fn].isManual_=!0,pv(e),r}finishDraft(t,e){let r=t&&t[fn];(!r||!r.isManual_)&&Lr(9);let{scope_:n}=r;return lU(n,e),uU(void 0,n)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}applyPatches(t,e){let r;for(r=e.length-1;r>=0;r--){let o=e[r];if(o.path.length===0&&o.op==="replace"){t=o.value;break}}r>-1&&(e=e.slice(r+1));let n=_s("Patches").applyPatches_;return ws(t)?n(t,e):this.produce(t,o=>n(o,e))}};function gv(t,e){let r=Bd(t)?_s("MapSet").proxyMap_(t,e):zd(t)?_s("MapSet").proxySet_(t,e):L9(t,e);return(e?e.scope_:gU()).drafts_.push(r),r}function k9(t){return ws(t)||Lr(10,t),fU(t)}function fU(t){if(!ma(t)||of(t))return t;let e=t[fn],r;if(e){if(!e.modified_)return e.base_;e.finalized_=!0,r=cv(t,e.scope_.immer_.useStrictShallowCopy_)}else r=cv(t,!0);return Dd(r,(n,o)=>{mU(r,n,fU(o))}),e&&(e.finalized_=!1),r}function SU(){let e="replace",r="add",n="remove";function o(p,m,g,h){switch(p.type_){case 0:case 2:return a(p,m,g,h);case 1:return i(p,m,g,h);case 3:return s(p,m,g,h)}}function i(p,m,g,h){let{base_:f,assigned_:S}=p,b=p.copy_;b.length<f.length&&([f,b]=[b,f],[g,h]=[h,g]);for(let y=0;y<f.length;y++)if(S[y]&&b[y]!==f[y]){let T=m.concat([y]);g.push({op:e,path:T,value:d(b[y])}),h.push({op:e,path:T,value:d(f[y])})}for(let y=f.length;y<b.length;y++){let T=m.concat([y]);g.push({op:r,path:T,value:d(b[y])})}for(let y=b.length-1;f.length<=y;--y){let T=m.concat([y]);h.push({op:n,path:T})}}function a(p,m,g,h){let{base_:f,copy_:S}=p;Dd(p.assigned_,(b,y)=>{let T=av(f,b),w=av(S,b),P=y?kd(f,b)?e:r:n;if(T===w&&P===e)return;let A=m.concat(b);g.push(P===n?{op:P,path:A}:{op:P,path:A,value:w}),h.push(P===r?{op:n,path:A}:P===n?{op:r,path:A,value:d(T)}:{op:e,path:A,value:d(T)})})}function s(p,m,g,h){let{base_:f,copy_:S}=p,b=0;f.forEach(y=>{if(!S.has(y)){let T=m.concat([b]);g.push({op:n,path:T,value:y}),h.unshift({op:r,path:T,value:y})}b++}),b=0,S.forEach(y=>{if(!f.has(y)){let T=m.concat([b]);g.push({op:r,path:T,value:y}),h.unshift({op:n,path:T,value:y})}b++})}function c(p,m,g,h){g.push({op:e,path:[],value:m===hv?void 0:m}),h.push({op:e,path:[],value:p})}function l(p,m){return m.forEach(g=>{let{path:h,op:f}=g,S=p;for(let w=0;w<h.length-1;w++){let P=xs(S),A=h[w];typeof A!="string"&&typeof A!="number"&&(A=""+A),(P===0||P===1)&&(A==="__proto__"||A==="constructor")&&Lr(19),typeof S=="function"&&A==="prototype"&&Lr(19),S=av(S,A),typeof S!="object"&&Lr(18,h.join("/"))}let b=xs(S),y=u(g.value),T=h[h.length-1];switch(f){case e:switch(b){case 2:return S.set(T,y);case 3:Lr(16);default:return S[T]=y}case r:switch(b){case 1:return T==="-"?S.push(y):S.splice(T,0,y);case 2:return S.set(T,y);case 3:return S.add(y);default:return S[T]=y}case n:switch(b){case 1:return S.splice(T,1);case 2:return S.delete(T);case 3:return S.delete(g.value);default:return delete S[T]}default:Lr(17,f)}}),p}function u(p){if(!ma(p))return p;if(Array.isArray(p))return p.map(u);if(Bd(p))return new Map(Array.from(p.entries()).map(([g,h])=>[g,u(h)]));if(zd(p))return new Set(Array.from(p).map(u));let m=Object.create(Cs(p));for(let g in p)m[g]=u(p[g]);return kd(p,Nd)&&(m[Nd]=p[Nd]),m}function d(p){return ws(p)?u(p):p}P9("Patches",{applyPatches_:l,generatePatches_:o,generateReplacementPatches_:c})}var Sn=new D9,alt=Sn.produce,yU=Sn.produceWithPatches.bind(Sn),slt=Sn.setAutoFreeze.bind(Sn),llt=Sn.setUseStrictShallowCopy.bind(Sn),clt=Sn.applyPatches.bind(Sn),ult=Sn.createDraft.bind(Sn),dlt=Sn.finishDraft.bind(Sn);import{v4 as U9}from"uuid";SU();function Hd({logger:t,socket:e,baseState:r,recipe:n,description:o}){let[i,a,s]=yU(r,n),c={id:U9(),patches:a,inversePatches:s,description:o,timestamp:Date.now()};return e?.emit("copilotPatch",c),t.info({description:o},"Emitting copilot patch"),{patch:c,newState:i}}import F9 from"fs";import uc from"path";function bU(t){let e=t.subDir?uc.join(t.project.rootDir,t.subDir):t.project.rootDir,r=`${st(t.name)}.module.yaml`,n=uc.join(e,r),o=uc.relative(t.project.rootDir,n),i=F9.statSync(n);return{type:De.MODULE,name:t.name,id:t.moduleId,description:t.description??void 0,relativePath:o,fullFilePath:n,platformSep:uc.sep,fullPathSegments:n.split(uc.sep),relativePathSegments:o.split(uc.sep),fileName:r,lastModified:i.mtime,createdAt:i.birthtime}}import{randomUUID as yv}from"crypto";import{z as EU}from"zod";function af(t){let e=t.config.ai?.aiAction??!1,r=e?"The step types that can be ingested for a test change. The PRESET_ACTION's action can be seen as a single step command. The MODULE is a module step to use. The AI_ACTION_DYNAMIC is an AI action that will dynamically generate up to 15 steps to achieve a goal.":"The step types that can be ingested for a test change. The PRESET_ACTION's action can be seen as a single step command. The MODULE is a module step to use.";return e?EU.discriminatedUnion("type",[wp,xp,uS]).describe(r):EU.discriminatedUnion("type",[wp,xp]).describe(r)}async function jd(t,e,r){switch(t.type){case"PRESET_ACTION":{let n=Ys(t.action);if(n.type==="SUCCESS"||n.type==="FAILURE")throw new Error("Cannot create a step with a SUCCESS or FAILURE command");let o=t.envKey&&cS.includes(n.type)?t.envKey:void 0;return{type:"PRESET_ACTION",command:n,id:yv(),envKey:o}}case"MODULE":{let{selector:n,inputs:o}=t.module,{entity:i,momenticFiles:a}=await en(e,n,"module"),s=await to(i,a,r);BR(o,s);let l=Object.keys(o??{}).length>0?o??{}:(s.parameters?.length??0)>0?{}:void 0,u={id:yv(),inputs:l};return{...s,...u,type:"RESOLVED_MODULE"}}case"AI_ACTION_DYNAMIC":{if(!(e.config.ai?.aiAction??!1))throw new Error("AI actions are disabled. Enable AI actions in your momentic.config.yaml by setting 'ai.aiAction: true' to use this feature.");return{type:"AI_ACTION_DYNAMIC",text:t.text,id:yv()}}default:return(o=>{throw new Error("You missed a case in the switch above")})(t)}}async function vU({moduleMetadata:t,steps:e,momenticFiles:r,project:n}){let{stepsToSave:o}=await Pt({stepLists:{steps:e}});Un({content:{...t,steps:o.steps},schemaVersion:Qe,momenticFiles:r,project:n})}function z9({step:t,moduleMetadata:e,updatedSteps:r}){if(t.type!=="RESOLVED_MODULE")return;let{moduleId:n,...o}=e;Object.assign(t,o),t.steps=r}var H9=(t,e)=>{let r=!1,n=o=>o.type!=="RESOLVED_MODULE"||o.moduleId!==e?!1:(r=!0,!0);return kn({steps:t,earlyStop:!0,onPresetAction:n,onConditional:n,onSimpleStepContainer:n}),r},j9=(t,e,r,n)=>{let o=i=>{i.type==="RESOLVED_MODULE"&&i.moduleId===e&&z9({step:i,moduleMetadata:r,updatedSteps:n})};kn({steps:t,onPresetAction:o,onConditional:o,onSimpleStepContainer:o})},AU=t=>{let e=TU({description:"Create a module. If startIndex is provided, the steps will be extracted from the current test, a module will be created with those steps, and the test will be updated to reference the new module. If no startIndex is provided, an unreferenced module will be created. Automatically splices and repairs the test to reference the new module.",inputSchema:mt.object({name:mt.string(),description:mt.string(),enabled:mt.boolean().default(!0),parameters:mt.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:mt.record(mt.string(),mt.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:mt.record(mt.string(),mt.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:mt.record(mt.string(),mt.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 if startIndex is provided."),subDir:mt.string().optional().describe("sub directory to create the module in. If not provided, the module will be created in the project's root directory."),startIndex:mt.number().optional().describe("Start index of steps to extract from the current test (0-based)."),endIndex:mt.number().optional().describe("End index of steps to extract from the current test (exclusive). If not provided, extracts just the startIndex.")}),execute:async r=>{let{project:n,logger:o,testPath:i,socket:a,saveChangesToDisk:s}=t,c=r.startIndex??0,l=r.endIndex??c+1,u=await ce(n);if(Object.values(u.modules).find(f=>f.name===r.name))return at(se({text:`Error: A module with the name "${r.name}" already exists. Please use a different name.`,xmlTag:"Error"}));if(r.parameters!==void 0){let f=r.defaultParameters?Object.keys(r.defaultParameters):[],S=r.parameterEnums?Object.keys(r.parameterEnums):[],b=new Set([...f,...S]);for(let y of b)if(!r.parameters.includes(y))return at(se({text:`Error: Default parameter "${y}" is not defined in parameters array. Available parameters: ${r.parameters.join(", ")}`,xmlTag:"Error"}))}let p=[];if(r.startIndex!==void 0){if(!i)return at(se({text:"Error: testPath is required when extracting steps from the current test.",xmlTag:"Error"}));let f=await St(sf.join(n.rootDir,i),o,u);if(c<0||c>=f.steps.length)return at(se({text:`Error: startIndex ${c} is out of bounds. Test has ${f.steps.length} steps.`,xmlTag:"Error"}));if(l<=c||l>f.steps.length)return at(se({text:`Error: endIndex ${l} is out of bounds. Must be between ${c+1} and ${f.steps.length}.`,xmlTag:"Error"}));p=f.steps.slice(c,l);for(let S of p)if(S.type==="RESOLVED_MODULE")return at(se({text:"Error: Modules cannot be nested. Please select steps that do not include module references.",xmlTag:"Error"}))}let m=r.subDir?sf.join(n.rootDir,r.subDir):n.rootDir;r.subDir&&B9.mkdirSync(m,{recursive:!0});let g=await Ng({name:r.name,description:r.description??"",enabled:r.enabled??!0,steps:p,folder:m,project:n}),h=bU({project:n,name:r.name,moduleId:g.moduleId,subDir:r.subDir,description:g.description??void 0});if(u.modules[g.moduleId]=h,r.parameters!==void 0||r.defaultParameters!==void 0||r.parameterEnums!==void 0){let f={moduleId:g.moduleId,name:r.name,description:r.description??g.description,enabled:r.enabled??g.enabled,parameters:r.parameters??[],defaultParameters:r.defaultParameters,parameterEnums:r.parameterEnums};await vU({moduleMetadata:f,steps:p,momenticFiles:u,project:n}),g={...g,name:r.name,description:r.description??g.description,enabled:r.enabled??g.enabled,parameters:r.parameters??[],defaultParameters:r.defaultParameters,parameterEnums:r.parameterEnums}}if(r.startIndex!==void 0){let f=await St(sf.join(n.rootDir,i),o,u),S={steps:f.steps??[],beforeSteps:f.beforeSteps??[],afterSteps:f.afterSteps??[]},b={type:"MODULE",module:{selector:{id:g.moduleId},inputs:r.moduleInputs??{}}},y;try{y=await jd(b,n,o)}catch(P){return at(se({text:`Module "${r.name}" was created successfully, but could not be added to the test. ${String(P)}`,xmlTag:"Error"}))}let T=P=>{P.steps.splice(c,l-c,y)},{newState:w}=Hd({logger:o,socket:a,baseState:S,recipe:T,description:`Create module "${r.name}" from steps ${c}-${l-1}`});if(s){let{stepsToSave:P,moduleUpdates:A}=await Pt({stepLists:w});A.forEach(x=>{Un({content:x,schemaVersion:Qe,momenticFiles:u,project:n})}),cn({relativeTestPath:i,steps:P,schemaVersion:Qe,project:n})}}return at(se({text:JSON.stringify(g,null,2),xmlTag:"ModuleResult"}))}});return{name:$h,tool:e}};function G9(t,e,r,n,o){if(t===void 0&&e!==void 0)throw new At("Validation Error: startIndex is required when endIndex is provided.");if(t!==void 0&&e===void 0&&r===0)throw new At("Validation Error: steps are required when startIndex is provided without an endIndex.");if(t!==void 0&&(t>n||t<0))throw new At(`Validation Error: startIndex is out of bounds for module with ${n} steps.`);if(e!==void 0&&t===void 0)throw new At("Validation Error: startIndex is required when endIndex is provided.");if(e!==void 0&&t!==void 0&&e<t)throw new At("Validation Error: endIndex must be greater than or equal to startIndex.");if(e!==void 0&&(e>n||e<0))throw new At(`Validation Error: endIndex ${e} is out of bounds for module with ${n} steps.`);let i=t??n;if((e??i)===i&&r===0&&!o)throw new At("Validation Error: Nothing to change. Provide steps, a valid delete range, or metadata updates.")}var RU=t=>{let e=af(t.project),r=TU({description:"Edit a module's steps and/or metadata. Provide startIndex (and optional endIndex) to replace or remove that range; omit endIndex to insert at startIndex; omit both indices to append new steps. Use an empty steps array with both indices to delete the range. Optionally update metadata like parameters. Omit both indices and steps to only update metadata.",inputSchema:mt.object({selector:Ii,steps:e.array(),startIndex:mt.number().optional(),endIndex:mt.number().optional(),description:mt.string().optional().describe("New description for the module."),enabled:mt.boolean().optional().describe("New enabled state for the module."),parameters:mt.string().array().optional().describe("New array of parameter names, e.g., ['apiKey', 'userId']. Replaces all existing parameters, resets default parameters and parameter enums if set."),defaultParameters:mt.record(mt.string(),mt.string()).optional().describe("New default values, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:mt.record(mt.string(),mt.string().array()).optional().describe("New enum options, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters.")}),execute:async n=>{let{project:o,logger:i,socket:a,testPath:s,saveChangesToDisk:c}=t,l=await Promise.all(n.steps.map(T=>jd(T,o,i))),{entity:u,momenticFiles:d}=await en(o,n.selector,"module"),p=await to(u,d,i),m=l.find(T=>!oS(T));if(m)return at(se({text:`Error: step type ${m.type} cannot be added to a module.`,xmlTag:"Error"}));let g=n.description!==void 0||n.enabled!==void 0||n.parameters!==void 0||n.defaultParameters!==void 0||n.parameterEnums!==void 0;try{G9(n.startIndex,n.endIndex,n.steps.length,p.steps.length,g)}catch(T){return at(se({text:String(T),xmlTag:"Error"}))}let h=p.steps;if(n.steps.length>0||n.startIndex!==void 0||n.endIndex!==void 0){h=[...p.steps];let T=n.startIndex!==void 0?n.startIndex:h.length,w=n.endIndex!==void 0?n.endIndex:T;h.splice(T,w-T,...l)}let f={moduleId:p.moduleId,name:p.name,description:n.description??p.description,enabled:n.enabled??p.enabled,parameters:n.parameters??p.parameters,defaultParameters:n.defaultParameters??p.defaultParameters,parameterEnums:n.parameterEnums??p.parameterEnums};n.parameters!==void 0&&(f.defaultParameters=n.defaultParameters??{},f.parameterEnums=n.parameterEnums??{});let S=null;if(s){let T=await St(sf.join(o.rootDir,s),i,d);S={steps:T.steps??[],beforeSteps:T.beforeSteps??[],afterSteps:T.afterSteps??[]}}let b=S?[S.steps,S.beforeSteps,S.afterSteps].some(T=>H9(T,p.moduleId)):!1;(c||!b)&&await vU({moduleMetadata:f,steps:h,momenticFiles:d,project:o}),s&&S&&b&&Hd({logger:i,socket:a,baseState:S,recipe:w=>{let P=A=>{j9(A,p.moduleId,f,h)};P(w.steps),P(w.beforeSteps),P(w.afterSteps)},description:`Update module "${p.name}"`});let y={...f,stepCount:h.length};return at(se({text:JSON.stringify(y,null,2),xmlTag:"ModuleResult"}))}});return{name:Wh,tool:r}};import{tool as bv}from"ai";import{randomUUID as wU}from"crypto";import{z as dc}from"zod";import{randomUUID as CU}from"crypto";async function lf({step:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,outputMode:c="inline"}){switch(t.type){case"PRESET_ACTION":return V9({command:t.command,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,outputMode:c});case"AI_ACTION_DYNAMIC":return $9({text:t.text,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,outputMode:c});default:{let[l,u]=await Promise.all([gn({browser:n.browser,outputMode:c}),so({testContext:s,outputMode:c})]);return[...se({text:`Preview for step type ${t.type} is not supported. Only PRESET_ACTION and AI_ACTION_DYNAMIC are supported.`,xmlTag:"Error"}),...l,...u]}}}async function V9({command:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,outputMode:c="inline"}){let l=Ys(t);if(l.type==="SUCCESS"||l.type==="FAILURE")throw new Error("Cannot create a step with a SUCCESS or FAILURE command");let u={type:"PRESET_ACTION",command:l,id:CU()},d=await Pd({step:u,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s}),p=[];d?d.status==="SUCCESS"?p.push(...se({text:`Step Execution successful: ${d.message}`,xmlTag:"SuccessfulResult"})):p.push(...se({text:`Step Execution failed: ${d.message}`,xmlTag:"Error"})):p.push(...se({text:"Step Execution errored for an unknown reason.",xmlTag:"Error"}));let[m,g]=await Promise.all([gn({browser:n.browser,outputMode:c}),so({testContext:s,outputMode:c})]);return p.push(...m,...g),p}async function $9({text:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,outputMode:c="inline"}){let l={type:"AI_ACTION_DYNAMIC",text:t,id:CU()},u=await Pd({step:l,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s}),d=[];u?u.status==="SUCCESS"?d.push(...se({text:`AI action completed successfully: ${u.message??"Goal achieved"}`,xmlTag:"SuccessfulResult"})):d.push(...se({text:`AI action failed: ${u.message??"Unknown error while previewing AI action"}`,xmlTag:"Error"})):d.push(...se({text:"AI action executed with unknown result.",xmlTag:"Error"}));let[p,m]=await Promise.all([gn({browser:n.browser,outputMode:c}),so({testContext:s,outputMode:c})]);return d.push(...p,...m),d}var W9=t=>{let e=bv({description:"Resolve and validate locators without changing the page. If found, it will return the locator ID and HTML.",inputSchema:dc.object({description:dc.string().describe("Description of the element to preview.")}),toModelOutput:r=>r,execute:async({description:r})=>{t.controller.setOpen();let{controller:n,logger:o,testContext:i}=t;try{let a=await n.locateElement({description:r,disableCache:!0,skipWait:!0,logger:o,testContext:i});a.resolution.locator&&await Promise.all([n.browser.scrollIntoViewIfNeeded(a.resolution.locator),n.browser.highlight(a.resolution.locator)]);let s=[...se({text:`Found element matching description: ${a.target.id}`,xmlTag:"Result"})];return a.target.nodeOnlySerializedHtml&&s.push(...se({text:`HTML: ${a.target.nodeOnlySerializedHtml}`})),s.push(...await gn({browser:n.browser})),at(s)}catch(a){let s=[...se({text:`Failed to find any element matching description: ${a}`,xmlTag:"Error"}),...await gn({browser:n.browser})];return at(s)}}});return{name:$n,tool:e}},q9=t=>{let e=bv({description:"Confirm page state.",inputSchema:dc.object({assertion:dc.string().describe("Assertion to confirm page state.")}),toModelOutput:r=>r,execute:async({assertion:r})=>{t.controller.setOpen();let{logger:n,storage:o,controller:i,codeEvalTools:a,socket:s,orgId:c,testContext:l}=t,u={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:r,id:wU()},id:wU()},d=await Pd({step:u,controller:i,storage:o,codeEvalTools:a,logger:n,socket:s,orgId:c,testContext:l}),p=[];return d?d.status==="SUCCESS"?p.push(...se({text:`Assertion is true: ${d.message}`,xmlTag:"SuccessfulResult"})):p.push(...se({text:`Assertion is false: ${d.message}`,xmlTag:"Error"})):p.push(...se({text:"Assertion executed with unknown result.",xmlTag:"Error"})),p.push(...await gn({browser:i.browser})),at(p)}});return{name:Gk,tool:e}},K9=t=>{let{project:e}=t,n=e.config.ai?.aiAction??!1?dc.union([Gc,Rp]):Gc,o=bv({description:"Execute a step without adding it to the test.",inputSchema:dc.object({step:n}),toModelOutput:i=>i,execute:async({step:i})=>{t.controller.setOpen();let{logger:a,storage:s,controller:c,codeEvalTools:l,socket:u,orgId:d,testContext:p}=t,m=await lf({step:i,logger:a,storage:s,controller:c,codeEvalTools:l,socket:u,orgId:d,testContext:p});return at(m)}});return{name:Or,tool:o}},xU=[W9,q9,K9];import{tool as Ev}from"ai";import{z as Tv}from"zod";import{cloneDeep as Y9}from"lodash-es";import _U from"path";var IU=t=>{throw new Error(`Unknown test section: ${t}`)};function PU(t,e){switch(e){case"setup":return t.beforeSteps??[];case"teardown":return t.afterSteps??[];case"main":return t.steps;default:return IU(e)}}async function cf({project:t,logger:e,testPath:r,socket:n,saveChangesToDisk:o,params:i}){let a=await ce(t),s=await St(_U.join(t.rootDir,r),e,a),c={steps:s.steps??[],beforeSteps:s.beforeSteps??[],afterSteps:s.afterSteps??[]},l=PU(c,i.targetSection);if(i.startIndex<0||i.startIndex>l.length)return at(se({text:`Error: Invalid startIndex ${i.startIndex} for splicing ${i.targetSection} section with ${l.length} steps (must be 0-${l.length})`,xmlTag:"Error"}));let u=await Promise.all(i.steps.map(f=>jd(f,t,e))),d=f=>{switch(i.targetSection){case"setup":f.beforeSteps.splice(i.startIndex,i.deleteCount,...u);break;case"teardown":f.afterSteps.splice(i.startIndex,i.deleteCount,...u);break;case"main":f.steps.splice(i.startIndex,i.deleteCount,...u);break;default:IU(i.targetSection)}},p=i.steps.length,m=i.deleteCount,{newState:g}=Hd({logger:e,socket:n,baseState:c,recipe:d,description:`Splice ${p} step(s) at index ${i.startIndex} in ${i.targetSection}, removing ${m}`});if(o){let{stepsToSave:f,moduleUpdates:S}=await Pt({stepLists:g});S.forEach(b=>{Un({content:b,schemaVersion:Qe,momenticFiles:a,project:t})}),cn({relativeTestPath:r,steps:f,schemaVersion:Qe,project:t})}let h=[...se({text:`Successfully spliced ${p} step(s) at index ${i.startIndex} in the ${i.targetSection} section, removing ${m} step(s).`,xmlTag:"Result"})];return i.returnTest&&h.push(...se({text:JSON.stringify(await Hh(t,r,e),null,2),xmlTag:"TestContent"})),at(h)}async function uf({project:t,logger:e,testPath:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:c,params:l,tokenLimit:u,outputMode:d="inline"}){let{fromStep:p,toStep:m,targetSection:g}=l,h=await ce(t),f=await St(_U.join(t.rootDir,r),e,h),S=new pt({baseUrl:er(),apiKey:$r(),logger:e}),b=await Ir(e,S,t),y=Oo({logger:e,orgId:s,client:S,gitMetadata:b,regenerateCache:!1,alwaysSaveCache:!0,noCache:!1,bustOldestCachePercentage:void 0}),T=[];try{await y.resolveStepCacheEntries({logger:e,schemaVersion:f.schemaVersion,stepLists:{beforeSteps:f.beforeSteps??[],afterSteps:f.afterSteps??[],steps:f.steps},testId:f.id})}catch(F){e.warn({err:F},"Failed to resolve step cache entries, continuing without cache")}T=PU(f,g);let w=Y9({steps:f.steps,beforeSteps:f.beforeSteps,afterSteps:f.afterSteps}),{result:P}=kl(T,p.fromStepId,p.parentStepIdChain);if(!P)return at(se({text:`Error: No step found with id "${p.fromStepId}" and parent chain [${p.parentStepIdChain.join(", ")}] in ${g} section.`,xmlTag:"Error"}));if(m){let{result:F}=kl(T,m.toStepId,m.parentStepIdChain);if(!F)return at(se({text:`Error: No step found with id "${m.toStepId}" and parent chain [${m.parentStepIdChain.join(", ")}] in ${g} section.`,xmlTag:"Error"}))}o.setOpen();let{results:A}=await nv({steps:T,controller:o,storage:n,codeEvalTools:i,logger:e,socket:a,orgId:s,testContext:c,fromStep:p,toStep:m});if(!A||A.length===0)return at(se({text:"Error: No steps were executed.",xmlTag:"Error"}));let x=A.at(-1);if(!x)return at(se({text:"Error: No steps were executed.",xmlTag:"Error"}));let O={logger:e,cacheStorage:y,orgId:s,testId:f.id,originalStepsWithCaches:w,updatedStepsWithCaches:{steps:f.steps,beforeSteps:f.beforeSteps??[],afterSteps:f.afterSteps??[]}};if(x.status!=="SUCCESS")return x.status==="FAILED"&&await jl(O),at(se({text:`Error: step with id ${x.id} failed: ${x.message}`,xmlTag:"Error"}));try{await Hl(O)}catch(F){e.warn({err:F},"Failed to save step cache after execution, future runs may be slower")}let L=g==="main"?"":` in ${g}`,N=F=>{let z="fromStepId"in F?F.fromStepId:F.toStepId;return F.parentStepIdChain.length>0?`id "${z}" (parent chain [${F.parentStepIdChain.join(", ")}])`:`id "${z}"`},j=m?`Steps from ${N(p)} through ${N(m)}${L}`:`Steps from ${N(p)} to end${L}`,W=[];if(x.status==="SUCCESS"){o.setOpen();let F=`${j} executed successfully.`;W.push(...se({text:F,xmlTag:"Result"})),x.data&&W.push(...se({text:`Data: ${JSON.stringify(x.data,null,2)}`,xmlTag:"ResultData"}))}let[B,xe]=await Promise.all([gn({browser:o.browser,outputMode:d}),so({testContext:c,outputMode:d,limits:{tokenLimit:u}})]);return at([...W,...B,...xe])}var MU=3,OU=t=>{let e=Ev({description:"Get the current environment variables.",inputSchema:Tv.object({}),toModelOutput:r=>r,execute:async()=>{let r=t.conversationTokenTarget/MU;return Hk({testContext:t.testContext,limits:{tokenLimit:r}})}});return{name:jh,tool:e}},LU=t=>{let e=Ev({description:"Reset the browser session. This will clear any authentication state and also navigate to the starting URL of the test.",inputSchema:Tv.object({}),toModelOutput:r=>r,execute:async()=>{t.controller.setOpen();let{project:r,logger:n,testPath:o,orgId:i,storage:a,apiKey:s,baseUrl:c,controller:l,testContext:u}=t;return Qh({project:r,logger:n,testPath:o,orgId:i,storage:a,apiKey:s,baseUrl:c,controller:l,testContext:u,outputMode:t.outputMode})}});return{name:Gh,tool:e}},NU=t=>{let e=Ev({description:"Run steps from a given step to the end (or to an optional end step). Use the same stepId and parentStepIdChain when running to/from specific steps. parentStepIdChain is the list of parent step ids from root to the step's immediate parent (empty for top-level steps).",inputSchema:Tv.object({fromStep:Nh,toStep:Dh.optional(),targetSection:Ma.default("main")}),toModelOutput:r=>r,execute:async({fromStep:r,toStep:n,targetSection:o})=>{t.controller.setOpen();let i=t.conversationTokenTarget/MU;return uf({project:t.project,logger:t.logger,testPath:t.testPath,storage:t.storage,controller:t.controller,codeEvalTools:t.codeEvalTools,socket:t.socket,orgId:t.orgId,testContext:t.testContext,params:{fromStep:r,toStep:n,targetSection:o},tokenLimit:i})}});return{name:Bo,tool:e}};import{tool as DU}from"ai";import{z as Gd}from"zod";var kU=t=>{let e=af(t.project),r=DU({description:`Splice steps in the test. This is the primary tool for replacing, removing, or bulk inserting steps. Never use this as a means to bypass a failure. Examples: Replace step at index 5: ${tr}(startIndex=5, deleteCount=1, steps=[newStep]). Delete step at index 5: ${tr}(startIndex=5, deleteCount=1, steps=[]). Insert multiple steps at index 5: ${tr}(startIndex=5, deleteCount=0, steps=[step1, step2]).`,inputSchema:Gd.object({startIndex:Gd.number(),deleteCount:Gd.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:e.array(),targetSection:Ma.default("main"),returnTest:Gd.boolean().default(!1).describe("Whether or not you want to see the full test after the splice is complete")}),execute:async n=>{let{project:o,logger:i,testPath:a,socket:s,saveChangesToDisk:c}=t;return cf({project:o,logger:i,testPath:a,socket:s,saveChangesToDisk:c,params:n})}});return{name:tr,tool:r}},UU=t=>{let e=DU({description:"Retrieve the full test contents, including simplified cache data on some steps enabling you to inspect resolved locators and debug targeting issues. For context, the caches are just simplified targeting information",inputSchema:Gd.object({}),execute:async()=>Hh(t.project,t.testPath,t.logger)});return{name:Vh,tool:e}};var FU=[sU,OU,NU,UU,LU,kU,AU,RU,...xU];var Q9=1e5,BU=8e4,vv=2,Av="[trimmed: omitted due to context budget]",Rv=50,eZ=1600;function tZ(t,e){return typeof t=="object"&&t!==null&&t.type===e}function rZ(t,e,r){let n=0,o=[];for(let i of t){let a=i.content;if(!Array.isArray(a)){o.push(i);continue}let s=[];for(let c of a){if(n>=e){s.push(c);continue}if(!tZ(c,r)){s.push(c);continue}if(r==="image"){n>=e?s.push(c):n+=eZ;continue}let l=r==="tool-result"?"output":"input",u=r==="tool-result"?c.output:c.input;if(u===void 0||u===Av){s.push(c);continue}let d=We(u);n+=d;let p=r==="tool-call"?{_trimmed:Av}:{type:"text",value:Av};s.push({...c,[l]:p})}s.length!==0&&o.push({...i,content:s})}return{messages:o,trimmedTokens:n}}function nZ(t){let e=t[0];return e?"parts"in e&&Array.isArray(e.parts):!1}function oZ(t){return J9({messages:t,reasoning:"before-last-message",toolCalls:[{type:"before-last-10-messages",tools:[sc,ua,jh]},{type:"before-last-5-messages",tools:[Bo]},{type:"before-last-4-messages",tools:[Vh,Gh,tr,$h,$n,Or]},{type:"before-last-3-messages",tools:[hn,qh,Wh]}],emptyMessages:"remove"})}var iZ=["tool-result","image","tool-call"],aZ=.3;function Vd(t,e,r){let n=[...t];for(let o of iZ){let i=We(n);if(i<=e)break;let a=i-e,s=rZ(n,a,o);n=s.messages,s.trimmedTokens>0&&r.debug({contentType:o,trimmedTokens:s.trimmedTokens,newTokenCount:We(n)},"Trimmed content")}return n}function sZ(t,e,r){let n=We(t);if(n<=e||t.length<=1)return t;let o=t[0],i=[],a=[];if(t.length>vv+1?(i=t.slice(1,t.length-vv),a=t.slice(t.length-vv)):a=t.slice(1),i.length>0){i=Vd(i,e,r);let u=[o,...i,...a];if(n=We(u),n<=e)return u}let s=We(i),c=s/e;if(c<aZ){if(a.length>1){let u=a[a.length-1],d=[...i,...a.slice(0,-1)],p=Vd(d,e,r),m=[o,...p,u];if(n=We(m),n<=e)return m;let g=Vd([...p,u],e,r),h=[o,...g];if(n=We(h),n<=e)return h}else if(a.length===1){let u=[...i,...a],d=Vd(u,e,r),p=[o,...d];if(n=We(p),n<=e)return p}}else for(r.debug({headBudgetRatio:c,middleMsgTokens:s,targetTokens:e},"Middle exceeds 30% budget, removing messages");i.length>0;){i.shift();let u=[o,...i,...a];if(n=We(u),n<=e)return u}a=Vd(a,e,r);let l=[o,...i,...a];if(n=We(l),n<=e)return l;for(;a.length>0;)if(a.shift(),l=[o,...i,...a],n=We(l),n<=e)return l;return n>e&&r.warn({targetTokens:e,finalTokenCount:n,remainingMessages:l.length},"Unable to meet token target after all pruning phases"),l}function lZ(t,e,r,n){let o=oZ(t),i=We(o);return i>e&&(n.debug({projected:i,threshold:e,target:r},"Context exceeds threshold, pruning messages"),o=sZ(o,r,n)),o}function $d(t){let{testPath:e,messages:r,logger:n,session:o,sessionId:i,hooks:a={},saveChangesToDisk:s=!1,outputMode:c="inline"}=t,{onStepFinish:l,onPrepareStep:u,onChunk:d,onError:p,onFinish:m}=a,g=$r(),h=zt(),f=er(),S=Ee(),b=new pt({apiKey:g,baseUrl:f,logger:n}),y=new pa(b,h,S),T=new Mo({httpClient:new fr({baseUrl:b.baseUrl,apiKey:b.apiKey,logger:n,mode:"interactive"}),fakerSeed:S.config.advanced?.fakerConstantSeed?ml:void 0}),w={project:S,apiKey:g,orgId:h,baseUrl:f,sessionId:i,logger:n,storage:y,codeEvalTools:T,saveChangesToDisk:s,outputMode:"inline",testPath:e,testContext:o.context,controller:o.controller,socket:o.socket,conversationTokenTarget:BU},P=Jh.reduce((W,{name:B,builder:xe})=>(W[B]=xe(w),W),{}),A={};for(let W of FU){let B=W(w);B&&(A[B.name]=B.tool)}let x={...P,...A},O=Kh(i),L=async W=>{let{messages:B}=W;u&&await u(B);let xe=lZ(B,Q9,BU,n),F=We(B);return F>Jw&&n.debug({originalCount:B.length,prunedCount:xe.length,originalTokens:F,prunedTokens:We(xe)},"Prepared messages for copilot step"),{...W,messages:xe}},N={model:O("claude-sonnet-4-5-20250929"),stopWhen:Z9(Rv),maxRetries:4,system:aU(S),tools:x,prepareStep:L,onStepFinish:l,onChunk:d,onError:p,onFinish:async({finishReason:W,usage:B,text:xe,response:F})=>{n.info({finishReason:W,usage:B,sessionId:i},"Full copilot turn finished"),m&&await m({finishReason:W,usage:B,text:xe,response:F})}},j=nZ(r)?X9(r,{tools:N.tools}):r;return{...N,messages:j}}import{Mutex as cZ}from"async-mutex";var Cv=class{mutexes=new Map;activeControllers=new Map;async startOrReplace(e,r){r.throwIfAborted(),this.mutexes.has(e)||this.mutexes.set(e,new cZ);let o=await this.mutexes.get(e).acquire();try{let i=this.activeControllers.get(e);i&&!i.signal.aborted&&i.abort(new Error(`Superseded by newer ${Id} invocation. Stop executing edit_test requests to this test and ask the user what to do next.`));let a=new AbortController;return this.activeControllers.set(e,a),{signal:AbortSignal.any([r,a.signal]),release:()=>{this.activeControllers.get(e)===a&&this.activeControllers.delete(e),this.activeControllers.has(e)||this.mutexes.delete(e)}}}finally{o()}}},zU=new Cv;import pc from"dedent";function uZ(){let t=Object.entries(Yf).map(([e,r])=>`- **${e}**: ${r}`).join(`
|
|
5008
5008
|
`);return pc`
|
|
5009
5009
|
### Available Step Types
|
|
5010
5010
|
|
|
@@ -5080,7 +5080,7 @@ Running tool ${d.toolName} with input ${JSON.stringify(d.input)}
|
|
|
5080
5080
|
${l}`)];return e.getMcpCopilotConversationEvaluation({messagesAndToolCalls:c},{logger:r})}var wZ=cr({schema:{name:Id,description:HU(),inputSchema:{selector:Ii,message:hi.string().describe("A single block of natural-language instructions describing the desired edits to the test. The test can also be edited to add modules, edit modules, or create new modules inside of the test. Can only be used to modify steps (including module steps) inside of the passed in test.")}},handle:async(t,e,r,n)=>{let{project:o,logger:i}=t,a=n?.signal;if(!a){r.addError(`No response handler available: client abort signal is required for ${Id}`);return}let s=$r(),c=er(),l=new Po(o.config.ai?.agentConfig,{baseUrl:c,apiKey:s,logger:i,mode:"interactive"}),u={completed:0,total:Rv},{hooks:d,notificationAbortController:p,getAccumulatedText:m}=bZ(n,i,u,r),g=jU(n);g&&await wv(n,u,"Validating if your edits requests are valid...",i,p,r);let h=await l.getLintMcpCopilotMessageResult({message:e.message},{logger:i});if(h.category!=="NONE"){r.addError(`${h.thoughts}
|
|
5081
5081
|
|
|
5082
5082
|
Category: ${h.category}`);return}let f,S;try{({entity:f,momenticFiles:S}=await en(o,e.selector,"test"))}catch(j){r.addError(String(j));return}let b=await St(f.fullFilePath,i,S),y=i.child({applicationName:"momentic-mcp-copilot",testId:f.id}),T=$d({testPath:f.relativePath,messages:[{role:"user",content:e.message}],logger:y,session:{...await Md({logger:y,project:o,entity:f,resolvedTest:b}),socket:void 0},sessionId:n?.sessionId,hooks:d,saveChangesToDisk:t.saveChangesToDisk,outputMode:"inline"}),{signal:w,release:P}=await zU.startOrReplace(f.id,a),A=hZ(T);try{await A.text}catch(j){if(w.aborted)i.debug("AI stream was cancelled, returning partial output"),r.addPartFromText(JSON.stringify({aborted:String(j),partialOutput:m()},null,2));else throw j}finally{P()}let x=await St(f.fullFilePath,i,S),O=await jO(b,x),L=m().split(`
|
|
5083
|
-
`).map(j=>j.trim()).filter(j=>j.length>0);g&&await wv(n,{completed:u.total,total:u.total},"Evaluating edits and generating edit status...",i,p,r);let N=await CZ(L,l,i);r.addPartFromText(JSON.stringify({additions:O.additions,deletions:O.deletions,summarization:N},null,2))}}),xZ=hi.union([Gc,Rp]).describe("The momentic step type to preview. Must be a valid step object."),GU=cr({schema:{name:Qk,description:"Execute a step without adding it to the test.",inputSchema:{sessionId:hi.string(),step:xZ}},handle:async(t,e,r,n)=>{let{sessionId:o,step:i}=e,a=As(r,o);if(!a)return;a.controller.setOpen();let s=await lf({step:i,logger:t.logger,storage:a.storage,controller:a.controller,codeEvalTools:a.codeEvalTools,orgId:a.orgId,testContext:a.context,outputMode:t.outputMode});r.addContentParts(s)}}),VU=cr({schema:{name:qk,description:"Splice steps in the test bound to an active session. Supports inserting, deleting, or replacing steps by index.",inputSchema:{sessionId:hi.string(),startIndex:hi.number(),deleteCount:hi.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:FR.array(),targetSection:Ma.default("main"),returnTest:hi.boolean().default(!1).describe("Whether or not you want to see the full test after the splice is complete")}},handle:async(t,e,r,n)=>{let o=As(r,e.sessionId);if(!o)return;let i;try{({entity:i}=await en(t.project,{id:o.testId},"test"))}catch(c){r.addError(String(c));return}let s=(await cf({project:t.project,logger:t.logger,testPath:i.relativePath,saveChangesToDisk:t.saveChangesToDisk,params:{startIndex:e.startIndex,deleteCount:e.deleteCount,steps:e.steps,targetSection:e.targetSection,returnTest:e.returnTest}})).value.map(c=>c.type==="media"?{type:"media",data:c.data,mediaType:"image/jpeg"}:c);r.addContentParts(s)}}),$U=cr({schema:{name:Kk,description:"Run one or more steps from the test bound to an active session. Use stepId and parentStepIdChain when running to/from specific steps.",inputSchema:{sessionId:hi.string(),fromStep:Nh,toStep:Dh.optional(),targetSection:Ma.default("main"),resetSession:hi.boolean().default(!1).describe("Whether to restart the browser session before running the steps.")}},handle:async(t,e,r,n)=>{let o=As(r,e.sessionId);if(!o)return;o.controller.setOpen();let i;try{({entity:i}=await en(t.project,{id:o.testId},"test"))}catch(c){r.addError(String(c));return}e.resetSession&&await Qh({project:t.project,logger:t.logger,testPath:i.relativePath,orgId:o.orgId,storage:o.storage,apiKey:$r(),baseUrl:er(),controller:o.controller,testContext:o.context,outputMode:t.outputMode});let s=(await uf({project:t.project,logger:t.logger,testPath:i.relativePath,storage:o.storage,controller:o.controller,codeEvalTools:o.codeEvalTools,orgId:o.orgId,testContext:o.context,params:{fromStep:e.fromStep,toStep:e.toStep,targetSection:e.targetSection},outputMode:t.outputMode})).value.map(c=>c.type==="media"?{type:"media",data:c.data,mediaType:"image/jpeg"}:c);r.addContentParts(s)}}),WU=[TZ,EZ,vZ,wZ];var qU=[eU,tU,rU,nU,GU,$U,VU];var KU=[...WU,...Jh,...qU];function df(t,e){let r=new _Z({name:e.applicationName,version:e.cliVersion},{capabilities:{logging:{},tools:{}}});for(let n of KU)n.addToolToMcpServer(t,r);return r}async function YU(t,e,r,n){let o=new IZ(r,e,n);return await t.connect(o),{close:async()=>{try{await t.close()}catch{}},transport:o}}async function xv({project:t,logger:e,apiKey:r,serverUrl:n,cliVersion:o,applicationName:i="momentic-mcp-stdio-server",outputMode:a="file",headfulBrowserDefault:s}){ah(n),await sh(r);let c={applicationName:i,cliVersion:o??"0.0.0"},l=e.child({orgId:zt(),userId:Lo(),...c}),d=df({project:t,logger:l,saveChangesToDisk:!0,outputMode:a,headfulBrowserDefault:s},c),p=new PZ;return await d.connect(p),{server:d,transport:p}}var _v="mcp-session-id",DZ="sessionId",mc=NZ(),Wd=new Map;function XU(t,e){let r={applicationName:"momentic-mcp-desktop-server",cliVersion:Rd??"0.0.0"},n=fe(),o=ct.child({orgId:zt(),userId:Lo(),...r});return{context:{project:n,logger:o,saveChangesToDisk:!0,outputMode:e??Nk(),headfulBrowserDefault:t},info:r}}mc.get("/sse",async(t,e)=>{let{context:r,info:n}=XU(),o=df(r,n),{transport:i}=await YU(o,e,"/api/mcp/sse",{enableDnsRebindingProtection:!1}),a=i.sessionId,s={transport:i,close:async()=>{Wd.delete(a);try{await o.close()}catch(c){r.logger.warn({err:c},"Failed to close MCP server on SSE session cleanup")}}};Wd.set(a,s),i.onclose=()=>{let c=Wd.get(a);c&&c.close()}});mc.post("/sse",async(t,e)=>{let r=String(t.query[DZ]??"");if(!r||!Wd.has(r)){e.status(400).send("Invalid or missing sessionId");return}await Wd.get(r).transport.handlePostMessage(t,e,t.body)});var JU=mc,fi={};mc.post("/",async(t,e)=>{let r=String(t.headers[_v]??"");try{if(r&&fi[r]){await fi[r].handleRequest(t,e,t.body);return}if(!r&&OZ(t.body)){let{context:n,info:o}=XU(),i=df(n,o),a=new MZ({sessionIdGenerator:()=>LZ(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{fi[s]=a}});a.onclose=()=>{let s=a.sessionId;s&&fi[s]&&delete fi[s],i.close().catch(()=>{})},await i.connect(a),await a.handleRequest(t,e,t.body);return}e.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided"},id:null})}catch{e.headersSent||e.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}});mc.get("/",async(t,e)=>{let r=String(t.headers[_v]??"");if(!r||!fi[r]){e.status(400).send("Invalid or missing session ID");return}await fi[r].handleRequest(t,e)});mc.delete("/",async(t,e)=>{let r=String(t.headers[_v]??"");if(!r||!fi[r]){e.status(400).send("Invalid or missing session ID");return}let n=fi[r];try{await n.handleRequest(t,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});import{Router as kZ}from"express";var ZU=kZ();ZU.get("/:id",Fe(async(t,e)=>{let{id:r}=t.params;if(!r){e.status(400).json({error:"Missing ID"});return}let n=tc();if(!n){e.status(500).json({error:"API client not initialized"});return}try{let{data:o,contentType:i}=await n.fetchOnDemandScreenshot(r);e.setHeader("Content-Type",i),e.status(200).send(o)}catch(o){ct.error({err:o,screenshotId:r},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"})}}));var QU=ZU;import{Router as UZ}from"express";var pf=UZ();pf.get("/",Fe(async(t,e)=>{let r=(await EE()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(r)}));pf.get("/current",Fe((t,e)=>{let r=fe();if(!r){e.status(404).json({error:"No project found."});return}let n={name:r.config.name,configFilePath:r.configFilePath};e.status(200).json(n)}));pf.post("/set",Fe(async(t,e)=>{let r;try{r=$w.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}ct.info("Setting local project");try{let n=await Nt({configFilePath:r.configFilePath});lh(n,o=>Nt({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var eF=pf;import{Router as FZ}from"express";var tF=FZ();tF.get("/",Fe((t,e)=>{let r=fe(),n={ai:r.config.ai,browser:r.config.browser,displayRoot:r.config.displayRoot};e.status(200).json(n)}));var rF=tF;import{streamText as BZ}from"ai";import{Router as zZ}from"express";import mf from"fs";import gc from"path";import{v4 as HZ}from"uuid";import jZ from"yaml";var qd=new hm({platform:"local_app"},{flushAt:1,flushInterval:0});var Si=zZ();Si.post("/",Fe(async(t,e)=>{let r;try{r=Bw.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=fe(),o=await Ld({project:n,input:r});qd.track({type:"test_editor:test_create"}),e.status(201).json(o)}catch(n){if(n instanceof At){e.status(400).json({error:n.message});return}throw n}}));Si.get("/:testPath",Fe(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n=fe(),o=await ce(n),i;try{i=await St(gc.join(n.rootDir,r),ct,o),e.status(200).json(i)}catch(a){e.status(400).send({error:a.message});return}(async()=>{try{let{stepsToSave:a,moduleUpdates:s}=await Pt({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});s.forEach(c=>{Un({content:c,schemaVersion:Qe,momenticFiles:o,project:n})}),cn({relativeTestPath:r,steps:a,schemaVersion:Qe,project:n})}catch(a){ct.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));Si.get("/:testPath/metadata",Fe(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n=fe(),o=gc.join(n.rootDir,r);if(!mf.existsSync(o)){e.status(404).json({error:"Test file not found."});return}let i=mf.statSync(o),a=await ci(ct),s={gitBranch:a.gitBranchName??"unknown",fileMtime:i.mtime,gitCommitSha:a.gitCommitSha??"unknown"};e.status(200).json(s)}));Si.patch("/:testPath/metadata",Fe(async(t,e)=>{if(!t.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Fw.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:hE(t.params.testPath,r,fe()).newRelativeTestPath};e.status(200).json(o)}));Si.patch("/:testPath",Fe(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=Uw.parse(t.body)}catch(m){ct.warn({err:m},"Invalid save request"),e.status(400).json({error:`Invalid request body: ${m}`});return}ct.info({testPath:r},"Save received");let o=fe(),i=await ce(o),a;try{a=pd(r,o)}catch(m){e.status(400).json({error:`Existing test file on disk is invalid: ${m}`});return}let{stepsToSave:s,moduleUpdates:c,cachesToSave:l}=await Pt({stepLists:n.stepLists,cacheCreationParams:{testId:a.id,orgId:zt()}}),u=new pt({apiKey:$r(),baseUrl:er(),logger:ct}),d=await Ir(ct,u,o);await Oo({logger:ct,orgId:zt(),client:u,gitMetadata:d,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1,bustOldestCachePercentage:void 0}).saveStepCacheEntries({logger:ct,testId:a.id,entries:l}),c.forEach(m=>{Un({content:m,schemaVersion:n.schemaVersion,momenticFiles:i,project:o})}),cn({relativeTestPath:r,steps:s,schemaVersion:n.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));Si.patch("/:testPath/environments",Fe(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=Vw.parse(t.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}hE(r,{envs:n.defaultEnv?[{name:n.defaultEnv,default:!0}]:[]},fe()),e.status(201).json({message:"ok"})}));Si.post("/:testPath/duplicate",Fe(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=zw.parse(t.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{_i(n.name)}catch(f){e.status(400).json({error:f.message});return}let o=fe(),i=gc.join(o.rootDir,r);if(!mf.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await ce(o),s;try{s=await St(i,ct,a)}catch(f){e.status(400).send({error:f.message});return}let c=HZ(),l=In.parse({...s,name:n.name,id:c}),{stepsToSave:u}=await Pt({stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:c,orgId:zt()}}),d=eo({fileType:De.TEST,...l,beforeSteps:u.beforeSteps??void 0,steps:u.steps,afterSteps:u.afterSteps??void 0}),p=gc.dirname(i),m=gc.join(p,`${n.name}.test.yaml`),g=jZ.stringify(d);mf.writeFileSync(m,g,"utf-8");let h={relativeFilePath:gc.relative(o.rootDir,m)};qd.track({type:"test_editor:test_create"}),e.status(201).json(h)}));Si.post("/:testPath/chat",Fe(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let{messages:n}=t.body;if(!n){e.status(400).json({error:"Missing messages in request body."});return}let{sessionId:o}=t.body;if(!o){e.status(401).json({error:"Missing sessionId in request body."});return}let i=Zh.getSession(o);if(!i){e.status(400).json({error:"No active browser session. Start a session first."});return}let a=fe(),s=pd(r,a),c=ct.child({orgId:zt(),userId:Lo(),applicationName:"momentic-desktop-server-copilot",testId:s.id,sessionId:o});c.debug({sessionId:o},"Initializing copilot with sessionId");let l=$d({testPath:r,messages:n,logger:c,session:i,sessionId:o,saveChangesToDisk:!1});BZ(l).pipeUIMessageStreamToResponse(e,{onError:d=>{let p=d instanceof Error?d.message:String(d);return c.error({err:d,sessionId:o},"streamText session failed"),p}})}));var nF=Si;async function sF(t){let{momenticServerUrl:e,apiKey:r,serverPort:n,staticDir:o,devicePixelRatio:i,regenerateCache:a,alwaysSaveCache:s,noCache:c,initialProject:l}=t;e&&ah(e),dN({alwaysSaveCache:s,noCache:c}),await sh(r);let u=zt(),d=Lo();qd.identify({user_id:d,org_id:u});let p=t.logger??ct;p=p.child({orgId:u,userId:d}),p.debug({params:t},"Desktop server init and api key check done");let m=YZ(o,n,p),g=`http://localhost:${n}`;lh(l,T=>Nt({configFilePath:T})),await new Promise(T=>{try{m.listen(n,()=>{p.info(`Desktop server is running at ${g}`),T()})}catch(w){w.message.includes("EADDRINUSE")?lF(n):v.error(`An unexpected error occurred while starting the server: ${w.message}`),process.exit(1)}}),v.info(`Desktop server is running at ${g}`);let f={type:"API_KEY",baseUrl:er(),apiKey:r,logger:p,mode:"interactive"},S=async()=>{let T=fe();return new Po(T.config.ai?.agentConfig,f)},b=async()=>new ta(f,await S()),y=new pt(f);xk({baseServer:m,getOrgId:async()=>zt(),generatorFactory:S,enricherFactory:b,cacheStorageFactory:async T=>{let w=fe(),P=await Ir(p,y,w);return Oo({logger:p,orgId:T,client:y,gitMetadata:P,regenerateCache:a,alwaysSaveCache:s,noCache:c,bustOldestCachePercentage:void 0})},branchGetter:async()=>{try{return(await ci(p))?.gitBranchName}catch(T){p.error({err:T},"Failed to get environment git metadata");return}},settingsFactory:async()=>{let T=fe();return{ai:{},browser:{},...T.config}},storageFactory:async T=>new pa(y,T),logger:p,devicePixelRatio:i,authorization:f,globalE2eStateManager:Zh,visualDiffStorageFactory:async T=>new Ts(y)})}var aF="25mb";function YZ(t,e,r){let n=iF();n.use(GZ()),n.use(oF.json({limit:aF})),n.use(oF.urlencoded({extended:!1,limit:aF}));let o=WZ();if(o.use("/tests",nF),o.use("/modules",_k),o.use("/environments",Mk),o.use("/projects",eF),o.use("/folders",QE),o.use("/settings",rF),o.use("/identify",Lk),o.use("/entities",Pk),o.use("/on-demand-screenshots",QU),o.use("/mcp",JU),o.use("/git",eT),o.use("/cache-config",ZE),n.use("/api",o),n.use((a,s,c)=>{a.path!=="/healthcheck"&&!a.path.startsWith("/assets")&&r.debug({url:a.url,path:a.path,query:a.query,method:a.method,body:a.body,headers:a.rawHeaders,client:a.ip},"Received desktop-server request"),s.on("close",()=>{s.statusCode>=400&&r.error({url:a.url,method:a.method,statusCode:s.statusCode},"Request completed in error")}),c()}),n.use((a,s,c,l)=>{if(a instanceof Error&&a.message.includes("BadRequestError: request aborted")){c.status(400).send("Client disconnected");return}r.error({stack:a.stack,msg:a.message,err:a,url:s.url,method:s.method},"Unhandled exception leading to 500 on desktop-server"),v.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${a.message}
|
|
5083
|
+
`).map(j=>j.trim()).filter(j=>j.length>0);g&&await wv(n,{completed:u.total,total:u.total},"Evaluating edits and generating edit status...",i,p,r);let N=await CZ(L,l,i);r.addPartFromText(JSON.stringify({additions:O.additions,deletions:O.deletions,summarization:N},null,2))}}),xZ=hi.union([Gc,Rp]).describe("The momentic step type to preview. Must be a valid step object."),GU=cr({schema:{name:Qk,description:"Execute a step without adding it to the test.",inputSchema:{sessionId:hi.string(),step:xZ}},handle:async(t,e,r,n)=>{let{sessionId:o,step:i}=e,a=As(r,o);if(!a)return;a.controller.setOpen();let s=await lf({step:i,logger:t.logger,storage:a.storage,controller:a.controller,codeEvalTools:a.codeEvalTools,orgId:a.orgId,testContext:a.context,outputMode:t.outputMode});r.addContentParts(s)}}),VU=cr({schema:{name:qk,description:"Splice steps in the test bound to an active session. Supports inserting, deleting, or replacing steps by index.",inputSchema:{sessionId:hi.string(),startIndex:hi.number(),deleteCount:hi.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:FR.array(),targetSection:Ma.default("main"),returnTest:hi.boolean().default(!1).describe("Whether or not you want to see the full test after the splice is complete")}},handle:async(t,e,r,n)=>{let o=As(r,e.sessionId);if(!o)return;let i;try{({entity:i}=await en(t.project,{id:o.testId},"test"))}catch(c){r.addError(String(c));return}let s=(await cf({project:t.project,logger:t.logger,testPath:i.relativePath,saveChangesToDisk:t.saveChangesToDisk,params:{startIndex:e.startIndex,deleteCount:e.deleteCount,steps:e.steps,targetSection:e.targetSection,returnTest:e.returnTest}})).value.map(c=>c.type==="media"?{type:"media",data:c.data,mediaType:"image/jpeg"}:c);r.addContentParts(s)}}),$U=cr({schema:{name:Kk,description:"Run one or more steps from the test bound to an active session. Use stepId and parentStepIdChain when running to/from specific steps.",inputSchema:{sessionId:hi.string(),fromStep:Nh,toStep:Dh.optional(),targetSection:Ma.default("main"),resetSession:hi.boolean().default(!1).describe("Whether to restart the browser session before running the steps.")}},handle:async(t,e,r,n)=>{let o=As(r,e.sessionId);if(!o)return;o.controller.setOpen();let i;try{({entity:i}=await en(t.project,{id:o.testId},"test"))}catch(c){r.addError(String(c));return}e.resetSession&&await Qh({project:t.project,logger:t.logger,testPath:i.relativePath,orgId:o.orgId,storage:o.storage,apiKey:$r(),baseUrl:er(),controller:o.controller,testContext:o.context,outputMode:t.outputMode});let s=(await uf({project:t.project,logger:t.logger,testPath:i.relativePath,storage:o.storage,controller:o.controller,codeEvalTools:o.codeEvalTools,orgId:o.orgId,testContext:o.context,params:{fromStep:e.fromStep,toStep:e.toStep,targetSection:e.targetSection},outputMode:t.outputMode})).value.map(c=>c.type==="media"?{type:"media",data:c.data,mediaType:"image/jpeg"}:c);r.addContentParts(s)}}),WU=[TZ,EZ,vZ,wZ];var qU=[eU,tU,rU,nU,GU,$U,VU];var KU=[...WU,...Jh,...qU];function df(t,e){let r=new _Z({name:e.applicationName,version:e.cliVersion},{capabilities:{logging:{},tools:{}}});for(let n of KU)n.addToolToMcpServer(t,r);return r}async function YU(t,e,r,n){let o=new IZ(r,e,n);return await t.connect(o),{close:async()=>{try{await t.close()}catch{}},transport:o}}async function xv({project:t,logger:e,apiKey:r,serverUrl:n,cliVersion:o,applicationName:i="momentic-mcp-stdio-server",outputMode:a="file",headfulBrowserDefault:s}){ah(n),await sh(r);let c={applicationName:i,cliVersion:o??"0.0.0"},l=e.child({orgId:zt(),userId:Lo(),...c}),d=df({project:t,logger:l,saveChangesToDisk:!0,outputMode:a,headfulBrowserDefault:s},c),p=new PZ;return await d.connect(p),{server:d,transport:p}}var _v="mcp-session-id",DZ="sessionId",mc=NZ(),Wd=new Map;function XU(t,e){let r={applicationName:"momentic-mcp-desktop-server",cliVersion:Rd??"0.0.0"},n=Ee(),o=ct.child({orgId:zt(),userId:Lo(),...r});return{context:{project:n,logger:o,saveChangesToDisk:!0,outputMode:e??Nk(),headfulBrowserDefault:t},info:r}}mc.get("/sse",async(t,e)=>{let{context:r,info:n}=XU(),o=df(r,n),{transport:i}=await YU(o,e,"/api/mcp/sse",{enableDnsRebindingProtection:!1}),a=i.sessionId,s={transport:i,close:async()=>{Wd.delete(a);try{await o.close()}catch(c){r.logger.warn({err:c},"Failed to close MCP server on SSE session cleanup")}}};Wd.set(a,s),i.onclose=()=>{let c=Wd.get(a);c&&c.close()}});mc.post("/sse",async(t,e)=>{let r=String(t.query[DZ]??"");if(!r||!Wd.has(r)){e.status(400).send("Invalid or missing sessionId");return}await Wd.get(r).transport.handlePostMessage(t,e,t.body)});var JU=mc,fi={};mc.post("/",async(t,e)=>{let r=String(t.headers[_v]??"");try{if(r&&fi[r]){await fi[r].handleRequest(t,e,t.body);return}if(!r&&OZ(t.body)){let{context:n,info:o}=XU(),i=df(n,o),a=new MZ({sessionIdGenerator:()=>LZ(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{fi[s]=a}});a.onclose=()=>{let s=a.sessionId;s&&fi[s]&&delete fi[s],i.close().catch(()=>{})},await i.connect(a),await a.handleRequest(t,e,t.body);return}e.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided"},id:null})}catch{e.headersSent||e.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}});mc.get("/",async(t,e)=>{let r=String(t.headers[_v]??"");if(!r||!fi[r]){e.status(400).send("Invalid or missing session ID");return}await fi[r].handleRequest(t,e)});mc.delete("/",async(t,e)=>{let r=String(t.headers[_v]??"");if(!r||!fi[r]){e.status(400).send("Invalid or missing session ID");return}let n=fi[r];try{await n.handleRequest(t,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});import{Router as kZ}from"express";var ZU=kZ();ZU.get("/:id",Fe(async(t,e)=>{let{id:r}=t.params;if(!r){e.status(400).json({error:"Missing ID"});return}let n=tc();if(!n){e.status(500).json({error:"API client not initialized"});return}try{let{data:o,contentType:i}=await n.fetchOnDemandScreenshot(r);e.setHeader("Content-Type",i),e.status(200).send(o)}catch(o){ct.error({err:o,screenshotId:r},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"})}}));var QU=ZU;import{Router as UZ}from"express";var pf=UZ();pf.get("/",Fe(async(t,e)=>{let r=(await EE()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(r)}));pf.get("/current",Fe((t,e)=>{let r=Ee();if(!r){e.status(404).json({error:"No project found."});return}let n={name:r.config.name,configFilePath:r.configFilePath};e.status(200).json(n)}));pf.post("/set",Fe(async(t,e)=>{let r;try{r=$w.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}ct.info("Setting local project");try{let n=await Nt({configFilePath:r.configFilePath});lh(n,o=>Nt({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var eF=pf;import{Router as FZ}from"express";var tF=FZ();tF.get("/",Fe((t,e)=>{let r=Ee(),n={ai:r.config.ai,browser:r.config.browser,displayRoot:r.config.displayRoot};e.status(200).json(n)}));var rF=tF;import{streamText as BZ}from"ai";import{Router as zZ}from"express";import mf from"fs";import gc from"path";import{v4 as HZ}from"uuid";import jZ from"yaml";var qd=new hm({platform:"local_app"},{flushAt:1,flushInterval:0});var Si=zZ();Si.post("/",Fe(async(t,e)=>{let r;try{r=Bw.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=Ee(),o=await Ld({project:n,input:r});qd.track({type:"test_editor:test_create"}),e.status(201).json(o)}catch(n){if(n instanceof At){e.status(400).json({error:n.message});return}throw n}}));Si.get("/:testPath",Fe(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n=Ee(),o=await ce(n),i;try{i=await St(gc.join(n.rootDir,r),ct,o),e.status(200).json(i)}catch(a){e.status(400).send({error:a.message});return}(async()=>{try{let{stepsToSave:a,moduleUpdates:s}=await Pt({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});s.forEach(c=>{Un({content:c,schemaVersion:Qe,momenticFiles:o,project:n})}),cn({relativeTestPath:r,steps:a,schemaVersion:Qe,project:n})}catch(a){ct.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));Si.get("/:testPath/metadata",Fe(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n=Ee(),o=gc.join(n.rootDir,r);if(!mf.existsSync(o)){e.status(404).json({error:"Test file not found."});return}let i=mf.statSync(o),a=await ci(ct),s={gitBranch:a.gitBranchName??"unknown",fileMtime:i.mtime,gitCommitSha:a.gitCommitSha??"unknown"};e.status(200).json(s)}));Si.patch("/:testPath/metadata",Fe(async(t,e)=>{if(!t.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Fw.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:hE(t.params.testPath,r,Ee()).newRelativeTestPath};e.status(200).json(o)}));Si.patch("/:testPath",Fe(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=Uw.parse(t.body)}catch(m){ct.warn({err:m},"Invalid save request"),e.status(400).json({error:`Invalid request body: ${m}`});return}ct.info({testPath:r},"Save received");let o=Ee(),i=await ce(o),a;try{a=pd(r,o)}catch(m){e.status(400).json({error:`Existing test file on disk is invalid: ${m}`});return}let{stepsToSave:s,moduleUpdates:c,cachesToSave:l}=await Pt({stepLists:n.stepLists,cacheCreationParams:{testId:a.id,orgId:zt()}}),u=new pt({apiKey:$r(),baseUrl:er(),logger:ct}),d=await Ir(ct,u,o);await Oo({logger:ct,orgId:zt(),client:u,gitMetadata:d,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1,bustOldestCachePercentage:void 0}).saveStepCacheEntries({logger:ct,testId:a.id,entries:l}),c.forEach(m=>{Un({content:m,schemaVersion:n.schemaVersion,momenticFiles:i,project:o})}),cn({relativeTestPath:r,steps:s,schemaVersion:n.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));Si.patch("/:testPath/environments",Fe(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=Vw.parse(t.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}hE(r,{envs:n.defaultEnv?[{name:n.defaultEnv,default:!0}]:[]},Ee()),e.status(201).json({message:"ok"})}));Si.post("/:testPath/duplicate",Fe(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=zw.parse(t.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{_i(n.name)}catch(f){e.status(400).json({error:f.message});return}let o=Ee(),i=gc.join(o.rootDir,r);if(!mf.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await ce(o),s;try{s=await St(i,ct,a)}catch(f){e.status(400).send({error:f.message});return}let c=HZ(),l=In.parse({...s,name:n.name,id:c}),{stepsToSave:u}=await Pt({stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:c,orgId:zt()}}),d=eo({fileType:De.TEST,...l,beforeSteps:u.beforeSteps??void 0,steps:u.steps,afterSteps:u.afterSteps??void 0}),p=gc.dirname(i),m=gc.join(p,`${n.name}.test.yaml`),g=jZ.stringify(d);mf.writeFileSync(m,g,"utf-8");let h={relativeFilePath:gc.relative(o.rootDir,m)};qd.track({type:"test_editor:test_create"}),e.status(201).json(h)}));Si.post("/:testPath/chat",Fe(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let{messages:n}=t.body;if(!n){e.status(400).json({error:"Missing messages in request body."});return}let{sessionId:o}=t.body;if(!o){e.status(401).json({error:"Missing sessionId in request body."});return}let i=Zh.getSession(o);if(!i){e.status(400).json({error:"No active browser session. Start a session first."});return}let a=Ee(),s=pd(r,a),c=ct.child({orgId:zt(),userId:Lo(),applicationName:"momentic-desktop-server-copilot",testId:s.id,sessionId:o});c.debug({sessionId:o},"Initializing copilot with sessionId");let l=$d({testPath:r,messages:n,logger:c,session:i,sessionId:o,saveChangesToDisk:!1});BZ(l).pipeUIMessageStreamToResponse(e,{onError:d=>{let p=d instanceof Error?d.message:String(d);return c.error({err:d,sessionId:o},"streamText session failed"),p}})}));var nF=Si;async function sF(t){let{momenticServerUrl:e,apiKey:r,serverPort:n,staticDir:o,devicePixelRatio:i,regenerateCache:a,alwaysSaveCache:s,noCache:c,initialProject:l}=t;e&&ah(e),dN({alwaysSaveCache:s,noCache:c}),await sh(r);let u=zt(),d=Lo();qd.identify({user_id:d,org_id:u});let p=t.logger??ct;p=p.child({orgId:u,userId:d}),p.debug({params:t},"Desktop server init and api key check done");let m=YZ(o,n,p),g=`http://localhost:${n}`;lh(l,T=>Nt({configFilePath:T})),await new Promise(T=>{try{m.listen(n,()=>{p.info(`Desktop server is running at ${g}`),T()})}catch(w){w.message.includes("EADDRINUSE")?lF(n):v.error(`An unexpected error occurred while starting the server: ${w.message}`),process.exit(1)}}),v.info(`Desktop server is running at ${g}`);let f={type:"API_KEY",baseUrl:er(),apiKey:r,logger:p,mode:"interactive"},S=async()=>{let T=Ee();return new Po(T.config.ai?.agentConfig,f)},b=async()=>new ta(f,await S()),y=new pt(f);xk({baseServer:m,getOrgId:async()=>zt(),generatorFactory:S,enricherFactory:b,cacheStorageFactory:async T=>{let w=Ee(),P=await Ir(p,y,w);return Oo({logger:p,orgId:T,client:y,gitMetadata:P,regenerateCache:a,alwaysSaveCache:s,noCache:c,bustOldestCachePercentage:void 0})},branchGetter:async()=>{try{return(await ci(p))?.gitBranchName}catch(T){p.error({err:T},"Failed to get environment git metadata");return}},settingsFactory:async()=>{let T=Ee();return{ai:{},browser:{},...T.config}},storageFactory:async T=>{let w=Ee();return new pa(y,T,w)},logger:p,devicePixelRatio:i,authorization:f,globalE2eStateManager:Zh,visualDiffStorageFactory:async T=>new Ts(y)})}var aF="25mb";function YZ(t,e,r){let n=iF();n.use(GZ()),n.use(oF.json({limit:aF})),n.use(oF.urlencoded({extended:!1,limit:aF}));let o=WZ();if(o.use("/tests",nF),o.use("/modules",_k),o.use("/environments",Mk),o.use("/projects",eF),o.use("/folders",QE),o.use("/settings",rF),o.use("/identify",Lk),o.use("/entities",Pk),o.use("/on-demand-screenshots",QU),o.use("/mcp",JU),o.use("/git",eT),o.use("/cache-config",ZE),n.use("/api",o),n.use((a,s,c)=>{a.path!=="/healthcheck"&&!a.path.startsWith("/assets")&&r.debug({url:a.url,path:a.path,query:a.query,method:a.method,body:a.body,headers:a.rawHeaders,client:a.ip},"Received desktop-server request"),s.on("close",()=>{s.statusCode>=400&&r.error({url:a.url,method:a.method,statusCode:s.statusCode},"Request completed in error")}),c()}),n.use((a,s,c,l)=>{if(a instanceof Error&&a.message.includes("BadRequestError: request aborted")){c.status(400).send("Client disconnected");return}r.error({stack:a.stack,msg:a.message,err:a,url:s.url,method:s.method},"Unhandled exception leading to 500 on desktop-server"),v.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${a.message}
|
|
5084
5084
|
${a.stack}`),c.status(500).send(`Internal Server Error: ${a.message}`)}),t){let a=iF.static(t,{setHeaders:s=>{s.setHeader("Cache-Control","no-cache")},redirect:!1});n.use(a),n.use("*",(s,c)=>{c.sendFile(KZ.join(t,"index.html"))})}let i=qZ.createServer(n);return i.once("error",a=>{"code"in a&&a.code==="EADDRINUSE"?(lF(e),process.exit(1)):console.error("An unexpected server error occurred:",a.message)}),i}$Z.setMaxListeners(25);process.on("warning",t=>{ct.warn({err:t},`Node warning received on desktop-server: ${t.message}`)});process.on("uncaughtException",t=>{ct.error({err:t},"Uncaught exception on desktop-server"),v.error(`Oh no! The Momentic desktop app encountered a fatal error \u{1F61E}. Error logs: ${t.message}`)});process.on("unhandledRejection",(t,e)=>{ct.error({reason:`${t}`,stack:t?.stack},"Uncaught exception on desktop-server (promise rejection)"),v.error(`Oh no! The Momentic desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${t}`)});function lF(t){v.error(VZ`Port ${t} is already in use by another process. Please close the other process and try again.
|
|
5085
5085
|
Using Bash on MacOS or Linux:
|
|
5086
5086
|
lsof -t -i :58888 | xargs kill -9
|
|
@@ -5100,13 +5100,13 @@ ${t.map(p=>`${It}- ${p}`).join(`
|
|
|
5100
5100
|
`)}`),Object.values(e.tests).forEach(p=>{t.some(m=>p.relativePath.includes(m))&&c.add(p.fullFilePath)}))}else{!n&&!await hr("No test paths or substrings were provided. Do you want to run all tests?")&&(s.error("Cancelled by user."),process.exit(1));let u=Object.values(e.tests);s.info(`Reading all ${u.length} tests in the project from local disk.`),u.forEach(d=>{c.add(d.fullFilePath)})}for(let u of c){let d=Yv.relative(r.rootDir,u);o&&!o.some(p=>new RegExp(p).test(d))&&c.delete(u),i&&i.some(p=>new RegExp(p).test(d))&&c.delete(u)}let l=Array.from(c).map(async u=>{try{let d=await St(u,J,e);if(fQ.gt(d.schemaVersion,Qe)&&s.warn(`Test ${u} has schema version ${d.schemaVersion}, which is greater than what is currently supported by this SDK. Please update your momentic package version to avoid unexpected behavior.`),a&&a.length>0){let p=d.labels||[];if(!a.some(g=>p.includes(g)))return null}return{...d,fullFilePath:u,relativeFilePath:Yv.relative(r.rootDir,u)}}catch(d){s.error(`Failed to read and resolve test at '${u}': ${d}`),process.exit(1)}});return Promise.all(l).then(gQ)}function KF({testDefinitions:t,quarantinedTestsMetadata:e,onlyQuarantined:r=!1,skipQuarantined:n=!1}){let[o,i]=qF(t,c=>c.disabled),[a,s]=qF(i,c=>c.id in e);return{testsToSkip:o,quarantinedTestsToSkip:n?a:[],testsToRun:r?[]:s,quarantinedTestsToRun:n?[]:a}}function YF({testsToRun:t,quarantinedTestsToRun:e,quarantinedTestsMetadata:r,testInputMatrix:n}){let o=[],i=(a,s,c)=>{n?n.forEach((l,u)=>{o.push({inputs:l,inputIndex:u,testDefinition:a,quarantined:s,quarantinedMetadata:c})}):o.push({inputs:void 0,testDefinition:a,quarantined:s,quarantinedMetadata:c})};return t.forEach(a=>i(a,!1)),e.forEach(a=>i(a,!0,r[a.id])),o}async function XF({project:t,apiClient:e}){let r=await ce(t),n=await Sc({tests:[],momenticFiles:r,yes:!0,project:t,logger:new Wa(40,{})}),o=(await e.getQuarantinedTests()).quarantined,i=new Set(o.map(s=>s.testId)),a=n.filter(s=>i.has(s.id));v.info(a.map(s=>s.relativeFilePath).join(`
|
|
5101
5101
|
`))}async function JF({test:t,reason:e,apiClient:r,project:n,identity:o}){let i=(await ce(n)).tests,a=Object.values(i),s=(await r.getQuarantinedTests()).quarantined,c=new Set(s.map(p=>p.testId)),l=a.filter(p=>c.has(p.id)),u=await Tf({prompt:"Select a test to unquarantine.",inputtedTest:t,testOptions:l}),d=await vf({prompt:"Enter a reason for unquarantining the test.",inputtedReason:e});await r.unquarantineTest(u,d,o),v.success(`Test ${u.name} has been successfully removed from quarantine.`)}function ZF(t){return t?st(t):"Unknown suite"}async function QF({client:t,orgId:e,suitePaths:r,wait:n,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:s}=await t.queueSuiteRuns({paths:r,...i});J.info({orgId:e,suiteRunIds:a,runGroupIds:s,suitePaths:r},"Queued suites remotely"),v.dimmed(`Queued ${r.length} suites.`),n||process.exit(0);let c=Date.now();v.dimmed(`Waiting for ${r.length} suites to finish. You can view results upon completion at:`);for(let f of s)v.dimmed(`${It}- ${t.getAppUrl()}/run-groups/${f}`);let l=new Set,u=[],d=f=>(f.status==="FAILED"||f.status==="PASSED"||f.status==="CANCELLED")&&f.runs.every(b=>b.status==="FAILED"&&(b.failureReason||b.finishedAt&&Date.now()-b.finishedAt.getTime()>30*1e3)||b.status==="PASSED"||b.status==="CANCELLED"),p=await dg({name:"suites",getResults:async()=>{let f=s.filter(y=>!u.some(T=>T.id===y)),S=await t.bulkGetRunGroupStatus(f),b=[];for(let y of S)d(y)?u.push(y):b.push(y);return[...u,...b]},timeoutMs:o?o*1e3:void 0,checkDone:f=>(f.forEach(S=>{S.status==="RUNNING"&&(l.has(S.id)||(l.add(S.id),v.log(`${l.size}/${s.length} ${ZF(S.suite?.name)}`)))}),f.every(d))}),m=t.getAppUrl(),h=Ll({results:p,startTime:c,onFailed:f=>{let S=ZF(f.suite?.name),b=f.runs.filter(T=>T.status==="FAILED").length,y=f.runs.length;v.error(`${S} (${b}/${y} tests failed):`);for(let T of f.runs)if(T.status==="FAILED"){let w=T.testName||T.test?.name;v.error(` ${w?st(w):"Unknown test"} (${m}/runs/${T.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?st(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(h.failed>0?1:0)}async function eB({tests:t,client:e,orgId:r,...n}){!n.yes&&!await hr(`This command will queue ${t.length} tests to run remotely on Momentic's infrastructure. Results will be available on ${e.getAppUrl()}. Continue?`)&&process.exit(1);let{queuedTests:o,runIds:i}=await e.queueTests({testPaths:t,...n});if(J.info({queuedTests:o,runIds:i,orgId:r},"Queued tests remotely"),v.dimmed(`Queued ${o.length} tests. Processing time may depend on a variety of factors, including how many tests have already been queued from your organization.`),n.wait||process.exit(0),!i.length)return;v.dimmed(`Waiting for ${o.length} tests to complete.`);let a=new Set,s=[],c=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",l=e.getAppUrl(),u=Date.now(),d=await dg({name:"runs",getResults:async()=>{let m=i.filter(f=>!s.some(S=>S.id===f)),g=await e.bulkGetRunStatus(m),h=[];for(let f of g)c(f)?s.push(f):h.push(f);return[...s,...h]},timeoutMs:n.waitTimeout?n.waitTimeout*1e3:void 0,checkDone:m=>(m.forEach(g=>{if(g.status==="RUNNING"&&!a.has(g.id)){a.add(g.id);let h=g.testName||g.test?.name;h&&v.log(`${a.size}/${o.length} ${st(h)}`)}}),m.every(c))}),p=Ll({results:d,startTime:u,onFailed:m=>{let g=m.testName||m.test?.name;pg(m,g?st(g):"Unknown test")},getDisplayLine:m=>{let g=m.testName||m.test?.name,h=` ${g?st(g):"Unknown test"}`;return m.id&&(h+=` (${l}/runs/${m.id})`),h},entity:"test"});process.exit(p.failed>0?1:0)}import{randomUUID as r7}from"crypto";import n7 from"fs";import{existsSync as PQ,mkdirSync as MQ,statSync as OQ}from"fs";import{randomUUID as Ps}from"crypto";import yc,{writeFileSync as tB}from"fs";import{hostname as SQ}from"os";import zo from"path";import{z as Af}from"zod";async function Cf(t,e,r,n){if(n){let o=await e.getScreenshot(t,n);if(o){let i=`screenshot-${n}.jpeg`,a=zo.join(r,i);return yc.writeFileSync(a,o),i}}}async function yQ(t,e,r,n){let o=r.folder,i={uuid:n.runAttemptId??Ps(),historyId:n.runId??Ps(),testCaseId:n.test.id,fullName:n.test.name,name:st(n.test.name),status:n.status==="PASSED"?"passed":n.status==="CANCELLED"?"skipped":"failed",start:n.lastAttemptStartedAt.getTime(),stop:n.finishedAt.getTime(),parameters:[],labels:[{name:"suite",value:r.suiteName},{name:"host",value:SQ()},{name:"platform",value:"momentic"},{name:"attempts",value:n.attempts.toString()}],steps:[]};n.runId&&i.labels.push({name:"runUrl",value:`https://app.momentic.ai/runs/${n.runId}`}),n.quarantined&&i.labels.push({name:"quarantined",value:"true"}),n.quarantinedMetadata?.quarantinedReason&&i.labels.push({name:"quarantinedReason",value:n.quarantinedMetadata.quarantinedReason}),n.quarantinedMetadata?.quarantinedAt&&i.labels.push({name:"quarantinedAt",value:n.quarantinedMetadata.quarantinedAt.toISOString()});for(let[c,l]of Object.entries(n.parameters))l!=null&&i.parameters.push({name:c,value:JSON.stringify(l)});n.results&&await Xv(t,e,r.folder,i.steps,n.results);let a=bQ(e,o,i.uuid);a.length>0&&(i.attachments=a);let s=`${n.runAttemptId}-result.json`;yc.writeFileSync(zo.join(o,s),JSON.stringify(i,void 0,2))}async function Rf(t,e,r,n){let o={name:_O(n),start:n.startedAt.getTime(),stop:n.finishedAt.getTime(),status:n.status==="SUCCESS"?"passed":n.status==="CANCELLED"?"skipped":"failed",labels:[],steps:[],attachments:[]};n.beforeUrl&&o.labels.push({name:"URL before step",value:n.beforeUrl}),n.afterUrl&&o.labels.push({name:"URL after step",value:n.afterUrl});let i=await Cf(t,e,r,n.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await Cf(t,e,r,n.afterSnapshot);if(a&&o.attachments.push({name:"Screenshot after step",source:a,type:"image/jpeg"}),n.message&&(o.statusDetails={message:n.message}),n.data)if(Lc.safeParse(n.data).success){let s=Lc.parse(n.data),c=s.request,l={...s,request:void 0},u=`output-attachment-api-request-${Ps()}.json`,d=`output-attachment-api-response-${Ps()}.json`,p=zo.join(r,u),m=zo.join(r,d);yc.writeFileSync(p,JSON.stringify(c,null,2)),yc.writeFileSync(m,JSON.stringify(l,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=Af.union([Af.object({}).passthrough(),Af.array(Af.any())]).safeParse(n.data).success,c=`output-attachment-${Ps()}.json`,l=zo.join(r,c);yc.writeFileSync(l,JSON.stringify(n.data,null,2)),o.attachments.push({name:"Step output data",source:c,type:s?"application/json":"text/plain"})}return o}async function Xv(t,e,r,n,o){for(let i of o){let a;switch(i.type){case"PRESET_ACTION":{a=await Rf(t,e,r,i);break}case"CONDITIONAL":{a=await Rf(t,e,r,i),a.steps=[],i.assertionResult&&a.steps.push(await Rf(t,e,r,i.assertionResult)),await Xv(t,e,r,a.steps,i.results);break}case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"SECTION":case"MODULE":{if(a=await Rf(t,e,r,i),await Xv(t,e,r,a.steps,i.results),i.type==="MODULE"&&i.inputs){a.parameters=[];for(let[s,c]of Object.entries(i.inputs))a.parameters.push({name:s,value:c})}break}default:{let s=i}}if(!a){t.warn({result:i},"Failed to convert Momentic result to Allure step");continue}if(a.attachments||(a.attachments=[]),i.beforeTestContext){let s=`before-context-${Ps()}.json`,c=zo.join(r,s);tB(c,rB(i.beforeTestContext.env)),a.attachments.push({name:"Test context before step",source:s,type:"application/json"})}if(i.afterTestContext){let s=`after-context-${Ps()}.json`,c=zo.join(r,s);tB(c,rB(i.afterTestContext.env)),a.attachments.push({name:"Test context after step",source:s,type:"application/json"})}n.push(a)}}async function nB(t,e,r,n,o){for(let i of o){if(!i.runId||!i.runAttemptId)throw new Error(`Missing runId/runAttemptId for Allure report generation for test '${i.test.name}'`);let a=e.createDebugDataReaderForRunAttempt(i.runId,i.runAttemptId);try{await yQ(t,a,{folder:r,suiteName:n.suiteName},i)}finally{a.close()}}}function rB(t){try{return JSON.stringify(t,void 0,2)??JSON.stringify({value:null},void 0,2)}catch(e){let r=e instanceof Error?e.message:"unknown error";return JSON.stringify({error:r},void 0,2)}}function bQ(t,e,r){let n=t.listVideoAssetPaths();if(n.length===0)return[];let o=[];for(let i of n){let a=zo.basename(i),s=a,c=zo.join(e,s);try{yc.copyFileSync(i,c)}catch{continue}let l,u=zo.extname(i).toLowerCase();u===".webm"?l="video/webm":u===".mp4"?l="video/mp4":l="application/octet-stream",o.push({name:a,source:s,type:l})}return o}import EQ from"junit-report-builder";import wf from"path";function oB(t,e){t.property("quarantined","true"),t.property("dd_tags[quarantined]","true"),e.quarantinedReason&&(t.property("quarantined_reason",e.quarantinedReason),t.property("dd_tags[quarantined_reason]",e.quarantinedReason)),e.quarantinedAt&&(t.property("quarantined_at",e.quarantinedAt.toISOString()),t.property("dd_tags[quarantined_at]",e.quarantinedAt.toISOString()))}function TQ(t,e){if(e.name(t.testName).className(t.testName).file(wf.relative(".",t.filePath)).property("id",t.testId).property("dd_tags[id]",t.testId),t.labels&&(e.property("labels",t.labels.join(",")),t.labels.forEach(r=>{e.property("dd_tags[label]",r)})),t.baseUrl&&(e.property("base_url",t.baseUrl),e.property("dd_tags[base_url]",t.baseUrl)),t.runId&&(e.property("run_url",`https://app.momentic.ai/runs/${t.runId}`),e.property("dd_tags[run_url]",`https://app.momentic.ai/runs/${t.runId}`)),t.quarantinedMetadata&&oB(e,t.quarantinedMetadata),t.setupFailed&&(e.property("setup_failed","true"),e.property("dd_tags[setup_failed]","true")),t.mainFailed&&(e.property("main_failed","true"),e.property("dd_tags[main_failed]","true")),t.teardownFailed&&(e.property("teardown_failed","true"),e.property("dd_tags[teardown_failed]","true")),t.status==="FAILED"){if(t.failureReason){let r=Ep[t.failureDetails?.classification?.reason||t.failureReason],n=t.failureDetails?.classification?.summary||Ws[t.failureReason];t.runId&&(n+=` Visit https://app.momentic.ai/runs/${t.runId} for more details.`),e.failure(n,r)}t.failureDetails?.errorStack&&e.stacktrace(t.failureDetails.errorStack)}else t.status==="CANCELLED"&&e.skipped();return e.time((t.finishedAt.getTime()-t.lastAttemptStartedAt.getTime())/1e3).property("started_at",t.lastAttemptStartedAt.toISOString()).property("dd_tags[started_at]",t.lastAttemptStartedAt.toISOString()).property("finished_at",t.finishedAt.toISOString()).property("dd_tags[finished_at]",t.finishedAt.toISOString()),e.property("attempts",t.attempts.toString()).property("dd_tags[attempts]",t.attempts.toString()),t.parameters?.envName&&(e.property("environment",t.parameters.envName),e.property("dd_tags[environment]",t.parameters.envName)),t.parameters?.urlOverride&&e.property("url_override",t.parameters.urlOverride),e}function vQ(t,e,r){let{suiteId:n,suiteName:o,startedAt:i,finishedAt:a,testsToSkip:s,quarantinedTestsToSkip:c,quarantinedTestsMetadata:l}=e,u=t.testSuite().name(o);n&&u.property("id",n),u.timestamp(i).property("startedAt",i.toISOString()).property("finishedAt",a.toISOString()).time((a.getTime()-i.getTime())/1e3);for(let d of r){let p=u.testCase();TQ(d,p)}for(let d of s){let p=u.testCase();p.name(d.name).className(d.name).file(wf.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 c){let p=u.testCase();p.name(d.name).className(d.name).file(wf.relative(".",d.relativeFilePath)).property("id",d.id);let m=l[d.id];m&&oB(p,m),d.baseUrl&&p.property("baseUrl",d.baseUrl),d.labels&&(p.property("labels",d.labels.join(",")),d.labels.forEach(g=>{p.property("dd_tags[label]",g)})),p.skipped()}return u}function iB(t,e,r){let n=EQ.newBuilder();vQ(n,e,r),n.writeTo(wf.join(t,`${e.suiteName}.xml`))}import AQ from"fs";import RQ from"path";function aB(t){return{title:ii(t),duration:t.finishedAt.getTime()-t.startedAt.getTime(),error:t.status==="FAILED"?{value:t.failureReason}:void 0,steps:t.results&&t.type!=="PRESET_ACTION"?t.results.map(aB):[]}}async function CQ(t,e,r,n){if(n.results?.length){let o=await Cf(t,e,r,n.results[n.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function wQ(t,e,r,n){return{status:n.status==="PASSED"?"passed":n.status==="CANCELLED"?"interrupted":"failed",duration:n.finishedAt.getTime()-n.lastAttemptStartedAt.getTime(),error:n.status==="FAILED"&&n.failureReason?{value:n.failureDetails?.classification?.reason||n.failureReason,message:n.failureDetails?.classification?.summary||Ws[n.failureReason]}:void 0,retry:n.attempts-1,steps:n.results?.map(aB)||[],startTime:n.lastAttemptStartedAt.toISOString(),attachments:await CQ(t,e,r,n)}}async function xQ(t,e,r,n){return{expectedStatus:"passed",status:n.status==="PASSED"?"expected":"unexpected",results:[await wQ(t,e,r,n)]}}async function _Q(t,e,r,n){return{tags:[],title:n.test.name,ok:n.status==="PASSED",tests:[await xQ(t,e,r,n)],id:n.runId,file:n.filePath}}function Jv(t,e){return t.reduce((r,n)=>e(n)?r+1:r,0)}async function IQ(t,e,r,n,o){return{suites:[{title:n.suiteName,file:n.projectConfigPath,specs:await Promise.all(o.map(async i=>{let a=i.runId&&i.runAttemptId?e.createDebugDataReaderForRunAttempt(i.runId,i.runAttemptId):new bu;try{return await _Q(t,a,r,i)}finally{a.close()}}))}],errors:[],stats:{startTime:n.startedAt.toISOString(),duration:n.finishedAt.getTime()-n.startedAt.getTime(),expected:Jv(o,i=>i.status==="PASSED"),unexpected:Jv(o,i=>i.status!=="PASSED"),flaky:Jv(o,i=>!!i.isFlake),skipped:0}}}async function sB(t,e,r,n,o){let i=await IQ(t,e,r,n,o);AQ.writeFileSync(RQ.join(r,`${n.suiteName}.json`),JSON.stringify(i,null,2))}function LQ(t){return{testName:t.test.name,testId:t.test.id,filePath:t.filePath,labels:t.test.labels,baseUrl:t.baseUrl,runId:t.runId,quarantined:t.quarantined,quarantinedMetadata:t.quarantinedMetadata,status:t.status,setupFailed:void 0,mainFailed:void 0,teardownFailed:void 0,failureDetails:t.failureDetails,failureReason:t.failureReason,finishedAt:t.finishedAt,lastAttemptStartedAt:t.lastAttemptStartedAt,attempts:t.attempts,parameters:t.parameters}}async function lB({logger:t,callbacks:e,format:r,params:n,runs:o,folder:i}){switch(PQ(i)?OQ(i).isDirectory()||(v.error(`The specified reporter output directory '${i}' exists on disk but is not a folder. Please move or delete the existing object or specify a different reporter path.`),process.exit(1)):(v.info(`Reporter output directory '${i}' does not exist on disk, creating it now...`),MQ(i,{recursive:!0})),r){case"junit":{let a=o.map(LQ);iB(i,n,a);return}case"allure":case"allure-json":await nB(t,e,i,n,o);return;case"playwright-json":await sB(t,e,i,n,o);return;default:throw new Error(`Unknown reporter format requested: '${r}'`)}}import o7 from"wait-on";import{execSync as NQ}from"child_process";import{platform as DQ}from"os";function Zv(){return cB()?(v.dimmed("Setting device pixel ratio to 2 automatically since a Mac OS Retina screen was detected."),v.dimmed(`If you are using a low pixel-density monitor, you should manually set --pixel-ratio to 1 to avoid incorrect viewport calculations. Confirm your device's pixel-ratio at https://www.mydevice.io.
|
|
5102
5102
|
`),2):(v.dimmed("Setting device pixel ratio to 1."),v.dimmed(`If you are using Momentic on a high-pixel density (HiDPI) monitor, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations. Confirm your device's pixel-ratio at https://www.mydevice.io.
|
|
5103
|
-
`),1)}function cB(){return DQ()==="darwin"&&NQ("system_profiler SPDisplaysDataType").toString().includes("Retina")}function Qv(t){cB()&&t===1&&(v.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),v.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import kQ from"@actions/exec";import UQ from"@actions/io";import FQ from"quote";import BQ from"string-argv";async function uB(t,e=!0){let r=BQ(t),n=await UQ.which(r[0],!0),o=r.slice(1),i=kQ.exec(FQ(n),o,{delay:100});if(e)return i}import zQ from"csv-parser";import{createReadStream as HQ}from"fs";function eA(t){return new Promise((e,r)=>{let n=[];HQ(t).pipe(zQ()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>r(o))})}import bc from"semver";import{z as xf}from"zod";var tn="2.46.2",jQ="https://registry.npmjs.org/momentic",GQ=xf.object({versions:xf.record(xf.string(),xf.unknown()).optional()});async function ur(t){try{await VQ(t)}catch(e){v.warn({err:e},"Failed to check CLI version against NPM servers")}}async function tA(){let t=await X(fetch(jQ),{milliseconds:5e3});if(!t.ok)throw new Error(`Got error status code ${t.statusText}`);let e=await t.json(),r=GQ.parse(e).versions;if(!r)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=tn;for(let o of Object.keys(r))bc.valid(o)&&bc.major(o)===bc.major(tn)&&bc.gt(o,n)&&bc.prerelease(o)===null&&(n=o);return n}async function VQ(t){let e;for(let r=0;r<2;r++)try{e=await tA()}catch(n){t.warn({err:n},"Failed to fetch latest version from npm registry")}if(!e){t.warn("Failed to fetch npm registry data. Skipping version check.");return}bc.eq(tn,e)||(v.warn(`Update available: v${tn} -> v${e}`),v.warn("This version may be missing critical fixes, features, and security updates."),v.warn('Run "npx momentic@latest upgrade" to update'))}async function bi(){try{await X(Promise.all([p_(),ir.flush()]),{milliseconds:5e3})}catch{}}import{partition as $Q}from"lodash-es";function _f(t){return t.length===1?"test":"tests"}function dB(t){return t===1?"1 worker":`${t} workers`}function pB(t){t.length!==0&&(v.info(`Skipping ${t.length} disabled ${_f(t)}:`),t.forEach(e=>{v.info(`${It}- ${[e.relativeFilePath]}`)}),v.log(""))}function mB(t,e){t.length!==0&&(v.info(`Skipping ${t.length} quarantined ${_f(t)}:`),t.forEach(r=>{v.info(`${It}- ${[r.relativeFilePath]}: ${e[r.id]?.quarantinedReason}`)}),v.log(""))}function WQ(t,e){t.length!==0&&(v.info(`Running ${t.length} quarantined ${_f(t)} with ${dB(e)}:`),t.forEach(r=>{v.info(`${It}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`)}),v.log(""))}function qQ(t,e,r){e.length===0&&t.length>0||(v.info(`Running ${e.length} ${_f(e)} with ${dB(r)}:`),e.forEach(n=>{v.info(`${It}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),v.log(""))}function gB({logger:t,localTestsToRunWithInputs:e,parallel:r,shardCount:n,shardIndex:o}){t.info({tests:e.length,shardCount:n,shardIndex:o,parallel:r},"Running local tests");let[i,a]=$Q(e,s=>s.quarantined);WQ(i,r),qQ(i,a,r)}import{randomUUID as KQ}from"crypto";import{cloneDeep as Ec}from"lodash-es";import{dirname as YQ}from"path";async function hB({orgId:t,codeEvalTools:e,logger:r,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:s,value:c}=a;i[s]=await qr({orgId:t,s:c,localTools:e,logger:r,context:o})}return i}async function fB({baseUrl:t,envName:e,testName:r,devicePixelRatio:n,apiClient:o,test:i,storageClient:a,codeEvalTools:s,generator:c,orgId:l,variables:u,logger:d,customHeaders:p,testInputs:m,localBrowserConfig:g,aiSettings:h,visualDiffScreenshotStorage:f,tracer:S}){let b=await kh({settings:g,customHeaders:p,envVariables:u,envName:e,testName:r,baseUrl:t,logger:d,localTools:s,orgId:l}),y={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:J,mode:"runner"},T=Pp({browserType:b.browserType,orgDefaultBrowserType:g.defaultBrowserType});if(!NM(T)){let x=`Browser ${T} is required by the test named ${i.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browsers' before running tests. Attempting to continue...`;v.warn(x),J.warn(x)}let w=await Gn.init({baseUrl:t,logger:d,userBrowserSettings:b,storage:a,enricher:new ta(y,c),contextArgs:{viewport:i.advanced.viewport??Ar,locale:i.advanced.locale??Pi,geolocation:i.advanced.geolocation??Oi,timezoneId:i.advanced.timezone??Mi,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},callbacks:{onNetworkPage:x=>S.onNetworkPage(x),onNetworkLogs:x=>S.onNetworkLogs(x)},iconKnowledgeBase:null,videoOptions:S.videoOutputPath?{videoOutputPath:S.videoOutputPath,onVideoPageChange:({videoName:x})=>{S.setActiveVideo(x)}}:void 0}),P=new la({browser:w,generator:c,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:b.slowMoMs,autoFollowNewTabs:b.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:f}),A=new zr({baseUrl:t,currentUrl:P.browser.url(),variablesFromEnvironment:u,envName:e,testName:r});return i.parameters&&await Promise.all(i.parameters.map(async x=>{let{name:O,defaultValue:L,required:N}=x,j=m?.[O];N&&j===void 0&&(v.error(`Required parameter '${O}' is required by test '${i.name}' but not provided`),process.exit(1));let W=await qr({orgId:l,s:j??L,localTools:s,logger:d,context:zr.dummyContext(A.getEnvName())});A.setMomenticSystemVariable(O,W)})),{controller:P,context:A}}async function SB({testAdvancedSettings:t,orgSettings:e,logger:r}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!qa){let n="This test is ineligible for failure recovery since this does not appear to be a CI environment";return r.warn(n),v.warn(n),!1}return!0}async function yB({attemptInputs:t,attemptFixtures:e,attemptMetadata:r}){let{orgId:n,runId:o}=r,{controller:i,context:a,codeEvalTools:s,storageClient:c,logger:l,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=t;l.info(`Running test '${p.name}' locally (run link: https://app.momentic.ai/runs/${o})`);let g={controller:i,storage:c,usageTracker:u,context:a,logger:l,codeEvalTools:s},h={orgId:n,runId:o,testMetadata:p,steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps,orgSettings:m},f={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await SB({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:l})};return await Lh({fixtures:g,inputs:h,options:f,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function bB(t){let{testDefinition:e,logger:r}=t,n=new Date;try{return await XQ(t)}catch(o){let i="Fatal error running test";return v.error(`${i}: ${o.message}`),r.error({err:o},i),{results:[],parameters:t,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:n,lastAttemptStartedAt:n,finishedAt:new Date,outputs:{},quarantined:t.quarantined,quarantinedMetadata:t.quarantinedMetadata}}}async function XQ(t){let{testDefinition:e,project:r,apiClient:n,orgId:o,urlOverride:i,runGroupTracer:a,logger:s,gitMetadata:c,cacheOptions:l,runId:u,testInputs:d,quarantined:p,quarantinedMetadata:m,usageTracker:g}=t,h=new Zl(n,o),f=Oo({logger:s,orgId:o,client:n,gitMetadata:c,regenerateCache:l.regenerateCache,alwaysSaveCache:l.alwaysSaveCache,noCache:l.noCache,bustOldestCachePercentage:l.bustOldestCachePercentage}),S=await Eg({cacheStorage:f,logger:s,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id}),b=S.steps,y=S.beforeSteps??void 0,T=S.afterSteps??void 0,{envName:w,resolvedEnv:P,environmentVariables:A,baseUrl:x}=rh({test:e,envNameOverride:t.envName,urlOverride:i,resolveEnv:j=>ls(j,r,s)}),O=await a.startRun({logger:s,runId:u,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,directory:YQ(e.relativeFilePath),testDescription:e.description??void 0,testLabels:e.labels,baseUrl:x,environmentName:w,schemaVersion:e.schemaVersion,resolvedInputs:d,quarantined:p,quarantinedReason:m?.quarantinedReason,aiSettings:t.project.config.ai}),L=s.child(O.loggerBindings||{});Object.entries(O.envVarBindings||{}).forEach(([j,W])=>{A[j]=W});let N=await JQ({...t,variables:A,envName:w,resolvedEnv:P,baseUrl:x,storageClient:h,tracer:O,logger:L,cacheStorage:f,stepsWithCaches:b,beforeStepsWithCaches:y,afterStepsWithCaches:T,usageTracker:g});return await O.finish({logger:s,status:N.status,finishedAt:N.finishedAt,failureDetails:N.failureDetails,failureReason:N.failureReason,isFlake:N.isFlake,failureRecoveryDetails:N.failureRecoveryDetails}),{runId:O.runId,...N}}async function JQ(t){let{testDefinition:e,stepsWithCaches:r,beforeStepsWithCaches:n,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:s,generator:c,baseUrl:l,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:g,testInputs:h,variables:f,resolvedEnv:S,retriesOverride:b,devicePixelRatio:y,logUpdate:T,tracer:w,logger:P,cacheStorage:A,gitMetadata:x,quarantined:O,quarantinedMetadata:L,usageTracker:N}=t,j=i.config.ai?.aiFailureAnalysis??!1,W=new Date,B=new Kl(i,s,a),xe={...i.config},F={envName:p,urlOverride:m,customHeaders:g,testInputs:h},z,ae=Math.abs(b??e.retries??i.config.retries??0),ue=[];P.info({...x,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let _e=0;_e<=ae;_e++){let ye=KQ(),le=await w.startAttempt(ye),Q=P.child(le.loggerBindings||{}),Te={...e,steps:Ec(r),beforeSteps:Ec(n),afterSteps:Ec(o)};_e!==0&&T("RETRY",`attempt ${_e+1}/${ae+1}`);let Ae=new Date,I=xe.advanced?.fakerConstantSeed,oe=new Mo({httpClient:new fr({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:Q,mode:"runner"}),fakerSeed:I?ml:void 0}),ge=le;try{let{controller:rn,context:Er}=await fB({tracer:le,baseUrl:l,envName:p,testName:Te.name,apiClient:s,devicePixelRatio:y,logger:Q,storageClient:u,codeEvalTools:oe,test:Te,generator:c,orgId:d,variables:f,customHeaders:g,testInputs:h,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...Te.advanced},aiSettings:{...i.config.ai||{},...Te.advanced||{}},visualDiffScreenshotStorage:B});z=await yB({attemptMetadata:{attemptNumber:_e+1,orgId:d,runId:w.runId},attemptFixtures:{logger:Q,storageClient:u,usageTracker:N,codeEvalTools:oe,apiClient:s,context:Er,controller:rn,tracer:le},attemptInputs:{test:Te,orgSettings:xe}});let co=new Date,ha={logger:P,cacheStorage:A,orgId:d,testId:e.id,originalStepsWithCaches:{steps:Ec(r),beforeSteps:Ec(n),afterSteps:Ec(o)},updatedStepsWithCaches:{steps:Te.steps,beforeSteps:Te.beforeSteps,afterSteps:Te.afterSteps}};z?.status==="PASSED"?await Hl(ha):z?.status==="FAILED"&&_e===ae&&await jl(ha),await le.finish({logger:Q,result:z}),ue.unshift(z.status);let ee=await hB({orgId:d,codeEvalTools:oe,logger:Q,outputDefinitions:e.outputs??[],testContext:Er}),Os=hC(ue),Ls=_e+1;if(z.status!=="FAILED")return{...z,runAttemptId:ye,parameters:F,test:Te,filePath:Te.relativeFilePath,startedAt:W,lastAttemptStartedAt:Ae,finishedAt:co,attempts:Ls,baseUrl:l,outputs:ee,isFlake:Os,quarantined:O,quarantinedMetadata:L};let fa=z.failedStepResult,Ho=fa?.message||"Unknown failure",jo=fa?.failureReason??vR(Ho)??"UnknownError",vc=Q.child({failureReason:jo,errorMessage:Ho,numAttempts:(ae+1).toString(),name:Te.name});if(_e<ae){vc.warn(`Retrying failed execution attempt for run: ${Ho}`);continue}vc.error(`Test failed after all exhausting attempts: ${Ho}`);let Ns=new Error(Ho),Ei={errorMessage:Ho,errorStack:Ns.stack},Pf;if(j){let Ac;try{if(z.results&&z.results.length>0){let{classification:He,aiFailureReason:Wn}=await XO({logger:Q,browserStateStorage:ge,generator:c,fullResults:z,failureReason:jo,error:Ns,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Ac=He,Pf=Wn}}catch(He){Q.warn({err:He},"Failed to classify test results")}Ac&&(Ei.classification=Ac,jo=Pf??jo)}return{...z,runAttemptId:ye,parameters:F,failureDetails:Ei,failureReason:jo,test:Te,filePath:Te.relativeFilePath,startedAt:W,lastAttemptStartedAt:Ae,finishedAt:co,attempts:_e+1,baseUrl:l,outputs:ee,quarantined:O,quarantinedMetadata:L}}catch(rn){let Er=`Encountered fatal platform error while running test '${Te.name}': ${rn}`,co=new Date,ha=_e+1;Q.error({err:rn},Er),v.error(Er);let ee={errorMessage:rn.message,errStack:rn.stack},Os={status:"FAILED",failureDetails:ee,failureReason:"InternalPlatformError",finishedAt:co};return await le.finish({logger:Q,result:{status:"FAILED",results:[]}}),{...Os,runAttemptId:ye,results:[],parameters:F,test:Te,filePath:Te.relativeFilePath,startedAt:W,lastAttemptStartedAt:Ae,finishedAt:new Date,attempts:ha,baseUrl:l,outputs:{},quarantined:O,quarantinedMetadata:L}}}throw new Error("This code should not be reachable")}import e7 from"adm-zip";import t7 from"path";function ZQ(t){switch(t){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}var Ms=class{constructor(e,r,n,o){this.orgId=e;this.testId=r;this.testName=n;this.diskStorage=o}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(e,r){return this.diskStorage.readFile(`${xr}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${xr}/${r}.html`)?.toString()}getParentStepIdChain(){return[]}recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))ir.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async startStep(e){let{step:r}=e;this.recordStepStat(r);let n={step:r,status:"RUNNING",startedAt:new Date},o=new rA(this.orgId,this.testId,this.testName,n,this.diskStorage);return this.children.push(o),o}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(r=>r.finishInternal({status:ZQ(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function QQ(t){switch(t){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var rA=class{constructor(e,r,n,o,i){this.orgId=e;this.testId=r;this.testName=n;this.metadata=o;this.diskStorage=i;this.interactionTracer=new pi,di.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${xr}/${r}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${xr}/${r}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${xr}/${r}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${xr}/${r}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:r}=e,n=r==="AI"?"ai-target-heal":"cache-heal";ir.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:r,healedAt:new Date}}recordStepDuration(e){let r=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;ir.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async finishInternal(e){this.finished||(this.finished=!0,this.interactionTracer.finish(),await Promise.all(this.children.map(r=>r.finish({status:QQ(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step),e.step.trace=this.interactionTracer.getRootSpan()}async startSubSteps(){let e=new Ms(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var Zd=class{constructor(e,r,n,o,i,a,s){this.orgId=e;this.testId=r;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir(xr),this.harPagesStream=this.diskStorage.createFileStream(`${xr}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${xr}/har-entries.log`),this.resourceUsageStream=this.diskStorage.createFileStream(`${xr}/resource-usage.ndjson`),this.resourceUsageSampler=y_({keepSamples:!1,onSample:c=>{this.resourceUsageStream.write(`${JSON.stringify(c)}
|
|
5103
|
+
`),1)}function cB(){return DQ()==="darwin"&&NQ("system_profiler SPDisplaysDataType").toString().includes("Retina")}function Qv(t){cB()&&t===1&&(v.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),v.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import kQ from"@actions/exec";import UQ from"@actions/io";import FQ from"quote";import BQ from"string-argv";async function uB(t,e=!0){let r=BQ(t),n=await UQ.which(r[0],!0),o=r.slice(1),i=kQ.exec(FQ(n),o,{delay:100});if(e)return i}import zQ from"csv-parser";import{createReadStream as HQ}from"fs";function eA(t){return new Promise((e,r)=>{let n=[];HQ(t).pipe(zQ()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>r(o))})}import bc from"semver";import{z as xf}from"zod";var tn="2.46.3",jQ="https://registry.npmjs.org/momentic",GQ=xf.object({versions:xf.record(xf.string(),xf.unknown()).optional()});async function ur(t){try{await VQ(t)}catch(e){v.warn({err:e},"Failed to check CLI version against NPM servers")}}async function tA(){let t=await X(fetch(jQ),{milliseconds:5e3});if(!t.ok)throw new Error(`Got error status code ${t.statusText}`);let e=await t.json(),r=GQ.parse(e).versions;if(!r)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=tn;for(let o of Object.keys(r))bc.valid(o)&&bc.major(o)===bc.major(tn)&&bc.gt(o,n)&&bc.prerelease(o)===null&&(n=o);return n}async function VQ(t){let e;for(let r=0;r<2;r++)try{e=await tA()}catch(n){t.warn({err:n},"Failed to fetch latest version from npm registry")}if(!e){t.warn("Failed to fetch npm registry data. Skipping version check.");return}bc.eq(tn,e)||(v.warn(`Update available: v${tn} -> v${e}`),v.warn("This version may be missing critical fixes, features, and security updates."),v.warn('Run "npx momentic@latest upgrade" to update'))}async function bi(){try{await X(Promise.all([p_(),ir.flush()]),{milliseconds:5e3})}catch{}}import{partition as $Q}from"lodash-es";function _f(t){return t.length===1?"test":"tests"}function dB(t){return t===1?"1 worker":`${t} workers`}function pB(t){t.length!==0&&(v.info(`Skipping ${t.length} disabled ${_f(t)}:`),t.forEach(e=>{v.info(`${It}- ${[e.relativeFilePath]}`)}),v.log(""))}function mB(t,e){t.length!==0&&(v.info(`Skipping ${t.length} quarantined ${_f(t)}:`),t.forEach(r=>{v.info(`${It}- ${[r.relativeFilePath]}: ${e[r.id]?.quarantinedReason}`)}),v.log(""))}function WQ(t,e){t.length!==0&&(v.info(`Running ${t.length} quarantined ${_f(t)} with ${dB(e)}:`),t.forEach(r=>{v.info(`${It}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`)}),v.log(""))}function qQ(t,e,r){e.length===0&&t.length>0||(v.info(`Running ${e.length} ${_f(e)} with ${dB(r)}:`),e.forEach(n=>{v.info(`${It}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),v.log(""))}function gB({logger:t,localTestsToRunWithInputs:e,parallel:r,shardCount:n,shardIndex:o}){t.info({tests:e.length,shardCount:n,shardIndex:o,parallel:r},"Running local tests");let[i,a]=$Q(e,s=>s.quarantined);WQ(i,r),qQ(i,a,r)}import{randomUUID as KQ}from"crypto";import{cloneDeep as Ec}from"lodash-es";import{dirname as YQ}from"path";async function hB({orgId:t,codeEvalTools:e,logger:r,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:s,value:c}=a;i[s]=await qr({orgId:t,s:c,localTools:e,logger:r,context:o})}return i}async function fB({baseUrl:t,envName:e,testName:r,devicePixelRatio:n,apiClient:o,test:i,storageClient:a,codeEvalTools:s,generator:c,orgId:l,variables:u,logger:d,customHeaders:p,testInputs:m,localBrowserConfig:g,aiSettings:h,visualDiffScreenshotStorage:f,tracer:S}){let b=await kh({settings:g,customHeaders:p,envVariables:u,envName:e,testName:r,baseUrl:t,logger:d,localTools:s,orgId:l}),y={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:J,mode:"runner"},T=Pp({browserType:b.browserType,orgDefaultBrowserType:g.defaultBrowserType});if(!NM(T)){let x=`Browser ${T} is required by the test named ${i.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browsers' before running tests. Attempting to continue...`;v.warn(x),J.warn(x)}let w=await Gn.init({baseUrl:t,logger:d,userBrowserSettings:b,storage:a,enricher:new ta(y,c),contextArgs:{viewport:i.advanced.viewport??Ar,locale:i.advanced.locale??Pi,geolocation:i.advanced.geolocation??Oi,timezoneId:i.advanced.timezone??Mi,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},callbacks:{onNetworkPage:x=>S.onNetworkPage(x),onNetworkLogs:x=>S.onNetworkLogs(x)},iconKnowledgeBase:null,videoOptions:S.videoOutputPath?{videoOutputPath:S.videoOutputPath,onVideoPageChange:({videoName:x})=>{S.setActiveVideo(x)}}:void 0}),P=new la({browser:w,generator:c,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:b.slowMoMs,autoFollowNewTabs:b.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:f}),A=new zr({baseUrl:t,currentUrl:P.browser.url(),variablesFromEnvironment:u,envName:e,testName:r});return i.parameters&&await Promise.all(i.parameters.map(async x=>{let{name:O,defaultValue:L,required:N}=x,j=m?.[O];N&&j===void 0&&(v.error(`Required parameter '${O}' is required by test '${i.name}' but not provided`),process.exit(1));let W=await qr({orgId:l,s:j??L,localTools:s,logger:d,context:zr.dummyContext(A.getEnvName())});A.setMomenticSystemVariable(O,W)})),{controller:P,context:A}}async function SB({testAdvancedSettings:t,orgSettings:e,logger:r}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!qa){let n="This test is ineligible for failure recovery since this does not appear to be a CI environment";return r.warn(n),v.warn(n),!1}return!0}async function yB({attemptInputs:t,attemptFixtures:e,attemptMetadata:r}){let{orgId:n,runId:o}=r,{controller:i,context:a,codeEvalTools:s,storageClient:c,logger:l,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=t;l.info(`Running test '${p.name}' locally (run link: https://app.momentic.ai/runs/${o})`);let g={controller:i,storage:c,usageTracker:u,context:a,logger:l,codeEvalTools:s},h={orgId:n,runId:o,testMetadata:p,steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps,orgSettings:m},f={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await SB({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:l})};return await Lh({fixtures:g,inputs:h,options:f,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function bB(t){let{testDefinition:e,logger:r}=t,n=new Date;try{return await XQ(t)}catch(o){let i="Fatal error running test";return v.error(`${i}: ${o.message}`),r.error({err:o},i),{results:[],parameters:t,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:n,lastAttemptStartedAt:n,finishedAt:new Date,outputs:{},quarantined:t.quarantined,quarantinedMetadata:t.quarantinedMetadata}}}async function XQ(t){let{testDefinition:e,project:r,apiClient:n,orgId:o,urlOverride:i,runGroupTracer:a,logger:s,gitMetadata:c,cacheOptions:l,runId:u,testInputs:d,quarantined:p,quarantinedMetadata:m,usageTracker:g}=t,h=new Zl(n,o),f=Oo({logger:s,orgId:o,client:n,gitMetadata:c,regenerateCache:l.regenerateCache,alwaysSaveCache:l.alwaysSaveCache,noCache:l.noCache,bustOldestCachePercentage:l.bustOldestCachePercentage}),S=await Eg({cacheStorage:f,logger:s,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id}),b=S.steps,y=S.beforeSteps??void 0,T=S.afterSteps??void 0,{envName:w,resolvedEnv:P,environmentVariables:A,baseUrl:x}=rh({test:e,envNameOverride:t.envName,urlOverride:i,resolveEnv:j=>ls(j,r,s)}),O=await a.startRun({logger:s,runId:u,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,directory:YQ(e.relativeFilePath),testDescription:e.description??void 0,testLabels:e.labels,baseUrl:x,environmentName:w,schemaVersion:e.schemaVersion,resolvedInputs:d,quarantined:p,quarantinedReason:m?.quarantinedReason,aiSettings:t.project.config.ai}),L=s.child(O.loggerBindings||{});Object.entries(O.envVarBindings||{}).forEach(([j,W])=>{A[j]=W});let N=await JQ({...t,variables:A,envName:w,resolvedEnv:P,baseUrl:x,storageClient:h,tracer:O,logger:L,cacheStorage:f,stepsWithCaches:b,beforeStepsWithCaches:y,afterStepsWithCaches:T,usageTracker:g});return await O.finish({logger:s,status:N.status,finishedAt:N.finishedAt,failureDetails:N.failureDetails,failureReason:N.failureReason,isFlake:N.isFlake,failureRecoveryDetails:N.failureRecoveryDetails}),{runId:O.runId,...N}}async function JQ(t){let{testDefinition:e,stepsWithCaches:r,beforeStepsWithCaches:n,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:s,generator:c,baseUrl:l,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:g,testInputs:h,variables:f,resolvedEnv:S,retriesOverride:b,devicePixelRatio:y,logUpdate:T,tracer:w,logger:P,cacheStorage:A,gitMetadata:x,quarantined:O,quarantinedMetadata:L,usageTracker:N}=t,j=i.config.ai?.aiFailureAnalysis??!1,W=new Date,B=new Kl(i,s,a),xe={...i.config},F={envName:p,urlOverride:m,customHeaders:g,testInputs:h},z,ae=Math.abs(b??e.retries??i.config.retries??0),ue=[];P.info({...x,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let _e=0;_e<=ae;_e++){let Se=KQ(),le=await w.startAttempt(Se),Q=P.child(le.loggerBindings||{}),Te={...e,steps:Ec(r),beforeSteps:Ec(n),afterSteps:Ec(o)};_e!==0&&T("RETRY",`attempt ${_e+1}/${ae+1}`);let Ae=new Date,I=xe.advanced?.fakerConstantSeed,oe=new Mo({httpClient:new fr({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:Q,mode:"runner"}),fakerSeed:I?ml:void 0}),ge=le;try{let{controller:rn,context:Er}=await fB({tracer:le,baseUrl:l,envName:p,testName:Te.name,apiClient:s,devicePixelRatio:y,logger:Q,storageClient:u,codeEvalTools:oe,test:Te,generator:c,orgId:d,variables:f,customHeaders:g,testInputs:h,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...Te.advanced},aiSettings:{...i.config.ai||{},...Te.advanced||{}},visualDiffScreenshotStorage:B});z=await yB({attemptMetadata:{attemptNumber:_e+1,orgId:d,runId:w.runId},attemptFixtures:{logger:Q,storageClient:u,usageTracker:N,codeEvalTools:oe,apiClient:s,context:Er,controller:rn,tracer:le},attemptInputs:{test:Te,orgSettings:xe}});let co=new Date,ha={logger:P,cacheStorage:A,orgId:d,testId:e.id,originalStepsWithCaches:{steps:Ec(r),beforeSteps:Ec(n),afterSteps:Ec(o)},updatedStepsWithCaches:{steps:Te.steps,beforeSteps:Te.beforeSteps,afterSteps:Te.afterSteps}};z?.status==="PASSED"?await Hl(ha):z?.status==="FAILED"&&_e===ae&&await jl(ha),await le.finish({logger:Q,result:z}),ue.unshift(z.status);let ee=await hB({orgId:d,codeEvalTools:oe,logger:Q,outputDefinitions:e.outputs??[],testContext:Er}),Os=hC(ue),Ls=_e+1;if(z.status!=="FAILED")return{...z,runAttemptId:Se,parameters:F,test:Te,filePath:Te.relativeFilePath,startedAt:W,lastAttemptStartedAt:Ae,finishedAt:co,attempts:Ls,baseUrl:l,outputs:ee,isFlake:Os,quarantined:O,quarantinedMetadata:L};let fa=z.failedStepResult,Ho=fa?.message||"Unknown failure",jo=fa?.failureReason??vR(Ho)??"UnknownError",vc=Q.child({failureReason:jo,errorMessage:Ho,numAttempts:(ae+1).toString(),name:Te.name});if(_e<ae){vc.warn(`Retrying failed execution attempt for run: ${Ho}`);continue}vc.error(`Test failed after all exhausting attempts: ${Ho}`);let Ns=new Error(Ho),Ei={errorMessage:Ho,errorStack:Ns.stack},Pf;if(j){let Ac;try{if(z.results&&z.results.length>0){let{classification:He,aiFailureReason:Wn}=await XO({logger:Q,browserStateStorage:ge,generator:c,fullResults:z,failureReason:jo,error:Ns,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Ac=He,Pf=Wn}}catch(He){Q.warn({err:He},"Failed to classify test results")}Ac&&(Ei.classification=Ac,jo=Pf??jo)}return{...z,runAttemptId:Se,parameters:F,failureDetails:Ei,failureReason:jo,test:Te,filePath:Te.relativeFilePath,startedAt:W,lastAttemptStartedAt:Ae,finishedAt:co,attempts:_e+1,baseUrl:l,outputs:ee,quarantined:O,quarantinedMetadata:L}}catch(rn){let Er=`Encountered fatal platform error while running test '${Te.name}': ${rn}`,co=new Date,ha=_e+1;Q.error({err:rn},Er),v.error(Er);let ee={errorMessage:rn.message,errStack:rn.stack},Os={status:"FAILED",failureDetails:ee,failureReason:"InternalPlatformError",finishedAt:co};return await le.finish({logger:Q,result:{status:"FAILED",results:[]}}),{...Os,runAttemptId:Se,results:[],parameters:F,test:Te,filePath:Te.relativeFilePath,startedAt:W,lastAttemptStartedAt:Ae,finishedAt:new Date,attempts:ha,baseUrl:l,outputs:{},quarantined:O,quarantinedMetadata:L}}}throw new Error("This code should not be reachable")}import e7 from"adm-zip";import t7 from"path";function ZQ(t){switch(t){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}var Ms=class{constructor(e,r,n,o){this.orgId=e;this.testId=r;this.testName=n;this.diskStorage=o}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(e,r){return this.diskStorage.readFile(`${xr}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${xr}/${r}.html`)?.toString()}getParentStepIdChain(){return[]}recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))ir.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async startStep(e){let{step:r}=e;this.recordStepStat(r);let n={step:r,status:"RUNNING",startedAt:new Date},o=new rA(this.orgId,this.testId,this.testName,n,this.diskStorage);return this.children.push(o),o}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(r=>r.finishInternal({status:ZQ(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function QQ(t){switch(t){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var rA=class{constructor(e,r,n,o,i){this.orgId=e;this.testId=r;this.testName=n;this.metadata=o;this.diskStorage=i;this.interactionTracer=new pi,di.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${xr}/${r}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${xr}/${r}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${xr}/${r}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${xr}/${r}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:r}=e,n=r==="AI"?"ai-target-heal":"cache-heal";ir.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:r,healedAt:new Date}}recordStepDuration(e){let r=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;ir.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async finishInternal(e){this.finished||(this.finished=!0,this.interactionTracer.finish(),await Promise.all(this.children.map(r=>r.finish({status:QQ(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step),e.step.trace=this.interactionTracer.getRootSpan()}async startSubSteps(){let e=new Ms(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var Zd=class{constructor(e,r,n,o,i,a,s){this.orgId=e;this.testId=r;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir(xr),this.harPagesStream=this.diskStorage.createFileStream(`${xr}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${xr}/har-entries.log`),this.resourceUsageStream=this.diskStorage.createFileStream(`${xr}/resource-usage.ndjson`),this.resourceUsageSampler=y_({keepSamples:!1,onSample:c=>{this.resourceUsageStream.write(`${JSON.stringify(c)}
|
|
5104
5104
|
`)}})}finished=!1;children=[];harPagesStream;inProgressHarEntries;harEntriesStream;resourceUsageStream;resourceUsageSampler;get loggerBindings(){return{runAttemptId:this.runAttemptId}}get videoOutputPath(){if(this.recordVideo)return t7.resolve(this.diskStorage.cwd(),xr)}setActiveVideo(e){this.recordVideo&&(this.metadata.activeVideos=this.metadata.activeVideos||[],this.metadata.activeVideos.push({videoName:e,timestamp:new Date}))}onNetworkPage(e){this.finished||this.harPagesStream.write(`${JSON.stringify(e)}
|
|
5105
5105
|
`)}onNetworkLogs(e){if(!this.finished)for(let[r,n]of Object.entries(e))n.response?(delete this.inProgressHarEntries[r],this.harEntriesStream.write(`${JSON.stringify(n)}
|
|
5106
5106
|
`)):this.inProgressHarEntries[r]=n}attachConsoleLogs(e){let{logs:r}=e;this.diskStorage.storeFile({name:"console.json",contents:JSON.stringify(r,null,2)})}attachBrowserCrashDump(e){let{crashReportDirFetcher:r,logger:n}=e,o=r();if(!o)return;let i=new e7;i.addLocalFolder(o,void 0,a=>a!==".DS_Store"),this.diskStorage.storeFile({name:`${xr}/${Uy}`,contents:i.toBuffer()}),n.info({browserCrashZipName:Uy},"Attached browser crash ZIP")}async finish(e){if(this.finished)return;this.finished=!0;let{logger:r,result:n}=e,o={...this.metadata,status:n.status,finishedAt:new Date,results:wg(n.results,r),beforeResults:n.beforeResults?wg(n.beforeResults,r):void 0,afterResults:n.afterResults?wg(n.afterResults,r):void 0};await Promise.all(this.children.map(i=>i.finish({status:o.status,finishedAt:o.finishedAt})));for(let i of Object.values(this.inProgressHarEntries))this.harEntriesStream.write(`${JSON.stringify(i)}
|
|
5107
|
-
`);try{this.harEntriesStream.end()}catch{}try{this.harPagesStream.end()}catch{}try{this.resourceUsageSampler.stop(),this.resourceUsageStream.end()}catch{}this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)})}async startBeforeStepList(){let e=new Ms(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new Ms(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new Ms(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,r){return this.diskStorage.readFile(`${xr}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${xr}/${r}.html`)?.toString()}};var Qd=class{constructor(e,r,n,o,i,a,s){this.orgId=e;this.testId=r;this.testName=n;this.runId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}get envVarBindings(){return{[ik]:this.runId}}async finish(e){if(this.finished)return;this.finished=!0;let r={...this.metadata,finishedAt:e.finishedAt||new Date,status:e.status,failureDetails:e.failureDetails,failureReason:e.failureReason,flake:e.isFlake||!1,failureRecoveryDetails:e.failureRecoveryDetails};await Promise.all(this.children.map(n=>n.finish({logger:e.logger,result:{status:r.status,results:[],beforeResults:[],afterResults:[]}}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(r,null,2)}),this.diskStorage.close()}async startAttempt(e){this.metadata.attempts=this.metadata.attempts+1,this.metadata.status="RUNNING",this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(this.metadata,null,2)});let r=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),n={id:e,schemaVersion:Qe,runAttemptSchemaVersion:n_,startedAt:new Date,status:"RUNNING"};r.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new Zd(this.orgId,this.testId,this.testName,e,n,r,this.recordVideo);return this.children.push(o),o}};var ep=class t{constructor(e,r,n,o,i){this.orgId=e;this.runGroupId=r;this.metadata=n;this.diskStorage=o;this.recordVideo=i}children=[];finished=!1;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start({suiteName:e,orgId:r,runGroupId:n,outputDir:o,gitMetadata:i,labels:a,recordVideo:s}){let c={...i,suiteName:e,id:n,trigger:Jr.CLI,startedAt:new Date,status:"RUNNING",cliVersion:tn,labels:a??[]},l=new fd(o);return l.storeFile({name:"metadata.json",contents:JSON.stringify(c,null,2)}),new t(r,n,c,l,s??!1)}async finish(e){if(this.finished)return;this.finished=!0;let{status:r}=e,n={...this.metadata,status:r,updatedAt:new Date,finishedAt:new Date};await Promise.all(this.children.map(o=>o.finish({logger:e.logger,status:n.status,finishedAt:n.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)})}async startRun(e){let r=this.diskStorage.createRunArchive(e.runId),n={stepsSnapshot:e.originalSteps.steps,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName,directory:e.directory,testDescription:e.testDescription,labels:e.testLabels,trigger:"CLI",status:"RUNNING",resolvedBaseUrl:e.baseUrl,environmentName:e.environmentName,resolvedInputs:e.resolvedInputs,cliVersion:tn,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0,quarantined:e.quarantined??!1,quarantinedReason:e.quarantinedReason,executionType:"WEB",aiSettings:e.aiSettings};r.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new Qd(this.orgId,e.testId,e.testName,e.runId,n,r,this.recordVideo);return this.children.push(o),o}};async function EB(t,e,r){if(r)return{};try{return(await e.getQuarantinedTests()).quarantined.reduce((o,i)=>(o[i.testId]={quarantinedAt:i.quarantinedAt,quarantinedReason:i.quarantinedReason,quarantinedBy:i.quarantinedBy},o),{})}catch(n){return t.warn({err:n},"Failed to fetch quarantined tests, proceeding without them."),{}}}async function TB(t){let{suiteName:e,logger:r,tests:n,yes:o,start:i,waitOn:a,waitOnProxy:s,client:c,project:l,retriesOverride:u,urlOverride:d,envName:p,orgId:m,devicePixelRatio:g,customHeaders:h,testInputMatrix:f,reporter:S,include:b,exclude:y,labels:T,reporterDir:w=pL,outputDir:P=mL,uploadResults:A=!1,waitOnTimeout:x=60,parallel:O,shardIndex:L=1,shardCount:N=1,regenerateGoldenFiles:j,gitMetadata:W,cacheOptions:B,ignoreQuarantine:xe,skipQuarantined:F,onlyQuarantined:z,runGroupId:ae,recordVideo:ue,timeoutMinutes:_e}=t;if(i&&(r.info({orgId:m},`Executing start command: ${i}`),await uB(i,!1)),a){r.info({orgId:m},`Waiting for url: ${a} with timeout: ${x} seconds.`);let He=s?new URL(s):void 0,Wn;He&&(Wn={host:He.hostname,port:He.port?parseInt(He.port):He.protocol.startsWith("https")?443:80,auth:He.username||He.password?{username:He.username,password:He.password}:void 0}),await o7({resources:[a],interval:2500,timeout:x*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1,proxy:Wn})}let
|
|
5108
|
-
`),v.log(""),A?(v.success(`Test results have been saved to the folder ${P}. Uploading to Momentic Cloud...`),await eh({client:c,consoleLogger:v,resultsPath:P})):v.success(`Test results have been saved to the folder ${P}. Upload them to Momentic Cloud by running 'npx momentic results upload ${P}'.`),Wn};n7.existsSync(P)&&v.warn(`Output directory ${P} already exists, removing before test execution...`);let Ls=await ep.start({suiteName:e,orgId:m,runGroupId:ae,outputDir:P,gitMetadata:W,labels:T,recordVideo:ue}),fa=r.child(Ls.loggerBindings||{}),Ho=!1,jo=async He=>{Ho||(Ho=!0,v.warn(`${He} Stopping tests and printing latest results...`),await Ls.finish({logger:fa,status:"CANCELLED"}),await Os(),await bi(),process.exit(1))},vc=async()=>{await jo("SIGINT received.")};process.once("SIGINT",vc);let Ns;if(_e!==void 0&&_e>0){let He=_e*60*1e3;v.info(`Test run timeout set to ${_e} minute(s).`),Ns=setTimeout(()=>{jo(`Timeout of ${_e} minute(s) reached.`)},He)}let Ei={};for(let He=0;He<Er.length;He++){let Wn=Object.values(Ei);Wn.length===O&&await Promise.race(Wn.map(Sa=>Sa.promise));let tp=Er[He],nn=`test-${He}`;Ei[nn]={done:!1,promise:(async({inputs:Sa,quarantined:PB,quarantinedMetadata:MB,testDefinition:ya})=>{ee.add({inputs:Sa});let rp=ya.relativeFilePath.includes("..")?ya.fullFilePath:ya.relativeFilePath;Qu({status:"START",testLogRef:rp,getRunningTestsCount:()=>ee.size,getTotalTestsCount:()=>Er.length});let OB=setInterval(()=>Qu({status:"RUN",testLogRef:rp,getRunningTestsCount:()=>ee.size,getTotalTestsCount:()=>Er.length}),5*60*1e3),Mf=r7(),Of=fa.child({testId:ya.id,runId:Mf}),aA=new Og({logger:Of,reporter:new Jg(c),runType:"test-run",runId:Mf,testMetadata:ya,suiteMetadata:void 0});try{let Rc=await bB({testDefinition:ya,project:l,testInputs:Sa,quarantined:PB,quarantinedMetadata:MB,orgId:m,runId:Mf,devicePixelRatio:g,apiClient:c,runGroupTracer:Ls,generator:
|
|
5107
|
+
`);try{this.harEntriesStream.end()}catch{}try{this.harPagesStream.end()}catch{}try{this.resourceUsageSampler.stop(),this.resourceUsageStream.end()}catch{}this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)})}async startBeforeStepList(){let e=new Ms(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new Ms(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new Ms(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,r){return this.diskStorage.readFile(`${xr}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${xr}/${r}.html`)?.toString()}};var Qd=class{constructor(e,r,n,o,i,a,s){this.orgId=e;this.testId=r;this.testName=n;this.runId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}get envVarBindings(){return{[ik]:this.runId}}async finish(e){if(this.finished)return;this.finished=!0;let r={...this.metadata,finishedAt:e.finishedAt||new Date,status:e.status,failureDetails:e.failureDetails,failureReason:e.failureReason,flake:e.isFlake||!1,failureRecoveryDetails:e.failureRecoveryDetails};await Promise.all(this.children.map(n=>n.finish({logger:e.logger,result:{status:r.status,results:[],beforeResults:[],afterResults:[]}}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(r,null,2)}),this.diskStorage.close()}async startAttempt(e){this.metadata.attempts=this.metadata.attempts+1,this.metadata.status="RUNNING",this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(this.metadata,null,2)});let r=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),n={id:e,schemaVersion:Qe,runAttemptSchemaVersion:n_,startedAt:new Date,status:"RUNNING"};r.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new Zd(this.orgId,this.testId,this.testName,e,n,r,this.recordVideo);return this.children.push(o),o}};var ep=class t{constructor(e,r,n,o,i){this.orgId=e;this.runGroupId=r;this.metadata=n;this.diskStorage=o;this.recordVideo=i}children=[];finished=!1;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start({suiteName:e,orgId:r,runGroupId:n,outputDir:o,gitMetadata:i,labels:a,recordVideo:s}){let c={...i,suiteName:e,id:n,trigger:Jr.CLI,startedAt:new Date,status:"RUNNING",cliVersion:tn,labels:a??[]},l=new fd(o);return l.storeFile({name:"metadata.json",contents:JSON.stringify(c,null,2)}),new t(r,n,c,l,s??!1)}async finish(e){if(this.finished)return;this.finished=!0;let{status:r}=e,n={...this.metadata,status:r,updatedAt:new Date,finishedAt:new Date};await Promise.all(this.children.map(o=>o.finish({logger:e.logger,status:n.status,finishedAt:n.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)})}async startRun(e){let r=this.diskStorage.createRunArchive(e.runId),n={stepsSnapshot:e.originalSteps.steps,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName,directory:e.directory,testDescription:e.testDescription,labels:e.testLabels,trigger:"CLI",status:"RUNNING",resolvedBaseUrl:e.baseUrl,environmentName:e.environmentName,resolvedInputs:e.resolvedInputs,cliVersion:tn,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0,quarantined:e.quarantined??!1,quarantinedReason:e.quarantinedReason,executionType:"WEB",aiSettings:e.aiSettings};r.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new Qd(this.orgId,e.testId,e.testName,e.runId,n,r,this.recordVideo);return this.children.push(o),o}};async function EB(t,e,r){if(r)return{};try{return(await e.getQuarantinedTests()).quarantined.reduce((o,i)=>(o[i.testId]={quarantinedAt:i.quarantinedAt,quarantinedReason:i.quarantinedReason,quarantinedBy:i.quarantinedBy},o),{})}catch(n){return t.warn({err:n},"Failed to fetch quarantined tests, proceeding without them."),{}}}async function TB(t){let{suiteName:e,logger:r,tests:n,yes:o,start:i,waitOn:a,waitOnProxy:s,client:c,project:l,retriesOverride:u,urlOverride:d,envName:p,orgId:m,devicePixelRatio:g,customHeaders:h,testInputMatrix:f,reporter:S,include:b,exclude:y,labels:T,reporterDir:w=pL,outputDir:P=mL,uploadResults:A=!1,waitOnTimeout:x=60,parallel:O,shardIndex:L=1,shardCount:N=1,regenerateGoldenFiles:j,gitMetadata:W,cacheOptions:B,ignoreQuarantine:xe,skipQuarantined:F,onlyQuarantined:z,runGroupId:ae,recordVideo:ue,timeoutMinutes:_e}=t;if(i&&(r.info({orgId:m},`Executing start command: ${i}`),await uB(i,!1)),a){r.info({orgId:m},`Waiting for url: ${a} with timeout: ${x} seconds.`);let He=s?new URL(s):void 0,Wn;He&&(Wn={host:He.hostname,port:He.port?parseInt(He.port):He.protocol.startsWith("https")?443:80,auth:He.username||He.password?{username:He.username,password:He.password}:void 0}),await o7({resources:[a],interval:2500,timeout:x*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1,proxy:Wn})}let Se=new Po(l.config.ai?.agentConfig,{baseUrl:c.baseUrl,apiKey:c.apiKey,logger:r,mode:"runner"}),le=await ce(l),Q=await Sc({tests:n,momenticFiles:le,yes:o,project:l,include:b,exclude:y,labels:T,logger:v}),Te=await EB(r,c,xe),{testsToSkip:Ae,quarantinedTestsToSkip:I,testsToRun:oe,quarantinedTestsToRun:ge}=KF({testDefinitions:Q,quarantinedTestsMetadata:Te,onlyQuarantined:z,skipQuarantined:F});pB(Ae),mB(I,Te);let rn=YF({testsToRun:oe,quarantinedTestsToRun:ge,quarantinedTestsMetadata:Te,testInputMatrix:f}),Er=BM({items:rn,shardIndex:L,shardCount:N,sortKey:He=>`${He.testDefinition.fullFilePath}:${He.inputIndex??0}`});gB({logger:r,localTestsToRunWithInputs:Er,parallel:O,shardCount:N,shardIndex:L});let co=[],ha=new Date,ee=new Set,Os=async()=>{let He=c.getAppUrl(),Wn=Ll({results:co,startTime:ha.getTime(),onFailed:nn=>{pg(nn,nn.filePath)},getDisplayLine:nn=>{let Sa=`${It}- ${nn.filePath}${nn.failureRecoveryDetails?" [recovered] ":""}`;return nn.runId&&(Sa+=` ( link when uploaded: ${He}/runs/${nn.runId} )`),Sa},entity:"test"}),tp=co.filter(nn=>!!nn.failureRecoveryDetails?.attempts);return tp.length>0&&v.warn(`Our AI agent automatically prevented ${tp.length} tests from failing due to transient issues. Use the run links above to review the additional steps that were executed.
|
|
5108
|
+
`),v.log(""),A?(v.success(`Test results have been saved to the folder ${P}. Uploading to Momentic Cloud...`),await eh({client:c,consoleLogger:v,resultsPath:P})):v.success(`Test results have been saved to the folder ${P}. Upload them to Momentic Cloud by running 'npx momentic results upload ${P}'.`),Wn};n7.existsSync(P)&&v.warn(`Output directory ${P} already exists, removing before test execution...`);let Ls=await ep.start({suiteName:e,orgId:m,runGroupId:ae,outputDir:P,gitMetadata:W,labels:T,recordVideo:ue}),fa=r.child(Ls.loggerBindings||{}),Ho=!1,jo=async He=>{Ho||(Ho=!0,v.warn(`${He} Stopping tests and printing latest results...`),await Ls.finish({logger:fa,status:"CANCELLED"}),await Os(),await bi(),process.exit(1))},vc=async()=>{await jo("SIGINT received.")};process.once("SIGINT",vc);let Ns;if(_e!==void 0&&_e>0){let He=_e*60*1e3;v.info(`Test run timeout set to ${_e} minute(s).`),Ns=setTimeout(()=>{jo(`Timeout of ${_e} minute(s) reached.`)},He)}let Ei={};for(let He=0;He<Er.length;He++){let Wn=Object.values(Ei);Wn.length===O&&await Promise.race(Wn.map(Sa=>Sa.promise));let tp=Er[He],nn=`test-${He}`;Ei[nn]={done:!1,promise:(async({inputs:Sa,quarantined:PB,quarantinedMetadata:MB,testDefinition:ya})=>{ee.add({inputs:Sa});let rp=ya.relativeFilePath.includes("..")?ya.fullFilePath:ya.relativeFilePath;Qu({status:"START",testLogRef:rp,getRunningTestsCount:()=>ee.size,getTotalTestsCount:()=>Er.length});let OB=setInterval(()=>Qu({status:"RUN",testLogRef:rp,getRunningTestsCount:()=>ee.size,getTotalTestsCount:()=>Er.length}),5*60*1e3),Mf=r7(),Of=fa.child({testId:ya.id,runId:Mf}),aA=new Og({logger:Of,reporter:new Jg(c),runType:"test-run",runId:Mf,testMetadata:ya,suiteMetadata:void 0});try{let Rc=await bB({testDefinition:ya,project:l,testInputs:Sa,quarantined:PB,quarantinedMetadata:MB,orgId:m,runId:Mf,devicePixelRatio:g,apiClient:c,runGroupTracer:Ls,generator:Se,retriesOverride:u,urlOverride:d,envName:p,customHeaders:h,regenerateGoldenFiles:j,logUpdate:(np,LB)=>Qu({status:np,testLogRef:rp,getRunningTestsCount:()=>ee.size,getTotalTestsCount:()=>Er.length,additionalText:LB}),logger:Of,gitMetadata:W,cacheOptions:B,usageTracker:aA});Qu({status:Rc.status,testLogRef:rp,getRunningTestsCount:()=>ee.size,getTotalTestsCount:()=>Er.length}),co.push(Rc)}catch(Rc){let np=`Encountered unexpected fatal error when running test '${ya.name}': ${Rc.message}`;v.error(np),Of.error({err:Rc},np),await jo("Fatal error occurred.")}finally{clearInterval(OB),Ei[nn].done=!0,delete Ei[nn]}await aA.flush(r)})(tp)}}await Promise.allSettled(Object.values(Ei).map(He=>He.promise));let Ac=co.some(He=>z?He.status==="FAILED":!He.quarantined&&He.status==="FAILED")?"FAILED":"PASSED";return process.off("SIGINT",vc),Ns&&clearTimeout(Ns),await Ls.finish({logger:fa,status:Ac}),S&&await lB({logger:fa,callbacks:{createDebugDataReaderForRunAttempt:(He,Wn)=>new th(P,He,Wn)},format:S,params:{projectConfigPath:l.configFilePath,suiteName:e??l.config.name,startedAt:ha,finishedAt:new Date,testsToSkip:Ae,quarantinedTestsToSkip:I,quarantinedTestsMetadata:Te},runs:co,folder:w}),Os()}import{installPackage as i7}from"@antfu/install-pkg";import{cloneDeep as a7}from"lodash-es";import s7 from"semver";async function vB(){let t=await tA();s7.lt(tn,t)&&v.warn(`The current CLI version (${tn}) is not the latest. It's recommended to run the upgrade command using momentic@latest.`),await i7(`momentic@${t}`,{silent:!1,dev:!0})}function AB(t){let e=a7(t.config),r={...e.ai?.agentConfig,...Gp},n={...e.ai,agentConfig:r};e.ai=n,Xi(e,t.configFilePath)}J.setApp("cli");qb||J.warn("Sentry is not enabled in this environment due to unsupported node version");AM({serviceName:"cli"});var wB=process.argv.some(t=>t.includes("--log-level"))&&process.argv.some(t=>t.includes("debug")),xB=t=>{wB&&v.dimmed(t)};wB&&UM(J);var dr=new c7;dr.name("momentic").description("Momentic CLI").version(tn);dr.command("install-browsers").description("Install browser executables onto the local machine.").option("-f, --force","Force reinstallation even if the browser executables already exist on disk.").option("-a, --all","Install all browsers types.").argument("[browsers...]",`Browsers to install. Available choices: ${Xb.join(", ")}.`).action(async(t,e)=>{await ur(J),!e.all&&t.length===0&&(v.error("No browsers specified"),process.exit(1)),await DM({rawBrowsers:t,force:e.force,all:e.all})});dr.addOption(new Dr("--log-level <level>").choices(["debug","info","warn","error"]).default("info")).on("option:log-level",t=>{t==="debug"&&v.info("Enabling debug logging"),v.setMinLevel(t.toLowerCase())});dr.addOption(new Dr("--verbose","enable verbose logging")).on("option:verbose",()=>{J.enableConsoleLogs(),v.setMinLevel(20)});var nA=dr.command("checks").alias("check").description("Perform various project checks");nA.command("config").addOption(Nr).action(async t=>{await ur(J),await Nt({configFilePath:t.config})});nA.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(Nr).addOption(MF).action(async t=>{await ur(J);let e=await Nt({configFilePath:t.config});await fF({project:e,fix:t.fix})});nA.command("duplicate-names").description("Checks if tests or modules with duplicate names or ids exist").addOption(Nr).action(async t=>{await ur(J);let e=await Nt({configFilePath:t.config});await SF({project:e})});var _B=dr.command("migrate").description("Migrate and upgrade tooling");_B.command("steps").description("Migrate steps in all tests and modules to the latest schema version. Note that this is always done when a test is loaded through the interactive editor, so is generally not needed.").addOption(Nr).action(async t=>{let e=await Nt({configFilePath:t.config});await VF(e)});_B.command("v1-v2").description("Migrate from v1 of the Momentic CLI to v2").addOption(En).addOption(Nr).addOption(bn).addOption(yi).action(async t=>{!t.yes&&!await hr("This command will modify your existing Momentic configuration. Please backup your local directory using Git or another version control system before proceeding. Continue?")&&process.exit(1);let e=await Nt({configFilePath:t.config}),r=new pt({baseUrl:t.server,apiKey:t.apiKey,logger:J}),{orgId:n}=await r.getAuthInfo();await $F({project:e,orgId:n,apiClient:r}),process.exit(0)});dr.command("import").addOption(bn).addOption(En).addOption(Nr).addOption(yi).addArgument(FF).action(async(t,e)=>{await ur(J);let{apiKey:r,server:n,config:o,yes:i}=e,a=await Nt({configFilePath:o}),s=new pt({baseUrl:n,apiKey:r,logger:J});!t||t.length===0?await vF({client:s,project:a,skipPrompts:i}):await AF({client:s,project:a,paths:t,skipPrompts:i}),process.exit(0)});dr.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new Dr("--name <name>","Name of the project")).action(async t=>{await ur(J),v.info(`Welcome to the Momentic project setup wizard! \u{1F680}
|
|
5109
5109
|
`),v.info("This wizard will help you bootstrap a new Momentic project. If you need to import existing assets from Momentic Cloud, you can call the 'import' command after initialization."),If.existsSync(Wl)&&(v.error("A momentic.config.yaml file already exists in this directory. Please rename or remove it to initialize a new project."),process.exit(1));let e=t.name??await xM("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app");await hL()||await hr("A Git repository was not detected in the current directory. Momentic highly recommends initializing your project within a Git repository for seamless version control. Continue?")||process.exit(1),Xi({name:e,include:Ug},Wl),v.success(`Initialized Momentic project file at ${Tc.resolve(Wl)}`)});dr.command("app").addOption(bn).addOption(En).addOption(yi).addOption(Bv).addOption(Nr).addOption(Hv).addOption(jv).addOption(Gv).action(async t=>{await ur(J),J.setApp("desktop-server");let{apiKey:e,yes:r,server:n,pixelRatio:o,disableCache:i,saveCache:a,regenerateCache:s}=t;Zb({disableCache:i,saveCache:a,regenerateCache:s});let c=await Nt({configFilePath:t.config,nameFilter:void 0}),{errors:l,parsingErrors:u,failedTestFilePaths:d,failedModuleFilePaths:p,parsingErrorDetails:m}=await Xd({project:c,fix:!1});u>0?(Nl({parsingErrors:u,parsingErrorDetails:m,failedTestFilePaths:d,failedModuleFilePaths:p}),process.exit(1)):l>0&&(v.error(`Found ${l} errors`),v.warn("To fix these errors automatically, run the duplicate-ids check with the --fix flag and then commit the resulting changes"),process.exit(1)),b_(J);let g=new pt({baseUrl:n,apiKey:e,logger:J});await Xg({client:g,skipPrompts:r});let h=CB(import.meta.url),f=Tc.dirname(h),S=Tc.resolve(f,"..","static"),b=Tc.resolve(f,"..","assets"),y=o??Zv();Qv(y),await sF({momenticServerUrl:n,apiKey:e,serverPort:ff,appPort:ff,staticDir:S,assetsDir:b,devicePixelRatio:y,regenerateCache:s??!1,noCache:i??!1,alwaysSaveCache:a??!1,initialProject:c});let T=`http://localhost:${ff}`;await m7(T)});dr.command("mcp").description("Start the MCP server over stdio.").addOption(bn).addOption(En).addOption(yi).addOption(Nr).addOption(GF).addOption(CF).action(async t=>{await ur(J),J.setApp("mcp");let{apiKey:e,server:r,yes:n,headfulBrowser:o}=t,i=o!==void 0?o:Lv(process.env.MOMENTIC_HEADFUL_BROWSER)??!1;v.setMinLevel("error");let a=await Nt({configFilePath:t.config,nameFilter:void 0}),{errors:s,parsingErrors:c,failedTestFilePaths:l,failedModuleFilePaths:u,parsingErrorDetails:d}=await Xd({project:a,fix:!1});c>0?(Nl({parsingErrors:c,parsingErrorDetails:d,failedTestFilePaths:l,failedModuleFilePaths:u}),process.exit(1)):s>0&&(v.error(`Found ${s} errors`),v.warn("To fix these errors automatically, run the duplicate-ids check with the --fix flag and then commit the resulting changes"),process.exit(1));let p=new pt({baseUrl:r,apiKey:e,logger:J});await Xg({client:p,skipPrompts:n});let m=t.outputMode==="inline"?"inline":"file";await xv({project:a,logger:J,apiKey:e,serverUrl:r,cliVersion:tn??"0.0.0",outputMode:m,headfulBrowserDefault:i})});var IB=dr.command("queue").description("Queue tests or suites to run on Momentic Cloud");IB.command("suites").description("Run one or more suites on Momentic Cloud").addOption(bn).addOption(En).addOption(Nv).addOption(Dv).addOption(yi).addArgument(BF).addOption(Ef).addOption(bf).addOption(yf).action(async(t,e)=>{await ur(J);let{apiKey:r,server:n,wait:o,waitTimeout:i,env:a,urlOverride:s}=e,c=Sf(e.customHeaders),l=new pt({baseUrl:n,apiKey:r,logger:J});(!t||!Array.isArray(t)||!t.length)&&(v.error("Must pass at least one suite to run."),process.exit(1));let{orgId:u}=await l.getAuthInfo();await QF({client:l,orgId:u,wait:o,suitePaths:t,waitTimeout:i,env:a,urlOverride:s,customHeaders:c}),await bi()});IB.command("tests").description("Run one or more tests on Momentic Cloud").addOption(bn).addOption(En).addOption(yi).addOption(yf).addOption(zv).addOption(Ef).addOption(bf).addOption(new Dr("--all","Run all tests.").default(!1)).addOption(Nv).addOption(Dv).addArgument(UF).action(async(t,e)=>{await ur(J);let{all:r,apiKey:n,env:o,server:i,inputCsv:a,urlOverride:s,wait:c,waitTimeout:l,yes:u}=e,d=Sf(e.customHeaders);for(let h of t)(h.endsWith(".yaml")||If.existsSync(h))&&v.warn("Are you trying to run a test on your local machine? If so, please use the 'run' command instead of the 'queue' command");let p=new pt({baseUrl:i,apiKey:n,logger:J}),{orgId:m}=await p.getAuthInfo(),g;a&&(g=await eA(a)),await eB({client:p,orgId:m,tests:t,all:r,customHeaders:d,env:o,urlOverride:s,wait:c,waitTimeout:l,testInputMatrix:g,yes:u}),await bi(),process.exit(0)});var g7=dr.command("list").description("List test paths");g7.addOption(Nr).addOption(ga).addOption(Uv).addOption(Fv).addOption(new Dr("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(Vv).action(async(t,e)=>{let r=await Nt({configFilePath:e.config,nameFilter:e.filter}),n=await ce(r),o=await Sc({tests:t,momenticFiles:n,yes:!0,project:r,include:e.include,exclude:e.exclude,labels:e.labels,logger:new Wa(40,{})});v.info(o.map(i=>i.relativeFilePath).join(`
|
|
5110
5110
|
`)),process.exit(0)});var h7=dr.command("run").alias("test").description("Run tests on the local machine");h7.addOption(bn).addOption(En).addOption(Nr).addOption(ga).addOption(yi).addOption(yf).addOption(zv).addOption(Hv).addOption(jv).addOption(Gv).addOption(OF).addOption(kF).addOption(LF).addOption(NF).addOption(DF).addOption(bf).addOption(Ef).addOption(Bv).addOption(new Dr("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new Dr("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new Dr("--wait-on-proxy <waitOnProxy>","HTTP proxy to use with the --wait-on command. Specify as https://username:pass@domain.com:2345")).addOption(new Dr("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.").default(60).argParser(lo)).addOption(new Dr("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.").argParser(lo)).addOption(new Dr("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(lo)).addOption(new Dr("--labels <labels...>","Only run tests with the specified label(s).")).addOption(jF).addOption(new Dr("--update-golden-files","Update locally stored golden files for steps that this is enabled for.").default(!1)).addOption(wF).addOption(xF).addOption(kv).addOption(_F).addOption(PF).addOption(IF).addOption(Uv).addOption(Fv).addOption(HF).addArgument(Vv).action(async(t,e)=>{await ur(J);let{disableCache:r,saveCache:n,regenerateCache:o,name:i}=e;Zb({disableCache:r,saveCache:n,regenerateCache:o}),FM({shardIndex:e.shardIndex,shardCount:e.shardCount});let a=Sf(e.customHeaders),s=await Nt({configFilePath:e.config,nameFilter:e.filter}),c=e.parallel??s.config.parallel??1;RB().length<c*2&&v.warn(`You requested to run tests in parallel ${c} at a time on a machine with ${RB().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`),v.debug({projectName:s.config.name},"Identified project config");let{errors:l,parsingErrors:u,parsingErrorDetails:d,failedTestFilePaths:p,failedModuleFilePaths:m}=await Xd({project:s,fix:!1});u>0?(Nl({parsingErrors:u,parsingErrorDetails:d,failedTestFilePaths:p,failedModuleFilePaths:m}),process.exit(1)):l>0&&(v.error(`Found ${l} errors`),v.warn("To fix these errors automatically, run the duplicate-ids check with the --fix flag and then commit the resulting changes"),process.exit(1));let g=new pt({baseUrl:e.server,apiKey:e.apiKey,logger:J});v.debug("Checking API key and dependencies");let{orgId:h,userId:f}=await Xg({client:g,skipPrompts:e.yes});v.debug("API key check and browser installation complete");let S=e.outputDir??s.config.outputDir,b=e.reporterDir??s.config.reporterDir,y=d7(),T=J.child({cliVersion:tn,orgId:h,userId:f,runGroupId:y}),w=await Ir(J,g,s);T.info({gitMetadata:w,config:s.config,nodeVersion:process.versions.node},"Got local metadata");let P;e.inputCsv&&(P=await eA(e.inputCsv));let A=e.pixelRatio??Zv();Qv(A);try{let x=await TB({...e,suiteName:i,parallel:c,retriesOverride:e.retries,devicePixelRatio:A,tests:t,project:s,client:g,outputDir:S,uploadResults:e.uploadResults,reporterDir:b,customHeaders:a,envName:e.env,orgId:h,testInputMatrix:P,logger:T,regenerateGoldenFiles:e.updateGoldenFiles,gitMetadata:w,cacheOptions:{regenerateCache:o??!1,alwaysSaveCache:n??!1,noCache:r??!1,bustOldestCachePercentage:e.bustOldestCachePercentage},recordVideo:e.recordVideo??s.config.recordVideo,runGroupId:y,timeoutMinutes:e.timeoutMinutes});await bi(),x.failed>0?process.exit(1):process.exit(0)}catch(x){v.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),v.error(x),await bi(),process.exit(1)}});var f7=dr.command("apply").description("Apply an operation to local resources");f7.command("patch").addOption(bn).addOption(En).addOption(Nr).addOption(ga).addOption(yi).addOption(new Dr("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new Dr("--to <to>","Name or ID of the test to apply the patch to").makeOptionMandatory()).action(async t=>{await ur(J);let{apiKey:e,server:r,config:n,yes:o}=t,i=await Nt({configFilePath:n}),a=J,s=new pt({baseUrl:r,apiKey:e,logger:a}),c=await ce(i),l=c.tests[t.to]??Object.values(c.tests).find(d=>st(d.name)===t.to.trim());l||(v.error(`No test matching '${t.to}' could be found in the current project.`),process.exit(1));let u=await s.fetchTestFragment(t.from);await gF({client:s,test:l,fragment:u,yes:o,entities:c,logger:J}),process.exit(0)});var oA=dr.command("results").description("Merge and upload test results.");oA.command("merge").description("Merge test results files.").addOption(kv).addArgument(zF).action(async(t,e)=>{await ur(J);let{outputDir:r}=e;r||(v.error("Output directory is required."),process.exit(1)),If.existsSync(t)||(v.warn("Results path does not exist, skipping merge."),process.exit(0)),If.existsSync(r)&&v.warn(`Output directory ${r} already exists, removing before merging...`),EL(J,r,t)});oA.command("upload").description("Upload test results to Momentic cloud.").addOption(bn).addOption(En).addArgument($v).action(async(t,e)=>{await ur(J);let{apiKey:r,server:n}=e,o=J,i=new pt({baseUrl:n,apiKey:r,logger:o});await eh({consoleLogger:v,resultsPath:t,client:i}),process.exit(0)});oA.command("view").description("Launch the run viewer to view test results in your current directory.").addOption(new Dr("--port <port>",`Port to run the backend server on. Defaults to ${lm}.`).argParser(lo)).addArgument($v).addArgument(new l7("<runId>","Run ID to open in the viewer.").argOptional()).action(async(t,e,r)=>{await ur(J),J.setApp("local-run-viewer");let n=CB(import.meta.url),o=Tc.dirname(n),i=Tc.resolve(o,"..","run-viewer-static");await Mv({staticDir:i,resultsPath:t,runId:e,port:r.port})});var iA=dr.command("quarantine").description("Manage test quarantines");iA.command("add").description("Add a test to the quarantine. This will prevent it from running.").addOption(bn).addOption(En).addOption(Nr).addOption(ga).addOption(Wv).addArgument(qv).action(async(t,e)=>{await ur(J);let{apiKey:r,server:n,config:o,reason:i}=e,a=J,s=await Nt({configFilePath:o}),c=new pt({baseUrl:n,apiKey:r,logger:a}),l=await Ir(J,c,s);await WF({test:t,reason:i,apiClient:c,project:s,logger:a,identity:l})});iA.command("list").description("List quarantined tests.").addOption(bn).addOption(En).addOption(Nr).addOption(ga).action(async t=>{let{apiKey:e,server:r,config:n}=t,o=J,i=await Nt({configFilePath:n}),a=new pt({baseUrl:r,apiKey:e,logger:o});await XF({apiClient:a,project:i})});iA.command("remove").description("Remove a test from the quarantine. This will allow it to run again.").addOption(bn).addOption(En).addOption(Nr).addOption(ga).addOption(Wv).addArgument(qv).action(async(t,e)=>{await ur(J);let{apiKey:r,server:n,config:o,reason:i}=e,a=J,s=await Nt({configFilePath:o}),c=new pt({baseUrl:n,apiKey:r,logger:a}),l=await Ir(J,c,s);await JF({test:t,reason:i,apiClient:c,project:s,identity:l})});dr.command("upgrade").description("Upgrade your configuration to the latest recommended settings").addOption(Nr).addOption(ga).action(async t=>{let e=await Nt({configFilePath:t.config,nameFilter:t.filter});v.info("Updating Momentic version in package.json..."),await vB(),v.info("Updating project configuration..."),AB(e),v.success("Your project configuration was successfully updated to the latest recommended settings."),v.info("You can optionally run tests with the `--regenerate-cache` flag to entirely rebuild caches with the newer configuration. Warning: using this option will cause all steps to run without any cached data, resulting in significantly longer execution times.")});async function S7(){xB("Main program started");try{await dr.parseAsync(process.argv),await bi()}catch(t){let e={};try{e.playwrightVersion=u7("npx playwright --version").toString()}catch(r){J.error({err:r},"Error fetching debug information")}J.error({err:t,debugInfo:e},"Uncaught error in CLI"),v.error(t),await bi(),process.exit(1)}}p7.setMaxListeners(25);process.on("warning",t=>{J.warn({err:t},`Node warning received on CLI: ${t.message}`)});xB("CLI parsing setup complete");S7();
|
|
5111
5111
|
//# sourceMappingURL=cli.js.map
|
|
5112
|
-
//# debugId=
|
|
5112
|
+
//# debugId=d314727f-a64e-5dbe-a217-ea3e84717376
|