momentic-mobile 0.35.3 → 0.35.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js CHANGED
@@ -1,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]="a4555179-f0fc-5283-84fa-75548e31f278")}catch(e){}}();
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]="17a80d9e-f007-5f8d-a9d4-fa1a6bfad22e")}catch(e){}}();
4
4
  var XD=Object.defineProperty;var yt=(r,e)=>()=>(r&&(e=r(r=0)),e);var JD=(r,e)=>{for(var t in e)XD(r,t,{get:e[t],enumerable:!0})};var Cw,xw=yt(()=>{"use strict";Cw=typeof globalThis=="object"?globalThis:global});var _w=yt(()=>{"use strict";xw()});var Mw=yt(()=>{"use strict";_w()});var co,ff=yt(()=>{"use strict";co="1.9.0"});function lG(r){var e=new Set([r]),t=new Set,n=r.match(Iw);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===r};function i(s){return t.add(s),!1}function a(s){return e.add(s),!0}return function(c){if(e.has(c))return!0;if(t.has(c))return!1;var l=c.match(Iw);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 Iw,Pw,Ow=yt(()=>{"use strict";ff();Iw=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;Pw=lG(co)});function gs(r,e,t,n){var o;n===void 0&&(n=!1);var i=Tc[Ec]=(o=Tc[Ec])!==null&&o!==void 0?o:{version:co};if(!n&&i[r]){var a=new Error("@opentelemetry/api: Attempted duplicate registration of API: "+r);return t.error(a.stack||a.message),!1}if(i.version!==co){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+r+" does not match previously registered API v"+co);return t.error(a.stack||a.message),!1}return i[r]=e,t.debug("@opentelemetry/api: Registered a global for "+r+" v"+co+"."),!0}function uo(r){var e,t,n=(e=Tc[Ec])===null||e===void 0?void 0:e.version;if(!(!n||!Pw(n)))return(t=Tc[Ec])===null||t===void 0?void 0:t[r]}function hs(r,e){e.debug("@opentelemetry/api: Unregistering a global for "+r+" v"+co+".");var t=Tc[Ec];t&&delete t[r]}var cG,Ec,Tc,vc=yt(()=>{"use strict";Mw();ff();Ow();cG=co.split(".")[0],Ec=Symbol.for("opentelemetry.js.api."+cG),Tc=Cw});function Ac(r,e,t){var n=uo("diag");if(n)return t.unshift(e),n[r].apply(n,dG([],uG(t),!1))}var uG,dG,Lw,Nw=yt(()=>{"use strict";vc();uG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},dG=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},Lw=function(){function r(e){this._namespace=e.namespace||"DiagComponentLogger"}return r.prototype.debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Ac("debug",this._namespace,e)},r.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Ac("error",this._namespace,e)},r.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Ac("info",this._namespace,e)},r.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Ac("warn",this._namespace,e)},r.prototype.verbose=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Ac("verbose",this._namespace,e)},r}()});var dt,Nd=yt(()=>{"use strict";(function(r){r[r.NONE=0]="NONE",r[r.ERROR=30]="ERROR",r[r.WARN=50]="WARN",r[r.INFO=60]="INFO",r[r.DEBUG=70]="DEBUG",r[r.VERBOSE=80]="VERBOSE",r[r.ALL=9999]="ALL"})(dt||(dt={}))});function Dw(r,e){r<dt.NONE?r=dt.NONE:r>dt.ALL&&(r=dt.ALL),e=e||{};function t(n,o){var i=e[n];return typeof i=="function"&&r>=o?i.bind(e):function(){}}return{error:t("error",dt.ERROR),warn:t("warn",dt.WARN),info:t("info",dt.INFO),debug:t("debug",dt.DEBUG),verbose:t("verbose",dt.VERBOSE)}}var kw=yt(()=>{"use strict";Nd()});var mG,pG,gG,Dn,Rc=yt(()=>{"use strict";Nw();kw();Nd();vc();mG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},pG=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},gG="diag",Dn=function(){function r(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=uo("diag");if(s)return s[o].apply(s,pG([],mG(i),!1))}}var t=this,n=function(o,i){var a,s,c;if(i===void 0&&(i={logLevel:dt.INFO}),o===t){var l=new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");return t.error((a=l.stack)!==null&&a!==void 0?a:l.message),!1}typeof i=="number"&&(i={logLevel:i});var u=uo("diag"),d=Dw((s=i.logLevel)!==null&&s!==void 0?s:dt.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 gs("diag",d,t,!0)};t.setLogger=n,t.disable=function(){hs(gG,t)},t.createComponentLogger=function(o){return new Lw(o)},t.verbose=e("verbose"),t.debug=e("debug"),t.info=e("info"),t.warn=e("warn"),t.error=e("error")}return r.instance=function(){return this._instance||(this._instance=new r),this._instance},r}()});var Fw,Uw=yt(()=>{"use strict";Fw=Symbol("BaggageEntryMetadata")});function Sf(r){return typeof r!="string"&&(hG.error("Cannot create baggage metadata from unknown type: "+typeof r),r=""),{__TYPE__:Fw,toString:function(){return r}}}var hG,Bw=yt(()=>{"use strict";Rc();Uw();hG=Dn.instance()});function yf(r){return Symbol.for(r)}var fG,bf,Ef=yt(()=>{"use strict";fG=function(){function r(e){var t=this;t._currentContext=e?new Map(e):new Map,t.getValue=function(n){return t._currentContext.get(n)},t.setValue=function(n,o){var i=new r(t._currentContext);return i._currentContext.set(n,o),i},t.deleteValue=function(n){var o=new r(t._currentContext);return o._currentContext.delete(n),o}}return r}(),bf=new fG});function Af(){return vf}var Ki,SG,Dd,yG,bG,EG,TG,Tf,vG,AG,RG,vf,wG,CG,xG,_G,MG,IG,PG,Rf=yt(()=>{"use strict";Ki=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),SG=function(){function r(){}return r.prototype.createGauge=function(e,t){return CG},r.prototype.createHistogram=function(e,t){return xG},r.prototype.createCounter=function(e,t){return wG},r.prototype.createUpDownCounter=function(e,t){return _G},r.prototype.createObservableGauge=function(e,t){return IG},r.prototype.createObservableCounter=function(e,t){return MG},r.prototype.createObservableUpDownCounter=function(e,t){return PG},r.prototype.addBatchObservableCallback=function(e,t){},r.prototype.removeBatchObservableCallback=function(e){},r}(),Dd=function(){function r(){}return r}(),yG=function(r){Ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(Dd),bG=function(r){Ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(Dd),EG=function(r){Ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(Dd),TG=function(r){Ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(Dd),Tf=function(){function r(){}return r.prototype.addCallback=function(e){},r.prototype.removeCallback=function(e){},r}(),vG=function(r){Ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Tf),AG=function(r){Ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Tf),RG=function(r){Ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Tf),vf=new SG,wG=new yG,CG=new EG,xG=new TG,_G=new bG,MG=new vG,IG=new AG,PG=new RG});var Lr,zw=yt(()=>{"use strict";(function(r){r[r.INT=0]="INT",r[r.DOUBLE=1]="DOUBLE"})(Lr||(Lr={}))});var OG,LG,Gw,Hw=yt(()=>{"use strict";Ef();OG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},LG=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},Gw=function(){function r(){}return r.prototype.active=function(){return bf},r.prototype.with=function(e,t,n){for(var o=[],i=3;i<arguments.length;i++)o[i-3]=arguments[i];return t.call.apply(t,LG([n],OG(o),!1))},r.prototype.bind=function(e,t){return t},r.prototype.enable=function(){return this},r.prototype.disable=function(){return this},r}()});var NG,DG,wf,kG,Ww,jw=yt(()=>{"use strict";Hw();vc();Rc();NG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},DG=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},wf="context",kG=new Gw,Ww=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalContextManager=function(e){return gs(wf,e,Dn.instance())},r.prototype.active=function(){return this._getContextManager().active()},r.prototype.with=function(e,t,n){for(var o,i=[],a=3;a<arguments.length;a++)i[a-3]=arguments[a];return(o=this._getContextManager()).with.apply(o,DG([e,t,n],NG(i),!1))},r.prototype.bind=function(e,t){return this._getContextManager().bind(e,t)},r.prototype._getContextManager=function(){return uo(wf)||kG},r.prototype.disable=function(){this._getContextManager().disable(),hs(wf,Dn.instance())},r}()});var fs,Vw=yt(()=>{"use strict";jw();fs=Ww.getInstance()});var Z,$w=yt(()=>{"use strict";Rc();Z=Dn.instance()});var FG,qw,Kw=yt(()=>{"use strict";Rf();FG=function(){function r(){}return r.prototype.getMeter=function(e,t,n){return vf},r}(),qw=new FG});var Cf,Yw,Xw=yt(()=>{"use strict";Kw();vc();Rc();Cf="metrics",Yw=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalMeterProvider=function(e){return gs(Cf,e,Dn.instance())},r.prototype.getMeterProvider=function(){return uo(Cf)||qw},r.prototype.getMeter=function(e,t,n){return this.getMeterProvider().getMeter(e,t,n)},r.prototype.disable=function(){hs(Cf,Dn.instance())},r}()});var kd,Jw=yt(()=>{"use strict";Xw();kd=Yw.getInstance()});var rt=yt(()=>{"use strict";Bw();Ef();Nd();Rf();zw();Vw();$w();Jw()});import xSe,{multistream as MSe}from"pino";import PSe from"pino-pretty";import{z as Sg}from"zod";var q6=Sg.object({input:Sg.string(),agentConfigVersion:Sg.string().optional()}),_u="finish";import{z as Ut}from"zod";var X6=Ut.object({srcs:Ut.array(Ut.string()),urls:Ut.array(Ut.string()),desiredSrc:Ut.string().optional(),desiredUrl:Ut.string().optional()}),dE=Ut.object({srcRegex:Ut.string().optional(),urlRegex:Ut.string().optional()}),mE=Ut.object({x:Ut.number(),y:Ut.number(),correlation:Ut.number()}),J6=Ut.object({searchImageBase64String:Ut.string(),pageImageBase64String:Ut.string(),id:Ut.string().uuid(),timeoutMs:Ut.number().max(1e4).min(0).optional()});import{z as L}from"zod";import*as G from"zod";import{extendZodWithOpenApi as ZD}from"zod-openapi";import ml from"zod";var pl=ml.object({updatedAt:ml.coerce.date().optional()}),Aa=ml.object({contentType:ml.enum(["image/jpeg","image/png"]),id:ml.string()});ZD(G);var Qn=(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))(Qn||{}),QD=G.object({mPathSelectorTokens:G.string().array(),frameSrcRegex:G.string().optional(),frameUrlRegex:G.string().optional(),indices:G.number().array()}),gl=G.object({result:G.number(),traceId:G.string()}).array(),eo=G.object({type:G.literal("GCS_TRACES"),traces:gl}),ur=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(ur||{}),pE=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(ur)}).optional(),shape:G.object({width:G.number(),height:G.number(),tolerance:G.nativeEnum(ur)}).optional(),boundingBox:G.object({x:G.number(),y:G.number(),width:G.number(),height:G.number()}).optional()}),ek=G.object({selectors:G.string().array(),requirements:pE.optional(),relativeAngleRadians:G.number().min(0).max(2*Math.PI).optional(),relativeDistance:G.number().optional()}),vo=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:pE.optional(),additionalElements:ek.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(Aa.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:QD.optional(),inputDescription:G.string().optional().describe("the description that generated this cache"),targetSource:G.nativeEnum(Qn).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:eo.optional()}).openapi({ref:"ElementTargetCache"});function Ra(r){return!!(r.serializedHtml||r.screenshotUrl||r.generatedSelectors||r.hybridSelector)}var tk=G.object({type:G.literal("description"),elementDescriptor:G.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),rk=G.object({x:G.number(),y:G.number()}),nk=G.object({type:G.literal("coordinates"),pixels:rk}).openapi({ref:"CoordinatesTarget"});function Ao(r){return r.type==="description"}function Rn(r){return r.type==="coordinates"}var nr=G.discriminatedUnion("type",[tk,nk]).openapi({ref:"ElementTarget"});function yg(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function gE(r){return eo.safeParse(r).success}import{v4 as qe}from"uuid";import*as A from"zod";import{extendZodWithOpenApi as gk}from"zod-openapi";import{z as Pe}from"zod";import{extendZodWithOpenApi as ok}from"zod-openapi";import{z as hl}from"zod";var fl=hl.object({result:hl.boolean(),traceId:hl.string()}).array(),yi=hl.object({type:hl.literal("GCS_TRACES"),traces:fl}),bg=pl.extend({memory:yi.optional()});ok(Pe);var hE=Pe.object({thoughts:Pe.string(),result:Pe.boolean(),relevantElements:Pe.array(Pe.number()).optional(),updatedMemory:fl.optional()}),zr=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(zr||{});var ik=Pe.object({type:Pe.literal("ELEMENT_NAME"),negated:Pe.boolean().optional(),operation:Pe.nativeEnum(zr),value:Pe.string()}).openapi({ref:"ElementNameAssertion"}),ak=Pe.object({type:Pe.literal("ELEMENT_STYLE"),negated:Pe.boolean().optional(),operation:Pe.nativeEnum(zr),property:Pe.string(),value:Pe.string()}).openapi({ref:"ElementStyleAssertion"}),sk=Pe.object({type:Pe.literal("ELEMENT_CONTENT"),negated:Pe.boolean().optional(),operation:Pe.nativeEnum(zr),value:Pe.string()}).openapi({ref:"ElementContentAssertion"}),lk=Pe.object({type:Pe.literal("ELEMENT_ATTRIBUTE"),negated:Pe.boolean().optional(),operation:Pe.nativeEnum(zr),attr:Pe.string(),value:Pe.string()}).openapi({ref:"ElementAttributeValueAssertion"}),wn=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(wn||{});var ck=Pe.object({type:Pe.literal("ELEMENT_EXISTENCE"),negated:Pe.boolean().optional(),condition:Pe.nativeEnum(wn).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Mu=Pe.discriminatedUnion("type",[sk,lk,ck,ik,ak]).openapi({ref:"ManualElementAssertion"});var uk=Pe.object({type:Pe.literal("CONTENT"),negated:Pe.boolean().optional(),value:Pe.string()}).openapi({ref:"PageContentAssertion"}),fE=Pe.discriminatedUnion("type",[uk]).openapi({ref:"ManualPageAssertion"});import dr from"zod";var Eg=dr.discriminatedUnion("type",[dr.object({type:dr.literal("SUBSTRING"),url:dr.string()}),dr.object({type:dr.literal("GLOB"),glob:dr.string()}),dr.object({type:dr.literal("REGEX"),regex:dr.string()}),dr.object({type:dr.literal("DOMAIN"),domain:dr.string()})]),Cn=dr.object({urlMatcher:Eg,method:dr.string().optional()});import{z as Ce}from"zod";var dk=Ce.object({type:Ce.literal("json"),content:Ce.string().describe("The JSON content to send in the request body")}),mk=Ce.object({type:Ce.literal("form-urlencoded"),content:Ce.record(Ce.string(),Ce.string()).describe("The form fields to send in the request body")}),pk=Ce.discriminatedUnion("type",[dk,mk]),bi=Ce.object({url:Ce.string(),method:Ce.union([Ce.literal("GET"),Ce.literal("POST"),Ce.literal("PUT"),Ce.literal("DELETE"),Ce.literal("PATCH")]),headers:Ce.record(Ce.string(),Ce.string()).optional(),params:Ce.record(Ce.string(),Ce.string()).optional(),body:pk.optional(),timeout:Ce.number().int().optional().describe("Max seconds to wait for the request to complete")}),SE=Ce.object({url:Ce.string(),headers:Ce.record(Ce.string(),Ce.string()).optional(),query:Ce.string(),variables:Ce.string().optional(),timeout:Ce.number().int().optional().describe("Max seconds to wait for the request to complete")}),Iu=Ce.object({code:Ce.string(),fragment:Ce.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:Ce.union([Ce.literal("NODE"),Ce.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:Ce.number().int().max(60).optional().describe("Max seconds for the code to complete")});var vt=(ie=>(ie.AI_EXTRACT="AI_EXTRACT",ie.AI_ASSERTION="AI_ASSERTION",ie.AUTH_LOAD="AUTH_LOAD",ie.AUTH_SAVE="AUTH_SAVE",ie.BLUR="BLUR",ie.CAPTCHA="CAPTCHA",ie.CLICK="CLICK",ie.COOKIE="COOKIE",ie.COPY="COPY",ie.DIALOG="DIALOG",ie.DRAG="DRAG",ie.ELEMENT_CHECK="ELEMENT_CHECK",ie.FILE_UPLOAD="FILE_UPLOAD",ie.FOCUS="FOCUS",ie.GO_BACK="GO_BACK",ie.GO_FORWARD="GO_FORWARD",ie.HOVER="HOVER",ie.JAVASCRIPT="JAVASCRIPT",ie.LOCAL_STORAGE="LOCAL_STORAGE",ie.MOUSE_DRAG="MOUSE_DRAG",ie.NAVIGATE="NAVIGATE",ie.NEW_TAB="NEW_TAB",ie.PAGE_CHECK="PAGE_CHECK",ie.PASTE="PASTE",ie.PRESS="PRESS",ie.KEY_DOWN="KEY_DOWN",ie.KEY_UP="KEY_UP",ie.REFRESH="REFRESH",ie.REQUEST="REQUEST",ie.GRAPHQL_REQUEST="GRAPHQL_REQUEST",ie.SCROLL_DOWN="SCROLL_DOWN",ie.SCROLL_UP="SCROLL_UP",ie.SCROLL_LEFT="SCROLL_LEFT",ie.SCROLL_RIGHT="SCROLL_RIGHT",ie.SELECT_OPTION="SELECT_OPTION",ie.SWITCH_TAB="TAB",ie.TYPE="TYPE",ie.VISUAL_DIFF="VISUAL_DIFF",ie.WAIT="WAIT",ie.WAIT_FOR_URL="WAIT_FOR_URL",ie.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",ie.AWAIT_LISTENER="AWAIT_LISTENER",ie.RECORD_REQUESTS="RECORD_REQUESTS",ie.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",ie.SET_HEADER="SET_HEADER",ie.MOCK_ROUTE="MOCK_ROUTE",ie.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",ie.OFFLINE_MODE="OFFLINE_MODE",ie.SUCCESS="SUCCESS",ie))(vt||{});gk(A);var ce=A.object({thoughts:A.string().optional(),id:A.string().uuid().describe("unique identifier to this step, used for step cache")}),Gr=A.object({useSelector:A.boolean().optional(),force:A.boolean().optional(),disableCache:A.boolean().optional().describe("disable element caching for this step"),iframeUrl:A.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),Hr=pl.extend({target:vo}).optional().openapi({ref:"SingleTargetCache"});function Pu(r){return!!r&&Hr.safeParse(r).success}var Ou=A.object({loadTimeout:A.number().int().max(60).optional().describe("Max seconds for the page to load")}),yE=ce.merge(Ou).merge(A.object({type:A.literal("NAVIGATE"),url:A.string()})).openapi({ref:"NavigateCommand"}),Lu=Gr.merge(A.object({cache:Hr})),Ei=ce.merge(Lu.merge(A.object({target:nr.optional(),type:A.literal("SCROLL_UP"),deltaY:A.number().optional()}))).openapi({ref:"ScrollUpCommand"}),Ti=ce.merge(Lu.merge(A.object({target:nr.optional(),type:A.literal("SCROLL_DOWN"),deltaY:A.number().optional()}))).openapi({ref:"ScrollDownCommand"}),wa=ce.merge(Lu.merge(A.object({target:nr.optional(),type:A.literal("SCROLL_LEFT"),deltaX:A.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Ca=ce.merge(Lu.merge(A.object({target:nr.optional(),type:A.literal("SCROLL_RIGHT"),deltaX:A.number().optional()}))).openapi({ref:"ScrollRightCommand"}),O8=A.discriminatedUnion("type",[Ei,Ti,wa,Ca]).openapi({ref:"AllScrollCommands"}),hk=ce.merge(A.object({type:A.literal("DIALOG"),action:A.union([A.literal("ACCEPT"),A.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),bE=ce.merge(A.object({type:A.literal("WAIT"),delay:A.number()})).openapi({ref:"WaitCommand"}),fk=A.object({caseInsensitive:A.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:A.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:A.number().int().optional().describe("Max seconds to wait for the URL to match")}),EE=ce.extend({type:A.literal("WAIT_FOR_URL"),matcher:Eg}).merge(fk).openapi({ref:"WaitUrlCommand"}),TE=ce.merge(Ou).merge(A.object({type:A.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),vE=ce.merge(A.object({type:A.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),AE=ce.merge(A.object({type:A.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),Sk=ce.extend({type:A.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),yk=ce.extend({type:A.literal("AUTH_LOAD"),storageState:A.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),vg=ce.merge(Gr).extend({type:A.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),RE=ce.extend({type:A.literal("COPY"),value:A.string()}).openapi({ref:"CopyCommand"}),wE=ce.extend({type:A.literal("PASTE")}).openapi({ref:"PasteCommand"}),CE=ce.merge(Iu).extend({type:A.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),xa=ce.merge(Gr).extend({type:A.literal("CLICK"),target:nr,doubleClick:A.boolean().optional(),rightClick:A.boolean().optional(),waitForDownload:A.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:A.number().optional(),downloadTimeoutMs:A.number().optional(),cache:Hr,relativePosition:A.object({x:A.number(),y:A.number()}).optional()}).openapi({ref:"ClickCommand"}),xE=pl.extend({fromTarget:vo.optional(),toTarget:vo.optional()}),_a=ce.merge(Gr).merge(A.object({type:A.literal("DRAG"),fromTarget:nr,toTarget:nr,steps:A.number().optional(),hoverSeconds:A.number().optional().describe("Seconds to hover the object before dropping"),cache:xE.optional()})).openapi({ref:"DragCommand"}),Ma=ce.merge(Gr).merge(A.object({type:A.literal("MOUSE_DRAG"),target:nr.optional(),deltaX:A.string().describe("pixels to move horizontally, can be template"),deltaY:A.string().describe("pixels to move vertically, can be template"),steps:A.number().optional(),cache:Hr})).openapi({ref:"MouseDragCommand"}),Ia=ce.merge(Gr).merge(A.object({type:A.literal("HOVER"),target:nr,cache:Hr})).openapi({ref:"HoverCommand"}),Sl=ce.merge(Gr).merge(A.object({type:A.literal("FOCUS"),target:nr,cache:Hr})).openapi({ref:"FocusCommand"}),yl=ce.merge(Gr).extend({type:A.literal("BLUR"),target:nr.optional(),cache:Hr}).openapi({ref:"BlurCommand"}),bk=A.object({type:A.literal("URL"),url:A.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),Ek=A.object({type:A.literal("USER_FILE"),name:A.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),Tk=ce.extend({type:A.literal("FILE_UPLOAD"),fileSource:A.discriminatedUnion("type",[bk,Ek]),filename:A.string().optional()}).openapi({ref:"FileUploadCommand"}),_E=A.discriminatedUnion("type",[A.object({type:A.literal("VALUE"),value:A.string()}),A.object({type:A.literal("LABEL"),label:A.string()}),A.object({type:A.literal("INDEX"),index:A.coerce.string()})]),Pa=ce.merge(Gr).extend({type:A.literal("SELECT_OPTION"),target:nr,cache:Hr,choice:_E.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Ag=A.union([A.literal("MULTIMODAL"),A.literal("VISION_ONLY")]),bl=ce.merge(A.object({type:A.literal("AI_ASSERTION"),assertion:A.string(),disableCache:A.boolean().optional(),iframeUrl:A.string().optional(),contextChoice:Ag.optional(),timeout:A.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:bg.optional(),source:A.string().optional()})).openapi({ref:"AIAssertionCommand"}),mr=5,vi=600,Oa=ce.merge(Gr).extend({type:A.literal("ELEMENT_CHECK"),target:nr,assertion:Mu,cache:Hr.or(bg).optional(),timeout:A.number().int().min(0).max(vi).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),ME=ce.extend({type:A.literal("PAGE_CHECK"),assertion:fE,iframeUrl:A.string().optional().describe("url or url regex for the iframe"),timeout:A.number().int().min(0).max(vi).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),IE=ce.merge(A.object({type:A.literal("AI_EXTRACT"),goal:A.string(),schema:A.string().optional(),envKey:A.string().optional(),disableCache:A.boolean().optional(),iframeUrl:A.string().optional()})).openapi({ref:"AIExtractCommand"}),vk=A.object({clearContent:A.boolean().optional(),forceClearContent:A.boolean().optional(),delay:A.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:A.boolean().optional(),pressEnter:A.boolean().optional(),relativePosition:A.object({x:A.number(),y:A.number()}).optional()}),PE=25,La=ce.merge(Gr).merge(vk).extend({type:A.literal("TYPE"),target:nr.optional(),value:A.string(),cache:Hr}).openapi({ref:"TypeCommand"}),OE=ce.merge(A.object({type:A.literal("PRESS"),value:A.string(),repeat:A.number().optional(),convertMeta:A.boolean().optional(),delayMs:A.number().optional()})).openapi({ref:"PressCommand"}),LE=ce.merge(A.object({type:A.literal("KEY_DOWN"),value:A.string(),convertMeta:A.boolean().optional()})).openapi({ref:"KeyDownCommand"}),NE=ce.merge(A.object({type:A.literal("KEY_UP"),value:A.string(),convertMeta:A.boolean().optional()})).openapi({ref:"KeyUpCommand"}),Ak=A.object({type:A.literal("SUBSTRING"),substring:A.string()}),Rk=A.object({type:A.literal("REGEX"),pattern:A.string()}),wk=A.object({type:A.literal("INDEX"),index:A.coerce.string()}),Ck=A.discriminatedUnion("type",[Ak,Rk,wk]),xk=ce.merge(Ou).merge(A.object({type:A.literal("TAB"),action:Ck})).openapi({ref:"TabCommand"}),DE=ce.merge(Ou).merge(A.object({type:A.literal("NEW_TAB"),url:A.string()})).openapi({ref:"NewTabCommand"}),_k=ce.merge(A.object({type:A.literal("COOKIE"),value:A.string()})).openapi({ref:"CookieCommand"}),kE=ce.merge(A.object({type:A.literal("LOCAL_STORAGE"),key:A.string(),value:A.string()})).openapi({ref:"LocalStorageCommand"}),FE=ce.extend({type:A.literal("REQUEST")}).merge(bi).openapi({ref:"RequestCommand"}),El=A.object({status:A.number().optional(),headers:A.record(A.string(),A.string()),json:A.unknown().optional(),text:A.string().optional(),cookies:A.record(A.string(),A.unknown()).array().optional(),request:A.object({url:A.string(),method:A.string(),headers:A.record(A.string(),A.string()),json:A.unknown().optional()})}),UE=ce.extend({type:A.literal("GRAPHQL_REQUEST")}).merge(SE).openapi({ref:"GraphQLRequestCommand"}),BE=ce.merge(A.object({type:A.literal("SUCCESS"),condition:bl.optional()})).openapi({ref:"SuccessCommand"}),zE=ce.merge(A.object({type:A.literal("FAILURE")})).openapi({ref:"FailureCommand"}),Mk=A.object({data:A.union([A.string().describe("location at which to find a jpg - public URL or local"),Aa]),width:A.number(),height:A.number()});var Tl=ce.merge(Gr).merge(A.object({type:A.literal("VISUAL_DIFF"),threshold:A.number().optional().describe("default 0.1"),target:nr.optional(),screenshot:Mk.optional(),cache:Hr})).openapi({ref:"VisualDiffCommand"}),GE=ce.merge(A.object({type:A.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:Cn,key:A.string()})).openapi({ref:"RegisterRequestListenerCommand"}),Ik=ce.merge(A.object({type:A.literal("AWAIT_LISTENER"),key:A.string(),timeout:A.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),HE=ce.merge(A.object({type:A.literal("RECORD_REQUESTS"),requestMatcher:Cn,key:A.string()})).openapi({ref:"RecordRequestsCommand"}),Pk=ce.merge(A.object({type:A.literal("GET_RECORDED_REQUESTS"),key:A.string()})).openapi({ref:"GetRecordedRequestsCommand"}),WE=ce.merge(A.object({type:A.literal("SET_HEADER"),name:A.string(),value:A.string(),requestMatcher:Cn.optional()})).openapi({ref:"SetHeaderCommand"}),jE=ce.merge(A.object({type:A.literal("MOCK_ROUTE"),requestMatcher:Cn,responseGenerator:A.string().describe("JavaScript code to generate a response"),fetchOriginalResponse:A.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:A.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"})),Ok=ce.merge(A.object({type:A.literal("REMOVE_ROUTE_MOCK"),key:A.string().optional().describe("Key of the mock to remove. If not set, all route mocks will be removed.")}).openapi({ref:"RemoveRouteMockCommandOptions"})),Lk=ce.merge(A.object({type:A.literal("OFFLINE_MODE"),enable:A.boolean()})).openapi({ref:"OfflineModeCommand"}),Nk=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],L8=[...Nk,"DRAG"],Dk=A.discriminatedUnion("type",[xa,La,OE,LE,NE,Pa,yE,Ti,Ei,bl,vE,Ia,bE]),kk=A.discriminatedUnion("type",[...Dk.options,_a]),Fk=A.discriminatedUnion("type",[...kk.options]),VE=A.discriminatedUnion("type",[...Fk.options,BE]),Rg=A.discriminatedUnion("type",[BE,xa,La,OE,LE,NE,Pa,yE,Ti,Ei,bl,vE,Ia,bE,CE,Oa,ME,DE,EE,IE,RE,AE,kE,_a,Ma,wE,TE,FE,UE,WE,GE,HE,jE]),Uk=A.discriminatedUnion("type",[IE,yk,Sk,vg,_k,RE,hk,Oa,Tk,AE,CE,kE,Ma,DE,ME,wE,TE,FE,UE,wa,Ca,xk,Tl,Sl,yl,EE,GE,Ik,HE,Pk,WE,jE,Ok,Lk]),Na=A.discriminatedUnion("type",[...VE.options,...Uk.options]).openapi({ref:"Command"}),Nu=A.discriminatedUnion("type",[...VE.options,zE]),N8=A.discriminatedUnion("type",[...Rg.options,zE]);function ro(r){let e;switch(r){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:qe(),type:r};break;case"AUTH_LOAD":{e={id:qe(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:qe(),type:r,goal:""};break;case"DIALOG":e={id:qe(),type:r,action:"DISMISS"};break;case"DRAG":e={id:qe(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:qe(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:qe(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:qe(),type:r,delay:1};break;case"BLUR":e={id:qe(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:qe(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:qe(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:qe(),type:r,value:""};break;case"SELECT_OPTION":e={id:qe(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:qe(),type:r,url:""};case"TAB":e={id:qe(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:qe(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:qe(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:qe(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:qe(),type:r,code:""};break;case"AI_ASSERTION":e={id:qe(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:qe(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:qe(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:qe(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:qe(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:qe(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:qe(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:qe(),type:r,key:""};break}case"SET_HEADER":{e={id:qe(),type:r,name:"",value:""};break}case"MOCK_ROUTE":{e={id:qe(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:qe(),type:r};break}case"OFFLINE_MODE":{e={id:qe(),type:r,enable:!0};break}default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}return e}var F8={AI_ASSERTION:"AI Check",JAVASCRIPT:"JavaScript",PAGE_CHECK:"Page Check"};import{z as Bk}from"zod";var H8=Bk.discriminatedUnion("type",[yl,vg,xa,_a,Sl,Ia,Ma,Ei,Ti,wa,Ca,Pa,La,Tl,Oa]);import{z as zk}from"zod";import{z as Ro}from"zod";function vl(r){return Ro.object({key:Ro.string(),testId:Ro.string().optional(),moduleId:Ro.string().optional(),organizationId:Ro.string(),value:r})}function Al(r){return vl(r).extend({uniqueKey:Ro.string()})}function Du(r){return Ro.record(Ro.string(),Al(r))}var pr={type:!0,cache:!0},Da=zk.discriminatedUnion("type",[bl.pick(pr),yl.pick(pr),xa.pick(pr),_a.pick(pr),Oa.pick(pr),Sl.pick(pr),Ia.pick(pr),Ma.pick(pr),Ei.pick(pr),Ti.pick(pr),wa.pick(pr),Ca.pick(pr),Pa.pick(pr),La.pick(pr),Tl.pick(pr)]),wg=Object.values(vt).filter(r=>Da.options.some(e=>e.shape.type.safeParse(r).success));Na.options.forEach(r=>{if("target"in r.shape&&!wg.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});function Cg(r){return wg.includes(r.type)}var $E=vl(Da),qE=Al(Da),X8=Du(Da);import{v4 as JQ}from"uuid";import{z as w}from"zod";var YE=Symbol("Let zodToJsonSchema decide on which parser to use");var KE={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"},XE=r=>typeof r=="string"?{...KE,name:r}:{...KE,...r};var JE=r=>{let e=XE(r),t=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,flags:{hasReferencedOpenAiAnyType:!1},currentPath:t,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 xg(r,e,t,n){n?.errorMessages&&t&&(r.errorMessage={...r.errorMessage,[e]:t})}function ke(r,e,t,n,o){r[e]=t,xg(r,e,n,o)}var ku=(r,e)=>{let t=0;for(;t<r.length&&t<e.length&&r[t]===e[t];t++);return[(r.length-t).toString(),...e.slice(t)].join("/")};import{ZodFirstPartyTypeKind as Oe}from"zod";function pt(r){if(r.target!=="openAi")return{};let e=[...r.basePath,r.definitionPath,r.openAiAnyTypeName];return r.flags.hasReferencedOpenAiAnyType=!0,{$ref:r.$refStrategy==="relative"?ku(e,r.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as Gk}from"zod";function ZE(r,e){let t={type:"array"};return r.type?._def&&r.type?._def?.typeName!==Gk.ZodAny&&(t.items=de(r.type._def,{...e,currentPath:[...e.currentPath,"items"]})),r.minLength&&ke(t,"minItems",r.minLength.value,r.minLength.message,e),r.maxLength&&ke(t,"maxItems",r.maxLength.value,r.maxLength.message,e),r.exactLength&&(ke(t,"minItems",r.exactLength.value,r.exactLength.message,e),ke(t,"maxItems",r.exactLength.value,r.exactLength.message,e)),t}function QE(r,e){let t={type:"integer",format:"int64"};if(!r.checks)return t;for(let n of r.checks)switch(n.kind){case"min":e.target==="jsonSchema7"?n.inclusive?ke(t,"minimum",n.value,n.message,e):ke(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),ke(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?ke(t,"maximum",n.value,n.message,e):ke(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),ke(t,"maximum",n.value,n.message,e));break;case"multipleOf":ke(t,"multipleOf",n.value,n.message,e);break}return t}function eT(){return{type:"boolean"}}function Fu(r,e){return de(r.type._def,e)}var tT=(r,e)=>de(r.innerType._def,e);function _g(r,e,t){let n=t??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>_g(r,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 Hk(r,e)}}var Hk=(r,e)=>{let t={type:"integer",format:"unix-time"};if(e.target==="openApi3")return t;for(let n of r.checks)switch(n.kind){case"min":ke(t,"minimum",n.value,n.message,e);break;case"max":ke(t,"maximum",n.value,n.message,e);break}return t};function rT(r,e){return{...de(r.innerType._def,e),default:r.defaultValue()}}function nT(r,e){return e.effectStrategy==="input"?de(r.schema._def,e):pt(e)}function oT(r){return{type:"string",enum:Array.from(r.values)}}var Wk=r=>"type"in r&&r.type==="string"?!1:"allOf"in r;function iT(r,e){let t=[de(r.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),de(r.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter(i=>!!i),n=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return t.forEach(i=>{if(Wk(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 aT(r,e){let t=typeof r.value;return t!=="bigint"&&t!=="number"&&t!=="boolean"&&t!=="string"?{type:Array.isArray(r.value)?"array":"object"}:e.target==="openApi3"?{type:t==="bigint"?"integer":t,enum:[r.value]}:{type:t==="bigint"?"integer":t,const:r.value}}import{ZodFirstPartyTypeKind as Rl}from"zod";var Mg,pn={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:()=>(Mg===void 0&&(Mg=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),Mg),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 Uu(r,e){let t={type:"string"};if(r.checks)for(let n of r.checks)switch(n.kind){case"min":ke(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e);break;case"max":ke(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"email":switch(e.emailStrategy){case"format:email":gn(t,"email",n.message,e);break;case"format:idn-email":gn(t,"idn-email",n.message,e);break;case"pattern:zod":gr(t,pn.email,n.message,e);break}break;case"url":gn(t,"uri",n.message,e);break;case"uuid":gn(t,"uuid",n.message,e);break;case"regex":gr(t,n.regex,n.message,e);break;case"cuid":gr(t,pn.cuid,n.message,e);break;case"cuid2":gr(t,pn.cuid2,n.message,e);break;case"startsWith":gr(t,RegExp(`^${Ig(n.value,e)}`),n.message,e);break;case"endsWith":gr(t,RegExp(`${Ig(n.value,e)}$`),n.message,e);break;case"datetime":gn(t,"date-time",n.message,e);break;case"date":gn(t,"date",n.message,e);break;case"time":gn(t,"time",n.message,e);break;case"duration":gn(t,"duration",n.message,e);break;case"length":ke(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e),ke(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"includes":{gr(t,RegExp(Ig(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&gn(t,"ipv4",n.message,e),n.version!=="v4"&&gn(t,"ipv6",n.message,e);break}case"base64url":gr(t,pn.base64url,n.message,e);break;case"jwt":gr(t,pn.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&gr(t,pn.ipv4Cidr,n.message,e),n.version!=="v4"&&gr(t,pn.ipv6Cidr,n.message,e);break}case"emoji":gr(t,pn.emoji(),n.message,e);break;case"ulid":{gr(t,pn.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{gn(t,"binary",n.message,e);break}case"contentEncoding:base64":{ke(t,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{gr(t,pn.base64,n.message,e);break}}break}case"nanoid":gr(t,pn.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return t}function Ig(r,e){return e.patternStrategy==="escape"?Vk(r):r}var jk=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function Vk(r){let e="";for(let t=0;t<r.length;t++)jk.has(r[t])||(e+="\\"),e+=r[t];return e}function gn(r,e,t,n){r.format||r.anyOf?.some(o=>o.format)?(r.anyOf||(r.anyOf=[]),r.format&&(r.anyOf.push({format:r.format,...r.errorMessage&&n.errorMessages&&{errorMessage:{format:r.errorMessage.format}}}),delete r.format,r.errorMessage&&(delete r.errorMessage.format,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.anyOf.push({format:e,...t&&n.errorMessages&&{errorMessage:{format:t}}})):ke(r,"format",e,t,n)}function gr(r,e,t,n){r.pattern||r.allOf?.some(o=>o.pattern)?(r.allOf||(r.allOf=[]),r.pattern&&(r.allOf.push({pattern:r.pattern,...r.errorMessage&&n.errorMessages&&{errorMessage:{pattern:r.errorMessage.pattern}}}),delete r.pattern,r.errorMessage&&(delete r.errorMessage.pattern,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.allOf.push({pattern:sT(e,n),...t&&n.errorMessages&&{errorMessage:{pattern:t}}})):ke(r,"pattern",sT(e,n),t,n)}function sT(r,e){if(!e.applyRegexFlags||!r.flags)return r.source;let t={i:r.flags.includes("i"),m:r.flags.includes("m"),s:r.flags.includes("s")},n=t.i?r.source.toLowerCase():r.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(t.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(t.m){if(n[c]==="^"){o+=`(^|(?<=[\r
5
5
  ]))`;continue}else if(n[c]==="$"){o+=`($|(?=[\r
6
6
  ]))`;continue}}if(t.s&&n[c]==="."){o+=a?`${n[c]}\r
@@ -34,11 +34,11 @@ ${this.decisions.map(e=>e.toString()).join(`
34
34
  To resolve the conflict:`,gS(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
  `,pS(l,e),`To resolve the conflict:
37
- `,gS(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},r}();var u_=function(){function r(e){this._backingStorages=e}return r.prototype.record=function(e,t,n,o){this._backingStorages.forEach(function(i){i.record(e,t,n,o)})},r}();rt();rt();var d_=function(){function r(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new bn}return r.prototype.observe=function(e,t){if(t===void 0&&(t={}),typeof e!="number"){Z.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===Lr.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(t,e)},r}();var m_=function(){function r(){this._buffer=new Map}return r.prototype.observe=function(e,t,n){if(n===void 0&&(n={}),!!Hc(e)){var o=this._buffer.get(e);if(o==null&&(o=new bn,this._buffer.set(e,o)),typeof t!="number"){Z.warn("non-number value provided to metric "+e._descriptor.name+": "+t);return}e._descriptor.valueType===Lr.INT&&!Number.isInteger(t)&&(Z.warn("INT value type cannot accept a floating-point value for "+e._descriptor.name+", ignoring the fractional digits."),t=Math.trunc(t),!Number.isInteger(t))||o.set(n,t)}},r}();var fS=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},SS=function(r,e){var t={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(;t;)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 t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}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}}},p_=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},g_=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},h_=function(){function r(){this._callbacks=[],this._batchCallbacks=[]}return r.prototype.addCallback=function(e,t){var n=this._findCallback(e,t);n>=0||this._callbacks.push({callback:e,instrument:t})},r.prototype.removeCallback=function(e,t){var n=this._findCallback(e,t);n<0||this._callbacks.splice(n,1)},r.prototype.addBatchCallback=function(e,t){var n=new Set(t.filter(Hc));if(n.size===0){Z.error("BatchObservableCallback is not associated with valid instruments",t);return}var o=this._findBatchCallback(e,n);o>=0||this._batchCallbacks.push({callback:e,instruments:n})},r.prototype.removeBatchCallback=function(e,t){var n=new Set(t.filter(Hc)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},r.prototype.observe=function(e,t){return fS(this,void 0,void 0,function(){var n,o,i,a;return SS(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,t),o=this._observeBatchCallbacks(e,t),[4,px(g_(g_([],p_(n),!1),p_(o),!1))];case 1:return i=s.sent(),a=i.filter(gx).map(function(c){return c.reason}),[2,a]}})})},r.prototype._observeCallbacks=function(e,t){var n=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return fS(n,void 0,void 0,function(){var s,c;return SS(this,function(l){switch(l.label){case 0:return s=new d_(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),t!=null&&(c=$o(c,t)),[4,c];case 1:return l.sent(),a._metricStorages.forEach(function(u){u.record(s._buffer,e)}),[2]}})})})},r.prototype._observeBatchCallbacks=function(e,t){var n=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return fS(n,void 0,void 0,function(){var s,c;return SS(this,function(l){switch(l.label){case 0:return s=new m_,c=Promise.resolve(i(s)),t!=null&&(c=$o(c,t)),[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]}})})})},r.prototype._findCallback=function(e,t){return this._callbacks.findIndex(function(n){return n.callback===e&&n.instrument===t})},r.prototype._findBatchCallback=function(e,t){return this._batchCallbacks.findIndex(function(n){return n.callback===e&&hx(n.instruments,t)})},r}();var lj=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),f_=function(r){lj(e,r);function e(t,n,o,i,a){var s=r.call(this,t)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new fm(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new Sm(n,i),s}return e.prototype.record=function(t,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(t,n,o,i)},e.prototype.collect=function(t,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(t,this._instrumentDescriptor,o,n)},e}(hm);var S_=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Cs=function(){function r(){}return r.Noop=function(){return uj},r}();var cj=function(r){S_(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.process=function(t,n){return t},e}(Cs);var y_=function(r){S_(e,r);function e(t){var n=r.call(this)||this;return n._allowedAttributeNames=t,n}return e.prototype.process=function(t,n){var o=this,i={};return Object.keys(t).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=t[a]}),i},e}(Cs);var uj=new cj;var dj=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},mj=function(r,e){var t={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(;t;)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 t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}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}}},pj=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},b_=function(){function r(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new c_,this.observableRegistry=new h_,this.meter=new i_(this)}return r.prototype.registerMetricStorage=function(e){var t=this._registerMetricStorage(e,f_);return t.length===1?t[0]:new u_(t)},r.prototype.registerAsyncMetricStorage=function(e){var t=this._registerMetricStorage(e,l_);return t},r.prototype.collect=function(e,t,n){return dj(this,void 0,void 0,function(){var o,i,a;return mj(this,function(s){switch(s.label){case 0:return[4,this.observableRegistry.observe(t,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,t)}).filter(dx),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},r.prototype._registerMetricStorage=function(e,t){var n=this,o=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope),i=o.map(function(c){var l=yx(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(l);if(u!=null)return u;var d=c.aggregation.createAggregator(l),p=new t(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=pj(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 t(e,m,Cs.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},r}();var gj=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},E_=function(){function r(e){this.resource=e,this.viewRegistry=new Jx,this.metricCollectors=[],this.meterSharedStates=new Map}return r.prototype.getMeterSharedState=function(e){var t=mx(e),n=this.meterSharedStates.get(t);return n==null&&(n=new b_(this,e),this.meterSharedStates.set(t,n)),n},r.prototype.selectAggregations=function(e){var t,n,o=[];try{for(var i=gj(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(e)])}}catch(c){t={error:c}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}return o},r}();var ym=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},bm=function(r,e){var t={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(;t;)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 t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}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}}},hj=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},fj=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},T_=function(){function r(e,t){this._sharedState=e,this._metricReader=t}return r.prototype.collect=function(e){return ym(this,void 0,void 0,function(){var t,n,o,i,a=this;return bm(this,function(s){switch(s.label){case 0:return t=Qi(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return ym(a,void 0,void 0,function(){var l;return bm(this,function(u){switch(u.label){case 0:return[4,c.collect(this,t,e)];case 1:return l=u.sent(),l?.scopeMetrics!=null&&n.push(l.scopeMetrics),l?.errors!=null&&o.push.apply(o,fj([],hj(l.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return s.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:o}]}})})},r.prototype.forceFlush=function(e){return ym(this,void 0,void 0,function(){return bm(this,function(t){switch(t.label){case 0:return[4,this._metricReader.forceFlush(e)];case 1:return t.sent(),[2]}})})},r.prototype.shutdown=function(e){return ym(this,void 0,void 0,function(){return bm(this,function(t){switch(t.label){case 0:return[4,this._metricReader.shutdown(e)];case 1:return t.sent(),[2]}})})},r.prototype.selectAggregationTemporality=function(e){return this._metricReader.selectAggregationTemporality(e)},r.prototype.selectAggregation=function(e){return this._metricReader.selectAggregation(e)},r.prototype.selectCardinalityLimit=function(e){var t,n,o;return(o=(n=(t=this._metricReader).selectCardinalityLimit)===null||n===void 0?void 0:n.call(t,e))!==null&&o!==void 0?o:2e3},r}();var v_=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},A_=function(r,e){var t={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(;t;)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 t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}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}}},R_=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function Sj(r,e){var t=e??mm.empty();return r?mm.default().merge(t):t}var yS=function(){function r(e){var t,n,o,i,a;if(this._shutdown=!1,this._sharedState=new E_(Sj((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=R_(e.views),c=s.next();!c.done;c=s.next()){var l=c.value;this._sharedState.viewRegistry.addView(l)}}catch(m){t={error:m}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(t)throw t.error}}if(e?.readers!=null&&e.readers.length>0)try{for(var u=R_(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 r.prototype.getMeter=function(e,t,n){return t===void 0&&(t=""),n===void 0&&(n={}),this._shutdown?(Z.warn("A shutdown MeterProvider cannot provide a Meter"),Af()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter},r.prototype.addMetricReader=function(e){var t=new T_(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)},r.prototype.shutdown=function(e){return v_(this,void 0,void 0,function(){return A_(this,function(t){switch(t.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 t.sent(),[2]}})})},r.prototype.forceFlush=function(e){return v_(this,void 0,void 0,function(){return A_(this,function(t){switch(t.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 t.sent(),[2]}})})},r}();var yj=/[\^$\\.+?()[\]{}|]/g,Em=function(){function r(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(r.escapePattern(e)))}return r.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},r.escapePattern=function(e){return"^"+e.replace(yj,"\\$&").replace("*",".*")+"$"},r.hasWildcard=function(e){return e.includes("*")},r}();var xs=function(){function r(e){this._matchAll=e===void 0,this._pattern=e}return r.prototype.match=function(e){return!!(this._matchAll||e===this._pattern)},r}();var w_=function(){function r(e){var t;this._nameFilter=new Em((t=e?.name)!==null&&t!==void 0?t:"*"),this._type=e?.type,this._unitFilter=new xs(e?.unit)}return r.prototype.getType=function(){return this._type},r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getUnitFilter=function(){return this._unitFilter},r}();var C_=function(){function r(e){this._nameFilter=new xs(e?.name),this._versionFilter=new xs(e?.version),this._schemaUrlFilter=new xs(e?.schemaUrl)}return r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getVersionFilter=function(){return this._versionFilter},r.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},r}();function bj(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var Tm=function(){function r(e){var t;if(bj(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||Em.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 y_(e.attributeKeys):this.attributesProcessor=Cs.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:tn.Default(),this.instrumentSelector=new w_({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new C_({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return r}();var RCe=process.env.APP||"unknown";rt();import{v4 as Ej}from"uuid";function Tj(){return new lx({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:Ji.DELTA})}var vj=[new Tm({instrumentName:"test_event_duration",instrumentType:Ue.HISTOGRAM,aggregation:new Gc([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new Tm({instrumentName:"test_step_duration",instrumentType:Ue.HISTOGRAM,aggregation:new Gc([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],vm=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let t=this.counterCache.get(e);if(t)return t;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let t=this.histogramCache.get(e);if(t)return t;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let t=this.observableGaugeCache.get(e);if(t)return t;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 t=typeof process<"u"?"production":"unknown",n=new Gf({[zd]:e.serviceName,[oC]:t,[aC]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:Ej()}),o=Tj(),i=new dS({exporter:o,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new yS({resource:n,readers:[i],views:vj}),kd.setGlobalMeterProvider(this.provider),this.meter=kd.getMeter("momentic-serverless")}increment(e,t,n){try{let o=Ld(n,this.globalAttributes);this.getCounter(e).add(typeof t=="number"?t:1,o)}catch{}}gauge(e,t){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,t)}catch{}}distribution(e,t,n){try{let o=Ld(n,this.globalAttributes);this.getHistogram(e).record(t,o)}catch{}}async flush(){try{await this.provider.forceFlush()}catch{}}async recordDuration({fn:e,name:t,tags:n}){let o=Date.now();try{return await Promise.resolve(e())}finally{this.distribution(t,Date.now()-o,n)}}};var nt=new Od;function x_(r){r.disabled||(nt=new vm(r))}import{exec as Aj}from"child_process";import{platform as __}from"os";var Rj=1e4;async function Wc(r){return new Promise(e=>{Aj(r,{timeout:Rj},(t,n,o)=>{e({command:r,stdout:n,stderr:o,error:t?.message??null,timedOut:t?.killed??!1})})})}async function wj(r){if(__()==="win32")return Wc(`tracert ${r}`);let t=await Wc(`traceroute ${r}`);return t.stderr.includes("not found")||t.error?.includes("not found")?Wc(`tracepath ${r}`):t}async function Am(r){let t=__()==="win32",n=t?`ping -n 3 ${r}`:`ping -c 3 ${r}`,i=`curl -w "\\n\\ntime_namelookup: %{time_namelookup}s\\ntime_connect: %{time_connect}s\\ntime_appconnect: %{time_appconnect}s\\ntime_starttransfer: %{time_starttransfer}s\\ntime_total: %{time_total}s\\n" -o ${t?"NUL":"/dev/null"} -s ${r}`,[a,s,c]=await Promise.all([Wc(n),wj(r),Wc(i)]);return{ping:a,traceroute:s,curl:c}}var bS=!1;try{let r=await import("@sentry/node");r.init({dsn:"https://67a6ef469598f8880478f33863d05873@o4506426201800704.ingest.us.sentry.io/4510914396291072",environment:"production",release:"51822d3944708dabdad399bf299847b0552f4f15",tracesSampleRate:0,sendDefaultPii:!0}),gw(r.captureException),bS=!0}catch{}import{Argument as xu,Command as O6,Option as hg}from"@commander-js/extra-typings";import{confirm as Cj,input as xj}from"@inquirer/prompts";import{existsSync as hxe,mkdirSync as fxe,statSync as _j}from"fs";var Mj=!1,M_=(()=>{try{return _j("/.dockerenv"),!0}catch{return!1}})();async function Rm(r){return $i||Mj||M_?!0:(await I.flush(),await new Promise(t=>setTimeout(t,100)),await Cj({message:r}))}async function I_(r,e){return $i||M_?e:(await xj({message:r,default:e})).trim()||e}import Ms,{supportsColor as Pj}from"chalk";import{Console as P_}from"console";import{format as jc}from"util";var ES=class extends Error{constructor(e,t,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,t),Error.stackTraceLimit=o}},wm=class r extends P_{_buffer=[];_groupDepth=0;Console=P_;constructor(){super({write:e=>(r.write(this._buffer,"log",e),!0)})}static write(e,t,n,o=2){let i=new ES(void 0,r.write).stack;if(!i)return e;let a=i.split(`
37
+ `,gS(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},r}();var u_=function(){function r(e){this._backingStorages=e}return r.prototype.record=function(e,t,n,o){this._backingStorages.forEach(function(i){i.record(e,t,n,o)})},r}();rt();rt();var d_=function(){function r(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new bn}return r.prototype.observe=function(e,t){if(t===void 0&&(t={}),typeof e!="number"){Z.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===Lr.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(t,e)},r}();var m_=function(){function r(){this._buffer=new Map}return r.prototype.observe=function(e,t,n){if(n===void 0&&(n={}),!!Hc(e)){var o=this._buffer.get(e);if(o==null&&(o=new bn,this._buffer.set(e,o)),typeof t!="number"){Z.warn("non-number value provided to metric "+e._descriptor.name+": "+t);return}e._descriptor.valueType===Lr.INT&&!Number.isInteger(t)&&(Z.warn("INT value type cannot accept a floating-point value for "+e._descriptor.name+", ignoring the fractional digits."),t=Math.trunc(t),!Number.isInteger(t))||o.set(n,t)}},r}();var fS=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},SS=function(r,e){var t={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(;t;)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 t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}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}}},p_=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},g_=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},h_=function(){function r(){this._callbacks=[],this._batchCallbacks=[]}return r.prototype.addCallback=function(e,t){var n=this._findCallback(e,t);n>=0||this._callbacks.push({callback:e,instrument:t})},r.prototype.removeCallback=function(e,t){var n=this._findCallback(e,t);n<0||this._callbacks.splice(n,1)},r.prototype.addBatchCallback=function(e,t){var n=new Set(t.filter(Hc));if(n.size===0){Z.error("BatchObservableCallback is not associated with valid instruments",t);return}var o=this._findBatchCallback(e,n);o>=0||this._batchCallbacks.push({callback:e,instruments:n})},r.prototype.removeBatchCallback=function(e,t){var n=new Set(t.filter(Hc)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},r.prototype.observe=function(e,t){return fS(this,void 0,void 0,function(){var n,o,i,a;return SS(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,t),o=this._observeBatchCallbacks(e,t),[4,px(g_(g_([],p_(n),!1),p_(o),!1))];case 1:return i=s.sent(),a=i.filter(gx).map(function(c){return c.reason}),[2,a]}})})},r.prototype._observeCallbacks=function(e,t){var n=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return fS(n,void 0,void 0,function(){var s,c;return SS(this,function(l){switch(l.label){case 0:return s=new d_(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),t!=null&&(c=$o(c,t)),[4,c];case 1:return l.sent(),a._metricStorages.forEach(function(u){u.record(s._buffer,e)}),[2]}})})})},r.prototype._observeBatchCallbacks=function(e,t){var n=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return fS(n,void 0,void 0,function(){var s,c;return SS(this,function(l){switch(l.label){case 0:return s=new m_,c=Promise.resolve(i(s)),t!=null&&(c=$o(c,t)),[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]}})})})},r.prototype._findCallback=function(e,t){return this._callbacks.findIndex(function(n){return n.callback===e&&n.instrument===t})},r.prototype._findBatchCallback=function(e,t){return this._batchCallbacks.findIndex(function(n){return n.callback===e&&hx(n.instruments,t)})},r}();var lj=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),f_=function(r){lj(e,r);function e(t,n,o,i,a){var s=r.call(this,t)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new fm(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new Sm(n,i),s}return e.prototype.record=function(t,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(t,n,o,i)},e.prototype.collect=function(t,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(t,this._instrumentDescriptor,o,n)},e}(hm);var S_=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Cs=function(){function r(){}return r.Noop=function(){return uj},r}();var cj=function(r){S_(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.process=function(t,n){return t},e}(Cs);var y_=function(r){S_(e,r);function e(t){var n=r.call(this)||this;return n._allowedAttributeNames=t,n}return e.prototype.process=function(t,n){var o=this,i={};return Object.keys(t).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=t[a]}),i},e}(Cs);var uj=new cj;var dj=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},mj=function(r,e){var t={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(;t;)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 t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}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}}},pj=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},b_=function(){function r(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new c_,this.observableRegistry=new h_,this.meter=new i_(this)}return r.prototype.registerMetricStorage=function(e){var t=this._registerMetricStorage(e,f_);return t.length===1?t[0]:new u_(t)},r.prototype.registerAsyncMetricStorage=function(e){var t=this._registerMetricStorage(e,l_);return t},r.prototype.collect=function(e,t,n){return dj(this,void 0,void 0,function(){var o,i,a;return mj(this,function(s){switch(s.label){case 0:return[4,this.observableRegistry.observe(t,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,t)}).filter(dx),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},r.prototype._registerMetricStorage=function(e,t){var n=this,o=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope),i=o.map(function(c){var l=yx(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(l);if(u!=null)return u;var d=c.aggregation.createAggregator(l),p=new t(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=pj(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 t(e,m,Cs.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},r}();var gj=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},E_=function(){function r(e){this.resource=e,this.viewRegistry=new Jx,this.metricCollectors=[],this.meterSharedStates=new Map}return r.prototype.getMeterSharedState=function(e){var t=mx(e),n=this.meterSharedStates.get(t);return n==null&&(n=new b_(this,e),this.meterSharedStates.set(t,n)),n},r.prototype.selectAggregations=function(e){var t,n,o=[];try{for(var i=gj(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(e)])}}catch(c){t={error:c}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}return o},r}();var ym=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},bm=function(r,e){var t={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(;t;)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 t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}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}}},hj=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},fj=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},T_=function(){function r(e,t){this._sharedState=e,this._metricReader=t}return r.prototype.collect=function(e){return ym(this,void 0,void 0,function(){var t,n,o,i,a=this;return bm(this,function(s){switch(s.label){case 0:return t=Qi(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return ym(a,void 0,void 0,function(){var l;return bm(this,function(u){switch(u.label){case 0:return[4,c.collect(this,t,e)];case 1:return l=u.sent(),l?.scopeMetrics!=null&&n.push(l.scopeMetrics),l?.errors!=null&&o.push.apply(o,fj([],hj(l.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return s.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:o}]}})})},r.prototype.forceFlush=function(e){return ym(this,void 0,void 0,function(){return bm(this,function(t){switch(t.label){case 0:return[4,this._metricReader.forceFlush(e)];case 1:return t.sent(),[2]}})})},r.prototype.shutdown=function(e){return ym(this,void 0,void 0,function(){return bm(this,function(t){switch(t.label){case 0:return[4,this._metricReader.shutdown(e)];case 1:return t.sent(),[2]}})})},r.prototype.selectAggregationTemporality=function(e){return this._metricReader.selectAggregationTemporality(e)},r.prototype.selectAggregation=function(e){return this._metricReader.selectAggregation(e)},r.prototype.selectCardinalityLimit=function(e){var t,n,o;return(o=(n=(t=this._metricReader).selectCardinalityLimit)===null||n===void 0?void 0:n.call(t,e))!==null&&o!==void 0?o:2e3},r}();var v_=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},A_=function(r,e){var t={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(;t;)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 t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}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}}},R_=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function Sj(r,e){var t=e??mm.empty();return r?mm.default().merge(t):t}var yS=function(){function r(e){var t,n,o,i,a;if(this._shutdown=!1,this._sharedState=new E_(Sj((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=R_(e.views),c=s.next();!c.done;c=s.next()){var l=c.value;this._sharedState.viewRegistry.addView(l)}}catch(m){t={error:m}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(t)throw t.error}}if(e?.readers!=null&&e.readers.length>0)try{for(var u=R_(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 r.prototype.getMeter=function(e,t,n){return t===void 0&&(t=""),n===void 0&&(n={}),this._shutdown?(Z.warn("A shutdown MeterProvider cannot provide a Meter"),Af()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter},r.prototype.addMetricReader=function(e){var t=new T_(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)},r.prototype.shutdown=function(e){return v_(this,void 0,void 0,function(){return A_(this,function(t){switch(t.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 t.sent(),[2]}})})},r.prototype.forceFlush=function(e){return v_(this,void 0,void 0,function(){return A_(this,function(t){switch(t.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 t.sent(),[2]}})})},r}();var yj=/[\^$\\.+?()[\]{}|]/g,Em=function(){function r(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(r.escapePattern(e)))}return r.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},r.escapePattern=function(e){return"^"+e.replace(yj,"\\$&").replace("*",".*")+"$"},r.hasWildcard=function(e){return e.includes("*")},r}();var xs=function(){function r(e){this._matchAll=e===void 0,this._pattern=e}return r.prototype.match=function(e){return!!(this._matchAll||e===this._pattern)},r}();var w_=function(){function r(e){var t;this._nameFilter=new Em((t=e?.name)!==null&&t!==void 0?t:"*"),this._type=e?.type,this._unitFilter=new xs(e?.unit)}return r.prototype.getType=function(){return this._type},r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getUnitFilter=function(){return this._unitFilter},r}();var C_=function(){function r(e){this._nameFilter=new xs(e?.name),this._versionFilter=new xs(e?.version),this._schemaUrlFilter=new xs(e?.schemaUrl)}return r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getVersionFilter=function(){return this._versionFilter},r.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},r}();function bj(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var Tm=function(){function r(e){var t;if(bj(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||Em.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 y_(e.attributeKeys):this.attributesProcessor=Cs.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:tn.Default(),this.instrumentSelector=new w_({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new C_({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return r}();var RCe=process.env.APP||"unknown";rt();import{v4 as Ej}from"uuid";function Tj(){return new lx({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:Ji.DELTA})}var vj=[new Tm({instrumentName:"test_event_duration",instrumentType:Ue.HISTOGRAM,aggregation:new Gc([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new Tm({instrumentName:"test_step_duration",instrumentType:Ue.HISTOGRAM,aggregation:new Gc([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],vm=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let t=this.counterCache.get(e);if(t)return t;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let t=this.histogramCache.get(e);if(t)return t;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let t=this.observableGaugeCache.get(e);if(t)return t;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 t=typeof process<"u"?"production":"unknown",n=new Gf({[zd]:e.serviceName,[oC]:t,[aC]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:Ej()}),o=Tj(),i=new dS({exporter:o,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new yS({resource:n,readers:[i],views:vj}),kd.setGlobalMeterProvider(this.provider),this.meter=kd.getMeter("momentic-serverless")}increment(e,t,n){try{let o=Ld(n,this.globalAttributes);this.getCounter(e).add(typeof t=="number"?t:1,o)}catch{}}gauge(e,t){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,t)}catch{}}distribution(e,t,n){try{let o=Ld(n,this.globalAttributes);this.getHistogram(e).record(t,o)}catch{}}async flush(){try{await this.provider.forceFlush()}catch{}}async recordDuration({fn:e,name:t,tags:n}){let o=Date.now();try{return await Promise.resolve(e())}finally{this.distribution(t,Date.now()-o,n)}}};var nt=new Od;function x_(r){r.disabled||(nt=new vm(r))}import{exec as Aj}from"child_process";import{platform as __}from"os";var Rj=1e4;async function Wc(r){return new Promise(e=>{Aj(r,{timeout:Rj},(t,n,o)=>{e({command:r,stdout:n,stderr:o,error:t?.message??null,timedOut:t?.killed??!1})})})}async function wj(r){if(__()==="win32")return Wc(`tracert ${r}`);let t=await Wc(`traceroute ${r}`);return t.stderr.includes("not found")||t.error?.includes("not found")?Wc(`tracepath ${r}`):t}async function Am(r){let t=__()==="win32",n=t?`ping -n 3 ${r}`:`ping -c 3 ${r}`,i=`curl -w "\\n\\ntime_namelookup: %{time_namelookup}s\\ntime_connect: %{time_connect}s\\ntime_appconnect: %{time_appconnect}s\\ntime_starttransfer: %{time_starttransfer}s\\ntime_total: %{time_total}s\\n" -o ${t?"NUL":"/dev/null"} -s ${r}`,[a,s,c]=await Promise.all([Wc(n),wj(r),Wc(i)]);return{ping:a,traceroute:s,curl:c}}var bS=!1;try{let r=await import("@sentry/node");r.init({dsn:"https://67a6ef469598f8880478f33863d05873@o4506426201800704.ingest.us.sentry.io/4510914396291072",environment:"production",release:"52af28ec511f58a5f8d9e11a48265b7776b523e9",tracesSampleRate:0,sendDefaultPii:!0}),gw(r.captureException),bS=!0}catch{}import{Argument as xu,Command as O6,Option as hg}from"@commander-js/extra-typings";import{confirm as Cj,input as xj}from"@inquirer/prompts";import{existsSync as hxe,mkdirSync as fxe,statSync as _j}from"fs";var Mj=!1,M_=(()=>{try{return _j("/.dockerenv"),!0}catch{return!1}})();async function Rm(r){return $i||Mj||M_?!0:(await I.flush(),await new Promise(t=>setTimeout(t,100)),await Cj({message:r}))}async function I_(r,e){return $i||M_?e:(await xj({message:r,default:e})).trim()||e}import Ms,{supportsColor as Pj}from"chalk";import{Console as P_}from"console";import{format as jc}from"util";var ES=class extends Error{constructor(e,t,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,t),Error.stackTraceLimit=o}},wm=class r extends P_{_buffer=[];_groupDepth=0;Console=P_;constructor(){super({write:e=>(r.write(this._buffer,"log",e),!0)})}static write(e,t,n,o=2){let i=new ES(void 0,r.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:t}),e}_log(e,t){r.write(this._buffer,e," ".repeat(this._groupDepth)+t,3)}debug(e,...t){this._log("debug",jc(e,...t))}error(e,...t){this._log("error",jc(e,...t))}info(e,...t){this._log("info",jc(e,...t))}log(e,...t){this._log("log",jc(e,...t))}warn(e,...t){this._log("warn",jc(e,...t))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function O_(r){let e=globalThis.console,t=new wm;globalThis.console=t;try{r()}finally{let o=t.getBuffer()?.map(i=>i.message).join(`
40
40
  `);process.stderr.write(`${o}
41
- `),globalThis.console=e}}var _s=" ".repeat(6);import{hostname as Ij}from"os";var br=ps({app:"cli",hostname:Ij(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:"0.35.3"});function TS(r){if(!r)return;r=r.toLowerCase();let e=Rd.safeParse(r);if(e.success)return I.setMinLevel(e.data),e.data}function L_({results:r,startTime:e,entity:t,getDisplayLine:n,onFailed:o}){let i=r.filter(u=>u.status==="PASSED"&&u.quarantined),a=r.filter(u=>u.status==="PASSED"&&!u.quarantined),s=r.filter(u=>u.status==="FAILED"&&u.quarantined),c=r.filter(u=>u.status==="FAILED"&&!u.quarantined),l=r.filter(u=>u.status==="CANCELLED");return O_(()=>{if(c.forEach(u=>{I.log(""),o(u)}),c.length){I.log("");let u=c.length===1?"":"s";I.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{I.dimmed(n(d))})}if(l.length){I.log("");let u=l.length===1?"":"s";I.warn(`${l.length} ${t}${u} cancelled:`),l.forEach(d=>{I.dimmed(n(d))})}if(a.length){I.log("");let u=a.length===1?"":"s";I.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{I.dimmed(n(d))})}if(s.length){I.log("");let u=s.length===1?"":"s";I.warn(`${s.length} quarantined ${t}${u} failed:`),s.forEach(d=>{I.dimmed(n(d))})}if(i.length){I.log("");let u=i.length===1?"":"s";I.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{I.dimmed(n(d))})}I.log(""),I.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 Vc=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=Ms.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=Ms.bgGreen.white("PASS"),a=3):r.includes("START")?(i=Ms.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=Ms.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=Ms.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=Ms.bgMagenta.white("RUNNING"),a=0):(I.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),Pj||(i=`${i}`),I.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};import Oj from"fs";import{platform as Lj,tmpdir as Nj}from"os";import Dj from"path";import{program as kj}from"playwright-core/lib/cli/program";import{registry as $c}from"playwright-core/lib/server";import N_ from"proper-lockfile";var D_=Dj.join(Nj(),"momenticBrowserInstallation");var vS=["chrome","chromium","chrome-for-testing","ffmpeg"],Fj={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},k_={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function F_(r){if(r==="Org Default")return!1;let e=k_[Fj[r]??""]??"",t=$c.findExecutable(e);return!t||t.installType==="none"?!1:AS(t)}function AS(r){let e=r.executablePath();return Oj.existsSync(e)}function Uj(r,e){let t=k_[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=$c.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&AS(n)))return n}async function Bj({browser:r,force:e}){let t=Uj(r,e);if(!t){I.info(`Browser '${r}' is already installed, skipping...`);return}I.info(`Installing browser '${r}'...`);try{await $c.installDeps([t],!1),await $c.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){I.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=$c.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!AS(o);)I.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function zj(){if(Lj()==="win32"){I.info("Installing Windows dependencies for Playwright...");try{await kj.parseAsync(["","","install","winldd"])}catch(r){I.warn(`Failed to install Windows dependencies: ${r}. Continuing with browser installation...`)}}}async function Cm({rawBrowsers:r,force:e=!1,all:t=!1}){await zj();let n=t?vS:Array.from(new Set(r));try{await N_.lock(D_,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){I.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 Bj({browser:i,force:e})}catch(a){o=a,I.error(`Failed to install the ${i} browser: ${a}`)}}finally{await N_.unlock(D_,{realpath:!1})}if(o)throw o}import{createServer as Gj}from"http";async function Xo(r,e,t=30){for(let n=0;n<t;n+=1){let o=r+n;if(await xm(o))return o}I.error(`Could not find an available port for ${e} starting from ${r} after ${t} attempts`),process.exit(1)}async function xm(r){return new Promise((e,t)=>{let n=Gj();n.once("error",o=>{o.code==="EADDRINUSE"?e(!1):(I.warn({err:o},"Unexpected error checking for open ports, continuing..."),n.close(),e(!0))}),n.once("listening",()=>{n.close(()=>{e(!0)})}),n.listen(r)})}import u_e from"blocked-at";import m_e from"why-is-node-running";function U_(r){let e=r?.shardIndex??1,t=r?.shardCount??1;if(e<1)throw new Error("Shard index must be greater than 0.");if(t<1)throw new Error("Shard count must be greater than 0.");if(e>t)throw new Error("Shard index cannot be greater than shard count")}function Hj(r,e,t,n){if(t>r.length&&(I.warn(`Shard count ${t} is greater than the number of tests ${r.length}! Some workers won't have any tests to run.`),t=Math.max(t,r.length),e>t))return[];let o=Math.floor((e-1)*(r.length/t)),i=Math.floor(e*(r.length/t));return(n?[...r].sort((s,c)=>n(s).localeCompare(n(c))):[...r].sort()).filter((s,c)=>c>=o&&c<i)}function B_(r){let{items:e,shardIndex:t,shardCount:n,sortKey:o}=r;return n>1?Hj(e,t,n,o):e}function RS({regenerateCache:r,saveCache:e,disableCache:t}){if(t){if(r)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 z_(r,e,t){return r instanceof Ai?(r.zodIssues.forEach(n=>{t.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 wS({parsingErrors:r,parsingErrorDetails:e,failedTestFilePaths:t,failedModuleFilePaths:n}){if(I.error(`
41
+ `),globalThis.console=e}}var _s=" ".repeat(6);import{hostname as Ij}from"os";var br=ps({app:"cli",hostname:Ij(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:"0.35.4"});function TS(r){if(!r)return;r=r.toLowerCase();let e=Rd.safeParse(r);if(e.success)return I.setMinLevel(e.data),e.data}function L_({results:r,startTime:e,entity:t,getDisplayLine:n,onFailed:o}){let i=r.filter(u=>u.status==="PASSED"&&u.quarantined),a=r.filter(u=>u.status==="PASSED"&&!u.quarantined),s=r.filter(u=>u.status==="FAILED"&&u.quarantined),c=r.filter(u=>u.status==="FAILED"&&!u.quarantined),l=r.filter(u=>u.status==="CANCELLED");return O_(()=>{if(c.forEach(u=>{I.log(""),o(u)}),c.length){I.log("");let u=c.length===1?"":"s";I.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{I.dimmed(n(d))})}if(l.length){I.log("");let u=l.length===1?"":"s";I.warn(`${l.length} ${t}${u} cancelled:`),l.forEach(d=>{I.dimmed(n(d))})}if(a.length){I.log("");let u=a.length===1?"":"s";I.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{I.dimmed(n(d))})}if(s.length){I.log("");let u=s.length===1?"":"s";I.warn(`${s.length} quarantined ${t}${u} failed:`),s.forEach(d=>{I.dimmed(n(d))})}if(i.length){I.log("");let u=i.length===1?"":"s";I.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{I.dimmed(n(d))})}I.log(""),I.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 Vc=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=Ms.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=Ms.bgGreen.white("PASS"),a=3):r.includes("START")?(i=Ms.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=Ms.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=Ms.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=Ms.bgMagenta.white("RUNNING"),a=0):(I.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),Pj||(i=`${i}`),I.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};import Oj from"fs";import{platform as Lj,tmpdir as Nj}from"os";import Dj from"path";import{program as kj}from"playwright-core/lib/cli/program";import{registry as $c}from"playwright-core/lib/server";import N_ from"proper-lockfile";var D_=Dj.join(Nj(),"momenticBrowserInstallation");var vS=["chrome","chromium","chrome-for-testing","ffmpeg"],Fj={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},k_={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function F_(r){if(r==="Org Default")return!1;let e=k_[Fj[r]??""]??"",t=$c.findExecutable(e);return!t||t.installType==="none"?!1:AS(t)}function AS(r){let e=r.executablePath();return Oj.existsSync(e)}function Uj(r,e){let t=k_[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=$c.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&AS(n)))return n}async function Bj({browser:r,force:e}){let t=Uj(r,e);if(!t){I.info(`Browser '${r}' is already installed, skipping...`);return}I.info(`Installing browser '${r}'...`);try{await $c.installDeps([t],!1),await $c.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){I.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=$c.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!AS(o);)I.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function zj(){if(Lj()==="win32"){I.info("Installing Windows dependencies for Playwright...");try{await kj.parseAsync(["","","install","winldd"])}catch(r){I.warn(`Failed to install Windows dependencies: ${r}. Continuing with browser installation...`)}}}async function Cm({rawBrowsers:r,force:e=!1,all:t=!1}){await zj();let n=t?vS:Array.from(new Set(r));try{await N_.lock(D_,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){I.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 Bj({browser:i,force:e})}catch(a){o=a,I.error(`Failed to install the ${i} browser: ${a}`)}}finally{await N_.unlock(D_,{realpath:!1})}if(o)throw o}import{createServer as Gj}from"http";async function Xo(r,e,t=30){for(let n=0;n<t;n+=1){let o=r+n;if(await xm(o))return o}I.error(`Could not find an available port for ${e} starting from ${r} after ${t} attempts`),process.exit(1)}async function xm(r){return new Promise((e,t)=>{let n=Gj();n.once("error",o=>{o.code==="EADDRINUSE"?e(!1):(I.warn({err:o},"Unexpected error checking for open ports, continuing..."),n.close(),e(!0))}),n.once("listening",()=>{n.close(()=>{e(!0)})}),n.listen(r)})}import u_e from"blocked-at";import m_e from"why-is-node-running";function U_(r){let e=r?.shardIndex??1,t=r?.shardCount??1;if(e<1)throw new Error("Shard index must be greater than 0.");if(t<1)throw new Error("Shard count must be greater than 0.");if(e>t)throw new Error("Shard index cannot be greater than shard count")}function Hj(r,e,t,n){if(t>r.length&&(I.warn(`Shard count ${t} is greater than the number of tests ${r.length}! Some workers won't have any tests to run.`),t=Math.max(t,r.length),e>t))return[];let o=Math.floor((e-1)*(r.length/t)),i=Math.floor(e*(r.length/t));return(n?[...r].sort((s,c)=>n(s).localeCompare(n(c))):[...r].sort()).filter((s,c)=>c>=o&&c<i)}function B_(r){let{items:e,shardIndex:t,shardCount:n,sortKey:o}=r;return n>1?Hj(e,t,n,o):e}function RS({regenerateCache:r,saveCache:e,disableCache:t}){if(t){if(r)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 z_(r,e,t){return r instanceof Ai?(r.zodIssues.forEach(n=>{t.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 wS({parsingErrors:r,parsingErrorDetails:e,failedTestFilePaths:t,failedModuleFilePaths:n}){if(I.error(`
42
42
  Found ${r} file(s) with validation errors that must be fixed manually:
43
43
  `),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)=>{I.error(` ${a}`),i.forEach(({stepIndex:s,field:c,issue:l})=>{let u=s!==void 0?`Step ${s}`:"File",d=c?`, field "${c}"`:"";I.error(` ${u}${d}:`),I.error(` \u2192 ${l}`)})})}else t.size>0&&I.error(`Failed test files:
44
44
  ${[...t].map(o=>`${_s}- ${o}`).join(`
@@ -4580,9 +4580,9 @@ ${r}`;case"ELEMENT_CHECK":return`${QP}
4580
4580
  ${r}`;default:return r}}async function sn({frameConfig:r,action:e,browser:t}){let n=t.getActiveFrameConfig();r?t.setActiveFrameConfig(r):n?.type==="auto"&&t.setActiveFrameConfig(void 0);try{return await e()}finally{t.setActiveFrameConfig(n)}}var V2=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function rO({beforeUrl:r,beforePages:e,browser:t,command:n,logger:o}){if(V2.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 J(250),l++;let u=(await t.getOpenPages()).map(p=>p.url),d=t.url();if(u.length!==e.length)for(let p=u.length-1;p>=e.length;p--){let m=u[p];if(na(m,o)&&m!==r&&m!==d){o.info({beforePages:e,afterPages:u,beforeUrl:r},"Auto-following new tab after preset action"),await t.switchToPage({type:"INDEX",index:String(p)});break}}}}async function Vn(r,e={}){let t=await r.getBrowserState(e);return{serializedTree:t.serialize(e.serializationOpts),tree:t}}var nO=r=>!!r&&Ra(r),oO=r=>{let{cache:e,description:t,disableSecondaryCacheResolution:n,logger:o}=r,i=e,a=!1;return i&&n&&i.targetSource==="HEURISTIC_HEALED"&&(a=!0,i=void 0),i?.inputDescription&&!eO(t,i.inputDescription)&&(o.warn({old:i.inputDescription,new:t},"Target cache was generated with a different description, clearing it automatically"),a=!0,i=void 0),{cache:i,cacheBustedBeforeAction:a}};import{randomUUID as J2}from"crypto";var aO={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},sO={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},iO=/<(\S+) id="(\d+)".*?>/g,$2=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,lO=["h1","h2","section","footer","nav","aside","form","label","dialog"],q2=[...lO,"span","div","h3"],K2=["table","select","form","ul","ol","menu","pre","code","dialog"],Y2=["table","form","dialog","nav","section","ul","select"];function ip(r){return X2(r)}function X2({logger:r,serializedTree:e,options:t}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=t,s=[],c=e.split(`
4581
4581
  `),l=0,u=[],d=0,p=[],m=[],g=!1;for(;l<c.length;){g&&(s.push({ids:p,content:u.join(`
4582
4582
  `),tokenLength:d}),u=[],d=0,p=m.length?[m[m.length-1].id]:[],g=!1);let h=c[l],f=En(h);d+=f,h.length>a&&(h=h.slice(0,a));let b=Array.from(h.matchAll(iO)).map(K=>K&&K.length>=3?{tagName:K[1],id:K[2]}:void 0).filter(K=>!!K),M=Array.from(h.matchAll($2)).map(K=>K&&(K[2]||K[4])).filter(K=>!!K);M.reverse();let O=h.replace(/ id="[0-9]+"/g,"");u.push(O);for(let K of b)p.push(K.id),m.push(K);for(let K of M){let ge=m[m.length-1];ge&&ge.tagName===K&&m.pop()}let v=m.some(K=>K2.includes(K.tagName)),C=c[l+1]??"",F=En(C),B=Array.from(C.matchAll(iO)).map(K=>K&&K.length>2?K[1]:void 0).filter(K=>!!K),D=B.some(K=>lO.includes(K)),ee=B.some(K=>q2.includes(K));d+F>=i&&(g=!0),d>=n&&(D&&!v||M.some(K=>Y2.includes(K)))&&(g=!0),d>=o&&ee&&!v&&(g=!0),l++}return u.length&&s.push({ids:p,content:u.join(`
4583
- `),tokenLength:d}),s.forEach((h,f)=>{let y=h.ids[0],E=h.ids[h.ids.length-1];r.debug({tokenLength:h.tokenLength,minId:y,maxId:E},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var Z2=75e4,ap=3e5;async function ca(r){let{options:e,fixtures:t,screenshot:n}=r,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:s,signal:c}=t,l=r.tree,u=r.serializedTree,d=En(u);if(d>Z2)try{let p=ip({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await eK({...r,tokenLimit:ap-1e4,chunks:p.chunks}),u=l.serialize();let m=En(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(ap*Jo),u=l.serialize();let m=En(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>ap)try{if(o){let p=ip({serializedTree:u,options:sO,logger:i}),m=J2();l=await Y(Q2({...r,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let g=En(u);i.info({oldTokens:d,newTokens:g,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=g}else{let p=ip({serializedTree:u,options:aO,logger:i});l=await Y(tK({...r,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=En(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(ap*Jo),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function Q2({type:r,callId:e,chunks:t,description:n,fixtures:o,tree:i}){let{generator:a,signal:s,logger:c}=o,l=await a.rankChunksWithAi({chunks:t,description:n,type:r,softTokenLimit:4e4,hardTokenLimit:8e4,callId:e},{abortSignal:s,logger:c,loggerTags:ye(c)}),u=[];return t.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function eK(r){let{description:e,fixtures:t,tree:n}=r,{generator:o,logger:i,signal:a}=t;if(!e.trim())throw new Error("Empty description passed to page filtering");let s=await o.getExtractedKeywords({goal:e},{logger:i,loggerTags:ye(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let c of s.keywords){let l=r.chunks.filter(m=>m.content.toLowerCase().includes(c.toLowerCase()));if(!l.length||l.reduce((m,g)=>m+g.tokenLength,0)>r.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 tK(r){let{description:e,fixtures:t,chunkResult:n,tokenLimit:o,tree:i}=r,{generator:a,logger:s,signal:c}=t,l=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:c,logger:s,loggerTags:ye(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 Uy(r,e){if(!r.description)throw new R("UserConfigurationError","Cannot locate element with empty description");return sn({action:async()=>rK(r,e),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:e.browser,logger:r.logger})}async function rK(r,e){let{disableCache:t,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:c,logger:l,allowNotActionableNodesOverride:u,skipSavingVisualAttributes:d}=r,{orgId:p,browser:m,localCodeEvalTools:g,generator:h,abortSignal:f}=e,y=r.description,E=oa(),b=r.useMemory&&!t;n&&(y=await Xc({orgId:p,s:y,context:n,localTools:g,signal:f,logger:l})),a&&(y=tO(y,a));let{serializedTree:_,tree:M}=await E.startAsyncSpan("GET_PAGE_STATE",async()=>Vn(m,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),{}),O=await E.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let U,W=Date.now(),ue;for(;!U&&Date.now()-W<3e3;){f.throwIfAborted();try{U=await m.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(le){ue=le}}if(!U)throw new R("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${ue?.message}`);return U}),v=_,C=!1,P=`data:image/jpeg;base64,${O.toString("base64")}`;v=await ca({type:"locator",description:y,screenshot:P,serializedTree:_,options:{aiPageFiltering:c},tree:M,fixtures:{generator:h,signal:f,logger:l,orgId:p}}),v!==_&&(C=!0);let B=await E.startAsyncSpan("AI_LOCATOR_CALL",async U=>{let W=await h.getElementLocation({browserState:v,goal:y,screenshot:P,source:a,memory:b?s:void 0},{disableCache:t,abortSignal:f,loggerTags:ye(l),useMemory:b});return U.result=W,W});if(l.debug({usedRag:C,result:B},"Got locator result"),!(B.id>0))throw new wo(`Could not find any relevant element: ${B.thoughts}`,B.updatedMemory?{type:"GCS_TRACES",traces:B.updatedMemory}:void 0);let{resolution:ee,target:K,frameConfig:ge}=await E.startAsyncSpan("TARGET_RESOLUTION",async U=>{let W=await m.createTargetFromA11yId({id:B.id,requirements:B.requirements,additionalElements:B.additionalElements,description:y,targetSource:"AI",logger:l,skipSavingVisualAttributes:d});return U.result={serializedElement:W.target.nodeOnlySerializedHtml??"Unknown HTML element"},W});if(ee.a11yNode?.properties?.hidden&&ee.a11yNode?.properties?.hidden!=="false")throw new R("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${ee.displayString}`);return b&&(B.updatedMemory?K.memory={type:"GCS_TRACES",traces:B.updatedMemory}:s&&(K.memory=s)),{thoughts:B.thoughts,target:K,resolution:ee,frameConfig:ge,screenshot:P}}var nK=15;async function sp({command:r,aiPageFiltering:e,logger:t,fixtures:n,useMemory:o,maxRetries:i=nK}){if(!r.assertion.trim())throw new R("ActionFailureError","Assertion command is missing the assertion content");let a=oh.optional().catch(void 0).parse(r.source);r.source&&!a&&t.warn(`Invalid source ${r.source} for AI assertion, ignoring...`);let{browser:s}=n,c=r.timeout?r.timeout*1e3:s.smartWaitingTimeout,l=mI(c,i-1),u=0,d=Date.now(),p=d+c,m=d,g,h,f;try{await sn({action:()=>s.clearHighlights(),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:s,logger:t})}catch(y){t.warn({err:y},"Failed to clear highlights before AI check, continuing...")}for(;u<i;){n.abortSignal.throwIfAborted();let y=Date.now();if(u>0){if(y>=p)break;let _=p-y,M=m-y,O=Math.min(M,_);O>0&&await J(O,n.abortSignal)}let E=Date.now();if(u>0&&E>=p)break;let b=!1;try{if(g=await sn({action:async()=>{let M=await cO(s,t,n.abortSignal);return h&&h.serializedTree===M.serializedTree&&h.screenshotBuff.equals(M.screenshotBuff)?(b=!0,g):(h=M,uO({command:r,state:M,fixtures:n,useMemory:o,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:t,source:a}))},frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s}),g?.success){g?.updatedMemory&&Jc(r,g.updatedMemory,t);break}else throw g?.thoughts?new R("AssertionFailureError",g.thoughts):new R("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(_){n.abortSignal.throwIfAborted(),f=_ instanceof Error?_:new Error(`${_}`),b?t.info(`AI check attempt ${u} failed (re-used previous result)`):t.info({err:_},`AI check assert attempt ${u} failed, retrying...`)}finally{u++,m=E+l}}if(!g?.success){let y=p-Date.now();y>0&&await J(y,n.abortSignal)}if(!g?.success)try{g=await sn({action:async()=>uO({command:r,state:await cO(s,t,n.abortSignal),fixtures:n,useMemory:o,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:t}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s})}catch(y){n.abortSignal.throwIfAborted(),f=y instanceof Error?y:new Error(`${y}`)}finally{u++}if(g?.updatedMemory&&Jc(r,g.updatedMemory,t),!g?.success){let y=`AI check still failing after ${u} attempts.`;throw f&&(y+=` Latest result: ${f.message}`),new R("AssertionFailureError",y)}return{...g,succeedImmediately:!1,urlAfterCommand:s.url()}}async function cO(r,e,t){let[n,o]=await Promise.all([Vn(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function uO({command:r,state:e,fixtures:t,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:p}=t,m={type:"ASSERTION"},{serializedTree:g,tree:h}=e,f=e.screenshotBuff,y=f.toString("base64"),E=u.url(),b=r.contextChoice??"MULTIMODAL",_=g;b!=="VISION_ONLY"&&(_=await ca({type:"assertion",serializedTree:g,tree:h,description:r.assertion,screenshot:y,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:t.orgId}}),_!==g&&(m.ragUsed=!0),m.pageState=_);let M={goal:r.assertion,url:E,memory:o?r.cache?.memory:void 0,browserState:_,screenshot:y,contextChoice:b,source:c},v=await(b==="VISION_ONLY"?(C,F)=>d.getVisualAssertionResult(C,F):(C,F)=>d.getAssertionResult(C,F))(M,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!r.disableCache,abortSignal:p,logger:l,loggerTags:ye(l)});return(v.result||i)&&v.relevantElements&&(m.relevantElementsSerialized=v.relevantElements.map(C=>u.getSerializedFormFromA11yId(C)).filter(C=>!!C),await oK(v.relevantElements,u,l)),{success:v.result,thoughts:v.thoughts,afterScreenshotOverride:f,updatedMemory:o?v.updatedMemory:void 0}}async function oK(r,e,t){let n=Date.now();for(let o of r){if(Date.now()-n>2e3){t.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await Y(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){t.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var iK=1e5,lp=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function dO(r,e){let{logger:t}=r,{abortSignal:n,browser:o}=e,i=Date.now();try{await aK(i,r,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof lp?t.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):t.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await J(s,n)}finally{t.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function aK(r,e,t){let{abortSignal:n,browser:o}=t;if(o.smartWaitingTimeout<3e3){await J(o.smartWaitingTimeout,n);return}if(!e.description)throw new R("UserConfigurationError","Cannot locate element with empty description");await Y(sK(r,e,t),{milliseconds:o.smartWaitingTimeout})}async function sK(r,e,t){let{logger:n,iframeUrl:o}=e,{browser:i}=t;for(;Date.now()-r<i.smartWaitingTimeout;)if(await sn({action:async()=>lK(e,t),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function lK(r,e){let{testContext:t,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=r,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=r.description;t&&(d=await Xc({orgId:l,s:d,context:t,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await Vn(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(En(p)>iK)throw new lp;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(E){throw new R("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${E instanceof Error?E.message:E}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let y=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:ye(n)});return n.debug({result:y},"Got smart waiting result"),y.isPageReady}import{cloneDeep as pO}from"lodash-es";async function gO(r){let{command:e,timeoutMs:t,fixtures:n}=r,{abortSignal:o}=n,i=()=>Pu(e.cache)?e.cache:void 0,a=i(),s=pO(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=TM(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<t;){u++,u>1&&await J(p,o),o?.throwIfAborted(),a=i();let{result:h,elementWasFound:f}=await mO({cacheToUse:a,params:r});if(d=h,m=f,h.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new R("InternalPlatformError",`Failed to evaluate manual element assertion in ${t}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&Ra(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await mO({cacheToUse:h,params:r});d=f,d.success||c(!0)}let g=i();return d.success&&g?.target&&!m&&(g.target=FS(g.target),g.updatedAt=new Date),d}async function mO({cacheToUse:r,params:e}){let{command:t,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(t.target&&!Ao(t.target))throw new Error("Element assertion with x/y is not supported yet");let c=Nm(t.assertion),l,u=!1,d=pO(r);try{let{elementInteractedDisplayString:p,result:m,thoughts:g}=await a({ctx:o.ctx,tracer:i,command:t,target:t.target,cache:d?.target,action:async h=>cK(h.locator,e),options:{...t,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Ll(t),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 R)||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 cK(r,{command:e,fixtures:t}){return await t.browser.highlight(r),await uK(r,e.assertion)}async function uK(r,e){let t=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await r.textContent()??"";if(o={elementTextContent:$t(a,500,!0)},!zn(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=rn(e);t=!1,n=new R("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:$t(await r.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a=null;try{a=await r.getAttribute(e.attr,{timeout:3e3})}catch(s){n=new R("AssertionFailureError",s instanceof Error?s.message:String(s)),t=!1;break}if(!zn(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=rn(e);t=!1,e.operation==="EXISTS"?n=new R("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new R("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{t=await r.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},mr*1e3);break}case"EDITABLE":{t=await r.isEditable({timeout:mr*1e3});break}case"EXISTS":{t=!0;break}case"ENABLED":{t=await r.isEnabled({timeout:mr*1e3});break}case"FOCUSED":{t=await r.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(t=e.negated?!t:t,!t){let a=rn(e);n=new R("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await r.evaluate(s=>s.tagName);if(!zn(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=rn(e);t=!1,n=new R("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await r.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!zn(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=rn(e);t=!1,e.operation==="EXISTS"?n=new R("AssertionFailureError",`The style property ${e.property} ${s}`):n=new R("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:t,data:o,err:n}}function hO(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&r.condition==="EXISTS"}import{Jimp as dK}from"jimp";async function su(r,e){let t=await r.screenshot(e),n=await dK.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as fO}from"jimp";import By from"jpeg-js";import mK from"pixelmatch";async function SO({ctx:r,tracer:e,command:t,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!Ao(t.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;t.target?.elementDescriptor?l=(await i({ctx:r,tracer:e,command:t,target:t.target,cache:t.cache?.target,action:async B=>su(o,{locator:B.locator,...c}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:l=await su(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,t,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 P=`${l.width}x${l.height}`,B=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${P}) does not match saved screenshot dimensions (${B}) - 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 fO.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await fO.fromBuffer(u.buffer),g={width:u.width,height:u.height},h,f=p.width*p.height,y=g.width*g.height,E=Math.abs(p.height-g.height),b=Math.abs(p.width-g.width);if(f>y){let P=d.cover({w:g.width,h:g.height});l.buffer=await P.getBuffer("image/jpeg"),h="current",l.width=g.width,l.height=g.height}else if(y>f){let P=m.cover({w:p.width,h:p.height});u.buffer=await P.getBuffer("image/jpeg"),h="saved"}let _={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},M=t.threshold??.1,v=mK(By.decode(u.buffer).data,By.decode(l.buffer).data,_.data,l.width,l.height,{threshold:M,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,C=v>M*100,F=`Visual diff of ${v.toFixed(2)}% detected, which is ${C?"over":"under"} the threshold of ${M*100}%.`;if(h&&(F+=` The ${h} screenshot was cropped since it was taller by ${E} pixels and wider by ${b} pixels.`),C)throw new R("ActionFailureError",F);return{fail:C,thoughts:F,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:By.encode(_,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var pK=3e4;function gK(r){if(!r.body)return{};switch(r.body.type){case"json":return{content:r.body.content,contentType:"application/json"};case"form-urlencoded":{let e=new URLSearchParams;return Object.entries(r.body.content).forEach(([t,n])=>{e.append(t,n)}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function cp({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??pK/1e3,i=Object.fromEntries(Object.entries(r.headers||{}).filter(([g,h])=>g&&h)),a=new URLSearchParams;Object.entries(r.params||{}).filter(([g,h])=>g&&h).forEach(([g,h])=>{a.append(g,h)});let s=a.toString(),c;if(Ns(r.url)&&(c=r.url),t&&Ds(r.url,t)&&(c=new URL(r.url,t).toString()),!c)throw new R("ActionFailureError",`Invalid URL: ${r.url}`);let l=c;e.info({url:l,searchParams:s,headers:i,body:r.body,method:r.method},"Making HTTP request");let d=await Y((async()=>{let g=s?`${l}?${s}`:l;try{let h=gK(r),f=new Headers(i);return h.contentType&&!f.has("Content-Type")&&f.set("Content-Type",h.contentType),await n(g,{headers:f,method:r.method,body:h.content})}catch(h){throw new Error(`Failed to make HTTP request: ${h}`,{cause:h})}})(),{milliseconds:o*1e3,fallback:()=>{throw new R("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 R("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:r.method,headers:i}};if(r.body?.type==="json"&&r.body.content)try{m.request.json=JSON.parse(r.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 hK=5e3;async function bO({timeout:r=mr,...e}){let t=Date.now(),n=r*1e3,o=n+1e4,i,a=0,s=500;for(;a-t<n;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await up(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 J(s,e.signal),s=Math.min(Math.floor(s*1.5),hK);else return i}return i=await up(e),i}async function up({assertion:r,browser:e,autoExpandIframes:t}){switch(r.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(t){let c=await e.evaluateFunctionInAllFrames(yO,{value:r.value,negated:!!r.negated,returnHtml:!1});i=r.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(yO,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let c=r.negated?mo.CONTAINS:po.CONTAINS;a=new R("AssertionFailureError",`The page ${c} '${r.value}'.`),o=s}}catch(s){a=new R("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"})(r)}}function yO({value:r,negated:e,returnHtml:t}){let n=document.body.innerHTML,o=n.includes(r)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&t?n:void 0}}var fK=3e4;async function EO({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??fK/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Ns(r.url)&&(s=r.url),t&&Ds(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new R("ActionFailureError",`Invalid URL: ${r.url}`);let l=await Y((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:r.query,variables:r.variables?JSON.parse(r.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 R("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 R("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new R("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new R("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 dp=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:t,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=t,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:t,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([Vn(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 ca({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:t,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...ye(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([Vn(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 ca({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:t,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...ye(a)},langfuseSessionId:s})}catch(g){throw new R("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return Vn(this.browser,e)}async locateElement(e){return await Uy({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return sn({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:t?{type:"url",url:t}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,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:t,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:t,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:t,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new R("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(t.type!=="description")throw new R("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:t.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 J(500)}}throw c}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:t,disableGlobalLocatorRedirect:n,logger:o}=e,i=oa(),a=!n&&this.browser.userBrowserSettings.globalLocatorRedirect!==!1;(this.browser.userBrowserSettings.visualActions||a)&&await i.startAsyncSpan("SCROLL_ELEMENT_INTO_VIEW",async()=>{await this.browser.scrollIntoViewIfNeeded(t.locator)});let s;return a&&(s=await i.startAsyncSpan("LOCATOR_REDIRECT",async()=>this.browser.performTargetRedirection(t,o))),s||(s={locator:t.locator,serverSideBoundingBox:await t.locator.boundingBox({timeout:ae}),originalElementLocationResult:t.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{ctx:t,cache:n,options:o,logger:i}=e,s=await oa().startAsyncSpan("CACHE_RESOLUTION",async l=>{let u=await this.browser.resolveTarget(t,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 sn({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:t,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=oa(),h=this.logger.child({commandId:s.id}),f=this.shouldUseMemory(),y=TO(e.cache);if((!y||d)&&!yg(o))throw new R("ActionFailureError","Cannot target element with no cached data or element descriptor");if(p)return this.wrapHardcodedCssTargetingCommandHelper(e);let E=!1;d&&(h.info("Cache explicitly disabled for this step"),E=!0,y=void 0);let b=oO({cache:y,description:o.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:h});y=b.cache,E=E||b.cacheBustedBeforeAction;let _=!0;if(!nO(y))return u--,_=!1,this.executeTargetingCommandWithAI({ctx:t,tracer:g,stepTracer:n,target:o,options:a,command:s,action:i,originalCache:l,logger:h,useMemory:f,cacheBustedBeforeAction:E});try{let{resolutionResult:M,finalTarget:O}=await this.resolveCachedTargetForAction({ctx:t,cache:y,options:a,logger:h}),v=await i(O);if(nt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!y.requirements}`,`hasAdditionalElements:${!!y.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.35.3"]),km({cmd:s,key:m,newTarget:y,logger:h,updatedWithAI:!1}),_){let C=M.decisions.filter(F=>F.matched);if(C.length!==1)h.warn({decisions:M.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let F=C[0].type;n.recordTargetAutoHeal({healType:F})}}return{result:v,elementInteractedDisplayString:M.displayString}}catch(M){this.throwIfClosed();let O=Ng(M);if(O&&!c)return h.warn({err:M},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({ctx:t,tracer:n,command:s,target:o,action:i,cache:l,originalCache:l,retriesWithAI:u,finalAttempt:!0,options:a});if(M instanceof R&&!O)throw h.warn({err:M},"Failed to execute command with target (fatal)"),M;if(u>0&&o){h.info({err:M},"Failed to execute action with cached target, retrying with AI"),nt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!y.requirements}`,`hasAdditionalElements:${!!y.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.35.3",`missReason:${M instanceof gt?M.cacheMissReason:"unknown"}`]);let v;return y.memory&&gE(y.memory)&&(v=y.memory),this.wrapElementTargetingCommandHelper({ctx:t,tracer:n,command:s,target:o,cache:void 0,action:i,originalCache:l,retriesWithAI:u,finalAttempt:!0,options:{...a,memory:v,targetHealingInProgress:!0}})}throw new R("ActionFailureError",`Failed to execute interactive command: ${M instanceof Error?M.message:`${M}`}`,{errOptions:{cause:M}})}}async executeTargetingCommandWithAI(e){let{ctx:t,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 dO({description:i.elementDescriptor,iframeUrl:a.iframeUrl,source:a.source,logger:u,allowNotActionableNodesOverride:a.allowNotActionableNodesOverride},this.getControllerFixtures(t)));let m=2;for(let g=1;g<=m;g++){let h=!1,f=this.browser.getActiveFrameConfig();try{let y;try{y=await Uy({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(t))}catch(_){if(_ instanceof wo&&_.updatedLocatorMemory){let M={id:-1,...l,memory:_.updatedLocatorMemory};km({cmd:s,key:a.targetName,newTarget:M,logger:u,updatedWithAI:!0})}throw _}y.frameConfig&&(this.browser.setActiveFrameConfig(y.frameConfig),h=!0);let E=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:y.resolution,disableGlobalLocatorRedirect:a.disableGlobalLocatorRedirect,logger:u}),b=await c(E);return km({cmd:s,key:a.targetName,newTarget:y.target,logger:u,updatedWithAI:!0}),a.targetHealingInProgress&&(o.recordTargetAutoHeal({healType:"AI"}),y.target.targetSource="AI_HEALED",y.target.targetUpdateTime=new Date().toUTCString(),y.target.targetUpdateLoggerTags=ye(u)),{result:b,elementInteractedDisplayString:y.resolution.displayString,thoughts:y.thoughts}}catch(y){if(h&&this.browser.setActiveFrameConfig(f),this.throwIfClosed(),g<m&&Ng(y)){u.warn({err:y,aiAttempt:g},"Encountered retryable AI targeting error; retrying with AI once");continue}throw y instanceof R?y:new R("ActionFailureError",y.message)}}throw new R("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return su(this.browser,e)}async executePresetCommand(e,t,n,o,i){this.options?.slowMoMs&&await J(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 R("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,t,n,o,i);return this.options?.autoFollowNewTabs&&await rO({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{Os(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>ly(e)}}async resolveCommandTemplateStrings(e,t){return Ps({obj:e,context:t,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,t,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()?sp({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 R("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new R("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return sp({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new R("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let h=aw(n.schema);if(h)throw new R("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:ye(a)});if(h.result==="NOT_FOUND")throw new R("ActionFailureError","No relevant data found for extraction goal on this page");if(h.thoughts?.includes("MaxGenerationLengthExceededError"))throw new R("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 R("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new R("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:h}}):h}}case"NAVIGATE":if(!Ns(n.url)&&!Ds(n.url,this.browser.baseUrl))throw new R("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 R("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&&Rn(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:y,thoughts:E}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:b=>this.browser.hover(b),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});m=y,g=E}let h=this.browser.getViewport()?.height??Po.height,f=this.browser.getViewport()?.width??Po.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 R("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 R("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let c=n.delay*1e3;await J(c,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(Rn(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:t,target:n.target,command:n,cache:n.cache?.target,action:E=>this.browser.click(E,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),y={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f,data:h.downloadedFile?{downloadedFile:h.downloadedFile}:void 0};return Wm(m,y.urlAfterCommand)&&(y.succeedImmediately=!0,y.succeedImmediatelyReason="URL changed"),y}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(Rn(n.fromTarget)&&Rn(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0});break}if(Rn(n.fromTarget)||Rn(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:t,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 R("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&Rn(n.target)){await this.browser.mouseDragUsingVisualCoordinates({deltaX:m,deltaY:g,steps:h,fromTarget:n.target.pixels});break}let f,y;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:E,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async _=>this.browser.mouseDrag(m,g,h,_.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=E,y=b}else await this.browser.mouseDrag(m,g,h,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:y}}case"SELECT_OPTION":{if(!Ao(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:t,command:n,target:{type:"description",elementDescriptor:m},cache:n.cache?.target,action:y=>this.browser.selectOption(y,g,n.force),options:{...n,targetName:"target",disableCache:i,source:Ll(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 Bn({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 R("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(m)}catch(g){throw new R("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&&Rn(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=TO(n.target),y=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:b,thoughts:_}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:f,cache:n.cache?.target,action:M=>this.browser.typeIntoTarget(n.value,M,{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:!y,source:Ll(n)}});g=b,h=_}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let E={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:h};return Wm(m,E.urlAfterCommand)&&(E.succeedImmediately=!0,E.succeedImmediatelyReason="URL changed"),E}case"HOVER":{if(Rn(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,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(!Ao(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,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&&!Ao(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:t,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 Wm(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 yK,g=SK(fetch,m),h;try{h=new URL(n.url).hostname}catch{}let f=await cp({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g});return{data:El.parse({...f,cookies:md(m,h)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await EO({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return SO({ctx:e,tracer:t,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 OI({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 R("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 Bn({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof m!="object")throw new R("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let g;try{g=uA.optional().parse(m)}catch(h){throw new R("ActionFailureError",`Credentials provided do not follow the required format: ${h}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let m=(n.timeout??mr)*1e3,g=this.generator.getAgentConfig()?.[Vt.ASSERTION];if(hO(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 y=await sp({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: ${y.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:y.afterScreenshotOverride}}finally{f.cache?.memory&&Jc(n,f.cache?.memory.traces,a)}}let h=await gO({command:n,tracer:t,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 sn({action:async()=>bO({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 ti(n.requestMatcher),g=this.browser.registerRequestListener(m);return this.registeredListeners[n.key]=g.then(async h=>await py(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 R("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await Y(m,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=new ti(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]=Ym(h)},onRequestComplete:(g,h)=>{this.recordedRequests[n.key]?.[g]&&(this.recordedRequests[n.key][g]=Ym(h))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[n.key];if(!m)throw new R("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 ti(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 ti(n.requestMatcher),async(g,h)=>{let f=await Bn({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"}),y=DA.parse(f);return new Response(y.body,{status:y.status,headers:y.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:t,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:t,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:ye(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:n}){this.recordAbortController=t;let o=new tp({signal:t.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:ye(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:ye(this.logger)})}};import{mkdirSync as GK}from"fs";import{tmpdir as HK}from"os";import PO from"path";import{diff as zK}from"deep-object-diff";import{cloneDeep as Gy}from"lodash-es";import CO from"fontoxpath";import bK from"@prettier/plugin-xml";import EK from"prettier";import{DOMParser as TK,XMLSerializer as vK}from"slimdom";var AK=new Set(["android.webkit.webview","com.facebook.react.views.webview.reactwebview","com.tencent.smtt.sdk.webview","com.tencent.smtt.sdk.x5webview","org.xwalk.core.xwalkview","com.uc.webview.export.webview"]);function RK(r){let e=r.toLowerCase();return e.endsWith("webview")||AK.has(e)}function lu(r){return!!(RK(r.tagName)||r.getAttribute("package")==="com.android.chrome"&&r.getAttribute("content-desc")==="Web View"&&vO(r.tagName.toLowerCase()).startsWith("frame"))}function vO(r){let e=["android.widget.","android.view.","android.webkit.","android.app.","android.support.","androidx.","com.android.inputmethod."];for(let t of e)if(r.startsWith(t))return r.substring(t.length);return r}var wK=new Set(["index","package","a11y-important","screen-reader-focusabl"]),CK=new Set(["selected","checked","checkable","clickable","enabled","focusable","focused","long-clickable","password","scrollable","selected","showing-hint","context-clickable","multiline","text-entry-key","heading","dismissable","screen-reader-focusable","content-invalid","a11y-focused"]),xK=new Set(["text","hint"]),_K=new Set(["live-region","drawing-order"]),MK=new Set(["displayed","enabled"]);function IK(r,e){let t={};for(let[n,o]of Object.entries(e))wK.has(n)||n==="class"&&r===o||n==="focusable"&&o==="true"&&e.clickable==="true"||CK.has(n)&&o==="false"||xK.has(n)&&o===""||MK.has(n)&&o==="true"||_K.has(n)&&o==="0"||n!=="id"&&(t[n]=o);return t}function AO(r,e,t){let{prunedDocument:n,idToElement:o,prunedIdToElement:i,idCounter:a,opts:s}=r,c=a.value++;t.setAttribute("id",String(c));let l={};for(let p of e.attributes){let m=p.name,g=p.value;g!=null&&(l[m]=String(g))}let u=IK(e.tagName,l);for(let[p,m]of Object.entries(u))t.setAttribute(p,m);if(o.set(c,e),i.set(c,t),lu(e)){let p=s?.injectedWebviewContent??"";if(s?.removeWebviewContent){for(;t.firstChild;)t.removeChild(t.firstChild);return}else if(!s?.disableMomenticAccessibilityTree&&p.trim().length>0){for(;t.firstChild;)t.removeChild(t.firstChild);p.trim().length>0&&t.appendChild(n.createCDATASection(`
4583
+ `),tokenLength:d}),s.forEach((h,f)=>{let y=h.ids[0],E=h.ids[h.ids.length-1];r.debug({tokenLength:h.tokenLength,minId:y,maxId:E},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var Z2=75e4,ap=3e5;async function ca(r){let{options:e,fixtures:t,screenshot:n}=r,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:s,signal:c}=t,l=r.tree,u=r.serializedTree,d=En(u);if(d>Z2)try{let p=ip({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await eK({...r,tokenLimit:ap-1e4,chunks:p.chunks}),u=l.serialize();let m=En(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(ap*Jo),u=l.serialize();let m=En(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>ap)try{if(o){let p=ip({serializedTree:u,options:sO,logger:i}),m=J2();l=await Y(Q2({...r,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let g=En(u);i.info({oldTokens:d,newTokens:g,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=g}else{let p=ip({serializedTree:u,options:aO,logger:i});l=await Y(tK({...r,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=En(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(ap*Jo),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function Q2({type:r,callId:e,chunks:t,description:n,fixtures:o,tree:i}){let{generator:a,signal:s,logger:c}=o,l=await a.rankChunksWithAi({chunks:t,description:n,type:r,softTokenLimit:4e4,hardTokenLimit:8e4,callId:e},{abortSignal:s,logger:c,loggerTags:ye(c)}),u=[];return t.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function eK(r){let{description:e,fixtures:t,tree:n}=r,{generator:o,logger:i,signal:a}=t;if(!e.trim())throw new Error("Empty description passed to page filtering");let s=await o.getExtractedKeywords({goal:e},{logger:i,loggerTags:ye(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let c of s.keywords){let l=r.chunks.filter(m=>m.content.toLowerCase().includes(c.toLowerCase()));if(!l.length||l.reduce((m,g)=>m+g.tokenLength,0)>r.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 tK(r){let{description:e,fixtures:t,chunkResult:n,tokenLimit:o,tree:i}=r,{generator:a,logger:s,signal:c}=t,l=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:c,logger:s,loggerTags:ye(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 Uy(r,e){if(!r.description)throw new R("UserConfigurationError","Cannot locate element with empty description");return sn({action:async()=>rK(r,e),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:e.browser,logger:r.logger})}async function rK(r,e){let{disableCache:t,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:c,logger:l,allowNotActionableNodesOverride:u,skipSavingVisualAttributes:d}=r,{orgId:p,browser:m,localCodeEvalTools:g,generator:h,abortSignal:f}=e,y=r.description,E=oa(),b=r.useMemory&&!t;n&&(y=await Xc({orgId:p,s:y,context:n,localTools:g,signal:f,logger:l})),a&&(y=tO(y,a));let{serializedTree:_,tree:M}=await E.startAsyncSpan("GET_PAGE_STATE",async()=>Vn(m,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),{}),O=await E.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let U,W=Date.now(),ue;for(;!U&&Date.now()-W<3e3;){f.throwIfAborted();try{U=await m.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(le){ue=le}}if(!U)throw new R("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${ue?.message}`);return U}),v=_,C=!1,P=`data:image/jpeg;base64,${O.toString("base64")}`;v=await ca({type:"locator",description:y,screenshot:P,serializedTree:_,options:{aiPageFiltering:c},tree:M,fixtures:{generator:h,signal:f,logger:l,orgId:p}}),v!==_&&(C=!0);let B=await E.startAsyncSpan("AI_LOCATOR_CALL",async U=>{let W=await h.getElementLocation({browserState:v,goal:y,screenshot:P,source:a,memory:b?s:void 0},{disableCache:t,abortSignal:f,loggerTags:ye(l),useMemory:b});return U.result=W,W});if(l.debug({usedRag:C,result:B},"Got locator result"),!(B.id>0))throw new wo(`Could not find any relevant element: ${B.thoughts}`,B.updatedMemory?{type:"GCS_TRACES",traces:B.updatedMemory}:void 0);let{resolution:ee,target:K,frameConfig:ge}=await E.startAsyncSpan("TARGET_RESOLUTION",async U=>{let W=await m.createTargetFromA11yId({id:B.id,requirements:B.requirements,additionalElements:B.additionalElements,description:y,targetSource:"AI",logger:l,skipSavingVisualAttributes:d});return U.result={serializedElement:W.target.nodeOnlySerializedHtml??"Unknown HTML element"},W});if(ee.a11yNode?.properties?.hidden&&ee.a11yNode?.properties?.hidden!=="false")throw new R("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${ee.displayString}`);return b&&(B.updatedMemory?K.memory={type:"GCS_TRACES",traces:B.updatedMemory}:s&&(K.memory=s)),{thoughts:B.thoughts,target:K,resolution:ee,frameConfig:ge,screenshot:P}}var nK=15;async function sp({command:r,aiPageFiltering:e,logger:t,fixtures:n,useMemory:o,maxRetries:i=nK}){if(!r.assertion.trim())throw new R("ActionFailureError","Assertion command is missing the assertion content");let a=oh.optional().catch(void 0).parse(r.source);r.source&&!a&&t.warn(`Invalid source ${r.source} for AI assertion, ignoring...`);let{browser:s}=n,c=r.timeout?r.timeout*1e3:s.smartWaitingTimeout,l=mI(c,i-1),u=0,d=Date.now(),p=d+c,m=d,g,h,f;try{await sn({action:()=>s.clearHighlights(),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:s,logger:t})}catch(y){t.warn({err:y},"Failed to clear highlights before AI check, continuing...")}for(;u<i;){n.abortSignal.throwIfAborted();let y=Date.now();if(u>0){if(y>=p)break;let _=p-y,M=m-y,O=Math.min(M,_);O>0&&await J(O,n.abortSignal)}let E=Date.now();if(u>0&&E>=p)break;let b=!1;try{if(g=await sn({action:async()=>{let M=await cO(s,t,n.abortSignal);return h&&h.serializedTree===M.serializedTree&&h.screenshotBuff.equals(M.screenshotBuff)?(b=!0,g):(h=M,uO({command:r,state:M,fixtures:n,useMemory:o,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:t,source:a}))},frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s}),g?.success){g?.updatedMemory&&Jc(r,g.updatedMemory,t);break}else throw g?.thoughts?new R("AssertionFailureError",g.thoughts):new R("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(_){n.abortSignal.throwIfAborted(),f=_ instanceof Error?_:new Error(`${_}`),b?t.info(`AI check attempt ${u} failed (re-used previous result)`):t.info({err:_},`AI check assert attempt ${u} failed, retrying...`)}finally{u++,m=E+l}}if(!g?.success){let y=p-Date.now();y>0&&await J(y,n.abortSignal)}if(!g?.success)try{g=await sn({action:async()=>uO({command:r,state:await cO(s,t,n.abortSignal),fixtures:n,useMemory:o,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:t}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s})}catch(y){n.abortSignal.throwIfAborted(),f=y instanceof Error?y:new Error(`${y}`)}finally{u++}if(g?.updatedMemory&&Jc(r,g.updatedMemory,t),!g?.success){let y=`AI check still failing after ${u} attempts.`;throw f&&(y+=` Latest result: ${f.message}`),new R("AssertionFailureError",y)}return{...g,succeedImmediately:!1,urlAfterCommand:s.url()}}async function cO(r,e,t){let[n,o]=await Promise.all([Vn(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function uO({command:r,state:e,fixtures:t,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:p}=t,m={type:"ASSERTION"},{serializedTree:g,tree:h}=e,f=e.screenshotBuff,y=f.toString("base64"),E=u.url(),b=r.contextChoice??"MULTIMODAL",_=g;b!=="VISION_ONLY"&&(_=await ca({type:"assertion",serializedTree:g,tree:h,description:r.assertion,screenshot:y,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:t.orgId}}),_!==g&&(m.ragUsed=!0),m.pageState=_);let M={goal:r.assertion,url:E,memory:o?r.cache?.memory:void 0,browserState:_,screenshot:y,contextChoice:b,source:c},v=await(b==="VISION_ONLY"?(C,F)=>d.getVisualAssertionResult(C,F):(C,F)=>d.getAssertionResult(C,F))(M,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!r.disableCache,abortSignal:p,logger:l,loggerTags:ye(l)});return(v.result||i)&&v.relevantElements&&(m.relevantElementsSerialized=v.relevantElements.map(C=>u.getSerializedFormFromA11yId(C)).filter(C=>!!C),await oK(v.relevantElements,u,l)),{success:v.result,thoughts:v.thoughts,afterScreenshotOverride:f,updatedMemory:o?v.updatedMemory:void 0}}async function oK(r,e,t){let n=Date.now();for(let o of r){if(Date.now()-n>2e3){t.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await Y(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){t.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var iK=1e5,lp=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function dO(r,e){let{logger:t}=r,{abortSignal:n,browser:o}=e,i=Date.now();try{await aK(i,r,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof lp?t.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):t.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await J(s,n)}finally{t.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function aK(r,e,t){let{abortSignal:n,browser:o}=t;if(o.smartWaitingTimeout<3e3){await J(o.smartWaitingTimeout,n);return}if(!e.description)throw new R("UserConfigurationError","Cannot locate element with empty description");await Y(sK(r,e,t),{milliseconds:o.smartWaitingTimeout})}async function sK(r,e,t){let{logger:n,iframeUrl:o}=e,{browser:i}=t;for(;Date.now()-r<i.smartWaitingTimeout;)if(await sn({action:async()=>lK(e,t),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function lK(r,e){let{testContext:t,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=r,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=r.description;t&&(d=await Xc({orgId:l,s:d,context:t,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await Vn(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(En(p)>iK)throw new lp;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(E){throw new R("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${E instanceof Error?E.message:E}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let y=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:ye(n)});return n.debug({result:y},"Got smart waiting result"),y.isPageReady}import{cloneDeep as pO}from"lodash-es";async function gO(r){let{command:e,timeoutMs:t,fixtures:n}=r,{abortSignal:o}=n,i=()=>Pu(e.cache)?e.cache:void 0,a=i(),s=pO(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=TM(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<t;){u++,u>1&&await J(p,o),o?.throwIfAborted(),a=i();let{result:h,elementWasFound:f}=await mO({cacheToUse:a,params:r});if(d=h,m=f,h.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new R("InternalPlatformError",`Failed to evaluate manual element assertion in ${t}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&Ra(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await mO({cacheToUse:h,params:r});d=f,d.success||c(!0)}let g=i();return d.success&&g?.target&&!m&&(g.target=FS(g.target),g.updatedAt=new Date),d}async function mO({cacheToUse:r,params:e}){let{command:t,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(t.target&&!Ao(t.target))throw new Error("Element assertion with x/y is not supported yet");let c=Nm(t.assertion),l,u=!1,d=pO(r);try{let{elementInteractedDisplayString:p,result:m,thoughts:g}=await a({ctx:o.ctx,tracer:i,command:t,target:t.target,cache:d?.target,action:async h=>cK(h.locator,e),options:{...t,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Ll(t),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 R)||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 cK(r,{command:e,fixtures:t}){return await t.browser.highlight(r),await uK(r,e.assertion)}async function uK(r,e){let t=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await r.textContent()??"";if(o={elementTextContent:$t(a,500,!0)},!zn(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=rn(e);t=!1,n=new R("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:$t(await r.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a=null;try{a=await r.getAttribute(e.attr,{timeout:3e3})}catch(s){n=new R("AssertionFailureError",s instanceof Error?s.message:String(s)),t=!1;break}if(!zn(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=rn(e);t=!1,e.operation==="EXISTS"?n=new R("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new R("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{t=await r.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},mr*1e3);break}case"EDITABLE":{t=await r.isEditable({timeout:mr*1e3});break}case"EXISTS":{t=!0;break}case"ENABLED":{t=await r.isEnabled({timeout:mr*1e3});break}case"FOCUSED":{t=await r.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(t=e.negated?!t:t,!t){let a=rn(e);n=new R("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await r.evaluate(s=>s.tagName);if(!zn(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=rn(e);t=!1,n=new R("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await r.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!zn(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=rn(e);t=!1,e.operation==="EXISTS"?n=new R("AssertionFailureError",`The style property ${e.property} ${s}`):n=new R("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:t,data:o,err:n}}function hO(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&r.condition==="EXISTS"}import{Jimp as dK}from"jimp";async function su(r,e){let t=await r.screenshot(e),n=await dK.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as fO}from"jimp";import By from"jpeg-js";import mK from"pixelmatch";async function SO({ctx:r,tracer:e,command:t,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!Ao(t.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;t.target?.elementDescriptor?l=(await i({ctx:r,tracer:e,command:t,target:t.target,cache:t.cache?.target,action:async B=>su(o,{locator:B.locator,...c}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:l=await su(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,t,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 P=`${l.width}x${l.height}`,B=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${P}) does not match saved screenshot dimensions (${B}) - 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 fO.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await fO.fromBuffer(u.buffer),g={width:u.width,height:u.height},h,f=p.width*p.height,y=g.width*g.height,E=Math.abs(p.height-g.height),b=Math.abs(p.width-g.width);if(f>y){let P=d.cover({w:g.width,h:g.height});l.buffer=await P.getBuffer("image/jpeg"),h="current",l.width=g.width,l.height=g.height}else if(y>f){let P=m.cover({w:p.width,h:p.height});u.buffer=await P.getBuffer("image/jpeg"),h="saved"}let _={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},M=t.threshold??.1,v=mK(By.decode(u.buffer).data,By.decode(l.buffer).data,_.data,l.width,l.height,{threshold:M,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,C=v>M*100,F=`Visual diff of ${v.toFixed(2)}% detected, which is ${C?"over":"under"} the threshold of ${M*100}%.`;if(h&&(F+=` The ${h} screenshot was cropped since it was taller by ${E} pixels and wider by ${b} pixels.`),C)throw new R("ActionFailureError",F);return{fail:C,thoughts:F,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:By.encode(_,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var pK=3e4;function gK(r){if(!r.body)return{};switch(r.body.type){case"json":return{content:r.body.content,contentType:"application/json"};case"form-urlencoded":{let e=new URLSearchParams;return Object.entries(r.body.content).forEach(([t,n])=>{e.append(t,n)}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function cp({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??pK/1e3,i=Object.fromEntries(Object.entries(r.headers||{}).filter(([g,h])=>g&&h)),a=new URLSearchParams;Object.entries(r.params||{}).filter(([g,h])=>g&&h).forEach(([g,h])=>{a.append(g,h)});let s=a.toString(),c;if(Ns(r.url)&&(c=r.url),t&&Ds(r.url,t)&&(c=new URL(r.url,t).toString()),!c)throw new R("ActionFailureError",`Invalid URL: ${r.url}`);let l=c;e.info({url:l,searchParams:s,headers:i,body:r.body,method:r.method},"Making HTTP request");let d=await Y((async()=>{let g=s?`${l}?${s}`:l;try{let h=gK(r),f=new Headers(i);return h.contentType&&!f.has("Content-Type")&&f.set("Content-Type",h.contentType),await n(g,{headers:f,method:r.method,body:h.content})}catch(h){throw new Error(`Failed to make HTTP request: ${h}`,{cause:h})}})(),{milliseconds:o*1e3,fallback:()=>{throw new R("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 R("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:r.method,headers:i}};if(r.body?.type==="json"&&r.body.content)try{m.request.json=JSON.parse(r.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 hK=5e3;async function bO({timeout:r=mr,...e}){let t=Date.now(),n=r*1e3,o=n+1e4,i,a=0,s=500;for(;a-t<n;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await up(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 J(s,e.signal),s=Math.min(Math.floor(s*1.5),hK);else return i}return i=await up(e),i}async function up({assertion:r,browser:e,autoExpandIframes:t}){switch(r.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(t){let c=await e.evaluateFunctionInAllFrames(yO,{value:r.value,negated:!!r.negated,returnHtml:!1});i=r.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(yO,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let c=r.negated?mo.CONTAINS:po.CONTAINS;a=new R("AssertionFailureError",`The page ${c} '${r.value}'.`),o=s}}catch(s){a=new R("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"})(r)}}function yO({value:r,negated:e,returnHtml:t}){let n=document.body.innerHTML,o=n.includes(r)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&t?n:void 0}}var fK=3e4;async function EO({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??fK/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Ns(r.url)&&(s=r.url),t&&Ds(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new R("ActionFailureError",`Invalid URL: ${r.url}`);let l=await Y((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:r.query,variables:r.variables?JSON.parse(r.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 R("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 R("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new R("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new R("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 dp=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:t,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=t,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:t,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([Vn(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 ca({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:t,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...ye(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([Vn(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 ca({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:t,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...ye(a)},langfuseSessionId:s})}catch(g){throw new R("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return Vn(this.browser,e)}async locateElement(e){return await Uy({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return sn({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:t?{type:"url",url:t}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,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:t,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:t,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:t,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new R("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(t.type!=="description")throw new R("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:t.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 J(500)}}throw c}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:t,disableGlobalLocatorRedirect:n,logger:o}=e,i=oa(),a=!n&&this.browser.userBrowserSettings.globalLocatorRedirect!==!1;(this.browser.userBrowserSettings.visualActions||a)&&await i.startAsyncSpan("SCROLL_ELEMENT_INTO_VIEW",async()=>{await this.browser.scrollIntoViewIfNeeded(t.locator)});let s;return a&&(s=await i.startAsyncSpan("LOCATOR_REDIRECT",async()=>this.browser.performTargetRedirection(t,o))),s||(s={locator:t.locator,serverSideBoundingBox:await t.locator.boundingBox({timeout:ae}),originalElementLocationResult:t.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{ctx:t,cache:n,options:o,logger:i}=e,s=await oa().startAsyncSpan("CACHE_RESOLUTION",async l=>{let u=await this.browser.resolveTarget(t,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 sn({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:t,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=oa(),h=this.logger.child({commandId:s.id}),f=this.shouldUseMemory(),y=TO(e.cache);if((!y||d)&&!yg(o))throw new R("ActionFailureError","Cannot target element with no cached data or element descriptor");if(p)return this.wrapHardcodedCssTargetingCommandHelper(e);let E=!1;d&&(h.info("Cache explicitly disabled for this step"),E=!0,y=void 0);let b=oO({cache:y,description:o.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:h});y=b.cache,E=E||b.cacheBustedBeforeAction;let _=!0;if(!nO(y))return u--,_=!1,this.executeTargetingCommandWithAI({ctx:t,tracer:g,stepTracer:n,target:o,options:a,command:s,action:i,originalCache:l,logger:h,useMemory:f,cacheBustedBeforeAction:E});try{let{resolutionResult:M,finalTarget:O}=await this.resolveCachedTargetForAction({ctx:t,cache:y,options:a,logger:h}),v=await i(O);if(nt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!y.requirements}`,`hasAdditionalElements:${!!y.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.35.4"]),km({cmd:s,key:m,newTarget:y,logger:h,updatedWithAI:!1}),_){let C=M.decisions.filter(F=>F.matched);if(C.length!==1)h.warn({decisions:M.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let F=C[0].type;n.recordTargetAutoHeal({healType:F})}}return{result:v,elementInteractedDisplayString:M.displayString}}catch(M){this.throwIfClosed();let O=Ng(M);if(O&&!c)return h.warn({err:M},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({ctx:t,tracer:n,command:s,target:o,action:i,cache:l,originalCache:l,retriesWithAI:u,finalAttempt:!0,options:a});if(M instanceof R&&!O)throw h.warn({err:M},"Failed to execute command with target (fatal)"),M;if(u>0&&o){h.info({err:M},"Failed to execute action with cached target, retrying with AI"),nt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!y.requirements}`,`hasAdditionalElements:${!!y.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.35.4",`missReason:${M instanceof gt?M.cacheMissReason:"unknown"}`]);let v;return y.memory&&gE(y.memory)&&(v=y.memory),this.wrapElementTargetingCommandHelper({ctx:t,tracer:n,command:s,target:o,cache:void 0,action:i,originalCache:l,retriesWithAI:u,finalAttempt:!0,options:{...a,memory:v,targetHealingInProgress:!0}})}throw new R("ActionFailureError",`Failed to execute interactive command: ${M instanceof Error?M.message:`${M}`}`,{errOptions:{cause:M}})}}async executeTargetingCommandWithAI(e){let{ctx:t,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 dO({description:i.elementDescriptor,iframeUrl:a.iframeUrl,source:a.source,logger:u,allowNotActionableNodesOverride:a.allowNotActionableNodesOverride},this.getControllerFixtures(t)));let m=2;for(let g=1;g<=m;g++){let h=!1,f=this.browser.getActiveFrameConfig();try{let y;try{y=await Uy({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(t))}catch(_){if(_ instanceof wo&&_.updatedLocatorMemory){let M={id:-1,...l,memory:_.updatedLocatorMemory};km({cmd:s,key:a.targetName,newTarget:M,logger:u,updatedWithAI:!0})}throw _}y.frameConfig&&(this.browser.setActiveFrameConfig(y.frameConfig),h=!0);let E=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:y.resolution,disableGlobalLocatorRedirect:a.disableGlobalLocatorRedirect,logger:u}),b=await c(E);return km({cmd:s,key:a.targetName,newTarget:y.target,logger:u,updatedWithAI:!0}),a.targetHealingInProgress&&(o.recordTargetAutoHeal({healType:"AI"}),y.target.targetSource="AI_HEALED",y.target.targetUpdateTime=new Date().toUTCString(),y.target.targetUpdateLoggerTags=ye(u)),{result:b,elementInteractedDisplayString:y.resolution.displayString,thoughts:y.thoughts}}catch(y){if(h&&this.browser.setActiveFrameConfig(f),this.throwIfClosed(),g<m&&Ng(y)){u.warn({err:y,aiAttempt:g},"Encountered retryable AI targeting error; retrying with AI once");continue}throw y instanceof R?y:new R("ActionFailureError",y.message)}}throw new R("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return su(this.browser,e)}async executePresetCommand(e,t,n,o,i){this.options?.slowMoMs&&await J(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 R("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,t,n,o,i);return this.options?.autoFollowNewTabs&&await rO({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{Os(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>ly(e)}}async resolveCommandTemplateStrings(e,t){return Ps({obj:e,context:t,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,t,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()?sp({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 R("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new R("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return sp({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new R("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let h=aw(n.schema);if(h)throw new R("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:ye(a)});if(h.result==="NOT_FOUND")throw new R("ActionFailureError","No relevant data found for extraction goal on this page");if(h.thoughts?.includes("MaxGenerationLengthExceededError"))throw new R("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 R("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new R("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:h}}):h}}case"NAVIGATE":if(!Ns(n.url)&&!Ds(n.url,this.browser.baseUrl))throw new R("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 R("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&&Rn(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:y,thoughts:E}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:b=>this.browser.hover(b),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});m=y,g=E}let h=this.browser.getViewport()?.height??Po.height,f=this.browser.getViewport()?.width??Po.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 R("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 R("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let c=n.delay*1e3;await J(c,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(Rn(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:t,target:n.target,command:n,cache:n.cache?.target,action:E=>this.browser.click(E,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),y={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f,data:h.downloadedFile?{downloadedFile:h.downloadedFile}:void 0};return Wm(m,y.urlAfterCommand)&&(y.succeedImmediately=!0,y.succeedImmediatelyReason="URL changed"),y}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(Rn(n.fromTarget)&&Rn(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0});break}if(Rn(n.fromTarget)||Rn(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:t,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 R("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&Rn(n.target)){await this.browser.mouseDragUsingVisualCoordinates({deltaX:m,deltaY:g,steps:h,fromTarget:n.target.pixels});break}let f,y;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:E,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async _=>this.browser.mouseDrag(m,g,h,_.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=E,y=b}else await this.browser.mouseDrag(m,g,h,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:y}}case"SELECT_OPTION":{if(!Ao(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:t,command:n,target:{type:"description",elementDescriptor:m},cache:n.cache?.target,action:y=>this.browser.selectOption(y,g,n.force),options:{...n,targetName:"target",disableCache:i,source:Ll(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 Bn({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 R("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(m)}catch(g){throw new R("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&&Rn(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=TO(n.target),y=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:b,thoughts:_}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:f,cache:n.cache?.target,action:M=>this.browser.typeIntoTarget(n.value,M,{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:!y,source:Ll(n)}});g=b,h=_}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let E={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:h};return Wm(m,E.urlAfterCommand)&&(E.succeedImmediately=!0,E.succeedImmediatelyReason="URL changed"),E}case"HOVER":{if(Rn(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,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(!Ao(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,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&&!Ao(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:t,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 Wm(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 yK,g=SK(fetch,m),h;try{h=new URL(n.url).hostname}catch{}let f=await cp({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g});return{data:El.parse({...f,cookies:md(m,h)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await EO({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return SO({ctx:e,tracer:t,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 OI({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 R("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 Bn({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof m!="object")throw new R("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let g;try{g=uA.optional().parse(m)}catch(h){throw new R("ActionFailureError",`Credentials provided do not follow the required format: ${h}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let m=(n.timeout??mr)*1e3,g=this.generator.getAgentConfig()?.[Vt.ASSERTION];if(hO(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 y=await sp({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: ${y.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:y.afterScreenshotOverride}}finally{f.cache?.memory&&Jc(n,f.cache?.memory.traces,a)}}let h=await gO({command:n,tracer:t,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 sn({action:async()=>bO({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 ti(n.requestMatcher),g=this.browser.registerRequestListener(m);return this.registeredListeners[n.key]=g.then(async h=>await py(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 R("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await Y(m,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=new ti(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]=Ym(h)},onRequestComplete:(g,h)=>{this.recordedRequests[n.key]?.[g]&&(this.recordedRequests[n.key][g]=Ym(h))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[n.key];if(!m)throw new R("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 ti(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 ti(n.requestMatcher),async(g,h)=>{let f=await Bn({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"}),y=DA.parse(f);return new Response(y.body,{status:y.status,headers:y.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:t,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:t,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:ye(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:n}){this.recordAbortController=t;let o=new tp({signal:t.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:ye(this.logger)})}async getFailureRecoveryPlan(e,t){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:ye(t??this.logger)})}};import{mkdirSync as GK}from"fs";import{tmpdir as HK}from"os";import PO from"path";import{diff as zK}from"deep-object-diff";import{cloneDeep as Gy}from"lodash-es";import CO from"fontoxpath";import bK from"@prettier/plugin-xml";import EK from"prettier";import{DOMParser as TK,XMLSerializer as vK}from"slimdom";var AK=new Set(["android.webkit.webview","com.facebook.react.views.webview.reactwebview","com.tencent.smtt.sdk.webview","com.tencent.smtt.sdk.x5webview","org.xwalk.core.xwalkview","com.uc.webview.export.webview"]);function RK(r){let e=r.toLowerCase();return e.endsWith("webview")||AK.has(e)}function lu(r){return!!(RK(r.tagName)||r.getAttribute("package")==="com.android.chrome"&&r.getAttribute("content-desc")==="Web View"&&vO(r.tagName.toLowerCase()).startsWith("frame"))}function vO(r){let e=["android.widget.","android.view.","android.webkit.","android.app.","android.support.","androidx.","com.android.inputmethod."];for(let t of e)if(r.startsWith(t))return r.substring(t.length);return r}var wK=new Set(["index","package","a11y-important","screen-reader-focusabl"]),CK=new Set(["selected","checked","checkable","clickable","enabled","focusable","focused","long-clickable","password","scrollable","selected","showing-hint","context-clickable","multiline","text-entry-key","heading","dismissable","screen-reader-focusable","content-invalid","a11y-focused"]),xK=new Set(["text","hint"]),_K=new Set(["live-region","drawing-order"]),MK=new Set(["displayed","enabled"]);function IK(r,e){let t={};for(let[n,o]of Object.entries(e))wK.has(n)||n==="class"&&r===o||n==="focusable"&&o==="true"&&e.clickable==="true"||CK.has(n)&&o==="false"||xK.has(n)&&o===""||MK.has(n)&&o==="true"||_K.has(n)&&o==="0"||n!=="id"&&(t[n]=o);return t}function AO(r,e,t){let{prunedDocument:n,idToElement:o,prunedIdToElement:i,idCounter:a,opts:s}=r,c=a.value++;t.setAttribute("id",String(c));let l={};for(let p of e.attributes){let m=p.name,g=p.value;g!=null&&(l[m]=String(g))}let u=IK(e.tagName,l);for(let[p,m]of Object.entries(u))t.setAttribute(p,m);if(o.set(c,e),i.set(c,t),lu(e)){let p=s?.injectedWebviewContent??"";if(s?.removeWebviewContent){for(;t.firstChild;)t.removeChild(t.firstChild);return}else if(!s?.disableMomenticAccessibilityTree&&p.trim().length>0){for(;t.firstChild;)t.removeChild(t.firstChild);p.trim().length>0&&t.appendChild(n.createCDATASection(`
4584
4584
  ${p}
4585
- `));return}}let d=Array.from(e.childNodes??[]);for(let p of d){let m=p.nodeType;if(m===3){let g=p.nodeValue;g&&g.trim().length>0&&t.appendChild(n.createTextNode(g));continue}if(m===1){let g=p;if(!LK(g,s?.viewportBounds))continue;let h=n.createElement(vO(g.tagName));AO(r,g,h),t.appendChild(h)}}}function PK(r,e,t,n){let o=r.parseFromString("<hierarchy/>","text/xml"),i=new Map,a={prunedDocument:o,idToElement:t,prunedIdToElement:i,idCounter:{value:0},opts:n},s=o.documentElement;AO(a,e,s);let c=new vK().serializeToString(o);return{prunedDocument:o,prunedIdToElement:i,xml:c}}async function RO(r,e){let t=new TK,n=t.parseFromString(r,"text/xml"),o=new Map,i=n.documentElement;if(!i)throw new R("InternalWebAgentError","No root element found in XML");if(i.tagName!=="hierarchy")throw new R("InternalWebAgentError","No hierarchy element found in XML");let{prunedDocument:a,prunedIdToElement:s,xml:c}=PK(t,i,o,e);return{xml:await EK.format(c,{parser:"xml",plugins:[bK],printWidth:120,tabWidth:1,singleAttributePerLine:!1}),originalXml:r,document:n,idToElement:o,prunedDocument:a,prunedIdToElement:s}}function OK(r){let e=[],t=r;for(;t;){let n=t.tagName,o=t.parentElement,i=1;if(o){let a=Array.from(o.children).filter(s=>s.tagName===n);for(let s=0;s<a.length;s++)if(a[s]===t){i=s+1;break}}e.unshift(`${n}[${i}]`),t=o}return`/${e.join("/")}`}function mp(r,e){let t=r.idToElement.get(e);if(t)return OK(t)}function zy(r,e){let t=r.idToElement.get(e);if(!t)return;let n=t.cloneNode(!0);for(let o of Array.from(n.children)){let i=o;for(let a of Array.from(i.children))i.removeChild(a)}return n.outerHTML}function ua(r){if(!r.hasAttribute("bounds"))return;let e=r.getAttribute("bounds");if(!e)return;let t=e.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);if(t){let n=parseInt(t[1],10),o=parseInt(t[2],10),i=parseInt(t[3],10),a=parseInt(t[4],10);if(Number.isFinite(n)&&Number.isFinite(o)&&Number.isFinite(i)&&Number.isFinite(a))return[n,o,i,a]}}function LK(r,e){if(!e)return!0;let t=ua(r);if(!t||t.length<4)return!0;let n=t[0],o=t[1],i=t[2],a=t[3];return!(i<=e.left||n>=e.right||a<=e.top||o>=e.bottom)}function wO(r,e){if(r&&!(!e||e.length===0))return Object.fromEntries(e.map(t=>[t,r.getAttribute(t)]).filter(([,t])=>t!==null))}function xO({requirements:r,element:e}){let t;if((r?.positionSpecificity||r?.shapeSpecificity)&&(t=ua(e),!t))throw new R("ActionFailureError","Element to cache has no bounds or unexpected bounds format");return{requiredText:r?.textRequired?e.getAttribute("text")??void 0:void 0,requiredAttributes:wO(e,r?.attributesRequired),requiredBounds:r?.boundsRequired,position:r?.positionSpecificity?{x1:t[0],y1:t[1],x2:t[2],y2:t[3],tolerance:r?.positionSpecificity}:void 0,shape:r?.shapeSpecificity?{width:t[2]-t[0],height:t[3]-t[1],tolerance:r?.shapeSpecificity}:void 0}}function MO({aiResponse:r,description:e,emulatorState:t,memory:n,useMemory:o}){let i=t.graph.idToElement.get(r.id);if(!i)throw new R("InternalWebAgentError",`Could not find node with id: ${r.id}`);let a=ua(i);if(!a)throw new R("InternalWebAgentError",`Node ${r.id} has no bounding box: ${i.outerHTML}`);let s=mp(t.graph,r.id)??"",c=zy(t.graph,r.id)??"",l=xO({requirements:r.requirements,element:i}),u=[];r.additionalElements&&(u=r.additionalElements.map(({id:p,requirements:m})=>{let g=t.graph.idToElement.get(p);if(!g)return;let h=mp(t.graph,p);return h?{xPath:h,requirements:xO({requirements:m,element:g})}:void 0}).filter(p=>!!p));let d;if(lu(i)&&r.inWebview!==!1?d={type:"WEBVIEW",resolvedDescription:e,xPath:s}:d={type:"NATIVE",bounds:a,resolvedDescription:e,xPath:s,elementOnlySerializedXml:c,requirements:l,requiredRelatedElements:u},o)if(r.updatedMemory){let p={type:"GCS_TRACES",traces:r.updatedMemory};d.memory=p}else n&&(d.memory=n);return{target:d,resolvedNode:i}}function IO(r){return r?.type==="WEBVIEW"?r.browserCache?.memory:void 0}var NK=.1,DK=.25;function pp(r,e,t,n){let o=Math.abs(e-t);switch(r){case"precise":return o<=n;case"narrow":return o<=Math.abs(e)*NK;case"broad":return o<=Math.abs(e)*DK;case"irrelevant":return!0}}function kK(r,e){let t=e.x2-e.x1,n=(e.x1+e.x2)/2,o=(r[0]+r[2])/2;if(!pp(e.tolerance,n,o,Math.min(1,t)))return!1;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(r[1]+r[3])/2;return pp(e.tolerance,a,s,Math.min(1,i))}function FK(r,e){return pp(e.tolerance,e.width,r[2]-r[0],Math.min(1,e.width))?pp(e.tolerance,e.height,r[3]-r[1],Math.min(1,e.height)):!1}var _O=(r,e,t)=>{if(!e)return;let{requiredAttributes:n,requiredText:o,requiredBounds:i,position:a,shape:s}=e;if(o!==void 0&&o.length>0){let c=Yc(r);if(c!==o)throw new gt(`Resolved element text mismatch: expected ${o}, got ${c}`)}if(n)for(let[c,l]of Object.entries(n)){let u=r.getAttribute(c)??void 0;if(u!==l)throw new gt(`Attribute ${c} mismatch: expected ${l}, got ${u}`)}if(i&&t&&!t.targetBounds.every((l,u)=>l===t.newElementBounds[u]))throw new gt(`Bounds changed from [${t.targetBounds.join(",")} ] to [${t.newElementBounds.join(",")} ]`);if(a&&t&&!kK(t.newElementBounds,a))throw new gt(`Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(t.newElementBounds)}`);if(s&&t&&!FK(t.newElementBounds,s))throw new gt(`Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(t.newElementBounds)}`)};async function gp(r){let{target:e,domState:t}=r,{graph:n}=t,{document:o}=n,i=se();if(e.type==="WEBVIEW")return UK(e,r);if(!e.xPath)throw new R("ActionFailureError","Native element cache has no XPath");let a=CO.evaluateXPathToFirstNode(e.xPath,o,null,null);if(!a)throw new gt(`Could not resolve cached target via XPath: ${e.xPath}`);if(e.requiredRelatedElements){let p=e.requiredRelatedElements;i.startSection("Validate related elements are similar enough to past runs",()=>{for(let m of p){let g=CO.evaluateXPathToFirstNode(m.xPath,o);if(!g)throw new gt(`Required related element not found for XPath: ${m.xPath}`);_O(g,m.requirements)}})}let s=ua(a);if(!s)throw new gt("Resolved native element has no bounding box");if(!e.bounds)throw new gt("Native element cache has no bounds");_O(a,e.requirements,{targetBounds:e.bounds,newElementBounds:s});let c;for(let[p,m]of n.idToElement.entries())if(m===a){c=p;break}let l=e.elementOnlySerializedXml,u=e.xPath;return c!==void 0&&(l=zy(n,c)??l,u=mp(n,c)??u),{resolvedTarget:{...e,resolvedNode:a,bounds:s,elementOnlySerializedXml:l,xPath:u}}}async function UK(r,e){let{stateManager:t,logger:n,signal:o}=e,i=se(),a=await t.getActiveWebview();if(!a||!a.browserController)throw n.error({webview:a?{...a,browserController:!!a.browserController}:void 0},"resolveTargetCacheInWebView: No browser controller attached"),new gt("No browser controller is attached to the requested webview");let s=a.browserController;if(!r.browserCache)throw n.error({target:r},"resolveTargetCacheInWebView: No browser target available on cache"),new gt("No browser target available on cache");let c=r.browserCache,{finalTarget:l}=await i.startAsyncSection("Resolve target in webview",()=>s.resolveCachedTargetForAction({ctx:null,cache:c,options:{disableGlobalLocatorRedirect:e.disableTargetRedirection,resolveTargetOptions:{logger:n,signal:o,skipWaitForPageLoad:!0,skipSavingVisualAttributes:!0}},logger:n}));return{resolvedTarget:{...r,controller:a.browserController,browserTarget:l}}}function da(r){let{command:e,cacheKey:t="cache",targetName:n="target",updatedCache:o}=r;Gi(e)&&(e[t]={...e[t],[n]:$a.parse(o)},r.updatedWithAI&&(e[t].updatedAt=new Date,e[t].updatedAtLoggerTags=ye(r.logger)))}function hp(r){if(r.type==="WEBVIEW")return{type:"WEBVIEW",resolvedDescription:r.resolvedDescription,xPath:r.xPath,browserCache:r.browserCache,memory:r.memory};let{resolvedNode:e,...t}=r;return{...t}}var Rt=class{driver;generator;stateManager;logger;fixtures;aborter;orgId;aiSettings;options;constructor(e){this.stateManager=e.stateManager,this.generator=e.generator,this.driver=e.driver,this.logger=e.logger,this.fixtures=e.fixtures,this.aborter=e.aborter,this.orgId=e.orgId,this.aiSettings=e.aiSettings,this.options=e.options}shouldUseMemoryForCommand(e){return this.aiSettings?.useMemory&&!e?.disableCache}async findElement({description:e,tracer:t,skipFetchingFullWebviewContent:n=!1,removeWebviewContent:o=!1,useMemory:i=!1,memory:a,webviewMemory:s,metadata:c}){let l=this.logger.child({...c}),u=await t.startAsyncSection("Get emulator state",async()=>{let f=await this.stateManager.getDomState({skipFetchingFullWebviewContent:n,removeWebviewContent:o}),y=await this.stateManager.getCurrentScreenshotPngString();return{emulatorState:f,screenshot:y}}),d;try{d=await t.startAsyncSpan("AI_LOCATOR_CALL",async f=>{let y=await this.generator.getAndroidElementLocation({description:e,screenXml:u.emulatorState.graph.xml,screenshot:u.screenshot,memory:i?a:void 0},{logger:l,loggerTags:ye(l),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["android-locator"]});return f.result=y,y})}catch(f){throw this.throwIfAborted(),l.error({err:f},"Failed to locate element"),new R("InternalWebAgentError",`Failed to locate element: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}if(d.id===-1){let f=d.updatedMemory?{type:"GCS_TRACES",traces:d.updatedMemory}:void 0;return{success:!1,thoughts:d.thoughts??"No matching element found",updatedLocatorMemory:f}}let{target:p,resolvedNode:m}=MO({aiResponse:d,description:e,emulatorState:u.emulatorState,memory:a,useMemory:i});if(p.type==="NATIVE")return t.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:p.elementOnlySerializedXml??"Unknown element"},attributes:{},subSpans:[]}),{success:!0,resolvedTarget:{...p,resolvedNode:m},thoughts:d.thoughts};let{browserLocateResult:g,browserController:h}=await t.startWebviewTrace(async()=>{let f=await this.stateManager.getActiveWebview();if(!f||!f.browserController)throw new R("InternalWebAgentError","No browser controller is attached to the requested webview");return{browserLocateResult:await f.browserController.locateElement({description:e,disableCache:!1,useMemory:i,memory:i?s:void 0,logger:this.logger,skipWait:!0,skipSavingVisualAttributes:!0}),browserController:f.browserController}});return t.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:g.target.nodeOnlySerializedHtml??"Unknown HTML element in webview"},attributes:{},subSpans:[]}),{success:!0,resolvedTarget:{...p,controller:h,browserTarget:{...g.resolution,serverSideBoundingBox:await g.resolution.locator.boundingBox({timeout:5e3})},browserCache:g.target},thoughts:g.thoughts}}async targetingActionWithAILocator(e){let{action:t,command:n,description:o,tracer:i,cacheKey:a,targetName:s,cache:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,metadata:d}=e,p=await this.findElement({description:o,tracer:i,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:this.shouldUseMemoryForCommand(n),memory:c?.memory,webviewMemory:IO(c),metadata:d});if(!p.success){if(p.updatedLocatorMemory&&c){let h={...c,memory:p.updatedLocatorMemory};da({command:n,cacheKey:a,targetName:s,updatedCache:h,updatedWithAI:!0,logger:this.logger})}throw new R("NoMatchingElementError",p.thoughts??"No matching element found")}let m=p.thoughts,g=await t(p.resolvedTarget);return da({command:n,cacheKey:a,targetName:s,updatedCache:p.resolvedTarget,updatedWithAI:!0,logger:this.logger}),{result:g,thoughts:m}}async wrapTargetingAction(e){let{action:t,description:n,command:o,cacheKey:i="cache",targetName:a="target",cacheIsInvalidAfterResolution:s,tracer:c,skipFetchingFullWebviewContent:l=!1,removeWebviewContent:u=!1,disableTargetRedirection:d=!1}=e,p,m={commandId:o.id};if(i==="cache"&&"cache"in o&&o.cache){let b=o.cache;a==="target"&&"target"in b?p=b.target:a==="fromTarget"&&"fromTarget"in b?p=b.fromTarget:a==="toTarget"&&"toTarget"in b&&(p=b.toTarget)}let g=!1,h=Gy(p);if(o.disableCache&&(this.logger.debug({command:o},"Cache explicitly disabled for command"),g=!0,h=void 0),s&&(g=!0,h=void 0),h&&h?.resolvedDescription!==n&&(this.logger.info({description:n,cacheDescription:h?.resolvedDescription},"Cache description mismatch, clearing it automatically"),g=!0,h=void 0),!h)return this.logger.info({description:n,cacheBustedBeforeAction:g},"Prompting AI for a new element location"),this.targetingActionWithAILocator({action:t,command:o,description:n,tracer:c,cacheKey:i,targetName:a,cache:p,skipFetchingFullWebviewContent:l,removeWebviewContent:u,metadata:m});let f=h.type==="NATIVE"?!!h.requirements:!!h.browserCache?.requirements,y=h.type==="NATIVE"?!!h.requiredRelatedElements?.length:!!h.browserCache?.additionalElements?.length,E;try{this.options?.emulator?.waitForStability&&await this.stateManager.waitForPageSourceStability({timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"});let{resolvedTarget:b,updatedCache:_}=await c.startAsyncSpan("CACHE_RESOLUTION",async O=>{let v=Date.now(),C;for(;Date.now()-v<3e3;){E=await this.stateManager.getDomState({skipFetchingFullWebviewContent:h?.type==="NATIVE"});let F;try{F=(await gp({target:h,domState:E,stateManager:this.stateManager,logger:this.logger,disableTargetRedirection:d})).resolvedTarget}catch(D){if(C=D,D instanceof gt){this.logger.warn({err:D},"Failed to resolve target cache, retrying");continue}throw this.logger.error({err:D},"Failed to resolve target cache"),D}let P=hp(F),B=zK(h,P);return B&&Object.keys(B).length>0&&this.logger.info({cacheDiffs:B},"Successfully resolved target with cache"),O.attributes.serializedElement=F.type==="WEBVIEW"?F.browserCache?.nodeOnlySerializedHtml??"Unknown HTML element in webview":F.elementOnlySerializedXml??"Unknown element",{resolvedTarget:F,updatedCache:P}}throw C}),M=await t(b);return da({command:o,cacheKey:i,targetName:a,updatedCache:_,updatedWithAI:!1,logger:this.logger}),nt.increment("cache_target_resolution_v2",1,["outcome:hit",`platform:mobile-${h.type.toLowerCase()}`,`hasRequirements:${f}`,`hasAdditionalElements:${y}`,`orgId:${this.orgId}`,"cliVersion:0.35.3"]),{result:M,thoughts:"Successfully executed preset action with cache"}}catch(b){if(this.throwIfAborted(),b instanceof R&&b.reason!=="InternalWebAgentError")throw this.logger.error({err:b},"Failed to execute action with target cache (fatal)"),b;return nt.increment("cache_target_resolution_v2",1,["outcome:miss",`platform:mobile-${h.type.toLowerCase()}`,`hasRequirements:${f}`,`hasAdditionalElements:${y}`,`orgId:${this.orgId}`,"cliVersion:0.35.3"]),this.logger.warn({err:b},"Failed to execute action with target cache, retrying with AI"),this.targetingActionWithAILocator({action:t,command:o,description:n,tracer:c,cacheKey:i,targetName:a,cache:h,skipFetchingFullWebviewContent:l,removeWebviewContent:u,metadata:m})}}constructPerformerParams(){return{stateManager:this.stateManager,generator:this.generator,driver:this.driver,logger:this.logger,fixtures:this.fixtures,aborter:this.aborter,orgId:this.orgId,aiSettings:this.aiSettings,options:this.options}}getBoundsFromNativeCache(e){if(!e.bounds)throw new R("ActionFailureError","Native element cache has no bounds");let[t,n,o,i]=e.bounds;if(t===void 0||n===void 0||o===void 0||i===void 0)throw new R("ActionFailureError",`Native element cache has incomplete bounds: [${e.bounds.join(", ")}]`);return{left:t,top:n,width:o-t,height:i-n}}calculateSwipeCoordinates({containerBounds:e,direction:t,desiredDelta:n,edgeMarginPercent:o=.1}){let i=e.left+e.width/2,a=e.top+e.height/2;if(t==="up"||t==="down"){let s=e.height*o,c=e.top+s,l=e.top+e.height-s,u=l-c,d=Math.min(Math.abs(n),u);return{startX:i,startY:t==="down"?l:c,actualDelta:d}}else{let s=e.width*o,c=e.left+s,l=e.left+e.width-s,u=l-c,d=Math.min(Math.abs(n),u);return{startX:t==="right"?l:c,startY:a,actualDelta:d}}}invertDirection(e){if(e==="up")return"down";if(e==="down")return"up";if(e==="left")return"right";if(e==="right")return"left";throw new Error(`Unreachable code: ${e}`)}async performRawSwipe({startX:e,startY:t,deltaPixels:n,direction:o,durationMs:i=300}){let a=Math.abs(n),s=e,c=t;o==="up"||o==="down"?c=o==="up"?t-a:t+a:s=o==="left"?e-a:e+a,await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pause",duration:100},{type:"pointerMove",duration:i,x:s,y:c},{type:"pointerUp",button:0}]}]),await this.driver.releaseActions()}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}get abortSignal(){return this.aborter.controller?.signal}get aiSettingsCopy(){return Gy(this.aiSettings)}get optionsCopy(){return Gy(this.options)}};function OO(r){return"iterations"in r}function WK(r){let e={relativePosition:r.relativePosition};if(r.iterations!==void 0&&(!Number.isInteger(r.iterations)||r.iterations<1))throw new Error("UserConfigurationError: iterations must be a positive integer");if(r.tapDelayMs!==void 0&&(!Number.isInteger(r.tapDelayMs)||r.tapDelayMs<0))throw new Error("UserConfigurationError: tapDelayMs must be >= 0");if(r.iterations&&r.iterations>1&&r.longPress)throw new Error("UserConfigurationError: Cannot specify both more than one tap iteration and long press at the same time");if(r.tapDelayMs!==void 0&&(!r.iterations||r.iterations<2))throw new Error("UserConfigurationError: tapDelayMs requires iterations >= 2");if(r.longPress){if(r.tapDelayMs!==void 0)throw new Error("UserConfigurationError: tapDelayMs cannot be used with longPress");return{...e,longPress:!0,longPressDurationMs:r.longPressDurationMs}}return r.iterations!==void 0?{...e,iterations:r.iterations,tapDelayMs:r.tapDelayMs}:e}var Hs=class extends Rt{async tapOnNativeCoordinates(e){let t=e.x,n=e.y;if(this.logger.info({x:t,y:n},"Tap at coordinates"),"longPress"in e&&e.longPress)return await this.driver.executeScript("mobile: longClickGesture",[{x:t,y:n,duration:e.longPressDurationMs??2e3}]);if(OO(e)){let o=e.tapDelayMs??100;for(let i=0;i<e.iterations;i++)await this.driver.tap({x:t,y:n}),i<e.iterations-1&&await new Promise(a=>setTimeout(a,o));return}await this.driver.tap({x:t,y:n})}async tapOnNativeTarget(e,t){let[n,o,i,a]=e.bounds,s=i-n,c=a-o,l=t?.relativePosition?.x??s/2,u=t?.relativePosition?.y??c/2;l=Math.max(0,Math.min(l,s)),u=Math.max(0,Math.min(u,c));let d=n+l,p=o+u;return await this.tapOnNativeCoordinates({x:d,y:p,...t}),{x:d,y:p}}async tapOnWebviewTarget(e,t){let{controller:n}=e,o,i=1;return t&&OO(t)?(o=t.tapDelayMs,i=t.iterations):t&&"longPress"in t&&(o=t.longPressDurationMs),(await n.browser.click(e.browserTarget,{createIsolatedFolder:()=>{let s=Math.random().toString(36).substring(4),c=PO.join(HK(),"momentic","downloads"),l=PO.join(c,this.orgId,s);return GK(l,{recursive:!0}),l}},{delayMs:o,relativePosition:t?.relativePosition,iterations:i})).coordinates}async tapOnTarget({target:e,options:t}){return await se().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.attributes.options=t,"type"in e&&e.type==="NATIVE"?o.attributes.point=await this.tapOnNativeTarget(e,t):(o.withinWebview=!0,o.attributes.point=await this.tapOnWebviewTarget(e,t))},{name:"Tap on target"})}async executeTap({command:e}){let t=se(),n=WK(e);if(e.target.type==="coordinates"){let a=await this.driver.getWindowSize(),s=e.target.xPercent*a.width,c=e.target.yPercent*a.height;return await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.tapOnNativeCoordinates({...n,x:s,y:c})},{name:`Tap at coordinates ${s}, ${c}`}),{success:!0,message:`Tapped at ${s}, ${c}`}}let o=e.target.description,{thoughts:i}=await this.wrapTargetingAction({command:e,tracer:t,action:a=>this.tapOnTarget({target:a,options:n}),description:o});return{success:!0,message:i}}};var oi=class extends Rt{async doPress({keycode:e,longPress:t}){await se().startAsyncSpan("EMULATOR_INTERACTION",async()=>this.driver.executeScript("mobile: pressKey",[{keycode:e,isLongPress:t}]),{name:"Send key events to emulator"})}};var ma=25,fp=class extends Rt{async doType(e){let t=se();if(!e.target){if(e.clearContent)throw new R("UserConfigurationError","Clearing content is only supported when a target is provided to the Type step");return await this.stateManager.waitForPageSourceStability({timeoutMs:2e3,signal:this.aborter.controller?.signal,reason:"Waiting for page to stabilize before typing"}),await this.sendKeys(e),{success:!0,message:"Successfully executed type action"}}if(e.target.type!=="description")throw new R("UserConfigurationError","x/y targets are not supported for the Type step");let{thoughts:n}=await this.wrapTargetingAction({command:e,tracer:t,action:async o=>{"type"in o&&o.type==="NATIVE"?await this.doNativeType(e,o):await this.doWebviewType(e,o)},description:e.target.description});return{success:!0,message:n}}async doWebviewType(e,t){await se().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.withinWebview=!0;let i={clearContent:e.clearContent,forceClearContent:e.forceClearContent,delay:e.keyPressDelayMs??ma};o.attributes.options=i;let{controller:a,browserTarget:s}=t;await a.browser.typeIntoTarget(e.text,s,i)},{name:"Typing within web view"})}async doNativeType(e,t){let n=new Hs(this.constructPerformerParams());e.clearContent?(await n.tapOnNativeTarget(t,{longPress:!0}),await this.clearContent()):await n.tapOnNativeTarget(t),await this.stateManager.waitForPageSourceStability({timeoutMs:2e3,signal:this.aborter.controller?.signal,reason:"Waiting for keyboard to appear before typing"}),await this.sendKeys(e)}async sendKeys(e){let t=se(),n=e.keyPressDelayMs??ma;await t.startAsyncSection("Waiting for system keyboard to open",async(o,i)=>{let a=Date.now();for(;Date.now()-a<2e3;){this.throwIfAborted();let s=Date.now();if(await this.driver.isKeyboardShown())return;let c=Date.now()-s;c<500&&await new Promise(l=>setTimeout(l,500-c))}i.attributes.timedOut=!0}),n!==ma?await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.driver.updateSettings({keyInjectionDelay:n}),await this.driver.keys(e.text),await this.driver.updateSettings({keyInjectionDelay:ma})},{name:`Typing with a ${n}ms delay`}):await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.driver.keys(e.text)},{name:`Typing with a ${ma}ms delay`})}async clearContent(){let e=se();try{await e.startAsyncSection("Clearing any content from the focused field",()=>this.clearContentHelper())}catch(t){this.logger.warn({err:t},"Failed to find select all button, continuing...")}}async clearContentHelper(){let e=this.driver.$('//android.widget.LinearLayout[@content-desc="Select all" and @clickable="true"]');await e.waitForExist({timeout:750}),await e.click(),await new oi(this.constructPerformerParams()).doPress({keycode:67})}};import Dr from"zod";var LO=.8,ii=.2,jK=Dr.object({navigationBar:Dr.object({visible:Dr.boolean(),x:Dr.number(),y:Dr.number(),width:Dr.number(),height:Dr.number()}),statusBar:Dr.object({visible:Dr.boolean(),x:Dr.number(),y:Dr.number(),width:Dr.number(),height:Dr.number()})}),Ws=class extends Rt{async getHardcodedScrollableElementBounds(e,t){let n;switch(e.type){case"SCREEN":n=this.getInsetBoundsFromViewport(t);break;case"OPEN_APP":try{let o=jK.parse(await this.driver.executeScript("mobile: getSystemBars",[]));n=this.getInsetBoundsFromViewport(t),o.navigationBar.visible&&(n.height=Math.max(1,n.height-o.navigationBar.height)),o.statusBar.visible&&(n.top+=o.statusBar.height,n.height=Math.max(1,n.height-o.statusBar.height))}catch(o){this.logger.warn({err:o},"Failed to get system bars, using hardcoded bounds"),n=this.getInsetBoundsFromViewport(t)}break;case"OPEN_WEBVIEW":{let o=await this.stateManager.getActiveWebviewNodes();if(o.length===0&&(await this.stateManager.refreshWebviewsManually("get active webview nodes"),o=await this.stateManager.getActiveWebviewNodes()),o.length===0)throw new Error("No active webviews found");if(o.length>1){let a=o.map(s=>({id:s.id,ele:s.originalElement.outerHTML,bounds:s.bounds}));throw new Error(`Multiple active webviews found. Momentic currently only supports a single active webview at a time. Discovered nodes: ${JSON.stringify(a)}`)}let i=o[0]?.bounds;if(!i)throw new Error("No bounds found for active webview");n=this.getInsetBoundsFromBounds(i);break}default:{let o=e;throw new Error("If Typescript complains about the line above, you missed a switch case")}}return n}getInsetBoundsFromViewport(e){let t=Math.floor(e.width*ii),n=Math.floor(e.height*ii);return{left:e.x+t,top:e.y+n,width:Math.max(1,e.width-t*2),height:Math.max(1,e.height-n*2)}}getInsetBoundsFromBounds(e){let t=e[0],n=e[1],o=e[2],i=e[3],a=o-t,s=i-n,c=Math.floor(a*ii),l=Math.floor(s*ii);return{left:t+c,top:n+l,width:Math.max(1,a-c*2),height:Math.max(1,s-l*2)}}async executeSwipe(e){let t=se();if(e.scrollableElement.type==="CUSTOM_COORDINATES"){let{startX:o,startY:i,deltaPixels:a}=e.scrollableElement;return await t.startAsyncSpan("EMULATOR_INTERACTION",async s=>{s.attributes.startX=o,s.attributes.startY=i,s.attributes.deltaPixels=a,s.attributes.direction=e.direction,await this.performRawSwipe({startX:o,startY:i,deltaPixels:a,direction:e.direction,durationMs:e.durationMs})},{name:`Swipe ${e.direction} using raw coordinates`}),{success:!0,message:"Successfully executed swipe action"}}if(e.scrollableElement.type!=="CUSTOM"){let o=await this.driver.getWindowRect(),i=await this.getHardcodedScrollableElementBounds(e.scrollableElement,o);return await t.startAsyncSpan("EMULATOR_INTERACTION",async a=>{await this.swipeByAbsoluteCoordinates({span:a,direction:e.direction,percent:e.viewportPercent,durationMs:e.durationMs,containerBounds:i})},{name:`Swipe ${e.direction} in the entire ${e.scrollableElement.type.toLowerCase()}`}),{success:!0,message:"Successfully executed swipe action"}}let{thoughts:n}=await this.wrapTargetingAction({command:e,description:e.scrollableElement.target.description,action:async o=>se().startAsyncSpan("EMULATOR_INTERACTION",async a=>"type"in o&&o.type==="NATIVE"?this.scrollInNativeContainer({span:a,cmd:e,target:o}):(a.withinWebview=!0,this.swipeInWebview({span:a,cmd:e,target:o})),{name:`Swipe ${e.direction} in the specified container`}),tracer:t});return{success:!0,message:n}}async scrollInNativeContainer({span:e,cmd:t,target:n}){if(!n.bounds||n.bounds.length<4)throw new R("ActionFailureError","Native container cache has no bounds");let o=n.bounds,i=o[2]-o[0],a=o[3]-o[1],s=Math.floor(i*ii),c=Math.floor(a*ii);await this.swipeByAbsoluteCoordinates({span:e,direction:t.direction,percent:t.viewportPercent,durationMs:t.durationMs,containerBounds:{left:o[0]+s,top:o[1]+c,width:Math.max(1,i-s*2),height:Math.max(1,a-c*2)}})}async swipeInWebview({span:e,cmd:t,target:n}){let{controller:o,browserTarget:i}=n;if(!o.browser.getViewport())throw new Error("Failed to get viewport size from webview");let s=t.direction==="down"||t.direction==="up",c=await i.locator.boundingBox();if(!c)throw new Error("Failed to get bounds for webview container");let l=Math.floor(c.width*ii),u=Math.floor(c.height*ii),d=Math.max(1,c.width-l*2),p=Math.max(1,c.height-u*2),m={x:c.x+l+d/2,y:c.y+u+p/2},g=(s?p:d)*(t.viewportPercent??LO)*(s?t.direction==="down"?1:-1:t.direction==="right"?1:-1);e.attributes.startPoint=m,e.attributes.scrollPixelAmount=g,await o.browser.mouseDragUsingVisualCoordinates({deltaX:s?0:g,deltaY:s?g:0,steps:10,dragDurationMs:t.durationMs,fromTarget:m})}async swipeByAbsoluteCoordinates({span:e,direction:t,percent:n=LO,durationMs:o=500,containerBounds:i}){e.attributes.containerBounds=i;let a,s;t==="up"||t==="down"?(a=i.height*n,s=Math.floor(a/(o/1e3))):(a=i.width*n,s=Math.floor(a/(o/1e3))),e.attributes.pixelDelta=a,e.attributes.pixelsPerSecond=s,await this.driver.executeScript("mobile: swipeGesture",[{...i,direction:t,percent:n,speed:s}])}};var NO=5,DO=.8,VK=1,Sp=class extends Ws{async executeScrollTo(e){let t=e.target.description,n=e.scrollStepPercent??DO,o=await this.tryUseCachedScrollPosition(e,t);return o||this.searchForElement(e,t,n)}async resolveContainer({scrollableElement:e,containerCache:t,aiMetadata:n}){let o=await this.driver.getWindowRect();if(e.type==="CUSTOM_COORDINATES")return{bounds:{left:0,top:0,width:o.width,height:o.height}};if(e.type!=="CUSTOM")return{bounds:await this.getHardcodedScrollableElementBounds(e,o)};let i=se(),a=e.target.description;if(t){let u=this.getBoundsFromNativeCache(t);return this.logger.info({bounds:u},"Got container bounds from native cache"),{bounds:u,cache:t}}let s=await this.findElement({description:a,tracer:i,metadata:n});if(!s.success)throw new R("NoMatchingElementError",s.thoughts??"No matching element found");let{resolvedTarget:c}=s;if(c.type!=="NATIVE")throw new Error(`ActionFailureError: Custom scroll container "${a}" resolved to a webview element. Custom containers must be native elements.`);let l=this.getBoundsFromNativeCache(c);return this.logger.info({bounds:l},"Got container bounds from AI"),{bounds:l,cache:c}}async tryUseCachedScrollPosition(e,t){let n=e.cache?.target;return n?n.type==="WEBVIEW"?this.tryUseWebviewCache(e,t):n.scrollDetails?this.tryUseNativeScrollCache(e,t,n):null:null}async tryUseWebviewCache(e,t){let n=se();try{let{thoughts:o}=await this.wrapTargetingAction({command:e,tracer:n,description:t,action:async i=>{if(i.type==="NATIVE")throw new Error("Expected WEBVIEW target but got NATIVE");await this.scrollWebviewTargetIntoView(i)}});return{success:!0,message:o}}catch(o){return this.logger.warn({err:o},"Failed to use webview cache, falling back to search"),null}}async tryUseNativeScrollCache(e,t,n){let o=n.scrollDetails,i=se(),a=e.scrollStepPercent??DO,s=o.scrollableElement.type==="CUSTOM"?o.scrollableElement.cache:void 0;await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:o.scrollableElement,containerCache:s,direction:o.direction,scrollStepPercent:a,aiMetadata:{commandId:e.id}});try{let l=await this.tryFindElement({cmd:e,description:t,tracer:i,scrollDetails:o,useAIIfCacheFails:!1});if(l)return l;this.logger.info("Element not found at cached position, undoing scroll")}catch(l){this.logger.warn({err:l},"Error finding element at cached position, will undo scroll")}let c=o.direction==="down"?"up":"down";return this.logger.info({pixelDelta:o.pixelDelta,originalDirection:o.direction,undoDirection:c,scrollableElementType:o.scrollableElement.type},"Undoing scroll"),await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:o.scrollableElement,containerCache:s,direction:c,scrollStepPercent:a,aiMetadata:{commandId:e.id}}),null}async tryFindElement({cmd:e,description:t,tracer:n,scrollDetails:o,useAIIfCacheFails:i=!0}){let a,s,c=e.cache?.target;if(c&&c.resolvedDescription===t&&!e.disableCache){let u=await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0});try{let{resolvedTarget:d}=await gp({target:c,domState:u,stateManager:this.stateManager,logger:this.logger});a=d,s="Successfully resolved scroll to target with cache.",this.logger.info("Successfully resolved scroll to target from cache")}catch(d){this.logger.warn({err:d},"Failed to resolve target from cache")}}if(!a&&!i)return null;if(!a)try{let u=await this.findElement({description:t,tracer:n,metadata:{commandId:e.id}});if(!u.success)return null;a=u.resolvedTarget,s=u.thoughts}catch(u){if(u instanceof R&&u.reason==="NoMatchingElementError")return null;throw this.logger.warn({err:u},"Failed to find scroll-to target with AI"),u}return a.type==="WEBVIEW"?(await this.scrollWebviewTargetIntoView(a),da({command:e,updatedCache:hp(a),updatedWithAI:!0,logger:this.logger}),{success:!0,message:s}):(da({command:e,updatedCache:{...a,scrollDetails:o},updatedWithAI:!0,logger:this.logger}),{success:!0,message:s})}async searchForElement(e,t,n){let o=se(),i=await this.resolveContainer({scrollableElement:e.scrollableElement,aiMetadata:{commandId:e.id}});return this.scrollAndSearch(e,t,o,n,i)}async scrollAndSearch(e,t,n,o,i){let a=0,s=i.bounds,c=s.height*o,l=!0;for(let u=0;u<NO;u++){this.throwIfAborted();let d=this.buildScrollDetails(e,a,i.cache),p=await this.tryFindElement({cmd:e,description:t,tracer:n,scrollDetails:d});if(p)return p;if(!l)throw new Error(`ActionFailureError: Could not find element "${t}" after scrolling to the end`);this.logger.debug({attempt:u,cumulativePixelDelta:a},"Element not found, scrolling further");let m=$K(e.scrollableElement);l=await this.scrollByPage({direction:e.direction,containerBounds:s,scrollStepPercent:o,rawCoordinates:m}),a+=e.direction==="down"?c:-c}throw new Error(`ActionFailureError: Could not find element "${t}" after ${NO} scroll attempts`)}buildScrollDetails(e,t,n){return e.scrollableElement.type==="CUSTOM"?{pixelDelta:t,scrollableElement:{type:"CUSTOM",target:e.scrollableElement.target,cache:n},direction:e.direction}:e.scrollableElement.type==="CUSTOM_COORDINATES"?{pixelDelta:t,scrollableElement:e.scrollableElement,direction:e.direction}:{pixelDelta:t,scrollableElement:e.scrollableElement,direction:e.direction}}async scrollWebviewTargetIntoView(e){let{controller:t,browserTarget:n}=e;await t.browser.hover(n)}async scrollByPage({direction:e,containerBounds:t,scrollStepPercent:n,rawCoordinates:o}){return se().startAsyncSpan("EMULATOR_INTERACTION",async a=>(a.attributes.containerBounds=t,a.attributes.direction=e,this.executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,rawCoordinates:o})),{name:`Scroll ${e} by one page`})}async scrollByPixelDelta({pixelDelta:e,scrollableElement:t,containerCache:n,direction:o,scrollStepPercent:i,aiMetadata:a}){if(e===0)return;let s=se(),c,l,u;if(t.type==="CUSTOM_COORDINATES")c=t.startX,l=t.startY,u=t.deltaPixels;else{let m=(await this.resolveContainer({scrollableElement:t,containerCache:n,aiMetadata:a})).bounds,g=m.height*i,h=this.calculateSwipeCoordinates({containerBounds:m,direction:o,desiredDelta:g});c=h.startX,l=h.startY,u=h.actualDelta}let d=Math.ceil(Math.abs(e)/u);this.logger.debug({pixelDelta:e,direction:o,scrollableElementType:t.type,startX:c,startY:l,maxScrollPerStep:u,numScrolls:d},"scrollByPixelDelta calculated parameters"),await s.startAsyncSpan("EMULATOR_INTERACTION",async p=>{p.attributes.pixelDelta=e,p.attributes.numScrolls=d,p.attributes.maxScrollPerStep=u,p.attributes.startX=c,p.attributes.startY=l;let m=0;for(let g=0;g<d;g++){this.throwIfAborted();let h=Math.abs(e)-m,f=Math.min(u,h);await this.performRawSwipe({startX:c,startY:l,deltaPixels:f,direction:this.invertDirection(o)}),m+=f}},{name:`Scroll ${o} by ${e}px`})}async executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,diffThresholdPercent:o=VK,rawCoordinates:i}){let a=await this.stateManager.getRawScreenshotBase64(),s,c,l;if(i)s=i.startX,c=i.startY,l=i.deltaPixels;else{let m=t.height*n,g=this.calculateSwipeCoordinates({containerBounds:t,direction:e,desiredDelta:m});s=g.startX,c=g.startY,l=g.actualDelta}await this.performRawSwipe({startX:s,startY:c,deltaPixels:l,direction:this.invertDirection(e)});let u=await this.stateManager.getRawScreenshotBase64(),d=Is(a,u),p=d>o;return this.logger.debug({diffPercent:d,diffThresholdPercent:o,canScrollMore:p,direction:e,actualDelta:l,rawCoordinates:i},"Scroll gesture visual diff result"),p}};function $K(r){if(r.type==="CUSTOM_COORDINATES")return r}import{randomUUID as qK}from"crypto";import uu from"fs";import{tmpdir as KK}from"os";import js from"path";var yp=class extends Rt{async doInstallApk(e){return await this.installApkFromUri(e.uri),{success:!0,message:"Installed APK."}}async installApkFromUri(e){let t=await this.resolveUriToLocalApk(e);try{await this.stateManager.executeRawADBCommand(`install -r ${js.resolve(t.localPath)}`),this.logger.info({uri:e,localPath:t.localPath},"Installed APK on device")}finally{t.cleanup()}}async resolveUriToLocalApk(e){try{let t=new URL(e);if(t.protocol==="file:"){let n=t.href.slice(7),o;if(uu.existsSync(n))o=n;else if(uu.existsSync(js.join("/",n)))o=js.join("/",n);else throw new R("UserConfigurationError",`APK not found at path: ${n}`);return this.assertFileExists(o),{localPath:o,cleanup:()=>{}}}if(t.protocol==="http:"||t.protocol==="https:"){let n=await this.fetchWithTimeout(t);if(!n.ok)throw new R("UserInfrastructureError",`Failed to download APK from ${e} (status ${n.status})`);let o=await n.arrayBuffer(),i=Buffer.from(o),a=await this.writeBufferToTempFile(i,t.pathname);return{localPath:a,cleanup:()=>{try{uu.unlinkSync(a)}catch(s){this.logger.warn({err:s,path:a},"Failed to remove temporary APK file")}}}}throw new R("UserConfigurationError",`Unsupported URI scheme for APK installation: ${t.protocol}`)}catch(t){if(t instanceof TypeError){let n=js.resolve(e);return this.assertFileExists(n),{localPath:n,cleanup:()=>{}}}throw t}}assertFileExists(e){try{uu.accessSync(e)}catch{throw new R("UserConfigurationError",`APK not found at path: ${e}`)}}async fetchWithTimeout(e){let t=AbortSignal.timeout(9e4);return await fetch(e,{signal:t})}async writeBufferToTempFile(e,t){let n=js.extname(t)||".apk",o=js.join(KK(),`momentic-apk-${qK()}${n}`);return uu.writeFileSync(o,e),o}};import{existsSync as YK,readFileSync as XK}from"fs";import JK from"zod";var ZK=JK.string().url();async function kO(r){if(ZK.safeParse(r).success){let e=new AbortController,t=setTimeout(()=>e.abort(),1e4),n;try{n=await fetch(r,{signal:e.signal})}catch(i){throw new R("UserInfrastructureError",`Fetch failed or timed out for URL: ${r}`,{errOptions:{cause:i}})}finally{clearTimeout(t)}if(!n.ok)throw new R("UserInfrastructureError",`Failed to fetch file from URL: ${r}, status: ${n.status}`);let o=await n.arrayBuffer();return Buffer.from(o).toString("base64")}if(!YK(r))throw new R("UserInfrastructureError",`File does not exist at path: ${r}`);return XK(r).toString("base64")}var bp=class extends Rt{async dragNative(e,t,n){let{left:o,top:i,width:a,height:s}=this.getBoundsFromNativeCache(e),{left:c,top:l,width:u,height:d}=this.getBoundsFromNativeCache(t),p=o+a/2,m=i+s/2,g=c+u/2,h=l+d/2,f=n?.hoverDuration??500,y=n?.dragDuration??1e3;await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:p,y:m},{type:"pointerDown",button:0},{type:"pause",duration:f},{type:"pointerMove",duration:y,x:g,y:h},{type:"pointerUp",button:0}]}]),await this.driver.releaseActions()}async dragWebview(e,t,n){let{controller:o}=e;if(e.controller!==t.controller)throw new R("UserConfigurationError","Cannot drag and drop between different webviews");let i=n?.dragDuration??1e3,a=n?.hoverDuration??1e3,s;n?.dragDuration&&(s=Math.max(1,Math.floor(i/200))),await o.browser.dragAndDrop(e.browserTarget,t.browserTarget,{hoverDurationMs:a,steps:s,dragDurationMs:i})}async executeDragAndDrop({command:e}){let t=se();if(e.fromTarget.type!=="description"||e.toTarget.type!=="description")throw new R("UserConfigurationError","Drag and drop only supports description targets for now");let n=e.fromTarget.description,{result:o,thoughts:i}=await this.wrapTargetingAction({command:e,tracer:t,description:n,cacheKey:"cache",targetName:"fromTarget",action:async l=>l}),a=e.toTarget.description,{result:s,thoughts:c}=await this.wrapTargetingAction({command:e,tracer:t,description:a,cacheKey:"cache",targetName:"toTarget",action:async l=>l});if(o.type!==s.type)throw new R("UserConfigurationError",`Drag and drop targets must be in the same context (both native or both webview). Found: From=${o.type}, To=${s.type}`);return await t.startAsyncSpan("EMULATOR_INTERACTION",async l=>{o.type==="NATIVE"&&s.type==="NATIVE"?await this.dragNative(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}):o.type==="WEBVIEW"&&s.type==="WEBVIEW"&&(l.withinWebview=!0,await this.dragWebview(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}))},{name:"Drag and drop"}),{success:!0,message:`${i}
4585
+ `));return}}let d=Array.from(e.childNodes??[]);for(let p of d){let m=p.nodeType;if(m===3){let g=p.nodeValue;g&&g.trim().length>0&&t.appendChild(n.createTextNode(g));continue}if(m===1){let g=p;if(!LK(g,s?.viewportBounds))continue;let h=n.createElement(vO(g.tagName));AO(r,g,h),t.appendChild(h)}}}function PK(r,e,t,n){let o=r.parseFromString("<hierarchy/>","text/xml"),i=new Map,a={prunedDocument:o,idToElement:t,prunedIdToElement:i,idCounter:{value:0},opts:n},s=o.documentElement;AO(a,e,s);let c=new vK().serializeToString(o);return{prunedDocument:o,prunedIdToElement:i,xml:c}}async function RO(r,e){let t=new TK,n=t.parseFromString(r,"text/xml"),o=new Map,i=n.documentElement;if(!i)throw new R("InternalWebAgentError","No root element found in XML");if(i.tagName!=="hierarchy")throw new R("InternalWebAgentError","No hierarchy element found in XML");let{prunedDocument:a,prunedIdToElement:s,xml:c}=PK(t,i,o,e);return{xml:await EK.format(c,{parser:"xml",plugins:[bK],printWidth:120,tabWidth:1,singleAttributePerLine:!1}),originalXml:r,document:n,idToElement:o,prunedDocument:a,prunedIdToElement:s}}function OK(r){let e=[],t=r;for(;t;){let n=t.tagName,o=t.parentElement,i=1;if(o){let a=Array.from(o.children).filter(s=>s.tagName===n);for(let s=0;s<a.length;s++)if(a[s]===t){i=s+1;break}}e.unshift(`${n}[${i}]`),t=o}return`/${e.join("/")}`}function mp(r,e){let t=r.idToElement.get(e);if(t)return OK(t)}function zy(r,e){let t=r.idToElement.get(e);if(!t)return;let n=t.cloneNode(!0);for(let o of Array.from(n.children)){let i=o;for(let a of Array.from(i.children))i.removeChild(a)}return n.outerHTML}function ua(r){if(!r.hasAttribute("bounds"))return;let e=r.getAttribute("bounds");if(!e)return;let t=e.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);if(t){let n=parseInt(t[1],10),o=parseInt(t[2],10),i=parseInt(t[3],10),a=parseInt(t[4],10);if(Number.isFinite(n)&&Number.isFinite(o)&&Number.isFinite(i)&&Number.isFinite(a))return[n,o,i,a]}}function LK(r,e){if(!e)return!0;let t=ua(r);if(!t||t.length<4)return!0;let n=t[0],o=t[1],i=t[2],a=t[3];return!(i<=e.left||n>=e.right||a<=e.top||o>=e.bottom)}function wO(r,e){if(r&&!(!e||e.length===0))return Object.fromEntries(e.map(t=>[t,r.getAttribute(t)]).filter(([,t])=>t!==null))}function xO({requirements:r,element:e}){let t;if((r?.positionSpecificity||r?.shapeSpecificity)&&(t=ua(e),!t))throw new R("ActionFailureError","Element to cache has no bounds or unexpected bounds format");return{requiredText:r?.textRequired?e.getAttribute("text")??void 0:void 0,requiredAttributes:wO(e,r?.attributesRequired),requiredBounds:r?.boundsRequired,position:r?.positionSpecificity?{x1:t[0],y1:t[1],x2:t[2],y2:t[3],tolerance:r?.positionSpecificity}:void 0,shape:r?.shapeSpecificity?{width:t[2]-t[0],height:t[3]-t[1],tolerance:r?.shapeSpecificity}:void 0}}function MO({aiResponse:r,description:e,emulatorState:t,memory:n,useMemory:o}){let i=t.graph.idToElement.get(r.id);if(!i)throw new R("InternalWebAgentError",`Could not find node with id: ${r.id}`);let a=ua(i);if(!a)throw new R("InternalWebAgentError",`Node ${r.id} has no bounding box: ${i.outerHTML}`);let s=mp(t.graph,r.id)??"",c=zy(t.graph,r.id)??"",l=xO({requirements:r.requirements,element:i}),u=[];r.additionalElements&&(u=r.additionalElements.map(({id:p,requirements:m})=>{let g=t.graph.idToElement.get(p);if(!g)return;let h=mp(t.graph,p);return h?{xPath:h,requirements:xO({requirements:m,element:g})}:void 0}).filter(p=>!!p));let d;if(lu(i)&&r.inWebview!==!1?d={type:"WEBVIEW",resolvedDescription:e,xPath:s}:d={type:"NATIVE",bounds:a,resolvedDescription:e,xPath:s,elementOnlySerializedXml:c,requirements:l,requiredRelatedElements:u},o)if(r.updatedMemory){let p={type:"GCS_TRACES",traces:r.updatedMemory};d.memory=p}else n&&(d.memory=n);return{target:d,resolvedNode:i}}function IO(r){return r?.type==="WEBVIEW"?r.browserCache?.memory:void 0}var NK=.1,DK=.25;function pp(r,e,t,n){let o=Math.abs(e-t);switch(r){case"precise":return o<=n;case"narrow":return o<=Math.abs(e)*NK;case"broad":return o<=Math.abs(e)*DK;case"irrelevant":return!0}}function kK(r,e){let t=e.x2-e.x1,n=(e.x1+e.x2)/2,o=(r[0]+r[2])/2;if(!pp(e.tolerance,n,o,Math.min(1,t)))return!1;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(r[1]+r[3])/2;return pp(e.tolerance,a,s,Math.min(1,i))}function FK(r,e){return pp(e.tolerance,e.width,r[2]-r[0],Math.min(1,e.width))?pp(e.tolerance,e.height,r[3]-r[1],Math.min(1,e.height)):!1}var _O=(r,e,t)=>{if(!e)return;let{requiredAttributes:n,requiredText:o,requiredBounds:i,position:a,shape:s}=e;if(o!==void 0&&o.length>0){let c=Yc(r);if(c!==o)throw new gt(`Resolved element text mismatch: expected ${o}, got ${c}`)}if(n)for(let[c,l]of Object.entries(n)){let u=r.getAttribute(c)??void 0;if(u!==l)throw new gt(`Attribute ${c} mismatch: expected ${l}, got ${u}`)}if(i&&t&&!t.targetBounds.every((l,u)=>l===t.newElementBounds[u]))throw new gt(`Bounds changed from [${t.targetBounds.join(",")} ] to [${t.newElementBounds.join(",")} ]`);if(a&&t&&!kK(t.newElementBounds,a))throw new gt(`Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(t.newElementBounds)}`);if(s&&t&&!FK(t.newElementBounds,s))throw new gt(`Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(t.newElementBounds)}`)};async function gp(r){let{target:e,domState:t}=r,{graph:n}=t,{document:o}=n,i=se();if(e.type==="WEBVIEW")return UK(e,r);if(!e.xPath)throw new R("ActionFailureError","Native element cache has no XPath");let a=CO.evaluateXPathToFirstNode(e.xPath,o,null,null);if(!a)throw new gt(`Could not resolve cached target via XPath: ${e.xPath}`);if(e.requiredRelatedElements){let p=e.requiredRelatedElements;i.startSection("Validate related elements are similar enough to past runs",()=>{for(let m of p){let g=CO.evaluateXPathToFirstNode(m.xPath,o);if(!g)throw new gt(`Required related element not found for XPath: ${m.xPath}`);_O(g,m.requirements)}})}let s=ua(a);if(!s)throw new gt("Resolved native element has no bounding box");if(!e.bounds)throw new gt("Native element cache has no bounds");_O(a,e.requirements,{targetBounds:e.bounds,newElementBounds:s});let c;for(let[p,m]of n.idToElement.entries())if(m===a){c=p;break}let l=e.elementOnlySerializedXml,u=e.xPath;return c!==void 0&&(l=zy(n,c)??l,u=mp(n,c)??u),{resolvedTarget:{...e,resolvedNode:a,bounds:s,elementOnlySerializedXml:l,xPath:u}}}async function UK(r,e){let{stateManager:t,logger:n,signal:o}=e,i=se(),a=await t.getActiveWebview();if(!a||!a.browserController)throw n.error({webview:a?{...a,browserController:!!a.browserController}:void 0},"resolveTargetCacheInWebView: No browser controller attached"),new gt("No browser controller is attached to the requested webview");let s=a.browserController;if(!r.browserCache)throw n.error({target:r},"resolveTargetCacheInWebView: No browser target available on cache"),new gt("No browser target available on cache");let c=r.browserCache,{finalTarget:l}=await i.startAsyncSection("Resolve target in webview",()=>s.resolveCachedTargetForAction({ctx:null,cache:c,options:{disableGlobalLocatorRedirect:e.disableTargetRedirection,resolveTargetOptions:{logger:n,signal:o,skipWaitForPageLoad:!0,skipSavingVisualAttributes:!0}},logger:n}));return{resolvedTarget:{...r,controller:a.browserController,browserTarget:l}}}function da(r){let{command:e,cacheKey:t="cache",targetName:n="target",updatedCache:o}=r;Gi(e)&&(e[t]={...e[t],[n]:$a.parse(o)},r.updatedWithAI&&(e[t].updatedAt=new Date,e[t].updatedAtLoggerTags=ye(r.logger)))}function hp(r){if(r.type==="WEBVIEW")return{type:"WEBVIEW",resolvedDescription:r.resolvedDescription,xPath:r.xPath,browserCache:r.browserCache,memory:r.memory};let{resolvedNode:e,...t}=r;return{...t}}var Rt=class{driver;generator;stateManager;logger;fixtures;aborter;orgId;aiSettings;options;constructor(e){this.stateManager=e.stateManager,this.generator=e.generator,this.driver=e.driver,this.logger=e.logger,this.fixtures=e.fixtures,this.aborter=e.aborter,this.orgId=e.orgId,this.aiSettings=e.aiSettings,this.options=e.options}shouldUseMemoryForCommand(e){return this.aiSettings?.useMemory&&!e?.disableCache}async findElement({description:e,tracer:t,skipFetchingFullWebviewContent:n=!1,removeWebviewContent:o=!1,useMemory:i=!1,memory:a,webviewMemory:s,metadata:c}){let l=this.logger.child({...c}),u=await t.startAsyncSection("Get emulator state",async()=>{let f=await this.stateManager.getDomState({skipFetchingFullWebviewContent:n,removeWebviewContent:o}),y=await this.stateManager.getCurrentScreenshotPngString();return{emulatorState:f,screenshot:y}}),d;try{d=await t.startAsyncSpan("AI_LOCATOR_CALL",async f=>{let y=await this.generator.getAndroidElementLocation({description:e,screenXml:u.emulatorState.graph.xml,screenshot:u.screenshot,memory:i?a:void 0},{logger:l,loggerTags:ye(l),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["android-locator"]});return f.result=y,y})}catch(f){throw this.throwIfAborted(),l.error({err:f},"Failed to locate element"),new R("InternalWebAgentError",`Failed to locate element: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}if(d.id===-1){let f=d.updatedMemory?{type:"GCS_TRACES",traces:d.updatedMemory}:void 0;return{success:!1,thoughts:d.thoughts??"No matching element found",updatedLocatorMemory:f}}let{target:p,resolvedNode:m}=MO({aiResponse:d,description:e,emulatorState:u.emulatorState,memory:a,useMemory:i});if(p.type==="NATIVE")return t.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:p.elementOnlySerializedXml??"Unknown element"},attributes:{},subSpans:[]}),{success:!0,resolvedTarget:{...p,resolvedNode:m},thoughts:d.thoughts};let{browserLocateResult:g,browserController:h}=await t.startWebviewTrace(async()=>{let f=await this.stateManager.getActiveWebview();if(!f||!f.browserController)throw new R("InternalWebAgentError","No browser controller is attached to the requested webview");return{browserLocateResult:await f.browserController.locateElement({description:e,disableCache:!1,useMemory:i,memory:i?s:void 0,logger:this.logger,skipWait:!0,skipSavingVisualAttributes:!0}),browserController:f.browserController}});return t.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:g.target.nodeOnlySerializedHtml??"Unknown HTML element in webview"},attributes:{},subSpans:[]}),{success:!0,resolvedTarget:{...p,controller:h,browserTarget:{...g.resolution,serverSideBoundingBox:await g.resolution.locator.boundingBox({timeout:5e3})},browserCache:g.target},thoughts:g.thoughts}}async targetingActionWithAILocator(e){let{action:t,command:n,description:o,tracer:i,cacheKey:a,targetName:s,cache:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,metadata:d}=e,p=await this.findElement({description:o,tracer:i,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:this.shouldUseMemoryForCommand(n),memory:c?.memory,webviewMemory:IO(c),metadata:d});if(!p.success){if(p.updatedLocatorMemory&&c){let h={...c,memory:p.updatedLocatorMemory};da({command:n,cacheKey:a,targetName:s,updatedCache:h,updatedWithAI:!0,logger:this.logger})}throw new R("NoMatchingElementError",p.thoughts??"No matching element found")}let m=p.thoughts,g=await t(p.resolvedTarget);return da({command:n,cacheKey:a,targetName:s,updatedCache:p.resolvedTarget,updatedWithAI:!0,logger:this.logger}),{result:g,thoughts:m}}async wrapTargetingAction(e){let{action:t,description:n,command:o,cacheKey:i="cache",targetName:a="target",cacheIsInvalidAfterResolution:s,tracer:c,skipFetchingFullWebviewContent:l=!1,removeWebviewContent:u=!1,disableTargetRedirection:d=!1}=e,p,m={commandId:o.id};if(i==="cache"&&"cache"in o&&o.cache){let b=o.cache;a==="target"&&"target"in b?p=b.target:a==="fromTarget"&&"fromTarget"in b?p=b.fromTarget:a==="toTarget"&&"toTarget"in b&&(p=b.toTarget)}let g=!1,h=Gy(p);if(o.disableCache&&(this.logger.debug({command:o},"Cache explicitly disabled for command"),g=!0,h=void 0),s&&(g=!0,h=void 0),h&&h?.resolvedDescription!==n&&(this.logger.info({description:n,cacheDescription:h?.resolvedDescription},"Cache description mismatch, clearing it automatically"),g=!0,h=void 0),!h)return this.logger.info({description:n,cacheBustedBeforeAction:g},"Prompting AI for a new element location"),this.targetingActionWithAILocator({action:t,command:o,description:n,tracer:c,cacheKey:i,targetName:a,cache:p,skipFetchingFullWebviewContent:l,removeWebviewContent:u,metadata:m});let f=h.type==="NATIVE"?!!h.requirements:!!h.browserCache?.requirements,y=h.type==="NATIVE"?!!h.requiredRelatedElements?.length:!!h.browserCache?.additionalElements?.length,E;try{this.options?.emulator?.waitForStability&&await this.stateManager.waitForPageSourceStability({timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"});let{resolvedTarget:b,updatedCache:_}=await c.startAsyncSpan("CACHE_RESOLUTION",async O=>{let v=Date.now(),C;for(;Date.now()-v<3e3;){E=await this.stateManager.getDomState({skipFetchingFullWebviewContent:h?.type==="NATIVE"});let F;try{F=(await gp({target:h,domState:E,stateManager:this.stateManager,logger:this.logger,disableTargetRedirection:d})).resolvedTarget}catch(D){if(C=D,D instanceof gt){this.logger.warn({err:D},"Failed to resolve target cache, retrying");continue}throw this.logger.error({err:D},"Failed to resolve target cache"),D}let P=hp(F),B=zK(h,P);return B&&Object.keys(B).length>0&&this.logger.info({cacheDiffs:B},"Successfully resolved target with cache"),O.attributes.serializedElement=F.type==="WEBVIEW"?F.browserCache?.nodeOnlySerializedHtml??"Unknown HTML element in webview":F.elementOnlySerializedXml??"Unknown element",{resolvedTarget:F,updatedCache:P}}throw C}),M=await t(b);return da({command:o,cacheKey:i,targetName:a,updatedCache:_,updatedWithAI:!1,logger:this.logger}),nt.increment("cache_target_resolution_v2",1,["outcome:hit",`platform:mobile-${h.type.toLowerCase()}`,`hasRequirements:${f}`,`hasAdditionalElements:${y}`,`orgId:${this.orgId}`,"cliVersion:0.35.4"]),{result:M,thoughts:"Successfully executed preset action with cache"}}catch(b){if(this.throwIfAborted(),b instanceof R&&b.reason!=="InternalWebAgentError")throw this.logger.error({err:b},"Failed to execute action with target cache (fatal)"),b;return nt.increment("cache_target_resolution_v2",1,["outcome:miss",`platform:mobile-${h.type.toLowerCase()}`,`hasRequirements:${f}`,`hasAdditionalElements:${y}`,`orgId:${this.orgId}`,"cliVersion:0.35.4"]),this.logger.warn({err:b},"Failed to execute action with target cache, retrying with AI"),this.targetingActionWithAILocator({action:t,command:o,description:n,tracer:c,cacheKey:i,targetName:a,cache:h,skipFetchingFullWebviewContent:l,removeWebviewContent:u,metadata:m})}}constructPerformerParams(){return{stateManager:this.stateManager,generator:this.generator,driver:this.driver,logger:this.logger,fixtures:this.fixtures,aborter:this.aborter,orgId:this.orgId,aiSettings:this.aiSettings,options:this.options}}getBoundsFromNativeCache(e){if(!e.bounds)throw new R("ActionFailureError","Native element cache has no bounds");let[t,n,o,i]=e.bounds;if(t===void 0||n===void 0||o===void 0||i===void 0)throw new R("ActionFailureError",`Native element cache has incomplete bounds: [${e.bounds.join(", ")}]`);return{left:t,top:n,width:o-t,height:i-n}}calculateSwipeCoordinates({containerBounds:e,direction:t,desiredDelta:n,edgeMarginPercent:o=.1}){let i=e.left+e.width/2,a=e.top+e.height/2;if(t==="up"||t==="down"){let s=e.height*o,c=e.top+s,l=e.top+e.height-s,u=l-c,d=Math.min(Math.abs(n),u);return{startX:i,startY:t==="down"?l:c,actualDelta:d}}else{let s=e.width*o,c=e.left+s,l=e.left+e.width-s,u=l-c,d=Math.min(Math.abs(n),u);return{startX:t==="right"?l:c,startY:a,actualDelta:d}}}invertDirection(e){if(e==="up")return"down";if(e==="down")return"up";if(e==="left")return"right";if(e==="right")return"left";throw new Error(`Unreachable code: ${e}`)}async performRawSwipe({startX:e,startY:t,deltaPixels:n,direction:o,durationMs:i=300}){let a=Math.abs(n),s=e,c=t;o==="up"||o==="down"?c=o==="up"?t-a:t+a:s=o==="left"?e-a:e+a,await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pause",duration:100},{type:"pointerMove",duration:i,x:s,y:c},{type:"pointerUp",button:0}]}]),await this.driver.releaseActions()}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}get abortSignal(){return this.aborter.controller?.signal}get aiSettingsCopy(){return Gy(this.aiSettings)}get optionsCopy(){return Gy(this.options)}};function OO(r){return"iterations"in r}function WK(r){let e={relativePosition:r.relativePosition};if(r.iterations!==void 0&&(!Number.isInteger(r.iterations)||r.iterations<1))throw new Error("UserConfigurationError: iterations must be a positive integer");if(r.tapDelayMs!==void 0&&(!Number.isInteger(r.tapDelayMs)||r.tapDelayMs<0))throw new Error("UserConfigurationError: tapDelayMs must be >= 0");if(r.iterations&&r.iterations>1&&r.longPress)throw new Error("UserConfigurationError: Cannot specify both more than one tap iteration and long press at the same time");if(r.tapDelayMs!==void 0&&(!r.iterations||r.iterations<2))throw new Error("UserConfigurationError: tapDelayMs requires iterations >= 2");if(r.longPress){if(r.tapDelayMs!==void 0)throw new Error("UserConfigurationError: tapDelayMs cannot be used with longPress");return{...e,longPress:!0,longPressDurationMs:r.longPressDurationMs}}return r.iterations!==void 0?{...e,iterations:r.iterations,tapDelayMs:r.tapDelayMs}:e}var Hs=class extends Rt{async tapOnNativeCoordinates(e){let t=e.x,n=e.y;if(this.logger.info({x:t,y:n},"Tap at coordinates"),"longPress"in e&&e.longPress)return await this.driver.executeScript("mobile: longClickGesture",[{x:t,y:n,duration:e.longPressDurationMs??2e3}]);if(OO(e)){let o=e.tapDelayMs??100;for(let i=0;i<e.iterations;i++)await this.driver.tap({x:t,y:n}),i<e.iterations-1&&await new Promise(a=>setTimeout(a,o));return}await this.driver.tap({x:t,y:n})}async tapOnNativeTarget(e,t){let[n,o,i,a]=e.bounds,s=i-n,c=a-o,l=t?.relativePosition?.x??s/2,u=t?.relativePosition?.y??c/2;l=Math.max(0,Math.min(l,s)),u=Math.max(0,Math.min(u,c));let d=n+l,p=o+u;return await this.tapOnNativeCoordinates({x:d,y:p,...t}),{x:d,y:p}}async tapOnWebviewTarget(e,t){let{controller:n}=e,o,i=1;return t&&OO(t)?(o=t.tapDelayMs,i=t.iterations):t&&"longPress"in t&&(o=t.longPressDurationMs),(await n.browser.click(e.browserTarget,{createIsolatedFolder:()=>{let s=Math.random().toString(36).substring(4),c=PO.join(HK(),"momentic","downloads"),l=PO.join(c,this.orgId,s);return GK(l,{recursive:!0}),l}},{delayMs:o,relativePosition:t?.relativePosition,iterations:i})).coordinates}async tapOnTarget({target:e,options:t}){return await se().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.attributes.options=t,"type"in e&&e.type==="NATIVE"?o.attributes.point=await this.tapOnNativeTarget(e,t):(o.withinWebview=!0,o.attributes.point=await this.tapOnWebviewTarget(e,t))},{name:"Tap on target"})}async executeTap({command:e}){let t=se(),n=WK(e);if(e.target.type==="coordinates"){let a=await this.driver.getWindowSize(),s=e.target.xPercent*a.width,c=e.target.yPercent*a.height;return await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.tapOnNativeCoordinates({...n,x:s,y:c})},{name:`Tap at coordinates ${s}, ${c}`}),{success:!0,message:`Tapped at ${s}, ${c}`}}let o=e.target.description,{thoughts:i}=await this.wrapTargetingAction({command:e,tracer:t,action:a=>this.tapOnTarget({target:a,options:n}),description:o});return{success:!0,message:i}}};var oi=class extends Rt{async doPress({keycode:e,longPress:t}){await se().startAsyncSpan("EMULATOR_INTERACTION",async()=>this.driver.executeScript("mobile: pressKey",[{keycode:e,isLongPress:t}]),{name:"Send key events to emulator"})}};var ma=25,fp=class extends Rt{async doType(e){let t=se();if(!e.target){if(e.clearContent)throw new R("UserConfigurationError","Clearing content is only supported when a target is provided to the Type step");return await this.stateManager.waitForPageSourceStability({timeoutMs:2e3,signal:this.aborter.controller?.signal,reason:"Waiting for page to stabilize before typing"}),await this.sendKeys(e),{success:!0,message:"Successfully executed type action"}}if(e.target.type!=="description")throw new R("UserConfigurationError","x/y targets are not supported for the Type step");let{thoughts:n}=await this.wrapTargetingAction({command:e,tracer:t,action:async o=>{"type"in o&&o.type==="NATIVE"?await this.doNativeType(e,o):await this.doWebviewType(e,o)},description:e.target.description});return{success:!0,message:n}}async doWebviewType(e,t){await se().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.withinWebview=!0;let i={clearContent:e.clearContent,forceClearContent:e.forceClearContent,delay:e.keyPressDelayMs??ma};o.attributes.options=i;let{controller:a,browserTarget:s}=t;await a.browser.typeIntoTarget(e.text,s,i)},{name:"Typing within web view"})}async doNativeType(e,t){let n=new Hs(this.constructPerformerParams());e.clearContent?(await n.tapOnNativeTarget(t,{longPress:!0}),await this.clearContent()):await n.tapOnNativeTarget(t),await this.stateManager.waitForPageSourceStability({timeoutMs:2e3,signal:this.aborter.controller?.signal,reason:"Waiting for keyboard to appear before typing"}),await this.sendKeys(e)}async sendKeys(e){let t=se(),n=e.keyPressDelayMs??ma;await t.startAsyncSection("Waiting for system keyboard to open",async(o,i)=>{let a=Date.now();for(;Date.now()-a<2e3;){this.throwIfAborted();let s=Date.now();if(await this.driver.isKeyboardShown())return;let c=Date.now()-s;c<500&&await new Promise(l=>setTimeout(l,500-c))}i.attributes.timedOut=!0}),n!==ma?await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.driver.updateSettings({keyInjectionDelay:n}),await this.driver.keys(e.text),await this.driver.updateSettings({keyInjectionDelay:ma})},{name:`Typing with a ${n}ms delay`}):await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.driver.keys(e.text)},{name:`Typing with a ${ma}ms delay`})}async clearContent(){let e=se();try{await e.startAsyncSection("Clearing any content from the focused field",()=>this.clearContentHelper())}catch(t){this.logger.warn({err:t},"Failed to find select all button, continuing...")}}async clearContentHelper(){let e=this.driver.$('//android.widget.LinearLayout[@content-desc="Select all" and @clickable="true"]');await e.waitForExist({timeout:750}),await e.click(),await new oi(this.constructPerformerParams()).doPress({keycode:67})}};import Dr from"zod";var LO=.8,ii=.2,jK=Dr.object({navigationBar:Dr.object({visible:Dr.boolean(),x:Dr.number(),y:Dr.number(),width:Dr.number(),height:Dr.number()}),statusBar:Dr.object({visible:Dr.boolean(),x:Dr.number(),y:Dr.number(),width:Dr.number(),height:Dr.number()})}),Ws=class extends Rt{async getHardcodedScrollableElementBounds(e,t){let n;switch(e.type){case"SCREEN":n=this.getInsetBoundsFromViewport(t);break;case"OPEN_APP":try{let o=jK.parse(await this.driver.executeScript("mobile: getSystemBars",[]));n=this.getInsetBoundsFromViewport(t),o.navigationBar.visible&&(n.height=Math.max(1,n.height-o.navigationBar.height)),o.statusBar.visible&&(n.top+=o.statusBar.height,n.height=Math.max(1,n.height-o.statusBar.height))}catch(o){this.logger.warn({err:o},"Failed to get system bars, using hardcoded bounds"),n=this.getInsetBoundsFromViewport(t)}break;case"OPEN_WEBVIEW":{let o=await this.stateManager.getActiveWebviewNodes();if(o.length===0&&(await this.stateManager.refreshWebviewsManually("get active webview nodes"),o=await this.stateManager.getActiveWebviewNodes()),o.length===0)throw new Error("No active webviews found");if(o.length>1){let a=o.map(s=>({id:s.id,ele:s.originalElement.outerHTML,bounds:s.bounds}));throw new Error(`Multiple active webviews found. Momentic currently only supports a single active webview at a time. Discovered nodes: ${JSON.stringify(a)}`)}let i=o[0]?.bounds;if(!i)throw new Error("No bounds found for active webview");n=this.getInsetBoundsFromBounds(i);break}default:{let o=e;throw new Error("If Typescript complains about the line above, you missed a switch case")}}return n}getInsetBoundsFromViewport(e){let t=Math.floor(e.width*ii),n=Math.floor(e.height*ii);return{left:e.x+t,top:e.y+n,width:Math.max(1,e.width-t*2),height:Math.max(1,e.height-n*2)}}getInsetBoundsFromBounds(e){let t=e[0],n=e[1],o=e[2],i=e[3],a=o-t,s=i-n,c=Math.floor(a*ii),l=Math.floor(s*ii);return{left:t+c,top:n+l,width:Math.max(1,a-c*2),height:Math.max(1,s-l*2)}}async executeSwipe(e){let t=se();if(e.scrollableElement.type==="CUSTOM_COORDINATES"){let{startX:o,startY:i,deltaPixels:a}=e.scrollableElement;return await t.startAsyncSpan("EMULATOR_INTERACTION",async s=>{s.attributes.startX=o,s.attributes.startY=i,s.attributes.deltaPixels=a,s.attributes.direction=e.direction,await this.performRawSwipe({startX:o,startY:i,deltaPixels:a,direction:e.direction,durationMs:e.durationMs})},{name:`Swipe ${e.direction} using raw coordinates`}),{success:!0,message:"Successfully executed swipe action"}}if(e.scrollableElement.type!=="CUSTOM"){let o=await this.driver.getWindowRect(),i=await this.getHardcodedScrollableElementBounds(e.scrollableElement,o);return await t.startAsyncSpan("EMULATOR_INTERACTION",async a=>{await this.swipeByAbsoluteCoordinates({span:a,direction:e.direction,percent:e.viewportPercent,durationMs:e.durationMs,containerBounds:i})},{name:`Swipe ${e.direction} in the entire ${e.scrollableElement.type.toLowerCase()}`}),{success:!0,message:"Successfully executed swipe action"}}let{thoughts:n}=await this.wrapTargetingAction({command:e,description:e.scrollableElement.target.description,action:async o=>se().startAsyncSpan("EMULATOR_INTERACTION",async a=>"type"in o&&o.type==="NATIVE"?this.scrollInNativeContainer({span:a,cmd:e,target:o}):(a.withinWebview=!0,this.swipeInWebview({span:a,cmd:e,target:o})),{name:`Swipe ${e.direction} in the specified container`}),tracer:t});return{success:!0,message:n}}async scrollInNativeContainer({span:e,cmd:t,target:n}){if(!n.bounds||n.bounds.length<4)throw new R("ActionFailureError","Native container cache has no bounds");let o=n.bounds,i=o[2]-o[0],a=o[3]-o[1],s=Math.floor(i*ii),c=Math.floor(a*ii);await this.swipeByAbsoluteCoordinates({span:e,direction:t.direction,percent:t.viewportPercent,durationMs:t.durationMs,containerBounds:{left:o[0]+s,top:o[1]+c,width:Math.max(1,i-s*2),height:Math.max(1,a-c*2)}})}async swipeInWebview({span:e,cmd:t,target:n}){let{controller:o,browserTarget:i}=n;if(!o.browser.getViewport())throw new Error("Failed to get viewport size from webview");let s=t.direction==="down"||t.direction==="up",c=await i.locator.boundingBox();if(!c)throw new Error("Failed to get bounds for webview container");let l=Math.floor(c.width*ii),u=Math.floor(c.height*ii),d=Math.max(1,c.width-l*2),p=Math.max(1,c.height-u*2),m={x:c.x+l+d/2,y:c.y+u+p/2},g=(s?p:d)*(t.viewportPercent??LO)*(s?t.direction==="down"?1:-1:t.direction==="right"?1:-1);e.attributes.startPoint=m,e.attributes.scrollPixelAmount=g,await o.browser.mouseDragUsingVisualCoordinates({deltaX:s?0:g,deltaY:s?g:0,steps:10,dragDurationMs:t.durationMs,fromTarget:m})}async swipeByAbsoluteCoordinates({span:e,direction:t,percent:n=LO,durationMs:o=500,containerBounds:i}){e.attributes.containerBounds=i;let a,s;t==="up"||t==="down"?(a=i.height*n,s=Math.floor(a/(o/1e3))):(a=i.width*n,s=Math.floor(a/(o/1e3))),e.attributes.pixelDelta=a,e.attributes.pixelsPerSecond=s,await this.driver.executeScript("mobile: swipeGesture",[{...i,direction:t,percent:n,speed:s}])}};var NO=5,DO=.8,VK=1,Sp=class extends Ws{async executeScrollTo(e){let t=e.target.description,n=e.scrollStepPercent??DO,o=await this.tryUseCachedScrollPosition(e,t);return o||this.searchForElement(e,t,n)}async resolveContainer({scrollableElement:e,containerCache:t,aiMetadata:n}){let o=await this.driver.getWindowRect();if(e.type==="CUSTOM_COORDINATES")return{bounds:{left:0,top:0,width:o.width,height:o.height}};if(e.type!=="CUSTOM")return{bounds:await this.getHardcodedScrollableElementBounds(e,o)};let i=se(),a=e.target.description;if(t){let u=this.getBoundsFromNativeCache(t);return this.logger.info({bounds:u},"Got container bounds from native cache"),{bounds:u,cache:t}}let s=await this.findElement({description:a,tracer:i,metadata:n});if(!s.success)throw new R("NoMatchingElementError",s.thoughts??"No matching element found");let{resolvedTarget:c}=s;if(c.type!=="NATIVE")throw new Error(`ActionFailureError: Custom scroll container "${a}" resolved to a webview element. Custom containers must be native elements.`);let l=this.getBoundsFromNativeCache(c);return this.logger.info({bounds:l},"Got container bounds from AI"),{bounds:l,cache:c}}async tryUseCachedScrollPosition(e,t){let n=e.cache?.target;return n?n.type==="WEBVIEW"?this.tryUseWebviewCache(e,t):n.scrollDetails?this.tryUseNativeScrollCache(e,t,n):null:null}async tryUseWebviewCache(e,t){let n=se();try{let{thoughts:o}=await this.wrapTargetingAction({command:e,tracer:n,description:t,action:async i=>{if(i.type==="NATIVE")throw new Error("Expected WEBVIEW target but got NATIVE");await this.scrollWebviewTargetIntoView(i)}});return{success:!0,message:o}}catch(o){return this.logger.warn({err:o},"Failed to use webview cache, falling back to search"),null}}async tryUseNativeScrollCache(e,t,n){let o=n.scrollDetails,i=se(),a=e.scrollStepPercent??DO,s=o.scrollableElement.type==="CUSTOM"?o.scrollableElement.cache:void 0;await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:o.scrollableElement,containerCache:s,direction:o.direction,scrollStepPercent:a,aiMetadata:{commandId:e.id}});try{let l=await this.tryFindElement({cmd:e,description:t,tracer:i,scrollDetails:o,useAIIfCacheFails:!1});if(l)return l;this.logger.info("Element not found at cached position, undoing scroll")}catch(l){this.logger.warn({err:l},"Error finding element at cached position, will undo scroll")}let c=o.direction==="down"?"up":"down";return this.logger.info({pixelDelta:o.pixelDelta,originalDirection:o.direction,undoDirection:c,scrollableElementType:o.scrollableElement.type},"Undoing scroll"),await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:o.scrollableElement,containerCache:s,direction:c,scrollStepPercent:a,aiMetadata:{commandId:e.id}}),null}async tryFindElement({cmd:e,description:t,tracer:n,scrollDetails:o,useAIIfCacheFails:i=!0}){let a,s,c=e.cache?.target;if(c&&c.resolvedDescription===t&&!e.disableCache){let u=await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0});try{let{resolvedTarget:d}=await gp({target:c,domState:u,stateManager:this.stateManager,logger:this.logger});a=d,s="Successfully resolved scroll to target with cache.",this.logger.info("Successfully resolved scroll to target from cache")}catch(d){this.logger.warn({err:d},"Failed to resolve target from cache")}}if(!a&&!i)return null;if(!a)try{let u=await this.findElement({description:t,tracer:n,metadata:{commandId:e.id}});if(!u.success)return null;a=u.resolvedTarget,s=u.thoughts}catch(u){if(u instanceof R&&u.reason==="NoMatchingElementError")return null;throw this.logger.warn({err:u},"Failed to find scroll-to target with AI"),u}return a.type==="WEBVIEW"?(await this.scrollWebviewTargetIntoView(a),da({command:e,updatedCache:hp(a),updatedWithAI:!0,logger:this.logger}),{success:!0,message:s}):(da({command:e,updatedCache:{...a,scrollDetails:o},updatedWithAI:!0,logger:this.logger}),{success:!0,message:s})}async searchForElement(e,t,n){let o=se(),i=await this.resolveContainer({scrollableElement:e.scrollableElement,aiMetadata:{commandId:e.id}});return this.scrollAndSearch(e,t,o,n,i)}async scrollAndSearch(e,t,n,o,i){let a=0,s=i.bounds,c=s.height*o,l=!0;for(let u=0;u<NO;u++){this.throwIfAborted();let d=this.buildScrollDetails(e,a,i.cache),p=await this.tryFindElement({cmd:e,description:t,tracer:n,scrollDetails:d});if(p)return p;if(!l)throw new Error(`ActionFailureError: Could not find element "${t}" after scrolling to the end`);this.logger.debug({attempt:u,cumulativePixelDelta:a},"Element not found, scrolling further");let m=$K(e.scrollableElement);l=await this.scrollByPage({direction:e.direction,containerBounds:s,scrollStepPercent:o,rawCoordinates:m}),a+=e.direction==="down"?c:-c}throw new Error(`ActionFailureError: Could not find element "${t}" after ${NO} scroll attempts`)}buildScrollDetails(e,t,n){return e.scrollableElement.type==="CUSTOM"?{pixelDelta:t,scrollableElement:{type:"CUSTOM",target:e.scrollableElement.target,cache:n},direction:e.direction}:e.scrollableElement.type==="CUSTOM_COORDINATES"?{pixelDelta:t,scrollableElement:e.scrollableElement,direction:e.direction}:{pixelDelta:t,scrollableElement:e.scrollableElement,direction:e.direction}}async scrollWebviewTargetIntoView(e){let{controller:t,browserTarget:n}=e;await t.browser.hover(n)}async scrollByPage({direction:e,containerBounds:t,scrollStepPercent:n,rawCoordinates:o}){return se().startAsyncSpan("EMULATOR_INTERACTION",async a=>(a.attributes.containerBounds=t,a.attributes.direction=e,this.executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,rawCoordinates:o})),{name:`Scroll ${e} by one page`})}async scrollByPixelDelta({pixelDelta:e,scrollableElement:t,containerCache:n,direction:o,scrollStepPercent:i,aiMetadata:a}){if(e===0)return;let s=se(),c,l,u;if(t.type==="CUSTOM_COORDINATES")c=t.startX,l=t.startY,u=t.deltaPixels;else{let m=(await this.resolveContainer({scrollableElement:t,containerCache:n,aiMetadata:a})).bounds,g=m.height*i,h=this.calculateSwipeCoordinates({containerBounds:m,direction:o,desiredDelta:g});c=h.startX,l=h.startY,u=h.actualDelta}let d=Math.ceil(Math.abs(e)/u);this.logger.debug({pixelDelta:e,direction:o,scrollableElementType:t.type,startX:c,startY:l,maxScrollPerStep:u,numScrolls:d},"scrollByPixelDelta calculated parameters"),await s.startAsyncSpan("EMULATOR_INTERACTION",async p=>{p.attributes.pixelDelta=e,p.attributes.numScrolls=d,p.attributes.maxScrollPerStep=u,p.attributes.startX=c,p.attributes.startY=l;let m=0;for(let g=0;g<d;g++){this.throwIfAborted();let h=Math.abs(e)-m,f=Math.min(u,h);await this.performRawSwipe({startX:c,startY:l,deltaPixels:f,direction:this.invertDirection(o)}),m+=f}},{name:`Scroll ${o} by ${e}px`})}async executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,diffThresholdPercent:o=VK,rawCoordinates:i}){let a=await this.stateManager.getRawScreenshotBase64(),s,c,l;if(i)s=i.startX,c=i.startY,l=i.deltaPixels;else{let m=t.height*n,g=this.calculateSwipeCoordinates({containerBounds:t,direction:e,desiredDelta:m});s=g.startX,c=g.startY,l=g.actualDelta}await this.performRawSwipe({startX:s,startY:c,deltaPixels:l,direction:this.invertDirection(e)});let u=await this.stateManager.getRawScreenshotBase64(),d=Is(a,u),p=d>o;return this.logger.debug({diffPercent:d,diffThresholdPercent:o,canScrollMore:p,direction:e,actualDelta:l,rawCoordinates:i},"Scroll gesture visual diff result"),p}};function $K(r){if(r.type==="CUSTOM_COORDINATES")return r}import{randomUUID as qK}from"crypto";import uu from"fs";import{tmpdir as KK}from"os";import js from"path";var yp=class extends Rt{async doInstallApk(e){return await this.installApkFromUri(e.uri),{success:!0,message:"Installed APK."}}async installApkFromUri(e){let t=await this.resolveUriToLocalApk(e);try{await this.stateManager.executeRawADBCommand(`install -r ${js.resolve(t.localPath)}`),this.logger.info({uri:e,localPath:t.localPath},"Installed APK on device")}finally{t.cleanup()}}async resolveUriToLocalApk(e){try{let t=new URL(e);if(t.protocol==="file:"){let n=t.href.slice(7),o;if(uu.existsSync(n))o=n;else if(uu.existsSync(js.join("/",n)))o=js.join("/",n);else throw new R("UserConfigurationError",`APK not found at path: ${n}`);return this.assertFileExists(o),{localPath:o,cleanup:()=>{}}}if(t.protocol==="http:"||t.protocol==="https:"){let n=await this.fetchWithTimeout(t);if(!n.ok)throw new R("UserInfrastructureError",`Failed to download APK from ${e} (status ${n.status})`);let o=await n.arrayBuffer(),i=Buffer.from(o),a=await this.writeBufferToTempFile(i,t.pathname);return{localPath:a,cleanup:()=>{try{uu.unlinkSync(a)}catch(s){this.logger.warn({err:s,path:a},"Failed to remove temporary APK file")}}}}throw new R("UserConfigurationError",`Unsupported URI scheme for APK installation: ${t.protocol}`)}catch(t){if(t instanceof TypeError){let n=js.resolve(e);return this.assertFileExists(n),{localPath:n,cleanup:()=>{}}}throw t}}assertFileExists(e){try{uu.accessSync(e)}catch{throw new R("UserConfigurationError",`APK not found at path: ${e}`)}}async fetchWithTimeout(e){let t=AbortSignal.timeout(9e4);return await fetch(e,{signal:t})}async writeBufferToTempFile(e,t){let n=js.extname(t)||".apk",o=js.join(KK(),`momentic-apk-${qK()}${n}`);return uu.writeFileSync(o,e),o}};import{existsSync as YK,readFileSync as XK}from"fs";import JK from"zod";var ZK=JK.string().url();async function kO(r){if(ZK.safeParse(r).success){let e=new AbortController,t=setTimeout(()=>e.abort(),1e4),n;try{n=await fetch(r,{signal:e.signal})}catch(i){throw new R("UserInfrastructureError",`Fetch failed or timed out for URL: ${r}`,{errOptions:{cause:i}})}finally{clearTimeout(t)}if(!n.ok)throw new R("UserInfrastructureError",`Failed to fetch file from URL: ${r}, status: ${n.status}`);let o=await n.arrayBuffer();return Buffer.from(o).toString("base64")}if(!YK(r))throw new R("UserInfrastructureError",`File does not exist at path: ${r}`);return XK(r).toString("base64")}var bp=class extends Rt{async dragNative(e,t,n){let{left:o,top:i,width:a,height:s}=this.getBoundsFromNativeCache(e),{left:c,top:l,width:u,height:d}=this.getBoundsFromNativeCache(t),p=o+a/2,m=i+s/2,g=c+u/2,h=l+d/2,f=n?.hoverDuration??500,y=n?.dragDuration??1e3;await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:p,y:m},{type:"pointerDown",button:0},{type:"pause",duration:f},{type:"pointerMove",duration:y,x:g,y:h},{type:"pointerUp",button:0}]}]),await this.driver.releaseActions()}async dragWebview(e,t,n){let{controller:o}=e;if(e.controller!==t.controller)throw new R("UserConfigurationError","Cannot drag and drop between different webviews");let i=n?.dragDuration??1e3,a=n?.hoverDuration??1e3,s;n?.dragDuration&&(s=Math.max(1,Math.floor(i/200))),await o.browser.dragAndDrop(e.browserTarget,t.browserTarget,{hoverDurationMs:a,steps:s,dragDurationMs:i})}async executeDragAndDrop({command:e}){let t=se();if(e.fromTarget.type!=="description"||e.toTarget.type!=="description")throw new R("UserConfigurationError","Drag and drop only supports description targets for now");let n=e.fromTarget.description,{result:o,thoughts:i}=await this.wrapTargetingAction({command:e,tracer:t,description:n,cacheKey:"cache",targetName:"fromTarget",action:async l=>l}),a=e.toTarget.description,{result:s,thoughts:c}=await this.wrapTargetingAction({command:e,tracer:t,description:a,cacheKey:"cache",targetName:"toTarget",action:async l=>l});if(o.type!==s.type)throw new R("UserConfigurationError",`Drag and drop targets must be in the same context (both native or both webview). Found: From=${o.type}, To=${s.type}`);return await t.startAsyncSpan("EMULATOR_INTERACTION",async l=>{o.type==="NATIVE"&&s.type==="NATIVE"?await this.dragNative(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}):o.type==="WEBVIEW"&&s.type==="WEBVIEW"&&(l.withinWebview=!0,await this.dragWebview(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}))},{name:"Drag and drop"}),{success:!0,message:`${i}
4586
4586
  ${c}`}}};import{cloneDeep as FO}from"lodash-es";var Ep=class{async getTextContent(e){return await e.textContent()??""}async getAttribute(e,t){return await e.getAttribute(t,{timeout:3e3})??""}async getTagName(e){return await e.evaluate(t=>t.tagName)}async isEditable(e){return await e.isEditable({timeout:mr*1e3})}async isEnabled(e){return await e.isEnabled({timeout:mr*1e3})}async isFocused(e){return await e.evaluate(t=>t===document.activeElement)}async getStyleProperty(e,t){return await e.evaluate((n,o)=>window.getComputedStyle(n).getPropertyValue(o),t)}},Tp=class{async getTextContent(e){return Yc(e)}async getAttribute(e,t){return e.getAttribute(t)??""}async getTagName(e){return e.tagName}async isEditable(e){throw new Error("Cannot perform editable check on native element")}async isEnabled(e){return e.getAttribute("enabled")==="true"}async isFocused(e){return e.getAttribute("focused")==="true"}async getStyleProperty(e,t){throw new Error("Cannot perform computed style checks on native element")}};var QK=5e3,vp=class extends Rt{async executeElementCheck(e){let t=Date.now(),n=(e.timeout??mr)*1e3,o=n+1e4,i,a=0,s=500,c=FO(e.cache);if(e.target.type!=="description")throw new R("UserConfigurationError","x/y targets are not supported for the Element Check step");for(;a-t<n;){if(Date.now()-t>o){this.logger.warn("Exceeded max system timeout for element check, exiting...");break}if(this.throwIfAborted(),i=await this.executeElementCheckHelper(e),a=Date.now(),!i.success)e.cache=c,c=FO(c),await J(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),QK);else return i}let l=await this.executeElementCheckHelper(e,{cacheIsInvalidAfterResolution:!0});if(!l.success&&c&&e.cache){let u=Qc({logger:this.logger,originalTarget:zi(c)?c.target:void 0,newTarget:e.cache.target});u&&Ls(c.target,u)&&(e.cache={target:u,updatedAt:e.cache.updatedAt})}return l}async executeElementCheckHelper(e,t){let n=se();if(e.target.type!=="description")throw new R("UserConfigurationError","x/y targets are not supported for the Element Check step");let o=Nm(e.assertion);try{return(await this.wrapTargetingAction({...t??{},command:e,tracer:n,action:async a=>"type"in a&&a.type==="NATIVE"?await this.executeNativeElementCheck(e,a):await this.executeWebviewElementCheck(e,a),description:e.target.description,skipFetchingFullWebviewContent:!0,removeWebviewContent:!0,disableTargetRedirection:!0})).result}catch(i){return o&&(i instanceof R&&i.reason==="NoMatchingElementError"||i instanceof wo)?{success:!0}:{success:!1,message:`Failed to evaluate element content assertion: ${i instanceof Error?i.message:`${i}`}`}}}async executeNativeElementCheck(e,t){let n=se(),{assertion:o}=e,i=t.resolvedNode;return await n.startAsyncSpan("ELEMENT_ASSERTION",async a=>{let s=await this.executeElementAssertion({assertion:o,element:i,elementPropertyAccessors:new Tp,span:a});return a.result=s,s},{name:"Native element check"})}async executeWebviewElementCheck(e,t){let n=se(),o=t.browserTarget.locator,i=e.assertion;return await n.startAsyncSpan("ELEMENT_ASSERTION",async a=>{await t.controller.browser.highlight(o);let s=await this.executeElementAssertion({assertion:i,element:o,elementPropertyAccessors:new Ep,span:a});return a.result=s,s},{name:"Webview element check"})}async executeElementAssertion({assertion:e,element:t,elementPropertyAccessors:n,span:o}){switch(e.type){case"ELEMENT_CONTENT":{let i=await n.getTextContent(t)??"";return o.attributes.elementTextContent=$t(i,500,!0),zn(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})?{success:!0}:{success:!1,message:`The content ${rn(e)} '${e.value}': ${i}`}}case"ELEMENT_ATTRIBUTE":{"evaluate"in t&&(o.attributes.elementOuterHtml=$t(await t.evaluate(a=>a.cloneNode(!1).outerHTML),500,!0));let i;try{i=await n.getAttribute(t,e.attr)}catch{i=null}if(!zn(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let a=rn(e);return{success:!1,message:`The attribute ${e.attr} ${a}${e.operation==="EXISTS"?"":` '${e.value}': ${i}`}`}}return{success:!0}}case"ELEMENT_EXISTENCE":{let i=!1;switch(e.condition){case"EDITABLE":i=await n.isEditable(t);break;case"VISIBLE":case"EXISTS":i=!0;break;case"ENABLED":{i=await n.isEnabled(t);break}case"FOCUSED":i=await n.isFocused(t);break;default:throw e.condition,new Error("Unrecognized element condition type")}return i=e.negated?!i:i,i?{success:!0}:{success:!1,message:`The element ${rn(e)}`}}case"ELEMENT_NAME":{let i=await n.getTagName(t);return zn(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})?{success:!0}:{success:!1,message:`The element tag name ${rn(e)} '${e.value}': ${i}`}}case"ELEMENT_STYLE":{let i=await n.getStyleProperty(t,e.property);if(!zn(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let a=rn(e);return{success:!1,message:`The style property ${e.property} ${a}${e.operation==="EXISTS"?"":` '${e.value}': ${i}`}`}}return{success:!0}}default:throw new Error("Unrecognized element assertion type")}}};var eY=5e3,Ap=class extends Rt{async executeScreenCheck(e){let{timeout:t}=e,n=Date.now(),o=(t??mr)*1e3,i=o+1e4,a=0,s=500;for(;a-n<o;){if(Date.now()-n>i){this.logger.warn("Exceeded max system timeout for screen check, exiting...");break}this.throwIfAborted();let c=await this.executeScreenCheckHelper(e);if(a=Date.now(),!c.success)await J(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),eY);else return c}return await this.executeScreenCheckHelper(e)}async executeScreenCheckHelper(e){return await se().startAsyncSection("Execute screen check",async(n,o)=>{let[i,a]=await Promise.all([this.executeNativeScreenCheckHelper({span:o,command:e}),this.executeWebviewScreenCheckHelper(e)]);return a?e.assertion.negated?i.success&&a.success?i:i.success?a:i:i.success?i:a:i})}async executeNativeScreenCheckHelper({span:e,command:t}){let{assertion:n}=t;switch(n.type){case"CONTENT":try{let o=(await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0})).graph.document.documentElement?.outerHTML;if(!o)throw new Error("Failed to get screen HTML");let i=o.includes(n.value)===!n.negated;return o.length>1e4&&(o=o.slice(0,1e4)+"...TRUNCATED"),i?{success:!0}:(e.attributes.screenContent=o,{success:!1,message:`The screen ${LS(n)}.`})}catch(o){return{success:!1,message:`Failed to evaluate screen content assertion: ${o instanceof Error?o.message:`${o}`}`}}default:return n.type,{success:!1,message:`Unsupported screen check assertion type: ${n.type}`}}}async executeWebviewScreenCheckHelper(e){let t=await this.stateManager.getActiveWebview();if(!t||!t.browserController)return;let n=t.browserController.browser;return await up({assertion:e.assertion,logger:this.logger,browser:n,autoExpandIframes:!!n.userBrowserSettings.autoExpandIframes})}};var Rp=class extends Rt{async doUninstallApk(e){return await this.uninstallApkPackage(e.packageName),{success:!0,message:"Uninstalled APK."}}async uninstallApkPackage(e){let t=e.replace(/^package:/,""),n=await this.stateManager.executeRawADBCommand(`shell pm list packages | grep -E "^package:${t}$" || true`);if(!n||n.length===0)throw new R("UserConfigurationError",`Package ${t} not found`);if(n.split(`
4587
4587
  `).filter(i=>!!i).length>1)throw new R("UserConfigurationError",`Multiple packages found for ${t}`);try{await this.stateManager.executeRawADBCommand(`uninstall ${t}`)}catch(i){throw new R("UserInfrastructureError",`Failed to uninstall package ${t}: ${i}`)}}};import{createHash as rY}from"crypto";import{_android as nY,chromium as oY}from"playwright";import{z as St}from"zod";var UO=St.object({"Android-Package":St.string(),Browser:St.string(),"Protocol-Version":St.string(),"User-Agent":St.string(),"V8-Version":St.string(),"WebKit-Version":St.string(),webSocketDebuggerUrl:St.string()}),BO=St.object({description:St.string(),devtoolsFrontendUrl:St.string(),id:St.string(),title:St.string(),type:St.string(),url:St.string(),webSocketDebuggerUrl:St.string()}),zO=St.object({proc:St.string(),webview:St.string(),webviewName:St.string()}),GO=St.array(zO.extend({info:UO.optional(),pages:St.array(BO).optional()})),$Ye=St.array(zO.extend({info:UO,pages:St.array(BO)}));var wp=class r{driver;limbarClient;device;currentContext;logger;webviews=new Map;fixtures;orgId;options;aborter;constructor({driver:e,context:t,limbarClient:n,logger:o,device:i,fixtures:a,orgId:s,options:c,aborter:l}){this.driver=e,this.limbarClient=n,this.device=i,this.currentContext=t,this.logger=o,this.fixtures=a,this.orgId=s,this.options=c,this.aborter=l;for(let u of["SIGINT","SIGTERM"])process.on(u,async()=>{await this.cleanupWebviews()})}static async init({driver:e,logger:t,fixtures:n,limbarClient:o,orgId:i,adbPort:a,options:s,aborter:c,playwrightDevice:l}){let u=await e.getContext(),d=typeof u=="string"?u:u.id,p;if(l)p=l;else{let g=(await nY.devices()).filter(h=>h._initializer?.serial?.endsWith(a.toString())||h._initializer?.serial?.endsWith((a-1).toString()));if(t.warn({devices:g.map(h=>({serial:h._initializer?.serial,model:h._initializer?.model}))},"No playwright device provided, using ADB to find device"),g.length===0)throw new R("UserInfrastructureError",`Momentic found no devices listening on port ${a} or ${a-1}. This can occur if Android Studio reuses existing emulators. Please run 'adb emu kill' and 'adb disconnect' and retry.`);if(g.length>1)throw new R("UserInfrastructureError",`Momentic found multiple devices on the ports ${a} or ${a-1}. This can occur if Android Studio reuses existing emulators. Please run 'adb emu kill' and 'adb disconnect' and retry.`);p=g[0]}let m=new r({driver:e,context:d,logger:t,device:p,fixtures:n,orgId:i,options:s,aborter:c,limbarClient:o});return m.startWebviewRefreshInterval(),m}async getContexts(){let e=await this.driver.getContexts({}),t=Array.from(this.webviews.values());return{contexts:e,webviews:t.map(n=>({contextId:n.contextId,packageName:n.packageName,active:n.active,hasPlaywright:!!n.browserController,lastSeen:n.lastSeen,socketName:n.socketName}))}}async getRawScreenshotBase64(e=2){let t=se(),n;for(let o=0;o<e;o++)try{return await t.startAsyncSpan("EMULATOR_READ_STATE",async()=>await this.driver.takeScreenshot(),{name:"Take screenshot",signal:this.aborter.controller?.signal,timeoutMs:2e3})}catch(i){if(n=i,this.logger.warn({err:i},"Failed to take screenshot"),o===e-1)throw i}throw new R("InternalWebAgentError",`Failed to take screenshot: ${n}`)}async getCurrentScreenshotPngString(){return`data:image/png;base64,${await this.getRawScreenshotBase64(1)}`}async waitForScreenshotStability({timeoutMs:e,signal:t,reason:n,tolerancePercent:o=1}){await se().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async i=>{i.attributes.reason=n;let a=Date.now(),s,c,l=!1;for(;Date.now()-a<e;){c&&c<500&&await J(500-c,t),t?.throwIfAborted();let u=Date.now();if(!s){s=await this.getRawScreenshotBase64(),c=u-a;continue}let d=await this.getRawScreenshotBase64();if(c=u-a,Is(s,d)<=o){l=!0;break}s=d}l||(i.attributes.timedOut=!0,this.logger.warn({purpose:n},"Timed out waiting for screenshot stability"))})}async waitForPageSourceStability({timeoutMs:e,signal:t,reason:n}){await se().startAsyncSpan("WAIT_FOR_PAGE_STABILITY",async o=>{o.attributes.reason=n;let i=Date.now(),a,s,c=!1;for(;Date.now()-i<e;){s&&s<250&&await J(250-s,t),t?.throwIfAborted();let l=Date.now(),u;try{u=await this.getPageSource()}catch(p){this.logger.warn({err:p},"Failed to get page source during stability wait"),s=Date.now()-l;continue}let d=rY("md5").update(u).digest("hex");if(s=Date.now()-l,a&&a===d){c=!0;break}a=d}c||(o.attributes.timedOut=!0,this.logger.warn({purpose:n},"Timed out waiting for page source stability"))})}async getCurrentPackage(){let e=await this.driver.execute("mobile: getCurrentPackage");return typeof e=="string"?e:void 0}async getActiveWebviewNodes(){let t=(await this.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0})).graph,n=[];for(let[o,i]of t.idToElement.entries())n.some(a=>a.id===o)||lu(i)&&n.push({id:o,originalElement:i,bounds:ua(i)});return n}async getActiveWebviewContent(){let e=await this.getActiveWebview();if(!e||!e.browserController)return;this.throwIfAborted();let t=e.browserController;return(await se().startAsyncSpan("EMULATOR_READ_STATE",()=>t.getBrowserState({abortSignal:this.aborter.controller?.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:this.logger,serializationOpts:{noId:!0}}),{name:"Get webview content",signal:this.aborter.controller?.signal})).serializedTree}async getDomState(e){return await se().startAsyncSection("Get emulator state XML",async()=>{let n;if(!e?.skipFetchingFullWebviewContent)try{n=await this.getActiveWebviewContent()}catch(c){this.logger.error({err:c},"Could not get webview info to get the nested DOM state")}this.throwIfAborted();let i=e?.filterOffscreenElements??!0?await this.getViewportBounds():void 0,a=await this.getPageSource();return{graph:await RO(a,{injectedWebviewContent:n,disableMomenticAccessibilityTree:this.options.disableMomenticAccessibilityTree,removeWebviewContent:e?.removeWebviewContent,viewportBounds:i}),context:this.currentContext}},{timeoutMs:15e3})}async getPageSource(){return await se().startAsyncSpan("EMULATOR_READ_STATE",()=>this.driver.getPageSource(),{name:"Get Android page source",signal:this.aborter.controller?.signal})}async getViewportBounds(){let e=await this.driver.getWindowRect();return{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height}}refreshPromise;refreshInterval;async refreshWebviewsManually(e){if(this.refreshPromise){await this.refreshPromise;return}clearInterval(this.refreshInterval),this.refreshPromise=this.doRefreshWebview(e).catch(t=>{this.logger.warn({err:t},"Error refreshing webviews, continuing...")}).finally(()=>{this.refreshPromise=void 0,this.startWebviewRefreshInterval()})}startWebviewRefreshInterval(){this.refreshInterval||(this.refreshInterval=setInterval(()=>{this.refreshPromise=this.doRefreshWebview("auto refresh").catch(e=>{this.logger.warn({err:e},"Error refreshing webviews, continuing...")}).finally(()=>{this.refreshPromise=void 0})},15e3))}async doRefreshWebview(e){this.logger.info({reason:e},"Refreshing webviews"),await this.getPageSource(),this.throwIfAborted();let t=await this.getCurrentPackage();if(t==="com.android.permissioncontroller")return;let n=await this.getDetailedContexts();if(!n){this.logger.warn("No context details, not proceeding with refreshing webviews");return}let o=Date.now(),i=new Set;for(let a of n){if(this.throwIfAborted(),a.webview==="NATIVE_APP")continue;let s=a.info["Android-Package"];if(t&&s!==t&&this.logger.warn({packageName:s,currentPkgName:t},"Ignoring webview not in the active package"),i.add(a.webview),!this.webviews.has(a.webview)||!this.webviews.get(a.webview)?.active){let c={contextId:a.webview,packageName:s,active:!1,lastSeen:o,socketName:a.proc.startsWith("@")?a.proc.substring(1):a.proc};this.logger.info({contextId:c.contextId,packageName:c.packageName,socketName:c.socketName},"New webview detected"),this.webviews.set(a.webview,c);let l;if(s==="com.android.chrome"?(this.logger.info({webviewInfo:c},`Connecting Playwright to Android Chrome: ${a.webview}`),l=await this.connectPlaywrightToChrome(c),this.logger.info(`Connected Playwright to Android Chrome: ${a.webview}`)):(this.logger.info({webviewInfo:c},`Connecting Playwright to webview: ${a.webview}`),l=await this.connectPlaywrightToWebview(s,c.socketName),l&&this.logger.info(`Connected Playwright to webview ${a.webview}`)),!l)continue;c.browserController=l,c.active=!0}}for(let[a,s]of this.webviews.entries())!i.has(a)&&s.active&&(this.logger.info(`Disconnecting dead webview ${a}`),this.disconnectPlaywrightFromWebview(s),s.active=!1);this.logger.info("Refreshed webviews")}async getActiveWebview(){await this.refreshPromise;let e=await this.driver.execute("mobile: getCurrentPackage"),t=async()=>{e!==void 0&&typeof e!="string"&&this.logger.warn({currentPkg:e},"Unexpected getCurrentPackage result"),this.logger.info({currentPkg:e,allWebviews:Array.from(this.webviews.values()).map(i=>({contextId:i.contextId,packageName:i.packageName,active:i.active}))},"getActiveWebview: filtering webviews");let o=[];for(let i of this.webviews.values())i.packageName===e&&i.active&&o.push(i);return this.logger.info(`getActiveWebview: found ${o.length} matching webviews`),o},n=await t();if(n.length===0&&(await se().startAsyncSection("Refresh webviews",async()=>{await this.refreshWebviewsManually("no matching webview during getActiveWebview")}),n=await t()),n.length>1)throw new R("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");return n[0]}getDeviceSerial(){let e=this.driver.capabilities,t=n=>{if(!e||typeof e!="object")return;let o=e[n];return typeof o=="string"?o:void 0};return t("deviceUDID")||t("udid")||t("appium:udid")||t("appium:deviceUDID")}async executeRawADBCommand(e){let t=this.getDeviceSerial(),n=e.trim().split(/\s+/).filter(i=>i.length>0);this.logger.info({serial:t,cmdArgs:n},"Executing ADB command");let o=await kt(n,{serial:t,timeoutMs:15e3,throwOnError:!0});return this.logger.info({result:o},"ADB command result"),o}async cleanupWebviews(){this.refreshInterval&&(clearInterval(this.refreshInterval),this.refreshInterval=void 0);for(let[e,t]of this.webviews.entries())this.logger.info(`Disconnecting webview ${e}`),this.disconnectPlaywrightFromWebview(t),t.active=!1}async getDetailedContexts(){return await se().startAsyncSpan("EMULATOR_READ_STATE",async()=>{let t=await this.driver.execute("mobile: getContexts");this.aborter.controller?.signal.throwIfAborted();let n;try{n=GO.parse(t)}catch(o){throw new R("InternalWebAgentError",`Failed to parse contexts. Original error:
4588
4588
  ${o}
@@ -4593,7 +4593,7 @@ ${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Moment
4593
4593
  `)){let o=n.indexOf("=");if(o===-1)continue;let i=n.slice(0,o),a=n.slice(o+1).trim();t[i]=a}return t}async function VY(r,e,t){try{let o=t["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 QO("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 QO("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function $Y(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return VY(r,e,t);if(o)return}catch{}}function Mp(r){if(r.startsWith("git@")){let e=r.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let n=t[0],o=t[1];return`${n}/${o}`}}}else if(r.startsWith("http")||r.startsWith("https")){let t=new URL(r).pathname.split("/").filter(Boolean);if(t.length>=2){let n=t[0],o=t[1].replace(".git","");return`${n}/${o}`}}}function qY(r){if(!(r instanceof Error))return!1;let e=r.message;return e.includes("not a git repository")||e.includes("ENOENT")}async function st(r,e){try{return(await e).trim()}catch(t){if(qY(t))return;r.error({err:t},"Failed to run git command");return}}function KY(){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 YY(r){let[e,t,n]=await Promise.all([st(r,at.show(["--no-patch","--format=%ci"])),st(r,at.show(["-s","--pretty=%B"])),st(r,at.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?So(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function XY(r){let[e,t,n]=await Promise.all([st(r,at.listRemote(["--get-url","origin"])),st(r,at.show(["-s","--pretty=%B"])),st(r,at.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?So(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:t,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function JY(r){let[e,t,n,o]=await Promise.all([st(r,at.show(["--no-patch","--format=%ci"])),st(r,at.listRemote(["--get-url","origin"])),st(r,at.show(["-s","--pretty=%B"])),st(r,at.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??t,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Mp(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?So(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 ZY(r){let[e,t,n]=await Promise.all([st(r,at.show(["--no-patch","--format=%ci"])),st(r,at.show(["-s","--pretty=%B"])),st(r,at.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Mp(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?So(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:t,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 QY(r){let[e,t,n]=await Promise.all([st(r,at.show(["--no-patch","--format=%ci"])),st(r,at.show(["-s","--pretty=%B"])),st(r,at.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Mp(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?So(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function e4(r,e){let[t,n,o,i,a,s,c,l,u]=await Promise.all([st(r,at.revparse(["HEAD"])),st(r,at.revparse(["--short","HEAD"])),st(r,at.revparse(["--abbrev-ref","HEAD"])),st(r,at.listRemote(["--get-url","origin"])),st(r,at.show(["--no-patch","--format=%ci"])),st(r,at.show(["-s","--pretty=%B"])),st(r,at.show(["-s","--pretty=%an"])),e?st(r,at.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),jY(r)]),d=l?await st(r,at.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),g=i?Mp(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,y=u["user.username"]||void 0,E=await $Y(r,i,u)??y??void 0;return{ciProvider:"none",gitCommitSha:t,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?So(a):void 0,gitCommitMessage:s,gitCommitAuthorName:c,gitLocalUsername:E,gitLocalEmail:h,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?So(d):void 0,githubRepository:p?g:void 0,gitlabProjectPath:m?g:void 0,pipelineId:void 0}}async function t4(){let r=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:r?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:r?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}function r4(){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:So(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:So(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 n4(r){let e=[...r.config.gitProtectedBranches??[]];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function mu(r,e){let t=KY();if(!t)return e4(r,e);switch(t){case"GithubActions":return YY(r);case"GitlabCI":return XY(r);case"CircleCI":return JY(r);case"Buildkite":return ZY(r);case"AzureDevOps":return QY(r);case"GCPCloudBuild":return t4();case"Custom":return r4()}}async function o4(r,e,t,n){let o=n;if(!n.gitCommitSha)return o;if(n.gitMainBranch&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let i=await e.getMergeBaseCommitFromGitlab(t,n.gitMainBranch,n.gitCommitSha);o={...o,lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(i){r.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(t,n.gitCommitSha);i&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??i.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??i.author.name,gitCommitMessage:o.gitCommitMessage??i.message})}catch(i){r.warn({err:i},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName)try{let i=await e.getMergedBranchFromGitlab(t,n.gitBranchName??"",n.gitCommitSha);i.mergedBranch&&(o={...o,mergedGitBranchName:i.mergedBranch})}catch(i){r.warn({err:i},"Failed to get merged branch from Gitlab")}return o}async function i4(r,e,t,n,o){let i=o;if(!o.gitCommitSha)return i;if(o.gitMainBranch&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let a=await e.getMergeBaseCommitFromGithub(t,n,o.gitMainBranch,o.gitCommitSha);i={...i,lastCommitOnMainSha:a.sha,lastCommitOnMainTimestamp:a.committer.date}}catch(a){r.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(t,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){r.warn({err:a},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName)try{let a=await e.getMergedBranchFromGithub(t,n,o.gitBranchName??"",o.gitCommitSha);a.mergedBranch&&(i={...i,mergedGitBranchName:a.mergedBranch})}catch(a){r.warn({err:a},"Failed to get merged branch from GitHub")}return i}async function a4(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await i4(r,e,n,o,t)}else if(t.gitlabProjectPath)return await o4(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function ln(r,e,t){let n=await n4(t),o=await mu(r,n.gitMainBranch),i={...n,...o};(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp)&&i.gitBranchName===n.gitMainBranch&&(i.lastCommitOnMainSha=i.gitCommitSha,i.lastCommitOnMainTimestamp=i.gitCommitTimestamp);let a=await a4(r,e,i);return{...n,...o,...a}}import{diff as eL}from"deep-object-diff";import si from"fs";import{cloneDeep as s4}from"lodash-es";import Ip from"path";import{v4 as l4}from"uuid";import pu from"yaml";function tL(r,e){let t=`${hn(e)}.module.yaml`,n=Ip.join(Ip.dirname(r),t);if(si.existsSync(n))throw new Error(`A conflicting file already exists at the following path: ${n}`);return si.renameSync(r,n),n}function rL({content:r,schemaVersion:e,momenticFiles:t,project:n,forceSaveOnNoDiffs:o}){let i=t.mobileModules[r.moduleId]?.fullFilePath,a=t.mobileModules[r.moduleId]?.name;if(!i||!si.existsSync(i))throw new Error(`Tried to update mobile module ${r.moduleId} that could not be found on disk`);let s=si.readFileSync(i,"utf-8"),c=pu.parse(s),l={...c,...r,schemaVersion:e},u=go({fileType:Xe.MOBILE_MODULE,...cc.parse(l),steps:Yr.array().parse(r.steps)}),d=!!r.name&&r.name!==a,p=eL(u,c);if(p&&Object.keys(p).length===0&&!o&&!d)return;let m=pu.stringify(u);si.writeFileSync(i,m,"utf-8");let g;d&&(g=tL(i,r.name)),$n(g||i,n.config)}function nL({moduleId:r,patch:e,momenticFiles:t,project:n,logger:o}){let i=t.mobileModules[r]?.fullFilePath;if(!i)throw new Error(`Tried to update mobile module ${r} that could not be found on disk`);let a=gu(i,o),s={...a,...e},c=go({fileType:Xe.MOBILE_MODULE,...hd.parse(s)}),l=eL(c,a);if(l&&Object.keys(l).length===0)return;let u=pu.stringify(c);si.writeFileSync(i,u,"utf-8");let d;e.name&&(d=tL(i,e.name)),$n(d||i,n.config)}async function oL({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=hn(r),s=Ip.join(o,`${a}.module.yaml`),c=l4(),{stepsToSave:l}=await Gn({platform:"ANDROID",steps:n}),u={schemaVersion:_o,moduleId:c,description:e,enabled:t},d={fileType:Xe.MOBILE_MODULE,...u,steps:l},p=pu.stringify(vA.parse(d));return si.writeFileSync(s,p,"utf-8"),$n(s,i.config),{moduleId:c,name:r,description:e||void 0,steps:n}}function gu(r,e){let t=si.readFileSync(r,"utf-8"),n=pu.parse(t);try{return{...hd.parse(n),name:Ip.basename(r,".module.yaml")}}catch(o){throw e.error({err:o,moduleFilePath:r,moduleContents:t},`${r} does not parse as a valid Momentic mobile module`),o}}async function qy(r,e,t,n){let o=gu(r.fullFilePath,t),{resolvedSteps:i}=await Zc({rawSteps:o.steps,resolvedModuleCache:n||{},onFetchModule:async s=>{let c=e.mobileModules[s]?.fullFilePath;if(!c)throw new Error(`Could not find mobile module with id ${s}`);return gu(c,t)},logger:t,metadata:{id:o.moduleId,schemaVersion:o.schemaVersion}}),a={...o,name:r.name,description:o.description||void 0,steps:i};return n&&(n[r.id]=s4(a)),a}async function iL(r,e){let t={};return await Promise.all(Object.values(r.mobileModules).map(async n=>{await qy(n,r,e,t)})),Array.from(Object.values(t))}import{randomUUID as c4}from"crypto";import cn from"fs";import li from"path";import Ks from"yaml";import qs from"zod";function aL({name:r,description:e="",steps:t=[],settings:n={},folder:o}){let a=`${hn(r)}.test.yaml`,s=li.join(o,a);if(cn.existsSync(s))throw new Error(`A test named '${r}' already exists at path '${s}'. Choose a different name.`);let c={fileType:Xe.MOBILE_TEST,id:c4(),description:e,schemaVersion:Mo,platform:"ANDROID",settings:n,steps:t},l=Ks.stringify(c);return cn.writeFileSync(s,l,"utf-8"),{fullPath:s,testId:c.id}}function Ky(r){if(!cn.existsSync(r))throw new Error(`Test file not found: ${r}`);let e=cn.readFileSync(r,"utf-8").replace(/\r\n|\r/g,`
4594
4594
  `),t=Ks.parse(e);if(!t.steps||!Array.isArray(t.steps))throw new Error(`Test ${r} is missing steps`);return t}async function yo(r,e,t){let n=Ky(r),o;try{o=ko.parse(n)}catch(i){throw new Error(`Mobile test ${r} is missing metadata or has invalid metadata: ${i}`)}switch(o.platform){case"ANDROID":return u4(r,e,t);case"IOS":return d4(r,e,t)}}async function u4(r,e,t){let n=Ky(r),o;try{o=ss.parse(n)}catch(s){throw new Error(`Mobile test ${r} is missing metadata or has invalid metadata: ${s}`)}let{resolvedStepLists:i}=await WS({rawStepLists:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},logger:e,testMetadata:o,onFetchModule:async s=>{let c=t.mobileModules[s]?.fullFilePath;if(!c)throw new Error(`Mobile module ${s} not found`);return gu(c,e)}});return{...o,steps:i.steps}}async function d4(r,e,t){let n=Ky(r),o;try{o=ls.parse(n)}catch(s){throw new Error(`Mobile test ${r} is missing metadata or has invalid metadata: ${s}`)}let{resolvedStepLists:i}=await HS({rawStepLists:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},logger:e,testMetadata:o,onFetchModule:async s=>{throw new Error("iOS modules are not yet supported")}});return{...o,steps:i.steps}}async function sL({filePath:r,steps:e,settings:t,labels:n,folder:o,project:i,momenticFiles:a,schemaVersion:s}){let c=li.isAbsolute(r)?r:li.join(o,r);if(!cn.existsSync(c))throw new Error(`Test file not found: ${c}`);let l=cn.readFileSync(c,"utf-8").replace(/\r\n|\r/g,`
4595
4595
  `),u=Ks.parse(l),d=uc.extend({steps:qs.record(qs.string(),qs.unknown()).array()}).parse({...u,schemaVersion:s});if(d.fileType!==Xe.MOBILE_TEST)throw new Error(`File at '${c}' is not a mobile test (fileType=${d.fileType}).`);let p;e&&(p=await Gn({platform:d.platform,steps:e}));let m={...d,...p?.stepsToSave!==void 0?{steps:p.stepsToSave}:{steps:d.steps},...n!==void 0?{labels:n}:{}};t&&(m.settings=t);let g=Ks.stringify(m);for(let h of p?.moduleUpdates??[])rL({content:h,schemaVersion:Mo,momenticFiles:a,project:i});cn.writeFileSync(c,g,"utf-8"),$n(c,i.config)}function lL(r,e,t){let n=li.join(t.rootDir,r);if(!cn.existsSync(n))throw new Error(`Test not found at path '${r}' in project '${t.rootDir}'`);let o=cn.readFileSync(n,"utf-8").replace(/\r\n|\r/g,`
4596
- `),i=Ks.parse(o),a=uc.extend({steps:qs.record(qs.string(),qs.unknown()).array()}).parse(i),s=li.basename(r,".test.yaml"),c,l;if(e.name&&e.name!==s){let p=`${hn(e.name)}.test.yaml`;if(c=li.join(li.dirname(r),p),l=li.join(t.rootDir,c),cn.existsSync(l))throw new Error(`Test with name '${e.name}' already exists at path '${l}'`)}let u={...a,...e};if(delete u.name,u.fileType!==Xe.MOBILE_TEST)throw new Error(`File at '${n}' is not a mobile test (fileType=${u.fileType}).`);let d=Ks.stringify(u);return cn.writeFileSync(n,d,"utf-8"),l&&l!==n?(cn.renameSync(n,l),$n(l,t.config)):$n(n,t.config),{newRelativeTestPath:c}}import{randomUUID as m4}from"crypto";import ci from"fs";import Ys from"path";var cL=new Set([".DS_Store","__MACOSX"]),uL={status:(r,e)=>{if(r.status===e.status)return r.status;if(r.status==="FAILED"||e.status==="FAILED")return"FAILED";if(r.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(r.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(r.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(r.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${r.status} and ${e.status}`)},startedAt:(r,e)=>r.startedAt<e.startedAt?r.startedAt:e.startedAt,updatedAt:(r,e)=>r.updatedAt>e.updatedAt?r.updatedAt:e.updatedAt,finishedAt:(r,e)=>!r.finishedAt||!e.finishedAt?new Date:r.finishedAt>e.finishedAt?r.finishedAt:e.finishedAt,gitCommitTimestamp:(r,e)=>{if(!(!r&&!e)){if(!r.gitCommitTimestamp||!e.gitCommitTimestamp||r.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${r.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return r.gitCommitTimestamp}},pipelineId:(r,e)=>r.pipelineId===e.pipelineId?r.pipelineId:!r.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&r.pipelineId?r.pipelineId:r.startedAt<e.startedAt?e.pipelineId:r.pipelineId,labels:(r,e)=>{let t=new Set([...r.labels??[],...e.labels??[]]);return Array.from(t)}};function p4(r,e,t){if(uL[t]){let i=uL[t];return i(r,e)}let n=r[t],o=e[t];if(n!==o)throw new Error(`Metadata values for key "${t}" do not match: "${n}" vs "${o}"`);return n}var Yy=class extends Error{constructor(e,t){let n=`${e} contains invalid Momentic results: ${t}. 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 dL(r,e){try{let t=Ys.join(e,"metadata.json");return ds.parse(JSON.parse(ci.readFileSync(t,"utf-8")))}catch{throw new Yy(r,e)}}function mL(r,e,t){let n=m4(),o=r.child({runGroupId:n});ci.rmSync(e,{recursive:!0,force:!0});let i=ci.readdirSync(t).filter(c=>!cL.has(c)).map(c=>Ys.join(t,c));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);ci.mkdirSync(e,{recursive:!0});let a={...dL(t,i[0]),id:n};for(let c of i){let l=Ys.join(c,"runs");if(!ci.existsSync(l))continue;let u=dL(t,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=p4(a,u,m)}let d=ci.readdirSync(l);for(let p of d){if(cL.has(p))continue;let m=Ys.join(l,p),g=Ys.join(e,"runs",p);ci.cpSync(m,g,{recursive:!0})}}let s=Ys.join(e,"metadata.json");ci.writeFileSync(s,JSON.stringify(a,null,2))}import r0 from"adm-zip";import Sb from"fs";import{z as r3}from"zod";var j="v1",Xy="mobile-cli",fa="0.35.3";var g4=9e4,h4=3,f4=1500,S4=15e3,Tn=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function y4(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Jy=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return fa&&(e[xd]=fa),Xy&&(e[dR]=Xy),e}async sendRequest(e,t){let{retries:n=h4,requestTimeoutMs:o=g4,initialRetryDelayMs:i=f4,maxRetryDelayMs:a=S4,onFailedRequest:s}=t,c=n,l=n,u,d={path:e,baseUrl:this.baseUrl,method:t.method};for(;c>0;)try{return c--,await this.sendSingleRequestHelper(e,t,o)}catch(p){u=p;try{s?.(u)}catch{}if(p instanceof Tn&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new Ho),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,t,n){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();t.signal&&t.signal.addEventListener("abort",s,{once:!0});let c=Date.now(),l={...this.getHeaders(),...t.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:l,signal:i.signal});if(!u.ok){let m=await y4(u);throw new Tn(u.status,m,`Request to ${t.method} ${e} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else if(t.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&&t.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server");let p=t.responseHeadersObject;return p&&u.headers.forEach((m,g)=>{p[g.toLowerCase()]=m}),d}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",s)}}},qn=class extends Jy{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[uR]:this.mode??""}}};import{createAnthropic as t3}from"@ai-sdk/anthropic";var GL="vercel.ai.error",b4=Symbol.for(GL),pL,gL,lt=class HL extends(gL=Error,pL=b4,gL){constructor({name:e,message:t,cause:n}){super(t),this[pL]=!0,this.name=e,this.cause=n}static isInstance(e){return HL.hasMarker(e,GL)}static hasMarker(e,t){let n=Symbol.for(t);return e!=null&&typeof e=="object"&&n in e&&typeof e[n]=="boolean"&&e[n]===!0}},WL="AI_APICallError",jL=`vercel.ai.error.${WL}`,E4=Symbol.for(jL),hL,fL,sr=class extends(fL=lt,hL=E4,fL){constructor({message:r,url:e,requestBodyValues:t,statusCode:n,responseHeaders:o,responseBody:i,cause:a,isRetryable:s=n!=null&&(n===408||n===409||n===429||n>=500),data:c}){super({name:WL,message:r,cause:a}),this[hL]=!0,this.url=e,this.requestBodyValues=t,this.statusCode=n,this.responseHeaders=o,this.responseBody=i,this.isRetryable=s,this.data=c}static isInstance(r){return lt.hasMarker(r,jL)}},VL="AI_EmptyResponseBodyError",$L=`vercel.ai.error.${VL}`,T4=Symbol.for($L),SL,yL,qL=class extends(yL=lt,SL=T4,yL){constructor({message:r="Empty response body"}={}){super({name:VL,message:r}),this[SL]=!0}static isInstance(r){return lt.hasMarker(r,$L)}};function KL(r){return r==null?"unknown error":typeof r=="string"?r:r instanceof Error?r.message:JSON.stringify(r)}var YL="AI_InvalidArgumentError",XL=`vercel.ai.error.${YL}`,v4=Symbol.for(XL),bL,EL,Pp=class extends(EL=lt,bL=v4,EL){constructor({message:r,cause:e,argument:t}){super({name:YL,message:r,cause:e}),this[bL]=!0,this.argument=t}static isInstance(r){return lt.hasMarker(r,XL)}},JL="AI_InvalidPromptError",ZL=`vercel.ai.error.${JL}`,A4=Symbol.for(ZL),TL,vL,QL=class extends(vL=lt,TL=A4,vL){constructor({prompt:r,message:e,cause:t}){super({name:JL,message:`Invalid prompt: ${e}`,cause:t}),this[TL]=!0,this.prompt=r}static isInstance(r){return lt.hasMarker(r,ZL)}},eN="AI_InvalidResponseDataError",tN=`vercel.ai.error.${eN}`,R4=Symbol.for(tN),AL,RL,Op=class extends(RL=lt,AL=R4,RL){constructor({data:r,message:e=`Invalid response data: ${JSON.stringify(r)}.`}){super({name:eN,message:e}),this[AL]=!0,this.data=r}static isInstance(r){return lt.hasMarker(r,tN)}},rN="AI_JSONParseError",nN=`vercel.ai.error.${rN}`,w4=Symbol.for(nN),wL,CL,hu=class extends(CL=lt,wL=w4,CL){constructor({text:r,cause:e}){super({name:rN,message:`JSON parsing failed: Text: ${r}.
4596
+ `),i=Ks.parse(o),a=uc.extend({steps:qs.record(qs.string(),qs.unknown()).array()}).parse(i),s=li.basename(r,".test.yaml"),c,l;if(e.name&&e.name!==s){let p=`${hn(e.name)}.test.yaml`;if(c=li.join(li.dirname(r),p),l=li.join(t.rootDir,c),cn.existsSync(l))throw new Error(`Test with name '${e.name}' already exists at path '${l}'`)}let u={...a,...e};if(delete u.name,u.fileType!==Xe.MOBILE_TEST)throw new Error(`File at '${n}' is not a mobile test (fileType=${u.fileType}).`);let d=Ks.stringify(u);return cn.writeFileSync(n,d,"utf-8"),l&&l!==n?(cn.renameSync(n,l),$n(l,t.config)):$n(n,t.config),{newRelativeTestPath:c}}import{randomUUID as m4}from"crypto";import ci from"fs";import Ys from"path";var cL=new Set([".DS_Store","__MACOSX"]),uL={status:(r,e)=>{if(r.status===e.status)return r.status;if(r.status==="FAILED"||e.status==="FAILED")return"FAILED";if(r.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(r.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(r.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(r.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${r.status} and ${e.status}`)},startedAt:(r,e)=>r.startedAt<e.startedAt?r.startedAt:e.startedAt,updatedAt:(r,e)=>r.updatedAt>e.updatedAt?r.updatedAt:e.updatedAt,finishedAt:(r,e)=>!r.finishedAt||!e.finishedAt?new Date:r.finishedAt>e.finishedAt?r.finishedAt:e.finishedAt,gitCommitTimestamp:(r,e)=>{if(!(!r&&!e)){if(!r.gitCommitTimestamp||!e.gitCommitTimestamp||r.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${r.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return r.gitCommitTimestamp}},pipelineId:(r,e)=>r.pipelineId===e.pipelineId?r.pipelineId:!r.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&r.pipelineId?r.pipelineId:r.startedAt<e.startedAt?e.pipelineId:r.pipelineId,labels:(r,e)=>{let t=new Set([...r.labels??[],...e.labels??[]]);return Array.from(t)}};function p4(r,e,t){if(uL[t]){let i=uL[t];return i(r,e)}let n=r[t],o=e[t];if(n!==o)throw new Error(`Metadata values for key "${t}" do not match: "${n}" vs "${o}"`);return n}var Yy=class extends Error{constructor(e,t){let n=`${e} contains invalid Momentic results: ${t}. 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 dL(r,e){try{let t=Ys.join(e,"metadata.json");return ds.parse(JSON.parse(ci.readFileSync(t,"utf-8")))}catch{throw new Yy(r,e)}}function mL(r,e,t){let n=m4(),o=r.child({runGroupId:n});ci.rmSync(e,{recursive:!0,force:!0});let i=ci.readdirSync(t).filter(c=>!cL.has(c)).map(c=>Ys.join(t,c));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);ci.mkdirSync(e,{recursive:!0});let a={...dL(t,i[0]),id:n};for(let c of i){let l=Ys.join(c,"runs");if(!ci.existsSync(l))continue;let u=dL(t,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=p4(a,u,m)}let d=ci.readdirSync(l);for(let p of d){if(cL.has(p))continue;let m=Ys.join(l,p),g=Ys.join(e,"runs",p);ci.cpSync(m,g,{recursive:!0})}}let s=Ys.join(e,"metadata.json");ci.writeFileSync(s,JSON.stringify(a,null,2))}import r0 from"adm-zip";import Sb from"fs";import{z as r3}from"zod";var j="v1",Xy="mobile-cli",fa="0.35.4";var g4=9e4,h4=3,f4=1500,S4=15e3,Tn=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function y4(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Jy=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return fa&&(e[xd]=fa),Xy&&(e[dR]=Xy),e}async sendRequest(e,t){let{retries:n=h4,requestTimeoutMs:o=g4,initialRetryDelayMs:i=f4,maxRetryDelayMs:a=S4,onFailedRequest:s}=t,c=n,l=n,u,d={path:e,baseUrl:this.baseUrl,method:t.method};for(;c>0;)try{return c--,await this.sendSingleRequestHelper(e,t,o)}catch(p){u=p;try{s?.(u)}catch{}if(p instanceof Tn&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new Ho),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,t,n){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();t.signal&&t.signal.addEventListener("abort",s,{once:!0});let c=Date.now(),l={...this.getHeaders(),...t.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:l,signal:i.signal});if(!u.ok){let m=await y4(u);throw new Tn(u.status,m,`Request to ${t.method} ${e} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else if(t.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&&t.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server");let p=t.responseHeadersObject;return p&&u.headers.forEach((m,g)=>{p[g.toLowerCase()]=m}),d}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",s)}}},qn=class extends Jy{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[uR]:this.mode??""}}};import{createAnthropic as t3}from"@ai-sdk/anthropic";var GL="vercel.ai.error",b4=Symbol.for(GL),pL,gL,lt=class HL extends(gL=Error,pL=b4,gL){constructor({name:e,message:t,cause:n}){super(t),this[pL]=!0,this.name=e,this.cause=n}static isInstance(e){return HL.hasMarker(e,GL)}static hasMarker(e,t){let n=Symbol.for(t);return e!=null&&typeof e=="object"&&n in e&&typeof e[n]=="boolean"&&e[n]===!0}},WL="AI_APICallError",jL=`vercel.ai.error.${WL}`,E4=Symbol.for(jL),hL,fL,sr=class extends(fL=lt,hL=E4,fL){constructor({message:r,url:e,requestBodyValues:t,statusCode:n,responseHeaders:o,responseBody:i,cause:a,isRetryable:s=n!=null&&(n===408||n===409||n===429||n>=500),data:c}){super({name:WL,message:r,cause:a}),this[hL]=!0,this.url=e,this.requestBodyValues=t,this.statusCode=n,this.responseHeaders=o,this.responseBody=i,this.isRetryable=s,this.data=c}static isInstance(r){return lt.hasMarker(r,jL)}},VL="AI_EmptyResponseBodyError",$L=`vercel.ai.error.${VL}`,T4=Symbol.for($L),SL,yL,qL=class extends(yL=lt,SL=T4,yL){constructor({message:r="Empty response body"}={}){super({name:VL,message:r}),this[SL]=!0}static isInstance(r){return lt.hasMarker(r,$L)}};function KL(r){return r==null?"unknown error":typeof r=="string"?r:r instanceof Error?r.message:JSON.stringify(r)}var YL="AI_InvalidArgumentError",XL=`vercel.ai.error.${YL}`,v4=Symbol.for(XL),bL,EL,Pp=class extends(EL=lt,bL=v4,EL){constructor({message:r,cause:e,argument:t}){super({name:YL,message:r,cause:e}),this[bL]=!0,this.argument=t}static isInstance(r){return lt.hasMarker(r,XL)}},JL="AI_InvalidPromptError",ZL=`vercel.ai.error.${JL}`,A4=Symbol.for(ZL),TL,vL,QL=class extends(vL=lt,TL=A4,vL){constructor({prompt:r,message:e,cause:t}){super({name:JL,message:`Invalid prompt: ${e}`,cause:t}),this[TL]=!0,this.prompt=r}static isInstance(r){return lt.hasMarker(r,ZL)}},eN="AI_InvalidResponseDataError",tN=`vercel.ai.error.${eN}`,R4=Symbol.for(tN),AL,RL,Op=class extends(RL=lt,AL=R4,RL){constructor({data:r,message:e=`Invalid response data: ${JSON.stringify(r)}.`}){super({name:eN,message:e}),this[AL]=!0,this.data=r}static isInstance(r){return lt.hasMarker(r,tN)}},rN="AI_JSONParseError",nN=`vercel.ai.error.${rN}`,w4=Symbol.for(nN),wL,CL,hu=class extends(CL=lt,wL=w4,CL){constructor({text:r,cause:e}){super({name:rN,message:`JSON parsing failed: Text: ${r}.
4597
4597
  Error message: ${KL(e)}`,cause:e}),this[wL]=!0,this.text=r}static isInstance(r){return lt.hasMarker(r,nN)}},oN="AI_LoadAPIKeyError",iN=`vercel.ai.error.${oN}`,C4=Symbol.for(iN),xL,_L,fu=class extends(_L=lt,xL=C4,_L){constructor({message:r}){super({name:oN,message:r}),this[xL]=!0}static isInstance(r){return lt.hasMarker(r,iN)}},aN="AI_LoadSettingError",sN=`vercel.ai.error.${aN}`,x4=Symbol.for(sN),ML,IL,X3e=class extends(IL=lt,ML=x4,IL){constructor({message:r}){super({name:aN,message:r}),this[ML]=!0}static isInstance(r){return lt.hasMarker(r,sN)}},lN="AI_NoContentGeneratedError",cN=`vercel.ai.error.${lN}`,_4=Symbol.for(cN),PL,OL,J3e=class extends(OL=lt,PL=_4,OL){constructor({message:r="No content generated."}={}){super({name:lN,message:r}),this[PL]=!0}static isInstance(r){return lt.hasMarker(r,cN)}},uN="AI_NoSuchModelError",dN=`vercel.ai.error.${uN}`,M4=Symbol.for(dN),LL,NL,Z3e=class extends(NL=lt,LL=M4,NL){constructor({errorName:r=uN,modelId:e,modelType:t,message:n=`No such ${t}: ${e}`}){super({name:r,message:n}),this[LL]=!0,this.modelId=e,this.modelType=t}static isInstance(r){return lt.hasMarker(r,dN)}},mN="AI_TooManyEmbeddingValuesForCallError",pN=`vercel.ai.error.${mN}`,I4=Symbol.for(pN),DL,kL,gN=class extends(kL=lt,DL=I4,kL){constructor(r){super({name:mN,message:`Too many values for a single embedding call. The ${r.provider} model "${r.modelId}" can only embed up to ${r.maxEmbeddingsPerCall} values per call, but ${r.values.length} values were provided.`}),this[DL]=!0,this.provider=r.provider,this.modelId=r.modelId,this.maxEmbeddingsPerCall=r.maxEmbeddingsPerCall,this.values=r.values}static isInstance(r){return lt.hasMarker(r,pN)}},hN="AI_TypeValidationError",fN=`vercel.ai.error.${hN}`,P4=Symbol.for(fN),FL,UL,ui=class Zy extends(UL=lt,FL=P4,UL){constructor({value:e,cause:t}){super({name:hN,message:`Type validation failed: Value: ${JSON.stringify(e)}.
4598
4598
  Error message: ${KL(t)}`,cause:t}),this[FL]=!0,this.value=e}static isInstance(e){return lt.hasMarker(e,fN)}static wrap({value:e,cause:t}){return Zy.isInstance(t)&&t.value===e?t:new Zy({value:e,cause:t})}},SN="AI_UnsupportedFunctionalityError",yN=`vercel.ai.error.${SN}`,O4=Symbol.for(yN),BL,zL,_r=class extends(zL=lt,BL=O4,zL){constructor({functionality:r,message:e=`'${r}' functionality not supported.`}){super({name:SN,message:e}),this[BL]=!0,this.functionality=r}static isInstance(r){return lt.hasMarker(r,yN)}};var Lp=class extends Error{constructor(e,t){super(e),this.name="ParseError",this.type=t.type,this.field=t.field,this.value=t.value,this.line=t.line}};function Qy(r){}function bN(r){if(typeof r=="function")throw new TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:e=Qy,onError:t=Qy,onRetry:n=Qy,onComment:o}=r,i="",a=!0,s,c="",l="";function u(h){let f=a?h.replace(/^\xEF\xBB\xBF/,""):h,[y,E]=L4(`${i}${f}`);for(let b of y)d(b);i=E,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 y=h.slice(0,f),E=h[f+1]===" "?2:1,b=h.slice(f+E);p(y,b,h);return}p(h,"",h)}function p(h,f,y){switch(h){case"event":l=f;break;case"data":c=`${c}${f}
4599
4599
  `;break;case"id":s=f.includes("\0")?void 0:f;break;case"retry":/^\d+$/.test(f)?n(parseInt(f,10)):t(new Lp(`Invalid \`retry\` value: "${f}"`,{type:"invalid-retry",value:f,line:y}));break;default:t(new Lp(`Unknown field "${h.length>20?`${h.slice(0,20)}\u2026`:h}"`,{type:"unknown-field",field:h,value:f,line:y}));break}}function m(){c.length>0&&e({id:s,event:l||void 0,data:c.endsWith(`
@@ -4614,7 +4614,7 @@ ${a}
4614
4614
  `;break}case"tool":throw new _r({functionality:"tool messages"});default:{let a=o;throw new Error(`Unsupported role: ${a}`)}}return n+=`${t}:
4615
4615
  `,{prompt:n,stopSequences:[`
4616
4616
  ${e}:`]}}function BN({id:r,model:e,created:t}){return{id:r??void 0,modelId:e??void 0,timestamp:t!=null?new Date(t*1e3):void 0}}function zN(r){switch(r){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 Z5=ot(()=>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()}))),Q5=ot(()=>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()}),mb]))),GN=ot(()=>me(Yn.object({echo:Yn.boolean().optional(),logitBias:Yn.record(Yn.string(),Yn.number()).optional(),suffix:Yn.string().optional(),user:Yn.string().optional(),logprobs:Yn.union([Yn.boolean(),Yn.number()]).optional()}))),eX=class{constructor(r,e){this.specificationVersion="v2",this.supportedUrls={},this.modelId=r,this.config=e}get providerOptionsName(){return this.config.provider.split(".")[0].trim()}get provider(){return this.config.provider}async getArgs({prompt:r,maxOutputTokens:e,temperature:t,topP:n,topK:o,frequencyPenalty:i,presencePenalty:a,stopSequences:s,responseFormat:c,tools:l,toolChoice:u,seed:d,providerOptions:p}){let m=[],g={...await vr({provider:"openai",providerOptions:p,schema:GN}),...await vr({provider:this.providerOptionsName,providerOptions:p,schema:GN})};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}=J5({prompt:r}),y=[...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:t,top_p:n,frequency_penalty:i,presence_penalty:a,seed:d,prompt:h,stop:y.length>0?y:void 0},warnings:m}}async doGenerate(r){var e,t,n;let{args:o,warnings:i}=await this.getArgs(r),{responseHeaders:a,value:s,rawValue:c}=await Ar({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:er(this.config.headers(),r.headers),body:o,failedResponseHandler:Xn,successfulResponseHandler:dn(Z5),abortSignal:r.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:(t=s.usage)==null?void 0:t.completion_tokens,totalTokens:(n=s.usage)==null?void 0:n.total_tokens},finishReason:zN(l.finish_reason),request:{body:o},response:{...BN(s),headers:a,body:c},providerMetadata:u,warnings:i}}async doStream(r){let{args:e,warnings:t}=await this.getArgs(r),n={...e,stream:!0,stream_options:{include_usage:!0}},{responseHeaders:o,value:i}=await Ar({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:er(this.config.headers(),r.headers),body:n,failedResponseHandler:Xn,successfulResponseHandler:Xs(Q5),abortSignal:r.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:t})},transform(u,d){if(r.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",...BN(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=zN(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}}}},tX=ot(()=>me(cb.object({dimensions:cb.number().optional(),user:cb.string().optional()}))),rX=ot(()=>me(Sa.object({data:Sa.array(Sa.object({embedding:Sa.array(Sa.number())})),usage:Sa.object({prompt_tokens:Sa.number()}).nullish()}))),nX=class{constructor(r,e){this.specificationVersion="v2",this.maxEmbeddingsPerCall=2048,this.supportsParallelCalls=!0,this.modelId=r,this.config=e}get provider(){return this.config.provider}async doEmbed({values:r,headers:e,abortSignal:t,providerOptions:n}){var o;if(r.length>this.maxEmbeddingsPerCall)throw new gN({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:r});let i=(o=await vr({provider:"openai",providerOptions:n,schema:tX}))!=null?o:{},{responseHeaders:a,value:s,rawValue:c}=await Ar({url:this.config.url({path:"/embeddings",modelId:this.modelId}),headers:er(this.config.headers(),e),body:{model:this.modelId,input:r,encoding_format:"float",dimensions:i.dimensions,user:i.user},failedResponseHandler:Xn,successfulResponseHandler:dn(rX),abortSignal:t,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}}}},oX=ot(()=>me(tr.object({created:tr.number().nullish(),data:tr.array(tr.object({b64_json:tr.string(),revised_prompt:tr.string().nullish()})),background:tr.string().nullish(),output_format:tr.string().nullish(),size:tr.string().nullish(),quality:tr.string().nullish(),usage:tr.object({input_tokens:tr.number().nullish(),output_tokens:tr.number().nullish(),total_tokens:tr.number().nullish(),input_tokens_details:tr.object({image_tokens:tr.number().nullish(),text_tokens:tr.number().nullish()}).nullish()}).nullish()}))),iX={"dall-e-3":1,"dall-e-2":10,"gpt-image-1":10,"gpt-image-1-mini":10,"gpt-image-1.5":10},aX=new Set(["gpt-image-1","gpt-image-1-mini","gpt-image-1.5"]),sX=class{constructor(r,e){this.modelId=r,this.config=e,this.specificationVersion="v2"}get maxImagesPerCall(){var r;return(r=iX[this.modelId])!=null?r:1}get provider(){return this.config.provider}async doGenerate({prompt:r,n:e,size:t,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 Ar({url:this.config.url({path:"/images/generations",modelId:this.modelId}),headers:er(this.config.headers(),a),body:{model:this.modelId,prompt:r,n:e,size:t,...(d=i.openai)!=null?d:{},...aX.has(this.modelId)?{}:{response_format:"b64_json"}},failedResponseHandler:Xn,successfulResponseHandler:dn(oX),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}:{}}))}}}}},lX=wt(()=>me(Kt.object({code:Kt.string().nullish(),containerId:Kt.string()}))),cX=wt(()=>me(Kt.object({outputs:Kt.array(Kt.discriminatedUnion("type",[Kt.object({type:Kt.literal("logs"),logs:Kt.string()}),Kt.object({type:Kt.literal("image"),url:Kt.string()})])).nullish()}))),uX=wt(()=>me(Kt.object({container:Kt.union([Kt.string(),Kt.object({fileIds:Kt.array(Kt.string()).optional()})]).optional()}))),dX=un({id:"openai.code_interpreter",name:"code_interpreter",inputSchema:lX,outputSchema:cX}),mX=(r={})=>dX(r),KN=ze.object({key:ze.string(),type:ze.enum(["eq","ne","gt","gte","lt","lte","in","nin"]),value:ze.union([ze.string(),ze.number(),ze.boolean(),ze.array(ze.string())])}),YN=ze.object({type:ze.enum(["and","or"]),filters:ze.array(ze.union([KN,ze.lazy(()=>YN)]))}),pX=wt(()=>me(ze.object({vectorStoreIds:ze.array(ze.string()),maxNumResults:ze.number().optional(),ranking:ze.object({ranker:ze.string().optional(),scoreThreshold:ze.number().optional()}).optional(),filters:ze.union([KN,YN]).optional()}))),gX=wt(()=>me(ze.object({queries:ze.array(ze.string()),results:ze.array(ze.object({attributes:ze.record(ze.string(),ze.unknown()),fileId:ze.string(),filename:ze.string(),score:ze.number(),text:ze.string()})).nullable()}))),hX=un({id:"openai.file_search",name:"file_search",inputSchema:ze.object({}),outputSchema:gX}),fX=wt(()=>me(lr.object({background:lr.enum(["auto","opaque","transparent"]).optional(),inputFidelity:lr.enum(["low","high"]).optional(),inputImageMask:lr.object({fileId:lr.string().optional(),imageUrl:lr.string().optional()}).optional(),model:lr.string().optional(),moderation:lr.enum(["auto"]).optional(),outputCompression:lr.number().int().min(0).max(100).optional(),outputFormat:lr.enum(["png","jpeg","webp"]).optional(),partialImages:lr.number().int().min(0).max(3).optional(),quality:lr.enum(["auto","low","medium","high"]).optional(),size:lr.enum(["1024x1024","1024x1536","1536x1024","auto"]).optional()}).strict())),SX=wt(()=>me(lr.object({}))),yX=wt(()=>me(lr.object({result:lr.string()}))),bX=un({id:"openai.image_generation",name:"image_generation",inputSchema:SX,outputSchema:yX}),EX=(r={})=>bX(r),XN=wt(()=>me(Ur.object({action:Ur.object({type:Ur.literal("exec"),command:Ur.array(Ur.string()),timeoutMs:Ur.number().optional(),user:Ur.string().optional(),workingDirectory:Ur.string().optional(),env:Ur.record(Ur.string(),Ur.string()).optional()})}))),JN=wt(()=>me(Ur.object({output:Ur.string()}))),TX=un({id:"openai.local_shell",name:"local_shell",inputSchema:XN,outputSchema:JN}),vX=wt(()=>me(Ve.object({externalWebAccess:Ve.boolean().optional(),filters:Ve.object({allowedDomains:Ve.array(Ve.string()).optional()}).optional(),searchContextSize:Ve.enum(["low","medium","high"]).optional(),userLocation:Ve.object({type:Ve.literal("approximate"),country:Ve.string().optional(),city:Ve.string().optional(),region:Ve.string().optional(),timezone:Ve.string().optional()}).optional()}))),AX=wt(()=>me(Ve.object({}))),RX=wt(()=>me(Ve.object({action:Ve.discriminatedUnion("type",[Ve.object({type:Ve.literal("search"),query:Ve.string().optional()}),Ve.object({type:Ve.literal("openPage"),url:Ve.string().nullish()}),Ve.object({type:Ve.literal("findInPage"),url:Ve.string().nullish(),pattern:Ve.string().nullish()})]),sources:Ve.array(Ve.discriminatedUnion("type",[Ve.object({type:Ve.literal("url"),url:Ve.string()}),Ve.object({type:Ve.literal("api"),name:Ve.string()})])).optional()}))),wX=un({id:"openai.web_search",name:"web_search",inputSchema:AX,outputSchema:RX}),CX=(r={})=>wX(r),xX=wt(()=>me(Lt.object({searchContextSize:Lt.enum(["low","medium","high"]).optional(),userLocation:Lt.object({type:Lt.literal("approximate"),country:Lt.string().optional(),city:Lt.string().optional(),region:Lt.string().optional(),timezone:Lt.string().optional()}).optional()}))),_X=wt(()=>me(Lt.object({}))),MX=wt(()=>me(Lt.object({action:Lt.discriminatedUnion("type",[Lt.object({type:Lt.literal("search"),query:Lt.string().optional()}),Lt.object({type:Lt.literal("openPage"),url:Lt.string().nullish()}),Lt.object({type:Lt.literal("findInPage"),url:Lt.string().nullish(),pattern:Lt.string().nullish()})])}))),IX=un({id:"openai.web_search_preview",name:"web_search_preview",inputSchema:_X,outputSchema:MX}),PX={codeInterpreter:mX,fileSearch:hX,imageGeneration:EX,localShell:TX,webSearchPreview:IX,webSearch:CX};function HN(r,e){return e?e.some(t=>r.startsWith(t)):!1}async function OX({prompt:r,systemMessageMode:e,fileIdPrefixes:t,store:n,hasLocalShellTool:o=!1}){var i,a,s,c;let l=[],u=[];for(let{role:d,content:p}of r)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,y;switch(m.type){case"text":return{type:"input_text",text:m.text};case"file":if(m.mediaType.startsWith("image/")){let E=m.mediaType==="image/*"?"image/jpeg":m.mediaType;return{type:"input_image",...m.data instanceof URL?{image_url:m.data.toString()}:typeof m.data=="string"&&HN(m.data,t)?{file_id:m.data}:{image_url:`data:${E};base64,${di(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"&&HN(m.data,t)?{file_id:m.data}:{filename:(y=m.filename)!=null?y:`part-${g}.pdf`,file_data:`data:application/pdf;base64,${di(m.data)}`}};throw new _r({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 y=await Kn({value:h.input,schema:XN});l.push({type:"local_shell_call",call_id:h.toolCallId,id:f,action:{type:"exec",command:y.action.command,timeout_ms:y.action.timeoutMs,user:y.action.user,working_directory:y.action.workingDirectory,env:y.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 vr({provider:"openai",providerOptions:h.providerOptions,schema:LX}),y=f?.itemId;if(y!=null){let E=m[y];if(n)E===void 0&&(l.push({type:"item_reference",id:y}),m[y]={type:"reasoning",id:y,summary:[]});else{let b=[];h.text.length>0?b.push({type:"summary_text",text:h.text}):E!==void 0&&u.push({type:"other",message:`Cannot append empty reasoning part to existing reasoning sequence. Skipping reasoning part: ${JSON.stringify(h)}.`}),E===void 0?(m[y]={type:"reasoning",id:y,encrypted_content:f?.reasoningEncryptedContent,summary:b},l.push(m[y])):(E.summary.push(...b),f?.reasoningEncryptedContent!=null&&(E.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 Kn({value:g.value,schema:JN});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 LX=ub.object({itemId:ub.string().nullish(),reasoningEncryptedContent:ub.string().nullish()});function WN({finishReason:r,hasFunctionCall:e}){switch(r){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 NX=ot(()=>me(S.union([S.object({type:S.literal("response.output_text.delta"),item_id:S.string(),delta:S.string(),logprobs:S.array(S.object({token:S.string(),logprob:S.number(),top_logprobs:S.array(S.object({token:S.string(),logprob:S.number()}))})).nullish()}),S.object({type:S.enum(["response.completed","response.incomplete"]),response:S.object({incomplete_details:S.object({reason:S.string()}).nullish(),usage:S.object({input_tokens:S.number(),input_tokens_details:S.object({cached_tokens:S.number().nullish()}).nullish(),output_tokens:S.number(),output_tokens_details:S.object({reasoning_tokens:S.number().nullish()}).nullish()}),service_tier:S.string().nullish()})}),S.object({type:S.literal("response.created"),response:S.object({id:S.string(),created_at:S.number(),model:S.string(),service_tier:S.string().nullish()})}),S.object({type:S.literal("response.output_item.added"),output_index:S.number(),item:S.discriminatedUnion("type",[S.object({type:S.literal("message"),id:S.string()}),S.object({type:S.literal("reasoning"),id:S.string(),encrypted_content:S.string().nullish()}),S.object({type:S.literal("function_call"),id:S.string(),call_id:S.string(),name:S.string(),arguments:S.string()}),S.object({type:S.literal("web_search_call"),id:S.string(),status:S.string()}),S.object({type:S.literal("computer_call"),id:S.string(),status:S.string()}),S.object({type:S.literal("file_search_call"),id:S.string()}),S.object({type:S.literal("image_generation_call"),id:S.string()}),S.object({type:S.literal("code_interpreter_call"),id:S.string(),container_id:S.string(),code:S.string().nullable(),outputs:S.array(S.discriminatedUnion("type",[S.object({type:S.literal("logs"),logs:S.string()}),S.object({type:S.literal("image"),url:S.string()})])).nullable(),status:S.string()})])}),S.object({type:S.literal("response.output_item.done"),output_index:S.number(),item:S.discriminatedUnion("type",[S.object({type:S.literal("message"),id:S.string()}),S.object({type:S.literal("reasoning"),id:S.string(),encrypted_content:S.string().nullish()}),S.object({type:S.literal("function_call"),id:S.string(),call_id:S.string(),name:S.string(),arguments:S.string(),status:S.literal("completed")}),S.object({type:S.literal("code_interpreter_call"),id:S.string(),code:S.string().nullable(),container_id:S.string(),outputs:S.array(S.discriminatedUnion("type",[S.object({type:S.literal("logs"),logs:S.string()}),S.object({type:S.literal("image"),url:S.string()})])).nullable()}),S.object({type:S.literal("image_generation_call"),id:S.string(),result:S.string()}),S.object({type:S.literal("web_search_call"),id:S.string(),status:S.string(),action:S.discriminatedUnion("type",[S.object({type:S.literal("search"),query:S.string().nullish(),sources:S.array(S.discriminatedUnion("type",[S.object({type:S.literal("url"),url:S.string()}),S.object({type:S.literal("api"),name:S.string()})])).nullish()}),S.object({type:S.literal("open_page"),url:S.string().nullish()}),S.object({type:S.literal("find_in_page"),url:S.string().nullish(),pattern:S.string().nullish()})])}),S.object({type:S.literal("file_search_call"),id:S.string(),queries:S.array(S.string()),results:S.array(S.object({attributes:S.record(S.string(),S.unknown()),file_id:S.string(),filename:S.string(),score:S.number(),text:S.string()})).nullish()}),S.object({type:S.literal("local_shell_call"),id:S.string(),call_id:S.string(),action:S.object({type:S.literal("exec"),command:S.array(S.string()),timeout_ms:S.number().optional(),user:S.string().optional(),working_directory:S.string().optional(),env:S.record(S.string(),S.string()).optional()})}),S.object({type:S.literal("computer_call"),id:S.string(),status:S.literal("completed")})])}),S.object({type:S.literal("response.function_call_arguments.delta"),item_id:S.string(),output_index:S.number(),delta:S.string()}),S.object({type:S.literal("response.image_generation_call.partial_image"),item_id:S.string(),output_index:S.number(),partial_image_b64:S.string()}),S.object({type:S.literal("response.code_interpreter_call_code.delta"),item_id:S.string(),output_index:S.number(),delta:S.string()}),S.object({type:S.literal("response.code_interpreter_call_code.done"),item_id:S.string(),output_index:S.number(),code:S.string()}),S.object({type:S.literal("response.output_text.annotation.added"),annotation:S.discriminatedUnion("type",[S.object({type:S.literal("url_citation"),start_index:S.number(),end_index:S.number(),url:S.string(),title:S.string()}),S.object({type:S.literal("file_citation"),file_id:S.string(),filename:S.string().nullish(),index:S.number().nullish(),start_index:S.number().nullish(),end_index:S.number().nullish(),quote:S.string().nullish()})])}),S.object({type:S.literal("response.reasoning_summary_part.added"),item_id:S.string(),summary_index:S.number()}),S.object({type:S.literal("response.reasoning_summary_text.delta"),item_id:S.string(),summary_index:S.number(),delta:S.string()}),S.object({type:S.literal("response.reasoning_summary_part.done"),item_id:S.string(),summary_index:S.number()}),S.object({type:S.literal("error"),sequence_number:S.number(),error:S.object({type:S.string(),code:S.string(),message:S.string(),param:S.string().nullish()})}),S.object({type:S.string()}).loose().transform(r=>({type:"unknown_chunk",message:r.type}))]))),DX=ot(()=>me(S.object({id:S.string().optional(),created_at:S.number().optional(),error:S.object({message:S.string(),type:S.string(),param:S.string().nullish(),code:S.string()}).nullish(),model:S.string().optional(),output:S.array(S.discriminatedUnion("type",[S.object({type:S.literal("message"),role:S.literal("assistant"),id:S.string(),content:S.array(S.object({type:S.literal("output_text"),text:S.string(),logprobs:S.array(S.object({token:S.string(),logprob:S.number(),top_logprobs:S.array(S.object({token:S.string(),logprob:S.number()}))})).nullish(),annotations:S.array(S.discriminatedUnion("type",[S.object({type:S.literal("url_citation"),start_index:S.number(),end_index:S.number(),url:S.string(),title:S.string()}),S.object({type:S.literal("file_citation"),file_id:S.string(),filename:S.string().nullish(),index:S.number().nullish(),start_index:S.number().nullish(),end_index:S.number().nullish(),quote:S.string().nullish()}),S.object({type:S.literal("container_file_citation"),container_id:S.string(),file_id:S.string(),filename:S.string().nullish(),start_index:S.number().nullish(),end_index:S.number().nullish(),index:S.number().nullish()}),S.object({type:S.literal("file_path"),file_id:S.string(),index:S.number().nullish()})]))}))}),S.object({type:S.literal("web_search_call"),id:S.string(),status:S.string(),action:S.discriminatedUnion("type",[S.object({type:S.literal("search"),query:S.string().nullish(),sources:S.array(S.discriminatedUnion("type",[S.object({type:S.literal("url"),url:S.string()}),S.object({type:S.literal("api"),name:S.string()})])).nullish()}),S.object({type:S.literal("open_page"),url:S.string().nullish()}),S.object({type:S.literal("find_in_page"),url:S.string().nullish(),pattern:S.string().nullish()})])}),S.object({type:S.literal("file_search_call"),id:S.string(),queries:S.array(S.string()),results:S.array(S.object({attributes:S.record(S.string(),S.union([S.string(),S.number(),S.boolean()])),file_id:S.string(),filename:S.string(),score:S.number(),text:S.string()})).nullish()}),S.object({type:S.literal("code_interpreter_call"),id:S.string(),code:S.string().nullable(),container_id:S.string(),outputs:S.array(S.discriminatedUnion("type",[S.object({type:S.literal("logs"),logs:S.string()}),S.object({type:S.literal("image"),url:S.string()})])).nullable()}),S.object({type:S.literal("image_generation_call"),id:S.string(),result:S.string()}),S.object({type:S.literal("local_shell_call"),id:S.string(),call_id:S.string(),action:S.object({type:S.literal("exec"),command:S.array(S.string()),timeout_ms:S.number().optional(),user:S.string().optional(),working_directory:S.string().optional(),env:S.record(S.string(),S.string()).optional()})}),S.object({type:S.literal("function_call"),call_id:S.string(),name:S.string(),arguments:S.string(),id:S.string()}),S.object({type:S.literal("computer_call"),id:S.string(),status:S.string().optional()}),S.object({type:S.literal("reasoning"),id:S.string(),encrypted_content:S.string().nullish(),summary:S.array(S.object({type:S.literal("summary_text"),text:S.string()}))})])).optional(),service_tier:S.string().nullish(),incomplete_details:S.object({reason:S.string()}).nullish(),usage:S.object({input_tokens:S.number(),input_tokens_details:S.object({cached_tokens:S.number().nullish()}).nullish(),output_tokens:S.number(),output_tokens_details:S.object({reasoning_tokens:S.number().nullish()}).nullish()}).optional()}))),ZN=20,kX=["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"],R6e=["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",...kX],FX=ot(()=>me(Tt.object({conversation:Tt.string().nullish(),include:Tt.array(Tt.enum(["reasoning.encrypted_content","file_search_call.results","message.output_text.logprobs"])).nullish(),instructions:Tt.string().nullish(),logprobs:Tt.union([Tt.boolean(),Tt.number().min(1).max(ZN)]).optional(),maxToolCalls:Tt.number().nullish(),metadata:Tt.any().nullish(),parallelToolCalls:Tt.boolean().nullish(),previousResponseId:Tt.string().nullish(),promptCacheKey:Tt.string().nullish(),promptCacheRetention:Tt.enum(["in_memory","24h"]).nullish(),reasoningEffort:Tt.string().nullish(),reasoningSummary:Tt.string().nullish(),safetyIdentifier:Tt.string().nullish(),serviceTier:Tt.enum(["auto","flex","priority","default"]).nullish(),store:Tt.boolean().nullish(),strictJsonSchema:Tt.boolean().nullish(),textVerbosity:Tt.enum(["low","medium","high"]).nullish(),truncation:Tt.enum(["auto","disabled"]).nullish(),user:Tt.string().nullish()})));async function UX({tools:r,toolChoice:e,strictJsonSchema:t}){r=r?.length?r:void 0;let n=[];if(r==null)return{tools:void 0,toolChoice:void 0,toolWarnings:n};let o=[];for(let a of r)switch(a.type){case"function":o.push({type:"function",name:a.name,description:a.description,parameters:a.inputSchema,strict:t});break;case"provider-defined":{switch(a.id){case"openai.file_search":{let s=await Kn({value:a.args,schema:pX});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 Kn({value:a.args,schema:xX});o.push({type:"web_search_preview",search_context_size:s.searchContextSize,user_location:s.userLocation});break}case"openai.web_search":{let s=await Kn({value:a.args,schema:vX});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 Kn({value:a.args,schema:uX});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 Kn({value:a.args,schema:fX});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 _r({functionality:`tool choice type: ${a}`})}}}var BX=class{constructor(r,e){this.specificationVersion="v2",this.supportedUrls={"image/*":[/^https?:\/\/.*$/],"application/pdf":[/^https?:\/\/.*$/]},this.modelId=r,this.config=e}get provider(){return this.config.provider}async getArgs({maxOutputTokens:r,temperature:e,stopSequences:t,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 y=[],E=qN(this.modelId);o!=null&&y.push({type:"unsupported-setting",setting:"topK"}),s!=null&&y.push({type:"unsupported-setting",setting:"seed"}),i!=null&&y.push({type:"unsupported-setting",setting:"presencePenalty"}),a!=null&&y.push({type:"unsupported-setting",setting:"frequencyPenalty"}),t!=null&&y.push({type:"unsupported-setting",setting:"stopSequences"});let b=await vr({provider:"openai",providerOptions:l,schema:FX});b?.conversation&&b?.previousResponseId&&y.push({type:"unsupported-setting",setting:"conversation",details:"conversation and previousResponseId cannot be used together"});let{input:_,warnings:M}=await OX({prompt:c,systemMessageMode:E.systemMessageMode,fileIdPrefixes:this.config.fileIdPrefixes,store:(m=b?.store)!=null?m:!0,hasLocalShellTool:F("openai.local_shell")});y.push(...M);let O=(g=b?.strictJsonSchema)!=null?g:!1,v=b?.include;function C(W){v==null?v=[W]:v.includes(W)||(v=[...v,W])}function F(W){return u?.find(ue=>ue.type==="provider-defined"&&ue.id===W)!=null}let P=typeof b?.logprobs=="number"?b?.logprobs:b?.logprobs===!0?ZN:void 0;P&&C("message.output_text.logprobs");let B=(h=u?.find(W=>W.type==="provider-defined"&&(W.id==="openai.web_search"||W.id==="openai.web_search_preview")))==null?void 0:h.name;B&&C("web_search_call.action.sources"),F("openai.code_interpreter")&&C("code_interpreter_call.outputs");let D=b?.store;D===!1&&E.isReasoningModel&&C("reasoning.encrypted_content");let ee={model:this.modelId,input:_,temperature:e,top_p:n,max_output_tokens:r,...(p?.type==="json"||b?.textVerbosity)&&{text:{...p?.type==="json"&&{format:p.schema!=null?{type:"json_schema",strict:O,name:(f=p.name)!=null?f:"response",description:p.description,schema:p.schema}:{type:"json_object"}},...b?.textVerbosity&&{verbosity:b.textVerbosity}}},conversation:b?.conversation,max_tool_calls:b?.maxToolCalls,metadata:b?.metadata,parallel_tool_calls:b?.parallelToolCalls,previous_response_id:b?.previousResponseId,store:D,user:b?.user,instructions:b?.instructions,service_tier:b?.serviceTier,include:v,prompt_cache_key:b?.promptCacheKey,prompt_cache_retention:b?.promptCacheRetention,safety_identifier:b?.safetyIdentifier,top_logprobs:P,truncation:b?.truncation,...E.isReasoningModel&&(b?.reasoningEffort!=null||b?.reasoningSummary!=null)&&{reasoning:{...b?.reasoningEffort!=null&&{effort:b.reasoningEffort},...b?.reasoningSummary!=null&&{summary:b.reasoningSummary}}}};E.isReasoningModel?b?.reasoningEffort==="none"&&E.supportsNonReasoningParameters||(ee.temperature!=null&&(ee.temperature=void 0,y.push({type:"unsupported-setting",setting:"temperature",details:"temperature is not supported for reasoning models"})),ee.top_p!=null&&(ee.top_p=void 0,y.push({type:"unsupported-setting",setting:"topP",details:"topP is not supported for reasoning models"}))):(b?.reasoningEffort!=null&&y.push({type:"unsupported-setting",setting:"reasoningEffort",details:"reasoningEffort is not supported for non-reasoning models"}),b?.reasoningSummary!=null&&y.push({type:"unsupported-setting",setting:"reasoningSummary",details:"reasoningSummary is not supported for non-reasoning models"})),b?.serviceTier==="flex"&&!E.supportsFlexProcessing&&(y.push({type:"unsupported-setting",setting:"serviceTier",details:"flex processing is only available for o3, o4-mini, and gpt-5 models"}),delete ee.service_tier),b?.serviceTier==="priority"&&!E.supportsPriorityProcessing&&(y.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 ee.service_tier);let{tools:K,toolChoice:ge,toolWarnings:U}=await UX({tools:u,toolChoice:d,strictJsonSchema:O});return{webSearchToolName:B,args:{...ee,tools:K,tool_choice:ge},warnings:[...y,...U],store:D}}async doGenerate(r){var e,t,n,o,i,a,s,c,l,u,d,p,m,g,h,f,y,E,b,_,M,O,v,C,F,P,B,D;let{args:ee,warnings:K,webSearchToolName:ge}=await this.getArgs(r),U=this.config.url({path:"/responses",modelId:this.modelId}),W=this.config.provider.replace(".responses",""),{responseHeaders:ue,value:le,rawValue:Ge}=await Ar({url:U,headers:er(this.config.headers(),r.headers),body:ee,failedResponseHandler:Xn,successfulResponseHandler:dn(DX),abortSignal:r.abortSignal,fetch:this.config.fetch});if(le.error)throw new sr({message:le.error.message,url:U,requestBodyValues:ee,statusCode:400,responseHeaders:ue,responseBody:Ge,isRetryable:!1});let ve=[],q=[],fe=!1;for(let x of le.output)switch(x.type){case"reasoning":{x.summary.length===0&&x.summary.push({type:"summary_text",text:""});for(let ne of x.summary)ve.push({type:"reasoning",text:ne.text,providerMetadata:{[W]:{itemId:x.id,reasoningEncryptedContent:(e=x.encrypted_content)!=null?e:null}}});break}case"image_generation_call":{ve.push({type:"tool-call",toolCallId:x.id,toolName:"image_generation",input:"{}",providerExecuted:!0}),ve.push({type:"tool-result",toolCallId:x.id,toolName:"image_generation",result:{result:x.result},providerExecuted:!0});break}case"local_shell_call":{ve.push({type:"tool-call",toolCallId:x.call_id,toolName:"local_shell",input:JSON.stringify({action:x.action}),providerMetadata:{[W]:{itemId:x.id}}});break}case"message":{for(let ne of x.content){(n=(t=r.providerOptions)==null?void 0:t.openai)!=null&&n.logprobs&&ne.logprobs&&q.push(ne.logprobs),ve.push({type:"text",text:ne.text,providerMetadata:{[W]:{itemId:x.id}}});for(let pe of ne.annotations)pe.type==="url_citation"?ve.push({type:"source",sourceType:"url",id:(a=(i=(o=this.config).generateId)==null?void 0:i.call(o))!=null?a:Fr(),url:pe.url,title:pe.title}):pe.type==="file_citation"?ve.push({type:"source",sourceType:"document",id:(l=(c=(s=this.config).generateId)==null?void 0:c.call(s))!=null?l:Fr(),mediaType:"text/plain",title:(d=(u=pe.quote)!=null?u:pe.filename)!=null?d:"Document",filename:(p=pe.filename)!=null?p:pe.file_id,...pe.file_id?{providerMetadata:{[W]:{fileId:pe.file_id}}}:{}}):pe.type==="container_file_citation"?ve.push({type:"source",sourceType:"document",id:(h=(g=(m=this.config).generateId)==null?void 0:g.call(m))!=null?h:Fr(),mediaType:"text/plain",title:(y=(f=pe.filename)!=null?f:pe.file_id)!=null?y:"Document",filename:(E=pe.filename)!=null?E:pe.file_id,providerMetadata:{[W]:{fileId:pe.file_id,containerId:pe.container_id,...pe.index!=null?{index:pe.index}:{}}}}):pe.type==="file_path"&&ve.push({type:"source",sourceType:"document",id:(M=(_=(b=this.config).generateId)==null?void 0:_.call(b))!=null?M:Fr(),mediaType:"application/octet-stream",title:pe.file_id,filename:pe.file_id,providerMetadata:{[W]:{fileId:pe.file_id,...pe.index!=null?{index:pe.index}:{}}}})}break}case"function_call":{fe=!0,ve.push({type:"tool-call",toolCallId:x.call_id,toolName:x.name,input:x.arguments,providerMetadata:{[W]:{itemId:x.id}}});break}case"web_search_call":{ve.push({type:"tool-call",toolCallId:x.id,toolName:ge??"web_search",input:JSON.stringify({}),providerExecuted:!0}),ve.push({type:"tool-result",toolCallId:x.id,toolName:ge??"web_search",result:VN(x.action),providerExecuted:!0});break}case"computer_call":{ve.push({type:"tool-call",toolCallId:x.id,toolName:"computer_use",input:"",providerExecuted:!0}),ve.push({type:"tool-result",toolCallId:x.id,toolName:"computer_use",result:{type:"computer_use_tool_result",status:x.status||"completed"},providerExecuted:!0});break}case"file_search_call":{ve.push({type:"tool-call",toolCallId:x.id,toolName:"file_search",input:"{}",providerExecuted:!0}),ve.push({type:"tool-result",toolCallId:x.id,toolName:"file_search",result:{queries:x.queries,results:(v=(O=x.results)==null?void 0:O.map(ne=>({attributes:ne.attributes,fileId:ne.file_id,filename:ne.filename,score:ne.score,text:ne.text})))!=null?v:null},providerExecuted:!0});break}case"code_interpreter_call":{ve.push({type:"tool-call",toolCallId:x.id,toolName:"code_interpreter",input:JSON.stringify({code:x.code,containerId:x.container_id}),providerExecuted:!0}),ve.push({type:"tool-result",toolCallId:x.id,toolName:"code_interpreter",result:{outputs:x.outputs},providerExecuted:!0});break}}let it={[W]:{...le.id!=null?{responseId:le.id}:{}}};q.length>0&&(it[W].logprobs=q),typeof le.service_tier=="string"&&(it[W].serviceTier=le.service_tier);let Ae=le.usage;return{content:ve,finishReason:WN({finishReason:(C=le.incomplete_details)==null?void 0:C.reason,hasFunctionCall:fe}),usage:{inputTokens:Ae.input_tokens,outputTokens:Ae.output_tokens,totalTokens:Ae.input_tokens+Ae.output_tokens,reasoningTokens:(P=(F=Ae.output_tokens_details)==null?void 0:F.reasoning_tokens)!=null?P:void 0,cachedInputTokens:(D=(B=Ae.input_tokens_details)==null?void 0:B.cached_tokens)!=null?D:void 0},request:{body:ee},response:{id:le.id,timestamp:new Date(le.created_at*1e3),modelId:le.model,headers:ue,body:Ge},providerMetadata:it,warnings:K}}async doStream(r){let{args:e,warnings:t,webSearchToolName:n,store:o}=await this.getArgs(r),{responseHeaders:i,value:a}=await Ar({url:this.config.url({path:"/responses",modelId:this.modelId}),headers:er(this.config.headers(),r.headers),body:{...e,stream:!0},failedResponseHandler:Xn,successfulResponseHandler:Xs(NX),abortSignal:r.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={},y;return{stream:a.pipeThrough(new TransformStream({start(E){E.enqueue({type:"stream-start",warnings:t})},transform(E,b){var _,M,O,v,C,F,P,B,D,ee,K,ge,U,W,ue,le,Ge,ve,q,fe,it,Ae;if(r.includeRawChunks&&b.enqueue({type:"raw",rawValue:E.rawValue}),!E.success){l="error",b.enqueue({type:"error",error:E.error});return}let x=E.value;if(jN(x))x.item.type==="function_call"?(m[x.output_index]={toolName:x.item.name,toolCallId:x.item.call_id},b.enqueue({type:"tool-input-start",id:x.item.call_id,toolName:x.item.name})):x.item.type==="web_search_call"?(m[x.output_index]={toolName:n??"web_search",toolCallId:x.item.id},b.enqueue({type:"tool-input-start",id:x.item.id,toolName:n??"web_search",providerExecuted:!0}),b.enqueue({type:"tool-input-end",id:x.item.id}),b.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:n??"web_search",input:JSON.stringify({}),providerExecuted:!0})):x.item.type==="computer_call"?(m[x.output_index]={toolName:"computer_use",toolCallId:x.item.id},b.enqueue({type:"tool-input-start",id:x.item.id,toolName:"computer_use",providerExecuted:!0})):x.item.type==="code_interpreter_call"?(m[x.output_index]={toolName:"code_interpreter",toolCallId:x.item.id,codeInterpreter:{containerId:x.item.container_id}},b.enqueue({type:"tool-input-start",id:x.item.id,toolName:"code_interpreter",providerExecuted:!0}),b.enqueue({type:"tool-input-delta",id:x.item.id,delta:`{"containerId":"${x.item.container_id}","code":"`})):x.item.type==="file_search_call"?b.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:"file_search",input:"{}",providerExecuted:!0}):x.item.type==="image_generation_call"?b.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:"image_generation",input:"{}",providerExecuted:!0}):x.item.type==="message"?(g.splice(0,g.length),b.enqueue({type:"text-start",id:x.item.id,providerMetadata:{[c]:{itemId:x.item.id}}})):jN(x)&&x.item.type==="reasoning"&&(f[x.item.id]={encryptedContent:x.item.encrypted_content,summaryParts:{0:"active"}},b.enqueue({type:"reasoning-start",id:`${x.item.id}:0`,providerMetadata:{[c]:{itemId:x.item.id,reasoningEncryptedContent:(_=x.item.encrypted_content)!=null?_:null}}}));else if(GX(x)){if(x.item.type==="message")b.enqueue({type:"text-end",id:x.item.id,providerMetadata:{[c]:{itemId:x.item.id,...g.length>0&&{annotations:g}}}});else if(x.item.type==="function_call")m[x.output_index]=void 0,h=!0,b.enqueue({type:"tool-input-end",id:x.item.call_id}),b.enqueue({type:"tool-call",toolCallId:x.item.call_id,toolName:x.item.name,input:x.item.arguments,providerMetadata:{[c]:{itemId:x.item.id}}});else if(x.item.type==="web_search_call")m[x.output_index]=void 0,b.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:n??"web_search",result:VN(x.item.action),providerExecuted:!0});else if(x.item.type==="computer_call")m[x.output_index]=void 0,b.enqueue({type:"tool-input-end",id:x.item.id}),b.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:"computer_use",input:"",providerExecuted:!0}),b.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"computer_use",result:{type:"computer_use_tool_result",status:x.item.status||"completed"},providerExecuted:!0});else if(x.item.type==="file_search_call")m[x.output_index]=void 0,b.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"file_search",result:{queries:x.item.queries,results:(O=(M=x.item.results)==null?void 0:M.map(ne=>({attributes:ne.attributes,fileId:ne.file_id,filename:ne.filename,score:ne.score,text:ne.text})))!=null?O:null},providerExecuted:!0});else if(x.item.type==="code_interpreter_call")m[x.output_index]=void 0,b.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"code_interpreter",result:{outputs:x.item.outputs},providerExecuted:!0});else if(x.item.type==="image_generation_call")b.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"image_generation",result:{result:x.item.result},providerExecuted:!0});else if(x.item.type==="local_shell_call")m[x.output_index]=void 0,b.enqueue({type:"tool-call",toolCallId:x.item.call_id,toolName:"local_shell",input:JSON.stringify({action:{type:"exec",command:x.item.action.command,timeoutMs:x.item.action.timeout_ms,user:x.item.action.user,workingDirectory:x.item.action.working_directory,env:x.item.action.env}}),providerMetadata:{[c]:{itemId:x.item.id}}});else if(x.item.type==="reasoning"){let ne=f[x.item.id],pe=Object.entries(ne.summaryParts).filter(([Br,fi])=>fi==="active"||fi==="can-conclude").map(([Br])=>Br);for(let Br of pe)b.enqueue({type:"reasoning-end",id:`${x.item.id}:${Br}`,providerMetadata:{[c]:{itemId:x.item.id,reasoningEncryptedContent:(v=x.item.encrypted_content)!=null?v:null}}});delete f[x.item.id]}}else if(jX(x)){let ne=m[x.output_index];ne!=null&&b.enqueue({type:"tool-input-delta",id:ne.toolCallId,delta:x.delta})}else if(VX(x)){let ne=m[x.output_index];ne!=null&&b.enqueue({type:"tool-input-delta",id:ne.toolCallId,delta:JSON.stringify(x.delta).slice(1,-1)})}else if($X(x)){let ne=m[x.output_index];ne!=null&&(b.enqueue({type:"tool-input-delta",id:ne.toolCallId,delta:'"}'}),b.enqueue({type:"tool-input-end",id:ne.toolCallId}),b.enqueue({type:"tool-call",toolCallId:ne.toolCallId,toolName:"code_interpreter",input:JSON.stringify({code:x.code,containerId:ne.codeInterpreter.containerId}),providerExecuted:!0}))}else if(WX(x))p=x.response.id,b.enqueue({type:"response-metadata",id:x.response.id,timestamp:new Date(x.response.created_at*1e3),modelId:x.response.model});else if(zX(x))b.enqueue({type:"text-delta",id:x.item_id,delta:x.delta}),(F=(C=r.providerOptions)==null?void 0:C.openai)!=null&&F.logprobs&&x.logprobs&&d.push(x.logprobs);else if(x.type==="response.reasoning_summary_part.added"){if(x.summary_index>0){let ne=f[x.item_id];ne.summaryParts[x.summary_index]="active";for(let pe of Object.keys(ne.summaryParts))ne.summaryParts[pe]==="can-conclude"&&(b.enqueue({type:"reasoning-end",id:`${x.item_id}:${pe}`,providerMetadata:{[c]:{itemId:x.item_id}}}),ne.summaryParts[pe]="concluded");b.enqueue({type:"reasoning-start",id:`${x.item_id}:${x.summary_index}`,providerMetadata:{[c]:{itemId:x.item_id,reasoningEncryptedContent:(B=(P=f[x.item_id])==null?void 0:P.encryptedContent)!=null?B:null}}})}}else x.type==="response.reasoning_summary_text.delta"?b.enqueue({type:"reasoning-delta",id:`${x.item_id}:${x.summary_index}`,delta:x.delta,providerMetadata:{[c]:{itemId:x.item_id}}}):x.type==="response.reasoning_summary_part.done"?o?(b.enqueue({type:"reasoning-end",id:`${x.item_id}:${x.summary_index}`,providerMetadata:{[c]:{itemId:x.item_id}}}),f[x.item_id].summaryParts[x.summary_index]="concluded"):f[x.item_id].summaryParts[x.summary_index]="can-conclude":HX(x)?(l=WN({finishReason:(D=x.response.incomplete_details)==null?void 0:D.reason,hasFunctionCall:h}),u.inputTokens=x.response.usage.input_tokens,u.outputTokens=x.response.usage.output_tokens,u.totalTokens=x.response.usage.input_tokens+x.response.usage.output_tokens,u.reasoningTokens=(K=(ee=x.response.usage.output_tokens_details)==null?void 0:ee.reasoning_tokens)!=null?K:void 0,u.cachedInputTokens=(U=(ge=x.response.usage.input_tokens_details)==null?void 0:ge.cached_tokens)!=null?U:void 0,typeof x.response.service_tier=="string"&&(y=x.response.service_tier)):qX(x)?(g.push(x.annotation),x.annotation.type==="url_citation"?b.enqueue({type:"source",sourceType:"url",id:(le=(ue=(W=s.config).generateId)==null?void 0:ue.call(W))!=null?le:Fr(),url:x.annotation.url,title:x.annotation.title}):x.annotation.type==="file_citation"&&b.enqueue({type:"source",sourceType:"document",id:(q=(ve=(Ge=s.config).generateId)==null?void 0:ve.call(Ge))!=null?q:Fr(),mediaType:"text/plain",title:(it=(fe=x.annotation.quote)!=null?fe:x.annotation.filename)!=null?it:"Document",filename:(Ae=x.annotation.filename)!=null?Ae:x.annotation.file_id,...x.annotation.file_id?{providerMetadata:{[c]:{fileId:x.annotation.file_id}}}:{}})):KX(x)&&b.enqueue({type:"error",error:x})},flush(E){let b={[c]:{responseId:p}};d.length>0&&(b[c].logprobs=d),y!==void 0&&(b[c].serviceTier=y),E.enqueue({type:"finish",finishReason:l,usage:u,providerMetadata:b})}})),request:{body:e},response:{headers:i}}}};function zX(r){return r.type==="response.output_text.delta"}function GX(r){return r.type==="response.output_item.done"}function HX(r){return r.type==="response.completed"||r.type==="response.incomplete"}function WX(r){return r.type==="response.created"}function jX(r){return r.type==="response.function_call_arguments.delta"}function VX(r){return r.type==="response.code_interpreter_call_code.delta"}function $X(r){return r.type==="response.code_interpreter_call_code.done"}function jN(r){return r.type==="response.output_item.added"}function qX(r){return r.type==="response.output_text.annotation.added"}function KX(r){return r.type==="error"}function VN(r){var e;switch(r.type){case"search":return{action:{type:"search",query:(e=r.query)!=null?e:void 0},...r.sources!=null&&{sources:r.sources}};case"open_page":return{action:{type:"openPage",url:r.url}};case"find_in_page":return{action:{type:"findInPage",url:r.url,pattern:r.pattern}}}}var YX=ot(()=>me(db.object({instructions:db.string().nullish(),speed:db.number().min(.25).max(4).default(1).nullish()}))),XX=class{constructor(r,e){this.modelId=r,this.config=e,this.specificationVersion="v2"}get provider(){return this.config.provider}async getArgs({text:r,voice:e="alloy",outputFormat:t="mp3",speed:n,instructions:o,language:i,providerOptions:a}){let s=[],c=await vr({provider:"openai",providerOptions:a,schema:YX}),l={model:this.modelId,input:r,voice:e,response_format:"mp3",speed:n,instructions:o};if(t&&(["mp3","opus","aac","flac","wav","pcm"].includes(t)?l.response_format=t:s.push({type:"unsupported-setting",setting:"outputFormat",details:`Unsupported output format: ${t}. 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(r){var e,t,n;let o=(n=(t=(e=this.config._internal)==null?void 0:e.currentDate)==null?void 0:t.call(e))!=null?n:new Date,{requestBody:i,warnings:a}=await this.getArgs(r),{value:s,responseHeaders:c,rawValue:l}=await Ar({url:this.config.url({path:"/audio/speech",modelId:this.modelId}),headers:er(this.config.headers(),r.headers),body:i,failedResponseHandler:Xn,successfulResponseHandler:IN(),abortSignal:r.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}}}},JX=ot(()=>me(Ct.object({text:Ct.string(),language:Ct.string().nullish(),duration:Ct.number().nullish(),words:Ct.array(Ct.object({word:Ct.string(),start:Ct.number(),end:Ct.number()})).nullish(),segments:Ct.array(Ct.object({id:Ct.number(),seek:Ct.number(),start:Ct.number(),end:Ct.number(),text:Ct.string(),tokens:Ct.array(Ct.number()),temperature:Ct.number(),avg_logprob:Ct.number(),compression_ratio:Ct.number(),no_speech_prob:Ct.number()})).nullish()}))),ZX=ot(()=>me(pi.object({include:pi.array(pi.string()).optional(),language:pi.string().optional(),prompt:pi.string().optional(),temperature:pi.number().min(0).max(1).default(0).optional(),timestampGranularities:pi.array(pi.enum(["word","segment"])).default(["segment"]).optional()}))),$N={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"},QX=class{constructor(r,e){this.modelId=r,this.config=e,this.specificationVersion="v2"}get provider(){return this.config.provider}async getArgs({audio:r,mediaType:e,providerOptions:t}){let n=[],o=await vr({provider:"openai",providerOptions:t,schema:ZX}),i=new FormData,a=r instanceof Uint8Array?new Blob([r]):new Blob([kN(r)]);i.append("model",this.modelId);let s=wN(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(r){var e,t,n,o,i,a,s,c;let l=(n=(t=(e=this.config._internal)==null?void 0:e.currentDate)==null?void 0:t.call(e))!=null?n:new Date,{formData:u,warnings:d}=await this.getArgs(r),{value:p,responseHeaders:m,rawValue:g}=await xN({url:this.config.url({path:"/audio/transcriptions",modelId:this.modelId}),headers:er(this.config.headers(),r.headers),formData:u,failedResponseHandler:Xn,successfulResponseHandler:dn(JX),abortSignal:r.abortSignal,fetch:this.config.fetch}),h=p.language!=null&&p.language in $N?$N[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}}}},e3="2.0.89";function pb(r={}){var e,t;let n=(e=FN(RN({settingValue:r.baseURL,environmentVariableName:"OPENAI_BASE_URL"})))!=null?e:"https://api.openai.com/v1",o=(t=r.name)!=null?t:"openai",i=()=>ob({Authorization:`Bearer ${AN({apiKey:r.apiKey,environmentVariableName:"OPENAI_API_KEY",description:"OpenAI"})}`,"OpenAI-Organization":r.organization,"OpenAI-Project":r.project,...r.headers},`ai-sdk/openai/${e3}`),a=h=>new X5(h,{provider:`${o}.chat`,url:({path:f})=>`${n}${f}`,headers:i,fetch:r.fetch}),s=h=>new eX(h,{provider:`${o}.completion`,url:({path:f})=>`${n}${f}`,headers:i,fetch:r.fetch}),c=h=>new nX(h,{provider:`${o}.embedding`,url:({path:f})=>`${n}${f}`,headers:i,fetch:r.fetch}),l=h=>new sX(h,{provider:`${o}.image`,url:({path:f})=>`${n}${f}`,headers:i,fetch:r.fetch}),u=h=>new QX(h,{provider:`${o}.transcription`,url:({path:f})=>`${n}${f}`,headers:i,fetch:r.fetch}),d=h=>new XX(h,{provider:`${o}.speech`,url:({path:f})=>`${n}${f}`,headers:i,fetch:r.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 BX(h,{provider:`${o}.responses`,url:({path:f})=>`${n}${f}`,headers:i,fetch:r.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=PX,g}var D6e=pb();function QN(r){let{apiKey:e,sessionId:t,extraHeaders:n,loggerTags:o}=r,i={Authorization:`Bearer ${e}`,[xd]:fa??"",...t&&{[pR]:t},...n||{}};return o&&(i[mR]=JSON.stringify(o)),i}var Bp=r=>e=>{let t=QN(r);return t3({baseURL:`${r.baseUrl}/v1/llm/anthropic/${e}`,headers:t,apiKey:r.apiKey})(e)},e0=r=>e=>{let t=QN(r);return pb({baseURL:`${r.baseUrl}/v1/llm/openai/${e}`,headers:t,apiKey:r.apiKey})(e)};var ya=class extends qn{agentConfig;constructor(e,t){let n={...Gv,...e};super(t),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,t){let n={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:t.abortSignal});return Cv.parse(o)}async rankChunksWithRag(e,t){let n=await this.sendRequest(`/${j}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:fa,...e},signal:t.abortSignal});return wv.parse(n)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${j}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return r3.string().parse(t)}async getElementLocation(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.[Vt.LOCATOR]},o=await this.sendRequest(`/${j}/web-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return bR.parse(o)}async getAssertionResult(e,t){let n={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.[Vt.ASSERTION]},o=await this.sendRequest(`/${j}/web-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return nf.parse(o)}async getLintStepResult(e,t){let n={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/lint/step`,{method:"POST",body:n,signal:t.abortSignal});return yR.parse(o)}async getLintMcpCopilotMessageResult(e,t){let n={message:e.message,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:t.abortSignal});return hR.parse(o)}async getMcpCopilotConversationEvaluation(e,t){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/mcp-copilot-conversation-evaluator`,{method:"POST",body:n,signal:t.abortSignal});return fR.parse(o)}async getMcpCopilotChatSummary(e,t){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/mcp-copilot-chat-summary`,{method:"POST",body:n,signal:t.abortSignal});return SR.parse(o)}async getVisualAssertionResult(e,t){let n={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.[Vt.VISUAL_ASSERTION]},o=await this.sendRequest(`/${j}/web-agent/visual-assertion`,{method:"POST",body:n,signal:t.abortSignal});return nf.parse(o)}async getAiActionCommand(e,t){let n=await this.sendRequest(`/${j}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return gR.parse(n)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${j}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal})}async getMultiturnAiActionEvaluation(e,t){let n=await this.sendRequest(`/${j}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return jg.parse(n)}async getReverseMappedDescription(e,t){let n=await this.sendRequest(`/${j}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return ER.parse(n)}async getTextExtraction(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.[Vt.TEXT_EXTRACTION]},o=await this.sendRequest(`/${j}/web-agent/text-extraction`,{method:"POST",body:n,signal:t.abortSignal});return Wg.parse(o)}async getPageSummary(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/page-summary`,{method:"POST",body:n,signal:t.abortSignal});return ov.parse(o)}async getSmartWaitingDecision(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/smart-waiting`,{method:"POST",body:n,signal:t.abortSignal});return iv.parse(o)}async getTestResultClassification(e,t){let n=await this.sendRequest(`/${j}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Og.parse(n)}async getExtractedKeywords(e,t){let n=await this.sendRequest(`/${j}/web-agent/extract-keywords`,{method:"POST",body:e,signal:t.abortSignal});return zv.parse(n)}async getAutohealingProposal(e,t){let n=await this.sendRequest(`/${j}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return QT.parse(n)}async getFailureRecoveryProposal(e,t){let n=await this.sendRequest(`/${j}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return rv.parse(n)}async getFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${j}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return tv.parse(n)}async getIframeRegex(e,t){let n=await this.sendRequest(`/${j}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return dE.parse(n)}getAnthropicModelFactory(e){let{sessionId:t,logger:n,streamType:o}=e;return Bp({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...ye(n),promptType:o},sessionId:t})}getOpenAIModelFactory(e){let{sessionId:t,logger:n,streamType:o}=e;return e0({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...ye(n),promptType:o},sessionId:t})}};import{z as gb}from"zod";var Mr=class extends qn{constructor(e){super({...e,mode:void 0})}getAppUrl(){return yc(this.baseUrl)}async getAuthInfo(){let e=await this.sendRequest(`/${j}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:t=>{I.warn(`API key check failed: ${t.message}`)}});return LR.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${j}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return MR.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${j}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return vR.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${j}/cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,t){let n=await this.sendRequest(`/${j}/cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return RR.parse(n)}async getWebStepCacheMemoryTraces(e){let t=await this.sendRequest(`/${j}/cache/traces`,{method:"POST",body:e,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return of.parse(t)}async getMobileStepCacheMemoryTraces(e){let t=await this.sendRequest(`/${j}/mobile-cache/traces`,{method:"POST",body:e,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return of.parse(t)}async updateMobileStepCaches(e,t){await this.sendRequest(`/${j}/mobile-cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest(e,t){let n=await this.sendRequest(`/${j}/mobile-cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return wR.parse(n)}async queueTests(e){let t=await this.sendRequest(`/${j}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return TR.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${j}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return OR.parse(t)}async uploadOnDemandScreenshot(e){return await this.sendRequest(`/${j}/on-demand-screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3}),{apiServerUrl:`${this.baseUrl}/${j}/on-demand-screenshots/${e.id}`}}async fetchOnDemandScreenshot(e){let t={};return{data:await this.sendRequest(`/${j}/on-demand-screenshots/${encodeURIComponent(e)}`,{method:"GET",retries:3,requestTimeoutMs:5e3,responseType:"buffer",responseHeadersObject:t}),contentType:t["content-type"]??"image/jpeg"}}async getAllEnvironments(){let e=await this.sendRequest(`/${j}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return NR.parse(e)}async acquireCacheLock(e,t){let n=await this.sendRequest(`/${j}/result-cache/lock`,{method:"POST",body:e,signal:t,retries:3,requestTimeoutMs:3e4});return ZR.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${j}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${j}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${j}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${j}/result-cache/entry`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(t){if(t instanceof Error&&t.message.includes("404"))return null;throw t}}async queueSuiteRuns(e){let t=await this.sendRequest(`/${j}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return DR.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},n=await this.sendRequest(`/${j}/run-groups/status`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3});return Tv.array().parse(n)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${j}/test-fragments/`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4})}catch(n){t.error({err:n},"Failed to upload proposed steps")}}async reportBillableEvents(e,t){try{await this.sendRequest(`/${j}/billing/events`,{method:"POST",body:t,retries:10,requestTimeoutMs:1e4})}catch(n){e.error({err:n},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${j}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return kR.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${j}/test-fragments/${e}`,{method:"PATCH",body:t,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,t){let n=await this.sendRequest(`/${j}/results/tests/${e}`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return FR.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${j}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return UR.parse(e)}async startProcessingResultsUpload(e,t){let n=await this.sendRequest(`/${j}/results/uploads/${e}/process`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return BR.parse(n)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${j}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return tw.parse(t)}catch(t){return e.error({err:t},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${j}/knowledge-base/icons`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(n){t.error({err:n},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,t,n,o){let i=new URLSearchParams;i.set("base",n),i.set("head",o);let a=await this.sendRequest(`/${j}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Sc.parse(a)}async getCommitFromGithub(e,t,n){let o=await this.sendRequest(`/${j}/git/github/${e}/${t}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Sc.parse(o)}async getMergedBranchFromGithub(e,t,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${j}/git/github/${e}/${t}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return lf.parse(a)}async getMergeBaseCommitFromGitlab(e,t,n){let o=new URLSearchParams;o.set("base",t),o.set("head",n);let i=encodeURIComponent(e),a=await this.sendRequest(`/${j}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Sc.parse(a)}async getCommitFromGitlab(e,t){let n=encodeURIComponent(e),o=await this.sendRequest(`/${j}/git/gitlab/${n}/commits/${t}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Sc.parse(o)}async getMergedBranchFromGitlab(e,t,n){let o=encodeURIComponent(t),i=encodeURIComponent(e),a=await this.sendRequest(`/${j}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return lf.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${j}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return gb.record(gb.string(),gb.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${j}/quarantine`,{method:"GET"});return zR.parse(e)}async quarantineTest(e,t,n){await this.sendRequest(`/${j}/quarantine`,{method:"POST",body:{testId:e.id,testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async unquarantineTest(e,t,n){await this.sendRequest(`/${j}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async createAndroidEmulator(e){let t=await this.sendRequest(`/${j}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return GR.parse(t)}async extendAndroidEmulatorTtl(e){try{await this.sendRequest(`/${j}/limbar/android/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async generateAndroidAssetUrls({channel:e,tag:t,md5:n}){let o={channel:e,tag:t,md5:n},i=await this.sendRequest(`/${j}/limbar/android/upload-url`,{method:"POST",retries:3,body:o,requestTimeoutMs:15e3,logResponse:!0});return WR.parse(i)}async deleteAndroidEmulator(e){await this.sendRequest(`/${j}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getAndroidAssets(){let e=await this.sendRequest(`/${j}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return jR.parse(e)}async getLimbarAssetDownloadUrl(e,t){let n=await this.sendRequest(`/${j}/limbar/assets/${e}/${t}/download-url`,{method:"GET",retries:2,requestTimeoutMs:3e4});return VR.parse(n)}async deleteAndroidAsset(e,t){await this.sendRequest(`/${j}/limbar/assets/${e}/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}async createIosEmulator(e){let t=await this.sendRequest(`/${j}/limbar/ios`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return HR.parse(t)}async extendIosEmulatorTtl(e){try{await this.sendRequest(`/${j}/limbar/ios/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async deleteIosEmulator(e){await this.sendRequest(`/${j}/limbar/ios/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async generateMobileLogcatUploadUrl(e){let t=await this.sendRequest(`/${j}/logcat/mobile/upload`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return NA.parse(t)}};async function hb(r){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(I.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),I.debug(`Identified node version ${e}`);let n=await r.client.getAuthInfo();return I.debug("Got auth info from API"),n}var zp=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,t){await this.apiClient.reportBillableEvents(e,t)}};var Js=class extends qn{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let n=await this.sendRequest(`/${j}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return mE.parse(n)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var Zs=class{constructor(e,t){this.client=e;this.orgId=t}getApiServerUrl(){return this.client.baseUrl}getAppServerUrl(){let e=this.getApiServerUrl();return yc(e)}async acquireCacheLock(e,t){return this.client.acquireCacheLock(e,t)}async createOnDemandScreenshot(e,t,n){let{apiServerUrl:o}=await this.client.uploadOnDemandScreenshot({id:e,screenshot:t.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,t){return this.client.saveNewIcons(e,t)}};import{Faker as n3,en as o3}from"@faker-js/faker";var Qs="v1",el=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 n3({locale:o3}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${Qs}/tools/ai/generate`,{method:"POST",body:t}).catch(n=>{throw n instanceof Tn?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${Qs}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Tn?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${Qs}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Tn?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${Qs}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Tn?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${Qs}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof Tn?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${Qs}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Tn?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};function t0(r,e,t){return fetch(r,{method:"PUT",body:t,headers:{"Content-Type":e}})}var Gp=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await t0(n,"application/zip",t);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}};var tl=class extends qn{constructor(e){super(e)}async getAndroidElementLocation(e,t){let n={...e,disableCache:t.disableCache,useMemory:t.useMemory,agentConfigVersion:t.agentConfigVersion,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/mobile-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return Nh.parse(o)}async evaluateAndroidAssertion(e,t){let n={...e,disableCache:t.disableCache,useMemory:t.useMemory,agentConfigVersion:t.agentConfigVersion,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/mobile-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return Dh.parse(o)}async getAndroidFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${j}/mobile-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return kh.parse(n)}async getIosElementLocation(e,t){let n={...e,disableCache:t.disableCache,useMemory:t.useMemory,agentConfigVersion:t.agentConfigVersion,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/ios-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return Nh.parse(o)}async evaluateIosAssertion(e,t){let n={...e,disableCache:t.disableCache,useMemory:t.useMemory,agentConfigVersion:t.agentConfigVersion,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/ios-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return Dh.parse(o)}async getIosFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${j}/ios-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return kh.parse(n)}getAnthropicModelFactory(e){let{logger:t,sessionId:n,streamType:o}=e;return Bp({baseUrl:this.baseUrl,apiKey:this.apiKey,sessionId:n,loggerTags:{...ye(t),promptType:o}})}};function gi({logger:r,orgId:e,client:t,gitMetadata:n,regenerateCache:o,alwaysSaveCache:i,noCache:a}){return a?new Id:new fb(r,e,t,n,{alwaysSaveCache:i,regenerateCache:o})}var fb=class{constructor(e,t,n,o,i){this.orgId=t;this.client=n;let{regenerateCache:a,alwaysSaveCache:s}=i,{gitBranchName:c,gitProtectedBranches:l}=o;this.cacheHeaders=fc(o),this.readCaches=!a,e.info({options:i,gitBranchName:c,gitProtectedBranches:l},"Cache storage initialization options");let u=c&&l.includes(c);s||!u?this.writeCaches=!0:this.writeCaches=!1}cacheHeaders;readCaches;writeCaches;async saveEntries({entries:e,testId:t,logger:n}){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateMobileStepCaches({entries:e,testId:t},this.cacheHeaders)}catch(o){n.warn({err:o},"Failed to save mobile step cache entries, continuing...")}}async resolveEntries(e){if(!this.readCaches){e.logger.debug("Skipping cache resolution because of regenerate flag");return}let t=await this.client.getMobileStepCacheForTest({testId:e.testId},this.cacheHeaders),{steps:n}=e.stepLists;n&&NS({steps:n,stepCacheEntries:t,logger:e.logger})}async populateCacheForRun(e){if(!this.readCaches){e.logger.debug("Skipping cache resolution because of regenerate flag");return}let{steps:t}=e.stepLists;if(e.skipFetchingCacheFromStorage||await this.resolveEntries(e),!this.writeCaches){e.logger.info("Skipping mobile cache last used at update because branch is protected");return}let{cachesToSave:n}=await Gn({platform:e.platform,steps:t,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});try{await this.client.updateMobileStepCaches({entries:n,testId:e.testId},this.cacheHeaders)}catch(o){e.logger.warn({err:o},"Failed to update mobile step cache entries, continuing...")}}async getCacheKeyForStep(e){let t=await this.client.getMobileStepCacheForTest({testId:e.testId},this.cacheHeaders);return DS({step:e.step,stepCacheEntries:t,parentStepIdChain:e.parentStepIdChain,logger:e.logger,options:{ignoreCacheValueOnStep:!0}})}};import Hp from"path";function i3(r){let e=new r0,t=Hp.join(r,"metadata.json"),n=ds.parse(JSON.parse(Sb.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Sb.readdirSync(Hp.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new r0(Hp.join(r,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(Hp.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function Wp(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!Sb.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new Gp(e);try{let{runGroupId:i,buffer:a}=i3(n),s=await o.uploadResultsArchive(i,a),c=`${e.getAppUrl()}/run-groups/${s}`;t.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",t.error(`Failed to upload test results: ${a}.`);return}}import a3 from"adm-zip";import cr from"fs";import mn from"path";var yu=class r{constructor(e){this.filePath=e;cr.rmSync(this.filePath,{recursive:!0,force:!0}),cr.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 t=new r(mn.join(this.filePath,e));return this.children.push(t),t}cwd(){return this.filePath}mkdir(e){cr.mkdirSync(mn.join(this.filePath,e),{recursive:!0})}readFile(e){let t=mn.join(this.filePath,e);if(cr.existsSync(t))return cr.readFileSync(t)}storeFile(e){let{name:t,contents:n}=e,o=mn.join(this.filePath,t);try{cr.writeFileSync(o,n)}catch{}}createFileStream(e){let t=mn.join(this.filePath,e),n=cr.createWriteStream(t);return this.streams.push(n),n}createRunArchive(e){let t=new yb(mn.join(this.filePath,"runs"),e);return this.children.push(t),t}},yb=class{children=[];tempPath;finalPath;constructor(e,t){this.tempPath=mn.join(e,`temp-storage-${t}`),this.finalPath=mn.join(e,`${t}.zip`),cr.rmSync(this.tempPath,{recursive:!0,force:!0}),cr.rmSync(this.finalPath,{recursive:!0,force:!0}),cr.mkdirSync(this.tempPath,{recursive:!0})}readFile(e){let t=mn.join(this.tempPath,e);if(cr.existsSync(t))return cr.readFileSync(t)}mkdir(e){cr.mkdirSync(mn.join(this.tempPath,e),{recursive:!0})}cd(e){let t=new yu(mn.join(this.tempPath,e));return this.children.push(t),t}cwd(){return this.tempPath}storeFile(e){let{name:t,contents:n}=e,o=mn.join(this.tempPath,t);cr.writeFileSync(o,n)}close(){for(let n of this.children)n.close();let e=new a3;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();cr.writeFileSync(this.finalPath,t),cr.rmSync(this.tempPath,{recursive:!0,force:!0})}};import s3 from"adm-zip";import{randomUUID as l3}from"crypto";import Ht from"fs";import rr from"path";function a0(r){try{return Ht.existsSync(r)?JSON.parse(Ht.readFileSync(r,"utf-8")):void 0}catch{return}}function n0(r){return Ht.existsSync(r)?Ht.readFileSync(r,"utf-8").split(`
4617
- `).map(t=>t.trim()).filter(t=>t.length>0):[]}function c3(r,e){let t=r.attemptIdToAttemptNumber.get(e);if(t)return rr.join(r.inflatedPath,"attempts",t);let n=rr.join(r.inflatedPath,"attempts");if(!Ht.existsSync(n))return;let o=Ht.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=rr.join(n,i,"metadata.json"),s=a0(a);if(typeof s!="object"||s===null)continue;let c=s.id;if(typeof c=="string"&&c===e)return r.attemptIdToAttemptNumber.set(e,i),rr.join(n,i)}}function o0(r,e,t){let n=rr.join(r,"attempts");if(!Ht.existsSync(n))return;let o=Ht.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=rr.join(n,i,"assets",`${e}.${t}`);if(Ht.existsSync(a))return a}}var jp=class{constructor(e,t,n){this.outputDir=e;this.runId=t;this.runAttemptId=n;this.runsDir=rr.join(e,"runs"),this.zipPath=rr.join(this.runsDir,`${t}.zip`)}inflatedByRunId=new Map;zipPath;runsDir;ensureInflatedRun(e){let t=this.inflatedByRunId.get(e);if(t)return t;if(e!==this.runId||!Ht.existsSync(this.zipPath))return;let n=rr.join(this.runsDir,`temp-unzipped-${e}-${l3()}`);Ht.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())Ht.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return c3(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let t=rr.join(e,"assets");return Ht.existsSync(t)?Ht.readdirSync(t,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>rr.join(t,o.name)).filter(o=>{let i=rr.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,t){let n=this.getAttemptDir();if(!n)return;let o=rr.join(n,"assets",`${e}.${t}`);if(Ht.existsSync(o))try{return Ht.readFileSync(o,"utf-8")}catch{return}}async getConsoleLogsForRunAttempt(e,t,n){if(t!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=a0(rr.join(o,"console.json")),a=Jh.safeParse(i);return a.success?a.data:void 0}async getNetworkLogsForRunAttempt(e,t,n){if(t!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=rr.join(o,"assets","har-pages.log"),a=rr.join(o,"assets","har-entries.log"),s={};for(let u of n0(i)){let d=dc.safeParse(i0(u));d.success&&(s[d.data.id]=d.data)}let c={},l=n0(a);for(let u=0;u<l.length;u++){let d=l[u],p=mc.safeParse(i0(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;c[m]=p.data}if(Object.keys(c).length!==0)return Qh(s,c)}async getHtmlSnapshot(e,t){let n=this.readAttemptAssetText(t,"html");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=o0(o.inflatedPath,t,"html");if(i)try{return Ht.readFileSync(i,"utf-8")}catch{return}}async getA11yTreeSnapshot(e,t){let n=this.readAttemptAssetText(t,"xml");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=o0(o.inflatedPath,t,"xml");if(i)try{return Ht.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,t){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),i=o?rr.join(o,"assets",`${t}.jpeg`):void 0;if(i)try{return Ht.readFileSync(i)}catch{return}}};function i0(r){try{return JSON.parse(r)}catch{return}}import va from"fs";import $p from"fs";import y3 from"open";import Eb from"path";import S3 from"express";import u3 from"adm-zip";import{Router as d3}from"express";import rl from"fs";import bu from"path";function s0(r){let e=d3(),t=bu.join(r,"runs");return e.get("/",async(n,o)=>{try{let i=m3(r);if(!i){o.status(404).json({error:"No run group found"});return}if(!rl.existsSync(t)){o.status(404).json({error:"No runs found for run group"});return}let a=p3(t,i),s={...i,id:i.id??"local-run-group",createdAt:i.startedAt,runs:a};o.status(200).json(s)}catch(i){o.status(500).json({error:`Error loading run group: ${i.message}`})}}),e}function m3(r){let e=bu.join(r,"metadata.json");if(!rl.existsSync(e))return I.error("Run group metadata file not found"),null;try{let t=rl.readFileSync(e,"utf-8");return ds.parse(JSON.parse(t))}catch(t){return I.error({err:t},"Error reading run group metadata"),null}}function p3(r,e){let t=rl.readdirSync(r).filter(o=>o.endsWith(".zip")).sort((o,i)=>{let a=rl.statSync(bu.join(r,o));return rl.statSync(bu.join(r,i)).mtime.getTime()-a.mtime.getTime()}),n=[];for(let o of t){let i=bu.join(r,o),a=o.replace(/\.zip$/i,"");n.push(g3(i,a,e))}return n}function g3(r,e,t){let o=new u3(r).getEntry("metadata.json");if(!o)throw new Error(`No entry found for file ${r}/metadata.json`);try{let i=o.getData().toString("utf-8"),a=JSON.parse(i),s=pw.parse(a);return gI(s,e,{runGroupMetadata:t,runAttempts:[],organizationId:"local"})}catch(i){throw I.error({err:i,zipPath:r},"Error parsing metadata.json for run"),new Error(`Error parsing metadata.json for run ${r}`)}}import{Router as h3}from"express";import l0 from"fs";import Vp from"path";function c0(r){let e=h3(),t=Vp.join(r,"runs");return e.get("/:filename",(n,o)=>{let i=n.params.filename;if(!i||!i.endsWith(".zip")){o.status(404).send("Not found");return}let a=Vp.join(t,i),s=Vp.resolve(a),c=Vp.resolve(t);if(!s.startsWith(c)){o.status(403).send("Forbidden");return}if(!l0.existsSync(a)){o.status(404).send("File not found");return}try{o.setHeader("Content-Type","application/zip"),o.setHeader("Content-Disposition",`attachment; filename="${i}"`);let l=l0.readFileSync(a);o.send(l)}catch(l){o.status(500).send(`Error reading file: ${l.message}`)}}),e}import{Router as f3}from"express";import bb from"fs";import nl from"path";function u0(r){let e=f3();return e.get("*",(t,n)=>{let o=t.path==="/"?nl.join(r,"index.html"):nl.join(r,t.path),i=nl.resolve(o),a=nl.resolve(r);if(!i.startsWith(a)){n.status(403).send("Forbidden");return}if(!bb.existsSync(o)&&(o=nl.join(r,"index.html"),!bb.existsSync(o))){n.status(404).send("File not found");return}try{let s=nl.extname(o).toLowerCase(),c=pc[s]||"application/octet-stream";n.setHeader("Content-Type",c);let l=bb.readFileSync(o);n.send(l)}catch(s){n.status(500).send(`Error reading file: ${s.message}`)}}),e}async function d0(r,e,t){let n=e??await Xo(vd,"local-run-viewer-server"),o=S3();return o.use((i,a,s)=>{a.setHeader("Access-Control-Allow-Origin","*"),a.setHeader("Cache-Control","no-cache"),s()}),o.use("/api/runs",c0(r)),o.use("/api/run-group",s0(r)),t&&o.use("/",u0(t)),new Promise((i,a)=>{let s=o.listen(n,()=>{let c=`http://localhost:${n}`;i({port:n,url:c,stop:()=>{s.close()}})});s.on("error",c=>{a(c)})})}async function Tb(r){let{staticDir:e,resultsPath:t,runId:n,port:o}=r,i=Eb.resolve(t),a=Eb.join(i,"runs"),s;if(n){s=`${n.replace(/\.zip$/i,"")}.zip`;let l=Eb.join(a,s);if(!$p.existsSync(l)){let u=[];if($p.existsSync(a))for(let d of $p.readdirSync(a))d.endsWith(".zip")&&u.push(d.replace(/\.zip$/i,""));I.error(`Run not found: ${s} in ${a}`),u.length>0&&I.error(`Available runs: ${u.join(", ")}`),process.exit(1)}}$p.existsSync(e)||(I.error(`Static frontend files not found at ${e}. Please ensure the CLI is properly built.`),process.exit(1));try{let l=(await d0(i,o,e)).url;I.info(`Run viewer running at ${l}`);let u=new URL(l);s&&u.searchParams.set("zipUrl",`${l}/api/runs/${s}`),await y3(u.toString())}catch(c){I.error(`Failed to start run viewer: ${c.message}`),process.exit(1)}}import iD from"body-parser";import PJ from"cors";import OJ from"dedent";import{Router as R3}from"express";import qp from"fs";import b3 from"path";var E3=new Mm(30,60*1e3),wb="https://api.momentic.ai",Ab,p0,g0=r=>{wb=r},Cb=()=>wb;var h0=r=>{p0=r},f0=()=>p0,Ir=()=>Ab;var ol,Rb,m0,S0=async r=>{if(Ab&&ol&&m0)return ol;let e=new Mr({baseUrl:wb,apiKey:r,logger:I});Ab=e;try{let t=await e.getAuthInfo();return ol=t.orgId,Rb=t.userId,m0=r,ol}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},Jn=()=>{if(!ol)throw new Error("Your organization ID is invalid.");return ol},Kp=()=>{if(!Rb)throw new Error("Your user ID is invalid.");return Rb};var xb,vb,y0=(r,e)=>{xb=r,vb?.abort(),vb=new AbortController;let t=vb.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=b3.resolve(r.rootDir,o.envFile);try{if(qp.lstatSync(i).isSymbolicLink())return;qp.existsSync(i)&&n.push(i)}catch(a){I.warn({err:a},`Failed to check if env file ${i} exists`)}});try{T3({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){I.error({err:o},"Failed to start config file watchers")}},je=()=>xb;function T3({filesToWatch:r,revalidator:e,signal:t,project:n}){I.debug("Starting watch on the following files:"),r.forEach(o=>{I.debug(`- ${o}`)}),r.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(E3.increment("setLocalProject")&&I.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.`),xb=await Promise.resolve(e(n.configFilePath)))};qp.watchFile(o,{persistent:!1},i);let a=()=>{qp.unwatchFile(o,i),t.removeEventListener("abort",a)};t.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function De(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}import{hostname as v3}from"os";var A3="0.35.3",ba=ps({app:"desktop-server",hostname:v3(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:A3});(async()=>{try{let r=await mu(ba);r.gitBranchName&&ba.addBinding("branch",r.gitBranchName)}catch{}})();var b0=R3();b0.get("/",async(r,e)=>{let t=je(),n=Ir();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await ln(ba,n,t),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=f0(),c=!a&&(s||!i);e.status(200).json({saveCaches:c,checkedOutBranch:o?.gitBranchName})});var _b=b0;import{Router as w3}from"express";import Rr from"fs";import{globSync as C3}from"glob";import Yt from"path";var Tu=w3();function Eu(r){let e=je(),t=Yt.dirname(e.configFilePath);return Yt.join(t,...r)}function x3(r){let e=je(),t=Yt.dirname(e.configFilePath),n=Yt.relative(t,r);return n?n.split(Yt.sep):[]}function _3(r,e){let t=Rr.statSync(r),n=x3(r);return ef.parse({name:e,absolutePath:r,relativePath:n.join(Yt.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}Tu.post("/",De(async(r,e,t)=>{let n;try{n=$A.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Eu(n);if(!Rr.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(Yt.sep)}`});return}if(!Rr.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(Yt.sep)}`});return}let a=je(),s=Array.from(a.config.exclude??[]).concat(Td),l=C3("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=Yt.join(o,d);return _3(p,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));Tu.put("/",De(async(r,e,t)=>{let n;try{n=qA.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Eu(n);if(Rr.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(Yt.sep)}`,pathSegments:n});return}Rr.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(Yt.sep)}`,pathSegments:n};e.status(201).json(i)}));Tu.patch("/",De(async(r,e,t)=>{let n,o;try{let l=KA.parse(r.body);n=l.pathSegments,o=l.newPathSegments}catch(l){e.status(400).json({error:`Failed to parse folder update body: ${l}`});return}let i=Eu(n),a=Eu(o);if(!Rr.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(Yt.sep)}`});return}if(Rr.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(Yt.sep)}`});return}let s=Yt.dirname(a);Rr.existsSync(s)||Rr.mkdirSync(s,{recursive:!0}),Rr.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(Yt.sep)} to ${o.join(Yt.sep)}`,pathSegments:o};e.status(200).json(c)}));Tu.delete("/",De(async(r,e,t)=>{let n,o=!0;try{let c=YA.parse(r.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=Eu(n);if(!Rr.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(Yt.sep)}`,pathSegments:n});return}if(!Rr.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(Yt.sep)}`});return}if(o)Rr.rmSync(i,{recursive:!0,force:!0});else{if(Rr.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}Rr.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var Mb=Tu;import{Router as M3}from"express";var E0=M3();E0.get("/",async(r,e)=>{let t=je(),n=Ir();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await ln(ba,n,t);e.status(200).json(o)});var Ib=E0;import LJ from"events";import aD,{Router as NJ}from"express";import DJ from"http";import{cloneDeep as J3}from"lodash-es";import{randomUUID as I3}from"crypto";var P3=3;async function T0(r){let{results:e,fixtures:t,work:n}=r,{logger:o}=t,i=e[e.length-1],a=L3(i,n);if(a)return o.info({failedResult:i,isNotEligible:a},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${a}`};o.info({failedResult:i},"Attempting failure recovery"),n.state.failureRecoveryAttempts=(n.state.failureRecoveryAttempts??0)+1;try{return await O3(r)}catch(s){return o.warn({err:s},"Error during failure recovery attempt, continuing..."),null}}async function O3(r){let{fixtures:e,results:t,failedStep:n,nextSteps:o,stepTracer:i,work:a}=r,{controller:s,logger:c}=e,l=i.parentTracer,{testMetadata:u}=r.inputs;if(!t.length)throw new Error("Attempted failure recovery with no failed results");let d=await s.getScreenshotPngString(),p=await s.getEmulatorDomState(),{results:m}=await uI(c,l,t,{numStepsWithScreenshots:8,addIndices:!0,includeBeforeScreenshots:!1}),g=o.map(C=>ra(C)),h=u.description.trim(),f=u?.settings?.ai?.failureRecoveryInstructions?.trim()||void 0,{scenario:y,thoughts:E,instructions:b}=await s.getMobileFailureRecoveryPlan({currentScreenshot:d,failedResults:m,currentScreenXml:p,nextStepsSerialized:g,testDescription:h,customInstructions:f});if(y!=="RECOVERABLE")return c.info({scenario:y,thoughts:E,instructions:b},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${E}`};if(!b)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let _={id:I3(),type:"MOBILE_AI_ACTION_STEP",text:b},M,O=a.state.failureRecoveryDisabled;O||(a.state.failureRecoveryDisabled=!0),c.info("executing mobile step list");try{M=await r.executeMobileStepList({...r,fixtures:{...r.fixtures},listParams:{steps:[_,n],containerName:"AI-recovered step list",tracer:l}})}finally{O||(a.state.failureRecoveryDisabled=O)}let v=M.results[0];if(v&&v.type==="MOBILE_AI_ACTION_STEP")if(qS({results:M.results,onPresetAction:C=>{C.aiSuggested=!0},onSimpleStepContainer:C=>{C.aiSuggested=!0}}),M.status==="SUCCESS"){let C=`The following steps were automatically executed by the failure recovery agent. Analysis: ${E}`;return v.message=C,nt.increment("test_event",1,["name:failure_recovery_success","platform:native",`orgId:${r.inputs.orgId}`]),c.info({thoughts:E},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:M,message:C}}else{nt.increment("test_event",1,["name:failure_recovery_failure","platform:native",`orgId:${r.inputs.orgId}`]);let C=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${E}`;return v.message=C,c.info({thoughts:E},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:M,message:C}}return null}function L3(r,e){if(!r)return"There is no failed result";if(r.type!=="MOBILE_PRESET_STEP")return"The failed step is not a preset action";let t=r.message;return t?t.includes("AbortError:")?"The user aborted the test":CT.some(n=>t.includes(n))?"The failed step is an irrecoverable configuration error":(e.state.failureRecoveryAttempts??0)>P3?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}async function v0(r){let e=Date.now(),t=r.fixtures.controller;try{return await N3(r)}catch(n){let o=t.isAborted()||n instanceof DOMException&&n.name==="AbortError";return{...r.moduleParams.step,steps:[],type:"MOBILE_MODULE_STEP",startTime:e,endTime:Date.now(),status:o?"CANCELLED":"FAILED",message:o?"Step cancelled.":`${n}`}}}async function N3({moduleParams:r,...e}){let t=Date.now(),{step:n,stepTracer:o,executeMobileStepList:i}=r,a=await D3({step:n,params:e}),s={};Object.entries(a).forEach(([p,m])=>{s[p]=JSON.stringify(m)});let c={...n,type:"MOBILE_MODULE_STEP",inputs:s,startTime:t,steps:[],endTime:Date.now(),status:"SUCCESS"},l=await o.startSubSteps(),{status:u,results:d}=await i({...e,listParams:{steps:n.steps,containerName:`module ('${n.name}')`,tracer:l}});return c.steps=d,c.status=u,c.endTime=Date.now(),lI({result:c,...sI(d)}),c}async function D3({step:r,params:e}){let t={},{logger:n,controller:o}=e.fixtures;for(let i of r.parameters?.parameterNames??[]){let a=r.inputs?.[i]??r.parameters?.defaultParameters?.[i];if(!a){n.warn({k:i},"No value found for parameter in module");continue}t[i]=await Bn({orgId:e.inputs.orgId,code:a,fragment:!0,logger:n,context:o.context,localTools:o.localCodeEvalTools})}return t}import{randomUUID as A0}from"crypto";import{diff as k3}from"deep-object-diff";import{cloneDeep as F3}from"lodash-es";async function R0({fixtures:r,step:e,inputs:t,stepTracer:n,work:o}){let i=Date.now(),{logger:a,controller:s}=r,c,l="",u,d=s.emulatorSettings?.disableXmlSnapshots??!1;if(!t.interactive){if(o.lastScreenshot)c=o.lastScreenshot.screenshot,l=o.lastScreenshot.snapshotId;else{l=A0();try{c=Buffer.from(await s.getScreenshotBase64(),"base64")}catch(h){a.warn({err:h},"Failed to take before screenshot")}}if(!d)if(o.lastScreenXml)u=o.lastScreenXml.screenXml;else try{u=await s.getEmulatorDomState()}catch(h){a.debug({err:h},"Failed to capture before XML snapshot")}}let p=VS(e.command,a),m=F3(p?.cache??{}),g={...e,status:"SUCCESS",startTime:i,endTime:Date.now()};try{let h=await s.executeCommand({command:e.command});g={...e,status:h.success?"SUCCESS":"FAILED",message:h.message,startTime:i,endTime:Date.now(),data:h.output}}catch(h){h instanceof Error&&h.name==="AbortError"||s.isAborted()?g={...e,status:"CANCELLED",message:"Step cancelled.",startTime:i,endTime:Date.now()}:(a.error({err:h},"Failed to execute preset step"),g={...e,status:"FAILED",message:h instanceof Error?h.message:String(h),startTime:i,endTime:Date.now()})}finally{if(!t.interactive){c&&(g.beforeSnapshot=l,n.attachBeforeScreenshot({snapshotId:l,screenshot:c}),!d&&u&&n.attachBeforeXmlSnapshot({snapshotId:l,xml:u}));let y=A0();try{let E=await s.getScreenshotBase64();g.afterSnapshot=y;let b=Buffer.from(E,"base64");n.attachAfterScreenshot({snapshotId:y,screenshot:b}),o.lastScreenshot={snapshotId:y,screenshot:b}}catch(E){a.warn({err:E},"Failed to take after screenshot"),o.lastScreenshot=void 0}if(!d)try{let E=await s.getEmulatorDomState();n.attachAfterXmlSnapshot({snapshotId:y,xml:E}),o.lastScreenXml={snapshotId:y,screenXml:E}}catch(E){a.debug({err:E},"Failed to capture after XML snapshot"),o.lastScreenXml=void 0}}let h="cache"in e.command?e.command.cache??{}:{};g.status==="FAILED"&&nI({logger:a,step:e,originalMobileCommandCache:p});let f=k3(m,h);f&&Object.keys(f).length>0&&a.info({diffs:ns(f)},"Updated cache")}return g}import{streamText as K3}from"ai";import{randomUUID as Y3}from"crypto";var Yp=class{controller;logger;rootStep;subStepIndex=0;callbacks;finalState=void 0;results=[];constructor(e){let{controller:t,logger:n,callbacks:o,rootStep:i}=e;this.controller=t,this.logger=n,this.callbacks=o,this.rootStep=i}async createAndExecuteStep(e){this.callbacks.onAiActionEvent?.({type:"SUBSTEP_CREATED",rootStep:this.rootStep,step:e});let t=this.subStepIndex++,n=await this.callbacks.executeStep(e,t);return this.results.push(n),n}recordGenericToolCall(e){this.callbacks.onAiActionEvent?.({type:"GENERIC_TOOL_CALLED",toolName:e,rootStep:this.rootStep})}};import{hasToolCall as $3,stepCountIs as q3}from"ai";import w0 from"dedent";var B3=w0`
4617
+ `).map(t=>t.trim()).filter(t=>t.length>0):[]}function c3(r,e){let t=r.attemptIdToAttemptNumber.get(e);if(t)return rr.join(r.inflatedPath,"attempts",t);let n=rr.join(r.inflatedPath,"attempts");if(!Ht.existsSync(n))return;let o=Ht.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=rr.join(n,i,"metadata.json"),s=a0(a);if(typeof s!="object"||s===null)continue;let c=s.id;if(typeof c=="string"&&c===e)return r.attemptIdToAttemptNumber.set(e,i),rr.join(n,i)}}function o0(r,e,t){let n=rr.join(r,"attempts");if(!Ht.existsSync(n))return;let o=Ht.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=rr.join(n,i,"assets",`${e}.${t}`);if(Ht.existsSync(a))return a}}var jp=class{constructor(e,t,n){this.outputDir=e;this.runId=t;this.runAttemptId=n;this.runsDir=rr.join(e,"runs"),this.zipPath=rr.join(this.runsDir,`${t}.zip`)}inflatedByRunId=new Map;zipPath;runsDir;ensureInflatedRun(e){let t=this.inflatedByRunId.get(e);if(t)return t;if(e!==this.runId||!Ht.existsSync(this.zipPath))return;let n=rr.join(this.runsDir,`temp-unzipped-${e}-${l3()}`);Ht.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())Ht.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return c3(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let t=rr.join(e,"assets");return Ht.existsSync(t)?Ht.readdirSync(t,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>rr.join(t,o.name)).filter(o=>{let i=rr.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,t){let n=this.getAttemptDir();if(!n)return;let o=rr.join(n,"assets",`${e}.${t}`);if(Ht.existsSync(o))try{return Ht.readFileSync(o,"utf-8")}catch{return}}async getConsoleLogsForRunAttempt(e,t,n){if(t!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=a0(rr.join(o,"console.json")),a=Jh.safeParse(i);return a.success?a.data:void 0}async getNetworkLogsForRunAttempt(e,t,n){if(t!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=rr.join(o,"assets","har-pages.log"),a=rr.join(o,"assets","har-entries.log"),s={};for(let u of n0(i)){let d=dc.safeParse(i0(u));d.success&&(s[d.data.id]=d.data)}let c={},l=n0(a);for(let u=0;u<l.length;u++){let d=l[u],p=mc.safeParse(i0(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;c[m]=p.data}if(Object.keys(c).length!==0)return Qh(s,c)}async getHtmlSnapshot(e,t){let n=this.readAttemptAssetText(t,"html");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=o0(o.inflatedPath,t,"html");if(i)try{return Ht.readFileSync(i,"utf-8")}catch{return}}async getA11yTreeSnapshot(e,t){let n=this.readAttemptAssetText(t,"xml");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=o0(o.inflatedPath,t,"xml");if(i)try{return Ht.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,t){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),i=o?rr.join(o,"assets",`${t}.jpeg`):void 0;if(i)try{return Ht.readFileSync(i)}catch{return}}};function i0(r){try{return JSON.parse(r)}catch{return}}import va from"fs";import $p from"fs";import y3 from"open";import Eb from"path";import S3 from"express";import u3 from"adm-zip";import{Router as d3}from"express";import rl from"fs";import bu from"path";function s0(r){let e=d3(),t=bu.join(r,"runs");return e.get("/",async(n,o)=>{try{let i=m3(r);if(!i){o.status(404).json({error:"No run group found"});return}if(!rl.existsSync(t)){o.status(404).json({error:"No runs found for run group"});return}let a=p3(t,i),s={...i,id:i.id??"local-run-group",createdAt:i.startedAt,runs:a};o.status(200).json(s)}catch(i){o.status(500).json({error:`Error loading run group: ${i.message}`})}}),e}function m3(r){let e=bu.join(r,"metadata.json");if(!rl.existsSync(e))return I.error("Run group metadata file not found"),null;try{let t=rl.readFileSync(e,"utf-8");return ds.parse(JSON.parse(t))}catch(t){return I.error({err:t},"Error reading run group metadata"),null}}function p3(r,e){let t=rl.readdirSync(r).filter(o=>o.endsWith(".zip")).sort((o,i)=>{let a=rl.statSync(bu.join(r,o));return rl.statSync(bu.join(r,i)).mtime.getTime()-a.mtime.getTime()}),n=[];for(let o of t){let i=bu.join(r,o),a=o.replace(/\.zip$/i,"");n.push(g3(i,a,e))}return n}function g3(r,e,t){let o=new u3(r).getEntry("metadata.json");if(!o)throw new Error(`No entry found for file ${r}/metadata.json`);try{let i=o.getData().toString("utf-8"),a=JSON.parse(i),s=pw.parse(a);return gI(s,e,{runGroupMetadata:t,runAttempts:[],organizationId:"local"})}catch(i){throw I.error({err:i,zipPath:r},"Error parsing metadata.json for run"),new Error(`Error parsing metadata.json for run ${r}`)}}import{Router as h3}from"express";import l0 from"fs";import Vp from"path";function c0(r){let e=h3(),t=Vp.join(r,"runs");return e.get("/:filename",(n,o)=>{let i=n.params.filename;if(!i||!i.endsWith(".zip")){o.status(404).send("Not found");return}let a=Vp.join(t,i),s=Vp.resolve(a),c=Vp.resolve(t);if(!s.startsWith(c)){o.status(403).send("Forbidden");return}if(!l0.existsSync(a)){o.status(404).send("File not found");return}try{o.setHeader("Content-Type","application/zip"),o.setHeader("Content-Disposition",`attachment; filename="${i}"`);let l=l0.readFileSync(a);o.send(l)}catch(l){o.status(500).send(`Error reading file: ${l.message}`)}}),e}import{Router as f3}from"express";import bb from"fs";import nl from"path";function u0(r){let e=f3();return e.get("*",(t,n)=>{let o=t.path==="/"?nl.join(r,"index.html"):nl.join(r,t.path),i=nl.resolve(o),a=nl.resolve(r);if(!i.startsWith(a)){n.status(403).send("Forbidden");return}if(!bb.existsSync(o)&&(o=nl.join(r,"index.html"),!bb.existsSync(o))){n.status(404).send("File not found");return}try{let s=nl.extname(o).toLowerCase(),c=pc[s]||"application/octet-stream";n.setHeader("Content-Type",c);let l=bb.readFileSync(o);n.send(l)}catch(s){n.status(500).send(`Error reading file: ${s.message}`)}}),e}async function d0(r,e,t){let n=e??await Xo(vd,"local-run-viewer-server"),o=S3();return o.use((i,a,s)=>{a.setHeader("Access-Control-Allow-Origin","*"),a.setHeader("Cache-Control","no-cache"),s()}),o.use("/api/runs",c0(r)),o.use("/api/run-group",s0(r)),t&&o.use("/",u0(t)),new Promise((i,a)=>{let s=o.listen(n,()=>{let c=`http://localhost:${n}`;i({port:n,url:c,stop:()=>{s.close()}})});s.on("error",c=>{a(c)})})}async function Tb(r){let{staticDir:e,resultsPath:t,runId:n,port:o}=r,i=Eb.resolve(t),a=Eb.join(i,"runs"),s;if(n){s=`${n.replace(/\.zip$/i,"")}.zip`;let l=Eb.join(a,s);if(!$p.existsSync(l)){let u=[];if($p.existsSync(a))for(let d of $p.readdirSync(a))d.endsWith(".zip")&&u.push(d.replace(/\.zip$/i,""));I.error(`Run not found: ${s} in ${a}`),u.length>0&&I.error(`Available runs: ${u.join(", ")}`),process.exit(1)}}$p.existsSync(e)||(I.error(`Static frontend files not found at ${e}. Please ensure the CLI is properly built.`),process.exit(1));try{let l=(await d0(i,o,e)).url;I.info(`Run viewer running at ${l}`);let u=new URL(l);s&&u.searchParams.set("zipUrl",`${l}/api/runs/${s}`),await y3(u.toString())}catch(c){I.error(`Failed to start run viewer: ${c.message}`),process.exit(1)}}import iD from"body-parser";import PJ from"cors";import OJ from"dedent";import{Router as R3}from"express";import qp from"fs";import b3 from"path";var E3=new Mm(30,60*1e3),wb="https://api.momentic.ai",Ab,p0,g0=r=>{wb=r},Cb=()=>wb;var h0=r=>{p0=r},f0=()=>p0,Ir=()=>Ab;var ol,Rb,m0,S0=async r=>{if(Ab&&ol&&m0)return ol;let e=new Mr({baseUrl:wb,apiKey:r,logger:I});Ab=e;try{let t=await e.getAuthInfo();return ol=t.orgId,Rb=t.userId,m0=r,ol}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},Jn=()=>{if(!ol)throw new Error("Your organization ID is invalid.");return ol},Kp=()=>{if(!Rb)throw new Error("Your user ID is invalid.");return Rb};var xb,vb,y0=(r,e)=>{xb=r,vb?.abort(),vb=new AbortController;let t=vb.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=b3.resolve(r.rootDir,o.envFile);try{if(qp.lstatSync(i).isSymbolicLink())return;qp.existsSync(i)&&n.push(i)}catch(a){I.warn({err:a},`Failed to check if env file ${i} exists`)}});try{T3({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){I.error({err:o},"Failed to start config file watchers")}},je=()=>xb;function T3({filesToWatch:r,revalidator:e,signal:t,project:n}){I.debug("Starting watch on the following files:"),r.forEach(o=>{I.debug(`- ${o}`)}),r.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(E3.increment("setLocalProject")&&I.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.`),xb=await Promise.resolve(e(n.configFilePath)))};qp.watchFile(o,{persistent:!1},i);let a=()=>{qp.unwatchFile(o,i),t.removeEventListener("abort",a)};t.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function De(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}import{hostname as v3}from"os";var A3="0.35.4",ba=ps({app:"desktop-server",hostname:v3(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:A3});(async()=>{try{let r=await mu(ba);r.gitBranchName&&ba.addBinding("branch",r.gitBranchName)}catch{}})();var b0=R3();b0.get("/",async(r,e)=>{let t=je(),n=Ir();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await ln(ba,n,t),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=f0(),c=!a&&(s||!i);e.status(200).json({saveCaches:c,checkedOutBranch:o?.gitBranchName})});var _b=b0;import{Router as w3}from"express";import Rr from"fs";import{globSync as C3}from"glob";import Yt from"path";var Tu=w3();function Eu(r){let e=je(),t=Yt.dirname(e.configFilePath);return Yt.join(t,...r)}function x3(r){let e=je(),t=Yt.dirname(e.configFilePath),n=Yt.relative(t,r);return n?n.split(Yt.sep):[]}function _3(r,e){let t=Rr.statSync(r),n=x3(r);return ef.parse({name:e,absolutePath:r,relativePath:n.join(Yt.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}Tu.post("/",De(async(r,e,t)=>{let n;try{n=$A.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Eu(n);if(!Rr.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(Yt.sep)}`});return}if(!Rr.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(Yt.sep)}`});return}let a=je(),s=Array.from(a.config.exclude??[]).concat(Td),l=C3("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=Yt.join(o,d);return _3(p,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));Tu.put("/",De(async(r,e,t)=>{let n;try{n=qA.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Eu(n);if(Rr.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(Yt.sep)}`,pathSegments:n});return}Rr.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(Yt.sep)}`,pathSegments:n};e.status(201).json(i)}));Tu.patch("/",De(async(r,e,t)=>{let n,o;try{let l=KA.parse(r.body);n=l.pathSegments,o=l.newPathSegments}catch(l){e.status(400).json({error:`Failed to parse folder update body: ${l}`});return}let i=Eu(n),a=Eu(o);if(!Rr.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(Yt.sep)}`});return}if(Rr.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(Yt.sep)}`});return}let s=Yt.dirname(a);Rr.existsSync(s)||Rr.mkdirSync(s,{recursive:!0}),Rr.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(Yt.sep)} to ${o.join(Yt.sep)}`,pathSegments:o};e.status(200).json(c)}));Tu.delete("/",De(async(r,e,t)=>{let n,o=!0;try{let c=YA.parse(r.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=Eu(n);if(!Rr.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(Yt.sep)}`,pathSegments:n});return}if(!Rr.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(Yt.sep)}`});return}if(o)Rr.rmSync(i,{recursive:!0,force:!0});else{if(Rr.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}Rr.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var Mb=Tu;import{Router as M3}from"express";var E0=M3();E0.get("/",async(r,e)=>{let t=je(),n=Ir();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await ln(ba,n,t);e.status(200).json(o)});var Ib=E0;import LJ from"events";import aD,{Router as NJ}from"express";import DJ from"http";import{cloneDeep as J3}from"lodash-es";import{randomUUID as I3}from"crypto";var P3=3;async function T0(r){let{results:e,fixtures:t,work:n}=r,{logger:o}=t,i=e[e.length-1],a=L3(i,n);if(a)return o.info({failedResult:i,isNotEligible:a},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${a}`};o.info({failedResult:i},"Attempting failure recovery"),n.state.failureRecoveryAttempts=(n.state.failureRecoveryAttempts??0)+1;try{return await O3(r)}catch(s){return o.warn({err:s},"Error during failure recovery attempt, continuing..."),null}}async function O3(r){let{fixtures:e,results:t,failedStep:n,nextSteps:o,stepTracer:i,work:a}=r,{controller:s,logger:c}=e,l=i.parentTracer,{testMetadata:u}=r.inputs;if(!t.length)throw new Error("Attempted failure recovery with no failed results");let d=await s.getScreenshotPngString(),p=await s.getEmulatorDomState(),{results:m}=await uI(c,l,t,{numStepsWithScreenshots:8,addIndices:!0,includeBeforeScreenshots:!1}),g=o.map(C=>ra(C)),h=u.description.trim(),f=u?.settings?.ai?.failureRecoveryInstructions?.trim()||void 0,{scenario:y,thoughts:E,instructions:b}=await s.getMobileFailureRecoveryPlan({currentScreenshot:d,failedResults:m,currentScreenXml:p,nextStepsSerialized:g,testDescription:h,customInstructions:f});if(y!=="RECOVERABLE")return c.info({scenario:y,thoughts:E,instructions:b},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${E}`};if(!b)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let _={id:I3(),type:"MOBILE_AI_ACTION_STEP",text:b},M,O=a.state.failureRecoveryDisabled;O||(a.state.failureRecoveryDisabled=!0),c.info("executing mobile step list");try{M=await r.executeMobileStepList({...r,fixtures:{...r.fixtures},listParams:{steps:[_,n],containerName:"AI-recovered step list",tracer:l}})}finally{O||(a.state.failureRecoveryDisabled=O)}let v=M.results[0];if(v&&v.type==="MOBILE_AI_ACTION_STEP")if(qS({results:M.results,onPresetAction:C=>{C.aiSuggested=!0},onSimpleStepContainer:C=>{C.aiSuggested=!0}}),M.status==="SUCCESS"){let C=`The following steps were automatically executed by the failure recovery agent. Analysis: ${E}`;return v.message=C,nt.increment("test_event",1,["name:failure_recovery_success","platform:native",`orgId:${r.inputs.orgId}`]),c.info({thoughts:E},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:M,message:C}}else{nt.increment("test_event",1,["name:failure_recovery_failure","platform:native",`orgId:${r.inputs.orgId}`]);let C=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${E}`;return v.message=C,c.info({thoughts:E},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:M,message:C}}return null}function L3(r,e){if(!r)return"There is no failed result";if(r.type!=="MOBILE_PRESET_STEP")return"The failed step is not a preset action";let t=r.message;return t?t.includes("AbortError:")?"The user aborted the test":CT.some(n=>t.includes(n))?"The failed step is an irrecoverable configuration error":(e.state.failureRecoveryAttempts??0)>P3?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}async function v0(r){let e=Date.now(),t=r.fixtures.controller;try{return await N3(r)}catch(n){let o=t.isAborted()||n instanceof DOMException&&n.name==="AbortError";return{...r.moduleParams.step,steps:[],type:"MOBILE_MODULE_STEP",startTime:e,endTime:Date.now(),status:o?"CANCELLED":"FAILED",message:o?"Step cancelled.":`${n}`}}}async function N3({moduleParams:r,...e}){let t=Date.now(),{step:n,stepTracer:o,executeMobileStepList:i}=r,a=await D3({step:n,params:e}),s={};Object.entries(a).forEach(([p,m])=>{s[p]=JSON.stringify(m)});let c={...n,type:"MOBILE_MODULE_STEP",inputs:s,startTime:t,steps:[],endTime:Date.now(),status:"SUCCESS"},l=await o.startSubSteps(),{status:u,results:d}=await i({...e,listParams:{steps:n.steps,containerName:`module ('${n.name}')`,tracer:l}});return c.steps=d,c.status=u,c.endTime=Date.now(),lI({result:c,...sI(d)}),c}async function D3({step:r,params:e}){let t={},{logger:n,controller:o}=e.fixtures;for(let i of r.parameters?.parameterNames??[]){let a=r.inputs?.[i]??r.parameters?.defaultParameters?.[i];if(!a){n.warn({k:i},"No value found for parameter in module");continue}t[i]=await Bn({orgId:e.inputs.orgId,code:a,fragment:!0,logger:n,context:o.context,localTools:o.localCodeEvalTools})}return t}import{randomUUID as A0}from"crypto";import{diff as k3}from"deep-object-diff";import{cloneDeep as F3}from"lodash-es";async function R0({fixtures:r,step:e,inputs:t,stepTracer:n,work:o}){let i=Date.now(),{logger:a,controller:s}=r,c,l="",u,d=s.emulatorSettings?.disableXmlSnapshots??!1;if(!t.interactive){if(o.lastScreenshot)c=o.lastScreenshot.screenshot,l=o.lastScreenshot.snapshotId;else{l=A0();try{c=Buffer.from(await s.getScreenshotBase64(),"base64")}catch(h){a.warn({err:h},"Failed to take before screenshot")}}if(!d)if(o.lastScreenXml)u=o.lastScreenXml.screenXml;else try{u=await s.getEmulatorDomState()}catch(h){a.debug({err:h},"Failed to capture before XML snapshot")}}let p=VS(e.command,a),m=F3(p?.cache??{}),g={...e,status:"SUCCESS",startTime:i,endTime:Date.now()};try{let h=await s.executeCommand({command:e.command});g={...e,status:h.success?"SUCCESS":"FAILED",message:h.message,startTime:i,endTime:Date.now(),data:h.output}}catch(h){h instanceof Error&&h.name==="AbortError"||s.isAborted()?g={...e,status:"CANCELLED",message:"Step cancelled.",startTime:i,endTime:Date.now()}:(a.error({err:h},"Failed to execute preset step"),g={...e,status:"FAILED",message:h instanceof Error?h.message:String(h),startTime:i,endTime:Date.now()})}finally{if(!t.interactive){c&&(g.beforeSnapshot=l,n.attachBeforeScreenshot({snapshotId:l,screenshot:c}),!d&&u&&n.attachBeforeXmlSnapshot({snapshotId:l,xml:u}));let y=A0();try{let E=await s.getScreenshotBase64();g.afterSnapshot=y;let b=Buffer.from(E,"base64");n.attachAfterScreenshot({snapshotId:y,screenshot:b}),o.lastScreenshot={snapshotId:y,screenshot:b}}catch(E){a.warn({err:E},"Failed to take after screenshot"),o.lastScreenshot=void 0}if(!d)try{let E=await s.getEmulatorDomState();n.attachAfterXmlSnapshot({snapshotId:y,xml:E}),o.lastScreenXml={snapshotId:y,screenXml:E}}catch(E){a.debug({err:E},"Failed to capture after XML snapshot"),o.lastScreenXml=void 0}}let h="cache"in e.command?e.command.cache??{}:{};g.status==="FAILED"&&nI({logger:a,step:e,originalMobileCommandCache:p});let f=k3(m,h);f&&Object.keys(f).length>0&&a.info({diffs:ns(f)},"Updated cache")}return g}import{streamText as K3}from"ai";import{randomUUID as Y3}from"crypto";var Yp=class{controller;logger;rootStep;subStepIndex=0;callbacks;finalState=void 0;results=[];constructor(e){let{controller:t,logger:n,callbacks:o,rootStep:i}=e;this.controller=t,this.logger=n,this.callbacks=o,this.rootStep=i}async createAndExecuteStep(e){this.callbacks.onAiActionEvent?.({type:"SUBSTEP_CREATED",rootStep:this.rootStep,step:e});let t=this.subStepIndex++,n=await this.callbacks.executeStep(e,t);return this.results.push(n),n}recordGenericToolCall(e){this.callbacks.onAiActionEvent?.({type:"GENERIC_TOOL_CALLED",toolName:e,rootStep:this.rootStep})}};import{hasToolCall as $3,stepCountIs as q3}from"ai";import w0 from"dedent";var B3=w0`
4618
4618
  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.
4619
4619
  `,C0=r=>w0`
4620
4620
  <background>
@@ -4647,7 +4647,7 @@ Momentic users value the following:
4647
4647
  b) There is a loading state that blocks you from proceeding with generation, and you need to wait until the state changes. In this case, you can generate an AI_CHECK step for the anticipated "done" state (e.g. "There is no loading spinner visible"). Unless explicitly specified by the user, you can generate and retry an assertion up to 3 times with a timeout up to 30 seconds each.
4648
4648
  If the max. allowed retries is exceeded, fail the generation cycle by calling "finish".
4649
4649
  </rules>
4650
- `;import{tool as H3}from"ai";import{randomUUID as W3}from"crypto";import j3 from"zod";import{tool as z3}from"ai";import G3 from"zod";var Pb="get_emulator_state";var x0=r=>{let e=z3({description:"Get the current state of the emulator (XML + screenshot)",inputSchema:G3.object({}),toModelOutput:t=>t,execute:async()=>{let{controller:t,logger:n,contextManager:o}=r;return o.recordGenericToolCall(Pb),n.info("AI action tool called (get_emulator_state)"),Ob(t)}});return{name:Pb,tool:e}};async function Ob(r){let e=await r.getEmulatorDomState(),t=await r.getScreenshotBase64();return{type:"content",value:[{type:"text",text:"<emulatorXml>"},{type:"text",text:e},{type:"text",text:"</emulatorXml>"},{type:"text",text:"<screenshot>"},{type:"media",data:t,mediaType:"image/png"},{type:"text",text:"</screenshot>"}]}}var _0=r=>({name:"create_execute_step",tool:H3({description:"Create and immediately execute a new Momentic step in the Android emulator, returning the result from the step and the state of the emulator after the step finished executing.",inputSchema:j3.object({step:Wh}),toModelOutput:t=>t,execute:async({step:t})=>{let{contextManager:n,logger:o,controller:i}=r;o.info({step:t},"AI action tool called (create_execute_step)");let a=pA(t),s={id:W3(),type:"MOBILE_PRESET_STEP",command:a},c=await n.createAndExecuteStep(s);c.status==="SUCCESS"&&i.optionsCopy?.emulator?.waitForStability&&await i.waitForPageSourceStability({reason:"Waiting for stability after executing AI-generated sub-step"});let l={...c,trace:void 0,beforeSnapshot:void 0,afterSnapshot:void 0},u=await Ob(i);return{type:"content",value:[{type:"text",text:"<result>"},{type:"text",text:JSON.stringify(l,null,2)},{type:"text",text:"</result>"},{type:"text",text:"<stateAfter>"},...u.value,{type:"text",text:"</stateAfter>"}]}}})});import{tool as V3}from"ai";import Lb from"zod";var M0=r=>{let e=V3({description:"Signal that the AI action has reached a terminal state (either success or failure).",inputSchema:Lb.object({message:Lb.string(),success:Lb.boolean()}),toModelOutput:t=>t,execute:async({message:t,success:n})=>{let{contextManager:o,logger:i}=r;return i.info({message:t,success:n},"AI action tool called (finish)"),o.finalState={message:t,status:n?"SUCCESS":"FAILED"},{type:"content",value:[{type:"text",text:"Done"}]}}});return{name:_u,tool:e}};var I0=[_0,x0,M0];function P0(r){let{logger:e,controller:t,contextManager:n,aiActionSessionId:o}=r,i={};for(let c of I0){let l=c({contextManager:n,logger:e,controller:t});i[l.name]=l.tool}let a=t.generator.getAnthropicModelFactory({logger:e,sessionId:o,streamType:"ai-action-tool-based"}),s=c=>{let{messages:l}=c,u=!1;for(let d=l.length-1;d>=0;d--){let p=l[d];for(let m of p.content)if(!(typeof m!="object"||!("type"in m))&&!(m.type!=="tool-result"||m.output.type!=="content")&&!(m.output.value.length<3))for(let g=0;g<m.output.value.length;g++){let h=m.output.value[g];if(h.type==="text"&&h.text.includes("<emulatorXml>"))if(u){let f=m.output.value[g+1];f.type==="text"?f.text="TRUNCATED DUE TO CONVERSATION LENGTH":e.warn({msg:f},"Got unexpected part when truncating emulator state message")}else{u=!0;continue}}}return c};return{model:a("claude-haiku-4-5-20251001"),tools:i,prepareStep:s,stopWhen:[q3(15),$3(_u)],system:C0(!1)}}async function O0(r){let e=Date.now(),{controller:t,logger:n}=r.fixtures;try{return await X3(r)}catch(o){let i=t.isAborted()||o instanceof DOMException&&o.name==="AbortError";return i||n.error({err:o},"Failed to execute mobile AI action"),{...r.aiActionParams.step,steps:[],type:"MOBILE_AI_ACTION_STEP",startTime:e,endTime:Date.now(),status:i?"CANCELLED":"FAILED",message:i?"Step cancelled.":`${o}`}}}async function X3(r){let{platform:e}=r,{step:t,stepTracer:n,executeMobileStepList:o}=r.aiActionParams,{controller:i,logger:a}=r.fixtures,{step:s}=r.callbacks,c=await n.startSubSteps(),l=Y3(),u=a.child({stepId:t.id,aiActionSessionId:l}),d=Date.now();if(e!=="ANDROID"||!(i instanceof ai))throw new R("UserConfigurationError","AI action steps are only supported on Android platform.");let p=async(y,E)=>{let b=await o({...r,listParams:{steps:[y],tracer:c,containerName:`AI action sub-step ${E}`}});if(b.results.length!==1)throw new R("InternalWebAgentError","Expected exactly one result from executeMobileStepList");return b.results[0]},m={stepId:t.id,parentStepIdChain:n.getParentStepIdChain()},g=new Yp({controller:i,callbacks:{onAiActionEvent:s?.onAiActionEvent,executeStep:p},logger:u,rootStep:m}),h=P0({controller:i,logger:u,contextManager:g,aiActionSessionId:l}),f=K3({...h,messages:[{role:"user",content:t.text}],abortSignal:i.abortSignal});for await(let y of f.fullStream)switch(i.throwIfAborted(),y.type){case"text-delta":s?.onAiActionEvent?.({type:"LLM_TEXT_OUTPUT",text:y.text,rootStep:m})}if(await f.response,i.throwIfAborted(),!g.finalState)throw new R("InternalWebAgentError","The AI agent never reached a final state. This could be because the maximum number of steps was reached.");return{...t,status:g.finalState.status,startTime:d,endTime:Date.now(),message:g.finalState.message,steps:g.results}}var Z3=60*60*1e3;async function vu(r){let{fixtures:e,inputs:t,listParams:n,work:o}=r,{containerName:i,steps:a,tracer:s}=n,{logger:c,controller:l,usageTracker:u}=e,d=s.getParentStepIdChain(),p=[],m,g="SUCCESS",h,{fromStep:f,toStep:y}=t;for(let E=0;E<a.length;E++){let b=a[E];if(b.skipped)continue;if(o.fastForwardingToStep&&f){let C=JSON.stringify(d);if(b.id===f.fromStepId&&C===JSON.stringify(f.parentStepIdChain))o.fastForwardingToStep=!1;else if(!aI({currentStep:b,currentParentChain:d,desiredStepId:f.fromStepId,desiredStepParentChain:f.parentStepIdChain}))continue}let _=0,M=1,O=Date.now();b.retries&&b.retries>0&&(M+=b.retries);let v=[];for(;_<M&&Date.now()-O<Z3;){_++;let C=`Executing step index ${E} in ${i} - ${ra(b)}`;_!==1&&(C+=` (attempt ${_})`),c.info({step:b},C);let F=Date.now(),P=await s.startStep({logger:c,step:b,attempt:_,parentStepIdChain:d});u.trackStepExecution(b);let B=J3(b),D=await Q3({step:b,stepTracer:P,params:r}),{trace:ee}=await P.finish({parentStepIdChain:d,result:D});if(D.trace=ee,C=`Finished step index ${E} in ${i} - ${ra(b)}`,_!==1&&(C+=` (attempt ${_})`),c.info({step:{id:b.id},trace:D.trace,status:D.status},C),D.status!=="SUCCESS"&&_<M){v.push(D),Date.now()-F<1e3&&await J(1e3-(Date.now()-F));continue}if(v.length>0&&(D.previousAttempts=v),p.push(D),h=await eJ({result:D,step:b,originalStep:B,steps:a,currentStepIndex:E,params:r,stepTracer:P,isLastAttempt:_===M,results:p}),D.status!=="SUCCESS"&&h!=="SUCCESS")return g=D.status,m=D,{results:p,status:g,terminalResult:m};if(b.envKey&&l.context.setVariable(b.envKey,D.data),y){let K=JSON.stringify(d);if(b.id===y.toStepId&&K===JSON.stringify(y.parentStepIdChain))return o.shouldStopExecuting=!0,{results:p,status:g,terminalResult:m}}if(o.shouldStopExecuting)return{results:p,status:g,terminalResult:m};break}}return{results:p,status:g,terminalResult:m}}async function Q3({step:r,params:e,stepTracer:t}){let{fixtures:n,inputs:o,callbacks:i,work:a}=e,s;switch(r.type){case"MOBILE_PRESET_STEP":{s=await R0({platform:e.platform,fixtures:n,inputs:o,step:r,stepTracer:t,callbacks:i,work:a});break}case"RESOLVED_MOBILE_MODULE":{s=await v0({...e,moduleParams:{step:r,stepTracer:t,executeMobileStepList:vu}});break}case"MOBILE_AI_ACTION_STEP":{let c=a.state.failureRecoveryDisabled;c||(a.state.failureRecoveryDisabled=!0);try{s=await O0({...e,aiActionParams:{step:r,stepTracer:t,executeMobileStepList:vu}})}finally{c||(a.state.failureRecoveryDisabled=c)}break}}return s}async function eJ({result:r,step:e,originalStep:t,steps:n,currentStepIndex:o,params:i,stepTracer:a,isLastAttempt:s,results:c}){let l,u;if(s&&r.status==="FAILED"&&!i.work.state.failureRecoveryDisabled){let d=await T0({...i,stepTracer:a,step:e,steps:n,currentStepIndex:o,isLastAttempt:s,executeMobileStepList:vu,failedStep:t,nextSteps:n.slice(o+1),results:c.concat(r)});d&&(d.type==="ATTEMPTED"?(l=d.result.results,u=d.status):d.type==="NOT_ELIGIBLE"&&(r.message=r.message?`${r.message} ${d.message}`:d.message),r.type==="MOBILE_PRESET_STEP"&&(r.failureRecoveryStatus={type:d.type,message:d.message}))}return l&&c.push(...l),u}import{diff as tJ}from"deep-object-diff";import{cloneDeep as rJ}from"lodash-es";async function il(r){let{tracer:e,containerName:t}=r,{steps:n,testMetadata:o}=r.inputs,{cacheStorage:i,logger:a}=r.fixtures,s=a.child({testId:r.inputs.testMetadata.id,testName:r.inputs.testName});await i.populateCacheForRun({logger:s,platform:o.platform,testId:o.id,stepLists:{steps:n},skipFetchingCacheFromStorage:r.inputs.interactive});let c=rJ(n);s.info({testMetadata:ko.parse(o)},"Starting mobile test");let l=await e.startMainStepList(),u=Rw(s);s.info({cpu:u?.cpuMetadata,platform:u?.platform},`Starting execution of ${t}`);let{status:d,results:p,terminalResult:m}=await vu({...r,listParams:{containerName:t,tracer:l,steps:c}});return clearInterval(u?.interval),await nJ({steps:n,stepsToExecute:c,logger:s,cacheStorage:i,orgId:r.inputs.orgId,testId:o.id,platform:o.platform}),d==="SUCCESS"?{status:"PASSED",results:p,failureRecoveryDetails:r.work.state.failureRecoveryAttempts?{attempts:r.work.state.failureRecoveryAttempts}:void 0}:d==="CANCELLED"?{status:"CANCELLED",results:p}:{status:"FAILED",results:p,terminalResult:m}}async function nJ({steps:r,stepsToExecute:e,logger:t,cacheStorage:n,orgId:o,testId:i,platform:a}){let s=tJ(r,e);if(s&&Object.keys(s).length>0){t.info({diffs:ns(s)},"Saving mobile step cache entries");let{cachesToSave:c}=await Gn({platform:a,steps:e,cacheCreationParams:{orgId:o,testId:i}});await n.saveEntries({logger:t,testId:i,entries:c})}else t.info("No cache entries to update")}import{Server as pJ}from"socket.io";import{tmpdir as oJ}from"os";import L0 from"path";async function N0({socket:r,logger:e,orgId:t,testMetadata:n,globalOrgSettings:o,androidDriverFactory:i,mobileGeneratorFactory:a,browserGeneratorFactory:s,browserEnricherFactory:c,storageFactory:l,localToolsFactory:u,globalStateManager:d,getGitMetadata:p}){let m=r.id,g=await p(),h=r.handshake.query?.fileName,f=h?L0.basename(h,".test.yaml"):"",y=n.id,E=n.settings?.defaultChannel,b=n.settings?.defaultTag;e=e.child({sessionId:m,testId:y,orgId:t,branch:g.gitBranchName});let _=await l(t),M=n.settings?.defaultEnv,O={};M&&(O=(await _.fetchEnvironment(M,e))?.variables??{});let v=is.parse(O[Ii]),C=is.parse(O[kl]),F={...o.emulator,...n.settings?.emulator},P=n.settings?.defaultApkFilePath?.trim()||C,B=d.getSession(m);if(B){if(e.info("Reconnecting to existing Android session"),B.local)return r.emit("session",B.metadata),B.softDeleted=!1,B.metadata;throw new Error("Restoring existing remote emulator sessions is not supported. Please reconnect to a new emulator.")}let D;if(F.region==="local"){if(await d.clearSoftDeletedLocalSessions(e),d.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");let Si=n.settings?.emulator?.localEmulatorSettings?.avdId?.trim()||v;if(!Si)throw new Error(`AVD ID is required when using a local emulator. Set it on the test (Options \u2192 Emulator \u2192 Local AVD ID) or on the environment via ${Ii}.`);D={avdId:Si,apkToInstall:E?{channel:E,tag:b}:void 0,apkFilePath:P}}else D={region:F.region,apkToInstall:E?{channel:E,tag:b}:void 0,osVersion:F.remoteEmulatorSettings?.androidVersion};let ee=Date.now(),{driver:K,cleanup:ge,emulatorName:U,adbPort:W,limbarClient:ue,limbarToken:le,limbarUrl:Ge,playwrightDevice:ve}=await i({socket:r,logger:e,creationOpts:D}),q=L0.join(oJ(),`logcat-logs-${t}-${y}-${m}.txt`),fe=await Om({driver:K,onLogs:Si=>{r.emit("logcatLogs",Si)},logFilePath:q});e.info({adbPort:W,apkChannel:E,apkTag:b,duration:Date.now()-ee,emulatorName:U},"Android emulator session initiated"),e=e.child({emulator:U});let it=await a(t,e),Ae=await s(t,e),x=await c(t,e),ne=u?await u(t):void 0,pe=new Do({variablesFromEnvironment:O,envName:M,testName:f}),Br=await ai.init({driver:K,generator:it,logger:e,limbarClient:ue,playwrightDevice:ve,aiSettings:{...o.ai,useMemory:o.ai?.useMemory!==!1,...n.settings?.ai},options:{emulator:{...F,browserSettings:o.browser}},fixtures:{storage:_,browserEnricher:x,browserGenerator:Ae,localCodeEvalTools:ne,testContext:pe},orgId:t,adbPort:W,abortController:new AbortController}),fi=await Br.getViewportBounds();if(!r.connected)throw await Br.cleanup(),await fe(),await ge(),new Error("Socket not connected anymore, not proceeding with Android session setup");let KD=iJ({socket:r,testContext:pe}),YD=async()=>{clearInterval(KD);try{await Promise.allSettled([Br.cleanup(),fe(),ge()])}catch(Si){e.warn({err:Si},"Failed to clean up emulator in socket server")}},ie={sessionId:m,testId:y,orgId:t,emulatorName:U,testName:f,limbarUrl:Ge,limbarToken:le,viewportBounds:fi};return d.registerSession(m,{controller:Br,cleanup:YD,emulatorName:U,local:F.region==="local",metadata:ie,logFilePath:q}),r.emit("session",ie),ie}function iJ({socket:r,testContext:e}){return setInterval(()=>{let t=e.toEditorDisplayCopy();r.emit("emulatorState",{context:t})},3e3)}import Xp from"fs/promises";async function D0({socket:r,logger:e,globalStateManager:t,authorization:n}){let o=r.id,i=t.getSession(o);i&&n&&i.logFilePath&&aJ({testId:i.metadata.testId,sessionId:o,logFilePath:i.logFilePath,authorization:n,logger:e}),await t.removeSession(o,e)}async function aJ({testId:r,sessionId:e,logFilePath:t,authorization:n,logger:o}){try{let i;try{i=await Xp.stat(t)}catch{o.debug({logFilePath:t},"No logcat file found to upload");return}if(i.size===0){o.debug({logFilePath:t},"Logcat file is empty, skipping upload"),await Xp.unlink(t);return}let a=new Mr(n),{uploadUrl:s}=await a.generateMobileLogcatUploadUrl({testId:r,sessionId:e}),c=await Xp.readFile(t),l=await fetch(s,{headers:{"Content-Length":c.length.toString(),"Content-Type":"text/plain"},method:"PUT",body:c});if(l.status!==200)throw new Error(`Failed to upload logcat: ${l.status} ${await l.text()}`);o.info({testId:r,sessionId:e},"Logcat file uploaded successfully")}catch(i){o.warn({err:i,testId:r,sessionId:e},"Failed to upload logcat file")}finally{try{await Xp.unlink(t)}catch(i){o.warn({err:i,logFilePath:t},"Failed to delete temp logcat file")}}}var sJ=({socket:r,globalStateManager:e})=>async()=>{let t=e.getSession(r.id);if(!t)throw new Error("No active Android session found");t.controller.abort()},k0={event:"cancel",createHandler:sJ};var lJ=({logger:r,globalStateManager:e,socket:t})=>async(n,o)=>{let i=e.getSession(t.id);if(!i){o({err:"No active Android session found"});return}try{let s=await i.controller.getEmulatorDomState();o({screenXml:s})}catch(a){r.error({err:a},"Error fetching screen XML from the session controller"),o({err:a.message})}},F0={event:"fetchScreenXml",createHandler:lJ};var Nb=class{parentTracer;socket;step;orgId;interactionTracer;constructor({step:e,socket:t,parentTracer:n,orgId:o}){this.socket=t,this.parentTracer=n,this.step=e,this.orgId=o,this.interactionTracer=new Zo,nn.initializeRootTracerContext(this.interactionTracer)}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeXmlSnapshot(){}attachAfterXmlSnapshot(){}recordStepDuration(e){let{durationMs:t,step:n}=e,o=n.type!=="MOBILE_PRESET_STEP"?n.type:n.command.type;nt.distribution("test_step_duration",t,[`type:${o}`,"platform:mobile","executor:editor",`orgId:${this.orgId}`])}async finish(e){this.interactionTracer.finish();let t=this.interactionTracer.getRootSpan(),n={...lw.parse(e),trace:Xh.parse(t)};switch(n.result.status){case"SUCCESS":this.socket.emit("success",n);break;case"FAILED":this.socket.emit("failure",n);break;case"CANCELLED":this.socket.emit("cancelled",n);break}return{trace:t}}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}async startSubSteps(){return new al({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},al=class{parentTracer;parentStep;socket;orgId;constructor({parentStep:e,socket:t,parentTracer:n,orgId:o}){this.parentTracer=n,this.parentStep=e,this.socket=t,this.orgId=o}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:e.parentStepIdChain,attempt:e.attempt}),new Nb({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId})}async getScreenshot(e){}},Jp=class{constructor(e,t){this.socket=e;this.orgId=t}appendLogs(){}async finish(){this.socket.emit("finished")}async startBeforeStepList(){return new al({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId})}async startMainStepList(){return new al({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId})}async startAfterStepList(){return new al({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId})}};var cJ=({metadata:r,logger:e,globalStateManager:t,socket:n,cacheStorageFactory:o,getGitMetadata:i})=>async(a,s)=>{let c=t.getSession(n.id);if(!c)throw new Error("No active Android session found");if(a.testMetadata.platform!=="ANDROID")throw new Error("Non-android tests aren't supported yet");let l=await i(),u=e.child({testId:a.testMetadata.id,branch:l.gitBranchName}),d=await o(r.orgId,l),p=c.controller;p.resetAbortController();let m=new Jp(n,r.orgId),g=await il({platform:"ANDROID",work:{fastForwardingToStep:!!a.fromStep,state:{failureRecoveryDisabled:!0,failureRecoveryAttempts:0}},fixtures:{controller:p,logger:u,cacheStorage:d,usageTracker:new ud},containerName:"entire test",inputs:{steps:a.steps,fromStep:a.fromStep,toStep:a.toStep,orgId:r.orgId,testName:r.testName,testMetadata:a.testMetadata,interactive:!0},tracer:m,callbacks:{step:{onAiActionEvent:f=>{n.emit("aiActionEvent",f)}}}});await m.finish();let h={results:yr.array().parse(g.results),status:g.status};s?.(h)},U0={event:"execute",createHandler:cJ};import{debounce as uJ}from"ts-debounce";var dJ=({socket:r,globalStateManager:e,keepSessionAlive:t})=>{let n=uJ(t,3e4,{maxWait:6e4});return async()=>{let o=e.getSession(r.id);if(!o)throw new Error("No active Android session found");o.emulatorName&&(o.local||n(o.emulatorName))}},B0={event:"keepalive",createHandler:dJ};var mJ=({socket:r,globalStateManager:e,logger:t})=>async(n,o)=>{let i=e.getSession(r.id);if(!i){let s="No active Android session found";t.error(s),o?.({success:!1,err:s});return}let a=i.controller;a.abort(),a.resetAbortController(),t.info("Resetting emulator state");try{await a.softReset(),t.info("Emulator reset completed"),o?.({success:!0,message:"Emulator reset successfully"})}catch(s){let c=s instanceof Error?s.message:String(s);t.error({err:s},"Failed to reset emulator"),o?.({success:!1,err:`Failed to reset emulator: ${c}`})}},z0={event:"reset",createHandler:mJ};var G0=[U0,k0,z0,B0,F0];var Zp=class{sessions=new Map;registerSession(e,t){this.sessions.set(e,t)}getSession(e){return this.sessions.get(e)}async clearSoftDeletedLocalSessions(e){for(let t of this.sessions.values())t.softDeleted===!0&&t.local===!0&&await this.removeSession(t.metadata.sessionId,e)}hasActiveLocalSession(){for(let e of this.sessions.values())if(e.local===!0)return!0;return!1}async removeSession(e,t){let n=this.sessions.get(e);if(n)try{await n.cleanup?.(),t.info({sessionId:e,emulatorName:n.emulatorName},"Android emulator cleaned up by removeSession")}catch(o){t.error({err:o},"Error during Android session cleanup")}finally{this.sessions.delete(e)}}async removeAllSessions(e){let t=Array.from(this.sessions.keys());await Promise.all(t.map(n=>this.removeSession(n,e)))}};function H0(r){let{logger:e,baseServer:t,globalStateManager:n,settingsFactory:o,getOrgId:i}=r,a=new pJ(t,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0,connectionStateRecovery:{maxDisconnectionDuration:60*60*1e3,skipMiddlewares:!0}}),s=async()=>{await n.removeAllSessions(e)};a.on("connection",async l=>{let u=l.id,d=e.child({sessionId:u});d.info({event:"connection",transport:l.conn.transport.name},"Android websocket connection initiated"),l.on("disconnect",async g=>{if(e.info({reason:g},"Disconnect received"),g.includes("namespace disconnect")){await D0({socket:l,globalStateManager:n,logger:d,authorization:r.authorization});return}let h=n.getSession(u);h&&(h.softDeleted=!0)});let p,m;try{let g=l.handshake.query?.testMetadata,h=ko.parse(JSON.parse(g??"")),f=h.id,y=await i({testId:f});m=await o(y,e),p=await N0({...r,orgId:y,socket:l,globalStateManager:n,logger:d,globalOrgSettings:m,testMetadata:h})}catch(g){d.error({err:g},"Failed to setup Android connection"),l.emit("error",{message:g instanceof Error?g.message:JSON.stringify(g)}),l.disconnect(!0);return}G0.forEach(g=>c(g,{...r,socket:l,metadata:p,globalOrgSettings:m,logger:d}))});let c=(l,u)=>{let d=l.createHandler(u),p=(...m)=>{l.event!=="keepalive"&&u.logger.debug({event:l.event},`Websocket event (${l.event})`);let g=h=>{u.logger.error({event:l.event,err:h instanceof Error?h:new Error(`${h}`)},"Unhandled exception in socket handler"),u.socket.emit("error",{message:h instanceof Error?h.message:typeof h=="string"?h:JSON.stringify(h)})};try{let h=d.apply(this,m);h&&typeof h.catch=="function"&&h.catch(g)}catch(h){g(h)}};u.socket.on(l.event,p)};return{server:a,dispose:s}}import kJ from"path";var Qp=new Zp;import{Router as hJ}from"express";import{existsSync as fJ}from"fs";import SJ from"path";import{hostname as gJ}from"os";var Db="0.35.3",Ze=ps({app:"mobile-desktop-server",hostname:gJ(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:Db});(async()=>{try{let r=await mu(Ze);r.gitBranchName&&Ze.addBinding("branch",r.gitBranchName)}catch{}})();var kb=hJ();kb.get("/",De(async(r,e)=>{let t=Ir();if(!t){e.status(500).json({message:"API client not initialized"});return}let n=await t.getAndroidAssets();e.status(200).json(n)}));kb.post("/upload-url",De(async(r,e)=>{let t;try{t=rR.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Ir();if(!n){e.status(500).json({error:"API client not initialized"});return}let o=SJ.resolve(t.filePath);if(!fJ(o)){e.status(400).json({error:`File not found: ${o}`});return}await Pm({tag:t.tag,channel:t.channel,filePath:o,apiClient:n,logger:Ze}),e.sendStatus(204)}));var W0=kb;import{Router as EJ}from"express";import{Router as yJ}from"express";import j0 from"fs";import bJ from"path";var sl=yJ();async function eg(r){return(await iL(r,Ze)).map(n=>{let o=r.mobileModules[n.moduleId];if(!o){I.warn(`Found a dangling mobile module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}sl.get("/",De(async(r,e)=>{let t=je(),n=await Qt(t),o=await eg(n);e.status(200).json(o)}));sl.get("/tests-join",De(async(r,e)=>{let t=je(),n=await Qt(t),o=await eg(n),i={};for(let s of o)i[s.id]={...s,tests:[]};let a=await Promise.all(Object.values(n.mobileTests).map(async s=>({id:s.id,name:s.name,relativePath:s.relativePath,test:await yo(s.fullFilePath,Ze,n)})));for(let{id:s,name:c,relativePath:l,test:u}of a){let d=new Set;$S({steps:u.steps,onPreset:()=>!1,onModule:p=>(d.add(p.moduleId),!1)});for(let p of d){let m=i[p];m&&m.tests.push({id:s,name:c,relativePath:l})}}e.status(200).json(i)}));sl.get("/:moduleId",De(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await Qt(je()),n=t.mobileModules[r.params.moduleId];if(!n){e.status(404).json({error:"Mobile module not found."});return}try{let o=await qy(n,t,I);e.json(o)}catch(o){e.status(400).json({err:o})}}));sl.patch("/:moduleId/metadata",De(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=oR.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=je(),o=await Qt(n);nL({moduleId:r.params.moduleId,patch:t,momenticFiles:o,logger:I,project:n}),e.status(201).json({message:"ok"})}));sl.post("/",De(async(r,e)=>{let t;try{t=iR.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}try{Io(t.name)}catch(c){e.status(400).json({error:`Invalid module name: ${c}`});return}let n=je(),i=(await Qt(n)).mobileModules;if(Object.values(i).find(c=>c.name===t.name)){e.status(400).json({error:`A mobile module with the name "${t.name}" already exists. Please choose a different name.`});return}let a=bJ.join(n.rootDir,t.folderPath??"");if(!j0.existsSync(a)||!j0.statSync(a).isDirectory()){e.status(400).json({error:`The folder configured for mobile module creation does not exist: ${a}`});return}let s=await oL({...t,folder:a,project:n});e.status(201).json(s)}));var V0=sl;var $0=EJ();$0.get("/",De(async(r,e)=>{let t=je(),n=await Qt(t),o=await eg(n),i=new Set;n?.mobileTests&&Object.values(n.mobileTests).forEach(l=>{l.labels?.forEach(u=>i.add(u))});let a=Array.from(i).sort(),s=Object.values(n.mobileTests),c={labels:a,modules:o,tests:s};e.status(200).json(c)}));var q0=$0;import{Router as TJ}from"express";var tg=TJ();tg.get("/",De((r,e)=>{let t=VO(je(),Ze);e.status(200).json(t)}));tg.get("/names",De((r,e)=>{let n=je().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));tg.post("/",De((r,e)=>{let t;try{t=nR.parse(r.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{Io(t.name)}catch(s){e.status(400).json({error:`Invalid environment name: ${s}`});return}let n=je();if(n.config.environments?.find(s=>s.name===t.name)){e.status(400).json({error:`An environment with the name "${t.name}" already exists. Please choose a different name.`});return}let i={...n.config,environments:[...n.config.environments??[],{name:t.name}]};n.config=i,_p(i,n.configFilePath);let a=ga(t.name,n,Ze);e.status(201).json(a)}));var K0=tg;import{Router as vJ}from"express";var Y0=vJ();Y0.get("/",(r,e)=>{e.status(200).json({userId:Kp(),orgId:Jn(),cliVersion:Db??"0.0.0"})});var X0=Y0;import{Router as AJ}from"express";var J0=AJ();J0.get("/",De(async(r,e)=>{let t=r.query.sessionId;if(!t){e.status(400).json({packages:[]});return}let n=Qp.getSession(t);if(!n?.controller){e.status(200).json({packages:[]});return}try{let a=(await n.controller.executeRawADBCommand("shell pm list packages -3"))?.split(`
4650
+ `;import{tool as H3}from"ai";import{randomUUID as W3}from"crypto";import j3 from"zod";import{tool as z3}from"ai";import G3 from"zod";var Pb="get_emulator_state";var x0=r=>{let e=z3({description:"Get the current state of the emulator (XML + screenshot)",inputSchema:G3.object({}),toModelOutput:t=>t,execute:async()=>{let{controller:t,logger:n,contextManager:o}=r;return o.recordGenericToolCall(Pb),n.info("AI action tool called (get_emulator_state)"),Ob(t)}});return{name:Pb,tool:e}};async function Ob(r){let e=await r.getEmulatorDomState(),t=await r.getScreenshotBase64();return{type:"content",value:[{type:"text",text:"<emulatorXml>"},{type:"text",text:e},{type:"text",text:"</emulatorXml>"},{type:"text",text:"<screenshot>"},{type:"media",data:t,mediaType:"image/png"},{type:"text",text:"</screenshot>"}]}}var _0=r=>({name:"create_execute_step",tool:H3({description:"Create and immediately execute a new Momentic step in the Android emulator, returning the result from the step and the state of the emulator after the step finished executing.",inputSchema:j3.object({step:Wh}),toModelOutput:t=>t,execute:async({step:t})=>{let{contextManager:n,logger:o,controller:i}=r;o.info({step:t},"AI action tool called (create_execute_step)");let a=pA(t),s={id:W3(),type:"MOBILE_PRESET_STEP",command:a},c=await n.createAndExecuteStep(s);c.status==="SUCCESS"&&i.optionsCopy?.emulator?.waitForStability&&await i.waitForPageSourceStability({reason:"Waiting for stability after executing AI-generated sub-step"});let l={...c,trace:void 0,beforeSnapshot:void 0,afterSnapshot:void 0},u=await Ob(i);return{type:"content",value:[{type:"text",text:"<result>"},{type:"text",text:JSON.stringify(l,null,2)},{type:"text",text:"</result>"},{type:"text",text:"<stateAfter>"},...u.value,{type:"text",text:"</stateAfter>"}]}}})});import{tool as V3}from"ai";import Lb from"zod";var M0=r=>{let e=V3({description:"Signal that the AI action has reached a terminal state (either success or failure).",inputSchema:Lb.object({message:Lb.string(),success:Lb.boolean()}),toModelOutput:t=>t,execute:async({message:t,success:n})=>{let{contextManager:o,logger:i}=r;return i.info({message:t,success:n},"AI action tool called (finish)"),o.finalState={message:t,status:n?"SUCCESS":"FAILED"},{type:"content",value:[{type:"text",text:"Done"}]}}});return{name:_u,tool:e}};var I0=[_0,x0,M0];function P0(r){let{logger:e,controller:t,contextManager:n,aiActionSessionId:o}=r,i={};for(let c of I0){let l=c({contextManager:n,logger:e,controller:t});i[l.name]=l.tool}let a=t.generator.getAnthropicModelFactory({logger:e,sessionId:o,streamType:"ai-action-tool-based"}),s=c=>{let{messages:l}=c,u=!1;for(let d=l.length-1;d>=0;d--){let p=l[d];for(let m of p.content)if(!(typeof m!="object"||!("type"in m))&&!(m.type!=="tool-result"||m.output.type!=="content")&&!(m.output.value.length<3))for(let g=0;g<m.output.value.length;g++){let h=m.output.value[g];if(h.type==="text"&&h.text.includes("<emulatorXml>"))if(u){let f=m.output.value[g+1];f.type==="text"?f.text="TRUNCATED DUE TO CONVERSATION LENGTH":e.warn({msg:f},"Got unexpected part when truncating emulator state message")}else{u=!0;continue}}}return c};return{model:a("claude-haiku-4-5-20251001"),tools:i,prepareStep:s,stopWhen:[q3(15),$3(_u)],system:C0(!1)}}async function O0(r){let e=Date.now(),{controller:t,logger:n}=r.fixtures;try{return await X3(r)}catch(o){let i=t.isAborted()||o instanceof DOMException&&o.name==="AbortError";return i||n.error({err:o},"Failed to execute mobile AI action"),{...r.aiActionParams.step,steps:[],type:"MOBILE_AI_ACTION_STEP",startTime:e,endTime:Date.now(),status:i?"CANCELLED":"FAILED",message:i?"Step cancelled.":`${o}`}}}async function X3(r){let{platform:e}=r,{step:t,stepTracer:n,executeMobileStepList:o}=r.aiActionParams,{controller:i,logger:a}=r.fixtures,{step:s}=r.callbacks,c=await n.startSubSteps(),l=Y3(),u=a.child({stepId:t.id,aiActionSessionId:l}),d=Date.now();if(e!=="ANDROID"||!(i instanceof ai))throw new R("UserConfigurationError","AI action steps are only supported on Android platform.");let p=async(y,E)=>{let b=await o({...r,listParams:{steps:[y],tracer:c,containerName:`AI action sub-step ${E}`}});if(b.results.length!==1)throw new R("InternalWebAgentError","Expected exactly one result from executeMobileStepList");return b.results[0]},m={stepId:t.id,parentStepIdChain:n.getParentStepIdChain()},g=new Yp({controller:i,callbacks:{onAiActionEvent:s?.onAiActionEvent,executeStep:p},logger:u,rootStep:m}),h=P0({controller:i,logger:u,contextManager:g,aiActionSessionId:l}),f=K3({...h,messages:[{role:"user",content:t.text}],abortSignal:i.abortSignal});for await(let y of f.fullStream)switch(i.throwIfAborted(),y.type){case"text-delta":s?.onAiActionEvent?.({type:"LLM_TEXT_OUTPUT",text:y.text,rootStep:m})}if(await f.response,i.throwIfAborted(),!g.finalState)throw new R("InternalWebAgentError","The AI agent never reached a final state. This could be because the maximum number of steps was reached.");return{...t,status:g.finalState.status,startTime:d,endTime:Date.now(),message:g.finalState.message,steps:g.results}}var Z3=60*60*1e3;async function vu(r){let{fixtures:e,inputs:t,listParams:n,work:o}=r,{containerName:i,steps:a,tracer:s}=n,{logger:c,controller:l,usageTracker:u}=e,d=s.getParentStepIdChain(),p=[],m,g="SUCCESS",h,{fromStep:f,toStep:y}=t;for(let E=0;E<a.length;E++){let b=a[E];if(b.skipped)continue;if(o.fastForwardingToStep&&f){let C=JSON.stringify(d);if(b.id===f.fromStepId&&C===JSON.stringify(f.parentStepIdChain))o.fastForwardingToStep=!1;else if(!aI({currentStep:b,currentParentChain:d,desiredStepId:f.fromStepId,desiredStepParentChain:f.parentStepIdChain}))continue}let _=0,M=1,O=Date.now();b.retries&&b.retries>0&&(M+=b.retries);let v=[];for(;_<M&&Date.now()-O<Z3;){_++;let C=`Executing step index ${E} in ${i} - ${ra(b)}`;_!==1&&(C+=` (attempt ${_})`),c.info({step:b},C);let F=Date.now(),P=await s.startStep({logger:c,step:b,attempt:_,parentStepIdChain:d});u.trackStepExecution(b);let B=J3(b),D=await Q3({step:b,stepTracer:P,params:r}),{trace:ee}=await P.finish({parentStepIdChain:d,result:D});if(D.trace=ee,C=`Finished step index ${E} in ${i} - ${ra(b)}`,_!==1&&(C+=` (attempt ${_})`),c.info({step:{id:b.id},trace:D.trace,status:D.status},C),D.status==="FAILED"&&_<M){v.push(D),Date.now()-F<1e3&&await J(1e3-(Date.now()-F));continue}if(v.length>0&&(D.previousAttempts=v),p.push(D),h=await eJ({result:D,step:b,originalStep:B,steps:a,currentStepIndex:E,params:r,stepTracer:P,isLastAttempt:_===M,results:p}),D.status!=="SUCCESS"&&h!=="SUCCESS")return g=D.status,m=D,{results:p,status:g,terminalResult:m};if(b.envKey&&l.context.setVariable(b.envKey,D.data),y){let K=JSON.stringify(d);if(b.id===y.toStepId&&K===JSON.stringify(y.parentStepIdChain))return o.shouldStopExecuting=!0,{results:p,status:g,terminalResult:m}}if(o.shouldStopExecuting)return{results:p,status:g,terminalResult:m};break}}return{results:p,status:g,terminalResult:m}}async function Q3({step:r,params:e,stepTracer:t}){let{fixtures:n,inputs:o,callbacks:i,work:a}=e,s;switch(r.type){case"MOBILE_PRESET_STEP":{s=await R0({platform:e.platform,fixtures:n,inputs:o,step:r,stepTracer:t,callbacks:i,work:a});break}case"RESOLVED_MOBILE_MODULE":{s=await v0({...e,moduleParams:{step:r,stepTracer:t,executeMobileStepList:vu}});break}case"MOBILE_AI_ACTION_STEP":{let c=a.state.failureRecoveryDisabled;c||(a.state.failureRecoveryDisabled=!0);try{s=await O0({...e,aiActionParams:{step:r,stepTracer:t,executeMobileStepList:vu}})}finally{c||(a.state.failureRecoveryDisabled=c)}break}}return s}async function eJ({result:r,step:e,originalStep:t,steps:n,currentStepIndex:o,params:i,stepTracer:a,isLastAttempt:s,results:c}){let l,u;if(s&&r.status==="FAILED"&&!i.work.state.failureRecoveryDisabled){let d=await T0({...i,stepTracer:a,step:e,steps:n,currentStepIndex:o,isLastAttempt:s,executeMobileStepList:vu,failedStep:t,nextSteps:n.slice(o+1),results:c.concat(r)});d&&(d.type==="ATTEMPTED"?(l=d.result.results,u=d.status):d.type==="NOT_ELIGIBLE"&&(r.message=r.message?`${r.message} ${d.message}`:d.message),r.type==="MOBILE_PRESET_STEP"&&(r.failureRecoveryStatus={type:d.type,message:d.message}))}return l&&c.push(...l),u}import{diff as tJ}from"deep-object-diff";import{cloneDeep as rJ}from"lodash-es";async function il(r){let{tracer:e,containerName:t}=r,{steps:n,testMetadata:o}=r.inputs,{cacheStorage:i,logger:a}=r.fixtures,s=a.child({testId:r.inputs.testMetadata.id,testName:r.inputs.testName});await i.populateCacheForRun({logger:s,platform:o.platform,testId:o.id,stepLists:{steps:n},skipFetchingCacheFromStorage:r.inputs.interactive});let c=rJ(n);s.info({testMetadata:ko.parse(o)},"Starting mobile test");let l=await e.startMainStepList(),u=Rw(s);s.info({cpu:u?.cpuMetadata,platform:u?.platform},`Starting execution of ${t}`);let{status:d,results:p,terminalResult:m}=await vu({...r,listParams:{containerName:t,tracer:l,steps:c}});return clearInterval(u?.interval),await nJ({steps:n,stepsToExecute:c,logger:s,cacheStorage:i,orgId:r.inputs.orgId,testId:o.id,platform:o.platform}),d==="SUCCESS"?{status:"PASSED",results:p,failureRecoveryDetails:r.work.state.failureRecoveryAttempts?{attempts:r.work.state.failureRecoveryAttempts}:void 0}:d==="CANCELLED"?{status:"CANCELLED",results:p}:{status:"FAILED",results:p,terminalResult:m}}async function nJ({steps:r,stepsToExecute:e,logger:t,cacheStorage:n,orgId:o,testId:i,platform:a}){let s=tJ(r,e);if(s&&Object.keys(s).length>0){t.info({diffs:ns(s)},"Saving mobile step cache entries");let{cachesToSave:c}=await Gn({platform:a,steps:e,cacheCreationParams:{orgId:o,testId:i}});await n.saveEntries({logger:t,testId:i,entries:c})}else t.info("No cache entries to update")}import{Server as pJ}from"socket.io";import{tmpdir as oJ}from"os";import L0 from"path";async function N0({socket:r,logger:e,orgId:t,testMetadata:n,globalOrgSettings:o,androidDriverFactory:i,mobileGeneratorFactory:a,browserGeneratorFactory:s,browserEnricherFactory:c,storageFactory:l,localToolsFactory:u,globalStateManager:d,getGitMetadata:p}){let m=r.id,g=await p(),h=r.handshake.query?.fileName,f=h?L0.basename(h,".test.yaml"):"",y=n.id,E=n.settings?.defaultChannel,b=n.settings?.defaultTag;e=e.child({sessionId:m,testId:y,orgId:t,branch:g.gitBranchName});let _=await l(t),M=n.settings?.defaultEnv,O={};M&&(O=(await _.fetchEnvironment(M,e))?.variables??{});let v=is.parse(O[Ii]),C=is.parse(O[kl]),F={...o.emulator,...n.settings?.emulator},P=n.settings?.defaultApkFilePath?.trim()||C,B=d.getSession(m);if(B){if(e.info("Reconnecting to existing Android session"),B.local)return r.emit("session",B.metadata),B.softDeleted=!1,B.metadata;throw new Error("Restoring existing remote emulator sessions is not supported. Please reconnect to a new emulator.")}let D;if(F.region==="local"){if(await d.clearSoftDeletedLocalSessions(e),d.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");let Si=n.settings?.emulator?.localEmulatorSettings?.avdId?.trim()||v;if(!Si)throw new Error(`AVD ID is required when using a local emulator. Set it on the test (Options \u2192 Emulator \u2192 Local AVD ID) or on the environment via ${Ii}.`);D={avdId:Si,apkToInstall:E?{channel:E,tag:b}:void 0,apkFilePath:P}}else D={region:F.region,apkToInstall:E?{channel:E,tag:b}:void 0,osVersion:F.remoteEmulatorSettings?.androidVersion};let ee=Date.now(),{driver:K,cleanup:ge,emulatorName:U,adbPort:W,limbarClient:ue,limbarToken:le,limbarUrl:Ge,playwrightDevice:ve}=await i({socket:r,logger:e,creationOpts:D}),q=L0.join(oJ(),`logcat-logs-${t}-${y}-${m}.txt`),fe=await Om({driver:K,onLogs:Si=>{r.emit("logcatLogs",Si)},logFilePath:q});e.info({adbPort:W,apkChannel:E,apkTag:b,duration:Date.now()-ee,emulatorName:U},"Android emulator session initiated"),e=e.child({emulator:U});let it=await a(t,e),Ae=await s(t,e),x=await c(t,e),ne=u?await u(t):void 0,pe=new Do({variablesFromEnvironment:O,envName:M,testName:f}),Br=await ai.init({driver:K,generator:it,logger:e,limbarClient:ue,playwrightDevice:ve,aiSettings:{...o.ai,useMemory:o.ai?.useMemory!==!1,...n.settings?.ai},options:{emulator:{...F,browserSettings:o.browser}},fixtures:{storage:_,browserEnricher:x,browserGenerator:Ae,localCodeEvalTools:ne,testContext:pe},orgId:t,adbPort:W,abortController:new AbortController}),fi=await Br.getViewportBounds();if(!r.connected)throw await Br.cleanup(),await fe(),await ge(),new Error("Socket not connected anymore, not proceeding with Android session setup");let KD=iJ({socket:r,testContext:pe}),YD=async()=>{clearInterval(KD);try{await Promise.allSettled([Br.cleanup(),fe(),ge()])}catch(Si){e.warn({err:Si},"Failed to clean up emulator in socket server")}},ie={sessionId:m,testId:y,orgId:t,emulatorName:U,testName:f,limbarUrl:Ge,limbarToken:le,viewportBounds:fi};return d.registerSession(m,{controller:Br,cleanup:YD,emulatorName:U,local:F.region==="local",metadata:ie,logFilePath:q}),r.emit("session",ie),ie}function iJ({socket:r,testContext:e}){return setInterval(()=>{let t=e.toEditorDisplayCopy();r.emit("emulatorState",{context:t})},3e3)}import Xp from"fs/promises";async function D0({socket:r,logger:e,globalStateManager:t,authorization:n}){let o=r.id,i=t.getSession(o);i&&n&&i.logFilePath&&aJ({testId:i.metadata.testId,sessionId:o,logFilePath:i.logFilePath,authorization:n,logger:e}),await t.removeSession(o,e)}async function aJ({testId:r,sessionId:e,logFilePath:t,authorization:n,logger:o}){try{let i;try{i=await Xp.stat(t)}catch{o.debug({logFilePath:t},"No logcat file found to upload");return}if(i.size===0){o.debug({logFilePath:t},"Logcat file is empty, skipping upload"),await Xp.unlink(t);return}let a=new Mr(n),{uploadUrl:s}=await a.generateMobileLogcatUploadUrl({testId:r,sessionId:e}),c=await Xp.readFile(t),l=await fetch(s,{headers:{"Content-Length":c.length.toString(),"Content-Type":"text/plain"},method:"PUT",body:c});if(l.status!==200)throw new Error(`Failed to upload logcat: ${l.status} ${await l.text()}`);o.info({testId:r,sessionId:e},"Logcat file uploaded successfully")}catch(i){o.warn({err:i,testId:r,sessionId:e},"Failed to upload logcat file")}finally{try{await Xp.unlink(t)}catch(i){o.warn({err:i,logFilePath:t},"Failed to delete temp logcat file")}}}var sJ=({socket:r,globalStateManager:e})=>async()=>{let t=e.getSession(r.id);if(!t)throw new Error("No active Android session found");t.controller.abort()},k0={event:"cancel",createHandler:sJ};var lJ=({logger:r,globalStateManager:e,socket:t})=>async(n,o)=>{let i=e.getSession(t.id);if(!i){o({err:"No active Android session found"});return}try{let s=await i.controller.getEmulatorDomState();o({screenXml:s})}catch(a){r.error({err:a},"Error fetching screen XML from the session controller"),o({err:a.message})}},F0={event:"fetchScreenXml",createHandler:lJ};var Nb=class{parentTracer;socket;step;orgId;interactionTracer;constructor({step:e,socket:t,parentTracer:n,orgId:o}){this.socket=t,this.parentTracer=n,this.step=e,this.orgId=o,this.interactionTracer=new Zo,nn.initializeRootTracerContext(this.interactionTracer)}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeXmlSnapshot(){}attachAfterXmlSnapshot(){}recordStepDuration(e){let{durationMs:t,step:n}=e,o=n.type!=="MOBILE_PRESET_STEP"?n.type:n.command.type;nt.distribution("test_step_duration",t,[`type:${o}`,"platform:mobile","executor:editor",`orgId:${this.orgId}`])}async finish(e){this.interactionTracer.finish();let t=this.interactionTracer.getRootSpan(),n={...lw.parse(e),trace:Xh.parse(t)};switch(n.result.status){case"SUCCESS":this.socket.emit("success",n);break;case"FAILED":this.socket.emit("failure",n);break;case"CANCELLED":this.socket.emit("cancelled",n);break}return{trace:t}}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}async startSubSteps(){return new al({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},al=class{parentTracer;parentStep;socket;orgId;constructor({parentStep:e,socket:t,parentTracer:n,orgId:o}){this.parentTracer=n,this.parentStep=e,this.socket=t,this.orgId=o}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:e.parentStepIdChain,attempt:e.attempt}),new Nb({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId})}async getScreenshot(e){}},Jp=class{constructor(e,t){this.socket=e;this.orgId=t}appendLogs(){}async finish(){this.socket.emit("finished")}async startBeforeStepList(){return new al({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId})}async startMainStepList(){return new al({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId})}async startAfterStepList(){return new al({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId})}};var cJ=({metadata:r,logger:e,globalStateManager:t,socket:n,cacheStorageFactory:o,getGitMetadata:i})=>async(a,s)=>{let c=t.getSession(n.id);if(!c)throw new Error("No active Android session found");if(a.testMetadata.platform!=="ANDROID")throw new Error("Non-android tests aren't supported yet");let l=await i(),u=e.child({testId:a.testMetadata.id,branch:l.gitBranchName}),d=await o(r.orgId,l),p=c.controller;p.resetAbortController();let m=new Jp(n,r.orgId),g=await il({platform:"ANDROID",work:{fastForwardingToStep:!!a.fromStep,state:{failureRecoveryDisabled:!0,failureRecoveryAttempts:0}},fixtures:{controller:p,logger:u,cacheStorage:d,usageTracker:new ud},containerName:"entire test",inputs:{steps:a.steps,fromStep:a.fromStep,toStep:a.toStep,orgId:r.orgId,testName:r.testName,testMetadata:a.testMetadata,interactive:!0},tracer:m,callbacks:{step:{onAiActionEvent:f=>{n.emit("aiActionEvent",f)}}}});await m.finish();let h={results:yr.array().parse(g.results),status:g.status};s?.(h)},U0={event:"execute",createHandler:cJ};import{debounce as uJ}from"ts-debounce";var dJ=({socket:r,globalStateManager:e,keepSessionAlive:t})=>{let n=uJ(t,3e4,{maxWait:6e4});return async()=>{let o=e.getSession(r.id);if(!o)throw new Error("No active Android session found");o.emulatorName&&(o.local||n(o.emulatorName))}},B0={event:"keepalive",createHandler:dJ};var mJ=({socket:r,globalStateManager:e,logger:t})=>async(n,o)=>{let i=e.getSession(r.id);if(!i){let s="No active Android session found";t.error(s),o?.({success:!1,err:s});return}let a=i.controller;a.abort(),a.resetAbortController(),t.info("Resetting emulator state");try{await a.softReset(),t.info("Emulator reset completed"),o?.({success:!0,message:"Emulator reset successfully"})}catch(s){let c=s instanceof Error?s.message:String(s);t.error({err:s},"Failed to reset emulator"),o?.({success:!1,err:`Failed to reset emulator: ${c}`})}},z0={event:"reset",createHandler:mJ};var G0=[U0,k0,z0,B0,F0];var Zp=class{sessions=new Map;registerSession(e,t){this.sessions.set(e,t)}getSession(e){return this.sessions.get(e)}async clearSoftDeletedLocalSessions(e){for(let t of this.sessions.values())t.softDeleted===!0&&t.local===!0&&await this.removeSession(t.metadata.sessionId,e)}hasActiveLocalSession(){for(let e of this.sessions.values())if(e.local===!0)return!0;return!1}async removeSession(e,t){let n=this.sessions.get(e);if(n)try{await n.cleanup?.(),t.info({sessionId:e,emulatorName:n.emulatorName},"Android emulator cleaned up by removeSession")}catch(o){t.error({err:o},"Error during Android session cleanup")}finally{this.sessions.delete(e)}}async removeAllSessions(e){let t=Array.from(this.sessions.keys());await Promise.all(t.map(n=>this.removeSession(n,e)))}};function H0(r){let{logger:e,baseServer:t,globalStateManager:n,settingsFactory:o,getOrgId:i}=r,a=new pJ(t,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0,connectionStateRecovery:{maxDisconnectionDuration:60*60*1e3,skipMiddlewares:!0}}),s=async()=>{await n.removeAllSessions(e)};a.on("connection",async l=>{let u=l.id,d=e.child({sessionId:u});d.info({event:"connection",transport:l.conn.transport.name},"Android websocket connection initiated"),l.on("disconnect",async g=>{if(e.info({reason:g},"Disconnect received"),g.includes("namespace disconnect")){await D0({socket:l,globalStateManager:n,logger:d,authorization:r.authorization});return}let h=n.getSession(u);h&&(h.softDeleted=!0)});let p,m;try{let g=l.handshake.query?.testMetadata,h=ko.parse(JSON.parse(g??"")),f=h.id,y=await i({testId:f});m=await o(y,e),p=await N0({...r,orgId:y,socket:l,globalStateManager:n,logger:d,globalOrgSettings:m,testMetadata:h})}catch(g){d.error({err:g},"Failed to setup Android connection"),l.emit("error",{message:g instanceof Error?g.message:JSON.stringify(g)}),l.disconnect(!0);return}G0.forEach(g=>c(g,{...r,socket:l,metadata:p,globalOrgSettings:m,logger:d}))});let c=(l,u)=>{let d=l.createHandler(u),p=(...m)=>{l.event!=="keepalive"&&u.logger.debug({event:l.event},`Websocket event (${l.event})`);let g=h=>{u.logger.error({event:l.event,err:h instanceof Error?h:new Error(`${h}`)},"Unhandled exception in socket handler"),u.socket.emit("error",{message:h instanceof Error?h.message:typeof h=="string"?h:JSON.stringify(h)})};try{let h=d.apply(this,m);h&&typeof h.catch=="function"&&h.catch(g)}catch(h){g(h)}};u.socket.on(l.event,p)};return{server:a,dispose:s}}import kJ from"path";var Qp=new Zp;import{Router as hJ}from"express";import{existsSync as fJ}from"fs";import SJ from"path";import{hostname as gJ}from"os";var Db="0.35.4",Ze=ps({app:"mobile-desktop-server",hostname:gJ(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:Db});(async()=>{try{let r=await mu(Ze);r.gitBranchName&&Ze.addBinding("branch",r.gitBranchName)}catch{}})();var kb=hJ();kb.get("/",De(async(r,e)=>{let t=Ir();if(!t){e.status(500).json({message:"API client not initialized"});return}let n=await t.getAndroidAssets();e.status(200).json(n)}));kb.post("/upload-url",De(async(r,e)=>{let t;try{t=rR.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Ir();if(!n){e.status(500).json({error:"API client not initialized"});return}let o=SJ.resolve(t.filePath);if(!fJ(o)){e.status(400).json({error:`File not found: ${o}`});return}await Pm({tag:t.tag,channel:t.channel,filePath:o,apiClient:n,logger:Ze}),e.sendStatus(204)}));var W0=kb;import{Router as EJ}from"express";import{Router as yJ}from"express";import j0 from"fs";import bJ from"path";var sl=yJ();async function eg(r){return(await iL(r,Ze)).map(n=>{let o=r.mobileModules[n.moduleId];if(!o){I.warn(`Found a dangling mobile module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}sl.get("/",De(async(r,e)=>{let t=je(),n=await Qt(t),o=await eg(n);e.status(200).json(o)}));sl.get("/tests-join",De(async(r,e)=>{let t=je(),n=await Qt(t),o=await eg(n),i={};for(let s of o)i[s.id]={...s,tests:[]};let a=await Promise.all(Object.values(n.mobileTests).map(async s=>({id:s.id,name:s.name,relativePath:s.relativePath,test:await yo(s.fullFilePath,Ze,n)})));for(let{id:s,name:c,relativePath:l,test:u}of a){let d=new Set;$S({steps:u.steps,onPreset:()=>!1,onModule:p=>(d.add(p.moduleId),!1)});for(let p of d){let m=i[p];m&&m.tests.push({id:s,name:c,relativePath:l})}}e.status(200).json(i)}));sl.get("/:moduleId",De(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await Qt(je()),n=t.mobileModules[r.params.moduleId];if(!n){e.status(404).json({error:"Mobile module not found."});return}try{let o=await qy(n,t,I);e.json(o)}catch(o){e.status(400).json({err:o})}}));sl.patch("/:moduleId/metadata",De(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=oR.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=je(),o=await Qt(n);nL({moduleId:r.params.moduleId,patch:t,momenticFiles:o,logger:I,project:n}),e.status(201).json({message:"ok"})}));sl.post("/",De(async(r,e)=>{let t;try{t=iR.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}try{Io(t.name)}catch(c){e.status(400).json({error:`Invalid module name: ${c}`});return}let n=je(),i=(await Qt(n)).mobileModules;if(Object.values(i).find(c=>c.name===t.name)){e.status(400).json({error:`A mobile module with the name "${t.name}" already exists. Please choose a different name.`});return}let a=bJ.join(n.rootDir,t.folderPath??"");if(!j0.existsSync(a)||!j0.statSync(a).isDirectory()){e.status(400).json({error:`The folder configured for mobile module creation does not exist: ${a}`});return}let s=await oL({...t,folder:a,project:n});e.status(201).json(s)}));var V0=sl;var $0=EJ();$0.get("/",De(async(r,e)=>{let t=je(),n=await Qt(t),o=await eg(n),i=new Set;n?.mobileTests&&Object.values(n.mobileTests).forEach(l=>{l.labels?.forEach(u=>i.add(u))});let a=Array.from(i).sort(),s=Object.values(n.mobileTests),c={labels:a,modules:o,tests:s};e.status(200).json(c)}));var q0=$0;import{Router as TJ}from"express";var tg=TJ();tg.get("/",De((r,e)=>{let t=VO(je(),Ze);e.status(200).json(t)}));tg.get("/names",De((r,e)=>{let n=je().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));tg.post("/",De((r,e)=>{let t;try{t=nR.parse(r.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{Io(t.name)}catch(s){e.status(400).json({error:`Invalid environment name: ${s}`});return}let n=je();if(n.config.environments?.find(s=>s.name===t.name)){e.status(400).json({error:`An environment with the name "${t.name}" already exists. Please choose a different name.`});return}let i={...n.config,environments:[...n.config.environments??[],{name:t.name}]};n.config=i,_p(i,n.configFilePath);let a=ga(t.name,n,Ze);e.status(201).json(a)}));var K0=tg;import{Router as vJ}from"express";var Y0=vJ();Y0.get("/",(r,e)=>{e.status(200).json({userId:Kp(),orgId:Jn(),cliVersion:Db??"0.0.0"})});var X0=Y0;import{Router as AJ}from"express";var J0=AJ();J0.get("/",De(async(r,e)=>{let t=r.query.sessionId;if(!t){e.status(400).json({packages:[]});return}let n=Qp.getSession(t);if(!n?.controller){e.status(200).json({packages:[]});return}try{let a=(await n.controller.executeRawADBCommand("shell pm list packages -3"))?.split(`
4651
4651
  `).filter(s=>s.trim().startsWith("package:")).map(s=>s.replace("package:","").trim()).filter(s=>s.length>0&&!s.startsWith("io.appium"))||[];e.status(200).json({packages:a})}catch(o){Ze.error({err:o},"Error fetching installed packages from the session controller"),e.status(200).json({packages:[]})}}));var Z0=J0;import{Router as RJ}from"express";var Fb=RJ(),wJ=async({steps:r,cacheStorage:e,stepId:t,parentStepIdChain:n,testId:o})=>{let{result:i}=KS(r,t,n);if(i)return await e.getCacheKeyForStep({logger:Ze,testId:o,parentStepIdChain:n,step:i})};Fb.patch("/",De(async(r,e)=>{let t=je(),n=Jn(),o=Ir();if(!o){e.status(500).json({error:"API client not initialized"});return}let i;try{i=sR.parse(r.body)}catch(l){e.status(400).json({error:`Invalid request body: ${l}`});return}let a=await ln(Ze,o,t),s=gi({logger:Ze,orgId:n,client:o,gitMetadata:a,regenerateCache:!1,noCache:!1,alwaysSaveCache:!1}),c=await wJ({cacheStorage:s,steps:i.steps,stepId:i.stepId,parentStepIdChain:i.parentStepIdChain,testId:i.testId});if(!c){e.status(400).json({error:"Cache-supporting step not found"});return}await o.updateMobileStepCaches({entries:[{key:c,organizationId:n,value:i.value,testId:i.testId}],testId:i.testId},fc(a)),e.status(204).send()}));Fb.post("/traces",De(async(r,e)=>{let t=Ir();if(!t){e.status(500).json({error:"API client not initialized"});return}let n;try{n=_d.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o=await t.getMobileStepCacheMemoryTraces(n);e.status(200).json(o)}));var Q0=Fb;import{Router as CJ}from"express";import Ub from"fs";import hi from"path";import{v4 as xJ}from"uuid";import _J from"yaml";var ll=CJ();ll.patch("/:testPath",De(async(r,e)=>{let t=r.params.testPath;if(!t){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=eR.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}if(n.steps===void 0&&n.settings===void 0&&n.labels===void 0){e.status(400).json({error:"At least one of steps, settings, or labels is required"});return}let o=je(),i=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,a=await Qt(o);await sL({filePath:i,steps:n.steps,settings:n.settings,labels:n.labels,folder:o.rootDir,project:o,momenticFiles:a,schemaVersion:Mo});let s={message:"ok"};e.status(200).json(s)}));ll.post("/",De((r,e)=>{let t;try{t=QA.parse(r.body)}catch(g){e.status(400).json({error:`Invalid request body: ${g}`});return}let{name:n,description:o,settings:i,pathSegments:a}=t;if(!n||typeof n!="string"){e.status(400).json({error:"Missing or invalid 'name' in body"});return}try{Io(n)}catch(g){e.status(400).json({error:g.message});return}let s=je(),c=hi.join(s.rootDir,...a),{fullPath:l,testId:u}=aL({name:n,description:o,steps:[],settings:i,folder:c}),d=hi.basename(l),p=hi.relative(s.rootDir,l),m={id:u,fileName:d,fullPath:l,relativeFilePath:p};e.status(201).json(m)}));ll.get("/:fileName",De(async(r,e)=>{let t=Ir(),n=Jn(),o=r.params.fileName;if(!o){e.status(400).json({error:"Missing fileName in path"});return}if(!t){e.status(500).json({error:"API client not initialized"});return}let i=o.endsWith(".test.yaml")?o:`${o}.test.yaml`,a=hi.basename(i).replace(".test.yaml",""),s=je(),c=await Qt(s),l=await yo(i,Ze,c),u=await ln(Ze,t,s);await gi({logger:Ze,orgId:n,client:t,gitMetadata:u,regenerateCache:!1,noCache:!1,alwaysSaveCache:!1}).resolveEntries({logger:Ze,platform:l.platform,testId:l.id,stepLists:{steps:l.steps}});let p={...l,name:a};e.status(200).json(p)}));ll.patch("/:testPath/metadata",De(async(r,e)=>{let t=r.params.testPath;if(!t){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=tR.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}let o=je(),i=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,s={message:"ok",newRelativeTestPath:lL(i,n,o).newRelativeTestPath};e.status(200).json(s)}));ll.post("/:testPath/duplicate",De(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=aR.parse(r.body)}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{Io(n.name)}catch(h){e.status(400).json({error:h.message});return}let o=je(),i=hi.join(o.rootDir,t);if(!Ub.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await Qt(o),s;try{s=await yo(i,Ze,a)}catch(h){e.status(400).json({error:h.message});return}let c=xJ(),{stepsToSave:l}=await Gn({...s,createNewCacheIds:!0}),u=go({fileType:Xe.MOBILE_TEST,id:c,schemaVersion:Mo,description:s.description,platform:s.platform,settings:s.settings,labels:s.labels,steps:l});MA.parse(u);let d=hi.dirname(i),p=hi.join(d,`${n.name}.test.yaml`);if(Ub.existsSync(p)){e.status(409).send("A test with this name already exists");return}let m=_J.stringify(u);Ub.writeFileSync(p,m,"utf-8");let g={relativeFilePath:hi.relative(o.rootDir,p)};e.status(201).json(g)}));var eD=ll;import{Router as MJ}from"express";var tD=MJ();tD.get("/",De((r,e)=>{let t=je(),n={ai:t.config.ai,displayRoot:t.config.displayRoot};e.status(200).json(n)}));var rD=tD;import{Router as IJ}from"express";var nD=IJ();nD.post("/traces",De(async(r,e)=>{let t=Ir();if(!t){e.status(500).json({error:"API client not initialized"});return}let n;try{n=_d.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o=await t.getWebStepCacheMemoryTraces(n);e.status(200).json(o)}));var oD=nD;var rg=class extends Zs{constructor(t,n){super(t,n);this.client=t;this.orgId=n}async fetchEnvironment(t,n){let o=je();return ga(t,o,I)}};var sD="10mb";async function lD(r){let{serverPort:e,apiKey:t,momenticServerUrl:n,staticDir:o,initialProject:i,driverLogLevel:a,regenerateCache:s,alwaysSaveCache:c,noCache:l}=r;n&&g0(n),h0({noCache:l,alwaysSaveCache:c}),await S0(t);let u=Jn(),d=Kp(),p=r.logger.child({orgId:u,userId:d});y0(i,v=>$s({configFilePath:v}));let m=aD();m.use(PJ()),m.use(iD.json({limit:sD})),m.use(iD.urlencoded({extended:!1,limit:sD}));let g=NJ();if(g.use("/folders",Mb),g.use("/entities",q0),g.use("/identify",X0),g.use("/mobile-tests",eD),g.use("/mobile-modules",V0),g.use("/mobile-cache",Q0),g.use("/web-cache",oD),g.use("/assets",W0),g.use("/git",Ib),g.use("/cache-config",_b),g.use("/environments",K0),g.use("/installed-packages",Z0),g.use("/settings",rD),m.use("/api",g),m.use((v,C,F)=>{I.debug({url:v.url,path:v.path,query:v.query,method:v.method,body:v.body,headers:v.rawHeaders,client:v.ip},"Incoming request on mobile-desktop-server"),C.on("close",()=>{C.statusCode>=400&&(I.error({url:v.url,method:v.method,statusCode:C.statusCode},"Request completed in error on mobile-desktop-server"),Ze.error({url:v.url,method:v.method,statusCode:C.statusCode},"Request completed in error on mobile-desktop-server"))}),F()}),m.use((v,C,F,P)=>{if(v instanceof Error&&v.message.includes("BadRequestError: request aborted")){F.status(400).send("Client disconnected");return}I.error({stack:v.stack,msg:v.message,err:v,url:C.url,method:C.method},"Unhandled exception leading to 500 on mobile-desktop-server"),Ze.error({stack:v.stack,msg:v.message,err:v,url:C.url,method:C.method},"Unhandled exception leading to 500 on mobile-desktop-server"),F.status(500).send(`Internal Server Error: ${v.message}`)}),o){m.use((C,F,P)=>{if(C.path==="/run-viewer"||C.path.startsWith("/run-viewer/"))return F.status(404).send("Not Found");P()});let v=aD.static(o,{setHeaders:C=>{C.setHeader("Cache-Control","no-cache")},redirect:!1});m.use(v),m.use("*",(C,F)=>{F.sendFile(kJ.join(o,"index.html"))})}let h=DJ.createServer(m),f=`http://localhost:${e}`;await new Promise(v=>{try{h.listen(e,()=>{p.info(`Mobile desktop server is running at ${f}`),v()})}catch(C){C.message.includes("EADDRINUSE")?FJ(e):I.error(`An unexpected error occurred while starting the server: ${C.message}`),process.exit(1)}});let E={type:"API_KEY",baseUrl:Cb(),apiKey:t,logger:p},b=new Mr(E),_=je(),M={...E,mode:"interactive"},{dispose:O}=H0({baseServer:h,logger:p,authorization:E,globalStateManager:Qp,getOrgId:()=>Jn(),getGitMetadata:async()=>await ln(p,b,_),androidDriverFactory:async({socket:v,logger:C,creationOpts:F})=>{let P=Math.floor(Math.random()*1e4)+4e4,B=await Xo(P,"appium");return Im({logger:C,driverLogLevel:a,apiClient:b,creationOpts:F,socket:v,appiumPort:B,sessionId:v.id,orgId:Jn(),callbacks:{onStatusUpdate:D=>{C.info({status:D},"Emulator status update"),v.emit("connectionStatusUpdate",{message:D,type:"info"})},onHeartbeatFailure:()=>{v.emit("connectionStatusUpdate",{message:"Emulator connection lost \u2014 possible ADB tunnel/emulator failure",type:"disconnected"})},onHeartbeatRestored:()=>{v.emit("connectionStatusUpdate",{message:"Emulator connection restored",type:"connected"})},onLimbarConnectionStateChange:D=>{D==="disconnected"?v.emit("connectionStatusUpdate",{message:"Emulator connection lost.",type:"disconnected"}):D==="reconnecting"||D==="connecting"?v.emit("connectionStatusUpdate",{message:"Reconnecting to emulator...",type:D==="reconnecting"?"reconnecting":"connecting"}):D==="connected"&&v.emit("connectionStatusUpdate",{message:"Emulator connection restored",type:"connected"})}}})},mobileGeneratorFactory:async v=>new tl({baseUrl:Cb(),apiKey:t,logger:p,mode:"interactive"}),browserGeneratorFactory:async v=>new ya(_.config.ai?.agentConfig,M),browserEnricherFactory:async v=>new Js(M,new ya(_.config.ai?.agentConfig,M)),storageFactory:async v=>new rg(b,v),cacheStorageFactory:async(v,C)=>gi({logger:p,orgId:v,client:b,gitMetadata:C,regenerateCache:s,noCache:l,alwaysSaveCache:c}),localToolsFactory:async()=>new el({httpClient:b,fakerSeed:_.config.advanced?.fakerConstantSeed?fd:void 0}),keepSessionAlive:v=>b.extendAndroidEmulatorTtl(v),settingsFactory:async()=>({emulator:{},ai:{},browser:{},..._.config})});process.once("SIGUSR2",async()=>{return;try{await O(),await nt.flush()}catch(v){I.error({err:v},"Error during session dispose on SIGUSR2")}try{h.close(()=>{process.kill(process.pid,"SIGUSR2")})}catch{process.kill(process.pid,"SIGUSR2")}}),process.once("SIGTERM",async()=>{let v="SIGTERM in Momentic mobile app received";I.info(v),p.info(v);try{await O(),await nt.flush()}finally{h.close(()=>process.exit(0))}}),process.once("SIGINT",async()=>{I.info("SIGINT in Momentic mobile app received");try{await O(),await nt.flush()}finally{h.close(()=>process.exit(0))}})}LJ.setMaxListeners(25);process.on("warning",r=>{Ze.warn({err:r},`Node warning received on mobile-desktop-server: ${r.message}`)});process.on("uncaughtException",r=>{Ze.error({err:r},"Uncaught exception on mobile-desktop-server"),I.error(`Oh no! The Momentic mobile desktop app encountered a fatal error \u{1F61E}. Error logs: ${r.message}`)});process.on("unhandledRejection",r=>{Ze.error({reason:`${r}`,stack:r?.stack},"Uncaught exception on mobile-desktop-server (promise rejection)"),I.error(`Oh no! The Momentic mobile desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${r}`)});function FJ(r){I.error(OJ`Port ${r} is already in use by another process. Please close the other process and try again.
4652
4652
  Using Bash on MacOS or Linux:
4653
4653
  lsof -t -i :58888 | xargs kill -9
@@ -4657,7 +4657,7 @@ Momentic users value the following:
4657
4657
  `)}import{Readable as N6}from"node:stream";import D6 from"open";import Eo,{dirname as k6,resolve as F6}from"path";import{pipeline as U6}from"stream/promises";import{fileURLToPath as cE}from"url";import Bb from"fs";import ng from"path";import{cwd as UJ}from"process";async function zb({tests:r,momenticFiles:e,project:t,yes:n,include:o,exclude:i,labels:a,logger:s,quarantinedTestsMetadata:c}){let l=new Set;if(r&&r.length>0){let d=r.some(m=>Bb.existsSync(m)),p=UJ();d?(p!==t.rootDir&&s.warn(`The current working directory ('${p}') is different from the project root directory ('${t.rootDir}'). All test path arguments will be resolved relative to the current working directory and only those tests matched by the project inclusion configuration will be ran. To avoid confusion, Momentic strongly recommends running the CLI from the project root directory or using substring filters rather than file paths.`),s.info(`Reading tests from the following local file paths:
4658
4658
  - ${r.join(`
4659
4659
  - `)}
4660
- `),r.forEach(m=>{if(!Bb.existsSync(m))throw new Error(`Path '${m}' does not exist.`);let g,h;try{g=Bb.statSync(m),h=g.isDirectory()}catch(y){s.warn({err:y},`Skipping path ${m} because it cannot be read`);return}let f=ng.resolve(m);Object.values(e.mobileTests).filter(y=>h?y.fullFilePath.startsWith(f):y.fullFilePath===f).forEach(y=>{l.add(y.fullFilePath)})})):(s.info("The arguments provided don't appear to be valid paths. Treating them as substrings instead... "),Object.values(e.mobileTests).forEach(m=>{r.some(g=>m.relativePath.includes(g))&&l.add(m.fullFilePath)}))}else{!n&&!await Rm("No test paths or substrings were provided. Do you want to run all tests?")&&(s.error("Cancelled by user."),process.exit(1));let d=Object.values(e.mobileTests);s.info(`Reading all ${d.length} mobile tests in the project from local disk.`),d.forEach(p=>{l.add(p.fullFilePath)})}for(let d of Array.from(l)){let p=ng.relative(t.rootDir,d);o&&!o.some(m=>new RegExp(m).test(p))&&l.delete(d),i&&i.some(m=>new RegExp(m).test(p))&&l.delete(d)}return(await Promise.all(Array.from(l).map(async d=>{try{let p=ng.relative(t.rootDir,d),m=await yo(d,s,e),g=ng.basename(d,".test.yaml");if(m.disabled)return null;if(a&&a.length>0){let f=m.labels||[];if(!a.some(E=>f.includes(E)))return null}let h={id:m.id,name:g,description:m.description,schemaVersion:m.schemaVersion,settings:m.settings,fullFilePath:d,relativeFilePath:p,quarantined:!!c[m.id],quarantinedMetadata:c[m.id],labels:m.labels};switch(m.platform){case"ANDROID":return{...h,platform:"ANDROID",steps:m.steps};case"IOS":return{...h,platform:"IOS",steps:m.steps};default:return(y=>{throw new Error("You missed a case in the switch above")})(m)}}catch(p){s.error(`Failed to read and resolve mobile test at '${d}': ${p}`),process.exit(1)}}))).filter(d=>!!d)}import{InvalidArgumentError as og,Option as Qe}from"@commander-js/extra-typings";import{z as BJ}from"zod";var cD=58890;function cl(r){let e=parseInt(r,10);if(isNaN(e))throw new og("Not a number.");return e}var Ea=new Qe("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").argParser(r=>{if(!r)throw new og("API key is required.");return r}).makeOptionMandatory(),ig=new Qe("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),Gb=new Qe("-f, --filter <filter>","Run tests within the project that has a name equal to the filter provided. This option cannot be used together with file path or directory arguments, but substring matches are allowed."),Ta=new Qe("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default("https://api.momentic.ai").argParser(r=>{try{return BJ.string().url().parse(r),r}catch{throw new og("Not a valid URL.")}}),Hb=new Qe("-y, --yes","Skip all confirmation prompts.").env("CI"),Wb=new Qe("--regenerate-cache","Regenerate all caches by starting from an empty cache state. This flag is useful for completely regenerating caches after changing configuration options. Warning: using this option will cause all steps to run without any cached data, resulting in significantly longer execution times."),jb=new Qe("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on protected branches.").env("CI"),Vb=new Qe("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes.").implies({saveCache:!1}),$b=new Qe("--tag <tag>","Tag identifier for the asset."),uD=new Qe("--channel <channel>","Channel name for the asset."),qb=new Qe("--channel <channel>","Channel name for the asset.").makeOptionMandatory(),dD=new Qe("--tag <tag>","Tag identifier for the asset.").makeOptionMandatory(),mD=new Qe("--env <env>","Environment to run all tests in (overrides test-level configuration)."),Au="closest",pD=new Qe("--region <region>",`Region to run all tests in (overrides all other configuration). Valid values: ${Object.values(Hi).join(", ")}, ${Au}, ${Object.values(Wi).join(", ")}.`),gD=new Qe("--local-avd-id <localAvdId>","Force tests to use a specific local Android Virtual Device (AVD) instead of remote emulators."),hD=new Qe("--local-apk-path <localApkPath>","Path to a local APK file to install when running tests with a local emulator. Overrides remote asset configuration."),fD=new Qe("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(cl),SD=new Qe("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(r=>{let e=cl(r);if(e<1)throw new og("Shard index must be greater than 0.");return e}),yD=new Qe("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(cl),Kb=new Qe("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),Yb=new Qe("--include <includePatterns...>","Only include tests that match the provided regex patterns. Multiple patterns can be provided. The patterns will be matched against the test file paths and the pattern only needs to match a part of the path for the test to be included."),Xb=new Qe("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),bD=new Qe("--upload-results","Upload test results to Momentic Cloud.").default(!1),Jb=new Qe("--log-level <logLevel>","Log level for Momentic and dependent services.").choices(["error","warn","info","debug"]),ED=new Qe("--ignore-quarantine","Run all tests even if they are quarantined. This is useful for validating that quarantined tests are fixed before moving them out of quarantine.").implies({skipQuarantined:!1,onlyQuarantined:!1}),TD=new Qe("--timeout-minutes <timeoutMinutes>","Maximum number of minutes to run tests before stopping. When the timeout is reached, tests will stop and current results will be printed.").argParser(cl),vD=new Qe("--reporter <reporter>","Output report files in a standardized format to a local directory.").choices(Object.values(Gl)),AD=new Qe("--reporter-dir <reporterDir>","Output directory to store report files. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml.").default("reports"),RD=new Qe("--name <name>","A name to associate with this run for easier identification in the Momentic dashboard.");import{randomUUID as M6}from"crypto";import{existsSync as I6}from"fs";import{dirname as b6}from"path";import{randomUUID as GJ}from"crypto";import{existsSync as HJ,statSync as WJ}from"fs";import wD from"path";import jJ from"zod";async function CD({runTracer:r,metadata:{orgId:e,runId:t},fixtures:{logger:n,apiClient:o,mobileGenerator:i,storage:a,cacheStorage:s,usageTracker:c,browserEnricher:l,browserGenerator:u,localCodeEvalTools:d},inputs:{channel:p,tag:m,project:g,testDefinition:h},env:{envName:f,envVariables:y},settings:{emulatorSettings:E,aiSettings:b},options:{logLevel:_,localAvdId:M,localApkPath:O,region:v}}){let C=Math.floor(Math.random()*1e4)+4e4,F=await Xo(C,"appium"),P=ts.or(jJ.literal(Au)).optional().parse(v??E.region),B=P==="local",D;if(B){let q;if(O&&(q=wD.resolve(O),!HJ(q)||!WJ(q).isFile()))throw new Error(`Local APK path "${q}" does not exist. Provide a valid file path via --local-apk-path.`);let fe,it=h.settings?.defaultApkFilePath;if(it){let fi=it.trim();fi&&(fe=fi)}let Ae=typeof y[Ii]=="string"?y[Ii].trim():void 0,x=typeof y[kl]=="string"?y[kl].trim():void 0,ne;x&&(ne=wD.resolve(x));let pe=q??fe??ne,Br=M??E.localEmulatorSettings?.avdId??Ae;if(!Br)throw new Error(`An AVD ID is required when using a local region. Provide --local-avd-id, configure a default local AVD ID on the test's settings, or set the ${Ii} key on the environment.`);D={avdId:Br,apkFilePath:pe}}else D={region:P==="closest"?void 0:P,apkToInstall:p?{channel:p,tag:m}:void 0,osVersion:E.remoteEmulatorSettings?.androidVersion??SA};let ee=GJ(),K=n.child({runAttemptId:ee}),ge;try{ge=await Im({apiClient:o,logger:n,driverLogLevel:_,creationOpts:D,callbacks:{onStatusUpdate:q=>{n.debug({status:q},"Emulator status update")},onHeartbeatFailure:()=>{let q="Appium heartbeat connection lost \u2014 possible ADB tunnel/emulator failure";I.warn(q)},onHeartbeatRestored:()=>{let q="Appium heartbeat connection restored";I.info(q)},onLimbarConnectionStateChange:q=>{q==="disconnected"?I.warn("Emulator websocket connection lost. Emulator may be unavailable."):(q==="reconnecting"||q==="connecting")&&I.info("Emulator websocket is reconnecting...")}},appiumPort:F,orgId:e,sessionId:ee})}catch(q){let fe=`Fatal error creating Android driver, failing test run attempt (runId: ${t})`;return n.error({err:q},fe),I.error({err:q},fe),{status:"FAILED",results:[],error:new R("UserConfigurationError",`Fatal error creating Android driver: ${q.message}`)}}let U=await r.startAttempt({emulatorName:ge.emulatorName,runAttemptId:ee});K=K.child(U.loggerBindings||{});let W=await Om({driver:ge.driver,onLogs:q=>{U.appendLogs(q)}}),ue=new Do({variablesFromEnvironment:y,envName:f,testName:h.name}),le=await ai.init({driver:ge.driver,generator:i,logger:K,limbarClient:ge.limbarClient,playwrightDevice:ge.playwrightDevice,orgId:e,adbPort:ge.adbPort,options:{emulator:{...E,browserSettings:g.config.browser}},aiSettings:b,fixtures:{storage:a,browserEnricher:l,browserGenerator:u,localCodeEvalTools:d,testContext:ue}}),Ge;try{Ge=await il({platform:"ANDROID",containerName:`android test ${h.name}`,fixtures:{controller:le,logger:K,cacheStorage:s,usageTracker:c},work:{state:{failureRecoveryDisabled:b.failureRecovery===!1,failureRecoveryAttempts:0}},inputs:{testName:h.name,steps:h.steps,orgId:e,testMetadata:h},tracer:U,callbacks:{}})}finally{await W(),await ge.cleanup(),await le.cleanup()}await U.finish({logger:K,results:Ge.results,status:Ge.status,assetDetails:{avdId:"avdId"in D?D.avdId:void 0,tag:"apkToInstall"in D?D.apkToInstall?.tag:void 0,channel:"apkToInstall"in D?D.apkToInstall?.channel:void 0}});let ve;if(Ge.status==="FAILED"&&Ge.terminalResult){let q=Ge.terminalResult.message;q?ve=R.fromMessage(q):ve=new R("UnknownError",q||"Unknown failure")}return{...Ge,error:ve}}import{randomUUID as p6}from"crypto";import{remote as qJ}from"webdriverio";var ag="NATIVE_APP";var sg=class{constructor(e){this.driver=e}async executeWebViewScript(e,t,...n){return this.executeInContext(e,async o=>{let i=new Function("...args",`${tu.safariUtilsLibJs}; const userFn = ${t.toString()}; return userFn(momenticFunctions, ...args);`);return o.execute(i,...n)})}async executeInNativeContext(e){return this.executeInContext(ag,e)}async executeInContext(e,t){return await this.driver.switchContext(e),await t(this.driver)}};import{createInstanceClient as VJ}from"@limrun/api/ios-client";import{hostname as $J}from"os";async function xD(r){let{apiClient:e,logger:t,creationOpts:n,logLevel:o,orgId:i,sessionId:a,onConnectionStateChange:s}=r,{token:c,webRtcUrl:l,wdaUrl:u,apiUrl:d,id:p,region:m}=await e.createIosEmulator({...n,hostname:$J(),sessionId:a});t.info({emulatorName:p,region:m,sessionId:a},"ios instance creation ok");let g=await nt.recordDuration({fn:async()=>await VJ({apiUrl:d,token:c,logLevel:o}),name:"test_event_duration",tags:["name:limbar-client-creation","clientOs:ios",`orgId:${i}`]});return s&&g.onConnectionStateChange(s),{close:()=>{g.disconnect()},limbarToken:c,limbarWebRtcUrl:l,limbarApiUrl:d,limbarWdaUrl:u,emulatorName:p,limbarClient:g}}async function _D({wdaUrl:r,token:e}){try{let t=new AbortController;return setTimeout(()=>t.abort(),3e3),await fetch(r+"/status",{headers:{Authorization:`Bearer ${e}`},signal:t.signal}),!0}catch{return!1}}async function MD({creationOpts:r,apiClient:e,logger:t,driverLogLevel:n,appiumPort:o,orgId:i,sessionId:a,callbacks:s}){let c=Date.now();t.info("Starting ios driver creation");let{onLimbarConnectionStateChange:l}=s,u=[],d=await xD({apiClient:e,logger:t,creationOpts:r,orgId:i,sessionId:a,onConnectionStateChange:l}),p=d.emulatorName;u.push(()=>e.deleteIosEmulator(p),d.close);let m=async()=>{for(let g=u.length-1;g>=0;g-=1)try{await u[g]()}catch(h){if(h instanceof Error&&["ECONNREFUSED","ECONNRESET","UND_ERR_CLOSED"].some(f=>h.message.includes(f)))continue;t.warn({err:h},"Error running cleanup task")}};try{let g=await KJ({logger:t,driverLogLevel:n,appiumPort:o,emulatorStart:c,emulatorCreationParams:d,apiClient:e,creationOpts:r,orgId:i,sessionId:a,callbacks:s});return u.push(g.appiumClose),u.push(async()=>g.driver.deleteSession()),g.driver.getPageSource().catch(()=>{}),{...d,...g,driver:new sg(g.driver),cleanup:m,appiumPort:o}}catch(g){throw await m(),new Error(`Failed to start Appium driver: ${g}`)}}async function KJ({logger:r,driverLogLevel:e="warn",emulatorStart:t,appiumPort:n,emulatorCreationParams:o,callbacks:{onStatusUpdate:i,onLimbarConnectionStateChange:a}}){let s=[],{emulatorName:c,limbarWdaUrl:l,limbarApiUrl:u,limbarToken:d,limbarClient:p}=o,m=Date.now(),{close:g,logFile:h}=await qc({logger:r,logLevel:e,appiumPort:n});await _D({wdaUrl:l,token:d})||(r.debug({emulatorName:c},"WDA is not running on the Limbar iOS emulator"),await p.simctl(["launch","booted","com.facebook.WebDriverAgentRunner.xctrunner"]).wait(),r.debug({emulatorName:c},"WDA launched"));let f={platformName:"iOS","appium:automationName":"XCUITest","appium:noReset":!0,"appium:fullReset":!1,"appium:webDriverAgentUrl":l,"appium:wdaLocalPort":443,"appium:useNewWDA":!1,"appium:usePreinstalledWDA":!0,"appium:newCommandTimeout":3600,"appium:autoWebview":!1,"appium:webviewConnectTimeout":500,"appium:webviewConnectRetries":5,"appium:includeSafariInWebviews":!0,"appium:fullContextList":!1,"appium:additionalWebviewBundleIds":["*"],"appium:waitForQuiescence":!1,"appium:settings":{customSnapshotTimeout:0},"appium:limInstanceApiUrl":u,"appium:limInstanceToken":d,"appium:wdaRequestHeaders":{Authorization:`Bearer ${d}`}},y=Date.now(),E=await qJ({capabilities:f,hostname:"localhost",port:n,path:"/",protocol:"http",logLevel:e}),b=new Map;return E.on("command",M=>{b.set(M.command,Date.now())}),E.on("result",M=>{let O=b.get(M.command);if(!O)return;let v=Date.now()-O;M.result instanceof Error?r.warn({err:M.result,command:M.command,args:M.body,durationMs:v},"Appium cmd failed"):v>1e4&&r.warn({command:M.command,args:M.body,durationMs:v},"Appium cmd took very long"),b.delete(M.command)}),r.info({timings:{emulatorDuration:m-t,appiumDuration:y-m,wdioDuration:Date.now()-y},capabilities:f,emulatorName:c},"Started Appium driver"),{onStatusUpdate:i,driver:E,appiumClose:async()=>{await g(),await Promise.all(s.map(M=>M()))},appiumPort:n,appiumLogFile:h,emulatorName:c}}import{createHash as c6}from"crypto";import u6 from"jpeg-js";import{PNG as FD}from"pngjs";import r6 from"@prettier/plugin-xml";import n6 from"prettier";import{DOMParser as o6,XMLSerializer as i6}from"slimdom";import{reduce as YJ}from"lodash-es";var XJ=new Set(["id","processId","bundleId","type","accessible","index","x","y","width","height"]),JJ=new Set([]),ZJ=new Set(["name","label","traits"]),QJ=new Set(["live-region","drawing-order"]),e6=new Set(["visible","enabled"]);function ID(r){let e={},t=r.tagName,n=YJ(r.attributes,(o,i)=>(o[i.name]=i.value,o),{});for(let[o,i]of Object.entries(n))XJ.has(o)||o==="class"&&t===i||o==="focusable"&&i==="true"&&n.clickable==="true"||JJ.has(o)&&i==="false"||ZJ.has(o)&&i===""||e6.has(o)&&i==="true"||QJ.has(o)&&i==="0"||(e[o]=i);return e.name&&e.label&&e.name===e.label&&delete e.label,e.name&&e.value&&e.name===e.value&&delete e.value,e}function lg(r){let e=r.getAttribute("x"),t=r.getAttribute("y"),n=r.getAttribute("width"),o=r.getAttribute("height");if(e===null||t===null||n===null||o===null)return;let i=parseFloat(e),a=parseFloat(t),s=parseFloat(n),c=parseFloat(o);if(!(isNaN(i)||isNaN(a)||isNaN(s)||isNaN(c)))return[i,a,i+s,a+c]}function Zb(r,e){let[t,n,o,i]=e;r.setAttribute("bounds",`[${t}, ${n}, ${o}, ${i}]`)}function t6(r){let e=r.match(/\[\s*([-\d.]+)\s*,\s*([-\d.]+)\s*,\s*([-\d.]+)\s*,\s*([-\d.]+)\s*\]/);if(!e)return;let t=parseFloat(e[1]),n=parseFloat(e[2]),o=parseFloat(e[3]),i=parseFloat(e[4]);if(!(isNaN(t)||isNaN(n)||isNaN(o)||isNaN(i)||o<t||i<n))return[t,n,o,i]}function PD(r){let e=r.getAttribute("bounds");if(e)return t6(e)}function OD(r,e){if(!e)return!0;let t=lg(r);return t?Qb(t,e):!0}function Qb(r,e){if(!e)return!0;let[t,n,o,i]=r;return!(o<e.left||t>e.right||i<e.top||n>e.bottom)}var LD=new Set(["XCUIElementTypeWebView"]);function a6(r){if(LD.has(r.tagName))return!0;let e=r.getAttribute("name");if(e&&(e.startsWith("TabDocument")||e.startsWith("BrowserView"))){let t=e.match(/UUID=([A-F0-9-]+)/),n=e.match(/WebViewProcessID=(\d+)/);if(t&&n)return!0}return!1}function s6(r){let e=["android.widget.","android.view.","android.webkit.","android.app.","android.support.","androidx.","com.android.inputmethod."];for(let t of e)if(r.startsWith(t))return r.substring(t.length);return r}function eE(r,e){let{idCounter:t,idToElement:n}=r,o=t.value++;e.setAttribute("id",String(o)),n.set(o,e)}function tE(r){if(LD.has(r.tagName))return r.children.length>0?tE(r.children[0]):void 0;if(r.tagName==="XCUIElementTypeOther"&&r.hasAttribute("name")&&r.hasAttribute("label"))return lg(r);if(r.children.length===1){let e=r.children[0];return tE(e)}}function ND(r,e,t,n){let{document:o}=t,{parentFrameBounds:i,pruneElementsOutsideBounds:a}=n;if(e.type==="element"){let s=o.createElement(e.role||e.tag);if(e.name&&s.setAttribute("name",e.name),e.description&&s.setAttribute("description",e.description),e.classes&&e.classes.length>0&&s.setAttribute("classes",e.classes.join(" ")),e.attrs)for(let[u,d]of Object.entries(e.attrs))s.setAttribute(u,d);let c=e.boundingRect,l=[i[0]+c.x,i[1]+c.y,i[0]+c.x+c.width,i[1]+c.y+c.height];if(!Qb(l,a))return;Zb(s,l),eE(t,s),r.appendChild(s);for(let u of e.children)ND(s,u,t,n)}else if(e.type==="text"){let s=o.createElement("text");eE(t,s),r.appendChild(s);let c=o.createTextNode(e.text);s.appendChild(c)}}function DD(r,e,t,n){let{pruneElementsOutsideBounds:o}=n,{document:i}=t;eE(t,e);let a=ID(r);for(let[l,u]of Object.entries(a))e.setAttribute(l,u);let s=lg(r);if(s&&Zb(e,s),a6(r)){let{removeWebviewContent:l,injectedWebviewContent:u}=n;if(l)return;if(u){let d=tE(r);if(d){ND(e,u,t,{parentFrameBounds:d,pruneElementsOutsideBounds:o});return}}}let c=Array.from(r.childNodes??[]);for(let l of c){let u=l.nodeType;if(u===3){let d=l.nodeValue;d&&d.trim().length>0&&e.appendChild(i.createTextNode(d));continue}if(u===1){let d=l;if(!OD(d,o))continue;let p=i.createElement(s6(d.tagName));DD(d,p,t,n),e.appendChild(p)}}}async function l6(r,e,t){let n=r.parseFromString("<AppiumAUT/>","text/xml"),o=new Map,i={document:n,idToElement:o,idCounter:{value:0}},a=n.documentElement;DD(e,a,i,t);let s=new i6().serializeToString(n),c=await n6.format(s,{parser:"xml",plugins:[r6],printWidth:120,tabWidth:1,singleAttributePerLine:!1});return{prunedDocument:n,idToElement:o,prunedXml:c}}async function kD(r,e){let t=new o6,o=t.parseFromString(r,"text/xml").documentElement;if(!o)throw new Error("No root element found in XML");if(o.tagName!=="AppiumAUT")throw new Error("No AppiumAUT element found in XML");let{prunedXml:i,idToElement:a,prunedDocument:s}=await l6(t,o,e);return{xml:i,idToElement:a,document:s}}var cg=class r{driver;limbarClient;orgId;options;aborter;constructor({driver:e,limbarClient:t,orgId:n,options:o,aborter:i}){this.driver=e,this.limbarClient=t,this.orgId=n,this.options=o,this.aborter=i}static async init({driver:e,limbarClient:t,orgId:n,options:o,aborter:i}){return new r({driver:e,orgId:n,options:o,aborter:i,limbarClient:t})}async getContexts(){let e=await this.driver.executeInNativeContext(async n=>await n.getContexts({})),t=e.filter(n=>n!==ag);return{contexts:e.map(n=>n),webviews:t}}async getRawScreenshotBase64(e,t=2){let n=se(),o;for(let i=0;i<t;i++)try{return await n.startAsyncSpan("EMULATOR_READ_STATE",async()=>{let a=await this.limbarClient.screenshot(),s=Buffer.from(a.base64,"base64"),c=u6.decode(s),l=new FD({width:c.width,height:c.height});return l.data=Buffer.from(c.data),FD.sync.write(l).toString("base64")},{name:"Take screenshot",signal:this.aborter.controller?.signal,timeoutMs:3e3})}catch(a){if(o=a,e.warn({err:a},"Failed to take screenshot"),i===t-1)throw a}throw new R("InternalWebAgentError",`Failed to take screenshot: ${o}`)}async getCurrentScreenshotPngString(e){return`data:image/png;base64,${await this.getRawScreenshotBase64(e,1)}`}async waitForScreenshotStability({logger:e,timeoutMs:t,signal:n,reason:o,tolerancePercent:i=1}){let a=Date.now(),s,c=!1;for(;Date.now()-a<t;){if(n?.throwIfAborted(),!s){s=await this.getRawScreenshotBase64(e);continue}let l=await this.getRawScreenshotBase64(e);if(Is(s,l)<=i){c=!0;break}s=l,await J(250,n)}c||e.warn({purpose:o},"Timed out waiting for screenshot stability")}async waitForPageSourceStability({logger:e,timeoutMs:t,signal:n,reason:o}){await se().startAsyncSpan("WAIT_FOR_PAGE_STABILITY",async i=>{i.attributes.reason=o;let a=Date.now(),s,c,l=!1;for(;Date.now()-a<t;){c&&c<250&&await J(250-c,n),n?.throwIfAborted();let u=Date.now(),d;try{d=await this.limbarClient.elementTree()}catch(m){e.warn({err:m},"Failed to get page source during stability wait"),c=Date.now()-u;continue}let p=c6("md5").update(d).digest("hex");if(c=Date.now()-u,s&&s===p){l=!0;break}s=p}l||(i.attributes.timedOut=!0,e.warn({purpose:o},"Timed out waiting for page source stability"))})}async getActiveWebview(){let t=(await this.getContexts()).webviews;if(t.length>1)throw new R("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");return t[0]}async getActiveWebviewContent(){let e=await this.getActiveWebview();if(!e)return;this.throwIfAborted();let t=await this.driver.executeWebViewScript(e,n=>n.dumpA11yTree());if(t)return JSON.parse(t)}async getDomState(e,t){let o=t?.filterOffscreenElements??!0?await this.getViewportBounds():void 0,i=await this.getPageSource();this.throwIfAborted();let a;if(!t?.skipFetchingFullWebviewContent)try{a=await this.getActiveWebviewContent()}catch(c){e.error({err:c},"Could not get webview info to get the nested DOM state")}return this.throwIfAborted(),{graph:await kD(i,{injectedWebviewContent:a,removeWebviewContent:t?.removeWebviewContent,pruneElementsOutsideBounds:o})}}async getPageSource(){return await se().startAsyncSpan("EMULATOR_READ_STATE",()=>this.driver.executeInNativeContext(async n=>n.getPageSource()),{name:"Get iOS page source",signal:this.aborter.controller?.signal})}async getViewportBounds(){let e=await this.driver.executeInNativeContext(async t=>t.getWindowRect());return{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height}}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}};function UD({aiResponse:r,description:e,emulatorState:t}){let n=t.graph.idToElement.get(r.id);if(!n)throw new Error(`Could not find node with id: ${r.id}`);let o=PD(n);if(!o)throw new Error(`Could not determine bounds for element with id: ${r.id}, description: ${e}`);return{target:{type:"NATIVE",bounds:o},resolvedNode:n}}var Zn=class{limbarClient;driver;stateManager;generator;fixtures;orgId;aiSettings;aborter;constructor(e){this.stateManager=e.stateManager,this.driver=e.driver,this.limbarClient=e.limbarClient,this.aborter=e.aborter,this.fixtures=e.fixtures,this.orgId=e.orgId,this.generator=e.generator,this.aiSettings=e.aiSettings}async findElement({logger:e,description:t,skipFetchingFullWebviewContent:n=!1,removeWebviewContent:o=!1,useMemory:i=!1,metadata:a}){let s=e.child({...a});await this.stateManager.waitForScreenshotStability({logger:e,timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before locating an element with AI"});let c=await this.stateManager.getDomState(e,{skipFetchingFullWebviewContent:n,removeWebviewContent:o}),l=await this.stateManager.getCurrentScreenshotPngString(e),u;try{u=await this.generator.getIosElementLocation({description:t,screenXml:c.graph.xml,screenshot:l},{logger:s,loggerTags:ye(s),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["ios-locator"]})}catch(m){throw this.throwIfAborted(),s.error({err:m},"Failed to locate element"),new Error(`ActionFailureError: Failed to locate element: ${m instanceof Error?m.message:m}`)}if(u.id===-1)throw new R("NoMatchingElementError",u.thoughts??"No matching element found");let{target:d,resolvedNode:p}=UD({aiResponse:u,description:t,emulatorState:c});return{resolvedTarget:{...d,resolvedNode:p},thoughts:u.thoughts}}async wrapTargetingAction(e){let{logger:t,action:n,description:o,command:i,cacheIsInvalidAfterResolution:a,skipFetchingFullWebviewContent:s=!1,removeWebviewContent:c=!1}=e,l={commandId:i.id},u=!1,d;i.disableCache&&(t.debug({command:i},"Cache explicitly disabled for command"),u=!0,d=void 0),a&&(u=!0,d=void 0),d&&d?.resolvedDescription!==o&&(t.info({description:o,cacheDescription:d?.resolvedDescription},"Cache description mismatch, clearing it automatically"),u=!0,d=void 0),t.info({description:o,cacheBustedBeforeAction:u},"Prompting AI for a new element location");let p=await this.findElement({logger:t,description:o,skipFetchingFullWebviewContent:s,removeWebviewContent:c,metadata:l}),m=p.thoughts;return{result:await n(p.resolvedTarget),thoughts:m}}constructPerformerParams(){return{limbarClient:this.limbarClient,stateManager:this.stateManager,driver:this.driver,fixtures:this.fixtures,aborter:this.aborter,orgId:this.orgId,generator:this.generator,aiSettings:this.aiSettings}}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}get abortSignal(){return this.aborter.controller?.signal}};var ug=class extends Zn{async doPress({name:e,longPress:t}){return this.driver.executeInNativeContext(n=>n.executeScript("mobile: pressButton",[{name:e,isLongPress:t}]))}};function d6(r){let e={relativePosition:r.relativePosition};if(r.doubleTap&&r.longPress)throw new Error("UserConfigurationError: Cannot specify both doubleTap and longPress");return r.doubleTap?{...e,doubleTap:!0,doubleTapDelayMs:r.doubleTapDelayMs}:r.longPress?{...e,longPress:!0,longPressDurationMs:r.longPressDurationMs}:e}var ul=class extends Zn{async tapOnAbsoluteCoordinates(e,t){let n=t.x,o=t.y;if(e.info({x:n,y:o},"Tap at coordinates"),t.longPress){let i=t.longPressDurationMs??2e3;await this.driver.executeInNativeContext(a=>a.tap({x:n,y:o,duration:i}));return}if(t.doubleTap){await this.driver.executeInNativeContext(a=>a.tap({x:n,y:o}));let i=t.doubleTapDelayMs??100;await new Promise(a=>setTimeout(a,i))}await this.driver.executeInNativeContext(i=>i.tap({x:n,y:o}))}async tapOnNativeTarget(e,t,n){let[o,i,a,s]=t.bounds,c=a-o,l=s-i,u=n?.relativePosition?.x??c/2,d=n?.relativePosition?.y??l/2;u=Math.max(0,Math.min(u,c)),d=Math.max(0,Math.min(d,l));let p=o+u,m=i+d;return await this.tapOnAbsoluteCoordinates(e,{x:p,y:m,...n}),{x:p,y:m}}async tapOnTarget({logger:e,target:t,options:n}){if("type"in t&&t.type==="NATIVE")await this.tapOnNativeTarget(e,t,n);else throw new Error("Not implemented yet")}async executeTap({logger:e,command:t}){let n=d6(t);if(t.target.type==="coordinates"){let a=await this.driver.executeInNativeContext(async l=>l.getWindowSize()),s=t.target.xPercent*a.width,c=t.target.yPercent*a.height;return await this.tapOnAbsoluteCoordinates(e,{...n,x:s,y:c}),{success:!0,message:`Tapped at ${s}, ${c}`}}let o=t.target.description,{thoughts:i}=await this.wrapTargetingAction({logger:e,command:t,action:a=>this.tapOnTarget({logger:e,target:a,options:n}),description:o});return{success:!0,message:i}}};var m6=25,dg=class extends Zn{async doType(e,t){if(!t.target){if(t.clearContent)throw new Error("UserConfigurationError: clearing content is only supported when a target is provided to the Type step");return await this.stateManager.waitForScreenshotStability({logger:e,timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for page to stabilize before typing"}),await this.sendKeys(t),{success:!0,message:"Successfully executed type action"}}if(t.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Type step");let{thoughts:n}=await this.wrapTargetingAction({logger:e,command:t,action:async o=>{if("type"in o&&o.type==="NATIVE")await this.doNativeType(e,t,o);else throw new Error("UserConfigurationError: Webview targets are not supported for the Type step on iOS devices")},description:t.target.description});return{success:!0,message:n}}async doNativeType(e,t,n){let o=new ul(this.constructPerformerParams());t.clearContent?(await o.tapOnNativeTarget(e,n,{longPress:!0}),await this.clearContent()):await o.tapOnNativeTarget(e,n),await this.stateManager.waitForScreenshotStability({logger:e,timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for keyboard to appear before typing"}),await this.sendKeys(t)}async sendKeys(e){let t=e.keyPressDelayMs??m6,n=Date.now();for(;Date.now()-n<3e3&&(this.throwIfAborted(),!await this.driver.executeInNativeContext(o=>o.isKeyboardShown()));)await new Promise(o=>setTimeout(o,500));t?await this.driver.executeInNativeContext(async o=>{await o.updateSettings({keyInjectionDelay:t}),await o.keys(e.text),await o.updateSettings({keyInjectionDelay:0})}):await this.driver.executeInNativeContext(async o=>{await o.keys(e.text)})}async clearContent(){await this.clearContentHelper()}async clearContentHelper(){}};var mg=class r extends Zn{emulatorSettings;logger;constructor(e){super(e),this.logger=e.logger,this.emulatorSettings=e.emulatorSettings}static async init({driver:e,logger:t,fixtures:n,orgId:o,options:i,abortController:a,limbarClient:s,generator:c,aiSettings:l}){let u={controller:a},d=i?.emulator??{},p=await cg.init({driver:e,orgId:o,limbarClient:s,options:d,aborter:u}),m=new r({generator:c,aiSettings:l,limbarClient:s,driver:e,stateManager:p,logger:t,fixtures:n,aborter:u,orgId:o,emulatorSettings:d});return await m.initializeSettings(),m}async executeCommand(e){let t=["type","a11yData","thoughts","cache","code"],n;try{n=await Ps({obj:e.command,context:this.fixtures.testContext,bannedKeys:t,orgId:this.orgId,logger:this.logger,signal:this.abortSignal,localTools:this.fixtures.localCodeEvalTools})}catch(o){throw this.throwIfAborted(),new Error(`ActionFailureError: Failed to substitute template strings in command: ${o.message}`,{cause:o})}try{return await this.executeCommandHelper(e)}catch(o){throw o.name!=="AbortError"&&this.logger.error({err:o},"Error thrown in action controller"),o}finally{Os(e.command,n)}}async executeCommandHelper({command:e}){let t=se();switch(e.type){case"TAP":return new ul(this.constructPerformerParams()).executeTap({logger:this.logger,command:e});case"TYPE":return new dg(this.constructPerformerParams()).doType(this.logger,e);case"STATE":{let n=await this.stateManager.getDomState(this.logger),o=await this.stateManager.getContexts();return{output:{xml:n.graph.xml,contexts:o},success:!0}}case"OPEN_APP":return await this.limbarClient.launchApp(e.packageName),{success:!0};case"PRESS":{let n=new ug(this.constructPerformerParams());switch(e.key){case"HOME":await n.doPress({name:"home"});break;case"POWER":await this.driver.executeInNativeContext(o=>o.isLocked())?await this.driver.executeInNativeContext(o=>o.unlock()):await this.driver.executeInNativeContext(o=>o.lock());break}return{success:!0}}case"AI_CHECK":{let o=e.timeoutSecs?e.timeoutSecs*1e3:5e3,i=Gm(o),a=Date.now(),s=0,c,l=!1,u;for(;s<15&&!l;){this.throwIfAborted(),l||c&&c-a>=o&&(l=!0),s!==0&&await J(i,this.abortSignal),c=Date.now();try{let d="",p="";await t.startAsyncSpan("EMULATOR_READ_STATE",async()=>{d=await this.getEmulatorDomState(),p=await this.getScreenshotBase64()},{name:"Get emulator state"});let m=await this.generator.evaluateIosAssertion({assertion:e.assertion,screenXml:d,screenshot:p},{logger:this.logger,loggerTags:ye(this.logger),agentConfigVersion:this.aiSettings.agentConfig?.["ios-assertion"]});if(m.result)return{success:m.result,message:m.thoughts};{let g=`AssertionFailureError: ${m.thoughts}`;u=new Error(g)}}catch(d){this.throwIfAborted(),this.logger.info({err:d},`AI check assert attempt ${s} failed, retrying...`),u=d instanceof Error?d:new Error(`${d}`)}finally{s++}}return{success:!1,message:u?.message}}default:throw new Error(`Unsupported mobile command type: ${e.type}`)}}async getMobileFailureRecoveryPlan(e){return{thoughts:"Failure recovery is not yet supported for iOS.",scenario:"INELIGIBLE",instructions:void 0}}async waitForPageSourceStability(e){return this.stateManager.waitForPageSourceStability({logger:this.logger,timeoutMs:e.timeoutMs??5e3,reason:e.reason,signal:this.aborter.controller?.signal})}async listInstalledApps(){let e=await this.driver.executeInNativeContext(n=>n.execute("mobile: listApps"));return Object.keys(e).filter(n=>!n.startsWith("com.apple.")&&!n.startsWith("io.appium"))}async initializeSettings(){}async getScreenshotBase64(){return this.stateManager.getRawScreenshotBase64(this.logger)}async getScreenshotPngString(){return this.stateManager.getCurrentScreenshotPngString(this.logger)}async getEmulatorDomState(){return(await this.stateManager.getDomState(this.logger)).graph.xml}async getViewportBounds(){return this.stateManager.getViewportBounds()}async waitForScreenshotStability(e){return this.stateManager.waitForScreenshotStability({logger:this.logger,timeoutMs:e.timeoutMs??5e3,reason:e.reason,signal:this.aborter.controller?.signal})}resetAbortController(e){this.aborter.controller=e??new AbortController}isAborted(){return this.aborter.controller?.signal.aborted}abort(){this.aborter.controller?.abort()}async cleanup(){}get abortSignal(){return this.aborter.controller?.signal}get context(){return this.fixtures.testContext}get localCodeEvalTools(){return this.fixtures.localCodeEvalTools}};import g6 from"zod";async function BD({runTracer:r,metadata:{orgId:e,runId:t},fixtures:{logger:n,apiClient:o,mobileGenerator:i,storage:a,cacheStorage:s,usageTracker:c,browserEnricher:l,browserGenerator:u,localCodeEvalTools:d},inputs:{project:p,testDefinition:m},env:{envName:g,envVariables:h},settings:{emulatorSettings:f,aiSettings:y},options:{logLevel:E,region:b}}){let _=Math.floor(Math.random()*1e4)+4e4,M=await Xo(_,"appium"),O=ts.or(g6.literal(Au)).optional().parse(b??f.region);if(O==="local")throw new Error("Local region is not supported for iOS tests, as we do not support local iOS emulators.");let C={region:O==="closest"?void 0:O},F=p6(),P=n.child({runAttemptId:F}),B;try{B=await MD({apiClient:o,logger:n,driverLogLevel:E,creationOpts:C,callbacks:{onStatusUpdate:W=>{n.debug({status:W},"Emulator status update")},onLimbarConnectionStateChange:W=>{W==="disconnected"?I.warn("Emulator websocket connection lost. Emulator may be unavailable."):(W==="reconnecting"||W==="connecting")&&I.info("Emulator websocket is reconnecting...")}},appiumPort:M,orgId:e,sessionId:F})}catch(W){let ue=`Fatal error creating iOS driver, failing test run attempt (runId: ${t})`;return n.error({err:W},ue),I.error({err:W},ue),{status:"FAILED",results:[],error:new R("UserConfigurationError",`Fatal error creating iOS driver: ${W.message}`)}}let D=await r.startAttempt({emulatorName:B.emulatorName,runAttemptId:F});P=P.child(D.loggerBindings||{});let ee=new Do({variablesFromEnvironment:h,envName:g,testName:m.name}),K=await mg.init({driver:B.driver,generator:i,logger:P,limbarClient:B.limbarClient,orgId:e,options:{emulator:{...f,browserSettings:p.config.browser}},aiSettings:y,fixtures:{storage:a,browserEnricher:l,browserGenerator:u,localCodeEvalTools:d,testContext:ee}}),ge;try{ge=await il({platform:"IOS",containerName:`ios test ${m.name}`,fixtures:{controller:K,logger:P,cacheStorage:s,usageTracker:c},work:{state:{failureRecoveryDisabled:y.failureRecovery===!1,failureRecoveryAttempts:0}},inputs:{testName:m.name,steps:m.steps,orgId:e,testMetadata:m},tracer:D,callbacks:{}})}finally{await B.cleanup(),await K.cleanup()}await D.finish({logger:P,results:ge.results,status:ge.status});let U;if(ge.status==="FAILED"&&ge.terminalResult){let W=ge.terminalResult.message;W?U=R.fromMessage(W):U=new R("UnknownError",W||"Unknown failure")}return{...ge,error:U}}import{cloneDeep as h6}from"lodash-es";import{debounce as f6}from"ts-debounce";var Cu="0.35.3";function S6(r){switch(r){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}function y6(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var nE=class{constructor(e,t,n,o,i,a){this.keepalive=e;this.testId=t;this.testName=n;this.diskStorage=o;this.parentTracer=i;this.orgId=a;this.interactionTracer=new Zo,nn.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;getParentStepIdChain(){return[]}recordStepDuration(e){let{durationMs:t,step:n}=e,o=n.type!=="MOBILE_PRESET_STEP"?n.type:n.command.type;nt.distribution("test_step_duration",t,[`type:${o}`,"platform:mobile","executor:cli",`orgId:${this.orgId}`])}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${Go}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${Go}/${t}.jpeg`,contents:n})}attachBeforeXmlSnapshot(e){let{snapshotId:t,xml:n}=e;this.diskStorage.storeFile({name:`${Go}/${t}.xml`,contents:n})}attachAfterXmlSnapshot(e){let{snapshotId:t,xml:n}=e;this.diskStorage.storeFile({name:`${Go}/${t}.xml`,contents:n})}async finishInternal(e){this.finished||(this.finished=!0,this.interactionTracer.finish(),await Promise.all(this.children.map(t=>t.finish({status:y6(e.status),finishedAt:e.finishedAt}))))}async finish(e){return await this.finishInternal({status:e.result.status,finishedAt:new Date(e.result.endTime)}),{trace:this.interactionTracer.getRootSpan()}}async startSubSteps(){let e=new dl(this.keepalive,this.testId,this.testName,this.diskStorage,this.orgId);return this.children.push(e),e}},dl=class{constructor(e,t,n,o,i){this.keepalive=e;this.testId=t;this.testName=n;this.diskStorage=o;this.orgId=i}children=[];finished=!1;async getScreenshot(e){return this.diskStorage.readFile(`${Go}/${e}.jpeg`)}getParentStepIdChain(){return[]}async startStep(e){this.keepalive();let t=new nE(this.keepalive,this.testId,this.testName,this.diskStorage,this,this.orgId);return this.children.push(t),t}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finishInternal({status:S6(e.status),finishedAt:e.finishedAt}))))}},oE=class{constructor(e,t,n,o,i,a,s){this.keepalive=e;this.testId=t;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.orgId=s;this.diskStorage.mkdir("assets"),this.logStream=this.diskStorage.createFileStream("assets/logs.logcat"),this.resourceUsageStream=this.diskStorage.createFileStream(`${Go}/resource-usage.ndjson`),this.resourceUsageSampler=Aw({keepSamples:!1,onSample:c=>{this.resourceUsageStream.write(`${JSON.stringify(c)}
4660
+ `),r.forEach(m=>{if(!Bb.existsSync(m))throw new Error(`Path '${m}' does not exist.`);let g,h;try{g=Bb.statSync(m),h=g.isDirectory()}catch(y){s.warn({err:y},`Skipping path ${m} because it cannot be read`);return}let f=ng.resolve(m);Object.values(e.mobileTests).filter(y=>h?y.fullFilePath.startsWith(f):y.fullFilePath===f).forEach(y=>{l.add(y.fullFilePath)})})):(s.info("The arguments provided don't appear to be valid paths. Treating them as substrings instead... "),Object.values(e.mobileTests).forEach(m=>{r.some(g=>m.relativePath.includes(g))&&l.add(m.fullFilePath)}))}else{!n&&!await Rm("No test paths or substrings were provided. Do you want to run all tests?")&&(s.error("Cancelled by user."),process.exit(1));let d=Object.values(e.mobileTests);s.info(`Reading all ${d.length} mobile tests in the project from local disk.`),d.forEach(p=>{l.add(p.fullFilePath)})}for(let d of Array.from(l)){let p=ng.relative(t.rootDir,d);o&&!o.some(m=>new RegExp(m).test(p))&&l.delete(d),i&&i.some(m=>new RegExp(m).test(p))&&l.delete(d)}return(await Promise.all(Array.from(l).map(async d=>{try{let p=ng.relative(t.rootDir,d),m=await yo(d,s,e),g=ng.basename(d,".test.yaml");if(m.disabled)return null;if(a&&a.length>0){let f=m.labels||[];if(!a.some(E=>f.includes(E)))return null}let h={id:m.id,name:g,description:m.description,schemaVersion:m.schemaVersion,settings:m.settings,fullFilePath:d,relativeFilePath:p,quarantined:!!c[m.id],quarantinedMetadata:c[m.id],labels:m.labels};switch(m.platform){case"ANDROID":return{...h,platform:"ANDROID",steps:m.steps};case"IOS":return{...h,platform:"IOS",steps:m.steps};default:return(y=>{throw new Error("You missed a case in the switch above")})(m)}}catch(p){s.error(`Failed to read and resolve mobile test at '${d}': ${p}`),process.exit(1)}}))).filter(d=>!!d)}import{InvalidArgumentError as og,Option as Qe}from"@commander-js/extra-typings";import{z as BJ}from"zod";var cD=58890;function cl(r){let e=parseInt(r,10);if(isNaN(e))throw new og("Not a number.");return e}var Ea=new Qe("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").argParser(r=>{if(!r)throw new og("API key is required.");return r}).makeOptionMandatory(),ig=new Qe("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),Gb=new Qe("-f, --filter <filter>","Run tests within the project that has a name equal to the filter provided. This option cannot be used together with file path or directory arguments, but substring matches are allowed."),Ta=new Qe("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default("https://api.momentic.ai").argParser(r=>{try{return BJ.string().url().parse(r),r}catch{throw new og("Not a valid URL.")}}),Hb=new Qe("-y, --yes","Skip all confirmation prompts.").env("CI"),Wb=new Qe("--regenerate-cache","Regenerate all caches by starting from an empty cache state. This flag is useful for completely regenerating caches after changing configuration options. Warning: using this option will cause all steps to run without any cached data, resulting in significantly longer execution times."),jb=new Qe("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on protected branches.").env("CI"),Vb=new Qe("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes.").implies({saveCache:!1}),$b=new Qe("--tag <tag>","Tag identifier for the asset."),uD=new Qe("--channel <channel>","Channel name for the asset."),qb=new Qe("--channel <channel>","Channel name for the asset.").makeOptionMandatory(),dD=new Qe("--tag <tag>","Tag identifier for the asset.").makeOptionMandatory(),mD=new Qe("--env <env>","Environment to run all tests in (overrides test-level configuration)."),Au="closest",pD=new Qe("--region <region>",`Region to run all tests in (overrides all other configuration). Valid values: ${Object.values(Hi).join(", ")}, ${Au}, ${Object.values(Wi).join(", ")}.`),gD=new Qe("--local-avd-id <localAvdId>","Force tests to use a specific local Android Virtual Device (AVD) instead of remote emulators."),hD=new Qe("--local-apk-path <localApkPath>","Path to a local APK file to install when running tests with a local emulator. Overrides remote asset configuration."),fD=new Qe("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(cl),SD=new Qe("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(r=>{let e=cl(r);if(e<1)throw new og("Shard index must be greater than 0.");return e}),yD=new Qe("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(cl),Kb=new Qe("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),Yb=new Qe("--include <includePatterns...>","Only include tests that match the provided regex patterns. Multiple patterns can be provided. The patterns will be matched against the test file paths and the pattern only needs to match a part of the path for the test to be included."),Xb=new Qe("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),bD=new Qe("--upload-results","Upload test results to Momentic Cloud.").default(!1),Jb=new Qe("--log-level <logLevel>","Log level for Momentic and dependent services.").choices(["error","warn","info","debug"]),ED=new Qe("--ignore-quarantine","Run all tests even if they are quarantined. This is useful for validating that quarantined tests are fixed before moving them out of quarantine.").implies({skipQuarantined:!1,onlyQuarantined:!1}),TD=new Qe("--timeout-minutes <timeoutMinutes>","Maximum number of minutes to run tests before stopping. When the timeout is reached, tests will stop and current results will be printed.").argParser(cl),vD=new Qe("--reporter <reporter>","Output report files in a standardized format to a local directory.").choices(Object.values(Gl)),AD=new Qe("--reporter-dir <reporterDir>","Output directory to store report files. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml.").default("reports"),RD=new Qe("--name <name>","A name to associate with this run for easier identification in the Momentic dashboard.");import{randomUUID as M6}from"crypto";import{existsSync as I6}from"fs";import{dirname as b6}from"path";import{randomUUID as GJ}from"crypto";import{existsSync as HJ,statSync as WJ}from"fs";import wD from"path";import jJ from"zod";async function CD({runTracer:r,metadata:{orgId:e,runId:t},fixtures:{logger:n,apiClient:o,mobileGenerator:i,storage:a,cacheStorage:s,usageTracker:c,browserEnricher:l,browserGenerator:u,localCodeEvalTools:d},inputs:{channel:p,tag:m,project:g,testDefinition:h},env:{envName:f,envVariables:y},settings:{emulatorSettings:E,aiSettings:b},options:{logLevel:_,localAvdId:M,localApkPath:O,region:v}}){let C=Math.floor(Math.random()*1e4)+4e4,F=await Xo(C,"appium"),P=ts.or(jJ.literal(Au)).optional().parse(v??E.region),B=P==="local",D;if(B){let q;if(O&&(q=wD.resolve(O),!HJ(q)||!WJ(q).isFile()))throw new Error(`Local APK path "${q}" does not exist. Provide a valid file path via --local-apk-path.`);let fe,it=h.settings?.defaultApkFilePath;if(it){let fi=it.trim();fi&&(fe=fi)}let Ae=typeof y[Ii]=="string"?y[Ii].trim():void 0,x=typeof y[kl]=="string"?y[kl].trim():void 0,ne;x&&(ne=wD.resolve(x));let pe=q??fe??ne,Br=M??E.localEmulatorSettings?.avdId??Ae;if(!Br)throw new Error(`An AVD ID is required when using a local region. Provide --local-avd-id, configure a default local AVD ID on the test's settings, or set the ${Ii} key on the environment.`);D={avdId:Br,apkFilePath:pe}}else D={region:P==="closest"?void 0:P,apkToInstall:p?{channel:p,tag:m}:void 0,osVersion:E.remoteEmulatorSettings?.androidVersion??SA};let ee=GJ(),K=n.child({runAttemptId:ee}),ge;try{ge=await Im({apiClient:o,logger:n,driverLogLevel:_,creationOpts:D,callbacks:{onStatusUpdate:q=>{n.debug({status:q},"Emulator status update")},onHeartbeatFailure:()=>{let q="Appium heartbeat connection lost \u2014 possible ADB tunnel/emulator failure";I.warn(q)},onHeartbeatRestored:()=>{let q="Appium heartbeat connection restored";I.info(q)},onLimbarConnectionStateChange:q=>{q==="disconnected"?I.warn("Emulator websocket connection lost. Emulator may be unavailable."):(q==="reconnecting"||q==="connecting")&&I.info("Emulator websocket is reconnecting...")}},appiumPort:F,orgId:e,sessionId:ee})}catch(q){let fe=`Fatal error creating Android driver, failing test run attempt (runId: ${t})`;return n.error({err:q},fe),I.error({err:q},fe),{status:"FAILED",results:[],error:new R("UserConfigurationError",`Fatal error creating Android driver: ${q.message}`)}}let U=await r.startAttempt({emulatorName:ge.emulatorName,runAttemptId:ee});K=K.child(U.loggerBindings||{});let W=await Om({driver:ge.driver,onLogs:q=>{U.appendLogs(q)}}),ue=new Do({variablesFromEnvironment:y,envName:f,testName:h.name}),le=await ai.init({driver:ge.driver,generator:i,logger:K,limbarClient:ge.limbarClient,playwrightDevice:ge.playwrightDevice,orgId:e,adbPort:ge.adbPort,options:{emulator:{...E,browserSettings:g.config.browser}},aiSettings:b,fixtures:{storage:a,browserEnricher:l,browserGenerator:u,localCodeEvalTools:d,testContext:ue}}),Ge;try{Ge=await il({platform:"ANDROID",containerName:`android test ${h.name}`,fixtures:{controller:le,logger:K,cacheStorage:s,usageTracker:c},work:{state:{failureRecoveryDisabled:b.failureRecovery===!1,failureRecoveryAttempts:0}},inputs:{testName:h.name,steps:h.steps,orgId:e,testMetadata:h},tracer:U,callbacks:{}})}finally{await W(),await ge.cleanup(),await le.cleanup()}await U.finish({logger:K,results:Ge.results,status:Ge.status,assetDetails:{avdId:"avdId"in D?D.avdId:void 0,tag:"apkToInstall"in D?D.apkToInstall?.tag:void 0,channel:"apkToInstall"in D?D.apkToInstall?.channel:void 0}});let ve;if(Ge.status==="FAILED"&&Ge.terminalResult){let q=Ge.terminalResult.message;q?ve=R.fromMessage(q):ve=new R("UnknownError",q||"Unknown failure")}return{...Ge,error:ve}}import{randomUUID as p6}from"crypto";import{remote as qJ}from"webdriverio";var ag="NATIVE_APP";var sg=class{constructor(e){this.driver=e}async executeWebViewScript(e,t,...n){return this.executeInContext(e,async o=>{let i=new Function("...args",`${tu.safariUtilsLibJs}; const userFn = ${t.toString()}; return userFn(momenticFunctions, ...args);`);return o.execute(i,...n)})}async executeInNativeContext(e){return this.executeInContext(ag,e)}async executeInContext(e,t){return await this.driver.switchContext(e),await t(this.driver)}};import{createInstanceClient as VJ}from"@limrun/api/ios-client";import{hostname as $J}from"os";async function xD(r){let{apiClient:e,logger:t,creationOpts:n,logLevel:o,orgId:i,sessionId:a,onConnectionStateChange:s}=r,{token:c,webRtcUrl:l,wdaUrl:u,apiUrl:d,id:p,region:m}=await e.createIosEmulator({...n,hostname:$J(),sessionId:a});t.info({emulatorName:p,region:m,sessionId:a},"ios instance creation ok");let g=await nt.recordDuration({fn:async()=>await VJ({apiUrl:d,token:c,logLevel:o}),name:"test_event_duration",tags:["name:limbar-client-creation","clientOs:ios",`orgId:${i}`]});return s&&g.onConnectionStateChange(s),{close:()=>{g.disconnect()},limbarToken:c,limbarWebRtcUrl:l,limbarApiUrl:d,limbarWdaUrl:u,emulatorName:p,limbarClient:g}}async function _D({wdaUrl:r,token:e}){try{let t=new AbortController;return setTimeout(()=>t.abort(),3e3),await fetch(r+"/status",{headers:{Authorization:`Bearer ${e}`},signal:t.signal}),!0}catch{return!1}}async function MD({creationOpts:r,apiClient:e,logger:t,driverLogLevel:n,appiumPort:o,orgId:i,sessionId:a,callbacks:s}){let c=Date.now();t.info("Starting ios driver creation");let{onLimbarConnectionStateChange:l}=s,u=[],d=await xD({apiClient:e,logger:t,creationOpts:r,orgId:i,sessionId:a,onConnectionStateChange:l}),p=d.emulatorName;u.push(()=>e.deleteIosEmulator(p),d.close);let m=async()=>{for(let g=u.length-1;g>=0;g-=1)try{await u[g]()}catch(h){if(h instanceof Error&&["ECONNREFUSED","ECONNRESET","UND_ERR_CLOSED"].some(f=>h.message.includes(f)))continue;t.warn({err:h},"Error running cleanup task")}};try{let g=await KJ({logger:t,driverLogLevel:n,appiumPort:o,emulatorStart:c,emulatorCreationParams:d,apiClient:e,creationOpts:r,orgId:i,sessionId:a,callbacks:s});return u.push(g.appiumClose),u.push(async()=>g.driver.deleteSession()),g.driver.getPageSource().catch(()=>{}),{...d,...g,driver:new sg(g.driver),cleanup:m,appiumPort:o}}catch(g){throw await m(),new Error(`Failed to start Appium driver: ${g}`)}}async function KJ({logger:r,driverLogLevel:e="warn",emulatorStart:t,appiumPort:n,emulatorCreationParams:o,callbacks:{onStatusUpdate:i,onLimbarConnectionStateChange:a}}){let s=[],{emulatorName:c,limbarWdaUrl:l,limbarApiUrl:u,limbarToken:d,limbarClient:p}=o,m=Date.now(),{close:g,logFile:h}=await qc({logger:r,logLevel:e,appiumPort:n});await _D({wdaUrl:l,token:d})||(r.debug({emulatorName:c},"WDA is not running on the Limbar iOS emulator"),await p.simctl(["launch","booted","com.facebook.WebDriverAgentRunner.xctrunner"]).wait(),r.debug({emulatorName:c},"WDA launched"));let f={platformName:"iOS","appium:automationName":"XCUITest","appium:noReset":!0,"appium:fullReset":!1,"appium:webDriverAgentUrl":l,"appium:wdaLocalPort":443,"appium:useNewWDA":!1,"appium:usePreinstalledWDA":!0,"appium:newCommandTimeout":3600,"appium:autoWebview":!1,"appium:webviewConnectTimeout":500,"appium:webviewConnectRetries":5,"appium:includeSafariInWebviews":!0,"appium:fullContextList":!1,"appium:additionalWebviewBundleIds":["*"],"appium:waitForQuiescence":!1,"appium:settings":{customSnapshotTimeout:0},"appium:limInstanceApiUrl":u,"appium:limInstanceToken":d,"appium:wdaRequestHeaders":{Authorization:`Bearer ${d}`}},y=Date.now(),E=await qJ({capabilities:f,hostname:"localhost",port:n,path:"/",protocol:"http",logLevel:e}),b=new Map;return E.on("command",M=>{b.set(M.command,Date.now())}),E.on("result",M=>{let O=b.get(M.command);if(!O)return;let v=Date.now()-O;M.result instanceof Error?r.warn({err:M.result,command:M.command,args:M.body,durationMs:v},"Appium cmd failed"):v>1e4&&r.warn({command:M.command,args:M.body,durationMs:v},"Appium cmd took very long"),b.delete(M.command)}),r.info({timings:{emulatorDuration:m-t,appiumDuration:y-m,wdioDuration:Date.now()-y},capabilities:f,emulatorName:c},"Started Appium driver"),{onStatusUpdate:i,driver:E,appiumClose:async()=>{await g(),await Promise.all(s.map(M=>M()))},appiumPort:n,appiumLogFile:h,emulatorName:c}}import{createHash as c6}from"crypto";import u6 from"jpeg-js";import{PNG as FD}from"pngjs";import r6 from"@prettier/plugin-xml";import n6 from"prettier";import{DOMParser as o6,XMLSerializer as i6}from"slimdom";import{reduce as YJ}from"lodash-es";var XJ=new Set(["id","processId","bundleId","type","accessible","index","x","y","width","height"]),JJ=new Set([]),ZJ=new Set(["name","label","traits"]),QJ=new Set(["live-region","drawing-order"]),e6=new Set(["visible","enabled"]);function ID(r){let e={},t=r.tagName,n=YJ(r.attributes,(o,i)=>(o[i.name]=i.value,o),{});for(let[o,i]of Object.entries(n))XJ.has(o)||o==="class"&&t===i||o==="focusable"&&i==="true"&&n.clickable==="true"||JJ.has(o)&&i==="false"||ZJ.has(o)&&i===""||e6.has(o)&&i==="true"||QJ.has(o)&&i==="0"||(e[o]=i);return e.name&&e.label&&e.name===e.label&&delete e.label,e.name&&e.value&&e.name===e.value&&delete e.value,e}function lg(r){let e=r.getAttribute("x"),t=r.getAttribute("y"),n=r.getAttribute("width"),o=r.getAttribute("height");if(e===null||t===null||n===null||o===null)return;let i=parseFloat(e),a=parseFloat(t),s=parseFloat(n),c=parseFloat(o);if(!(isNaN(i)||isNaN(a)||isNaN(s)||isNaN(c)))return[i,a,i+s,a+c]}function Zb(r,e){let[t,n,o,i]=e;r.setAttribute("bounds",`[${t}, ${n}, ${o}, ${i}]`)}function t6(r){let e=r.match(/\[\s*([-\d.]+)\s*,\s*([-\d.]+)\s*,\s*([-\d.]+)\s*,\s*([-\d.]+)\s*\]/);if(!e)return;let t=parseFloat(e[1]),n=parseFloat(e[2]),o=parseFloat(e[3]),i=parseFloat(e[4]);if(!(isNaN(t)||isNaN(n)||isNaN(o)||isNaN(i)||o<t||i<n))return[t,n,o,i]}function PD(r){let e=r.getAttribute("bounds");if(e)return t6(e)}function OD(r,e){if(!e)return!0;let t=lg(r);return t?Qb(t,e):!0}function Qb(r,e){if(!e)return!0;let[t,n,o,i]=r;return!(o<e.left||t>e.right||i<e.top||n>e.bottom)}var LD=new Set(["XCUIElementTypeWebView"]);function a6(r){if(LD.has(r.tagName))return!0;let e=r.getAttribute("name");if(e&&(e.startsWith("TabDocument")||e.startsWith("BrowserView"))){let t=e.match(/UUID=([A-F0-9-]+)/),n=e.match(/WebViewProcessID=(\d+)/);if(t&&n)return!0}return!1}function s6(r){let e=["android.widget.","android.view.","android.webkit.","android.app.","android.support.","androidx.","com.android.inputmethod."];for(let t of e)if(r.startsWith(t))return r.substring(t.length);return r}function eE(r,e){let{idCounter:t,idToElement:n}=r,o=t.value++;e.setAttribute("id",String(o)),n.set(o,e)}function tE(r){if(LD.has(r.tagName))return r.children.length>0?tE(r.children[0]):void 0;if(r.tagName==="XCUIElementTypeOther"&&r.hasAttribute("name")&&r.hasAttribute("label"))return lg(r);if(r.children.length===1){let e=r.children[0];return tE(e)}}function ND(r,e,t,n){let{document:o}=t,{parentFrameBounds:i,pruneElementsOutsideBounds:a}=n;if(e.type==="element"){let s=o.createElement(e.role||e.tag);if(e.name&&s.setAttribute("name",e.name),e.description&&s.setAttribute("description",e.description),e.classes&&e.classes.length>0&&s.setAttribute("classes",e.classes.join(" ")),e.attrs)for(let[u,d]of Object.entries(e.attrs))s.setAttribute(u,d);let c=e.boundingRect,l=[i[0]+c.x,i[1]+c.y,i[0]+c.x+c.width,i[1]+c.y+c.height];if(!Qb(l,a))return;Zb(s,l),eE(t,s),r.appendChild(s);for(let u of e.children)ND(s,u,t,n)}else if(e.type==="text"){let s=o.createElement("text");eE(t,s),r.appendChild(s);let c=o.createTextNode(e.text);s.appendChild(c)}}function DD(r,e,t,n){let{pruneElementsOutsideBounds:o}=n,{document:i}=t;eE(t,e);let a=ID(r);for(let[l,u]of Object.entries(a))e.setAttribute(l,u);let s=lg(r);if(s&&Zb(e,s),a6(r)){let{removeWebviewContent:l,injectedWebviewContent:u}=n;if(l)return;if(u){let d=tE(r);if(d){ND(e,u,t,{parentFrameBounds:d,pruneElementsOutsideBounds:o});return}}}let c=Array.from(r.childNodes??[]);for(let l of c){let u=l.nodeType;if(u===3){let d=l.nodeValue;d&&d.trim().length>0&&e.appendChild(i.createTextNode(d));continue}if(u===1){let d=l;if(!OD(d,o))continue;let p=i.createElement(s6(d.tagName));DD(d,p,t,n),e.appendChild(p)}}}async function l6(r,e,t){let n=r.parseFromString("<AppiumAUT/>","text/xml"),o=new Map,i={document:n,idToElement:o,idCounter:{value:0}},a=n.documentElement;DD(e,a,i,t);let s=new i6().serializeToString(n),c=await n6.format(s,{parser:"xml",plugins:[r6],printWidth:120,tabWidth:1,singleAttributePerLine:!1});return{prunedDocument:n,idToElement:o,prunedXml:c}}async function kD(r,e){let t=new o6,o=t.parseFromString(r,"text/xml").documentElement;if(!o)throw new Error("No root element found in XML");if(o.tagName!=="AppiumAUT")throw new Error("No AppiumAUT element found in XML");let{prunedXml:i,idToElement:a,prunedDocument:s}=await l6(t,o,e);return{xml:i,idToElement:a,document:s}}var cg=class r{driver;limbarClient;orgId;options;aborter;constructor({driver:e,limbarClient:t,orgId:n,options:o,aborter:i}){this.driver=e,this.limbarClient=t,this.orgId=n,this.options=o,this.aborter=i}static async init({driver:e,limbarClient:t,orgId:n,options:o,aborter:i}){return new r({driver:e,orgId:n,options:o,aborter:i,limbarClient:t})}async getContexts(){let e=await this.driver.executeInNativeContext(async n=>await n.getContexts({})),t=e.filter(n=>n!==ag);return{contexts:e.map(n=>n),webviews:t}}async getRawScreenshotBase64(e,t=2){let n=se(),o;for(let i=0;i<t;i++)try{return await n.startAsyncSpan("EMULATOR_READ_STATE",async()=>{let a=await this.limbarClient.screenshot(),s=Buffer.from(a.base64,"base64"),c=u6.decode(s),l=new FD({width:c.width,height:c.height});return l.data=Buffer.from(c.data),FD.sync.write(l).toString("base64")},{name:"Take screenshot",signal:this.aborter.controller?.signal,timeoutMs:3e3})}catch(a){if(o=a,e.warn({err:a},"Failed to take screenshot"),i===t-1)throw a}throw new R("InternalWebAgentError",`Failed to take screenshot: ${o}`)}async getCurrentScreenshotPngString(e){return`data:image/png;base64,${await this.getRawScreenshotBase64(e,1)}`}async waitForScreenshotStability({logger:e,timeoutMs:t,signal:n,reason:o,tolerancePercent:i=1}){let a=Date.now(),s,c=!1;for(;Date.now()-a<t;){if(n?.throwIfAborted(),!s){s=await this.getRawScreenshotBase64(e);continue}let l=await this.getRawScreenshotBase64(e);if(Is(s,l)<=i){c=!0;break}s=l,await J(250,n)}c||e.warn({purpose:o},"Timed out waiting for screenshot stability")}async waitForPageSourceStability({logger:e,timeoutMs:t,signal:n,reason:o}){await se().startAsyncSpan("WAIT_FOR_PAGE_STABILITY",async i=>{i.attributes.reason=o;let a=Date.now(),s,c,l=!1;for(;Date.now()-a<t;){c&&c<250&&await J(250-c,n),n?.throwIfAborted();let u=Date.now(),d;try{d=await this.limbarClient.elementTree()}catch(m){e.warn({err:m},"Failed to get page source during stability wait"),c=Date.now()-u;continue}let p=c6("md5").update(d).digest("hex");if(c=Date.now()-u,s&&s===p){l=!0;break}s=p}l||(i.attributes.timedOut=!0,e.warn({purpose:o},"Timed out waiting for page source stability"))})}async getActiveWebview(){let t=(await this.getContexts()).webviews;if(t.length>1)throw new R("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");return t[0]}async getActiveWebviewContent(){let e=await this.getActiveWebview();if(!e)return;this.throwIfAborted();let t=await this.driver.executeWebViewScript(e,n=>n.dumpA11yTree());if(t)return JSON.parse(t)}async getDomState(e,t){let o=t?.filterOffscreenElements??!0?await this.getViewportBounds():void 0,i=await this.getPageSource();this.throwIfAborted();let a;if(!t?.skipFetchingFullWebviewContent)try{a=await this.getActiveWebviewContent()}catch(c){e.error({err:c},"Could not get webview info to get the nested DOM state")}return this.throwIfAborted(),{graph:await kD(i,{injectedWebviewContent:a,removeWebviewContent:t?.removeWebviewContent,pruneElementsOutsideBounds:o})}}async getPageSource(){return await se().startAsyncSpan("EMULATOR_READ_STATE",()=>this.driver.executeInNativeContext(async n=>n.getPageSource()),{name:"Get iOS page source",signal:this.aborter.controller?.signal})}async getViewportBounds(){let e=await this.driver.executeInNativeContext(async t=>t.getWindowRect());return{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height}}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}};function UD({aiResponse:r,description:e,emulatorState:t}){let n=t.graph.idToElement.get(r.id);if(!n)throw new Error(`Could not find node with id: ${r.id}`);let o=PD(n);if(!o)throw new Error(`Could not determine bounds for element with id: ${r.id}, description: ${e}`);return{target:{type:"NATIVE",bounds:o},resolvedNode:n}}var Zn=class{limbarClient;driver;stateManager;generator;fixtures;orgId;aiSettings;aborter;constructor(e){this.stateManager=e.stateManager,this.driver=e.driver,this.limbarClient=e.limbarClient,this.aborter=e.aborter,this.fixtures=e.fixtures,this.orgId=e.orgId,this.generator=e.generator,this.aiSettings=e.aiSettings}async findElement({logger:e,description:t,skipFetchingFullWebviewContent:n=!1,removeWebviewContent:o=!1,useMemory:i=!1,metadata:a}){let s=e.child({...a});await this.stateManager.waitForScreenshotStability({logger:e,timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before locating an element with AI"});let c=await this.stateManager.getDomState(e,{skipFetchingFullWebviewContent:n,removeWebviewContent:o}),l=await this.stateManager.getCurrentScreenshotPngString(e),u;try{u=await this.generator.getIosElementLocation({description:t,screenXml:c.graph.xml,screenshot:l},{logger:s,loggerTags:ye(s),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["ios-locator"]})}catch(m){throw this.throwIfAborted(),s.error({err:m},"Failed to locate element"),new Error(`ActionFailureError: Failed to locate element: ${m instanceof Error?m.message:m}`)}if(u.id===-1)throw new R("NoMatchingElementError",u.thoughts??"No matching element found");let{target:d,resolvedNode:p}=UD({aiResponse:u,description:t,emulatorState:c});return{resolvedTarget:{...d,resolvedNode:p},thoughts:u.thoughts}}async wrapTargetingAction(e){let{logger:t,action:n,description:o,command:i,cacheIsInvalidAfterResolution:a,skipFetchingFullWebviewContent:s=!1,removeWebviewContent:c=!1}=e,l={commandId:i.id},u=!1,d;i.disableCache&&(t.debug({command:i},"Cache explicitly disabled for command"),u=!0,d=void 0),a&&(u=!0,d=void 0),d&&d?.resolvedDescription!==o&&(t.info({description:o,cacheDescription:d?.resolvedDescription},"Cache description mismatch, clearing it automatically"),u=!0,d=void 0),t.info({description:o,cacheBustedBeforeAction:u},"Prompting AI for a new element location");let p=await this.findElement({logger:t,description:o,skipFetchingFullWebviewContent:s,removeWebviewContent:c,metadata:l}),m=p.thoughts;return{result:await n(p.resolvedTarget),thoughts:m}}constructPerformerParams(){return{limbarClient:this.limbarClient,stateManager:this.stateManager,driver:this.driver,fixtures:this.fixtures,aborter:this.aborter,orgId:this.orgId,generator:this.generator,aiSettings:this.aiSettings}}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}get abortSignal(){return this.aborter.controller?.signal}};var ug=class extends Zn{async doPress({name:e,longPress:t}){return this.driver.executeInNativeContext(n=>n.executeScript("mobile: pressButton",[{name:e,isLongPress:t}]))}};function d6(r){let e={relativePosition:r.relativePosition};if(r.doubleTap&&r.longPress)throw new Error("UserConfigurationError: Cannot specify both doubleTap and longPress");return r.doubleTap?{...e,doubleTap:!0,doubleTapDelayMs:r.doubleTapDelayMs}:r.longPress?{...e,longPress:!0,longPressDurationMs:r.longPressDurationMs}:e}var ul=class extends Zn{async tapOnAbsoluteCoordinates(e,t){let n=t.x,o=t.y;if(e.info({x:n,y:o},"Tap at coordinates"),t.longPress){let i=t.longPressDurationMs??2e3;await this.driver.executeInNativeContext(a=>a.tap({x:n,y:o,duration:i}));return}if(t.doubleTap){await this.driver.executeInNativeContext(a=>a.tap({x:n,y:o}));let i=t.doubleTapDelayMs??100;await new Promise(a=>setTimeout(a,i))}await this.driver.executeInNativeContext(i=>i.tap({x:n,y:o}))}async tapOnNativeTarget(e,t,n){let[o,i,a,s]=t.bounds,c=a-o,l=s-i,u=n?.relativePosition?.x??c/2,d=n?.relativePosition?.y??l/2;u=Math.max(0,Math.min(u,c)),d=Math.max(0,Math.min(d,l));let p=o+u,m=i+d;return await this.tapOnAbsoluteCoordinates(e,{x:p,y:m,...n}),{x:p,y:m}}async tapOnTarget({logger:e,target:t,options:n}){if("type"in t&&t.type==="NATIVE")await this.tapOnNativeTarget(e,t,n);else throw new Error("Not implemented yet")}async executeTap({logger:e,command:t}){let n=d6(t);if(t.target.type==="coordinates"){let a=await this.driver.executeInNativeContext(async l=>l.getWindowSize()),s=t.target.xPercent*a.width,c=t.target.yPercent*a.height;return await this.tapOnAbsoluteCoordinates(e,{...n,x:s,y:c}),{success:!0,message:`Tapped at ${s}, ${c}`}}let o=t.target.description,{thoughts:i}=await this.wrapTargetingAction({logger:e,command:t,action:a=>this.tapOnTarget({logger:e,target:a,options:n}),description:o});return{success:!0,message:i}}};var m6=25,dg=class extends Zn{async doType(e,t){if(!t.target){if(t.clearContent)throw new Error("UserConfigurationError: clearing content is only supported when a target is provided to the Type step");return await this.stateManager.waitForScreenshotStability({logger:e,timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for page to stabilize before typing"}),await this.sendKeys(t),{success:!0,message:"Successfully executed type action"}}if(t.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Type step");let{thoughts:n}=await this.wrapTargetingAction({logger:e,command:t,action:async o=>{if("type"in o&&o.type==="NATIVE")await this.doNativeType(e,t,o);else throw new Error("UserConfigurationError: Webview targets are not supported for the Type step on iOS devices")},description:t.target.description});return{success:!0,message:n}}async doNativeType(e,t,n){let o=new ul(this.constructPerformerParams());t.clearContent?(await o.tapOnNativeTarget(e,n,{longPress:!0}),await this.clearContent()):await o.tapOnNativeTarget(e,n),await this.stateManager.waitForScreenshotStability({logger:e,timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for keyboard to appear before typing"}),await this.sendKeys(t)}async sendKeys(e){let t=e.keyPressDelayMs??m6,n=Date.now();for(;Date.now()-n<3e3&&(this.throwIfAborted(),!await this.driver.executeInNativeContext(o=>o.isKeyboardShown()));)await new Promise(o=>setTimeout(o,500));t?await this.driver.executeInNativeContext(async o=>{await o.updateSettings({keyInjectionDelay:t}),await o.keys(e.text),await o.updateSettings({keyInjectionDelay:0})}):await this.driver.executeInNativeContext(async o=>{await o.keys(e.text)})}async clearContent(){await this.clearContentHelper()}async clearContentHelper(){}};var mg=class r extends Zn{emulatorSettings;logger;constructor(e){super(e),this.logger=e.logger,this.emulatorSettings=e.emulatorSettings}static async init({driver:e,logger:t,fixtures:n,orgId:o,options:i,abortController:a,limbarClient:s,generator:c,aiSettings:l}){let u={controller:a},d=i?.emulator??{},p=await cg.init({driver:e,orgId:o,limbarClient:s,options:d,aborter:u}),m=new r({generator:c,aiSettings:l,limbarClient:s,driver:e,stateManager:p,logger:t,fixtures:n,aborter:u,orgId:o,emulatorSettings:d});return await m.initializeSettings(),m}async executeCommand(e){let t=["type","a11yData","thoughts","cache","code"],n;try{n=await Ps({obj:e.command,context:this.fixtures.testContext,bannedKeys:t,orgId:this.orgId,logger:this.logger,signal:this.abortSignal,localTools:this.fixtures.localCodeEvalTools})}catch(o){throw this.throwIfAborted(),new Error(`ActionFailureError: Failed to substitute template strings in command: ${o.message}`,{cause:o})}try{return await this.executeCommandHelper(e)}catch(o){throw o.name!=="AbortError"&&this.logger.error({err:o},"Error thrown in action controller"),o}finally{Os(e.command,n)}}async executeCommandHelper({command:e}){let t=se();switch(e.type){case"TAP":return new ul(this.constructPerformerParams()).executeTap({logger:this.logger,command:e});case"TYPE":return new dg(this.constructPerformerParams()).doType(this.logger,e);case"STATE":{let n=await this.stateManager.getDomState(this.logger),o=await this.stateManager.getContexts();return{output:{xml:n.graph.xml,contexts:o},success:!0}}case"OPEN_APP":return await this.limbarClient.launchApp(e.packageName),{success:!0};case"PRESS":{let n=new ug(this.constructPerformerParams());switch(e.key){case"HOME":await n.doPress({name:"home"});break;case"POWER":await this.driver.executeInNativeContext(o=>o.isLocked())?await this.driver.executeInNativeContext(o=>o.unlock()):await this.driver.executeInNativeContext(o=>o.lock());break}return{success:!0}}case"AI_CHECK":{let o=e.timeoutSecs?e.timeoutSecs*1e3:5e3,i=Gm(o),a=Date.now(),s=0,c,l=!1,u;for(;s<15&&!l;){this.throwIfAborted(),l||c&&c-a>=o&&(l=!0),s!==0&&await J(i,this.abortSignal),c=Date.now();try{let d="",p="";await t.startAsyncSpan("EMULATOR_READ_STATE",async()=>{d=await this.getEmulatorDomState(),p=await this.getScreenshotBase64()},{name:"Get emulator state"});let m=await this.generator.evaluateIosAssertion({assertion:e.assertion,screenXml:d,screenshot:p},{logger:this.logger,loggerTags:ye(this.logger),agentConfigVersion:this.aiSettings.agentConfig?.["ios-assertion"]});if(m.result)return{success:m.result,message:m.thoughts};{let g=`AssertionFailureError: ${m.thoughts}`;u=new Error(g)}}catch(d){this.throwIfAborted(),this.logger.info({err:d},`AI check assert attempt ${s} failed, retrying...`),u=d instanceof Error?d:new Error(`${d}`)}finally{s++}}return{success:!1,message:u?.message}}default:throw new Error(`Unsupported mobile command type: ${e.type}`)}}async getMobileFailureRecoveryPlan(e){return{thoughts:"Failure recovery is not yet supported for iOS.",scenario:"INELIGIBLE",instructions:void 0}}async waitForPageSourceStability(e){return this.stateManager.waitForPageSourceStability({logger:this.logger,timeoutMs:e.timeoutMs??5e3,reason:e.reason,signal:this.aborter.controller?.signal})}async listInstalledApps(){let e=await this.driver.executeInNativeContext(n=>n.execute("mobile: listApps"));return Object.keys(e).filter(n=>!n.startsWith("com.apple.")&&!n.startsWith("io.appium"))}async initializeSettings(){}async getScreenshotBase64(){return this.stateManager.getRawScreenshotBase64(this.logger)}async getScreenshotPngString(){return this.stateManager.getCurrentScreenshotPngString(this.logger)}async getEmulatorDomState(){return(await this.stateManager.getDomState(this.logger)).graph.xml}async getViewportBounds(){return this.stateManager.getViewportBounds()}async waitForScreenshotStability(e){return this.stateManager.waitForScreenshotStability({logger:this.logger,timeoutMs:e.timeoutMs??5e3,reason:e.reason,signal:this.aborter.controller?.signal})}resetAbortController(e){this.aborter.controller=e??new AbortController}isAborted(){return this.aborter.controller?.signal.aborted}abort(){this.aborter.controller?.abort()}async cleanup(){}get abortSignal(){return this.aborter.controller?.signal}get context(){return this.fixtures.testContext}get localCodeEvalTools(){return this.fixtures.localCodeEvalTools}};import g6 from"zod";async function BD({runTracer:r,metadata:{orgId:e,runId:t},fixtures:{logger:n,apiClient:o,mobileGenerator:i,storage:a,cacheStorage:s,usageTracker:c,browserEnricher:l,browserGenerator:u,localCodeEvalTools:d},inputs:{project:p,testDefinition:m},env:{envName:g,envVariables:h},settings:{emulatorSettings:f,aiSettings:y},options:{logLevel:E,region:b}}){let _=Math.floor(Math.random()*1e4)+4e4,M=await Xo(_,"appium"),O=ts.or(g6.literal(Au)).optional().parse(b??f.region);if(O==="local")throw new Error("Local region is not supported for iOS tests, as we do not support local iOS emulators.");let C={region:O==="closest"?void 0:O},F=p6(),P=n.child({runAttemptId:F}),B;try{B=await MD({apiClient:o,logger:n,driverLogLevel:E,creationOpts:C,callbacks:{onStatusUpdate:W=>{n.debug({status:W},"Emulator status update")},onLimbarConnectionStateChange:W=>{W==="disconnected"?I.warn("Emulator websocket connection lost. Emulator may be unavailable."):(W==="reconnecting"||W==="connecting")&&I.info("Emulator websocket is reconnecting...")}},appiumPort:M,orgId:e,sessionId:F})}catch(W){let ue=`Fatal error creating iOS driver, failing test run attempt (runId: ${t})`;return n.error({err:W},ue),I.error({err:W},ue),{status:"FAILED",results:[],error:new R("UserConfigurationError",`Fatal error creating iOS driver: ${W.message}`)}}let D=await r.startAttempt({emulatorName:B.emulatorName,runAttemptId:F});P=P.child(D.loggerBindings||{});let ee=new Do({variablesFromEnvironment:h,envName:g,testName:m.name}),K=await mg.init({driver:B.driver,generator:i,logger:P,limbarClient:B.limbarClient,orgId:e,options:{emulator:{...f,browserSettings:p.config.browser}},aiSettings:y,fixtures:{storage:a,browserEnricher:l,browserGenerator:u,localCodeEvalTools:d,testContext:ee}}),ge;try{ge=await il({platform:"IOS",containerName:`ios test ${m.name}`,fixtures:{controller:K,logger:P,cacheStorage:s,usageTracker:c},work:{state:{failureRecoveryDisabled:y.failureRecovery===!1,failureRecoveryAttempts:0}},inputs:{testName:m.name,steps:m.steps,orgId:e,testMetadata:m},tracer:D,callbacks:{}})}finally{await B.cleanup(),await K.cleanup()}await D.finish({logger:P,results:ge.results,status:ge.status});let U;if(ge.status==="FAILED"&&ge.terminalResult){let W=ge.terminalResult.message;W?U=R.fromMessage(W):U=new R("UnknownError",W||"Unknown failure")}return{...ge,error:U}}import{cloneDeep as h6}from"lodash-es";import{debounce as f6}from"ts-debounce";var Cu="0.35.4";function S6(r){switch(r){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}function y6(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var nE=class{constructor(e,t,n,o,i,a){this.keepalive=e;this.testId=t;this.testName=n;this.diskStorage=o;this.parentTracer=i;this.orgId=a;this.interactionTracer=new Zo,nn.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;getParentStepIdChain(){return[]}recordStepDuration(e){let{durationMs:t,step:n}=e,o=n.type!=="MOBILE_PRESET_STEP"?n.type:n.command.type;nt.distribution("test_step_duration",t,[`type:${o}`,"platform:mobile","executor:cli",`orgId:${this.orgId}`])}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${Go}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${Go}/${t}.jpeg`,contents:n})}attachBeforeXmlSnapshot(e){let{snapshotId:t,xml:n}=e;this.diskStorage.storeFile({name:`${Go}/${t}.xml`,contents:n})}attachAfterXmlSnapshot(e){let{snapshotId:t,xml:n}=e;this.diskStorage.storeFile({name:`${Go}/${t}.xml`,contents:n})}async finishInternal(e){this.finished||(this.finished=!0,this.interactionTracer.finish(),await Promise.all(this.children.map(t=>t.finish({status:y6(e.status),finishedAt:e.finishedAt}))))}async finish(e){return await this.finishInternal({status:e.result.status,finishedAt:new Date(e.result.endTime)}),{trace:this.interactionTracer.getRootSpan()}}async startSubSteps(){let e=new dl(this.keepalive,this.testId,this.testName,this.diskStorage,this.orgId);return this.children.push(e),e}},dl=class{constructor(e,t,n,o,i){this.keepalive=e;this.testId=t;this.testName=n;this.diskStorage=o;this.orgId=i}children=[];finished=!1;async getScreenshot(e){return this.diskStorage.readFile(`${Go}/${e}.jpeg`)}getParentStepIdChain(){return[]}async startStep(e){this.keepalive();let t=new nE(this.keepalive,this.testId,this.testName,this.diskStorage,this,this.orgId);return this.children.push(t),t}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finishInternal({status:S6(e.status),finishedAt:e.finishedAt}))))}},oE=class{constructor(e,t,n,o,i,a,s){this.keepalive=e;this.testId=t;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.orgId=s;this.diskStorage.mkdir("assets"),this.logStream=this.diskStorage.createFileStream("assets/logs.logcat"),this.resourceUsageStream=this.diskStorage.createFileStream(`${Go}/resource-usage.ndjson`),this.resourceUsageSampler=Aw({keepSamples:!1,onSample:c=>{this.resourceUsageStream.write(`${JSON.stringify(c)}
4661
4661
  `)}})}finished=!1;children=[];logStream;resourceUsageStream;resourceUsageSampler;get loggerBindings(){return{runAttemptId:this.runAttemptId}}appendLogs(e){let t=e.join(`
4662
4662
  `);this.logStream.write(t+`
4663
4663
  `)}async finish(e){if(this.finished)return;this.finished=!0;let{logger:t,status:n,results:o,beforeResults:i,afterResults:a}=e,s={...this.metadata,status:n,assetDetails:e.assetDetails,finishedAt:new Date,results:_m(o,t),beforeResults:i?_m(i,t):void 0,afterResults:a?_m(a,t):void 0};await Promise.all(this.children.map(c=>c.finish({status:s.status,finishedAt:s.finishedAt})));try{this.logStream.end()}catch{}try{this.resourceUsageSampler.stop(),this.resourceUsageStream.end()}catch{}this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(s,null,2)})}async startBeforeStepList(){let e=new dl(this.keepalive,this.testId,this.testName,this.diskStorage,this.orgId);return this.children.push(e),e}async startMainStepList(){let e=new dl(this.keepalive,this.testId,this.testName,this.diskStorage,this.orgId);return this.children.push(e),e}async startAfterStepList(){let e=new dl(this.keepalive,this.testId,this.testName,this.diskStorage,this.orgId);return this.children.push(e),e}async getScreenshot(e,t){return this.diskStorage.readFile(`${Go}/${t}.jpeg`)}},iE=class{constructor(e,t,n,o,i,a,s){this.client=e;this.testId=t;this.testName=n;this.runId=o;this.metadata=i;this.diskStorage=a;this.orgId=s}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}async finish(e){if(this.finished)return;this.finished=!0;let t={...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,status:t.status,results:[],beforeResults:[],afterResults:[]}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)}),this.diskStorage.close()}async startAttempt(e){let{runAttemptId:t}=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 n=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),o={id:t,schemaVersion:_o,runAttemptSchemaVersion:cw,startedAt:new Date,status:"RUNNING"};n.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)});let i=f6(async()=>{await this.client.extendAndroidEmulatorTtl(e.emulatorName)},3e4,{maxWait:6e4}),a=new oE(()=>void i(),this.testId,this.testName,t,o,n,this.orgId);return this.children.push(a),a}},pg=class r{constructor(e,t,n,o,i){this.orgId=e;this.runGroupId=t;this.metadata=n;this.client=o;this.diskStorage=i}children=[];finished=!1;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start({orgId:e,runGroupId:t,outputDir:n,client:o,gitMetadata:i,labels:a,suiteName:s}){let c={...i,suiteName:s,id:t,trigger:wr.CLI,startedAt:new Date,status:"RUNNING",cliVersion:Cu,labels:a??[]},l=new yu(n);return l.storeFile({name:"metadata.json",contents:JSON.stringify(c,null,2)}),new r(e,t,c,o,l)}async finish(e){if(this.finished)return;this.finished=!0;let{status:t}=e,n={...this.metadata,status:t,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 t=this.diskStorage.createRunArchive(e.runId),n={stepsSnapshot:e.originalSteps.steps,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName,testDescription:e.testDescription,directory:e.directory,labels:e.testLabels,trigger:"CLI",status:"RUNNING",environmentName:e.environmentName,cliVersion:Cu,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0,quarantined:e.quarantined,quarantinedReason:e.quarantinedReason,executionType:Ul(e.platform),aiSettings:e.aiSettings};t.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new iE(this.client,e.testId,e.testName,e.runId,n,t,this.orgId);return this.children.push(o),o}};function zD(r){return{platform:r.platform,originalSteps:{steps:h6(r.steps),beforeSteps:void 0,afterSteps:void 0}}}async function GD(r){let{inputs:e,fixtures:t,metadata:n}=r,{tracer:o,logger:i}=t,{runId:a}=n,{platform:s,testDefinition:c,project:l}=e,u=new Date,d=await o.startRun({...zD(c),logger:i,testId:c.id,testName:c.name,directory:b6(c.relativeFilePath),runId:a,testDescription:c.description,testLabels:c.labels,schemaVersion:c.schemaVersion,quarantined:c.quarantined,quarantinedReason:c.quarantinedMetadata?.quarantinedReason,aiSettings:l.config.ai}),p=i.child(d.loggerBindings||{}),m=1+(c.settings?.retries??l.config.retries??1);for(let g=0;g<m;g++){let h=new Date,f=await E6({...r,runTracer:d,fixtures:{...t,logger:p},constants:{attemptNumber:g,totalAttempts:m}}),y=new Date;if(f.status!=="FAILED")return await d.finish({logger:p,status:f.status,failureRecoveryDetails:f.failureRecoveryDetails,finishedAt:y}),{...f,testMetadata:c,platformType:Ul(s),steps:c.steps,startedAt:u,lastAttemptStartedAt:h,finishedAt:y,runId:a,attempts:g+1,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedMetadata:c.quarantinedMetadata,status:f.status};if(g!==m-1){p.warn("Retrying failed mobile run");continue}p.error("Mobile test failed after all exhausting attempts");let E={failureReason:f.error?.reason,failureDetails:f.error?{errorMessage:f.error.message,errorStack:f.error.stack}:void 0};return await d.finish({logger:p,status:f.status,...E,finishedAt:y}),{...f,testMetadata:c,platformType:Ul(s),steps:c.steps,startedAt:u,lastAttemptStartedAt:h,finishedAt:y,runId:a,...E,attempts:g+1,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedMetadata:c.quarantinedMetadata,status:f.status}}throw new Error("This code should not be reachable")}async function E6(r){let{runTracer:e,metadata:t,constants:n,fixtures:o,inputs:i,options:a}=r,{attemptNumber:s,totalAttempts:c}=n,{orgId:l,gitMetadata:u}=t,{apiClient:d,logger:p,usageTracker:m}=o,{testDefinition:g,logUpdate:h,project:f,envOverride:y}=i,{regenerateCache:E,alwaysSaveCache:b,noCache:_}=a;s!==0&&h("RETRY",`attempt ${s}/${c}`);let M={...i.project.config.emulator,...g.settings?.emulator},O={...f.config.ai,useMemory:f.config.ai?.useMemory!==!1,...g.settings?.ai},v=y||g.settings?.defaultEnv,F=(v?ga(v,f,p):void 0)?.variables??{},P=gi({logger:p,orgId:l,client:d,gitMetadata:u,regenerateCache:E,alwaysSaveCache:b,noCache:_}),B=new Zs(d,l),D={type:"API_KEY",baseUrl:d.baseUrl,apiKey:d.apiKey,logger:p,mode:"runner"},ee=new tl(D),K=new ya(O.agentConfig,D),ge=new Js(D,K),U=new el({httpClient:d,fakerSeed:f.config.advanced?.fakerConstantSeed?fd:void 0}),W={orgId:l,runTracer:e,metadata:t,options:a,fixtures:{logger:p,apiClient:d,mobileGenerator:ee,storage:B,cacheStorage:P,usageTracker:m,browserEnricher:ge,browserGenerator:K,localCodeEvalTools:U},env:{envName:v,envVariables:F},settings:{aiSettings:O,emulatorSettings:M}};switch(i.platform){case"ANDROID":return await CD({...W,inputs:i});case"IOS":return await BD({...W,inputs:i})}}import{existsSync as R6,mkdirSync as w6,statSync as C6}from"fs";import x6 from"path";import{z as qut}from"zod";import T6 from"junit-report-builder";import gg from"path";function HD(r,e){r.property("quarantined","true"),r.property("dd_tags[quarantined]","true"),e.quarantinedReason&&(r.property("quarantined_reason",e.quarantinedReason),r.property("dd_tags[quarantined_reason]",e.quarantinedReason)),e.quarantinedAt&&(r.property("quarantined_at",e.quarantinedAt.toISOString()),r.property("dd_tags[quarantined_at]",e.quarantinedAt.toISOString()))}function v6(r,e){if(e.name(r.testName).className(r.testName).file(gg.relative(".",r.filePath)).property("id",r.testId).property("dd_tags[id]",r.testId),r.labels&&(e.property("labels",r.labels.join(",")),r.labels.forEach(t=>{e.property("dd_tags[label]",t)})),r.baseUrl&&(e.property("base_url",r.baseUrl),e.property("dd_tags[base_url]",r.baseUrl)),r.runId&&(e.property("run_url",`https://app.momentic.ai/runs/${r.runId}`),e.property("dd_tags[run_url]",`https://app.momentic.ai/runs/${r.runId}`)),r.quarantinedMetadata&&HD(e,r.quarantinedMetadata),r.setupFailed&&(e.property("setup_failed","true"),e.property("dd_tags[setup_failed]","true")),r.mainFailed&&(e.property("main_failed","true"),e.property("dd_tags[main_failed]","true")),r.teardownFailed&&(e.property("teardown_failed","true"),e.property("dd_tags[teardown_failed]","true")),r.status==="FAILED"){if(r.failureReason){let t=Pg[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||zu[r.failureReason];r.runId&&(n+=` Visit https://app.momentic.ai/runs/${r.runId} for more details.`),e.failure(n,t)}r.failureDetails?.errorStack&&e.stacktrace(r.failureDetails.errorStack)}else r.status==="CANCELLED"&&e.skipped();return e.time((r.finishedAt.getTime()-r.lastAttemptStartedAt.getTime())/1e3).property("started_at",r.lastAttemptStartedAt.toISOString()).property("dd_tags[started_at]",r.lastAttemptStartedAt.toISOString()).property("finished_at",r.finishedAt.toISOString()).property("dd_tags[finished_at]",r.finishedAt.toISOString()),e.property("attempts",r.attempts.toString()).property("dd_tags[attempts]",r.attempts.toString()),r.parameters?.envName&&(e.property("environment",r.parameters.envName),e.property("dd_tags[environment]",r.parameters.envName)),r.parameters?.urlOverride&&e.property("url_override",r.parameters.urlOverride),e}function A6(r,e,t){let{suiteId:n,suiteName:o,startedAt:i,finishedAt:a,testsToSkip:s,quarantinedTestsToSkip:c,quarantinedTestsMetadata:l}=e,u=r.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 t){let p=u.testCase();v6(d,p)}for(let d of s){let p=u.testCase();p.name(d.name).className(d.name).file(gg.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(gg.relative(".",d.relativeFilePath)).property("id",d.id);let m=l[d.id];m&&HD(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 aE(r,e,t){let n=T6.newBuilder();A6(n,e,t),n.writeTo(gg.join(r,`${e.suiteName}.xml`))}function _6(r){return{testName:x6.basename(r.filePath,".test.yaml")||r.filePath.split("/").pop()?.replace(".yaml","")||r.filePath,testId:r.testMetadata.id,filePath:r.filePath,labels:r.testMetadata.labels,baseUrl:void 0,runId:r.runId,quarantined:r.quarantined,quarantinedMetadata:r.quarantinedMetadata,status:r.status,setupFailed:void 0,mainFailed:void 0,teardownFailed:void 0,failureDetails:r.failureDetails,failureReason:r.failureReason,finishedAt:r.finishedAt,lastAttemptStartedAt:r.lastAttemptStartedAt,attempts:r.attempts,parameters:r.parameters}}async function WD({format:r,params:e,runs:t,folder:n}){switch(R6(n)?C6(n).isDirectory()||(I.error(`The specified reporter output directory '${n}' exists on disk but is not a folder. Please move or delete the existing object or specify a different reporter path.`),process.exit(1)):(I.info(`Reporter output directory '${n}' does not exist on disk, creating it now...`),w6(n,{recursive:!0})),r){case"junit":{let o=t.map(_6);aE(n,e,o);return}case"allure":case"allure-json":I.error(`The specified reporter format '${r}' is not supported for mobile tests.`);return;case"playwright-json":I.error(`The specified reporter format '${r}' is not supported for mobile tests.`);return;default:throw new Error(`Unknown reporter format requested: '${r}'`)}}async function jD(r,e,t){if(t)return{};try{return(await e.getQuarantinedTests()).quarantined.reduce((o,i)=>(o[i.testId]={quarantinedAt:i.quarantinedAt,quarantinedReason:i.quarantinedReason},o),{})}catch(n){return r.warn({err:n},"Failed to fetch quarantined tests, proceeding without them."),{}}}async function bo(){try{await Y(Promise.all([Sw(),nt.flush()]),{milliseconds:5e3})}catch{}}async function VD(r){let{options:e,fixtures:t,inputs:n,metadata:o}=r,{project:i,apiClient:a,logger:s}=t,{orgId:c,runGroupId:l,gitMetadata:u}=o,{suiteName:d,outputDir:p,parallel:m}=e;I6(p)&&I.warn(`Output directory ${p} already exists, removing before test execution...`);let g=B_({items:n.testDefinitions,shardIndex:e.shardIndex??1,shardCount:e.shardCount??1,sortKey:D=>D.relativeFilePath}),h=new Set;n.testDefinitions.forEach(D=>{D.labels?.forEach(ee=>h.add(ee))});let f=s.child({orgId:c,runGroupId:l,branch:u.gitBranchName}),y=await pg.start({suiteName:d,logger:f,orgId:c,runGroupId:l,outputDir:p,client:a,gitMetadata:u,labels:Array.from(h)}),E=[],b=new Date,_=new Set,M=async()=>P6({runResults:E,startTime:b,ranTests:_,apiClient:a,uploadResults:e.uploadResults??!1,outputDir:p}),O=async D=>{I.warn(`${D} Stopping tests and printing latest results.`),await y.finish({logger:f,status:"CANCELLED"}),await M(),await bo(),process.exit(1)},v=async()=>{await O("SIGINT received.")};process.once("SIGINT",v);let C;if(e.timeoutMinutes!==void 0&&e.timeoutMinutes>0){let D=e.timeoutMinutes*60*1e3;C=setTimeout(()=>{O(`Timeout of ${e.timeoutMinutes} minute(s) reached.`)},D)}let F={};for(let D=0;D<g.length;D++){let ee=Object.values(F);ee.length===m&&await Promise.race(ee.map(U=>U.promise));let K=g[D],ge=`test-${D}`;F[ge]={done:!1,promise:(async({testDefinition:U})=>{_.add(ge);let W=U.relativeFilePath.includes("..")?U.fullFilePath:U.relativeFilePath;Vc({status:"START",testLogRef:W,getRunningTestsCount:()=>_.size,getTotalTestsCount:()=>g.length});let ue=setInterval(()=>Vc({status:"RUN",testLogRef:W,getRunningTestsCount:()=>_.size,getTotalTestsCount:()=>g.length}),5*60*1e3),le=M6(),Ge=f.child({testId:U.id,runId:le}),ve=new jm({logger:Ge,reporter:new zp(a),runType:"mobile-test-run",runId:le,testMetadata:U,suiteMetadata:void 0});try{let q={platform:U.platform,testDefinition:U},fe=await GD({metadata:{...o,runId:le},fixtures:{...t,tracer:y,logger:Ge,usageTracker:ve},inputs:{...n,...q,project:i,channel:n.channel??U.settings?.defaultChannel,tag:n.tag??U.settings?.defaultTag,logUpdate:(it,Ae)=>Vc({status:it,testLogRef:W,getRunningTestsCount:()=>_.size,getTotalTestsCount:()=>g.length,additionalText:Ae})},options:e});Vc({status:fe.status,testLogRef:W,getRunningTestsCount:()=>_.size,getTotalTestsCount:()=>g.length}),E.push(fe)}catch(q){let fe=`Encountered unexpected fatal error when running test '${U.name}': ${q.message}
@@ -4665,4 +4665,4 @@ ${q.stack}`;I.error(fe),Ge.error({err:q},`Encountered unexpected fatal error whe
4665
4665
  `)),process.exit(0)});var H6=To.command("run").alias("test").description("Run tests on the local machine");H6.addOption(Ea).addOption(Ta).addOption(ig).addOption(Gb).addOption(Yb).addOption(Xb).addOption(Hb).addOption(fD).addOption(Jb).addOption(yD).addOption(SD).addOption(Wb).addOption(jb).addOption(Vb).addOption(Kb).addOption(bD).addOption(vD).addOption(AD).addOption(RD).addOption(ED).addOption(TD).addOption(new hg("--labels <labels...>","Only run tests with the specified label(s).")).addOption($b).addOption(uD).addOption(mD).addOption(pD).addOption(gD).addOption(hD).addArgument(new xu("<tests...>","One or more test file path or folders that exist on the local machine.").argOptional()).action(async(r,e)=>{let{name:t,apiKey:n,server:o,tag:i,channel:a,outputDir:s,reporter:c,reporterDir:l,disableCache:u,saveCache:d,regenerateCache:p}=e,m=TS(e.logLevel);await sE(),I.debug({appiumHome:fg},"Resolved resource paths"),RS({disableCache:u,saveCache:d,regenerateCache:p}),U_({shardIndex:e.shardIndex,shardCount:e.shardCount});let g=await $s({configFilePath:e.config,nameFilter:e.filter}),h=s??g.config.outputDir??ZO,f=e.parallel??g.config.parallel??1,{parsingErrors:y,parsingErrorDetails:E,failedTestFilePaths:b}=await lE({project:g,logger:I});y>0&&(wS({parsingErrors:y,parsingErrorDetails:E,failedTestFilePaths:b}),process.exit(1)),I.debug("Checking API key and dependencies");let _=new Mr({baseUrl:o,apiKey:n,logger:I}),{orgId:M,userId:O}=await hb({client:_,skipPrompts:e.yes});I.debug("API key check and browser installation complete");let v=L6(),C=br.child({runGroupId:v,orgId:M,userId:O}),F=await ln(br,_,g);C.debug({gitMetadata:F,config:g.config,nodeVersion:process.versions.node},"Got local git metadata");let P=await jD(C,_,e.ignoreQuarantine),B=await Qt(g),D=await zb({tests:r,yes:e.yes,project:g,momenticFiles:B,include:e.include,exclude:e.exclude,labels:e.labels,logger:I,quarantinedTestsMetadata:P});try{let ee=await VD({options:{...e,parallel:f,outputDir:h,alwaysSaveCache:d??!1,regenerateCache:p??!1,noCache:u??!1,logLevel:m,timeoutMinutes:e.timeoutMinutes,shardIndex:e.shardIndex,shardCount:e.shardCount,reporter:c,reporterDir:l,labels:e.labels,suiteName:t},fixtures:{logger:C,project:g,apiClient:_},inputs:{envOverride:e.env,tag:i,channel:a,testDefinitions:D},metadata:{gitMetadata:F,runGroupId:v,orgId:M}});await bo(),ee.failed>0?process.exit(1):process.exit(0)}catch(ee){I.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),I.error(ee),br.error({err:ee},"Failed to run tests locally"),await bo(),process.exit(1)}});To.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new hg("--name <name>","Name of the project")).action(async r=>{I.info(`Welcome to the Momentic Mobile project setup wizard! \u{1F680}
4666
4666
  `),I.info("This wizard will help you bootstrap a new Momentic project."),va.existsSync(Vs)&&(I.error("A momentic.config.yaml file already exists in this directory. Please rename or remove it to initialize a new project."),process.exit(1));let t={name:r.name??await I_("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),include:Cp};_p(t,Vs),I.success(`Initialized Momentic project file at ${Eo.resolve(Vs)}`)});To.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: ${vS.join(", ")}.`).action(async(r,e)=>{!e.all&&r.length===0&&(I.error("No browsers specified"),process.exit(1)),await Cm({rawBrowsers:r,force:e.force,all:e.all})});async function W6(){try{await To.parseAsync(process.argv),await bo()}catch(r){br.error({err:r},"Uncaught error in CLI"),I.error(r),await bo(),process.exit(1)}}W6();
4667
4667
  //# sourceMappingURL=cli.js.map
4668
- //# debugId=a4555179-f0fc-5283-84fa-75548e31f278
4668
+ //# debugId=17a80d9e-f007-5f8d-a9d4-fa1a6bfad22e