momentic-mobile 1.4.5 → 1.4.6

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]="e8125d5e-4ef4-575b-8718-1573be81fe8f")}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]="50dd5e96-ea7c-5d9c-b214-a52be91a645b")}catch(e){}}();
4
4
  import * as w from 'zod';
5
5
  import w__default, { z, ZodOptional } from 'zod';
6
6
  import Dr from 'dedent';
@@ -169,11 +169,11 @@ ${this.decisions.map(e=>e.toString()).join(`
169
169
  Simplified format migration failed. Some files may have already been rewritten.
170
170
  Revert all local changes made by this command, fix the serialization error, then re-run the migration.
171
171
  Original error: ${o}
172
- `}async function Fz({dryRun:t,operation:e}){try{return await e()}catch(o){throw new Error(vce({err:o,dryRun:t}),{cause:o})}}function BT(t){return t instanceof Error?t:new Error(J(t))}function Bz(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Tm=Jr.extend({type:z.literal("AI_ACTION"),text:z.string(),steps:bn.array().optional()});var vP=Jr.extend({type:z.literal("CONDITIONAL"),skipped:z.boolean().optional()});var Cce=z.object({cacheKey:z.string(),cacheExpiryMs:z.number()}),CP=Jr.extend({id:z.guid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:z.record(z.string(),z.string()).optional(),cacheConfig:Cce.optional()}),Em=CP.extend({type:z.literal("MODULE"),moduleId:z.string().min(1).max(36),moduleName:z.string().optional()});z.union([Em.pick({type:true,moduleId:true}),z.record(z.string(),z.unknown().optional())]);var Ace=z.object({type:z.literal("URL_REGEX"),regex:z.string()}),Rce=z.object({type:z.literal("PAGE_CHECK"),substring:z.string()}),xce=z.object({cacheInvalidation:z.discriminatedUnion("type",[Rce,Ace]).optional()}),ps=z.object({moduleId:z.string().min(1).max(36),name:z.string(),description:z.string().nullish(),enabled:z.boolean().nullish(),parameters:z.string().array().nullish(),defaultParameters:z.record(z.string(),z.string()).nullish(),parameterEnums:z.record(z.string(),z.string().array()).nullish(),defaultCacheKey:z.string().nullish(),defaultCacheTtl:z.number().nullish(),defaultCacheAllInvocations:z.boolean().nullish(),autoAuth:z.boolean().nullish(),advanced:xce.nullish(),defaultRetries:z.int().min(0).nullish()});var $z=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))($z||{});var Mce=z.discriminatedUnion("type",[z.object({type:z.literal("NAVIGATE_URL"),url:z.url()}),z.object({type:z.literal("GO_TO_SECTION_START")})]),Pce=z.object({trigger:z.enum($z).optional(),attempts:z.int().optional(),restartBehavior:Mce}),ug=Jr.extend({type:z.literal("SECTION"),description:z.string().describe("user provided goal of what the section should accomplish"),plan:z.string().array().optional(),autohealingConfig:Pce.optional()});var AP=Jr.extend({type:z.literal("WHILE_LOOP"),skipped:z.boolean().optional(),maxIterations:z.number().int().positive().optional()});var Vz=ps.merge(CP).extend({type:z.literal("RESOLVED_MODULE"),steps:z.lazy(()=>Ao.array())}),UT=ps.extend({steps:z.lazy(()=>Ao.array())}),jz=ug.extend({steps:z.lazy(()=>Pa.array())}),Ice=ug.extend({steps:z.lazy(()=>Ao.array())}),zT=vP.extend({blocks:z.object({assertion:z.lazy(()=>bn),steps:z.lazy(()=>Pa.array())}).array(),elseSteps:z.lazy(()=>Pa.array().optional())}),_ce=vP.extend({blocks:z.object({assertion:z.lazy(()=>bn),steps:z.lazy(()=>Ao.array())}).array(),elseSteps:z.lazy(()=>Ao.array().optional())}),$T=AP.extend({condition:z.lazy(()=>bn).optional(),steps:z.lazy(()=>Pa.array())}),Oce=AP.extend({condition:z.lazy(()=>bn).optional(),steps:z.lazy(()=>Ao.array())}),Pa=z.discriminatedUnion("type",[bn,Tm,rg,Em,zT,$T,jz]),Ao=z.discriminatedUnion("type",[bn,Tm,rg,Vz,_ce,Oce,Ice]);var Hz=["steps","beforeSteps","afterSteps"],RP=z.enum(Hz);z.object({steps:Pa.array(),beforeSteps:Pa.array().nullish(),afterSteps:Pa.array().nullish()});var vm=z.object({steps:Ao.array(),beforeSteps:Ao.array().nullish(),afterSteps:Ao.array().nullish()}),Nu=z.object({steps:z.record(z.string(),z.unknown().optional()).array(),beforeSteps:z.record(z.string(),z.unknown().optional()).array().nullish(),afterSteps:z.record(z.string(),z.unknown().optional()).array().nullish()});var VT="1.0.24";var xP="0.0.0";var Ro="0.0.4";var Nce=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,Ti=t=>{let e=t.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var Lu=z.string().min(1).max(255).superRefine((t,e)=>{try{qi(t);}catch(o){e.addIssue({code:"custom",message:o.message,fatal:true});return}});function qi(t){if(t=t.toLowerCase().trim(),t.length===0||t.length>255)throw new Ye("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(t))throw new Ye('Name contains one of the following invalid characters: <>:"/\\|?*');if(t.endsWith("-")||t.startsWith("-"))throw new Ye("Name cannot start or end with a dash.");if(t.includes("\0"))throw new Ye("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(t))throw new Ye(`"${t}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(t)||/^\s|\s$/.test(t))throw new Ye("Name cannot start or end with a space or dot.");if(t.endsWith(".yaml"))throw new Ye('Name cannot end with ".yaml".');if(t==="none")throw new Ye("Name cannot be 'none'.");if(t.match(Nce))throw new Ye("Name cannot be a UUID. Please choose a different name.")}var jT=z.union([z.url(),z.literal(""),z.null()]).optional();var Wz="Run steps from a given step to the end, or to an optional end step. This is state-changing execution on the active session. The fromStep/toStep range is inclusive. Use stepId and parentStepIdChain values returned by Momentic tools for the active test session; do not read step ids from raw YAML files. parentStepIdChain is the list of parent step ids from root to the step's immediate parent, empty for top-level steps.";var Gz="momentic_module_create",HT="momentic_module_get";var ku="momentic_get_artifacts",qz="momentic_test_create",WT="momentic_test_get",GT="momentic_test_reload",mg="momentic_test_splice_steps",qT="momentic_run_step",Fu="momentic_session_start",Kz="momentic_session_terminate",MP="momentic_get_session_state",PP="momentic_get_environment_variables",pg="momentic_preview_step";var IP=z.enum(["setup","teardown","main"]).describe("Test section to modify: 'setup' corresponds to beforeSteps (steps that run before the test), 'teardown' corresponds to afterSteps (steps that run after the test), 'main' is synonymous with steps (the main test steps)"),Yz=z.object({id:z.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:Lu.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:z.string().optional().describe("The path of the entity to resolve.")}).describe("A selector for a single entity. Exactly one of id, name, or path must be provided. Id is recommended.").refine(t=>[t.id,t.name,t.path].filter(Boolean).length===1,"Exactly one of id, name, or path must be provided.");function Xz(t,e){let o=t??{},n=e.parameterNames??[],r=e.defaultParameters??{},i=e.parameterEnums??{},a=e.moduleName?`Module "${e.moduleName}"`:"Module",s=new Set(n),l=Object.keys(o).filter(d=>!s.has(d));if(l.length>0){let d=s.size>0?Array.from(s).join(", "):"none";throw new It(`${a} received unknown parameters: ${l.join(", ")}. Valid parameters are: ${d}`)}let c={...r,...o},u=n.filter(d=>!(d in c));if(u.length>0)throw new It(`${a} is missing required parameters: ${u.join(", ")}. Please call ${HT} to inspect the module's parameter requirements.`);for(let[d,m]of Object.entries(o)){let p=i[d];if(p&&!p.includes(m))throw new It(`${a} parameter "${d}" must be one of: ${p.join(", ")}. Received: "${m}"`)}}var Jz=z.object({phrase:z.string()}),Cm=z.object({thoughts:z.string().optional(),result:z.union([z.literal("NOT_FOUND"),z.string(),z.number(),z.array(z.unknown().optional()),z.record(z.string(),z.unknown().optional()),z.unknown().optional()])}),Lce=z.boolean().or(z.enum(Xr)).transform(t=>!(!t||t==="irrelevant")),Zz=z.object({attributes:z.array(z.string()).nullish(),text:Lce.nullish(),position:z.enum(Xr).nullish(),shape:z.enum(Xr).nullish()}),kce=z.object({id:z.int(),requirements:Zz}),Fce=kce.array(),YT=z.object({thoughts:z.string(),review:z.string().optional(),id:z.int(),updatedMemory:Wh.optional(),rememberedTraces:fT.optional(),requirements:Zz.nullish().transform(t=>t===null?void 0:t).optional(),additionalElements:Fce.nullish().transform(t=>t===null?void 0:t).optional(),citations:sn.array().optional()});var Qz=(p=>(p.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",p.FEW_WORDS="FEW_WORDS",p.STYLE_TAG="STYLE_TAG",p.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",p.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",p.NONE="NONE",p.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",p.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",p.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",p.PREFER_ASSERTION="PREFER_ASSERTION",p.HTML_ELEMENTS="HTML_ELEMENTS",p.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",p.NEEDS_DATE_VARIABLE="NEEDS_DATE_VARIABLE",p))(Qz||{});var e1=z.object({thoughts:z.string(),category:z.enum(Qz)}),Bce=z.discriminatedUnion("op",[z.object({op:z.literal("replace"),path:z.string(),value:z.string()}),z.object({op:z.literal("add"),path:z.string(),value:z.string()}),z.object({op:z.literal("remove"),path:z.string()})]);z.object({thoughts:z.string(),patches:Bce.array()});var Uce=[z.literal("add"),z.literal("replace"),z.literal("remove")],zce=z.object({op:z.union(Uce),path:z.string(),value:Ao.optional()}),t1=z.object({patches:zce.array(),thoughts:z.string()}),o1=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(o1||{}),n1=z.object({thoughts:z.string(),scenario:z.enum(o1),instructions:z.string().nullish(),reasonSummary:z.string().nullish()}),r1=z.object({reasoning:z.string(),scenario:z.string(),patch:z.null().optional()});z.object({thoughts:z.string(),evaluation:z.number().min(0).max(10)});z.object({observations:z.string(),reasoning:z.string(),command:RT});var _P=z.object({summary:z.string(),reasoning:z.string(),evaluation:z.discriminatedUnion("type",[z.object({type:z.literal("DONE")}),z.object({type:z.literal("RIGHT_TRACK")}),z.object({type:z.literal("WRONG_TRACK"),feedback:z.string()}),z.object({type:z.literal("IMPOSSIBLE")})])}),$ce=z.object({startId:z.int(),endId:z.int()}),i1=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))(i1||{}),a1=z.object({categoryThoughts:z.string(),category:z.enum(i1),relevantSections:$ce.array()}),cl=z.boolean().nullish().transform(t=>t??false),s1=z.object({thoughts:z.string().optional(),isPageReady:cl,descriptionLabels:z.object({usesTextContent:cl,usesAppearance:cl,usesPosition:cl,usesRelativeElements:cl,usesSingleQuotes:cl,isAmbiguous:cl,targetDoesNotExist:cl,usesIcon:cl}).optional()});var Vce=w.object({label:w.string(),value:w.string()});w.object({thoughts:w.string().optional().describe("only provided if a description was provided"),target:is.optional().describe("only provided if a description was provided"),pageState:w.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:Vce.array().optional().describe("list of options, provided for <select> elements only"),screenshot:w.object({data:w.string().or(rs),height:w.number().int(),width:w.number().int()}).optional().describe("only provided if returnScreenshot is true")});var l1=w.union([w.literal("ELEMENT_CHECK"),w.literal("NEGATED_CHECK"),w.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),w.literal("SELECT_OPTION"),w.literal("TYPE")]);function fg(t){if(!("useSelector"in t&&t.useSelector)){if(t.type==="SELECT_OPTION")return "SELECT_OPTION";if(t.type==="TYPE")return "TYPE";if(t.type==="ELEMENT_CHECK"&&t.assertion.type==="ELEMENT_EXISTENCE"&&t.assertion.condition==="EXISTS"&&t.assertion.negated)return "NEGATED_CHECK";if(t.type==="ELEMENT_CHECK"&&t.assertion.type==="ELEMENT_EXISTENCE"&&t.assertion.condition==="VISIBLE"&&t.assertion.negated)return "NEGATED_ELEMENT_VISIBLE_CHECK";if(t.type==="ELEMENT_CHECK")return "ELEMENT_CHECK"}}var hg=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(hg||{}),wm=w.object({matched:w.boolean(),reason:w.string().optional().describe("Human understandable description"),logs:w.string().array().optional().describe("Logs for debugging")}),jce=wm.extend({type:w.literal("USER_SELECTOR")}),Hce=wm.extend({type:w.literal("CSS_SELECTOR"),selectors:w.string().array()}),Wce=wm.extend({type:w.literal("HYBRID_SELECTOR")}),Gce=wm.extend({type:w.literal("HTML_DISTANCE"),distance:w.number().optional(),closestElement:w.string().optional(),savedElement:w.string().optional()}),qce=wm.extend({type:w.literal("TEMPLATE_MATCHING")}),Kce=wm.extend({type:w.literal("AUTO_FRAME"),logs:w.string().array().optional()});w.discriminatedUnion("type",[jce,Hce,Wce,Gce,qce,Kce]);var fs=(r=>(r.CHROMIUM="Chromium",r.GOOGLE_CHROME="Google Chrome",r.CHROME_FOR_TESTING="Chrome for Testing",r.ORG_DEFAULT="Org Default",r))(fs||{});var ul=z.object({width:z.number().min(200).max(1e4),height:z.number().min(200).max(1e4)}),c1={"Desktop Large":{width:1920,height:1080}};var oc=c1["Desktop Large"],u1="en-us",d1="America/Los_Angeles",Yce="Chromium",Am={latitude:37.7749,longitude:-122.4194};var Xce={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"};function DP(t){return !t||t==="Org Default"?Yce:t}function NP(t){return t==="ffmpeg"?"npx momentic install-browsers ffmpeg":`npx momentic install-browsers ${Xce[DP(t)]}`}var XT=(a=>(a.ClipboardRead="clipboard-read",a.ClipboardWrite="clipboard-write",a.Microphone="microphone",a.Camera="camera",a.Geolocation="geolocation",a.LocalNetworkAccess="local-network-access",a))(XT||{});var JT=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var Jce=z.enum(["off","test","prefer","always"]),LP=z.object({autoFollowNewTabs:z.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:z.union([z.boolean(),z.literal("inputs-only")]).optional(),ignoreHrefForCaching:z.boolean().optional(),disableSecondaryCacheResolution:z.boolean().optional(),hybridSelectorMode:Jce.optional(),globalLocatorRedirect:z.union([z.boolean(),z.literal("always")]).optional(),forceClickForMissingRedirectElement:z.boolean().optional(),visualActions:z.boolean().optional(),autoExpandIframes:z.boolean().optional(),disableHtmlSnapshots:z.boolean().optional(),recordVideo:z.boolean().optional(),defaultBrowserType:z.enum(fs).optional(),importantAttributes:z.string().array().optional(),importantClasses:z.string().array().optional(),importantStyles:z.string().array().optional(),bannedAttributes:z.string().array().optional(),includeLocatorBoundingBoxes:z.boolean().optional()});var kP="prefer";var m1=1e4,p1=6e4,Zce=z.object({server:z.string(),username:z.string().optional(),password:z.string().optional()}),dl=LP.extend({timezone:z.enum(JT).optional().describe("Default timezone for all tests. Can be overridden at the test level."),useHostTimezone:z.boolean().optional().describe("Use the host machine's timezone instead of the configured default. When enabled, all timezone settings are ignored."),pageLoadTimeoutMs:z.number().optional().refine(t=>t===void 0||t<=p1&&t>=-1,{message:`Page load timeout must be between 0 and ${p1/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:z.number().optional().refine(t=>t===void 0||t<=m1&&t>=-1,{message:`Smart waiting timeout must be between 0 and ${m1/1e3} seconds`}),ignorePageLoadTimeouts:z.boolean().optional(),localChromeExtensionPaths:z.string().array().optional(),extraHeaders:z.record(z.string(),z.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:z.record(z.string(),z.record(z.string(),z.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:z.string().optional(),disableGpu:z.boolean().optional(),disableZygote:z.boolean().optional(),disableBrowserMonitoring:z.boolean().optional().describe("Disable console logs, network request recording, browser HTML snapshots, and element trace screenshots which power various features in the run viewer"),disableConsoleLogs:z.boolean().optional().describe("Disable console log recording in the run viewer."),disableNetworkLogs:z.boolean().optional().describe("Disable network request recording in the run viewer."),allowPartialAccessibilityTree:z.boolean().optional().describe("When true (default), Momentic reads the accessibility data that the browser has already computed, which is fast and stable but can be incomplete on pages that never finish loading. When false, Momentic asks the browser to fully rebuild the accessibility tree on every read, which is more complete but much slower and can destabilize the browser on very large pages."),ignoreHttpsErrors:z.boolean().optional().describe("Ignore HTTPS errors, such as self-signed certificates and certificate errors. This can be useful for testing sites that use self-signed certificates or certificate errors."),proxy:Zce.optional().describe("HTTP proxy server to use for the entire browser. This can dramatically increase network latency."),disableFullStory:z.boolean().optional().describe("Disable FullStory, a third-party analytics tool that can significantly impact browser performance. This can be useful for testing sites that use FullStory."),grantedPermissions:z.enum(XT).array().optional().describe("List of permissions to grant to sites. If not provided, all permissions are granted."),remoteBrowser:z.boolean().optional().describe("Use a remote cloud-hosted browser instead of a local one. Connection credentials are fetched from the Momentic API server."),exposeNetwork:z.string().array().optional().describe("Additional hosts the remote browser is allowed to reach by tunneling through your machine's network. Each entry is a Playwright exposeNetwork rule: a hostname pattern (e.g. 'example.com', '*.internal.example.com') or IP literal (e.g. '10.0.0.1', '0.0.0.0:99'). Loopback addresses are always exposed. Only applies when remoteBrowser is enabled and the connection uses the Playwright protocol endpoint.")});var FP="BASE_URL";var Rm="ENV_NAME",gg="TEST_NAME",f1=z.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),h1=z.object({name:z.string(),variables:z.record(z.string().describe("variable name"),z.string().describe("variable value"))}),g1=z.object({name:z.string(),variables:z.record(z.string().describe("variable name"),z.unknown().optional().describe("variable value")),browser:dl.optional()});var nc="LOCAL_AVD_ID",b1="LOCAL_APK_PATH",rc="LOCAL_IOS_DEVICE_TYPE",y1="LOCAL_IOS_VERSION",S1="LOCAL_IOS_APP_PATH";z.object({name:z.string(),variables:z.record(z.string().describe("variable name"),z.unknown().optional().describe("variable value"))});var xm=w.object({env:w.record(w.string(),w.unknown().optional())});var bg=(i=>(i.PRECONDITION="precondition",i.REPLAY="replay",i.GENERATE="generate",i.AUTOHEAL="autoheal",i.POSTCONDITION="postcondition",i))(bg||{}),Qce=z.object({type:z.literal("SUBSTEP_CREATED"),step:Ao,status:z.enum(yo).optional()}),eue=z.object({type:z.literal("SUBSTEP_STARTED"),step:Ao}),tue=z.object({type:z.literal("LLM_TEXT_OUTPUT"),text:z.string()}),oue=z.object({type:z.literal("GENERIC_TOOL_CALLED"),toolName:z.string()}),nue=z.object({type:z.literal("SUBSTEP_EXECUTED"),step:Ao,status:z.enum(yo),message:z.string().optional()}),rue=z.object({type:z.literal("CACHED_STEPS_GENERATED"),cachedSteps:bn.array(),resolvedGoal:z.string(),lastSuccessfulRun:xT.optional()}),iue=z.object({type:z.literal("GENERATED_STEPS_SPLICED"),startIndex:z.number(),insertedSteps:bn.array(),removedSteps:bn.array()}),aue=z.object({type:z.literal("PHASE_CHANGED"),phase:z.enum(bg),totalSteps:z.number().optional(),failureMessage:z.string().optional()}),sue=z.object({type:z.literal("REPLAY_STEP"),step:bn,index:z.number(),total:z.number(),status:z.enum(yo),phase:z.enum(bg)}),lue=z.object({type:z.literal("SCREENSHOT_CAPTURED"),screenshot:og}),cue=z.object({type:z.literal("POSTCONDITION_REJECTED"),postcondition:z.string(),failureMessage:z.string(),attemptNumber:z.number()}),uue=z.object({type:z.literal("POSTCONDITION_AUTOGENERATED"),postcondition:z.string()}),due=z.object({type:z.literal("KNOWLEDGE_LOOKUP"),queries:z.string().array(),hitCount:z.number(),citations:sn.array()});z.discriminatedUnion("type",[Qce,eue,tue,oue,nue,rue,iue,aue,sue,lue,cue,uue,due]);var mue=z.object({type:z.literal("thought"),text:z.string()}),pue=z.object({type:z.literal("tool_call"),toolName:z.string()}),fue=z.object({type:z.literal("phase"),phase:z.enum(bg),totalSteps:z.number().optional(),failureMessage:z.string().optional()}),hue=z.object({type:z.literal("substep"),step:Ao,status:z.enum(yo),message:z.string().optional()}),gue=z.object({type:z.literal("replay_step"),step:bn,index:z.number(),total:z.number(),status:z.enum(yo),phase:z.enum(bg)}),bue=z.object({type:z.literal("screenshot"),screenshot:og}),yue=z.object({type:z.literal("knowledge_lookup"),queries:z.string().array(),hitCount:z.number(),citations:sn.array()}),Sue=z.discriminatedUnion("type",[mue,pue,fue,hue,gue,bue,yue]),T1=z.object({version:z.literal(1),events:Sue.array()});var BP=w.object({beforeUrl:w.string().optional(),afterUrl:w.string().optional(),message:w.string().optional(),beforeSnapshot:w.string().optional(),afterSnapshot:w.string().optional(),startedAt:w.coerce.date(),finishedAt:w.coerce.date()}),Tue=BP.extend({viewport:w.object({height:w.number(),width:w.number()}).nullish(),status:w.nativeEnum(dP),message:w.string().optional(),elementInteracted:w.string().optional()}),ac=BP.extend({status:w.nativeEnum(yo),message:w.string().optional(),data:w.unknown().optional().optional(),beforeTestContext:xm.optional(),afterTestContext:xm.optional(),failureReason:w.string().optional(),details:w.unknown().optional().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information."),trace:w.unknown().optional().describe("Web interaction trace from step execution (WebSectionSpan)"),failureClassification:OU.optional()}),UP=(o=>(o.NOT_ELIGIBLE="NOT_ELIGIBLE",o.ATTEMPTED="ATTEMPTED",o))(UP||{}),ZT=ac.merge(bn).extend({results:Tue.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:w.lazy(()=>hr.array()).optional(),failureRecoveryStatus:w.object({type:w.nativeEnum(UP),message:w.string(),shortMessage:w.string().optional()}).optional()}),Eue=ac.merge(Tm).extend({results:w.lazy(()=>ZT.array()),previousAttempts:w.lazy(()=>hr.array()).optional()}),vue=ac.merge(rg).extend({results:w.lazy(()=>ZT.array()),trajectory:T1.optional(),previousAttempts:w.lazy(()=>hr.array()).optional(),failureRecoveryReason:w.string().optional(),failureRecoveryReasonShort:w.string().optional(),citations:sn.array().optional()}),Cue=ac.merge(Em).extend({moduleName:w.string().optional(),results:w.lazy(()=>hr.array()),previousAttempts:w.lazy(()=>hr.array()).optional()}),wue=ac.merge(zT).extend({assertionResult:ZT.optional(),results:w.lazy(()=>hr.array()).describe("results for the block actually executed"),previousAttempts:w.lazy(()=>hr.array()).optional()}),Aue=ac.merge($T).extend({results:w.lazy(()=>hr.array()),iterationCount:w.number().optional(),iterationResultCounts:w.number().array().optional(),previousAttempts:w.lazy(()=>hr.array()).optional()}),Rue=ac.merge(ug).extend({results:w.lazy(()=>hr.array()),healingAttempts:w.lazy(()=>hr.array().array()).optional(),previousAttempts:w.lazy(()=>hr.array()).optional()}),hr=w.discriminatedUnion("type",[Eue,vue,ZT,Cue,wue,Aue,Rue]);ac.pick({startedAt:true,finishedAt:true,status:true,message:true,data:true});var xue=BP.extend({id:w.string().optional(),index:w.number().optional(),userFacingStepReference:w.string().optional(),description:w.string(),pageState:w.string().optional(),elementInteracted:w.string().optional(),startedAt:w.coerce.date().or(w.string()).optional().catch(void 0),finishedAt:w.coerce.date().or(w.string()).optional().catch(void 0)}),QT=xue.extend({beforeScreenshot:w.string().optional(),afterScreenshot:w.string().optional()});var zP=z.object({results:hr.array().describe("main results"),beforeResults:hr.array().optional(),afterResults:hr.array().optional()}),$P=zP.partial();var at=(o=>(o.ANDROID="ANDROID",o.IOS="IOS",o))(at||{}),eE=["ANDROID","IOS"],tE={ANDROID:"Android",IOS:"iOS"},yg=w__default.nativeEnum(at);function E1(t){switch(t){case "ANDROID":return "apk";case "IOS":return "app.zip"}}var oE=(e=>(e.WEB="WEB",e))(oE||{});var sc=z.enum(oE).or(z.enum(at)),v1=z.object({fromStepId:z.string(),parentStepIdChain:z.array(z.string())}),C1=z.object({toStepId:z.string(),parentStepIdChain:z.array(z.string())});w.custom().refine(t=>t&&t.length>0).refine(t=>t&&t[0]instanceof File,{message:"Please upload a valid file."});var Dn=t=>w.preprocess(e=>e==null?void 0:Array.isArray(e)?e:[e],w.array(t).optional()),Mm=w.string().transform(t=>{let e=t.trim();return e.length===0?void 0:e}).optional();var Sg=z.enum(["TERMINOLOGY","AGENT_RULE","FLOW","CODE_INSIGHT"]);var Pm=z.enum(["CANDIDATE","ACTIVE","PENDING_CONFLICT","REJECTED","ARCHIVED"]),VP=z.enum(["MANUAL","CRAWLER","SYSTEM","GENERATED","IMPORTED"]),Iue=z.enum(["PENDING","INDEXING","INDEXED","FAILED"]);var nE=z.enum(["locator","assertion","visual-assertion","text-extraction","failure-recovery","result-classification","ai-action","explorer","test-builder","heal-subagent"]),_ue=z.object({canonicalTerm:z.string().min(1),definition:z.string().min(1),examples:z.array(z.string().min(1)).default([])}),Oue=z.object({agentSubtype:nE,instruction:z.string().min(1)}),Due=z.object({intent:z.string().min(1),steps:z.string().min(1),successState:z.string().min(1)}),Nue=z.object({summary:z.string(),importChain:z.array(z.string()),userFacingFiles:z.array(z.object({file:z.string(),role:z.string()})),crossServiceEdges:z.array(z.string()),docsReferenced:z.array(z.string()),reasoning:z.string()}),rE=z.object({segmentId:z.string().optional(),segmentName:z.string()}),Lue=z.object({folderPath:z.string(),filePath:z.string(),segments:z.array(rE),evidence:Nue,source:z.enum(["auto-derived","user-authored"]),lastVerifiedAt:z.string().datetime().optional()}),iE=z.discriminatedUnion("type",[z.object({type:z.literal("TERMINOLOGY"),data:_ue}),z.object({type:z.literal("AGENT_RULE"),data:Oue}),z.object({type:z.literal("FLOW"),data:Due}),z.object({type:z.literal("CODE_INSIGHT"),data:Lue})]);var w1=z.discriminatedUnion("source",[z.object({source:z.literal("MANUAL"),userId:z.string().nullable()}),z.object({source:z.literal("CRAWLER"),url:z.url().nullable(),crawlerJobId:z.string().nullable(),snippet:z.string().nullable()}),z.object({source:z.literal("GENERATED"),generatorJobId:z.string().nullable(),agentName:z.string().nullable(),rationale:z.string().nullable(),metadata:z.record(z.string(),z.string()).optional()}),z.object({source:z.literal("SYSTEM"),rule:z.string().nullable()}),z.object({source:z.literal("IMPORTED"),importerSource:z.string().nullable(),externalId:z.string().nullable()})]),jP=z.object({id:z.string(),organizationId:z.string(),appId:z.string().nullable(),testId:z.string().nullable(),environmentId:z.string().nullable(),type:Sg,status:Pm,source:VP,trust:z.int().min(0).max(100),title:z.string(),body:z.string(),data:iE,provenance:w1,contentHash:z.string(),indexingState:Iue,indexedVersion:z.int().nullable(),currentVersion:z.int(),retrievalCount:z.int(),lastRetrievedAt:z.iso.datetime().nullable(),createdByUserId:z.string().nullable(),updatedByUserId:z.string().nullable(),createdAt:z.iso.datetime(),updatedAt:z.iso.datetime()});z.object({id:z.string(),itemId:z.string(),organizationId:z.string(),version:z.int(),title:z.string(),body:z.string(),data:iE,status:Pm,trust:z.int().min(0).max(100),changedByUserId:z.string().nullable(),changedBySystem:z.string().nullable(),changeNote:z.string().nullable(),changedAt:z.iso.datetime()});var kue=z.object({appId:z.string().nullable().optional(),testId:z.string().nullable().optional(),environmentId:z.string().nullable().optional()});kue.extend({type:Sg,status:Pm.optional(),source:VP,trust:z.int().min(0).max(100).optional(),title:z.string().min(1).max(500),data:iE,provenance:w1});z.object({title:z.string().min(1).max(500).optional(),data:iE.optional(),status:Pm.optional(),trust:z.int().min(0).max(100).optional(),appId:z.string().nullable().optional(),testId:z.string().nullable().optional(),environmentId:z.string().nullable().optional(),changeNote:z.string().nullable().optional()}).refine(t=>Object.entries(t).some(([e,o])=>e!=="changeNote"&&o!==void 0),{error:"at least one updatable field is required"});z.object({appId:z.string().nullable().optional(),type:Dn(Sg),status:Dn(Pm),source:Dn(VP),agentSubtype:Dn(nE),testId:z.string().optional(),environmentId:z.string().optional(),search:z.string().optional(),page:z.coerce.number().int().min(1).prefault(1),pageSize:z.coerce.number().int().min(1).max(200).prefault(50)});var A1=z.enum(["active-only","active-plus-candidates","review"]);z.object({query:z.string().min(1),appId:z.string().nullable().optional(),types:Sg.array().min(1).max(4).optional(),agentSubtype:nE.optional(),testId:z.string().nullable().optional(),environmentId:z.string().nullable().optional(),mode:A1.default("active-only"),limit:z.int().min(1).max(50).default(10),clientName:z.string().min(1).max(100),scoreMultiplier:z.number().positive().max(100).default(1)});var Fue=z.object({combined:z.number(),lexical:z.number().nullable(),vector:z.number().nullable()}),Bue=z.object({item:jP,rank:z.int().min(1),score:Fue,topChunkIndex:z.int().nullable()}),R1=z.object({hits:z.array(Bue),mode:A1});z.object({userFeedback:z.string().min(1),trace:z.record(z.string(),z.unknown()).optional(),agentType:z.string().min(1).optional()});var Uue=z.object({id:z.string(),status:Pm,title:z.string(),body:z.string(),type:Sg,isNew:z.boolean()});z.object({suggestions:z.array(Uue)});z.discriminatedUnion("type",[z.object({type:z.literal("TERMINOLOGY"),title:z.string().min(1).max(500),canonicalTerm:z.string().min(1),definition:z.string().min(1),examples:z.array(z.string()).nullish().transform(t=>t??[]),rationale:z.string().min(1)}),z.object({type:z.literal("AGENT_RULE"),title:z.string().min(1).max(500),agentSubtype:nE,instruction:z.string().min(1),rationale:z.string().min(1)}),z.object({type:z.literal("FLOW"),title:z.string().min(1).max(500),intent:z.string().min(1),steps:z.string().min(1),successState:z.string().min(1),rationale:z.string().min(1)})]);var zue=["SELECTED","RUN_ALL"],$ue=z.enum(zue),Vue=["segment_search","coverage_expansion","import_graph","code_reading"],jue=z.enum(Vue),Hue=z.object({discoverySource:jue,segmentMatch:z.boolean(),importGraphConnected:z.boolean()}),Wue=["high","medium","low"],Gue=z.enum(Wue),aE=z.object({testId:z.string(),testPath:z.string().nullable(),name:z.string(),rationale:z.string(),relevanceLabel:Gue.optional(),confidence:z.number().min(0).max(1).optional(),signals:Hue.optional()}),x1=z.object({source:z.string(),cap:z.number().int().positive().nullable()}),M1=z.object({baseRef:z.string().optional().describe("git ref to diff HEAD against when computing the AI selection. Defaults to origin/<gitMainBranch> when gitMainBranch is set."),onBaseUnavailable:z.enum(["run-all","fail","use-head"]).optional().describe("behavior when the base ref cannot be resolved: use-head (default) selects against the diff of the HEAD commit only, run-all runs every test, fail aborts the run."),targetTests:z.number().int().positive().optional().describe("soft cap on the number of tests the agent may select")}),HP=z.object({version:z.literal(2),userSummary:z.string(),toolCallCount:z.number().int().nonnegative(),selectedTests:z.array(aE),anchorSegmentIds:z.array(z.string()),budget:x1,generatedAt:z.string()});z.object({repository:z.string().min(1),headSha:z.string().min(1),baseRef:z.string().nullable().optional(),changedFiles:z.array(z.string()).default([]),diffSummary:z.string().nullable().optional(),budgetCap:z.number().int().positive().nullable().optional(),dryRun:z.boolean().default(false)});var Tg={CLAIMED:"claimed",COMPUTING:"computing",READY:"ready",ABSENT:"absent"};z.discriminatedUnion("status",[z.object({status:z.literal(Tg.CLAIMED),selectionPlanKey:z.string(),trackId:z.string(),graphVersion:z.string(),expiresInMs:z.number().int().positive()}),z.object({status:z.literal(Tg.COMPUTING),retryAfterMs:z.number().int().positive(),claimedBy:z.string().nullable()}),z.object({status:z.literal(Tg.READY),plan:HP,planId:z.string(),trackId:z.string()})]);z.object({selectionPlanKey:z.string(),repository:z.string().min(1),headSha:z.string().min(1),mode:$ue,userSummary:z.string(),toolCallCount:z.number().int().nonnegative(),selectedTests:z.array(aE),anchorSegmentIds:z.array(z.string()).default([]),budget:x1});z.object({planId:z.string(),plan:HP});z.discriminatedUnion("status",[z.object({status:z.literal(Tg.READY),plan:HP,planId:z.string()}),z.object({status:z.literal(Tg.ABSENT)})]);z.object({repository:z.string().min(1),query:z.string().min(1).max(2e3),k:z.number().int().positive().max(50)});var que=z.object({nodeType:z.string(),testId:z.string().nullable(),nodeId:z.string(),title:z.string(),summary:z.string(),testPath:z.string().nullable(),latestPassed:z.boolean().nullable(),latestQuarantined:z.boolean().nullable(),lastObservedAt:z.string().nullable(),vectorDistance:z.number().nullable(),lexicalRank:z.number().nullable(),hybridScore:z.number()});z.object({results:z.array(que)});z.object({testId:z.string(),name:z.string(),testPath:z.string().nullable(),goal:z.string().nullable(),description:z.string().nullable(),latestPassed:z.boolean(),latestQuarantined:z.boolean(),evidenceCount:z.number().int().nonnegative(),lastObservedAt:z.string().nullable(),lastObservedCommitSha:z.string().nullable(),matchedSegments:z.array(z.object({segmentId:z.string(),segmentName:z.string(),realizationId:z.string().nullable(),realizationName:z.string().nullable(),position:z.number().int().nonnegative()})),coverageEdges:z.array(z.object({journeyVariantId:z.string(),journeyId:z.string(),journeyName:z.string(),variantName:z.string(),level:z.string()}))});z.object({id:z.string(),name:z.string(),description:z.string().nullable(),realizations:z.array(z.object({id:z.string(),name:z.string()})),features:z.array(z.object({id:z.string(),name:z.string()}))});z.object({observedTests:z.array(z.object({testId:z.string(),name:z.string(),testPath:z.string().nullable(),realizationId:z.string().nullable(),latestPassed:z.boolean(),latestQuarantined:z.boolean()}))});var Kue=z.object({id:z.string(),folderPath:z.string(),filePath:z.string(),title:z.string(),segments:z.array(rE),evidenceSummary:z.string(),lastVerifiedAt:z.string().datetime().nullable()});z.object({repository:z.string().min(1),folderPaths:z.array(z.string().min(1)).min(1).max(50)});z.object({insights:z.array(Kue)});var Yue=z.object({folderPath:z.string().min(1),filePath:z.string().min(1),segments:z.array(rE).min(1),evidenceSummary:z.string().min(10).max(500)});Yue.extend({repository:z.string().min(1)});z.object({id:z.string()});var cc=Xue.configure({deterministic:false});function P1(t){let e=cc(t),{jsonString:o}=F6(e,5e4);return o}var Que=["app","version","env","namespace","host"];function $e(t){let e=t.bindings()??{},o={};for(let n of Object.keys(e)){let r=e[n];!Que.includes(n)&&typeof r=="string"&&(o[n]=r);}return o}var lE=w__default.enum(["debug","info","warn","error"]);var Eg={debug:20,info:30,warn:40,error:50},I1={20:"debug",30:"info",40:"warn",50:"error"},WP=class t{minLogLevel;logBindings;forcedStream=null;constructor(e,o){typeof e=="string"?this.minLogLevel=Eg[e]:this.minLogLevel=e,this.logBindings=o;}static singleton=new t(t.computeDefaultLogLevel(),{});static computeDefaultLogLevel(){return typeof window>"u"&&typeof process<"u"&&lE.safeParse(process?.env?.MOMENTIC_DEV_LOG_LEVEL).success?lE.parse(process.env.MOMENTIC_DEV_LOG_LEVEL):30}static _internalSingleton(){return t.singleton}logWithLevel(e,o,...n){try{this.logWithLevelHelper(e,o,...n);}catch(r){console.error(`Failed to log to console: ${r}`);}}indentMultiline(e,o=" "){return e.split(`
172
+ `}async function Fz({dryRun:t,operation:e}){try{return await e()}catch(o){throw new Error(vce({err:o,dryRun:t}),{cause:o})}}function BT(t){return t instanceof Error?t:new Error(J(t))}function Bz(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Tm=Jr.extend({type:z.literal("AI_ACTION"),text:z.string(),steps:bn.array().optional()});var vP=Jr.extend({type:z.literal("CONDITIONAL"),skipped:z.boolean().optional()});var Cce=z.object({cacheKey:z.string(),cacheExpiryMs:z.number()}),CP=Jr.extend({id:z.guid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:z.record(z.string(),z.string()).optional(),cacheConfig:Cce.optional()}),Em=CP.extend({type:z.literal("MODULE"),moduleId:z.string().min(1).max(36),moduleName:z.string().optional()});z.union([Em.pick({type:true,moduleId:true}),z.record(z.string(),z.unknown().optional())]);var Ace=z.object({type:z.literal("URL_REGEX"),regex:z.string()}),Rce=z.object({type:z.literal("PAGE_CHECK"),substring:z.string()}),xce=z.object({cacheInvalidation:z.discriminatedUnion("type",[Rce,Ace]).optional()}),ps=z.object({moduleId:z.string().min(1).max(36),name:z.string(),description:z.string().nullish(),enabled:z.boolean().nullish(),parameters:z.string().array().nullish(),defaultParameters:z.record(z.string(),z.string()).nullish(),parameterEnums:z.record(z.string(),z.string().array()).nullish(),defaultCacheKey:z.string().nullish(),defaultCacheTtl:z.number().nullish(),defaultCacheAllInvocations:z.boolean().nullish(),autoAuth:z.boolean().nullish(),advanced:xce.nullish(),defaultRetries:z.int().min(0).nullish()});var $z=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))($z||{});var Mce=z.discriminatedUnion("type",[z.object({type:z.literal("NAVIGATE_URL"),url:z.url()}),z.object({type:z.literal("GO_TO_SECTION_START")})]),Pce=z.object({trigger:z.enum($z).optional(),attempts:z.int().optional(),restartBehavior:Mce}),ug=Jr.extend({type:z.literal("SECTION"),description:z.string().describe("user provided goal of what the section should accomplish"),plan:z.string().array().optional(),autohealingConfig:Pce.optional()});var AP=Jr.extend({type:z.literal("WHILE_LOOP"),skipped:z.boolean().optional(),maxIterations:z.number().int().positive().optional()});var Vz=ps.merge(CP).extend({type:z.literal("RESOLVED_MODULE"),steps:z.lazy(()=>Ao.array())}),UT=ps.extend({steps:z.lazy(()=>Ao.array())}),jz=ug.extend({steps:z.lazy(()=>Pa.array())}),Ice=ug.extend({steps:z.lazy(()=>Ao.array())}),zT=vP.extend({blocks:z.object({assertion:z.lazy(()=>bn),steps:z.lazy(()=>Pa.array())}).array(),elseSteps:z.lazy(()=>Pa.array().optional())}),_ce=vP.extend({blocks:z.object({assertion:z.lazy(()=>bn),steps:z.lazy(()=>Ao.array())}).array(),elseSteps:z.lazy(()=>Ao.array().optional())}),$T=AP.extend({condition:z.lazy(()=>bn).optional(),steps:z.lazy(()=>Pa.array())}),Oce=AP.extend({condition:z.lazy(()=>bn).optional(),steps:z.lazy(()=>Ao.array())}),Pa=z.discriminatedUnion("type",[bn,Tm,rg,Em,zT,$T,jz]),Ao=z.discriminatedUnion("type",[bn,Tm,rg,Vz,_ce,Oce,Ice]);var Hz=["steps","beforeSteps","afterSteps"],RP=z.enum(Hz);z.object({steps:Pa.array(),beforeSteps:Pa.array().nullish(),afterSteps:Pa.array().nullish()});var vm=z.object({steps:Ao.array(),beforeSteps:Ao.array().nullish(),afterSteps:Ao.array().nullish()}),Nu=z.object({steps:z.record(z.string(),z.unknown().optional()).array(),beforeSteps:z.record(z.string(),z.unknown().optional()).array().nullish(),afterSteps:z.record(z.string(),z.unknown().optional()).array().nullish()});var VT="1.0.24";var xP="0.0.0";var Ro="0.0.4";var Nce=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,Ti=t=>{let e=t.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var Lu=z.string().min(1).max(255).superRefine((t,e)=>{try{qi(t);}catch(o){e.addIssue({code:"custom",message:o.message,fatal:true});return}});function qi(t){if(t=t.toLowerCase().trim(),t.length===0||t.length>255)throw new Ye("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(t))throw new Ye('Name contains one of the following invalid characters: <>:"/\\|?*');if(t.endsWith("-")||t.startsWith("-"))throw new Ye("Name cannot start or end with a dash.");if(t.includes("\0"))throw new Ye("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(t))throw new Ye(`"${t}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(t)||/^\s|\s$/.test(t))throw new Ye("Name cannot start or end with a space or dot.");if(t.endsWith(".yaml"))throw new Ye('Name cannot end with ".yaml".');if(t==="none")throw new Ye("Name cannot be 'none'.");if(t.match(Nce))throw new Ye("Name cannot be a UUID. Please choose a different name.")}var jT=z.union([z.url(),z.literal(""),z.null()]).optional();var Wz="Run steps from a given step to the end, or to an optional end step. This is state-changing execution on the active session. The fromStep/toStep range is inclusive. Use stepId and parentStepIdChain values returned by Momentic tools for the active test session; do not read step ids from raw YAML files. parentStepIdChain is the list of parent step ids from root to the step's immediate parent, empty for top-level steps.";var Gz="momentic_module_create",HT="momentic_module_get";var ku="momentic_get_artifacts",qz="momentic_test_create",WT="momentic_test_get",GT="momentic_test_reload",mg="momentic_test_splice_steps",qT="momentic_run_step",Fu="momentic_session_start",Kz="momentic_session_terminate",MP="momentic_get_session_state",PP="momentic_get_environment_variables",pg="momentic_preview_step";var IP=z.enum(["setup","teardown","main"]).describe("Test section to modify: 'setup' corresponds to beforeSteps (steps that run before the test), 'teardown' corresponds to afterSteps (steps that run after the test), 'main' is synonymous with steps (the main test steps)"),Yz=z.object({id:z.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:Lu.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:z.string().optional().describe("The path of the entity to resolve.")}).describe("A selector for a single entity. Exactly one of id, name, or path must be provided. Id is recommended.").refine(t=>[t.id,t.name,t.path].filter(Boolean).length===1,"Exactly one of id, name, or path must be provided.");function Xz(t,e){let o=t??{},n=e.parameterNames??[],r=e.defaultParameters??{},i=e.parameterEnums??{},a=e.moduleName?`Module "${e.moduleName}"`:"Module",s=new Set(n),l=Object.keys(o).filter(d=>!s.has(d));if(l.length>0){let d=s.size>0?Array.from(s).join(", "):"none";throw new It(`${a} received unknown parameters: ${l.join(", ")}. Valid parameters are: ${d}`)}let c={...r,...o},u=n.filter(d=>!(d in c));if(u.length>0)throw new It(`${a} is missing required parameters: ${u.join(", ")}. Please call ${HT} to inspect the module's parameter requirements.`);for(let[d,m]of Object.entries(o)){let p=i[d];if(p&&!p.includes(m))throw new It(`${a} parameter "${d}" must be one of: ${p.join(", ")}. Received: "${m}"`)}}var Jz=z.object({phrase:z.string()}),Cm=z.object({thoughts:z.string().optional(),result:z.union([z.literal("NOT_FOUND"),z.string(),z.number(),z.array(z.unknown().optional()),z.record(z.string(),z.unknown().optional()),z.unknown().optional()])}),Lce=z.boolean().or(z.enum(Xr)).transform(t=>!(!t||t==="irrelevant")),Zz=z.object({attributes:z.array(z.string()).nullish(),text:Lce.nullish(),position:z.enum(Xr).nullish(),shape:z.enum(Xr).nullish()}),kce=z.object({id:z.int(),requirements:Zz}),Fce=kce.array(),YT=z.object({thoughts:z.string(),review:z.string().optional(),id:z.int(),updatedMemory:Wh.optional(),rememberedTraces:fT.optional(),requirements:Zz.nullish().transform(t=>t===null?void 0:t).optional(),additionalElements:Fce.nullish().transform(t=>t===null?void 0:t).optional(),citations:sn.array().optional()});var Qz=(p=>(p.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",p.FEW_WORDS="FEW_WORDS",p.STYLE_TAG="STYLE_TAG",p.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",p.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",p.NONE="NONE",p.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",p.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",p.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",p.PREFER_ASSERTION="PREFER_ASSERTION",p.HTML_ELEMENTS="HTML_ELEMENTS",p.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",p.NEEDS_DATE_VARIABLE="NEEDS_DATE_VARIABLE",p))(Qz||{});var e1=z.object({thoughts:z.string(),category:z.enum(Qz)}),Bce=z.discriminatedUnion("op",[z.object({op:z.literal("replace"),path:z.string(),value:z.string()}),z.object({op:z.literal("add"),path:z.string(),value:z.string()}),z.object({op:z.literal("remove"),path:z.string()})]);z.object({thoughts:z.string(),patches:Bce.array()});var Uce=[z.literal("add"),z.literal("replace"),z.literal("remove")],zce=z.object({op:z.union(Uce),path:z.string(),value:Ao.optional()}),t1=z.object({patches:zce.array(),thoughts:z.string()}),o1=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(o1||{}),n1=z.object({thoughts:z.string(),scenario:z.enum(o1),instructions:z.string().nullish(),reasonSummary:z.string().nullish()}),r1=z.object({reasoning:z.string(),scenario:z.string(),patch:z.null().optional()});z.object({thoughts:z.string(),evaluation:z.number().min(0).max(10)});z.object({observations:z.string(),reasoning:z.string(),command:RT});var _P=z.object({summary:z.string(),reasoning:z.string(),evaluation:z.discriminatedUnion("type",[z.object({type:z.literal("DONE")}),z.object({type:z.literal("RIGHT_TRACK")}),z.object({type:z.literal("WRONG_TRACK"),feedback:z.string()}),z.object({type:z.literal("IMPOSSIBLE")})])}),$ce=z.object({startId:z.int(),endId:z.int()}),i1=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))(i1||{}),a1=z.object({categoryThoughts:z.string(),category:z.enum(i1),relevantSections:$ce.array()}),cl=z.boolean().nullish().transform(t=>t??false),s1=z.object({thoughts:z.string().optional(),isPageReady:cl,descriptionLabels:z.object({usesTextContent:cl,usesAppearance:cl,usesPosition:cl,usesRelativeElements:cl,usesSingleQuotes:cl,isAmbiguous:cl,targetDoesNotExist:cl,usesIcon:cl}).optional()});var Vce=w.object({label:w.string(),value:w.string()});w.object({thoughts:w.string().optional().describe("only provided if a description was provided"),target:is.optional().describe("only provided if a description was provided"),pageState:w.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:Vce.array().optional().describe("list of options, provided for <select> elements only"),screenshot:w.object({data:w.string().or(rs),height:w.number().int(),width:w.number().int()}).optional().describe("only provided if returnScreenshot is true")});var l1=w.union([w.literal("ELEMENT_CHECK"),w.literal("NEGATED_CHECK"),w.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),w.literal("SELECT_OPTION"),w.literal("TYPE")]);function fg(t){if(!("useSelector"in t&&t.useSelector)){if(t.type==="SELECT_OPTION")return "SELECT_OPTION";if(t.type==="TYPE")return "TYPE";if(t.type==="ELEMENT_CHECK"&&t.assertion.type==="ELEMENT_EXISTENCE"&&t.assertion.condition==="EXISTS"&&t.assertion.negated)return "NEGATED_CHECK";if(t.type==="ELEMENT_CHECK"&&t.assertion.type==="ELEMENT_EXISTENCE"&&t.assertion.condition==="VISIBLE"&&t.assertion.negated)return "NEGATED_ELEMENT_VISIBLE_CHECK";if(t.type==="ELEMENT_CHECK")return "ELEMENT_CHECK"}}var hg=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(hg||{}),wm=w.object({matched:w.boolean(),reason:w.string().optional().describe("Human understandable description"),logs:w.string().array().optional().describe("Logs for debugging")}),jce=wm.extend({type:w.literal("USER_SELECTOR")}),Hce=wm.extend({type:w.literal("CSS_SELECTOR"),selectors:w.string().array()}),Wce=wm.extend({type:w.literal("HYBRID_SELECTOR")}),Gce=wm.extend({type:w.literal("HTML_DISTANCE"),distance:w.number().optional(),closestElement:w.string().optional(),savedElement:w.string().optional()}),qce=wm.extend({type:w.literal("TEMPLATE_MATCHING")}),Kce=wm.extend({type:w.literal("AUTO_FRAME"),logs:w.string().array().optional()});w.discriminatedUnion("type",[jce,Hce,Wce,Gce,qce,Kce]);var fs=(r=>(r.CHROMIUM="Chromium",r.GOOGLE_CHROME="Google Chrome",r.CHROME_FOR_TESTING="Chrome for Testing",r.ORG_DEFAULT="Org Default",r))(fs||{});var ul=z.object({width:z.number().min(200).max(1e4),height:z.number().min(200).max(1e4)}),c1={"Desktop Large":{width:1920,height:1080}};var oc=c1["Desktop Large"],u1="en-us",d1="America/Los_Angeles",Yce="Chromium",Am={latitude:37.7749,longitude:-122.4194};var Xce={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"};function DP(t){return !t||t==="Org Default"?Yce:t}function NP(t){return t==="ffmpeg"?"npx momentic install-browsers ffmpeg":`npx momentic install-browsers ${Xce[DP(t)]}`}var XT=(a=>(a.ClipboardRead="clipboard-read",a.ClipboardWrite="clipboard-write",a.Microphone="microphone",a.Camera="camera",a.Geolocation="geolocation",a.LocalNetworkAccess="local-network-access",a))(XT||{});var JT=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var Jce=z.enum(["off","test","prefer","always"]),LP=z.object({autoFollowNewTabs:z.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:z.union([z.boolean(),z.literal("inputs-only")]).optional(),ignoreHrefForCaching:z.boolean().optional(),disableSecondaryCacheResolution:z.boolean().optional(),hybridSelectorMode:Jce.optional(),globalLocatorRedirect:z.union([z.boolean(),z.literal("always")]).optional(),forceClickForMissingRedirectElement:z.boolean().optional(),visualActions:z.boolean().optional(),autoExpandIframes:z.boolean().optional(),disableHtmlSnapshots:z.boolean().optional(),recordVideo:z.boolean().optional(),defaultBrowserType:z.enum(fs).optional(),importantAttributes:z.string().array().optional(),importantClasses:z.string().array().optional(),importantStyles:z.string().array().optional(),bannedAttributes:z.string().array().optional(),includeLocatorBoundingBoxes:z.boolean().optional()});var kP="prefer";var m1=1e4,p1=6e4,Zce=z.object({server:z.string(),username:z.string().optional(),password:z.string().optional()}),dl=LP.extend({timezone:z.enum(JT).optional().describe("Default timezone for all tests. Can be overridden at the test level."),useHostTimezone:z.boolean().optional().describe("Use the host machine's timezone instead of the configured default. When enabled, all timezone settings are ignored."),pageLoadTimeoutMs:z.number().optional().refine(t=>t===void 0||t<=p1&&t>=-1,{message:`Page load timeout must be between 0 and ${p1/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:z.number().optional().refine(t=>t===void 0||t<=m1&&t>=-1,{message:`Smart waiting timeout must be between 0 and ${m1/1e3} seconds`}),ignorePageLoadTimeouts:z.boolean().optional(),localChromeExtensionPaths:z.string().array().optional(),extraHeaders:z.record(z.string(),z.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:z.record(z.string(),z.record(z.string(),z.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:z.string().optional(),disableGpu:z.boolean().optional(),disableZygote:z.boolean().optional(),disableBrowserMonitoring:z.boolean().optional().describe("Disable console logs, network request recording, browser HTML snapshots, and element trace screenshots which power various features in the run viewer"),disableConsoleLogs:z.boolean().optional().describe("Disable console log recording in the run viewer."),disableNetworkLogs:z.boolean().optional().describe("Disable network request recording in the run viewer."),allowPartialAccessibilityTree:z.boolean().optional().describe("When true (default), Momentic reads the accessibility data that the browser has already computed, which is fast and stable but can be incomplete on pages that never finish loading. When false, Momentic asks the browser to fully rebuild the accessibility tree on every read, which is more complete but much slower and can destabilize the browser on very large pages."),ignoreHttpsErrors:z.boolean().optional().describe("Ignore HTTPS errors, such as self-signed certificates and certificate errors. This can be useful for testing sites that use self-signed certificates or certificate errors."),proxy:Zce.optional().describe("HTTP proxy server to use for the entire browser. This can dramatically increase network latency."),disableFullStory:z.boolean().optional().describe("Disable FullStory, a third-party analytics tool that can significantly impact browser performance. This can be useful for testing sites that use FullStory."),grantedPermissions:z.enum(XT).array().optional().describe("List of permissions to grant to sites. If not provided, all permissions are granted."),remoteBrowser:z.boolean().optional().describe("Use a remote cloud-hosted browser instead of a local one. Connection credentials are fetched from the Momentic API server."),exposeNetwork:z.string().array().optional().describe("Additional hosts the remote browser is allowed to reach by tunneling through your machine's network. Each entry is a Playwright exposeNetwork rule: a hostname pattern (e.g. 'example.com', '*.internal.example.com') or IP literal (e.g. '10.0.0.1', '0.0.0.0:99'). Loopback addresses are always exposed. Only applies when remoteBrowser is enabled and the connection uses the Playwright protocol endpoint.")});var FP="BASE_URL";var Rm="ENV_NAME",gg="TEST_NAME",f1=z.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),h1=z.object({name:z.string(),variables:z.record(z.string().describe("variable name"),z.string().describe("variable value"))}),g1=z.object({name:z.string(),variables:z.record(z.string().describe("variable name"),z.unknown().optional().describe("variable value")),browser:dl.optional()});var nc="LOCAL_AVD_ID",b1="LOCAL_APK_PATH",rc="LOCAL_IOS_DEVICE_TYPE",y1="LOCAL_IOS_VERSION",S1="LOCAL_IOS_APP_PATH";z.object({name:z.string(),variables:z.record(z.string().describe("variable name"),z.unknown().optional().describe("variable value"))});var xm=w.object({env:w.record(w.string(),w.unknown().optional())});var bg=(i=>(i.PRECONDITION="precondition",i.REPLAY="replay",i.GENERATE="generate",i.AUTOHEAL="autoheal",i.POSTCONDITION="postcondition",i))(bg||{}),Qce=z.object({type:z.literal("SUBSTEP_CREATED"),step:Ao,status:z.enum(yo).optional()}),eue=z.object({type:z.literal("SUBSTEP_STARTED"),step:Ao}),tue=z.object({type:z.literal("LLM_TEXT_OUTPUT"),text:z.string()}),oue=z.object({type:z.literal("GENERIC_TOOL_CALLED"),toolName:z.string()}),nue=z.object({type:z.literal("SUBSTEP_EXECUTED"),step:Ao,status:z.enum(yo),message:z.string().optional()}),rue=z.object({type:z.literal("CACHED_STEPS_GENERATED"),cachedSteps:bn.array(),resolvedGoal:z.string(),lastSuccessfulRun:xT.optional()}),iue=z.object({type:z.literal("GENERATED_STEPS_SPLICED"),startIndex:z.number(),insertedSteps:bn.array(),removedSteps:bn.array()}),aue=z.object({type:z.literal("PHASE_CHANGED"),phase:z.enum(bg),totalSteps:z.number().optional(),failureMessage:z.string().optional()}),sue=z.object({type:z.literal("REPLAY_STEP"),step:bn,index:z.number(),total:z.number(),status:z.enum(yo),phase:z.enum(bg)}),lue=z.object({type:z.literal("SCREENSHOT_CAPTURED"),screenshot:og}),cue=z.object({type:z.literal("POSTCONDITION_REJECTED"),postcondition:z.string(),failureMessage:z.string(),attemptNumber:z.number()}),uue=z.object({type:z.literal("POSTCONDITION_AUTOGENERATED"),postcondition:z.string()}),due=z.object({type:z.literal("KNOWLEDGE_LOOKUP"),queries:z.string().array(),hitCount:z.number(),citations:sn.array()});z.discriminatedUnion("type",[Qce,eue,tue,oue,nue,rue,iue,aue,sue,lue,cue,uue,due]);var mue=z.object({type:z.literal("thought"),text:z.string()}),pue=z.object({type:z.literal("tool_call"),toolName:z.string()}),fue=z.object({type:z.literal("phase"),phase:z.enum(bg),totalSteps:z.number().optional(),failureMessage:z.string().optional()}),hue=z.object({type:z.literal("substep"),step:Ao,status:z.enum(yo),message:z.string().optional()}),gue=z.object({type:z.literal("replay_step"),step:bn,index:z.number(),total:z.number(),status:z.enum(yo),phase:z.enum(bg)}),bue=z.object({type:z.literal("screenshot"),screenshot:og}),yue=z.object({type:z.literal("knowledge_lookup"),queries:z.string().array(),hitCount:z.number(),citations:sn.array()}),Sue=z.discriminatedUnion("type",[mue,pue,fue,hue,gue,bue,yue]),T1=z.object({version:z.literal(1),events:Sue.array()});var BP=w.object({beforeUrl:w.string().optional(),afterUrl:w.string().optional(),message:w.string().optional(),beforeSnapshot:w.string().optional(),afterSnapshot:w.string().optional(),startedAt:w.coerce.date(),finishedAt:w.coerce.date()}),Tue=BP.extend({viewport:w.object({height:w.number(),width:w.number()}).nullish(),status:w.nativeEnum(dP),message:w.string().optional(),elementInteracted:w.string().optional()}),ac=BP.extend({status:w.nativeEnum(yo),message:w.string().optional(),data:w.unknown().optional().optional(),beforeTestContext:xm.optional(),afterTestContext:xm.optional(),failureReason:w.string().optional(),details:w.unknown().optional().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information."),trace:w.unknown().optional().describe("Web interaction trace from step execution (WebSectionSpan)"),failureClassification:OU.optional()}),UP=(o=>(o.NOT_ELIGIBLE="NOT_ELIGIBLE",o.ATTEMPTED="ATTEMPTED",o))(UP||{}),ZT=ac.merge(bn).extend({results:Tue.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:w.lazy(()=>hr.array()).optional(),failureRecoveryStatus:w.object({type:w.nativeEnum(UP),message:w.string(),shortMessage:w.string().optional(),durationMs:w.number().optional()}).optional()}),Eue=ac.merge(Tm).extend({results:w.lazy(()=>ZT.array()),previousAttempts:w.lazy(()=>hr.array()).optional()}),vue=ac.merge(rg).extend({results:w.lazy(()=>ZT.array()),trajectory:T1.optional(),previousAttempts:w.lazy(()=>hr.array()).optional(),failureRecoveryReason:w.string().optional(),failureRecoveryReasonShort:w.string().optional(),citations:sn.array().optional()}),Cue=ac.merge(Em).extend({moduleName:w.string().optional(),results:w.lazy(()=>hr.array()),previousAttempts:w.lazy(()=>hr.array()).optional()}),wue=ac.merge(zT).extend({assertionResult:ZT.optional(),results:w.lazy(()=>hr.array()).describe("results for the block actually executed"),previousAttempts:w.lazy(()=>hr.array()).optional()}),Aue=ac.merge($T).extend({results:w.lazy(()=>hr.array()),iterationCount:w.number().optional(),iterationResultCounts:w.number().array().optional(),previousAttempts:w.lazy(()=>hr.array()).optional()}),Rue=ac.merge(ug).extend({results:w.lazy(()=>hr.array()),healingAttempts:w.lazy(()=>hr.array().array()).optional(),previousAttempts:w.lazy(()=>hr.array()).optional()}),hr=w.discriminatedUnion("type",[Eue,vue,ZT,Cue,wue,Aue,Rue]);ac.pick({startedAt:true,finishedAt:true,status:true,message:true,data:true});var xue=BP.extend({id:w.string().optional(),index:w.number().optional(),userFacingStepReference:w.string().optional(),description:w.string(),pageState:w.string().optional(),elementInteracted:w.string().optional(),startedAt:w.coerce.date().or(w.string()).optional().catch(void 0),finishedAt:w.coerce.date().or(w.string()).optional().catch(void 0)}),QT=xue.extend({beforeScreenshot:w.string().optional(),afterScreenshot:w.string().optional()});var zP=z.object({results:hr.array().describe("main results"),beforeResults:hr.array().optional(),afterResults:hr.array().optional()}),$P=zP.partial();var at=(o=>(o.ANDROID="ANDROID",o.IOS="IOS",o))(at||{}),eE=["ANDROID","IOS"],tE={ANDROID:"Android",IOS:"iOS"},yg=w__default.nativeEnum(at);function E1(t){switch(t){case "ANDROID":return "apk";case "IOS":return "app.zip"}}var oE=(e=>(e.WEB="WEB",e))(oE||{});var sc=z.enum(oE).or(z.enum(at)),v1=z.object({fromStepId:z.string(),parentStepIdChain:z.array(z.string())}),C1=z.object({toStepId:z.string(),parentStepIdChain:z.array(z.string())});w.custom().refine(t=>t&&t.length>0).refine(t=>t&&t[0]instanceof File,{message:"Please upload a valid file."});var Dn=t=>w.preprocess(e=>e==null?void 0:Array.isArray(e)?e:[e],w.array(t).optional()),Mm=w.string().transform(t=>{let e=t.trim();return e.length===0?void 0:e}).optional();var Sg=z.enum(["TERMINOLOGY","AGENT_RULE","FLOW","CODE_INSIGHT"]);var Pm=z.enum(["CANDIDATE","ACTIVE","PENDING_CONFLICT","REJECTED","ARCHIVED"]),VP=z.enum(["MANUAL","CRAWLER","SYSTEM","GENERATED","IMPORTED"]),Iue=z.enum(["PENDING","INDEXING","INDEXED","FAILED"]);var nE=z.enum(["locator","assertion","visual-assertion","text-extraction","failure-recovery","result-classification","ai-action","explorer","test-builder","heal-subagent"]),_ue=z.object({canonicalTerm:z.string().min(1),definition:z.string().min(1),examples:z.array(z.string().min(1)).default([])}),Oue=z.object({agentSubtype:nE,instruction:z.string().min(1)}),Due=z.object({intent:z.string().min(1),steps:z.string().min(1),successState:z.string().min(1)}),Nue=z.object({summary:z.string(),importChain:z.array(z.string()),userFacingFiles:z.array(z.object({file:z.string(),role:z.string()})),crossServiceEdges:z.array(z.string()),docsReferenced:z.array(z.string()),reasoning:z.string()}),rE=z.object({segmentId:z.string().optional(),segmentName:z.string()}),Lue=z.object({folderPath:z.string(),filePath:z.string(),segments:z.array(rE),evidence:Nue,source:z.enum(["auto-derived","user-authored"]),lastVerifiedAt:z.string().datetime().optional()}),iE=z.discriminatedUnion("type",[z.object({type:z.literal("TERMINOLOGY"),data:_ue}),z.object({type:z.literal("AGENT_RULE"),data:Oue}),z.object({type:z.literal("FLOW"),data:Due}),z.object({type:z.literal("CODE_INSIGHT"),data:Lue})]);var w1=z.discriminatedUnion("source",[z.object({source:z.literal("MANUAL"),userId:z.string().nullable()}),z.object({source:z.literal("CRAWLER"),url:z.url().nullable(),crawlerJobId:z.string().nullable(),snippet:z.string().nullable()}),z.object({source:z.literal("GENERATED"),generatorJobId:z.string().nullable(),agentName:z.string().nullable(),rationale:z.string().nullable(),metadata:z.record(z.string(),z.string()).optional()}),z.object({source:z.literal("SYSTEM"),rule:z.string().nullable()}),z.object({source:z.literal("IMPORTED"),importerSource:z.string().nullable(),externalId:z.string().nullable()})]),jP=z.object({id:z.string(),organizationId:z.string(),appId:z.string().nullable(),testId:z.string().nullable(),environmentId:z.string().nullable(),type:Sg,status:Pm,source:VP,trust:z.int().min(0).max(100),title:z.string(),body:z.string(),data:iE,provenance:w1,contentHash:z.string(),indexingState:Iue,indexedVersion:z.int().nullable(),currentVersion:z.int(),retrievalCount:z.int(),lastRetrievedAt:z.iso.datetime().nullable(),createdByUserId:z.string().nullable(),updatedByUserId:z.string().nullable(),createdAt:z.iso.datetime(),updatedAt:z.iso.datetime()});z.object({id:z.string(),itemId:z.string(),organizationId:z.string(),version:z.int(),title:z.string(),body:z.string(),data:iE,status:Pm,trust:z.int().min(0).max(100),changedByUserId:z.string().nullable(),changedBySystem:z.string().nullable(),changeNote:z.string().nullable(),changedAt:z.iso.datetime()});var kue=z.object({appId:z.string().nullable().optional(),testId:z.string().nullable().optional(),environmentId:z.string().nullable().optional()});kue.extend({type:Sg,status:Pm.optional(),source:VP,trust:z.int().min(0).max(100).optional(),title:z.string().min(1).max(500),data:iE,provenance:w1});z.object({title:z.string().min(1).max(500).optional(),data:iE.optional(),status:Pm.optional(),trust:z.int().min(0).max(100).optional(),appId:z.string().nullable().optional(),testId:z.string().nullable().optional(),environmentId:z.string().nullable().optional(),changeNote:z.string().nullable().optional()}).refine(t=>Object.entries(t).some(([e,o])=>e!=="changeNote"&&o!==void 0),{error:"at least one updatable field is required"});z.object({appId:z.string().nullable().optional(),type:Dn(Sg),status:Dn(Pm),source:Dn(VP),agentSubtype:Dn(nE),testId:z.string().optional(),environmentId:z.string().optional(),search:z.string().optional(),page:z.coerce.number().int().min(1).prefault(1),pageSize:z.coerce.number().int().min(1).max(200).prefault(50)});var A1=z.enum(["active-only","active-plus-candidates","review"]);z.object({query:z.string().min(1),appId:z.string().nullable().optional(),types:Sg.array().min(1).max(4).optional(),agentSubtype:nE.optional(),testId:z.string().nullable().optional(),environmentId:z.string().nullable().optional(),mode:A1.default("active-only"),limit:z.int().min(1).max(50).default(10),clientName:z.string().min(1).max(100),scoreMultiplier:z.number().positive().max(100).default(1)});var Fue=z.object({combined:z.number(),lexical:z.number().nullable(),vector:z.number().nullable()}),Bue=z.object({item:jP,rank:z.int().min(1),score:Fue,topChunkIndex:z.int().nullable()}),R1=z.object({hits:z.array(Bue),mode:A1});z.object({userFeedback:z.string().min(1),trace:z.record(z.string(),z.unknown()).optional(),agentType:z.string().min(1).optional()});var Uue=z.object({id:z.string(),status:Pm,title:z.string(),body:z.string(),type:Sg,isNew:z.boolean()});z.object({suggestions:z.array(Uue)});z.discriminatedUnion("type",[z.object({type:z.literal("TERMINOLOGY"),title:z.string().min(1).max(500),canonicalTerm:z.string().min(1),definition:z.string().min(1),examples:z.array(z.string()).nullish().transform(t=>t??[]),rationale:z.string().min(1)}),z.object({type:z.literal("AGENT_RULE"),title:z.string().min(1).max(500),agentSubtype:nE,instruction:z.string().min(1),rationale:z.string().min(1)}),z.object({type:z.literal("FLOW"),title:z.string().min(1).max(500),intent:z.string().min(1),steps:z.string().min(1),successState:z.string().min(1),rationale:z.string().min(1)})]);var zue=["SELECTED","RUN_ALL"],$ue=z.enum(zue),Vue=["segment_search","coverage_expansion","import_graph","code_reading"],jue=z.enum(Vue),Hue=z.object({discoverySource:jue,segmentMatch:z.boolean(),importGraphConnected:z.boolean()}),Wue=["high","medium","low"],Gue=z.enum(Wue),aE=z.object({testId:z.string(),testPath:z.string().nullable(),name:z.string(),rationale:z.string(),relevanceLabel:Gue.optional(),confidence:z.number().min(0).max(1).optional(),signals:Hue.optional()}),x1=z.object({source:z.string(),cap:z.number().int().positive().nullable()}),M1=z.object({baseRef:z.string().optional().describe("git ref to diff HEAD against when computing the AI selection. Defaults to origin/<gitMainBranch> when gitMainBranch is set."),onBaseUnavailable:z.enum(["run-all","fail","use-head"]).optional().describe("behavior when the base ref cannot be resolved: use-head (default) selects against the diff of the HEAD commit only, run-all runs every test, fail aborts the run."),targetTests:z.number().int().positive().optional().describe("soft cap on the number of tests the agent may select")}),HP=z.object({version:z.literal(2),userSummary:z.string(),toolCallCount:z.number().int().nonnegative(),selectedTests:z.array(aE),anchorSegmentIds:z.array(z.string()),budget:x1,generatedAt:z.string()});z.object({repository:z.string().min(1),headSha:z.string().min(1),baseRef:z.string().nullable().optional(),changedFiles:z.array(z.string()).default([]),diffSummary:z.string().nullable().optional(),budgetCap:z.number().int().positive().nullable().optional(),dryRun:z.boolean().default(false)});var Tg={CLAIMED:"claimed",COMPUTING:"computing",READY:"ready",ABSENT:"absent"};z.discriminatedUnion("status",[z.object({status:z.literal(Tg.CLAIMED),selectionPlanKey:z.string(),trackId:z.string(),graphVersion:z.string(),expiresInMs:z.number().int().positive()}),z.object({status:z.literal(Tg.COMPUTING),retryAfterMs:z.number().int().positive(),claimedBy:z.string().nullable()}),z.object({status:z.literal(Tg.READY),plan:HP,planId:z.string(),trackId:z.string()})]);z.object({selectionPlanKey:z.string(),repository:z.string().min(1),headSha:z.string().min(1),mode:$ue,userSummary:z.string(),toolCallCount:z.number().int().nonnegative(),selectedTests:z.array(aE),anchorSegmentIds:z.array(z.string()).default([]),budget:x1});z.object({planId:z.string(),plan:HP});z.discriminatedUnion("status",[z.object({status:z.literal(Tg.READY),plan:HP,planId:z.string()}),z.object({status:z.literal(Tg.ABSENT)})]);z.object({repository:z.string().min(1),query:z.string().min(1).max(2e3),k:z.number().int().positive().max(50)});var que=z.object({nodeType:z.string(),testId:z.string().nullable(),nodeId:z.string(),title:z.string(),summary:z.string(),testPath:z.string().nullable(),latestPassed:z.boolean().nullable(),latestQuarantined:z.boolean().nullable(),lastObservedAt:z.string().nullable(),vectorDistance:z.number().nullable(),lexicalRank:z.number().nullable(),hybridScore:z.number()});z.object({results:z.array(que)});z.object({testId:z.string(),name:z.string(),testPath:z.string().nullable(),goal:z.string().nullable(),description:z.string().nullable(),latestPassed:z.boolean(),latestQuarantined:z.boolean(),evidenceCount:z.number().int().nonnegative(),lastObservedAt:z.string().nullable(),lastObservedCommitSha:z.string().nullable(),matchedSegments:z.array(z.object({segmentId:z.string(),segmentName:z.string(),realizationId:z.string().nullable(),realizationName:z.string().nullable(),position:z.number().int().nonnegative()})),coverageEdges:z.array(z.object({journeyVariantId:z.string(),journeyId:z.string(),journeyName:z.string(),variantName:z.string(),level:z.string()}))});z.object({id:z.string(),name:z.string(),description:z.string().nullable(),realizations:z.array(z.object({id:z.string(),name:z.string()})),features:z.array(z.object({id:z.string(),name:z.string()}))});z.object({observedTests:z.array(z.object({testId:z.string(),name:z.string(),testPath:z.string().nullable(),realizationId:z.string().nullable(),latestPassed:z.boolean(),latestQuarantined:z.boolean()}))});var Kue=z.object({id:z.string(),folderPath:z.string(),filePath:z.string(),title:z.string(),segments:z.array(rE),evidenceSummary:z.string(),lastVerifiedAt:z.string().datetime().nullable()});z.object({repository:z.string().min(1),folderPaths:z.array(z.string().min(1)).min(1).max(50)});z.object({insights:z.array(Kue)});var Yue=z.object({folderPath:z.string().min(1),filePath:z.string().min(1),segments:z.array(rE).min(1),evidenceSummary:z.string().min(10).max(500)});Yue.extend({repository:z.string().min(1)});z.object({id:z.string()});var cc=Xue.configure({deterministic:false});function P1(t){let e=cc(t),{jsonString:o}=F6(e,5e4);return o}var Que=["app","version","env","namespace","host"];function $e(t){let e=t.bindings()??{},o={};for(let n of Object.keys(e)){let r=e[n];!Que.includes(n)&&typeof r=="string"&&(o[n]=r);}return o}var lE=w__default.enum(["debug","info","warn","error"]);var Eg={debug:20,info:30,warn:40,error:50},I1={20:"debug",30:"info",40:"warn",50:"error"},WP=class t{minLogLevel;logBindings;forcedStream=null;constructor(e,o){typeof e=="string"?this.minLogLevel=Eg[e]:this.minLogLevel=e,this.logBindings=o;}static singleton=new t(t.computeDefaultLogLevel(),{});static computeDefaultLogLevel(){return typeof window>"u"&&typeof process<"u"&&lE.safeParse(process?.env?.MOMENTIC_DEV_LOG_LEVEL).success?lE.parse(process.env.MOMENTIC_DEV_LOG_LEVEL):30}static _internalSingleton(){return t.singleton}logWithLevel(e,o,...n){try{this.logWithLevelHelper(e,o,...n);}catch(r){console.error(`Failed to log to console: ${r}`);}}indentMultiline(e,o=" "){return e.split(`
173
173
  `).map((n,r)=>r>0?`${o}${n}`:n).join(`
174
174
  `)}logWithLevelHelper(e,o,...n){if(e<this.minLogLevel)return;let r=this.forcedStream??(e>=40?"stderr":"stdout"),i=(...u)=>r==="stderr"?console.error(...u):console.log(...u),a;Array.isArray(n[0])?(a=n[0],n=n.slice(1)):typeof n[0]=="object"&&!(n[0]instanceof Error)&&Object.entries(n[0]).length&&(a={...n[0],...this.logBindings},n=n.slice(1));let s=Ia.level===0,l=s&&e===50?"Error:":s&&e===40?"Warning:":"",c=[];if(l&&c.push(l),c.push(...n),i(o(...c)),a&&!Array.isArray(a)){let u=Object.entries(a);for(let[d,m]of u){let p=m;if(m instanceof Error){p=m.message,i(o(` ${d}:`,p)),i(o(" stack:",m.stack));let h=Object.entries(m).filter(([g])=>g!=="message"&&g!=="stack");for(let[g,b]of h){if(b instanceof Error){i(o(` ${d}.${g}:`,b.message)),b.stack&&i(o(` ${d}.${g}.stack:`,b.stack));continue}if(typeof b=="object"&&b!==null){let y=this.indentMultiline(cc(b,void 0,2)," ");i(o(` ${d}.${g}:`,y));continue}i(o(` ${d}.${g}:`,b));}}else typeof m=="object"?(p=cc(m,void 0,2),p=this.indentMultiline(p),i(o(` ${d}:`,p))):i(o(` ${d}:`,p));}}else if(a)for(let u of a){let d=u;typeof u=="object"&&(d=cc(u,void 0,2),d=d.split(`
175
175
  `).map((m,p)=>p>0?` ${m}`:m).join(`
176
- `)),i(" ",o(d));}}setMinLevel(e){typeof e=="string"?this.minLogLevel=Eg[e]:this.minLogLevel=e;}setOutputStream(e){this.forcedStream=e;}log(...e){this.logWithLevel(30,Ia.reset,...e);}info(...e){this.logWithLevel(30,Ia.white,...e);}debug(...e){this.logWithLevel(20,Ia.dim,...e);}warn(...e){this.logWithLevel(40,Ia.yellow,...e);}error(...e){this.logWithLevel(50,Ia.red,...e);}success(...e){this.logWithLevel(30,Ia.green,...e);}dimmed(...e){this.logWithLevel(30,Ia.dim,...e);}underline(...e){this.logWithLevel(30,Ia.underline,...e);}bold(...e){this.logWithLevel(30,Ia.bold,...e);}grey(...e){this.logWithLevel(30,Ia.grey,...e);}child(e){let o=new t(this.minLogLevel,{...this.logBindings,...e});return o.forcedStream=this.forcedStream,o}async flush(){}bindings(){return this.logBindings}},N=WP._internalSingleton(),Bu={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>Bu,flush:async()=>{},bindings:()=>({})},sE={},qP=({logger:t,logKey:e,maxCount:o,intervalMs:n},r,i,...a)=>{let s=sE[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},sE[e]=s),s.totalCount++,s.count<o&&(s.count++,t.debug(r,i,...a)),s.timer=setTimeout(()=>{let l=sE[e];l?.totalCount!==l?.count&&t.debug({logKey:e,totalCount:l?.totalCount,count:l?.count},`Debug logs were rate-limited for ${e}`),delete sE[e];},n);};var _1=1e4,cE=1,KP=dl.extend({browserType:z.enum(fs).optional(),slowMoMs:z.number().optional().refine(t=>t===void 0||t<=_1&&t>=-1,{message:`Slow motion must be between 0 and ${_1} milliseconds`}),basicAuthorization:z.object({username:z.string().optional(),password:z.string().optional()}).optional(),geolocation:z.object({latitude:z.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:z.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:z.boolean().optional(),locale:z.string().optional(),timezone:z.enum(JT).optional(),colorScheme:z.enum(["light","dark"]).optional()});var YP=z.object({useMemory:z.boolean().optional(),failureRecovery:z.boolean().optional().describe("undefined means inherit org settings")}),XP=YP.extend({disableAICaching:z.boolean().optional(),failureRecoveryInstructions:z.string().optional()}),tde=z.object({viewport:ul.optional()}),Uu=tde.extend(XP.shape).extend(KP.shape),uE=z.object({cron:z.string().refine(t=>isValidCron(t),{error:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:z.boolean().default(false),env:z.string().optional(),timeZone:z.string().default("America/Los_Angeles"),jobKey:z.string().optional()}),dE=z.object({onSuccess:z.boolean().default(false),failureMessage:z.string().optional(),onFailure:z.boolean().default(true),successMessage:z.string().optional()}),ode=z.object({name:z.string(),required:z.boolean().optional(),defaultValue:z.string().describe("this is not optional because we need a value when the editor is first loaded")}),O1=ode.array(),nde=z.object({name:z.string(),value:z.string()}),mE=nde.array(),D1=z.object({name:z.string(),default:z.boolean().optional(),fixtures:f1.array().optional()});var gs=YP.extend({agentConfig:z.record(z.string(),z.string()).optional(),aiFailureAnalysis:z.boolean().optional(),classification:kU.optional(),triage:LU.optional(),healing:NU.optional(),explore:BU.optional(),select:M1.optional()}),rde=z.object({cliOnly:z.boolean().optional(),neverShowUsageBanner:z.boolean().optional(),hideInternalTraceInfo:z.boolean().optional(),bypassUsageLimits:z.boolean().optional()}),JP=z.object({fakerConstantSeed:z.boolean().optional(),isolateCachesByEnvironment:z.boolean().optional()}),ide=z.enum(["flaky_tests","low_test_coverage","frequent_bugs","fix_flaky_tests","migrate_tests","increase_test_coverage","catch_more_bugs"]),ade=z.enum(["ios","android","web"]),sde=z.enum(["selenium","playwright","cypress","puppeteer","maestro","appium","detox","manual_qa","nothing_yet","other"]),lde=z.enum(["advertisement","ai_search","google_search","hacker_news","linkedin","reddit","referral_from_customer","twitter_x","word_of_mouth","youtube","other"]),cde=z.object({helpIntents:z.array(ide).optional(),helpIntentOtherText:z.string().optional(),deviceTypeIntent:ade.optional(),currentTestingTool:sde.optional(),heardAboutSource:lde.optional()}),ude=z.object({discovery:cde.optional(),needsToCompleteOnboarding:z.boolean().optional(),wizardCompletedAt:z.iso.datetime().optional()}),pE=z.object({ai:gs.optional(),githubAppInstallationId:z.number().nullish(),githubAppSummaryMessageEnabled:z.boolean().nullish(),githubReleaseAppInstallationId:z.number().nullish(),gitlabAppAccessToken:z.string().nullish(),gitlabAppBaseUrl:z.string().nullish(),browser:LP.optional(),internal:rde.optional(),advanced:JP.optional(),onboarding:ude.optional()});function N1(t){try{return pE.parse(t)}catch{return N.warn("Cloud settings contain values this version of the CLI does not support. Please upgrade. Falling back to defaults."),pE.parse({})}}z.object({globalOverrides:z.record(z.string(),z.string()).optional(),agentConfig:z.record(z.string(),z.string()).optional()});z.record(z.string(),z.string()).nullish();var k1=(o=>(o.CANNOT_FIX_TEST="CANNOT_FIX_TEST",o.FIXED="FIXED",o))(k1||{}),L1=z.object({index:z.int().nonnegative(),section:RP,step:Pa}),dde=z.object({additions:L1.array(),deletions:L1.array()}),ZP=z.object({subAgentStatus:z.enum(k1).default("CANNOT_FIX_TEST"),rootCause:z.string(),solution:z.string(),verificationNotes:z.string().optional().default(""),diffs:dde.optional(),pullRequestUrl:z.string().optional(),branchUrl:z.string().optional()}),F1=ZP.optional().catch(void 0),B1=z.object({subAgentStatus:z.literal("FIXED").default("FIXED"),rootCause:z.string(),solution:z.string(),verificationNotes:z.string().optional().default(""),gitPatch:z.string().min(1)});var Ei={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},to=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(to||{});var QP=(r=>(r.NOT_ATTEMPTED="NOT_ATTEMPTED",r.PERM_HEAL_SUCCEEDED="PERM_HEAL_SUCCEEDED",r.PERM_HEAL_FAILED="PERM_HEAL_FAILED",r.PERM_HEAL_ON_SUCCESS_FAILED="PERM_HEAL_ON_SUCCESS_FAILED",r))(QP||{});var vg=z.enum(QP).default("NOT_ATTEMPTED"),fE=(o=>(o.BEFORE_ALL="BEFORE_ALL",o.AFTER_ALL="AFTER_ALL",o))(fE||{});var mde=z.object({attempts:z.int().nonnegative()}),$o=z.string().pipe(z.coerce.date()).or(z.date()),Ki=z.object({id:z.string(),runKey:z.string(),organizationId:z.string(),executionType:sc.optional().default("WEB"),createdAt:$o,createdBy:z.string(),flake:z.boolean().nullish(),scheduledAt:$o.or(z.null()),startedAt:$o.or(z.null()),updatedAt:$o.nullish(),finishedAt:$o.or(z.null()),resolvedBaseUrl:z.string().nullish(),environmentName:z.string().nullish(),gitBranchName:z.string().nullish(),gitMainBranch:z.string().nullish(),githubRepository:z.string().nullish(),gitlabProjectPath:z.string().nullish(),labels:z.array(z.string()).optional(),gitOriginUrl:z.string().nullish(),gitCommitSha:z.string().nullish(),gitCommitShaShort:z.string().nullish(),gitCommitAuthorName:z.string().nullish(),gitCommitTimestamp:$o.nullish(),gitCommitMessage:z.string().nullish(),schemaVersion:z.string().nullish(),cliVersion:z.string().nullish(),section:z.enum(fE).nullish(),status:z.enum(to),healStatus:vg,healDetails:F1.nullish(),trigger:z.enum(Ei),attempts:z.number(),runAttempts:z.array(z.object({id:z.string(),status:z.enum(to),startedAt:$o.or(z.null()),finishedAt:$o.or(z.null())})).optional(),videos:z.array(z.string()).optional(),failureReason:z.string().nullish(),failureDetails:kz.nullish(),failureRecoveryDetails:mde.nullish(),pipelineId:z.string().nullish(),resolvedInputs:z.record(z.string(),z.string()).nullish(),quarantined:z.boolean().nullish().default(false),quarantinedReason:z.string().nullish(),localTestId:z.string().nullish(),testId:z.string().nullish(),testName:z.string().nullish(),description:z.string().nullish(),directory:z.string().nullish(),test:z.object({name:z.string(),id:z.string()}).nullish().default(null),suiteId:z.string().nullish(),aiSettings:gs.nullish(),stepsSnapshot:z.array(z.record(z.string(),z.unknown().optional())).nullish(),beforeStepsSnapshot:z.array(z.record(z.string(),z.unknown().optional())).nullish(),afterStepsSnapshot:z.array(z.record(z.string(),z.unknown().optional())).nullish()}),pde={id:true,status:true,healStatus:true,healDetails:true,testName:true,localTestId:true,testId:true,test:{select:{name:true,id:true}},finishedAt:true,failureReason:true,failureDetails:true},hE=Ki.pick({...pde,test:true}),U1=Ki.omit({failureReason:true,failureDetails:true,test:true}),eI=Ki.extend({stepsSnapshot:z.array(z.record(z.string(),z.unknown().optional())).nullish(),beforeStepsSnapshot:z.array(z.record(z.string(),z.unknown().optional())).nullish(),afterStepsSnapshot:z.array(z.record(z.string(),z.unknown().optional())).nullish(),resolvedInputs:z.record(z.string(),z.string()).nullish(),test:z.object({name:z.string(),id:z.string(),description:z.string().nullish(),baseUrl:z.string().nullish(),advanced:Uu.nullish()}).nullish()}).extend(zP.shape);var fde=z.object({category:z.string(),reasoning:z.string(),citations:z.array(sn).optional()}),hde=z.object({testInputs:z.record(z.string(),z.string()).optional(),envName:z.string().optional(),urlOverride:z.string().optional()}),gde=z.object({reason:z.string().optional(),message:z.string().optional()}),bde=z.object({runId:z.string().optional(),testId:z.string(),testName:z.string(),filePath:z.string(),labels:z.array(z.string()).optional(),status:z.enum(to),startedAt:z.string(),finishedAt:z.string(),durationMs:z.number(),attempts:z.number(),quarantined:z.boolean(),recovered:z.boolean(),parameters:hde.optional(),failure:gde.nullable(),classification:fde.nullable()}),yde=z.object({testId:z.string(),testName:z.string(),filePath:z.string(),labels:z.array(z.string()).optional(),quarantined:z.boolean()}),Sde=z.object({total:z.number(),executed:z.number(),skipped:z.number(),passed:z.number(),failed:z.number(),cancelled:z.number(),quarantined:z.number(),recovered:z.number()}),z1=z.object({version:z.literal(1),runGroup:z.object({startedAt:z.string(),finishedAt:z.string(),durationMs:z.number()}),summary:Sde,runs:z.array(bde),skipped:z.array(yde)});var $1=z.enum(["error","warning","passing"]);var V1=z.enum(["safe_to_merge","confirm_intended_change","investigate_regression","fix_test","resolve_infra","review_coverage"]);var j1=z.object({kind:V1,detail:z.string().min(1).max(280)}),zu=z.object({riskLevel:z.string(),headline:z.string().min(1).max(200).describe("One-sentence summary of what happened in this run. Plain text, no markdown."),overview:z.string().min(1).max(280).optional().describe("One plain-text sentence giving the bottom line of the run. No markdown."),summaryMarkdown:z.string().min(1).max(4e3).describe("Markdown body. Several short paragraphs or a tight list. No emojis, no top-level heading. Max 5 sentences."),recommendedAction:j1.optional()});zu.extend({riskLevel:$1.describe("Traffic-light validation signal. Use passing when validation is trustworthy with no real concern, warning when review or follow-up is needed, and error when the evidence shows the PR may hide or cause a product regression or another material concern that requires review."),headline:z.string().min(1).max(60).describe("Short, factual, title-case status of the validation signal, 6 words max, no punctuation. Describe the outcome only - never name the process or mode (no 'dry run', 'auto-heal', 'triage', 'pending'); those are shown separately. Examples: 'Review Required', 'Sign In Failing Across 5 Tests', 'All Tests Passed'."),overview:z.string().min(1).max(280).describe("The bottom-line verdict in one plain sentence: what the Momentic validation means for user-visible behavior and how trustworthy the signal is. This is the conclusion only, not the evidence. No markdown, headings, lists, or emojis. Do not prescribe a merge decision (use recommendedAction)."),summaryMarkdown:z.string().min(1).max(1e3).describe("The supporting evidence behind the overview, in GitHub-flavored markdown: a few short sentences or a tight list with the specific tests, errors, and signals that justify the verdict. Must carry information the overview does not - never paraphrase or restate the overview. Do not prescribe a merge decision or restate repair mechanics. Max 4 sentences. No emojis or top-level heading."),recommendedAction:j1.extend({kind:V1.describe("The kind of action a reviewer should take. safe_to_merge = signal is trustworthy and can be merged as-is; confirm_intended_change = a product or UI change was detected (or a heal relaxed an expectation) and a human must confirm it is intentional; investigate_regression = evidence points to a real product bug or regression to investigate before merging; fix_test = a broken or stale test or test setup needs repair; resolve_infra = an infrastructure or environment problem needs resolving and a re-run; review_coverage = quarantine has materially reduced coverage that should be reviewed."),detail:z.string().min(1).max(280).describe("One plain-text sentence naming the specific next step (e.g. 'Confirm the new success-indicator color is an intended design change'). No markdown.")}).describe("The single most important next step a reviewer should take. Omit entirely when the signal is clean and there is genuinely nothing to do.").optional()});var H1=z.object({id:z.string(),status:z.enum(to),trigger:z.enum(Ei),createdAt:$o,startedAt:$o.nullish(),finishedAt:$o.nullish(),gitCommitSha:z.string().nullish(),gitCommitShaShort:z.string().nullish(),gitCommitTimestamp:$o.nullish(),gitBranchName:z.string().nullish(),gitOriginUrl:z.string().nullish(),gitCommitMessage:z.string().nullish(),gitCommitAuthorName:z.string().nullish(),githubRepository:z.string().nullish(),gitlabProjectPath:z.string().nullish(),pipelineId:z.string().nullish(),ciProvider:z.string().nullish(),cliVersion:z.string().nullish(),labels:z.string().array().optional(),healRiskSummary:zu.optional(),localSuiteName:z.string().optional(),suite:z.object({id:z.string(),name:z.string()}).nullish(),runs:z.object({executionType:sc,status:z.enum(to),environmentName:z.string().nullish()}).array()}),W1=H1.pick({id:true,createdAt:true,startedAt:true,finishedAt:true,status:true,trigger:true,suite:true,localSuiteName:true}).extend({runs:hE.array()}),G1=H1.extend({runs:Ki.array()});var Ede=z.object({id:z.string(),name:z.string()});Ede.extend(z.object({createdAt:$o,createdBy:z.string(),schedule:uE,notification:dE,environment:z.object({name:z.string()}).nullish(),beforeTests:z.object({id:z.string()}).array().nullish(),afterTests:z.object({id:z.string()}).array().nullish()}).shape);var q1=z.object({id:z.guid(),orgId:z.string(),createdAt:$o,startedAt:$o.or(z.null()),finishedAt:$o.or(z.null()),status:z.enum(to),trigger:z.enum(Ei),suite:z.object({id:z.string(),name:z.string()}).nullish(),runs:Ki.array()});q1.pick({id:true,createdAt:true,startedAt:true,finishedAt:true,status:true,trigger:true,suite:true});var K1=q1.extend({runs:hE.array()});function Y1({beforeStatus:t,mainStatus:e,afterStatus:o}){return t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":o==="FAILED"?"FAILED":o==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}function X1(t,e){return t.some(r=>e?.onlyQuarantined?r.status==="FAILED":!r.quarantined&&r.status==="FAILED")?"FAILED":t.some(r=>r.status==="CANCELLED")?"CANCELLED":"PASSED"}function Cg(t){switch(t){case "SUCCESS":return "PASSED";case "FAILED":return "FAILED";case "CANCELLED":return "CANCELLED";case "RUNNING":return "RUNNING";case "IDLE":return "PENDING"}}function J1(t){switch(t){case "PASSED":return "SUCCESS";case "FAILED":return "FAILED";case "CANCELLED":return "CANCELLED";case "RUNNING":case "PENDING":case "RETRYING":case "WAITING_FOR_USER":return "RUNNING"}}var tI=z.object({content:z.string(),ids:z.string().array(),tokenLength:z.number()}),vde=z.object({chunks:tI.array()});z.object({ids:z.string().array(),score:z.number(),tokenLength:z.number()});vde.extend({description:z.string().describe("Input to pass to RAG engine"),tokenLimit:z.number()});var Z1=z.object({ids:z.number().array()}),Q1=z.object({indices:z.number().array()});var wg=(o=>(o.Interactive="interactive",o.Runner="runner",o))(wg||{}),Cde=z.enum(wg),Nn=z.object({disableCache:z.boolean().optional(),useMemory:z.boolean().optional(),clientMode:Cde.optional(),loggerTags:z.record(z.string(),z.string()).optional(),langfuseSessionId:z.string().optional(),agentConfigVersion:z.string().optional(),cacheBustReason:z.enum(Iu).optional()});Nn.extend({chunks:tI.array(),description:z.string().describe("Input to pass to AI"),type:z.union([z.literal("locator"),z.literal("assertion"),z.literal("ai-action")]),softTokenLimit:z.number(),mediumTokenLimit:z.number().optional(),hardTokenLimit:z.number(),callId:z.string().optional()});var wde=z.object({screenshotBase64AfterCommand:z.string(),urlAfterCommand:z.string(),serializedCommand:z.string(),elementInteracted:z.string().optional(),thoughts:z.string().optional()}),e$=z.object({goal:z.string(),browserState:z.string(),screenshot:z.string(),source:l1.optional().catch(void 0),isTieBreakerCall:z.boolean().optional(),memory:z.discriminatedUnion("type",[xa,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional(),firstPassModelResults:YT.array().optional(),knowledgeBaseSection:z.string().optional()}),t$=z.object({target:z.string().or(z.number()),browserState:z.string().optional(),screenshot:z.string().optional(),boundingBox:z.object({x:z.number(),y:z.number(),height:z.number(),width:z.number()}).optional()}),o$=z.object({goal:z.string(),browserState:z.string(),screenshot:z.string().optional(),returnSchema:z.string().optional()}),n$=z.object({goal:z.string(),emulatorState:z.string(),screenshot:z.string().optional(),returnSchema:z.string().optional()}),oI=z.union([z.literal("NEGATED_CHECK"),z.literal("CONDITIONAL_CHECK")]),r$=z.object({goal:z.string(),browserState:z.string(),screenshot:z.string(),url:z.string(),contextChoice:Ou.optional(),memory:z.discriminatedUnion("type",[Pu,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional(),source:oI.optional(),recoveryHint:z.string().optional(),knowledgeBaseSection:z.string().optional()}),i$=z.object({command:gm}),nI=z.object({goal:z.string(),browserState:z.string(),startingScreenshot:z.string().optional(),screenshot:z.string(),url:z.string(),history:wde.array(),actionHint:z.string().optional(),lastError:z.string().optional()}),a$=z.object({results:QT.array(),errorMessage:z.string(),errorStack:z.string().optional()}),s$=z.object({results:QT.array(),goal:z.string(),errorMessage:z.string()}),l$=z.object({failedResults:QT.array(),nextStepsSerialized:z.string().array(),currentUrl:z.string(),currentPageState:z.string(),currentScreenshot:z.string(),customInstructions:z.string().optional(),testDescription:z.string().optional()});z.object({description:z.string(),type:z.union([z.literal("locator"),z.literal("assertion"),z.literal("ai-action")]),excerpt:z.string()});var c$=z.object({type:z.string(),browserContext:z.string(),currentStep:z.string(),screenshot:z.string()}),u$=z.object({description:z.string(),browserState:z.string().optional(),screenshot:z.string()}),Ade=z.enum(["locator","assertion"]);z.object({completionType:Ade,currentGoal:z.string(),pastGoal:z.string().optional(),currentScreenshot:z.string(),pastScreenshot:z.string(),pastResult:z.union([z.boolean(),z.number()])});z.object({goal:z.string()});var d$=z.object({keywords:z.array(z.string())});var gE=(i=>(i.LOCATOR="locator",i.ASSERTION="assertion",i.VISUAL_ASSERTION="visual-assertion",i.TEXT_EXTRACTION="text-extraction",i.FAILURE_RECOVERY="failure-recovery",i))(gE||{}),Rde=["locator","assertion","visual-assertion","text-extraction","failure-recovery"];z.enum(gE);var xde=new Set(Rde);function Mde(t){return xde.has(t)}var Pde=z.enum(["v1","v2","v3","v4"]),Ide=z.string().regex(/^v\d+\.\d+$/).describe("pinned sub-version like v3.1");z.union([Pde,Ide,z.string().describe("for people with special configurations")]);var _m={locator:"v4.2",assertion:"v4.1","visual-assertion":"v4.0","text-extraction":"v3.0","failure-recovery":"v2.1"},m$={locator:{v4:["v4.2","v4.1","v4.0"],v3:["v3.3","v3.2","v3.1","v3.0"],v2:["v2.2","v2.1","v2.0"],v1:["v1.0"]},assertion:{v4:["v4.1","v4.0"],v3:["v3.2","v3.1","v3.0"],v2:["v2.3","v2.2","v2.1","v2.0"],v1:["v1.0"]},"visual-assertion":{v4:["v4.0"],v3:["v3.2","v3.1","v3.0"],v2:["v2.0"],v1:["v1.0"]},"text-extraction":{v3:["v3.0"],v2:["v2.0"],v1:["v1.0"]},"failure-recovery":{v2:["v2.1","v2.0"],v1:["v1.0"]}},uc=(a=>(a.ANDROID_LOCATOR="android-locator",a.IOS_LOCATOR="ios-locator",a.ANDROID_ASSERTION="android-assertion",a.IOS_ASSERTION="ios-assertion",a.ANDROID_TEXT_EXTRACTION="android-text-extraction",a.IOS_TEXT_EXTRACTION="ios-text-extraction",a))(uc||{});z.enum(uc);var _de={locator:["v1"],assertion:["v1"],"visual-assertion":["v1"],"text-extraction":["v1"]};function Ode(t){let e=_de[t];if(!e)return new Set;let o=m$[t],n=new Set;for(let r of e){n.add(r);for(let i of o[r]??[])n.add(i);}return n}function p$(t){for(let[e,o]of Object.entries(t)){if(!Mde(e))continue;let n=m$[e];if(!n)continue;let r=new Set;for(let[i,a]of Object.entries(n)){r.add(i);for(let s of a)r.add(s);}if(!r.has(o)){let i=[...r].sort();throw new O("UserConfigurationError",`Invalid agent config: "${o}" is not a valid version for "${e}". Valid versions: ${i.join(", ")}`)}if(Ode(e).has(o))throw new O("UserConfigurationError",`Agent config "${o}" for "${e}" is no longer supported because it relies on a legacy model. Upgrade to a newer version.`)}}var ml=w__default.object({id:w__default.guid(),envKey:w__default.string().optional(),skipped:w__default.boolean().optional(),retries:w__default.number().optional()});var xo=(r=>(r.PRESET="MOBILE_PRESET_STEP",r.MODULE="MOBILE_MODULE_STEP",r.AI_ACTION="MOBILE_AI_ACTION_STEP",r.CONDITIONAL="MOBILE_CONDITIONAL_STEP",r))(xo||{});var Om=ml.extend({type:w__default.literal("MOBILE_CONDITIONAL_STEP")});var bs=z.object({id:z.string(),name:Lu,baseUrl:jT,description:z.string().optional().nullish(),schemaVersion:z.string(),advanced:Uu,retries:z.number().optional().nullish(),envs:z.array(D1).nullish(),parameters:O1.nullish(),disabled:z.boolean().optional(),labels:z.array(z.string()).optional().catch([])}),f$=z.enum(["INHERIT","ENABLED","DISABLED"]);var Nde=Uu.extend({failureRecovery:f$.optional(),useMemory:f$.optional()});bs.pick({name:true,description:true,baseUrl:true,retries:true,disabled:true,parameters:true}).extend({advanced:Nde});bs.pick({name:true,description:true,baseUrl:true,retries:true,disabled:true,advanced:true,parameters:true});var Lde=z.object({labels:z.array(z.string()).optional(),outputs:mE.nullish()}),xg=bs.extend(Lde.shape),kde=z.object({createdAt:z.coerce.date(),updatedAt:z.coerce.date(),updatedBy:z.string().nullable(),schedule:uE,notification:dE,createdBy:z.string(),organizationId:z.string(),folderId:z.string().nullable().optional()}),Fde=bs.extend(kde.shape);Fde.extend(vm.shape);var rI=bs.extend(vm.shape);bs.extend(Nu.shape);var Bde="test",Ude="module",zde="mobile-test",$de="mobile-module",Vde="test/v2",jde="module/v2",Hde="mobile-test/v2",Wde="mobile-module/v2";var Pe=(l=>(l.TEST=`momentic/${Bde}`,l.MODULE=`momentic/${Ude}`,l.TEST_V2=`momentic/${Vde}`,l.MODULE_V2=`momentic/${jde}`,l.MOBILE_TEST=`momentic/${zde}`,l.MOBILE_MODULE=`momentic/${$de}`,l.MOBILE_TEST_V2=`momentic/${Hde}`,l.MOBILE_MODULE_V2=`momentic/${Wde}`,l))(Pe||{});bs.merge(Nu);var Gde=ps.extend({steps:z.array(z.record(z.string(),z.unknown().optional())),schemaVersion:z.string()});Gde.extend({fileType:z.literal(Pe.MODULE)});z.object({test:z.string().describe("YAML for the test, including metadata and steps"),modules:z.record(z.string(),z.string()).describe("Map of module name to YAML for the module")});function Dm(t){if(t===void 0)return "__undefined__";if(t===null)return null;if(typeof t!="object")return t;if(Array.isArray(t))return t.map(Dm);let e={};for(let[o,n]of Object.entries(t))e[o]=Dm(n);return e}var qde=/^[a-z0-9]+(?:-[a-z0-9]+){2,}$/,h$=36,cn=z.union([z.guid().max(h$,"V2 IDs must be 36 characters or fewer"),z.string().max(h$,"V2 IDs must be 36 characters or fewer").regex(qde,"V2 IDs must be lowercase kebab-case with at least three words, e.g. silver-river-lantern")],{error:"ID must be a UUID or lowercase kebab-case with at least three words, e.g. silver-river-lantern (36 characters max)"});var vi=(i=>(i.SCREEN="SCREEN",i.OPEN_APP="OPEN_APP",i.OPEN_WEBVIEW="OPEN_WEBVIEW",i.CUSTOM="CUSTOM",i.CUSTOM_COORDINATES="CUSTOM_COORDINATES",i))(vi||{}),Mg=w.discriminatedUnion("type",[w.object({type:w.literal("SCREEN")}),w.object({type:w.literal("OPEN_APP")}),w.object({type:w.literal("OPEN_WEBVIEW")})]),pl=w.object({type:w.literal("description"),description:w.string()}),aI=w.object({type:w.literal("CUSTOM_COORDINATES"),startX:w.number().describe("Starting X coordinate in pixels"),startY:w.number().describe("Starting Y coordinate in pixels"),deltaPixels:w.number().describe("Number of pixels to scroll in the specified direction")}),bE=w.discriminatedUnion("type",[...Mg.options,w.object({type:w.literal("CUSTOM"),target:pl}),aI]);function Kde(t){return t.toLowerCase().replaceAll("_"," ")}function fl(t){switch(t.type){case "CUSTOM":return t.target.description;case "CUSTOM_COORDINATES":return `custom coordinates (x: ${t.startX}, y: ${t.startY}, delta: ${t.deltaPixels}px)`;case "SCREEN":case "OPEN_APP":case "OPEN_WEBVIEW":return Kde(t.type);default:{throw new Error("Unreachable")}}}var Yde=w.object({type:w.literal("coordinates"),xPercent:w.number(),yPercent:w.number()}),Xde=w.object({type:w.literal("absolute_percent"),x:w.number(),y:w.number()}),Nm=w.discriminatedUnion("type",[pl,Yde,Xde]);var Jde=w.object({x1:w.number(),y1:w.number(),x2:w.number(),y2:w.number(),tolerance:w.nativeEnum(Xr),preciseTolerance:w.boolean().optional()}),Zde=w.object({width:w.number(),height:w.number(),tolerance:w.nativeEnum(Xr),preciseTolerance:w.boolean().optional()}),sI=w.object({requiredText:w.string().optional(),requiredAttributes:w.record(w.string(),w.string()).optional(),requiredBounds:w.boolean().optional(),position:Jde.optional(),shape:Zde.optional()}),g$=w.object({xPath:w.string(),requirements:sI.optional()}),Qde=w.object({type:w.literal("CUSTOM"),target:pl,cache:w.lazy(()=>b$).optional()}),eme=w.object({pixelDelta:w.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:w.union([Mg,Qde,aI]),direction:w.enum(["up","down"])}),b$=w.object({type:w.literal("NATIVE"),bounds:w.number().array().optional(),resolvedDescription:w.string().optional(),xPath:w.string().optional(),elementOnlySerializedXml:w.string().optional(),scrollDetails:eme.optional(),requirements:sI.optional(),requiredRelatedElements:g$.array().optional(),memory:xa.optional()}),tme=w.object({type:w.literal("WEBVIEW"),resolvedDescription:w.string().optional(),xPath:w.string().optional(),browserCache:is.optional(),memory:xa.optional()}),Lm=w.union([b$,tme]);var ome=w.object({left:w.number(),top:w.number(),right:w.number(),bottom:w.number()});w.object({newViewportBounds:ome});var nme=w.object({type:w.literal("CUSTOM"),target:pl,cache:w.lazy(()=>T$).optional()}),y$=w.object({pixelDelta:w.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:w.union([Mg,nme,aI]),direction:w.enum(["up","down"])}),lI=(o=>(o.Native="native",o.Appium="appium",o))(lI||{}),cI=w.tuple([w.number(),w.number(),w.number(),w.number()]),S$=g$.extend({bounds:cI.optional(),browserCache:is.optional()}),T$=w.object({type:w.literal("NATIVE"),bounds:cI.optional(),resolvedDescription:w.string().optional(),sourceTree:w.nativeEnum(lI).optional(),xPath:w.string().optional(),elementOnlySerializedXml:w.string().optional(),scrollDetails:y$.optional(),requirements:sI.optional(),requiredRelatedElements:S$.array().optional(),memory:xa.optional()}),rme=w.object({type:w.literal("WEBVIEW"),bounds:cI.optional(),resolvedDescription:w.string().optional(),xPath:w.string().optional(),scrollDetails:y$.optional(),browserCache:is.optional(),requiredRelatedElements:S$.array().optional(),memory:xa.optional()}),km=w.discriminatedUnion("type",[T$,rme]);var tt=(k=>(k.AI_CHECK="AI_CHECK",k.AI_EXTRACT="AI_EXTRACT",k.TAP="TAP",k.TYPE="TYPE",k.PRESS="PRESS",k.PRESS_KEYBOARD="PRESS_KEYBOARD",k.OPEN_APP="OPEN_APP",k.KILL_APP="KILL_APP",k.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",k.SWIPE="SWIPE",k.SCROLL_TO="SCROLL_TO",k.SCREEN_CHECK="SCREEN_CHECK",k.ELEMENT_CHECK="ELEMENT_CHECK",k.VISUAL_DIFF="VISUAL_DIFF",k.DRAG_AND_DROP="DRAG_AND_DROP",k.JAVASCRIPT="JAVASCRIPT",k.REQUEST="REQUEST",k.WAIT="WAIT",k.ADD_FILE="ADD_FILE",k.INSTALL_APP="INSTALL_APP",k.UNINSTALL_APP="UNINSTALL_APP",k.TOGGLE_SETTINGS="TOGGLE_SETTINGS",k.ROTATE_ORIENTATION="ROTATE_ORIENTATION",k.ADB_COMMAND="ADB_COMMAND",k.APPIUM_EXECUTE="APPIUM_EXECUTE",k.STATE="STATE",k))(tt||{}),Ue=w__default.object({id:w__default.guid(),disableCache:w__default.boolean().optional()}),Fm=w__default.object({updatedAt:w__default.coerce.date().optional(),updatedAtLoggerTags:w__default.record(w__default.string(),w__default.string()).optional()}),Ci=Fm.extend({target:Lm}),Pg=Fm.extend({fromTarget:Lm,toTarget:Lm}),Xi=Fm.extend({target:km}),uI=Fm.extend({fromTarget:km,toTarget:km}),Oa=t=>{switch(t.type){case "description":return t.description;case "coordinates":return `${Math.round(t.xPercent*100)}%, ${Math.round(t.yPercent*100)}%`;case "absolute_percent":return `x: ${t.x}%, y: ${t.y}%`}};var E$=Ue.extend({type:w__default.literal("ADB_COMMAND"),command:w__default.string(),jsonArgs:w__default.string().optional()});var ime=w__default.string().trim(),C$=Ue.extend({type:w__default.literal("INSTALL_APP"),uri:ime});var w$=Ue.extend({type:w__default.literal("OPEN_NOTIFICATION_DRAWER")});var Da=(r=>(r.AIRPLANE_MODE="AIRPLANE_MODE",r.DATA="DATA",r.WIFI="WIFI",r.LOCATION="LOCATION",r))(Da||{}),mI=Ue.extend({type:w__default.literal("TOGGLE_SETTINGS"),settingsType:w__default.nativeEnum(Da)});var x$=Ue.extend({type:w__default.literal("UNINSTALL_APP"),packageName:w__default.string()});var yE=Ue.extend({type:w__default.literal("APPIUM_EXECUTE"),command:w__default.string(),jsonArgs:w__default.string().optional()});var M$=Ue.extend({type:w__default.literal("ADD_FILE"),file:w__default.string(),storageLocation:w__default.string()});var hl=Ue.extend({type:w__default.literal("AI_CHECK"),assertion:w__default.string(),timeoutSecs:w__default.number().optional(),contextChoice:Ou.optional(),cache:Fm.extend({memory:Pu.optional()}).optional()});var P$=Ue.extend({type:w__default.literal("AI_EXTRACT"),goal:w__default.string(),schema:w__default.string().optional()});var Bm=Ue.extend({type:w__default.literal("JAVASCRIPT"),code:w__default.string(),timeout:w__default.number().int().max(600).optional().describe("Max seconds for the code to complete")});var I$=Ue.extend({type:w__default.literal("KILL_APP")});var er=(o=>(o.HOME="HOME",o.POWER="POWER",o))(er||{}),Ji=(a=>(a.BACK="BACK",a.APP_SWITCHER="APP_SWITCHER",a.SEARCH="SEARCH",a.VOLUME_UP="VOLUME_UP",a.VOLUME_DOWN="VOLUME_DOWN",a.VOLUME_MUTE="VOLUME_MUTE",a))(Ji||{}),_g=Ue.extend({type:w__default.literal("PRESS"),key:w__default.nativeEnum(er),longPress:w__default.boolean().optional()}),yI=_g.extend({key:w__default.nativeEnum(Ji).or(w__default.nativeEnum(er))}),SI=_g;var _$=Ue.extend({type:w__default.literal("REQUEST")}).merge(Kh);var ys=(o=>(o.PORTRAIT="PORTRAIT",o.LANDSCAPE="LANDSCAPE",o))(ys||{}),TI=Ue.extend({type:w__default.literal("ROTATE_ORIENTATION"),orientation:w__default.nativeEnum(ys)});var cme=w__default.object({type:w__default.literal("CONTENT"),negated:w__default.boolean().optional(),value:w__default.string()}),zm=Ue.extend({type:w__default.literal("SCREEN_CHECK"),assertion:cme,timeout:w__default.number().int().min(0).max(hm).optional().describe("max seconds to wait for the assertion to be true")});var D$=Ue.extend({type:w__default.literal("STATE")});var Og=.1,EI=Ue.extend({type:w__default.literal("VISUAL_DIFF"),path:w__default.string().describe("path to the golden screenshot to compare against"),threshold:w__default.number().min(0).max(1).optional().describe("max allowed fraction of differing pixels before the diff fails (default 0.1)")}),vI=w__default.object({created:w__default.boolean(),goldenPath:w__default.string(),threshold:w__default.number(),goldenScreenshotBase64:w__default.string().optional(),currentScreenshotBase64:w__default.string().optional(),diffScreenshotBase64:w__default.string().optional(),goldenScreenshotSnapshotId:w__default.string().optional(),currentScreenshotSnapshotId:w__default.string().optional(),diffScreenshotSnapshotId:w__default.string().optional(),diffPercent:w__default.number().optional(),pass:w__default.boolean().optional(),dimensionMismatch:w__default.boolean().optional()});var L$=Ue.extend({type:w__default.literal("WAIT"),timeoutSecs:w__default.number()});var Dg=w__default.discriminatedUnion("type",[D$,hl,P$,Bm,L$,_$,TI,zm,EI,M$,I$]);w__default.discriminatedUnion("type",[...Dg.options,_g]);var wI=Ue.extend({type:w__default.literal("DRAG_AND_DROP"),fromTarget:pl,toTarget:pl,hoverDuration:w__default.number().optional(),dragDuration:w__default.number().optional()}),Ng=wI.extend({cache:Pg.optional()}),Lg=wI.extend({cache:uI.optional()});var AI=Ue.extend({type:w__default.literal("ELEMENT_CHECK"),target:Nm,assertion:hT,timeout:w__default.number().int().min(0).max(hm).optional().describe("max seconds to wait for the assertion to be true")}),$u=AI.extend({cache:Ci.optional()}),Vu=AI.extend({cache:Xi.optional()});var yr=(o=>(o.ENTER="ENTER",o.BACKSPACE="BACKSPACE",o))(yr||{}),Ss=(e=>(e.CLOSE_KEYBOARD="CLOSE_KEYBOARD",e))(Ss||{}),B$={repeat:w__default.number().int().min(1).optional(),keyPressDelayMs:w__default.number().min(0).optional()},RI=Ue.extend({type:w__default.literal("PRESS_KEYBOARD"),key:w__default.nativeEnum(yr),...B$}),xI=Ue.extend({type:w__default.literal("PRESS_KEYBOARD"),key:w__default.nativeEnum(Ss).or(w__default.nativeEnum(yr)),...B$});var U$=Ue.extend({type:w__default.literal("OPEN_APP"),packageName:w__default.string(),activityName:w__default.string().optional(),intentExtras:w__default.string().optional()}),z$=Ue.extend({type:w__default.literal("OPEN_APP"),packageName:w__default.string(),intentExtras:w__default.string().optional()});var MI=Ue.extend({type:w__default.literal("SCROLL_TO"),target:pl,direction:w__default.enum(["down","up"]),scrollableElement:bE,scrollStepPercent:w__default.number().min(.1).max(1).optional().describe("How much of the container height to scroll at each step (0.1 to 1.0). Default is 0.9 (90%)."),maxScrollAttempts:w__default.number().int().min(1).max(50).optional().describe("Maximum number of scroll attempts before giving up. Default is 20.")}),kg=MI.extend({cache:Ci.optional()}),Fg=MI.extend({cache:Xi.optional()});var PI=Ue.extend({type:w__default.literal("SWIPE"),direction:w__default.enum(["up","down","left","right"]),scrollableElement:bE,viewportPercent:w__default.number().optional(),durationMs:w__default.number().optional(),relativePosition:pm.optional()}),Bg=PI.extend({cache:Ci.optional()}),Ug=PI.extend({cache:Xi.optional()});var II=Ue.extend({type:w__default.literal("TAP"),target:Nm,longPress:w__default.boolean().optional(),longPressDurationMs:w__default.number().optional(),iterations:w__default.number().optional(),tapDelayMs:w__default.number().optional(),relativePosition:pm.optional(),doubleTap:w__default.boolean().optional(),doubleTapDelayMs:w__default.number().optional()}),zg=II.extend({cache:Ci.optional()}),$g=II.extend({cache:Xi.optional()});var wi=(r=>(r.AUTO="auto",r.PROGRAMMATIC="programmatic",r.LONG_PRESS="long-press",r.BACKSPACE="backspace",r))(wi||{}),_I=["auto","programmatic","long-press","backspace"];var OI=Ue.extend({type:w__default.literal("TYPE"),target:Nm.optional(),keyPressDelayMs:w__default.number().optional(),text:w__default.string(),clearContent:w__default.boolean().optional(),forceClearContent:w__default.boolean().optional(),replaceStrategy:w__default.nativeEnum(wi).optional()});var Vg=OI.extend({cache:Ci.optional()}),jg=OI.extend({cache:Xi.optional()});var Gu=w__default.discriminatedUnion("type",[...Dg.options,zg,Vg,yI,xI,x$,C$,E$,yE,Ng,w$,kg,Bg,mI,$u,U$]);var qu=w__default.discriminatedUnion("type",[...Dg.options,$g,jg,SI,RI,z$,Ug,Lg,Fg,Vu,yE]);var EE={ANDROID:t=>Gu.parse(t),IOS:t=>qu.parse(t)};var vE=w__default.union([w__default.string(),w__default.record(w__default.string(),w__default.unknown().optional())]),CE=ml.extend({type:w__default.literal("MOBILE_PRESET_STEP"),keyPressDelayMs:w__default.number().optional()}),mc=CE.extend({command:Gu}),pc=CE.extend({command:qu}),jm=w__default.object({moduleId:w__default.string(),inputs:w__default.record(w__default.string(),w__default.string()).optional()}),Ku=ml.merge(jm.extend({type:w__default.literal("MOBILE_MODULE_STEP")}));jm.extend({steps:w__default.lazy(()=>Ts.array())});jm.extend({steps:w__default.lazy(()=>gl.array())});var fc=(o=>(o.V2="2",o.V3="3",o))(fc||{});var wE="3",DI=w__default.nativeEnum(fc),pme=ns.extend({platform:w__default.literal("ANDROID"),resolvedGoal:w__default.string(),steps:w__default.lazy(()=>mc.array()),autoGeneratedPostcondition:w__default.string().optional()}),fme=ns.extend({platform:w__default.literal("IOS"),resolvedGoal:w__default.string(),steps:w__default.lazy(()=>pc.array()),autoGeneratedPostcondition:w__default.string().optional()}),Hg=w__default.discriminatedUnion("platform",[pme,fme]),Wg={ANDROID:t=>t.platform==="ANDROID"?t.steps:[],IOS:t=>t.platform==="IOS"?t.steps:[]},hc=ml.extend({type:w__default.literal("MOBILE_AI_ACTION_STEP"),text:w__default.string(),version:DI.optional(),cache:Hg.optional(),precondition:w__default.string().optional(),postcondition:w__default.string().optional()});function j$(t,e){let o={id:v4$1(),type:"AI_CHECK",assertion:e,timeoutSecs:5};return {id:v4$1(),type:"MOBILE_PRESET_STEP",command:EE[t](o)}}function AE(t){let e=t.postcondition?.trim();return e||t.cache?.autoGeneratedPostcondition?.trim()||void 0}function Gg({platform:t,step:e}){let o=AE(e);return {preconditionStep:e.precondition?.trim()?j$(t,e.precondition):void 0,generatedSteps:e.cache?Wg[t](e.cache):[],postconditionStep:o?j$(t,o):void 0}}var hme=w__default.discriminatedUnion("type",[hl,zm,$u,Bm]),NI=CE.extend({command:hme}),gme=w__default.discriminatedUnion("type",[hl,zm,Vu,Bm]),LI=CE.extend({command:gme}),bme=w__default.object({assertion:NI,steps:w__default.lazy(()=>Ts.array())}),yme=w__default.object({assertion:LI,steps:w__default.lazy(()=>gl.array())}),Sme=Om.extend({blocks:w__default.lazy(()=>bme.array()),elseSteps:w__default.lazy(()=>Ts.array()).optional()}),Tme=Om.extend({blocks:w__default.lazy(()=>yme.array()),elseSteps:w__default.lazy(()=>gl.array()).optional()}),Ts=w__default.discriminatedUnion("type",[mc,Ku,hc,Sme]),gl=w__default.discriminatedUnion("type",[pc,Ku,hc,Tme]),Hm=w__default.union([Ts.array(),gl.array()]),Eme={ANDROID:Ts,IOS:gl};function Na(t){return Eme[t]}var qg=w__default.object({parameterNames:w__default.string().array(),defaultParameters:w__default.record(w__default.string(),w__default.string()).optional(),parameterEnums:w__default.record(w__default.string(),w__default.string().array()).optional()}),Wm=w__default.object({moduleId:cn,name:w__default.string(),description:w__default.string().nullish(),platform:w__default.nativeEnum(at).optional().default("ANDROID"),parameters:qg.optional(),enabled:w__default.boolean().nullish(),schemaVersion:w__default.string()}),Es=Wm.omit({name:true}),kI=Es.extend({steps:vE.array()}),FI=w__default.object({fileType:w__default.literal(Pe.MOBILE_MODULE)}).merge(kI),H$=Wm.omit({platform:true,schemaVersion:true}),vme={ANDROID:H$.extend({platform:w__default.literal("ANDROID"),steps:Ts.array()}),IOS:H$.extend({platform:w__default.literal("IOS"),steps:gl.array()})};function W$(t){return vme[t]}var Zi=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(Zi||{}),G$=w__default.object({description:w__default.string().optional(),name:w__default.string().describe("name of the module"),parameters:qg.optional()}),RE=jm.merge(G$).extend({platform:w__default.literal("ANDROID"),get steps(){return Sn.array()}}),xE=jm.merge(G$).extend({platform:w__default.literal("IOS"),get steps(){return Tn.array()}});w__default.discriminatedUnion("platform",[RE,xE]);var BI=ml.merge(RE).extend({type:w__default.literal("RESOLVED_MOBILE_MODULE")}),UI=ml.merge(xE).extend({type:w__default.literal("RESOLVED_MOBILE_MODULE")}),q$={ANDROID:BI,IOS:UI};w__default.discriminatedUnion("platform",[BI,UI]);var Cme=w__default.object({assertion:NI,get steps(){return Sn.array()}}),zI=Om.extend({get blocks(){return Cme.array()},get elseSteps(){return Sn.array().optional()}}),wme=w__default.object({assertion:LI,get steps(){return Tn.array()}}),$I=Om.extend({get blocks(){return wme.array()},get elseSteps(){return Tn.array().optional()}}),Sn=w__default.discriminatedUnion("type",[BI,mc,hc,zI]),Tn=w__default.discriminatedUnion("type",[UI,pc,hc,$I]);function K$(t){return Object.values(Zi).includes(t)||Object.values(xo).includes(t)}var ME=(i=>(i.PRECONDITION="PRECONDITION",i.REPLAY="REPLAY",i.GENERATE="GENERATE",i.AUTOHEAL="AUTOHEAL",i.POSTCONDITION="POSTCONDITION",i))(ME||{}),Y$=z.enum(["pending","running","success","failed"]),X$=z.object({type:z.literal("THOUGHT"),text:z.string(),blockId:z.string().optional()}),J$=z.object({type:z.literal("TOOL_CALL"),toolName:z.string()}),Z$=z.object({type:z.literal("PHASE"),phase:z.nativeEnum(ME),failureMessage:z.string().optional()}),Ame=z.object({type:z.literal("STEP_UPDATE"),stepIndex:z.number(),step:Sn,status:Y$,message:z.string().optional(),afterSnapshotId:z.string().optional()}),Rme=z.object({type:z.literal("STEP_UPDATE"),stepIndex:z.number(),step:Tn,status:Y$,message:z.string().optional(),afterSnapshotId:z.string().optional()}),Q$=z.object({type:z.literal("POSTCONDITION_AUTOGENERATED"),postcondition:z.string()}),xme=z.object({type:z.literal("CACHED_STEPS_GENERATED"),cachedSteps:mc.array(),resolvedGoal:z.string()}),Mme=z.object({type:z.literal("CACHED_STEPS_GENERATED"),cachedSteps:pc.array(),resolvedGoal:z.string()}),eV=z.discriminatedUnion("type",[X$,J$,Z$,Ame,xme,Q$]),tV=z.discriminatedUnion("type",[X$,J$,Z$,Rme,Mme,Q$]);var vs=w__default.object({message:w__default.string().optional(),startTime:w__default.number(),endTime:w__default.number(),status:w__default.nativeEnum(yo),trace:w__default.unknown().optional().optional(),beforeSnapshot:w__default.string().optional(),afterSnapshot:w__default.string().optional(),data:w__default.unknown().optional().optional().describe("output data from the step"),aiSuggested:w__default.boolean().optional(),beforeTestContext:xm.optional(),afterTestContext:xm.optional()}),oV=vs.merge(mc).extend({previousAttempts:w__default.lazy(()=>Zr.array()).optional()}),Pme=vs.merge(Ku).extend({steps:w__default.lazy(()=>Zr.array()),name:w__default.string().optional(),previousAttempts:w__default.lazy(()=>Zr.array()).optional()}),Ime=vs.merge(hc).extend({steps:w__default.lazy(()=>Zr.array()),previousAttempts:w__default.lazy(()=>Zr.array()).optional(),failureRecoveryReason:w__default.string().optional(),trajectory:eV.array().optional()}),_me=vs.merge(zI).extend({assertionResult:oV.optional(),steps:w__default.lazy(()=>Zr.array()),previousAttempts:w__default.lazy(()=>Zr.array()).optional()}),Zr=w__default.discriminatedUnion("type",[oV,Pme,Ime,_me]),nV=vs.merge(pc).extend({previousAttempts:w__default.lazy(()=>Qr.array()).optional()}),Ome=vs.merge(Ku).extend({steps:w__default.lazy(()=>Qr.array()),name:w__default.string().optional(),previousAttempts:w__default.lazy(()=>Qr.array()).optional()}),Dme=vs.merge(hc).extend({steps:w__default.lazy(()=>Qr.array()),previousAttempts:w__default.lazy(()=>Qr.array()).optional(),failureRecoveryReason:w__default.string().optional(),trajectory:tV.array().optional()}),Nme=vs.merge($I).extend({assertionResult:nV.optional(),steps:w__default.lazy(()=>Qr.array()),previousAttempts:w__default.lazy(()=>Qr.array()).optional()}),Qr=w__default.discriminatedUnion("type",[nV,Ome,Dme,Nme]);var Lme=vs.extend({index:w__default.number().optional(),userFacingStepReference:w__default.string().optional(),description:w__default.string()}),rV=Lme.extend({beforeScreenshot:w__default.string().optional(),afterScreenshot:w__default.string().optional()});var iV=z.object({attributesRequired:z.array(z.string()).optional(),textRequired:z.boolean().optional(),boundsRequired:z.boolean().optional(),positionSpecificity:z.enum(Xr).optional(),shapeSpecificity:z.enum(Xr).optional()}),kme=z.object({id:z.number(),requirements:iV}).array(),VI=z.object({thoughts:z.string(),id:z.number(),updatedMemory:Wh.optional(),inWebview:z.boolean().optional(),requirements:iV.optional(),additionalElements:kme.optional()}),Fme=z.literal("SCROLL_TO"),aV=z.object({description:z.string(),screenXml:z.string(),screenshot:z.string(),source:Fme.optional(),memory:z.discriminatedUnion("type",[xa,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional()}),sV=z.object({assertion:z.string(),screenXml:z.string(),screenshot:z.string(),contextChoice:Ou.optional(),memory:z.discriminatedUnion("type",[Pu,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional()}),jI=z.object({thoughts:z.string(),result:z.boolean(),relevantElements:z.array(z.number()).optional(),updatedMemory:Gh.optional()}),lV=z.object({failedResults:rV.array(),nextStepsSerialized:z.string().array(),currentScreenXml:z.string(),currentScreenshot:z.string(),customInstructions:z.string().optional(),testDescription:z.string()}),PE=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(PE||{}),HI=z.object({thoughts:z.string(),scenario:z.enum(PE),instructions:z.string().nullish(),reasonSummary:z.string().nullish()});z.looseObject({type:z.literal("response.create")});var cV=z.union([z.looseObject({response:z.looseObject({id:z.string()}),sequence_number:z.number(),type:z.literal("response.completed")}),z.looseObject({code:z.string().nullable(),message:z.string(),sequence_number:z.number(),type:z.literal("error")})]);function Qi(t){switch(t){case "ANDROID":return "android";case "IOS":return "ios"}}var gc=(a=>(a.TestRun="test-run",a.MobileTestRun="mobile-test-run",a.CreditsUsed="credits-used",a.CreditsUsedV2="credits-used-v2",a.StepsExecuted="steps-executed",a.LLMTokensUsed="llm-tokens-used",a))(gc||{}),bl=(c=>(c.TestRunner="test-runner",c.Editor="editor",c.Mcp="mcp",c.Explore="explore",c.Heal="heal",c.ResultClassification="result-classification",c.GithubPrSummary="github-pr-summary",c.AppGraph="app-graph",c.RunViewer="run-viewer",c))(bl||{}),Bme=3;function Ume(t){return t==="MODULE"||t==="CONDITIONAL"||t==="WHILE_LOOP"||t==="SECTION"||t==="RESOLVED_MODULE"}function uV(t){if(!Ume(t))switch(t){case "PRESET_ACTION":return 0;case "AI_ACTION":return 3;case "AI_ACTION_DYNAMIC":return 5;default:(o=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})();}}function dV(t){switch(t.type){case "AI_EXTRACT":case "AI_ASSERTION":return Bme;case "CAPTCHA":return 3;case "CLICK":case "TYPE":case "SELECT_OPTION":case "HOVER":case "ELEMENT_CHECK":case "FOCUS":case "BLUR":case "SCROLL_DOWN":case "SCROLL_LEFT":case "SCROLL_RIGHT":case "SCROLL_UP":case "MOUSE_DRAG":return t.useSelector||!t.target||t.target.type!=="description"?0:1;case "DRAG":return t.useSelector?0:1;case "VISUAL_DIFF":case "TAB":case "JAVASCRIPT":case "NAVIGATE":case "WAIT":case "SUCCESS":case "AUTH_LOAD":case "AUTH_SAVE":case "COOKIE":case "DIALOG":case "FILE_UPLOAD":case "GO_BACK":case "GO_FORWARD":case "LOCAL_STORAGE":case "NEW_TAB":case "CLOSE_TAB":case "PAGE_CHECK":case "PRESS":case "KEY_DOWN":case "KEY_UP":case "COPY":case "PASTE":case "REFRESH":case "REQUEST":case "GRAPHQL_REQUEST":case "WAIT_FOR_URL":case "REGISTER_REQUEST_LISTENER":case "AWAIT_LISTENER":case "RECORD_REQUESTS":case "GET_RECORDED_REQUESTS":case "SET_HEADER":case "MOCK_ROUTE":case "REMOVE_ROUTE_MOCK":case "OFFLINE_MODE":return 0;default:(o=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})();}}var WI=z.object({name:z.string(),value:z.string(),url:z.string().optional(),domain:z.string().optional(),path:z.string().optional(),expires:z.number().default(Date.now()/1e3+60*60*24*365),httpOnly:z.boolean().optional(),secure:z.boolean().default(true),sameSite:z.union([z.literal("Strict"),z.literal("Lax"),z.literal("None")]).default("None")});function IE(t,e){let o=[],n=splitCookiesString(t);for(let r of n){let i=parseString(r,{decodeValues:false});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let u=i.sameSite.trim().toLowerCase();if(u==="strict")a="Strict";else if(u==="lax")a="Lax";else if(u==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${u}`)}i.httpOnly===void 0&&(i.httpOnly=false),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=WI.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});o.push(s);let l=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),c=r.match(/\b(\S+)=([^;]*)/g);if(c)for(let u of c){let[d,m]=u.split("=");if(!d||!m)throw new Error(`Invalid key-value pair in cookie: ${u}`);l.includes(d.toLowerCase())||o.push({...s,name:d,value:m});}}return o}var Vme=z.object({origin:z.string(),localStorage:z.array(z.object({name:z.string(),value:z.string()})),sessionStorage:z.array(z.object({name:z.string(),value:z.string()})).optional()}),jme=z.object({entries:z.record(z.string(),z.array(z.tuple([z.unknown().optional(),z.unknown().optional()]))),version:z.number().optional()}),mV=z.object({cookies:WI.array().optional(),origins:Vme.array().optional(),idb:z.record(z.string(),jme).optional().describe("key is db name")});function Gm(t,e){let o=[];return t.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let r=WI.safeParse({name:n.key,...n});if(!r.success)return;let i=r.data;!i.domain&&!i.url&&(i.domain=e),o.push(i);}),o}var Hme=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM","CUSTOM_COORDINATES"],pV=w__default.object({type:w__default.enum(Hme).describe("Where to interact. SCREEN = entire device (use for system surfaces like the notification bar or quick settings), OPEN_APP = current foreground app when the main app content itself should scroll, OPEN_WEBVIEW = active webview (only if a webview is present and there is high confidence that the element is inside it), CUSTOM = explicitly describe a nested scrollable container when scrolling should happen inside a visible region such as an open dropdown list, picker, modal body, bottom sheet, carousel, or inner panel, CUSTOM_COORDINATES = use explicit pixel coordinates for the scroll start position and distance (fallback if other containers don't work)."),description:w__default.string().or(w__default.null()).describe("Description of the container to interact with. Only used if the container type is CUSTOM, else set to null. Describe the scrollable container itself, not the target item inside it. Good examples: 'the open country dropdown list', 'the results list in the bottom sheet', 'the modal body showing account settings'."),startX:w__default.number().or(w__default.null()).describe("Starting X coordinate in pixels. Only used if the container type is CUSTOM_COORDINATES, else set to null."),startY:w__default.number().or(w__default.null()).describe("Starting Y coordinate in pixels. Only used if the container type is CUSTOM_COORDINATES, else set to null."),deltaPixels:w__default.number().or(w__default.null()).describe("Number of pixels to scroll in the specified direction. Only used if the container type is CUSTOM_COORDINATES, else set to null.")}),Wme=w__default.object({xPercent:w__default.number().min(0).max(1).describe("X coordinate as a fraction of the viewport width (0 = left edge, 1 = right edge)."),yPercent:w__default.number().min(0).max(1).describe("Y coordinate as a fraction of the viewport height (0 = top edge, 1 = bottom edge).")}),Gme=w__default.string().or(Wme).describe("Either a string description of an actual element in the page XML to target, or an object with xPercent/yPercent (0-1) for coordinate-based targeting when no suitable element exists. Prefer element descriptions when possible."),fV=w__default.object({type:w__default.literal("TAP"),target:Gme,longPress:w__default.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),iterations:w__default.null().or(w__default.number()).describe("Number of times to tap the element, useful for selecting text, selecting a row, or opening a menu. If null, tap once."),relativePosition:pm.nullable().describe("Specific position to tap within the bounding box of the element, specified in pixels. E.g. 0,0 is the top left corner. Only applicable when target is a string description.")}).describe("Tap on an element on the screen, or tap at specific coordinates."),qme=w__default.object({type:w__default.literal("PRESS"),key:w__default.nativeEnum(Ji)}).describe("Press a button on the device. Some buttons are physical (volume) while others are virtual (Back/Home/App Switcher)."),hV=w__default.object({type:w__default.literal("AI_CHECK"),assertion:w__default.string().describe("A natural language assertion to validate. On each attempt, Momentic's AI agents will evaluate the assertion by analyzing the current emulator XML and screenshot. Thus, the assertion must be verifiable based on a single point in time. The assertion will be automatically retried until it is true or the timeout is reached."),timeoutSecs:w__default.number().describe("Maximum number of seconds to wait for the assertion to be true.")}).describe("Use AI to verify a statement about the state of the emulator. Will retry up until the timeout, so this can be used as a flexible wait that supports visual, numerical, and logical reasoning."),gV=w__default.object({type:w__default.literal("WAIT"),timeoutSecs:w__default.number().describe("Number of seconds to wait.")}).describe("Wait for a fixed number of seconds. Use this in these scenarios: 1. Short waits that are expected to be less than 5 seconds almost all the time, which shouldn't warrant an AI call (e.g. an app needs to finish loading, or some contents are suspending); 2. Waits with an obvious deterministic duration (e.g. a 60-second countdown is on the page). For other scenarios, prefer AI_CHECK.");w__default.object({type:w__default.literal("AI_EXTRACT"),goal:w__default.string().describe("Natural language description of what to extract from the current emulator state."),schema:w__default.string().or(w__default.null()).describe("Optional JSON schema string for the expected output shape. Use null to omit.")}).describe("Use AI to extract structured data from the current emulator state.");var bV=w__default.object({type:w__default.literal("TYPE"),target:w__default.string().or(w__default.null()).optional().describe("Description of the input element to type into. Required when clearContent is true. Set to null only when typing into the already-focused element."),text:w__default.string().describe("Exact text to type, which will be passed to appium's driver.keys() method. Use an empty string only when clearContent is true and the goal is to clear the target field."),keyPressDelayMs:w__default.number().or(w__default.null()).describe("Milliseconds to wait between each key press. Useful for triggering auto-complete and other event listeners."),clearContent:w__default.boolean().or(w__default.null()).describe("Clear the content of the target input before typing. To clear a populated field without entering replacement text, provide the target, set text to an empty string, and set clearContent to true. Do not repeat empty TYPE steps if the field did not clear."),replaceStrategy:w__default.nativeEnum(wi).or(w__default.null()).describe("Optional strategy for clearing the target before typing. Defaults to auto. Use a specific value only when a known native input needs a more efficient or more reliable replacement path.")}),yV=w__default.object({type:w__default.literal("SWIPE"),direction:w__default.enum(["up","down","left","right"]).describe("Direction to swipe. Important: swiping up will scroll down, and vice versa."),container:pV,viewportPercent:w__default.number().min(.1).max(1).or(w__default.null()).describe("How much of the container height/width to swipe each time as a decimal (0.1 - 1). Set to null for default (0.8)."),durationMs:w__default.number().int().positive().or(w__default.null()).describe("Optional swipe duration in milliseconds. Set to null for default.")}).describe("Swipe a single time in a specified direction within a container (screen/app/webview/custom container/custom coordinates). Use CUSTOM when the swipe should happen inside a nested scrollable region rather than across the whole app."),SV=w__default.object({type:w__default.literal("SCROLL_TO"),targetDescription:w__default.string().describe("Description of the element to scroll to inside the container."),direction:w__default.enum(["down","up"]).describe("Direction to search for the target. Important: this is direction the target is in relative to the current position. E.g. 'down' means the desired element is below the current position."),container:pV,scrollStepPercent:w__default.number().min(.1).max(1).or(w__default.null()).describe("How much of the container height to scroll at each step (0.1 - 1). Set to null for default (0.8)."),maxScrollAttempts:w__default.number().int().min(1).max(50).or(w__default.null()).describe("Maximum number of scroll attempts before giving up. Set to null for default (20).")}).describe("Scroll within a container until the described target is visible or we can't scroll anymore. There is no need to repeat the same scroll to command in the same direction multiple times in a row. If the target lives inside a nested list, picker, modal body, bottom sheet, carousel, or other inner scroll region, use CUSTOM and describe that container rather than OPEN_APP. If a scroll fails, we do not restore the position automatically."),GI=w__default.discriminatedUnion("type",[fV,qme,hV,gV,bV,yV,SV]),Kme=w__default.object({type:w__default.literal("PRESS"),key:w__default.nativeEnum(er)}).describe("Press a physical button on the device. Only HOME and POWER are available on iOS."),Yme=w__default.object({type:w__default.literal("PRESS_KEYBOARD"),key:w__default.nativeEnum(yr)}).describe("Press a key on the keyboard. Available keys: ENTER, BACKSPACE."),qI=w__default.discriminatedUnion("type",[fV,Kme,Yme,hV,gV,bV,yV,SV]),_E=t=>{switch(t.type){case "SCREEN":return {type:"SCREEN"};case "OPEN_APP":return {type:"OPEN_APP"};case "OPEN_WEBVIEW":return {type:"OPEN_WEBVIEW"};case "CUSTOM":if(!t.description)throw new It("Description is required when container type is CUSTOM.");return {type:"CUSTOM",target:{type:"description",description:t.description}};case "CUSTOM_COORDINATES":{if(t.startX==null||t.startY==null||t.deltaPixels==null)throw new It("startX, startY, and deltaPixels are required when container type is CUSTOM_COORDINATES.");return {type:"CUSTOM_COORDINATES",startX:t.startX,startY:t.startY,deltaPixels:t.deltaPixels}}default:{throw new Error("Unreachable")}}},TV=t=>typeof t=="string"?{type:"description",description:t}:{type:"coordinates",xPercent:t.xPercent,yPercent:t.yPercent},EV=t=>{let e=GI.parse(t);switch(e.type){case "TAP":return {id:v4$1(),type:"TAP",target:TV(e.target),longPress:e.longPress??void 0,iterations:e.iterations??void 0,relativePosition:typeof e.target=="string"?e.relativePosition??void 0:void 0};case "PRESS":return {id:v4$1(),...e};case "AI_CHECK":return {id:v4$1(),...e};case "WAIT":return {id:v4$1(),...e};case "TYPE":return {id:v4$1(),type:"TYPE",target:e.target?{type:"description",description:e.target}:void 0,text:e.text,keyPressDelayMs:e.keyPressDelayMs??void 0,clearContent:e.clearContent??void 0,replaceStrategy:e.replaceStrategy??void 0};case "SWIPE":return {id:v4$1(),type:"SWIPE",direction:e.direction,scrollableElement:_E(e.container),viewportPercent:e.viewportPercent??void 0,durationMs:e.durationMs??void 0};case "SCROLL_TO":return {id:v4$1(),type:"SCROLL_TO",target:{type:"description",description:e.targetDescription},direction:e.direction,scrollableElement:_E(e.container),scrollStepPercent:e.scrollStepPercent??void 0,maxScrollAttempts:e.maxScrollAttempts??void 0};default:{throw new Error("Unreachable")}}},vV=t=>{let e=qI.parse(t);switch(e.type){case "TAP":return {id:v4$1(),type:"TAP",target:TV(e.target),longPress:e.longPress??void 0,iterations:e.iterations??void 0,relativePosition:typeof e.target=="string"?e.relativePosition??void 0:void 0};case "PRESS":return {id:v4$1(),...e};case "PRESS_KEYBOARD":return {id:v4$1(),...e};case "AI_CHECK":return {id:v4$1(),...e};case "WAIT":return {id:v4$1(),...e};case "TYPE":return {id:v4$1(),type:"TYPE",target:e.target?{type:"description",description:e.target}:void 0,text:e.text,keyPressDelayMs:e.keyPressDelayMs??void 0,clearContent:e.clearContent??void 0,replaceStrategy:e.replaceStrategy??void 0};case "SWIPE":return {id:v4$1(),type:"SWIPE",direction:e.direction,scrollableElement:_E(e.container),viewportPercent:e.viewportPercent??void 0,durationMs:e.durationMs??void 0};case "SCROLL_TO":return {id:v4$1(),type:"SCROLL_TO",target:{type:"description",description:e.targetDescription},direction:e.direction,scrollableElement:_E(e.container),scrollStepPercent:e.scrollStepPercent??void 0,maxScrollAttempts:e.maxScrollAttempts??void 0};default:{throw new Error("Unreachable")}}};var CV=w__default.object({left:w__default.number(),top:w__default.number(),width:w__default.number(),height:w__default.number()});var ei={type:true,cache:true},wV=[hl.pick(ei),$u.pick(ei),zg.pick(ei),Vg.pick(ei),Bg.pick(ei),kg.pick(ei),Ng.pick(ei)],Yu=w__default.discriminatedUnion("type",wV),AV=[hl.pick(ei),Vu.pick(ei),$g.pick(ei),jg.pick(ei),Ug.pick(ei),Lg.pick(ei),Fg.pick(ei)],KI=w__default.discriminatedUnion("type",AV),Km=t=>Ci.safeParse(t).success,Xu=t=>Pg.safeParse(t).success,YI=t=>Xi.safeParse(t).success;function XI(t){return !!t&&(t.type==="AI_ASSERTION"||t.type==="AI_CHECK")&&!!t.cache}var Xme=Object.values(tt).filter(t=>wV.some(e=>e.shape.type.safeParse(t).success));function Ym(t){return Xme.includes(t.type)}var Jme=Object.values(tt).filter(t=>AV.some(e=>e.shape.type.safeParse(t).success));function JI(t){return Jme.includes(t.type)}function ea(t,e){return t==="ANDROID"&&Ym(e)||t==="IOS"&&JI(e)}var OE=w__default.object({type:w__default.literal("MOBILE_AI_ACTION_STEP"),cache:Hg}),DE=w__default.union([Yu,OE]),NE=w__default.union([KI,OE]),LE={ANDROID:Yu,IOS:KI},RV={ANDROID:t=>DE.parse(t),IOS:t=>NE.parse(t)},kE={ANDROID:t=>Yu.parse(t),IOS:t=>KI.parse(t)};var Xg=(a=>(a.US_EAST_1="us-east1",a.US_EAST_2="us-east2",a.US_WEST_1="us-west1",a.US_WEST_2="us-west2",a.EU_NORTH_1="eu-north1",a.AS_SOUTH_1="as-south1",a))(Xg||{}),Jg=(n=>(n.US="us",n.EU="eu",n.AS="as",n))(Jg||{}),Cs=(e=>(e.LOCAL="local",e))(Cs||{}),ZI=w__default.nativeEnum(Xg).or(w__default.nativeEnum(Jg)),QI=w__default.nativeEnum(Xg).or(w__default.nativeEnum(Jg)).or(w__default.nativeEnum(Cs)),xi="closest",bc=QI.or(w__default.literal(xi)),Xm=(o=>(o.ANDROID_14="14",o.ANDROID_15="15",o))(Xm||{}),Jm="14",FE=(e=>(e.IOS_26="26",e))(FE||{}),Zm="26",Zme=["1.56.1-lim.1","1.60.0-lim.1"],xV=w__default.enum(Zme);var MV="1.60.0-lim.1",PV=w__default.nativeEnum(Xm).or(w__default.nativeEnum(FE));var epe="-",tpe=[Rm,gg],IV=[Rm,gg],e_=2e4,ta=class t{env={};varsFromMomenticEnvironment={};initialParams;constructor(e){this.initialParams=cloneDeep(e),this.reset(e);}static dummyContext(e=void 0,o=void 0,n={}){return new t({testName:e,envName:o,variablesFromEnvironment:n})}static fromSnapshot({snapshot:e,environmentVariables:o}){let n=e.env[Rm],r=e.env[gg],i={};for(let[s,l]of Object.entries(e.env))IV.includes(s)||(o??{})[s]===void 0&&(i[s]=l);return new t({dynamicVariables:i,envName:n,testName:r,variablesFromEnvironment:o??{}})}setEnvVariables(e){let o=cloneDeep(e);this.env=Object.assign(this.env,o);}setInputs(e){e&&this.setEnvVariables(e);}setMomenticSystemVariable(e,o){this.varsFromMomenticEnvironment[e]=o;}getVariable(e){return this.env[e]}setVariable(e,o){tpe.includes(e)||(this.env[e]=o);}getEnvName(){return this.env[Rm]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return cloneDeep(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy(),o=new Set;if(e.env=Object.fromEntries(Object.entries(e.env).map(([r,i])=>IV.includes(r)||this.varsFromMomenticEnvironment[r]===void 0?[r,i]:(o.add(r),[r,epe]))),JSON.stringify(e.env).length>e_){for(let r of o)if(delete e.env[r],JSON.stringify(e.env).length<=e_)break}let{jsonString:n}=F6(JSON.stringify(e.env),e_);try{e.env=JSON.parse(n);}catch{e.env={};}return e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.varsFromMomenticEnvironment=cloneDeep(e.variablesFromEnvironment),e.envName&&this.setMomenticSystemVariable(Rm,e.envName),e.testName&&this.setMomenticSystemVariable(gg,e.testName);}resetToInitial(){this.reset(this.initialParams);}getDynamicVariablesCopy(){return cloneDeep(this.env)}getVariablesFromEnvironmentCopy(){return cloneDeep(this.varsFromMomenticEnvironment)}};var ope=w__default.object({disableMomenticAccessibilityTree:w__default.boolean().optional(),autoGrantPermissions:w__default.boolean().optional().describe("Automatically grant app permission prompts during the run. Android only."),autoAcceptAlerts:w__default.boolean().optional().describe("Automatically accept native alert dialogs. iOS only."),autoDismissAlerts:w__default.boolean().optional().describe("Automatically dismiss native alert dialogs. iOS only."),disableXmlSnapshots:w__default.boolean().optional().describe("Skip collecting XML snapshots during test runs. This can speed up test runs, but will cause the run viewer to show less information."),browserSettings:KP.optional(),locale:w__default.string().optional().describe("Device locale code (e.g. 'fr', 'en-us'). Sets the device language and region. iOS and Android.")}),Ju="avdId",t_="iosDeviceType",o_="iosVersion",n_=ope.extend({region:QI.optional().describe('Where the emulator runs: "local" for an emulator on your machine, or a region for hosted emulators. Defaults to hosted emulators.'),remoteEmulatorSettings:w__default.object({androidVersion:w__default.nativeEnum(Xm).optional()}).optional(),localEmulatorSettings:w__default.object({[Ju]:Mm,[t_]:Mm,[o_]:Mm}).optional(),geolocation:w__default.object({latitude:w__default.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:w__default.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),waitForStability:w__default.boolean().optional().describe("wait for stability before every targeting action")});function BE(t){let e=t.split("-"),o=e[0]??t,n=e.slice(1);return {"appium:language":o,...n.length>0&&{"appium:locale":n.join("-").toUpperCase()}}}var Ur=w__default.object({retries:w__default.number().optional().describe("number of retries to run"),defaultChannel:w__default.string().optional().describe("Default app release channel to use when installing from managed mobile artifacts."),defaultTag:w__default.string().optional().describe("Default app artifact tag to use. If not set, the latest available tag is used."),defaultEnv:w__default.string().optional().describe("Default mobile environment name to load variables from at runtime."),defaultApkFilePath:Mm.describe("APK to install when using the emulator in the local region."),defaultAppFilePath:Mm.describe("App file (e.g. .app or .ipa) to install when using the emulator in the local region."),emulator:n_.optional().describe("Emulator configuration for local or remote mobile execution, including region and local emulator overrides."),ai:XP.optional().describe("AI behavior overrides for this mobile test, such as memory and failure recovery settings.")}),UE=w__default.object({id:cn,description:w__default.string(),schemaVersion:w__default.string(),settings:Ur.optional(),disabled:w__default.boolean().optional(),labels:w__default.array(w__default.string()).optional()}),ep=UE.extend({platform:w__default.literal("ANDROID").optional().default("ANDROID")}),tp=UE.extend({platform:w__default.literal("IOS")}),yc=w__default.discriminatedUnion("platform",[ep,tp]),_V=w__default.object({fileType:w__default.literal(Pe.MOBILE_TEST)}),zE=_V.merge(ep),$E=_V.merge(tp),VE=w__default.discriminatedUnion("platform",[zE,$E]),OV=ep.merge(w__default.object({steps:w__default.array(Ts)})),DV=tp.merge(w__default.object({steps:w__default.array(gl)}));w__default.discriminatedUnion("platform",[OV,DV]);var npe=zE.merge(OV),rpe=$E.merge(DV),NV=w__default.discriminatedUnion("platform",[npe,rpe]);w__default.object({name:w__default.string(),steps:w__default.array(Ts).optional(),settings:Ur.optional()});var LV=ep.extend({steps:Sn.array(),beforeSteps:Sn.array().optional(),afterSteps:Sn.array().optional()}),kV=tp.extend({steps:Tn.array(),beforeSteps:Tn.array().optional(),afterSteps:Tn.array().optional()});w__default.discriminatedUnion("platform",[LV,kV]);var r_=LV.extend({name:w__default.string()}),i_=kV.extend({name:w__default.string()});w__default.discriminatedUnion("platform",[r_,i_]);var Hn=w__default.object({startTime:w__default.number(),endTime:w__default.number().optional(),durationMs:w__default.number().optional(),error:w__default.string().optional(),result:w__default.unknown().optional().optional(),attributes:w__default.record(w__default.string(),w__default.unknown().optional()),subSpans:w__default.lazy(()=>vpe.array())});var a_=Hn.extend({type:w__default.literal("SECTION"),name:w__default.string()}),ipe=Hn.extend({type:w__default.literal("GET_PAGE_STATE")}),ape=Hn.extend({type:w__default.literal("GET_PAGE_SCREENSHOT")}),spe=Hn.extend({type:w__default.literal("SMART_WAITING")}),lpe=Hn.extend({type:w__default.literal("SCROLL_ELEMENT_INTO_VIEW")}),cpe=Hn.extend({type:w__default.literal("AI_LOCATOR_CALL"),screenshotSnapshotId:w__default.string().optional(),result:w__default.object({id:w__default.number(),thoughts:w__default.string(),citations:sn.array().optional()}).optional()}),upe=Hn.extend({type:w__default.literal("AI_ASSERTION_CALL"),screenshotSnapshotId:w__default.string().optional(),elementScreenshotSnapshotId:w__default.string().optional(),result:w__default.object({thoughts:w__default.string(),result:w__default.boolean(),citations:sn.array().optional()}).optional()}),dpe=Hn.extend({type:w__default.literal("AI_EXTRACTION_CALL"),screenshotSnapshotId:w__default.string().optional(),browserStateSnapshotId:w__default.string().optional(),result:w__default.object({thoughts:w__default.string().optional(),result:w__default.unknown().optional().optional()}).optional()}),mpe=Hn.extend({type:w__default.literal("ELEMENT_ASSERTION"),name:w__default.string(),result:w__default.object({success:w__default.boolean(),message:w__default.string().optional()}).optional()}),ppe=Hn.extend({type:w__default.literal("BROWSER_INTERACTION"),name:w__default.string(),coordinates:w__default.object({x:w__default.number(),y:w__default.number()}).optional(),value:w__default.string().optional(),selector:w__default.string().optional()}),fpe=Hn.extend({type:w__default.literal("CACHE_RESOLUTION"),resolutionMethod:w__default.string().optional(),cacheMissReason:w__default.nativeEnum(fm).optional(),targetSource:w__default.string().optional(),elementScreenshotSnapshotId:w__default.string().optional(),result:w__default.object({serializedElement:w__default.string()}).optional()}),hpe=Hn.extend({type:w__default.literal("TARGET_RESOLUTION"),elementScreenshotSnapshotId:w__default.string().optional(),result:w__default.object({serializedElement:w__default.string()}).optional()}),gpe=Hn.extend({type:w__default.literal("LOCATOR_REDIRECT"),elementScreenshotSnapshotId:w__default.string().optional(),result:w__default.object({outcome:w__default.string(),logs:w__default.string().array().optional(),serializedElement:w__default.string().optional(),relativeClickPoint:w__default.object({x:w__default.number(),y:w__default.number()}).optional(),force:w__default.boolean().optional()}).optional()}),bpe=Hn.extend({type:w__default.literal("WAIT_FOR_STABILITY")}),ype=Hn.extend({type:w__default.literal("GENERIC"),name:w__default.string()}),Spe=Hn.extend({type:w__default.literal("PAGE_ASSERTION"),name:w__default.string(),result:w__default.object({success:w__default.boolean(),message:w__default.string().optional()}).optional()}),Tpe=Hn.extend({type:w__default.literal("AUTO_FOLLOW_NEW_TABS"),result:w__default.object({followed:w__default.boolean()}).optional()}),Epe=Hn.extend({type:w__default.literal("VISUAL_DIFF"),name:w__default.string(),result:w__default.object({success:w__default.boolean(),message:w__default.string().optional()}).optional()});function FV(t){return t.type==="CACHE_RESOLUTION"||t.type==="TARGET_RESOLUTION"}var vpe=w__default.discriminatedUnion("type",[a_,ipe,ape,spe,lpe,cpe,upe,dpe,mpe,ppe,hpe,fpe,gpe,bpe,Spe,Epe,ype,Tpe]);var ti=w__default.object({startTime:w__default.number(),endTime:w__default.number().optional(),durationMs:w__default.number().optional(),error:w__default.string().optional(),targetBounds:CV.optional(),result:w__default.unknown().optional().optional(),attributes:w__default.record(w__default.string(),w__default.unknown().optional()),subSpans:w__default.lazy(()=>s_.array())});var Cpe=ti.extend({type:w__default.literal("SECTION"),name:w__default.string()}),wpe=ti.extend({type:w__default.literal("AI_LOCATOR_CALL"),result:w__default.object({id:w__default.number(),thoughts:w__default.string()}).optional()}),Ape=ti.extend({type:w__default.literal("AI_ASSERTION_CALL"),result:w__default.object({thoughts:w__default.string(),result:w__default.boolean()}).optional()}),Rpe=ti.extend({type:w__default.literal("AI_EXTRACTION_CALL"),screenshotSnapshotId:w__default.string().optional(),emulatorStateSnapshotId:w__default.string().optional(),result:w__default.object({thoughts:w__default.string().optional(),result:w__default.unknown().optional().optional()}).optional()}),xpe=ti.extend({type:w__default.literal("TARGET_RESOLUTION"),result:w__default.object({serializedElement:w__default.string()}).optional()}),Mpe=ti.extend({type:w__default.literal("EMULATOR_INTERACTION"),name:w__default.string(),withinWebview:w__default.boolean().optional()}),Ppe=ti.extend({type:w__default.literal("EMULATOR_READ_STATE"),name:w__default.string()}),Ipe=ti.extend({type:w__default.literal("ELEMENT_ASSERTION"),name:w__default.string(),withinWebview:w__default.boolean().optional(),result:w__default.object({success:w__default.boolean(),message:w__default.string().optional()}).optional()}),_pe=ti.extend({type:w__default.literal("CACHE_RESOLUTION")}),Ope=ti.extend({type:w__default.literal("WAIT_FOR_SCREENSHOT_STABILITY")}),Dpe=ti.extend({type:w__default.literal("WAIT_FOR_PAGE_STABILITY")}),Npe=ti.extend({type:w__default.literal("VISUAL_DIFF"),result:w__default.object({created:w__default.boolean(),success:w__default.boolean(),message:w__default.string()}).optional()}),Lpe=ti.extend({type:w__default.literal("WEBVIEW_LOCATOR_CALL"),webTrace:a_}),kpe=ti.extend({type:w__default.literal("GENERIC"),name:w__default.string()}),s_=w__default.discriminatedUnion("type",[Cpe,wpe,Ape,Rpe,xpe,Mpe,Ppe,Ipe,_pe,Ope,Dpe,Npe,Lpe,kpe]);z.object({testId:z.string(),sessionId:z.string()});var BV=z.object({uploadUrl:z.string(),id:z.string()});var np=(o=>(o.LOCAL="local",o.REMOTE="remote",o))(np||{});w__default.nativeEnum(np);function rp({overrideAvdId:t,overrideApkFilePath:e,emulatorSettings:o,defaultApkFilePath:n,envVariables:r}){let i=Mi(r?.[nc]),{filePath:a,source:s}=UV({overrideFilePath:e,defaultFilePath:n,envFilePath:Mi(r?.[b1])});return {avdId:Mi(t)??Mi(o?.localEmulatorSettings?.[Ju])??i,apkFilePath:a,apkFilePathSource:s}}function ip({overrideDeviceType:t,overrideIosVersion:e,overrideAppFilePath:o,emulatorSettings:n,defaultAppFilePath:r,envVariables:i}){let a=Mi(i?.[rc]),s=Mi(i?.[y1]),{filePath:l,source:c}=UV({overrideFilePath:o,defaultFilePath:r,envFilePath:Mi(i?.[S1])});return {deviceType:Mi(t)??Mi(n?.localEmulatorSettings?.[t_])??a,iosVersion:Mi(e)??Mi(n?.localEmulatorSettings?.[o_])??s,appFilePath:l,appFilePathSource:c}}function Mi(t){if(typeof t!="string")return;let e=t.trim();return e||void 0}function UV({overrideFilePath:t,defaultFilePath:e,envFilePath:o}){let n=Mi(t),r=Mi(e);return {filePath:n??r??o,source:n?"override":r?"default":o?"env":void 0}}var Bpe=z.string().refine(t=>Ll.valid(t),{error:"must be a valid semver string"});function l_(t){return Ll.parse(t)||void 0}function c_(t){if(t!==void 0)return t===true||t==="true"||t==="1"}var $V="on-fail";function VV(t){return t==="on-fail"?"on-fail":t==="false"?false:!!t}var u_=(o=>(o.CLI="cli",o.MobileCLI="mobile-cli",o))(u_||{}),Upe=z.nativeEnum(u_),jV=(n=>(n.Error="error",n.Warn="warn",n.Info="info",n))(jV||{}),zpe=z.nativeEnum(jV),$pe=z.object({id:z.string(),level:zpe,versionRange:z.string(),announcement:z.string()});z.object({cliType:Upe,version:Bpe});var HV=z.object({announcements:z.array($pe)});var ap=55555,jE="momentic-code-eval.js";z.object({body:z.string(),to:z.string(),from:z.string()});z.object({from:z.string().optional(),to:z.string(),timeout:z.number().optional(),beforeDate:z.string().pipe(z.coerce.date()).or(z.date()).optional(),afterDate:z.string().pipe(z.coerce.date()).or(z.date()).optional()});z.object({timeoutMs:z.number().nonnegative().optional()}).optional();z.object({phoneNumber:z.string(),leaseToken:z.string()});var Vpe=z.union([z.string(),z.date()]).transform(t=>t instanceof Date?t:new Date(t)),WV=z.object({phoneNumber:z.string(),expiresAt:Vpe,leaseToken:z.string()});z.object({to:z.email(),from:z.string(),subject:z.string(),body:z.string(),html:z.string().optional()});z.object({inbox:z.string().transform(t=>t.toLowerCase()),afterDate:z.string().pipe(z.coerce.date()).or(z.date()).optional(),timeout:z.number().optional(),trimWhitespace:z.boolean().optional()});z.object({inbox:z.string(),limit:z.number().optional(),afterDate:z.string().pipe(z.coerce.date()).or(z.date()).optional(),trimWhitespace:z.boolean().optional()});var GV=z.object({email:z.string(),prefix:z.string(),expiresAt:z.coerce.date()}),HE=(o=>(o.RAW="RAW",o.RESPONSE="RESPONSE",o))(HE||{}),qV=z.object({body:z.string().nullish(),status:z.number().optional(),headers:z.array(z.tuple([z.string(),z.string()])).optional()}),jpe=z.object({url:z.string(),options:z.object({method:z.string(),body:z.string().nullish(),headers:z.array(z.tuple([z.string(),z.string()])).optional()}).optional()}).optional(),Hpe=z.object({body:z.string().nullish(),options:z.object({status:z.number(),statusText:z.string().optional(),headers:z.array(z.tuple([z.string(),z.string()])).optional()}).optional()}).optional(),KV=z.object({result:z.unknown().optional(),variableUpdates:z.record(z.string(),z.unknown().optional()).optional(),persistentVariableUpdates:z.record(z.string(),z.unknown().optional()).optional(),error:z.string().optional(),success:z.boolean()});z.object({id:z.string().optional(),orgId:z.string(),momenticLambdaAuthHash:z.string(),code:z.string(),fragment:z.boolean(),state:z.object({env:z.record(z.string(),z.unknown().optional()),request:jpe,response:Hpe,additionalBindings:z.record(z.string(),z.unknown().optional()).optional()}),timeoutMs:z.number().optional(),disallowVariableUpdates:z.boolean().optional(),responseSerialization:z.enum(HE).optional()});var Sc=9e4;var Wpe=w.object({url:w.string(),lineNumber:w.number(),columnNumber:w.number()}),YV=w.object({timestamp:w.number(),text:w.string(),type:w.string(),tabIndex:w.number(),args:w.unknown().optional().array().optional(),url:w.string().optional(),location:Wpe.optional()}),XV=YV.array(),d_=XV.array();var Gpe=z.object({name:z.string(),version:z.string(),comment:z.string().optional()}),qpe=z.object({name:z.string(),version:z.string(),comment:z.string().optional()}),Kpe=z.object({onContentLoad:z.number().optional(),onLoad:z.number().optional(),comment:z.string().optional()}),Zg=z.object({startedDateTime:z.string(),id:z.string(),title:z.string().optional(),pageTimings:Kpe,comment:z.string().optional()}),Ype=z.array(Zg),Xpe=z.object({name:z.string(),value:z.string(),path:z.string().optional(),domain:z.string().optional(),expires:z.string().optional(),httpOnly:z.boolean().optional(),secure:z.boolean().optional(),comment:z.string().optional()}),ZV=z.array(Xpe),Jpe=z.object({name:z.string(),value:z.string(),comment:z.string().optional()}),QV=z.array(Jpe),Zpe=z.object({name:z.string(),value:z.string(),comment:z.string().optional()}),Qpe=z.array(Zpe),efe=z.object({name:z.string(),value:z.string().optional(),fileName:z.string().optional(),contentType:z.string().optional(),comment:z.string().optional()}),tfe=z.array(efe),ofe=z.object({mimeType:z.string(),params:tfe,text:z.string(),comment:z.string().optional(),_redactedReason:z.string().optional()}),nfe=z.object({method:z.string(),url:z.string(),httpVersion:z.string().optional(),cookies:ZV,headers:QV,queryString:Qpe,postData:ofe.optional(),headersSize:z.number().optional(),bodySize:z.number().optional(),comment:z.string().optional()}),rfe=z.object({size:z.number().optional(),compression:z.number().optional(),mimeType:z.string().optional(),text:z.string().optional(),encoding:z.string().optional(),comment:z.string().optional(),_redactedReason:z.string().optional()}),ife=z.object({status:z.number(),statusText:z.string(),httpVersion:z.string().optional(),cookies:ZV,headers:QV,content:rfe,redirectURL:z.string().optional(),headersSize:z.number().optional(),bodySize:z.number().optional(),comment:z.string().optional(),_mocked:z.boolean().optional()}),JV=z.object({expires:z.string().optional(),lastAccess:z.string(),eTag:z.string(),hitCount:z.number(),comment:z.string().optional()}),afe=z.object({beforeRequest:JV.optional(),afterRequest:JV.optional(),comment:z.string().optional()}),sfe=z.object({blocked:z.number().optional(),dns:z.number().optional(),connect:z.number().optional(),send:z.number(),wait:z.number(),receive:z.number(),ssl:z.number().optional(),comment:z.string().optional()}),Qg=z.object({pageref:z.string().optional(),startedDateTime:z.string(),time:z.number().optional(),request:nfe,response:ife.optional(),cache:afe.optional(),timings:sfe,serverIPAddress:z.string().optional(),connection:z.string().optional(),comment:z.string().optional(),_resourceType:z.string().optional()}),lfe=z.array(Qg),cfe=z.object({version:z.string().default("1.1"),creator:Gpe.optional(),browser:qpe.optional(),pages:Ype.optional(),entries:lfe,comment:z.string().optional()});z.object({log:cfe});z.record(z.string(),Zg);z.record(z.string(),Qg);function m_(t,e){return {log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(t).sort((o,n)=>new Date(o.startedDateTime).getTime()-new Date(n.startedDateTime).getTime()),entries:Object.values(e).sort((o,n)=>new Date(o.startedDateTime).getTime()-new Date(n.startedDateTime).getTime())}}}var ej=(T=>(T.DisableClickhouseCaches="disable_clickhouse_caches",T.ShowZeroOpacityElements="show_zero_opacity_elements",T.VisualActions="visual_actions",T.RagV2="rag_v2",T.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",T.GlobalLocatorRedirect="global_locator_redirect",T.FakerConstantSeed="faker_constant_seed",T.AutoExpandIframes="auto_expand_iframes",T.MobileNewAiActionStepsUseV3="mobile_new_ai_action_steps_use_v3",T.PerformanceInsights="performance_insights",T.ShowKnowledgeBase="show_knowledge_base",T.AppGraphBackend="app_graph_backend",T.AppGraphUI="app_graph_ui",T.ClassificationUI="classification_ui",T.HealingUI="healing_ui",T.ExploreUI="explore_ui",T.SlackNotifications="slack_notifications",T.SlackNotificationDms="slack_notification_dms",T.ResultClassificationCache="result_classification_cache",T))(ej||{});var Tc=z.union([z.string(),z.number(),z.boolean(),z.null(),z.record(z.string(),z.lazy(()=>Tc)),z.array(z.lazy(()=>Tc))]);var Zu={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},tj=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"];var oj=z.discriminatedUnion("operation",[z.object({operation:z.literal("upsert"),path:z.string().min(1),content:z.string()}),z.object({operation:z.literal("delete"),path:z.string().min(1)})]),mfe=z.object({githubLogin:z.string().optional(),email:z.string().optional()}),pfe=z.object({baseSha:z.string().min(1),headSha:z.string().min(1)}),ffe=z.object({baseBranch:z.string().min(1).max(255),baseCommitSha:z.string().min(1),headBranch:z.string().min(1).max(255).optional(),branchPrefix:z.string().min(1).max(255).optional(),idempotencyKey:z.string().min(1).optional()}),hfe=z.object({commitMessage:z.string().min(1),title:z.string().min(1),body:z.string(),reviewers:z.array(z.string().min(1)).optional(),draft:z.boolean().optional()});ffe.extend(hfe.shape).extend({changes:z.array(oj).min(1),coAuthorRange:pfe.optional(),requestCommitAuthorsAsReviewers:z.boolean().optional()}).superRefine((t,e)=>{t.headBranch||(!t.branchPrefix||!t.idempotencyKey)&&e.addIssue({code:"custom",message:"branchPrefix and idempotencyKey are required when headBranch is omitted",path:["idempotencyKey"]});});var nj=z.object({pullRequestUrl:z.url(),pullRequestNumber:z.number(),headBranch:z.string(),commitSha:z.string(),created:z.boolean(),authors:z.array(mfe).optional()});z.object({branch:z.string().min(1).max(255),commitMessage:z.string().min(1),changes:z.array(oj).min(1)});var rj=z.object({branch:z.string(),commitSha:z.string(),committed:z.boolean()}),ij=z.object({issueNumber:z.number(),htmlUrl:z.url(),headBranch:z.string().min(1),baseBranch:z.string().min(1),latestCommitSha:z.string().min(1),draft:z.boolean().optional(),title:z.string().optional(),body:z.string().optional()});z.object({number:z.number(),htmlUrl:z.url()});var gfe=z.object({path:z.string().min(1),status:z.string().min(1),additions:z.number(),deletions:z.number(),previousPath:z.string().optional(),patch:z.string().optional()}),bfe=z.object({sha:z.string().min(1),author:z.string().optional(),email:z.string().optional(),date:z.string().optional(),message:z.string()}),aj=z.object({mergeBaseSha:z.string().min(1),totalCommits:z.number(),commits:z.array(bfe),files:z.array(gfe)}),sj=z.object({content:z.string().nullable()}),lj=z.object({name:z.string().min(1),protected:z.boolean()}),cj=z.object({iid:z.number(),webUrl:z.url(),sourceBranch:z.string().min(1),targetBranch:z.string().min(1),latestCommitSha:z.string().min(1)}),yfe=z.object({name:z.string(),path:z.string(),body:z.string()}),uj=z.object({template:yfe});function dj(t){let[e,o,...n]=t.split("/");if(!(!e||!o||n.length>0))return {owner:e,repo:o}}function mj(t){let e=dj(t);if(e)return e;throw new It(`Invalid GitHub repository string: ${t}. Expected format "owner/repo".`)}var sp=w__default.object({platformSep:w__default.string(),fullPathSegments:w__default.string().array(),relativePathSegments:w__default.string().array(),relativePath:w__default.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:w__default.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:w__default.coerce.date(),createdAt:w__default.coerce.date()});var Sfe=z.array(sp.extend({id:z.string(),name:z.string(),description:z.string().optional(),labels:z.string().array().optional()})),Tfe=sp.extend({id:z.string(),name:z.string(),description:z.string().optional(),content:UT}),Efe=z.array(Tfe);z.object({tests:Sfe,modules:Efe,labels:z.string().array()});z.string().array();z.object({pathSegments:z.string().array()});rI.merge(xg);z.object({schemaVersion:z.string(),stepLists:vm});xg.partial().merge(bs.pick({id:true}));var WE="1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID.",vfe={name:z.string().min(1).max(255).describe(WE),description:z.string().optional(),baseUrl:z.url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:z.string().optional().describe("For LLM: Do not include the variable unless the user explicitly asks for it and use the environment lookup tool to get the correct one before passing here."),browserType:z.enum(fs).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:ul.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:z.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder. Paths are relative to the project root.")};z.object(vfe);rI.extend(z.object({relativeFilePath:z.string().describe("relative to project root")}).shape);z.object({name:z.string()});z.object({relativeFilePath:z.string()});z.object({name:z.string(),sourceModuleContent:UT});z.object({relativeFilePath:z.string()});z.object({name:z.string(),description:z.string(),enabled:z.boolean(),steps:z.lazy(()=>Ao.array()),testFilePath:z.string().describe("relative to the project root"),folderPath:z.string().optional().describe("user selected folder path")});z.object({name:z.string(),description:z.string(),enabled:z.boolean()}).partial();z.object({folderPath:z.string()});z.object({folderPath:z.string()});z.array(g1);z.object({defaultEnv:z.string().optional().describe("name of the default env, or undefined to unset")});z.object({configFilePath:z.string().describe("full path on disk")});z.string().array();z.object({message:z.string(),newRelativeTestPath:z.string().optional()});var f_=z.object({name:z.string(),absolutePath:z.string(),relativePath:z.string(),pathSegments:z.array(z.string()),isDirectory:z.boolean(),size:z.number(),createdAt:z.coerce.date(),modifiedAt:z.coerce.date(),accessedAt:z.coerce.date()}),pj=z.object({pathSegments:z.array(z.string())});z.object({absolutePath:z.string(),pathSegments:z.array(z.string()),contents:z.array(f_)});var fj=z.object({sourceDirectoryPath:z.string().optional(),value:z.string(),allowedExtensions:z.array(z.string()).optional()}),Cfe=z.object({name:z.string(),value:z.string(),isDirectory:z.boolean()});z.object({suggestions:z.array(Cfe)});var hj=z.object({pathSegments:z.array(z.string())}),gj=z.object({pathSegments:z.array(z.string()),newPathSegments:z.array(z.string())}),bj=z.object({pathSegments:z.array(z.string()),recursive:z.boolean().optional()});z.object({success:z.boolean(),message:z.string(),pathSegments:z.array(z.string()).optional()});z.object({gitBranch:z.string(),fileMtime:z.coerce.date(),gitCommitSha:z.string()});var yj=typeof process<"u"&&true&&true,GE=58889,Sj=24*60*60*1e3;var wfe=z.array(sp.extend({id:z.string(),name:z.string(),description:z.string().optional(),labels:z.string().array().optional()})),Afe=z.array(sp.extend({id:z.string(),name:z.string(),description:z.string().optional(),content:z.discriminatedUnion("platform",[RE,xE])})),Tj={name:z.string().min(1).max(255).describe(WE),description:z.string().optional(),settings:Ur.optional().describe(`Optional mobile test settings to persist on the new test, such as retries, default environment, app selection, emulator configuration, and AI settings. Emulator: prefer remote Limbar emulators\u2014omit settings.emulator or use a Limbar region (e.g. us-west1) unless the user explicitly requests a local machine emulator; only then set settings.emulator.region to "local" and supply local-only fields as needed. For MCP-managed mobile assets, use the channels payload from ${ku} as the source of truth: settings.defaultChannel must exist in channels[platform], and settings.defaultTag must be one of channels[platform][settings.defaultChannel]. settings.defaultTag is optional, if omitted we use the most recently uploaded tag for that channel. Do not set defaultTag to the literal "latest" unless the user explicitly asks for it and "latest" appears in that channel's tag list.`),pathSegments:z.string().array().optional().describe("Path segments for the destination folder. Omit or pass [] to create the test at the project root."),defaultEnv:z.string().optional(),platform:yg.optional().default("ANDROID").describe("For LLM: Never assign this unless the user explicitly asks for iOS. Defaults to Android.")},{defaultEnv:Knt,...Ej}=Tj;var vj=z.object(Tj);z.object({id:z.string(),fileName:z.string(),fullPath:z.string(),relativeFilePath:z.string().describe("relative to project root")});z.discriminatedUnion("platform",[r_.extend({absoluteFilePath:z.string()}),i_.extend({absoluteFilePath:z.string()})]);var Cj=z.object({settings:Ur.optional(),labels:z.array(z.string()).optional()}),Rfe=Cj.extend({platform:z.literal("IOS"),steps:Tn.array().optional(),beforeSteps:Tn.array().optional(),afterSteps:Tn.array().optional()}),xfe=Cj.extend({platform:z.literal("ANDROID"),steps:Sn.array().optional(),beforeSteps:Sn.array().optional(),afterSteps:Sn.array().optional()}),wj=z.discriminatedUnion("platform",[Rfe,xfe]);z.object({message:z.literal("ok")});var Aj=z.object({name:Lu.optional(),description:z.string().min(1).optional(),settings:Ur.optional(),disabled:z.boolean().optional(),labels:z.array(z.string()).optional()});z.object({message:z.string(),newRelativeTestPath:z.string().optional()});var Rj=z.object({tag:z.string().trim().min(1,"tag must be a non-empty string"),channel:z.string().trim().min(1,"channel must be a non-empty string"),filePath:z.string().trim().min(1,"filePath must be a non-empty string")}),xj=z.object({name:Lu});z.object({tests:wfe,modules:Afe,labels:z.string().array()});var Mj=z.object({name:z.string(),description:z.string(),enabled:z.boolean()}).partial(),Pj=z.object({name:z.string(),description:z.string(),enabled:z.boolean(),testFilePath:z.string().describe("relative to the project root"),folderPath:z.string().optional().describe("user selected folder path")}),Mfe=Pj.extend({platform:z.literal("ANDROID"),steps:Sn.array()}),Pfe=Pj.extend({platform:z.literal("IOS"),steps:Tn.array()}),Ij=z.discriminatedUnion("platform",[Mfe,Pfe]),h_=z.object({name:z.string().describe(WE),description:z.string().optional(),enabled:z.boolean().default(true),platform:yg.optional().describe("Platform for a new module. When testPath is provided, the source test platform is used. Defaults to Android when no testPath is provided."),parameters:qg.optional(),moduleInputs:z.record(z.string(),z.string()).optional(),folderPath:z.string().optional(),testPath:z.string().optional(),startIndex:z.number().optional(),endIndex:z.number().optional()});z.object({packages:z.string().array()});var _j=z.object({name:z.string()});z.object({relativeFilePath:z.string()});var Oj=z.object({stepId:z.string(),testId:z.string(),environment:z.string().optional(),parentStepIdChain:z.array(z.string()),value:Yu}),Ife=Oj.extend({platform:z.literal("ANDROID"),steps:Sn.array()}),_fe=Oj.extend({platform:z.literal("IOS"),steps:Tn.array()}),Dj=z.discriminatedUnion("platform",[Ife,_fe]),Nj=z.object({stepId:z.string(),testId:z.string(),environment:z.string().optional(),parentStepIdChain:z.array(z.string())}),Ofe=Nj.extend({platform:z.literal("ANDROID"),steps:Sn.array()}),Dfe=Nj.extend({platform:z.literal("IOS"),steps:Tn.array()}),Lj=z.discriminatedUnion("platform",[Ofe,Dfe]),kj=z.object({platform:z.enum(at),completionType:z.string(),traceIds:z.string().array()}),Fj=z.object({completionType:z.string(),traceIds:z.string().array()});var Bj=(n=>(n.AZURE="AZURE",n.KERNEL="KERNEL",n.BROWSERBASE="BROWSERBASE",n))(Bj||{}),g_=z.enum(Bj);z.object({azureRegion:z.string().optional(),azureWorkspaceId:z.string().optional()});z.object({});var Nfe=z.enum(["us-west-2","us-east-1","eu-central-1","ap-southeast-1"]);z.object({region:Nfe.optional()});var b_=(e=>(e.TEST_REVIEW="TEST_REVIEW",e))(b_||{});var Lfe=z.object({type:z.literal("DESCRIPTION_UPDATE"),thoughts:z.string()}),qE=z.discriminatedUnion("type",[Lfe]),kfe=z.object({testId:z.string(),name:z.string(),orgId:z.string(),runId:z.string(),steps:Ao.array(),purpose:z.enum(b_),details:qE.or(qE.array()).optional()});kfe.pick({name:true,orgId:true});var Ffe=z.object({id:z.string(),name:z.string().nullish(),createdAt:z.string().pipe(z.coerce.date()).or(z.date()),organizationId:z.string(),schemaVersion:z.string(),runId:z.string().nullish(),purpose:z.enum(b_),details:qE.or(qE.array()).optional(),applied:z.boolean().nullish(),appliedAt:z.coerce.date().nullish()}),Uj=Ffe.extend({steps:Ao.array()});var zj=z.enum(["v1","v2"]);var Ufe=z.enum(["element","content","attribute","tag_name","style"]),KE=z.enum(["exists","visible","enabled","editable","focused","contains","equals","starts_with"]);[...KU,...qU].forEach(t=>{if(!KE.options.includes(t.toLowerCase()))throw new Error(`V2CheckConditionSchema is missing option: ${t}`)});var y_={element:{aliasPrefix:"",assertionType:"ELEMENT_EXISTENCE",requiresName:false},content:{aliasPrefix:"Content",assertionType:"ELEMENT_CONTENT",requiresName:false},attribute:{aliasPrefix:"Attribute",assertionType:"ELEMENT_ATTRIBUTE",requiresName:true},tag_name:{aliasPrefix:"Name",assertionType:"ELEMENT_NAME",requiresName:false},style:{aliasPrefix:"Style",assertionType:"ELEMENT_STYLE",requiresName:true}},jj={exists:{positiveAliasSuffix:"Exists",negativeAliasSuffix:"DoesNotExist",elementCondition:"EXISTS",contentOperation:"EXISTS"},visible:{positiveAliasSuffix:"Visible",negativeAliasSuffix:"NotVisible",elementCondition:"VISIBLE"},enabled:{positiveAliasSuffix:"Enabled",negativeAliasSuffix:"NotEnabled",elementCondition:"ENABLED"},editable:{positiveAliasSuffix:"Editable",negativeAliasSuffix:"NotEditable",elementCondition:"EDITABLE"},focused:{positiveAliasSuffix:"Focused",negativeAliasSuffix:"NotFocused",elementCondition:"FOCUSED"},contains:{positiveAliasSuffix:"Contains",negativeAliasSuffix:"DoesNotContain",contentOperation:"CONTAINS"},equals:{positiveAliasSuffix:"Equals",negativeAliasSuffix:"DoesNotEqual",contentOperation:"EQUALS"},starts_with:{positiveAliasSuffix:"StartsWith",negativeAliasSuffix:"DoesNotStartWith",contentOperation:"STARTS_WITH"}},Hj={ELEMENT_EXISTENCE:"element",ELEMENT_CONTENT:"content",ELEMENT_ATTRIBUTE:"attribute",ELEMENT_NAME:"tag_name",ELEMENT_STYLE:"style"};function $j(t){return {alias:S_(t),subject:t.subject,condition:t.condition,negated:t.negated,assertionType:y_[t.subject].assertionType,requiresName:y_[t.subject].requiresName,requiresValue:t.subject!=="element"&&t.condition!=="exists"}}function S_(t){let e=y_[t.subject],o=jj[t.condition];if(!Wj(t.subject,t.condition))throw new Error(`Unsupported element check alias for subject '${t.subject}' and condition '${t.condition}'.`);let n=t.negated?o.negativeAliasSuffix:o.positiveAliasSuffix;return `checkElement${e.aliasPrefix}${n}`}function Wj(t,e){let o=jj[e],n=o.elementCondition,r=o.contentOperation;return t==="element"?n!==void 0:r!==void 0}var zfe=Ufe.options.flatMap(t=>KE.options.flatMap(e=>Wj(t,e)?[$j({subject:t,condition:e,negated:false}),$j({subject:t,condition:e,negated:true})]:[])),Gj=new Map(zfe.map(t=>[t.alias,t]));var $fe=z.enum(ji),Vfe=z.enum(pr);function oi(t){return Gj.get(t)}function Kj(t){let e=Hj[t.type],o=t.type==="ELEMENT_EXISTENCE"?t.condition:t.operation;return S_({subject:e,condition:jfe(o),negated:t.negated})}function Yj(t){return $fe.parse(t.toUpperCase())}function eb(t){return Vfe.parse(t.toUpperCase())}function jfe(t){return KE.parse(t.toLowerCase())}var Ve={saveAs:z.string().optional(),retries:z.number().optional(),skipped:z.boolean().optional(),comment:z.string().optional()};z.object(Ve);var tb=Object.keys(Ve);function Le(t){return z.union([z.strictObject({[t.key]:t.simplified}),z.strictObject({[t.key]:t.detailed})])}function Mo(t){return z.strictObject({[t.key]:t.detailed})}var Xj='Coordinates must be "x, y" pixel values, e.g. "100, 200"',lp=z.union([as,z.string().regex(/^\s*-?\d+(?:\.\d+)?\s*,\s*-?\d+(?:\.\d+)?\s*$/,Xj)],{error:Xj});z.union([z.string(),as]);var Pi={css:z.string().optional(),coords:lp.optional(),x:z.union([z.number(),z.string()]).optional(),y:z.union([z.number(),z.string()]).optional()},E_={on:z.string().optional(),...Pi},Ii={...Ve,useSelector:z.boolean().optional(),force:z.boolean().optional(),DANGEROUS_FORCE_DYNAMIC:z.boolean().optional(),iframe:z.string().optional()},ob={...Ii,offset:lp.optional()};function $r({schema:t,descriptionKey:e,required:o=true}){return t.superRefine((n,r)=>{let a=[e in n?Object.entries(n).find(([s])=>s===e)?.[1]:void 0,"css"in n?n.css:void 0,"coords"in n?n.coords:void 0,"x"in n||"y"in n?true:void 0].filter(s=>s!==void 0).length;o&&a!==1&&r.addIssue({code:"custom",message:`Use exactly one target: ${e}, css, coords, or x/y.`}),!o&&a>1&&r.addIssue({code:"custom",message:`Use at most one target: ${e}, css, coords, or x/y.`}),("x"in n||"y"in n)&&(!("x"in n)||n.x===void 0||!("y"in n)||n.y===void 0)&&r.addIssue({code:"custom",message:"x and y must be provided together."});})}var Hfe=$r({descriptionKey:"on",schema:z.strictObject({...E_,...ob,times:z.int().min(1).optional(),rightClick:z.boolean().optional(),waitForDownload:z.boolean().optional(),delay:z.number().optional(),downloadTimeout:z.number().optional()})}),Wfe=$r({descriptionKey:"on",schema:z.strictObject({...E_,...ob,rightClick:z.boolean().optional(),waitForDownload:z.boolean().optional(),delay:z.number().optional(),downloadTimeout:z.number().optional()})}),Gfe=$r({descriptionKey:"on",schema:z.strictObject({...E_,...ob,times:z.int().min(1).optional(),waitForDownload:z.boolean().optional(),delay:z.number().optional(),downloadTimeout:z.number().optional()})}),Jj=Le({key:"click",simplified:z.string(),detailed:Hfe}),Zj=Le({key:"doubleClick",simplified:z.string(),detailed:Wfe}),Qj=Le({key:"rightClick",simplified:z.string(),detailed:Gfe}),qfe=$r({descriptionKey:"into",required:false,schema:z.strictObject({text:z.string(),into:z.string().optional(),...Pi,...ob,pressEnter:z.boolean().optional(),clear:z.union([z.literal("inputs"),z.literal("always"),z.literal("never"),z.boolean()]).optional(),delay:z.number().optional()})}),e2=Le({key:"type",simplified:z.string(),detailed:qfe}),t2=Mo({key:"select",detailed:$r({descriptionKey:"from",schema:z.strictObject({from:z.string().optional(),...Pi,label:z.string().optional(),value:z.string().optional(),index:z.union([z.string(),z.number()]).optional(),...Ii})}).superRefine((t,e)=>{[t.label,t.value,t.index].filter(n=>n!==void 0).length!==1&&e.addIssue({code:"custom",message:"select requires exactly one of label, value, or index"});})}),o2=Le({key:"hover",simplified:z.string(),detailed:$r({descriptionKey:"on",schema:z.strictObject({on:z.string().optional(),...Pi,...ob})})}),n2=Mo({key:"blur",detailed:$r({descriptionKey:"on",required:false,schema:z.strictObject({on:z.string().optional(),...Pi,...Ii})})}),r2=Le({key:"focus",simplified:z.string(),detailed:$r({descriptionKey:"on",schema:z.strictObject({on:z.string().optional(),...Pi,...Ii})})}),i2=Mo({key:"dragAndDrop",detailed:z.strictObject({from:z.string().optional(),to:z.string().optional(),fromCss:z.string().optional(),toCss:z.string().optional(),fromCoords:lp.optional(),toCoords:lp.optional(),fromX:z.union([z.number(),z.string()]).optional(),fromY:z.union([z.number(),z.string()]).optional(),toX:z.union([z.number(),z.string()]).optional(),toY:z.union([z.number(),z.string()]).optional(),steps:z.number().optional(),hover:z.number().optional(),...Ii}).superRefine((t,e)=>{let o=[t.from,t.fromCss,t.fromCoords,t.fromX!==void 0||t.fromY!==void 0?true:void 0].filter(r=>r!==void 0).length,n=[t.to,t.toCss,t.toCoords,t.toX!==void 0||t.toY!==void 0?true:void 0].filter(r=>r!==void 0).length;o!==1&&e.addIssue({code:"custom",message:"Use exactly one from target."}),n!==1&&e.addIssue({code:"custom",message:"Use exactly one to target."}),(t.fromX!==void 0||t.fromY!==void 0)&&(t.fromX===void 0||t.fromY===void 0)&&e.addIssue({code:"custom",message:"fromX and fromY must be provided together."}),(t.toX!==void 0||t.toY!==void 0)&&(t.toX===void 0||t.toY===void 0)&&e.addIssue({code:"custom",message:"toX and toY must be provided together."});})}),a2=z.union([z.strictObject({mouseDrag:lp}),z.strictObject({mouseDrag:$r({descriptionKey:"from",required:false,schema:z.strictObject({from:z.string().optional(),...Pi,delta:lp,steps:z.number().optional(),...Ii})})})]),s2=Le({key:"press",simplified:z.string(),detailed:z.strictObject({key:z.string(),repeat:z.number().optional(),delay:z.number().optional(),convertMeta:z.boolean().optional(),...Ve})}),l2=Le({key:"keyDown",simplified:z.string(),detailed:z.strictObject({key:z.string(),convertMeta:z.boolean().optional(),...Ve})}),c2=Le({key:"keyUp",simplified:z.string(),detailed:z.strictObject({key:z.string(),convertMeta:z.boolean().optional(),...Ve})}),u2=Le({key:"navigate",simplified:z.string(),detailed:z.strictObject({url:z.string(),timeout:z.number().optional(),...Ve})}),d2=Le({key:"newTab",simplified:z.string(),detailed:z.strictObject({url:z.string(),timeout:z.number().optional(),...Ve})}),m2=Le({key:"switchTab",simplified:z.union([z.number(),z.string()]),detailed:z.strictObject({substring:z.string().optional(),regex:z.string().optional(),index:z.union([z.string(),z.number()]).optional(),timeout:z.number().optional(),...Ve}).superRefine((t,e)=>{[t.substring,t.regex,t.index].filter(n=>n!==void 0).length!==1&&e.addIssue({code:"custom",message:"switchTab requires exactly one of substring, regex, or index"});})}),p2=Mo({key:"closeTab",detailed:z.strictObject({substring:z.string().optional(),regex:z.string().optional(),index:z.union([z.string(),z.number()]).optional(),timeout:z.number().optional(),...Ve}).superRefine((t,e)=>{[t.substring,t.regex,t.index].filter(n=>n!==void 0).length<=1||e.addIssue({code:"custom",message:"closeTab accepts at most one of substring, regex, or index"});})}),f2=Mo({key:"goBack",detailed:z.strictObject(Ve)}),h2=Mo({key:"goForward",detailed:z.strictObject(Ve)}),g2=Mo({key:"refresh",detailed:z.strictObject({timeout:z.number().optional(),...Ve})}),b2=z.enum(["goBack","goForward","refresh","paste","authSave","offline","online","blur","visualDiff","captcha","closeTab"]),y2=Le({key:"scrollUp",simplified:z.number().nonnegative(),detailed:$r({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...Pi,...Ii})})}),S2=Le({key:"scrollDown",simplified:z.number().nonnegative(),detailed:$r({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...Pi,...Ii})})}),T2=Le({key:"scrollLeft",simplified:z.number().nonnegative(),detailed:$r({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...Pi,...Ii})})}),E2=Le({key:"scrollRight",simplified:z.number().nonnegative(),detailed:$r({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...Pi,...Ii})})}),v2=Le({key:"wait",simplified:z.number(),detailed:z.strictObject({ms:z.number(),...Ve})}),Kfe=Le({key:"assert",simplified:z.string(),detailed:z.strictObject({that:z.string(),timeout:z.number().optional(),DANGEROUS_FORCE_DYNAMIC:z.boolean().optional(),iframe:z.string().optional(),source:z.string().optional(),...Ve})}),Yfe=Le({key:"assertVisually",simplified:z.string(),detailed:z.strictObject({that:z.string(),timeout:z.number().optional(),DANGEROUS_FORCE_DYNAMIC:z.boolean().optional(),iframe:z.string().optional(),source:z.string().optional(),...Ve})}),YE=Kfe,XE=Yfe,C2=Le({key:"checkPageContains",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),iframe:z.string().optional(),...Ve})}),w2=Le({key:"checkPageDoesNotContain",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),iframe:z.string().optional(),...Ve})}),v_=z.union([C2,w2]),Xfe=z.record(z.string(),z.unknown().optional()),JE=Xfe.superRefine((t,e)=>{let o=Object.keys(t),n=o[0];if(o.length!==1||n===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}let r=oi(n);if(r===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}if(typeof t[r.alias]=="string")return;let i=$r({descriptionKey:"element",schema:z.looseObject({element:z.string().optional(),...Pi,...Ii,timeout:z.number().optional(),name:z.string().optional(),value:z.string().optional()})}).safeParse(t[r.alias]);if(!i.success){e.addIssue({code:"custom",message:`element check alias '${r.alias}' must be a string target or detailed object`,path:[r.alias]});return}r.requiresName&&i.data.name===void 0&&e.addIssue({code:"custom",message:`element check alias '${r.alias}' requires a name`,path:[r.alias,"name"]}),r.requiresValue&&i.data.value===void 0&&e.addIssue({code:"custom",message:`element check alias '${r.alias}' requires a value`,path:[r.alias,"value"]});}),A2=Le({key:"extract",simplified:z.string(),detailed:z.strictObject({goal:z.string(),schema:Tc.optional(),DANGEROUS_FORCE_DYNAMIC:z.boolean().optional(),iframe:z.string().optional(),...Ve})}),R2=Le({key:"cookie",simplified:z.string(),detailed:z.strictObject({value:z.string(),...Ve})}),x2=Mo({key:"localStorage",detailed:z.strictObject({key:z.string(),value:z.string(),...Ve})}),M2=Le({key:"request",simplified:z.string(),detailed:z.strictObject({url:z.string(),method:Ma.optional(),headers:z.record(z.string(),z.string()).optional(),params:z.record(z.string(),z.string()).optional(),body:Tc.optional(),contentType:z.enum(cs).optional(),timeout:z.number().optional(),...Ve})}),P2=Mo({key:"graphqlRequest",detailed:z.strictObject({url:z.string(),query:z.string(),variables:Tc.optional(),headers:z.record(z.string(),z.string()).optional(),timeout:z.number().optional(),...Ve})}),ZE=Le({key:"javascript",simplified:z.string(),detailed:z.strictObject({code:z.string(),environment:z.enum(["node","browser","NODE","BROWSER"]).optional(),fragment:z.boolean().optional(),timeout:z.number().optional(),...Ve})}),cp={substring:z.string().optional(),glob:z.string().optional(),regex:z.string().optional(),domain:z.string().optional()};function Jfe(t){return [t.substring,t.glob,t.regex,t.domain].filter(e=>e!==void 0).length}function up(t){let e=Jfe(t.payload);if(t.required&&e!==1||!t.required&&e>1){t.ctx.addIssue({code:"custom",message:t.required?"requires exactly one of substring, glob, regex, or domain":"requires at most one of substring, glob, regex, or domain"});return}!t.required&&e===0&&t.payload.method&&t.ctx.addIssue({code:"custom",message:"method requires a URL matcher"});}var I2=Mo({key:"header",detailed:z.strictObject({name:z.string(),value:z.string(),...cp,method:z.string().optional(),...Ve}).superRefine((t,e)=>{up({payload:t,ctx:e,required:false});})}),_2=Mo({key:"mock",detailed:z.strictObject({...cp,method:z.string().optional(),responseGenerator:z.string(),fetchOriginalResponse:z.boolean().optional(),key:z.string().optional(),...Ve}).superRefine((t,e)=>{up({payload:t,ctx:e,required:true});})}),O2=Le({key:"removeRouteMock",simplified:z.string(),detailed:z.strictObject({key:z.string().optional(),...Ve})}),D2=Le({key:"waitForUrl",simplified:z.string(),detailed:z.strictObject({...cp,caseInsensitive:z.boolean().optional(),timeout:z.number().optional(),...Ve}).superRefine((t,e)=>{up({payload:t,ctx:e,required:true});})}),N2=Le({key:"waitForUrlNotToMatch",simplified:z.string(),detailed:z.strictObject({...cp,caseInsensitive:z.boolean().optional(),timeout:z.number().optional(),...Ve}).superRefine((t,e)=>{up({payload:t,ctx:e,required:true});})}),Zfe=z.union([D2,N2]),L2=Le({key:"dialog",simplified:z.enum(["ACCEPT","DISMISS"]),detailed:z.strictObject({action:z.enum(["ACCEPT","DISMISS"]),...Ve})}),k2=Le({key:"fileUpload",simplified:z.string(),detailed:z.strictObject({path:z.string(),name:z.string().optional(),...Ve})}),F2=Le({key:"copy",simplified:z.union([z.string(),z.boolean(),z.null()]),detailed:z.strictObject({value:z.union([z.string(),z.boolean(),z.null()]),...Ve})}),B2=Mo({key:"paste",detailed:z.strictObject(Ve)}),U2=Mo({key:"captcha",detailed:z.strictObject({...Ii})}),Qfe=z.strictObject({data:z.union([z.string(),rs]),width:z.number(),height:z.number()}),z2=Le({key:"visualDiff",simplified:z.string(),detailed:$r({descriptionKey:"on",required:false,schema:z.strictObject({on:z.string().optional(),...Pi,threshold:z.number().optional(),screenshot:Qfe.optional(),...Ii})})}),$2=Mo({key:"offline",detailed:z.strictObject(Ve)}),V2=Mo({key:"online",detailed:z.strictObject(Ve)}),j2=Mo({key:"registerRequestListener",detailed:z.strictObject({...cp,key:z.string(),method:z.string().optional(),...Ve}).superRefine((t,e)=>{up({payload:t,ctx:e,required:true});})}),H2=Le({key:"awaitListener",simplified:z.string(),detailed:z.strictObject({key:z.string(),timeout:z.number().optional(),...Ve})}),W2=Mo({key:"recordRequests",detailed:z.strictObject({...cp,key:z.string(),method:z.string().optional(),...Ve}).superRefine((t,e)=>{up({payload:t,ctx:e,required:true});})}),G2=Le({key:"getRecordedRequests",simplified:z.string(),detailed:z.strictObject({key:z.string(),...Ve})}),q2=Le({key:"authLoad",simplified:z.string(),detailed:z.strictObject({path:z.string(),...Ve})}),K2=Le({key:"authSave",simplified:z.string(),detailed:z.strictObject({path:z.string().optional(),...Ve})});z.union([Jj,Zj,Qj,m2,p2,e2,t2,o2,n2,r2,i2,a2,s2,l2,c2,u2,d2,f2,h2,g2,y2,S2,T2,E2,v2,YE,XE,v_,A2,R2,x2,M2,P2,ZE,I2,_2,O2,Zfe,L2,k2,F2,B2,U2,z2,$2,V2,j2,H2,W2,G2,q2,K2,JE]);var Y2=new Map([["click",Jj],["doubleClick",Zj],["rightClick",Qj],["switchTab",m2],["closeTab",p2],["type",e2],["select",t2],["hover",o2],["blur",n2],["focus",r2],["dragAndDrop",i2],["mouseDrag",a2],["press",s2],["keyDown",l2],["keyUp",c2],["navigate",u2],["newTab",d2],["goBack",f2],["goForward",h2],["refresh",g2],["scrollUp",y2],["scrollDown",S2],["scrollLeft",T2],["scrollRight",E2],["wait",v2],["assert",YE],["assertVisually",XE],["checkPageContains",C2],["checkPageDoesNotContain",w2],["extract",A2],["cookie",R2],["localStorage",x2],["request",M2],["graphqlRequest",P2],["javascript",ZE],["header",I2],["mock",_2],["removeRouteMock",O2],["waitForUrl",D2],["waitForUrlNotToMatch",N2],["dialog",L2],["fileUpload",k2],["copy",F2],["paste",B2],["captcha",U2],["visualDiff",z2],["offline",$2],["online",V2],["registerRequestListener",j2],["awaitListener",H2],["recordRequests",W2],["getRecordedRequests",G2],["authLoad",q2],["authSave",K2]]);Object.freeze([...Y2.keys()]);var X2=z.custom().superRefine((t,e)=>{if(typeof t!="object"||t===null){e.addIssue({code:"custom",message:"Steps must be objects with exactly one action key."});return}let o=Object.keys(t),n=o[0];if(o.length!==1||n===void 0){e.addIssue({code:"custom",message:"Steps must have exactly one action key."});return}let r=Y2.get(n)??(oi(n)?JE:void 0);if(!r){e.addIssue({code:"custom",message:`Unsupported step type '${n}'.`});return}let i=r.safeParse(t);if(!i.success){let a=ehe(i.error.issues,n);a.length>0&&J2(e,a);}});function ehe(t,e){return the(t).filter(o=>!ohe(o,e))}function J2(t,e){for(let o of e){if(o.code==="invalid_union"){J2(t,C_(o));continue}t.addIssue({...o});}}function the(t){let e=[];for(let o of t){if(o.code==="invalid_union"){e.push(...C_(o));continue}e.push(o);}return e}function ohe(t,e){return t.code!=="unrecognized_keys"?false:e===void 0?t.path.length===0:t.path.length===1&&t.path[0]===e}function C_(t){let e=t.errors[0]??[],o=T_(e);for(let n of t.errors.slice(1)){let r=T_(n);r>o&&(e=n,o=r);}return e}function T_(t){return t.reduce((e,o)=>{let n=o.code==="invalid_union"?T_(C_(o)):0;return e+o.path.length+n},0)}var Z2=z.strictObject({string:z.string()}),nhe=z.strictObject({javascript:z.string()}),Q2=z.union([Z2,nhe]),rhe=z.union([z.strictObject({name:z.string(),required:z.boolean().optional(),default:Z2.optional()}),z.strictObject({name:z.string(),required:z.boolean().optional(),defaultValue:z.string()})]),eH=rhe.array(),ihe=z.strictObject({name:z.string(),default:Q2.optional(),enum:z.array(z.string()).optional()}),tH=ihe.array(),nb=z.union([Q2,z.string()]),oH=z.record(z.string(),nb);var ahe=z.preprocess(t=>typeof t=="number"?String(t):t,pP),she=z.looseObject({goal:z.string(),version:ahe.optional(),...Ve}),lhe=z.union([z.strictObject({act:z.string()}),z.strictObject({act:she})]),che=z.looseObject({path:z.string(),inputs:z.record(z.string(),nb).optional(),...Ve}),uhe=z.union([z.strictObject({module:z.string()}),z.strictObject({module:che})]),nH=z.union([YE,XE,v_,ZE,JE]),dhe=new Set(["then",...tb]),mhe=z.looseObject({then:z.lazy(()=>ka.array()),...Ve}).superRefine((t,e)=>{Object.entries(t).filter(([n,r])=>!dhe.has(n)&&nH.safeParse({[n]:r}).success).length!==1&&e.addIssue({code:"custom",message:"Conditional steps require exactly one assertion condition at the top level."});}),phe=z.strictObject({if:mhe}),fhe=new Set(["do","maxIterations",...tb]),hhe=z.looseObject({do:z.lazy(()=>ka.array()),maxIterations:z.number().int().positive().optional(),...Ve}).superRefine((t,e)=>{let o=Object.entries(t).filter(([n,r])=>!fhe.has(n)&&nH.safeParse({[n]:r}).success).length;if(o>1){e.addIssue({code:"custom",message:"While loops accept at most one condition at the top level."});return}o===0&&t.maxIterations===void 0&&e.addIssue({code:"custom",message:"While loops require a condition or a maximum number of iterations."});}),ghe=z.strictObject({while:hhe}),ka=z.lazy(()=>z.union([b2,lhe,uhe,phe,ghe,X2]));z.object({before:ka.array().optional(),steps:ka.array(),after:ka.array().optional()});var bhe=z.union([ul,z.string().refine(t=>{let e=t.match(/^\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*$/);if(!e)return false;let[,o,n]=e;return ul.safeParse({width:Number(o),height:Number(n)}).success},"Viewport must be two numeric values, e.g. 1920, 1080")]),yhe=Uu.omit({viewport:true}).extend({viewport:bhe.optional()}),w_=z.object({id:cn,version:z.string().optional(),url:jT.optional(),description:z.string().optional(),retries:z.number().optional(),defaultEnv:z.string().optional(),parameters:eH.optional(),outputs:mE.optional(),disabled:z.boolean().optional(),labels:z.array(z.string()).optional()}).extend(yhe.shape);z.looseObject({fileType:z.literal(Pe.TEST_V2)}).extend(w_.shape).extend({before:ka.array().optional(),steps:ka.array(),after:ka.array().optional()});var She=z.array(z.string()),The=z.union([z.string(),z.record(z.string(),z.unknown().optional())]),QE=ps.omit({moduleId:true,name:true,parameters:true,defaultParameters:true,parameterEnums:true}).extend({id:cn,version:z.string().optional(),name:z.string().optional(),parameters:z.union([tH,She]).optional(),defaultParameters:z.record(z.string(),z.string()).optional(),parameterEnums:z.record(z.string(),z.array(z.string())).optional()});z.looseObject(QE.extend({fileType:z.literal(Pe.MODULE_V2),steps:The.array().optional()}).shape).superRefine(rH);z.looseObject(QE.extend({fileType:z.literal(Pe.MODULE_V2),steps:ka.array().optional()}).shape).superRefine(rH);function rH(t,e){"main"in t&&e.addIssue({code:"custom",message:"v2 modules must use steps, not main",path:["main"]});}var ev=(n=>(n.WEB="web",n.ANDROID="android",n.IOS="ios",n))(ev||{}),A_=z.nativeEnum(ev);var iH=z.object({entity_type:z.string(),value:z.string(),schema_version:z.string().optional()}),aH=Qh(iH),sH=iH.extend({cache_key:z.string()});function rb({entityType:t,entityId:e}){return `${t}:${e}`}var Ehe=/^\s*-?\d+(?:\.\d+)?\s*%\s*,\s*-?\d+(?:\.\d+)?\s*%\s*$/,ed=z.string();function mH(t){return Ehe.test(t)}var lH='Coordinates must be "x, y" pixel values, e.g. "100, 200"',pH=z.union([as,z.string().regex(/^\s*-?\d+(?:\.\d+)?\s*,\s*-?\d+(?:\.\d+)?\s*$/,lH)],{error:lH}),cH='Percent must be a number or a percent string, e.g. 90 or "90%"',fH=z.union([z.number(),z.string().regex(/^-?\d+(?:\.\d+)?%$/,cH)],{error:cH}).transform(t=>typeof t=="number"?t:Number(t.slice(0,-1))).pipe(z.number().min(0,{message:"Percent must be >= 0"}).max(100,{message:"Percent must be <= 100"})),vhe=z.strictObject({x:z.number(),y:z.number(),delta:z.number()}),hH=z.union([z.string(),vhe]),tv={screen:"SCREEN",app:"OPEN_APP",webview:"OPEN_WEBVIEW"},uo={...Ve,DANGEROUS_FORCE_DYNAMIC:z.boolean().optional()},Che=["home","power","back","app_switcher","search","volume_up","volume_down","volume_mute"],gH={HOME:"home",POWER:"power",BACK:"back",APP_SWITCHER:"app_switcher",SEARCH:"search",VOLUME_UP:"volume_up",VOLUME_DOWN:"volume_down",VOLUME_MUTE:"volume_mute"},R_={home:"HOME",power:"POWER",back:"BACK",app_switcher:"APP_SWITCHER",search:"SEARCH",volume_up:"VOLUME_UP",volume_down:"VOLUME_DOWN",volume_mute:"VOLUME_MUTE"},whe=["enter","backspace","close_keyboard"],bH={ENTER:"enter",BACKSPACE:"backspace",CLOSE_KEYBOARD:"close_keyboard"},x_={enter:"ENTER",backspace:"BACKSPACE",close_keyboard:"CLOSE_KEYBOARD"},uH=["airplane_mode","data","wifi","location"],yH={AIRPLANE_MODE:"airplane_mode",DATA:"data",WIFI:"wifi",LOCATION:"location"},M_={airplane_mode:"AIRPLANE_MODE",data:"DATA",wifi:"WIFI",location:"LOCATION"},dH=["portrait","landscape"],SH={PORTRAIT:"portrait",LANDSCAPE:"landscape"},P_={portrait:"PORTRAIT",landscape:"LANDSCAPE"},Ahe=z.strictObject({on:ed.optional(),longPress:z.boolean().optional(),longPressDuration:z.number().optional(),iterations:z.number().optional(),tapDelay:z.number().optional(),offset:pH.optional(),...uo}),TH=Le({key:"tap",simplified:ed,detailed:Ahe}),Rhe=z.strictObject({text:z.string(),into:ed.optional(),clearContent:z.boolean().optional(),forceClearContent:z.boolean().optional(),delay:z.number().optional(),replaceStrategy:z.nativeEnum(wi).optional(),keyPressDelay:z.number().optional(),...uo}),EH=Le({key:"type",simplified:z.string(),detailed:Rhe}),vH=z.enum(Che),xhe=z.strictObject({key:vH,longPress:z.boolean().optional(),...uo}),CH=Le({key:"press",simplified:vH,detailed:xhe}),wH=z.enum(whe),Mhe=z.strictObject({key:wH,repeat:z.number().optional(),delay:z.number().optional(),keyPressDelay:z.number().optional(),...uo}),AH=Le({key:"pressKey",simplified:wH,detailed:Mhe}),Phe=z.strictObject({package:z.string(),activity:z.string().optional(),intentExtras:z.string().optional(),...uo}),RH=Le({key:"openApp",simplified:z.string(),detailed:Phe}),xH=Mo({key:"killApp",detailed:z.strictObject(uo)}),MH=Mo({key:"openNotifications",detailed:z.strictObject(uo)}),PH=z.enum(["up","down","left","right"]),Ihe=z.strictObject({direction:PH,in:hH.optional(),viewportPercent:fH.optional(),duration:z.number().optional(),offset:pH.optional(),...uo}),IH=Le({key:"swipe",simplified:PH,detailed:Ihe}),_he=z.enum(["up","down"]),Ohe=z.strictObject({on:ed,direction:_he.optional(),in:hH.optional(),scrollStepPercent:fH.optional(),maxScrollAttempts:z.number().optional(),...uo}),_H=Le({key:"scrollTo",simplified:z.string(),detailed:Ohe}),I_=Le({key:"assert",simplified:z.string(),detailed:z.strictObject({that:z.string(),timeout:z.number().optional(),...uo})}),__=Le({key:"assertVisually",simplified:z.string(),detailed:z.strictObject({that:z.string(),timeout:z.number().optional(),...uo})}),OH=Le({key:"extract",simplified:z.string(),detailed:z.strictObject({goal:z.string(),schema:Tc.optional(),...uo})}),DH=Le({key:"checkScreenContains",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),...uo})}),NH=Le({key:"checkScreenDoesNotContain",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),...uo})}),LH=z.union([DH,NH]),Dhe=z.record(z.string(),z.unknown().optional()),O_=Dhe.superRefine((t,e)=>{let o=Object.keys(t),n=o[0];if(o.length!==1||n===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}let r=oi(n);if(r===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}if(typeof t[r.alias]=="string")return;let i=z.looseObject({on:ed.optional(),timeout:z.number().optional(),name:z.string().optional(),value:z.string().optional(),...uo}).safeParse(t[r.alias]);if(!i.success){e.addIssue({code:"custom",message:`element check alias '${r.alias}' must be a string target or detailed object`,path:[r.alias]});return}i.data.on===void 0&&e.addIssue({code:"custom",message:`element check alias '${r.alias}' requires a target via 'on'`,path:[r.alias,"on"]}),r.requiresName&&i.data.name===void 0&&e.addIssue({code:"custom",message:`element check alias '${r.alias}' requires a name`,path:[r.alias,"name"]}),r.requiresValue&&i.data.value===void 0&&e.addIssue({code:"custom",message:`element check alias '${r.alias}' requires a value`,path:[r.alias,"value"]});}),Nhe=z.strictObject({from:ed,to:ed,hoverDuration:z.number().optional(),dragDuration:z.number().optional(),...uo}),kH=Mo({key:"dragAndDrop",detailed:Nhe}),D_=Le({key:"javascript",simplified:z.string(),detailed:z.strictObject({code:z.string(),timeout:z.number().optional(),...uo})}),FH=Le({key:"request",simplified:z.string(),detailed:z.strictObject({url:z.string(),method:Ma.optional(),headers:z.record(z.string(),z.string()).optional(),params:z.record(z.string(),z.string()).optional(),body:z.string().optional(),bodyType:z.nativeEnum(cs).optional(),timeout:z.number().optional(),...uo})}),BH=Le({key:"wait",simplified:z.number(),detailed:z.strictObject({ms:z.number(),...uo})}),UH=Le({key:"visualDiff",simplified:z.string(),detailed:z.strictObject({path:z.string(),threshold:z.number().min(0).max(1).optional(),...uo})}),zH=Mo({key:"addFile",detailed:z.strictObject({path:z.string(),location:z.string(),...uo})}),$H=Le({key:"installApp",simplified:z.string(),detailed:z.strictObject({path:z.string(),...uo})}),VH=Le({key:"uninstallApp",simplified:z.string(),detailed:z.strictObject({package:z.string(),...uo})}),jH=Le({key:"toggleSettings",simplified:z.enum(uH),detailed:z.strictObject({setting:z.enum(uH),...uo})}),HH=Le({key:"rotate",simplified:z.enum(dH),detailed:z.strictObject({orientation:z.enum(dH),...uo})}),WH=Le({key:"adb",simplified:z.string(),detailed:z.strictObject({command:z.string(),args:z.string().optional(),...uo})}),GH=Mo({key:"appium",detailed:z.strictObject({script:z.string(),args:z.string().optional(),...uo})}),qH=Mo({key:"debugState",detailed:z.strictObject(uo)}),ov=z.enum(["killApp","openNotifications","debugState"]);z.union([TH,EH,CH,AH,RH,xH,MH,IH,_H,I_,__,OH,LH,kH,D_,FH,BH,UH,zH,$H,VH,jH,HH,WH,GH,qH,O_]);var KH=new Map([["tap",TH],["type",EH],["press",CH],["pressKey",AH],["openApp",RH],["killApp",xH],["openNotifications",MH],["swipe",IH],["scrollTo",_H],["assert",I_],["assertVisually",__],["extract",OH],["checkScreenContains",DH],["checkScreenDoesNotContain",NH],["dragAndDrop",kH],["javascript",D_],["request",FH],["wait",BH],["visualDiff",UH],["addFile",zH],["installApp",$H],["uninstallApp",VH],["toggleSettings",jH],["rotate",HH],["adb",WH],["appium",GH],["debugState",qH]]);Object.freeze([...KH.keys()]);var YH=z.custom().superRefine((t,e)=>{if(typeof t!="object"||t===null){e.addIssue({code:"custom",message:"v2 mobile commands must be objects with exactly one action key."});return}let o=Object.keys(t),n=o[0];if(o.length!==1||n===void 0){e.addIssue({code:"custom",message:"v2 mobile commands must have exactly one action key."});return}let r=KH.get(n)??(oi(n)?O_:void 0);if(!r){e.addIssue({code:"custom",message:`Unsupported v2 mobile command '${n}'.`});return}let i=r.safeParse(t);if(!i.success)for(let a of i.error.issues)e.addIssue({...a});}),ib=z.union([I_,__,LH,D_,O_]);var Lhe=z.preprocess(t=>typeof t=="number"?String(t):t,DI),khe=z.looseObject({goal:z.string(),version:Lhe.optional(),precondition:z.string().optional(),postcondition:z.string().optional(),...Ve}),Fhe=z.union([z.strictObject({act:z.string()}),z.strictObject({act:khe})]),Bhe=z.looseObject({path:z.string(),inputs:z.record(z.string(),nb).optional(),...Ve}),Uhe=z.union([z.strictObject({module:z.string()}),z.strictObject({module:Bhe})]),zhe=new Set(["then",...tb]),$he=z.looseObject({then:z.lazy(()=>Rs.array()),...Ve}).superRefine((t,e)=>{if("else"in t){e.addIssue({code:"custom",message:"v2 mobile conditionals do not support 'else'. Use a separate step instead.",path:["else"]});return}Object.entries(t).filter(([n,r])=>!zhe.has(n)&&ib.safeParse({[n]:r}).success).length!==1&&e.addIssue({code:"custom",message:"v2 mobile conditional steps require exactly one assertion condition at the top level."});}),Vhe=z.strictObject({if:$he}),Rs=z.lazy(()=>z.union([ov,Fhe,Uhe,Vhe,YH]));z.object({before:Rs.array().optional(),steps:Rs.array(),after:Rs.array().optional()});var N_=["android","ios"],jhe=z.literal("android"),Hhe=z.literal("ios");z.enum(N_);function mp(t){return t==="android"?"ANDROID":"IOS"}function L_(t){return t==="ANDROID"?"android":"ios"}function nv(t){if(typeof t!="object"||t===null)return t;let e=t;if(typeof e.platform!="string")return t;let o=e.platform.toLowerCase();return o===e.platform?t:{...e,platform:o}}var XH=ep.omit({schemaVersion:true,settings:true,platform:true}).extend({version:z.string().optional(),platform:jhe,...Ur.shape}),JH=tp.omit({schemaVersion:true,settings:true,platform:true}).extend({version:z.string().optional(),platform:Hhe,...Ur.shape}),Whe=z.discriminatedUnion("platform",[XH,JH]),ZH=z.preprocess(nv,Whe),QH={before:Rs.array().optional(),steps:Rs.array(),after:Rs.array().optional()},eW=z.looseObject({fileType:z.literal(Pe.MOBILE_TEST_V2)}).extend(XH.shape).extend(QH);z.preprocess(nv,eW);var tW=z.looseObject({fileType:z.literal(Pe.MOBILE_TEST_V2)}).extend(JH.shape).extend(QH);z.preprocess(nv,tW);var Ghe=z.discriminatedUnion("platform",[eW,tW]),vc=z.preprocess(nv,Ghe);var qhe=z.preprocess(t=>typeof t=="string"?t.toLowerCase():t,z.enum(N_).optional().default("android")),rv=Wm.omit({moduleId:true,name:true,schemaVersion:true,platform:true}).extend({id:cn,name:z.string().optional(),version:z.string().optional(),platform:qhe});z.looseObject(rv.extend({fileType:z.literal(Pe.MOBILE_MODULE_V2),steps:z.array(z.record(z.string(),z.unknown().optional())).optional()}).shape);var iv=z.looseObject(rv.extend({fileType:z.literal(Pe.MOBILE_MODULE_V2),steps:Rs.array().optional()}).shape);function oW(t){return t.steps??[]}var av="x-momentic-cli-version",rW="x-momentic-client-mode",sv="x-momentic-runner",iW="x-momentic-cli-type",aW="x-momentic-logger-tags",Khe="x-momentic-main-branch-name",Yhe="x-momentic-branch-name",Xhe="x-momentic-commit-timestamp",Jhe="x-momentic-last-commit-on-main",Zhe="x-momentic-last-commit-on-main-timestamp",Qhe="x-momentic-merged-branch-name",sW="x-momentic-session-id",lW="x-momentic-parent-trace-id";w.object({error:w.boolean(),reason:w.string(),message:w.string()});Nn.merge(nI);var cW=RT;Nn.merge(nI);Nn.merge(r$).extend({useConsensus:w.boolean().optional(),attemptNumber:w.number().optional()});var k_=GU;Nn.merge(i$);var uW=e1;Nn.merge(e$);var dW=YT;Nn.merge(UU);Nn.merge(t$);var mW=Jz;Nn.merge(o$);Nn.merge(n$);Nn.merge(c$);Nn.merge(u$);w.object({testPaths:w.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:w.string().optional(),all:w.boolean().optional(),urlOverride:w.string().optional(),customHeaders:w.record(w.string(),w.string()).optional(),testInputMatrix:w.record(w.string(),w.string()).array().optional()});var pW=w.object({queuedTests:w.unknown().optional().array(),runIds:w.guid().array(),runGroupId:w.string().optional()});w.string().array();w.union([w.object({paths:w.string().array().describe("Export specific test paths or folder paths (e.g. todo-test, auth/onboarding)"),all:w.boolean().describe("run all tests").optional()}),w.object({path:w.string().describe("deprecated; present for backcompat")})]);var ege=w.object({tests:w.record(w.string().describe("Test name (keys correspond to entries in `tests`)"),w.string().describe("Slash-separated folder name path that the test lives in (e.g. 'Auth/Login'). Top-level entities are omitted.")),modules:w.record(w.string().describe("Module name (keys correspond to entries in `modules`)"),w.string().describe("Slash-separated folder name path that the module lives in."))}),fW=w.object({tests:w.record(w.string().describe("Test name"),w.string().describe("Test YAML")),modules:w.record(w.string().describe("Module name"),w.string().describe("Module YAML")),folderPaths:ege.optional().describe("Optional map from exported entity name to its slash-separated cloud folder path. Used by the CLI to recreate folder structure on disk.")}),tge=w.object({test:w.string().describe("test YAML"),modules:w.record(w.string().describe("moduleId"),w.string().describe("module YAML"))});tge.array();w.object({testId:w.string(),schemaVersion:w.string()}).merge(Nu);function td(t){let{gitMainBranch:e,gitBranchName:o,gitCommitTimestamp:n,lastCommitOnMainSha:r,lastCommitOnMainTimestamp:i}=t,a={};return e&&(a[Khe]=encodeURIComponent(e)),o&&(a[Yhe]=encodeURIComponent(o)),n&&(a[Xhe]=n.toISOString()),r&&(a[Jhe]=encodeURIComponent(r)),i&&(a[Zhe]=i.toISOString()),t.mergedGitBranchName&&(a[Qhe]=encodeURIComponent(t.mergedGitBranchName)),a}w.object({entries:w.array(Dz)});w.object({platform:A_.optional(),entries:w.array(aH)});w.object({testId:w.string(),environment:w.string().optional(),platform:A_.optional()});w.object({testId:w.string(),key:w.string(),environment:w.string().optional()});function hW(t){return w.record(w.string(),w.unknown().optional()).transform(e=>{let o={};for(let[n,r]of Object.entries(e)){let i=t.safeParse(r);i.success&&(o[n]=i.data);}return o})}var gW=hW(Nz),bW=sH.array();function nW(t){return hW(eg(t))}var yW={ANDROID:t=>nW(DE).parse(t),IOS:t=>nW(NE).parse(t)},oge=w.object({id:w.string(),completionType:w.string(),description:w.string().optional(),thoughts:w.string(),result:w.string(),sessionType:w.string(),timeCreated:w.string().optional(),citations:w.array(sn).optional()}),nge=w.object({id:w.string(),assertion:w.string().optional(),result:w.string(),thoughts:w.string(),sessionType:w.string(),timeCreated:w.string().optional(),citations:w.array(sn).optional()});w.object({completionType:w.string(),traceIds:w.string().array()});var F_=w.union([oge,nge]).array(),SW=w.object({trigger:w.nativeEnum(Ei),status:w.nativeEnum(to),startedAt:w.coerce.date().optional(),gitCommitSha:w.string().optional(),gitCommitShaShort:w.string().optional(),gitCommitTimestamp:w.coerce.date().optional(),gitBranchName:w.string().optional(),gitOriginUrl:w.string().optional(),gitCommitMessage:w.string().optional(),gitCommitAuthorName:w.string().optional(),githubRepository:w.string().optional(),gitlabProjectPath:w.string().optional(),pipelineId:w.string().optional(),cliVersion:w.string().optional()});w.object({id:w.string()});var TW=w.object({status:w.nativeEnum(to),updatedAt:w.coerce.date().optional(),finishedAt:w.coerce.date().optional()});w.object({summary:zu,githubRepository:w.string().optional(),gitBranchName:w.string().optional()});w.object({updates:w.object({runId:w.string(),healStatus:vg,healDetails:ZP.optional()}).array()});var EW=w.object({stepsSnapshot:w.array(w.record(w.string(),w.unknown().optional())).optional(),beforeStepsSnapshot:w.array(w.record(w.string(),w.unknown().optional())).optional(),afterStepsSnapshot:w.array(w.record(w.string(),w.unknown().optional())).optional(),runGroupId:w.string().optional(),testId:w.string(),testName:w.string(),resolvedBaseUrl:w.string().optional(),environmentName:w.string().optional(),labels:w.array(w.string()).optional(),cliVersion:w.string().optional(),trigger:w.nativeEnum(Ei),schemaVersion:w.string().optional(),section:w.nativeEnum(fE).optional(),resolvedInputs:w.record(w.string(),w.string()).optional(),quarantined:w.boolean().optional().default(false),quarantinedReason:w.string().optional(),aiSettings:gs.optional()});w.object({id:w.string()});var rge=eI.pick({id:true,status:true,healStatus:true,healDetails:true,testName:true,testId:true,test:true,failureReason:true,failureDetails:true}),vW=rge.array(),CW=eI.pick({startedAt:true,finishedAt:true,updatedAt:true,results:true,beforeResults:true,afterResults:true,status:true,healStatus:true,healDetails:true,failureDetails:true,failureReason:true,failureRecoveryDetails:true,resolvedBaseUrl:true,environmentName:true,labels:true,cliVersion:true,resolvedInputs:true,attempts:true,flake:true,aiSettings:true}).partial();w.object({id:w.string()});var wW=w.object({run:Ki.omit({runAttempts:true}),attemptZipUrls:w.array(w.string().url().nullish())}),AW=w.object({status:w.nativeEnum(to),finishedAt:w.coerce.date().optional(),schemaVersion:w.string().optional().default("1.0.19"),results:w.record(w.string(),w.unknown().optional()).array().optional(),beforeResults:w.record(w.string(),w.unknown().optional()).array().optional(),afterResults:w.record(w.string(),w.unknown().optional()).array().optional()});w.object({screenshot:w.string(),contentType:w.enum(["image/jpeg","image/png"]).optional()});w.object({id:w.string(),screenshot:w.string(),contentType:w.enum(["image/jpeg","image/png"])});var RW=w.object({key:w.string()}),xW=w.object({orgId:w.string(),userId:w.string(),email:w.string().optional(),name:w.string().optional(),pylonEmailHash:w.string().optional(),selfServe:w.boolean().optional()}),MW=w.object({blocked:w.boolean()}),PW=w.array(h1);w.record(w.string(),w.union([w.string(),w.boolean()]));w.object({workosAccessToken:w.string().min(1),organizationId:w.string().optional(),clientName:w.string().min(1).max(80).optional()});var IW=w.object({apiKey:w.string(),apiKeyName:w.string(),organizationId:w.string(),user:w.object({id:w.string(),email:w.string().optional()}),selfServe:w.boolean().optional()}),_W=w.object({error:w.literal("multiple_organizations"),organizations:w.array(w.object({id:w.string(),name:w.string()}))}),ige=["web","ios","android"];w.object({platforms:w.array(w.enum(ige)),packageManager:w.enum(["npm","pnpm","yarn","bun"]),wizardVersion:w.string().min(1).max(40),cliVersions:w.object({momentic:w.string().max(40).optional(),momenticMobile:w.string().max(40).optional()}).optional(),firstRunIds:w.array(w.guid()).max(10).optional()});w.object({ok:w.literal(true)});w.object({paths:w.string().array(),env:w.string().optional(),urlOverride:w.string().optional(),customHeaders:w.record(w.string(),w.string()).optional()});var OW=w.object({suiteRunIds:w.string().array(),runGroupIds:w.string().array()});w.object({suiteRunIds:w.string().array()});K1.array();w.object({runGroupIds:w.string().array()});var B_=w.object({uploadUrl:w.string()});Nn.merge(a$);Nn.merge(l$);Nn.merge(s$);var age=w.object({testId:w.string().optional().default(""),testName:w.string().optional().default(""),suiteId:w.string().optional().default(""),suiteName:w.string().optional().default(""),isInteractive:w.boolean().optional().default(false),runner:w.nativeEnum(bl).optional(),creditsUsed:w.number().optional(),stepsExecuted:w.number().optional(),tokensUsed:w.number().optional()}),sge=w.object({transactionId:w.string(),timestamp:w.string(),event:w.nativeEnum(gc),properties:age});sge.array();var DW=Uj.omit({steps:true}).extend({steps:w.array(w.record(w.string(),w.unknown().optional())).describe("unparsed ResolvedStep[]")});w.object({limit:w.number().min(1).max(10).optional(),page:w.number().min(1).optional(),start:$o.optional(),end:$o.optional(),gitBranchName:w.string().optional(),status:w.nativeEnum(to).optional()});var NW=U1.array(),lge=w.object({testId:cn.optional(),gitBranchName:w.string().optional(),gitCommitSha:w.string().optional(),status:w.nativeEnum(to).optional(),label:w.string().array().optional(),limit:w.number().min(1).max(100).optional(),page:w.number().min(1).optional(),start:$o.optional(),end:$o.optional(),quarantined:w.boolean().optional(),recovered:w.boolean().optional(),includeFailureDetails:w.boolean().optional()});lge.extend({orgId:w.string().optional(),testId:Dn(cn),status:Dn(w.nativeEnum(to)),gitBranchName:Dn(w.string()),label:Dn(w.string()),testName:w.string().optional(),trigger:Dn(w.nativeEnum(Ei)),executionType:Dn(sc),cliVersion:Dn(w.string()),githubRepository:Dn(w.string()),gitlabProjectPath:Dn(w.string()),environment:Dn(w.string()),directory:Dn(w.string()),failureCategory:Dn(w.string()),exclude:Dn(w.string()),healed:w.boolean().optional()});var cge=Ki.omit({test:true}),LW=w.object({runs:cge.array(),page:w.number(),pageSize:w.number(),pageCount:w.number()});w.object({applied:w.boolean().optional(),appliedAt:w.coerce.date().optional()});var kW=B_.extend({id:w.string()});w.object({runGroupId:w.guid().optional(),persist:w.boolean().optional()});var FW=w.object({runGroupId:w.guid()}),BW=w.object({quarantined:w.object({testId:cn,quarantinedAt:w.coerce.date(),quarantinedBy:w.string().optional(),quarantinedReason:w.string()}).array()}),UW=w.object({gitLocalUsername:w.string().optional(),gitLocalEmail:w.string().optional(),gitLocalName:w.string().optional()});w.object({testId:cn,testName:w.string().optional(),reason:w.string()}).merge(UW);w.object({testName:w.string().optional(),reason:w.string().optional()}).merge(UW);Nn.merge(aV);Nn.merge(sV);Nn.merge(lV);w.object({apkToInstall:w.object({channel:w.string(),tag:w.string().optional()}).optional(),hostname:w.string().optional(),region:ZI.optional(),osVersion:w.nativeEnum(Xm).optional(),sessionId:w.string().optional(),playwrightVersion:xV.optional()});var zW=w.object({name:w.string(),apiUrl:w.string(),webRtcUrl:w.string(),adbUrl:w.string(),token:w.string(),apkDownloadUrl:w.string().optional(),playwrightServerUrl:w.string().optional(),region:w.string().optional(),resolvedTag:w.string().optional()});w.object({appToInstall:w.object({channel:w.string(),tag:w.string().optional()}).optional(),hostname:w.string().optional(),region:ZI.optional(),osVersion:w.nativeEnum(FE).optional(),sessionId:w.string().optional(),installAppOnClient:w.boolean().optional()});var $W=w.object({id:w.string(),apiUrl:w.string(),webRtcUrl:w.string(),wdaUrl:w.string(),token:w.string(),appDownloadUrl:w.string().optional(),appMd5:w.string().optional(),region:w.string().optional(),resolvedTag:w.string().optional()});w.object({channel:w.string().trim().min(1,"channel must be a non-empty string"),tag:w.string().trim().min(1,"tag must be a non-empty string"),md5:w.string()});var VW=w.object({id:w.string(),uploadUrl:w.string().optional(),downloadUrl:w.string(),md5:w.string().optional()}),uge=w.object({channel:w.string(),tag:w.string(),md5:w.string(),platform:w.nativeEnum(at).default("ANDROID"),createdAt:w.number().describe("Unix timestamp in milliseconds")}),jW=w.object({assets:w.array(uge)}),HW=w.object({downloadUrl:w.string()}),U_=(o=>(o.PLAYWRIGHT="PLAYWRIGHT",o.CDP="CDP",o))(U_||{}),dge=w.nativeEnum(U_);w.object({runId:w.guid().optional(),attemptedProviders:w.array(g_).optional()});var WW=w.object({wsEndpoint:w.string(),accessToken:w.string().optional(),endpointType:dge.optional(),provider:g_.optional()});z.object({repositoriesIndexed:z.boolean(),indexingInProgress:z.boolean(),indexesOutdated:z.boolean()});var GW=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(GW||{}),qW=(s=>(s.Success="success",s.Failure="failure",s.Neutral="neutral",s.Cancelled="cancelled",s.Skipped="skipped",s.TimedOut="timed_out",s.ActionRequired="action_required",s))(qW||{});z.object({name:z.string(),status:z.enum(GW),conclusion:z.enum(qW).nullable()});var ab=z.object({sha:z.string(),message:z.string(),author:z.object({name:z.string().optional(),email:z.string().optional(),date:z.coerce.date().optional()}),committer:z.object({name:z.string().optional(),email:z.string().optional(),date:z.coerce.date().optional()})}),z_=z.object({mergedBranch:z.string().optional()});var KW=z.object({orgId:z.string(),cacheKeys:z.string().array()});z.object({keyParams:KW,clientMetadata:z.string(),lockAcquisitionTimeoutMs:z.number().optional()});var YW=z.object({acquired:z.boolean(),acquiredByMetadata:z.string(),keyPrefix:z.string()});z.object({keyPrefix:z.string(),result:z.string(),ttlMs:z.number()});z.union([z.object({keyPrefix:z.string()}),KW]);var mge=z.object({remainingTtlMs:z.number(),value:z.string().nullish()});z.object({results:z.record(z.string(),mge),activeLocks:z.string().array()});var XW=z.object({testId:z.string().min(1),stepId:z.string().min(1),baseTestFileHash:z.string().min(1),branchName:z.string().min(1).optional(),environment:z.string().min(1).optional(),classification:nP,healDetails:B1.optional()}),pge=XW.extend({createdAt:z.coerce.date(),updatedAt:z.coerce.date()});z.object({branchName:z.string().min(1).optional(),mainBranchName:z.string().min(1).optional(),stepId:z.string().min(1),baseTestFileHash:z.string().min(1),environment:z.string().min(1).optional()});var JW=pge.array();z.object({entries:XW.array()});function sb(t){if(t.startsWith("https://api"))return t.replace("https://api","https://app");if(t.startsWith("http://localhost:8000"))return t.replace("http://localhost:8000","http://localhost:3000");throw new Error(`Unknown Momentic app server URL pattern: ${t}`)}var fge=z.object({version:z.string(),json:z.record(z.string(),z.unknown().optional()),hash:z.string()}),ZW=z.record(z.string(),z.unknown().optional());z.object({newSvgs:z.array(fge),metadata:ZW.optional()});var hge=z.object({version:z.string(),json:z.record(z.string(),z.unknown().optional()).nullish(),hash:z.string(),description:z.string().nullish(),metadata:ZW.nullish()}),QW=z.record(z.string().describe("icon hash"),hge);function pp(t){let e;try{e=JSON.parse(t);}catch(o){return `The schema is not valid JSON. ${o}`}try{validator(e);}catch(o){return `The schema is not a valid JSON schema. ${o}`}}var eG=t=>{t.extraHeaders&&(t.extraHeaders=Object.fromEntries(Object.entries(t.extraHeaders).filter(([e,o])=>e.trim()&&o.trim())));};var lv=class{async prepareGoldenScreenshotForComparison(e,o,n){return n}};var cv=class{async resolveEntries(){}async populateCacheForRun(){}async getCacheKeyForStep(){}async saveEntries(){}async saveSnapshotCacheEntries(){}};function bge(t){return t.map(e=>({...e,environment:void 0}))}function $_(t,e){return e?t:bge(t)}var pn="metadata.json",ra="assets",tr="runs",yge=z.object({step:Ao,status:z.enum(yo),startedAt:z.coerce.date(),finishedAt:z.coerce.date().optional(),healMetadata:z.object({healType:z.enum(hg).or(z.literal("AI")),healedAt:z.coerce.date()}).optional(),beforeSnapshotId:z.guid().optional(),afterSnapshotId:z.guid().optional(),message:z.string().optional()}),Sge=yge.extend({finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});Sge.extend({step:z.unknown().optional()});var V_=z.object({avdId:z.string().optional(),channel:z.string().optional(),tag:z.string().optional(),region:z.string().optional(),osVersion:PV.optional()}),oG="1.0.0",nG=AW.extend({id:z.guid().optional(),startedAt:z.coerce.date(),runAttemptSchemaVersion:z.string().optional(),schemaVersion:z.string().optional().default("1.0.19"),results:z.record(z.string(),z.unknown().optional()).array().optional(),beforeResults:z.record(z.string(),z.unknown().optional()).array().optional(),afterResults:z.record(z.string(),z.unknown().optional()).array().optional(),assetDetails:V_.optional(),viewport:ul.optional(),activeVideos:z.array(z.object({videoName:z.string(),timestamp:z.coerce.date()})).optional()}),j_=nG.extend({assetDetails:V_.optional(),finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});nG.extend($P.shape);var rG=j_.extend($P.shape),Tge=z.object({results:z.array(Zr),beforeResults:z.array(Zr).optional(),afterResults:z.array(Zr).optional()});j_.extend(Tge.shape);var Ege=z.object({results:z.array(Qr),beforeResults:z.array(Qr).optional(),afterResults:z.array(Qr).optional()});j_.extend(Ege.shape);var iG=CW.merge(EW).extend({executionType:sc.optional().default("WEB"),testId:cn,testDescription:z.string().optional(),directory:z.string().optional(),runGroupId:z.guid(),status:z.enum(to),healStatus:vg,startedAt:z.coerce.date(),schemaVersion:z.string().nullish(),attempts:z.number(),failureRecoveryDetails:z.object({attempts:z.number()}).optional(),aiSettings:gs.optional(),avgCpuUsage:z.number().optional(),avgMemoryUsage:z.number().optional()}),vge=iG.extend(V_.shape),aG=iG.extend({finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});vge.extend({finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});var tG=z.object({mode:z.enum(["SELECTED","RUN_ALL","RUN_NONE","SHADOW"]),baseRef:z.string().nullable(),headSha:z.string(),planId:z.string().nullable(),totalCandidates:z.number().int().nonnegative(),selectedCount:z.number().int().nonnegative(),anchorSegmentIds:z.array(z.string()),userSummary:z.string(),toolCallCount:z.number().int().nonnegative(),selectedTests:z.array(aE),forcedTests:z.array(z.object({name:z.string(),testPath:z.string(),status:z.enum(["A","M","R","C","T"])})).optional().default([]),runAllReason:z.string().nullable()}),Cge=SW.merge(TW).extend({id:z.guid().optional(),startedAt:z.coerce.date(),cliVersion:z.string(),labels:z.string().array().optional().default([]),suiteName:z.string().optional(),ciProvider:z.string().optional(),gitMainBranch:z.string().optional(),ai:gs.optional(),browser:dl.optional(),aiSelect:z.union([tG.transform(t=>[t]),z.array(tG)]).optional()}),fp=Cge.extend({healRiskSummary:zu.optional(),updatedAt:z.coerce.date().optional().transform(t=>t??new Date),finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});var wge=new Set(["MOBILE_MODULE_STEP","MOBILE_CONDITIONAL_STEP","RESOLVED_MOBILE_MODULE"]);function uv(t){return t.type!=="MOBILE_PRESET_STEP"?t.type:t.command.type}function dv(t){return !wge.has(t.type)}var sG="CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih",hp="https://us-west.metrics.momentic.ai",gp="c60c6a0f-60da-41a7-a61b-07969a0aa303",od=!!process.env.CI||!!process.env.GITHUB_ACTIONS||!!process.env.GITHUB_RUN_ID||!!process.env.GITLAB_CI||!!process.env.CI_COMMIT_SHA||!!process.env.JENKINS_URL||!!process.env.BUILD_NUMBER||!!process.env.JENKINS_HOME||!!process.env.CIRCLECI||!!process.env.CIRCLE_BUILD_NUM||!!process.env.TRAVIS||!!process.env.TRAVIS_BUILD_NUMBER||!!process.env.BITBUCKET_BUILD_NUMBER||!!process.env.BITBUCKET_COMMIT||!!process.env.CODEBUILD_BUILD_ID||!!process.env.TF_BUILD||!!process.env.BUILD_BUILDID||!!process.env.AGENT_ID||!!process.env.BUILDER_SA_EMAIL||!!process.env.HEROKU_TEST_RUN_ID||!!process.env.CI_NODE_INDEX||!!process.env.TEAMCITY_VERSION||!!process.env.BUILD_VCS_NUMBER||!!process.env.BUILDKITE||!!process.env.BUILDKITE_BUILD_NUMBER||!!process.env.APPVEYOR||!!process.env.APPVEYOR_BUILD_NUMBER||!!process.env.DRONE||!!process.env.DRONE_BUILD_NUMBER||!!process.env.SHIPPABLE||!!process.env.BUILD_URL||!!process.env.SEMAPHORE||!!process.env.SEMAPHORE_EXECUTABLE_UUID||!!process.env.WOODPECKER||!!process.env.CI_BUILD_NUMBER||!!process.env.WERCKER_MAIN_PIPELINE_STARTED||!!process.env.BUDDY_EXECUTION_ID;var lG=(()=>{try{return statSync("/.dockerenv"),!0}catch{return false}})();async function Cc(t){return od||lG?true:(await N.flush(),await new Promise(o=>setTimeout(o,100)),await confirm({message:t}))}async function cG(t,e){return od||lG?e:(await input({message:t,default:e})).trim()||e}var bp=new Map,dG="Log throttle exceeded",Bge=100,Uge=5e3,zge=Oge(global.fetch,{retries:2,retryOn:function(t,e,o){return !!(e!==null||o&&o.status>=500)},retryDelay:function(t){return Math.pow(2,t)*500}}),$ge=`${hp}/logs/json`,H_=class{constructor(e,o){this.flushIntervalMs=e;this.maxBatchSize=o;}records=[];flushTimer;push(e){if(this.records.push(e),this.records.length>=this.maxBatchSize){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=void 0),this.flush();return}this.scheduleFlush();}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=void 0,this.flush();},this.flushIntervalMs));}async flush(){if(this.records.length===0)return;let e=this.records;this.records=[];try{let o=await zge($ge,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":sG,"x-momentic-metrics-api-key":gp},body:cc(e),signal:AbortSignal.timeout(5e3)});if(!o.ok)throw new Error(`Got error status (${o.statusText}) from SigNoz`)}catch{}}},W_=class t{consoleLogger;hostname;bindingAttributes;disableConsoleLogs;minLevelValue=20;logsInCurrentWindow=0;droppedLogsInWindow=false;lastWindowStart=Date.now();flushIntervalMs;maxBatchSize;buffer;constructor({bindings:e,hostname:o,disableConsoleLogs:n,flushIntervalMs:r,maxBatchSize:i,buffer:a}){this.hostname=o??Tl.hostname(),this.disableConsoleLogs=n,this.bindingAttributes={...e,env:"production"},this.flushIntervalMs=r??5e3,this.maxBatchSize=i??10,this.buffer=a??new H_(this.flushIntervalMs,this.maxBatchSize);let s={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=uG(s);}child(e){return new t({bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs,flushIntervalMs:this.flushIntervalMs,maxBatchSize:this.maxBatchSize,buffer:this.buffer})}async flush(){await this.buffer.flush(),this.disableConsoleLogs||this.consoleLogger.flush();}shouldAllowLog(e){if(e===dG)return true;let o=Date.now();return o-this.lastWindowStart>Uge&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,dG),this.droppedLogsInWindow=false,this.lastWindowStart=o),this.logsInCurrentWindow<Bge?(this.logsInCurrentWindow++,true):(this.droppedLogsInWindow=true,false)}log(e,o,n,...r){try{this.logHelper(e,o,n,...r);}catch(i){this.consoleLogger.warn(`Failed to log to Signoz: ${i}`);}}logHelper(e,o,n,...r){if(Eg[e]<this.minLevelValue||!this.shouldAllowLog(n))return;typeof o=="string"&&!n&&(o={message:o}),typeof o=="object"&&o&&"err"in o&&o.err instanceof Error&&(o.err=kge.err(o.err));let i={...this.bindingAttributes,...o&&typeof o=="object"?o:{},...r.length>0?{args:r}:{}},a={host:this.hostname,env:this.bindingAttributes.env},s=Vge();this.disableConsoleLogs||this.consoleLogger[e]({...i,...s??{}},n,...r);let l={timestamp:Math.round(Date.now()*1e6),...s??{},severity_text:e.toUpperCase(),resources:a,attributes:{},body:P1({message:n||"",...i})};this.buffer.push(l);}setApp(e){let o=this.bindingAttributes.app;this.bindingAttributes.app=e,bp.set("app",this),bp.delete(o);}debug(e,o,...n){this.log("debug",e,o,...n);}info(e,o,...n){this.log("info",e,o,...n);}warn(e,o,...n){this.log("warn",e,o,...n);}error(e,o,...n){this.log("error",e,o,...n);}bindings(){return this.bindingAttributes}addBinding(e,o){this.bindingAttributes[e]=o;}setMinLevel(e){typeof e=="number"?(this.minLevelValue=e,this.consoleLogger.level=I1[e]):(this.minLevelValue=Eg[e],this.consoleLogger.level=e);}enableConsoleLogs(){this.disableConsoleLogs=false;}},yp=({app:t,hostname:e,disableConsoleLogs:o})=>(bp.has(t)||bp.set(t,new W_({bindings:{app:t},hostname:e,disableConsoleLogs:o})),bp.get(t));function Vge(){let t=trace.getSpan(context.active());if(!t)return;let e=t.spanContext();if(isSpanContextValid(e))return {trace_id:e.traceId,span_id:e.spanId,trace_flags:e.traceFlags}}async function mv(){await Promise.all([...bp.values()].map(t=>t.flush()));}var Fa=class extends Error{constructor(e){super(e),this.name="TimeoutError";}};var mG=t=>{let e=t.reason===void 0?new DOMException("This operation was aborted.","AbortError"):t.reason;return e instanceof Error?e:new DOMException(e,"AbortError")};function re(t,e){let{milliseconds:o,fallback:n,message:r,customTimers:i={setTimeout,clearTimeout}}=e,a;if(typeof o!="number"||Math.sign(o)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${o}\``);return new Promise((s,l)=>{let c;if(e.signal){let{signal:m}=e;if(m.aborted)return l(mG(m));c=()=>l(mG(m)),m.addEventListener("abort",c,{once:true});}let u=()=>{if(e.signal&&e.signal.removeEventListener("abort",c),n)try{s(n());}catch(m){l(m);}else {typeof t.cancel=="function"&&Promise.resolve().then(()=>t.cancel()).catch(()=>{});let m=r instanceof Error?r:new Fa(r??`Promise timed out after ${o}ms`);l(m);}};o<1/0&&(a=i.setTimeout(u,o));let d=()=>{i.clearTimeout(a),e.signal&&e.signal.removeEventListener("abort",c);};Promise.resolve(t).then(m=>{d(),s(m);}).catch(m=>{d(),l(m);});})}function Sp({signal:t,timeoutMs:e}){let o=AbortSignal.timeout(e);return t?AbortSignal.any([t,o]):o}var pG="organization";function pv(t){let e=new PostHog(t.writeKey,{host:t.host,...t.flushImmediately?{flushAt:1,flushInterval:0}:{}}),o=t.platform,n=(l,c,u)=>{let{type:d,...m}=l;e.capture({distinctId:c??u??randomUUID(),event:d,...u&&{groups:{[pG]:u}},properties:{platform:o,user_id:c??void 0,org_id:u??void 0,...m,organizationId:u??void 0,...c==null&&u==null&&{$process_person_profile:false}}});},r=({orgId:l,properties:c})=>{e.groupIdentify({groupType:pG,groupKey:l,properties:c});},i=({userId:l,properties:c})=>{Object.values(c).some(d=>d!=null&&d!=="")&&e.identify({distinctId:l,properties:c});},a=()=>e.shutdown();if(t.identity==="stashed"){let l=null;return {shutdownAnalytics:a,groupIdentifyOrg:r,setAnalyticsIdentity:u=>{l=u,t.onIdentify?.(u),i({userId:u.userId,properties:{email:u.email,...u.selfServe!==void 0?{self_serve:u.selfServe}:{}}});},captureEvent:u=>n(u,l?.userId??null,l?.orgId??null)}}return {shutdownAnalytics:a,groupIdentifyOrg:r,identifyUser:i,captureEvent:(l,{userId:c,orgId:u})=>n(l,c,u),captureBillingEvent:(l,{userId:c,orgId:u})=>n(l,c,u)}}var qge=2e3,nd=t=>Number.parseInt(t,10),q_=t=>readFileSync(t,"utf8").trim(),Tp=t=>nd(q_(t)),fG,fv,lb={samples:0,lowMemorySamples:0,highCpuSamples:0,highHeapSamples:0};function yG(){return {...lb}}var hv=Tl.platform(),Kge=Tl.cpus().map(t=>({model:t.model,speed:t.speed})).reduce((t,e)=>(t[e.model]={speed:e.speed},t.totalCores=(t.totalCores??0)+1,t),{});function G_(t=Date.now()){let e=Tl.cpus(),o={measurementTime:t,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let n of e)o.user+=n.times.user,o.nice+=n.times.nice,o.sys+=n.times.sys,o.idle+=n.times.idle,o.irq+=n.times.irq;return o.total=o.user+o.nice+o.sys+o.idle+o.irq,o}function SG(t,e){let o={user:e.user-t.user,nice:e.nice-t.nice,sys:e.sys-t.sys,idle:e.idle-t.idle,irq:e.irq-t.irq,total:e.total-t.total};return o.total<=0?null:{measurementTime:e.measurementTime,intervalMs:e.measurementTime-t.measurementTime,user:o.user/o.total*100,nice:o.nice/o.total*100,sys:o.sys/o.total*100,idle:o.idle/o.total*100,irq:o.irq/o.total*100,total:100-o.idle/o.total*100}}function Yge(){let t=G_();return ()=>{let e=G_(),o=SG(t,e);return t=e,o}}function hG(){try{let e=readFileSync("/sys/fs/cgroup/cpu.stat","utf8").match(/^usage_usec\s+(\d+)/m);if(e?.[1])return nd(e[1])}catch{}try{let t=Tp("/sys/fs/cgroup/cpuacct/cpuacct.usage");if(!isNaN(t))return t/1e3}catch{}return null}function Xge(){try{let e=q_("/sys/fs/cgroup/cpu.max").split(" "),o=e[0],n=e[1];return !o||!n||o==="max"?null:nd(o)/nd(n)}catch{}try{let t=Tp("/sys/fs/cgroup/cpu/cpu.cfs_quota_us"),e=Tp("/sys/fs/cgroup/cpu/cpu.cfs_period_us");return t===-1||isNaN(e)?null:t/e}catch{return null}}function Jge(){if(hv!=="linux")return null;let t=hG();if(t===null)return null;let e=Xge()??Tl.cpus().length,o=t,n=Date.now();return ()=>{let r=hG();if(r===null)return null;let i=Date.now(),a=i-n;if(a<=0)return null;let s=r-o,l=a*1e3,c=Math.max(0,Math.min(100,s/l/e*100));return o=r,n=i,{measurementTime:i,intervalMs:a,user:c,nice:0,sys:0,idle:Math.max(0,100-c),irq:0,total:c}}}function Zge(){let t=process.cpuUsage(),e=process.hrtime.bigint();return ()=>{let o=process.cpuUsage(),n=process.hrtime.bigint(),r=Number(n-e)/1e6,i=o.user-t.user,a=o.system-t.system;if(t=o,e=n,r<=0)return null;let s=Math.max(Tl.cpus().length,1),l=c=>Math.max(0,c/1e3/r*100/s);return {total:l(i+a),user:l(i),sys:l(a),intervalMs:r}}}function TG({intervalMs:t=qge,maxSamples:e=1e4,keepSamples:o=true,onSample:n}={}){let r=[],i=Jge()??Yge(),a=Zge(),s=()=>{let u=Date.now(),d=vG(),m=process.memoryUsage(),p=i(),f=a(),h={timestamp:u,system:{cpu:p,memory:{total:d.totalMemory,free:d.freeMemory,freePercentage:d.freePercentage}},process:{cpu:f,memory:{rss:m.rss,heapTotal:m.heapTotal,heapUsed:m.heapUsed,external:m.external,arrayBuffers:m.arrayBuffers}}};n?.(h),o&&(r.push(h),r.length>e&&r.shift());};s();let l=setInterval(s,t),c=u=>({samples:o?[...r]:[]});return {stop:()=>(clearInterval(l),c()),getSeries:()=>c()}}var gG=t=>{try{let e={},o=!1,n=vG(),r=ebe();lb.samples++,n.freePercentage<.05&&(Object.assign(e,process.memoryUsage()),o=!0,lb.lowMemorySamples++),r&&r?.total>80&&(o=!0,lb.highCpuSamples++);let i=Gge.getHeapStatistics(),a=i.used_heap_size,s=i.heap_size_limit;a/s>.9&&(o=!0,lb.highHeapSamples++),o?t.warn({memory:n,cpu:r,heapStats:i,...e},"Critical resource usage metrics detected"):t.debug({memory:n,cpu:r},"Got machine resource usage metrics");}catch{}};function EG(t){return gG(t),{interval:setInterval(()=>gG(t),2e4),cpuMetadata:Kge,platform:hv}}function Qge(){if(hv!=="linux")return null;try{let t=q_("/sys/fs/cgroup/memory.max"),e=Tp("/sys/fs/cgroup/memory.current");if(t==="max"||isNaN(e))return null;let o=nd(t);if(isNaN(o))return null;let n=Math.max(0,o-e);return {totalMemory:o,freeMemory:n,freePercentage:n/o}}catch{}try{let t=Tp("/sys/fs/cgroup/memory/memory.limit_in_bytes"),e=Tp("/sys/fs/cgroup/memory/memory.usage_in_bytes");if(isNaN(t)||isNaN(e))return null;let o=Tl.totalmem();if(t>=o)return null;let n=Math.max(0,t-e);return {totalMemory:t,freeMemory:n,freePercentage:n/t}}catch{return null}}function vG(){let t=Qge();if(t)return t;let e=Tl.totalmem(),o=hv==="darwin"?tbe():(()=>{let r=Tl.freemem();return {availableMemory:r,rawFreeMemory:r,cachedMemory:0}})(),n=o.availableMemory/e;return {totalMemory:e,freeMemory:o.availableMemory,freePercentage:n}}function ebe(){let t=G_();if(!fv)return fv=t,null;let e=SG(fv,t);return fv=t,e?(fG=e,fG):null}function tbe(){try{let t=execSync("/usr/bin/vm_stat",{encoding:"utf8",stdio:["pipe","pipe","ignore"]}),o=t.match(/page size of (\d+) bytes/)?.[1],n=o?nd(o):4096,r=u=>{let m=t.match(new RegExp(`${u}:\\s+(\\d+)\\.`,"i"))?.[1];return m?nd(m):0},i=r("Pages free"),a=r("Pages inactive"),s=r("Pages speculative"),l=i*n,c=(a+s)*n;return {availableMemory:l+c,rawFreeMemory:l,cachedMemory:c}}catch{let t=Tl.freemem();return {availableMemory:t,rawFreeMemory:t,cachedMemory:0}}}process.env.APP||"unknown";var gv="deployment.environment",bv="service.instance.id";function CG(){return process.env.MOMENTIC_LOCAL_DEV==="1"&&process.env.LOCAL_SIGNOZ==="true"}var Ep=false,yv,cb,ub,fbe=[],Sv;function Tv(){return Ep}async function hbe(){for(let t of fbe)try{await t();}catch{}}function gbe(){return Tv()&&trace.getSpan(context.active())!==void 0}function bbe(){return CG()?new OTLPTraceExporter({url:"http://localhost:4318/v1/traces"}):new OTLPTraceExporter({url:`${hp}/v1/traces`,headers:{"x-momentic-metrics-api-key":gp}})}function ybe(t){let e="production",o=v4$1(),n=bbe();return new NodeTracerProvider({resource:resourceFromAttributes({[ATTR_SERVICE_NAME]:t,[gv]:e,[bv]:o,[ATTR_SERVICE_VERSION]:"1.4.5"}),spanProcessors:[new BatchSpanProcessor(n)]})}function Sbe(t){Sv=registerInstrumentations({tracerProvider:t,instrumentations:[new UndiciInstrumentation({requireParentforSpans:true})]});}function Tbe(t){return !t&&!yv?trace.getTracer("momentic-serverless"):ub?.getTracer("momentic-serverless")??trace.getTracer("momentic-serverless")}async function Ev(t){if(!(!t.enabled||Ep))try{yv=t.serviceName;let e=ybe(t.serviceName);ub=e,cb=new AsyncLocalStorageContextManager,e.register({contextManager:cb.enable(),propagator:new W3CTraceContextPropagator}),Sbe(e),Ep=!0;}catch{Ep=false,yv=void 0,ub=void 0,cb=void 0,Sv=void 0;}}async function vv(){if(Ep)try{await hbe(),await ub?.shutdown();}catch{}finally{Sv?.();try{cb?.disable();}catch{}Ep=false,yv=void 0,cb=void 0,ub=void 0,Sv=void 0;}}async function We(t){if(!Tv()||!t.root&&!gbe())return t.fn(void 0);let e=t.serviceName===void 0?t.attributes:{...t.attributes??{},"momentic.span_service_name":t.serviceName};return await Tbe(t.serviceName).startActiveSpan(t.name,{attributes:e,kind:t.kind??SpanKind.CLIENT},async o=>{try{let n=await t.fn(o);return o.setStatus({code:SpanStatusCode.OK}),n}catch(n){throw o.setStatus({code:SpanStatusCode.ERROR,message:n instanceof Error?n.message.slice(0,300):void 0}),n instanceof Error&&o.recordException(n),n}finally{o.end();}})}var db=class{increment(e,o,n){}gauge(e,o){}distribution(e,o,n){}async flush(){}async recordDuration(e){return await Y_(e)}};async function Y_({fn:t,name:e,timeoutMs:o,timeoutMessage:n,trace:r}){let i=r?()=>We({name:r.name,attributes:r.attributes,fn:t}):t,a=Promise.resolve(i());return o===void 0?await a:await re(a,{milliseconds:o,message:n??`Timed out after ${o}ms recording duration for ${e}`})}function Ebe(t){if(!t||t.length===0)return {};let e={};for(let o of t){let n=o.indexOf(":");if(n>-1){let r=o.slice(0,n).trim(),i=o.slice(n+1).trim();r&&(e[r]=i);continue}e[o]=true;}return e}function X_(t,e){let o=Ebe(t);return !e||Object.keys(e).length===0?o:{...e,...o}}var Sr;(function(t){t[t.DELTA=0]="DELTA",t[t.CUMULATIVE=1]="CUMULATIVE";})(Sr||(Sr={}));var Fe;(function(t){t.COUNTER="COUNTER",t.GAUGE="GAUGE",t.HISTOGRAM="HISTOGRAM",t.UP_DOWN_COUNTER="UP_DOWN_COUNTER",t.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",t.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",t.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER";})(Fe||(Fe={}));var Tr;(function(t){t[t.HISTOGRAM=0]="HISTOGRAM",t[t.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",t[t.GAUGE=2]="GAUGE",t[t.SUM=3]="SUM";})(Tr||(Tr={}));function Cv(t){let e=Object.keys(t);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(o=>[o,t[o]])))}function RG(t){return `${t.name}:${t.version??""}:${t.schemaUrl??""}`}var mb=class t extends Error{constructor(e){super(e),Object.setPrototypeOf(this,t.prototype);}};function wc(t,e){let o,n=new Promise(function(i,a){o=setTimeout(function(){a(new mb("Operation timed out."));},e);});return Promise.race([t,n]).then(r=>(clearTimeout(o),r),r=>{throw clearTimeout(o),r})}function xG(t,e){if(t.size!==e.size)return false;for(let o of t)if(!e.has(o))return false;return true}function MG(t,e){let o=0,n=t.length-1,r=t.length;for(;n>=o;){let i=o+Math.trunc((n-o)/2);t[i]<e?o=i+1:(r=i,n=i-1);}return r}function PG(t,e){return t.toLowerCase()===e.toLowerCase()}var ia;(function(t){t[t.DROP=0]="DROP",t[t.SUM=1]="SUM",t[t.LAST_VALUE=2]="LAST_VALUE",t[t.HISTOGRAM=3]="HISTOGRAM",t[t.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM";})(ia||(ia={}));var pb=class{kind=ia.DROP;createAccumulation(){}merge(e,o){}diff(e,o){}toMetricData(e,o,n,r){}};function vbe(t){let e=t.map(()=>0);return e.push(0),{buckets:{boundaries:t,counts:e},sum:0,count:0,hasMinMax:false,min:1/0,max:-1/0}}var vp=class{startTime;_boundaries;_recordMinMax;_current;constructor(e,o,n=true,r=vbe(o)){this.startTime=e,this._boundaries=o,this._recordMinMax=n,this._current=r;}record(e){if(Number.isNaN(e))return;this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=true);let o=MG(this._boundaries,e);this._current.buckets.counts[o]+=1;}setStartTime(e){this.startTime=e;}toPointValue(){return this._current}},Cp=class{kind=ia.HISTOGRAM;_boundaries;_recordMinMax;constructor(e,o){this._boundaries=e,this._recordMinMax=o;}createAccumulation(e){return new vp(e,this._boundaries,this._recordMinMax)}merge(e,o){let n=e.toPointValue(),r=o.toPointValue(),i=n.buckets.counts,a=r.buckets.counts,s=new Array(i.length);for(let u=0;u<i.length;u++)s[u]=i[u]+a[u];let l=1/0,c=-1/0;return this._recordMinMax&&(n.hasMinMax&&r.hasMinMax?(l=Math.min(n.min,r.min),c=Math.max(n.max,r.max)):n.hasMinMax?(l=n.min,c=n.max):r.hasMinMax&&(l=r.min,c=r.max)),new vp(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:n.count+r.count,sum:n.sum+r.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||r.hasMinMax),min:l,max:c})}diff(e,o){let n=e.toPointValue(),r=o.toPointValue(),i=n.buckets.counts,a=r.buckets.counts,s=new Array(i.length);for(let l=0;l<i.length;l++)s[l]=a[l]-i[l];return new vp(o.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:r.count-n.count,sum:r.sum-n.sum,hasMinMax:false,min:1/0,max:-1/0})}toMetricData(e,o,n,r){return {descriptor:e,aggregationTemporality:o,dataPointType:Tr.HISTOGRAM,dataPoints:n.map(([i,a])=>{let s=a.toPointValue(),l=e.type===Fe.GAUGE||e.type===Fe.UP_DOWN_COUNTER||e.type===Fe.OBSERVABLE_GAUGE||e.type===Fe.OBSERVABLE_UP_DOWN_COUNTER;return {attributes:i,startTime:a.startTime,endTime:r,value:{min:s.hasMinMax?s.min:void 0,max:s.hasMinMax?s.max:void 0,sum:l?void 0:s.sum,buckets:s.buckets,count:s.count}}})}}};var fb=class t{backing;indexBase;indexStart;indexEnd;constructor(e=new J_,o=0,n=0,r=0){this.backing=e,this.indexBase=o,this.indexStart=n,this.indexEnd=r;}get offset(){return this.indexStart}get length(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1}counts(){return Array.from({length:this.length},(e,o)=>this.at(o))}at(e){let o=this.indexBase-this.indexStart;return e<o&&(e+=this.backing.length),e-=o,this.backing.countAt(e)}incrementBucket(e,o){this.backing.increment(e,o);}decrementBucket(e,o){this.backing.decrement(e,o);}trim(){for(let e=0;e<this.length;e++)if(this.at(e)!==0){this.indexStart+=e;break}else if(e===this.length-1){this.indexStart=this.indexEnd=this.indexBase=0;return}for(let e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate();}downscale(e){this._rotate();let o=1+this.indexEnd-this.indexStart,n=1<<e,r=0,i=0;for(let a=this.indexStart;a<=this.indexEnd;){let s=a%n;s<0&&(s+=n);for(let l=s;l<n&&r<o;l++)this._relocateBucket(i,r),r++,a++;i++;}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart;}clone(){return new t(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)}_rotate(){let e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart);}_relocateBucket(e,o){e!==o&&this.incrementBucket(e,this.backing.emptyBucket(o));}},J_=class t{_counts;constructor(e=[0]){this._counts=e;}get length(){return this._counts.length}countAt(e){return this._counts[e]}growTo(e,o,n){let r=new Array(e).fill(0);r.splice(n,this._counts.length-o,...this._counts.slice(o)),r.splice(0,o,...this._counts.slice(0,o)),this._counts=r;}reverse(e,o){let n=Math.floor((e+o)/2)-e;for(let r=0;r<n;r++){let i=this._counts[e+r];this._counts[e+r]=this._counts[o-r-1],this._counts[o-r-1]=i;}}emptyBucket(e){let o=this._counts[e];return this._counts[e]=0,o}increment(e,o){this._counts[e]+=o;}decrement(e,o){this._counts[e]>=o?this._counts[e]-=o:this._counts[e]=0;}clone(){return new t([...this._counts])}};var hb=Math.pow(2,-1022);function wv(t){let e=new DataView(new ArrayBuffer(8));return e.setFloat64(0,t),((e.getUint32(0)&2146435072)>>20)-1023}function Av(t){let e=new DataView(new ArrayBuffer(8));e.setFloat64(0,t);let o=e.getUint32(0),n=e.getUint32(4);return (o&1048575)*Math.pow(2,32)+n}function gb(t,e){return t===0||t===Number.POSITIVE_INFINITY||t===Number.NEGATIVE_INFINITY||Number.isNaN(t)?t:t*Math.pow(2,e)}function _G(t){return t--,t|=t>>1,t|=t>>2,t|=t>>4,t|=t>>8,t|=t>>16,t++,t}var xs=class extends Error{};var Rv=class{_shift;constructor(e){this._shift=-e;}mapToIndex(e){if(e<hb)return this._minNormalLowerBoundaryIndex();let o=wv(e),n=this._rightShift(Av(e)-1,52);return o+n>>this._shift}lowerBoundary(e){let o=this._minNormalLowerBoundaryIndex();if(e<o)throw new xs(`underflow: ${e} is < minimum lower boundary: ${o}`);let n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new xs(`overflow: ${e} is > maximum lower boundary: ${n}`);return gb(1,e<<this._shift)}get scale(){return this._shift===0?0:-this._shift}_minNormalLowerBoundaryIndex(){let e=-1022>>this._shift;return this._shift<2&&e--,e}_maxNormalLowerBoundaryIndex(){return 1023>>this._shift}_rightShift(e,o){return Math.floor(e*Math.pow(2,-o))}};var xv=class{_scale;_scaleFactor;_inverseFactor;constructor(e){this._scale=e,this._scaleFactor=gb(Math.LOG2E,e),this._inverseFactor=gb(Math.LN2,-e);}mapToIndex(e){if(e<=hb)return this._minNormalLowerBoundaryIndex()-1;if(Av(e)===0)return (wv(e)<<this._scale)-1;let o=Math.floor(Math.log(e)*this._scaleFactor),n=this._maxNormalLowerBoundaryIndex();return o>=n?n:o}lowerBoundary(e){let o=this._maxNormalLowerBoundaryIndex();if(e>=o){if(e===o)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new xs(`overflow: ${e} is > maximum lower boundary: ${o}`)}let n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return hb;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new xs(`overflow: ${e} is < minimum lower boundary: ${n}`)}return Math.exp(e*this._inverseFactor)}get scale(){return this._scale}_minNormalLowerBoundaryIndex(){return -1022<<this._scale}_maxNormalLowerBoundaryIndex(){return (1024<<this._scale)-1}};var DG=-10,NG=20,wbe=Array.from({length:31},(t,e)=>e>10?new xv(e-10):new Rv(e-10));function eO(t){if(t>NG||t<DG)throw new xs(`expected scale >= ${DG} && <= ${NG}, got: ${t}`);return wbe[t+10]}var wp=class t{static combine(e,o){return new t(Math.min(e.low,o.low),Math.max(e.high,o.high))}low;high;constructor(e,o){this.low=e,this.high=o;}},Rbe=20,xbe=160,tO=2,Mv=class t{startTime;_maxSize;_recordMinMax;_sum;_count;_zeroCount;_min;_max;_positive;_negative;_mapping;constructor(e,o=xbe,n=true,r=0,i=0,a=0,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=new fb,u=new fb,d=eO(Rbe)){this.startTime=e,this._maxSize=o,this._recordMinMax=n,this._sum=r,this._count=i,this._zeroCount=a,this._min=s,this._max=l,this._positive=c,this._negative=u,this._mapping=d,this._maxSize<tO&&(diag.warn(`Exponential Histogram Max Size set to ${this._maxSize}, changing to the minimum size of: ${tO}`),this._maxSize=tO);}record(e){this.updateByIncrement(e,1);}setStartTime(e){this.startTime=e;}toPointValue(){return {hasMinMax:this._recordMinMax,min:this.min,max:this.max,sum:this.sum,positive:{offset:this.positive.offset,bucketCounts:this.positive.counts()},negative:{offset:this.negative.offset,bucketCounts:this.negative.counts()},count:this.count,scale:this.scale,zeroCount:this.zeroCount}}get sum(){return this._sum}get min(){return this._min}get max(){return this._max}get count(){return this._count}get zeroCount(){return this._zeroCount}get scale(){return this._count===this._zeroCount?0:this._mapping.scale}get positive(){return this._positive}get negative(){return this._negative}updateByIncrement(e,o){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=o,e===0){this._zeroCount+=o;return}this._sum+=e*o,e>0?this._updateBuckets(this._positive,e,o):this._updateBuckets(this._negative,-e,o);}}merge(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.min<this.min&&(this._min=e.min),e.max>this.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;let o=this._minScale(e);this._downscale(this.scale-o),this._mergeBuckets(this.positive,e,e.positive,o),this._mergeBuckets(this.negative,e,e.negative,o);}diff(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;let o=this._minScale(e);this._downscale(this.scale-o),this._diffBuckets(this.positive,e,e.positive,o),this._diffBuckets(this.negative,e,e.negative,o);}clone(){return new t(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)}_updateBuckets(e,o,n){let r=this._mapping.mapToIndex(o),i=false,a=0,s=0;if(e.length===0?(e.indexStart=r,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):r<e.indexStart&&e.indexEnd-r>=this._maxSize?(i=true,s=r,a=e.indexEnd):r>e.indexEnd&&r-e.indexStart>=this._maxSize&&(i=true,s=e.indexStart,a=r),i){let l=this._changeScale(a,s);this._downscale(l),r=this._mapping.mapToIndex(o);}this._incrementIndexBy(e,r,n);}_incrementIndexBy(e,o,n){if(n===0)return;if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=o),o<e.indexStart){let i=e.indexEnd-o;i>=e.backing.length&&this._grow(e,i+1),e.indexStart=o;}else if(o>e.indexEnd){let i=o-e.indexStart;i>=e.backing.length&&this._grow(e,i+1),e.indexEnd=o;}let r=o-e.indexBase;r<0&&(r+=e.backing.length),e.incrementBucket(r,n);}_grow(e,o){let n=e.backing.length,r=e.indexBase-e.indexStart,i=n-r,a=_G(o);a>this._maxSize&&(a=this._maxSize);let s=a-r;e.backing.growTo(a,i,s);}_changeScale(e,o){let n=0;for(;e-o>=this._maxSize;)e>>=1,o>>=1,n++;return n}_downscale(e){if(e===0)return;if(e<0)throw new Error(`impossible change of scale: ${this.scale}`);let o=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=eO(o);}_minScale(e){let o=Math.min(this.scale,e.scale),n=wp.combine(this._highLowAtScale(this.positive,this.scale,o),this._highLowAtScale(e.positive,e.scale,o)),r=wp.combine(this._highLowAtScale(this.negative,this.scale,o),this._highLowAtScale(e.negative,e.scale,o));return Math.min(o-this._changeScale(n.high,n.low),o-this._changeScale(r.high,r.low))}_highLowAtScale(e,o,n){if(e.length===0)return new wp(0,-1);let r=o-n;return new wp(e.indexStart>>r,e.indexEnd>>r)}_mergeBuckets(e,o,n,r){let i=n.offset,a=o.scale-r;for(let s=0;s<n.length;s++)this._incrementIndexBy(e,i+s>>a,n.at(s));}_diffBuckets(e,o,n,r){let i=n.offset,a=o.scale-r;for(let s=0;s<n.length;s++){let c=(i+s>>a)-e.indexBase;c<0&&(c+=e.backing.length),e.decrementBucket(c,n.at(s));}e.trim();}},bb=class{kind=ia.EXPONENTIAL_HISTOGRAM;_maxSize;_recordMinMax;constructor(e,o){this._maxSize=e,this._recordMinMax=o;}createAccumulation(e){return new Mv(e,this._maxSize,this._recordMinMax)}merge(e,o){let n=o.clone();return n.merge(e),n}diff(e,o){let n=o.clone();return n.diff(e),n}toMetricData(e,o,n,r){return {descriptor:e,aggregationTemporality:o,dataPointType:Tr.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(([i,a])=>{let s=a.toPointValue(),l=e.type===Fe.GAUGE||e.type===Fe.UP_DOWN_COUNTER||e.type===Fe.OBSERVABLE_GAUGE||e.type===Fe.OBSERVABLE_UP_DOWN_COUNTER;return {attributes:i,startTime:a.startTime,endTime:r,value:{min:s.hasMinMax?s.min:void 0,max:s.hasMinMax?s.max:void 0,sum:l?void 0:s.sum,positive:{offset:s.positive.offset,bucketCounts:s.positive.bucketCounts},negative:{offset:s.negative.offset,bucketCounts:s.negative.bucketCounts},count:s.count,scale:s.scale,zeroCount:s.zeroCount}}})}}};var Ap=class{startTime;_current;sampleTime;constructor(e,o=0,n=[0,0]){this.startTime=e,this._current=o,this.sampleTime=n;}record(e){this._current=e,this.sampleTime=millisToHrTime(Date.now());}setStartTime(e){this.startTime=e;}toPointValue(){return this._current}},yb=class{kind=ia.LAST_VALUE;createAccumulation(e){return new Ap(e)}merge(e,o){let n=hrTimeToMicroseconds(o.sampleTime)>=hrTimeToMicroseconds(e.sampleTime)?o:e;return new Ap(e.startTime,n.toPointValue(),n.sampleTime)}diff(e,o){let n=hrTimeToMicroseconds(o.sampleTime)>=hrTimeToMicroseconds(e.sampleTime)?o:e;return new Ap(o.startTime,n.toPointValue(),n.sampleTime)}toMetricData(e,o,n,r){return {descriptor:e,aggregationTemporality:o,dataPointType:Tr.GAUGE,dataPoints:n.map(([i,a])=>({attributes:i,startTime:a.startTime,endTime:r,value:a.toPointValue()}))}}};var Ac=class{startTime;monotonic;_current;reset;constructor(e,o,n=0,r=false){this.startTime=e,this.monotonic=o,this._current=n,this.reset=r;}record(e){this.monotonic&&e<0||(this._current+=e);}setStartTime(e){this.startTime=e;}toPointValue(){return this._current}},Rp=class{kind=ia.SUM;monotonic;constructor(e){this.monotonic=e;}createAccumulation(e){return new Ac(e,this.monotonic)}merge(e,o){let n=e.toPointValue(),r=o.toPointValue();return o.reset?new Ac(o.startTime,this.monotonic,r,o.reset):new Ac(e.startTime,this.monotonic,n+r)}diff(e,o){let n=e.toPointValue(),r=o.toPointValue();return this.monotonic&&n>r?new Ac(o.startTime,this.monotonic,r,true):new Ac(o.startTime,this.monotonic,r-n)}toMetricData(e,o,n,r){return {descriptor:e,aggregationTemporality:o,dataPointType:Tr.SUM,dataPoints:n.map(([i,a])=>({attributes:i,startTime:a.startTime,endTime:r,value:a.toPointValue()})),isMonotonic:this.monotonic}}};var oO=class t{static DEFAULT_INSTANCE=new pb;createAggregator(e){return t.DEFAULT_INSTANCE}};var nO=class t{static MONOTONIC_INSTANCE=new Rp(true);static NON_MONOTONIC_INSTANCE=new Rp(false);createAggregator(e){switch(e.type){case Fe.COUNTER:case Fe.OBSERVABLE_COUNTER:case Fe.HISTOGRAM:return t.MONOTONIC_INSTANCE;default:return t.NON_MONOTONIC_INSTANCE}}};var rO=class t{static DEFAULT_INSTANCE=new yb;createAggregator(e){return t.DEFAULT_INSTANCE}};var iO=class t{static DEFAULT_INSTANCE=new Cp([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],true);createAggregator(e){return t.DEFAULT_INSTANCE}};var Sb=class{_boundaries;_recordMinMax;constructor(e,o=true){if(e==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");e=e.concat(),e=e.sort((i,a)=>i-a);let n=e.lastIndexOf(-1/0),r=e.indexOf(1/0);r===-1&&(r=void 0),this._boundaries=e.slice(n+1,r),this._recordMinMax=o;}createAggregator(e){return new Cp(this._boundaries,this._recordMinMax)}},Tb=class{_maxSize;_recordMinMax;constructor(e=160,o=true){this._maxSize=e,this._recordMinMax=o;}createAggregator(e){return new bb(this._maxSize,this._recordMinMax)}},aO=class{_resolve(e){switch(e.type){case Fe.COUNTER:case Fe.UP_DOWN_COUNTER:case Fe.OBSERVABLE_COUNTER:case Fe.OBSERVABLE_UP_DOWN_COUNTER:return lO;case Fe.GAUGE:case Fe.OBSERVABLE_GAUGE:return cO;case Fe.HISTOGRAM:return e.advice.explicitBucketBoundaries?new Sb(e.advice.explicitBucketBoundaries):uO}return Cb.diag.warn(`Unable to recognize instrument type: ${e.type}`),sO}createAggregator(e){return this._resolve(e).createAggregator(e)}},sO=new oO,lO=new nO,cO=new rO,uO=new iO,kG=new aO;var or;(function(t){t[t.DEFAULT=0]="DEFAULT",t[t.DROP=1]="DROP",t[t.SUM=2]="SUM",t[t.LAST_VALUE=3]="LAST_VALUE",t[t.EXPLICIT_BUCKET_HISTOGRAM=4]="EXPLICIT_BUCKET_HISTOGRAM",t[t.EXPONENTIAL_HISTOGRAM=5]="EXPONENTIAL_HISTOGRAM";})(or||(or={}));function Iv(t){switch(t.type){case or.DEFAULT:return kG;case or.DROP:return sO;case or.SUM:return lO;case or.LAST_VALUE:return cO;case or.EXPONENTIAL_HISTOGRAM:{let e=t;return new Tb(e.options?.maxSize,e.options?.recordMinMax)}case or.EXPLICIT_BUCKET_HISTOGRAM:{let e=t;return e.options==null?uO:new Sb(e.options?.boundaries,e.options?.recordMinMax)}default:throw new Error("Unsupported Aggregation")}}var FG=t=>({type:or.DEFAULT}),BG=t=>Sr.CUMULATIVE;var UG="otel.component.name",zG="otel.component.type",$G="periodic_metric_reader",VG="otel.sdk.metric_reader.collection.duration",jG="error.type";var HG=new Map,Eb=class{collectionDuration;standardAttrs;constructor(e,o){let n=HG.get(e)??0;HG.set(e,n+1),this.standardAttrs={[zG]:e,[UG]:`${e}/${n}`},this.collectionDuration=o.createHistogram(VG,{unit:"s",description:"The duration of the collect operation of the metric reader.",advice:{explicitBucketBoundaries:[]}});}recordCollection(e,o){let n=o?{...this.standardAttrs,[jG]:o}:this.standardAttrs;this.collectionDuration.record(e,n);}};var WG="2.8.0";var xp=class{_shutdown=false;_metricProducers;_sdkMetricProducer;_selfObsMetrics;_aggregationTemporalitySelector;_aggregationSelector;_cardinalitySelector;_otelComponentType;constructor(e){this._aggregationSelector=e?.aggregationSelector??FG,this._aggregationTemporalitySelector=e?.aggregationTemporalitySelector??BG,this._metricProducers=e?.metricProducers??[],this._cardinalitySelector=e?.cardinalitySelector,this._otelComponentType=e?.otelComponentType??this.constructor.name,this._selfObsMetrics=new Eb(this._otelComponentType,Cb.createNoopMeter());}setMetricProducer(e){if(this._sdkMetricProducer)throw new Error("MetricReader can not be bound to a MeterProvider again.");this._sdkMetricProducer=e,this.onInitialized();}_setSelfObsMeterProvider(e){let o=e.getMeter("@opentelemetry/sdk-metrics",WG);this._selfObsMetrics=new Eb(this._otelComponentType,o);}selectAggregation(e){return this._aggregationSelector(e)}selectAggregationTemporality(e){return this._aggregationTemporalitySelector(e)}selectCardinalityLimit(e){return this._cardinalitySelector?this._cardinalitySelector(e):2e3}onInitialized(){}async collect(e){if(this._sdkMetricProducer===void 0)throw new Error("MetricReader is not bound to a MetricProducer");if(this._shutdown)throw new Error("MetricReader is shutdown");let o=hrTime(),[n,...r]=await Promise.all([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis}),...this._metricProducers.map(u=>u.collect({timeoutMillis:e?.timeoutMillis}))]),i=hrTime(),a=n.errors.concat(r.flatMap(u=>u.errors)),s=hrTimeToSeconds(hrTimeDuration(o,i));this._selfObsMetrics.recordCollection(s,a.length>0?a[0].name??"collect_error":void 0);let l=n.resourceMetrics.resource,c=n.resourceMetrics.scopeMetrics.concat(r.flatMap(u=>u.resourceMetrics.scopeMetrics));return {resourceMetrics:{resource:l,scopeMetrics:c},errors:a}}async shutdown(e){if(this._shutdown){Cb.diag.error("Cannot call shutdown twice.");return}e?.timeoutMillis==null?await this.onShutdown():await wc(this.onShutdown(),e.timeoutMillis),this._shutdown=true;}async forceFlush(e){if(this._shutdown){Cb.diag.warn("Cannot forceFlush on already shutdown MetricReader.");return}if(e?.timeoutMillis==null){await this.onForceFlush();return}await wc(this.onForceFlush(),e.timeoutMillis);}};var wb=class extends xp{_interval;_exporter;_exportInterval;_exportTimeout;constructor(e){let{exporter:o,exportIntervalMillis:n=6e4,metricProducers:r,cardinalityLimits:i}=e,{exportTimeoutMillis:a=3e4}=e;if(super({aggregationSelector:o.selectAggregation?.bind(o),aggregationTemporalitySelector:o.selectAggregationTemporality?.bind(o),otelComponentType:$G,metricProducers:r,cardinalitySelector:s=>{let l={default:2e3,...i};switch(s){case Fe.COUNTER:return l.counter??l.default;case Fe.GAUGE:return l.gauge??l.default;case Fe.HISTOGRAM:return l.histogram??l.default;case Fe.OBSERVABLE_COUNTER:return l.observableCounter??l.default;case Fe.OBSERVABLE_UP_DOWN_COUNTER:return l.observableUpDownCounter??l.default;case Fe.OBSERVABLE_GAUGE:return l.observableGauge??l.default;case Fe.UP_DOWN_COUNTER:return l.upDownCounter??l.default;default:return l.default}}}),n<=0)throw Error("exportIntervalMillis must be greater than 0");if(a<=0)throw Error("exportTimeoutMillis must be greater than 0");if(n<a){if("exportIntervalMillis"in e&&"exportTimeoutMillis"in e)throw Error("exportIntervalMillis must be greater than or equal to exportTimeoutMillis");Cb.diag.info(`Timeout of ${a} exceeds the interval of ${n}. Clamping timeout to interval duration.`),a=n;}this._exportInterval=n,this._exportTimeout=a,this._exporter=o;}async _runOnce(){try{await wc(this._doRun(),this._exportTimeout);}catch(e){if(e instanceof mb){Cb.diag.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout);return}globalErrorHandler(e);}}async _doRun(){let{resourceMetrics:e,errors:o}=await this.collect({timeoutMillis:this._exportTimeout});if(o.length>0&&Cb.diag.error("PeriodicExportingMetricReader: metrics collection errors",...o),e.resource.asyncAttributesPending)try{await e.resource.waitForAsyncAttributes?.();}catch(r){Cb.diag.debug("Error while resolving async portion of resource: ",r),globalErrorHandler(r);}if(e.scopeMetrics.length===0)return;let n=await internal._export(this._exporter,e);if(n.code!==ExportResultCode.SUCCESS)throw new Error(`PeriodicExportingMetricReader: metrics export failed (error ${n.error})`)}onInitialized(){this._interval=setInterval(()=>{this._runOnce();},this._exportInterval),typeof this._interval!="number"&&this._interval.unref();}async onForceFlush(){await this._runOnce(),await this._exporter.forceFlush();}async onShutdown(){this._interval&&clearInterval(this._interval),await this.onForceFlush(),await this._exporter.shutdown();}};var _v=class{_registeredViews=[];addView(e){this._registeredViews.push(e);}findViews(e,o){return this._registeredViews.filter(r=>this._matchInstrument(r.instrumentSelector,e)&&this._matchMeter(r.meterSelector,o))}_matchInstrument(e,o){return (e.getType()===void 0||o.type===e.getType())&&e.getNameFilter().match(o.name)&&e.getUnitFilter().match(o.unit)}_matchMeter(e,o){return e.getNameFilter().match(o.name)&&(o.version===void 0||e.getVersionFilter().match(o.version))&&(o.schemaUrl===void 0||e.getSchemaUrlFilter().match(o.schemaUrl))}};function Ms(t,e,o){return kbe(t)||diag.warn(`Invalid metric name: "${t}". The metric name should be a ASCII string with a length no greater than 255 characters.`),{name:t,type:e,description:o?.description??"",unit:o?.unit??"",valueType:o?.valueType??ValueType.DOUBLE,advice:o?.advice??{}}}function KG(t,e){return {name:t.name??e.name,description:t.description??e.description,type:e.type,unit:e.unit,valueType:e.valueType,advice:e.advice}}function YG(t,e){return PG(t.name,e.name)&&t.unit===e.unit&&t.type===e.type&&t.valueType===e.valueType}var Lbe=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function kbe(t){return Lbe.test(t)}var Mp=class{_writableMetricStorage;_descriptor;constructor(e,o){this._writableMetricStorage=e,this._descriptor=o;}_record(e,o={},n=context.active()){if(typeof e!="number"){diag.warn(`non-number value provided to metric ${this._descriptor.name}: ${e}`);return}this._descriptor.valueType===ValueType.INT&&!Number.isInteger(e)&&(diag.warn(`INT value type cannot accept a floating-point value for ${this._descriptor.name}, ignoring the fractional digits.`),e=Math.trunc(e),!Number.isInteger(e))||this._writableMetricStorage.record(e,o,n,millisToHrTime(Date.now()));}},Dv=class extends Mp{add(e,o,n){this._record(e,o,n);}},Nv=class extends Mp{add(e,o,n){if(e<0){diag.warn(`negative value provided to counter ${this._descriptor.name}: ${e}`);return}this._record(e,o,n);}},Lv=class extends Mp{record(e,o,n){this._record(e,o,n);}},kv=class extends Mp{record(e,o,n){if(e<0){diag.warn(`negative value provided to histogram ${this._descriptor.name}: ${e}`);return}this._record(e,o,n);}},Pp=class{_metricStorages;_descriptor;_observableRegistry;constructor(e,o,n){this._descriptor=e,this._metricStorages=o,this._observableRegistry=n;}addCallback(e){this._observableRegistry.addCallback(e,this);}removeCallback(e){this._observableRegistry.removeCallback(e,this);}},Fv=class extends Pp{},Bv=class extends Pp{},Uv=class extends Pp{};function Ab(t){return t instanceof Pp}var zv=class{_meterSharedState;constructor(e){this._meterSharedState=e;}createGauge(e,o){let n=Ms(e,Fe.GAUGE,o),r=this._meterSharedState.registerMetricStorage(n);return new Lv(r,n)}createHistogram(e,o){let n=Ms(e,Fe.HISTOGRAM,o),r=this._meterSharedState.registerMetricStorage(n);return new kv(r,n)}createCounter(e,o){let n=Ms(e,Fe.COUNTER,o),r=this._meterSharedState.registerMetricStorage(n);return new Nv(r,n)}createUpDownCounter(e,o){let n=Ms(e,Fe.UP_DOWN_COUNTER,o),r=this._meterSharedState.registerMetricStorage(n);return new Dv(r,n)}createObservableGauge(e,o){let n=Ms(e,Fe.OBSERVABLE_GAUGE,o),r=this._meterSharedState.registerAsyncMetricStorage(n);return new Bv(n,r,this._meterSharedState.observableRegistry)}createObservableCounter(e,o){let n=Ms(e,Fe.OBSERVABLE_COUNTER,o),r=this._meterSharedState.registerAsyncMetricStorage(n);return new Fv(n,r,this._meterSharedState.observableRegistry)}createObservableUpDownCounter(e,o){let n=Ms(e,Fe.OBSERVABLE_UP_DOWN_COUNTER,o),r=this._meterSharedState.registerAsyncMetricStorage(n);return new Uv(n,r,this._meterSharedState.observableRegistry)}addBatchObservableCallback(e,o){this._meterSharedState.observableRegistry.addBatchCallback(e,o);}removeBatchObservableCallback(e,o){this._meterSharedState.observableRegistry.removeBatchCallback(e,o);}};var Ip=class{_instrumentDescriptor;constructor(e){this._instrumentDescriptor=e;}getInstrumentDescriptor(){return this._instrumentDescriptor}updateDescription(e){this._instrumentDescriptor=Ms(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice});}};var dO=class{_valueMap=new Map;_keyMap=new Map;_hash;constructor(e){this._hash=e;}get(e,o){return o??=this._hash(e),this._valueMap.get(o)}getOrDefault(e,o){let n=this._hash(e);if(this._valueMap.has(n))return this._valueMap.get(n);let r=o();return this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,r),r}set(e,o,n){n??=this._hash(e),this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,o);}has(e,o){return o??=this._hash(e),this._valueMap.has(o)}*keys(){let e=this._keyMap.entries(),o=e.next();for(;o.done!==true;)yield [o.value[1],o.value[0]],o=e.next();}*entries(){let e=this._valueMap.entries(),o=e.next();for(;o.done!==true;)yield [this._keyMap.get(o.value[0]),o.value[1],o.value[0]],o=e.next();}get size(){return this._valueMap.size}},_i=class extends dO{constructor(){super(Cv);}};var _p=class{_activeCollectionStorage=new _i;_cumulativeMemoStorage=new _i;_cardinalityLimit;_overflowAttributes={"otel.metric.overflow":true};_overflowHashCode;_aggregator;constructor(e,o){this._aggregator=e,this._cardinalityLimit=(o??2e3)-1,this._overflowHashCode=Cv(this._overflowAttributes);}record(e,o,n,r){let i=this._activeCollectionStorage.get(o);if(!i){if(this._activeCollectionStorage.size>=this._cardinalityLimit){this._activeCollectionStorage.getOrDefault(this._overflowAttributes,()=>this._aggregator.createAccumulation(r))?.record(e);return}i=this._aggregator.createAccumulation(r),this._activeCollectionStorage.set(o,i);}i?.record(e);}batchCumulate(e,o){for(let[n,r,i]of e.entries()){let a=n,s=i,l=this._aggregator.createAccumulation(o);l?.record(r);let c=l;if(this._cumulativeMemoStorage.has(a,s)){let u=this._cumulativeMemoStorage.get(a,s);c=this._aggregator.diff(u,l);}else if(this._cumulativeMemoStorage.size>=this._cardinalityLimit&&(a=this._overflowAttributes,s=this._overflowHashCode,this._cumulativeMemoStorage.has(a,s))){let u=this._cumulativeMemoStorage.get(a,s);c=this._aggregator.diff(u,l);}if(this._activeCollectionStorage.has(a,s)){let u=this._activeCollectionStorage.get(a,s);c=this._aggregator.merge(u,c);}this._cumulativeMemoStorage.set(a,l,s),this._activeCollectionStorage.set(a,c,s);}}collect(){let e=this._activeCollectionStorage;return this._activeCollectionStorage=new _i,e}};var Op=class t{_aggregator;_unreportedAccumulations=new Map;_reportHistory=new Map;constructor(e,o){this._aggregator=e,o.forEach(n=>{this._unreportedAccumulations.set(n,[]);});}buildMetrics(e,o,n,r){this._stashAccumulations(n);let i=this._getMergedUnreportedAccumulations(e),a=i,s;if(this._reportHistory.has(e)){let c=this._reportHistory.get(e),u=c.collectionTime;s=c.aggregationTemporality,s===Sr.CUMULATIVE?a=t.merge(c.accumulations,i,this._aggregator):a=t.calibrateStartTime(c.accumulations,i,u);}else s=e.selectAggregationTemporality(o.type);this._reportHistory.set(e,{accumulations:a,collectionTime:r,aggregationTemporality:s});let l=zbe(a);if(l.length!==0)return this._aggregator.toMetricData(o,s,l,r)}_stashAccumulations(e){let o=this._unreportedAccumulations.keys();for(let n of o){let r=this._unreportedAccumulations.get(n);r===void 0&&(r=[],this._unreportedAccumulations.set(n,r)),r.push(e);}}_getMergedUnreportedAccumulations(e){let o=new _i,n=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),n===void 0)return o;for(let r of n)o=t.merge(o,r,this._aggregator);return o}static merge(e,o,n){let r=e,i=o.entries(),a=i.next();for(;a.done!==true;){let[s,l,c]=a.value;if(e.has(s,c)){let u=e.get(s,c),d=n.merge(u,l);r.set(s,d,c);}else r.set(s,l,c);a=i.next();}return r}static calibrateStartTime(e,o,n){for(let[r,i]of e.keys())o.get(r,i)?.setStartTime(n);return o}};function zbe(t){return Array.from(t.entries())}var $v=class extends Ip{_aggregationCardinalityLimit;_deltaMetricStorage;_temporalMetricStorage;_attributesProcessor;constructor(e,o,n,r,i){super(e),this._aggregationCardinalityLimit=i,this._deltaMetricStorage=new _p(o,this._aggregationCardinalityLimit),this._temporalMetricStorage=new Op(o,r),this._attributesProcessor=n;}record(e,o){let n=new _i;for(let[r,i]of e.entries())n.set(this._attributesProcessor.process(r),i);this._deltaMetricStorage.batchCumulate(n,o);}collect(e,o){let n=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(e,this._instrumentDescriptor,n,o)}};function mO(t,e){let o="";return t.unit!==e.unit&&(o+=` - Unit '${t.unit}' does not match '${e.unit}'
176
+ `)),i(" ",o(d));}}setMinLevel(e){typeof e=="string"?this.minLogLevel=Eg[e]:this.minLogLevel=e;}setOutputStream(e){this.forcedStream=e;}log(...e){this.logWithLevel(30,Ia.reset,...e);}info(...e){this.logWithLevel(30,Ia.white,...e);}debug(...e){this.logWithLevel(20,Ia.dim,...e);}warn(...e){this.logWithLevel(40,Ia.yellow,...e);}error(...e){this.logWithLevel(50,Ia.red,...e);}success(...e){this.logWithLevel(30,Ia.green,...e);}dimmed(...e){this.logWithLevel(30,Ia.dim,...e);}underline(...e){this.logWithLevel(30,Ia.underline,...e);}bold(...e){this.logWithLevel(30,Ia.bold,...e);}grey(...e){this.logWithLevel(30,Ia.grey,...e);}child(e){let o=new t(this.minLogLevel,{...this.logBindings,...e});return o.forcedStream=this.forcedStream,o}async flush(){}bindings(){return this.logBindings}},N=WP._internalSingleton(),Bu={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>Bu,flush:async()=>{},bindings:()=>({})},sE={},qP=({logger:t,logKey:e,maxCount:o,intervalMs:n},r,i,...a)=>{let s=sE[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},sE[e]=s),s.totalCount++,s.count<o&&(s.count++,t.debug(r,i,...a)),s.timer=setTimeout(()=>{let l=sE[e];l?.totalCount!==l?.count&&t.debug({logKey:e,totalCount:l?.totalCount,count:l?.count},`Debug logs were rate-limited for ${e}`),delete sE[e];},n);};var _1=1e4,cE=1,KP=dl.extend({browserType:z.enum(fs).optional(),slowMoMs:z.number().optional().refine(t=>t===void 0||t<=_1&&t>=-1,{message:`Slow motion must be between 0 and ${_1} milliseconds`}),basicAuthorization:z.object({username:z.string().optional(),password:z.string().optional()}).optional(),geolocation:z.object({latitude:z.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:z.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:z.boolean().optional(),locale:z.string().optional(),timezone:z.enum(JT).optional(),colorScheme:z.enum(["light","dark"]).optional()});var YP=z.object({useMemory:z.boolean().optional(),failureRecovery:z.boolean().optional().describe("undefined means inherit org settings")}),XP=YP.extend({disableAICaching:z.boolean().optional(),failureRecoveryInstructions:z.string().optional()}),tde=z.object({viewport:ul.optional()}),Uu=tde.extend(XP.shape).extend(KP.shape),uE=z.object({cron:z.string().refine(t=>isValidCron(t),{error:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:z.boolean().default(false),env:z.string().optional(),timeZone:z.string().default("America/Los_Angeles"),jobKey:z.string().optional()}),dE=z.object({onSuccess:z.boolean().default(false),failureMessage:z.string().optional(),onFailure:z.boolean().default(true),successMessage:z.string().optional()}),ode=z.object({name:z.string(),required:z.boolean().optional(),defaultValue:z.string().describe("this is not optional because we need a value when the editor is first loaded")}),O1=ode.array(),nde=z.object({name:z.string(),value:z.string()}),mE=nde.array(),D1=z.object({name:z.string(),default:z.boolean().optional(),fixtures:f1.array().optional()});var gs=YP.extend({agentConfig:z.record(z.string(),z.string()).optional(),aiFailureAnalysis:z.boolean().optional(),classification:kU.optional(),triage:LU.optional(),healing:NU.optional(),explore:BU.optional(),select:M1.optional()}),rde=z.object({cliOnly:z.boolean().optional(),neverShowUsageBanner:z.boolean().optional(),hideInternalTraceInfo:z.boolean().optional(),bypassUsageLimits:z.boolean().optional()}),JP=z.object({fakerConstantSeed:z.boolean().optional(),isolateCachesByEnvironment:z.boolean().optional()}),ide=z.enum(["flaky_tests","low_test_coverage","frequent_bugs","fix_flaky_tests","migrate_tests","increase_test_coverage","catch_more_bugs"]),ade=z.enum(["ios","android","web"]),sde=z.enum(["selenium","playwright","cypress","puppeteer","maestro","appium","detox","manual_qa","nothing_yet","other"]),lde=z.enum(["advertisement","ai_search","google_search","hacker_news","linkedin","reddit","referral_from_customer","twitter_x","word_of_mouth","youtube","other"]),cde=z.object({helpIntents:z.array(ide).optional(),helpIntentOtherText:z.string().optional(),deviceTypeIntent:ade.optional(),currentTestingTool:sde.optional(),heardAboutSource:lde.optional()}),ude=z.object({discovery:cde.optional(),needsToCompleteOnboarding:z.boolean().optional(),wizardCompletedAt:z.iso.datetime().optional()}),pE=z.object({ai:gs.optional(),githubAppInstallationId:z.number().nullish(),githubAppSummaryMessageEnabled:z.boolean().nullish(),githubReleaseAppInstallationId:z.number().nullish(),gitlabAppAccessToken:z.string().nullish(),gitlabAppBaseUrl:z.string().nullish(),browser:LP.optional(),internal:rde.optional(),advanced:JP.optional(),onboarding:ude.optional()});function N1(t){try{return pE.parse(t)}catch{return N.warn("Cloud settings contain values this version of the CLI does not support. Please upgrade. Falling back to defaults."),pE.parse({})}}z.object({globalOverrides:z.record(z.string(),z.string()).optional(),agentConfig:z.record(z.string(),z.string()).optional()});z.record(z.string(),z.string()).nullish();var k1=(o=>(o.CANNOT_FIX_TEST="CANNOT_FIX_TEST",o.FIXED="FIXED",o))(k1||{}),L1=z.object({index:z.int().nonnegative(),section:RP,step:Pa}),dde=z.object({additions:L1.array(),deletions:L1.array()}),ZP=z.object({subAgentStatus:z.enum(k1).default("CANNOT_FIX_TEST"),rootCause:z.string(),solution:z.string(),verificationNotes:z.string().optional().default(""),diffs:dde.optional(),pullRequestUrl:z.string().optional(),branchUrl:z.string().optional()}),F1=ZP.optional().catch(void 0),B1=z.object({subAgentStatus:z.literal("FIXED").default("FIXED"),rootCause:z.string(),solution:z.string(),verificationNotes:z.string().optional().default(""),gitPatch:z.string().min(1)});var Ei={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},to=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(to||{});var QP=(r=>(r.NOT_ATTEMPTED="NOT_ATTEMPTED",r.PERM_HEAL_SUCCEEDED="PERM_HEAL_SUCCEEDED",r.PERM_HEAL_FAILED="PERM_HEAL_FAILED",r.PERM_HEAL_ON_SUCCESS_FAILED="PERM_HEAL_ON_SUCCESS_FAILED",r))(QP||{});var vg=z.enum(QP).default("NOT_ATTEMPTED"),fE=(o=>(o.BEFORE_ALL="BEFORE_ALL",o.AFTER_ALL="AFTER_ALL",o))(fE||{});var mde=z.object({attempts:z.int().nonnegative()}),$o=z.string().pipe(z.coerce.date()).or(z.date()),Ki=z.object({id:z.string(),runKey:z.string(),organizationId:z.string(),executionType:sc.optional().default("WEB"),createdAt:$o,createdBy:z.string(),flake:z.boolean().nullish(),scheduledAt:$o.or(z.null()),startedAt:$o.or(z.null()),updatedAt:$o.nullish(),finishedAt:$o.or(z.null()),resolvedBaseUrl:z.string().nullish(),environmentName:z.string().nullish(),gitBranchName:z.string().nullish(),gitMainBranch:z.string().nullish(),githubRepository:z.string().nullish(),gitlabProjectPath:z.string().nullish(),labels:z.array(z.string()).optional(),gitOriginUrl:z.string().nullish(),gitCommitSha:z.string().nullish(),gitCommitShaShort:z.string().nullish(),gitCommitAuthorName:z.string().nullish(),gitCommitTimestamp:$o.nullish(),gitCommitMessage:z.string().nullish(),schemaVersion:z.string().nullish(),cliVersion:z.string().nullish(),section:z.enum(fE).nullish(),status:z.enum(to),healStatus:vg,healDetails:F1.nullish(),trigger:z.enum(Ei),attempts:z.number(),runAttempts:z.array(z.object({id:z.string(),status:z.enum(to),startedAt:$o.or(z.null()),finishedAt:$o.or(z.null())})).optional(),videos:z.array(z.string()).optional(),failureReason:z.string().nullish(),failureDetails:kz.nullish(),failureRecoveryDetails:mde.nullish(),pipelineId:z.string().nullish(),resolvedInputs:z.record(z.string(),z.string()).nullish(),quarantined:z.boolean().nullish().default(false),quarantinedReason:z.string().nullish(),localTestId:z.string().nullish(),testId:z.string().nullish(),testName:z.string().nullish(),description:z.string().nullish(),directory:z.string().nullish(),test:z.object({name:z.string(),id:z.string()}).nullish().default(null),suiteId:z.string().nullish(),aiSettings:gs.nullish(),stepsSnapshot:z.array(z.record(z.string(),z.unknown().optional())).nullish(),beforeStepsSnapshot:z.array(z.record(z.string(),z.unknown().optional())).nullish(),afterStepsSnapshot:z.array(z.record(z.string(),z.unknown().optional())).nullish()}),pde={id:true,status:true,healStatus:true,healDetails:true,testName:true,localTestId:true,testId:true,test:{select:{name:true,id:true}},finishedAt:true,failureReason:true,failureDetails:true},hE=Ki.pick({...pde,test:true}),U1=Ki.omit({failureReason:true,failureDetails:true,test:true}),eI=Ki.extend({stepsSnapshot:z.array(z.record(z.string(),z.unknown().optional())).nullish(),beforeStepsSnapshot:z.array(z.record(z.string(),z.unknown().optional())).nullish(),afterStepsSnapshot:z.array(z.record(z.string(),z.unknown().optional())).nullish(),resolvedInputs:z.record(z.string(),z.string()).nullish(),test:z.object({name:z.string(),id:z.string(),description:z.string().nullish(),baseUrl:z.string().nullish(),advanced:Uu.nullish()}).nullish()}).extend(zP.shape);var fde=z.object({category:z.string(),reasoning:z.string(),citations:z.array(sn).optional()}),hde=z.object({testInputs:z.record(z.string(),z.string()).optional(),envName:z.string().optional(),urlOverride:z.string().optional()}),gde=z.object({reason:z.string().optional(),message:z.string().optional()}),bde=z.object({runId:z.string().optional(),testId:z.string(),testName:z.string(),filePath:z.string(),labels:z.array(z.string()).optional(),status:z.enum(to),startedAt:z.string(),finishedAt:z.string(),durationMs:z.number(),attempts:z.number(),quarantined:z.boolean(),recovered:z.boolean(),parameters:hde.optional(),failure:gde.nullable(),classification:fde.nullable()}),yde=z.object({testId:z.string(),testName:z.string(),filePath:z.string(),labels:z.array(z.string()).optional(),quarantined:z.boolean()}),Sde=z.object({total:z.number(),executed:z.number(),skipped:z.number(),passed:z.number(),failed:z.number(),cancelled:z.number(),quarantined:z.number(),recovered:z.number()}),z1=z.object({version:z.literal(1),runGroup:z.object({startedAt:z.string(),finishedAt:z.string(),durationMs:z.number()}),summary:Sde,runs:z.array(bde),skipped:z.array(yde)});var $1=z.enum(["error","warning","passing"]);var V1=z.enum(["safe_to_merge","confirm_intended_change","investigate_regression","fix_test","resolve_infra","review_coverage"]);var j1=z.object({kind:V1,detail:z.string().min(1).max(280)}),zu=z.object({riskLevel:z.string(),headline:z.string().min(1).max(200).describe("One-sentence summary of what happened in this run. Plain text, no markdown."),overview:z.string().min(1).max(280).optional().describe("One plain-text sentence giving the bottom line of the run. No markdown."),summaryMarkdown:z.string().min(1).max(4e3).describe("Markdown body. Several short paragraphs or a tight list. No emojis, no top-level heading. Max 5 sentences."),recommendedAction:j1.optional()});zu.extend({riskLevel:$1.describe("Traffic-light validation signal. Use passing when validation is trustworthy with no real concern, warning when review or follow-up is needed, and error when the evidence shows the PR may hide or cause a product regression or another material concern that requires review."),headline:z.string().min(1).max(60).describe("Short, factual, title-case status of the validation signal, 6 words max, no punctuation. Describe the outcome only - never name the process or mode (no 'dry run', 'auto-heal', 'triage', 'pending'); those are shown separately. Examples: 'Review Required', 'Sign In Failing Across 5 Tests', 'All Tests Passed'."),overview:z.string().min(1).max(280).describe("The bottom-line verdict in one plain sentence: what the Momentic validation means for user-visible behavior and how trustworthy the signal is. This is the conclusion only, not the evidence. No markdown, headings, lists, or emojis. Do not prescribe a merge decision (use recommendedAction)."),summaryMarkdown:z.string().min(1).max(1e3).describe("The supporting evidence behind the overview, in GitHub-flavored markdown: a few short sentences or a tight list with the specific tests, errors, and signals that justify the verdict. Must carry information the overview does not - never paraphrase or restate the overview. Do not prescribe a merge decision or restate repair mechanics. Max 4 sentences. No emojis or top-level heading."),recommendedAction:j1.extend({kind:V1.describe("The kind of action a reviewer should take. safe_to_merge = signal is trustworthy and can be merged as-is; confirm_intended_change = a product or UI change was detected (or a heal relaxed an expectation) and a human must confirm it is intentional; investigate_regression = evidence points to a real product bug or regression to investigate before merging; fix_test = a broken or stale test or test setup needs repair; resolve_infra = an infrastructure or environment problem needs resolving and a re-run; review_coverage = quarantine has materially reduced coverage that should be reviewed."),detail:z.string().min(1).max(280).describe("One plain-text sentence naming the specific next step (e.g. 'Confirm the new success-indicator color is an intended design change'). No markdown.")}).describe("The single most important next step a reviewer should take. Omit entirely when the signal is clean and there is genuinely nothing to do.").optional()});var H1=z.object({id:z.string(),status:z.enum(to),trigger:z.enum(Ei),createdAt:$o,startedAt:$o.nullish(),finishedAt:$o.nullish(),gitCommitSha:z.string().nullish(),gitCommitShaShort:z.string().nullish(),gitCommitTimestamp:$o.nullish(),gitBranchName:z.string().nullish(),gitOriginUrl:z.string().nullish(),gitCommitMessage:z.string().nullish(),gitCommitAuthorName:z.string().nullish(),githubRepository:z.string().nullish(),gitlabProjectPath:z.string().nullish(),pipelineId:z.string().nullish(),ciProvider:z.string().nullish(),cliVersion:z.string().nullish(),labels:z.string().array().optional(),healRiskSummary:zu.optional(),localSuiteName:z.string().optional(),suite:z.object({id:z.string(),name:z.string()}).nullish(),runs:z.object({executionType:sc,status:z.enum(to),environmentName:z.string().nullish()}).array()}),W1=H1.pick({id:true,createdAt:true,startedAt:true,finishedAt:true,status:true,trigger:true,suite:true,localSuiteName:true}).extend({runs:hE.array()}),G1=H1.extend({runs:Ki.array()});var Ede=z.object({id:z.string(),name:z.string()});Ede.extend(z.object({createdAt:$o,createdBy:z.string(),schedule:uE,notification:dE,environment:z.object({name:z.string()}).nullish(),beforeTests:z.object({id:z.string()}).array().nullish(),afterTests:z.object({id:z.string()}).array().nullish()}).shape);var q1=z.object({id:z.guid(),orgId:z.string(),createdAt:$o,startedAt:$o.or(z.null()),finishedAt:$o.or(z.null()),status:z.enum(to),trigger:z.enum(Ei),suite:z.object({id:z.string(),name:z.string()}).nullish(),runs:Ki.array()});q1.pick({id:true,createdAt:true,startedAt:true,finishedAt:true,status:true,trigger:true,suite:true});var K1=q1.extend({runs:hE.array()});function Y1({beforeStatus:t,mainStatus:e,afterStatus:o}){return t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":o==="FAILED"?"FAILED":o==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}function X1(t,e){return t.some(r=>e?.onlyQuarantined?r.status==="FAILED":!r.quarantined&&r.status==="FAILED")?"FAILED":t.some(r=>r.status==="CANCELLED")?"CANCELLED":"PASSED"}function Cg(t){switch(t){case "SUCCESS":return "PASSED";case "FAILED":return "FAILED";case "CANCELLED":return "CANCELLED";case "RUNNING":return "RUNNING";case "IDLE":return "PENDING"}}function J1(t){switch(t){case "PASSED":return "SUCCESS";case "FAILED":return "FAILED";case "CANCELLED":return "CANCELLED";case "RUNNING":case "PENDING":case "RETRYING":case "WAITING_FOR_USER":return "RUNNING"}}var tI=z.object({content:z.string(),ids:z.string().array(),tokenLength:z.number()}),vde=z.object({chunks:tI.array()});z.object({ids:z.string().array(),score:z.number(),tokenLength:z.number()});vde.extend({description:z.string().describe("Input to pass to RAG engine"),tokenLimit:z.number()});var Z1=z.object({ids:z.number().array()}),Q1=z.object({indices:z.number().array()});var wg=(o=>(o.Interactive="interactive",o.Runner="runner",o))(wg||{}),Cde=z.enum(wg),Nn=z.object({disableCache:z.boolean().optional(),useMemory:z.boolean().optional(),clientMode:Cde.optional(),loggerTags:z.record(z.string(),z.string()).optional(),langfuseSessionId:z.string().optional(),agentConfigVersion:z.string().optional(),cacheBustReason:z.enum(Iu).optional()});Nn.extend({chunks:tI.array(),description:z.string().describe("Input to pass to AI"),type:z.union([z.literal("locator"),z.literal("assertion"),z.literal("ai-action")]),softTokenLimit:z.number(),mediumTokenLimit:z.number().optional(),hardTokenLimit:z.number(),callId:z.string().optional()});var wde=z.object({screenshotBase64AfterCommand:z.string(),urlAfterCommand:z.string(),serializedCommand:z.string(),elementInteracted:z.string().optional(),thoughts:z.string().optional()}),e$=z.object({goal:z.string(),browserState:z.string(),screenshot:z.string(),source:l1.optional().catch(void 0),isTieBreakerCall:z.boolean().optional(),memory:z.discriminatedUnion("type",[xa,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional(),firstPassModelResults:YT.array().optional(),knowledgeBaseSection:z.string().optional()}),t$=z.object({target:z.string().or(z.number()),browserState:z.string().optional(),screenshot:z.string().optional(),boundingBox:z.object({x:z.number(),y:z.number(),height:z.number(),width:z.number()}).optional()}),o$=z.object({goal:z.string(),browserState:z.string(),screenshot:z.string().optional(),returnSchema:z.string().optional()}),n$=z.object({goal:z.string(),emulatorState:z.string(),screenshot:z.string().optional(),returnSchema:z.string().optional()}),oI=z.union([z.literal("NEGATED_CHECK"),z.literal("CONDITIONAL_CHECK")]),r$=z.object({goal:z.string(),browserState:z.string(),screenshot:z.string(),url:z.string(),contextChoice:Ou.optional(),memory:z.discriminatedUnion("type",[Pu,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional(),source:oI.optional(),recoveryHint:z.string().optional(),knowledgeBaseSection:z.string().optional()}),i$=z.object({command:gm}),nI=z.object({goal:z.string(),browserState:z.string(),startingScreenshot:z.string().optional(),screenshot:z.string(),url:z.string(),history:wde.array(),actionHint:z.string().optional(),lastError:z.string().optional()}),a$=z.object({results:QT.array(),errorMessage:z.string(),errorStack:z.string().optional()}),s$=z.object({results:QT.array(),goal:z.string(),errorMessage:z.string()}),l$=z.object({failedResults:QT.array(),nextStepsSerialized:z.string().array(),currentUrl:z.string(),currentPageState:z.string(),currentScreenshot:z.string(),customInstructions:z.string().optional(),testDescription:z.string().optional()});z.object({description:z.string(),type:z.union([z.literal("locator"),z.literal("assertion"),z.literal("ai-action")]),excerpt:z.string()});var c$=z.object({type:z.string(),browserContext:z.string(),currentStep:z.string(),screenshot:z.string()}),u$=z.object({description:z.string(),browserState:z.string().optional(),screenshot:z.string()}),Ade=z.enum(["locator","assertion"]);z.object({completionType:Ade,currentGoal:z.string(),pastGoal:z.string().optional(),currentScreenshot:z.string(),pastScreenshot:z.string(),pastResult:z.union([z.boolean(),z.number()])});z.object({goal:z.string()});var d$=z.object({keywords:z.array(z.string())});var gE=(i=>(i.LOCATOR="locator",i.ASSERTION="assertion",i.VISUAL_ASSERTION="visual-assertion",i.TEXT_EXTRACTION="text-extraction",i.FAILURE_RECOVERY="failure-recovery",i))(gE||{}),Rde=["locator","assertion","visual-assertion","text-extraction","failure-recovery"];z.enum(gE);var xde=new Set(Rde);function Mde(t){return xde.has(t)}var Pde=z.enum(["v1","v2","v3","v4"]),Ide=z.string().regex(/^v\d+\.\d+$/).describe("pinned sub-version like v3.1");z.union([Pde,Ide,z.string().describe("for people with special configurations")]);var _m={locator:"v4.2",assertion:"v4.1","visual-assertion":"v4.0","text-extraction":"v3.0","failure-recovery":"v2.1"},m$={locator:{v4:["v4.2","v4.1","v4.0"],v3:["v3.3","v3.2","v3.1","v3.0"],v2:["v2.2","v2.1","v2.0"],v1:["v1.0"]},assertion:{v4:["v4.1","v4.0"],v3:["v3.2","v3.1","v3.0"],v2:["v2.3","v2.2","v2.1","v2.0"],v1:["v1.0"]},"visual-assertion":{v4:["v4.0"],v3:["v3.2","v3.1","v3.0"],v2:["v2.0"],v1:["v1.0"]},"text-extraction":{v3:["v3.0"],v2:["v2.0"],v1:["v1.0"]},"failure-recovery":{v2:["v2.1","v2.0"],v1:["v1.0"]}},uc=(a=>(a.ANDROID_LOCATOR="android-locator",a.IOS_LOCATOR="ios-locator",a.ANDROID_ASSERTION="android-assertion",a.IOS_ASSERTION="ios-assertion",a.ANDROID_TEXT_EXTRACTION="android-text-extraction",a.IOS_TEXT_EXTRACTION="ios-text-extraction",a))(uc||{});z.enum(uc);var _de={locator:["v1"],assertion:["v1"],"visual-assertion":["v1"],"text-extraction":["v1"]};function Ode(t){let e=_de[t];if(!e)return new Set;let o=m$[t],n=new Set;for(let r of e){n.add(r);for(let i of o[r]??[])n.add(i);}return n}function p$(t){for(let[e,o]of Object.entries(t)){if(!Mde(e))continue;let n=m$[e];if(!n)continue;let r=new Set;for(let[i,a]of Object.entries(n)){r.add(i);for(let s of a)r.add(s);}if(!r.has(o)){let i=[...r].sort();throw new O("UserConfigurationError",`Invalid agent config: "${o}" is not a valid version for "${e}". Valid versions: ${i.join(", ")}`)}if(Ode(e).has(o))throw new O("UserConfigurationError",`Agent config "${o}" for "${e}" is no longer supported because it relies on a legacy model. Upgrade to a newer version.`)}}var ml=w__default.object({id:w__default.guid(),envKey:w__default.string().optional(),skipped:w__default.boolean().optional(),retries:w__default.number().optional()});var xo=(r=>(r.PRESET="MOBILE_PRESET_STEP",r.MODULE="MOBILE_MODULE_STEP",r.AI_ACTION="MOBILE_AI_ACTION_STEP",r.CONDITIONAL="MOBILE_CONDITIONAL_STEP",r))(xo||{});var Om=ml.extend({type:w__default.literal("MOBILE_CONDITIONAL_STEP")});var bs=z.object({id:z.string(),name:Lu,baseUrl:jT,description:z.string().optional().nullish(),schemaVersion:z.string(),advanced:Uu,retries:z.number().optional().nullish(),envs:z.array(D1).nullish(),parameters:O1.nullish(),disabled:z.boolean().optional(),labels:z.array(z.string()).optional().catch([])}),f$=z.enum(["INHERIT","ENABLED","DISABLED"]);var Nde=Uu.extend({failureRecovery:f$.optional(),useMemory:f$.optional()});bs.pick({name:true,description:true,baseUrl:true,retries:true,disabled:true,parameters:true}).extend({advanced:Nde});bs.pick({name:true,description:true,baseUrl:true,retries:true,disabled:true,advanced:true,parameters:true});var Lde=z.object({labels:z.array(z.string()).optional(),outputs:mE.nullish()}),xg=bs.extend(Lde.shape),kde=z.object({createdAt:z.coerce.date(),updatedAt:z.coerce.date(),updatedBy:z.string().nullable(),schedule:uE,notification:dE,createdBy:z.string(),organizationId:z.string(),folderId:z.string().nullable().optional()}),Fde=bs.extend(kde.shape);Fde.extend(vm.shape);var rI=bs.extend(vm.shape);bs.extend(Nu.shape);var Bde="test",Ude="module",zde="mobile-test",$de="mobile-module",Vde="test/v2",jde="module/v2",Hde="mobile-test/v2",Wde="mobile-module/v2";var Pe=(l=>(l.TEST=`momentic/${Bde}`,l.MODULE=`momentic/${Ude}`,l.TEST_V2=`momentic/${Vde}`,l.MODULE_V2=`momentic/${jde}`,l.MOBILE_TEST=`momentic/${zde}`,l.MOBILE_MODULE=`momentic/${$de}`,l.MOBILE_TEST_V2=`momentic/${Hde}`,l.MOBILE_MODULE_V2=`momentic/${Wde}`,l))(Pe||{});bs.merge(Nu);var Gde=ps.extend({steps:z.array(z.record(z.string(),z.unknown().optional())),schemaVersion:z.string()});Gde.extend({fileType:z.literal(Pe.MODULE)});z.object({test:z.string().describe("YAML for the test, including metadata and steps"),modules:z.record(z.string(),z.string()).describe("Map of module name to YAML for the module")});function Dm(t){if(t===void 0)return "__undefined__";if(t===null)return null;if(typeof t!="object")return t;if(Array.isArray(t))return t.map(Dm);let e={};for(let[o,n]of Object.entries(t))e[o]=Dm(n);return e}var qde=/^[a-z0-9]+(?:-[a-z0-9]+){2,}$/,h$=36,cn=z.union([z.guid().max(h$,"V2 IDs must be 36 characters or fewer"),z.string().max(h$,"V2 IDs must be 36 characters or fewer").regex(qde,"V2 IDs must be lowercase kebab-case with at least three words, e.g. silver-river-lantern")],{error:"ID must be a UUID or lowercase kebab-case with at least three words, e.g. silver-river-lantern (36 characters max)"});var vi=(i=>(i.SCREEN="SCREEN",i.OPEN_APP="OPEN_APP",i.OPEN_WEBVIEW="OPEN_WEBVIEW",i.CUSTOM="CUSTOM",i.CUSTOM_COORDINATES="CUSTOM_COORDINATES",i))(vi||{}),Mg=w.discriminatedUnion("type",[w.object({type:w.literal("SCREEN")}),w.object({type:w.literal("OPEN_APP")}),w.object({type:w.literal("OPEN_WEBVIEW")})]),pl=w.object({type:w.literal("description"),description:w.string()}),aI=w.object({type:w.literal("CUSTOM_COORDINATES"),startX:w.number().describe("Starting X coordinate in pixels"),startY:w.number().describe("Starting Y coordinate in pixels"),deltaPixels:w.number().describe("Number of pixels to scroll in the specified direction")}),bE=w.discriminatedUnion("type",[...Mg.options,w.object({type:w.literal("CUSTOM"),target:pl}),aI]);function Kde(t){return t.toLowerCase().replaceAll("_"," ")}function fl(t){switch(t.type){case "CUSTOM":return t.target.description;case "CUSTOM_COORDINATES":return `custom coordinates (x: ${Math.round(t.startX)}, y: ${Math.round(t.startY)}, delta: ${Math.round(t.deltaPixels)}px)`;case "SCREEN":case "OPEN_APP":case "OPEN_WEBVIEW":return Kde(t.type);default:{throw new Error("Unreachable")}}}var Yde=w.object({type:w.literal("coordinates"),xPercent:w.number(),yPercent:w.number()}),Xde=w.object({type:w.literal("absolute_percent"),x:w.number(),y:w.number()}),Nm=w.discriminatedUnion("type",[pl,Yde,Xde]);var Jde=w.object({x1:w.number(),y1:w.number(),x2:w.number(),y2:w.number(),tolerance:w.nativeEnum(Xr),preciseTolerance:w.boolean().optional()}),Zde=w.object({width:w.number(),height:w.number(),tolerance:w.nativeEnum(Xr),preciseTolerance:w.boolean().optional()}),sI=w.object({requiredText:w.string().optional(),requiredAttributes:w.record(w.string(),w.string()).optional(),requiredBounds:w.boolean().optional(),position:Jde.optional(),shape:Zde.optional()}),g$=w.object({xPath:w.string(),requirements:sI.optional()}),Qde=w.object({type:w.literal("CUSTOM"),target:pl,cache:w.lazy(()=>b$).optional()}),eme=w.object({pixelDelta:w.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:w.union([Mg,Qde,aI]),direction:w.enum(["up","down"])}),b$=w.object({type:w.literal("NATIVE"),bounds:w.number().array().optional(),resolvedDescription:w.string().optional(),xPath:w.string().optional(),elementOnlySerializedXml:w.string().optional(),scrollDetails:eme.optional(),requirements:sI.optional(),requiredRelatedElements:g$.array().optional(),memory:xa.optional()}),tme=w.object({type:w.literal("WEBVIEW"),resolvedDescription:w.string().optional(),xPath:w.string().optional(),browserCache:is.optional(),memory:xa.optional()}),Lm=w.union([b$,tme]);var ome=w.object({left:w.number(),top:w.number(),right:w.number(),bottom:w.number()});w.object({newViewportBounds:ome});var nme=w.object({type:w.literal("CUSTOM"),target:pl,cache:w.lazy(()=>T$).optional()}),y$=w.object({pixelDelta:w.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:w.union([Mg,nme,aI]),direction:w.enum(["up","down"])}),lI=(o=>(o.Native="native",o.Appium="appium",o))(lI||{}),cI=w.tuple([w.number(),w.number(),w.number(),w.number()]),S$=g$.extend({bounds:cI.optional(),browserCache:is.optional()}),T$=w.object({type:w.literal("NATIVE"),bounds:cI.optional(),resolvedDescription:w.string().optional(),sourceTree:w.nativeEnum(lI).optional(),xPath:w.string().optional(),elementOnlySerializedXml:w.string().optional(),scrollDetails:y$.optional(),requirements:sI.optional(),requiredRelatedElements:S$.array().optional(),memory:xa.optional()}),rme=w.object({type:w.literal("WEBVIEW"),bounds:cI.optional(),resolvedDescription:w.string().optional(),xPath:w.string().optional(),scrollDetails:y$.optional(),browserCache:is.optional(),requiredRelatedElements:S$.array().optional(),memory:xa.optional()}),km=w.discriminatedUnion("type",[T$,rme]);var tt=(k=>(k.AI_CHECK="AI_CHECK",k.AI_EXTRACT="AI_EXTRACT",k.TAP="TAP",k.TYPE="TYPE",k.PRESS="PRESS",k.PRESS_KEYBOARD="PRESS_KEYBOARD",k.OPEN_APP="OPEN_APP",k.KILL_APP="KILL_APP",k.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",k.SWIPE="SWIPE",k.SCROLL_TO="SCROLL_TO",k.SCREEN_CHECK="SCREEN_CHECK",k.ELEMENT_CHECK="ELEMENT_CHECK",k.VISUAL_DIFF="VISUAL_DIFF",k.DRAG_AND_DROP="DRAG_AND_DROP",k.JAVASCRIPT="JAVASCRIPT",k.REQUEST="REQUEST",k.WAIT="WAIT",k.ADD_FILE="ADD_FILE",k.INSTALL_APP="INSTALL_APP",k.UNINSTALL_APP="UNINSTALL_APP",k.TOGGLE_SETTINGS="TOGGLE_SETTINGS",k.ROTATE_ORIENTATION="ROTATE_ORIENTATION",k.ADB_COMMAND="ADB_COMMAND",k.APPIUM_EXECUTE="APPIUM_EXECUTE",k.STATE="STATE",k))(tt||{}),Ue=w__default.object({id:w__default.guid(),disableCache:w__default.boolean().optional()}),Fm=w__default.object({updatedAt:w__default.coerce.date().optional(),updatedAtLoggerTags:w__default.record(w__default.string(),w__default.string()).optional()}),Ci=Fm.extend({target:Lm}),Pg=Fm.extend({fromTarget:Lm,toTarget:Lm}),Xi=Fm.extend({target:km}),uI=Fm.extend({fromTarget:km,toTarget:km}),Oa=t=>{switch(t.type){case "description":return t.description;case "coordinates":return `${Math.round(t.xPercent*100)}%, ${Math.round(t.yPercent*100)}%`;case "absolute_percent":return `x: ${t.x}%, y: ${t.y}%`}};var E$=Ue.extend({type:w__default.literal("ADB_COMMAND"),command:w__default.string(),jsonArgs:w__default.string().optional()});var ime=w__default.string().trim(),C$=Ue.extend({type:w__default.literal("INSTALL_APP"),uri:ime});var w$=Ue.extend({type:w__default.literal("OPEN_NOTIFICATION_DRAWER")});var Da=(r=>(r.AIRPLANE_MODE="AIRPLANE_MODE",r.DATA="DATA",r.WIFI="WIFI",r.LOCATION="LOCATION",r))(Da||{}),mI=Ue.extend({type:w__default.literal("TOGGLE_SETTINGS"),settingsType:w__default.nativeEnum(Da)});var x$=Ue.extend({type:w__default.literal("UNINSTALL_APP"),packageName:w__default.string()});var yE=Ue.extend({type:w__default.literal("APPIUM_EXECUTE"),command:w__default.string(),jsonArgs:w__default.string().optional()});var M$=Ue.extend({type:w__default.literal("ADD_FILE"),file:w__default.string(),storageLocation:w__default.string()});var hl=Ue.extend({type:w__default.literal("AI_CHECK"),assertion:w__default.string(),timeoutSecs:w__default.number().optional(),contextChoice:Ou.optional(),cache:Fm.extend({memory:Pu.optional()}).optional()});var P$=Ue.extend({type:w__default.literal("AI_EXTRACT"),goal:w__default.string(),schema:w__default.string().optional()});var Bm=Ue.extend({type:w__default.literal("JAVASCRIPT"),code:w__default.string(),timeout:w__default.number().int().max(600).optional().describe("Max seconds for the code to complete")});var I$=Ue.extend({type:w__default.literal("KILL_APP")});var er=(o=>(o.HOME="HOME",o.POWER="POWER",o))(er||{}),Ji=(a=>(a.BACK="BACK",a.APP_SWITCHER="APP_SWITCHER",a.SEARCH="SEARCH",a.VOLUME_UP="VOLUME_UP",a.VOLUME_DOWN="VOLUME_DOWN",a.VOLUME_MUTE="VOLUME_MUTE",a))(Ji||{}),_g=Ue.extend({type:w__default.literal("PRESS"),key:w__default.nativeEnum(er),longPress:w__default.boolean().optional()}),yI=_g.extend({key:w__default.nativeEnum(Ji).or(w__default.nativeEnum(er))}),SI=_g;var _$=Ue.extend({type:w__default.literal("REQUEST")}).merge(Kh);var ys=(o=>(o.PORTRAIT="PORTRAIT",o.LANDSCAPE="LANDSCAPE",o))(ys||{}),TI=Ue.extend({type:w__default.literal("ROTATE_ORIENTATION"),orientation:w__default.nativeEnum(ys)});var cme=w__default.object({type:w__default.literal("CONTENT"),negated:w__default.boolean().optional(),value:w__default.string()}),zm=Ue.extend({type:w__default.literal("SCREEN_CHECK"),assertion:cme,timeout:w__default.number().int().min(0).max(hm).optional().describe("max seconds to wait for the assertion to be true")});var D$=Ue.extend({type:w__default.literal("STATE")});var Og=.1,EI=Ue.extend({type:w__default.literal("VISUAL_DIFF"),path:w__default.string().describe("path to the golden screenshot to compare against"),threshold:w__default.number().min(0).max(1).optional().describe("max allowed fraction of differing pixels before the diff fails (default 0.1)")}),vI=w__default.object({created:w__default.boolean(),goldenPath:w__default.string(),threshold:w__default.number(),goldenScreenshotBase64:w__default.string().optional(),currentScreenshotBase64:w__default.string().optional(),diffScreenshotBase64:w__default.string().optional(),goldenScreenshotSnapshotId:w__default.string().optional(),currentScreenshotSnapshotId:w__default.string().optional(),diffScreenshotSnapshotId:w__default.string().optional(),diffPercent:w__default.number().optional(),pass:w__default.boolean().optional(),dimensionMismatch:w__default.boolean().optional()});var L$=Ue.extend({type:w__default.literal("WAIT"),timeoutSecs:w__default.number()});var Dg=w__default.discriminatedUnion("type",[D$,hl,P$,Bm,L$,_$,TI,zm,EI,M$,I$]);w__default.discriminatedUnion("type",[...Dg.options,_g]);var wI=Ue.extend({type:w__default.literal("DRAG_AND_DROP"),fromTarget:pl,toTarget:pl,hoverDuration:w__default.number().optional(),dragDuration:w__default.number().optional()}),Ng=wI.extend({cache:Pg.optional()}),Lg=wI.extend({cache:uI.optional()});var AI=Ue.extend({type:w__default.literal("ELEMENT_CHECK"),target:Nm,assertion:hT,timeout:w__default.number().int().min(0).max(hm).optional().describe("max seconds to wait for the assertion to be true")}),$u=AI.extend({cache:Ci.optional()}),Vu=AI.extend({cache:Xi.optional()});var yr=(o=>(o.ENTER="ENTER",o.BACKSPACE="BACKSPACE",o))(yr||{}),Ss=(e=>(e.CLOSE_KEYBOARD="CLOSE_KEYBOARD",e))(Ss||{}),B$={repeat:w__default.number().int().min(1).optional(),keyPressDelayMs:w__default.number().min(0).optional()},RI=Ue.extend({type:w__default.literal("PRESS_KEYBOARD"),key:w__default.nativeEnum(yr),...B$}),xI=Ue.extend({type:w__default.literal("PRESS_KEYBOARD"),key:w__default.nativeEnum(Ss).or(w__default.nativeEnum(yr)),...B$});var U$=Ue.extend({type:w__default.literal("OPEN_APP"),packageName:w__default.string(),activityName:w__default.string().optional(),intentExtras:w__default.string().optional()}),z$=Ue.extend({type:w__default.literal("OPEN_APP"),packageName:w__default.string(),intentExtras:w__default.string().optional()});var MI=Ue.extend({type:w__default.literal("SCROLL_TO"),target:pl,direction:w__default.enum(["down","up"]),scrollableElement:bE,scrollStepPercent:w__default.number().min(.1).max(1).optional().describe("How much of the container height to scroll at each step (0.1 to 1.0). Default is 0.9 (90%)."),maxScrollAttempts:w__default.number().int().min(1).max(50).optional().describe("Maximum number of scroll attempts before giving up. Default is 20.")}),kg=MI.extend({cache:Ci.optional()}),Fg=MI.extend({cache:Xi.optional()});var PI=Ue.extend({type:w__default.literal("SWIPE"),direction:w__default.enum(["up","down","left","right"]),scrollableElement:bE,viewportPercent:w__default.number().optional(),durationMs:w__default.number().optional(),relativePosition:pm.optional()}),Bg=PI.extend({cache:Ci.optional()}),Ug=PI.extend({cache:Xi.optional()});var II=Ue.extend({type:w__default.literal("TAP"),target:Nm,longPress:w__default.boolean().optional(),longPressDurationMs:w__default.number().optional(),iterations:w__default.number().optional(),tapDelayMs:w__default.number().optional(),relativePosition:pm.optional(),doubleTap:w__default.boolean().optional(),doubleTapDelayMs:w__default.number().optional()}),zg=II.extend({cache:Ci.optional()}),$g=II.extend({cache:Xi.optional()});var wi=(r=>(r.AUTO="auto",r.PROGRAMMATIC="programmatic",r.LONG_PRESS="long-press",r.BACKSPACE="backspace",r))(wi||{}),_I=["auto","programmatic","long-press","backspace"];var OI=Ue.extend({type:w__default.literal("TYPE"),target:Nm.optional(),keyPressDelayMs:w__default.number().optional(),text:w__default.string(),clearContent:w__default.boolean().optional(),forceClearContent:w__default.boolean().optional(),replaceStrategy:w__default.nativeEnum(wi).optional()});var Vg=OI.extend({cache:Ci.optional()}),jg=OI.extend({cache:Xi.optional()});var Gu=w__default.discriminatedUnion("type",[...Dg.options,zg,Vg,yI,xI,x$,C$,E$,yE,Ng,w$,kg,Bg,mI,$u,U$]);var qu=w__default.discriminatedUnion("type",[...Dg.options,$g,jg,SI,RI,z$,Ug,Lg,Fg,Vu,yE]);var EE={ANDROID:t=>Gu.parse(t),IOS:t=>qu.parse(t)};var vE=w__default.union([w__default.string(),w__default.record(w__default.string(),w__default.unknown().optional())]),CE=ml.extend({type:w__default.literal("MOBILE_PRESET_STEP"),keyPressDelayMs:w__default.number().optional()}),mc=CE.extend({command:Gu}),pc=CE.extend({command:qu}),jm=w__default.object({moduleId:w__default.string(),inputs:w__default.record(w__default.string(),w__default.string()).optional()}),Ku=ml.merge(jm.extend({type:w__default.literal("MOBILE_MODULE_STEP")}));jm.extend({steps:w__default.lazy(()=>Ts.array())});jm.extend({steps:w__default.lazy(()=>gl.array())});var fc=(o=>(o.V2="2",o.V3="3",o))(fc||{});var wE="3",DI=w__default.nativeEnum(fc),pme=ns.extend({platform:w__default.literal("ANDROID"),resolvedGoal:w__default.string(),steps:w__default.lazy(()=>mc.array()),autoGeneratedPostcondition:w__default.string().optional()}),fme=ns.extend({platform:w__default.literal("IOS"),resolvedGoal:w__default.string(),steps:w__default.lazy(()=>pc.array()),autoGeneratedPostcondition:w__default.string().optional()}),Hg=w__default.discriminatedUnion("platform",[pme,fme]),Wg={ANDROID:t=>t.platform==="ANDROID"?t.steps:[],IOS:t=>t.platform==="IOS"?t.steps:[]},hc=ml.extend({type:w__default.literal("MOBILE_AI_ACTION_STEP"),text:w__default.string(),version:DI.optional(),cache:Hg.optional(),precondition:w__default.string().optional(),postcondition:w__default.string().optional()});function j$(t,e){let o={id:v4$1(),type:"AI_CHECK",assertion:e,timeoutSecs:5};return {id:v4$1(),type:"MOBILE_PRESET_STEP",command:EE[t](o)}}function AE(t){let e=t.postcondition?.trim();return e||t.cache?.autoGeneratedPostcondition?.trim()||void 0}function Gg({platform:t,step:e}){let o=AE(e);return {preconditionStep:e.precondition?.trim()?j$(t,e.precondition):void 0,generatedSteps:e.cache?Wg[t](e.cache):[],postconditionStep:o?j$(t,o):void 0}}var hme=w__default.discriminatedUnion("type",[hl,zm,$u,Bm]),NI=CE.extend({command:hme}),gme=w__default.discriminatedUnion("type",[hl,zm,Vu,Bm]),LI=CE.extend({command:gme}),bme=w__default.object({assertion:NI,steps:w__default.lazy(()=>Ts.array())}),yme=w__default.object({assertion:LI,steps:w__default.lazy(()=>gl.array())}),Sme=Om.extend({blocks:w__default.lazy(()=>bme.array()),elseSteps:w__default.lazy(()=>Ts.array()).optional()}),Tme=Om.extend({blocks:w__default.lazy(()=>yme.array()),elseSteps:w__default.lazy(()=>gl.array()).optional()}),Ts=w__default.discriminatedUnion("type",[mc,Ku,hc,Sme]),gl=w__default.discriminatedUnion("type",[pc,Ku,hc,Tme]),Hm=w__default.union([Ts.array(),gl.array()]),Eme={ANDROID:Ts,IOS:gl};function Na(t){return Eme[t]}var qg=w__default.object({parameterNames:w__default.string().array(),defaultParameters:w__default.record(w__default.string(),w__default.string()).optional(),parameterEnums:w__default.record(w__default.string(),w__default.string().array()).optional()}),Wm=w__default.object({moduleId:cn,name:w__default.string(),description:w__default.string().nullish(),platform:w__default.nativeEnum(at).optional().default("ANDROID"),parameters:qg.optional(),enabled:w__default.boolean().nullish(),schemaVersion:w__default.string()}),Es=Wm.omit({name:true}),kI=Es.extend({steps:vE.array()}),FI=w__default.object({fileType:w__default.literal(Pe.MOBILE_MODULE)}).merge(kI),H$=Wm.omit({platform:true,schemaVersion:true}),vme={ANDROID:H$.extend({platform:w__default.literal("ANDROID"),steps:Ts.array()}),IOS:H$.extend({platform:w__default.literal("IOS"),steps:gl.array()})};function W$(t){return vme[t]}var Zi=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(Zi||{}),G$=w__default.object({description:w__default.string().optional(),name:w__default.string().describe("name of the module"),parameters:qg.optional()}),RE=jm.merge(G$).extend({platform:w__default.literal("ANDROID"),get steps(){return Sn.array()}}),xE=jm.merge(G$).extend({platform:w__default.literal("IOS"),get steps(){return Tn.array()}});w__default.discriminatedUnion("platform",[RE,xE]);var BI=ml.merge(RE).extend({type:w__default.literal("RESOLVED_MOBILE_MODULE")}),UI=ml.merge(xE).extend({type:w__default.literal("RESOLVED_MOBILE_MODULE")}),q$={ANDROID:BI,IOS:UI};w__default.discriminatedUnion("platform",[BI,UI]);var Cme=w__default.object({assertion:NI,get steps(){return Sn.array()}}),zI=Om.extend({get blocks(){return Cme.array()},get elseSteps(){return Sn.array().optional()}}),wme=w__default.object({assertion:LI,get steps(){return Tn.array()}}),$I=Om.extend({get blocks(){return wme.array()},get elseSteps(){return Tn.array().optional()}}),Sn=w__default.discriminatedUnion("type",[BI,mc,hc,zI]),Tn=w__default.discriminatedUnion("type",[UI,pc,hc,$I]);function K$(t){return Object.values(Zi).includes(t)||Object.values(xo).includes(t)}var ME=(i=>(i.PRECONDITION="PRECONDITION",i.REPLAY="REPLAY",i.GENERATE="GENERATE",i.AUTOHEAL="AUTOHEAL",i.POSTCONDITION="POSTCONDITION",i))(ME||{}),Y$=z.enum(["pending","running","success","failed"]),X$=z.object({type:z.literal("THOUGHT"),text:z.string(),blockId:z.string().optional()}),J$=z.object({type:z.literal("TOOL_CALL"),toolName:z.string()}),Z$=z.object({type:z.literal("PHASE"),phase:z.nativeEnum(ME),failureMessage:z.string().optional()}),Ame=z.object({type:z.literal("STEP_UPDATE"),stepIndex:z.number(),step:Sn,status:Y$,message:z.string().optional(),afterSnapshotId:z.string().optional()}),Rme=z.object({type:z.literal("STEP_UPDATE"),stepIndex:z.number(),step:Tn,status:Y$,message:z.string().optional(),afterSnapshotId:z.string().optional()}),Q$=z.object({type:z.literal("POSTCONDITION_AUTOGENERATED"),postcondition:z.string()}),xme=z.object({type:z.literal("CACHED_STEPS_GENERATED"),cachedSteps:mc.array(),resolvedGoal:z.string()}),Mme=z.object({type:z.literal("CACHED_STEPS_GENERATED"),cachedSteps:pc.array(),resolvedGoal:z.string()}),eV=z.discriminatedUnion("type",[X$,J$,Z$,Ame,xme,Q$]),tV=z.discriminatedUnion("type",[X$,J$,Z$,Rme,Mme,Q$]);var vs=w__default.object({message:w__default.string().optional(),startTime:w__default.number(),endTime:w__default.number(),status:w__default.nativeEnum(yo),trace:w__default.unknown().optional().optional(),beforeSnapshot:w__default.string().optional(),afterSnapshot:w__default.string().optional(),data:w__default.unknown().optional().optional().describe("output data from the step"),aiSuggested:w__default.boolean().optional(),beforeTestContext:xm.optional(),afterTestContext:xm.optional()}),oV=vs.merge(mc).extend({previousAttempts:w__default.lazy(()=>Zr.array()).optional()}),Pme=vs.merge(Ku).extend({steps:w__default.lazy(()=>Zr.array()),name:w__default.string().optional(),previousAttempts:w__default.lazy(()=>Zr.array()).optional()}),Ime=vs.merge(hc).extend({steps:w__default.lazy(()=>Zr.array()),previousAttempts:w__default.lazy(()=>Zr.array()).optional(),failureRecoveryReason:w__default.string().optional(),trajectory:eV.array().optional()}),_me=vs.merge(zI).extend({assertionResult:oV.optional(),steps:w__default.lazy(()=>Zr.array()),previousAttempts:w__default.lazy(()=>Zr.array()).optional()}),Zr=w__default.discriminatedUnion("type",[oV,Pme,Ime,_me]),nV=vs.merge(pc).extend({previousAttempts:w__default.lazy(()=>Qr.array()).optional()}),Ome=vs.merge(Ku).extend({steps:w__default.lazy(()=>Qr.array()),name:w__default.string().optional(),previousAttempts:w__default.lazy(()=>Qr.array()).optional()}),Dme=vs.merge(hc).extend({steps:w__default.lazy(()=>Qr.array()),previousAttempts:w__default.lazy(()=>Qr.array()).optional(),failureRecoveryReason:w__default.string().optional(),trajectory:tV.array().optional()}),Nme=vs.merge($I).extend({assertionResult:nV.optional(),steps:w__default.lazy(()=>Qr.array()),previousAttempts:w__default.lazy(()=>Qr.array()).optional()}),Qr=w__default.discriminatedUnion("type",[nV,Ome,Dme,Nme]);var Lme=vs.extend({index:w__default.number().optional(),userFacingStepReference:w__default.string().optional(),description:w__default.string()}),rV=Lme.extend({beforeScreenshot:w__default.string().optional(),afterScreenshot:w__default.string().optional()});var iV=z.object({attributesRequired:z.array(z.string()).optional(),textRequired:z.boolean().optional(),boundsRequired:z.boolean().optional(),positionSpecificity:z.enum(Xr).optional(),shapeSpecificity:z.enum(Xr).optional()}),kme=z.object({id:z.number(),requirements:iV}).array(),VI=z.object({thoughts:z.string(),id:z.number(),updatedMemory:Wh.optional(),inWebview:z.boolean().optional(),requirements:iV.optional(),additionalElements:kme.optional()}),Fme=z.literal("SCROLL_TO"),aV=z.object({description:z.string(),screenXml:z.string(),screenshot:z.string(),source:Fme.optional(),memory:z.discriminatedUnion("type",[xa,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional()}),sV=z.object({assertion:z.string(),screenXml:z.string(),screenshot:z.string(),contextChoice:Ou.optional(),memory:z.discriminatedUnion("type",[Pu,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional()}),jI=z.object({thoughts:z.string(),result:z.boolean(),relevantElements:z.array(z.number()).optional(),updatedMemory:Gh.optional()}),lV=z.object({failedResults:rV.array(),nextStepsSerialized:z.string().array(),currentScreenXml:z.string(),currentScreenshot:z.string(),customInstructions:z.string().optional(),testDescription:z.string()}),PE=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(PE||{}),HI=z.object({thoughts:z.string(),scenario:z.enum(PE),instructions:z.string().nullish(),reasonSummary:z.string().nullish()});z.looseObject({type:z.literal("response.create")});var cV=z.union([z.looseObject({response:z.looseObject({id:z.string()}),sequence_number:z.number(),type:z.literal("response.completed")}),z.looseObject({code:z.string().nullable(),message:z.string(),sequence_number:z.number(),type:z.literal("error")})]);function Qi(t){switch(t){case "ANDROID":return "android";case "IOS":return "ios"}}var gc=(a=>(a.TestRun="test-run",a.MobileTestRun="mobile-test-run",a.CreditsUsed="credits-used",a.CreditsUsedV2="credits-used-v2",a.StepsExecuted="steps-executed",a.LLMTokensUsed="llm-tokens-used",a))(gc||{}),bl=(c=>(c.TestRunner="test-runner",c.Editor="editor",c.Mcp="mcp",c.Explore="explore",c.Heal="heal",c.ResultClassification="result-classification",c.GithubPrSummary="github-pr-summary",c.AppGraph="app-graph",c.RunViewer="run-viewer",c))(bl||{}),Bme=3;function Ume(t){return t==="MODULE"||t==="CONDITIONAL"||t==="WHILE_LOOP"||t==="SECTION"||t==="RESOLVED_MODULE"}function uV(t){if(!Ume(t))switch(t){case "PRESET_ACTION":return 0;case "AI_ACTION":return 3;case "AI_ACTION_DYNAMIC":return 5;default:(o=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})();}}function dV(t){switch(t.type){case "AI_EXTRACT":case "AI_ASSERTION":return Bme;case "CAPTCHA":return 3;case "CLICK":case "TYPE":case "SELECT_OPTION":case "HOVER":case "ELEMENT_CHECK":case "FOCUS":case "BLUR":case "SCROLL_DOWN":case "SCROLL_LEFT":case "SCROLL_RIGHT":case "SCROLL_UP":case "MOUSE_DRAG":return t.useSelector||!t.target||t.target.type!=="description"?0:1;case "DRAG":return t.useSelector?0:1;case "VISUAL_DIFF":case "TAB":case "JAVASCRIPT":case "NAVIGATE":case "WAIT":case "SUCCESS":case "AUTH_LOAD":case "AUTH_SAVE":case "COOKIE":case "DIALOG":case "FILE_UPLOAD":case "GO_BACK":case "GO_FORWARD":case "LOCAL_STORAGE":case "NEW_TAB":case "CLOSE_TAB":case "PAGE_CHECK":case "PRESS":case "KEY_DOWN":case "KEY_UP":case "COPY":case "PASTE":case "REFRESH":case "REQUEST":case "GRAPHQL_REQUEST":case "WAIT_FOR_URL":case "REGISTER_REQUEST_LISTENER":case "AWAIT_LISTENER":case "RECORD_REQUESTS":case "GET_RECORDED_REQUESTS":case "SET_HEADER":case "MOCK_ROUTE":case "REMOVE_ROUTE_MOCK":case "OFFLINE_MODE":return 0;default:(o=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})();}}var WI=z.object({name:z.string(),value:z.string(),url:z.string().optional(),domain:z.string().optional(),path:z.string().optional(),expires:z.number().default(Date.now()/1e3+60*60*24*365),httpOnly:z.boolean().optional(),secure:z.boolean().default(true),sameSite:z.union([z.literal("Strict"),z.literal("Lax"),z.literal("None")]).default("None")});function IE(t,e){let o=[],n=splitCookiesString(t);for(let r of n){let i=parseString(r,{decodeValues:false});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let u=i.sameSite.trim().toLowerCase();if(u==="strict")a="Strict";else if(u==="lax")a="Lax";else if(u==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${u}`)}i.httpOnly===void 0&&(i.httpOnly=false),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=WI.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});o.push(s);let l=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),c=r.match(/\b(\S+)=([^;]*)/g);if(c)for(let u of c){let[d,m]=u.split("=");if(!d||!m)throw new Error(`Invalid key-value pair in cookie: ${u}`);l.includes(d.toLowerCase())||o.push({...s,name:d,value:m});}}return o}var Vme=z.object({origin:z.string(),localStorage:z.array(z.object({name:z.string(),value:z.string()})),sessionStorage:z.array(z.object({name:z.string(),value:z.string()})).optional()}),jme=z.object({entries:z.record(z.string(),z.array(z.tuple([z.unknown().optional(),z.unknown().optional()]))),version:z.number().optional()}),mV=z.object({cookies:WI.array().optional(),origins:Vme.array().optional(),idb:z.record(z.string(),jme).optional().describe("key is db name")});function Gm(t,e){let o=[];return t.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let r=WI.safeParse({name:n.key,...n});if(!r.success)return;let i=r.data;!i.domain&&!i.url&&(i.domain=e),o.push(i);}),o}var Hme=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM","CUSTOM_COORDINATES"],pV=w__default.object({type:w__default.enum(Hme).describe("Where to interact. SCREEN = entire device (use for system surfaces like the notification bar or quick settings), OPEN_APP = current foreground app when the main app content itself should scroll, OPEN_WEBVIEW = active webview (only if a webview is present and there is high confidence that the element is inside it), CUSTOM = explicitly describe a nested scrollable container when scrolling should happen inside a visible region such as an open dropdown list, picker, modal body, bottom sheet, carousel, or inner panel, CUSTOM_COORDINATES = use explicit pixel coordinates for the scroll start position and distance (fallback if other containers don't work)."),description:w__default.string().or(w__default.null()).describe("Description of the container to interact with. Only used if the container type is CUSTOM, else set to null. Describe the scrollable container itself, not the target item inside it. Good examples: 'the open country dropdown list', 'the results list in the bottom sheet', 'the modal body showing account settings'."),startX:w__default.number().or(w__default.null()).describe("Starting X coordinate in pixels. Only used if the container type is CUSTOM_COORDINATES, else set to null."),startY:w__default.number().or(w__default.null()).describe("Starting Y coordinate in pixels. Only used if the container type is CUSTOM_COORDINATES, else set to null."),deltaPixels:w__default.number().or(w__default.null()).describe("Number of pixels to scroll in the specified direction. Only used if the container type is CUSTOM_COORDINATES, else set to null.")}),Wme=w__default.object({xPercent:w__default.number().min(0).max(1).describe("X coordinate as a fraction of the viewport width (0 = left edge, 1 = right edge)."),yPercent:w__default.number().min(0).max(1).describe("Y coordinate as a fraction of the viewport height (0 = top edge, 1 = bottom edge).")}),Gme=w__default.string().or(Wme).describe("Either a string description of an actual element in the page XML to target, or an object with xPercent/yPercent (0-1) for coordinate-based targeting when no suitable element exists. Prefer element descriptions when possible."),fV=w__default.object({type:w__default.literal("TAP"),target:Gme,longPress:w__default.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),iterations:w__default.null().or(w__default.number()).describe("Number of times to tap the element, useful for selecting text, selecting a row, or opening a menu. If null, tap once."),relativePosition:pm.nullable().describe("Specific position to tap within the bounding box of the element, specified in pixels. E.g. 0,0 is the top left corner. Only applicable when target is a string description.")}).describe("Tap on an element on the screen, or tap at specific coordinates."),qme=w__default.object({type:w__default.literal("PRESS"),key:w__default.nativeEnum(Ji)}).describe("Press a button on the device. Some buttons are physical (volume) while others are virtual (Back/Home/App Switcher)."),hV=w__default.object({type:w__default.literal("AI_CHECK"),assertion:w__default.string().describe("A natural language assertion to validate. On each attempt, Momentic's AI agents will evaluate the assertion by analyzing the current emulator XML and screenshot. Thus, the assertion must be verifiable based on a single point in time. The assertion will be automatically retried until it is true or the timeout is reached."),timeoutSecs:w__default.number().describe("Maximum number of seconds to wait for the assertion to be true.")}).describe("Use AI to verify a statement about the state of the emulator. Will retry up until the timeout, so this can be used as a flexible wait that supports visual, numerical, and logical reasoning."),gV=w__default.object({type:w__default.literal("WAIT"),timeoutSecs:w__default.number().describe("Number of seconds to wait.")}).describe("Wait for a fixed number of seconds. Use this in these scenarios: 1. Short waits that are expected to be less than 5 seconds almost all the time, which shouldn't warrant an AI call (e.g. an app needs to finish loading, or some contents are suspending); 2. Waits with an obvious deterministic duration (e.g. a 60-second countdown is on the page). For other scenarios, prefer AI_CHECK.");w__default.object({type:w__default.literal("AI_EXTRACT"),goal:w__default.string().describe("Natural language description of what to extract from the current emulator state."),schema:w__default.string().or(w__default.null()).describe("Optional JSON schema string for the expected output shape. Use null to omit.")}).describe("Use AI to extract structured data from the current emulator state.");var bV=w__default.object({type:w__default.literal("TYPE"),target:w__default.string().or(w__default.null()).optional().describe("Description of the input element to type into. Required when clearContent is true. Set to null only when typing into the already-focused element."),text:w__default.string().describe("Exact text to type, which will be passed to appium's driver.keys() method. Use an empty string only when clearContent is true and the goal is to clear the target field."),keyPressDelayMs:w__default.number().or(w__default.null()).describe("Milliseconds to wait between each key press. Useful for triggering auto-complete and other event listeners."),clearContent:w__default.boolean().or(w__default.null()).describe("Clear the content of the target input before typing. To clear a populated field without entering replacement text, provide the target, set text to an empty string, and set clearContent to true. Do not repeat empty TYPE steps if the field did not clear."),replaceStrategy:w__default.nativeEnum(wi).or(w__default.null()).describe("Optional strategy for clearing the target before typing. Defaults to auto. Use a specific value only when a known native input needs a more efficient or more reliable replacement path.")}),yV=w__default.object({type:w__default.literal("SWIPE"),direction:w__default.enum(["up","down","left","right"]).describe("Direction to swipe. Important: swiping up will scroll down, and vice versa."),container:pV,viewportPercent:w__default.number().min(.1).max(1).or(w__default.null()).describe("How much of the container height/width to swipe each time as a decimal (0.1 - 1). Set to null for default (0.8)."),durationMs:w__default.number().int().positive().or(w__default.null()).describe("Optional swipe duration in milliseconds. Set to null for default.")}).describe("Swipe a single time in a specified direction within a container (screen/app/webview/custom container/custom coordinates). Use CUSTOM when the swipe should happen inside a nested scrollable region rather than across the whole app."),SV=w__default.object({type:w__default.literal("SCROLL_TO"),targetDescription:w__default.string().describe("Description of the element to scroll to inside the container."),direction:w__default.enum(["down","up"]).describe("Direction to search for the target. Important: this is direction the target is in relative to the current position. E.g. 'down' means the desired element is below the current position."),container:pV,scrollStepPercent:w__default.number().min(.1).max(1).or(w__default.null()).describe("How much of the container height to scroll at each step (0.1 - 1). Set to null for default (0.8)."),maxScrollAttempts:w__default.number().int().min(1).max(50).or(w__default.null()).describe("Maximum number of scroll attempts before giving up. Set to null for default (20).")}).describe("Scroll within a container until the described target is visible or we can't scroll anymore. There is no need to repeat the same scroll to command in the same direction multiple times in a row. If the target lives inside a nested list, picker, modal body, bottom sheet, carousel, or other inner scroll region, use CUSTOM and describe that container rather than OPEN_APP. If a scroll fails, we do not restore the position automatically."),GI=w__default.discriminatedUnion("type",[fV,qme,hV,gV,bV,yV,SV]),Kme=w__default.object({type:w__default.literal("PRESS"),key:w__default.nativeEnum(er)}).describe("Press a physical button on the device. Only HOME and POWER are available on iOS."),Yme=w__default.object({type:w__default.literal("PRESS_KEYBOARD"),key:w__default.nativeEnum(yr)}).describe("Press a key on the keyboard. Available keys: ENTER, BACKSPACE."),qI=w__default.discriminatedUnion("type",[fV,Kme,Yme,hV,gV,bV,yV,SV]),_E=t=>{switch(t.type){case "SCREEN":return {type:"SCREEN"};case "OPEN_APP":return {type:"OPEN_APP"};case "OPEN_WEBVIEW":return {type:"OPEN_WEBVIEW"};case "CUSTOM":if(!t.description)throw new It("Description is required when container type is CUSTOM.");return {type:"CUSTOM",target:{type:"description",description:t.description}};case "CUSTOM_COORDINATES":{if(t.startX==null||t.startY==null||t.deltaPixels==null)throw new It("startX, startY, and deltaPixels are required when container type is CUSTOM_COORDINATES.");return {type:"CUSTOM_COORDINATES",startX:t.startX,startY:t.startY,deltaPixels:t.deltaPixels}}default:{throw new Error("Unreachable")}}},TV=t=>typeof t=="string"?{type:"description",description:t}:{type:"coordinates",xPercent:t.xPercent,yPercent:t.yPercent},EV=t=>{let e=GI.parse(t);switch(e.type){case "TAP":return {id:v4$1(),type:"TAP",target:TV(e.target),longPress:e.longPress??void 0,iterations:e.iterations??void 0,relativePosition:typeof e.target=="string"?e.relativePosition??void 0:void 0};case "PRESS":return {id:v4$1(),...e};case "AI_CHECK":return {id:v4$1(),...e};case "WAIT":return {id:v4$1(),...e};case "TYPE":return {id:v4$1(),type:"TYPE",target:e.target?{type:"description",description:e.target}:void 0,text:e.text,keyPressDelayMs:e.keyPressDelayMs??void 0,clearContent:e.clearContent??void 0,replaceStrategy:e.replaceStrategy??void 0};case "SWIPE":return {id:v4$1(),type:"SWIPE",direction:e.direction,scrollableElement:_E(e.container),viewportPercent:e.viewportPercent??void 0,durationMs:e.durationMs??void 0};case "SCROLL_TO":return {id:v4$1(),type:"SCROLL_TO",target:{type:"description",description:e.targetDescription},direction:e.direction,scrollableElement:_E(e.container),scrollStepPercent:e.scrollStepPercent??void 0,maxScrollAttempts:e.maxScrollAttempts??void 0};default:{throw new Error("Unreachable")}}},vV=t=>{let e=qI.parse(t);switch(e.type){case "TAP":return {id:v4$1(),type:"TAP",target:TV(e.target),longPress:e.longPress??void 0,iterations:e.iterations??void 0,relativePosition:typeof e.target=="string"?e.relativePosition??void 0:void 0};case "PRESS":return {id:v4$1(),...e};case "PRESS_KEYBOARD":return {id:v4$1(),...e};case "AI_CHECK":return {id:v4$1(),...e};case "WAIT":return {id:v4$1(),...e};case "TYPE":return {id:v4$1(),type:"TYPE",target:e.target?{type:"description",description:e.target}:void 0,text:e.text,keyPressDelayMs:e.keyPressDelayMs??void 0,clearContent:e.clearContent??void 0,replaceStrategy:e.replaceStrategy??void 0};case "SWIPE":return {id:v4$1(),type:"SWIPE",direction:e.direction,scrollableElement:_E(e.container),viewportPercent:e.viewportPercent??void 0,durationMs:e.durationMs??void 0};case "SCROLL_TO":return {id:v4$1(),type:"SCROLL_TO",target:{type:"description",description:e.targetDescription},direction:e.direction,scrollableElement:_E(e.container),scrollStepPercent:e.scrollStepPercent??void 0,maxScrollAttempts:e.maxScrollAttempts??void 0};default:{throw new Error("Unreachable")}}};var CV=w__default.object({left:w__default.number(),top:w__default.number(),width:w__default.number(),height:w__default.number()});var ei={type:true,cache:true},wV=[hl.pick(ei),$u.pick(ei),zg.pick(ei),Vg.pick(ei),Bg.pick(ei),kg.pick(ei),Ng.pick(ei)],Yu=w__default.discriminatedUnion("type",wV),AV=[hl.pick(ei),Vu.pick(ei),$g.pick(ei),jg.pick(ei),Ug.pick(ei),Lg.pick(ei),Fg.pick(ei)],KI=w__default.discriminatedUnion("type",AV),Km=t=>Ci.safeParse(t).success,Xu=t=>Pg.safeParse(t).success,YI=t=>Xi.safeParse(t).success;function XI(t){return !!t&&(t.type==="AI_ASSERTION"||t.type==="AI_CHECK")&&!!t.cache}var Xme=Object.values(tt).filter(t=>wV.some(e=>e.shape.type.safeParse(t).success));function Ym(t){return Xme.includes(t.type)}var Jme=Object.values(tt).filter(t=>AV.some(e=>e.shape.type.safeParse(t).success));function JI(t){return Jme.includes(t.type)}function ea(t,e){return t==="ANDROID"&&Ym(e)||t==="IOS"&&JI(e)}var OE=w__default.object({type:w__default.literal("MOBILE_AI_ACTION_STEP"),cache:Hg}),DE=w__default.union([Yu,OE]),NE=w__default.union([KI,OE]),LE={ANDROID:Yu,IOS:KI},RV={ANDROID:t=>DE.parse(t),IOS:t=>NE.parse(t)},kE={ANDROID:t=>Yu.parse(t),IOS:t=>KI.parse(t)};var Xg=(a=>(a.US_EAST_1="us-east1",a.US_EAST_2="us-east2",a.US_WEST_1="us-west1",a.US_WEST_2="us-west2",a.EU_NORTH_1="eu-north1",a.AS_SOUTH_1="as-south1",a))(Xg||{}),Jg=(n=>(n.US="us",n.EU="eu",n.AS="as",n))(Jg||{}),Cs=(e=>(e.LOCAL="local",e))(Cs||{}),ZI=w__default.nativeEnum(Xg).or(w__default.nativeEnum(Jg)),QI=w__default.nativeEnum(Xg).or(w__default.nativeEnum(Jg)).or(w__default.nativeEnum(Cs)),xi="closest",bc=QI.or(w__default.literal(xi)),Xm=(o=>(o.ANDROID_14="14",o.ANDROID_15="15",o))(Xm||{}),Jm="14",FE=(e=>(e.IOS_26="26",e))(FE||{}),Zm="26",Zme=["1.56.1-lim.1","1.60.0-lim.1"],xV=w__default.enum(Zme);var MV="1.60.0-lim.1",PV=w__default.nativeEnum(Xm).or(w__default.nativeEnum(FE));var epe="-",tpe=[Rm,gg],IV=[Rm,gg],e_=2e4,ta=class t{env={};varsFromMomenticEnvironment={};initialParams;constructor(e){this.initialParams=cloneDeep(e),this.reset(e);}static dummyContext(e=void 0,o=void 0,n={}){return new t({testName:e,envName:o,variablesFromEnvironment:n})}static fromSnapshot({snapshot:e,environmentVariables:o}){let n=e.env[Rm],r=e.env[gg],i={};for(let[s,l]of Object.entries(e.env))IV.includes(s)||(o??{})[s]===void 0&&(i[s]=l);return new t({dynamicVariables:i,envName:n,testName:r,variablesFromEnvironment:o??{}})}setEnvVariables(e){let o=cloneDeep(e);this.env=Object.assign(this.env,o);}setInputs(e){e&&this.setEnvVariables(e);}setMomenticSystemVariable(e,o){this.varsFromMomenticEnvironment[e]=o;}getVariable(e){return this.env[e]}setVariable(e,o){tpe.includes(e)||(this.env[e]=o);}getEnvName(){return this.env[Rm]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return cloneDeep(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy(),o=new Set;if(e.env=Object.fromEntries(Object.entries(e.env).map(([r,i])=>IV.includes(r)||this.varsFromMomenticEnvironment[r]===void 0?[r,i]:(o.add(r),[r,epe]))),JSON.stringify(e.env).length>e_){for(let r of o)if(delete e.env[r],JSON.stringify(e.env).length<=e_)break}let{jsonString:n}=F6(JSON.stringify(e.env),e_);try{e.env=JSON.parse(n);}catch{e.env={};}return e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.varsFromMomenticEnvironment=cloneDeep(e.variablesFromEnvironment),e.envName&&this.setMomenticSystemVariable(Rm,e.envName),e.testName&&this.setMomenticSystemVariable(gg,e.testName);}resetToInitial(){this.reset(this.initialParams);}getDynamicVariablesCopy(){return cloneDeep(this.env)}getVariablesFromEnvironmentCopy(){return cloneDeep(this.varsFromMomenticEnvironment)}};var ope=w__default.object({disableMomenticAccessibilityTree:w__default.boolean().optional(),autoGrantPermissions:w__default.boolean().optional().describe("Automatically grant app permission prompts during the run. Android only."),autoAcceptAlerts:w__default.boolean().optional().describe("Automatically accept native alert dialogs. iOS only."),autoDismissAlerts:w__default.boolean().optional().describe("Automatically dismiss native alert dialogs. iOS only."),disableXmlSnapshots:w__default.boolean().optional().describe("Skip collecting XML snapshots during test runs. This can speed up test runs, but will cause the run viewer to show less information."),browserSettings:KP.optional(),locale:w__default.string().optional().describe("Device locale code (e.g. 'fr', 'en-us'). Sets the device language and region. iOS and Android.")}),Ju="avdId",t_="iosDeviceType",o_="iosVersion",n_=ope.extend({region:QI.optional().describe('Where the emulator runs: "local" for an emulator on your machine, or a region for hosted emulators. Defaults to hosted emulators.'),remoteEmulatorSettings:w__default.object({androidVersion:w__default.nativeEnum(Xm).optional()}).optional(),localEmulatorSettings:w__default.object({[Ju]:Mm,[t_]:Mm,[o_]:Mm}).optional(),geolocation:w__default.object({latitude:w__default.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:w__default.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),waitForStability:w__default.boolean().optional().describe("wait for stability before every targeting action")});function BE(t){let e=t.split("-"),o=e[0]??t,n=e.slice(1);return {"appium:language":o,...n.length>0&&{"appium:locale":n.join("-").toUpperCase()}}}var Ur=w__default.object({retries:w__default.number().optional().describe("number of retries to run"),defaultChannel:w__default.string().optional().describe("Default app release channel to use when installing from managed mobile artifacts."),defaultTag:w__default.string().optional().describe("Default app artifact tag to use. If not set, the latest available tag is used."),defaultEnv:w__default.string().optional().describe("Default mobile environment name to load variables from at runtime."),defaultApkFilePath:Mm.describe("APK to install when using the emulator in the local region."),defaultAppFilePath:Mm.describe("App file (e.g. .app or .ipa) to install when using the emulator in the local region."),emulator:n_.optional().describe("Emulator configuration for local or remote mobile execution, including region and local emulator overrides."),ai:XP.optional().describe("AI behavior overrides for this mobile test, such as memory and failure recovery settings.")}),UE=w__default.object({id:cn,description:w__default.string(),schemaVersion:w__default.string(),settings:Ur.optional(),disabled:w__default.boolean().optional(),labels:w__default.array(w__default.string()).optional()}),ep=UE.extend({platform:w__default.literal("ANDROID").optional().default("ANDROID")}),tp=UE.extend({platform:w__default.literal("IOS")}),yc=w__default.discriminatedUnion("platform",[ep,tp]),_V=w__default.object({fileType:w__default.literal(Pe.MOBILE_TEST)}),zE=_V.merge(ep),$E=_V.merge(tp),VE=w__default.discriminatedUnion("platform",[zE,$E]),OV=ep.merge(w__default.object({steps:w__default.array(Ts)})),DV=tp.merge(w__default.object({steps:w__default.array(gl)}));w__default.discriminatedUnion("platform",[OV,DV]);var npe=zE.merge(OV),rpe=$E.merge(DV),NV=w__default.discriminatedUnion("platform",[npe,rpe]);w__default.object({name:w__default.string(),steps:w__default.array(Ts).optional(),settings:Ur.optional()});var LV=ep.extend({steps:Sn.array(),beforeSteps:Sn.array().optional(),afterSteps:Sn.array().optional()}),kV=tp.extend({steps:Tn.array(),beforeSteps:Tn.array().optional(),afterSteps:Tn.array().optional()});w__default.discriminatedUnion("platform",[LV,kV]);var r_=LV.extend({name:w__default.string()}),i_=kV.extend({name:w__default.string()});w__default.discriminatedUnion("platform",[r_,i_]);var Hn=w__default.object({startTime:w__default.number(),endTime:w__default.number().optional(),durationMs:w__default.number().optional(),error:w__default.string().optional(),result:w__default.unknown().optional().optional(),attributes:w__default.record(w__default.string(),w__default.unknown().optional()),subSpans:w__default.lazy(()=>vpe.array())});var a_=Hn.extend({type:w__default.literal("SECTION"),name:w__default.string()}),ipe=Hn.extend({type:w__default.literal("GET_PAGE_STATE")}),ape=Hn.extend({type:w__default.literal("GET_PAGE_SCREENSHOT")}),spe=Hn.extend({type:w__default.literal("SMART_WAITING")}),lpe=Hn.extend({type:w__default.literal("SCROLL_ELEMENT_INTO_VIEW")}),cpe=Hn.extend({type:w__default.literal("AI_LOCATOR_CALL"),screenshotSnapshotId:w__default.string().optional(),result:w__default.object({id:w__default.number(),thoughts:w__default.string(),citations:sn.array().optional()}).optional()}),upe=Hn.extend({type:w__default.literal("AI_ASSERTION_CALL"),screenshotSnapshotId:w__default.string().optional(),elementScreenshotSnapshotId:w__default.string().optional(),result:w__default.object({thoughts:w__default.string(),result:w__default.boolean(),citations:sn.array().optional()}).optional()}),dpe=Hn.extend({type:w__default.literal("AI_EXTRACTION_CALL"),screenshotSnapshotId:w__default.string().optional(),browserStateSnapshotId:w__default.string().optional(),result:w__default.object({thoughts:w__default.string().optional(),result:w__default.unknown().optional().optional()}).optional()}),mpe=Hn.extend({type:w__default.literal("ELEMENT_ASSERTION"),name:w__default.string(),result:w__default.object({success:w__default.boolean(),message:w__default.string().optional()}).optional()}),ppe=Hn.extend({type:w__default.literal("BROWSER_INTERACTION"),name:w__default.string(),coordinates:w__default.object({x:w__default.number(),y:w__default.number()}).optional(),value:w__default.string().optional(),selector:w__default.string().optional()}),fpe=Hn.extend({type:w__default.literal("CACHE_RESOLUTION"),resolutionMethod:w__default.string().optional(),cacheMissReason:w__default.nativeEnum(fm).optional(),targetSource:w__default.string().optional(),elementScreenshotSnapshotId:w__default.string().optional(),result:w__default.object({serializedElement:w__default.string()}).optional()}),hpe=Hn.extend({type:w__default.literal("TARGET_RESOLUTION"),elementScreenshotSnapshotId:w__default.string().optional(),result:w__default.object({serializedElement:w__default.string()}).optional()}),gpe=Hn.extend({type:w__default.literal("LOCATOR_REDIRECT"),elementScreenshotSnapshotId:w__default.string().optional(),result:w__default.object({outcome:w__default.string(),logs:w__default.string().array().optional(),serializedElement:w__default.string().optional(),relativeClickPoint:w__default.object({x:w__default.number(),y:w__default.number()}).optional(),force:w__default.boolean().optional()}).optional()}),bpe=Hn.extend({type:w__default.literal("WAIT_FOR_STABILITY")}),ype=Hn.extend({type:w__default.literal("GENERIC"),name:w__default.string()}),Spe=Hn.extend({type:w__default.literal("PAGE_ASSERTION"),name:w__default.string(),result:w__default.object({success:w__default.boolean(),message:w__default.string().optional()}).optional()}),Tpe=Hn.extend({type:w__default.literal("AUTO_FOLLOW_NEW_TABS"),result:w__default.object({followed:w__default.boolean()}).optional()}),Epe=Hn.extend({type:w__default.literal("VISUAL_DIFF"),name:w__default.string(),result:w__default.object({success:w__default.boolean(),message:w__default.string().optional()}).optional()});function FV(t){return t.type==="CACHE_RESOLUTION"||t.type==="TARGET_RESOLUTION"}var vpe=w__default.discriminatedUnion("type",[a_,ipe,ape,spe,lpe,cpe,upe,dpe,mpe,ppe,hpe,fpe,gpe,bpe,Spe,Epe,ype,Tpe]);var ti=w__default.object({startTime:w__default.number(),endTime:w__default.number().optional(),durationMs:w__default.number().optional(),error:w__default.string().optional(),targetBounds:CV.optional(),result:w__default.unknown().optional().optional(),attributes:w__default.record(w__default.string(),w__default.unknown().optional()),subSpans:w__default.lazy(()=>s_.array())});var Cpe=ti.extend({type:w__default.literal("SECTION"),name:w__default.string()}),wpe=ti.extend({type:w__default.literal("AI_LOCATOR_CALL"),result:w__default.object({id:w__default.number(),thoughts:w__default.string()}).optional()}),Ape=ti.extend({type:w__default.literal("AI_ASSERTION_CALL"),result:w__default.object({thoughts:w__default.string(),result:w__default.boolean()}).optional()}),Rpe=ti.extend({type:w__default.literal("AI_EXTRACTION_CALL"),screenshotSnapshotId:w__default.string().optional(),emulatorStateSnapshotId:w__default.string().optional(),result:w__default.object({thoughts:w__default.string().optional(),result:w__default.unknown().optional().optional()}).optional()}),xpe=ti.extend({type:w__default.literal("TARGET_RESOLUTION"),result:w__default.object({serializedElement:w__default.string()}).optional()}),Mpe=ti.extend({type:w__default.literal("EMULATOR_INTERACTION"),name:w__default.string(),withinWebview:w__default.boolean().optional()}),Ppe=ti.extend({type:w__default.literal("EMULATOR_READ_STATE"),name:w__default.string()}),Ipe=ti.extend({type:w__default.literal("ELEMENT_ASSERTION"),name:w__default.string(),withinWebview:w__default.boolean().optional(),result:w__default.object({success:w__default.boolean(),message:w__default.string().optional()}).optional()}),_pe=ti.extend({type:w__default.literal("CACHE_RESOLUTION")}),Ope=ti.extend({type:w__default.literal("WAIT_FOR_SCREENSHOT_STABILITY")}),Dpe=ti.extend({type:w__default.literal("WAIT_FOR_PAGE_STABILITY")}),Npe=ti.extend({type:w__default.literal("VISUAL_DIFF"),result:w__default.object({created:w__default.boolean(),success:w__default.boolean(),message:w__default.string()}).optional()}),Lpe=ti.extend({type:w__default.literal("WEBVIEW_LOCATOR_CALL"),webTrace:a_}),kpe=ti.extend({type:w__default.literal("GENERIC"),name:w__default.string()}),s_=w__default.discriminatedUnion("type",[Cpe,wpe,Ape,Rpe,xpe,Mpe,Ppe,Ipe,_pe,Ope,Dpe,Npe,Lpe,kpe]);z.object({testId:z.string(),sessionId:z.string()});var BV=z.object({uploadUrl:z.string(),id:z.string()});var np=(o=>(o.LOCAL="local",o.REMOTE="remote",o))(np||{});w__default.nativeEnum(np);function rp({overrideAvdId:t,overrideApkFilePath:e,emulatorSettings:o,defaultApkFilePath:n,envVariables:r}){let i=Mi(r?.[nc]),{filePath:a,source:s}=UV({overrideFilePath:e,defaultFilePath:n,envFilePath:Mi(r?.[b1])});return {avdId:Mi(t)??Mi(o?.localEmulatorSettings?.[Ju])??i,apkFilePath:a,apkFilePathSource:s}}function ip({overrideDeviceType:t,overrideIosVersion:e,overrideAppFilePath:o,emulatorSettings:n,defaultAppFilePath:r,envVariables:i}){let a=Mi(i?.[rc]),s=Mi(i?.[y1]),{filePath:l,source:c}=UV({overrideFilePath:o,defaultFilePath:r,envFilePath:Mi(i?.[S1])});return {deviceType:Mi(t)??Mi(n?.localEmulatorSettings?.[t_])??a,iosVersion:Mi(e)??Mi(n?.localEmulatorSettings?.[o_])??s,appFilePath:l,appFilePathSource:c}}function Mi(t){if(typeof t!="string")return;let e=t.trim();return e||void 0}function UV({overrideFilePath:t,defaultFilePath:e,envFilePath:o}){let n=Mi(t),r=Mi(e);return {filePath:n??r??o,source:n?"override":r?"default":o?"env":void 0}}var Bpe=z.string().refine(t=>Ll.valid(t),{error:"must be a valid semver string"});function l_(t){return Ll.parse(t)||void 0}function c_(t){if(t!==void 0)return t===true||t==="true"||t==="1"}var $V="on-fail";function VV(t){return t==="on-fail"?"on-fail":t==="false"?false:!!t}var u_=(o=>(o.CLI="cli",o.MobileCLI="mobile-cli",o))(u_||{}),Upe=z.nativeEnum(u_),jV=(n=>(n.Error="error",n.Warn="warn",n.Info="info",n))(jV||{}),zpe=z.nativeEnum(jV),$pe=z.object({id:z.string(),level:zpe,versionRange:z.string(),announcement:z.string()});z.object({cliType:Upe,version:Bpe});var HV=z.object({announcements:z.array($pe)});var ap=55555,jE="momentic-code-eval.js";z.object({body:z.string(),to:z.string(),from:z.string()});z.object({from:z.string().optional(),to:z.string(),timeout:z.number().optional(),beforeDate:z.string().pipe(z.coerce.date()).or(z.date()).optional(),afterDate:z.string().pipe(z.coerce.date()).or(z.date()).optional()});z.object({timeoutMs:z.number().nonnegative().optional()}).optional();z.object({phoneNumber:z.string(),leaseToken:z.string()});var Vpe=z.union([z.string(),z.date()]).transform(t=>t instanceof Date?t:new Date(t)),WV=z.object({phoneNumber:z.string(),expiresAt:Vpe,leaseToken:z.string()});z.object({to:z.email(),from:z.string(),subject:z.string(),body:z.string(),html:z.string().optional()});z.object({inbox:z.string().transform(t=>t.toLowerCase()),afterDate:z.string().pipe(z.coerce.date()).or(z.date()).optional(),timeout:z.number().optional(),trimWhitespace:z.boolean().optional()});z.object({inbox:z.string(),limit:z.number().optional(),afterDate:z.string().pipe(z.coerce.date()).or(z.date()).optional(),trimWhitespace:z.boolean().optional()});var GV=z.object({email:z.string(),prefix:z.string(),expiresAt:z.coerce.date()}),HE=(o=>(o.RAW="RAW",o.RESPONSE="RESPONSE",o))(HE||{}),qV=z.object({body:z.string().nullish(),status:z.number().optional(),headers:z.array(z.tuple([z.string(),z.string()])).optional()}),jpe=z.object({url:z.string(),options:z.object({method:z.string(),body:z.string().nullish(),headers:z.array(z.tuple([z.string(),z.string()])).optional()}).optional()}).optional(),Hpe=z.object({body:z.string().nullish(),options:z.object({status:z.number(),statusText:z.string().optional(),headers:z.array(z.tuple([z.string(),z.string()])).optional()}).optional()}).optional(),KV=z.object({result:z.unknown().optional(),variableUpdates:z.record(z.string(),z.unknown().optional()).optional(),persistentVariableUpdates:z.record(z.string(),z.unknown().optional()).optional(),error:z.string().optional(),success:z.boolean()});z.object({id:z.string().optional(),orgId:z.string(),momenticLambdaAuthHash:z.string(),code:z.string(),fragment:z.boolean(),state:z.object({env:z.record(z.string(),z.unknown().optional()),request:jpe,response:Hpe,additionalBindings:z.record(z.string(),z.unknown().optional()).optional()}),timeoutMs:z.number().optional(),disallowVariableUpdates:z.boolean().optional(),responseSerialization:z.enum(HE).optional()});var Sc=9e4;var Wpe=w.object({url:w.string(),lineNumber:w.number(),columnNumber:w.number()}),YV=w.object({timestamp:w.number(),text:w.string(),type:w.string(),tabIndex:w.number(),args:w.unknown().optional().array().optional(),url:w.string().optional(),location:Wpe.optional()}),XV=YV.array(),d_=XV.array();var Gpe=z.object({name:z.string(),version:z.string(),comment:z.string().optional()}),qpe=z.object({name:z.string(),version:z.string(),comment:z.string().optional()}),Kpe=z.object({onContentLoad:z.number().optional(),onLoad:z.number().optional(),comment:z.string().optional()}),Zg=z.object({startedDateTime:z.string(),id:z.string(),title:z.string().optional(),pageTimings:Kpe,comment:z.string().optional()}),Ype=z.array(Zg),Xpe=z.object({name:z.string(),value:z.string(),path:z.string().optional(),domain:z.string().optional(),expires:z.string().optional(),httpOnly:z.boolean().optional(),secure:z.boolean().optional(),comment:z.string().optional()}),ZV=z.array(Xpe),Jpe=z.object({name:z.string(),value:z.string(),comment:z.string().optional()}),QV=z.array(Jpe),Zpe=z.object({name:z.string(),value:z.string(),comment:z.string().optional()}),Qpe=z.array(Zpe),efe=z.object({name:z.string(),value:z.string().optional(),fileName:z.string().optional(),contentType:z.string().optional(),comment:z.string().optional()}),tfe=z.array(efe),ofe=z.object({mimeType:z.string(),params:tfe,text:z.string(),comment:z.string().optional(),_redactedReason:z.string().optional()}),nfe=z.object({method:z.string(),url:z.string(),httpVersion:z.string().optional(),cookies:ZV,headers:QV,queryString:Qpe,postData:ofe.optional(),headersSize:z.number().optional(),bodySize:z.number().optional(),comment:z.string().optional()}),rfe=z.object({size:z.number().optional(),compression:z.number().optional(),mimeType:z.string().optional(),text:z.string().optional(),encoding:z.string().optional(),comment:z.string().optional(),_redactedReason:z.string().optional()}),ife=z.object({status:z.number(),statusText:z.string(),httpVersion:z.string().optional(),cookies:ZV,headers:QV,content:rfe,redirectURL:z.string().optional(),headersSize:z.number().optional(),bodySize:z.number().optional(),comment:z.string().optional(),_mocked:z.boolean().optional()}),JV=z.object({expires:z.string().optional(),lastAccess:z.string(),eTag:z.string(),hitCount:z.number(),comment:z.string().optional()}),afe=z.object({beforeRequest:JV.optional(),afterRequest:JV.optional(),comment:z.string().optional()}),sfe=z.object({blocked:z.number().optional(),dns:z.number().optional(),connect:z.number().optional(),send:z.number(),wait:z.number(),receive:z.number(),ssl:z.number().optional(),comment:z.string().optional()}),Qg=z.object({pageref:z.string().optional(),startedDateTime:z.string(),time:z.number().optional(),request:nfe,response:ife.optional(),cache:afe.optional(),timings:sfe,serverIPAddress:z.string().optional(),connection:z.string().optional(),comment:z.string().optional(),_resourceType:z.string().optional()}),lfe=z.array(Qg),cfe=z.object({version:z.string().default("1.1"),creator:Gpe.optional(),browser:qpe.optional(),pages:Ype.optional(),entries:lfe,comment:z.string().optional()});z.object({log:cfe});z.record(z.string(),Zg);z.record(z.string(),Qg);function m_(t,e){return {log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(t).sort((o,n)=>new Date(o.startedDateTime).getTime()-new Date(n.startedDateTime).getTime()),entries:Object.values(e).sort((o,n)=>new Date(o.startedDateTime).getTime()-new Date(n.startedDateTime).getTime())}}}var ej=(T=>(T.DisableClickhouseCaches="disable_clickhouse_caches",T.ShowZeroOpacityElements="show_zero_opacity_elements",T.VisualActions="visual_actions",T.RagV2="rag_v2",T.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",T.GlobalLocatorRedirect="global_locator_redirect",T.FakerConstantSeed="faker_constant_seed",T.AutoExpandIframes="auto_expand_iframes",T.MobileNewAiActionStepsUseV3="mobile_new_ai_action_steps_use_v3",T.PerformanceInsights="performance_insights",T.ShowKnowledgeBase="show_knowledge_base",T.AppGraphBackend="app_graph_backend",T.AppGraphUI="app_graph_ui",T.ClassificationUI="classification_ui",T.HealingUI="healing_ui",T.ExploreUI="explore_ui",T.SlackNotifications="slack_notifications",T.SlackNotificationDms="slack_notification_dms",T.ResultClassificationCache="result_classification_cache",T))(ej||{});var Tc=z.union([z.string(),z.number(),z.boolean(),z.null(),z.record(z.string(),z.lazy(()=>Tc)),z.array(z.lazy(()=>Tc))]);var Zu={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},tj=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"];var oj=z.discriminatedUnion("operation",[z.object({operation:z.literal("upsert"),path:z.string().min(1),content:z.string()}),z.object({operation:z.literal("delete"),path:z.string().min(1)})]),mfe=z.object({githubLogin:z.string().optional(),email:z.string().optional()}),pfe=z.object({baseSha:z.string().min(1),headSha:z.string().min(1)}),ffe=z.object({baseBranch:z.string().min(1).max(255),baseCommitSha:z.string().min(1),headBranch:z.string().min(1).max(255).optional(),branchPrefix:z.string().min(1).max(255).optional(),idempotencyKey:z.string().min(1).optional()}),hfe=z.object({commitMessage:z.string().min(1),title:z.string().min(1),body:z.string(),reviewers:z.array(z.string().min(1)).optional(),draft:z.boolean().optional()});ffe.extend(hfe.shape).extend({changes:z.array(oj).min(1),coAuthorRange:pfe.optional(),requestCommitAuthorsAsReviewers:z.boolean().optional()}).superRefine((t,e)=>{t.headBranch||(!t.branchPrefix||!t.idempotencyKey)&&e.addIssue({code:"custom",message:"branchPrefix and idempotencyKey are required when headBranch is omitted",path:["idempotencyKey"]});});var nj=z.object({pullRequestUrl:z.url(),pullRequestNumber:z.number(),headBranch:z.string(),commitSha:z.string(),created:z.boolean(),authors:z.array(mfe).optional()});z.object({branch:z.string().min(1).max(255),commitMessage:z.string().min(1),changes:z.array(oj).min(1)});var rj=z.object({branch:z.string(),commitSha:z.string(),committed:z.boolean()}),ij=z.object({issueNumber:z.number(),htmlUrl:z.url(),headBranch:z.string().min(1),baseBranch:z.string().min(1),latestCommitSha:z.string().min(1),draft:z.boolean().optional(),title:z.string().optional(),body:z.string().optional()});z.object({number:z.number(),htmlUrl:z.url()});var gfe=z.object({path:z.string().min(1),status:z.string().min(1),additions:z.number(),deletions:z.number(),previousPath:z.string().optional(),patch:z.string().optional()}),bfe=z.object({sha:z.string().min(1),author:z.string().optional(),email:z.string().optional(),date:z.string().optional(),message:z.string()}),aj=z.object({mergeBaseSha:z.string().min(1),totalCommits:z.number(),commits:z.array(bfe),files:z.array(gfe)}),sj=z.object({content:z.string().nullable()}),lj=z.object({name:z.string().min(1),protected:z.boolean()}),cj=z.object({iid:z.number(),webUrl:z.url(),sourceBranch:z.string().min(1),targetBranch:z.string().min(1),latestCommitSha:z.string().min(1)}),yfe=z.object({name:z.string(),path:z.string(),body:z.string()}),uj=z.object({template:yfe});function dj(t){let[e,o,...n]=t.split("/");if(!(!e||!o||n.length>0))return {owner:e,repo:o}}function mj(t){let e=dj(t);if(e)return e;throw new It(`Invalid GitHub repository string: ${t}. Expected format "owner/repo".`)}var sp=w__default.object({platformSep:w__default.string(),fullPathSegments:w__default.string().array(),relativePathSegments:w__default.string().array(),relativePath:w__default.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:w__default.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:w__default.coerce.date(),createdAt:w__default.coerce.date()});var Sfe=z.array(sp.extend({id:z.string(),name:z.string(),description:z.string().optional(),labels:z.string().array().optional()})),Tfe=sp.extend({id:z.string(),name:z.string(),description:z.string().optional(),content:UT}),Efe=z.array(Tfe);z.object({tests:Sfe,modules:Efe,labels:z.string().array()});z.string().array();z.object({pathSegments:z.string().array()});rI.merge(xg);z.object({schemaVersion:z.string(),stepLists:vm});xg.partial().merge(bs.pick({id:true}));var WE="1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID.",vfe={name:z.string().min(1).max(255).describe(WE),description:z.string().optional(),baseUrl:z.url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:z.string().optional().describe("For LLM: Do not include the variable unless the user explicitly asks for it and use the environment lookup tool to get the correct one before passing here."),browserType:z.enum(fs).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:ul.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:z.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder. Paths are relative to the project root.")};z.object(vfe);rI.extend(z.object({relativeFilePath:z.string().describe("relative to project root")}).shape);z.object({name:z.string()});z.object({relativeFilePath:z.string()});z.object({name:z.string(),sourceModuleContent:UT});z.object({relativeFilePath:z.string()});z.object({name:z.string(),description:z.string(),enabled:z.boolean(),steps:z.lazy(()=>Ao.array()),testFilePath:z.string().describe("relative to the project root"),folderPath:z.string().optional().describe("user selected folder path")});z.object({name:z.string(),description:z.string(),enabled:z.boolean()}).partial();z.object({folderPath:z.string()});z.object({folderPath:z.string()});z.array(g1);z.object({defaultEnv:z.string().optional().describe("name of the default env, or undefined to unset")});z.object({configFilePath:z.string().describe("full path on disk")});z.string().array();z.object({message:z.string(),newRelativeTestPath:z.string().optional()});var f_=z.object({name:z.string(),absolutePath:z.string(),relativePath:z.string(),pathSegments:z.array(z.string()),isDirectory:z.boolean(),size:z.number(),createdAt:z.coerce.date(),modifiedAt:z.coerce.date(),accessedAt:z.coerce.date()}),pj=z.object({pathSegments:z.array(z.string())});z.object({absolutePath:z.string(),pathSegments:z.array(z.string()),contents:z.array(f_)});var fj=z.object({sourceDirectoryPath:z.string().optional(),value:z.string(),allowedExtensions:z.array(z.string()).optional()}),Cfe=z.object({name:z.string(),value:z.string(),isDirectory:z.boolean()});z.object({suggestions:z.array(Cfe)});var hj=z.object({pathSegments:z.array(z.string())}),gj=z.object({pathSegments:z.array(z.string()),newPathSegments:z.array(z.string())}),bj=z.object({pathSegments:z.array(z.string()),recursive:z.boolean().optional()});z.object({success:z.boolean(),message:z.string(),pathSegments:z.array(z.string()).optional()});z.object({gitBranch:z.string(),fileMtime:z.coerce.date(),gitCommitSha:z.string()});var yj=typeof process<"u"&&true&&true,GE=58889,Sj=24*60*60*1e3;var wfe=z.array(sp.extend({id:z.string(),name:z.string(),description:z.string().optional(),labels:z.string().array().optional()})),Afe=z.array(sp.extend({id:z.string(),name:z.string(),description:z.string().optional(),content:z.discriminatedUnion("platform",[RE,xE])})),Tj={name:z.string().min(1).max(255).describe(WE),description:z.string().optional(),settings:Ur.optional().describe(`Optional mobile test settings to persist on the new test, such as retries, default environment, app selection, emulator configuration, and AI settings. Emulator: prefer remote Limbar emulators\u2014omit settings.emulator or use a Limbar region (e.g. us-west1) unless the user explicitly requests a local machine emulator; only then set settings.emulator.region to "local" and supply local-only fields as needed. For MCP-managed mobile assets, use the channels payload from ${ku} as the source of truth: settings.defaultChannel must exist in channels[platform], and settings.defaultTag must be one of channels[platform][settings.defaultChannel]. settings.defaultTag is optional, if omitted we use the most recently uploaded tag for that channel. Do not set defaultTag to the literal "latest" unless the user explicitly asks for it and "latest" appears in that channel's tag list.`),pathSegments:z.string().array().optional().describe("Path segments for the destination folder. Omit or pass [] to create the test at the project root."),defaultEnv:z.string().optional(),platform:yg.optional().default("ANDROID").describe("For LLM: Never assign this unless the user explicitly asks for iOS. Defaults to Android.")},{defaultEnv:Knt,...Ej}=Tj;var vj=z.object(Tj);z.object({id:z.string(),fileName:z.string(),fullPath:z.string(),relativeFilePath:z.string().describe("relative to project root")});z.discriminatedUnion("platform",[r_.extend({absoluteFilePath:z.string()}),i_.extend({absoluteFilePath:z.string()})]);var Cj=z.object({settings:Ur.optional(),labels:z.array(z.string()).optional()}),Rfe=Cj.extend({platform:z.literal("IOS"),steps:Tn.array().optional(),beforeSteps:Tn.array().optional(),afterSteps:Tn.array().optional()}),xfe=Cj.extend({platform:z.literal("ANDROID"),steps:Sn.array().optional(),beforeSteps:Sn.array().optional(),afterSteps:Sn.array().optional()}),wj=z.discriminatedUnion("platform",[Rfe,xfe]);z.object({message:z.literal("ok")});var Aj=z.object({name:Lu.optional(),description:z.string().min(1).optional(),settings:Ur.optional(),disabled:z.boolean().optional(),labels:z.array(z.string()).optional()});z.object({message:z.string(),newRelativeTestPath:z.string().optional()});var Rj=z.object({tag:z.string().trim().min(1,"tag must be a non-empty string"),channel:z.string().trim().min(1,"channel must be a non-empty string"),filePath:z.string().trim().min(1,"filePath must be a non-empty string")}),xj=z.object({name:Lu});z.object({tests:wfe,modules:Afe,labels:z.string().array()});var Mj=z.object({name:z.string(),description:z.string(),enabled:z.boolean()}).partial(),Pj=z.object({name:z.string(),description:z.string(),enabled:z.boolean(),testFilePath:z.string().describe("relative to the project root"),folderPath:z.string().optional().describe("user selected folder path")}),Mfe=Pj.extend({platform:z.literal("ANDROID"),steps:Sn.array()}),Pfe=Pj.extend({platform:z.literal("IOS"),steps:Tn.array()}),Ij=z.discriminatedUnion("platform",[Mfe,Pfe]),h_=z.object({name:z.string().describe(WE),description:z.string().optional(),enabled:z.boolean().default(true),platform:yg.optional().describe("Platform for a new module. When testPath is provided, the source test platform is used. Defaults to Android when no testPath is provided."),parameters:qg.optional(),moduleInputs:z.record(z.string(),z.string()).optional(),folderPath:z.string().optional(),testPath:z.string().optional(),startIndex:z.number().optional(),endIndex:z.number().optional()});z.object({packages:z.string().array()});var _j=z.object({name:z.string()});z.object({relativeFilePath:z.string()});var Oj=z.object({stepId:z.string(),testId:z.string(),environment:z.string().optional(),parentStepIdChain:z.array(z.string()),value:Yu}),Ife=Oj.extend({platform:z.literal("ANDROID"),steps:Sn.array()}),_fe=Oj.extend({platform:z.literal("IOS"),steps:Tn.array()}),Dj=z.discriminatedUnion("platform",[Ife,_fe]),Nj=z.object({stepId:z.string(),testId:z.string(),environment:z.string().optional(),parentStepIdChain:z.array(z.string())}),Ofe=Nj.extend({platform:z.literal("ANDROID"),steps:Sn.array()}),Dfe=Nj.extend({platform:z.literal("IOS"),steps:Tn.array()}),Lj=z.discriminatedUnion("platform",[Ofe,Dfe]),kj=z.object({platform:z.enum(at),completionType:z.string(),traceIds:z.string().array()}),Fj=z.object({completionType:z.string(),traceIds:z.string().array()});var Bj=(n=>(n.AZURE="AZURE",n.KERNEL="KERNEL",n.BROWSERBASE="BROWSERBASE",n))(Bj||{}),g_=z.enum(Bj);z.object({azureRegion:z.string().optional(),azureWorkspaceId:z.string().optional()});z.object({});var Nfe=z.enum(["us-west-2","us-east-1","eu-central-1","ap-southeast-1"]);z.object({region:Nfe.optional()});var b_=(e=>(e.TEST_REVIEW="TEST_REVIEW",e))(b_||{});var Lfe=z.object({type:z.literal("DESCRIPTION_UPDATE"),thoughts:z.string()}),qE=z.discriminatedUnion("type",[Lfe]),kfe=z.object({testId:z.string(),name:z.string(),orgId:z.string(),runId:z.string(),steps:Ao.array(),purpose:z.enum(b_),details:qE.or(qE.array()).optional()});kfe.pick({name:true,orgId:true});var Ffe=z.object({id:z.string(),name:z.string().nullish(),createdAt:z.string().pipe(z.coerce.date()).or(z.date()),organizationId:z.string(),schemaVersion:z.string(),runId:z.string().nullish(),purpose:z.enum(b_),details:qE.or(qE.array()).optional(),applied:z.boolean().nullish(),appliedAt:z.coerce.date().nullish()}),Uj=Ffe.extend({steps:Ao.array()});var zj=z.enum(["v1","v2"]);var Ufe=z.enum(["element","content","attribute","tag_name","style"]),KE=z.enum(["exists","visible","enabled","editable","focused","contains","equals","starts_with"]);[...KU,...qU].forEach(t=>{if(!KE.options.includes(t.toLowerCase()))throw new Error(`V2CheckConditionSchema is missing option: ${t}`)});var y_={element:{aliasPrefix:"",assertionType:"ELEMENT_EXISTENCE",requiresName:false},content:{aliasPrefix:"Content",assertionType:"ELEMENT_CONTENT",requiresName:false},attribute:{aliasPrefix:"Attribute",assertionType:"ELEMENT_ATTRIBUTE",requiresName:true},tag_name:{aliasPrefix:"Name",assertionType:"ELEMENT_NAME",requiresName:false},style:{aliasPrefix:"Style",assertionType:"ELEMENT_STYLE",requiresName:true}},jj={exists:{positiveAliasSuffix:"Exists",negativeAliasSuffix:"DoesNotExist",elementCondition:"EXISTS",contentOperation:"EXISTS"},visible:{positiveAliasSuffix:"Visible",negativeAliasSuffix:"NotVisible",elementCondition:"VISIBLE"},enabled:{positiveAliasSuffix:"Enabled",negativeAliasSuffix:"NotEnabled",elementCondition:"ENABLED"},editable:{positiveAliasSuffix:"Editable",negativeAliasSuffix:"NotEditable",elementCondition:"EDITABLE"},focused:{positiveAliasSuffix:"Focused",negativeAliasSuffix:"NotFocused",elementCondition:"FOCUSED"},contains:{positiveAliasSuffix:"Contains",negativeAliasSuffix:"DoesNotContain",contentOperation:"CONTAINS"},equals:{positiveAliasSuffix:"Equals",negativeAliasSuffix:"DoesNotEqual",contentOperation:"EQUALS"},starts_with:{positiveAliasSuffix:"StartsWith",negativeAliasSuffix:"DoesNotStartWith",contentOperation:"STARTS_WITH"}},Hj={ELEMENT_EXISTENCE:"element",ELEMENT_CONTENT:"content",ELEMENT_ATTRIBUTE:"attribute",ELEMENT_NAME:"tag_name",ELEMENT_STYLE:"style"};function $j(t){return {alias:S_(t),subject:t.subject,condition:t.condition,negated:t.negated,assertionType:y_[t.subject].assertionType,requiresName:y_[t.subject].requiresName,requiresValue:t.subject!=="element"&&t.condition!=="exists"}}function S_(t){let e=y_[t.subject],o=jj[t.condition];if(!Wj(t.subject,t.condition))throw new Error(`Unsupported element check alias for subject '${t.subject}' and condition '${t.condition}'.`);let n=t.negated?o.negativeAliasSuffix:o.positiveAliasSuffix;return `checkElement${e.aliasPrefix}${n}`}function Wj(t,e){let o=jj[e],n=o.elementCondition,r=o.contentOperation;return t==="element"?n!==void 0:r!==void 0}var zfe=Ufe.options.flatMap(t=>KE.options.flatMap(e=>Wj(t,e)?[$j({subject:t,condition:e,negated:false}),$j({subject:t,condition:e,negated:true})]:[])),Gj=new Map(zfe.map(t=>[t.alias,t]));var $fe=z.enum(ji),Vfe=z.enum(pr);function oi(t){return Gj.get(t)}function Kj(t){let e=Hj[t.type],o=t.type==="ELEMENT_EXISTENCE"?t.condition:t.operation;return S_({subject:e,condition:jfe(o),negated:t.negated})}function Yj(t){return $fe.parse(t.toUpperCase())}function eb(t){return Vfe.parse(t.toUpperCase())}function jfe(t){return KE.parse(t.toLowerCase())}var Ve={saveAs:z.string().optional(),retries:z.number().optional(),skipped:z.boolean().optional(),comment:z.string().optional()};z.object(Ve);var tb=Object.keys(Ve);function Le(t){return z.union([z.strictObject({[t.key]:t.simplified}),z.strictObject({[t.key]:t.detailed})])}function Mo(t){return z.strictObject({[t.key]:t.detailed})}var Xj='Coordinates must be "x, y" pixel values, e.g. "100, 200"',lp=z.union([as,z.string().regex(/^\s*-?\d+(?:\.\d+)?\s*,\s*-?\d+(?:\.\d+)?\s*$/,Xj)],{error:Xj});z.union([z.string(),as]);var Pi={css:z.string().optional(),coords:lp.optional(),x:z.union([z.number(),z.string()]).optional(),y:z.union([z.number(),z.string()]).optional()},E_={on:z.string().optional(),...Pi},Ii={...Ve,useSelector:z.boolean().optional(),force:z.boolean().optional(),DANGEROUS_FORCE_DYNAMIC:z.boolean().optional(),iframe:z.string().optional()},ob={...Ii,offset:lp.optional()};function $r({schema:t,descriptionKey:e,required:o=true}){return t.superRefine((n,r)=>{let a=[e in n?Object.entries(n).find(([s])=>s===e)?.[1]:void 0,"css"in n?n.css:void 0,"coords"in n?n.coords:void 0,"x"in n||"y"in n?true:void 0].filter(s=>s!==void 0).length;o&&a!==1&&r.addIssue({code:"custom",message:`Use exactly one target: ${e}, css, coords, or x/y.`}),!o&&a>1&&r.addIssue({code:"custom",message:`Use at most one target: ${e}, css, coords, or x/y.`}),("x"in n||"y"in n)&&(!("x"in n)||n.x===void 0||!("y"in n)||n.y===void 0)&&r.addIssue({code:"custom",message:"x and y must be provided together."});})}var Hfe=$r({descriptionKey:"on",schema:z.strictObject({...E_,...ob,times:z.int().min(1).optional(),rightClick:z.boolean().optional(),waitForDownload:z.boolean().optional(),delay:z.number().optional(),downloadTimeout:z.number().optional()})}),Wfe=$r({descriptionKey:"on",schema:z.strictObject({...E_,...ob,rightClick:z.boolean().optional(),waitForDownload:z.boolean().optional(),delay:z.number().optional(),downloadTimeout:z.number().optional()})}),Gfe=$r({descriptionKey:"on",schema:z.strictObject({...E_,...ob,times:z.int().min(1).optional(),waitForDownload:z.boolean().optional(),delay:z.number().optional(),downloadTimeout:z.number().optional()})}),Jj=Le({key:"click",simplified:z.string(),detailed:Hfe}),Zj=Le({key:"doubleClick",simplified:z.string(),detailed:Wfe}),Qj=Le({key:"rightClick",simplified:z.string(),detailed:Gfe}),qfe=$r({descriptionKey:"into",required:false,schema:z.strictObject({text:z.string(),into:z.string().optional(),...Pi,...ob,pressEnter:z.boolean().optional(),clear:z.union([z.literal("inputs"),z.literal("always"),z.literal("never"),z.boolean()]).optional(),delay:z.number().optional()})}),e2=Le({key:"type",simplified:z.string(),detailed:qfe}),t2=Mo({key:"select",detailed:$r({descriptionKey:"from",schema:z.strictObject({from:z.string().optional(),...Pi,label:z.string().optional(),value:z.string().optional(),index:z.union([z.string(),z.number()]).optional(),...Ii})}).superRefine((t,e)=>{[t.label,t.value,t.index].filter(n=>n!==void 0).length!==1&&e.addIssue({code:"custom",message:"select requires exactly one of label, value, or index"});})}),o2=Le({key:"hover",simplified:z.string(),detailed:$r({descriptionKey:"on",schema:z.strictObject({on:z.string().optional(),...Pi,...ob})})}),n2=Mo({key:"blur",detailed:$r({descriptionKey:"on",required:false,schema:z.strictObject({on:z.string().optional(),...Pi,...Ii})})}),r2=Le({key:"focus",simplified:z.string(),detailed:$r({descriptionKey:"on",schema:z.strictObject({on:z.string().optional(),...Pi,...Ii})})}),i2=Mo({key:"dragAndDrop",detailed:z.strictObject({from:z.string().optional(),to:z.string().optional(),fromCss:z.string().optional(),toCss:z.string().optional(),fromCoords:lp.optional(),toCoords:lp.optional(),fromX:z.union([z.number(),z.string()]).optional(),fromY:z.union([z.number(),z.string()]).optional(),toX:z.union([z.number(),z.string()]).optional(),toY:z.union([z.number(),z.string()]).optional(),steps:z.number().optional(),hover:z.number().optional(),...Ii}).superRefine((t,e)=>{let o=[t.from,t.fromCss,t.fromCoords,t.fromX!==void 0||t.fromY!==void 0?true:void 0].filter(r=>r!==void 0).length,n=[t.to,t.toCss,t.toCoords,t.toX!==void 0||t.toY!==void 0?true:void 0].filter(r=>r!==void 0).length;o!==1&&e.addIssue({code:"custom",message:"Use exactly one from target."}),n!==1&&e.addIssue({code:"custom",message:"Use exactly one to target."}),(t.fromX!==void 0||t.fromY!==void 0)&&(t.fromX===void 0||t.fromY===void 0)&&e.addIssue({code:"custom",message:"fromX and fromY must be provided together."}),(t.toX!==void 0||t.toY!==void 0)&&(t.toX===void 0||t.toY===void 0)&&e.addIssue({code:"custom",message:"toX and toY must be provided together."});})}),a2=z.union([z.strictObject({mouseDrag:lp}),z.strictObject({mouseDrag:$r({descriptionKey:"from",required:false,schema:z.strictObject({from:z.string().optional(),...Pi,delta:lp,steps:z.number().optional(),...Ii})})})]),s2=Le({key:"press",simplified:z.string(),detailed:z.strictObject({key:z.string(),repeat:z.number().optional(),delay:z.number().optional(),convertMeta:z.boolean().optional(),...Ve})}),l2=Le({key:"keyDown",simplified:z.string(),detailed:z.strictObject({key:z.string(),convertMeta:z.boolean().optional(),...Ve})}),c2=Le({key:"keyUp",simplified:z.string(),detailed:z.strictObject({key:z.string(),convertMeta:z.boolean().optional(),...Ve})}),u2=Le({key:"navigate",simplified:z.string(),detailed:z.strictObject({url:z.string(),timeout:z.number().optional(),...Ve})}),d2=Le({key:"newTab",simplified:z.string(),detailed:z.strictObject({url:z.string(),timeout:z.number().optional(),...Ve})}),m2=Le({key:"switchTab",simplified:z.union([z.number(),z.string()]),detailed:z.strictObject({substring:z.string().optional(),regex:z.string().optional(),index:z.union([z.string(),z.number()]).optional(),timeout:z.number().optional(),...Ve}).superRefine((t,e)=>{[t.substring,t.regex,t.index].filter(n=>n!==void 0).length!==1&&e.addIssue({code:"custom",message:"switchTab requires exactly one of substring, regex, or index"});})}),p2=Mo({key:"closeTab",detailed:z.strictObject({substring:z.string().optional(),regex:z.string().optional(),index:z.union([z.string(),z.number()]).optional(),timeout:z.number().optional(),...Ve}).superRefine((t,e)=>{[t.substring,t.regex,t.index].filter(n=>n!==void 0).length<=1||e.addIssue({code:"custom",message:"closeTab accepts at most one of substring, regex, or index"});})}),f2=Mo({key:"goBack",detailed:z.strictObject(Ve)}),h2=Mo({key:"goForward",detailed:z.strictObject(Ve)}),g2=Mo({key:"refresh",detailed:z.strictObject({timeout:z.number().optional(),...Ve})}),b2=z.enum(["goBack","goForward","refresh","paste","authSave","offline","online","blur","visualDiff","captcha","closeTab"]),y2=Le({key:"scrollUp",simplified:z.number().nonnegative(),detailed:$r({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...Pi,...Ii})})}),S2=Le({key:"scrollDown",simplified:z.number().nonnegative(),detailed:$r({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...Pi,...Ii})})}),T2=Le({key:"scrollLeft",simplified:z.number().nonnegative(),detailed:$r({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...Pi,...Ii})})}),E2=Le({key:"scrollRight",simplified:z.number().nonnegative(),detailed:$r({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...Pi,...Ii})})}),v2=Le({key:"wait",simplified:z.number(),detailed:z.strictObject({ms:z.number(),...Ve})}),Kfe=Le({key:"assert",simplified:z.string(),detailed:z.strictObject({that:z.string(),timeout:z.number().optional(),DANGEROUS_FORCE_DYNAMIC:z.boolean().optional(),iframe:z.string().optional(),source:z.string().optional(),...Ve})}),Yfe=Le({key:"assertVisually",simplified:z.string(),detailed:z.strictObject({that:z.string(),timeout:z.number().optional(),DANGEROUS_FORCE_DYNAMIC:z.boolean().optional(),iframe:z.string().optional(),source:z.string().optional(),...Ve})}),YE=Kfe,XE=Yfe,C2=Le({key:"checkPageContains",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),iframe:z.string().optional(),...Ve})}),w2=Le({key:"checkPageDoesNotContain",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),iframe:z.string().optional(),...Ve})}),v_=z.union([C2,w2]),Xfe=z.record(z.string(),z.unknown().optional()),JE=Xfe.superRefine((t,e)=>{let o=Object.keys(t),n=o[0];if(o.length!==1||n===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}let r=oi(n);if(r===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}if(typeof t[r.alias]=="string")return;let i=$r({descriptionKey:"element",schema:z.looseObject({element:z.string().optional(),...Pi,...Ii,timeout:z.number().optional(),name:z.string().optional(),value:z.string().optional()})}).safeParse(t[r.alias]);if(!i.success){e.addIssue({code:"custom",message:`element check alias '${r.alias}' must be a string target or detailed object`,path:[r.alias]});return}r.requiresName&&i.data.name===void 0&&e.addIssue({code:"custom",message:`element check alias '${r.alias}' requires a name`,path:[r.alias,"name"]}),r.requiresValue&&i.data.value===void 0&&e.addIssue({code:"custom",message:`element check alias '${r.alias}' requires a value`,path:[r.alias,"value"]});}),A2=Le({key:"extract",simplified:z.string(),detailed:z.strictObject({goal:z.string(),schema:Tc.optional(),DANGEROUS_FORCE_DYNAMIC:z.boolean().optional(),iframe:z.string().optional(),...Ve})}),R2=Le({key:"cookie",simplified:z.string(),detailed:z.strictObject({value:z.string(),...Ve})}),x2=Mo({key:"localStorage",detailed:z.strictObject({key:z.string(),value:z.string(),...Ve})}),M2=Le({key:"request",simplified:z.string(),detailed:z.strictObject({url:z.string(),method:Ma.optional(),headers:z.record(z.string(),z.string()).optional(),params:z.record(z.string(),z.string()).optional(),body:Tc.optional(),contentType:z.enum(cs).optional(),timeout:z.number().optional(),...Ve})}),P2=Mo({key:"graphqlRequest",detailed:z.strictObject({url:z.string(),query:z.string(),variables:Tc.optional(),headers:z.record(z.string(),z.string()).optional(),timeout:z.number().optional(),...Ve})}),ZE=Le({key:"javascript",simplified:z.string(),detailed:z.strictObject({code:z.string(),environment:z.enum(["node","browser","NODE","BROWSER"]).optional(),fragment:z.boolean().optional(),timeout:z.number().optional(),...Ve})}),cp={substring:z.string().optional(),glob:z.string().optional(),regex:z.string().optional(),domain:z.string().optional()};function Jfe(t){return [t.substring,t.glob,t.regex,t.domain].filter(e=>e!==void 0).length}function up(t){let e=Jfe(t.payload);if(t.required&&e!==1||!t.required&&e>1){t.ctx.addIssue({code:"custom",message:t.required?"requires exactly one of substring, glob, regex, or domain":"requires at most one of substring, glob, regex, or domain"});return}!t.required&&e===0&&t.payload.method&&t.ctx.addIssue({code:"custom",message:"method requires a URL matcher"});}var I2=Mo({key:"header",detailed:z.strictObject({name:z.string(),value:z.string(),...cp,method:z.string().optional(),...Ve}).superRefine((t,e)=>{up({payload:t,ctx:e,required:false});})}),_2=Mo({key:"mock",detailed:z.strictObject({...cp,method:z.string().optional(),responseGenerator:z.string(),fetchOriginalResponse:z.boolean().optional(),key:z.string().optional(),...Ve}).superRefine((t,e)=>{up({payload:t,ctx:e,required:true});})}),O2=Le({key:"removeRouteMock",simplified:z.string(),detailed:z.strictObject({key:z.string().optional(),...Ve})}),D2=Le({key:"waitForUrl",simplified:z.string(),detailed:z.strictObject({...cp,caseInsensitive:z.boolean().optional(),timeout:z.number().optional(),...Ve}).superRefine((t,e)=>{up({payload:t,ctx:e,required:true});})}),N2=Le({key:"waitForUrlNotToMatch",simplified:z.string(),detailed:z.strictObject({...cp,caseInsensitive:z.boolean().optional(),timeout:z.number().optional(),...Ve}).superRefine((t,e)=>{up({payload:t,ctx:e,required:true});})}),Zfe=z.union([D2,N2]),L2=Le({key:"dialog",simplified:z.enum(["ACCEPT","DISMISS"]),detailed:z.strictObject({action:z.enum(["ACCEPT","DISMISS"]),...Ve})}),k2=Le({key:"fileUpload",simplified:z.string(),detailed:z.strictObject({path:z.string(),name:z.string().optional(),...Ve})}),F2=Le({key:"copy",simplified:z.union([z.string(),z.boolean(),z.null()]),detailed:z.strictObject({value:z.union([z.string(),z.boolean(),z.null()]),...Ve})}),B2=Mo({key:"paste",detailed:z.strictObject(Ve)}),U2=Mo({key:"captcha",detailed:z.strictObject({...Ii})}),Qfe=z.strictObject({data:z.union([z.string(),rs]),width:z.number(),height:z.number()}),z2=Le({key:"visualDiff",simplified:z.string(),detailed:$r({descriptionKey:"on",required:false,schema:z.strictObject({on:z.string().optional(),...Pi,threshold:z.number().optional(),screenshot:Qfe.optional(),...Ii})})}),$2=Mo({key:"offline",detailed:z.strictObject(Ve)}),V2=Mo({key:"online",detailed:z.strictObject(Ve)}),j2=Mo({key:"registerRequestListener",detailed:z.strictObject({...cp,key:z.string(),method:z.string().optional(),...Ve}).superRefine((t,e)=>{up({payload:t,ctx:e,required:true});})}),H2=Le({key:"awaitListener",simplified:z.string(),detailed:z.strictObject({key:z.string(),timeout:z.number().optional(),...Ve})}),W2=Mo({key:"recordRequests",detailed:z.strictObject({...cp,key:z.string(),method:z.string().optional(),...Ve}).superRefine((t,e)=>{up({payload:t,ctx:e,required:true});})}),G2=Le({key:"getRecordedRequests",simplified:z.string(),detailed:z.strictObject({key:z.string(),...Ve})}),q2=Le({key:"authLoad",simplified:z.string(),detailed:z.strictObject({path:z.string(),...Ve})}),K2=Le({key:"authSave",simplified:z.string(),detailed:z.strictObject({path:z.string().optional(),...Ve})});z.union([Jj,Zj,Qj,m2,p2,e2,t2,o2,n2,r2,i2,a2,s2,l2,c2,u2,d2,f2,h2,g2,y2,S2,T2,E2,v2,YE,XE,v_,A2,R2,x2,M2,P2,ZE,I2,_2,O2,Zfe,L2,k2,F2,B2,U2,z2,$2,V2,j2,H2,W2,G2,q2,K2,JE]);var Y2=new Map([["click",Jj],["doubleClick",Zj],["rightClick",Qj],["switchTab",m2],["closeTab",p2],["type",e2],["select",t2],["hover",o2],["blur",n2],["focus",r2],["dragAndDrop",i2],["mouseDrag",a2],["press",s2],["keyDown",l2],["keyUp",c2],["navigate",u2],["newTab",d2],["goBack",f2],["goForward",h2],["refresh",g2],["scrollUp",y2],["scrollDown",S2],["scrollLeft",T2],["scrollRight",E2],["wait",v2],["assert",YE],["assertVisually",XE],["checkPageContains",C2],["checkPageDoesNotContain",w2],["extract",A2],["cookie",R2],["localStorage",x2],["request",M2],["graphqlRequest",P2],["javascript",ZE],["header",I2],["mock",_2],["removeRouteMock",O2],["waitForUrl",D2],["waitForUrlNotToMatch",N2],["dialog",L2],["fileUpload",k2],["copy",F2],["paste",B2],["captcha",U2],["visualDiff",z2],["offline",$2],["online",V2],["registerRequestListener",j2],["awaitListener",H2],["recordRequests",W2],["getRecordedRequests",G2],["authLoad",q2],["authSave",K2]]);Object.freeze([...Y2.keys()]);var X2=z.custom().superRefine((t,e)=>{if(typeof t!="object"||t===null){e.addIssue({code:"custom",message:"Steps must be objects with exactly one action key."});return}let o=Object.keys(t),n=o[0];if(o.length!==1||n===void 0){e.addIssue({code:"custom",message:"Steps must have exactly one action key."});return}let r=Y2.get(n)??(oi(n)?JE:void 0);if(!r){e.addIssue({code:"custom",message:`Unsupported step type '${n}'.`});return}let i=r.safeParse(t);if(!i.success){let a=ehe(i.error.issues,n);a.length>0&&J2(e,a);}});function ehe(t,e){return the(t).filter(o=>!ohe(o,e))}function J2(t,e){for(let o of e){if(o.code==="invalid_union"){J2(t,C_(o));continue}t.addIssue({...o});}}function the(t){let e=[];for(let o of t){if(o.code==="invalid_union"){e.push(...C_(o));continue}e.push(o);}return e}function ohe(t,e){return t.code!=="unrecognized_keys"?false:e===void 0?t.path.length===0:t.path.length===1&&t.path[0]===e}function C_(t){let e=t.errors[0]??[],o=T_(e);for(let n of t.errors.slice(1)){let r=T_(n);r>o&&(e=n,o=r);}return e}function T_(t){return t.reduce((e,o)=>{let n=o.code==="invalid_union"?T_(C_(o)):0;return e+o.path.length+n},0)}var Z2=z.strictObject({string:z.string()}),nhe=z.strictObject({javascript:z.string()}),Q2=z.union([Z2,nhe]),rhe=z.union([z.strictObject({name:z.string(),required:z.boolean().optional(),default:Z2.optional()}),z.strictObject({name:z.string(),required:z.boolean().optional(),defaultValue:z.string()})]),eH=rhe.array(),ihe=z.strictObject({name:z.string(),default:Q2.optional(),enum:z.array(z.string()).optional()}),tH=ihe.array(),nb=z.union([Q2,z.string()]),oH=z.record(z.string(),nb);var ahe=z.preprocess(t=>typeof t=="number"?String(t):t,pP),she=z.looseObject({goal:z.string(),version:ahe.optional(),...Ve}),lhe=z.union([z.strictObject({act:z.string()}),z.strictObject({act:she})]),che=z.looseObject({path:z.string(),inputs:z.record(z.string(),nb).optional(),...Ve}),uhe=z.union([z.strictObject({module:z.string()}),z.strictObject({module:che})]),nH=z.union([YE,XE,v_,ZE,JE]),dhe=new Set(["then",...tb]),mhe=z.looseObject({then:z.lazy(()=>ka.array()),...Ve}).superRefine((t,e)=>{Object.entries(t).filter(([n,r])=>!dhe.has(n)&&nH.safeParse({[n]:r}).success).length!==1&&e.addIssue({code:"custom",message:"Conditional steps require exactly one assertion condition at the top level."});}),phe=z.strictObject({if:mhe}),fhe=new Set(["do","maxIterations",...tb]),hhe=z.looseObject({do:z.lazy(()=>ka.array()),maxIterations:z.number().int().positive().optional(),...Ve}).superRefine((t,e)=>{let o=Object.entries(t).filter(([n,r])=>!fhe.has(n)&&nH.safeParse({[n]:r}).success).length;if(o>1){e.addIssue({code:"custom",message:"While loops accept at most one condition at the top level."});return}o===0&&t.maxIterations===void 0&&e.addIssue({code:"custom",message:"While loops require a condition or a maximum number of iterations."});}),ghe=z.strictObject({while:hhe}),ka=z.lazy(()=>z.union([b2,lhe,uhe,phe,ghe,X2]));z.object({before:ka.array().optional(),steps:ka.array(),after:ka.array().optional()});var bhe=z.union([ul,z.string().refine(t=>{let e=t.match(/^\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*$/);if(!e)return false;let[,o,n]=e;return ul.safeParse({width:Number(o),height:Number(n)}).success},"Viewport must be two numeric values, e.g. 1920, 1080")]),yhe=Uu.omit({viewport:true}).extend({viewport:bhe.optional()}),w_=z.object({id:cn,version:z.string().optional(),url:jT.optional(),description:z.string().optional(),retries:z.number().optional(),defaultEnv:z.string().optional(),parameters:eH.optional(),outputs:mE.optional(),disabled:z.boolean().optional(),labels:z.array(z.string()).optional()}).extend(yhe.shape);z.looseObject({fileType:z.literal(Pe.TEST_V2)}).extend(w_.shape).extend({before:ka.array().optional(),steps:ka.array(),after:ka.array().optional()});var She=z.array(z.string()),The=z.union([z.string(),z.record(z.string(),z.unknown().optional())]),QE=ps.omit({moduleId:true,name:true,parameters:true,defaultParameters:true,parameterEnums:true}).extend({id:cn,version:z.string().optional(),name:z.string().optional(),parameters:z.union([tH,She]).optional(),defaultParameters:z.record(z.string(),z.string()).optional(),parameterEnums:z.record(z.string(),z.array(z.string())).optional()});z.looseObject(QE.extend({fileType:z.literal(Pe.MODULE_V2),steps:The.array().optional()}).shape).superRefine(rH);z.looseObject(QE.extend({fileType:z.literal(Pe.MODULE_V2),steps:ka.array().optional()}).shape).superRefine(rH);function rH(t,e){"main"in t&&e.addIssue({code:"custom",message:"v2 modules must use steps, not main",path:["main"]});}var ev=(n=>(n.WEB="web",n.ANDROID="android",n.IOS="ios",n))(ev||{}),A_=z.nativeEnum(ev);var iH=z.object({entity_type:z.string(),value:z.string(),schema_version:z.string().optional()}),aH=Qh(iH),sH=iH.extend({cache_key:z.string()});function rb({entityType:t,entityId:e}){return `${t}:${e}`}var Ehe=/^\s*-?\d+(?:\.\d+)?\s*%\s*,\s*-?\d+(?:\.\d+)?\s*%\s*$/,ed=z.string();function mH(t){return Ehe.test(t)}var lH='Coordinates must be "x, y" pixel values, e.g. "100, 200"',pH=z.union([as,z.string().regex(/^\s*-?\d+(?:\.\d+)?\s*,\s*-?\d+(?:\.\d+)?\s*$/,lH)],{error:lH}),cH='Percent must be a number or a percent string, e.g. 90 or "90%"',fH=z.union([z.number(),z.string().regex(/^-?\d+(?:\.\d+)?%$/,cH)],{error:cH}).transform(t=>typeof t=="number"?t:Number(t.slice(0,-1))).pipe(z.number().min(0,{message:"Percent must be >= 0"}).max(100,{message:"Percent must be <= 100"})),vhe=z.strictObject({x:z.number(),y:z.number(),delta:z.number()}),hH=z.union([z.string(),vhe]),tv={screen:"SCREEN",app:"OPEN_APP",webview:"OPEN_WEBVIEW"},uo={...Ve,DANGEROUS_FORCE_DYNAMIC:z.boolean().optional()},Che=["home","power","back","app_switcher","search","volume_up","volume_down","volume_mute"],gH={HOME:"home",POWER:"power",BACK:"back",APP_SWITCHER:"app_switcher",SEARCH:"search",VOLUME_UP:"volume_up",VOLUME_DOWN:"volume_down",VOLUME_MUTE:"volume_mute"},R_={home:"HOME",power:"POWER",back:"BACK",app_switcher:"APP_SWITCHER",search:"SEARCH",volume_up:"VOLUME_UP",volume_down:"VOLUME_DOWN",volume_mute:"VOLUME_MUTE"},whe=["enter","backspace","close_keyboard"],bH={ENTER:"enter",BACKSPACE:"backspace",CLOSE_KEYBOARD:"close_keyboard"},x_={enter:"ENTER",backspace:"BACKSPACE",close_keyboard:"CLOSE_KEYBOARD"},uH=["airplane_mode","data","wifi","location"],yH={AIRPLANE_MODE:"airplane_mode",DATA:"data",WIFI:"wifi",LOCATION:"location"},M_={airplane_mode:"AIRPLANE_MODE",data:"DATA",wifi:"WIFI",location:"LOCATION"},dH=["portrait","landscape"],SH={PORTRAIT:"portrait",LANDSCAPE:"landscape"},P_={portrait:"PORTRAIT",landscape:"LANDSCAPE"},Ahe=z.strictObject({on:ed.optional(),longPress:z.boolean().optional(),longPressDuration:z.number().optional(),iterations:z.number().optional(),tapDelay:z.number().optional(),offset:pH.optional(),...uo}),TH=Le({key:"tap",simplified:ed,detailed:Ahe}),Rhe=z.strictObject({text:z.string(),into:ed.optional(),clearContent:z.boolean().optional(),forceClearContent:z.boolean().optional(),delay:z.number().optional(),replaceStrategy:z.nativeEnum(wi).optional(),keyPressDelay:z.number().optional(),...uo}),EH=Le({key:"type",simplified:z.string(),detailed:Rhe}),vH=z.enum(Che),xhe=z.strictObject({key:vH,longPress:z.boolean().optional(),...uo}),CH=Le({key:"press",simplified:vH,detailed:xhe}),wH=z.enum(whe),Mhe=z.strictObject({key:wH,repeat:z.number().optional(),delay:z.number().optional(),keyPressDelay:z.number().optional(),...uo}),AH=Le({key:"pressKey",simplified:wH,detailed:Mhe}),Phe=z.strictObject({package:z.string(),activity:z.string().optional(),intentExtras:z.string().optional(),...uo}),RH=Le({key:"openApp",simplified:z.string(),detailed:Phe}),xH=Mo({key:"killApp",detailed:z.strictObject(uo)}),MH=Mo({key:"openNotifications",detailed:z.strictObject(uo)}),PH=z.enum(["up","down","left","right"]),Ihe=z.strictObject({direction:PH,in:hH.optional(),viewportPercent:fH.optional(),duration:z.number().optional(),offset:pH.optional(),...uo}),IH=Le({key:"swipe",simplified:PH,detailed:Ihe}),_he=z.enum(["up","down"]),Ohe=z.strictObject({on:ed,direction:_he.optional(),in:hH.optional(),scrollStepPercent:fH.optional(),maxScrollAttempts:z.number().optional(),...uo}),_H=Le({key:"scrollTo",simplified:z.string(),detailed:Ohe}),I_=Le({key:"assert",simplified:z.string(),detailed:z.strictObject({that:z.string(),timeout:z.number().optional(),...uo})}),__=Le({key:"assertVisually",simplified:z.string(),detailed:z.strictObject({that:z.string(),timeout:z.number().optional(),...uo})}),OH=Le({key:"extract",simplified:z.string(),detailed:z.strictObject({goal:z.string(),schema:Tc.optional(),...uo})}),DH=Le({key:"checkScreenContains",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),...uo})}),NH=Le({key:"checkScreenDoesNotContain",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),...uo})}),LH=z.union([DH,NH]),Dhe=z.record(z.string(),z.unknown().optional()),O_=Dhe.superRefine((t,e)=>{let o=Object.keys(t),n=o[0];if(o.length!==1||n===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}let r=oi(n);if(r===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}if(typeof t[r.alias]=="string")return;let i=z.looseObject({on:ed.optional(),timeout:z.number().optional(),name:z.string().optional(),value:z.string().optional(),...uo}).safeParse(t[r.alias]);if(!i.success){e.addIssue({code:"custom",message:`element check alias '${r.alias}' must be a string target or detailed object`,path:[r.alias]});return}i.data.on===void 0&&e.addIssue({code:"custom",message:`element check alias '${r.alias}' requires a target via 'on'`,path:[r.alias,"on"]}),r.requiresName&&i.data.name===void 0&&e.addIssue({code:"custom",message:`element check alias '${r.alias}' requires a name`,path:[r.alias,"name"]}),r.requiresValue&&i.data.value===void 0&&e.addIssue({code:"custom",message:`element check alias '${r.alias}' requires a value`,path:[r.alias,"value"]});}),Nhe=z.strictObject({from:ed,to:ed,hoverDuration:z.number().optional(),dragDuration:z.number().optional(),...uo}),kH=Mo({key:"dragAndDrop",detailed:Nhe}),D_=Le({key:"javascript",simplified:z.string(),detailed:z.strictObject({code:z.string(),timeout:z.number().optional(),...uo})}),FH=Le({key:"request",simplified:z.string(),detailed:z.strictObject({url:z.string(),method:Ma.optional(),headers:z.record(z.string(),z.string()).optional(),params:z.record(z.string(),z.string()).optional(),body:z.string().optional(),bodyType:z.nativeEnum(cs).optional(),timeout:z.number().optional(),...uo})}),BH=Le({key:"wait",simplified:z.number(),detailed:z.strictObject({ms:z.number(),...uo})}),UH=Le({key:"visualDiff",simplified:z.string(),detailed:z.strictObject({path:z.string(),threshold:z.number().min(0).max(1).optional(),...uo})}),zH=Mo({key:"addFile",detailed:z.strictObject({path:z.string(),location:z.string(),...uo})}),$H=Le({key:"installApp",simplified:z.string(),detailed:z.strictObject({path:z.string(),...uo})}),VH=Le({key:"uninstallApp",simplified:z.string(),detailed:z.strictObject({package:z.string(),...uo})}),jH=Le({key:"toggleSettings",simplified:z.enum(uH),detailed:z.strictObject({setting:z.enum(uH),...uo})}),HH=Le({key:"rotate",simplified:z.enum(dH),detailed:z.strictObject({orientation:z.enum(dH),...uo})}),WH=Le({key:"adb",simplified:z.string(),detailed:z.strictObject({command:z.string(),args:z.string().optional(),...uo})}),GH=Mo({key:"appium",detailed:z.strictObject({script:z.string(),args:z.string().optional(),...uo})}),qH=Mo({key:"debugState",detailed:z.strictObject(uo)}),ov=z.enum(["killApp","openNotifications","debugState"]);z.union([TH,EH,CH,AH,RH,xH,MH,IH,_H,I_,__,OH,LH,kH,D_,FH,BH,UH,zH,$H,VH,jH,HH,WH,GH,qH,O_]);var KH=new Map([["tap",TH],["type",EH],["press",CH],["pressKey",AH],["openApp",RH],["killApp",xH],["openNotifications",MH],["swipe",IH],["scrollTo",_H],["assert",I_],["assertVisually",__],["extract",OH],["checkScreenContains",DH],["checkScreenDoesNotContain",NH],["dragAndDrop",kH],["javascript",D_],["request",FH],["wait",BH],["visualDiff",UH],["addFile",zH],["installApp",$H],["uninstallApp",VH],["toggleSettings",jH],["rotate",HH],["adb",WH],["appium",GH],["debugState",qH]]);Object.freeze([...KH.keys()]);var YH=z.custom().superRefine((t,e)=>{if(typeof t!="object"||t===null){e.addIssue({code:"custom",message:"v2 mobile commands must be objects with exactly one action key."});return}let o=Object.keys(t),n=o[0];if(o.length!==1||n===void 0){e.addIssue({code:"custom",message:"v2 mobile commands must have exactly one action key."});return}let r=KH.get(n)??(oi(n)?O_:void 0);if(!r){e.addIssue({code:"custom",message:`Unsupported v2 mobile command '${n}'.`});return}let i=r.safeParse(t);if(!i.success)for(let a of i.error.issues)e.addIssue({...a});}),ib=z.union([I_,__,LH,D_,O_]);var Lhe=z.preprocess(t=>typeof t=="number"?String(t):t,DI),khe=z.looseObject({goal:z.string(),version:Lhe.optional(),precondition:z.string().optional(),postcondition:z.string().optional(),...Ve}),Fhe=z.union([z.strictObject({act:z.string()}),z.strictObject({act:khe})]),Bhe=z.looseObject({path:z.string(),inputs:z.record(z.string(),nb).optional(),...Ve}),Uhe=z.union([z.strictObject({module:z.string()}),z.strictObject({module:Bhe})]),zhe=new Set(["then",...tb]),$he=z.looseObject({then:z.lazy(()=>Rs.array()),...Ve}).superRefine((t,e)=>{if("else"in t){e.addIssue({code:"custom",message:"v2 mobile conditionals do not support 'else'. Use a separate step instead.",path:["else"]});return}Object.entries(t).filter(([n,r])=>!zhe.has(n)&&ib.safeParse({[n]:r}).success).length!==1&&e.addIssue({code:"custom",message:"v2 mobile conditional steps require exactly one assertion condition at the top level."});}),Vhe=z.strictObject({if:$he}),Rs=z.lazy(()=>z.union([ov,Fhe,Uhe,Vhe,YH]));z.object({before:Rs.array().optional(),steps:Rs.array(),after:Rs.array().optional()});var N_=["android","ios"],jhe=z.literal("android"),Hhe=z.literal("ios");z.enum(N_);function mp(t){return t==="android"?"ANDROID":"IOS"}function L_(t){return t==="ANDROID"?"android":"ios"}function nv(t){if(typeof t!="object"||t===null)return t;let e=t;if(typeof e.platform!="string")return t;let o=e.platform.toLowerCase();return o===e.platform?t:{...e,platform:o}}var XH=ep.omit({schemaVersion:true,settings:true,platform:true}).extend({version:z.string().optional(),platform:jhe,...Ur.shape}),JH=tp.omit({schemaVersion:true,settings:true,platform:true}).extend({version:z.string().optional(),platform:Hhe,...Ur.shape}),Whe=z.discriminatedUnion("platform",[XH,JH]),ZH=z.preprocess(nv,Whe),QH={before:Rs.array().optional(),steps:Rs.array(),after:Rs.array().optional()},eW=z.looseObject({fileType:z.literal(Pe.MOBILE_TEST_V2)}).extend(XH.shape).extend(QH);z.preprocess(nv,eW);var tW=z.looseObject({fileType:z.literal(Pe.MOBILE_TEST_V2)}).extend(JH.shape).extend(QH);z.preprocess(nv,tW);var Ghe=z.discriminatedUnion("platform",[eW,tW]),vc=z.preprocess(nv,Ghe);var qhe=z.preprocess(t=>typeof t=="string"?t.toLowerCase():t,z.enum(N_).optional().default("android")),rv=Wm.omit({moduleId:true,name:true,schemaVersion:true,platform:true}).extend({id:cn,name:z.string().optional(),version:z.string().optional(),platform:qhe});z.looseObject(rv.extend({fileType:z.literal(Pe.MOBILE_MODULE_V2),steps:z.array(z.record(z.string(),z.unknown().optional())).optional()}).shape);var iv=z.looseObject(rv.extend({fileType:z.literal(Pe.MOBILE_MODULE_V2),steps:Rs.array().optional()}).shape);function oW(t){return t.steps??[]}var av="x-momentic-cli-version",rW="x-momentic-client-mode",sv="x-momentic-runner",iW="x-momentic-cli-type",aW="x-momentic-logger-tags",Khe="x-momentic-main-branch-name",Yhe="x-momentic-branch-name",Xhe="x-momentic-commit-timestamp",Jhe="x-momentic-last-commit-on-main",Zhe="x-momentic-last-commit-on-main-timestamp",Qhe="x-momentic-merged-branch-name",sW="x-momentic-session-id",lW="x-momentic-parent-trace-id";w.object({error:w.boolean(),reason:w.string(),message:w.string()});Nn.merge(nI);var cW=RT;Nn.merge(nI);Nn.merge(r$).extend({useConsensus:w.boolean().optional(),attemptNumber:w.number().optional()});var k_=GU;Nn.merge(i$);var uW=e1;Nn.merge(e$);var dW=YT;Nn.merge(UU);Nn.merge(t$);var mW=Jz;Nn.merge(o$);Nn.merge(n$);Nn.merge(c$);Nn.merge(u$);w.object({testPaths:w.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:w.string().optional(),all:w.boolean().optional(),urlOverride:w.string().optional(),customHeaders:w.record(w.string(),w.string()).optional(),testInputMatrix:w.record(w.string(),w.string()).array().optional()});var pW=w.object({queuedTests:w.unknown().optional().array(),runIds:w.guid().array(),runGroupId:w.string().optional()});w.string().array();w.union([w.object({paths:w.string().array().describe("Export specific test paths or folder paths (e.g. todo-test, auth/onboarding)"),all:w.boolean().describe("run all tests").optional()}),w.object({path:w.string().describe("deprecated; present for backcompat")})]);var ege=w.object({tests:w.record(w.string().describe("Test name (keys correspond to entries in `tests`)"),w.string().describe("Slash-separated folder name path that the test lives in (e.g. 'Auth/Login'). Top-level entities are omitted.")),modules:w.record(w.string().describe("Module name (keys correspond to entries in `modules`)"),w.string().describe("Slash-separated folder name path that the module lives in."))}),fW=w.object({tests:w.record(w.string().describe("Test name"),w.string().describe("Test YAML")),modules:w.record(w.string().describe("Module name"),w.string().describe("Module YAML")),folderPaths:ege.optional().describe("Optional map from exported entity name to its slash-separated cloud folder path. Used by the CLI to recreate folder structure on disk.")}),tge=w.object({test:w.string().describe("test YAML"),modules:w.record(w.string().describe("moduleId"),w.string().describe("module YAML"))});tge.array();w.object({testId:w.string(),schemaVersion:w.string()}).merge(Nu);function td(t){let{gitMainBranch:e,gitBranchName:o,gitCommitTimestamp:n,lastCommitOnMainSha:r,lastCommitOnMainTimestamp:i}=t,a={};return e&&(a[Khe]=encodeURIComponent(e)),o&&(a[Yhe]=encodeURIComponent(o)),n&&(a[Xhe]=n.toISOString()),r&&(a[Jhe]=encodeURIComponent(r)),i&&(a[Zhe]=i.toISOString()),t.mergedGitBranchName&&(a[Qhe]=encodeURIComponent(t.mergedGitBranchName)),a}w.object({entries:w.array(Dz)});w.object({platform:A_.optional(),entries:w.array(aH)});w.object({testId:w.string(),environment:w.string().optional(),platform:A_.optional()});w.object({testId:w.string(),key:w.string(),environment:w.string().optional()});function hW(t){return w.record(w.string(),w.unknown().optional()).transform(e=>{let o={};for(let[n,r]of Object.entries(e)){let i=t.safeParse(r);i.success&&(o[n]=i.data);}return o})}var gW=hW(Nz),bW=sH.array();function nW(t){return hW(eg(t))}var yW={ANDROID:t=>nW(DE).parse(t),IOS:t=>nW(NE).parse(t)},oge=w.object({id:w.string(),completionType:w.string(),description:w.string().optional(),thoughts:w.string(),result:w.string(),sessionType:w.string(),timeCreated:w.string().optional(),citations:w.array(sn).optional()}),nge=w.object({id:w.string(),assertion:w.string().optional(),result:w.string(),thoughts:w.string(),sessionType:w.string(),timeCreated:w.string().optional(),citations:w.array(sn).optional()});w.object({completionType:w.string(),traceIds:w.string().array()});var F_=w.union([oge,nge]).array(),SW=w.object({trigger:w.nativeEnum(Ei),status:w.nativeEnum(to),startedAt:w.coerce.date().optional(),gitCommitSha:w.string().optional(),gitCommitShaShort:w.string().optional(),gitCommitTimestamp:w.coerce.date().optional(),gitBranchName:w.string().optional(),gitOriginUrl:w.string().optional(),gitCommitMessage:w.string().optional(),gitCommitAuthorName:w.string().optional(),githubRepository:w.string().optional(),gitlabProjectPath:w.string().optional(),pipelineId:w.string().optional(),cliVersion:w.string().optional()});w.object({id:w.string()});var TW=w.object({status:w.nativeEnum(to),updatedAt:w.coerce.date().optional(),finishedAt:w.coerce.date().optional()});w.object({summary:zu,githubRepository:w.string().optional(),gitBranchName:w.string().optional()});w.object({updates:w.object({runId:w.string(),healStatus:vg,healDetails:ZP.optional()}).array()});var EW=w.object({stepsSnapshot:w.array(w.record(w.string(),w.unknown().optional())).optional(),beforeStepsSnapshot:w.array(w.record(w.string(),w.unknown().optional())).optional(),afterStepsSnapshot:w.array(w.record(w.string(),w.unknown().optional())).optional(),runGroupId:w.string().optional(),testId:w.string(),testName:w.string(),resolvedBaseUrl:w.string().optional(),environmentName:w.string().optional(),labels:w.array(w.string()).optional(),cliVersion:w.string().optional(),trigger:w.nativeEnum(Ei),schemaVersion:w.string().optional(),section:w.nativeEnum(fE).optional(),resolvedInputs:w.record(w.string(),w.string()).optional(),quarantined:w.boolean().optional().default(false),quarantinedReason:w.string().optional(),aiSettings:gs.optional()});w.object({id:w.string()});var rge=eI.pick({id:true,status:true,healStatus:true,healDetails:true,testName:true,testId:true,test:true,failureReason:true,failureDetails:true}),vW=rge.array(),CW=eI.pick({startedAt:true,finishedAt:true,updatedAt:true,results:true,beforeResults:true,afterResults:true,status:true,healStatus:true,healDetails:true,failureDetails:true,failureReason:true,failureRecoveryDetails:true,resolvedBaseUrl:true,environmentName:true,labels:true,cliVersion:true,resolvedInputs:true,attempts:true,flake:true,aiSettings:true}).partial();w.object({id:w.string()});var wW=w.object({run:Ki.omit({runAttempts:true}),attemptZipUrls:w.array(w.string().url().nullish())}),AW=w.object({status:w.nativeEnum(to),finishedAt:w.coerce.date().optional(),schemaVersion:w.string().optional().default("1.0.19"),results:w.record(w.string(),w.unknown().optional()).array().optional(),beforeResults:w.record(w.string(),w.unknown().optional()).array().optional(),afterResults:w.record(w.string(),w.unknown().optional()).array().optional()});w.object({screenshot:w.string(),contentType:w.enum(["image/jpeg","image/png"]).optional()});w.object({id:w.string(),screenshot:w.string(),contentType:w.enum(["image/jpeg","image/png"])});var RW=w.object({key:w.string()}),xW=w.object({orgId:w.string(),userId:w.string(),email:w.string().optional(),name:w.string().optional(),pylonEmailHash:w.string().optional(),selfServe:w.boolean().optional()}),MW=w.object({blocked:w.boolean()}),PW=w.array(h1);w.record(w.string(),w.union([w.string(),w.boolean()]));w.object({workosAccessToken:w.string().min(1),organizationId:w.string().optional(),clientName:w.string().min(1).max(80).optional()});var IW=w.object({apiKey:w.string(),apiKeyName:w.string(),organizationId:w.string(),user:w.object({id:w.string(),email:w.string().optional()}),selfServe:w.boolean().optional()}),_W=w.object({error:w.literal("multiple_organizations"),organizations:w.array(w.object({id:w.string(),name:w.string()}))}),ige=["web","ios","android"];w.object({platforms:w.array(w.enum(ige)),packageManager:w.enum(["npm","pnpm","yarn","bun"]),wizardVersion:w.string().min(1).max(40),cliVersions:w.object({momentic:w.string().max(40).optional(),momenticMobile:w.string().max(40).optional()}).optional(),firstRunIds:w.array(w.guid()).max(10).optional()});w.object({ok:w.literal(true)});w.object({paths:w.string().array(),env:w.string().optional(),urlOverride:w.string().optional(),customHeaders:w.record(w.string(),w.string()).optional()});var OW=w.object({suiteRunIds:w.string().array(),runGroupIds:w.string().array()});w.object({suiteRunIds:w.string().array()});K1.array();w.object({runGroupIds:w.string().array()});var B_=w.object({uploadUrl:w.string()});Nn.merge(a$);Nn.merge(l$);Nn.merge(s$);var age=w.object({testId:w.string().optional().default(""),testName:w.string().optional().default(""),suiteId:w.string().optional().default(""),suiteName:w.string().optional().default(""),isInteractive:w.boolean().optional().default(false),runner:w.nativeEnum(bl).optional(),creditsUsed:w.number().optional(),stepsExecuted:w.number().optional(),tokensUsed:w.number().optional()}),sge=w.object({transactionId:w.string(),timestamp:w.string(),event:w.nativeEnum(gc),properties:age});sge.array();var DW=Uj.omit({steps:true}).extend({steps:w.array(w.record(w.string(),w.unknown().optional())).describe("unparsed ResolvedStep[]")});w.object({limit:w.number().min(1).max(10).optional(),page:w.number().min(1).optional(),start:$o.optional(),end:$o.optional(),gitBranchName:w.string().optional(),status:w.nativeEnum(to).optional()});var NW=U1.array(),lge=w.object({testId:cn.optional(),gitBranchName:w.string().optional(),gitCommitSha:w.string().optional(),status:w.nativeEnum(to).optional(),label:w.string().array().optional(),limit:w.number().min(1).max(100).optional(),page:w.number().min(1).optional(),start:$o.optional(),end:$o.optional(),quarantined:w.boolean().optional(),recovered:w.boolean().optional(),includeFailureDetails:w.boolean().optional()});lge.extend({orgId:w.string().optional(),testId:Dn(cn),status:Dn(w.nativeEnum(to)),gitBranchName:Dn(w.string()),label:Dn(w.string()),testName:w.string().optional(),trigger:Dn(w.nativeEnum(Ei)),executionType:Dn(sc),cliVersion:Dn(w.string()),githubRepository:Dn(w.string()),gitlabProjectPath:Dn(w.string()),environment:Dn(w.string()),directory:Dn(w.string()),failureCategory:Dn(w.string()),exclude:Dn(w.string()),healed:w.boolean().optional()});var cge=Ki.omit({test:true}),LW=w.object({runs:cge.array(),page:w.number(),pageSize:w.number(),pageCount:w.number()});w.object({applied:w.boolean().optional(),appliedAt:w.coerce.date().optional()});var kW=B_.extend({id:w.string()});w.object({runGroupId:w.guid().optional(),persist:w.boolean().optional()});var FW=w.object({runGroupId:w.guid()}),BW=w.object({quarantined:w.object({testId:cn,quarantinedAt:w.coerce.date(),quarantinedBy:w.string().optional(),quarantinedReason:w.string()}).array()}),UW=w.object({gitLocalUsername:w.string().optional(),gitLocalEmail:w.string().optional(),gitLocalName:w.string().optional()});w.object({testId:cn,testName:w.string().optional(),reason:w.string()}).merge(UW);w.object({testName:w.string().optional(),reason:w.string().optional()}).merge(UW);Nn.merge(aV);Nn.merge(sV);Nn.merge(lV);w.object({apkToInstall:w.object({channel:w.string(),tag:w.string().optional()}).optional(),hostname:w.string().optional(),region:ZI.optional(),osVersion:w.nativeEnum(Xm).optional(),sessionId:w.string().optional(),playwrightVersion:xV.optional()});var zW=w.object({name:w.string(),apiUrl:w.string(),webRtcUrl:w.string(),adbUrl:w.string(),token:w.string(),apkDownloadUrl:w.string().optional(),playwrightServerUrl:w.string().optional(),region:w.string().optional(),resolvedTag:w.string().optional()});w.object({appToInstall:w.object({channel:w.string(),tag:w.string().optional()}).optional(),hostname:w.string().optional(),region:ZI.optional(),osVersion:w.nativeEnum(FE).optional(),sessionId:w.string().optional(),installAppOnClient:w.boolean().optional()});var $W=w.object({id:w.string(),apiUrl:w.string(),webRtcUrl:w.string(),wdaUrl:w.string(),token:w.string(),appDownloadUrl:w.string().optional(),appMd5:w.string().optional(),region:w.string().optional(),resolvedTag:w.string().optional()});w.object({channel:w.string().trim().min(1,"channel must be a non-empty string"),tag:w.string().trim().min(1,"tag must be a non-empty string"),md5:w.string()});var VW=w.object({id:w.string(),uploadUrl:w.string().optional(),downloadUrl:w.string(),md5:w.string().optional()}),uge=w.object({channel:w.string(),tag:w.string(),md5:w.string(),platform:w.nativeEnum(at).default("ANDROID"),createdAt:w.number().describe("Unix timestamp in milliseconds")}),jW=w.object({assets:w.array(uge)}),HW=w.object({downloadUrl:w.string()}),U_=(o=>(o.PLAYWRIGHT="PLAYWRIGHT",o.CDP="CDP",o))(U_||{}),dge=w.nativeEnum(U_);w.object({runId:w.guid().optional(),attemptedProviders:w.array(g_).optional()});var WW=w.object({wsEndpoint:w.string(),accessToken:w.string().optional(),endpointType:dge.optional(),provider:g_.optional()});z.object({repositoriesIndexed:z.boolean(),indexingInProgress:z.boolean(),indexesOutdated:z.boolean()});var GW=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(GW||{}),qW=(s=>(s.Success="success",s.Failure="failure",s.Neutral="neutral",s.Cancelled="cancelled",s.Skipped="skipped",s.TimedOut="timed_out",s.ActionRequired="action_required",s))(qW||{});z.object({name:z.string(),status:z.enum(GW),conclusion:z.enum(qW).nullable()});var ab=z.object({sha:z.string(),message:z.string(),author:z.object({name:z.string().optional(),email:z.string().optional(),date:z.coerce.date().optional()}),committer:z.object({name:z.string().optional(),email:z.string().optional(),date:z.coerce.date().optional()})}),z_=z.object({mergedBranch:z.string().optional()});var KW=z.object({orgId:z.string(),cacheKeys:z.string().array()});z.object({keyParams:KW,clientMetadata:z.string(),lockAcquisitionTimeoutMs:z.number().optional()});var YW=z.object({acquired:z.boolean(),acquiredByMetadata:z.string(),keyPrefix:z.string()});z.object({keyPrefix:z.string(),result:z.string(),ttlMs:z.number()});z.union([z.object({keyPrefix:z.string()}),KW]);var mge=z.object({remainingTtlMs:z.number(),value:z.string().nullish()});z.object({results:z.record(z.string(),mge),activeLocks:z.string().array()});var XW=z.object({testId:z.string().min(1),stepId:z.string().min(1),baseTestFileHash:z.string().min(1),branchName:z.string().min(1).optional(),environment:z.string().min(1).optional(),classification:nP,healDetails:B1.optional()}),pge=XW.extend({createdAt:z.coerce.date(),updatedAt:z.coerce.date()});z.object({branchName:z.string().min(1).optional(),mainBranchName:z.string().min(1).optional(),stepId:z.string().min(1),baseTestFileHash:z.string().min(1),environment:z.string().min(1).optional()});var JW=pge.array();z.object({entries:XW.array()});function sb(t){if(t.startsWith("https://api"))return t.replace("https://api","https://app");if(t.startsWith("http://localhost:8000"))return t.replace("http://localhost:8000","http://localhost:3000");throw new Error(`Unknown Momentic app server URL pattern: ${t}`)}var fge=z.object({version:z.string(),json:z.record(z.string(),z.unknown().optional()),hash:z.string()}),ZW=z.record(z.string(),z.unknown().optional());z.object({newSvgs:z.array(fge),metadata:ZW.optional()});var hge=z.object({version:z.string(),json:z.record(z.string(),z.unknown().optional()).nullish(),hash:z.string(),description:z.string().nullish(),metadata:ZW.nullish()}),QW=z.record(z.string().describe("icon hash"),hge);function pp(t){let e;try{e=JSON.parse(t);}catch(o){return `The schema is not valid JSON. ${o}`}try{validator(e);}catch(o){return `The schema is not a valid JSON schema. ${o}`}}var eG=t=>{t.extraHeaders&&(t.extraHeaders=Object.fromEntries(Object.entries(t.extraHeaders).filter(([e,o])=>e.trim()&&o.trim())));};var lv=class{async prepareGoldenScreenshotForComparison(e,o,n){return n}};var cv=class{async resolveEntries(){}async populateCacheForRun(){}async getCacheKeyForStep(){}async saveEntries(){}async saveSnapshotCacheEntries(){}};function bge(t){return t.map(e=>({...e,environment:void 0}))}function $_(t,e){return e?t:bge(t)}var pn="metadata.json",ra="assets",tr="runs",yge=z.object({step:Ao,status:z.enum(yo),startedAt:z.coerce.date(),finishedAt:z.coerce.date().optional(),healMetadata:z.object({healType:z.enum(hg).or(z.literal("AI")),healedAt:z.coerce.date()}).optional(),beforeSnapshotId:z.guid().optional(),afterSnapshotId:z.guid().optional(),message:z.string().optional()}),Sge=yge.extend({finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});Sge.extend({step:z.unknown().optional()});var V_=z.object({avdId:z.string().optional(),channel:z.string().optional(),tag:z.string().optional(),region:z.string().optional(),osVersion:PV.optional()}),oG="1.0.0",nG=AW.extend({id:z.guid().optional(),startedAt:z.coerce.date(),runAttemptSchemaVersion:z.string().optional(),schemaVersion:z.string().optional().default("1.0.19"),results:z.record(z.string(),z.unknown().optional()).array().optional(),beforeResults:z.record(z.string(),z.unknown().optional()).array().optional(),afterResults:z.record(z.string(),z.unknown().optional()).array().optional(),assetDetails:V_.optional(),viewport:ul.optional(),activeVideos:z.array(z.object({videoName:z.string(),timestamp:z.coerce.date()})).optional()}),j_=nG.extend({assetDetails:V_.optional(),finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});nG.extend($P.shape);var rG=j_.extend($P.shape),Tge=z.object({results:z.array(Zr),beforeResults:z.array(Zr).optional(),afterResults:z.array(Zr).optional()});j_.extend(Tge.shape);var Ege=z.object({results:z.array(Qr),beforeResults:z.array(Qr).optional(),afterResults:z.array(Qr).optional()});j_.extend(Ege.shape);var iG=CW.merge(EW).extend({executionType:sc.optional().default("WEB"),testId:cn,testDescription:z.string().optional(),directory:z.string().optional(),runGroupId:z.guid(),status:z.enum(to),healStatus:vg,startedAt:z.coerce.date(),schemaVersion:z.string().nullish(),attempts:z.number(),failureRecoveryDetails:z.object({attempts:z.number()}).optional(),aiSettings:gs.optional(),avgCpuUsage:z.number().optional(),avgMemoryUsage:z.number().optional()}),vge=iG.extend(V_.shape),aG=iG.extend({finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});vge.extend({finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});var tG=z.object({mode:z.enum(["SELECTED","RUN_ALL","RUN_NONE","SHADOW"]),baseRef:z.string().nullable(),headSha:z.string(),planId:z.string().nullable(),totalCandidates:z.number().int().nonnegative(),selectedCount:z.number().int().nonnegative(),anchorSegmentIds:z.array(z.string()),userSummary:z.string(),toolCallCount:z.number().int().nonnegative(),selectedTests:z.array(aE),forcedTests:z.array(z.object({name:z.string(),testPath:z.string(),status:z.enum(["A","M","R","C","T"])})).optional().default([]),runAllReason:z.string().nullable()}),Cge=SW.merge(TW).extend({id:z.guid().optional(),startedAt:z.coerce.date(),cliVersion:z.string(),labels:z.string().array().optional().default([]),suiteName:z.string().optional(),ciProvider:z.string().optional(),gitMainBranch:z.string().optional(),ai:gs.optional(),browser:dl.optional(),aiSelect:z.union([tG.transform(t=>[t]),z.array(tG)]).optional()}),fp=Cge.extend({healRiskSummary:zu.optional(),updatedAt:z.coerce.date().optional().transform(t=>t??new Date),finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});var wge=new Set(["MOBILE_MODULE_STEP","MOBILE_CONDITIONAL_STEP","RESOLVED_MOBILE_MODULE"]);function uv(t){return t.type!=="MOBILE_PRESET_STEP"?t.type:t.command.type}function dv(t){return !wge.has(t.type)}var sG="CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih",hp="https://us-west.metrics.momentic.ai",gp="c60c6a0f-60da-41a7-a61b-07969a0aa303",od=!!process.env.CI||!!process.env.GITHUB_ACTIONS||!!process.env.GITHUB_RUN_ID||!!process.env.GITLAB_CI||!!process.env.CI_COMMIT_SHA||!!process.env.JENKINS_URL||!!process.env.BUILD_NUMBER||!!process.env.JENKINS_HOME||!!process.env.CIRCLECI||!!process.env.CIRCLE_BUILD_NUM||!!process.env.TRAVIS||!!process.env.TRAVIS_BUILD_NUMBER||!!process.env.BITBUCKET_BUILD_NUMBER||!!process.env.BITBUCKET_COMMIT||!!process.env.CODEBUILD_BUILD_ID||!!process.env.TF_BUILD||!!process.env.BUILD_BUILDID||!!process.env.AGENT_ID||!!process.env.BUILDER_SA_EMAIL||!!process.env.HEROKU_TEST_RUN_ID||!!process.env.CI_NODE_INDEX||!!process.env.TEAMCITY_VERSION||!!process.env.BUILD_VCS_NUMBER||!!process.env.BUILDKITE||!!process.env.BUILDKITE_BUILD_NUMBER||!!process.env.APPVEYOR||!!process.env.APPVEYOR_BUILD_NUMBER||!!process.env.DRONE||!!process.env.DRONE_BUILD_NUMBER||!!process.env.SHIPPABLE||!!process.env.BUILD_URL||!!process.env.SEMAPHORE||!!process.env.SEMAPHORE_EXECUTABLE_UUID||!!process.env.WOODPECKER||!!process.env.CI_BUILD_NUMBER||!!process.env.WERCKER_MAIN_PIPELINE_STARTED||!!process.env.BUDDY_EXECUTION_ID;var lG=(()=>{try{return statSync("/.dockerenv"),!0}catch{return false}})();async function Cc(t){return od||lG?true:(await N.flush(),await new Promise(o=>setTimeout(o,100)),await confirm({message:t}))}async function cG(t,e){return od||lG?e:(await input({message:t,default:e})).trim()||e}var bp=new Map,dG="Log throttle exceeded",Bge=100,Uge=5e3,zge=Oge(global.fetch,{retries:2,retryOn:function(t,e,o){return !!(e!==null||o&&o.status>=500)},retryDelay:function(t){return Math.pow(2,t)*500}}),$ge=`${hp}/logs/json`,H_=class{constructor(e,o){this.flushIntervalMs=e;this.maxBatchSize=o;}records=[];flushTimer;push(e){if(this.records.push(e),this.records.length>=this.maxBatchSize){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=void 0),this.flush();return}this.scheduleFlush();}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=void 0,this.flush();},this.flushIntervalMs));}async flush(){if(this.records.length===0)return;let e=this.records;this.records=[];try{let o=await zge($ge,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":sG,"x-momentic-metrics-api-key":gp},body:cc(e),signal:AbortSignal.timeout(5e3)});if(!o.ok)throw new Error(`Got error status (${o.statusText}) from SigNoz`)}catch{}}},W_=class t{consoleLogger;hostname;bindingAttributes;disableConsoleLogs;minLevelValue=20;logsInCurrentWindow=0;droppedLogsInWindow=false;lastWindowStart=Date.now();flushIntervalMs;maxBatchSize;buffer;constructor({bindings:e,hostname:o,disableConsoleLogs:n,flushIntervalMs:r,maxBatchSize:i,buffer:a}){this.hostname=o??Tl.hostname(),this.disableConsoleLogs=n,this.bindingAttributes={...e,env:"production"},this.flushIntervalMs=r??5e3,this.maxBatchSize=i??10,this.buffer=a??new H_(this.flushIntervalMs,this.maxBatchSize);let s={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=uG(s);}child(e){return new t({bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs,flushIntervalMs:this.flushIntervalMs,maxBatchSize:this.maxBatchSize,buffer:this.buffer})}async flush(){await this.buffer.flush(),this.disableConsoleLogs||this.consoleLogger.flush();}shouldAllowLog(e){if(e===dG)return true;let o=Date.now();return o-this.lastWindowStart>Uge&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,dG),this.droppedLogsInWindow=false,this.lastWindowStart=o),this.logsInCurrentWindow<Bge?(this.logsInCurrentWindow++,true):(this.droppedLogsInWindow=true,false)}log(e,o,n,...r){try{this.logHelper(e,o,n,...r);}catch(i){this.consoleLogger.warn(`Failed to log to Signoz: ${i}`);}}logHelper(e,o,n,...r){if(Eg[e]<this.minLevelValue||!this.shouldAllowLog(n))return;typeof o=="string"&&!n&&(o={message:o}),typeof o=="object"&&o&&"err"in o&&o.err instanceof Error&&(o.err=kge.err(o.err));let i={...this.bindingAttributes,...o&&typeof o=="object"?o:{},...r.length>0?{args:r}:{}},a={host:this.hostname,env:this.bindingAttributes.env},s=Vge();this.disableConsoleLogs||this.consoleLogger[e]({...i,...s??{}},n,...r);let l={timestamp:Math.round(Date.now()*1e6),...s??{},severity_text:e.toUpperCase(),resources:a,attributes:{},body:P1({message:n||"",...i})};this.buffer.push(l);}setApp(e){let o=this.bindingAttributes.app;this.bindingAttributes.app=e,bp.set("app",this),bp.delete(o);}debug(e,o,...n){this.log("debug",e,o,...n);}info(e,o,...n){this.log("info",e,o,...n);}warn(e,o,...n){this.log("warn",e,o,...n);}error(e,o,...n){this.log("error",e,o,...n);}bindings(){return this.bindingAttributes}addBinding(e,o){this.bindingAttributes[e]=o;}setMinLevel(e){typeof e=="number"?(this.minLevelValue=e,this.consoleLogger.level=I1[e]):(this.minLevelValue=Eg[e],this.consoleLogger.level=e);}enableConsoleLogs(){this.disableConsoleLogs=false;}},yp=({app:t,hostname:e,disableConsoleLogs:o})=>(bp.has(t)||bp.set(t,new W_({bindings:{app:t},hostname:e,disableConsoleLogs:o})),bp.get(t));function Vge(){let t=trace.getSpan(context.active());if(!t)return;let e=t.spanContext();if(isSpanContextValid(e))return {trace_id:e.traceId,span_id:e.spanId,trace_flags:e.traceFlags}}async function mv(){await Promise.all([...bp.values()].map(t=>t.flush()));}var Fa=class extends Error{constructor(e){super(e),this.name="TimeoutError";}};var mG=t=>{let e=t.reason===void 0?new DOMException("This operation was aborted.","AbortError"):t.reason;return e instanceof Error?e:new DOMException(e,"AbortError")};function re(t,e){let{milliseconds:o,fallback:n,message:r,customTimers:i={setTimeout,clearTimeout}}=e,a;if(typeof o!="number"||Math.sign(o)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${o}\``);return new Promise((s,l)=>{let c;if(e.signal){let{signal:m}=e;if(m.aborted)return l(mG(m));c=()=>l(mG(m)),m.addEventListener("abort",c,{once:true});}let u=()=>{if(e.signal&&e.signal.removeEventListener("abort",c),n)try{s(n());}catch(m){l(m);}else {typeof t.cancel=="function"&&Promise.resolve().then(()=>t.cancel()).catch(()=>{});let m=r instanceof Error?r:new Fa(r??`Promise timed out after ${o}ms`);l(m);}};o<1/0&&(a=i.setTimeout(u,o));let d=()=>{i.clearTimeout(a),e.signal&&e.signal.removeEventListener("abort",c);};Promise.resolve(t).then(m=>{d(),s(m);}).catch(m=>{d(),l(m);});})}function Sp({signal:t,timeoutMs:e}){let o=AbortSignal.timeout(e);return t?AbortSignal.any([t,o]):o}var pG="organization";function pv(t){let e=new PostHog(t.writeKey,{host:t.host,...t.flushImmediately?{flushAt:1,flushInterval:0}:{}}),o=t.platform,n=(l,c,u)=>{let{type:d,...m}=l;e.capture({distinctId:c??u??randomUUID(),event:d,...u&&{groups:{[pG]:u}},properties:{platform:o,user_id:c??void 0,org_id:u??void 0,...m,organizationId:u??void 0,...c==null&&u==null&&{$process_person_profile:false}}});},r=({orgId:l,properties:c})=>{e.groupIdentify({groupType:pG,groupKey:l,properties:c});},i=({userId:l,properties:c})=>{Object.values(c).some(d=>d!=null&&d!=="")&&e.identify({distinctId:l,properties:c});},a=()=>e.shutdown();if(t.identity==="stashed"){let l=null;return {shutdownAnalytics:a,groupIdentifyOrg:r,setAnalyticsIdentity:u=>{l=u,t.onIdentify?.(u),i({userId:u.userId,properties:{email:u.email,...u.selfServe!==void 0?{self_serve:u.selfServe}:{}}});},captureEvent:u=>n(u,l?.userId??null,l?.orgId??null)}}return {shutdownAnalytics:a,groupIdentifyOrg:r,identifyUser:i,captureEvent:(l,{userId:c,orgId:u})=>n(l,c,u),captureBillingEvent:(l,{userId:c,orgId:u})=>n(l,c,u)}}var qge=2e3,nd=t=>Number.parseInt(t,10),q_=t=>readFileSync(t,"utf8").trim(),Tp=t=>nd(q_(t)),fG,fv,lb={samples:0,lowMemorySamples:0,highCpuSamples:0,highHeapSamples:0};function yG(){return {...lb}}var hv=Tl.platform(),Kge=Tl.cpus().map(t=>({model:t.model,speed:t.speed})).reduce((t,e)=>(t[e.model]={speed:e.speed},t.totalCores=(t.totalCores??0)+1,t),{});function G_(t=Date.now()){let e=Tl.cpus(),o={measurementTime:t,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let n of e)o.user+=n.times.user,o.nice+=n.times.nice,o.sys+=n.times.sys,o.idle+=n.times.idle,o.irq+=n.times.irq;return o.total=o.user+o.nice+o.sys+o.idle+o.irq,o}function SG(t,e){let o={user:e.user-t.user,nice:e.nice-t.nice,sys:e.sys-t.sys,idle:e.idle-t.idle,irq:e.irq-t.irq,total:e.total-t.total};return o.total<=0?null:{measurementTime:e.measurementTime,intervalMs:e.measurementTime-t.measurementTime,user:o.user/o.total*100,nice:o.nice/o.total*100,sys:o.sys/o.total*100,idle:o.idle/o.total*100,irq:o.irq/o.total*100,total:100-o.idle/o.total*100}}function Yge(){let t=G_();return ()=>{let e=G_(),o=SG(t,e);return t=e,o}}function hG(){try{let e=readFileSync("/sys/fs/cgroup/cpu.stat","utf8").match(/^usage_usec\s+(\d+)/m);if(e?.[1])return nd(e[1])}catch{}try{let t=Tp("/sys/fs/cgroup/cpuacct/cpuacct.usage");if(!isNaN(t))return t/1e3}catch{}return null}function Xge(){try{let e=q_("/sys/fs/cgroup/cpu.max").split(" "),o=e[0],n=e[1];return !o||!n||o==="max"?null:nd(o)/nd(n)}catch{}try{let t=Tp("/sys/fs/cgroup/cpu/cpu.cfs_quota_us"),e=Tp("/sys/fs/cgroup/cpu/cpu.cfs_period_us");return t===-1||isNaN(e)?null:t/e}catch{return null}}function Jge(){if(hv!=="linux")return null;let t=hG();if(t===null)return null;let e=Xge()??Tl.cpus().length,o=t,n=Date.now();return ()=>{let r=hG();if(r===null)return null;let i=Date.now(),a=i-n;if(a<=0)return null;let s=r-o,l=a*1e3,c=Math.max(0,Math.min(100,s/l/e*100));return o=r,n=i,{measurementTime:i,intervalMs:a,user:c,nice:0,sys:0,idle:Math.max(0,100-c),irq:0,total:c}}}function Zge(){let t=process.cpuUsage(),e=process.hrtime.bigint();return ()=>{let o=process.cpuUsage(),n=process.hrtime.bigint(),r=Number(n-e)/1e6,i=o.user-t.user,a=o.system-t.system;if(t=o,e=n,r<=0)return null;let s=Math.max(Tl.cpus().length,1),l=c=>Math.max(0,c/1e3/r*100/s);return {total:l(i+a),user:l(i),sys:l(a),intervalMs:r}}}function TG({intervalMs:t=qge,maxSamples:e=1e4,keepSamples:o=true,onSample:n}={}){let r=[],i=Jge()??Yge(),a=Zge(),s=()=>{let u=Date.now(),d=vG(),m=process.memoryUsage(),p=i(),f=a(),h={timestamp:u,system:{cpu:p,memory:{total:d.totalMemory,free:d.freeMemory,freePercentage:d.freePercentage}},process:{cpu:f,memory:{rss:m.rss,heapTotal:m.heapTotal,heapUsed:m.heapUsed,external:m.external,arrayBuffers:m.arrayBuffers}}};n?.(h),o&&(r.push(h),r.length>e&&r.shift());};s();let l=setInterval(s,t),c=u=>({samples:o?[...r]:[]});return {stop:()=>(clearInterval(l),c()),getSeries:()=>c()}}var gG=t=>{try{let e={},o=!1,n=vG(),r=ebe();lb.samples++,n.freePercentage<.05&&(Object.assign(e,process.memoryUsage()),o=!0,lb.lowMemorySamples++),r&&r?.total>80&&(o=!0,lb.highCpuSamples++);let i=Gge.getHeapStatistics(),a=i.used_heap_size,s=i.heap_size_limit;a/s>.9&&(o=!0,lb.highHeapSamples++),o?t.warn({memory:n,cpu:r,heapStats:i,...e},"Critical resource usage metrics detected"):t.debug({memory:n,cpu:r},"Got machine resource usage metrics");}catch{}};function EG(t){return gG(t),{interval:setInterval(()=>gG(t),2e4),cpuMetadata:Kge,platform:hv}}function Qge(){if(hv!=="linux")return null;try{let t=q_("/sys/fs/cgroup/memory.max"),e=Tp("/sys/fs/cgroup/memory.current");if(t==="max"||isNaN(e))return null;let o=nd(t);if(isNaN(o))return null;let n=Math.max(0,o-e);return {totalMemory:o,freeMemory:n,freePercentage:n/o}}catch{}try{let t=Tp("/sys/fs/cgroup/memory/memory.limit_in_bytes"),e=Tp("/sys/fs/cgroup/memory/memory.usage_in_bytes");if(isNaN(t)||isNaN(e))return null;let o=Tl.totalmem();if(t>=o)return null;let n=Math.max(0,t-e);return {totalMemory:t,freeMemory:n,freePercentage:n/t}}catch{return null}}function vG(){let t=Qge();if(t)return t;let e=Tl.totalmem(),o=hv==="darwin"?tbe():(()=>{let r=Tl.freemem();return {availableMemory:r,rawFreeMemory:r,cachedMemory:0}})(),n=o.availableMemory/e;return {totalMemory:e,freeMemory:o.availableMemory,freePercentage:n}}function ebe(){let t=G_();if(!fv)return fv=t,null;let e=SG(fv,t);return fv=t,e?(fG=e,fG):null}function tbe(){try{let t=execSync("/usr/bin/vm_stat",{encoding:"utf8",stdio:["pipe","pipe","ignore"]}),o=t.match(/page size of (\d+) bytes/)?.[1],n=o?nd(o):4096,r=u=>{let m=t.match(new RegExp(`${u}:\\s+(\\d+)\\.`,"i"))?.[1];return m?nd(m):0},i=r("Pages free"),a=r("Pages inactive"),s=r("Pages speculative"),l=i*n,c=(a+s)*n;return {availableMemory:l+c,rawFreeMemory:l,cachedMemory:c}}catch{let t=Tl.freemem();return {availableMemory:t,rawFreeMemory:t,cachedMemory:0}}}process.env.APP||"unknown";var gv="deployment.environment",bv="service.instance.id";function CG(){return process.env.MOMENTIC_LOCAL_DEV==="1"&&process.env.LOCAL_SIGNOZ==="true"}var Ep=false,yv,cb,ub,fbe=[],Sv;function Tv(){return Ep}async function hbe(){for(let t of fbe)try{await t();}catch{}}function gbe(){return Tv()&&trace.getSpan(context.active())!==void 0}function bbe(){return CG()?new OTLPTraceExporter({url:"http://localhost:4318/v1/traces"}):new OTLPTraceExporter({url:`${hp}/v1/traces`,headers:{"x-momentic-metrics-api-key":gp}})}function ybe(t){let e="production",o=v4$1(),n=bbe();return new NodeTracerProvider({resource:resourceFromAttributes({[ATTR_SERVICE_NAME]:t,[gv]:e,[bv]:o,[ATTR_SERVICE_VERSION]:"1.4.6"}),spanProcessors:[new BatchSpanProcessor(n)]})}function Sbe(t){Sv=registerInstrumentations({tracerProvider:t,instrumentations:[new UndiciInstrumentation({requireParentforSpans:true})]});}function Tbe(t){return !t&&!yv?trace.getTracer("momentic-serverless"):ub?.getTracer("momentic-serverless")??trace.getTracer("momentic-serverless")}async function Ev(t){if(!(!t.enabled||Ep))try{yv=t.serviceName;let e=ybe(t.serviceName);ub=e,cb=new AsyncLocalStorageContextManager,e.register({contextManager:cb.enable(),propagator:new W3CTraceContextPropagator}),Sbe(e),Ep=!0;}catch{Ep=false,yv=void 0,ub=void 0,cb=void 0,Sv=void 0;}}async function vv(){if(Ep)try{await hbe(),await ub?.shutdown();}catch{}finally{Sv?.();try{cb?.disable();}catch{}Ep=false,yv=void 0,cb=void 0,ub=void 0,Sv=void 0;}}async function We(t){if(!Tv()||!t.root&&!gbe())return t.fn(void 0);let e=t.serviceName===void 0?t.attributes:{...t.attributes??{},"momentic.span_service_name":t.serviceName};return await Tbe(t.serviceName).startActiveSpan(t.name,{attributes:e,kind:t.kind??SpanKind.CLIENT},async o=>{try{let n=await t.fn(o);return o.setStatus({code:SpanStatusCode.OK}),n}catch(n){throw o.setStatus({code:SpanStatusCode.ERROR,message:n instanceof Error?n.message.slice(0,300):void 0}),n instanceof Error&&o.recordException(n),n}finally{o.end();}})}var db=class{increment(e,o,n){}gauge(e,o){}distribution(e,o,n){}async flush(){}async recordDuration(e){return await Y_(e)}};async function Y_({fn:t,name:e,timeoutMs:o,timeoutMessage:n,trace:r}){let i=r?()=>We({name:r.name,attributes:r.attributes,fn:t}):t,a=Promise.resolve(i());return o===void 0?await a:await re(a,{milliseconds:o,message:n??`Timed out after ${o}ms recording duration for ${e}`})}function Ebe(t){if(!t||t.length===0)return {};let e={};for(let o of t){let n=o.indexOf(":");if(n>-1){let r=o.slice(0,n).trim(),i=o.slice(n+1).trim();r&&(e[r]=i);continue}e[o]=true;}return e}function X_(t,e){let o=Ebe(t);return !e||Object.keys(e).length===0?o:{...e,...o}}var Sr;(function(t){t[t.DELTA=0]="DELTA",t[t.CUMULATIVE=1]="CUMULATIVE";})(Sr||(Sr={}));var Fe;(function(t){t.COUNTER="COUNTER",t.GAUGE="GAUGE",t.HISTOGRAM="HISTOGRAM",t.UP_DOWN_COUNTER="UP_DOWN_COUNTER",t.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",t.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",t.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER";})(Fe||(Fe={}));var Tr;(function(t){t[t.HISTOGRAM=0]="HISTOGRAM",t[t.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",t[t.GAUGE=2]="GAUGE",t[t.SUM=3]="SUM";})(Tr||(Tr={}));function Cv(t){let e=Object.keys(t);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(o=>[o,t[o]])))}function RG(t){return `${t.name}:${t.version??""}:${t.schemaUrl??""}`}var mb=class t extends Error{constructor(e){super(e),Object.setPrototypeOf(this,t.prototype);}};function wc(t,e){let o,n=new Promise(function(i,a){o=setTimeout(function(){a(new mb("Operation timed out."));},e);});return Promise.race([t,n]).then(r=>(clearTimeout(o),r),r=>{throw clearTimeout(o),r})}function xG(t,e){if(t.size!==e.size)return false;for(let o of t)if(!e.has(o))return false;return true}function MG(t,e){let o=0,n=t.length-1,r=t.length;for(;n>=o;){let i=o+Math.trunc((n-o)/2);t[i]<e?o=i+1:(r=i,n=i-1);}return r}function PG(t,e){return t.toLowerCase()===e.toLowerCase()}var ia;(function(t){t[t.DROP=0]="DROP",t[t.SUM=1]="SUM",t[t.LAST_VALUE=2]="LAST_VALUE",t[t.HISTOGRAM=3]="HISTOGRAM",t[t.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM";})(ia||(ia={}));var pb=class{kind=ia.DROP;createAccumulation(){}merge(e,o){}diff(e,o){}toMetricData(e,o,n,r){}};function vbe(t){let e=t.map(()=>0);return e.push(0),{buckets:{boundaries:t,counts:e},sum:0,count:0,hasMinMax:false,min:1/0,max:-1/0}}var vp=class{startTime;_boundaries;_recordMinMax;_current;constructor(e,o,n=true,r=vbe(o)){this.startTime=e,this._boundaries=o,this._recordMinMax=n,this._current=r;}record(e){if(Number.isNaN(e))return;this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=true);let o=MG(this._boundaries,e);this._current.buckets.counts[o]+=1;}setStartTime(e){this.startTime=e;}toPointValue(){return this._current}},Cp=class{kind=ia.HISTOGRAM;_boundaries;_recordMinMax;constructor(e,o){this._boundaries=e,this._recordMinMax=o;}createAccumulation(e){return new vp(e,this._boundaries,this._recordMinMax)}merge(e,o){let n=e.toPointValue(),r=o.toPointValue(),i=n.buckets.counts,a=r.buckets.counts,s=new Array(i.length);for(let u=0;u<i.length;u++)s[u]=i[u]+a[u];let l=1/0,c=-1/0;return this._recordMinMax&&(n.hasMinMax&&r.hasMinMax?(l=Math.min(n.min,r.min),c=Math.max(n.max,r.max)):n.hasMinMax?(l=n.min,c=n.max):r.hasMinMax&&(l=r.min,c=r.max)),new vp(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:n.count+r.count,sum:n.sum+r.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||r.hasMinMax),min:l,max:c})}diff(e,o){let n=e.toPointValue(),r=o.toPointValue(),i=n.buckets.counts,a=r.buckets.counts,s=new Array(i.length);for(let l=0;l<i.length;l++)s[l]=a[l]-i[l];return new vp(o.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:r.count-n.count,sum:r.sum-n.sum,hasMinMax:false,min:1/0,max:-1/0})}toMetricData(e,o,n,r){return {descriptor:e,aggregationTemporality:o,dataPointType:Tr.HISTOGRAM,dataPoints:n.map(([i,a])=>{let s=a.toPointValue(),l=e.type===Fe.GAUGE||e.type===Fe.UP_DOWN_COUNTER||e.type===Fe.OBSERVABLE_GAUGE||e.type===Fe.OBSERVABLE_UP_DOWN_COUNTER;return {attributes:i,startTime:a.startTime,endTime:r,value:{min:s.hasMinMax?s.min:void 0,max:s.hasMinMax?s.max:void 0,sum:l?void 0:s.sum,buckets:s.buckets,count:s.count}}})}}};var fb=class t{backing;indexBase;indexStart;indexEnd;constructor(e=new J_,o=0,n=0,r=0){this.backing=e,this.indexBase=o,this.indexStart=n,this.indexEnd=r;}get offset(){return this.indexStart}get length(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1}counts(){return Array.from({length:this.length},(e,o)=>this.at(o))}at(e){let o=this.indexBase-this.indexStart;return e<o&&(e+=this.backing.length),e-=o,this.backing.countAt(e)}incrementBucket(e,o){this.backing.increment(e,o);}decrementBucket(e,o){this.backing.decrement(e,o);}trim(){for(let e=0;e<this.length;e++)if(this.at(e)!==0){this.indexStart+=e;break}else if(e===this.length-1){this.indexStart=this.indexEnd=this.indexBase=0;return}for(let e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate();}downscale(e){this._rotate();let o=1+this.indexEnd-this.indexStart,n=1<<e,r=0,i=0;for(let a=this.indexStart;a<=this.indexEnd;){let s=a%n;s<0&&(s+=n);for(let l=s;l<n&&r<o;l++)this._relocateBucket(i,r),r++,a++;i++;}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart;}clone(){return new t(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)}_rotate(){let e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart);}_relocateBucket(e,o){e!==o&&this.incrementBucket(e,this.backing.emptyBucket(o));}},J_=class t{_counts;constructor(e=[0]){this._counts=e;}get length(){return this._counts.length}countAt(e){return this._counts[e]}growTo(e,o,n){let r=new Array(e).fill(0);r.splice(n,this._counts.length-o,...this._counts.slice(o)),r.splice(0,o,...this._counts.slice(0,o)),this._counts=r;}reverse(e,o){let n=Math.floor((e+o)/2)-e;for(let r=0;r<n;r++){let i=this._counts[e+r];this._counts[e+r]=this._counts[o-r-1],this._counts[o-r-1]=i;}}emptyBucket(e){let o=this._counts[e];return this._counts[e]=0,o}increment(e,o){this._counts[e]+=o;}decrement(e,o){this._counts[e]>=o?this._counts[e]-=o:this._counts[e]=0;}clone(){return new t([...this._counts])}};var hb=Math.pow(2,-1022);function wv(t){let e=new DataView(new ArrayBuffer(8));return e.setFloat64(0,t),((e.getUint32(0)&2146435072)>>20)-1023}function Av(t){let e=new DataView(new ArrayBuffer(8));e.setFloat64(0,t);let o=e.getUint32(0),n=e.getUint32(4);return (o&1048575)*Math.pow(2,32)+n}function gb(t,e){return t===0||t===Number.POSITIVE_INFINITY||t===Number.NEGATIVE_INFINITY||Number.isNaN(t)?t:t*Math.pow(2,e)}function _G(t){return t--,t|=t>>1,t|=t>>2,t|=t>>4,t|=t>>8,t|=t>>16,t++,t}var xs=class extends Error{};var Rv=class{_shift;constructor(e){this._shift=-e;}mapToIndex(e){if(e<hb)return this._minNormalLowerBoundaryIndex();let o=wv(e),n=this._rightShift(Av(e)-1,52);return o+n>>this._shift}lowerBoundary(e){let o=this._minNormalLowerBoundaryIndex();if(e<o)throw new xs(`underflow: ${e} is < minimum lower boundary: ${o}`);let n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new xs(`overflow: ${e} is > maximum lower boundary: ${n}`);return gb(1,e<<this._shift)}get scale(){return this._shift===0?0:-this._shift}_minNormalLowerBoundaryIndex(){let e=-1022>>this._shift;return this._shift<2&&e--,e}_maxNormalLowerBoundaryIndex(){return 1023>>this._shift}_rightShift(e,o){return Math.floor(e*Math.pow(2,-o))}};var xv=class{_scale;_scaleFactor;_inverseFactor;constructor(e){this._scale=e,this._scaleFactor=gb(Math.LOG2E,e),this._inverseFactor=gb(Math.LN2,-e);}mapToIndex(e){if(e<=hb)return this._minNormalLowerBoundaryIndex()-1;if(Av(e)===0)return (wv(e)<<this._scale)-1;let o=Math.floor(Math.log(e)*this._scaleFactor),n=this._maxNormalLowerBoundaryIndex();return o>=n?n:o}lowerBoundary(e){let o=this._maxNormalLowerBoundaryIndex();if(e>=o){if(e===o)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new xs(`overflow: ${e} is > maximum lower boundary: ${o}`)}let n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return hb;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new xs(`overflow: ${e} is < minimum lower boundary: ${n}`)}return Math.exp(e*this._inverseFactor)}get scale(){return this._scale}_minNormalLowerBoundaryIndex(){return -1022<<this._scale}_maxNormalLowerBoundaryIndex(){return (1024<<this._scale)-1}};var DG=-10,NG=20,wbe=Array.from({length:31},(t,e)=>e>10?new xv(e-10):new Rv(e-10));function eO(t){if(t>NG||t<DG)throw new xs(`expected scale >= ${DG} && <= ${NG}, got: ${t}`);return wbe[t+10]}var wp=class t{static combine(e,o){return new t(Math.min(e.low,o.low),Math.max(e.high,o.high))}low;high;constructor(e,o){this.low=e,this.high=o;}},Rbe=20,xbe=160,tO=2,Mv=class t{startTime;_maxSize;_recordMinMax;_sum;_count;_zeroCount;_min;_max;_positive;_negative;_mapping;constructor(e,o=xbe,n=true,r=0,i=0,a=0,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=new fb,u=new fb,d=eO(Rbe)){this.startTime=e,this._maxSize=o,this._recordMinMax=n,this._sum=r,this._count=i,this._zeroCount=a,this._min=s,this._max=l,this._positive=c,this._negative=u,this._mapping=d,this._maxSize<tO&&(diag.warn(`Exponential Histogram Max Size set to ${this._maxSize}, changing to the minimum size of: ${tO}`),this._maxSize=tO);}record(e){this.updateByIncrement(e,1);}setStartTime(e){this.startTime=e;}toPointValue(){return {hasMinMax:this._recordMinMax,min:this.min,max:this.max,sum:this.sum,positive:{offset:this.positive.offset,bucketCounts:this.positive.counts()},negative:{offset:this.negative.offset,bucketCounts:this.negative.counts()},count:this.count,scale:this.scale,zeroCount:this.zeroCount}}get sum(){return this._sum}get min(){return this._min}get max(){return this._max}get count(){return this._count}get zeroCount(){return this._zeroCount}get scale(){return this._count===this._zeroCount?0:this._mapping.scale}get positive(){return this._positive}get negative(){return this._negative}updateByIncrement(e,o){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=o,e===0){this._zeroCount+=o;return}this._sum+=e*o,e>0?this._updateBuckets(this._positive,e,o):this._updateBuckets(this._negative,-e,o);}}merge(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.min<this.min&&(this._min=e.min),e.max>this.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;let o=this._minScale(e);this._downscale(this.scale-o),this._mergeBuckets(this.positive,e,e.positive,o),this._mergeBuckets(this.negative,e,e.negative,o);}diff(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;let o=this._minScale(e);this._downscale(this.scale-o),this._diffBuckets(this.positive,e,e.positive,o),this._diffBuckets(this.negative,e,e.negative,o);}clone(){return new t(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)}_updateBuckets(e,o,n){let r=this._mapping.mapToIndex(o),i=false,a=0,s=0;if(e.length===0?(e.indexStart=r,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):r<e.indexStart&&e.indexEnd-r>=this._maxSize?(i=true,s=r,a=e.indexEnd):r>e.indexEnd&&r-e.indexStart>=this._maxSize&&(i=true,s=e.indexStart,a=r),i){let l=this._changeScale(a,s);this._downscale(l),r=this._mapping.mapToIndex(o);}this._incrementIndexBy(e,r,n);}_incrementIndexBy(e,o,n){if(n===0)return;if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=o),o<e.indexStart){let i=e.indexEnd-o;i>=e.backing.length&&this._grow(e,i+1),e.indexStart=o;}else if(o>e.indexEnd){let i=o-e.indexStart;i>=e.backing.length&&this._grow(e,i+1),e.indexEnd=o;}let r=o-e.indexBase;r<0&&(r+=e.backing.length),e.incrementBucket(r,n);}_grow(e,o){let n=e.backing.length,r=e.indexBase-e.indexStart,i=n-r,a=_G(o);a>this._maxSize&&(a=this._maxSize);let s=a-r;e.backing.growTo(a,i,s);}_changeScale(e,o){let n=0;for(;e-o>=this._maxSize;)e>>=1,o>>=1,n++;return n}_downscale(e){if(e===0)return;if(e<0)throw new Error(`impossible change of scale: ${this.scale}`);let o=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=eO(o);}_minScale(e){let o=Math.min(this.scale,e.scale),n=wp.combine(this._highLowAtScale(this.positive,this.scale,o),this._highLowAtScale(e.positive,e.scale,o)),r=wp.combine(this._highLowAtScale(this.negative,this.scale,o),this._highLowAtScale(e.negative,e.scale,o));return Math.min(o-this._changeScale(n.high,n.low),o-this._changeScale(r.high,r.low))}_highLowAtScale(e,o,n){if(e.length===0)return new wp(0,-1);let r=o-n;return new wp(e.indexStart>>r,e.indexEnd>>r)}_mergeBuckets(e,o,n,r){let i=n.offset,a=o.scale-r;for(let s=0;s<n.length;s++)this._incrementIndexBy(e,i+s>>a,n.at(s));}_diffBuckets(e,o,n,r){let i=n.offset,a=o.scale-r;for(let s=0;s<n.length;s++){let c=(i+s>>a)-e.indexBase;c<0&&(c+=e.backing.length),e.decrementBucket(c,n.at(s));}e.trim();}},bb=class{kind=ia.EXPONENTIAL_HISTOGRAM;_maxSize;_recordMinMax;constructor(e,o){this._maxSize=e,this._recordMinMax=o;}createAccumulation(e){return new Mv(e,this._maxSize,this._recordMinMax)}merge(e,o){let n=o.clone();return n.merge(e),n}diff(e,o){let n=o.clone();return n.diff(e),n}toMetricData(e,o,n,r){return {descriptor:e,aggregationTemporality:o,dataPointType:Tr.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(([i,a])=>{let s=a.toPointValue(),l=e.type===Fe.GAUGE||e.type===Fe.UP_DOWN_COUNTER||e.type===Fe.OBSERVABLE_GAUGE||e.type===Fe.OBSERVABLE_UP_DOWN_COUNTER;return {attributes:i,startTime:a.startTime,endTime:r,value:{min:s.hasMinMax?s.min:void 0,max:s.hasMinMax?s.max:void 0,sum:l?void 0:s.sum,positive:{offset:s.positive.offset,bucketCounts:s.positive.bucketCounts},negative:{offset:s.negative.offset,bucketCounts:s.negative.bucketCounts},count:s.count,scale:s.scale,zeroCount:s.zeroCount}}})}}};var Ap=class{startTime;_current;sampleTime;constructor(e,o=0,n=[0,0]){this.startTime=e,this._current=o,this.sampleTime=n;}record(e){this._current=e,this.sampleTime=millisToHrTime(Date.now());}setStartTime(e){this.startTime=e;}toPointValue(){return this._current}},yb=class{kind=ia.LAST_VALUE;createAccumulation(e){return new Ap(e)}merge(e,o){let n=hrTimeToMicroseconds(o.sampleTime)>=hrTimeToMicroseconds(e.sampleTime)?o:e;return new Ap(e.startTime,n.toPointValue(),n.sampleTime)}diff(e,o){let n=hrTimeToMicroseconds(o.sampleTime)>=hrTimeToMicroseconds(e.sampleTime)?o:e;return new Ap(o.startTime,n.toPointValue(),n.sampleTime)}toMetricData(e,o,n,r){return {descriptor:e,aggregationTemporality:o,dataPointType:Tr.GAUGE,dataPoints:n.map(([i,a])=>({attributes:i,startTime:a.startTime,endTime:r,value:a.toPointValue()}))}}};var Ac=class{startTime;monotonic;_current;reset;constructor(e,o,n=0,r=false){this.startTime=e,this.monotonic=o,this._current=n,this.reset=r;}record(e){this.monotonic&&e<0||(this._current+=e);}setStartTime(e){this.startTime=e;}toPointValue(){return this._current}},Rp=class{kind=ia.SUM;monotonic;constructor(e){this.monotonic=e;}createAccumulation(e){return new Ac(e,this.monotonic)}merge(e,o){let n=e.toPointValue(),r=o.toPointValue();return o.reset?new Ac(o.startTime,this.monotonic,r,o.reset):new Ac(e.startTime,this.monotonic,n+r)}diff(e,o){let n=e.toPointValue(),r=o.toPointValue();return this.monotonic&&n>r?new Ac(o.startTime,this.monotonic,r,true):new Ac(o.startTime,this.monotonic,r-n)}toMetricData(e,o,n,r){return {descriptor:e,aggregationTemporality:o,dataPointType:Tr.SUM,dataPoints:n.map(([i,a])=>({attributes:i,startTime:a.startTime,endTime:r,value:a.toPointValue()})),isMonotonic:this.monotonic}}};var oO=class t{static DEFAULT_INSTANCE=new pb;createAggregator(e){return t.DEFAULT_INSTANCE}};var nO=class t{static MONOTONIC_INSTANCE=new Rp(true);static NON_MONOTONIC_INSTANCE=new Rp(false);createAggregator(e){switch(e.type){case Fe.COUNTER:case Fe.OBSERVABLE_COUNTER:case Fe.HISTOGRAM:return t.MONOTONIC_INSTANCE;default:return t.NON_MONOTONIC_INSTANCE}}};var rO=class t{static DEFAULT_INSTANCE=new yb;createAggregator(e){return t.DEFAULT_INSTANCE}};var iO=class t{static DEFAULT_INSTANCE=new Cp([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],true);createAggregator(e){return t.DEFAULT_INSTANCE}};var Sb=class{_boundaries;_recordMinMax;constructor(e,o=true){if(e==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");e=e.concat(),e=e.sort((i,a)=>i-a);let n=e.lastIndexOf(-1/0),r=e.indexOf(1/0);r===-1&&(r=void 0),this._boundaries=e.slice(n+1,r),this._recordMinMax=o;}createAggregator(e){return new Cp(this._boundaries,this._recordMinMax)}},Tb=class{_maxSize;_recordMinMax;constructor(e=160,o=true){this._maxSize=e,this._recordMinMax=o;}createAggregator(e){return new bb(this._maxSize,this._recordMinMax)}},aO=class{_resolve(e){switch(e.type){case Fe.COUNTER:case Fe.UP_DOWN_COUNTER:case Fe.OBSERVABLE_COUNTER:case Fe.OBSERVABLE_UP_DOWN_COUNTER:return lO;case Fe.GAUGE:case Fe.OBSERVABLE_GAUGE:return cO;case Fe.HISTOGRAM:return e.advice.explicitBucketBoundaries?new Sb(e.advice.explicitBucketBoundaries):uO}return Cb.diag.warn(`Unable to recognize instrument type: ${e.type}`),sO}createAggregator(e){return this._resolve(e).createAggregator(e)}},sO=new oO,lO=new nO,cO=new rO,uO=new iO,kG=new aO;var or;(function(t){t[t.DEFAULT=0]="DEFAULT",t[t.DROP=1]="DROP",t[t.SUM=2]="SUM",t[t.LAST_VALUE=3]="LAST_VALUE",t[t.EXPLICIT_BUCKET_HISTOGRAM=4]="EXPLICIT_BUCKET_HISTOGRAM",t[t.EXPONENTIAL_HISTOGRAM=5]="EXPONENTIAL_HISTOGRAM";})(or||(or={}));function Iv(t){switch(t.type){case or.DEFAULT:return kG;case or.DROP:return sO;case or.SUM:return lO;case or.LAST_VALUE:return cO;case or.EXPONENTIAL_HISTOGRAM:{let e=t;return new Tb(e.options?.maxSize,e.options?.recordMinMax)}case or.EXPLICIT_BUCKET_HISTOGRAM:{let e=t;return e.options==null?uO:new Sb(e.options?.boundaries,e.options?.recordMinMax)}default:throw new Error("Unsupported Aggregation")}}var FG=t=>({type:or.DEFAULT}),BG=t=>Sr.CUMULATIVE;var UG="otel.component.name",zG="otel.component.type",$G="periodic_metric_reader",VG="otel.sdk.metric_reader.collection.duration",jG="error.type";var HG=new Map,Eb=class{collectionDuration;standardAttrs;constructor(e,o){let n=HG.get(e)??0;HG.set(e,n+1),this.standardAttrs={[zG]:e,[UG]:`${e}/${n}`},this.collectionDuration=o.createHistogram(VG,{unit:"s",description:"The duration of the collect operation of the metric reader.",advice:{explicitBucketBoundaries:[]}});}recordCollection(e,o){let n=o?{...this.standardAttrs,[jG]:o}:this.standardAttrs;this.collectionDuration.record(e,n);}};var WG="2.8.0";var xp=class{_shutdown=false;_metricProducers;_sdkMetricProducer;_selfObsMetrics;_aggregationTemporalitySelector;_aggregationSelector;_cardinalitySelector;_otelComponentType;constructor(e){this._aggregationSelector=e?.aggregationSelector??FG,this._aggregationTemporalitySelector=e?.aggregationTemporalitySelector??BG,this._metricProducers=e?.metricProducers??[],this._cardinalitySelector=e?.cardinalitySelector,this._otelComponentType=e?.otelComponentType??this.constructor.name,this._selfObsMetrics=new Eb(this._otelComponentType,Cb.createNoopMeter());}setMetricProducer(e){if(this._sdkMetricProducer)throw new Error("MetricReader can not be bound to a MeterProvider again.");this._sdkMetricProducer=e,this.onInitialized();}_setSelfObsMeterProvider(e){let o=e.getMeter("@opentelemetry/sdk-metrics",WG);this._selfObsMetrics=new Eb(this._otelComponentType,o);}selectAggregation(e){return this._aggregationSelector(e)}selectAggregationTemporality(e){return this._aggregationTemporalitySelector(e)}selectCardinalityLimit(e){return this._cardinalitySelector?this._cardinalitySelector(e):2e3}onInitialized(){}async collect(e){if(this._sdkMetricProducer===void 0)throw new Error("MetricReader is not bound to a MetricProducer");if(this._shutdown)throw new Error("MetricReader is shutdown");let o=hrTime(),[n,...r]=await Promise.all([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis}),...this._metricProducers.map(u=>u.collect({timeoutMillis:e?.timeoutMillis}))]),i=hrTime(),a=n.errors.concat(r.flatMap(u=>u.errors)),s=hrTimeToSeconds(hrTimeDuration(o,i));this._selfObsMetrics.recordCollection(s,a.length>0?a[0].name??"collect_error":void 0);let l=n.resourceMetrics.resource,c=n.resourceMetrics.scopeMetrics.concat(r.flatMap(u=>u.resourceMetrics.scopeMetrics));return {resourceMetrics:{resource:l,scopeMetrics:c},errors:a}}async shutdown(e){if(this._shutdown){Cb.diag.error("Cannot call shutdown twice.");return}e?.timeoutMillis==null?await this.onShutdown():await wc(this.onShutdown(),e.timeoutMillis),this._shutdown=true;}async forceFlush(e){if(this._shutdown){Cb.diag.warn("Cannot forceFlush on already shutdown MetricReader.");return}if(e?.timeoutMillis==null){await this.onForceFlush();return}await wc(this.onForceFlush(),e.timeoutMillis);}};var wb=class extends xp{_interval;_exporter;_exportInterval;_exportTimeout;constructor(e){let{exporter:o,exportIntervalMillis:n=6e4,metricProducers:r,cardinalityLimits:i}=e,{exportTimeoutMillis:a=3e4}=e;if(super({aggregationSelector:o.selectAggregation?.bind(o),aggregationTemporalitySelector:o.selectAggregationTemporality?.bind(o),otelComponentType:$G,metricProducers:r,cardinalitySelector:s=>{let l={default:2e3,...i};switch(s){case Fe.COUNTER:return l.counter??l.default;case Fe.GAUGE:return l.gauge??l.default;case Fe.HISTOGRAM:return l.histogram??l.default;case Fe.OBSERVABLE_COUNTER:return l.observableCounter??l.default;case Fe.OBSERVABLE_UP_DOWN_COUNTER:return l.observableUpDownCounter??l.default;case Fe.OBSERVABLE_GAUGE:return l.observableGauge??l.default;case Fe.UP_DOWN_COUNTER:return l.upDownCounter??l.default;default:return l.default}}}),n<=0)throw Error("exportIntervalMillis must be greater than 0");if(a<=0)throw Error("exportTimeoutMillis must be greater than 0");if(n<a){if("exportIntervalMillis"in e&&"exportTimeoutMillis"in e)throw Error("exportIntervalMillis must be greater than or equal to exportTimeoutMillis");Cb.diag.info(`Timeout of ${a} exceeds the interval of ${n}. Clamping timeout to interval duration.`),a=n;}this._exportInterval=n,this._exportTimeout=a,this._exporter=o;}async _runOnce(){try{await wc(this._doRun(),this._exportTimeout);}catch(e){if(e instanceof mb){Cb.diag.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout);return}globalErrorHandler(e);}}async _doRun(){let{resourceMetrics:e,errors:o}=await this.collect({timeoutMillis:this._exportTimeout});if(o.length>0&&Cb.diag.error("PeriodicExportingMetricReader: metrics collection errors",...o),e.resource.asyncAttributesPending)try{await e.resource.waitForAsyncAttributes?.();}catch(r){Cb.diag.debug("Error while resolving async portion of resource: ",r),globalErrorHandler(r);}if(e.scopeMetrics.length===0)return;let n=await internal._export(this._exporter,e);if(n.code!==ExportResultCode.SUCCESS)throw new Error(`PeriodicExportingMetricReader: metrics export failed (error ${n.error})`)}onInitialized(){this._interval=setInterval(()=>{this._runOnce();},this._exportInterval),typeof this._interval!="number"&&this._interval.unref();}async onForceFlush(){await this._runOnce(),await this._exporter.forceFlush();}async onShutdown(){this._interval&&clearInterval(this._interval),await this.onForceFlush(),await this._exporter.shutdown();}};var _v=class{_registeredViews=[];addView(e){this._registeredViews.push(e);}findViews(e,o){return this._registeredViews.filter(r=>this._matchInstrument(r.instrumentSelector,e)&&this._matchMeter(r.meterSelector,o))}_matchInstrument(e,o){return (e.getType()===void 0||o.type===e.getType())&&e.getNameFilter().match(o.name)&&e.getUnitFilter().match(o.unit)}_matchMeter(e,o){return e.getNameFilter().match(o.name)&&(o.version===void 0||e.getVersionFilter().match(o.version))&&(o.schemaUrl===void 0||e.getSchemaUrlFilter().match(o.schemaUrl))}};function Ms(t,e,o){return kbe(t)||diag.warn(`Invalid metric name: "${t}". The metric name should be a ASCII string with a length no greater than 255 characters.`),{name:t,type:e,description:o?.description??"",unit:o?.unit??"",valueType:o?.valueType??ValueType.DOUBLE,advice:o?.advice??{}}}function KG(t,e){return {name:t.name??e.name,description:t.description??e.description,type:e.type,unit:e.unit,valueType:e.valueType,advice:e.advice}}function YG(t,e){return PG(t.name,e.name)&&t.unit===e.unit&&t.type===e.type&&t.valueType===e.valueType}var Lbe=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function kbe(t){return Lbe.test(t)}var Mp=class{_writableMetricStorage;_descriptor;constructor(e,o){this._writableMetricStorage=e,this._descriptor=o;}_record(e,o={},n=context.active()){if(typeof e!="number"){diag.warn(`non-number value provided to metric ${this._descriptor.name}: ${e}`);return}this._descriptor.valueType===ValueType.INT&&!Number.isInteger(e)&&(diag.warn(`INT value type cannot accept a floating-point value for ${this._descriptor.name}, ignoring the fractional digits.`),e=Math.trunc(e),!Number.isInteger(e))||this._writableMetricStorage.record(e,o,n,millisToHrTime(Date.now()));}},Dv=class extends Mp{add(e,o,n){this._record(e,o,n);}},Nv=class extends Mp{add(e,o,n){if(e<0){diag.warn(`negative value provided to counter ${this._descriptor.name}: ${e}`);return}this._record(e,o,n);}},Lv=class extends Mp{record(e,o,n){this._record(e,o,n);}},kv=class extends Mp{record(e,o,n){if(e<0){diag.warn(`negative value provided to histogram ${this._descriptor.name}: ${e}`);return}this._record(e,o,n);}},Pp=class{_metricStorages;_descriptor;_observableRegistry;constructor(e,o,n){this._descriptor=e,this._metricStorages=o,this._observableRegistry=n;}addCallback(e){this._observableRegistry.addCallback(e,this);}removeCallback(e){this._observableRegistry.removeCallback(e,this);}},Fv=class extends Pp{},Bv=class extends Pp{},Uv=class extends Pp{};function Ab(t){return t instanceof Pp}var zv=class{_meterSharedState;constructor(e){this._meterSharedState=e;}createGauge(e,o){let n=Ms(e,Fe.GAUGE,o),r=this._meterSharedState.registerMetricStorage(n);return new Lv(r,n)}createHistogram(e,o){let n=Ms(e,Fe.HISTOGRAM,o),r=this._meterSharedState.registerMetricStorage(n);return new kv(r,n)}createCounter(e,o){let n=Ms(e,Fe.COUNTER,o),r=this._meterSharedState.registerMetricStorage(n);return new Nv(r,n)}createUpDownCounter(e,o){let n=Ms(e,Fe.UP_DOWN_COUNTER,o),r=this._meterSharedState.registerMetricStorage(n);return new Dv(r,n)}createObservableGauge(e,o){let n=Ms(e,Fe.OBSERVABLE_GAUGE,o),r=this._meterSharedState.registerAsyncMetricStorage(n);return new Bv(n,r,this._meterSharedState.observableRegistry)}createObservableCounter(e,o){let n=Ms(e,Fe.OBSERVABLE_COUNTER,o),r=this._meterSharedState.registerAsyncMetricStorage(n);return new Fv(n,r,this._meterSharedState.observableRegistry)}createObservableUpDownCounter(e,o){let n=Ms(e,Fe.OBSERVABLE_UP_DOWN_COUNTER,o),r=this._meterSharedState.registerAsyncMetricStorage(n);return new Uv(n,r,this._meterSharedState.observableRegistry)}addBatchObservableCallback(e,o){this._meterSharedState.observableRegistry.addBatchCallback(e,o);}removeBatchObservableCallback(e,o){this._meterSharedState.observableRegistry.removeBatchCallback(e,o);}};var Ip=class{_instrumentDescriptor;constructor(e){this._instrumentDescriptor=e;}getInstrumentDescriptor(){return this._instrumentDescriptor}updateDescription(e){this._instrumentDescriptor=Ms(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice});}};var dO=class{_valueMap=new Map;_keyMap=new Map;_hash;constructor(e){this._hash=e;}get(e,o){return o??=this._hash(e),this._valueMap.get(o)}getOrDefault(e,o){let n=this._hash(e);if(this._valueMap.has(n))return this._valueMap.get(n);let r=o();return this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,r),r}set(e,o,n){n??=this._hash(e),this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,o);}has(e,o){return o??=this._hash(e),this._valueMap.has(o)}*keys(){let e=this._keyMap.entries(),o=e.next();for(;o.done!==true;)yield [o.value[1],o.value[0]],o=e.next();}*entries(){let e=this._valueMap.entries(),o=e.next();for(;o.done!==true;)yield [this._keyMap.get(o.value[0]),o.value[1],o.value[0]],o=e.next();}get size(){return this._valueMap.size}},_i=class extends dO{constructor(){super(Cv);}};var _p=class{_activeCollectionStorage=new _i;_cumulativeMemoStorage=new _i;_cardinalityLimit;_overflowAttributes={"otel.metric.overflow":true};_overflowHashCode;_aggregator;constructor(e,o){this._aggregator=e,this._cardinalityLimit=(o??2e3)-1,this._overflowHashCode=Cv(this._overflowAttributes);}record(e,o,n,r){let i=this._activeCollectionStorage.get(o);if(!i){if(this._activeCollectionStorage.size>=this._cardinalityLimit){this._activeCollectionStorage.getOrDefault(this._overflowAttributes,()=>this._aggregator.createAccumulation(r))?.record(e);return}i=this._aggregator.createAccumulation(r),this._activeCollectionStorage.set(o,i);}i?.record(e);}batchCumulate(e,o){for(let[n,r,i]of e.entries()){let a=n,s=i,l=this._aggregator.createAccumulation(o);l?.record(r);let c=l;if(this._cumulativeMemoStorage.has(a,s)){let u=this._cumulativeMemoStorage.get(a,s);c=this._aggregator.diff(u,l);}else if(this._cumulativeMemoStorage.size>=this._cardinalityLimit&&(a=this._overflowAttributes,s=this._overflowHashCode,this._cumulativeMemoStorage.has(a,s))){let u=this._cumulativeMemoStorage.get(a,s);c=this._aggregator.diff(u,l);}if(this._activeCollectionStorage.has(a,s)){let u=this._activeCollectionStorage.get(a,s);c=this._aggregator.merge(u,c);}this._cumulativeMemoStorage.set(a,l,s),this._activeCollectionStorage.set(a,c,s);}}collect(){let e=this._activeCollectionStorage;return this._activeCollectionStorage=new _i,e}};var Op=class t{_aggregator;_unreportedAccumulations=new Map;_reportHistory=new Map;constructor(e,o){this._aggregator=e,o.forEach(n=>{this._unreportedAccumulations.set(n,[]);});}buildMetrics(e,o,n,r){this._stashAccumulations(n);let i=this._getMergedUnreportedAccumulations(e),a=i,s;if(this._reportHistory.has(e)){let c=this._reportHistory.get(e),u=c.collectionTime;s=c.aggregationTemporality,s===Sr.CUMULATIVE?a=t.merge(c.accumulations,i,this._aggregator):a=t.calibrateStartTime(c.accumulations,i,u);}else s=e.selectAggregationTemporality(o.type);this._reportHistory.set(e,{accumulations:a,collectionTime:r,aggregationTemporality:s});let l=zbe(a);if(l.length!==0)return this._aggregator.toMetricData(o,s,l,r)}_stashAccumulations(e){let o=this._unreportedAccumulations.keys();for(let n of o){let r=this._unreportedAccumulations.get(n);r===void 0&&(r=[],this._unreportedAccumulations.set(n,r)),r.push(e);}}_getMergedUnreportedAccumulations(e){let o=new _i,n=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),n===void 0)return o;for(let r of n)o=t.merge(o,r,this._aggregator);return o}static merge(e,o,n){let r=e,i=o.entries(),a=i.next();for(;a.done!==true;){let[s,l,c]=a.value;if(e.has(s,c)){let u=e.get(s,c),d=n.merge(u,l);r.set(s,d,c);}else r.set(s,l,c);a=i.next();}return r}static calibrateStartTime(e,o,n){for(let[r,i]of e.keys())o.get(r,i)?.setStartTime(n);return o}};function zbe(t){return Array.from(t.entries())}var $v=class extends Ip{_aggregationCardinalityLimit;_deltaMetricStorage;_temporalMetricStorage;_attributesProcessor;constructor(e,o,n,r,i){super(e),this._aggregationCardinalityLimit=i,this._deltaMetricStorage=new _p(o,this._aggregationCardinalityLimit),this._temporalMetricStorage=new Op(o,r),this._attributesProcessor=n;}record(e,o){let n=new _i;for(let[r,i]of e.entries())n.set(this._attributesProcessor.process(r),i);this._deltaMetricStorage.batchCumulate(n,o);}collect(e,o){let n=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(e,this._instrumentDescriptor,n,o)}};function mO(t,e){let o="";return t.unit!==e.unit&&(o+=` - Unit '${t.unit}' does not match '${e.unit}'
177
177
  `),t.type!==e.type&&(o+=` - Type '${t.type}' does not match '${e.type}'
178
178
  `),t.valueType!==e.valueType&&(o+=` - Value Type '${t.valueType}' does not match '${e.valueType}'
179
179
  `),t.description!==e.description&&(o+=` - Description '${t.description}' does not match '${e.description}'
@@ -185,14 +185,14 @@ ${this.decisions.map(e=>e.toString()).join(`
185
185
  To resolve the conflict:`,pO(i,e))),n=r):Cb.diag.warn("A view or instrument with the name ",e.name,` has already been registered and is incompatible with another registered view.
186
186
  `,`Details:
187
187
  `,mO(i,e),`To resolve the conflict:
188
- `,pO(i,e));}return n}};var jv=class{_backingStorages;constructor(e){this._backingStorages=e;}record(e,o,n,r){let i=this._backingStorages;for(let a=0;a<i.length;a++)i[a].record(e,o,n,r);}};var Wv=class{_buffer=new _i;_instrumentName;_valueType;constructor(e,o){this._instrumentName=e,this._valueType=o;}observe(e,o={}){if(typeof e!="number"){diag.warn(`non-number value provided to metric ${this._instrumentName}: ${e}`);return}this._valueType===ValueType.INT&&!Number.isInteger(e)&&(diag.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(o,e);}},Gv=class{_buffer=new Map;observe(e,o,n={}){if(!Ab(e))return;let r=this._buffer.get(e);if(r==null&&(r=new _i,this._buffer.set(e,r)),typeof o!="number"){diag.warn(`non-number value provided to metric ${e._descriptor.name}: ${o}`);return}e._descriptor.valueType===ValueType.INT&&!Number.isInteger(o)&&(diag.warn(`INT value type cannot accept a floating-point value for ${e._descriptor.name}, ignoring the fractional digits.`),o=Math.trunc(o),!Number.isInteger(o))||r.set(n,o);}};var qv=class{_callbacks=[];_batchCallbacks=[];addCallback(e,o){this._findCallback(e,o)>=0||this._callbacks.push({callback:e,instrument:o});}removeCallback(e,o){let n=this._findCallback(e,o);n<0||this._callbacks.splice(n,1);}addBatchCallback(e,o){let n=new Set(o.filter(Ab));if(n.size===0){diag.error("BatchObservableCallback is not associated with valid instruments",o);return}this._findBatchCallback(e,n)>=0||this._batchCallbacks.push({callback:e,instruments:n});}removeBatchCallback(e,o){let n=new Set(o.filter(Ab)),r=this._findBatchCallback(e,n);r<0||this._batchCallbacks.splice(r,1);}async observe(e,o){let n=this._observeCallbacks(e,o),r=this._observeBatchCallbacks(e,o);return (await Promise.allSettled([...n,...r])).filter(s=>s.status==="rejected").map(s=>s.reason)}_observeCallbacks(e,o){return this._callbacks.map(async({callback:n,instrument:r})=>{let i=new Wv(r._descriptor.name,r._descriptor.valueType),a=Promise.resolve(n(i));o!=null&&(a=wc(a,o)),await a,r._metricStorages.forEach(s=>{s.record(i._buffer,e);});})}_observeBatchCallbacks(e,o){return this._batchCallbacks.map(async({callback:n,instruments:r})=>{let i=new Gv,a=Promise.resolve(n(i));o!=null&&(a=wc(a,o)),await a,r.forEach(s=>{let l=i._buffer.get(s);l!=null&&s._metricStorages.forEach(c=>{c.record(l,e);});});})}_findCallback(e,o){return this._callbacks.findIndex(n=>n.callback===e&&n.instrument===o)}_findBatchCallback(e,o){return this._batchCallbacks.findIndex(n=>n.callback===e&&xG(n.instruments,o))}};var Kv=class extends Ip{_aggregationCardinalityLimit;_deltaMetricStorage;_temporalMetricStorage;_attributesProcessor;constructor(e,o,n,r,i){super(e),this._aggregationCardinalityLimit=i,this._deltaMetricStorage=new _p(o,this._aggregationCardinalityLimit),this._temporalMetricStorage=new Op(o,r),this._attributesProcessor=n;}record(e,o,n,r){o=this._attributesProcessor.process(o,n),this._deltaMetricStorage.record(e,o,n,r);}collect(e,o){let n=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(e,this._instrumentDescriptor,n,o)}};var hO=class{process(e,o){return e}},gO=class{_processors;constructor(e){this._processors=e;}process(e,o){let n=e;for(let r of this._processors)n=r.process(n,o);return n}};function Yv(){return Gbe}function JG(t){return new gO(t)}var Gbe=new hO;var Xv=class{metricStorageRegistry=new Vv;observableRegistry=new qv;meter;_meterProviderSharedState;_instrumentationScope;constructor(e,o){this.meter=new zv(this),this._meterProviderSharedState=e,this._instrumentationScope=o;}registerMetricStorage(e){let o=this._registerMetricStorage(e,Kv);return o.length===1?o[0]:new jv(o)}registerAsyncMetricStorage(e){return this._registerMetricStorage(e,$v)}async collect(e,o,n){let r=await this.observableRegistry.observe(o,n?.timeoutMillis),i=this.metricStorageRegistry.getStorages(e);if(i.length===0)return null;let a=[];return i.forEach(s=>{let l=s.collect(e,o);l!=null&&a.push(l);}),a.length===0?{errors:r}:{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:r}}_registerMetricStorage(e,o){let r=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope).map(i=>{let a=KG(i,e),s=this.metricStorageRegistry.findOrUpdateCompatibleStorage(a);if(s!=null)return s;let l=i.aggregation.createAggregator(a),c=new o(a,l,i.attributesProcessor,this._meterProviderSharedState.metricCollectors,i.aggregationCardinalityLimit);return this.metricStorageRegistry.register(c),c});if(r.length===0){let a=this._meterProviderSharedState.selectAggregations(e.type).map(([s,l])=>{let c=this.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(s,e);if(c!=null)return c;let u=l.createAggregator(e),d=s.selectCardinalityLimit(e.type),m=new o(e,u,Yv(),[s],d);return this.metricStorageRegistry.registerForCollector(s,m),m});r=r.concat(a);}return r}};var Jv=class{viewRegistry=new _v;metricCollectors=[];meterSharedStates=new Map;resource;constructor(e){this.resource=e;}getMeterSharedState(e){let o=RG(e),n=this.meterSharedStates.get(o);return n==null&&(n=new Xv(this,e),this.meterSharedStates.set(o,n)),n}selectAggregations(e){let o=[];for(let n of this.metricCollectors)o.push([n,Iv(n.selectAggregation(e))]);return o}};var Zv=class{_sharedState;_metricReader;constructor(e,o){this._sharedState=e,this._metricReader=o;}async collect(e){let o=millisToHrTime(Date.now()),n=[],r=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(async a=>{let s=await a.collect(this,o,e);s?.scopeMetrics!=null&&n.push(s.scopeMetrics),s?.errors!=null&&r.push(...s.errors);});return await Promise.all(i),{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:r}}async forceFlush(e){await this._metricReader.forceFlush(e);}async shutdown(e){await this._metricReader.shutdown(e);}selectAggregationTemporality(e){return this._metricReader.selectAggregationTemporality(e)}selectAggregation(e){return this._metricReader.selectAggregation(e)}selectCardinalityLimit(e){return this._metricReader.selectCardinalityLimit?.(e)??2e3}};var Kbe=/[\^$\\.+?()[\]{}|]/g,Dp=class t{_matchAll;_regexp;constructor(e){e==="*"?(this._matchAll=true,this._regexp=/.*/):(this._matchAll=false,this._regexp=new RegExp(t.escapePattern(e)));}match(e){return this._matchAll?true:this._regexp.test(e)}static escapePattern(e){return `^${e.replace(Kbe,"\\$&").replace("*",".*")}$`}static hasWildcard(e){return e.includes("*")}},Rc=class{_matchAll;_pattern;constructor(e){this._matchAll=e===void 0,this._pattern=e;}match(e){return !!(this._matchAll||e===this._pattern)}};var Qv=class{_nameFilter;_type;_unitFilter;constructor(e){this._nameFilter=new Dp(e?.name??"*"),this._type=e?.type,this._unitFilter=new Rc(e?.unit);}getType(){return this._type}getNameFilter(){return this._nameFilter}getUnitFilter(){return this._unitFilter}};var eC=class{_nameFilter;_versionFilter;_schemaUrlFilter;constructor(e){this._nameFilter=new Rc(e?.name),this._versionFilter=new Rc(e?.version),this._schemaUrlFilter=new Rc(e?.schemaUrl);}getNameFilter(){return this._nameFilter}getVersionFilter(){return this._versionFilter}getSchemaUrlFilter(){return this._schemaUrlFilter}};function Ybe(t){return t.instrumentName==null&&t.instrumentType==null&&t.instrumentUnit==null&&t.meterName==null&&t.meterVersion==null&&t.meterSchemaUrl==null}function Xbe(t){if(Ybe(t))throw new Error("Cannot create view with no selector arguments supplied");if(t.name!=null&&(t?.instrumentName==null||Dp.hasWildcard(t.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.")}var tC=class{name;description;aggregation;attributesProcessor;instrumentSelector;meterSelector;aggregationCardinalityLimit;constructor(e){Xbe(e),e.attributesProcessors!=null?this.attributesProcessor=JG(e.attributesProcessors):this.attributesProcessor=Yv(),this.name=e.name,this.description=e.description,this.aggregation=Iv(e.aggregation??{type:or.DEFAULT}),this.instrumentSelector=new Qv({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new eC({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit;}};var Rb=class{_sharedState;_shutdown=false;constructor(e){if(this._sharedState=new Jv(e?.resource??defaultResource()),e?.views!=null&&e.views.length>0)for(let o of e.views)this._sharedState.viewRegistry.addView(new tC(o));if(e?.readers!=null&&e.readers.length>0)for(let o of e.readers){let n=new Zv(this._sharedState,o);o.setMetricProducer(n),this._sharedState.metricCollectors.push(n),e.sdkMetricsEnabled&&o instanceof xp&&o._setSelfObsMeterProvider(this);}}getMeter(e,o="",n={}){return this._shutdown?(diag.warn("A shutdown MeterProvider cannot provide a Meter"),createNoopMeter()):this._sharedState.getMeterSharedState({name:e,version:o,schemaUrl:n.schemaUrl}).meter}async shutdown(e){if(this._shutdown){diag.warn("shutdown may only be called once per MeterProvider");return}this._shutdown=true,await Promise.all(this._sharedState.metricCollectors.map(o=>o.shutdown(e)));}async forceFlush(e){if(this._shutdown){diag.warn("invalid attempt to force flush after MeterProvider shutdown");return}await Promise.all(this._sharedState.metricCollectors.map(o=>o.forceFlush(e)));}};var xc;(function(t){t[t.DELTA=0]="DELTA",t[t.CUMULATIVE=1]="CUMULATIVE",t[t.LOWMEMORY=2]="LOWMEMORY";})(xc||(xc={}));var xb=class{_delegate;constructor(e){this._delegate=e;}export(e,o){this._delegate.export(e,o);}forceFlush(){return this._delegate.forceFlush()}shutdown(){return this._delegate.shutdown()}};var rd=class extends Error{code;name="OTLPExporterError";data;constructor(e,o,n){super(e),this.data=n,this.code=o;}};function Qbe(t){if(Number.isFinite(t)&&t>0)return t;throw new Error(`Configuration: timeoutMillis is invalid, expected number greater than 0 (actual: '${t}')`)}function oC(t){if(t!=null)return async()=>t}function ZG(t,e,o){return {timeoutMillis:Qbe(t.timeoutMillis??e.timeoutMillis??o.timeoutMillis),concurrencyLimit:t.concurrencyLimit??e.concurrencyLimit??o.concurrencyLimit,compression:t.compression??e.compression??o.compression}}function QG(){return {timeoutMillis:1e4,concurrencyLimit:30,compression:"none"}}var yO=class{_concurrencyLimit;_sendingPromises=[];constructor(e){this._concurrencyLimit=e;}pushPromise(e){if(this.hasReachedLimit())throw new Error("Concurrency Limit reached");this._sendingPromises.push(e);let o=()=>{let n=this._sendingPromises.indexOf(e);this._sendingPromises.splice(n,1);};e.then(o,o);}hasReachedLimit(){return this._sendingPromises.length>=this._concurrencyLimit}async awaitAll(){await Promise.all(this._sendingPromises);}};function eq(t){return new yO(t.concurrencyLimit)}function tye(t){return Object.prototype.hasOwnProperty.call(t,"partialSuccess")}function tq(){return {handleResponse(t){t==null||!tye(t)||t.partialSuccess==null||Object.keys(t.partialSuccess).length===0||diag.warn("Received Partial Success response:",JSON.stringify(t.partialSuccess));}}}var SO=class{_diagLogger;_transport;_serializer;_responseHandler;_promiseQueue;_timeout;constructor(e,o,n,r,i){this._transport=e,this._serializer=o,this._responseHandler=n,this._promiseQueue=r,this._timeout=i,this._diagLogger=diag.createComponentLogger({namespace:"OTLPExportDelegate"});}export(e,o){if(this._diagLogger.debug("items to be sent",e),this._promiseQueue.hasReachedLimit()){o({code:ExportResultCode.FAILED,error:new Error("Concurrent export limit reached")});return}let n=this._serializer.serializeRequest(e);if(n==null){o({code:ExportResultCode.FAILED,error:new Error("Nothing to send")});return}this._promiseQueue.pushPromise(this._transport.send(n,this._timeout).then(r=>{if(r.status==="success"){if(r.data!=null)try{this._responseHandler.handleResponse(this._serializer.deserializeResponse(r.data));}catch(i){this._diagLogger.warn("Export succeeded but could not deserialize response - is the response specification compliant?",i,r.data);}o({code:ExportResultCode.SUCCESS});return}else if(r.status==="failure"&&r.error){o({code:ExportResultCode.FAILED,error:r.error});return}else r.status==="retryable"?o({code:ExportResultCode.FAILED,error:r.error??new rd("Export failed with retryable status")}):o({code:ExportResultCode.FAILED,error:new rd("Export failed with unknown error")});},r=>o({code:ExportResultCode.FAILED,error:r})));}forceFlush(){return this._promiseQueue.awaitAll()}async shutdown(){this._diagLogger.debug("shutdown started"),await this.forceFlush(),this._transport.shutdown();}};function oq(t,e){return new SO(t.transport,t.serializer,tq(),t.promiseHandler,e.timeout)}var TO=()=>Sr.CUMULATIVE,nq=t=>{switch(t){case Fe.COUNTER:case Fe.OBSERVABLE_COUNTER:case Fe.GAUGE:case Fe.HISTOGRAM:case Fe.OBSERVABLE_GAUGE:return Sr.DELTA;case Fe.UP_DOWN_COUNTER:case Fe.OBSERVABLE_UP_DOWN_COUNTER:return Sr.CUMULATIVE}},rq=t=>{switch(t){case Fe.COUNTER:case Fe.HISTOGRAM:return Sr.DELTA;case Fe.GAUGE:case Fe.UP_DOWN_COUNTER:case Fe.OBSERVABLE_UP_DOWN_COUNTER:case Fe.OBSERVABLE_COUNTER:case Fe.OBSERVABLE_GAUGE:return Sr.CUMULATIVE}};function iye(){let t=(getStringFromEnv("OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE")??"cumulative").toLowerCase();return t==="cumulative"?TO:t==="delta"?nq:t==="lowmemory"?rq:(diag.warn(`OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to '${t}', but only 'cumulative' and 'delta' are allowed. Using default ('cumulative') instead.`),TO)}function aye(t){return t!=null?t===xc.DELTA?nq:t===xc.LOWMEMORY?rq:TO:iye()}var sye=Object.freeze({type:or.DEFAULT});function lye(t){return t?.aggregationPreference??(()=>sye)}var nC=class extends xb{_aggregationTemporalitySelector;_aggregationSelector;constructor(e,o){super(e),this._aggregationSelector=lye(o),this._aggregationTemporalitySelector=aye(o?.temporalityPreference);}selectAggregation(e){return this._aggregationSelector(e)}selectAggregationTemporality(e){return this._aggregationTemporalitySelector(e)}};function iq(t,e){let o={attributes:Np(t.attributes,e),droppedAttributesCount:0},n=t.schemaUrl;return n&&n!==""&&(o.schemaUrl=n),o}function aq(t,e){let o={name:t.name,version:t.version};return t.attributes&&Object.keys(t.attributes).length>0&&(o.attributes=Np(t.attributes,e),o.droppedAttributesCount=t.droppedAttributesCount??0),o}function Np(t,e){return Object.keys(t).map(o=>cye(o,t[o],e))}function cye(t,e,o){return {key:t,value:EO(e,o)}}function EO(t,e){let o=typeof t;if(o==="string")return {stringValue:t};if(o==="number")return Number.isInteger(t)?{intValue:t}:{doubleValue:t};if(o==="boolean")return {boolValue:t};if(t instanceof Uint8Array)return {bytesValue:e.encodeUint8Array(t)};if(Array.isArray(t)){let n=new Array(t.length);for(let r=0;r<t.length;r++)n[r]=EO(t[r],e);return {arrayValue:{values:n}}}if(o==="object"&&t!=null){let n=Object.keys(t),r=new Array(n.length);for(let i=0;i<n.length;i++)r[i]={key:n[i],value:EO(t[n[i]],e)};return {kvlistValue:{values:r}}}return {}}function dye(t){let e=BigInt(1e9);return BigInt(Math.trunc(t[0]))*e+BigInt(Math.trunc(t[1]))}function mye(t){return dye(t).toString()}var pye=typeof BigInt<"u"?mye:hrTimeToNanoseconds;function sq(t){return t}var lq={encodeHrTime:pye,encodeSpanContext:sq,encodeOptionalSpanContext:sq,encodeUint8Array:t=>{if(typeof Buffer<"u")return Buffer.from(t).toString("base64");let e=new Array(t.length);for(let o=0;o<t.length;o++)e[o]=String.fromCharCode(t[o]);return btoa(e.join(""))}};var Mb;(function(t){t[t.AGGREGATION_TEMPORALITY_UNSPECIFIED=0]="AGGREGATION_TEMPORALITY_UNSPECIFIED",t[t.AGGREGATION_TEMPORALITY_DELTA=1]="AGGREGATION_TEMPORALITY_DELTA",t[t.AGGREGATION_TEMPORALITY_CUMULATIVE=2]="AGGREGATION_TEMPORALITY_CUMULATIVE";})(Mb||(Mb={}));function fye(t,e){let o=iq(t.resource,e);return {resource:o,schemaUrl:o.schemaUrl,scopeMetrics:hye(t.scopeMetrics,e)}}function hye(t,e){return Array.from(t.map(o=>({scope:aq(o.scope,e),metrics:o.metrics.map(n=>gye(n,e)),schemaUrl:o.scope.schemaUrl})))}function gye(t,e){let o={name:t.descriptor.name,description:t.descriptor.description,unit:t.descriptor.unit},n=Tye(t.aggregationTemporality);switch(t.dataPointType){case Tr.SUM:o.sum={aggregationTemporality:n,isMonotonic:t.isMonotonic,dataPoints:uq(t,e)};break;case Tr.GAUGE:o.gauge={dataPoints:uq(t,e)};break;case Tr.HISTOGRAM:o.histogram={aggregationTemporality:n,dataPoints:yye(t,e)};break;case Tr.EXPONENTIAL_HISTOGRAM:o.exponentialHistogram={aggregationTemporality:n,dataPoints:Sye(t,e)};break}return o}function bye(t,e,o){let n={attributes:Np(t.attributes,o),startTimeUnixNano:o.encodeHrTime(t.startTime),timeUnixNano:o.encodeHrTime(t.endTime)};switch(e){case ValueType.INT:n.asInt=t.value;break;case ValueType.DOUBLE:n.asDouble=t.value;break}return n}function uq(t,e){return t.dataPoints.map(o=>bye(o,t.descriptor.valueType,e))}function yye(t,e){return t.dataPoints.map(o=>{let n=o.value;return {attributes:Np(o.attributes,e),bucketCounts:n.buckets.counts,explicitBounds:n.buckets.boundaries,count:n.count,sum:n.sum,min:n.min,max:n.max,startTimeUnixNano:e.encodeHrTime(o.startTime),timeUnixNano:e.encodeHrTime(o.endTime)}})}function Sye(t,e){return t.dataPoints.map(o=>{let n=o.value;return {attributes:Np(o.attributes,e),count:n.count,min:n.min,max:n.max,sum:n.sum,positive:{offset:n.positive.offset,bucketCounts:n.positive.bucketCounts},negative:{offset:n.negative.offset,bucketCounts:n.negative.bucketCounts},scale:n.scale,zeroCount:n.zeroCount,startTimeUnixNano:e.encodeHrTime(o.startTime),timeUnixNano:e.encodeHrTime(o.endTime)}})}function Tye(t){switch(t){case Sr.DELTA:return Mb.AGGREGATION_TEMPORALITY_DELTA;case Sr.CUMULATIVE:return Mb.AGGREGATION_TEMPORALITY_CUMULATIVE}}function dq(t,e){return {resourceMetrics:t.map(o=>fye(o,e))}}var rC={serializeRequest:t=>{let e=dq([t],lq);return new TextEncoder().encode(JSON.stringify(e))},deserializeResponse:t=>{if(t.length===0)return {};let e=new TextDecoder;try{return JSON.parse(e.decode(t))}catch(o){return diag.warn(`Failed to parse metrics export response: ${o.message}. Returning empty response`),{}}}};function mq(t){let e={};return Object.entries(t??{}).forEach(([o,n])=>{typeof n<"u"?e[o]=String(n):diag.warn(`Header "${o}" has invalid value (${n}) and will be ignored`);}),e}function Cye(t,e,o){return async()=>{let n={...await o()},r={};return e!=null&&Object.assign(r,await e()),t!=null&&Object.assign(r,mq(await t())),Object.assign(r,n)}}function wye(t){if(t!=null)try{let e=globalThis.location?.href;return new URL(t,e).href}catch{throw new Error(`Configuration: Could not parse user-provided export URL: '${t}'`)}}function pq(t,e,o){return {...ZG(t,e,o),headers:Cye(t.headers,e.headers,o.headers),url:wye(t.url)??e.url??o.url}}function fq(t,e){return {...QG(),headers:async()=>t,url:"http://localhost:4318/"+e}}function Lp(t){return async e=>{let o=e==="http:",n=o?import('http'):import('https'),{Agent:r}=await n;if(o){let{ca:i,cert:a,key:s,...l}=t;return new r(l)}return new r(t)}}function hq(t,e,o){return {...pq(t,e,o),agentFactory:t.agentFactory??e.agentFactory??o.agentFactory,userAgent:t.userAgent}}function gq(t,e){return {...fq(t,e),agentFactory:Lp({keepAlive:true})}}function vO(t){return t===429||t===502||t===503||t===504}function CO(t){if(t==null)return;let e=Number.parseInt(t,10);if(Number.isInteger(e))return e>0?e*1e3:-1;let o=new Date(t).getTime()-Date.now();return o>=0?o:0}var bq="0.219.0";var yq=`OTel-OTLP-Exporter-JavaScript/${bq}`,Sq=4*1024*1024;function Eq(t,e,o,n,r,i,a,s){return new Promise(l=>{let c=new URL(e);r?o["User-Agent"]=`${r} ${yq}`:o["User-Agent"]=yq;let d=t(c,{method:"POST",headers:o,agent:i},m=>{let p=[],f=0;m.on("data",h=>{if(f+=h.length,f>Sq){let g=new Error(`OTLP export response body exceeded size limit of ${Sq} bytes`);l({status:"failure",error:g}),m.destroy();return}p.push(h);}),m.on("end",()=>{if(m.statusCode&&m.statusCode<=299)l({status:"success",data:Buffer.concat(p)});else if(m.statusCode&&vO(m.statusCode))l({status:"retryable",retryInMillis:CO(m.headers["retry-after"])});else {let h=new rd(m.statusMessage,m.statusCode,Buffer.concat(p).toString());l({status:"failure",error:h});}}),m.on("error",h=>{m.statusCode&&m.statusCode<=299?l({status:"success"}):m.statusCode&&vO(m.statusCode)?l({status:"retryable",error:h,retryInMillis:CO(m.headers["retry-after"])}):l({status:"failure",error:h});});});d.setTimeout(s,()=>{d.destroy(),l({status:"retryable",error:new Error("Request timed out")});}),d.on("error",m=>{Mye(m)?l({status:"retryable",error:m}):l({status:"failure",error:m});}),Rye(d,n,a,m=>{l({status:"failure",error:m});});})}function Rye(t,e,o,n){let r=xye(o);e==="gzip"&&(t.setHeader("Content-Encoding","gzip"),r=r.on("error",n).pipe(Tq.createGzip()).on("error",n)),r.pipe(t).on("error",n);}function xye(t){let e=new Readable$1;return e.push(t),e.push(null),e}function Mye(t){let e=new Set(["ECONNRESET","ECONNREFUSED","EPIPE","ETIMEDOUT","EAI_AGAIN","ENOTFOUND","ENETUNREACH","EHOSTUNREACH"]);return "code"in t&&typeof t.code=="string"?e.has(t.code):false}var wO=class{_utils=null;_parameters;constructor(e){this._parameters=e;}async send(e,o){let{agent:n,request:r}=await this._loadUtils(),i=await this._parameters.headers();return Eq(r,this._parameters.url,i,this._parameters.compression,this._parameters.userAgent,n,e,o)}shutdown(){}async _loadUtils(){let e=this._utils;if(e===null){let o=new URL(this._parameters.url).protocol,[n,r]=await Promise.all([this._parameters.agentFactory(o),Pye(o)]);e=this._utils={agent:n,request:r};}return e}};async function Pye(t){let e=t==="http:"?import('http'):import('https'),{request:o}=await e;return o}function vq(t){return new wO(t)}var AO=5,Iye=1e3,_ye=5e3,Oye=1.5,Cq=.2;function Dye(){return Math.random()*(2*Cq)-Cq}var RO=class{_transport;constructor(e){this._transport=e;}retry(e,o,n){return new Promise((r,i)=>{setTimeout(()=>{this._transport.send(e,o).then(r,i);},n);})}async send(e,o){let n=AO,r=Iye,i=Date.now()+o,a=await this._transport.send(e,o);for(;a.status==="retryable"&&n>0;){n--;let s=Math.max(Math.min(r*(1+Dye()),_ye),0);r=r*Oye;let l=a.retryInMillis??s,c=i-Date.now();if(l>c)return diag.info(`Export retry time ${Math.round(l)}ms exceeds remaining timeout ${Math.round(c)}ms, not retrying further.`),a;diag.verbose(`Scheduling export retry in ${Math.round(l)}ms`),a=await this.retry(e,c,l);}return a.status==="success"?diag.verbose(`Export succeeded after ${AO-n} retry attempts.`):a.status==="retryable"?diag.info(`Export failed after maximum retry attempts (${AO}).`):diag.info(`Export failed with non-retryable error: ${a.error}`),a}shutdown(){return this._transport.shutdown()}};function wq(t){return new RO(t.transport)}function xO(t,e){return oq({transport:wq({transport:vq(t)}),serializer:e,promiseHandler:eq(t)},{timeout:t.timeoutMillis})}function Aq(t){let e=getNumberFromEnv(t);if(e!=null){if(Number.isFinite(e)&&e>0)return e;diag.warn(`Configuration: ${t} is invalid, expected number greater than 0 (actual: ${e})`);}}function kye(t){let e=Aq(`OTEL_EXPORTER_OTLP_${t}_TIMEOUT`),o=Aq("OTEL_EXPORTER_OTLP_TIMEOUT");return e??o}function Rq(t){let e=getStringFromEnv(t)?.trim();if(e==null||e==="none"||e==="gzip")return e;diag.warn(`Configuration: ${t} is invalid, expected 'none' or 'gzip' (actual: '${e}')`);}function Fye(t){let e=Rq(`OTEL_EXPORTER_OTLP_${t}_COMPRESSION`),o=Rq("OTEL_EXPORTER_OTLP_COMPRESSION");return e??o}function Mq(t){return {timeoutMillis:kye(t),compression:Fye(t)}}function Bye(t){let e=getStringFromEnv(`OTEL_EXPORTER_OTLP_${t}_HEADERS`),o=getStringFromEnv("OTEL_EXPORTER_OTLP_HEADERS"),n=parseKeyPairsIntoRecord(e),r=parseKeyPairsIntoRecord(o);if(!(Object.keys(n).length===0&&Object.keys(r).length===0))return Object.assign({},parseKeyPairsIntoRecord(o),parseKeyPairsIntoRecord(e))}function Uye(t){try{return new URL(t).toString()}catch{diag.warn(`Configuration: Could not parse environment-provided export URL: '${t}', falling back to undefined`);return}}function zye(t,e){try{new URL(t);}catch{diag.warn(`Configuration: Could not parse environment-provided export URL: '${t}', falling back to undefined`);return}t.endsWith("/")||(t=t+"/"),t+=e;try{new URL(t);}catch{diag.warn(`Configuration: Provided URL appended with '${e}' is not a valid URL, using 'undefined' instead of '${t}'`);return}return t}function $ye(t){let e=getStringFromEnv("OTEL_EXPORTER_OTLP_ENDPOINT");if(e!==void 0)return zye(e,t)}function Vye(t){let e=getStringFromEnv(`OTEL_EXPORTER_OTLP_${t}_ENDPOINT`);if(e!==void 0)return Uye(e)}function MO(t,e,o){let n=getStringFromEnv(t),r=getStringFromEnv(e),i=n??r;if(i!=null)try{return Bn.readFileSync(Oo.resolve(process.cwd(),i))}catch{diag.warn(o);return}else return}function jye(t){return MO(`OTEL_EXPORTER_OTLP_${t}_CLIENT_CERTIFICATE`,"OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE","Failed to read client certificate chain file")}function Hye(t){return MO(`OTEL_EXPORTER_OTLP_${t}_CLIENT_KEY`,"OTEL_EXPORTER_OTLP_CLIENT_KEY","Failed to read client certificate private key file")}function Wye(t){return MO(`OTEL_EXPORTER_OTLP_${t}_CERTIFICATE`,"OTEL_EXPORTER_OTLP_CERTIFICATE","Failed to read root certificate file")}function _q(t,e){return {...Mq(t),url:Vye(t)??$ye(e),headers:oC(Bye(t)),agentFactory:Lp({keepAlive:true,ca:Wye(t),cert:jye(t),key:Hye(t)})}}function Oq(t){return typeof t.headers=="function"?t.headers:oC(t.headers)}function qye(t){if(typeof t.httpAgentOptions=="function")return t.httpAgentOptions;let e=t.httpAgentOptions;if(t.keepAlive!=null&&(e={keepAlive:t.keepAlive,...e}),e!=null)return Lp(e)}function PO(t,e,o,n){return t.metadata&&diag.warn("Metadata cannot be set when using http"),hq({url:t.url,headers:Oq(t),concurrencyLimit:t.concurrencyLimit,timeoutMillis:t.timeoutMillis,compression:t.compression,agentFactory:qye(t),userAgent:t.userAgent},_q(e,o),gq(n,o))}var ad=class extends nC{constructor(e){super(xO(PO(e??{},"METRICS","v1/metrics",{"Content-Type":"application/json"}),rC),e);}};function Zye(){return new ad({url:`${hp}/v1/metrics`,headers:{"x-momentic-metrics-api-key":gp},temporalityPreference:xc.DELTA})}var IO=[100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],sC=(t,e)=>({instrumentName:t,instrumentType:Fe.HISTOGRAM,aggregation:{type:or.EXPLICIT_BUCKET_HISTOGRAM,options:{boundaries:e,recordMinMax:false}}}),Qye=[sC("test_event_duration",IO),sC("test_step_duration",IO),sC("test_mobile_step_duration",IO),sC("web_agent_action_duration",[25,50,100,200,350,500,750,1e3,2e3,5e3,1e4,2e4])],lC=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let o=this.counterCache.get(e);if(o)return o;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let o=this.histogramCache.get(e);if(o)return o;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let o=this.observableGaugeCache.get(e);if(o)return o;let n=this.meter.createObservableGauge(e);return n.addCallback(r=>{let i=this.gaugeValues.get(e);i!==void 0&&r.observe(i,this.globalAttributes);}),this.observableGaugeCache.set(e,n),n}constructor(e){this.globalAttributes={...e.globalAttributes??{}};let o=typeof process<"u"?"production":"unknown",n=resourceFromAttributes({[ATTR_SERVICE_NAME]:e.serviceName,[gv]:o,[bv]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:v4$1(),[ATTR_SERVICE_VERSION]:"1.4.5"}),r=Zye(),i=new wb({exporter:r,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new Rb({resource:n,readers:[i],views:Qye}),metrics.setGlobalMeterProvider(this.provider),this.meter=metrics.getMeter("momentic-serverless");}increment(e,o,n){try{let r=X_(n,this.globalAttributes);this.getCounter(e).add(typeof o=="number"?o:1,r);}catch{}}gauge(e,o){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,o);}catch{}}distribution(e,o,n){try{let r=X_(n,this.globalAttributes);this.getHistogram(e).record(o,r);}catch{}}async flush(){try{await this.provider.forceFlush();}catch{}}async recordDuration(e){let{name:o,tags:n}=e,r=Date.now();try{return await Y_(e)}finally{this.distribution(o,Date.now()-r,n);}}};var Qe=new db;function Nq(t){if(!t.disabled)try{Qe=new lC(t);}catch{Qe=new db;}}var tSe=1e4;async function Ib(t){return new Promise(e=>{exec(t,{timeout:tSe},(o,n,r)=>{e({command:t,stdout:n,stderr:r,error:o?.message??null,timedOut:o?.killed??false});});})}async function oSe(t){if(platform()==="win32")return Ib(`tracert ${t}`);let o=await Ib(`traceroute ${t}`);return o.stderr.includes("not found")||o.error?.includes("not found")?Ib(`tracepath ${t}`):o}async function Fp(t){let o=platform()==="win32",n=o?`ping -n 3 ${t}`:`ping -c 3 ${t}`,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 ${o?"NUL":"/dev/null"} -s ${t}`,[a,s,l]=await Promise.all([Ib(n),oSe(t),Ib(i)]);return {ping:a,traceroute:s,curl:l}}var _O;function kq(t){_O=t;}function cC(t){rSe(t)&&_O&&_O(t);}var nSe=new Set(["InternalWebAgentError","InternalPlatformError","UnknownError"]);function rSe(t){return t instanceof Error&&t.name==="AbortError"||cg(t,Ye)?false:t instanceof O?nSe.has(t.reason):true}function Er(t=process.stdout){let e=supportsColor?supportsColor.level:0,o=process.env.LC_ALL??process.env.LC_CTYPE??process.env.LANG??"",n=process.env.MOMENTIC_NO_UNICODE===void 0&&process.env.TERM!=="linux"&&(process.platform==="win32"||/utf-?8/i.test(o));return {isTTY:!!t.isTTY,colorLevel:e,unicode:n,columns:t.columns??-1,ci:od}}function Bp(t){return t.isTTY&&!t.ci}var OO=class extends Console{_buffer=[];Console=Console;constructor(){super({write:e=>(this._buffer.push(e),true)});}_log(e){this._buffer.push(e);}debug(e,...o){this._log(format(e,...o));}error(e,...o){this._log(format(e,...o));}info(e,...o){this._log(format(e,...o));}log(e,...o){this._log(format(e,...o));}warn(e,...o){this._log(format(e,...o));}flushed(){return this._buffer.length>0?this._buffer.join(`
188
+ `,pO(i,e));}return n}};var jv=class{_backingStorages;constructor(e){this._backingStorages=e;}record(e,o,n,r){let i=this._backingStorages;for(let a=0;a<i.length;a++)i[a].record(e,o,n,r);}};var Wv=class{_buffer=new _i;_instrumentName;_valueType;constructor(e,o){this._instrumentName=e,this._valueType=o;}observe(e,o={}){if(typeof e!="number"){diag.warn(`non-number value provided to metric ${this._instrumentName}: ${e}`);return}this._valueType===ValueType.INT&&!Number.isInteger(e)&&(diag.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(o,e);}},Gv=class{_buffer=new Map;observe(e,o,n={}){if(!Ab(e))return;let r=this._buffer.get(e);if(r==null&&(r=new _i,this._buffer.set(e,r)),typeof o!="number"){diag.warn(`non-number value provided to metric ${e._descriptor.name}: ${o}`);return}e._descriptor.valueType===ValueType.INT&&!Number.isInteger(o)&&(diag.warn(`INT value type cannot accept a floating-point value for ${e._descriptor.name}, ignoring the fractional digits.`),o=Math.trunc(o),!Number.isInteger(o))||r.set(n,o);}};var qv=class{_callbacks=[];_batchCallbacks=[];addCallback(e,o){this._findCallback(e,o)>=0||this._callbacks.push({callback:e,instrument:o});}removeCallback(e,o){let n=this._findCallback(e,o);n<0||this._callbacks.splice(n,1);}addBatchCallback(e,o){let n=new Set(o.filter(Ab));if(n.size===0){diag.error("BatchObservableCallback is not associated with valid instruments",o);return}this._findBatchCallback(e,n)>=0||this._batchCallbacks.push({callback:e,instruments:n});}removeBatchCallback(e,o){let n=new Set(o.filter(Ab)),r=this._findBatchCallback(e,n);r<0||this._batchCallbacks.splice(r,1);}async observe(e,o){let n=this._observeCallbacks(e,o),r=this._observeBatchCallbacks(e,o);return (await Promise.allSettled([...n,...r])).filter(s=>s.status==="rejected").map(s=>s.reason)}_observeCallbacks(e,o){return this._callbacks.map(async({callback:n,instrument:r})=>{let i=new Wv(r._descriptor.name,r._descriptor.valueType),a=Promise.resolve(n(i));o!=null&&(a=wc(a,o)),await a,r._metricStorages.forEach(s=>{s.record(i._buffer,e);});})}_observeBatchCallbacks(e,o){return this._batchCallbacks.map(async({callback:n,instruments:r})=>{let i=new Gv,a=Promise.resolve(n(i));o!=null&&(a=wc(a,o)),await a,r.forEach(s=>{let l=i._buffer.get(s);l!=null&&s._metricStorages.forEach(c=>{c.record(l,e);});});})}_findCallback(e,o){return this._callbacks.findIndex(n=>n.callback===e&&n.instrument===o)}_findBatchCallback(e,o){return this._batchCallbacks.findIndex(n=>n.callback===e&&xG(n.instruments,o))}};var Kv=class extends Ip{_aggregationCardinalityLimit;_deltaMetricStorage;_temporalMetricStorage;_attributesProcessor;constructor(e,o,n,r,i){super(e),this._aggregationCardinalityLimit=i,this._deltaMetricStorage=new _p(o,this._aggregationCardinalityLimit),this._temporalMetricStorage=new Op(o,r),this._attributesProcessor=n;}record(e,o,n,r){o=this._attributesProcessor.process(o,n),this._deltaMetricStorage.record(e,o,n,r);}collect(e,o){let n=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(e,this._instrumentDescriptor,n,o)}};var hO=class{process(e,o){return e}},gO=class{_processors;constructor(e){this._processors=e;}process(e,o){let n=e;for(let r of this._processors)n=r.process(n,o);return n}};function Yv(){return Gbe}function JG(t){return new gO(t)}var Gbe=new hO;var Xv=class{metricStorageRegistry=new Vv;observableRegistry=new qv;meter;_meterProviderSharedState;_instrumentationScope;constructor(e,o){this.meter=new zv(this),this._meterProviderSharedState=e,this._instrumentationScope=o;}registerMetricStorage(e){let o=this._registerMetricStorage(e,Kv);return o.length===1?o[0]:new jv(o)}registerAsyncMetricStorage(e){return this._registerMetricStorage(e,$v)}async collect(e,o,n){let r=await this.observableRegistry.observe(o,n?.timeoutMillis),i=this.metricStorageRegistry.getStorages(e);if(i.length===0)return null;let a=[];return i.forEach(s=>{let l=s.collect(e,o);l!=null&&a.push(l);}),a.length===0?{errors:r}:{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:r}}_registerMetricStorage(e,o){let r=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope).map(i=>{let a=KG(i,e),s=this.metricStorageRegistry.findOrUpdateCompatibleStorage(a);if(s!=null)return s;let l=i.aggregation.createAggregator(a),c=new o(a,l,i.attributesProcessor,this._meterProviderSharedState.metricCollectors,i.aggregationCardinalityLimit);return this.metricStorageRegistry.register(c),c});if(r.length===0){let a=this._meterProviderSharedState.selectAggregations(e.type).map(([s,l])=>{let c=this.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(s,e);if(c!=null)return c;let u=l.createAggregator(e),d=s.selectCardinalityLimit(e.type),m=new o(e,u,Yv(),[s],d);return this.metricStorageRegistry.registerForCollector(s,m),m});r=r.concat(a);}return r}};var Jv=class{viewRegistry=new _v;metricCollectors=[];meterSharedStates=new Map;resource;constructor(e){this.resource=e;}getMeterSharedState(e){let o=RG(e),n=this.meterSharedStates.get(o);return n==null&&(n=new Xv(this,e),this.meterSharedStates.set(o,n)),n}selectAggregations(e){let o=[];for(let n of this.metricCollectors)o.push([n,Iv(n.selectAggregation(e))]);return o}};var Zv=class{_sharedState;_metricReader;constructor(e,o){this._sharedState=e,this._metricReader=o;}async collect(e){let o=millisToHrTime(Date.now()),n=[],r=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(async a=>{let s=await a.collect(this,o,e);s?.scopeMetrics!=null&&n.push(s.scopeMetrics),s?.errors!=null&&r.push(...s.errors);});return await Promise.all(i),{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:r}}async forceFlush(e){await this._metricReader.forceFlush(e);}async shutdown(e){await this._metricReader.shutdown(e);}selectAggregationTemporality(e){return this._metricReader.selectAggregationTemporality(e)}selectAggregation(e){return this._metricReader.selectAggregation(e)}selectCardinalityLimit(e){return this._metricReader.selectCardinalityLimit?.(e)??2e3}};var Kbe=/[\^$\\.+?()[\]{}|]/g,Dp=class t{_matchAll;_regexp;constructor(e){e==="*"?(this._matchAll=true,this._regexp=/.*/):(this._matchAll=false,this._regexp=new RegExp(t.escapePattern(e)));}match(e){return this._matchAll?true:this._regexp.test(e)}static escapePattern(e){return `^${e.replace(Kbe,"\\$&").replace("*",".*")}$`}static hasWildcard(e){return e.includes("*")}},Rc=class{_matchAll;_pattern;constructor(e){this._matchAll=e===void 0,this._pattern=e;}match(e){return !!(this._matchAll||e===this._pattern)}};var Qv=class{_nameFilter;_type;_unitFilter;constructor(e){this._nameFilter=new Dp(e?.name??"*"),this._type=e?.type,this._unitFilter=new Rc(e?.unit);}getType(){return this._type}getNameFilter(){return this._nameFilter}getUnitFilter(){return this._unitFilter}};var eC=class{_nameFilter;_versionFilter;_schemaUrlFilter;constructor(e){this._nameFilter=new Rc(e?.name),this._versionFilter=new Rc(e?.version),this._schemaUrlFilter=new Rc(e?.schemaUrl);}getNameFilter(){return this._nameFilter}getVersionFilter(){return this._versionFilter}getSchemaUrlFilter(){return this._schemaUrlFilter}};function Ybe(t){return t.instrumentName==null&&t.instrumentType==null&&t.instrumentUnit==null&&t.meterName==null&&t.meterVersion==null&&t.meterSchemaUrl==null}function Xbe(t){if(Ybe(t))throw new Error("Cannot create view with no selector arguments supplied");if(t.name!=null&&(t?.instrumentName==null||Dp.hasWildcard(t.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.")}var tC=class{name;description;aggregation;attributesProcessor;instrumentSelector;meterSelector;aggregationCardinalityLimit;constructor(e){Xbe(e),e.attributesProcessors!=null?this.attributesProcessor=JG(e.attributesProcessors):this.attributesProcessor=Yv(),this.name=e.name,this.description=e.description,this.aggregation=Iv(e.aggregation??{type:or.DEFAULT}),this.instrumentSelector=new Qv({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new eC({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit;}};var Rb=class{_sharedState;_shutdown=false;constructor(e){if(this._sharedState=new Jv(e?.resource??defaultResource()),e?.views!=null&&e.views.length>0)for(let o of e.views)this._sharedState.viewRegistry.addView(new tC(o));if(e?.readers!=null&&e.readers.length>0)for(let o of e.readers){let n=new Zv(this._sharedState,o);o.setMetricProducer(n),this._sharedState.metricCollectors.push(n),e.sdkMetricsEnabled&&o instanceof xp&&o._setSelfObsMeterProvider(this);}}getMeter(e,o="",n={}){return this._shutdown?(diag.warn("A shutdown MeterProvider cannot provide a Meter"),createNoopMeter()):this._sharedState.getMeterSharedState({name:e,version:o,schemaUrl:n.schemaUrl}).meter}async shutdown(e){if(this._shutdown){diag.warn("shutdown may only be called once per MeterProvider");return}this._shutdown=true,await Promise.all(this._sharedState.metricCollectors.map(o=>o.shutdown(e)));}async forceFlush(e){if(this._shutdown){diag.warn("invalid attempt to force flush after MeterProvider shutdown");return}await Promise.all(this._sharedState.metricCollectors.map(o=>o.forceFlush(e)));}};var xc;(function(t){t[t.DELTA=0]="DELTA",t[t.CUMULATIVE=1]="CUMULATIVE",t[t.LOWMEMORY=2]="LOWMEMORY";})(xc||(xc={}));var xb=class{_delegate;constructor(e){this._delegate=e;}export(e,o){this._delegate.export(e,o);}forceFlush(){return this._delegate.forceFlush()}shutdown(){return this._delegate.shutdown()}};var rd=class extends Error{code;name="OTLPExporterError";data;constructor(e,o,n){super(e),this.data=n,this.code=o;}};function Qbe(t){if(Number.isFinite(t)&&t>0)return t;throw new Error(`Configuration: timeoutMillis is invalid, expected number greater than 0 (actual: '${t}')`)}function oC(t){if(t!=null)return async()=>t}function ZG(t,e,o){return {timeoutMillis:Qbe(t.timeoutMillis??e.timeoutMillis??o.timeoutMillis),concurrencyLimit:t.concurrencyLimit??e.concurrencyLimit??o.concurrencyLimit,compression:t.compression??e.compression??o.compression}}function QG(){return {timeoutMillis:1e4,concurrencyLimit:30,compression:"none"}}var yO=class{_concurrencyLimit;_sendingPromises=[];constructor(e){this._concurrencyLimit=e;}pushPromise(e){if(this.hasReachedLimit())throw new Error("Concurrency Limit reached");this._sendingPromises.push(e);let o=()=>{let n=this._sendingPromises.indexOf(e);this._sendingPromises.splice(n,1);};e.then(o,o);}hasReachedLimit(){return this._sendingPromises.length>=this._concurrencyLimit}async awaitAll(){await Promise.all(this._sendingPromises);}};function eq(t){return new yO(t.concurrencyLimit)}function tye(t){return Object.prototype.hasOwnProperty.call(t,"partialSuccess")}function tq(){return {handleResponse(t){t==null||!tye(t)||t.partialSuccess==null||Object.keys(t.partialSuccess).length===0||diag.warn("Received Partial Success response:",JSON.stringify(t.partialSuccess));}}}var SO=class{_diagLogger;_transport;_serializer;_responseHandler;_promiseQueue;_timeout;constructor(e,o,n,r,i){this._transport=e,this._serializer=o,this._responseHandler=n,this._promiseQueue=r,this._timeout=i,this._diagLogger=diag.createComponentLogger({namespace:"OTLPExportDelegate"});}export(e,o){if(this._diagLogger.debug("items to be sent",e),this._promiseQueue.hasReachedLimit()){o({code:ExportResultCode.FAILED,error:new Error("Concurrent export limit reached")});return}let n=this._serializer.serializeRequest(e);if(n==null){o({code:ExportResultCode.FAILED,error:new Error("Nothing to send")});return}this._promiseQueue.pushPromise(this._transport.send(n,this._timeout).then(r=>{if(r.status==="success"){if(r.data!=null)try{this._responseHandler.handleResponse(this._serializer.deserializeResponse(r.data));}catch(i){this._diagLogger.warn("Export succeeded but could not deserialize response - is the response specification compliant?",i,r.data);}o({code:ExportResultCode.SUCCESS});return}else if(r.status==="failure"&&r.error){o({code:ExportResultCode.FAILED,error:r.error});return}else r.status==="retryable"?o({code:ExportResultCode.FAILED,error:r.error??new rd("Export failed with retryable status")}):o({code:ExportResultCode.FAILED,error:new rd("Export failed with unknown error")});},r=>o({code:ExportResultCode.FAILED,error:r})));}forceFlush(){return this._promiseQueue.awaitAll()}async shutdown(){this._diagLogger.debug("shutdown started"),await this.forceFlush(),this._transport.shutdown();}};function oq(t,e){return new SO(t.transport,t.serializer,tq(),t.promiseHandler,e.timeout)}var TO=()=>Sr.CUMULATIVE,nq=t=>{switch(t){case Fe.COUNTER:case Fe.OBSERVABLE_COUNTER:case Fe.GAUGE:case Fe.HISTOGRAM:case Fe.OBSERVABLE_GAUGE:return Sr.DELTA;case Fe.UP_DOWN_COUNTER:case Fe.OBSERVABLE_UP_DOWN_COUNTER:return Sr.CUMULATIVE}},rq=t=>{switch(t){case Fe.COUNTER:case Fe.HISTOGRAM:return Sr.DELTA;case Fe.GAUGE:case Fe.UP_DOWN_COUNTER:case Fe.OBSERVABLE_UP_DOWN_COUNTER:case Fe.OBSERVABLE_COUNTER:case Fe.OBSERVABLE_GAUGE:return Sr.CUMULATIVE}};function iye(){let t=(getStringFromEnv("OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE")??"cumulative").toLowerCase();return t==="cumulative"?TO:t==="delta"?nq:t==="lowmemory"?rq:(diag.warn(`OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to '${t}', but only 'cumulative' and 'delta' are allowed. Using default ('cumulative') instead.`),TO)}function aye(t){return t!=null?t===xc.DELTA?nq:t===xc.LOWMEMORY?rq:TO:iye()}var sye=Object.freeze({type:or.DEFAULT});function lye(t){return t?.aggregationPreference??(()=>sye)}var nC=class extends xb{_aggregationTemporalitySelector;_aggregationSelector;constructor(e,o){super(e),this._aggregationSelector=lye(o),this._aggregationTemporalitySelector=aye(o?.temporalityPreference);}selectAggregation(e){return this._aggregationSelector(e)}selectAggregationTemporality(e){return this._aggregationTemporalitySelector(e)}};function iq(t,e){let o={attributes:Np(t.attributes,e),droppedAttributesCount:0},n=t.schemaUrl;return n&&n!==""&&(o.schemaUrl=n),o}function aq(t,e){let o={name:t.name,version:t.version};return t.attributes&&Object.keys(t.attributes).length>0&&(o.attributes=Np(t.attributes,e),o.droppedAttributesCount=t.droppedAttributesCount??0),o}function Np(t,e){return Object.keys(t).map(o=>cye(o,t[o],e))}function cye(t,e,o){return {key:t,value:EO(e,o)}}function EO(t,e){let o=typeof t;if(o==="string")return {stringValue:t};if(o==="number")return Number.isInteger(t)?{intValue:t}:{doubleValue:t};if(o==="boolean")return {boolValue:t};if(t instanceof Uint8Array)return {bytesValue:e.encodeUint8Array(t)};if(Array.isArray(t)){let n=new Array(t.length);for(let r=0;r<t.length;r++)n[r]=EO(t[r],e);return {arrayValue:{values:n}}}if(o==="object"&&t!=null){let n=Object.keys(t),r=new Array(n.length);for(let i=0;i<n.length;i++)r[i]={key:n[i],value:EO(t[n[i]],e)};return {kvlistValue:{values:r}}}return {}}function dye(t){let e=BigInt(1e9);return BigInt(Math.trunc(t[0]))*e+BigInt(Math.trunc(t[1]))}function mye(t){return dye(t).toString()}var pye=typeof BigInt<"u"?mye:hrTimeToNanoseconds;function sq(t){return t}var lq={encodeHrTime:pye,encodeSpanContext:sq,encodeOptionalSpanContext:sq,encodeUint8Array:t=>{if(typeof Buffer<"u")return Buffer.from(t).toString("base64");let e=new Array(t.length);for(let o=0;o<t.length;o++)e[o]=String.fromCharCode(t[o]);return btoa(e.join(""))}};var Mb;(function(t){t[t.AGGREGATION_TEMPORALITY_UNSPECIFIED=0]="AGGREGATION_TEMPORALITY_UNSPECIFIED",t[t.AGGREGATION_TEMPORALITY_DELTA=1]="AGGREGATION_TEMPORALITY_DELTA",t[t.AGGREGATION_TEMPORALITY_CUMULATIVE=2]="AGGREGATION_TEMPORALITY_CUMULATIVE";})(Mb||(Mb={}));function fye(t,e){let o=iq(t.resource,e);return {resource:o,schemaUrl:o.schemaUrl,scopeMetrics:hye(t.scopeMetrics,e)}}function hye(t,e){return Array.from(t.map(o=>({scope:aq(o.scope,e),metrics:o.metrics.map(n=>gye(n,e)),schemaUrl:o.scope.schemaUrl})))}function gye(t,e){let o={name:t.descriptor.name,description:t.descriptor.description,unit:t.descriptor.unit},n=Tye(t.aggregationTemporality);switch(t.dataPointType){case Tr.SUM:o.sum={aggregationTemporality:n,isMonotonic:t.isMonotonic,dataPoints:uq(t,e)};break;case Tr.GAUGE:o.gauge={dataPoints:uq(t,e)};break;case Tr.HISTOGRAM:o.histogram={aggregationTemporality:n,dataPoints:yye(t,e)};break;case Tr.EXPONENTIAL_HISTOGRAM:o.exponentialHistogram={aggregationTemporality:n,dataPoints:Sye(t,e)};break}return o}function bye(t,e,o){let n={attributes:Np(t.attributes,o),startTimeUnixNano:o.encodeHrTime(t.startTime),timeUnixNano:o.encodeHrTime(t.endTime)};switch(e){case ValueType.INT:n.asInt=t.value;break;case ValueType.DOUBLE:n.asDouble=t.value;break}return n}function uq(t,e){return t.dataPoints.map(o=>bye(o,t.descriptor.valueType,e))}function yye(t,e){return t.dataPoints.map(o=>{let n=o.value;return {attributes:Np(o.attributes,e),bucketCounts:n.buckets.counts,explicitBounds:n.buckets.boundaries,count:n.count,sum:n.sum,min:n.min,max:n.max,startTimeUnixNano:e.encodeHrTime(o.startTime),timeUnixNano:e.encodeHrTime(o.endTime)}})}function Sye(t,e){return t.dataPoints.map(o=>{let n=o.value;return {attributes:Np(o.attributes,e),count:n.count,min:n.min,max:n.max,sum:n.sum,positive:{offset:n.positive.offset,bucketCounts:n.positive.bucketCounts},negative:{offset:n.negative.offset,bucketCounts:n.negative.bucketCounts},scale:n.scale,zeroCount:n.zeroCount,startTimeUnixNano:e.encodeHrTime(o.startTime),timeUnixNano:e.encodeHrTime(o.endTime)}})}function Tye(t){switch(t){case Sr.DELTA:return Mb.AGGREGATION_TEMPORALITY_DELTA;case Sr.CUMULATIVE:return Mb.AGGREGATION_TEMPORALITY_CUMULATIVE}}function dq(t,e){return {resourceMetrics:t.map(o=>fye(o,e))}}var rC={serializeRequest:t=>{let e=dq([t],lq);return new TextEncoder().encode(JSON.stringify(e))},deserializeResponse:t=>{if(t.length===0)return {};let e=new TextDecoder;try{return JSON.parse(e.decode(t))}catch(o){return diag.warn(`Failed to parse metrics export response: ${o.message}. Returning empty response`),{}}}};function mq(t){let e={};return Object.entries(t??{}).forEach(([o,n])=>{typeof n<"u"?e[o]=String(n):diag.warn(`Header "${o}" has invalid value (${n}) and will be ignored`);}),e}function Cye(t,e,o){return async()=>{let n={...await o()},r={};return e!=null&&Object.assign(r,await e()),t!=null&&Object.assign(r,mq(await t())),Object.assign(r,n)}}function wye(t){if(t!=null)try{let e=globalThis.location?.href;return new URL(t,e).href}catch{throw new Error(`Configuration: Could not parse user-provided export URL: '${t}'`)}}function pq(t,e,o){return {...ZG(t,e,o),headers:Cye(t.headers,e.headers,o.headers),url:wye(t.url)??e.url??o.url}}function fq(t,e){return {...QG(),headers:async()=>t,url:"http://localhost:4318/"+e}}function Lp(t){return async e=>{let o=e==="http:",n=o?import('http'):import('https'),{Agent:r}=await n;if(o){let{ca:i,cert:a,key:s,...l}=t;return new r(l)}return new r(t)}}function hq(t,e,o){return {...pq(t,e,o),agentFactory:t.agentFactory??e.agentFactory??o.agentFactory,userAgent:t.userAgent}}function gq(t,e){return {...fq(t,e),agentFactory:Lp({keepAlive:true})}}function vO(t){return t===429||t===502||t===503||t===504}function CO(t){if(t==null)return;let e=Number.parseInt(t,10);if(Number.isInteger(e))return e>0?e*1e3:-1;let o=new Date(t).getTime()-Date.now();return o>=0?o:0}var bq="0.219.0";var yq=`OTel-OTLP-Exporter-JavaScript/${bq}`,Sq=4*1024*1024;function Eq(t,e,o,n,r,i,a,s){return new Promise(l=>{let c=new URL(e);r?o["User-Agent"]=`${r} ${yq}`:o["User-Agent"]=yq;let d=t(c,{method:"POST",headers:o,agent:i},m=>{let p=[],f=0;m.on("data",h=>{if(f+=h.length,f>Sq){let g=new Error(`OTLP export response body exceeded size limit of ${Sq} bytes`);l({status:"failure",error:g}),m.destroy();return}p.push(h);}),m.on("end",()=>{if(m.statusCode&&m.statusCode<=299)l({status:"success",data:Buffer.concat(p)});else if(m.statusCode&&vO(m.statusCode))l({status:"retryable",retryInMillis:CO(m.headers["retry-after"])});else {let h=new rd(m.statusMessage,m.statusCode,Buffer.concat(p).toString());l({status:"failure",error:h});}}),m.on("error",h=>{m.statusCode&&m.statusCode<=299?l({status:"success"}):m.statusCode&&vO(m.statusCode)?l({status:"retryable",error:h,retryInMillis:CO(m.headers["retry-after"])}):l({status:"failure",error:h});});});d.setTimeout(s,()=>{d.destroy(),l({status:"retryable",error:new Error("Request timed out")});}),d.on("error",m=>{Mye(m)?l({status:"retryable",error:m}):l({status:"failure",error:m});}),Rye(d,n,a,m=>{l({status:"failure",error:m});});})}function Rye(t,e,o,n){let r=xye(o);e==="gzip"&&(t.setHeader("Content-Encoding","gzip"),r=r.on("error",n).pipe(Tq.createGzip()).on("error",n)),r.pipe(t).on("error",n);}function xye(t){let e=new Readable$1;return e.push(t),e.push(null),e}function Mye(t){let e=new Set(["ECONNRESET","ECONNREFUSED","EPIPE","ETIMEDOUT","EAI_AGAIN","ENOTFOUND","ENETUNREACH","EHOSTUNREACH"]);return "code"in t&&typeof t.code=="string"?e.has(t.code):false}var wO=class{_utils=null;_parameters;constructor(e){this._parameters=e;}async send(e,o){let{agent:n,request:r}=await this._loadUtils(),i=await this._parameters.headers();return Eq(r,this._parameters.url,i,this._parameters.compression,this._parameters.userAgent,n,e,o)}shutdown(){}async _loadUtils(){let e=this._utils;if(e===null){let o=new URL(this._parameters.url).protocol,[n,r]=await Promise.all([this._parameters.agentFactory(o),Pye(o)]);e=this._utils={agent:n,request:r};}return e}};async function Pye(t){let e=t==="http:"?import('http'):import('https'),{request:o}=await e;return o}function vq(t){return new wO(t)}var AO=5,Iye=1e3,_ye=5e3,Oye=1.5,Cq=.2;function Dye(){return Math.random()*(2*Cq)-Cq}var RO=class{_transport;constructor(e){this._transport=e;}retry(e,o,n){return new Promise((r,i)=>{setTimeout(()=>{this._transport.send(e,o).then(r,i);},n);})}async send(e,o){let n=AO,r=Iye,i=Date.now()+o,a=await this._transport.send(e,o);for(;a.status==="retryable"&&n>0;){n--;let s=Math.max(Math.min(r*(1+Dye()),_ye),0);r=r*Oye;let l=a.retryInMillis??s,c=i-Date.now();if(l>c)return diag.info(`Export retry time ${Math.round(l)}ms exceeds remaining timeout ${Math.round(c)}ms, not retrying further.`),a;diag.verbose(`Scheduling export retry in ${Math.round(l)}ms`),a=await this.retry(e,c,l);}return a.status==="success"?diag.verbose(`Export succeeded after ${AO-n} retry attempts.`):a.status==="retryable"?diag.info(`Export failed after maximum retry attempts (${AO}).`):diag.info(`Export failed with non-retryable error: ${a.error}`),a}shutdown(){return this._transport.shutdown()}};function wq(t){return new RO(t.transport)}function xO(t,e){return oq({transport:wq({transport:vq(t)}),serializer:e,promiseHandler:eq(t)},{timeout:t.timeoutMillis})}function Aq(t){let e=getNumberFromEnv(t);if(e!=null){if(Number.isFinite(e)&&e>0)return e;diag.warn(`Configuration: ${t} is invalid, expected number greater than 0 (actual: ${e})`);}}function kye(t){let e=Aq(`OTEL_EXPORTER_OTLP_${t}_TIMEOUT`),o=Aq("OTEL_EXPORTER_OTLP_TIMEOUT");return e??o}function Rq(t){let e=getStringFromEnv(t)?.trim();if(e==null||e==="none"||e==="gzip")return e;diag.warn(`Configuration: ${t} is invalid, expected 'none' or 'gzip' (actual: '${e}')`);}function Fye(t){let e=Rq(`OTEL_EXPORTER_OTLP_${t}_COMPRESSION`),o=Rq("OTEL_EXPORTER_OTLP_COMPRESSION");return e??o}function Mq(t){return {timeoutMillis:kye(t),compression:Fye(t)}}function Bye(t){let e=getStringFromEnv(`OTEL_EXPORTER_OTLP_${t}_HEADERS`),o=getStringFromEnv("OTEL_EXPORTER_OTLP_HEADERS"),n=parseKeyPairsIntoRecord(e),r=parseKeyPairsIntoRecord(o);if(!(Object.keys(n).length===0&&Object.keys(r).length===0))return Object.assign({},parseKeyPairsIntoRecord(o),parseKeyPairsIntoRecord(e))}function Uye(t){try{return new URL(t).toString()}catch{diag.warn(`Configuration: Could not parse environment-provided export URL: '${t}', falling back to undefined`);return}}function zye(t,e){try{new URL(t);}catch{diag.warn(`Configuration: Could not parse environment-provided export URL: '${t}', falling back to undefined`);return}t.endsWith("/")||(t=t+"/"),t+=e;try{new URL(t);}catch{diag.warn(`Configuration: Provided URL appended with '${e}' is not a valid URL, using 'undefined' instead of '${t}'`);return}return t}function $ye(t){let e=getStringFromEnv("OTEL_EXPORTER_OTLP_ENDPOINT");if(e!==void 0)return zye(e,t)}function Vye(t){let e=getStringFromEnv(`OTEL_EXPORTER_OTLP_${t}_ENDPOINT`);if(e!==void 0)return Uye(e)}function MO(t,e,o){let n=getStringFromEnv(t),r=getStringFromEnv(e),i=n??r;if(i!=null)try{return Bn.readFileSync(Oo.resolve(process.cwd(),i))}catch{diag.warn(o);return}else return}function jye(t){return MO(`OTEL_EXPORTER_OTLP_${t}_CLIENT_CERTIFICATE`,"OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE","Failed to read client certificate chain file")}function Hye(t){return MO(`OTEL_EXPORTER_OTLP_${t}_CLIENT_KEY`,"OTEL_EXPORTER_OTLP_CLIENT_KEY","Failed to read client certificate private key file")}function Wye(t){return MO(`OTEL_EXPORTER_OTLP_${t}_CERTIFICATE`,"OTEL_EXPORTER_OTLP_CERTIFICATE","Failed to read root certificate file")}function _q(t,e){return {...Mq(t),url:Vye(t)??$ye(e),headers:oC(Bye(t)),agentFactory:Lp({keepAlive:true,ca:Wye(t),cert:jye(t),key:Hye(t)})}}function Oq(t){return typeof t.headers=="function"?t.headers:oC(t.headers)}function qye(t){if(typeof t.httpAgentOptions=="function")return t.httpAgentOptions;let e=t.httpAgentOptions;if(t.keepAlive!=null&&(e={keepAlive:t.keepAlive,...e}),e!=null)return Lp(e)}function PO(t,e,o,n){return t.metadata&&diag.warn("Metadata cannot be set when using http"),hq({url:t.url,headers:Oq(t),concurrencyLimit:t.concurrencyLimit,timeoutMillis:t.timeoutMillis,compression:t.compression,agentFactory:qye(t),userAgent:t.userAgent},_q(e,o),gq(n,o))}var ad=class extends nC{constructor(e){super(xO(PO(e??{},"METRICS","v1/metrics",{"Content-Type":"application/json"}),rC),e);}};function Zye(){return new ad({url:`${hp}/v1/metrics`,headers:{"x-momentic-metrics-api-key":gp},temporalityPreference:xc.DELTA})}var IO=[100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],sC=(t,e)=>({instrumentName:t,instrumentType:Fe.HISTOGRAM,aggregation:{type:or.EXPLICIT_BUCKET_HISTOGRAM,options:{boundaries:e,recordMinMax:false}}}),Qye=[sC("test_event_duration",IO),sC("test_step_duration",IO),sC("test_mobile_step_duration",IO),sC("web_agent_action_duration",[25,50,100,200,350,500,750,1e3,2e3,5e3,1e4,2e4])],lC=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let o=this.counterCache.get(e);if(o)return o;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let o=this.histogramCache.get(e);if(o)return o;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let o=this.observableGaugeCache.get(e);if(o)return o;let n=this.meter.createObservableGauge(e);return n.addCallback(r=>{let i=this.gaugeValues.get(e);i!==void 0&&r.observe(i,this.globalAttributes);}),this.observableGaugeCache.set(e,n),n}constructor(e){this.globalAttributes={...e.globalAttributes??{}};let o=typeof process<"u"?"production":"unknown",n=resourceFromAttributes({[ATTR_SERVICE_NAME]:e.serviceName,[gv]:o,[bv]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:v4$1(),[ATTR_SERVICE_VERSION]:"1.4.6"}),r=Zye(),i=new wb({exporter:r,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new Rb({resource:n,readers:[i],views:Qye}),metrics.setGlobalMeterProvider(this.provider),this.meter=metrics.getMeter("momentic-serverless");}increment(e,o,n){try{let r=X_(n,this.globalAttributes);this.getCounter(e).add(typeof o=="number"?o:1,r);}catch{}}gauge(e,o){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,o);}catch{}}distribution(e,o,n){try{let r=X_(n,this.globalAttributes);this.getHistogram(e).record(o,r);}catch{}}async flush(){try{await this.provider.forceFlush();}catch{}}async recordDuration(e){let{name:o,tags:n}=e,r=Date.now();try{return await Y_(e)}finally{this.distribution(o,Date.now()-r,n);}}};var Qe=new db;function Nq(t){if(!t.disabled)try{Qe=new lC(t);}catch{Qe=new db;}}var tSe=1e4;async function Ib(t){return new Promise(e=>{exec(t,{timeout:tSe},(o,n,r)=>{e({command:t,stdout:n,stderr:r,error:o?.message??null,timedOut:o?.killed??false});});})}async function oSe(t){if(platform()==="win32")return Ib(`tracert ${t}`);let o=await Ib(`traceroute ${t}`);return o.stderr.includes("not found")||o.error?.includes("not found")?Ib(`tracepath ${t}`):o}async function Fp(t){let o=platform()==="win32",n=o?`ping -n 3 ${t}`:`ping -c 3 ${t}`,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 ${o?"NUL":"/dev/null"} -s ${t}`,[a,s,l]=await Promise.all([Ib(n),oSe(t),Ib(i)]);return {ping:a,traceroute:s,curl:l}}var _O;function kq(t){_O=t;}function cC(t){rSe(t)&&_O&&_O(t);}var nSe=new Set(["InternalWebAgentError","InternalPlatformError","UnknownError"]);function rSe(t){return t instanceof Error&&t.name==="AbortError"||cg(t,Ye)?false:t instanceof O?nSe.has(t.reason):true}function Er(t=process.stdout){let e=supportsColor?supportsColor.level:0,o=process.env.LC_ALL??process.env.LC_CTYPE??process.env.LANG??"",n=process.env.MOMENTIC_NO_UNICODE===void 0&&process.env.TERM!=="linux"&&(process.platform==="win32"||/utf-?8/i.test(o));return {isTTY:!!t.isTTY,colorLevel:e,unicode:n,columns:t.columns??-1,ci:od}}function Bp(t){return t.isTTY&&!t.ci}var OO=class extends Console{_buffer=[];Console=Console;constructor(){super({write:e=>(this._buffer.push(e),true)});}_log(e){this._buffer.push(e);}debug(e,...o){this._log(format(e,...o));}error(e,...o){this._log(format(e,...o));}info(e,...o){this._log(format(e,...o));}log(e,...o){this._log(format(e,...o));}warn(e,...o){this._log(format(e,...o));}flushed(){return this._buffer.length>0?this._buffer.join(`
189
189
  `):void 0}};function Uq(t){let e=globalThis.console,o=new OO;globalThis.console=o;try{t();}finally{let n=o.flushed();n&&process.stdout.write(`${n}
190
190
  `),globalThis.console=e;}}var sSe=" ",lSe=" ",cSe=" ",uSe=" > ",$q=3;function Vq(t){if(!t.failureDetails)return;let e=t.filePath?dC(t.filePath):void 0;if(e&&e.doc.get("fileType")!==Pe.TEST_V2)return;let o=e?dSe({root:e,result:t}):void 0,n=t.failureDetails.classification?.previousStepsDescription??[];if(n.length===0&&!o)return;let r=[`${sSe}Failed at:`];for(let i of n)r.push(`${lSe}- ${i}`);if(o){let i=pSe(o);i&&(r.push(""),r.push(i));}return r.join(`
191
191
  `)}function dC(t){let e;try{e=readFileSync(t,"utf-8");}catch{return}let o=new LineCounter,n=Ob.parseDocument(e,{lineCounter:o});if(!(n.errors.length>0))return {filePath:t,text:e,doc:n,lineCounter:o}}function dSe({root:t,result:e}){let o=[["before",e.beforeResults],["steps",e.results],["after",e.afterResults]];for(let[n,r]of o){if(!r)continue;let i=DO({source:t,yamlPath:[n],results:r});if(i)return i}}function DO({source:t,yamlPath:e,results:o}){let n=o.findIndex(l=>l.status==="FAILED"),r=o[n];if(!r)return;let i=[...e,n],a=t.doc.getIn(i,true);if(!Ob.isNode(a))return;let s={source:t,node:a};if(r.type==="MODULE"){let l=mSe({source:t,stepPath:i});return l?DO({source:l,yamlPath:["steps"],results:r.results})??s:s}if(r.type==="CONDITIONAL"){let l=t.doc.getIn([...i,"if","then"],true);return !Ob.isNode(l)||!Ob.isSeq(l)?s:DO({source:t,yamlPath:[...i,"if","then"],results:r.results})??s}return s}function mSe({source:t,stepPath:e}){let o=t.doc.getIn([...e,"module"]),n=typeof o=="string"?o:t.doc.getIn([...e,"module","path"]);if(typeof n!="string")return;let r=Oo__default.resolve(Oo__default.dirname(t.filePath),n),i=dC(r);if(i?.doc.get("fileType")===Pe.MODULE_V2)return i}function pSe(t){let e=t.node.range;if(e)return NO(t.source,e[0])}function jq(t,e){let o=typeof e[0]=="number"?["steps",...e]:e;for(let n=o.length;n>=0;n--){let r=n===0?t.doc.contents:t.doc.getIn(o.slice(0,n),true);if(Ob.isNode(r)&&r.range){let i=r.range[0],{line:a,col:s}=t.lineCounter.linePos(i);return {line:a,col:s,startOffset:i}}}}function NO(t,e){let o=t.lineCounter.linePos(e).line,n=t.text.split(`
192
192
  `);if(o<1||o>n.length)return;let r=Math.max(1,o-$q),i=Math.min(n.length,o+$q),a=String(i).length,s=[];for(let l=r;l<=i;l++){let c=l===o?uSe:cSe;s.push(`${c}${String(l).padStart(a)} | ${n[l-1]??""}`);}return s.join(`
193
193
  `)}var Hq="\r",Wq="\x1B[1A",Gq="\x1B[J",fSe="\u28CB\u28D9\u28F9\u28F8\u28FC\u28F4\u28E6\u28E7\u28C7\u28CF",hSe="|/-\\",gSe="\u2736\u2738\u2739\u273A\u2739\u2737",bSe="*",ySe="#0891b2",SSe={pass:{glyph:"\u2713",ascii:"v",paint:Ia.green},fail:{glyph:"\u2718",ascii:"x",paint:Ia.red},skip:{glyph:"\u2212",ascii:"-",paint:Ia.dim},cancel:{glyph:"\u2298",ascii:"o",paint:Ia.yellow},retry:{glyph:"\u21BB",ascii:"~",paint:Ia.yellow}};function sd(t){let e=t.colorLevel>0&&t.isTTY,o=(n,r)=>e?r(n):n;return {unicode:t.unicode,color:e,bold:n=>o(n,Ia.bold),dim:n=>o(n,Ia.gray),code:n=>o(n,Ia.hex(ySe)),spinner:n=>{let r=t.unicode?fSe:hSe,i=(n%r.length+r.length)%r.length;return o(r.charAt(i),Ia.cyan)},classifySpinner:n=>{let r=t.unicode?gSe:bSe,i=(n%r.length+r.length)%r.length;return o(r.charAt(i),Ia.cyan)},statusGlyph:n=>{let r=SSe[n],i=t.unicode?r.glyph:r.ascii;return e?r.paint(i):i},separator:t.unicode?" \xB7 ":" | "}}function qq(t,e=""){let o=process.stdout?.columns||process.stderr?.columns||80,n=Math.max(o-e.length,20),r=[];for(let i of t.split(`
194
194
  `)){let a="";for(let s of i.split(" ")){if(!a.length){a=s;continue}let l=`${a} ${s}`;if(l.length<=n){a=l;continue}r.push(e+a),a=s;}r.push(e+a);}return r.join(`
195
- `)}var TSe={PASS:{glyph:"pass",isTerminal:true},FAIL:{glyph:"fail",isTerminal:true},SKIP:{glyph:"skip",isTerminal:true},CANCEL:{glyph:"cancel",isTerminal:true},RETRY:{glyph:"retry",isTerminal:false}},ESe={PASSED:"PASS",FAILED:"FAIL",CANCELLED:"CANCEL",RETRYING:"RETRY",RUNNING:"RUNNING",SKIP:"SKIP",RUN:"RUNNING",RETRY:"RETRY"};function Kq(t,e,o=0){let n=ESe[t];if(!n)return;let r=sd(e);if(n==="RUNNING")return {badge:r.spinner(o),isTerminal:false};let{glyph:i,isTerminal:a}=TSe[n];return {badge:r.statusGlyph(i),isTerminal:a}}function Mc(t,e){return !e.isTTY||e.colorLevel===0?t:`\x1B]8;;${t}\x07${t}\x1B]8;;\x07`}function Yq(){let t=yG(),e=[];t.lowMemorySamples>0&&e.push(`memory low ${t.lowMemorySamples}x`),t.highCpuSamples>0&&e.push(`CPU saturated ${t.highCpuSamples}x`),t.highHeapSamples>0&&e.push(`heap near limit ${t.highHeapSamples}x`),e.length!==0&&(N.log(""),N.warn(`Machine was under pressure during this run (${e.join(", ")}). Slowdowns and timeouts may be related.`));}var Bt=yp({app:"cli",hostname:hostname(),disableConsoleLogs:true}).child({cliVersion:"1.4.5"});function LO(t){if(!t)return;t=t.toLowerCase();let e=lE.safeParse(t);if(e.success)return N.setMinLevel(e.data),e.data}var ld=" ";function Xq(t){let e={passed:[],failed:[],cancelled:[],quarantinedPassed:[],quarantinedFailed:[]};for(let o of t)switch(o.status){case "PASSED":(o.quarantined?e.quarantinedPassed:e.passed).push(o);break;case "FAILED":(o.quarantined?e.quarantinedFailed:e.failed).push(o);break;case "CANCELLED":e.cancelled.push(o);break}return e}function Jq(t){let e=Xq(t),o=e.failed.filter(r=>r.failureDetails?.classification?.action==="heal"),n=e.failed.filter(r=>r.failureDetails?.classification?.action==="warn");return {passed:e.passed.length,failed:e.failed.length,cancelled:e.cancelled.length,quarantinedPassed:e.quarantinedPassed.length,quarantinedFailed:e.quarantinedFailed.length,healElectedFailures:o.length,warnElectedFailures:n.length}}function Zq(t,{onlyQuarantined:e=false,overrideExitCode:o=false}={}){let n=o?t.healElectedFailures+t.warnElectedFailures:0,r=t.failed-n,i=e?t.quarantinedFailed:0;return r+i>0||t.cancelled>0}function Qq({results:t,startTime:e,getPath:o,getUrl:n,printFailureBody:r,getCancellationReason:i,recoveredCount:a,skippedCount:s,videoRecordingActive:l}){let{passed:c,failed:u,cancelled:d,quarantinedPassed:m,quarantinedFailed:p}=Xq(t),f=Er(),h=f.unicode?"\u2500":"-",g=process.stdout?.columns||80,b=(y,T,v,E)=>{let P=` ${T+1}) ${o(y)} `,M=Math.max(3,g-P.length-2);N.log(""),N.log(v(`${P}${h.repeat(M)}`)),N.log(""),E();let I=n(y);I&&(N.log(""),N.log(`${ld}${Mc(I,f)}`));};Uq(()=>{u.forEach((I,A)=>{b(I,A,Ia.red.bold,()=>r?.(I));}),d.forEach((I,A)=>{b(I,u.length+A,Ia.yellow.bold,()=>{let k=i?.(I)??"Cancelled";N.log(`${ld}${Ia.yellow.bold(k)}`);});});let y=(I,A,k)=>{I.length!==0&&(N.log(""),N.log(` ${k(`${I.length} ${A}`)}`),I.forEach(_=>{N.dimmed(`${ld}${o(_)}`);}));};y(u,"failed",Ia.red.bold),y(p,"failed",I=>Ia.red.bold(`${I} (quarantined)`)),y(d,"cancelled",Ia.yellow.bold),s&&(N.log(""),N.log(` ${Ia.yellow.bold(`${s} skipped`)}`));let T=c.length+m.length,v=Math.max(1,Math.round((Date.now()-e)/1e3)),E=[];m.length>0&&E.push(`${m.length} quarantined`),a&&a>0&&E.push(`${a} recovered`);let P=E.length>0?` (${E.join(", ")})`:"",M=CSe(t,f,l);N.log(""),N.log(` ${Ia.green.bold(`${T} passed${P} (${v}s)`)}${M}`),Yq();});}function CSe(t,e,o=false){let n=t.length;if(n===0)return "";let r=t.filter(s=>s.usedRemoteBrowser).length;return r===0?"":`${e.unicode?" \xB7 ":" | "}${r}/${n} ran on remote browser${o?" (video saved async)":""}`}function e3(t){if(!t.failureDetails||!t.failureReason)return;let e=tc({failureReason:t.failureReason,classification:t.failureDetails.classification,manualClassification:t.failureDetails.manualClassification}),o=e.title??t.failureReason,n=t.failureDetails.classification?.rootCause??e.description??e.title??t.failureReason;N.log(`${ld}${Ia.red.bold(o)}`),n&&n!==o&&(N.log(""),N.log(qq(n,ld)));let r=Vq({failureDetails:t.failureDetails,filePath:t.filePath,results:t.results,beforeResults:t.beforeResults,afterResults:t.afterResults});r&&(N.log(""),N.log(r));let i=t.failureDetails.classification?.citations;if(i&&i.length>0){N.log(""),N.log(`${ld}${Ia.bold("Sources:")}`);for(let a of i)N.log(`${ld} [${a.refId}] ${a.title}`);}}var t3=" ".repeat(6);var wSe=(t,e,o,n)=>{if(o==="length"||o==="prototype"||o==="arguments"||o==="caller")return;let r=Object.getOwnPropertyDescriptor(t,o),i=Object.getOwnPropertyDescriptor(e,o);!ASe(r,i)&&n||Object.defineProperty(t,o,i);},ASe=function(t,e){return t===void 0||t.configurable||t.writable===e.writable&&t.enumerable===e.enumerable&&t.configurable===e.configurable&&(t.writable||t.value===e.value)},RSe=(t,e)=>{let o=Object.getPrototypeOf(e);o!==Object.getPrototypeOf(t)&&Object.setPrototypeOf(t,o);},xSe=(t,e)=>`/* Wrapped ${t}*/
195
+ `)}var TSe={PASS:{glyph:"pass",isTerminal:true},FAIL:{glyph:"fail",isTerminal:true},SKIP:{glyph:"skip",isTerminal:true},CANCEL:{glyph:"cancel",isTerminal:true},RETRY:{glyph:"retry",isTerminal:false}},ESe={PASSED:"PASS",FAILED:"FAIL",CANCELLED:"CANCEL",RETRYING:"RETRY",RUNNING:"RUNNING",SKIP:"SKIP",RUN:"RUNNING",RETRY:"RETRY"};function Kq(t,e,o=0){let n=ESe[t];if(!n)return;let r=sd(e);if(n==="RUNNING")return {badge:r.spinner(o),isTerminal:false};let{glyph:i,isTerminal:a}=TSe[n];return {badge:r.statusGlyph(i),isTerminal:a}}function Mc(t,e){return !e.isTTY||e.colorLevel===0?t:`\x1B]8;;${t}\x07${t}\x1B]8;;\x07`}function Yq(){let t=yG(),e=[];t.lowMemorySamples>0&&e.push(`memory low ${t.lowMemorySamples}x`),t.highCpuSamples>0&&e.push(`CPU saturated ${t.highCpuSamples}x`),t.highHeapSamples>0&&e.push(`heap near limit ${t.highHeapSamples}x`),e.length!==0&&(N.log(""),N.warn(`Machine was under pressure during this run (${e.join(", ")}). Slowdowns and timeouts may be related.`));}var Bt=yp({app:"cli",hostname:hostname(),disableConsoleLogs:true}).child({cliVersion:"1.4.6"});function LO(t){if(!t)return;t=t.toLowerCase();let e=lE.safeParse(t);if(e.success)return N.setMinLevel(e.data),e.data}var ld=" ";function Xq(t){let e={passed:[],failed:[],cancelled:[],quarantinedPassed:[],quarantinedFailed:[]};for(let o of t)switch(o.status){case "PASSED":(o.quarantined?e.quarantinedPassed:e.passed).push(o);break;case "FAILED":(o.quarantined?e.quarantinedFailed:e.failed).push(o);break;case "CANCELLED":e.cancelled.push(o);break}return e}function Jq(t){let e=Xq(t),o=e.failed.filter(r=>r.failureDetails?.classification?.action==="heal"),n=e.failed.filter(r=>r.failureDetails?.classification?.action==="warn");return {passed:e.passed.length,failed:e.failed.length,cancelled:e.cancelled.length,quarantinedPassed:e.quarantinedPassed.length,quarantinedFailed:e.quarantinedFailed.length,healElectedFailures:o.length,warnElectedFailures:n.length}}function Zq(t,{onlyQuarantined:e=false,overrideExitCode:o=false}={}){let n=o?t.healElectedFailures+t.warnElectedFailures:0,r=t.failed-n,i=e?t.quarantinedFailed:0;return r+i>0||t.cancelled>0}function Qq({results:t,startTime:e,getPath:o,getUrl:n,printFailureBody:r,getCancellationReason:i,recoveredCount:a,skippedCount:s,videoRecordingActive:l}){let{passed:c,failed:u,cancelled:d,quarantinedPassed:m,quarantinedFailed:p}=Xq(t),f=Er(),h=f.unicode?"\u2500":"-",g=process.stdout?.columns||80,b=(y,T,v,E)=>{let P=` ${T+1}) ${o(y)} `,M=Math.max(3,g-P.length-2);N.log(""),N.log(v(`${P}${h.repeat(M)}`)),N.log(""),E();let I=n(y);I&&(N.log(""),N.log(`${ld}${Mc(I,f)}`));};Uq(()=>{u.forEach((I,A)=>{b(I,A,Ia.red.bold,()=>r?.(I));}),d.forEach((I,A)=>{b(I,u.length+A,Ia.yellow.bold,()=>{let k=i?.(I)??"Cancelled";N.log(`${ld}${Ia.yellow.bold(k)}`);});});let y=(I,A,k)=>{I.length!==0&&(N.log(""),N.log(` ${k(`${I.length} ${A}`)}`),I.forEach(_=>{N.dimmed(`${ld}${o(_)}`);}));};y(u,"failed",Ia.red.bold),y(p,"failed",I=>Ia.red.bold(`${I} (quarantined)`)),y(d,"cancelled",Ia.yellow.bold),s&&(N.log(""),N.log(` ${Ia.yellow.bold(`${s} skipped`)}`));let T=c.length+m.length,v=Math.max(1,Math.round((Date.now()-e)/1e3)),E=[];m.length>0&&E.push(`${m.length} quarantined`),a&&a>0&&E.push(`${a} recovered`);let P=E.length>0?` (${E.join(", ")})`:"",M=CSe(t,f,l);N.log(""),N.log(` ${Ia.green.bold(`${T} passed${P} (${v}s)`)}${M}`),Yq();});}function CSe(t,e,o=false){let n=t.length;if(n===0)return "";let r=t.filter(s=>s.usedRemoteBrowser).length;return r===0?"":`${e.unicode?" \xB7 ":" | "}${r}/${n} ran on remote browser${o?" (video saved async)":""}`}function e3(t){if(!t.failureDetails||!t.failureReason)return;let e=tc({failureReason:t.failureReason,classification:t.failureDetails.classification,manualClassification:t.failureDetails.manualClassification}),o=e.title??t.failureReason,n=t.failureDetails.classification?.rootCause??e.description??e.title??t.failureReason;N.log(`${ld}${Ia.red.bold(o)}`),n&&n!==o&&(N.log(""),N.log(qq(n,ld)));let r=Vq({failureDetails:t.failureDetails,filePath:t.filePath,results:t.results,beforeResults:t.beforeResults,afterResults:t.afterResults});r&&(N.log(""),N.log(r));let i=t.failureDetails.classification?.citations;if(i&&i.length>0){N.log(""),N.log(`${ld}${Ia.bold("Sources:")}`);for(let a of i)N.log(`${ld} [${a.refId}] ${a.title}`);}}var t3=" ".repeat(6);var wSe=(t,e,o,n)=>{if(o==="length"||o==="prototype"||o==="arguments"||o==="caller")return;let r=Object.getOwnPropertyDescriptor(t,o),i=Object.getOwnPropertyDescriptor(e,o);!ASe(r,i)&&n||Object.defineProperty(t,o,i);},ASe=function(t,e){return t===void 0||t.configurable||t.writable===e.writable&&t.enumerable===e.enumerable&&t.configurable===e.configurable&&(t.writable||t.value===e.value)},RSe=(t,e)=>{let o=Object.getPrototypeOf(e);o!==Object.getPrototypeOf(t)&&Object.setPrototypeOf(t,o);},xSe=(t,e)=>`/* Wrapped ${t}*/
196
196
  ${e}`,MSe=Object.getOwnPropertyDescriptor(Function.prototype,"toString"),PSe=Object.getOwnPropertyDescriptor(Function.prototype.toString,"name"),ISe=(t,e,o)=>{let n=o===""?"":`with ${o.trim()}() `,r=xSe.bind(null,n,e.toString());Object.defineProperty(r,"name",PSe);let{writable:i,enumerable:a,configurable:s}=MSe;Object.defineProperty(t,"toString",{value:r,writable:i,enumerable:a,configurable:s});};function kO(t,e,{ignoreNonConfigurable:o=false}={}){let{name:n}=t;for(let r of Reflect.ownKeys(e))wSe(t,e,r,o);return RSe(t,e),ISe(t,e,n),t}var mC=new WeakMap,o3=(t,e={})=>{if(typeof t!="function")throw new TypeError("Expected a function");let o,n=0,r=t.displayName||t.name||"<anonymous>",i=function(...a){if(mC.set(i,++n),n===1)o=t.apply(this,a),t=void 0;else if(e.throw===true)throw new Error(`Function \`${r}\` can only be called once`);return o};return kO(i,t),mC.set(i,n),i};o3.callCount=t=>{if(!mC.has(t))throw new Error(`The given function \`${t.name}\` is not wrapped by the \`onetime\` package`);return mC.get(t)};var n3=o3;var cd=[];cd.push("SIGHUP","SIGINT","SIGTERM");process.platform!=="win32"&&cd.push("SIGALRM","SIGABRT","SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&cd.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT");var pC=t=>!!t&&typeof t=="object"&&typeof t.removeListener=="function"&&typeof t.emit=="function"&&typeof t.reallyExit=="function"&&typeof t.listeners=="function"&&typeof t.kill=="function"&&typeof t.pid=="number"&&typeof t.on=="function",FO=Symbol.for("signal-exit emitter"),BO=globalThis,_Se=Object.defineProperty.bind(Object),UO=class{emitted={afterExit:false,exit:false};listeners={afterExit:[],exit:[]};count=0;id=Math.random();constructor(){if(BO[FO])return BO[FO];_Se(BO,FO,{value:this,writable:false,enumerable:false,configurable:false});}on(e,o){this.listeners[e].push(o);}removeListener(e,o){let n=this.listeners[e],r=n.indexOf(o);r!==-1&&(r===0&&n.length===1?n.length=0:n.splice(r,1));}emit(e,o,n){if(this.emitted[e])return false;this.emitted[e]=true;let r=false;for(let i of this.listeners[e])r=i(o,n)===true||r;return e==="exit"&&(r=this.emit("afterExit",o,n)||r),r}},fC=class{},OSe=t=>({onExit(e,o){return t.onExit(e,o)},load(){return t.load()},unload(){return t.unload()}}),zO=class extends fC{onExit(){return ()=>{}}load(){}unload(){}},$O=class extends fC{#a=VO.platform==="win32"?"SIGINT":"SIGHUP";#o=new UO;#e;#r;#m;#t={};#i=false;constructor(e){super(),this.#e=e,this.#t={};for(let o of cd)this.#t[o]=()=>{let n=this.#e.listeners(o),{count:r}=this.#o,i=e;if(typeof i.__signal_exit_emitter__=="object"&&typeof i.__signal_exit_emitter__.count=="number"&&(r+=i.__signal_exit_emitter__.count),n.length===r){this.unload();let a=this.#o.emit("exit",null,o),s=o==="SIGHUP"?this.#a:o;a||e.kill(e.pid,s);}};this.#m=e.reallyExit,this.#r=e.emit;}onExit(e,o){if(!pC(this.#e))return ()=>{};this.#i===false&&this.load();let n=o?.alwaysLast?"afterExit":"exit";return this.#o.on(n,e),()=>{this.#o.removeListener(n,e),this.#o.listeners.exit.length===0&&this.#o.listeners.afterExit.length===0&&this.unload();}}load(){if(!this.#i){this.#i=true,this.#o.count+=1;for(let e of cd)try{let o=this.#t[e];o&&this.#e.on(e,o);}catch{}this.#e.emit=(e,...o)=>this.#p(e,...o),this.#e.reallyExit=e=>this.#n(e);}}unload(){this.#i&&(this.#i=false,cd.forEach(e=>{let o=this.#t[e];if(!o)throw new Error("Listener not defined for signal: "+e);try{this.#e.removeListener(e,o);}catch{}}),this.#e.emit=this.#r,this.#e.reallyExit=this.#m,this.#o.count-=1);}#n(e){return pC(this.#e)?(this.#e.exitCode=e||0,this.#o.emit("exit",this.#e.exitCode,null),this.#m.call(this.#e,this.#e.exitCode)):0}#p(e,...o){let n=this.#r;if(e==="exit"&&pC(this.#e)){typeof o[0]=="number"&&(this.#e.exitCode=o[0]);let r=n.call(this.#e,e,...o);return this.#o.emit("exit",this.#e.exitCode,null),r}else return n.call(this.#e,e,...o)}},VO=globalThis.process,{onExit:r3}=OSe(pC(VO)?new $O(VO):new zO);var i3=Ba.stderr.isTTY?Ba.stderr:Ba.stdout.isTTY?Ba.stdout:void 0,DSe=i3?n3(()=>{r3(()=>{i3.write("\x1B[?25h");},{alwaysLast:true});}):()=>{},a3=DSe;var gC=false,Up={};Up.show=(t=Ba.stderr)=>{t.isTTY&&(gC=false,t.write("\x1B[?25h"));};Up.hide=(t=Ba.stderr)=>{t.isTTY&&(a3(),gC=true,t.write("\x1B[?25l"));};Up.toggle=(t,e)=>{t!==void 0&&(gC=t),gC?Up.show(e):Up.hide(e);};var jO=Up;var Lb=zh(HO());function WO(){return Ba.platform!=="win32"?Ba.env.TERM!=="linux":!!Ba.env.CI||!!Ba.env.WT_SESSION||!!Ba.env.TERMINUS_SUBLIME||Ba.env.ConEmuTask==="{cmd::Cmder}"||Ba.env.TERM_PROGRAM==="Terminus-Sublime"||Ba.env.TERM_PROGRAM==="vscode"||Ba.env.TERM==="xterm-256color"||Ba.env.TERM==="alacritty"||Ba.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var LSe={info:Ia.blue("\u2139"),success:Ia.green("\u2714"),warning:Ia.yellow("\u26A0"),error:Ia.red("\u2716")},kSe={info:Ia.blue("i"),success:Ia.green("\u221A"),warning:Ia.yellow("\u203C"),error:Ia.red("\xD7")},FSe=WO()?LSe:kSe,Db=FSe;function GO({onlyFirst:t=false}={}){let r="(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]";return new RegExp(r,t?void 0:"g")}var BSe=GO();function Nb(t){if(typeof t!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof t}\``);return !t.includes("\x1B")&&!t.includes("\x9B")?t:t.replace(BSe,"")}var d3=[161,161,164,164,167,168,170,170,173,174,176,180,182,186,188,191,198,198,208,208,215,216,222,225,230,230,232,234,236,237,240,240,242,243,247,250,252,252,254,254,257,257,273,273,275,275,283,283,294,295,299,299,305,307,312,312,319,322,324,324,328,331,333,333,338,339,358,359,363,363,462,462,464,464,466,466,468,468,470,470,472,472,474,474,476,476,593,593,609,609,708,708,711,711,713,715,717,717,720,720,728,731,733,733,735,735,768,879,913,929,931,937,945,961,963,969,1025,1025,1040,1103,1105,1105,8208,8208,8211,8214,8216,8217,8220,8221,8224,8226,8228,8231,8240,8240,8242,8243,8245,8245,8251,8251,8254,8254,8308,8308,8319,8319,8321,8324,8364,8364,8451,8451,8453,8453,8457,8457,8467,8467,8470,8470,8481,8482,8486,8486,8491,8491,8531,8532,8539,8542,8544,8555,8560,8569,8585,8585,8592,8601,8632,8633,8658,8658,8660,8660,8679,8679,8704,8704,8706,8707,8711,8712,8715,8715,8719,8719,8721,8721,8725,8725,8730,8730,8733,8736,8739,8739,8741,8741,8743,8748,8750,8750,8756,8759,8764,8765,8776,8776,8780,8780,8786,8786,8800,8801,8804,8807,8810,8811,8814,8815,8834,8835,8838,8839,8853,8853,8857,8857,8869,8869,8895,8895,8978,8978,9312,9449,9451,9547,9552,9587,9600,9615,9618,9621,9632,9633,9635,9641,9650,9651,9654,9655,9660,9661,9664,9665,9670,9672,9675,9675,9678,9681,9698,9701,9711,9711,9733,9734,9737,9737,9742,9743,9756,9756,9758,9758,9792,9792,9794,9794,9824,9825,9827,9829,9831,9834,9836,9837,9839,9839,9886,9887,9919,9919,9926,9933,9935,9939,9941,9953,9955,9955,9960,9961,9963,9969,9972,9972,9974,9977,9979,9980,9982,9983,10045,10045,10102,10111,11094,11097,12872,12879,57344,63743,65024,65039,65533,65533,127232,127242,127248,127277,127280,127337,127344,127373,127375,127376,127387,127404,917760,917999,983040,1048573,1048576,1114109],m3=12288,p3=65510,f3=[12288,12288,65281,65376,65504,65510];var h3=4352,g3=262141,qO=[4352,4447,8986,8987,9001,9002,9193,9196,9200,9200,9203,9203,9725,9726,9748,9749,9776,9783,9800,9811,9855,9855,9866,9871,9875,9875,9889,9889,9898,9899,9917,9918,9924,9925,9934,9934,9940,9940,9962,9962,9970,9971,9973,9973,9978,9978,9981,9981,9989,9989,9994,9995,10024,10024,10060,10060,10062,10062,10067,10069,10071,10071,10133,10135,10160,10160,10175,10175,11035,11036,11088,11088,11093,11093,11904,11929,11931,12019,12032,12245,12272,12287,12289,12350,12353,12438,12441,12543,12549,12591,12593,12686,12688,12773,12783,12830,12832,12871,12880,42124,42128,42182,43360,43388,44032,55203,63744,64255,65040,65049,65072,65106,65108,65126,65128,65131,94176,94180,94192,94198,94208,101589,101631,101662,101760,101874,110576,110579,110581,110587,110589,110590,110592,110882,110898,110898,110928,110930,110933,110933,110948,110951,110960,111355,119552,119638,119648,119670,126980,126980,127183,127183,127374,127374,127377,127386,127488,127490,127504,127547,127552,127560,127568,127569,127584,127589,127744,127776,127789,127797,127799,127868,127870,127891,127904,127946,127951,127955,127968,127984,127988,127988,127992,128062,128064,128064,128066,128252,128255,128317,128331,128334,128336,128359,128378,128378,128405,128406,128420,128420,128507,128591,128640,128709,128716,128716,128720,128722,128725,128728,128732,128735,128747,128748,128756,128764,128992,129003,129008,129008,129292,129338,129340,129349,129351,129535,129648,129660,129664,129674,129678,129734,129736,129736,129741,129756,129759,129770,129775,129784,131072,196605,196608,262141];var yC=(t,e)=>{let o=0,n=Math.floor(t.length/2)-1;for(;o<=n;){let r=Math.floor((o+n)/2),i=r*2;if(e<t[i])n=r-1;else if(e>t[i+1])o=r+1;else return true}return false};var b3=19968,[$Se,VSe]=jSe(qO);function jSe(t){let e=t[0],o=t[1];for(let n=0;n<t.length;n+=2){let r=t[n],i=t[n+1];if(b3>=r&&b3<=i)return [r,i];i-r>o-e&&(e=r,o=i);}return [e,o]}var y3=t=>t<161||t>1114109?false:yC(d3,t),S3=t=>t<m3||t>p3?false:yC(f3,t);var T3=t=>t>=$Se&&t<=VSe?true:t<h3||t>g3?false:yC(qO,t);function HSe(t){if(!Number.isSafeInteger(t))throw new TypeError(`Expected a code point, got \`${typeof t}\`.`)}function E3(t,{ambiguousAsWide:e=false}={}){return HSe(t),S3(t)||T3(t)||e&&y3(t)?2:1}var v3=()=>/[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E-\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED8\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])))?))?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3C-\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE8A\uDE8E-\uDEC2\uDEC6\uDEC8\uDECD-\uDEDC\uDEDF-\uDEEA\uDEEF]|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;var WSe=new Intl.Segmenter,GSe=/^\p{Default_Ignorable_Code_Point}$/u;function zp(t,e={}){if(typeof t!="string"||t.length===0)return 0;let{ambiguousIsNarrow:o=true,countAnsiEscapeCodes:n=false}=e;if(n||(t=Nb(t)),t.length===0)return 0;let r=0,i={ambiguousAsWide:!o};for(let{segment:a}of WSe.segment(t)){let s=a.codePointAt(0);if(!(s<=31||s>=127&&s<=159)&&!(s>=8203&&s<=8207||s===65279)&&!(s>=768&&s<=879||s>=6832&&s<=6911||s>=7616&&s<=7679||s>=8400&&s<=8447||s>=65056&&s<=65071)&&!(s>=55296&&s<=57343)&&!(s>=65024&&s<=65039)&&!GSe.test(a)){if(v3().test(a)){r+=2;continue}r+=E3(s,i);}}return r}function KO({stream:t=process.stdout}={}){return !!(t&&t.isTTY&&process.env.TERM!=="dumb"&&!("CI"in process.env))}function YO(){let{env:t}=Ba,{TERM:e,TERM_PROGRAM:o}=t;return Ba.platform!=="win32"?e!=="linux":!!t.WT_SESSION||!!t.TERMINUS_SUBLIME||t.ConEmuTask==="{cmd::Cmder}"||o==="Terminus-Sublime"||o==="vscode"||e==="xterm-256color"||e==="alacritty"||e==="rxvt-unicode"||e==="rxvt-unicode-256color"||t.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var qSe=3,XO=class{#a=0;start(){this.#a++,this.#a===1&&this.#o();}stop(){if(this.#a<=0)throw new Error("`stop` called more times than `start`");this.#a--,this.#a===0&&this.#e();}#o(){Ba.platform==="win32"||!Ba.stdin.isTTY||(Ba.stdin.setRawMode(true),Ba.stdin.on("data",this.#r),Ba.stdin.resume());}#e(){Ba.stdin.isTTY&&(Ba.stdin.off("data",this.#r),Ba.stdin.pause(),Ba.stdin.setRawMode(false));}#r(e){e[0]===qSe&&Ba.emit("SIGINT");}},KSe=new XO,JO=KSe;zh(HO());var ZO=class{#a=0;#o=false;#e=0;#r=-1;#m=0;#t;#i;#n;#p;#h;#c;#u;#d;#g;#s;#l;color;constructor(e){typeof e=="string"&&(e={text:e}),this.#t={color:"cyan",stream:Ba.stderr,discardStdin:true,hideCursor:true,...e},this.color=this.#t.color,this.spinner=this.#t.spinner,this.#h=this.#t.interval,this.#n=this.#t.stream,this.#c=typeof this.#t.isEnabled=="boolean"?this.#t.isEnabled:KO({stream:this.#n}),this.#u=typeof this.#t.isSilent=="boolean"?this.#t.isSilent:false,this.text=this.#t.text,this.prefixText=this.#t.prefixText,this.suffixText=this.#t.suffixText,this.indent=this.#t.indent,Ba.env.NODE_ENV==="test"&&(this._stream=this.#n,this._isEnabled=this.#c,Object.defineProperty(this,"_linesToClear",{get(){return this.#a},set(o){this.#a=o;}}),Object.defineProperty(this,"_frameIndex",{get(){return this.#r}}),Object.defineProperty(this,"_lineCount",{get(){return this.#e}}));}get indent(){return this.#d}set indent(e=0){if(!(e>=0&&Number.isInteger(e)))throw new Error("The `indent` option must be an integer from 0 and up");this.#d=e,this.#f();}get interval(){return this.#h??this.#i.interval??100}get spinner(){return this.#i}set spinner(e){if(this.#r=-1,this.#h=void 0,typeof e=="object"){if(e.frames===void 0)throw new Error("The given spinner must have a `frames` property");this.#i=e;}else if(!YO())this.#i=Lb.default.line;else if(e===void 0)this.#i=Lb.default.dots;else if(e!=="default"&&Lb.default[e])this.#i=Lb.default[e];else throw new Error(`There is no built-in spinner named '${e}'. See https://github.com/sindresorhus/cli-spinners/blob/main/spinners.json for a full list.`)}get text(){return this.#g}set text(e=""){this.#g=e,this.#f();}get prefixText(){return this.#s}set prefixText(e=""){this.#s=e,this.#f();}get suffixText(){return this.#l}set suffixText(e=""){this.#l=e,this.#f();}get isSpinning(){return this.#p!==void 0}#b(e=this.#s,o=" "){return typeof e=="string"&&e!==""?e+o:typeof e=="function"?e()+o:""}#y(e=this.#l,o=" "){return typeof e=="string"&&e!==""?o+e:typeof e=="function"?o+e():""}#f(){let e=this.#n.columns??80,o=this.#b(this.#s,"-"),n=this.#y(this.#l,"-"),r=" ".repeat(this.#d)+o+"--"+this.#g+"--"+n;this.#e=0;for(let i of Nb(r).split(`
197
197
  `))this.#e+=Math.max(1,Math.ceil(zp(i,{countAnsiEscapeCodes:true})/e));}get isEnabled(){return this.#c&&!this.#u}set isEnabled(e){if(typeof e!="boolean")throw new TypeError("The `isEnabled` option must be a boolean");this.#c=e;}get isSilent(){return this.#u}set isSilent(e){if(typeof e!="boolean")throw new TypeError("The `isSilent` option must be a boolean");this.#u=e;}frame(){let e=Date.now();(this.#r===-1||e-this.#m>=this.interval)&&(this.#r=++this.#r%this.#i.frames.length,this.#m=e);let{frames:o}=this.#i,n=o[this.#r];this.color&&(n=Ia[this.color](n));let r=typeof this.#s=="string"&&this.#s!==""?this.#s+" ":"",i=typeof this.text=="string"?" "+this.text:"",a=typeof this.#l=="string"&&this.#l!==""?" "+this.#l:"";return r+n+i+a}clear(){if(!this.#c||!this.#n.isTTY)return this;this.#n.cursorTo(0);for(let e=0;e<this.#a;e++)e>0&&this.#n.moveCursor(0,-1),this.#n.clearLine(1);return (this.#d||this.lastIndent!==this.#d)&&this.#n.cursorTo(this.#d),this.lastIndent=this.#d,this.#a=0,this}render(){return this.#u?this:(this.clear(),this.#n.write(this.frame()),this.#a=this.#e,this)}start(e){return e&&(this.text=e),this.#u?this:this.#c?this.isSpinning?this:(this.#t.hideCursor&&jO.hide(this.#n),this.#t.discardStdin&&Ba.stdin.isTTY&&(this.#o=true,JO.start()),this.render(),this.#p=setInterval(this.render.bind(this),this.interval),this):(this.text&&this.#n.write(`- ${this.text}
198
198
  `),this)}stop(){return this.#c?(clearInterval(this.#p),this.#p=void 0,this.#r=0,this.clear(),this.#t.hideCursor&&jO.show(this.#n),this.#t.discardStdin&&Ba.stdin.isTTY&&this.#o&&(JO.stop(),this.#o=false),this):this}succeed(e){return this.stopAndPersist({symbol:Db.success,text:e})}fail(e){return this.stopAndPersist({symbol:Db.error,text:e})}warn(e){return this.stopAndPersist({symbol:Db.warning,text:e})}info(e){return this.stopAndPersist({symbol:Db.info,text:e})}stopAndPersist(e={}){if(this.#u)return this;let o=e.prefixText??this.#s,n=this.#b(o," "),r=e.symbol??" ",i=e.text??this.text,s=typeof i=="string"?(r?" ":"")+i:"",l=e.suffixText??this.#l,c=this.#y(l," "),u=n+r+s+c+`
@@ -221,7 +221,7 @@ ${o}`:o}var GTe="[FAILED]";async function WC(t,e,o,{numStepsWithScreenshots:n=5,
221
221
  `),s;try{s=Ob.parse(a);}catch(l){throw l instanceof YAMLParseError?new LT(`Invalid YAML in ${o}: ${l.message}`,{cause:l}):l}return S4.set(o,{mtimeMs:n.mtimeMs,size:n.size,parsed:s}),{parsed:structuredClone(s),stats:n}}var w4=false,_ve=z.object({fileType:z.enum(Pe)});async function _t(t,e=false,o=Sd){return R4({project:t,includeGlobs:t.config.include??Qp,disableLogging:e,fileSystem:o})}async function A4(t,e=false){let o=t.config.include??["**/*.module.yaml"];return {mobileModules:(await R4({project:t,includeGlobs:o,disableLogging:e,filePathPredicate:r=>r.endsWith(".module.yaml")})).mobileModules}}async function R4({project:t,includeGlobs:e,disableLogging:o,filePathPredicate:n,fileSystem:r=Sd}){let i={project:t,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{},metadataParseFailures:[]},a=t.config.exclude??[],s=AbortSignal.timeout(5e3),l;try{l=await yd(e,{cwd:t.rootDir,ignore:a,maxDepth:ry,nodir:!0,signal:s,fs:r});}catch(c){throw N.error({err:c},"Failed to list all Momentic files in the current directory. This usually indicates the 'include' and 'exclude' globs are misconfigured in your momentic.config.yaml, or that your machine is severely resource constrained."),new Error("Listing Momentic files timed out after 5 seconds.",{cause:c})}for(let c of l){if(n&&!n(c))continue;let u=Dve(t.rootDir,c,i,o?Bu:N,r);u&&(i.duplicateEntities[u.id]=u.paths);}return w4=true,i}async function x4(t){let e=t.config.exclude??[],o=AbortSignal.timeout(5e3),n;try{n=await yd(["**"],{cwd:t.rootDir,ignore:e,maxDepth:ry,nodir:!1,onlyDirectories:!0,signal:o});}catch(i){throw o.aborted?(N.error({err:i},"Listing Momentic entity folders timed out after 5s. Check 'include'/'exclude' globs in momentic.config.yaml."),new Error("Listing Momentic entity folders timed out after 5s.",{cause:i})):i}let r=n.map(i=>i.split(Oo__default.sep).join("/")).filter(i=>Ove(t,i));return Array.from(new Set(r)).sort()}function Ove(t,e){let o=t.config.exclude??[],n=t.config.include??Qp;return ["test.yaml","module.yaml"].some(i=>{let a=e?`${e}/placeholder.${i}`:`placeholder.${i}`;return ny(a,o)?false:ny(a,n)})}function gw({project:t,relativeFilePath:e}){let o=e.split(Oo__default.sep).join("/"),n=t.config.exclude??[];if(ny(o,n))throw new It(`Cannot create "${o}" because it matches this project's "exclude" patterns (${n.join(", ")}). Choose a folder that is part of the project.`);let r=t.config.include??Qp;if(!ny(o,r))throw new It(`Cannot create "${o}" because it is outside this project's "include" patterns (${r.join(", ")}). Choose a folder that is part of the project.`)}function Dve(t,e,o,n,r){let i=Oo__default.join(t,e),a=Nve(i,n,r);if(!a)return;let{entityJs:s,stats:l}=a,c=_ve.safeParse(s);if(c.success===false){n.warn(`Possible Momentic file at ${i} does not have a 'fileType', skipping: ${J(c.error)}`);return}let u=c.data.fileType,d=Lve(e,i,l);switch(u){case Pe.TEST:try{return T4(s,u,o,d,i,n)}catch(m){n.warn(`Skipping file '${i}' because it is missing Momentic test metadata: ${J(m)}`);return}case Pe.TEST_V2:try{return T4(s,u,o,d,i,n)}catch(m){hw({err:m,fullPath:i,fsAttributes:d,kind:"test",suffix:"test.yaml",resultsCollector:o,logger:n});return}case Pe.MODULE:try{return E4(s,u,o,d,i,n)}catch(m){n.warn(`Skipping file '${i}' because it is missing Momentic module metadata: ${J(m)}`);return}case Pe.MODULE_V2:try{return E4(s,u,o,d,i,n)}catch(m){hw({err:m,fullPath:i,fsAttributes:d,kind:"module",suffix:"module.yaml",resultsCollector:o,logger:n});return}case Pe.MOBILE_TEST:try{return C4(s,u,o,d,i,n)}catch(m){n.warn(`Skipping file '${i}' because it is missing Momentic mobile test metadata: ${J(m)}`);return}case Pe.MOBILE_TEST_V2:try{return C4(s,u,o,d,i,n)}catch(m){hw({err:m,fullPath:i,fsAttributes:d,kind:"test",suffix:"test.yaml",resultsCollector:o,logger:n});return}case Pe.MOBILE_MODULE:try{return v4(s,u,o,d,i,n)}catch(m){n.warn(`Skipping file '${i}' because it is missing Momentic mobile module metadata: ${J(m)}`);return}case Pe.MOBILE_MODULE_V2:try{return v4(s,u,o,d,i,n)}catch(m){hw({err:m,fullPath:i,fsAttributes:d,kind:"module",suffix:"module.yaml",resultsCollector:o,logger:n});return}default:{return}}}function Nve(t,e,o){try{let{parsed:n,stats:r}=ca(t,o);if(typeof n!="object"||n===null)throw new Error("The YAML document should parse as a map with key-value pairs");return {entityJs:n,stats:r}}catch(n){e.warn(`Could not parse possible Momentic file at ${t}, skipping: ${J(n)}`);return}}function hw({err:t,fullPath:e,fsAttributes:o,kind:n,suffix:r,resultsCollector:i,logger:a}){if(t instanceof z.ZodError){i.metadataParseFailures.push({fullPath:e,relativePath:o.relativePath,name:o.fileName.replace(`.${r}`,""),kind:n,issues:t.issues});return}a.warn(`Skipping file '${e}': failed to read Momentic v2 ${n} metadata: ${J(t)}`);}function Lve(t,e,o){return {relativePath:t,fullFilePath:e,platformSep:Oo__default.sep,fullPathSegments:e.split(Oo__default.sep),relativePathSegments:t.split(Oo__default.sep),fileName:Oo__default.basename(e),lastModified:o.mtime,createdAt:o.birthtime}}function T4(t,e,o,n,r,i){let a=n.fileName.replace(".test.yaml",""),s,l;e===Pe.TEST_V2?(s=w_.parse(t),l=a):(s=xg.parse(t),l=s.name);let c;if(o.tests[s.id]){let u=o.tests[s.id].fullFilePath;c={id:s.id,paths:[u,r]};}return o.tests[s.id]={type:e,name:l,id:s.id,description:s.description??void 0,labels:s.labels,...n},c}function E4(t,e,o,n,r,i){let a,s,l,c=n.fileName.replace(".module.yaml","");if(e===Pe.MODULE_V2){let d=QE.parse(t);a=d.id,s=d.name??c,l=d.description;}else {let d=ps.parse(t);a=d.moduleId,s=d.name,l=d.description;}let u;if(o.modules[a]){let d=o.modules[a].fullFilePath;u={id:a,paths:[d,r]};}return o.modules[a]={type:e,name:s,id:a,description:l??void 0,...n},!w4&&Ti(s)!==c&&i.warn(`The module with ID ${a} has a name (${s}) that does not match its file name (${c}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`),u}function v4(t,e,o,n,r,i){let a=n.fileName.replace(".module.yaml",""),s,l,c;if(e===Pe.MOBILE_MODULE_V2){let d=rv.parse(t);s=d.id,l=d.description,c=d.name??a;}else {let d=Es.parse(t);s=d.moduleId,l=d.description,c=a;}let u;if(o.mobileModules[s]){let d=o.mobileModules[s].fullFilePath;u={id:s,paths:[d,r]};}return o.mobileModules[s]={type:e,name:c,id:s,description:l??void 0,...n},u}function C4(t,e,o,n,r,i){let a=e===Pe.MOBILE_TEST_V2?ZH.parse(t):yc.parse(t),s;if(o.mobileTests[a.id]){let c=o.mobileTests[a.id].fullFilePath;s={id:a.id,paths:[c,r]};}let l=n.fileName.replace(".test.yaml","");return o.mobileTests[a.id]={type:e,name:l,id:a.id,description:a.description??void 0,labels:a.labels,...n},s}var M4=100;function xl(t,e){let o=e.hooks?.postSave;if(!o)return;let n;o.includes("$1")?n=o.replaceAll("$1",t):n=`${o} ${t}`,I4(n);}function P4(t,e){let o=e.hooks?.postSave;if(!(!o||t.length===0)){if(o.includes("$1")){for(let n of t)xl(n,e);return}for(let n=0;n<t.length;n+=M4){let r=t.slice(n,n+M4).map(Fve).join(" ");I4(`${o} ${r}`);}}}function I4(t){N.debug({postSaveCommand:t},"Executing post-save hook command");try{execSync(t,{encoding:"utf-8"});}catch(e){N.warn({err:e,postSaveCommand:t},"Post-save hook command failed; continuing.");}}function Fve(t){return `'${t.replaceAll("'","'\\''")}'`}function Ed({sourceFilePath:t,momenticFiles:e}){return Uve({sourceFilePath:t,moduleEntities:e?.mobileModules})}function Uve({sourceFilePath:t,moduleEntities:e}){return {sourceFilePath:t,getModuleReference:o=>{let n=e?.[o]?.fullFilePath;if(!n)return;let r=Oo__default.relative(Oo__default.dirname(t),n).split(Oo__default.sep).join("/");return FD(r)},getRelativeJsonFileReference:o=>{if(!Oo__default.isAbsolute(o))return FD(o);let n=Oo__default.relative(Oo__default.dirname(t),o).split(Oo__default.sep).join("/");return FD(n)}}}function vd({sourceFilePath:t,momenticFiles:e}){return zve({sourceFilePath:t,moduleEntities:e.mobileModules})}function zve({sourceFilePath:t,moduleEntities:e}){let o=new Map(Object.values(e).map(n=>[Oo__default.resolve(n.fullFilePath),n]));return {sourceFilePath:t,readRelativeFile:n=>rw(n)||Oo__default.isAbsolute(n)||t4(n)?readFileSync(Oo__default.resolve(Oo__default.dirname(t),n),"utf8"):n,resolveRelativeJsonPath:n=>Oo__default.isAbsolute(n)?n:Oo__default.resolve(Oo__default.dirname(t),n),resolveModuleReference:n=>{if(!iw(n))return;let r=Oo__default.resolve(Oo__default.dirname(t),n),i=o.get(r);if(!i)throw new Ye(`Could not find module file '${n}' referenced from '${t}'.`);return {moduleId:i.id,moduleName:i.name}}}}function FD(t){return rw(t)||Oo__default.isAbsolute(t)?t.split(Oo__default.sep).join("/"):`./${t.split(Oo__default.sep).join("/")}`}var _4=100;function ef({projectConfig:t,momenticFiles:e,entityType:o}){if(t.fileFormat!=="v2")return v4$1();let n;switch(o){case "test":n=Object.keys(e.tests);break;case "module":n=Object.keys(e.modules);break;case "mobile-test":n=Object.keys(e.mobileTests);break;case "mobile-module":n=Object.keys(e.mobileModules);break}return $ve({existingIds:n})}function $ve({existingIds:t}){let e=new Set(t);for(let o=0;o<_4;o++){let n=cn.parse(Y3(v4$1()));if(!e.has(n))return n}throw new Error(`Failed to generate a unique readable v2 entity ID after ${_4} attempts`)}function bw(t,e){let o=[];for(let n of t.config.environments??[]){if(n.baseUrl)continue;let r=Cd(n.name,t,e);r.variables[FP]||o.push(r);}return o}function Hve(t){return t.includes("${")?t.replace(/\$\{([^}]+)\}/g,(e,o)=>{let n=o.match(/^([A-Za-z_][A-Za-z0-9_]*)(?:(:-|-)([\s\S]*))?$/);if(!n)return process.env[o]||"";let r=n[1];if(!r)return "";let i=n[2],a=n[3],s=process.env[r];return i===":-"?s&&s!==""?s:a||"":i==="-"?s!==void 0?s:a||"":s||""}):t}function Wve(t){let{envVariables:e,project:o}=t;if(!e)return {};let n={};for(let[r,i]of Object.entries(e)){if(typeof i=="string"){let s=Hve(i);s&&(n[r]=s);continue}let a;try{a=Bn__default.readFileSync(Oo__default.resolve(o.rootDir,i.fromFile),"utf-8");}catch(s){throw new Error(`Failed to read environment variable '${r}' from file '${i.fromFile}': ${s}`)}if(i.json)try{n[r]=JSON.parse(a);}catch(s){throw new Error(`Failed to parse environment variable '${r}' from file '${i.fromFile}' as JSON: ${s}`)}else n[r]=a;}return Object.keys(n).length>0&&N.debug(n,"Set environment variables with interpolation from project configuration"),n}function Gve(t){let{project:e,envFile:o,logger:n}=t,r={};if(!o)return r;let i=Vve.config({path:Oo__default.resolve(e.rootDir,o),processEnv:r,logLevel:"error",quiet:true});if(i.error)throw new Ye(`Failed to load .env file: ${i.error.message}`,{cause:i.error});return n.debug("Set environment variables from .env file"),r}function Cd(t,e,o){let n=(e.config.environments??[]).find(l=>l.name===t);if(!n)throw new Ye(`Environment ${t} not found in local project configuration file`);let r={},i=Wve({envVariables:n.envVariables,project:e});Object.assign(r,i);let a=Gve({project:e,envFile:n.envFile,logger:o});return Object.assign(r,a),n.inheritFromShell&&(o.debug(process.env,"Inheriting environment variables from shell"),Object.assign(r,process.env)),{name:t,variables:r}}var kc="momentic.config.yaml",UD="momentic.workspace.yaml",Zve=z.object({projects:z.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),Qve=z.union([z.string(),z.object({fromFile:z.string(),json:z.boolean().optional()})]),eCe=z.object({name:ND,baseUrl:z.string().optional().describe("Optional for mobile tests"),envFile:z.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:z.record(z.string(),Qve).optional(),inheritFromShell:z.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:dl.optional().describe("NB: most things should use project-level configuration only")}),tCe=z.object({postSave:z.string().optional()}),oCe=z.union([z.boolean(),z.literal("on-fail")]).describe("Controls video recording for test runs. true records video for all tests, false disables video (default), 'on-fail' records video but removes it for passing tests."),nCe=z.object({name:ND,include:z.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:z.string().array().optional().describe("opposite of include, takes precedence over include"),fileFormat:zj.optional().describe("file format version to use"),goldenFileDir:z.string().optional(),reporterDir:z.string().optional(),outputDir:z.string().optional(),recordVideo:oCe.optional(),retries:z.number().optional().describe("number of retries per test"),parallel:z.union([z.number(),z.literal("auto")]).optional().describe("degree of parallelism"),environments:z.array(eCe).optional(),gitMainBranch:z.string().optional().readonly(),gitProtectedBranches:z.string().array().optional().readonly(),ai:gs.optional(),browser:dl.optional(),emulator:n_.optional(),advanced:JP.optional(),displayRoot:z.string().optional().describe("relative path from project root to use as the Repository root"),hooks:tCe.optional()});function k4(t,e){let o;try{o=readFileSync(t,"utf-8");}catch(r){N.warn(`Could not read possible Momentic ${e} file at ${t}: ${J(r)}`);return}let n;try{if(n=Ob.parse(o),typeof n!="object"||n===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof n} instead`)}catch(r){N.warn(`Possible Momentic ${e} file at ${t} does not parse as valid YAML: ${J(r)}`);return}return n}function F4(t,e){let o=[];for(let[n,r]of Object.entries(t)){let a=/^\d+$/.test(n)?`${e}[${n}]`:e?`${e}.${n}`:n;r!==null&&typeof r=="object"?o.push(...F4(r,a)):o.push(a);}return o}var rCe=["healing","explore"];function iCe(t){let e=t.ai;if(!e)return [];let o=[];for(let n of rCe)e[n]!==void 0&&(delete e[n],o.push(`ai.${n}`));return o}var aCe=z.object({ai:z.object({classification:z.object({categories:z.unknown()})})});function sCe(t){let e=aCe.safeParse(t);return e.success&&e.data.ai.classification.categories!==void 0}function zD(t){let e=k4(t,"project configuration");if(e===void 0)return;let o;try{o=nCe.parse(e);}catch(a){let s=a instanceof z.ZodError?`
222
222
  ${z.prettifyError(a)}`:`: ${J(a)}`;N.warn(`Project config at ${t} does not match the required schema${s}`);return}let n=deletedDiff(e,o),r=F4(n,"");r.length>0&&N.warn(`Momentic config file at ${t} contains unrecognized keys: ${r.join(", ")}. These keys will be ignored.`);let i=iCe(o);return sCe(e)&&i.push("ai.classification.categories"),i.length>0&&N.warn(`Momentic config file at ${t} sets cloud-managed AI settings (${i.join(", ")}) that are configured in the Momentic dashboard and ignored locally. Remove them from this file.`),o}function lCe(t){let e=k4(t,"workspace configuration");if(e!==void 0)try{return Zve.parse(e)}catch(o){N.warn(`Possible Momentic workspace configuration file at ${t} does not adhere to the required schema: ${J(o)}`);return}}function cCe(){let t=[],e=cwd(),o=Oo__default.parse(e).root,n=15,r=0;for(;r<n;){r++;let i=Oo__default.basename(e);if(DD.includes(i))return N.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),t;for(let a of readdirSync(e))if(a.endsWith(kc)){let s=Oo__default.join(e,a),l=zD(s);l&&t.push({configFilePath:s,config:l,rootDir:dirname(s)});}if(t.length)return t;if(e=Oo__default.dirname(e),e===o)break}return t}async function Ni(t={}){let{configFilePath:e,nameFilter:o,skipExitOnError:n}=t,r=await dCe(e,n);if(o&&(r=r.filter(i=>i.config.name===o)),r.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
223
223
  ${r.map(i=>i.configFilePath)}`);if(r.length===0)throw new Error("No valid Momentic project file available.");return N.debug(`Found valid project configuration at ${r[0].configFilePath}`),r[0]}async function uCe(t){let e=lCe(t);if(!e||!e.projects||!e.projects.length)return;let o=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${kc}`)),n=AbortSignal.timeout(2e3),r;try{r=await yd(o,{cwd:cwd(),maxDepth:ry,ignore:[],nodir:!0,signal:n});}catch(a){throw N.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${UD} is misconfigured.`),a}let i=[];for(let a of r){let s=Oo__default.join(cwd(),a),l=zD(s);l&&i.push({configFilePath:s,config:l,rootDir:dirname(s)});}return i}async function dCe(t,e){if(t){t=Oo__default.resolve(t);let n=zD(t);return n?[{config:n,configFilePath:t,rootDir:Oo__default.dirname(t)}]:(console.error(`No valid Momentic project file found at ${t}.`),e||process.exit(1),[])}if(existsSync(UD)){let n=await uCe(UD);if(n)return n}return cCe()}function Ad(t,e){let o=Ob.stringify(t);writeFileSync(e,o);}var iy="test-results";var B4=3e3,Zt=U4(),fCe=promisify(execFile);async function ua(t){let{logger:e,operation:o,fn:n,context:r}=t,i=Date.now();try{return await n()}finally{let a=Date.now()-i;a>B4&&!process.env.CI&&e.warn({operation:o,durationMs:a,thresholdMs:B4,...r??{}},"[timing] slow git metadata operation");}}function Ls(t){if(t)try{let e=new Date(t);return isNaN(e.getTime())?void 0:e}catch{return}}async function hCe(t){let e=await Qt(t,Zt.raw(["config","--list"])),o={};if(!e)return o;for(let n of e.split(`
224
- `)){let r=n.indexOf("=");if(r===-1)continue;let i=n.slice(0,r),a=n.slice(r+1).trim();o[i]=a;}return o}async function gCe(t,e,o){try{let r=o["github.user"]||void 0;if(r)return r}catch{}let n;try{if(e?.startsWith("http://")||e?.startsWith("https://"))n=new URL(e).host;else if(e?.startsWith("git@")){let r=e.indexOf("@"),i=e.indexOf(":",r+1);r!==-1&&i!==-1&&(n=e.slice(r+1,i));}}catch{}if(n=n?.toLowerCase(),!!n&&e?.startsWith("git@")&&n.includes("github"))try{let{stdout:r,stderr:i}=await fCe("ssh",["-T","-o","BatchMode=yes",`git@${n}`],{timeout:5e3}),s=`${r??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}catch{return}}async function bCe(t,e,o){let n=e?.includes("github.com"),r=e?.includes("gitlab.com");try{if(n)return gCe(t,e,o);if(r)return}catch{}}function ay(t){if(t.startsWith("git@")){let e=t.split(":");if(e.length===2){let o=e[1].replace(".git","").split("/");if(o.length===2){let n=o[0],r=o[1];return `${n}/${r}`}}}else if(t.startsWith("http")||t.startsWith("https")){let o=new URL(t).pathname.split("/").filter(Boolean);if(o.length>=2){let n=o[0],r=o[1].replace(".git","");return `${n}/${r}`}}}function yCe(t){if(!(t instanceof Error))return false;let e=t.message;return e.includes("not a git repository")||e.includes("ENOENT")||e.includes("detected dubious ownership")}async function Qt(t,e){try{return (await e).trim()}catch(o){if(yCe(o))return;t.error({err:o},"Failed to run git command");return}}function SCe(){if(process.env.GITHUB_ACTION)return "GithubActions";if(process.env.GITLAB_CI)return "GitlabCI";if(process.env.CIRCLECI)return "CircleCI";if(process.env.BUILDKITE)return "Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return "AzureDevOps";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return "GCPCloudBuild";if(process.env.BITRISE_BUILD_SLUG)return "Bitrise";if(process.env.MOMENTIC_GIT_OVERRIDE)return "Custom"}async function TCe(t){let[e,o,n]=await Promise.all([Qt(t,Zt.show(["--no-patch","--format=%ci"])),Qt(t,Zt.show(["-s","--pretty=%B"])),Qt(t,Zt.show(["-s","--pretty=%an"]))]),r=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?Ls(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:r,gitCommitMessage:o,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function ECe(t){let[e,o,n]=await Promise.all([Qt(t,Zt.listRemote(["--get-url","origin"])),Qt(t,Zt.show(["-s","--pretty=%B"])),Qt(t,Zt.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?Ls(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:o,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function vCe(t){let[e,o,n,r]=await Promise.all([Qt(t,Zt.show(["--no-patch","--format=%ci"])),Qt(t,Zt.listRemote(["--get-url","origin"])),Qt(t,Zt.show(["-s","--pretty=%B"])),Qt(t,Zt.show(["-s","--pretty=%an"]))]),a=process.env.CIRCLE_REPOSITORY_URL?.trim()||void 0||o||void 0,s=a?.includes("github.com")??false,l=a?.includes("gitlab.com")??false,c=a?ay(a):void 0;return {ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?Ls(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:a,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:s?c:void 0,gitlabProjectPath:l?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function CCe(t){let[e,o,n]=await Promise.all([Qt(t,Zt.show(["--no-patch","--format=%ci"])),Qt(t,Zt.show(["-s","--pretty=%B"])),Qt(t,Zt.show(["-s","--pretty=%an"]))]),r=process.env.BUILDKITE_REPO,i=r?.includes("github.com"),a=r?.includes("gitlab.com"),s=r?ay(r):void 0;return {ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?Ls(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:r,gitCommitMessage:o,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 wCe(t){let[e,o,n]=await Promise.all([Qt(t,Zt.show(["--no-patch","--format=%ci"])),Qt(t,Zt.show(["-s","--pretty=%B"])),Qt(t,Zt.show(["-s","--pretty=%an"]))]),r=process.env["Build.Repository.Uri"],i=r?.includes("github.com"),a=r?.includes("gitlab.com"),s=r?ay(r):void 0;return {ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?Ls(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:r,gitCommitMessage:o,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function ACe(t,e,o){let[n,r,i,a,s,l,c,u,d]=await Promise.all([Qt(t,Zt.revparse(["HEAD"])),Qt(t,Zt.revparse(["--short","HEAD"])),Qt(t,Zt.revparse(["--abbrev-ref","HEAD"])),Qt(t,Zt.listRemote(["--get-url","origin"])),Qt(t,Zt.show(["--no-patch","--format=%ci"])),Qt(t,Zt.show(["-s","--pretty=%B"])),Qt(t,Zt.show(["-s","--pretty=%an"])),e?Qt(t,Zt.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),hCe(t)]),m=u||(e?await Qt(t,Zt.raw(["merge-base",e,"HEAD"])):void 0),p=m?await Qt(t,Zt.show(["--no-patch","--format=%ci",m])):void 0,f=a?.includes("github.com"),h=a?.includes("gitlab.com"),g=a?ay(a):void 0,b=d["user.email"]||void 0,y=d["user.name"]||void 0,T=d["user.username"]||void 0,v=d["github.user"]||void 0,M=(o?.includeHostingUsername??true?await bCe(t,a,d):void 0)??T??v??void 0;return {ciProvider:"none",gitCommitSha:n,gitCommitShaShort:r,gitBranchName:i,gitOriginUrl:a,gitCommitTimestamp:s?Ls(s):void 0,gitCommitMessage:l,gitCommitAuthorName:c,gitLocalUsername:M,gitLocalEmail:b,gitLocalName:y,lastCommitOnMainSha:m,lastCommitOnMainTimestamp:p?Ls(p):void 0,githubRepository:f?g:void 0,gitlabProjectPath:h?g:void 0,pipelineId:void 0}}async function RCe(t){let[e,o]=await Promise.all([Qt(t,Zt.show(["--no-patch","--format=%ci"])),Qt(t,Zt.show(["-s","--pretty=%an"]))]),n=process.env.GIT_REPOSITORY_URL,r=n?.includes("github.com"),i=n?.includes("gitlab.com"),a=n?ay(n):void 0;return {ciProvider:"Bitrise",gitCommitSha:process.env.BITRISE_GIT_COMMIT,gitCommitShaShort:process.env.BITRISE_GIT_COMMIT?.slice(0,6),gitCommitTimestamp:e?Ls(e):void 0,gitBranchName:process.env.BITRISE_GIT_BRANCH,gitOriginUrl:n,gitCommitMessage:process.env.BITRISE_GIT_MESSAGE,gitCommitAuthorName:o,githubRepository:r?a:void 0,gitlabProjectPath:i?a:void 0,pipelineId:`${process.env.BITRISE_APP_SLUG}:${process.env.BITRISE_BUILD_SLUG}`}}async function xCe(){let t=process.env._HEAD_REPO_URL;return {ciProvider:"GCPCloudBuild",gitCommitSha:process.env.COMMIT_SHA,gitCommitShaShort:process.env.COMMIT_SHA?.slice(0,6),gitBranchName:process.env.BRANCH_NAME,gitOriginUrl:t?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:t?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}function MCe(){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:Ls(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:Ls(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 PCe(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function sy(t,e,o){let n=SCe();if(!n)return ACe(t,e,o);switch(n){case "GithubActions":return TCe(t);case "GitlabCI":return ECe(t);case "CircleCI":return vCe(t);case "Buildkite":return CCe(t);case "AzureDevOps":return wCe(t);case "GCPCloudBuild":return xCe();case "Bitrise":return RCe(t);case "Custom":return MCe()}}async function ICe(t,e,o,n){let r=n,i=n.gitCommitSha;if(!i)return r;let a=n.gitMainBranch;if(a&&(!r.lastCommitOnMainSha||!r.lastCommitOnMainTimestamp))try{let s=await ua({logger:t,operation:"getRemoteMetadataFromGitlab.getMergeBaseCommitFromGitlab",fn:()=>e.getMergeBaseCommitFromGitlab(o,a,i),context:{projectPath:o,mainBranch:a}});r={...r,lastCommitOnMainSha:s.sha,lastCommitOnMainTimestamp:s.committer.date};}catch(s){t.warn({err:s},"Failed to get merge base commit from Gitlab");}if(!r.gitCommitTimestamp||!r.gitCommitAuthorName||!r.gitCommitMessage||!r.gitCommitAuthorName)try{let s=await ua({logger:t,operation:"getRemoteMetadataFromGitlab.getCommitFromGitlab",fn:()=>e.getCommitFromGitlab(o,i),context:{projectPath:o,gitCommitSha:i}});s&&(r={...r,gitCommitTimestamp:r.gitCommitTimestamp??s.committer.date,gitCommitAuthorName:r.gitCommitAuthorName??s.author.name,gitCommitMessage:r.gitCommitMessage??s.message});}catch(s){t.warn({err:s},"Failed to get commit from Gitlab");}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!r.mergedGitBranchName){let s=n.gitBranchName;try{let l=await ua({logger:t,operation:"getRemoteMetadataFromGitlab.getMergedBranchFromGitlab",fn:()=>e.getMergedBranchFromGitlab(o,s,i),context:{projectPath:o,branchName:s,gitCommitSha:i}});l.mergedBranch&&(r={...r,mergedGitBranchName:l.mergedBranch});}catch(l){t.warn({err:l},"Failed to get merged branch from Gitlab");}}return r}async function _Ce(t,e,o,n,r){let i=r,a=r.gitCommitSha;if(!a)return i;let s=r.gitMainBranch;if(s&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let l=await ua({logger:t,operation:"getRemoteMetadataFromGitHub.getMergeBaseCommitFromGithub",fn:()=>e.getMergeBaseCommitFromGithub(o,n,s,a),context:{owner:o,repo:n,mainBranch:s}});i={...i,lastCommitOnMainSha:l.sha,lastCommitOnMainTimestamp:l.committer.date};}catch(l){t.warn({err:l},"Failed to get merge base commit from GitHub");}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let l=await ua({logger:t,operation:"getRemoteMetadataFromGitHub.getCommitFromGithub",fn:()=>e.getCommitFromGithub(o,n,a),context:{owner:o,repo:n,gitCommitSha:a}});l&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??l.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??l.author.name,gitCommitMessage:i.gitCommitMessage??l.message});}catch(l){t.warn({err:l},"Failed to get commit from GitHub");}if(r.gitBranchName&&r.gitBranchName===r.gitMainBranch&&!i.mergedGitBranchName){let l=r.gitBranchName;try{let c=await ua({logger:t,operation:"getRemoteMetadataFromGitHub.getMergedBranchFromGithub",fn:()=>e.getMergedBranchFromGithub(o,n,l,a),context:{owner:o,repo:n,branchName:l,gitCommitSha:a}});c.mergedBranch&&(i={...i,mergedGitBranchName:c.mergedBranch});}catch(c){t.warn({err:c},"Failed to get merged branch from GitHub");}}return i}async function OCe(t,e,o){try{if(o.githubRepository){let{owner:n,repo:r}=mj(o.githubRepository);return await ua({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitHub",fn:()=>_Ce(t,e,n,r,o),context:{githubRepository:o.githubRepository}})}else if(o.gitlabProjectPath){let n=o.gitlabProjectPath;return await ua({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitlab",fn:()=>ICe(t,e,n,o),context:{gitlabProjectPath:n}})}}catch(n){t.warn({err:n},"Failed to get remote git metadata");}return o}async function DCe(t,e,o,n){let r={},i={gitMainBranch:o.config.gitMainBranch};return ua({logger:t,operation:"getGitMetadata.total",fn:async()=>{let[a,s]=await Promise.all([ua({logger:t,operation:"getGitMetadata.getConfiguredGitMetadata",fn:()=>PCe(o),context:{projectConfigPath:o.configFilePath}}),ua({logger:t,operation:"getGitMetadata.getEnvironmentGitMetadata",fn:async()=>{let u=await sy(t,o.config.gitMainBranch,n);return i.ciProvider=u.ciProvider,u},context:i})]),l={...a,...s};r.gitBranchName=l.gitBranchName,r.githubRepository=l.githubRepository,r.gitlabProjectPath=l.gitlabProjectPath,(!l.lastCommitOnMainSha||!l.lastCommitOnMainTimestamp)&&l.gitBranchName===a.gitMainBranch&&(l.lastCommitOnMainSha=l.gitCommitSha,l.lastCommitOnMainTimestamp=l.gitCommitTimestamp);let c=await ua({logger:t,operation:"getGitMetadata.getRemoteMetadataIfNeeded",fn:()=>OCe(t,e,l),context:{githubRepository:l.githubRepository,gitlabProjectPath:l.gitlabProjectPath,gitBranchName:l.gitBranchName}});return {...a,...s,...c}},context:r})}async function z4(t){try{let e=await U4(t).remote(["show","origin"]);return e?e.match(/HEAD branch: (.*)$/m)?.[1]?.trim():void 0}catch{return}}var $D=new Map;async function NCe(t,e,o){let n,r;try{[n,r]=await Promise.all([Qt(t,Zt.raw(["symbolic-ref","--short","-q","HEAD"]).then(s=>s.trim())),Qt(t,Zt.revparse(["--verify","HEAD"]).then(s=>s.trim()))]);}catch{return}if(!n||!r)return;let i=`${e.configFilePath}:${e.config.gitMainBranch}:${e.config.gitProtectedBranches?.join(",")}`,a=`${o?.includeHostingUsername}`;return `${n}:${r}:${i}:${a}`}async function Lo(t,e,o,n){let r=await NCe(t,o,n);if(r&&$D.has(r))return t.debug("Using cached git metadata"),$D.get(r);let i=await DCe(t,e,o,n);return r&&$D.set(r,i),i}function FCe(t,e){let o=`${Ti(e)}.module.yaml`,n=Oo__default.join(Oo__default.dirname(t),o);if(Bn__default.existsSync(n))throw new Error(`A conflicting file already exists at the following path: ${n}`);return Bn__default.renameSync(t,n),n}function ks({content:t,schemaVersion:e,momenticFiles:o,project:n,forceSaveOnNoDiffs:r,forceFileFormat:i}){let a=o.mobileModules[t.moduleId]?.fullFilePath,s=o.mobileModules[t.moduleId]?.name;if(!a||!Bn__default.existsSync(a))throw new Error(`Tried to update mobile module ${t.moduleId} that could not be found on disk`);let{parsed:l}=ca(a),c=n.config.fileFormat==="v2";i!==void 0&&(c=i==="v2");let u=!!t.name&&t.name!==s,d={...l,...t,schemaVersion:e},m=Es.parse(d),p=Na(t.platform).array().parse(t.steps),f=c?fw({metadata:{...m,moduleId:t.moduleId,name:t.name??s??""},steps:p,fileResolver:Ed({sourceFilePath:a,momenticFiles:{mobileModules:o.mobileModules}})}):Ln({fileType:Pe.MOBILE_MODULE,...m,steps:p}),h=diff(f,l);if(h&&Object.keys(h).length===0&&!r&&!u)return;Bn__default.writeFileSync(a,Ob.stringify(f),"utf-8");let g=u?FCe(a,t.name):void 0;xl(g??a,n.config);}function V4({moduleId:t,patch:e,momenticFiles:o,project:n,logger:r}){let i=o.mobileModules[t]?.fullFilePath;if(!i)throw new Error(`Tried to update mobile module ${t} that could not be found on disk`);let a=Fc(i,r),s=Bc({module:a,moduleFilePath:i,momenticFiles:o}),l=kI.parse({...s,...e}),c={moduleId:l.moduleId,platform:l.platform,name:e.name??s.name,description:l.description,enabled:l.enabled,parameters:l.parameters,steps:Na(l.platform).array().parse(l.steps)};ks({content:c,schemaVersion:l.schemaVersion,momenticFiles:o,project:n});}async function cy({name:t,description:e,enabled:o,platform:n,steps:r,folder:i,project:a,momenticFiles:s}){let l=Ti(t),c=Oo__default.join(i,`${l}.module.yaml`);gw({project:a,relativeFilePath:Oo__default.relative(a.rootDir,c)});let u=ef({projectConfig:a.config,momenticFiles:s,entityType:"mobile-module"}),{stepsToSave:{steps:d}}=await Gn({platform:n,stepLists:{steps:r}}),m={schemaVersion:VT,platform:n,moduleId:u,description:e,enabled:o},p=a.config.fileFormat==="v2"?fw({metadata:{...m,moduleId:u,name:t},steps:d,fileResolver:Ed({sourceFilePath:c,momenticFiles:{mobileModules:s.mobileModules}})}):FI.parse({fileType:Pe.MOBILE_MODULE,...m,steps:d});return Bn__default.mkdirSync(i,{recursive:true}),Bn__default.writeFileSync(c,Ob.stringify(p),"utf-8"),xl(c,a.config),{moduleId:u,platform:n,name:t,description:e||void 0,steps:r}}function Fc(t,e){let{parsed:o}=ca(t);if(ty(o))try{return iv.parse(o)}catch(n){throw e.error({err:n,moduleFilePath:t,existingModule:o},`${t} does not parse as a valid V2 Momentic mobile module`),n}try{return FI.parse(o)}catch(n){throw e.error({err:n,moduleFilePath:t,existingModule:o},`${t} does not parse as a valid Momentic mobile module`),n}}function Bc({module:t,moduleFilePath:e,momenticFiles:o}){let n=Oo__default.basename(e,".module.yaml");if(!ty(t))return {...t,name:n};let{module:r}=pw({moduleV2:t,moduleName:n,fileResolver:vd({sourceFilePath:e,momenticFiles:o})});return r}async function Rd(t,e,o,n){let r=Fc(t.fullFilePath,o),i=Bc({module:r,moduleFilePath:t.fullFilePath,momenticFiles:e}),a=i.platform==="ANDROID"?n?.android:n?.ios,{resolvedSteps:s}=await UC({platform:i.platform,rawSteps:i.steps,resolvedModuleCache:a||{},onFetchModule:async c=>{let u=e.mobileModules[c]?.fullFilePath;if(!u)throw new Error(`Could not find mobile module with id ${c}`);let d=Fc(u,o);return Bc({module:d,moduleFilePath:u,momenticFiles:e})},logger:o,metadata:{id:i.moduleId,schemaVersion:i.schemaVersion}}),l=i.platform==="ANDROID"?{...i,platform:"ANDROID",name:t.name,description:i.description||void 0,steps:s}:{...i,platform:"IOS",name:t.name,description:i.description||void 0,steps:s};return a&&(a[t.id]=cloneDeep(l)),l}async function j4(t,e){let o={},n={};return await Promise.all(Object.values(t.mobileModules).map(async r=>{await Rd(r,t,e,{ios:o,android:n});})),[...Object.values(o),...Object.values(n)]}var of=vE.array(),yw=w__default.discriminatedUnion("platform",[zE.extend({beforeSteps:of.optional(),steps:of,afterSteps:of.optional()}),$E.extend({beforeSteps:of.optional(),steps:of,afterSteps:of.optional()})]);function Sw({name:t,description:e="",settings:o,folder:n,platform:r,project:i,momenticFiles:a}){try{qi(t);}catch(p){throw new It(`${p} when validating the test entity name`)}let l=`${Ti(t)}.test.yaml`,c=Oo__default.join(n,l);if(Bn__default.existsSync(c))throw new ig({name:t,path:c});gw({project:i,relativeFilePath:Oo__default.relative(i.rootDir,c)});let u=ef({projectConfig:i.config,momenticFiles:a,entityType:"mobile-test"}),d={fileType:Pe.MOBILE_TEST,id:u,description:e,schemaVersion:Ro,platform:r,settings:o,steps:[]},m=i.config.fileFormat==="v2"?Zp({metadata:d,stepLists:{steps:[]},fileResolver:Ed({sourceFilePath:c,momenticFiles:{mobileModules:a.mobileModules}})}):NV.parse(d);return Bn__default.mkdirSync(n,{recursive:true}),Bn__default.writeFileSync(c,Ob.stringify(m),"utf-8"),{fullPath:c,testId:u}}function BCe(t){if(!Bn__default.existsSync(t))throw new Error(`Test file not found: ${t}`);let{parsed:e}=ca(t);if(ey(e))return e;if(!e.steps||!Array.isArray(e.steps))throw new Error(`Test ${t} is missing steps`);return e}async function Po(t,e,o){let n=BCe(t),r,i;if(ey(n)){let s;try{s=vc.parse(n);}catch(c){let u=c instanceof w__default.ZodError?w__default.prettifyError(c):J(c);throw new It(`Mobile test ${t} is missing metadata or has invalid metadata: ${u}`,{cause:c})}r=oy({testV2:s});let l=await mw({testV2:s,platform:r.platform,fileResolver:vd({sourceFilePath:t,momenticFiles:{mobileModules:o.mobileModules}})});i={steps:l.stepLists.steps,beforeSteps:l.stepLists.beforeSteps,afterSteps:l.stepLists.afterSteps};}else {try{r=yc.parse(n);}catch(s){let l=s instanceof w__default.ZodError?w__default.prettifyError(s):J(s);throw new It(`Mobile test ${t} is missing metadata or has invalid metadata: ${l}`,{cause:s})}i={steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps};}let a={rawStepLists:i,logger:e,testMetadata:r,onFetchModule:async s=>{let l=o.mobileModules[s]?.fullFilePath;if(!l)throw new Error(`Mobile module ${s} not found`);try{let c=Fc(l,e);return Bc({module:c,moduleFilePath:l,momenticFiles:o})}catch(c){throw c instanceof w__default.ZodError?new It(`Mobile module ${l} has invalid steps or metadata: ${w__default.prettifyError(c)}`,{cause:c}):c}}};switch(r.platform){case "ANDROID":{let{resolvedStepLists:s}=await mD({...a,platform:r.platform});return {...r,steps:s.steps,...s.beforeSteps?.length&&{beforeSteps:s.beforeSteps},...s.afterSteps?.length&&{afterSteps:s.afterSteps}}}case "IOS":{let{resolvedStepLists:s}=await mD({...a,platform:r.platform});return {...r,steps:s.steps,...s.beforeSteps?.length&&{beforeSteps:s.beforeSteps},...s.afterSteps?.length&&{afterSteps:s.afterSteps}}}}}async function Pl({platform:t,filePath:e,steps:o,beforeSteps:n,afterSteps:r,settings:i,labels:a,folder:s,project:l,momenticFiles:c,schemaVersion:u,forceFileFormat:d}){let m=Oo__default.isAbsolute(e)?e:Oo__default.join(s,e);if(!Bn__default.existsSync(m))throw new Error(`Test file not found: ${m}`);let{parsed:p}=ca(m),f=ey(p),h,g;if(f?(g=vc.parse(p),h={...oy({testV2:g}),schemaVersion:u,fileType:Pe.MOBILE_TEST,steps:[]}):h=yw.parse({...p,schemaVersion:u}),h.fileType!==Pe.MOBILE_TEST)throw new Error(`File at '${m}' is not a mobile test (fileType=${h.fileType}).`);if(h.platform!==t)throw new Error(`Platform mismatch. Test at '${m}' is for platform ${h.platform}, but update is for platform ${t}.`);let b=o||n||r,y=b?await Gn({platform:t,stepLists:{steps:o??[],beforeSteps:n,afterSteps:r}}):void 0,T=y?.moduleUpdates??[],v;f&&g&&!b&&(v={steps:g.steps??[],before:g.before,after:g.after});let E=l.config.fileFormat==="v2"||f;d!==void 0&&(E=d==="v2");for(let I of T)ks({content:I,schemaVersion:Ro,momenticFiles:c,project:l,forceFileFormat:d});if(E){let I={...h};a!==void 0&&(I.labels=a),i!==void 0&&(I.settings=i);let A={...I,steps:[]},k;if(b&&y){let _;y.stepsToSave.beforeSteps&&y.stepsToSave.beforeSteps.length>0&&(_=y.stepsToSave.beforeSteps);let H;y.stepsToSave.afterSteps&&y.stepsToSave.afterSteps.length>0&&(H=y.stepsToSave.afterSteps),k={steps:y.stepsToSave.steps,beforeSteps:_,afterSteps:H};let V=Ed({sourceFilePath:m,momenticFiles:{mobileModules:c.mobileModules}}),j=Zp({metadata:A,stepLists:k,fileResolver:V});Bn__default.writeFileSync(m,Ob.stringify(j),"utf-8");}else {let _=Zp({metadata:A,stepLists:{steps:[]},fileResolver:Ed({sourceFilePath:m,momenticFiles:{mobileModules:c.mobileModules}})}),H=W4({formatted:_,stepLists:v??{steps:[]}});Bn__default.writeFileSync(m,H,"utf-8");}xl(m,l.config);return}let P={...h,steps:h.steps};if(o&&(P.steps=y?.stepsToSave.steps??[]),a!==void 0&&(P.labels=a),n){let I=y?.stepsToSave.beforeSteps;I&&I.length>0?P.beforeSteps=I:delete P.beforeSteps;}else h.beforeSteps&&h.beforeSteps.length>0&&(P.beforeSteps=h.beforeSteps);if(r){let I=y?.stepsToSave.afterSteps;I&&I.length>0?P.afterSteps=I:delete P.afterSteps;}else h.afterSteps&&h.afterSteps.length>0&&(P.afterSteps=h.afterSteps);i&&(P.settings=i);let M=Ob.stringify(yw.parse(P));Bn__default.writeFileSync(m,M,"utf-8"),xl(m,l.config);}function H4(t,e,o){let n=Oo__default.join(o.rootDir,t);if(!Bn__default.existsSync(n))throw new Ye(`Test not found at path '${t}' in project '${o.rootDir}'`);let{parsed:r}=ca(n),i=ey(r),a=Oo__default.basename(t,".test.yaml"),s,l;if(e.name&&e.name!==a){let u=`${Ti(e.name)}.test.yaml`;if(s=Oo__default.join(Oo__default.dirname(t),u),l=Oo__default.join(o.rootDir,s),Bn__default.existsSync(l))throw new ig({name:e.name,path:l})}let c=i?UCe({existingTestRaw:r,updates:e}):zCe({existingTestRaw:r,updates:e});return Bn__default.writeFileSync(n,c,"utf-8"),l&&l!==n?(Bn__default.renameSync(n,l),xl(l,o.config)):xl(n,o.config),{newRelativeTestPath:s}}function UCe({existingTestRaw:t,updates:e}){let o=vc.parse(t),n=oy({testV2:o}),r={...n,description:e.description??n.description,disabled:e.disabled??n.disabled,labels:e.labels??n.labels,settings:e.settings??n.settings,fileType:Pe.MOBILE_TEST,steps:[]};return W4({formatted:Zp({metadata:r,stepLists:{steps:[]}}),stepLists:{before:o.before,steps:o.steps??[],after:o.after}})}function W4({formatted:t,stepLists:e}){let{steps:o,...n}=t,r=e.before;r&&r.length===0&&(r=void 0);let i=e.after;i&&i.length===0&&(i=void 0);let a=Ln({...n,before:r,steps:e.steps,after:i});return Ob.stringify(a)}function zCe({existingTestRaw:t,updates:e}){let n={...yw.parse(t),...e};if(n.fileType!==Pe.MOBILE_TEST)throw new Error(`Existing legacy mobile test has unexpected fileType=${n.fileType}.`);return Ob.stringify(yw.parse(n))}var G4=new Set([".DS_Store","__MACOSX"]),q4={status:(t,e)=>{if(t.status===e.status)return t.status;if(t.status==="FAILED"||e.status==="FAILED")return "FAILED";if(t.status==="CANCELLED"||e.status==="CANCELLED")return "CANCELLED";if(t.status==="RETRYING"||e.status==="RETRYING")return "RETRYING";if(t.status==="RUNNING"||e.status==="RUNNING")return "RUNNING";if(t.status==="PENDING"||e.status==="PENDING")return "PENDING";throw new Error(`Invalid run status merge: ${t.status} and ${e.status}`)},startedAt:(t,e)=>t.startedAt<e.startedAt?t.startedAt:e.startedAt,updatedAt:(t,e)=>t.updatedAt>e.updatedAt?t.updatedAt:e.updatedAt,finishedAt:(t,e)=>!t.finishedAt||!e.finishedAt?new Date:t.finishedAt>e.finishedAt?t.finishedAt:e.finishedAt,gitCommitTimestamp:(t,e)=>{if(!(!t&&!e)){if(!t.gitCommitTimestamp||!e.gitCommitTimestamp||t.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${t.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return t.gitCommitTimestamp}},pipelineId:(t,e)=>t.pipelineId===e.pipelineId?t.pipelineId:!t.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&t.pipelineId?t.pipelineId:t.startedAt<e.startedAt?e.pipelineId:t.pipelineId,labels:(t,e)=>{let o=new Set([...t.labels??[],...e.labels??[]]);return Array.from(o)},ai:(t,e)=>t.ai??e.ai,browser:(t,e)=>t.browser??e.browser,aiSelect:(t,e)=>{let o=[...t.aiSelect??[],...e.aiSelect??[]];return o.length>0?o:void 0},healRiskSummary:()=>{}};function VCe(t,e,o){if(q4[o]){let i=q4[o];return i(t,e)}let n=t[o],r=e[o];if(n===void 0)return r;if(r===void 0)return n;if(n!==r)throw new Error(`Metadata values for key "${o}" do not match: "${n}" vs "${r}"`);return n}var VD=class extends Error{constructor(e,o){let n=`${e} contains invalid Momentic results: ${o}. 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 K4(t,e){try{let o=Oo__default.join(e,pn);return fp.parse(JSON.parse(Bn__default.readFileSync(o,"utf-8")))}catch{throw new VD(t,e)}}function Y4(t,e,o){let n=randomUUID(),r=t.child({runGroupId:n});Bn__default.rmSync(e,{recursive:true,force:true});let i=Bn__default.readdirSync(o).filter(l=>!G4.has(l)).map(l=>Oo__default.join(o,l));if(i.length===0)throw new Error(`No run groups found in results path: ${o}`);Bn__default.mkdirSync(e,{recursive:true});let a={...K4(o,i[0]),id:n,healRiskSummary:void 0,aiSelect:void 0};for(let l of i){let c=Oo__default.join(l,tr);if(!Bn__default.existsSync(c))continue;let u=K4(o,l);r.info({oldRunGroupId:u.id},"Merging run groups");for(let m in u){if(m==="id")continue;let p=m;a[p]=VCe(a,u,p);}let d=Bn__default.readdirSync(c);for(let m of d){if(G4.has(m))continue;let p=Oo__default.join(c,m),f=Oo__default.join(e,tr,m);Bn__default.cpSync(p,f,{recursive:true});}}let s=Oo__default.join(e,pn);Bn__default.writeFileSync(s,JSON.stringify(a,null,2));}var oe="v1",jD="mobile-cli",Md="1.4.5";var jCe=9e4,HCe=3,WCe=1500,GCe=15e3,Ho=class extends Error{status;rawError;constructor(e,o,n,r={}){super(n,r),this.status=e,this.rawError=o;}},HD=class extends Ye{constructor(e,o={}){super(e,o),this.name="PlanLimitExceededError";}};async function qCe(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var WD=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger;}getHeaders(){let e={"Content-Type":"application/json"};return (e[av]=Md),(e[iW]=jD),e}async sendRequest(e,o){let{retries:n=HCe,requestTimeoutMs:r=jCe,initialRetryDelayMs:i=WCe,maxRetryDelayMs:a=GCe,onFailedRequest:s}=o,l=n,c=n,u,d={path:e,baseUrl:this.baseUrl,method:o.method};for(;l>0;)try{return l--,await this.sendSingleRequestHelper(e,o,r)}catch(m){u=m;try{s?.(u);}catch{}if(m instanceof Ho&&m.status>=400&&m.status<500)throw m.status===402?new HD(m.rawError,{cause:m}):m;if(m instanceof Error&&m.name==="AbortError"&&(u=new Fa),l===0)throw u;let p=c-l,f=Math.min(i*Math.pow(2,p-1),a);await new Promise(h=>setTimeout(h,f));}throw this.logger.warn({...d,err:u},"Got fatal error response from Momentic server"),u}async sendSingleRequestHelper(e,o,n){let r={path:e,baseUrl:this.baseUrl,method:o.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();o.signal&&o.signal.addEventListener("abort",s,{once:true});let l=Date.now(),c={...this.getHeaders(),...o.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:o.method,body:o.body?JSON.stringify(o.body):void 0,headers:c,signal:i.signal});if(!u.ok){let p=await qCe(u);throw new Ho(u.status,p,`Request to ${o.method} ${e} failed with status ${u.status}: ${p}`)}let d;if(u.status===204)d={};else if(o.responseType==="buffer"){let p=await u.arrayBuffer();d=Buffer.from(p);}else {let p=await u.text();try{d=JSON.parse(p);}catch{d=p;}}this.logger&&o.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-l,...r},"Got response from Momentic server");let m=o.responseHeadersObject;return m&&u.headers.forEach((p,f)=>{m[f.toLowerCase()]=p;}),d}finally{clearTimeout(a),o.signal&&o.signal.removeEventListener("abort",s);}}},Fs=class extends WD{apiKey;mode;runner;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode,this.runner=e.runner;}getHeaders(){return {...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[rW]:this.mode,[sv]:this.runner}}};var w5="vercel.ai.error",KCe=Symbol.for(w5),X4,J4,wt=class A5 extends(J4=Error,X4=KCe,J4){constructor({name:e,message:o,cause:n}){super(o),this[X4]=true,this.name=e,this.cause=n;}static isInstance(e){return A5.hasMarker(e,w5)}static hasMarker(e,o){let n=Symbol.for(o);return e!=null&&typeof e=="object"&&n in e&&typeof e[n]=="boolean"&&e[n]===true}},R5="AI_APICallError",x5=`vercel.ai.error.${R5}`,YCe=Symbol.for(x5),Z4,Q4,Jo=class extends(Q4=wt,Z4=YCe,Q4){constructor({message:t,url:e,requestBodyValues:o,statusCode:n,responseHeaders:r,responseBody:i,cause:a,isRetryable:s=n!=null&&(n===408||n===409||n===429||n>=500),data:l}){super({name:R5,message:t,cause:a}),this[Z4]=true,this.url=e,this.requestBodyValues=o,this.statusCode=n,this.responseHeaders=r,this.responseBody=i,this.isRetryable=s,this.data=l;}static isInstance(t){return wt.hasMarker(t,x5)}},M5="AI_EmptyResponseBodyError",P5=`vercel.ai.error.${M5}`,XCe=Symbol.for(P5),e5,t5,I5=class extends(t5=wt,e5=XCe,t5){constructor({message:t="Empty response body"}={}){super({name:M5,message:t}),this[e5]=true;}static isInstance(t){return wt.hasMarker(t,P5)}};function _5(t){return t==null?"unknown error":typeof t=="string"?t:t instanceof Error?t.message:JSON.stringify(t)}var O5="AI_InvalidArgumentError",D5=`vercel.ai.error.${O5}`,JCe=Symbol.for(D5),o5,n5,Tw=class extends(n5=wt,o5=JCe,n5){constructor({message:t,cause:e,argument:o}){super({name:O5,message:t,cause:e}),this[o5]=true,this.argument=o;}static isInstance(t){return wt.hasMarker(t,D5)}},N5="AI_InvalidPromptError",L5=`vercel.ai.error.${N5}`,ZCe=Symbol.for(L5),r5,i5,k5=class extends(i5=wt,r5=ZCe,i5){constructor({prompt:t,message:e,cause:o}){super({name:N5,message:`Invalid prompt: ${e}`,cause:o}),this[r5]=true,this.prompt=t;}static isInstance(t){return wt.hasMarker(t,L5)}},F5="AI_InvalidResponseDataError",B5=`vercel.ai.error.${F5}`,QCe=Symbol.for(B5),a5,s5,Ew=class extends(s5=wt,a5=QCe,s5){constructor({data:t,message:e=`Invalid response data: ${JSON.stringify(t)}.`}){super({name:F5,message:e}),this[a5]=true,this.data=t;}static isInstance(t){return wt.hasMarker(t,B5)}},U5="AI_JSONParseError",z5=`vercel.ai.error.${U5}`,ewe=Symbol.for(z5),l5,c5,dy=class extends(c5=wt,l5=ewe,c5){constructor({text:t,cause:e}){super({name:U5,message:`JSON parsing failed: Text: ${t}.
224
+ `)){let r=n.indexOf("=");if(r===-1)continue;let i=n.slice(0,r),a=n.slice(r+1).trim();o[i]=a;}return o}async function gCe(t,e,o){try{let r=o["github.user"]||void 0;if(r)return r}catch{}let n;try{if(e?.startsWith("http://")||e?.startsWith("https://"))n=new URL(e).host;else if(e?.startsWith("git@")){let r=e.indexOf("@"),i=e.indexOf(":",r+1);r!==-1&&i!==-1&&(n=e.slice(r+1,i));}}catch{}if(n=n?.toLowerCase(),!!n&&e?.startsWith("git@")&&n.includes("github"))try{let{stdout:r,stderr:i}=await fCe("ssh",["-T","-o","BatchMode=yes",`git@${n}`],{timeout:5e3}),s=`${r??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}catch{return}}async function bCe(t,e,o){let n=e?.includes("github.com"),r=e?.includes("gitlab.com");try{if(n)return gCe(t,e,o);if(r)return}catch{}}function ay(t){if(t.startsWith("git@")){let e=t.split(":");if(e.length===2){let o=e[1].replace(".git","").split("/");if(o.length===2){let n=o[0],r=o[1];return `${n}/${r}`}}}else if(t.startsWith("http")||t.startsWith("https")){let o=new URL(t).pathname.split("/").filter(Boolean);if(o.length>=2){let n=o[0],r=o[1].replace(".git","");return `${n}/${r}`}}}function yCe(t){if(!(t instanceof Error))return false;let e=t.message;return e.includes("not a git repository")||e.includes("ENOENT")||e.includes("detected dubious ownership")}async function Qt(t,e){try{return (await e).trim()}catch(o){if(yCe(o))return;t.error({err:o},"Failed to run git command");return}}function SCe(){if(process.env.GITHUB_ACTION)return "GithubActions";if(process.env.GITLAB_CI)return "GitlabCI";if(process.env.CIRCLECI)return "CircleCI";if(process.env.BUILDKITE)return "Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return "AzureDevOps";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return "GCPCloudBuild";if(process.env.BITRISE_BUILD_SLUG)return "Bitrise";if(process.env.MOMENTIC_GIT_OVERRIDE)return "Custom"}async function TCe(t){let[e,o,n]=await Promise.all([Qt(t,Zt.show(["--no-patch","--format=%ci"])),Qt(t,Zt.show(["-s","--pretty=%B"])),Qt(t,Zt.show(["-s","--pretty=%an"]))]),r=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?Ls(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:r,gitCommitMessage:o,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function ECe(t){let[e,o,n]=await Promise.all([Qt(t,Zt.listRemote(["--get-url","origin"])),Qt(t,Zt.show(["-s","--pretty=%B"])),Qt(t,Zt.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?Ls(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:o,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function vCe(t){let[e,o,n,r]=await Promise.all([Qt(t,Zt.show(["--no-patch","--format=%ci"])),Qt(t,Zt.listRemote(["--get-url","origin"])),Qt(t,Zt.show(["-s","--pretty=%B"])),Qt(t,Zt.show(["-s","--pretty=%an"]))]),a=process.env.CIRCLE_REPOSITORY_URL?.trim()||void 0||o||void 0,s=a?.includes("github.com")??false,l=a?.includes("gitlab.com")??false,c=a?ay(a):void 0;return {ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?Ls(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:a,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:s?c:void 0,gitlabProjectPath:l?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function CCe(t){let[e,o,n]=await Promise.all([Qt(t,Zt.show(["--no-patch","--format=%ci"])),Qt(t,Zt.show(["-s","--pretty=%B"])),Qt(t,Zt.show(["-s","--pretty=%an"]))]),r=process.env.BUILDKITE_REPO,i=r?.includes("github.com"),a=r?.includes("gitlab.com"),s=r?ay(r):void 0;return {ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?Ls(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:r,gitCommitMessage:o,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 wCe(t){let[e,o,n]=await Promise.all([Qt(t,Zt.show(["--no-patch","--format=%ci"])),Qt(t,Zt.show(["-s","--pretty=%B"])),Qt(t,Zt.show(["-s","--pretty=%an"]))]),r=process.env["Build.Repository.Uri"],i=r?.includes("github.com"),a=r?.includes("gitlab.com"),s=r?ay(r):void 0;return {ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?Ls(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:r,gitCommitMessage:o,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function ACe(t,e,o){let[n,r,i,a,s,l,c,u,d]=await Promise.all([Qt(t,Zt.revparse(["HEAD"])),Qt(t,Zt.revparse(["--short","HEAD"])),Qt(t,Zt.revparse(["--abbrev-ref","HEAD"])),Qt(t,Zt.listRemote(["--get-url","origin"])),Qt(t,Zt.show(["--no-patch","--format=%ci"])),Qt(t,Zt.show(["-s","--pretty=%B"])),Qt(t,Zt.show(["-s","--pretty=%an"])),e?Qt(t,Zt.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),hCe(t)]),m=u||(e?await Qt(t,Zt.raw(["merge-base",e,"HEAD"])):void 0),p=m?await Qt(t,Zt.show(["--no-patch","--format=%ci",m])):void 0,f=a?.includes("github.com"),h=a?.includes("gitlab.com"),g=a?ay(a):void 0,b=d["user.email"]||void 0,y=d["user.name"]||void 0,T=d["user.username"]||void 0,v=d["github.user"]||void 0,M=(o?.includeHostingUsername??true?await bCe(t,a,d):void 0)??T??v??void 0;return {ciProvider:"none",gitCommitSha:n,gitCommitShaShort:r,gitBranchName:i,gitOriginUrl:a,gitCommitTimestamp:s?Ls(s):void 0,gitCommitMessage:l,gitCommitAuthorName:c,gitLocalUsername:M,gitLocalEmail:b,gitLocalName:y,lastCommitOnMainSha:m,lastCommitOnMainTimestamp:p?Ls(p):void 0,githubRepository:f?g:void 0,gitlabProjectPath:h?g:void 0,pipelineId:void 0}}async function RCe(t){let[e,o]=await Promise.all([Qt(t,Zt.show(["--no-patch","--format=%ci"])),Qt(t,Zt.show(["-s","--pretty=%an"]))]),n=process.env.GIT_REPOSITORY_URL,r=n?.includes("github.com"),i=n?.includes("gitlab.com"),a=n?ay(n):void 0;return {ciProvider:"Bitrise",gitCommitSha:process.env.BITRISE_GIT_COMMIT,gitCommitShaShort:process.env.BITRISE_GIT_COMMIT?.slice(0,6),gitCommitTimestamp:e?Ls(e):void 0,gitBranchName:process.env.BITRISE_GIT_BRANCH,gitOriginUrl:n,gitCommitMessage:process.env.BITRISE_GIT_MESSAGE,gitCommitAuthorName:o,githubRepository:r?a:void 0,gitlabProjectPath:i?a:void 0,pipelineId:`${process.env.BITRISE_APP_SLUG}:${process.env.BITRISE_BUILD_SLUG}`}}async function xCe(){let t=process.env._HEAD_REPO_URL;return {ciProvider:"GCPCloudBuild",gitCommitSha:process.env.COMMIT_SHA,gitCommitShaShort:process.env.COMMIT_SHA?.slice(0,6),gitBranchName:process.env.BRANCH_NAME,gitOriginUrl:t?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:t?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}function MCe(){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:Ls(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:Ls(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 PCe(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function sy(t,e,o){let n=SCe();if(!n)return ACe(t,e,o);switch(n){case "GithubActions":return TCe(t);case "GitlabCI":return ECe(t);case "CircleCI":return vCe(t);case "Buildkite":return CCe(t);case "AzureDevOps":return wCe(t);case "GCPCloudBuild":return xCe();case "Bitrise":return RCe(t);case "Custom":return MCe()}}async function ICe(t,e,o,n){let r=n,i=n.gitCommitSha;if(!i)return r;let a=n.gitMainBranch;if(a&&(!r.lastCommitOnMainSha||!r.lastCommitOnMainTimestamp))try{let s=await ua({logger:t,operation:"getRemoteMetadataFromGitlab.getMergeBaseCommitFromGitlab",fn:()=>e.getMergeBaseCommitFromGitlab(o,a,i),context:{projectPath:o,mainBranch:a}});r={...r,lastCommitOnMainSha:s.sha,lastCommitOnMainTimestamp:s.committer.date};}catch(s){t.warn({err:s},"Failed to get merge base commit from Gitlab");}if(!r.gitCommitTimestamp||!r.gitCommitAuthorName||!r.gitCommitMessage||!r.gitCommitAuthorName)try{let s=await ua({logger:t,operation:"getRemoteMetadataFromGitlab.getCommitFromGitlab",fn:()=>e.getCommitFromGitlab(o,i),context:{projectPath:o,gitCommitSha:i}});s&&(r={...r,gitCommitTimestamp:r.gitCommitTimestamp??s.committer.date,gitCommitAuthorName:r.gitCommitAuthorName??s.author.name,gitCommitMessage:r.gitCommitMessage??s.message});}catch(s){t.warn({err:s},"Failed to get commit from Gitlab");}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!r.mergedGitBranchName){let s=n.gitBranchName;try{let l=await ua({logger:t,operation:"getRemoteMetadataFromGitlab.getMergedBranchFromGitlab",fn:()=>e.getMergedBranchFromGitlab(o,s,i),context:{projectPath:o,branchName:s,gitCommitSha:i}});l.mergedBranch&&(r={...r,mergedGitBranchName:l.mergedBranch});}catch(l){t.warn({err:l},"Failed to get merged branch from Gitlab");}}return r}async function _Ce(t,e,o,n,r){let i=r,a=r.gitCommitSha;if(!a)return i;let s=r.gitMainBranch;if(s&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let l=await ua({logger:t,operation:"getRemoteMetadataFromGitHub.getMergeBaseCommitFromGithub",fn:()=>e.getMergeBaseCommitFromGithub(o,n,s,a),context:{owner:o,repo:n,mainBranch:s}});i={...i,lastCommitOnMainSha:l.sha,lastCommitOnMainTimestamp:l.committer.date};}catch(l){t.warn({err:l},"Failed to get merge base commit from GitHub");}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let l=await ua({logger:t,operation:"getRemoteMetadataFromGitHub.getCommitFromGithub",fn:()=>e.getCommitFromGithub(o,n,a),context:{owner:o,repo:n,gitCommitSha:a}});l&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??l.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??l.author.name,gitCommitMessage:i.gitCommitMessage??l.message});}catch(l){t.warn({err:l},"Failed to get commit from GitHub");}if(r.gitBranchName&&r.gitBranchName===r.gitMainBranch&&!i.mergedGitBranchName){let l=r.gitBranchName;try{let c=await ua({logger:t,operation:"getRemoteMetadataFromGitHub.getMergedBranchFromGithub",fn:()=>e.getMergedBranchFromGithub(o,n,l,a),context:{owner:o,repo:n,branchName:l,gitCommitSha:a}});c.mergedBranch&&(i={...i,mergedGitBranchName:c.mergedBranch});}catch(c){t.warn({err:c},"Failed to get merged branch from GitHub");}}return i}async function OCe(t,e,o){try{if(o.githubRepository){let{owner:n,repo:r}=mj(o.githubRepository);return await ua({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitHub",fn:()=>_Ce(t,e,n,r,o),context:{githubRepository:o.githubRepository}})}else if(o.gitlabProjectPath){let n=o.gitlabProjectPath;return await ua({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitlab",fn:()=>ICe(t,e,n,o),context:{gitlabProjectPath:n}})}}catch(n){t.warn({err:n},"Failed to get remote git metadata");}return o}async function DCe(t,e,o,n){let r={},i={gitMainBranch:o.config.gitMainBranch};return ua({logger:t,operation:"getGitMetadata.total",fn:async()=>{let[a,s]=await Promise.all([ua({logger:t,operation:"getGitMetadata.getConfiguredGitMetadata",fn:()=>PCe(o),context:{projectConfigPath:o.configFilePath}}),ua({logger:t,operation:"getGitMetadata.getEnvironmentGitMetadata",fn:async()=>{let u=await sy(t,o.config.gitMainBranch,n);return i.ciProvider=u.ciProvider,u},context:i})]),l={...a,...s};r.gitBranchName=l.gitBranchName,r.githubRepository=l.githubRepository,r.gitlabProjectPath=l.gitlabProjectPath,(!l.lastCommitOnMainSha||!l.lastCommitOnMainTimestamp)&&l.gitBranchName===a.gitMainBranch&&(l.lastCommitOnMainSha=l.gitCommitSha,l.lastCommitOnMainTimestamp=l.gitCommitTimestamp);let c=await ua({logger:t,operation:"getGitMetadata.getRemoteMetadataIfNeeded",fn:()=>OCe(t,e,l),context:{githubRepository:l.githubRepository,gitlabProjectPath:l.gitlabProjectPath,gitBranchName:l.gitBranchName}});return {...a,...s,...c}},context:r})}async function z4(t){try{let e=await U4(t).remote(["show","origin"]);return e?e.match(/HEAD branch: (.*)$/m)?.[1]?.trim():void 0}catch{return}}var $D=new Map;async function NCe(t,e,o){let n,r;try{[n,r]=await Promise.all([Qt(t,Zt.raw(["symbolic-ref","--short","-q","HEAD"]).then(s=>s.trim())),Qt(t,Zt.revparse(["--verify","HEAD"]).then(s=>s.trim()))]);}catch{return}if(!n||!r)return;let i=`${e.configFilePath}:${e.config.gitMainBranch}:${e.config.gitProtectedBranches?.join(",")}`,a=`${o?.includeHostingUsername}`;return `${n}:${r}:${i}:${a}`}async function Lo(t,e,o,n){let r=await NCe(t,o,n);if(r&&$D.has(r))return t.debug("Using cached git metadata"),$D.get(r);let i=await DCe(t,e,o,n);return r&&$D.set(r,i),i}function FCe(t,e){let o=`${Ti(e)}.module.yaml`,n=Oo__default.join(Oo__default.dirname(t),o);if(Bn__default.existsSync(n))throw new Error(`A conflicting file already exists at the following path: ${n}`);return Bn__default.renameSync(t,n),n}function ks({content:t,schemaVersion:e,momenticFiles:o,project:n,forceSaveOnNoDiffs:r,forceFileFormat:i}){let a=o.mobileModules[t.moduleId]?.fullFilePath,s=o.mobileModules[t.moduleId]?.name;if(!a||!Bn__default.existsSync(a))throw new Error(`Tried to update mobile module ${t.moduleId} that could not be found on disk`);let{parsed:l}=ca(a),c=n.config.fileFormat==="v2";i!==void 0&&(c=i==="v2");let u=!!t.name&&t.name!==s,d={...l,...t,schemaVersion:e},m=Es.parse(d),p=Na(t.platform).array().parse(t.steps),f=c?fw({metadata:{...m,moduleId:t.moduleId,name:t.name??s??""},steps:p,fileResolver:Ed({sourceFilePath:a,momenticFiles:{mobileModules:o.mobileModules}})}):Ln({fileType:Pe.MOBILE_MODULE,...m,steps:p}),h=diff(f,l);if(h&&Object.keys(h).length===0&&!r&&!u)return;Bn__default.writeFileSync(a,Ob.stringify(f),"utf-8");let g=u?FCe(a,t.name):void 0;xl(g??a,n.config);}function V4({moduleId:t,patch:e,momenticFiles:o,project:n,logger:r}){let i=o.mobileModules[t]?.fullFilePath;if(!i)throw new Error(`Tried to update mobile module ${t} that could not be found on disk`);let a=Fc(i,r),s=Bc({module:a,moduleFilePath:i,momenticFiles:o}),l=kI.parse({...s,...e}),c={moduleId:l.moduleId,platform:l.platform,name:e.name??s.name,description:l.description,enabled:l.enabled,parameters:l.parameters,steps:Na(l.platform).array().parse(l.steps)};ks({content:c,schemaVersion:l.schemaVersion,momenticFiles:o,project:n});}async function cy({name:t,description:e,enabled:o,platform:n,steps:r,folder:i,project:a,momenticFiles:s}){let l=Ti(t),c=Oo__default.join(i,`${l}.module.yaml`);gw({project:a,relativeFilePath:Oo__default.relative(a.rootDir,c)});let u=ef({projectConfig:a.config,momenticFiles:s,entityType:"mobile-module"}),{stepsToSave:{steps:d}}=await Gn({platform:n,stepLists:{steps:r}}),m={schemaVersion:VT,platform:n,moduleId:u,description:e,enabled:o},p=a.config.fileFormat==="v2"?fw({metadata:{...m,moduleId:u,name:t},steps:d,fileResolver:Ed({sourceFilePath:c,momenticFiles:{mobileModules:s.mobileModules}})}):FI.parse({fileType:Pe.MOBILE_MODULE,...m,steps:d});return Bn__default.mkdirSync(i,{recursive:true}),Bn__default.writeFileSync(c,Ob.stringify(p),"utf-8"),xl(c,a.config),{moduleId:u,platform:n,name:t,description:e||void 0,steps:r}}function Fc(t,e){let{parsed:o}=ca(t);if(ty(o))try{return iv.parse(o)}catch(n){throw e.error({err:n,moduleFilePath:t,existingModule:o},`${t} does not parse as a valid V2 Momentic mobile module`),n}try{return FI.parse(o)}catch(n){throw e.error({err:n,moduleFilePath:t,existingModule:o},`${t} does not parse as a valid Momentic mobile module`),n}}function Bc({module:t,moduleFilePath:e,momenticFiles:o}){let n=Oo__default.basename(e,".module.yaml");if(!ty(t))return {...t,name:n};let{module:r}=pw({moduleV2:t,moduleName:n,fileResolver:vd({sourceFilePath:e,momenticFiles:o})});return r}async function Rd(t,e,o,n){let r=Fc(t.fullFilePath,o),i=Bc({module:r,moduleFilePath:t.fullFilePath,momenticFiles:e}),a=i.platform==="ANDROID"?n?.android:n?.ios,{resolvedSteps:s}=await UC({platform:i.platform,rawSteps:i.steps,resolvedModuleCache:a||{},onFetchModule:async c=>{let u=e.mobileModules[c]?.fullFilePath;if(!u)throw new Error(`Could not find mobile module with id ${c}`);let d=Fc(u,o);return Bc({module:d,moduleFilePath:u,momenticFiles:e})},logger:o,metadata:{id:i.moduleId,schemaVersion:i.schemaVersion}}),l=i.platform==="ANDROID"?{...i,platform:"ANDROID",name:t.name,description:i.description||void 0,steps:s}:{...i,platform:"IOS",name:t.name,description:i.description||void 0,steps:s};return a&&(a[t.id]=cloneDeep(l)),l}async function j4(t,e){let o={},n={};return await Promise.all(Object.values(t.mobileModules).map(async r=>{await Rd(r,t,e,{ios:o,android:n});})),[...Object.values(o),...Object.values(n)]}var of=vE.array(),yw=w__default.discriminatedUnion("platform",[zE.extend({beforeSteps:of.optional(),steps:of,afterSteps:of.optional()}),$E.extend({beforeSteps:of.optional(),steps:of,afterSteps:of.optional()})]);function Sw({name:t,description:e="",settings:o,folder:n,platform:r,project:i,momenticFiles:a}){try{qi(t);}catch(p){throw new It(`${p} when validating the test entity name`)}let l=`${Ti(t)}.test.yaml`,c=Oo__default.join(n,l);if(Bn__default.existsSync(c))throw new ig({name:t,path:c});gw({project:i,relativeFilePath:Oo__default.relative(i.rootDir,c)});let u=ef({projectConfig:i.config,momenticFiles:a,entityType:"mobile-test"}),d={fileType:Pe.MOBILE_TEST,id:u,description:e,schemaVersion:Ro,platform:r,settings:o,steps:[]},m=i.config.fileFormat==="v2"?Zp({metadata:d,stepLists:{steps:[]},fileResolver:Ed({sourceFilePath:c,momenticFiles:{mobileModules:a.mobileModules}})}):NV.parse(d);return Bn__default.mkdirSync(n,{recursive:true}),Bn__default.writeFileSync(c,Ob.stringify(m),"utf-8"),{fullPath:c,testId:u}}function BCe(t){if(!Bn__default.existsSync(t))throw new Error(`Test file not found: ${t}`);let{parsed:e}=ca(t);if(ey(e))return e;if(!e.steps||!Array.isArray(e.steps))throw new Error(`Test ${t} is missing steps`);return e}async function Po(t,e,o){let n=BCe(t),r,i;if(ey(n)){let s;try{s=vc.parse(n);}catch(c){let u=c instanceof w__default.ZodError?w__default.prettifyError(c):J(c);throw new It(`Mobile test ${t} is missing metadata or has invalid metadata: ${u}`,{cause:c})}r=oy({testV2:s});let l=await mw({testV2:s,platform:r.platform,fileResolver:vd({sourceFilePath:t,momenticFiles:{mobileModules:o.mobileModules}})});i={steps:l.stepLists.steps,beforeSteps:l.stepLists.beforeSteps,afterSteps:l.stepLists.afterSteps};}else {try{r=yc.parse(n);}catch(s){let l=s instanceof w__default.ZodError?w__default.prettifyError(s):J(s);throw new It(`Mobile test ${t} is missing metadata or has invalid metadata: ${l}`,{cause:s})}i={steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps};}let a={rawStepLists:i,logger:e,testMetadata:r,onFetchModule:async s=>{let l=o.mobileModules[s]?.fullFilePath;if(!l)throw new Error(`Mobile module ${s} not found`);try{let c=Fc(l,e);return Bc({module:c,moduleFilePath:l,momenticFiles:o})}catch(c){throw c instanceof w__default.ZodError?new It(`Mobile module ${l} has invalid steps or metadata: ${w__default.prettifyError(c)}`,{cause:c}):c}}};switch(r.platform){case "ANDROID":{let{resolvedStepLists:s}=await mD({...a,platform:r.platform});return {...r,steps:s.steps,...s.beforeSteps?.length&&{beforeSteps:s.beforeSteps},...s.afterSteps?.length&&{afterSteps:s.afterSteps}}}case "IOS":{let{resolvedStepLists:s}=await mD({...a,platform:r.platform});return {...r,steps:s.steps,...s.beforeSteps?.length&&{beforeSteps:s.beforeSteps},...s.afterSteps?.length&&{afterSteps:s.afterSteps}}}}}async function Pl({platform:t,filePath:e,steps:o,beforeSteps:n,afterSteps:r,settings:i,labels:a,folder:s,project:l,momenticFiles:c,schemaVersion:u,forceFileFormat:d}){let m=Oo__default.isAbsolute(e)?e:Oo__default.join(s,e);if(!Bn__default.existsSync(m))throw new Error(`Test file not found: ${m}`);let{parsed:p}=ca(m),f=ey(p),h,g;if(f?(g=vc.parse(p),h={...oy({testV2:g}),schemaVersion:u,fileType:Pe.MOBILE_TEST,steps:[]}):h=yw.parse({...p,schemaVersion:u}),h.fileType!==Pe.MOBILE_TEST)throw new Error(`File at '${m}' is not a mobile test (fileType=${h.fileType}).`);if(h.platform!==t)throw new Error(`Platform mismatch. Test at '${m}' is for platform ${h.platform}, but update is for platform ${t}.`);let b=o||n||r,y=b?await Gn({platform:t,stepLists:{steps:o??[],beforeSteps:n,afterSteps:r}}):void 0,T=y?.moduleUpdates??[],v;f&&g&&!b&&(v={steps:g.steps??[],before:g.before,after:g.after});let E=l.config.fileFormat==="v2"||f;d!==void 0&&(E=d==="v2");for(let I of T)ks({content:I,schemaVersion:Ro,momenticFiles:c,project:l,forceFileFormat:d});if(E){let I={...h};a!==void 0&&(I.labels=a),i!==void 0&&(I.settings=i);let A={...I,steps:[]},k;if(b&&y){let _;y.stepsToSave.beforeSteps&&y.stepsToSave.beforeSteps.length>0&&(_=y.stepsToSave.beforeSteps);let H;y.stepsToSave.afterSteps&&y.stepsToSave.afterSteps.length>0&&(H=y.stepsToSave.afterSteps),k={steps:y.stepsToSave.steps,beforeSteps:_,afterSteps:H};let V=Ed({sourceFilePath:m,momenticFiles:{mobileModules:c.mobileModules}}),j=Zp({metadata:A,stepLists:k,fileResolver:V});Bn__default.writeFileSync(m,Ob.stringify(j),"utf-8");}else {let _=Zp({metadata:A,stepLists:{steps:[]},fileResolver:Ed({sourceFilePath:m,momenticFiles:{mobileModules:c.mobileModules}})}),H=W4({formatted:_,stepLists:v??{steps:[]}});Bn__default.writeFileSync(m,H,"utf-8");}xl(m,l.config);return}let P={...h,steps:h.steps};if(o&&(P.steps=y?.stepsToSave.steps??[]),a!==void 0&&(P.labels=a),n){let I=y?.stepsToSave.beforeSteps;I&&I.length>0?P.beforeSteps=I:delete P.beforeSteps;}else h.beforeSteps&&h.beforeSteps.length>0&&(P.beforeSteps=h.beforeSteps);if(r){let I=y?.stepsToSave.afterSteps;I&&I.length>0?P.afterSteps=I:delete P.afterSteps;}else h.afterSteps&&h.afterSteps.length>0&&(P.afterSteps=h.afterSteps);i&&(P.settings=i);let M=Ob.stringify(yw.parse(P));Bn__default.writeFileSync(m,M,"utf-8"),xl(m,l.config);}function H4(t,e,o){let n=Oo__default.join(o.rootDir,t);if(!Bn__default.existsSync(n))throw new Ye(`Test not found at path '${t}' in project '${o.rootDir}'`);let{parsed:r}=ca(n),i=ey(r),a=Oo__default.basename(t,".test.yaml"),s,l;if(e.name&&e.name!==a){let u=`${Ti(e.name)}.test.yaml`;if(s=Oo__default.join(Oo__default.dirname(t),u),l=Oo__default.join(o.rootDir,s),Bn__default.existsSync(l))throw new ig({name:e.name,path:l})}let c=i?UCe({existingTestRaw:r,updates:e}):zCe({existingTestRaw:r,updates:e});return Bn__default.writeFileSync(n,c,"utf-8"),l&&l!==n?(Bn__default.renameSync(n,l),xl(l,o.config)):xl(n,o.config),{newRelativeTestPath:s}}function UCe({existingTestRaw:t,updates:e}){let o=vc.parse(t),n=oy({testV2:o}),r={...n,description:e.description??n.description,disabled:e.disabled??n.disabled,labels:e.labels??n.labels,settings:e.settings??n.settings,fileType:Pe.MOBILE_TEST,steps:[]};return W4({formatted:Zp({metadata:r,stepLists:{steps:[]}}),stepLists:{before:o.before,steps:o.steps??[],after:o.after}})}function W4({formatted:t,stepLists:e}){let{steps:o,...n}=t,r=e.before;r&&r.length===0&&(r=void 0);let i=e.after;i&&i.length===0&&(i=void 0);let a=Ln({...n,before:r,steps:e.steps,after:i});return Ob.stringify(a)}function zCe({existingTestRaw:t,updates:e}){let n={...yw.parse(t),...e};if(n.fileType!==Pe.MOBILE_TEST)throw new Error(`Existing legacy mobile test has unexpected fileType=${n.fileType}.`);return Ob.stringify(yw.parse(n))}var G4=new Set([".DS_Store","__MACOSX"]),q4={status:(t,e)=>{if(t.status===e.status)return t.status;if(t.status==="FAILED"||e.status==="FAILED")return "FAILED";if(t.status==="CANCELLED"||e.status==="CANCELLED")return "CANCELLED";if(t.status==="RETRYING"||e.status==="RETRYING")return "RETRYING";if(t.status==="RUNNING"||e.status==="RUNNING")return "RUNNING";if(t.status==="PENDING"||e.status==="PENDING")return "PENDING";throw new Error(`Invalid run status merge: ${t.status} and ${e.status}`)},startedAt:(t,e)=>t.startedAt<e.startedAt?t.startedAt:e.startedAt,updatedAt:(t,e)=>t.updatedAt>e.updatedAt?t.updatedAt:e.updatedAt,finishedAt:(t,e)=>!t.finishedAt||!e.finishedAt?new Date:t.finishedAt>e.finishedAt?t.finishedAt:e.finishedAt,gitCommitTimestamp:(t,e)=>{if(!(!t&&!e)){if(!t.gitCommitTimestamp||!e.gitCommitTimestamp||t.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${t.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return t.gitCommitTimestamp}},pipelineId:(t,e)=>t.pipelineId===e.pipelineId?t.pipelineId:!t.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&t.pipelineId?t.pipelineId:t.startedAt<e.startedAt?e.pipelineId:t.pipelineId,labels:(t,e)=>{let o=new Set([...t.labels??[],...e.labels??[]]);return Array.from(o)},ai:(t,e)=>t.ai??e.ai,browser:(t,e)=>t.browser??e.browser,aiSelect:(t,e)=>{let o=[...t.aiSelect??[],...e.aiSelect??[]];return o.length>0?o:void 0},healRiskSummary:()=>{}};function VCe(t,e,o){if(q4[o]){let i=q4[o];return i(t,e)}let n=t[o],r=e[o];if(n===void 0)return r;if(r===void 0)return n;if(n!==r)throw new Error(`Metadata values for key "${o}" do not match: "${n}" vs "${r}"`);return n}var VD=class extends Error{constructor(e,o){let n=`${e} contains invalid Momentic results: ${o}. 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 K4(t,e){try{let o=Oo__default.join(e,pn);return fp.parse(JSON.parse(Bn__default.readFileSync(o,"utf-8")))}catch{throw new VD(t,e)}}function Y4(t,e,o){let n=randomUUID(),r=t.child({runGroupId:n});Bn__default.rmSync(e,{recursive:true,force:true});let i=Bn__default.readdirSync(o).filter(l=>!G4.has(l)).map(l=>Oo__default.join(o,l));if(i.length===0)throw new Error(`No run groups found in results path: ${o}`);Bn__default.mkdirSync(e,{recursive:true});let a={...K4(o,i[0]),id:n,healRiskSummary:void 0,aiSelect:void 0};for(let l of i){let c=Oo__default.join(l,tr);if(!Bn__default.existsSync(c))continue;let u=K4(o,l);r.info({oldRunGroupId:u.id},"Merging run groups");for(let m in u){if(m==="id")continue;let p=m;a[p]=VCe(a,u,p);}let d=Bn__default.readdirSync(c);for(let m of d){if(G4.has(m))continue;let p=Oo__default.join(c,m),f=Oo__default.join(e,tr,m);Bn__default.cpSync(p,f,{recursive:true});}}let s=Oo__default.join(e,pn);Bn__default.writeFileSync(s,JSON.stringify(a,null,2));}var oe="v1",jD="mobile-cli",Md="1.4.6";var jCe=9e4,HCe=3,WCe=1500,GCe=15e3,Ho=class extends Error{status;rawError;constructor(e,o,n,r={}){super(n,r),this.status=e,this.rawError=o;}},HD=class extends Ye{constructor(e,o={}){super(e,o),this.name="PlanLimitExceededError";}};async function qCe(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var WD=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger;}getHeaders(){let e={"Content-Type":"application/json"};return (e[av]=Md),(e[iW]=jD),e}async sendRequest(e,o){let{retries:n=HCe,requestTimeoutMs:r=jCe,initialRetryDelayMs:i=WCe,maxRetryDelayMs:a=GCe,onFailedRequest:s}=o,l=n,c=n,u,d={path:e,baseUrl:this.baseUrl,method:o.method};for(;l>0;)try{return l--,await this.sendSingleRequestHelper(e,o,r)}catch(m){u=m;try{s?.(u);}catch{}if(m instanceof Ho&&m.status>=400&&m.status<500)throw m.status===402?new HD(m.rawError,{cause:m}):m;if(m instanceof Error&&m.name==="AbortError"&&(u=new Fa),l===0)throw u;let p=c-l,f=Math.min(i*Math.pow(2,p-1),a);await new Promise(h=>setTimeout(h,f));}throw this.logger.warn({...d,err:u},"Got fatal error response from Momentic server"),u}async sendSingleRequestHelper(e,o,n){let r={path:e,baseUrl:this.baseUrl,method:o.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();o.signal&&o.signal.addEventListener("abort",s,{once:true});let l=Date.now(),c={...this.getHeaders(),...o.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:o.method,body:o.body?JSON.stringify(o.body):void 0,headers:c,signal:i.signal});if(!u.ok){let p=await qCe(u);throw new Ho(u.status,p,`Request to ${o.method} ${e} failed with status ${u.status}: ${p}`)}let d;if(u.status===204)d={};else if(o.responseType==="buffer"){let p=await u.arrayBuffer();d=Buffer.from(p);}else {let p=await u.text();try{d=JSON.parse(p);}catch{d=p;}}this.logger&&o.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-l,...r},"Got response from Momentic server");let m=o.responseHeadersObject;return m&&u.headers.forEach((p,f)=>{m[f.toLowerCase()]=p;}),d}finally{clearTimeout(a),o.signal&&o.signal.removeEventListener("abort",s);}}},Fs=class extends WD{apiKey;mode;runner;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode,this.runner=e.runner;}getHeaders(){return {...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[rW]:this.mode,[sv]:this.runner}}};var w5="vercel.ai.error",KCe=Symbol.for(w5),X4,J4,wt=class A5 extends(J4=Error,X4=KCe,J4){constructor({name:e,message:o,cause:n}){super(o),this[X4]=true,this.name=e,this.cause=n;}static isInstance(e){return A5.hasMarker(e,w5)}static hasMarker(e,o){let n=Symbol.for(o);return e!=null&&typeof e=="object"&&n in e&&typeof e[n]=="boolean"&&e[n]===true}},R5="AI_APICallError",x5=`vercel.ai.error.${R5}`,YCe=Symbol.for(x5),Z4,Q4,Jo=class extends(Q4=wt,Z4=YCe,Q4){constructor({message:t,url:e,requestBodyValues:o,statusCode:n,responseHeaders:r,responseBody:i,cause:a,isRetryable:s=n!=null&&(n===408||n===409||n===429||n>=500),data:l}){super({name:R5,message:t,cause:a}),this[Z4]=true,this.url=e,this.requestBodyValues=o,this.statusCode=n,this.responseHeaders=r,this.responseBody=i,this.isRetryable=s,this.data=l;}static isInstance(t){return wt.hasMarker(t,x5)}},M5="AI_EmptyResponseBodyError",P5=`vercel.ai.error.${M5}`,XCe=Symbol.for(P5),e5,t5,I5=class extends(t5=wt,e5=XCe,t5){constructor({message:t="Empty response body"}={}){super({name:M5,message:t}),this[e5]=true;}static isInstance(t){return wt.hasMarker(t,P5)}};function _5(t){return t==null?"unknown error":typeof t=="string"?t:t instanceof Error?t.message:JSON.stringify(t)}var O5="AI_InvalidArgumentError",D5=`vercel.ai.error.${O5}`,JCe=Symbol.for(D5),o5,n5,Tw=class extends(n5=wt,o5=JCe,n5){constructor({message:t,cause:e,argument:o}){super({name:O5,message:t,cause:e}),this[o5]=true,this.argument=o;}static isInstance(t){return wt.hasMarker(t,D5)}},N5="AI_InvalidPromptError",L5=`vercel.ai.error.${N5}`,ZCe=Symbol.for(L5),r5,i5,k5=class extends(i5=wt,r5=ZCe,i5){constructor({prompt:t,message:e,cause:o}){super({name:N5,message:`Invalid prompt: ${e}`,cause:o}),this[r5]=true,this.prompt=t;}static isInstance(t){return wt.hasMarker(t,L5)}},F5="AI_InvalidResponseDataError",B5=`vercel.ai.error.${F5}`,QCe=Symbol.for(B5),a5,s5,Ew=class extends(s5=wt,a5=QCe,s5){constructor({data:t,message:e=`Invalid response data: ${JSON.stringify(t)}.`}){super({name:F5,message:e}),this[a5]=true,this.data=t;}static isInstance(t){return wt.hasMarker(t,B5)}},U5="AI_JSONParseError",z5=`vercel.ai.error.${U5}`,ewe=Symbol.for(z5),l5,c5,dy=class extends(c5=wt,l5=ewe,c5){constructor({text:t,cause:e}){super({name:U5,message:`JSON parsing failed: Text: ${t}.
225
225
  Error message: ${_5(e)}`,cause:e}),this[l5]=true,this.text=t;}static isInstance(t){return wt.hasMarker(t,z5)}},$5="AI_LoadAPIKeyError",V5=`vercel.ai.error.${$5}`,twe=Symbol.for(V5),u5,d5,my=class extends(d5=wt,u5=twe,d5){constructor({message:t}){super({name:$5,message:t}),this[u5]=true;}static isInstance(t){return wt.hasMarker(t,V5)}},Y5="AI_TooManyEmbeddingValuesForCallError",X5=`vercel.ai.error.${Y5}`,iwe=Symbol.for(X5),y5,S5,vw=class extends(S5=wt,y5=iwe,S5){constructor(t){super({name:Y5,message:`Too many values for a single embedding call. The ${t.provider} model "${t.modelId}" can only embed up to ${t.maxEmbeddingsPerCall} values per call, but ${t.values.length} values were provided.`}),this[y5]=true,this.provider=t.provider,this.modelId=t.modelId,this.maxEmbeddingsPerCall=t.maxEmbeddingsPerCall,this.values=t.values;}static isInstance(t){return wt.hasMarker(t,X5)}},J5="AI_TypeValidationError",Z5=`vercel.ai.error.${J5}`,awe=Symbol.for(Z5),T5,E5,zc=class GD extends(E5=wt,T5=awe,E5){constructor({value:e,cause:o,context:n}){let r="Type validation failed";if(n?.field&&(r+=` for ${n.field}`),n?.entityName||n?.entityId){r+=" (";let i=[];n.entityName&&i.push(n.entityName),n.entityId&&i.push(`id: "${n.entityId}"`),r+=i.join(", "),r+=")";}super({name:J5,message:`${r}: Value: ${JSON.stringify(e)}.
226
226
  Error message: ${_5(o)}`,cause:o}),this[T5]=true,this.value=e,this.context=n;}static isInstance(e){return wt.hasMarker(e,Z5)}static wrap({value:e,cause:o,context:n}){var r,i,a;return GD.isInstance(o)&&o.value===e&&((r=o.context)==null?void 0:r.field)===n?.field&&((i=o.context)==null?void 0:i.entityName)===n?.entityName&&((a=o.context)==null?void 0:a.entityId)===n?.entityId?o:new GD({value:e,cause:o,context:n})}},Q5="AI_UnsupportedFunctionalityError",e9=`vercel.ai.error.${Q5}`,swe=Symbol.for(e9),v5,C5,Fn=class extends(C5=wt,v5=swe,C5){constructor({functionality:t,message:e=`'${t}' functionality not supported.`}){super({name:Q5,message:e}),this[v5]=true,this.functionality=t;}static isInstance(t){return wt.hasMarker(t,e9)}};var Cw=class extends Error{constructor(e,o){super(e),this.name="ParseError",this.type=o.type,this.field=o.field,this.value=o.value,this.line=o.line;}};function qD(t){}function t9(t){if(typeof t=="function")throw new TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:e=qD,onError:o=qD,onRetry:n=qD,onComment:r}=t,i="",a=true,s,l="",c="";function u(h){let g=a?h.replace(/^\xEF\xBB\xBF/,""):h,[b,y]=lwe(`${i}${g}`);for(let T of b)d(T);i=y,a=false;}function d(h){if(h===""){p();return}if(h.startsWith(":")){r&&r(h.slice(h.startsWith(": ")?2:1));return}let g=h.indexOf(":");if(g!==-1){let b=h.slice(0,g),y=h[g+1]===" "?2:1,T=h.slice(g+y);m(b,T,h);return}m(h,"",h);}function m(h,g,b){switch(h){case "event":c=g;break;case "data":l=`${l}${g}
227
227
  `;break;case "id":s=g.includes("\0")?void 0:g;break;case "retry":/^\d+$/.test(g)?n(parseInt(g,10)):o(new Cw(`Invalid \`retry\` value: "${g}"`,{type:"invalid-retry",value:g,line:b}));break;default:o(new Cw(`Unknown field "${h.length>20?`${h.slice(0,20)}\u2026`:h}"`,{type:"unknown-field",field:h,value:g,line:b}));break}}function p(){l.length>0&&e({id:s,event:c||void 0,data:l.endsWith(`
@@ -278,7 +278,7 @@ ${r}
278
278
  `);}catch(o){t.logger.warn({err:o},"Failed to check CLI version against npm");}}async function kPe(t,e,o){if(!A6){A6=true;try{let n=await t.getCliAnnouncements();for(let{announcement:r,level:i}of n)N.log(`
279
279
  ${T6({announcement:r,level:i},o)}
280
280
  `);}catch(n){e.warn({err:n},"Failed to fetch CLI announcements");}}}var kN="^22.12.0 || >=24.0.0";function P6(){(Ll.satisfies(process.version,kN)||(N.error(`Momentic requires Node.js ${kN}, but you are running ${process.version}. Upgrade Node.js (https://nodejs.org/en/download) and try again.`),process.exit(1)));}var hf=25;function I6(t){return {v2ProjectConfig:{...t.config,fileFormat:"v2"},migratedFilePaths:[]}}function _6(t){return {legacyProjectConfig:{...t.config,fileFormat:"v1"},migratedFilePaths:[]}}function FN({project:t,newProjectConfig:e,fileFormatLabel:o,migratedFilePaths:n}){t.config=e,Ad(t.config,t.configFilePath),n.push(t.configFilePath),N.info(`Updated ${t.configFilePath} to use ${o} file format`),e.hooks?.postSave&&(N.info(`Running post-save hook for ${n.length} migrated files`),P4([...new Set(n)],e));}async function gf(t,e,o){for(let n=0;n<t.length;n+=e)await Promise.all(t.slice(n,n+e).map(o));}function BN(t){return t.upgradedAgents.length>0||t.enabledUseMemory||t.enabledFailureRecovery}function BPe(t){let e=t.ai??={},o=e.agentConfig??={},n=[];for(let[a,s]of Object.entries(_m)){let l=o[a];l!==s&&(l?.startsWith(`${s}.`)||(o[a]=s,n.push({type:a,newValue:s})));}let r=e.useMemory!==true;r&&(e.useMemory=true);let i=e.failureRecovery!==true;return i&&(e.failureRecovery=true),{upgradedAgents:n,enabledUseMemory:r,enabledFailureRecovery:i}}async function O6({project:t,dryRun:e,migrate:o}){let n=t.config.fileFormat!=="v2",r=BPe(t.config);return n?{fileFormatChanged:n,aiSettings:r,migration:await o()}:(!e&&BN(r)&&Ad(t.config,t.configFilePath),{fileFormatChanged:false,aiSettings:r,migration:UN()})}function UN(){return {migratedTestPaths:[],migratedModulePaths:[],alreadyV2TestCount:0,alreadyV2ModuleCount:0}}function zN({summary:t,fileFormatChanged:e,aiSettings:o,dryRun:n,testNoun:r="test",moduleNoun:i="module"}){let a=n?"Would migrate":"Migrated",s=pd(r,t.migratedTestPaths.length),l=pd(i,t.migratedModulePaths.length);N.info(`${a} ${t.migratedTestPaths.length} ${s} and ${t.migratedModulePaths.length} ${l} to v2.`),(t.alreadyV2TestCount>0||t.alreadyV2ModuleCount>0)&&N.dimmed(` Skipped ${t.alreadyV2TestCount} already-v2 ${pd(r,t.alreadyV2TestCount)} and ${t.alreadyV2ModuleCount} already-v2 ${pd(i,t.alreadyV2ModuleCount)}.`),e&&N.dimmed(" + fileFormat: v2");for(let c of o.upgradedAgents)N.dimmed(` + ai.agentConfig.${c.type}: ${c.newValue}`);o.enabledUseMemory&&N.dimmed(" + ai.useMemory: true"),o.enabledFailureRecovery&&N.dimmed(" + ai.failureRecovery: true");}var VPe=w__default.string().url();async function Qw(t){if(VPe.safeParse(t).success){let e=new AbortController,o=setTimeout(()=>e.abort(),1e4),n;try{n=await fetch(t,{signal:e.signal});}catch(i){throw new O("UserInfrastructureError",`Fetch failed or timed out for URL: ${t}`,{errOptions:{cause:i}})}finally{clearTimeout(o);}if(!n.ok)throw new O("UserInfrastructureError",`Failed to fetch file from URL: ${t}, status: ${n.status}`);let r=await n.arrayBuffer();return Buffer.from(r).toString("base64")}if(!existsSync(t))throw new O("UserInfrastructureError",`File does not exist at path: ${t}`);return readFileSync(t).toString("base64")}var D6=1e3,N6=5e6,HPe=5*1024*1024;function $N(t,e){for(let o=0;o<t.length;o++){let n=t[o];if(n.type==="MOBILE_PRESET_STEP"&&n.command.type==="VISUAL_DIFF")WPe(n);else try{if(n.data){let{jsonString:r}=F6(JSON.stringify(n.data),1e3);n.data=JSON.parse(r);}}catch(r){e.error({err:r},"Failed to serialize individual result output data"),n.data=`Result output data could not be serialized: ${r}`;}switch(n.type){case "MOBILE_PRESET_STEP":L6(n);break;case "MOBILE_AI_ACTION_STEP":case "MOBILE_MODULE_STEP":$N(n.steps,e);break;case "MOBILE_CONDITIONAL_STEP":n.assertionResult&&L6(n.assertionResult),$N(n.steps,e);break;default:{throw new Error("If Typescript complains about the line below, you missed a case or break in the switch above")}}}}function L6(t){let e=t.command;"cache"in e&&e.cache&&(e.cache=void 0);}function WPe(t){let e=vI.safeParse(t.data);if(!e.success)return;let o=e.data;t.data={created:o.created,goldenPath:o.goldenPath,threshold:o.threshold,goldenScreenshotSnapshotId:o.goldenScreenshotSnapshotId,currentScreenshotSnapshotId:o.currentScreenshotSnapshotId,diffScreenshotSnapshotId:o.diffScreenshotSnapshotId,diffPercent:o.diffPercent,pass:o.pass,dimensionMismatch:o.dimensionMismatch};}function k6(t,e){let o=JSON.stringify(t),n=o.replaceAll("\\u0000","");if(o.length!==n.length){let r=o.indexOf("\\u0000");e.warn({input:o.slice(Math.max(0,r-500),Math.min(o.length,r+500))},"Database content violation: stripped unicode character from input");}return n}function eA(t,e,o){let n=cloneDeep(t);if($N(n,o),n.length>D6)return o.error("Database content violation: results too long, truncating before insertion"),n.slice(0,D6);let r=k6(n,o);if(r.length>N6)for(o.error({serializedLength:r.length,resultsArrayLength:n.length},"Database content violation: results too large, truncating before insertion");r.length>N6;)n.pop(),r=k6(n,o);let{jsonString:i}=F6(r,HPe);try{return e.array().parse(JSON.parse(i))}catch(a){throw o.error({serialized:r,err:a},"Could not parse serialized results into JSON structure after processing"),a}}function Yc(t,e,o=.01){let n=Buffer.from(t,"base64"),r=Buffer.from(e,"base64"),i=PNG.sync.read(n),a=PNG.sync.read(r);if(i.width!==a.width||i.height!==a.height)return 100;let s=i.width,l=i.height,c=Buffer.alloc(s*l*4);return B6(i.data,a.data,c,s,l,{threshold:o})/(s*l)*100}function U6(t,e,o){let n=PNG.sync.read(Buffer.from(t,"base64")),r=PNG.sync.read(Buffer.from(e,"base64")),i={width:n.width,height:n.height},a={width:r.width,height:r.height};if(n.width!==r.width||n.height!==r.height)return {diffPercent:100,diffPngBase64:"",dimensionMismatch:true,goldenDimensions:i,currentDimensions:a};let s=n.width,l=n.height,c=new PNG({width:s,height:l});return {diffPercent:B6(n.data,r.data,c.data,s,l,{threshold:o,diffColorAlt:[0,255,0]})/(s*l)*100,diffPngBase64:PNG.sync.write(c).toString("base64"),dimensionMismatch:false,goldenDimensions:i,currentDimensions:a}}var Vs=class{baseDir;updateGoldenFiles;constructor({baseDir:e,updateGoldenFiles:o}){this.baseDir=e,this.updateGoldenFiles=o;}resolveGoldenPath(e){return Oo__default.isAbsolute(e)?e:Oo__default.join(this.baseDir,e)}compareOrCreate({goldenPath:e,currentScreenshotBase64:o,pixelThreshold:n,updateGoldenFiles:r,logger:i}){let a=this.resolveGoldenPath(e),s=Bn__default.existsSync(a),l=r??this.updateGoldenFiles;if(!s||l)return Bn__default.mkdirSync(Oo__default.dirname(a),{recursive:true}),Bn__default.writeFileSync(a,Buffer.from(o,"base64")),i.info({goldenPath:a,updated:s},s?"Updated golden screenshot":"Created golden screenshot"),{created:true,goldenScreenshotBase64:o};let c=Bn__default.readFileSync(a).toString("base64"),u=U6(c,o,n);return {created:false,goldenScreenshotBase64:c,diffScreenshotBase64:u.diffPngBase64,diffPercent:u.diffPercent,dimensionMismatch:u.dimensionMismatch,goldenDimensions:u.goldenDimensions,currentDimensions:u.currentDimensions}}};var z6=1e4,$6=2e4,YPe=250,XPe=5e3,JPe=2e3,ZPe=[/dbug Appium Creating hash file directory/];function QPe(t){return ZPe.some(e=>e.test(t))}var eIe=createRequire(import.meta.url),tIe=eIe.resolve("appium/build/lib/main.js");function oIe(t){let e=(t??"").toLowerCase();return {deviceOffline:e.includes("device offline"),instrumentationCrashed:e.includes("instrumentation process has been unexpectedly terminated"),uiAutomatorCrashed:e.includes("uiautomator2")&&(e.includes("instrumentation")||e.includes("not running")||e.includes("socket hang up")),nodeVersionUnsupported:e.includes("node version must be at least")}}function nIe(t,e){let o=`Appium subprocess exited before becoming ready with exit code ${t}`;if(e.nodeVersionUnsupported)return `${o}. The current Node.js version is not supported by Appium; see the Appium log for the required version range.`;let n=e.lastError??e.lastWarn;return n?`${o}. Appium reported: ${n}`:o}async function jN(t){try{let e=await fetch(`http://localhost:${t}/status`,{method:"GET",signal:AbortSignal.timeout(XPe)}),o=await e.text();return {ok:!0,statusCode:e.status,body:o}}catch(e){return {ok:false,error:J(e)}}}async function rIe({appiumPort:t,child:e,appiumLogHints:o,waitForOutputFlush:n}){let r=Date.now();for(;Date.now()-r<$6;){if(e.exitCode!==null)throw await n(),new Error(nIe(e.exitCode,o));if((await jN(t)).ok)return;await new Promise(a=>setTimeout(a,YPe));}throw new Error(`Timed out waiting for Appium to become ready after ${$6}ms`)}async function V6({child:t,logger:e}){t.exitCode!==null||t.killed||(t.kill("SIGTERM"),await re(new Promise(o=>{t.once("exit",()=>o());}),{milliseconds:z6,fallback:()=>{e.warn({timeoutMs:z6},"Appium subprocess close timed out; sending SIGKILL"),t.kill("SIGKILL");}}));}function j6(t,e,o,n){let r=createInterface({input:t,terminal:false}),i=[],a=l=>{let c=oIe(l);n.deviceOffline||=c.deviceOffline,n.instrumentationCrashed||=c.instrumentationCrashed,n.uiAutomatorCrashed||=c.uiAutomatorCrashed,n.nodeVersionUnsupported||=c.nodeVersionUnsupported;},s=()=>{if(i.length===0)return;let l=i.join(`
281
- `);a(l),o==="warn"&&(n.lastWarn=l),e[o]({appium:true,logLine:l},"Appium log"),i.length=0;};return r.on("line",l=>{if(!l.trim()||QPe(l))return;let c;try{c=JSON.parse(l);}catch{}if(c!==void 0){s(),a(l);let u=c.level,d=c.message;typeof d=="string"&&(u==="error"?n.lastError=d:u==="warn"&&(n.lastWarn=d)),e[o]({appium:true,parsed:c},"Appium log");}else !/^\s/.test(l)&&i.length>0&&s(),i.push(l);}),new Promise(l=>{r.on("close",()=>{s(),l();});})}async function HN({logger:t,logLevel:e,appiumPort:o}){let n=Date.now(),r=spawn(process.execPath,[tIe,"--address","127.0.0.1","--port",`${o}`,"--relaxed-security","--log-format","json","--log-level",e],{stdio:["ignore","pipe","pipe"],env:process.env}),i={deviceOffline:false,instrumentationCrashed:false,uiAutomatorCrashed:false,nodeVersionUnsupported:false},a=[];r.stdout&&a.push(j6(r.stdout,t,"info",i)),r.stderr&&a.push(j6(r.stderr,t,"warn",i));let s=()=>re(Promise.all(a).then(()=>{}),{milliseconds:JPe,fallback:()=>{}});try{await rIe({appiumPort:o,child:r,appiumLogHints:i,waitForOutputFlush:s});}catch(l){throw await V6({child:r,logger:t}),l}return t.info({duration:Date.now()-n},"Started Appium server"),{close:()=>V6({child:r,logger:t}),appiumLogHints:i}}function W6(t){let e=J(t);return e.includes("/session")&&(e.toLowerCase().includes("timeout")||e.toLowerCase().includes("socket hang up"))}function oA(t){return t instanceof Error?t.message.includes("Could not find a driver for automationName")||t.message.includes("Multiple drivers claim support for the same automationName"):false}async function pIe(t,e){let o=new iIe(e);return await o.start(),dIe.createInterface({input:o}).on("line",r=>{t.info({wdio:true,logLine:r},"WebdriverIO log");}),()=>o.quit()}async function fIe(t){let e=Oo__default.join(tmpdir(),"momentic","wdio",randomUUID());mkdirSync(e,{recursive:true});let o=new Set,n=[],r=watch(e,async(i,a)=>{if(i!=="rename"||!a||o.has(a))return;o.add(a);let s=Oo__default.join(e,a.toString());if(!existsSync(s)){o.delete(a);return}try{let l=await pIe(t,s);n.push(l);}catch(l){o.delete(a),t.warn({err:l,fileName:a},"Failed to start forwarding logs from new WDIO log file");}});return {stop:async()=>{r.close(),await Promise.all(n.map(i=>i().catch(a=>{t.warn({err:a},"Failed to stop forwarding logs from WDIO log file");})));},logDir:e}}async function G6({logger:t,callbacks:e,logLevel:o,wdioOpts:n}){let{onStatusUpdate:r,onFailure:i}=e,a=Math.floor(Math.random()*1e4)+4e4,s=await Ic(a,"appium"),{close:l,appiumLogHints:c}=await HN({logger:t,logLevel:o,appiumPort:s}),u=async()=>{try{await l();}catch(p){t.warn({err:p},"Failed to close Appium server");}},{logDir:d,stop:m}=await fIe(t);for(let p=1;p<=2;p++)try{p>1&&r("Retrying Appium session");let f=Date.now(),h=await remote({connectionRetryTimeout:3e4,connectionRetryCount:0,...n,outputDir:d,hostname:"localhost",port:s,path:"/",protocol:"http",logLevel:o,transformRequest:hIe});return t.info({duration:Date.now()-f},"Created Wdio driver"),{driver:h,appiumServerClose:async()=>{await m(),await l();}}}catch(f){let h,g;try{let b=i?await i({err:f,attempt:p,appiumPort:s,appiumLogHints:c}):{shouldRetry:!1,recover:void 0};h=b.shouldRetry,g=b.recover;}catch(b){throw await m(),await u(),b}if(!h||p>=2)throw await m(),await u(),f;if(g)try{await g();}catch(b){t.warn({err:b},"Recovery failed before Appium restart");}await u(),{close:l,appiumLogHints:c}=await HN({logger:t,logLevel:o,appiumPort:s});}throw new Error("createWdioDriverWithRecovery: unexpected state")}function hIe(t){let e=new Headers(t.headers);return e.delete("connection"),e.delete("content-length"),{...t,headers:e}}function q6(t,e){let o=new Map;e.on("command",n=>{o.set(n.command,Date.now());}),e.on("result",n=>{let r=o.get(n.command);if(!r)return;let i=Date.now()-r;n.result instanceof Error?t.warn({err:n.result,command:n.command,args:n.body,durationMs:i},"Appium cmd failed"):i>1e4&&t.warn({command:n.command,args:n.body,durationMs:i},"Appium cmd took very long"),o.delete(n.command);});}var K6=1e4,gIe=15e3,bIe=15e3;function Y6(t,e,o,n){let{isTeardownRequested:r,onHeartbeatFailure:i,onHeartbeatRestored:a}=n||{},s=0,l=false,c,u,d=[];t.on("command",p=>{d.push(p.command);}),t.on("result",p=>{p.result instanceof Error||(u=Date.now());});async function m(){let p=gIe,f=Date.now()-(u??0);if(f>K6)try{if(await re(e(),{milliseconds:bIe}),l)return;s>0&&(o.info("Driver heartbeat restored"),a?.()),s=0;}catch(h){if(l){r?.()===true&&o.debug({err:h,recentCommands:d,teardownRequested:true},"Ignoring driver heartbeat failure during teardown");return}if(r?.()===true){o.debug({err:h,recentCommands:d,teardownRequested:true},"Ignoring driver heartbeat failure during teardown");return}s++;let g=h instanceof Error?h.message:`${h}`;if(o.warn({attempt:s,error:g,recentCommands:d},"Driver heartbeat failed"),s===3){let b="The driver appears unresponsive, indicating a possible emulator failure";o.error({err:h},b),N.error(b),i?.();}}else s>0&&(o.info("Driver heartbeat restored"),a?.()),s=0,p-=f;d=[],l||(c=setTimeout(()=>void m(),Math.max(p,K6)));}return m(),()=>{l=true,clearTimeout(c);}}var yIe=6e4,SIe=15e3,TIe=1e4;async function yf(t,e,o,n){let{maxAttempts:r=3,signal:i,slowThresholdMs:a=3e3,initialBackoffMs:s=3e3,backoffMultiplier:l=2,timeoutMs:c,attemptTimeoutMs:u,operationName:d}=o,m=u??TIe,p=c??Math.max(yIe,m),f=Date.now()+p,h;for(let g=0;g<r;g++){i?.throwIfAborted();let b=n?.reconnectingPromise?.();if(b){t.info("Waiting for reconnect to finish before attempt");let T=Date.now(),v=J6(f);try{await re(b,{milliseconds:v,signal:i,message:`${d} timed out after ${v}ms while waiting for Appium reconnect`});}catch(E){if(t.error({err:E},"Error while waiting for reconnect"),E instanceof Fa)throw E}finally{f+=Date.now()-T;}}else if(r>1&&g===r-1&&n?.tryReconnect){t.info({attempt:g+1,maxAttempts:r},`Attempting reconnect before final attempt ${g+1}`);let T=Date.now(),v=J6(f);try{await re(n.tryReconnect(t),{milliseconds:v,signal:i,message:`${d} timed out after ${v}ms while reconnecting to Appium`});}finally{f+=Date.now()-T;}}let y=Date.now();try{let T=Math.min(m,X6({deadlineMs:f,operationName:d,totalTimeoutMs:p})),v=await re(e(),{milliseconds:T,signal:i,message:T<m?`${d} timed out after ${p}ms`:`${d} attempt timed out after ${m}ms`}),E=Date.now()-y;return E>a&&t.warn({durationMs:E},`${d} took very long`),v}catch(T){if(i?.throwIfAborted(),T instanceof Error)h=T;else throw T;if(g===r-1)throw t.error({err:T,attempt:g+1,maxAttempts:r},`${d} failed on final attempt`),T;if(!EIe(T))throw t.error({err:T,attempt:g+1,maxAttempts:r},`${d} failed and does not look retryable`),T;let v=Math.min(1e4,s*Math.pow(l,g)),E=Math.min(v,X6({deadlineMs:f,operationName:d,totalTimeoutMs:p}));t.warn({err:T,attempt:g+1,maxAttempts:r,backoffMs:E},`${d} failed, sleeping ${E}ms for recovery`),await Te(E,i);}}throw h}function X6({deadlineMs:t,operationName:e,totalTimeoutMs:o}){let n=t-Date.now();if(n>0)return n;throw new Fa(`${e} timed out after ${o}ms`)}function J6(t){return Math.max(SIe,t-Date.now())}function EIe(t){return t instanceof Error?["socket hang up","read ECONNRESET","timeout","timed out","UND_ERR_HEADERS_TIMEOUT","ECONNREFUSED"].some(o=>t.message.includes(o)):false}var vIe="NATIVE_APP",Xc=class t{currentContext;driver;appiumClose;stopHeartbeat;initializationParams;reconnectingPromise;teardownRequested=false;beginClose(){if(!this.teardownRequested){this.teardownRequested=true;try{this.stopHeartbeat();}catch{}}}async close(){this.beginClose(),await this.closeCurrentDriver();}async closeCurrentDriver(){try{this.stopHeartbeat();}catch{}try{await this.appiumClose();}catch{}}startHeartbeat(e,o){return Y6(this.driver,()=>this.healthcheck(),e,{...o,isTeardownRequested:()=>this.teardownRequested,onHeartbeatFailure:()=>{this.teardownRequested||(o.onHeartbeatFailure?.(),this.reconnect(e).catch(n=>{this.teardownRequested||e.error({err:n},"Failed to reconnect after heartbeat failure");}));}})}constructor({logger:e,driver:o,appiumClose:n,callbacks:r,initializationParams:i}){this.initializationParams=i,this.driver=o,this.appiumClose=n,this.stopHeartbeat=this.startHeartbeat(e,r);}static async connectAppium(e){let{logger:o}=e,{driver:n,appiumServerClose:r}=await G6(e);return q6(o,n),{...e,driver:n,appiumClose:r,initializationParams:e}}async executeInNativeContext(e,o,n){return this.executeInContext(e,vIe,o,n)}async reconnect(e){if(!this.teardownRequested){if(e.info("Attempting to reconnect to Appium"),this.reconnectingPromise)return this.reconnectingPromise;this.reconnectingPromise=(async()=>{try{await this.closeCurrentDriver();}catch(i){e.error({err:i},"Error while closing Appium during reconnect");}if(this.teardownRequested||(this.initializationParams.callbacks.restartWda&&await this.initializationParams.callbacks.restartWda(e),this.teardownRequested))return;let{driver:o,appiumClose:n,callbacks:r}=await t.connectAppium(this.initializationParams);if(this.teardownRequested){try{await n();}catch{}return}this.currentContext=void 0,this.driver=o,this.appiumClose=n,this.stopHeartbeat=this.startHeartbeat(e,r);})();try{await this.reconnectingPromise;}finally{this.reconnectingPromise=void 0;}}}async executeInContext(e,o,n,r){return yf(e,async()=>(this.currentContext!==o&&(e.info({from:this.currentContext,to:o},"Switching Appium context"),this.currentContext=void 0,await this.driver.switchContext(o),this.currentContext=o),await n(this.driver)),r,{reconnectingPromise:()=>this.reconnectingPromise,tryReconnect:async a=>{await this.reconnect(a);}})}};function Sf({containerBounds:t,viewport:e,defaultThresholdPercent:o}){let n=e.width*e.height;if(n<=0)return o;let r=Z6({start:t.left,size:t.width,maxSize:e.width}),i=Z6({start:t.top,size:t.height,maxSize:e.height});if(r<=0||i<=0)return o;let a=Math.min(r*i/n,1);return o*a}function nA({currentPixelDelta:t,baseDirection:e,correctionDirection:o,correctionPixels:n}){let r=Math.abs(t),i;o===e?i=r+n:i=Math.max(0,r-n);let a;return t===0?a=e==="down"?1:-1:a=Math.sign(t),a*i}function js({containerBounds:t,containerInsetRatio:e}){let o=t.height*e;return t.height-2*o}function rA({viewportTop:t,viewportBottom:e,elementHeight:o,targetTopRatio:n}){let r=Math.max(1,e-t),i=t+r*n,a=Math.max(t,e-o);return Math.max(t,Math.min(i,a))}function Z6({start:t,size:e,maxSize:o}){let n=t+e;return Math.max(0,Math.min(n,o)-Math.max(t,0))}function Q6(t){return t?.position?{...t,position:void 0}:t}function CIe(t){return t?.map(e=>({...e,requirements:Q6(e.requirements)}))}function iA(t){return {...t,requirements:Q6(t.requirements),requiredRelatedElements:CIe(t.requiredRelatedElements)}}function aA(t){let{tracer:e,span:o,screenshot:n,emulatorState:r,logger:i}=t;if(e.storeTraceAsset)try{let a=randomUUID$1();e.storeTraceAsset({snapshotId:a,data:Buffer.from(n,"base64"),extension:"png"}),o.screenshotSnapshotId=a;let s=randomUUID$1();e.storeTraceAsset({snapshotId:s,data:Buffer.from(r),extension:"xml"}),o.emulatorStateSnapshotId=s;}catch(a){i.debug({err:a},"Failed to store extraction trace assets");}}function sA(t){let{tracer:e,goldenScreenshotBase64:o,currentScreenshotBase64:n,diffScreenshotBase64:r,logger:i}=t,a=e.storeTraceAsset;if(!a)return {};let s=l=>{if(!l)return;let c=randomUUID$1();return a({snapshotId:c,data:Buffer.from(l,"base64"),extension:"png"}),c};try{return {goldenScreenshotSnapshotId:s(o),currentScreenshotSnapshotId:s(n),diffScreenshotSnapshotId:s(r)}}catch(l){return i.debug({err:l},"Failed to store visual diff trace assets"),{}}}function lA(t){let{tracer:e}=t;return e.startSpan("VISUAL_DIFF",o=>{let n=AIe(t);return o.result={created:n.output.created,success:n.success,message:n.message},n})}function AIe({goldenStorage:t,command:e,currentScreenshotBase64:o,threshold:n,updateGoldenFiles:r,tracer:i,logger:a}){let s=t.compareOrCreate({goldenPath:e.path,currentScreenshotBase64:o,pixelThreshold:n,updateGoldenFiles:r,logger:a}),l=t.resolveGoldenPath(e.path);if(s.created){let d=sA({tracer:i,goldenScreenshotBase64:s.goldenScreenshotBase64,currentScreenshotBase64:o,logger:a});return {success:true,message:`Saved golden screenshot to ${l}.`,output:{created:true,goldenPath:l,threshold:n,goldenScreenshotBase64:s.goldenScreenshotBase64,currentScreenshotBase64:o,...d}}}if(s.dimensionMismatch){let d=`${s.currentDimensions.width}x${s.currentDimensions.height}`,m=`${s.goldenDimensions.width}x${s.goldenDimensions.height}`,p=sA({tracer:i,goldenScreenshotBase64:s.goldenScreenshotBase64,currentScreenshotBase64:o,logger:a});return {success:false,message:`Current screenshot (${d}) does not match golden dimensions (${m}).`,output:{created:false,goldenPath:l,threshold:n,goldenScreenshotBase64:s.goldenScreenshotBase64,currentScreenshotBase64:o,diffPercent:s.diffPercent,pass:false,dimensionMismatch:true,...p}}}let c=s.diffPercent<=n*100,u=sA({tracer:i,goldenScreenshotBase64:s.goldenScreenshotBase64,currentScreenshotBase64:o,diffScreenshotBase64:s.diffScreenshotBase64,logger:a});return {success:c,message:`Visual diff of ${s.diffPercent.toFixed(2)}% detected, which is ${c?"under":"over"} the threshold of ${n*100}%.`,output:{created:false,goldenPath:l,threshold:n,goldenScreenshotBase64:s.goldenScreenshotBase64,currentScreenshotBase64:o,diffScreenshotBase64:s.diffScreenshotBase64,diffPercent:s.diffPercent,pass:c,...u}}}function cA(t,e){return e.length*(t+50)+4e3}var RIe=["WebSocket was closed before the connection was","Intentional disconnect"];function Ey(t){return t instanceof Error&&RIe.some(e=>t.message.includes(e))}var WN=false,tY;try{let t=await import('@sentry/node'),e="production";t.init({dsn:"https://67a6ef469598f8880478f33863d05873@o4506426201800704.ingest.us.sentry.io/4510914396291072",environment:e,enabled:e!=="development",dist:"production",release:"mobile-cli@1.4.5",tracesSampleRate:0,skipOpenTelemetrySetup:!0,sendDefaultPii:!0,beforeSend(o,n){return Z3(n?.originalException)||cg(n?.originalException,Ye)||Ey(n?.originalException)||Q3(n?.originalException)?null:o}}),kq(t.captureException),tY=o=>{if(!o){t.setUser(null);return}t.setUser({id:o.userId,organizationId:o.orgId,...o.email&&{email:o.email}});},WN=!0;}catch{}var oY=t=>tY?.(t);var xIe="https://api.momentic.ai";function nY(t){let e=process.env.MOMENTIC_API_KEY??Gw();if(!e)return;let o=(process.env.MOMENTIC_SERVER??qw()??xIe).replace(/\/+$/,"");return new on({apiKey:e,baseUrl:o,logger:t,mode:"runner",runner:"run-viewer"})}function rY({apiClient:t,logger:e}){let o=Router();return o.get("/:id",async(n,r)=>{let{id:i}=n.params;if(!i){r.status(400).json({error:"Missing screenshot ID"});return}if(!t){r.status(401).json({error:"Missing Momentic API key"});return}try{let{data:a,contentType:s}=await t.fetchOnDemandScreenshot(i);r.setHeader("Content-Type",s),r.send(a);}catch(a){e.error({err:a,screenshotId:i},"Failed to proxy on-demand screenshot"),r.status(502).json({error:"Failed to fetch screenshot"});}}),o}function iY(t){let e=Router(),o=Oo__default.join(t,tr);return e.get("/",async(n,r)=>{try{let i=_Ie(t);if(!i){r.status(404).json({error:"No run group found"});return}if(!Bn__default.existsSync(o)){r.status(404).json({error:"No runs found for run group"});return}let a=OIe(o,i),s={...i,id:i.id??"local-run-group",createdAt:i.startedAt,runs:a};r.status(200).json(s);}catch(i){r.status(500).json({error:`Error loading run group: ${i.message}`});}}),e}function _Ie(t){let e=Oo__default.join(t,pn);if(!Bn__default.existsSync(e))return N.error("Run group metadata file not found"),null;try{let o=Bn__default.readFileSync(e,"utf-8");return fp.parse(JSON.parse(o))}catch(o){return N.error({err:o},"Error reading run group metadata"),null}}function OIe(t,e){let o=Bn__default.readdirSync(t).filter(r=>r.endsWith(".zip")).sort((r,i)=>{let a=Bn__default.statSync(Oo__default.join(t,r));return Bn__default.statSync(Oo__default.join(t,i)).mtime.getTime()-a.mtime.getTime()}),n=[];for(let r of o){let i=Oo__default.join(t,r),a=r.replace(/\.zip$/i,"");n.push(DIe(i,a,e));}return n}function DIe(t,e,o){let n=new z8(t),r=n.getEntry(pn);if(!r)throw new Error(`No entry found for file ${t}/${pn}`);try{let i=r.getData().toString("utf-8"),a=JSON.parse(i),s=aG.parse(a),l=LIe(n,t);return _K(s,e,{runGroupMetadata:o,runAttempts:l,organizationId:"local"})}catch(i){throw N.error({err:i,zipPath:t},`Error parsing ${pn} for run`),new Error(`Error parsing ${pn} for run ${t}`,{cause:i})}}var NIe=/^attempts\/(\d+)\/metadata\.json$/;function LIe(t,e){let o=[];for(let r of t.getEntries()){let i=NIe.exec(r.entryName);!i||!i[1]||o.push({index:parseInt(i[1],10),entry:r});}o.sort((r,i)=>r.index-i.index);let n=[];for(let{entry:r}of o){let i=kIe(r,e);!i||!i.id||n.push({id:i.id,status:i.status,startedAt:i.startedAt,finishedAt:i.finishedAt??null});}return n}function kIe(t,e){try{let o=t.getData().toString("utf-8");return rG.parse(JSON.parse(o))}catch(o){return N.warn({err:o,zipPath:e,entryName:t.entryName},"Skipping attempt metadata that failed to parse"),null}}function sY(t){let e=Router(),o=Oo__default.join(t,tr);return e.get("/:filename",(n,r)=>{let i=n.params.filename;if(!i||!i.endsWith(".zip")){r.status(404).send("Not found");return}let a=Oo__default.join(o,i),s=Oo__default.resolve(a),l=Oo__default.resolve(o);if(!s.startsWith(l)){r.status(403).send("Forbidden");return}if(!Bn__default.existsSync(a)){r.status(404).send("File not found");return}try{r.setHeader("Content-Type","application/zip"),r.setHeader("Content-Disposition",`attachment; filename="${i}"`);let c=Bn__default.readFileSync(a);r.send(c);}catch(c){r.status(500).send(`Error reading file: ${c.message}`);}}),e}function lY(t){let e=Router();return e.get("*",(o,n)=>{let r=o.path==="/"?Oo__default.join(t,"index.html"):Oo__default.join(t,o.path),i=Oo__default.resolve(r),a=Oo__default.resolve(t);if(!i.startsWith(a)){n.status(403).send("Forbidden");return}if(!Bn__default.existsSync(r)&&(r=Oo__default.join(t,"index.html"),!Bn__default.existsSync(r))){n.status(404).send("File not found");return}try{let s=Oo__default.extname(r).toLowerCase(),l=Zu[s]||"application/octet-stream";n.setHeader("Content-Type",l);let c=Bn__default.readFileSync(r);n.send(c);}catch(s){n.status(500).send(`Error reading file: ${s.message}`);}}),e}async function cY(t,e,o,n){$p(t);let r=o??await Ic(GE,"local-run-viewer-server"),i=Gae();i.use((s,l,c)=>{l.setHeader("Access-Control-Allow-Origin","*"),l.setHeader("Cache-Control","no-cache"),c();});let a=nY(t);return i.use("/api/runs",sY(e)),i.use("/api/run-group",iY(e)),i.use("/api/on-demand-screenshots",rY({apiClient:a,logger:t})),i.get("/knowledge/*",(s,l)=>{let c=a?.getAppUrl();if(!c){l.status(404).json({error:"App URL unavailable"});return}l.redirect(`${c}${s.originalUrl}`);}),n&&i.use("/",lY(n)),new Promise((s,l)=>{let c=i.listen(r,()=>{let u=`http://localhost:${r}`;ud(async()=>{await c.close();}),s({port:r,url:u});});c.on("error",u=>{l(u);});})}async function KN(t){let{logger:e,staticDir:o,resultsPath:n,runId:r,port:i}=t,a=Oo__default.resolve(n),s=Oo__default.join(a,tr),l;if(r){l=`${r.replace(/\.zip$/i,"")}.zip`;let u=Oo__default.join(s,l);if(!Bn__default.existsSync(u)){let d=[];if(Bn__default.existsSync(s))for(let m of Bn__default.readdirSync(s))m.endsWith(".zip")&&d.push(m.replace(/\.zip$/i,""));N.error(`Run not found: ${l} in ${s}`),d.length>0&&N.error(`Available runs: ${d.join(", ")}`),process.exit(1);}}Bn__default.existsSync(o)||(N.error(`Static frontend files not found at ${o}. Please ensure the CLI is properly built.`),process.exit(1));try{let u=(await cY(e,a,i,o)).url;N.info(`Run viewer running at ${u}`);let d=new URL(u);l&&d.searchParams.set("zipUrl",`${u}/api/runs/${l}`),await xTe(d.toString());}catch(c){N.error(`Failed to start run viewer: ${c.message}`),process.exit(1);}}function jIe(){let t=process.env.ANDROID_HOME;if(!t)return "adb";let e=process.platform==="win32"?"adb.exe":"adb";return Oo__default.join(t,"platform-tools",e)}async function hn(t,e){let{timeoutMs:o=5e3,serial:n,throwOnError:r=false,encoding:i="utf8"}=e,a=jIe(),s=n?["-s",n,...t]:t;return await new Promise((l,c)=>{execFile$1(a,s,{encoding:i,timeout:o,maxBuffer:1024*1024*20},(u,d)=>{if(u){if(r){c(u);return}l(void 0);return}l(d);});})}var mA=class t extends Xc{get capabilities(){return this.driver.capabilities}get sessionId(){return this.driver.sessionId}get sessionOptions(){let{hostname:e,port:o,protocol:n}=this.driver.options;return {hostname:e,port:o,protocol:n}}static async init(e){let o=await Xc.connectAppium(e);return new t(o)}async healthcheck(){await this.driver.execute("mobile: shell",{command:"echo",args:["ping"]});}};var YIe=12e4,Cy=3e5,uY=6e4,wy=2,XIe=1e3;async function dY(t){let{apiClient:e,logger:o,creationOpts:n,onStatusUpdate:r,logLevel:i,orgId:a,sessionId:s,onConnectionStateChange:l}=t,{token:c,webRtcUrl:u,adbUrl:d,apiUrl:m,name:p,apkDownloadUrl:f,region:h,resolvedTag:g,playwrightServerUrl:b}=await e.createAndroidEmulator({...n,hostname:hostname(),sessionId:s,playwrightVersion:MV}),y;try{execSync("adb --version"),y="adb";}catch{if(process.env.ANDROID_HOME)y=Oo__default.join(process.env.ANDROID_HOME,"platform-tools","adb");else throw new O("UserInfrastructureError","The ADB binary was not found in PATH and ANDROID_HOME is not set either")}o.info({creationOpts:n,emulatorName:p,apkToInstall:n.apkToInstall,region:h,apkDownloadUrl:f,sessionId:s,playwrightServerUrl:b},"Android instance creation ok");let T=n.apkToInstall?.channel,v=n.apkToInstall?.tag,E=await Qe.recordDuration({fn:async()=>await createInstanceClient$1({adbUrl:d,apiUrl:m,token:c,logLevel:i,adbPath:y}),name:"test_event_duration",tags:["name:limbar-client-creation","clientOs:android",`orgId:${a}`],timeoutMs:uY,timeoutMessage:`Timed out after ${uY}ms creating Limbar Android instance client for emulator ${p} after instance creation succeeded (region: ${h??"unknown"}, channel: ${T??"none"}, tag: ${v??"none"})`}),P;l&&(P=E.onConnectionStateChange(l));let M=["https://storage.googleapis.com/mobile-drivers/appium-uiautomator2-server-v10.2.1.apk","https://storage.googleapis.com/mobile-drivers/appium-uiautomator2-server-debug-androidTest-v10.2.1.apk","https://storage.googleapis.com/mobile-drivers/settings_apk-debug-v7.1.3.apk"];f&&M.push(f),r(`Installing APK${T?` with channel ${T}`:""}${v?` and tag ${v}`:""}`),await Qe.recordDuration({fn:async()=>{await Promise.all(M.map(_=>JIe({client:E,url:_,logger:o,emulatorName:p})));},name:"test_event_duration",tags:["name:limbar-asset-upload",`orgId:${a}`]}),r("Starting ADB tunnel");let I=await Qe.recordDuration({fn:async()=>await E.startAdbTunnel(),name:"test_event_duration",tags:["name:limbar-tunnel-connect",`orgId:${a}`]}),A=()=>{P?.(),I.close(),E.disconnect();},k;return b&&(r("Opening Playwright connection"),k=await Qe.recordDuration({fn:async()=>{let _=await _android.connect(b,{timeout:3e4});return o.info("Playwright connection opened"),_},name:"test_event_duration",tags:["name:playwright-device-connect",`orgId:${a}`]})),{adbPort:I.address.port,close:A,limbarToken:c,limbarUrl:u,limbarRegion:h,limbarTag:g,limbarOsVersion:n.osVersion,emulatorName:p,playwrightDevice:k,limbarClient:E}}async function JIe(t){let{client:e,url:o,logger:n,emulatorName:r}=t,i,a=Date.now();for(let s=1;s<=wy;s++){let l=Cy-(Date.now()-a);if(l<=0)break;let c=Math.min(YIe,l);try{await re(e.sendAsset(o,c),{milliseconds:c,message:`Timed out after ${c}ms sending asset to emulator ${r}: ${o}`});return}catch(u){if(i=u,s===wy)break;let d=XIe*2**(s-1);if(Cy-(Date.now()-a)-d<=0)break;n.warn({url:o,err:u,emulatorName:r,attempt:s,maxAttempts:wy,backoffMs:d,attemptTimeoutMs:c,totalTimeoutMs:Cy},"Failed to send asset to Limbar client; retrying after backoff"),await Te(d);}}throw n.error({url:o,err:i,emulatorName:r,maxAttempts:wy,totalTimeoutMs:Cy},"Failed to send asset to Limbar client (no more retries)"),new O("InternalPlatformError",`Failed to upload APK asset to emulator ${r} after ${wy} attempt(s) within ${Cy}ms: ${i}`)}var ZIe=["If you see 'device offline' in ADB output, the emulator likely reset or crashed. Please start a new editor session by refreshing the page.","If Appium /status does not respond, the Appium server may not have started correctly. Please inspect the log output above for errors."];function mY(t,e){if(!t||!e)return;let o=t.split(/\r?\n/).map(n=>n.trim()).filter(n=>n.length>0);for(let n of o){if(n.startsWith("List of devices attached")||!n.startsWith(e))continue;let i=n.split(/\s+/)[1]?.toLowerCase();return i==="device"?"device":i==="offline"?"offline":i==="unauthorized"?"unauthorized":"unknown"}}function QIe(t){return t&&(/^\d{1,3}(\.\d{1,3}){3}:\d+$/.test(t)||/^localhost:\d+$/.test(t))?t:null}async function e_e(t){return {adbSerial:t,devices:await hn(["devices","-l"],{timeoutMs:2500}),state:t?await hn(["get-state"],{serial:t,timeoutMs:5e3}):void 0,bootCompleted:t?await hn(["shell","getprop","sys.boot_completed"],{serial:t,timeoutMs:5e3}):void 0}}async function t_e({logger:t,adbSerial:e,adbSnapshot:o,appiumLogHints:n,transportMode:r}){let i=mY(o.devices,e);if(!(i==="offline"||n.deviceOffline||n.instrumentationCrashed||n.uiAutomatorCrashed))return;let s=r==="tunneled"?QIe(e):void 0;if(t.warn({adbSerial:e,deviceState:i,appiumLogHints:n,transportMode:r},"Attempting best-effort recovery of Android transport"),r==="tunneled"&&s?(await hn(["start-server"],{timeoutMs:5e3}),await Te(500),await hn(["disconnect",s],{timeoutMs:5e3}),await Te(500),await hn(["connect",s],{timeoutMs:5e3}),await Te(500)):(await hn(["kill-server"],{timeoutMs:5e3}),await Te(500),await hn(["start-server"],{timeoutMs:5e3}),await Te(500),await hn(["reconnect","offline"],{timeoutMs:5e3}),await Te(500)),e){let l=await hn(["get-state"],{serial:e,timeoutMs:5e3});typeof l=="string"&&l.trim()==="device"&&(await hn(["shell","pm","clear","io.appium.uiautomator2.server"],{serial:e,timeoutMs:5e3}),await hn(["shell","pm","clear","io.appium.uiautomator2.server.test"],{serial:e,timeoutMs:5e3}));}}function pY({logger:t,onStatusUpdate:e,adbSerial:o,transportMode:n}){return async({err:r,attempt:i,appiumPort:a,appiumLogHints:s})=>{let l=r instanceof O?r:new O("UserInfrastructureError",J(r),{errOptions:{cause:r}}),c=await jN(a),u=await e_e(o),d=mY(u.devices,o);t.error({err:r,appiumPort:a,appiumStatus:c,adbSnapshot:u,adbDeviceState:d,appiumLogHints:s},"Failed to create Appium WebDriver session"),e(`Appium session creation failed: ${J(r)}`);let m=i===1&&(W6(r)||oA(r)||d==="offline"||s.instrumentationCrashed||s.deviceOffline);if(!m)throw N.error(`Failed to create Appium WebDriver session. Troubleshooting:
281
+ `);a(l),o==="warn"&&(n.lastWarn=l),e[o]({appium:true,logLine:l},"Appium log"),i.length=0;};return r.on("line",l=>{if(!l.trim()||QPe(l))return;let c;try{c=JSON.parse(l);}catch{}if(c!==void 0){s(),a(l);let u=c.level,d=c.message;typeof d=="string"&&(u==="error"?n.lastError=d:u==="warn"&&(n.lastWarn=d)),e[o]({appium:true,parsed:c},"Appium log");}else !/^\s/.test(l)&&i.length>0&&s(),i.push(l);}),new Promise(l=>{r.on("close",()=>{s(),l();});})}async function HN({logger:t,logLevel:e,appiumPort:o}){let n=Date.now(),r=spawn(process.execPath,[tIe,"--address","127.0.0.1","--port",`${o}`,"--relaxed-security","--log-format","json","--log-level",e],{stdio:["ignore","pipe","pipe"],env:process.env}),i={deviceOffline:false,instrumentationCrashed:false,uiAutomatorCrashed:false,nodeVersionUnsupported:false},a=[];r.stdout&&a.push(j6(r.stdout,t,"info",i)),r.stderr&&a.push(j6(r.stderr,t,"warn",i));let s=()=>re(Promise.all(a).then(()=>{}),{milliseconds:JPe,fallback:()=>{}});try{await rIe({appiumPort:o,child:r,appiumLogHints:i,waitForOutputFlush:s});}catch(l){throw await V6({child:r,logger:t}),l}return t.info({duration:Date.now()-n},"Started Appium server"),{close:()=>V6({child:r,logger:t}),appiumLogHints:i}}function W6(t){let e=J(t);return e.includes("/session")&&(e.toLowerCase().includes("timeout")||e.toLowerCase().includes("socket hang up"))}function oA(t){return t instanceof Error?t.message.includes("Could not find a driver for automationName")||t.message.includes("Multiple drivers claim support for the same automationName"):false}async function pIe(t,e){let o=new iIe(e);return await o.start(),dIe.createInterface({input:o}).on("line",r=>{t.info({wdio:true,logLine:r},"WebdriverIO log");}),()=>o.quit()}async function fIe(t){let e=Oo__default.join(tmpdir(),"momentic","wdio",randomUUID());mkdirSync(e,{recursive:true});let o=new Set,n=[],r=watch(e,async(i,a)=>{if(i!=="rename"||!a||o.has(a))return;o.add(a);let s=Oo__default.join(e,a.toString());if(!existsSync(s)){o.delete(a);return}try{let l=await pIe(t,s);n.push(l);}catch(l){o.delete(a),t.warn({err:l,fileName:a},"Failed to start forwarding logs from new WDIO log file");}});return {stop:async()=>{r.close(),await Promise.all(n.map(i=>i().catch(a=>{t.warn({err:a},"Failed to stop forwarding logs from WDIO log file");})));},logDir:e}}async function G6({logger:t,callbacks:e,logLevel:o,wdioOpts:n}){let{onStatusUpdate:r,onFailure:i}=e,a=Math.floor(Math.random()*1e4)+4e4,s=await Ic(a,"appium"),{close:l,appiumLogHints:c}=await HN({logger:t,logLevel:o,appiumPort:s}),u=async()=>{try{await l();}catch(p){t.warn({err:p},"Failed to close Appium server");}},{logDir:d,stop:m}=await fIe(t);for(let p=1;p<=2;p++)try{p>1&&r("Retrying Appium session");let f=Date.now(),h=await remote({connectionRetryTimeout:3e4,connectionRetryCount:0,...n,outputDir:d,hostname:"localhost",port:s,path:"/",protocol:"http",logLevel:o,transformRequest:hIe});return t.info({duration:Date.now()-f},"Created Wdio driver"),{driver:h,appiumServerClose:async()=>{await m(),await l();}}}catch(f){let h,g;try{let b=i?await i({err:f,attempt:p,appiumPort:s,appiumLogHints:c}):{shouldRetry:!1,recover:void 0};h=b.shouldRetry,g=b.recover;}catch(b){throw await m(),await u(),b}if(!h||p>=2)throw await m(),await u(),f;if(g)try{await g();}catch(b){t.warn({err:b},"Recovery failed before Appium restart");}await u(),{close:l,appiumLogHints:c}=await HN({logger:t,logLevel:o,appiumPort:s});}throw new Error("createWdioDriverWithRecovery: unexpected state")}function hIe(t){let e=new Headers(t.headers);return e.delete("connection"),e.delete("content-length"),{...t,headers:e}}function q6(t,e){let o=new Map;e.on("command",n=>{o.set(n.command,Date.now());}),e.on("result",n=>{let r=o.get(n.command);if(!r)return;let i=Date.now()-r;n.result instanceof Error?t.warn({err:n.result,command:n.command,args:n.body,durationMs:i},"Appium cmd failed"):i>1e4&&t.warn({command:n.command,args:n.body,durationMs:i},"Appium cmd took very long"),o.delete(n.command);});}var K6=1e4,gIe=15e3,bIe=15e3;function Y6(t,e,o,n){let{isTeardownRequested:r,onHeartbeatFailure:i,onHeartbeatRestored:a}=n||{},s=0,l=false,c,u,d=[];t.on("command",p=>{d.push(p.command);}),t.on("result",p=>{p.result instanceof Error||(u=Date.now());});async function m(){let p=gIe,f=Date.now()-(u??0);if(f>K6)try{if(await re(e(),{milliseconds:bIe}),l)return;s>0&&(o.info("Driver heartbeat restored"),a?.()),s=0;}catch(h){if(l){r?.()===true&&o.debug({err:h,recentCommands:d,teardownRequested:true},"Ignoring driver heartbeat failure during teardown");return}if(r?.()===true){o.debug({err:h,recentCommands:d,teardownRequested:true},"Ignoring driver heartbeat failure during teardown");return}s++;let g=h instanceof Error?h.message:`${h}`;if(o.warn({attempt:s,error:g,recentCommands:d},"Driver heartbeat failed"),s===3){let b="The driver appears unresponsive, indicating a possible emulator failure";o.error({err:h},b),N.error(b),i?.();}}else s>0&&(o.info("Driver heartbeat restored"),a?.()),s=0,p-=f;d=[],l||(c=setTimeout(()=>void m(),Math.max(p,K6)));}return m(),()=>{l=true,clearTimeout(c);}}var yIe=6e4,SIe=15e3,TIe=1e4;async function yf(t,e,o,n){let{maxAttempts:r=3,signal:i,slowThresholdMs:a=3e3,initialBackoffMs:s=3e3,backoffMultiplier:l=2,timeoutMs:c,attemptTimeoutMs:u,operationName:d}=o,m=u??TIe,p=c??Math.max(yIe,m),f=Date.now()+p,h;for(let g=0;g<r;g++){i?.throwIfAborted();let b=n?.reconnectingPromise?.();if(b){t.info("Waiting for reconnect to finish before attempt");let T=Date.now(),v=J6(f);try{await re(b,{milliseconds:v,signal:i,message:`${d} timed out after ${v}ms while waiting for Appium reconnect`});}catch(E){if(t.error({err:E},"Error while waiting for reconnect"),E instanceof Fa)throw E}finally{f+=Date.now()-T;}}else if(r>1&&g===r-1&&n?.tryReconnect){t.info({attempt:g+1,maxAttempts:r},`Attempting reconnect before final attempt ${g+1}`);let T=Date.now(),v=J6(f);try{await re(n.tryReconnect(t),{milliseconds:v,signal:i,message:`${d} timed out after ${v}ms while reconnecting to Appium`});}finally{f+=Date.now()-T;}}let y=Date.now();try{let T=Math.min(m,X6({deadlineMs:f,operationName:d,totalTimeoutMs:p})),v=await re(e(),{milliseconds:T,signal:i,message:T<m?`${d} timed out after ${p}ms`:`${d} attempt timed out after ${m}ms`}),E=Date.now()-y;return E>a&&t.warn({durationMs:E},`${d} took very long`),v}catch(T){if(i?.throwIfAborted(),T instanceof Error)h=T;else throw T;if(g===r-1)throw t.error({err:T,attempt:g+1,maxAttempts:r},`${d} failed on final attempt`),T;if(!EIe(T))throw t.error({err:T,attempt:g+1,maxAttempts:r},`${d} failed and does not look retryable`),T;let v=Math.min(1e4,s*Math.pow(l,g)),E=Math.min(v,X6({deadlineMs:f,operationName:d,totalTimeoutMs:p}));t.warn({err:T,attempt:g+1,maxAttempts:r,backoffMs:E},`${d} failed, sleeping ${E}ms for recovery`),await Te(E,i);}}throw h}function X6({deadlineMs:t,operationName:e,totalTimeoutMs:o}){let n=t-Date.now();if(n>0)return n;throw new Fa(`${e} timed out after ${o}ms`)}function J6(t){return Math.max(SIe,t-Date.now())}function EIe(t){return t instanceof Error?["socket hang up","read ECONNRESET","timeout","timed out","UND_ERR_HEADERS_TIMEOUT","ECONNREFUSED"].some(o=>t.message.includes(o)):false}var vIe="NATIVE_APP",Xc=class t{currentContext;driver;appiumClose;stopHeartbeat;initializationParams;reconnectingPromise;teardownRequested=false;beginClose(){if(!this.teardownRequested){this.teardownRequested=true;try{this.stopHeartbeat();}catch{}}}async close(){this.beginClose(),await this.closeCurrentDriver();}async closeCurrentDriver(){try{this.stopHeartbeat();}catch{}try{await this.appiumClose();}catch{}}startHeartbeat(e,o){return Y6(this.driver,()=>this.healthcheck(),e,{...o,isTeardownRequested:()=>this.teardownRequested,onHeartbeatFailure:()=>{this.teardownRequested||(o.onHeartbeatFailure?.(),this.reconnect(e).catch(n=>{this.teardownRequested||e.error({err:n},"Failed to reconnect after heartbeat failure");}));}})}constructor({logger:e,driver:o,appiumClose:n,callbacks:r,initializationParams:i}){this.initializationParams=i,this.driver=o,this.appiumClose=n,this.stopHeartbeat=this.startHeartbeat(e,r);}static async connectAppium(e){let{logger:o}=e,{driver:n,appiumServerClose:r}=await G6(e);return q6(o,n),{...e,driver:n,appiumClose:r,initializationParams:e}}async executeInNativeContext(e,o,n){return this.executeInContext(e,vIe,o,n)}async reconnect(e){if(!this.teardownRequested){if(e.info("Attempting to reconnect to Appium"),this.reconnectingPromise)return this.reconnectingPromise;this.reconnectingPromise=(async()=>{try{await this.closeCurrentDriver();}catch(i){e.error({err:i},"Error while closing Appium during reconnect");}if(this.teardownRequested||(this.initializationParams.callbacks.restartWda&&await this.initializationParams.callbacks.restartWda(e),this.teardownRequested))return;let{driver:o,appiumClose:n,callbacks:r}=await t.connectAppium(this.initializationParams);if(this.teardownRequested){try{await n();}catch{}return}this.currentContext=void 0,this.driver=o,this.appiumClose=n,this.stopHeartbeat=this.startHeartbeat(e,r);})();try{await this.reconnectingPromise;}finally{this.reconnectingPromise=void 0;}}}async executeInContext(e,o,n,r){return yf(e,async()=>(this.currentContext!==o&&(e.info({from:this.currentContext,to:o},"Switching Appium context"),this.currentContext=void 0,await this.driver.switchContext(o),this.currentContext=o),await n(this.driver)),r,{reconnectingPromise:()=>this.reconnectingPromise,tryReconnect:async a=>{await this.reconnect(a);}})}};function Sf({containerBounds:t,viewport:e,defaultThresholdPercent:o}){let n=e.width*e.height;if(n<=0)return o;let r=Z6({start:t.left,size:t.width,maxSize:e.width}),i=Z6({start:t.top,size:t.height,maxSize:e.height});if(r<=0||i<=0)return o;let a=Math.min(r*i/n,1);return o*a}function nA({currentPixelDelta:t,baseDirection:e,correctionDirection:o,correctionPixels:n}){let r=Math.abs(t),i;o===e?i=r+n:i=Math.max(0,r-n);let a;return t===0?a=e==="down"?1:-1:a=Math.sign(t),a*i}function js({containerBounds:t,containerInsetRatio:e}){let o=t.height*e;return t.height-2*o}function rA({viewportTop:t,viewportBottom:e,elementHeight:o,targetTopRatio:n}){let r=Math.max(1,e-t),i=t+r*n,a=Math.max(t,e-o);return Math.max(t,Math.min(i,a))}function Z6({start:t,size:e,maxSize:o}){let n=t+e;return Math.max(0,Math.min(n,o)-Math.max(t,0))}function Q6(t){return t?.position?{...t,position:void 0}:t}function CIe(t){return t?.map(e=>({...e,requirements:Q6(e.requirements)}))}function iA(t){return {...t,requirements:Q6(t.requirements),requiredRelatedElements:CIe(t.requiredRelatedElements)}}function aA(t){let{tracer:e,span:o,screenshot:n,emulatorState:r,logger:i}=t;if(e.storeTraceAsset)try{let a=randomUUID$1();e.storeTraceAsset({snapshotId:a,data:Buffer.from(n,"base64"),extension:"png"}),o.screenshotSnapshotId=a;let s=randomUUID$1();e.storeTraceAsset({snapshotId:s,data:Buffer.from(r),extension:"xml"}),o.emulatorStateSnapshotId=s;}catch(a){i.debug({err:a},"Failed to store extraction trace assets");}}function sA(t){let{tracer:e,goldenScreenshotBase64:o,currentScreenshotBase64:n,diffScreenshotBase64:r,logger:i}=t,a=e.storeTraceAsset;if(!a)return {};let s=l=>{if(!l)return;let c=randomUUID$1();return a({snapshotId:c,data:Buffer.from(l,"base64"),extension:"png"}),c};try{return {goldenScreenshotSnapshotId:s(o),currentScreenshotSnapshotId:s(n),diffScreenshotSnapshotId:s(r)}}catch(l){return i.debug({err:l},"Failed to store visual diff trace assets"),{}}}function lA(t){let{tracer:e}=t;return e.startSpan("VISUAL_DIFF",o=>{let n=AIe(t);return o.result={created:n.output.created,success:n.success,message:n.message},n})}function AIe({goldenStorage:t,command:e,currentScreenshotBase64:o,threshold:n,updateGoldenFiles:r,tracer:i,logger:a}){let s=t.compareOrCreate({goldenPath:e.path,currentScreenshotBase64:o,pixelThreshold:n,updateGoldenFiles:r,logger:a}),l=t.resolveGoldenPath(e.path);if(s.created){let d=sA({tracer:i,goldenScreenshotBase64:s.goldenScreenshotBase64,currentScreenshotBase64:o,logger:a});return {success:true,message:`Saved golden screenshot to ${l}.`,output:{created:true,goldenPath:l,threshold:n,goldenScreenshotBase64:s.goldenScreenshotBase64,currentScreenshotBase64:o,...d}}}if(s.dimensionMismatch){let d=`${s.currentDimensions.width}x${s.currentDimensions.height}`,m=`${s.goldenDimensions.width}x${s.goldenDimensions.height}`,p=sA({tracer:i,goldenScreenshotBase64:s.goldenScreenshotBase64,currentScreenshotBase64:o,logger:a});return {success:false,message:`Current screenshot (${d}) does not match golden dimensions (${m}).`,output:{created:false,goldenPath:l,threshold:n,goldenScreenshotBase64:s.goldenScreenshotBase64,currentScreenshotBase64:o,diffPercent:s.diffPercent,pass:false,dimensionMismatch:true,...p}}}let c=s.diffPercent<=n*100,u=sA({tracer:i,goldenScreenshotBase64:s.goldenScreenshotBase64,currentScreenshotBase64:o,diffScreenshotBase64:s.diffScreenshotBase64,logger:a});return {success:c,message:`Visual diff of ${s.diffPercent.toFixed(2)}% detected, which is ${c?"under":"over"} the threshold of ${n*100}%.`,output:{created:false,goldenPath:l,threshold:n,goldenScreenshotBase64:s.goldenScreenshotBase64,currentScreenshotBase64:o,diffScreenshotBase64:s.diffScreenshotBase64,diffPercent:s.diffPercent,pass:c,...u}}}function cA(t,e){return e.length*(t+50)+4e3}var RIe=["WebSocket was closed before the connection was","Intentional disconnect"];function Ey(t){return t instanceof Error&&RIe.some(e=>t.message.includes(e))}var WN=false,tY;try{let t=await import('@sentry/node'),e="production";t.init({dsn:"https://67a6ef469598f8880478f33863d05873@o4506426201800704.ingest.us.sentry.io/4510914396291072",environment:e,enabled:e!=="development",dist:"production",release:"mobile-cli@1.4.6",tracesSampleRate:0,skipOpenTelemetrySetup:!0,sendDefaultPii:!0,beforeSend(o,n){return Z3(n?.originalException)||cg(n?.originalException,Ye)||Ey(n?.originalException)||Q3(n?.originalException)?null:o}}),kq(t.captureException),tY=o=>{if(!o){t.setUser(null);return}t.setUser({id:o.userId,organizationId:o.orgId,...o.email&&{email:o.email}});},WN=!0;}catch{}var oY=t=>tY?.(t);var xIe="https://api.momentic.ai";function nY(t){let e=process.env.MOMENTIC_API_KEY??Gw();if(!e)return;let o=(process.env.MOMENTIC_SERVER??qw()??xIe).replace(/\/+$/,"");return new on({apiKey:e,baseUrl:o,logger:t,mode:"runner",runner:"run-viewer"})}function rY({apiClient:t,logger:e}){let o=Router();return o.get("/:id",async(n,r)=>{let{id:i}=n.params;if(!i){r.status(400).json({error:"Missing screenshot ID"});return}if(!t){r.status(401).json({error:"Missing Momentic API key"});return}try{let{data:a,contentType:s}=await t.fetchOnDemandScreenshot(i);r.setHeader("Content-Type",s),r.send(a);}catch(a){e.error({err:a,screenshotId:i},"Failed to proxy on-demand screenshot"),r.status(502).json({error:"Failed to fetch screenshot"});}}),o}function iY(t){let e=Router(),o=Oo__default.join(t,tr);return e.get("/",async(n,r)=>{try{let i=_Ie(t);if(!i){r.status(404).json({error:"No run group found"});return}if(!Bn__default.existsSync(o)){r.status(404).json({error:"No runs found for run group"});return}let a=OIe(o,i),s={...i,id:i.id??"local-run-group",createdAt:i.startedAt,runs:a};r.status(200).json(s);}catch(i){r.status(500).json({error:`Error loading run group: ${i.message}`});}}),e}function _Ie(t){let e=Oo__default.join(t,pn);if(!Bn__default.existsSync(e))return N.error("Run group metadata file not found"),null;try{let o=Bn__default.readFileSync(e,"utf-8");return fp.parse(JSON.parse(o))}catch(o){return N.error({err:o},"Error reading run group metadata"),null}}function OIe(t,e){let o=Bn__default.readdirSync(t).filter(r=>r.endsWith(".zip")).sort((r,i)=>{let a=Bn__default.statSync(Oo__default.join(t,r));return Bn__default.statSync(Oo__default.join(t,i)).mtime.getTime()-a.mtime.getTime()}),n=[];for(let r of o){let i=Oo__default.join(t,r),a=r.replace(/\.zip$/i,"");n.push(DIe(i,a,e));}return n}function DIe(t,e,o){let n=new z8(t),r=n.getEntry(pn);if(!r)throw new Error(`No entry found for file ${t}/${pn}`);try{let i=r.getData().toString("utf-8"),a=JSON.parse(i),s=aG.parse(a),l=LIe(n,t);return _K(s,e,{runGroupMetadata:o,runAttempts:l,organizationId:"local"})}catch(i){throw N.error({err:i,zipPath:t},`Error parsing ${pn} for run`),new Error(`Error parsing ${pn} for run ${t}`,{cause:i})}}var NIe=/^attempts\/(\d+)\/metadata\.json$/;function LIe(t,e){let o=[];for(let r of t.getEntries()){let i=NIe.exec(r.entryName);!i||!i[1]||o.push({index:parseInt(i[1],10),entry:r});}o.sort((r,i)=>r.index-i.index);let n=[];for(let{entry:r}of o){let i=kIe(r,e);!i||!i.id||n.push({id:i.id,status:i.status,startedAt:i.startedAt,finishedAt:i.finishedAt??null});}return n}function kIe(t,e){try{let o=t.getData().toString("utf-8");return rG.parse(JSON.parse(o))}catch(o){return N.warn({err:o,zipPath:e,entryName:t.entryName},"Skipping attempt metadata that failed to parse"),null}}function sY(t){let e=Router(),o=Oo__default.join(t,tr);return e.get("/:filename",(n,r)=>{let i=n.params.filename;if(!i||!i.endsWith(".zip")){r.status(404).send("Not found");return}let a=Oo__default.join(o,i),s=Oo__default.resolve(a),l=Oo__default.resolve(o);if(!s.startsWith(l)){r.status(403).send("Forbidden");return}if(!Bn__default.existsSync(a)){r.status(404).send("File not found");return}try{r.setHeader("Content-Type","application/zip"),r.setHeader("Content-Disposition",`attachment; filename="${i}"`);let c=Bn__default.readFileSync(a);r.send(c);}catch(c){r.status(500).send(`Error reading file: ${c.message}`);}}),e}function lY(t){let e=Router();return e.get("*",(o,n)=>{let r=o.path==="/"?Oo__default.join(t,"index.html"):Oo__default.join(t,o.path),i=Oo__default.resolve(r),a=Oo__default.resolve(t);if(!i.startsWith(a)){n.status(403).send("Forbidden");return}if(!Bn__default.existsSync(r)&&(r=Oo__default.join(t,"index.html"),!Bn__default.existsSync(r))){n.status(404).send("File not found");return}try{let s=Oo__default.extname(r).toLowerCase(),l=Zu[s]||"application/octet-stream";n.setHeader("Content-Type",l);let c=Bn__default.readFileSync(r);n.send(c);}catch(s){n.status(500).send(`Error reading file: ${s.message}`);}}),e}async function cY(t,e,o,n){$p(t);let r=o??await Ic(GE,"local-run-viewer-server"),i=Gae();i.use((s,l,c)=>{l.setHeader("Access-Control-Allow-Origin","*"),l.setHeader("Cache-Control","no-cache"),c();});let a=nY(t);return i.use("/api/runs",sY(e)),i.use("/api/run-group",iY(e)),i.use("/api/on-demand-screenshots",rY({apiClient:a,logger:t})),i.get("/knowledge/*",(s,l)=>{let c=a?.getAppUrl();if(!c){l.status(404).json({error:"App URL unavailable"});return}l.redirect(`${c}${s.originalUrl}`);}),n&&i.use("/",lY(n)),new Promise((s,l)=>{let c=i.listen(r,()=>{let u=`http://localhost:${r}`;ud(async()=>{await c.close();}),s({port:r,url:u});});c.on("error",u=>{l(u);});})}async function KN(t){let{logger:e,staticDir:o,resultsPath:n,runId:r,port:i}=t,a=Oo__default.resolve(n),s=Oo__default.join(a,tr),l;if(r){l=`${r.replace(/\.zip$/i,"")}.zip`;let u=Oo__default.join(s,l);if(!Bn__default.existsSync(u)){let d=[];if(Bn__default.existsSync(s))for(let m of Bn__default.readdirSync(s))m.endsWith(".zip")&&d.push(m.replace(/\.zip$/i,""));N.error(`Run not found: ${l} in ${s}`),d.length>0&&N.error(`Available runs: ${d.join(", ")}`),process.exit(1);}}Bn__default.existsSync(o)||(N.error(`Static frontend files not found at ${o}. Please ensure the CLI is properly built.`),process.exit(1));try{let u=(await cY(e,a,i,o)).url;N.info(`Run viewer running at ${u}`);let d=new URL(u);l&&d.searchParams.set("zipUrl",`${u}/api/runs/${l}`),await xTe(d.toString());}catch(c){N.error(`Failed to start run viewer: ${c.message}`),process.exit(1);}}function jIe(){let t=process.env.ANDROID_HOME;if(!t)return "adb";let e=process.platform==="win32"?"adb.exe":"adb";return Oo__default.join(t,"platform-tools",e)}async function hn(t,e){let{timeoutMs:o=5e3,serial:n,throwOnError:r=false,encoding:i="utf8"}=e,a=jIe(),s=n?["-s",n,...t]:t;return await new Promise((l,c)=>{execFile$1(a,s,{encoding:i,timeout:o,maxBuffer:1024*1024*20},(u,d)=>{if(u){if(r){c(u);return}l(void 0);return}l(d);});})}var mA=class t extends Xc{get capabilities(){return this.driver.capabilities}get sessionId(){return this.driver.sessionId}get sessionOptions(){let{hostname:e,port:o,protocol:n}=this.driver.options;return {hostname:e,port:o,protocol:n}}static async init(e){let o=await Xc.connectAppium(e);return new t(o)}async healthcheck(){await this.driver.execute("mobile: shell",{command:"echo",args:["ping"]});}};var YIe=12e4,Cy=3e5,uY=6e4,wy=2,XIe=1e3;async function dY(t){let{apiClient:e,logger:o,creationOpts:n,onStatusUpdate:r,logLevel:i,orgId:a,sessionId:s,onConnectionStateChange:l}=t,{token:c,webRtcUrl:u,adbUrl:d,apiUrl:m,name:p,apkDownloadUrl:f,region:h,resolvedTag:g,playwrightServerUrl:b}=await e.createAndroidEmulator({...n,hostname:hostname(),sessionId:s,playwrightVersion:MV}),y;try{execSync("adb --version"),y="adb";}catch{if(process.env.ANDROID_HOME)y=Oo__default.join(process.env.ANDROID_HOME,"platform-tools","adb");else throw new O("UserInfrastructureError","The ADB binary was not found in PATH and ANDROID_HOME is not set either")}o.info({creationOpts:n,emulatorName:p,apkToInstall:n.apkToInstall,region:h,apkDownloadUrl:f,sessionId:s,playwrightServerUrl:b},"Android instance creation ok");let T=n.apkToInstall?.channel,v=n.apkToInstall?.tag,E=await Qe.recordDuration({fn:async()=>await createInstanceClient$1({adbUrl:d,apiUrl:m,token:c,logLevel:i,adbPath:y}),name:"test_event_duration",tags:["name:limbar-client-creation","clientOs:android",`orgId:${a}`],timeoutMs:uY,timeoutMessage:`Timed out after ${uY}ms creating Limbar Android instance client for emulator ${p} after instance creation succeeded (region: ${h??"unknown"}, channel: ${T??"none"}, tag: ${v??"none"})`}),P;l&&(P=E.onConnectionStateChange(l));let M=["https://storage.googleapis.com/mobile-drivers/appium-uiautomator2-server-v10.2.1.apk","https://storage.googleapis.com/mobile-drivers/appium-uiautomator2-server-debug-androidTest-v10.2.1.apk","https://storage.googleapis.com/mobile-drivers/settings_apk-debug-v7.1.3.apk"];f&&M.push(f),r(`Installing APK${T?` with channel ${T}`:""}${v?` and tag ${v}`:""}`),await Qe.recordDuration({fn:async()=>{await Promise.all(M.map(_=>JIe({client:E,url:_,logger:o,emulatorName:p})));},name:"test_event_duration",tags:["name:limbar-asset-upload",`orgId:${a}`]}),r("Starting ADB tunnel");let I=await Qe.recordDuration({fn:async()=>await E.startAdbTunnel(),name:"test_event_duration",tags:["name:limbar-tunnel-connect",`orgId:${a}`]}),A=()=>{P?.(),I.close(),E.disconnect();},k;return b&&(r("Opening Playwright connection"),k=await Qe.recordDuration({fn:async()=>{let _=await _android.connect(b,{timeout:3e4});return o.info("Playwright connection opened"),_},name:"test_event_duration",tags:["name:playwright-device-connect",`orgId:${a}`]})),{adbPort:I.address.port,close:A,limbarToken:c,limbarUrl:u,limbarRegion:h,limbarTag:g,limbarOsVersion:n.osVersion,emulatorName:p,playwrightDevice:k,limbarClient:E}}async function JIe(t){let{client:e,url:o,logger:n,emulatorName:r}=t,i,a=Date.now();for(let s=1;s<=wy;s++){let l=Cy-(Date.now()-a);if(l<=0)break;let c=Math.min(YIe,l);try{await re(e.sendAsset(o,c),{milliseconds:c,message:`Timed out after ${c}ms sending asset to emulator ${r}: ${o}`});return}catch(u){if(i=u,s===wy)break;let d=XIe*2**(s-1);if(Cy-(Date.now()-a)-d<=0)break;n.warn({url:o,err:u,emulatorName:r,attempt:s,maxAttempts:wy,backoffMs:d,attemptTimeoutMs:c,totalTimeoutMs:Cy},"Failed to send asset to Limbar client; retrying after backoff"),await Te(d);}}throw n.error({url:o,err:i,emulatorName:r,maxAttempts:wy,totalTimeoutMs:Cy},"Failed to send asset to Limbar client (no more retries)"),new O("InternalPlatformError",`Failed to upload APK asset to emulator ${r} after ${wy} attempt(s) within ${Cy}ms: ${i}`)}var ZIe=["If you see 'device offline' in ADB output, the emulator likely reset or crashed. Please start a new editor session by refreshing the page.","If Appium /status does not respond, the Appium server may not have started correctly. Please inspect the log output above for errors."];function mY(t,e){if(!t||!e)return;let o=t.split(/\r?\n/).map(n=>n.trim()).filter(n=>n.length>0);for(let n of o){if(n.startsWith("List of devices attached")||!n.startsWith(e))continue;let i=n.split(/\s+/)[1]?.toLowerCase();return i==="device"?"device":i==="offline"?"offline":i==="unauthorized"?"unauthorized":"unknown"}}function QIe(t){return t&&(/^\d{1,3}(\.\d{1,3}){3}:\d+$/.test(t)||/^localhost:\d+$/.test(t))?t:null}async function e_e(t){return {adbSerial:t,devices:await hn(["devices","-l"],{timeoutMs:2500}),state:t?await hn(["get-state"],{serial:t,timeoutMs:5e3}):void 0,bootCompleted:t?await hn(["shell","getprop","sys.boot_completed"],{serial:t,timeoutMs:5e3}):void 0}}async function t_e({logger:t,adbSerial:e,adbSnapshot:o,appiumLogHints:n,transportMode:r}){let i=mY(o.devices,e);if(!(i==="offline"||n.deviceOffline||n.instrumentationCrashed||n.uiAutomatorCrashed))return;let s=r==="tunneled"?QIe(e):void 0;if(t.warn({adbSerial:e,deviceState:i,appiumLogHints:n,transportMode:r},"Attempting best-effort recovery of Android transport"),r==="tunneled"&&s?(await hn(["start-server"],{timeoutMs:5e3}),await Te(500),await hn(["disconnect",s],{timeoutMs:5e3}),await Te(500),await hn(["connect",s],{timeoutMs:5e3}),await Te(500)):(await hn(["kill-server"],{timeoutMs:5e3}),await Te(500),await hn(["start-server"],{timeoutMs:5e3}),await Te(500),await hn(["reconnect","offline"],{timeoutMs:5e3}),await Te(500)),e){let l=await hn(["get-state"],{serial:e,timeoutMs:5e3});typeof l=="string"&&l.trim()==="device"&&(await hn(["shell","pm","clear","io.appium.uiautomator2.server"],{serial:e,timeoutMs:5e3}),await hn(["shell","pm","clear","io.appium.uiautomator2.server.test"],{serial:e,timeoutMs:5e3}));}}function pY({logger:t,onStatusUpdate:e,adbSerial:o,transportMode:n}){return async({err:r,attempt:i,appiumPort:a,appiumLogHints:s})=>{let l=r instanceof O?r:new O("UserInfrastructureError",J(r),{errOptions:{cause:r}}),c=await jN(a),u=await e_e(o),d=mY(u.devices,o);t.error({err:r,appiumPort:a,appiumStatus:c,adbSnapshot:u,adbDeviceState:d,appiumLogHints:s},"Failed to create Appium WebDriver session"),e(`Appium session creation failed: ${J(r)}`);let m=i===1&&(W6(r)||oA(r)||d==="offline"||s.instrumentationCrashed||s.deviceOffline);if(!m)throw N.error(`Failed to create Appium WebDriver session. Troubleshooting:
282
282
  - ${ZIe.join(`
283
283
  - `)}`),l;return {shouldRetry:m,recover:()=>t_e({logger:t,adbSerial:o,adbSnapshot:u,appiumLogHints:s,transportMode:n})}}}var fY=5e3;async function vf({callbacks:t,creationOpts:e,apiClient:o,logger:n,driverLogLevel:r,socket:i,orgId:a,sessionId:s,emulatorSettings:l}){let c=Date.now();n.info("Starting android driver creation");let u=[],d,m,p;if("avdId"in e)p=e;else {p=await dY({apiClient:o,logger:n,creationOpts:e,onStatusUpdate:t.onStatusUpdate,orgId:a,sessionId:s,onConnectionStateChange:t.onLimbarConnectionStateChange});let g=p.emulatorName,b=p.close;m=async()=>o.deleteAndroidEmulator(g),u.push(b),n=n.child({emulatorName:g}),(async()=>{try{let[y,T]=await Promise.allSettled([Fp("limserver-1.limrun.net"),Fp("125.253.92.199")]);n.info({limserver:y.status==="fulfilled"?y.value:y.reason,ip125:T.status==="fulfilled"?T.value:T.reason},"Limbar network diagnostics");}catch(y){n.warn({err:y},"Failed to run network diagnostics");}})();}let f=async()=>{let g=u.toReversed();m&&(g.push(m),m=void 0),d?.beginClose();let b=g.map(y=>Promise.resolve(y()).catch(T=>{md(T)||n.warn({err:T},"Error running cleanup task");}));try{await re(Promise.allSettled(b),{milliseconds:fY,message:`Android driver cleanup timed out after ${fY}ms`});}catch(y){n.warn({err:y},"Android driver cleanup timed out");}},h=async()=>{if(i&&!i.connected)throw await f(),new O("UserInfrastructureError","Client disconnected before Appium driver could be started, cleaning up...")};await h();try{let g=await i_e({logger:n,driverLogLevel:r,emulatorStart:c,emulatorCreationParams:p,apiClient:o,callbacks:t,creationOpts:e,orgId:a,sessionId:s,emulatorSettings:l}),b=g.driver;return d=b,u.push(g.appiumClose),await h(),{...p,...g,driver:b,cleanup:f}}catch(g){throw await f(),new O("UserInfrastructureError",`Failed to start Appium driver: ${g.message}`)}}async function i_e({logger:t,driverLogLevel:e="error",emulatorCreationParams:o,callbacks:n,creationOpts:r,emulatorSettings:i}){let a=[],{adbPort:s,emulatorName:l}=o,c,u="tunneled";if(!s){u="local";let h=0;for(;h<10;){let g=5555+Math.floor(Math.random()*30);if(g%2!==0&&(g=Math.min(g+1,5584)),await CC(g)&&await CC(g+1)){c=g,s=g+1;break}h+=1;}if(!s)throw new O("UserInfrastructureError",`Failed to find an available ADB port after ${h} attempts`)}l||(l=`emulator-${c}`,n.onStatusUpdate("Killing existing emulators"),await hY(t),a.push(()=>hY(t)),n.onStatusUpdate("Starting new emulator"));let d={platformName:"Android","appium:automationName":"UiAutomator2","appium:deviceName":"Android","appium:udid":`127.0.0.1:${s}`,"appium:adbExecTimeout":3e4,"appium:newCommandTimeout":3600,"appium:skipDeviceInitialization":true,"appium:skipServerInstallation":true,"appium:androidInstallTimeout":6e4,"appium:autoWebview":false,"appium:autoWebviewTimeout":0,"appium:clearDeviceLogsOnStart":true,"appium:ensureWebviewsHavePages":true,"appium:noReset":true,"appium:fullReset":false,"appium:dontStopAppOnReset":true,"appium:shouldTerminateApp":false,"appium:forceAppLaunch":false,"appium:skipUnlock":true,...i?.autoGrantPermissions!=null&&{"appium:autoGrantPermissions":i.autoGrantPermissions},...i?.locale!=null&&BE(i.locale)},m={capabilities:d,connectionRetryTimeout:3e4,connectionRetryCount:3};if("avdId"in o){d["appium:avd"]=o.avdId,d["appium:avdLaunchTimeout"]=18e4,d["appium:avdReadyTimeout"]=18e4,d["appium:skipDeviceInitialization"]=false,d["appium:skipServerInstallation"]=false,d["appium:udid"]=void 0;let h=a_e();d["appium:avdArgs"]=`-port ${c} -memory ${h} -no-snapshot-save -no-boot-anim -noaudio`,m.connectionRetryTimeout=12e4,m.connectionRetryCount=3;}let p=Ju in o?l:`127.0.0.1:${s}`,f=await mA.init({logger:t,callbacks:{...n,onFailure:pY({logger:t,onStatusUpdate:n.onStatusUpdate,adbSerial:p,transportMode:u})},logLevel:e,wdioOpts:m});try{if("avdId"in r){let y=r.apkFilePath?.trim();if(y){let T=Oo__default.resolve(y);if(!Bn__default.existsSync(T))throw new O("UserConfigurationError",`APK not found at path: ${T}`);n.onStatusUpdate("Installing local APK");let v=Date.now();try{await f.executeInNativeContext(t,E=>E.installApp(T),{operationName:"installApp"}),t.info({apkFilePath:T,installDurationMs:Date.now()-v},"Installed local APK");}catch(E){throw t.error({err:E,apkFilePath:T},"Failed to install local APK"),new O("UserConfigurationError",`Failed to install APK from ${T}: ${E.message}`)}}}let[h,g]=await Promise.all([hn(["shell","wm","size"],{serial:p,timeoutMs:5e3}),hn(["shell","wm","density"],{serial:p,timeoutMs:5e3}),f.executeInNativeContext(t,y=>y.updateSettings({enableMultiWindows:!0,waitForIdleTimeout:250,simpleBoundsCalculation:!0}),{operationName:"updateSettings"})]);return t.info({capabilities:d,emulatorName:l,viewport:{size:h?.trim(),density:g?.trim()}},"Started Appium driver"),{driver:f,appiumClose:async()=>{await f.close(),await Promise.all(a.map(y=>y()));},emulatorName:l,adbPort:s}}catch(h){throw t.error({err:h},"Failed to initialize emulator"),await f.close(),h}}async function hY(t){let n=(await hn(["devices"],{timeoutMs:5e3})??"").split(`
284
284
  `).map(r=>r.trim().split(/\s+/)[0]).filter(r=>!!r?.startsWith("emulator-"));await Promise.all(n.map(async r=>{t.info({emulatorName:r},"Killing emulator");let i=await hn(["emu","kill"],{serial:r,timeoutMs:5e3});i&&t.warn({emulatorName:r,killResult:i},"Failed to kill emulator, continuing...");}));}function a_e(){let t=Math.floor(totalmem()/1024/1024),e=Math.floor(t/4);return Math.max(2048,Math.min(4096,Math.floor(e/256)*256))}var c_e="If you do not have Java installed, please download the JDK 24 from https://www.oracle.com/java/technologies/downloads/, move it to your home directory, and then set the JAVA_HOME environment variable in your shell profile to the JDK path.",u_e="If you do not have Android Studio installed, please download it first from https://developer.android.com/studio and then follow all setup instructions in the Android Studio app.",d_e="Follow the instructions at https://developer.android.com/tools/variables to set the ANDROID_HOME environment variable.",yY="On Mac OS, the SDK is typically installed at /Users/<username>/Library/Android/sdk.",SY="On Windows, the SDK is typically installed at C:\\Users\\<username>\\AppData\\Local\\Android\\Sdk.";function m_e(){if(!process.env.JAVA_HOME)N.warn("JAVA_HOME is not set. Some Appium drivers and Android tools may not work as expected.");else {process.platform==="darwin"&&/\.jdk\/?$/.test(process.env.JAVA_HOME)&&N.warn("JAVA_HOME appears to point at a *.jdk bundle, which is incorrect. The correct path should be formatted like '<bundle>/Contents/Home'.");let e=((o,n)=>join(o,"bin",process.platform==="win32"?`${n}.exe`:n))(process.env.JAVA_HOME,"java");existsSync(e)||N.warn(`JAVA_HOME does not appear to point to a valid Java installation: expected the 'java' binary to exist at ${e}`);}try{execSync("java --version",{stdio:"pipe",encoding:"utf-8"})||N.warn(`Could not find a Java installation. Some Appium drivers and Android tools may not work as expected. ${c_e}`);}catch(t){N.warn(`Got error while checking if the Java JDK is installed: ${J(t)}`);}}function p_e(){process.env.ANDROID_HOME||N.warn(`The ANDROID_HOME environment variable is not set. Some Appium drivers and Android tools may not work as expected. ${d_e} ${platform()==="darwin"?yY:SY}`);}function f_e(){let t=process.env.ANDROID_HOME?`${process.env.ANDROID_HOME}/platform-tools/adb`:"adb";try{execSync(`${t} version`,{stdio:"pipe",encoding:"utf-8"})||N.warn(`Could not find the Android Debug Bridge (ADB) tool locally. Some Appium drivers and Android tools may not work as expected. This tool is included with Android Studio. ${u_e} Finally, ensure that the 'adb' command is available in your shell. ${platform()==="darwin"?yY:SY}`);}catch(e){N.warn(`Got error while checking if ADB is installed: ${J(e)}`);}}function TY(){m_e(),p_e(),f_e();}var S_e=100,T_e=2500,EY=4e3,E_e="\u2026",v_e=1e3;async function pA({driver:t,onLogs:e,logFilePath:o}){await t.execute("mobile: startLogsBroadcast");let n=o?Bn__default.createWriteStream(o,{flags:"a"}):void 0,r=[],i=()=>{r.length===0||!n||(n.write(r.join(`
@@ -5732,7 +5732,7 @@ ${t}`;case "ELEMENT_CHECK":return `${xJ}
5732
5732
  ${t}`;default:return t}}async function ya({frameConfig:t,action:e,browser:o}){let n=o.getActiveFrameConfig();t?o.setActiveFrameConfig(t):n?.type==="auto"&&o.setActiveFrameConfig(void 0);try{return await e()}finally{o.setActiveFrameConfig(n);}}var PNe=["NAVIGATE","NEW_TAB","CLOSE_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function IJ({beforeUrl:t,beforePages:e,browser:o,command:n,logger:r}){if(PNe.includes(n.type))return;await Wo().startAsyncSpan("AUTO_FOLLOW_NEW_TABS",async a=>{let c=("cache"in n&&n.cache&&"target"in n.cache?n.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??false?300:3e3,u=Date.now(),d=0;for(r.info({command:n.type,beforePages:e,beforeUrl:t,timeout:c},"Checking for new tabs to auto-follow");d===0||Date.now()-u<c;){await Te(250),d++;let m=(await o.getOpenPages()).map(f=>f.url),p=o.url();if(m.length!==e.length)for(let f=m.length-1;f>=e.length;f--){let h=m[f];if(Dc(h,r)&&h!==t&&h!==p){r.info({beforePages:e,afterPages:m,beforeUrl:t},"Auto-following new tab after preset action"),await o.switchToPage({type:"INDEX",index:String(f)}),a.result={followed:true};return}}}a.result={followed:false};});}async function nu(t,e={}){let o=await t.getBrowserState(e);return {serializedTree:o.serialize(e.serializationOpts),tree:o}}var _J=t=>!!t&&mm(t),OJ=t=>{let{cache:e,description:o,disableSecondaryCacheResolution:n,logger:r}=t,i=e,a=false,s;if(i&&n&&i.targetSource==="HEURISTIC_HEALED"&&(a=true,s="Heuristic healed cache incompatible",i=void 0),i){let l=i.inputDescription;(l?!MJ(o,l):!!o)&&(r.warn({old:i.inputDescription,new:o},"Target cache was generated with a different description, clearing it automatically"),a=true,s="Description changed",i=void 0);}return {cache:i,cacheBustedBeforeAction:a,cacheBustReason:s}};var NJ={minChunkTokenCount:1e4,acceptableChunkTokenCount:25e3,maxChunkTokenCount:5e4,maxLineLength:4e3},DJ=/<(\S+) id="(\d+)".*?>/g,INe=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,LJ=["h1","h2","section","footer","nav","aside","form","label","dialog"],_Ne=[...LJ,"span","div","h3"],ONe=["table","select","form","ul","ol","menu","pre","code","dialog"],DNe=["table","form","dialog","nav","section","ul","select"];function kJ(t){return NNe(t)}function NNe({logger:t,serializedTree:e,options:o}){let{minChunkTokenCount:n,acceptableChunkTokenCount:r,maxChunkTokenCount:i,maxLineLength:a}=o,s=[],l=e.split(`
5733
5733
  `),c=0,u=[],d=0,m=[],p=[],f=false;for(;c<l.length;){f&&(s.push({ids:m,content:u.join(`
5734
5734
  `),tokenLength:d}),u=[],d=0,m=p.length?[p[p.length-1].id]:[],f=false);let h=l[c],g=Jt(h);d+=g,h.length>a&&(h=h.slice(0,a));let T=Array.from(h.matchAll(DJ)).map(j=>j&&j.length>=3?{tagName:j[1],id:j[2]}:void 0).filter(j=>!!j),E=Array.from(h.matchAll(INe)).map(j=>j&&(j[2]||j[4])).filter(j=>!!j);E.reverse();let P=h.replace(/ id="[0-9]+"/g,"");u.push(P);for(let j of T)m.push(j.id),p.push(j);for(let j of E){let le=p[p.length-1];le&&le.tagName===j&&p.pop();}let M=p.some(j=>ONe.includes(j.tagName)),I=l[c+1]??"",A=Jt(I),_=Array.from(I.matchAll(DJ)).map(j=>j&&j.length>2?j[1]:void 0).filter(j=>!!j),H=_.some(j=>LJ.includes(j)),V=_.some(j=>_Ne.includes(j));d+A>=i&&(f=true),d>=n&&(H&&!M||E.some(j=>DNe.includes(j)))&&(f=true),d>=r&&V&&!M&&(f=true),c++;}return u.length&&s.push({ids:m,content:u.join(`
5735
- `),tokenLength:d}),s.forEach((h,g)=>{let b=h.ids[0],y=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:b,maxId:y},`Chunk for page filtering (index ${g+1}/${s.length})`);}),{chunks:s}}var FJ=5e6,kNe=1e5,FNe=3e4,BNe=6e4,UNe=1e5;async function Bd(t){let{fixtures:e}=t,{logger:o}=e,n=t.tree,r=t.serializedTree,i=Jt(r);if(i>FJ)throw new O("UserConfigurationError",`Page accessibility tree is too large for AI page filtering (${i} tokens). Maximum supported size is ${FJ} tokens.`);if(i>kNe){let a=kJ({serializedTree:r,options:NJ,logger:o}),s=randomUUID();n=await zNe({...t,chunks:a.chunks,callId:s}),r=n.serialize();let l=Jt(r);o.info({oldTokens:i,newTokens:l,langfuseCallId:s},"Filtered page using AI chunk ranking");}return r}async function zNe({type:t,callId:e,chunks:o,description:n,fixtures:r,tree:i}){let{generator:a,signal:s,logger:l}=r,c=await a.rankChunksWithAi({chunks:o,description:n,type:t,softTokenLimit:FNe,mediumTokenLimit:BNe,hardTokenLimit:UNe,callId:e},{abortSignal:s,logger:l,loggerTags:$e(l)}),u=[];return o.forEach((m,p)=>{c.indices.includes(p)&&(u=u.concat(m.ids));}),i.pruneUsingRelevantIds(new Set(u))}async function $L(t,e){if(!t.description)throw new O("UserConfigurationError","Cannot locate element with empty description");return ya({action:async()=>VNe(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function VNe(t,e){let{disableCache:o,testContext:n,filterByViewport:r,skipWait:i,source:a,memory:s,logger:l,allowNotActionableNodesOverride:c,allowIneligibleTagRedirect:u,showZeroOpacityElementsOverride:d,skipSavingVisualAttributes:m,isAutoHeal:p,cacheBustReason:f,acceptElementMovedError:h}=t,{orgId:g,browser:b,localCodeEvalTools:y,generator:T,abortSignal:v}=e,E=t.description,P=Wo(),M=t.useMemory&&!o;n&&(E=await kl({orgId:g,s:E,context:n,localTools:y,signal:v,logger:l})),a&&(E=PJ(E,a));let{serializedTree:I,tree:A}=await P.startAsyncSpan("GET_PAGE_STATE",async()=>nu(b,{allowNotActionableNodesOverride:c,allowIneligibleTagRedirect:u,showZeroOpacityElementsOverride:d,filterByViewport:r,abortSignal:v,skipWait:i,logger:l}),{}),k=await P.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let B,z=Date.now(),q;for(;!B&&Date.now()-z<3e3;){v.throwIfAborted();try{B=await b.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2});}catch(Q){q=Q;}}if(!B)throw new O("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${q?.message}`);return B}),_=I,H=false,j=`data:image/jpeg;base64,${k.toString("base64")}`,le=$e(l);_=await Bd({type:"locator",description:E,screenshot:j,serializedTree:I,tree:A,fixtures:{generator:T,signal:v,logger:l,orgId:g}}),_!==I&&(H=true);let Y=await P.startAsyncSpan("AI_LOCATOR_CALL",async B=>{p&&(B.attributes.isAutoHeal=true),f&&(B.attributes.cacheBustReason=f);let z=await T.getElementLocation({browserState:_,goal:E,screenshot:j,source:a,memory:M?s:void 0},{disableCache:o,abortSignal:v,logger:l,loggerTags:le,useMemory:M,cacheBustReason:f});if(B.result=z,M&&(B.attributes.useMemory=true,B.attributes.memoryTraces=z.rememberedTraces??[],z.updatedMemory&&(B.attributes.memorySavedNewResult=true)),P.storeTraceAsset){let q=randomUUID();P.storeTraceAsset({snapshotId:q,data:k}),B.screenshotSnapshotId=q;}return z});if(l.debug({usedRag:H,result:Y},"Got locator result"),!(Y.id>0))throw new ds(`Could not find any relevant element: ${Y.thoughts}`,Y.updatedMemory?{type:"GCS_TRACES",traces:Y.updatedMemory}:void 0);let{resolution:U,target:x,frameConfig:X}=await P.startAsyncSpan("TARGET_RESOLUTION",async B=>{let z=await b.createTargetFromA11yId({id:Y.id,requirements:Y.requirements,additionalElements:Y.additionalElements,description:E,targetSource:"AI",logger:l,skipSavingVisualAttributes:m,acceptElementMovedError:h});return B.result={serializedElement:z.target.nodeOnlySerializedHtml??"Unknown HTML element"},z});if(U.a11yNode?.properties?.hidden&&U.a11yNode?.properties?.hidden!=="false")throw new O("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: ${U.displayString}`);return M&&(Y.updatedMemory?x.memory={type:"GCS_TRACES",traces:Y.updatedMemory}:s&&(x.memory=s)),{thoughts:Y.thoughts,target:x,resolution:U,frameConfig:X,screenshot:j}}var jNe=15;async function DA({command:t,logger:e,fixtures:o,useMemory:n,maxRetries:r=jNe,recoveryHint:i}){if(!t.assertion.trim())throw new O("ActionFailureError","Assertion command is missing the assertion content");let a=oI.optional().catch(void 0).parse(t.source);t.source&&!a&&e.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let s=Wo();return s.startAsyncSpan("AI_ASSERTION_CALL",async l=>{let{browser:c}=o,u=t.timeout?t.timeout*1e3:c.smartWaitingTimeout,d=PK(u,r-1),m=0,p=Date.now(),f=p+u,h=p,g,b,y;try{await ya({action:()=>c.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:c,logger:e});}catch(E){e.warn({err:E},"Failed to clear highlights before AI check, continuing...");}for(;m<r;){o.abortSignal.throwIfAborted();let E=Date.now();if(m>0){if(E>=f)break;let I=f-E,A=h-E,k=Math.min(A,I);k>0&&await Te(k,o.abortSignal);}let P=Date.now();if(m>0&&P>=f)break;let M=false;try{if(g=await ya({action:async()=>{let A=await UJ(c,e,o.abortSignal);return b&&b.serializedTree===A.serializedTree&&b.screenshotBuff.equals(A.screenshotBuff)?(M=!0,g):(b=A,zJ({command:t,state:A,fixtures:o,useMemory:n,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:m,logger:e,source:a,recoveryHint:i}))},frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:e,browser:c}),g?.aiResult.result){g?.updatedMemory&&zb(t,g.updatedMemory,e);break}else throw g?.aiResult.thoughts?new O("AssertionFailureError",g.aiResult.thoughts):new O("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(I){o.abortSignal.throwIfAborted(),y=I instanceof Error?I:new Error(`${I}`),M?e.info(`AI check attempt ${m} failed (re-used previous result)`):e.info({err:I},`AI check assert attempt ${m} failed, retrying...`);}finally{m++,h=P+d;}}if(!g?.aiResult.result){let E=f-Date.now();E>0&&await Te(E,o.abortSignal);}if(!g?.aiResult.result)try{g=await ya({action:async()=>zJ({command:t,state:await UJ(c,e,o.abortSignal),fixtures:o,useMemory:n,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:m,logger:e,recoveryHint:i}),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:e,browser:c});}catch(E){o.abortSignal.throwIfAborted(),y=E instanceof Error?E:new Error(`${E}`);}finally{m++;}g?.updatedMemory&&zb(t,g.updatedMemory,e);let T=g?.afterScreenshotOverride;if(T&&s.storeTraceAsset){let E=randomUUID();s.storeTraceAsset({snapshotId:E,data:T}),l.screenshotSnapshotId=E;}let v=g?.elementScreenshotOverride;if(v&&s.storeTraceAsset){let E=randomUUID();s.storeTraceAsset({snapshotId:E,data:v}),l.elementScreenshotSnapshotId=E;}if(n&&(l.attributes.useMemory=true,l.attributes.memoryTraces=g?.aiResult.rememberedTraces??[],g?.updatedMemory&&(l.attributes.memorySavedNewResult=true)),!g?.aiResult.result){l.result=g?.aiResult??{thoughts:y?.message??"AI check failed after all attempts",result:false};let E=`AI check still failing after ${m} attempts.`;throw y&&(E+=` Latest result: ${y.message}`),new O("AssertionFailureError",E)}return l.result=g.aiResult,{...g,thoughts:g.aiResult.thoughts,succeedImmediately:false,urlAfterCommand:c.url()}})}async function UJ(t,e,o){await t.waitForPageLoad({signal:o});let[n,r]=await Promise.all([nu(t,{abortSignal:o,skipWait:true,skipWaitForPageLoad:true,logger:e}),t.screenshot({retries:1,respectActiveFrame:true})]);return {...n,screenshotBuff:r}}async function zJ({command:t,state:e,fixtures:o,useConsensus:n,useMemory:r,highlightElementsOnFailure:i,attemptNumber:a,source:s,logger:l,recoveryHint:c}){let {browser:u,generator:d,abortSignal:m}=o,{serializedTree:f,tree:h}=e,g=e.screenshotBuff,b=g.toString("base64"),y=u.url(),T=t.contextChoice??"MULTIMODAL",v=f;T!=="VISION_ONLY"&&(v=await Bd({type:"assertion",serializedTree:f,tree:h,description:t.assertion,screenshot:b,fixtures:{generator:d,signal:m,logger:l,orgId:o.orgId}}),v);let E={goal:t.assertion,url:y,memory:r?t.cache?.memory:void 0,browserState:v,screenshot:b,contextChoice:T,source:s,recoveryHint:c},M=await(T==="VISION_ONLY"?(A,k)=>d.getVisualAssertionResult(A,k):(A,k)=>d.getAssertionResult(A,k))(E,{useConsensus:n,attemptNumber:a,useMemory:r,disableCache:!!t.disableCache,abortSignal:m,logger:l,loggerTags:$e(l)}),I;if((M.result||i)&&M.relevantElements?.length){M.relevantElements.map(A=>u.getSerializedFormFromA11yId(A)).filter(A=>!!A);try{let A=M.relevantElements[0],{resolution:k}=await u.createTargetFromA11yId({id:A,description:null,targetSource:"AI",skipSaveToCache:!0});I=await u.screenshot({locator:k.locator,clearHighlights:!0,respectActiveFrame:!0});}catch(A){l.debug({err:A},"Failed to capture element screenshot for trace, continuing...");}await HNe(M.relevantElements,u,l);}return {aiResult:M,afterScreenshotOverride:g,elementScreenshotOverride:I,updatedMemory:r?M.updatedMemory:void 0}}async function HNe(t,e,o){let n=Date.now();for(let r of t){if(Date.now()-n>2e3){o.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await re(e.highlightA11yId(r),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}});}catch(i){o.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}async function VJ(t){let{command:e,logger:o,fixtures:n,disableCache:r}=t,{browser:i,generator:a,abortSignal:s}=n;if(!e.goal.trim())throw new O("ActionFailureError","Cannot perform AI extraction without goal");if(e.schema){let d=pp(e.schema);if(d)throw new O("UserConfigurationError",d)}let l=await i.getCondensedHtml(),c=await i.screenshot({retries:2}),u=Wo();try{return await u.startAsyncSpan("AI_EXTRACTION_CALL",async d=>{let m=await a.getTextExtraction({goal:e.goal,browserState:l,returnSchema:e.schema,screenshot:`data:image/jpeg;base64,${c.toString("base64")}`},{disableCache:r,abortSignal:s,loggerTags:$e(o)});if(d.result=m,WNe({tracer:u,span:d,screenshot:c,htmlState:l,logger:o}),m.result==="NOT_FOUND")throw new O("ActionFailureError","No relevant data found for extraction goal on this page");if(m.thoughts?.includes("MaxGenerationLengthExceededError"))throw new O("UserConfigurationError",m.thoughts);return {thoughts:m.thoughts||void 0,data:m.result,succeedImmediately:!1,urlAfterCommand:i.url()}})}catch(d){let m=J(d);throw m.includes("MaxGenerationLengthExceededError")?new O("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."):m.includes("AIProviderError")&&m.includes("time")?new O("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}}function WNe(t){let{tracer:e,span:o,screenshot:n,htmlState:r,logger:i}=t;if(e.storeTraceAsset)try{let a=randomUUID();e.storeTraceAsset({snapshotId:a,data:n}),o.screenshotSnapshotId=a;let s=randomUUID();e.storeTraceAsset({snapshotId:s,data:Buffer.from(r),extension:"html"}),o.browserStateSnapshotId=s;}catch(a){i.debug({err:a},"Failed to store extraction trace assets");}}async function jJ(t,e){let{logger:o}=t,{abortSignal:n,browser:r}=e,i=Date.now();try{await GNe(i,t,e);}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;o.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=r.smartWaitingTimeout-(Date.now()-i);s>0&&await Te(s,n);}finally{o.debug({durationMs:Date.now()-i},"AI smart waiting complete");}}async function GNe(t,e,o){let{abortSignal:n,browser:r}=o;if(r.smartWaitingTimeout<3e3){await Te(r.smartWaitingTimeout,n);return}if(!e.description)throw new O("UserConfigurationError","Cannot locate element with empty description");await re(qNe(t,e,o),{milliseconds:r.smartWaitingTimeout});}async function qNe(t,e,o){let{logger:n,iframeUrl:r}=e,{browser:i}=o;for(;Date.now()-t<i.smartWaitingTimeout;)if(await ya({action:async()=>KNe(e,o),frameConfig:r?{type:"url",url:r}:void 0,browser:i,logger:n}))return}async function KNe(t,e){let{testContext:o,logger:n}=t,{browser:r,abortSignal:i,localCodeEvalTools:a,orgId:s,generator:l}=e,c=t.description;o&&(c=await kl({orgId:s,s:c,context:o,localTools:a,signal:i,logger:n})),i.throwIfAborted();let u;try{u=await r.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2});}catch(f){throw new O("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${f instanceof Error?f.message:f}`)}let m=`data:image/jpeg;base64,${u.toString("base64")}`;i.throwIfAborted();let p=await l.getSmartWaitingDecision({description:c,screenshot:m},{abortSignal:i,loggerTags:$e(n)});return n.debug({result:p},"Got smart waiting result"),p.isPageReady}var YNe=3e4;async function GJ(t){return Wo().startAsyncSpan("ELEMENT_ASSERTION",async o=>XNe(t,o),{name:"Element check"})}async function XNe(t,e){let{command:o,timeoutMs:n,fixtures:r,disableCache:i}=t,{abortSignal:a}=r,s=()=>sP(o.cache)?o.cache:void 0,l=s(),c=!i&&!!l?.target&&mm(l.target),u=cloneDeep(l),d=(v=false)=>{if(l=s(),!!l)if(v){let E=uK(u,l);l.target=E.target,l.updatedAt=E.updatedAt;}else {if(!u){l=void 0;return}l.target=u.target,l.updatedAt=u.updatedAt;}},m=Date.now(),p=c?Math.max(n/10,YNe):0,f=m,h=0,g,b=500,y=false;for(;h<2||Date.now()-m<n;){h++,h>1&&await Te(b,a),a?.throwIfAborted(),l=s();let v=h===1,E=c&&Date.now()-f>=p;E&&(f=Date.now());let{result:P,elementWasFound:M}=await HJ({cacheToUse:l,skipAISmartWaiting:!v,useAIIfCacheFails:!c||E,params:t});if(g=P,y=y||M,P.success)break;d(),b=Math.min(b*1.25,1e4);}if(!g)throw new O("InternalPlatformError",`Failed to evaluate manual element assertion in ${n}ms.`);if(a?.throwIfAborted(),!g.success){let v=s(),E=v?.target?.memory?{target:{id:-1,memory:v.target.memory}}:void 0,{result:P,elementWasFound:M}=await HJ({cacheToUse:E,skipAISmartWaiting:true,useAIIfCacheFails:true,params:t});g=P,y=y||M,g.success||d(true);}let T=s();return g.success&&T?.target&&!y&&(T.target=cD(T.target),T.updatedAt=new Date),e.result={success:g.success,message:g.err?.message},g}async function HJ({cacheToUse:t,skipAISmartWaiting:e,useAIIfCacheFails:o,params:n}){let{command:r,disableCache:i,fixtures:a,tracer:s,targetingWrapper:l}=n,{logger:c}=a;if(r.target&&!al(r.target))throw new Error("Element assertion with x/y is not supported yet");let u=jp(r.assertion),d=JNe(r.assertion),m,p=false,f=cloneDeep(t);try{let{elementInteractedDisplayString:h,result:g,thoughts:b}=await l({tracer:s,command:r,target:r.target,cache:f?.target,action:async y=>ZNe(y.locator,n),options:{...r,allowNotActionableNodesOverride:d,allowIneligibleTagRedirect:d,showZeroOpacityElementsOverride:!0,disableCache:i,memory:f?.target?.memory,disableGlobalLocatorRedirect:!0,source:fg(r),skipAISmartWaiting:e,targetName:"target"},retriesWithAI:o?1:0});return m={success:g.success,data:g.data,err:g.err,elementInteractedDisplayString:h,thoughts:b},p=!0,g.success||(c.warn({aiThoughts:b,elementString:h,err:g.err},"Element check found an element but failed"),m={...g,thoughts:b}),{result:m,elementWasFound:p}}catch(h){if(u)return m={success:true,thoughts:`The element described does not exist on the page: ${h.message}`,err:void 0,data:void 0},{result:m,elementWasFound:p};if(!(h instanceof O)||h.reason!="ActionFailureError")throw h;return m={success:false,err:h,data:void 0,thoughts:void 0},c.warn({err:h},"Element check did not find an element and failed"),{result:m,elementWasFound:p}}}function JNe(t){return !(t.type==="ELEMENT_EXISTENCE"&&t.condition==="VISIBLE"&&!t.negated)}async function ZNe(t,{command:e,fixtures:o}){return await o.browser.highlight(t),await QNe(t,e.assertion)}async function QNe(t,e){let o=true,n,r;switch(e.type){case "ELEMENT_CONTENT":{let a=await t.textContent()??"";if(r={elementTextContent:Xo(a,500,true)},!Hr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let s=Wn(e);o=false,n=new O("AssertionFailureError",`The content ${s} '${e.value}': ${a}`);}break}case "ELEMENT_ATTRIBUTE":{r={elementOuterHtml:Xo(await t.evaluate(s=>s.cloneNode(false).outerHTML),500,true)};let a=null;try{a=await t.getAttribute(e.attr,{timeout:3e3});}catch(s){n=new O("AssertionFailureError",J(s)),o=false;break}if(!Hr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let s=Wn(e);o=false,e.operation==="EXISTS"?n=new O("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new O("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`);}break}case "ELEMENT_EXISTENCE":{switch(e.condition){case "VISIBLE":{o=await t.evaluate(async(s,l)=>{let c=Date.now();for(;Date.now()-c<l;){await new Promise(d=>setTimeout(d,250));let u=s.getBoundingClientRect();if(!(u.width===0||u.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return true}return false},_n*1e3);break}case "EDITABLE":{o=await t.isEditable({timeout:_n*1e3});break}case "EXISTS":{o=true;break}case "ENABLED":{o=await t.isEnabled({timeout:_n*1e3});break}case "FOCUSED":{o=await t.evaluate(s=>s===document.activeElement);break}default:return (s=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})(e.condition)}if(o=e.negated?!o:o,!o){let a=Wn(e);n=new O("AssertionFailureError",`The element ${a}`);}break}case "ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!Hr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:true})){let s=Wn(e);o=false,n=new O("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`);}break}case "ELEMENT_STYLE":{let a=await t.evaluate((s,l)=>window.getComputedStyle(s).getPropertyValue(l),e.property);if(!Hr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let s=Wn(e);o=false,e.operation==="EXISTS"?n=new O("AssertionFailureError",`The style property ${e.property} ${s}`):n=new O("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"})()}return {thoughts:void 0,success:o,data:r,err:n}}function qJ(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}async function Dy(t,e){let o=await t.screenshot(e),{width:n,height:r}=imageSize(o);return {buffer:o,width:Math.ceil(n),height:Math.ceil(r)}}async function YJ(t){let{command:e,browser:o,logger:n}=t;if(e.target&&!al(e.target))throw new Error("Visual Diff with x/y is not supported yet");return await o.waitForStability({logger:n}),Wo().startAsyncSpan("VISUAL_DIFF",async i=>{try{let a=await oLe(t);return i.result={success:!a.fail,message:a.thoughts},a}catch(a){throw a instanceof O&&(i.result={success:false,message:a.message}),a}},{name:"Compare against golden"})}async function oLe({tracer:t,command:e,disableCache:o,browser:n,targetingWrapper:r,logger:i,screenshotStorage:a}){let s={clearHighlights:true,hideCaret:true},l=e.target&&al(e.target)?e.target:void 0,c;l?.elementDescriptor?c=(await r({tracer:t,command:e,target:l,cache:e.cache?.target,action:async _=>Dy(n,{locator:_.locator,...s}),options:{...e,disableCache:o,disableGlobalLocatorRedirect:true,memory:e.cache?.target?.memory,targetName:"target"}})).result:c=await Dy(n,s);let u=await a.prepareGoldenScreenshotForComparison(i,e,c);if((c.height!==u.height||c.width!==u.width)&&i.warn({currHeight:c.height,currWidth:c.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(c.height-u.height)>10||Math.abs(c.width-u.width)>10){let k=`${c.width}x${c.height}`,_=`${u.width}x${u.height}`;return {fail:true,thoughts:`Current screenshot (${k}) does not match saved screenshot dimensions (${_}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:c.buffer,succeedImmediately:false,urlAfterCommand:n.url()}}let d=await Jimp.fromBuffer(c.buffer),m={width:c.width,height:c.height},p=await Jimp.fromBuffer(u.buffer),f={width:u.width,height:u.height},h,g=m.width*m.height,b=f.width*f.height,y=Math.abs(m.height-f.height),T=Math.abs(m.width-f.width);if(g>b){let k=d.cover({w:f.width,h:f.height});c.buffer=await k.getBuffer("image/jpeg"),h="current",c.width=f.width,c.height=f.height;}else if(b>g){let k=p.cover({w:m.width,h:m.height});u.buffer=await k.getBuffer("image/jpeg"),h="saved";}let v={data:Buffer.alloc(c.width*c.height*4),width:c.width,height:c.height},E=e.threshold??.1,M=B6(VL.decode(u.buffer).data,VL.decode(c.buffer).data,v.data,c.width,c.height,{threshold:E,diffColorAlt:[0,255,0]})/(c.width*c.height)*100,I=M>E*100,A=`Visual diff of ${M.toFixed(2)}% detected, which is ${I?"over":"under"} the threshold of ${E*100}%.`;if(h&&(A+=` The ${h} screenshot was cropped since it was taller by ${y} pixels and wider by ${T} pixels.`),I)throw new O("ActionFailureError",A);return {fail:I,thoughts:A,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:VL.encode(v,75).data,succeedImmediately:false,urlAfterCommand:n.url()}}var nLe=3e4;function rLe(t){if(!t.body)return {};switch(t.body.type){case "json":return {content:t.body.content,contentType:"application/json"};case "form-urlencoded":{let e=new URLSearchParams;return Object.entries(t.body.content).forEach(([o,n])=>{e.append(o,n);}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function _f({command:t,logger:e,baseUrl:o,fetchImplementation:n=fetch}){let r=t.timeout??nLe/1e3,i=Object.fromEntries(Object.entries(t.headers||{}).filter(([f,h])=>f&&h)),a=new URLSearchParams;Object.entries(t.params||{}).filter(([f,h])=>f&&h).forEach(([f,h])=>{a.append(f,h);});let s=a.toString(),l;if(Wp(t.url)&&(l=t.url),o&&Gp(t.url,o)&&(l=new URL(t.url,o).toString()),!l)throw new O("ActionFailureError",`Invalid URL: ${t.url}`);let c=l;e.info({url:c,searchParams:s,headers:i,body:t.body,method:t.method},"Making HTTP request");let d=await re((async()=>{let f=s?`${c}?${s}`:c;try{let h=rLe(t),g=new Headers(i);return h.contentType&&!g.has("Content-Type")&&g.set("Content-Type",h.contentType),await n(f,{headers:g,method:t.method,body:h.content})}catch(h){throw new Error(`Failed to make HTTP request: ${h}`,{cause:h})}})(),{milliseconds:r*1e3,fallback:()=>{throw new O("ActionFailureError",`Fetch request timed out after ${r} seconds`)}});if(!d.ok){let f;try{f=await d.text();}catch(h){f=`Failed to read response body: ${h}`;}throw new O("ActionFailureError",`Fetch request failed with status ${d.status}: ${f}`)}let m={};d.headers.forEach((f,h)=>{m[h]=f;});let p={status:d.status,headers:m,request:{url:d.url,method:t.method,headers:i}};if(t.body?.type==="json"&&t.body.content)try{p.request.json=JSON.parse(t.body.content);}catch{}if(d.headers.get("content-type")?.includes("json"))try{p.json=await d.json();}catch{}else d.headers.get("content-type")?.includes("text")&&(p.text=await d.text());return p}var iLe=5e3;async function ZJ({timeout:t=_n,...e}){let o=Date.now(),n=t*1e3,r=n+1e4,i,a=0,s=500;for(;a-o<n;){if(Date.now()-o>r){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let l=Date.now();i=await XJ(e),a=Date.now();let c=a-l;if(c>1e3&&e.logger.warn({pageAssertDuration:c},"Page assertion took longer than expected"),!i.success)await Te(s,e.signal),s=Math.min(Math.floor(s*1.5),iLe);else return i}return i=await XJ(e),i}async function XJ(t){return Wo().startAsyncSpan("PAGE_ASSERTION",async o=>{let n=await jL(t);return o.result={success:n.success,message:n.err?.message},n},{name:"Page check"})}async function jL({assertion:t,browser:e,autoExpandIframes:o}){switch(t.type){case "CONTENT":case "CONTENT":{let r,i=false,a;try{let s;if(o){let l=await e.evaluateFunctionInAllFrames(JJ,{value:t.value,negated:!!t.negated,returnHtml:!1});i=t.negated?l.every(c=>c.evaluation):l.some(c=>c.evaluation),s=l.find(c=>c.pageHtml)?.pageHtml;}else ({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(JJ,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let l=t.negated?vl.CONTAINS:Cl.CONTAINS;a=new O("AssertionFailureError",`The page ${l} '${t.value}'.`),r=s;}}catch(s){a=new O("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`);}return {success:i,err:a,data:i||!r?void 0:{pageContent:r}}}default:return (r=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}}function JJ({value:t,negated:e,returnHtml:o}){let n=document.body.innerHTML,r=n.includes(t)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:r,pageHtml:!r&&o?n:void 0}}var aLe=3e4;async function QJ({command:t,logger:e,baseUrl:o,fetchImplementation:n=fetch}){let r=t.timeout??aLe/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,m])=>d&&m));a["Content-Type"]="application/json";let s;if(Wp(t.url)&&(s=t.url),o&&Gp(t.url,o)&&(s=new URL(t.url,o).toString()),!s)throw new O("ActionFailureError",`Invalid URL: ${t.url}`);let c=await re((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:t.query,variables:t.variables?JSON.parse(t.variables):void 0}),signal:i.signal})}catch(d){throw new Error(`Failed to make HTTP request: ${d}`,{cause:d})}})(),{milliseconds:r*1e3});if(!c)throw new O("ActionFailureError",`GraphQL request timed out after ${r} seconds`);if(!c.ok){let d,m=await c.text();try{d=JSON.parse(m);}catch{throw new O("ActionFailureError",`GraphQL request failed with status ${c.status}: ${m}`)}throw d?.errors?.length&&d?.errors[0]?.message?new O("ActionFailureError",`GraphQL request failed with status ${c.status}: ${d.errors[0].message}`):new O("ActionFailureError",`GraphQL request failed with status ${c.status}: ${m}`)}let u={};return c.headers.forEach((d,m)=>{u[m]=d;}),{status:c.status,headers:u,json:await c.json()}}var NA=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;executionOptionsStack=[];recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:o,logger:n,storage:r,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:l,options:c}){this.orgId=i,this.options=c,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=r,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=l,this.localCodeEvalTools=a,this.generator=o,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 withExecutionOptions(e,o){this.executionOptionsStack.push(e);try{return await o()}finally{this.executionOptionsStack.pop();}}getCurrentExecutionOptions(){return this.executionOptionsStack[this.executionOptionsStack.length-1]??{}}async evaluateAiAction({goal:e,startingScreenshot:o,history:n,disableCache:r,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[l,c]=await Promise.all([nu(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:true,skipWaitForPageLoad:true,logger:s}),this.browser.screenshot({retries:1,clearHighlights:true})]),u=`data:image/jpeg;base64,${c.toString("base64")}`,d=await Bd({type:"ai-action",description:e,screenshot:u,serializedTree:l.serializedTree,tree:l.tree,fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),m={url:this.browser.url(),browserState:d,startingScreenshot:o,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(m,{disableCache:r,abortSignal:this.executeAbortController.signal,loggerTags:{...$e(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:o,history:n,actionHint:r,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let l=this.browser.url(),[c,u]=await Promise.all([nu(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:true,skipWaitForPageLoad:true,logger:a}),this.browser.screenshot({retries:1,clearHighlights:true})]),d=`data:image/jpeg;base64,${u.toString("base64")}`,m=await Bd({type:"ai-action",description:e,screenshot:d,serializedTree:c.serializedTree,tree:c.tree,fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),p={url:l,browserState:m,startingScreenshot:o,history:n,goal:e,actionHint:r,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(p,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...$e(a)},langfuseSessionId:s})}catch(f){throw new O("InternalWebAgentError",`Error generating command: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}}async getBrowserState(e){return nu(this.browser,e)}async locateElement(e){return await $L(e,this.getControllerFixtures())}async locateElementWithSelector(e,o){return ya({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({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:o?{type:"url",url:o}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(){return {browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??true}async wrapMultiElementTargetingCommand({tracer:e,command:o,targetNames:n,descriptions:r,caches:i,action:a,options:s,retriesWithAI:l=1}){let c=[];for(let u=0;u<r.length;u++){let d=r[u],m=await this.wrapElementTargetingCommand({tracer:e,command:o,target:d,cache:i[u],action:async p=>p,options:{...s,targetName:n[u]}});c.push(m);}try{let u=await a(...c.map(p=>p.result)),d=p=>p==="fromTarget"?"From Target":p==="toTarget"?"To Target":"Target",m=c.map((p,f)=>p.thoughts?`${d(n[f])}: ${p.thoughts}`:void 0).filter(p=>!!p).join(" -------------- ")||void 0;return {result:u,elementInteractedDisplayStrings:c.map(p=>p.elementInteractedDisplayString),thoughts:m}}catch(u){if(this.throwIfClosed(),l>0)return this.logger.warn({err:u},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({tracer:e,command:o,targetNames:n,descriptions:r,caches:r.map(()=>{}),action:a,options:s,retriesWithAI:l-1});throw new O("ActionFailureError",u.message,{errOptions:{cause:u}})}}async wrapHardcodedCssTargetingCommandHelper({target:e,action:o,options:n,command:r}){let i=this.logger.child({commandId:r.id}),{targetName:a}=n;if(e.type!=="description")throw new O("ActionFailureError","Cannot use selector with non-description target");let s,l=Date.now(),c=Date.now();for(;Date.now()-c<this.browser.smartWaitingTimeout;){l=Date.now();try{let u=await this.browser.resolveHardcodedCssSelector({selector:e.elementDescriptor,targetName:a,logger:i});return {result:await o({locator:u.locator,originalElementLocationResult:void 0,serverSideBoundingBox:null}),elementInteractedDisplayString:u.displayString}}catch(u){if(u.name==="AbortError")throw u;s=u,i.warn({err:u},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await Te(500);}}throw s}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:o,disableGlobalLocatorRedirect:n,logger:r}=e,i=Wo(),a=!n&&this.browser.userBrowserSettings.globalLocatorRedirect!==false;(this.browser.userBrowserSettings.visualActions||a)&&await i.startAsyncSpan("SCROLL_ELEMENT_INTO_VIEW",async()=>{await this.browser.scrollIntoViewIfNeeded(o.locator);});let s;return a&&(s=await i.startAsyncSpan("LOCATOR_REDIRECT",async l=>{let{targetingResult:c,metadata:u}=await this.browser.performTargetRedirection(o,r);if(l.result=u,u.outcome==="redirected to new element"&&c&&i.storeTraceAsset&&!this.browser.userBrowserSettings.disableBrowserMonitoring){let d=randomUUID();(async()=>{try{let m=await this.browser.screenshot({locator:c.locator,clearHighlights:!0,boundingBoxOverride:c.serverSideBoundingBox??void 0});i.storeTraceAsset?.({snapshotId:d,data:m});}catch(m){r.debug({err:m},"Failed to capture element screenshot for redirect trace");}})(),l.elementScreenshotSnapshotId=d;}return c})),s||(s={locator:o.locator,serverSideBoundingBox:await o.locator.boundingBox({timeout:ze}),originalElementLocationResult:o.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{cache:o,options:n,logger:r}=e,a=await Wo().startAsyncSpan("CACHE_RESOLUTION",async l=>{l.targetSource=o.targetSource,l.attributes.smartWaitingTimeoutMs=this.browser.smartWaitingTimeout;try{let c=await this.browser.resolveTarget(o,{allowNotActionableNodesOverride:n.allowNotActionableNodesOverride,logger:r,signal:this.executeAbortController.signal,...n.resolveTargetOptions,acceptElementMovedError:n.force});l.attributes.targetDisplayString=c.displayString,l.attributes.decisions=c.decisions;let u=c.decisions.find(d=>d.matched);return u&&(l.resolutionMethod=u.type),c}catch(c){throw c instanceof Ne&&(l.cacheMissReason=c.cacheMissReason,l.attributes.decisions=c.decisions),c}}),s=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:a,disableGlobalLocatorRedirect:n.disableGlobalLocatorRedirect,logger:r});return n.force||await a.revalidator?.(),{resolutionResult:a,finalTarget:s}}async wrapElementTargetingCommand(e){return await ya({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{tracer:o,target:n,action:r,options:i,command:a,finalAttempt:s=false,originalCache:l=e.cache}=e,{retriesWithAI:c=1}=e,{disableCache:u,useSelector:d,targetName:m}=i,p=Wo(),f=this.logger.child({commandId:a.id}),h=this.shouldUseMemory(),g=cloneDeep(e.cache);if((!g||u)&&!HU(n))throw new O("ActionFailureError","Cannot target element with no cached data or element descriptor");if(d)return this.wrapHardcodedCssTargetingCommandHelper(e);let b=false,y;u&&(f.info("Cache explicitly disabled for this step"),b=true,y="Cache explicitly disabled",g=void 0);let T=OJ({cache:g,description:n.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:f});g=T.cache,b=b||T.cacheBustedBeforeAction,!y&&T.cacheBustReason&&(y=T.cacheBustReason);let v=true;if(!_J(g))return c--,v=false,this.executeTargetingCommandWithAI({tracer:p,stepTracer:o,target:n,options:i,command:a,action:r,originalCache:l,logger:f,useMemory:h,cacheBustedBeforeAction:b,cacheBustReason:y});try{let{resolutionResult:E,finalTarget:P}=await this.resolveCachedTargetForAction({cache:g,options:i,logger:f}),M=await r(P);if(Qe.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:1.4.5"]),kC({cmd:a,key:m,newTarget:g,logger:f,updatedWithAI:!1}),v){let I=E.decisions.filter(A=>A.matched);if(I.length!==1)f.warn({decisions:E.decisions},"Expected exactly 1 matching method for element location, got more or less");else {let A=I[0].type;o.recordTargetAutoHeal({healType:A});}}return {result:M,elementInteractedDisplayString:E.displayString}}catch(E){this.throwIfClosed();let P=EP(E);if(P&&!s)return f.warn({err:E},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({tracer:o,command:a,target:n,action:r,cache:l,originalCache:l,retriesWithAI:c,finalAttempt:true,options:i});if(E instanceof O&&!P)throw f.warn({err:E},"Failed to execute command with target (fatal)"),E;if(c>0&&n){f.info({err:E},"Failed to execute action with cached target, retrying with AI"),Qe.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:1.4.5",`missReason:${E instanceof Ne?E.cacheMissReason:"unknown"}`]);let M;g.memory&&WU(g.memory)&&(M=g.memory);let I=E instanceof Ne&&E.cacheMissReason==="failing-ldist";return this.wrapElementTargetingCommandHelper({tracer:o,command:a,target:n,cache:void 0,action:r,originalCache:l,retriesWithAI:c,finalAttempt:true,options:{...i,memory:M,targetHealingInProgress:true},skipInitialLocateWait:I})}throw new O("ActionFailureError",`Failed to execute interactive command: ${E instanceof Error?E.message:`${E}`}`,{errOptions:{cause:E}})}}async executeTargetingCommandWithAI(e){let{tracer:o,stepTracer:n,target:r,options:i,command:a,action:s,originalCache:l,logger:c,useMemory:u,cacheBustedBeforeAction:d,cacheBustReason:m,skipInitialLocateWait:p}=e;c.info({description:r.elementDescriptor,targetHealingInProgress:i.targetHealingInProgress,cacheBustedBeforeAction:d,memory:i.memory,useMemory:u},"Prompting AI for an updated element location");let f=false;(d||!l)&&!this.getCurrentExecutionOptions().skipAISmartWaiting&&!i.skipAISmartWaiting?(await o.startAsyncSpan("SMART_WAITING",async()=>await jJ({description:r.elementDescriptor,iframeUrl:i.iframeUrl,source:i.source,logger:c,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride},this.getControllerFixtures())),f=true):(d||!l)&&(i.skipAISmartWaiting?c.debug("Skipping AI smart waiting for this targeting attempt"):c.debug("Skipping AI smart waiting due to controller execution options"));let h=2;for(let g=1;g<=h;g++){let b=false,y=this.browser.getActiveFrameConfig(),T=i.force||g>1;try{let v;try{v=await $L({description:r.elementDescriptor,disableCache:!!i.disableCache,iframeUrl:i.iframeUrl,source:i.source,useMemory:u,memory:u?i.memory:void 0,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride,allowIneligibleTagRedirect:i.allowIneligibleTagRedirect,showZeroOpacityElementsOverride:i.showZeroOpacityElementsOverride,logger:c,skipWait:f||p,isAutoHeal:!!i.targetHealingInProgress,cacheBustReason:m,acceptElementMovedError:T},this.getControllerFixtures());}catch(M){if(M instanceof ds&&M.updatedLocatorMemory){let I={id:-1,...l,memory:M.updatedLocatorMemory};kC({cmd:a,key:i.targetName,newTarget:I,logger:c,updatedWithAI:!0});}throw M}v.frameConfig&&(this.browser.setActiveFrameConfig(v.frameConfig),b=!0);let E=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:v.resolution,disableGlobalLocatorRedirect:i.disableGlobalLocatorRedirect,logger:c}),P=await s(E);return kC({cmd:a,key:i.targetName,newTarget:v.target,logger:c,updatedWithAI:!0}),i.targetHealingInProgress&&(n.recordTargetAutoHeal({healType:"AI"}),v.target.targetSource="AI_HEALED",v.target.targetUpdateTime=new Date().toUTCString(),v.target.targetUpdateLoggerTags=$e(c)),{result:P,elementInteractedDisplayString:v.resolution.displayString,thoughts:v.thoughts}}catch(v){if(b&&this.browser.setActiveFrameConfig(y),this.throwIfClosed(),g<h&&EP(v)){c.warn({err:v,aiAttempt:g},"Encountered retryable AI targeting error; retrying with AI once");continue}throw v instanceof O?v:new O("ActionFailureError",v.message)}}throw new O("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return Dy(this.browser,e)}async executePresetCommand(e,o,n,r,i){this.options?.slowMoMs&&await Te(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),l;try{l=await this.resolveCommandTemplateStrings(o,n);}catch(c){throw this.throwIfClosed(),new O("ActionFailureError",`Failed to substitute template strings in command: ${c.message}`,{errOptions:{cause:c}})}try{let c=await We({name:`cli.command.${o.type}`,attributes:{"momentic.command_type":o.type,"momentic.command_id":o.id},fn:()=>this.executePresetCommandHelper(e,o,n,r,i)});return this.options?.autoFollowNewTabs&&await IJ({beforeUrl:s,command:o,beforePages:a.map(u=>u.url),browser:this.browser,logger:this.logger}),c}catch(c){throw c.name!=="AbortError"&&this.logger.error({err:c},"Error thrown in action controller"),c}finally{Rf(o,l);}}createCallbacksForBrowser(e){return {createIsolatedFolder:()=>bL(e)}}async traceBrowserInteraction(e,o,n){return Wo().startAsyncSpan("BROWSER_INTERACTION",async i=>o(i),{name:e,...n})}async resolveCommandTemplateStrings(e,o){return Af({obj:e,context:o,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,o,n,r,i){r=r||"disableCache"in o&&!!o.disableCache;let a=this.logger.child({commandId:o.id});switch(o.type){case "SUCCESS":{let s=o.condition;return s?.assertion.trim()?DA({command:s,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),logger:a,recoveryHint:i}):{succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "AI_ASSERTION":{if(!o.assertion.trim())throw new O("ActionFailureError","Missing assertion");if(o.timeout&&o.timeout>1800)throw new O("AssertionFailureError",`AI check timeout of ${o.timeout} exceeds the maximum allowed value of 30 minutes.`);return DA({command:o,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),logger:a,recoveryHint:i})}case "AI_EXTRACT":return VJ({command:o,logger:a,fixtures:this.getControllerFixtures(),disableCache:r});case "NAVIGATE":if(!Wp(o.url)&&!Gp(o.url,this.browser.baseUrl))throw new O("ActionFailureError",`Invalid URL provided to navigate command: ${o.url}`);await this.traceBrowserInteraction("Navigate",()=>this.browser.navigate({url:o.url,loadTimeoutMs:o.loadTimeout?o.loadTimeout*1e3:void 0}));break;case "DIALOG":this.browser.registerDialogHandler(o.action);break;case "CAPTCHA":throw new O("UserConfigurationError","Captcha solving is no longer available on Momentic");case "GO_BACK":await this.traceBrowserInteraction("Go back",()=>this.browser.goBack());break;case "GO_FORWARD":await this.traceBrowserInteraction("Go forward",()=>this.browser.goForward());break;case "SCROLL_LEFT":case "SCROLL_RIGHT":case "SCROLL_DOWN":case "SCROLL_UP":{let s,l;if(o.target&&ss(o.target)){let d=bo(o.target.pixels);await this.browser.hoverUsingVisualCoordinates(d);}else if(o.target&&o.target.elementDescriptor.trim()){let{elementInteractedDisplayString:d,thoughts:m}=await this.wrapElementTargetingCommand({tracer:e,command:o,target:o.target,cache:o.cache?.target,action:p=>this.browser.hover(p),options:{...o,targetName:"target",disableGlobalLocatorRedirect:true,disableCache:r}});s=d,l=m;}let c=this.browser.getViewport()?.height??oc.height,u=this.browser.getViewport()?.width??oc.width;switch(o.type){case "SCROLL_UP":await this.traceBrowserInteraction("Scroll up",()=>this.browser.scrollVertical(-(o.deltaY??c)));break;case "SCROLL_DOWN":await this.traceBrowserInteraction("Scroll down",()=>this.browser.scrollVertical(o.deltaY??c));break;case "SCROLL_LEFT":await this.traceBrowserInteraction("Scroll left",()=>this.browser.scrollHorizontal(-(o.deltaX??u)));break;case "SCROLL_RIGHT":await this.traceBrowserInteraction("Scroll right",()=>this.browser.scrollHorizontal(o.deltaX??u));break}return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "WAIT_FOR_URL":{if(o.timeout&&o.timeout>1800)throw new O("UserConfigurationError",`Wait for URL timeout of ${o.timeout} exceeds the maximum allowed value of 30 minutes.`);let s=o.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:s},{timeout:o.timeout?o.timeout*1e3:void 0,negated:o.negated,caseInsensitive:o.caseInsensitive});break}case "WAIT":{if(o.delay>1800)throw new O("UserConfigurationError",`Wait timeout of ${o.delay} seconds exceeds the maximum allowed value of 30 minutes`);let s=o.delay*1e3;await Te(s,this.executeAbortController.signal);break}case "REFRESH":await this.traceBrowserInteraction("Refresh",()=>this.browser.refresh({loadTimeoutMs:o.loadTimeout?o.loadTimeout*1e3:void 0}));break;case "CLICK":{if(ss(o.target)){let m=bo(o.target.pixels),p={...o,relativePosition:o.relativePosition?bo(o.relativePosition):void 0};await this.traceBrowserInteraction("Click",()=>this.browser.clickUsingVisualCoordinates(m,p),{coordinates:m});break}let s=this.browser.url(),{elementInteractedDisplayString:l,result:c,thoughts:u}=await this.wrapElementTargetingCommand({tracer:e,target:o.target,command:o,cache:o.cache?.target,action:m=>this.traceBrowserInteraction("Click",async p=>{let f={...o,relativePosition:o.relativePosition?bo(o.relativePosition):void 0},h=await this.browser.click(m,this.createCallbacksForBrowser(this.orgId),f);return h.coordinates&&(p.coordinates=h.coordinates),h},{selector:m.locator.toString()}),options:{...o,targetName:"target",disableCache:r}}),d={urlAfterCommand:this.browser.url(),succeedImmediately:false,elementInteracted:l,thoughts:u,data:c.downloadedFile?{downloadedFile:c.downloadedFile}:void 0};return KC(s,d.urlAfterCommand)&&(d.succeedImmediately=true,d.succeedImmediatelyReason="URL changed"),d}case "COPY":return await this.browser.copy(o.value),{succeedImmediately:false,data:o.value,urlAfterCommand:this.browser.url()};case "PASTE":{await this.browser.paste();break}case "DRAG":{if(ss(o.fromTarget)&&ss(o.toTarget)){let c=bo(o.fromTarget.pixels),u=bo(o.toTarget.pixels);await this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDropUsingVisualCoordinates(c,u,{hoverDurationMs:o.hoverSeconds?o.hoverSeconds*1e3:void 0}),{coordinates:c});break}if(ss(o.fromTarget)||ss(o.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:s,thoughts:l}=await this.wrapMultiElementTargetingCommand({tracer:e,command:o,targetNames:["fromTarget","toTarget"],descriptions:[o.fromTarget,o.toTarget],caches:[o.cache?.fromTarget,o.cache?.toTarget],action:(c,u)=>this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDrop(c,u,{hoverDurationMs:o.hoverSeconds?o.hoverSeconds*1e3:void 0,steps:o.steps})),options:{...o,disableCache:r}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s[0],thoughts:l}}case "MOUSE_DRAG":{let s=parseInt(o.deltaX),l=parseInt(o.deltaY),c=o.steps??5;if(isNaN(s)||isNaN(l))throw new O("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${o.deltaX}, ${o.deltaY})`);if(o.target&&ss(o.target)){let m=bo(o.target.pixels);await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDragUsingVisualCoordinates({deltaX:s,deltaY:l,steps:c,fromTarget:m}),{coordinates:m});break}let u,d;if(o.target?.elementDescriptor){let{elementInteractedDisplayString:m,thoughts:p}=await this.wrapElementTargetingCommand({tracer:e,command:o,target:o.target,cache:o.cache?.target,action:async f=>this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(s,l,c,f.locator,{force:o.force})),options:{...o,targetName:"target",disableCache:r}});u=m,d=p;}else await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(s,l,c,void 0,{force:o.force}));return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:u,thoughts:d}}case "SELECT_OPTION":{if(!al(o.target))throw new Error("Select with x/y is not supported yet");let s=o.target.elementDescriptor,l=o.choice,{elementInteractedDisplayString:c,thoughts:u}=await this.wrapElementTargetingCommand({tracer:e,command:o,target:{type:"description",elementDescriptor:s},cache:o.cache?.target,action:d=>this.traceBrowserInteraction("Select option",()=>this.browser.selectOption(d,l,o.force),{value:l.type==="LABEL"?l.label:l.type==="VALUE"?l.value:l.index}),options:{...o,targetName:"target",disableCache:r,source:fg(o)}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:c,thoughts:u}}case "TAB":{let s={loadTimeoutMs:o.loadTimeout?o.loadTimeout*1e3:void 0,retry:true};await this.browser.switchToPage(o.action,s);break}case "NEW_TAB":await this.browser.createNewTab(o.url,{loadTimeoutMs:o.loadTimeout?o.loadTimeout*1e3:void 0});break;case "CLOSE_TAB":await this.browser.closePage(o.action,{retry:true});break;case "COOKIE":{if(!o.value)break;let s=await this.browser.setCookie(o.value);a.debug({results:s},"Set cookies");break}case "LOCAL_STORAGE":if(!o.value||!o.key)break;await this.browser.setLocalStorage(o.key,o.value);break;case "JAVASCRIPT":{let s;try{o.environment==="BROWSER"?(s=await this.browser.evaluateCodeInPage({code:o.code,fragment:o.fragment??!1,context:n.toObjectCopy(),timeoutMs:o.timeout?o.timeout*1e3:void 0}),a.info({result:s},"Executed JavaScript in browser")):s=await fa({orgId:this.orgId,code:o.code,fragment:!!o.fragment,context:n,timeoutMs:o.timeout?o.timeout*1e3:void 0,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async l=>{if(!this.options?.scratchPadId){a.warn({updates:l},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:l,logger:a});}}});}catch(l){throw this.throwIfClosed(),new O("ActionFailureError",l instanceof Error?l.message:`${l}`,{errOptions:{cause:l}})}try{JSON.stringify(s);}catch(l){throw new O("ActionFailureError",`Return value is not serializable: ${l instanceof Error?l.message:`${l}`}`,{errOptions:{cause:l}})}return {urlAfterCommand:this.browser.url(),succeedImmediately:false,data:s}}case "TYPE":{if(o.target&&ss(o.target)){let p=bo(o.target.pixels),f={...o,relativePosition:o.relativePosition?bo(o.relativePosition):void 0};await this.browser.clickUsingVisualCoordinates(p,f),await this.traceBrowserInteraction("Type",()=>this.browser.type(o.value,{force:o.force,clearContent:o.clearContent,forceClearContent:o.forceClearContent,delay:o.delay,pressEnter:o.pressEnter},true),{value:o.value});break}let s=this.browser.url(),l,c,u=cloneDeep(o.target),d=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(u){let{elementInteractedDisplayString:p,thoughts:f}=await this.wrapElementTargetingCommand({tracer:e,command:o,target:u,cache:o.cache?.target,action:h=>this.traceBrowserInteraction("Type",()=>this.browser.typeIntoTarget(o.value,h,{force:o.force,clearContent:o.clearContent,forceClearContent:o.forceClearContent,delay:o.delay,pressEnter:o.pressEnter,relativePosition:o.relativePosition}),{value:o.value,selector:h.locator.toString()}),options:{...o,targetName:"target",disableCache:r,disableGlobalLocatorRedirect:!d,source:fg(o)}});l=p,c=f;}else await this.traceBrowserInteraction("Type",()=>this.browser.type(o.value,{force:o.force,clearContent:o.clearContent,forceClearContent:o.forceClearContent,delay:o.delay,pressEnter:o.pressEnter},true),{value:o.value});let m={urlAfterCommand:this.browser.url(),succeedImmediately:false,elementInteracted:l,thoughts:c};return KC(s,m.urlAfterCommand)&&(m.succeedImmediately=true,m.succeedImmediatelyReason="URL changed"),m}case "HOVER":{if(ss(o.target)){let c=bo(o.target.pixels);await this.traceBrowserInteraction("Hover",()=>this.browser.hoverUsingVisualCoordinates(c),{coordinates:c});break}let{elementInteractedDisplayString:s,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,command:o,target:o.target,cache:o.cache?.target,action:c=>this.traceBrowserInteraction("Hover",()=>this.browser.hover(c,{relativePosition:o.relativePosition?bo(o.relativePosition):void 0}),{selector:c.locator.toString()}),options:{...o,targetName:"target",disableCache:r}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "FOCUS":{if(!al(o.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:s,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,command:o,target:o.target,cache:o.cache?.target,action:c=>this.browser.focus(c),options:{...o,targetName:"target",disableCache:r}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "BLUR":{if(o.target&&!al(o.target))throw new Error("Blur with x/y is not supported yet");if(!o.target||!o.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:false,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:s,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,target:o.target,command:o,cache:o.cache?.target,action:c=>this.browser.blur(c),options:{...o,targetName:"target",disableCache:r}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "PRESS":{let s=this.browser.url();await this.traceBrowserInteraction("Press key",()=>this.browser.press(o.value,{repeat:o.repeat,convertMeta:o.convertMeta??true,delayMs:o.delayMs}),{value:o.value});let l={urlAfterCommand:this.browser.url(),succeedImmediately:false};return KC(s,l.urlAfterCommand)&&(l.succeedImmediately=true,l.succeedImmediatelyReason="URL changed"),l}case "KEY_DOWN":return await this.browser.keyDown(o.value,{convertMeta:o.convertMeta??true}),{urlAfterCommand:this.browser.url(),succeedImmediately:false};case "KEY_UP":return await this.browser.keyUp(o.value,{convertMeta:o.convertMeta??true}),{urlAfterCommand:this.browser.url(),succeedImmediately:false};case "REQUEST":{let s=new CookieJar,l=lLe(fetch,s),c;try{c=new URL(o.url).hostname;}catch{}let u=await _f({command:o,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:l});return {data:Du.parse({...u,cookies:Gm(s,c)}),succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "GRAPHQL_REQUEST":return {data:await QJ({command:o,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:false,urlAfterCommand:this.browser.url()};case "VISUAL_DIFF":return YJ({tracer:e,command:o,disableCache:r,browser:this.browser,logger:a,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:s=>this.wrapElementTargetingCommand(s)});case "FILE_UPLOAD":{let s,l;if(o.fileSource.type==="URL"?(l=o.fileSource.url,s=await bX({uri:o.fileSource.url,logger:a,orgId:this.orgId})):o.fileSource.type==="USER_FILE"&&(l=o.fileSource.name,s=await this.uploadedFileStorage?.getFileForUpload(o.fileSource.name,this.orgId)),!s)throw new O("UserConfigurationError",`Attempted to use non-existent file for upload step: ${l}`);await this.browser.setFileChooserHandler({...s,filename:o.filename});break}case "AUTH_SAVE":{let s=await this.browser.saveAuthState();if(o.storageState&&vD(o.storageState)){let l=Oo__default.resolve(o.storageState);Bn__default.mkdirSync(Oo__default.dirname(l),{recursive:true}),Bn__default.writeFileSync(l,`${JSON.stringify(s,null,2)}
5735
+ `),tokenLength:d}),s.forEach((h,g)=>{let b=h.ids[0],y=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:b,maxId:y},`Chunk for page filtering (index ${g+1}/${s.length})`);}),{chunks:s}}var FJ=5e6,kNe=1e5,FNe=3e4,BNe=6e4,UNe=1e5;async function Bd(t){let{fixtures:e}=t,{logger:o}=e,n=t.tree,r=t.serializedTree,i=Jt(r);if(i>FJ)throw new O("UserConfigurationError",`Page accessibility tree is too large for AI page filtering (${i} tokens). Maximum supported size is ${FJ} tokens.`);if(i>kNe){let a=kJ({serializedTree:r,options:NJ,logger:o}),s=randomUUID();n=await zNe({...t,chunks:a.chunks,callId:s}),r=n.serialize();let l=Jt(r);o.info({oldTokens:i,newTokens:l,langfuseCallId:s},"Filtered page using AI chunk ranking");}return r}async function zNe({type:t,callId:e,chunks:o,description:n,fixtures:r,tree:i}){let{generator:a,signal:s,logger:l}=r,c=await a.rankChunksWithAi({chunks:o,description:n,type:t,softTokenLimit:FNe,mediumTokenLimit:BNe,hardTokenLimit:UNe,callId:e},{abortSignal:s,logger:l,loggerTags:$e(l)}),u=[];return o.forEach((m,p)=>{c.indices.includes(p)&&(u=u.concat(m.ids));}),i.pruneUsingRelevantIds(new Set(u))}async function $L(t,e){if(!t.description)throw new O("UserConfigurationError","Cannot locate element with empty description");return ya({action:async()=>VNe(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function VNe(t,e){let{disableCache:o,testContext:n,filterByViewport:r,skipWait:i,source:a,memory:s,logger:l,allowNotActionableNodesOverride:c,allowIneligibleTagRedirect:u,showZeroOpacityElementsOverride:d,skipSavingVisualAttributes:m,isAutoHeal:p,cacheBustReason:f,acceptElementMovedError:h}=t,{orgId:g,browser:b,localCodeEvalTools:y,generator:T,abortSignal:v}=e,E=t.description,P=Wo(),M=t.useMemory&&!o;n&&(E=await kl({orgId:g,s:E,context:n,localTools:y,signal:v,logger:l})),a&&(E=PJ(E,a));let{serializedTree:I,tree:A}=await P.startAsyncSpan("GET_PAGE_STATE",async()=>nu(b,{allowNotActionableNodesOverride:c,allowIneligibleTagRedirect:u,showZeroOpacityElementsOverride:d,filterByViewport:r,abortSignal:v,skipWait:i,logger:l}),{}),k=await P.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let B,z=Date.now(),q;for(;!B&&Date.now()-z<3e3;){v.throwIfAborted();try{B=await b.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2});}catch(Q){q=Q;}}if(!B)throw new O("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${q?.message}`);return B}),_=I,H=false,j=`data:image/jpeg;base64,${k.toString("base64")}`,le=$e(l);_=await Bd({type:"locator",description:E,screenshot:j,serializedTree:I,tree:A,fixtures:{generator:T,signal:v,logger:l,orgId:g}}),_!==I&&(H=true);let Y=await P.startAsyncSpan("AI_LOCATOR_CALL",async B=>{p&&(B.attributes.isAutoHeal=true),f&&(B.attributes.cacheBustReason=f);let z=await T.getElementLocation({browserState:_,goal:E,screenshot:j,source:a,memory:M?s:void 0},{disableCache:o,abortSignal:v,logger:l,loggerTags:le,useMemory:M,cacheBustReason:f});if(B.result=z,M&&(B.attributes.useMemory=true,B.attributes.memoryTraces=z.rememberedTraces??[],z.updatedMemory&&(B.attributes.memorySavedNewResult=true)),P.storeTraceAsset){let q=randomUUID();P.storeTraceAsset({snapshotId:q,data:k}),B.screenshotSnapshotId=q;}return z});if(l.debug({usedRag:H,result:Y},"Got locator result"),!(Y.id>0))throw new ds(`Could not find any relevant element: ${Y.thoughts}`,Y.updatedMemory?{type:"GCS_TRACES",traces:Y.updatedMemory}:void 0);let{resolution:U,target:x,frameConfig:X}=await P.startAsyncSpan("TARGET_RESOLUTION",async B=>{let z=await b.createTargetFromA11yId({id:Y.id,requirements:Y.requirements,additionalElements:Y.additionalElements,description:E,targetSource:"AI",logger:l,skipSavingVisualAttributes:m,acceptElementMovedError:h});return B.result={serializedElement:z.target.nodeOnlySerializedHtml??"Unknown HTML element"},z});if(U.a11yNode?.properties?.hidden&&U.a11yNode?.properties?.hidden!=="false")throw new O("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: ${U.displayString}`);return M&&(Y.updatedMemory?x.memory={type:"GCS_TRACES",traces:Y.updatedMemory}:s&&(x.memory=s)),{thoughts:Y.thoughts,target:x,resolution:U,frameConfig:X,screenshot:j}}var jNe=15;async function DA({command:t,logger:e,fixtures:o,useMemory:n,maxRetries:r=jNe,recoveryHint:i}){if(!t.assertion.trim())throw new O("ActionFailureError","Assertion command is missing the assertion content");let a=oI.optional().catch(void 0).parse(t.source);t.source&&!a&&e.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let s=Wo();return s.startAsyncSpan("AI_ASSERTION_CALL",async l=>{let{browser:c}=o,u=t.timeout?t.timeout*1e3:c.smartWaitingTimeout,d=PK(u,r-1),m=0,p=Date.now(),f=p+u,h=p,g,b,y;try{await ya({action:()=>c.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:c,logger:e});}catch(E){e.warn({err:E},"Failed to clear highlights before AI check, continuing...");}for(;m<r;){o.abortSignal.throwIfAborted();let E=Date.now();if(m>0){if(E>=f)break;let I=f-E,A=h-E,k=Math.min(A,I);k>0&&await Te(k,o.abortSignal);}let P=Date.now();if(m>0&&P>=f)break;let M=false;try{if(g=await ya({action:async()=>{let A=await UJ(c,e,o.abortSignal);return b&&b.serializedTree===A.serializedTree&&b.screenshotBuff.equals(A.screenshotBuff)?(M=!0,g):(b=A,zJ({command:t,state:A,fixtures:o,useMemory:n,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:m,logger:e,source:a,recoveryHint:i}))},frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:e,browser:c}),g?.aiResult.result){g?.updatedMemory&&zb(t,g.updatedMemory,e);break}else throw g?.aiResult.thoughts?new O("AssertionFailureError",g.aiResult.thoughts):new O("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(I){o.abortSignal.throwIfAborted(),y=I instanceof Error?I:new Error(`${I}`),M?e.info(`AI check attempt ${m} failed (re-used previous result)`):e.info({err:I},`AI check assert attempt ${m} failed, retrying...`);}finally{m++,h=P+d;}}if(!g?.aiResult.result){let E=f-Date.now();E>0&&await Te(E,o.abortSignal);}if(!g?.aiResult.result)try{g=await ya({action:async()=>zJ({command:t,state:await UJ(c,e,o.abortSignal),fixtures:o,useMemory:n,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:m,logger:e,recoveryHint:i}),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:e,browser:c});}catch(E){o.abortSignal.throwIfAborted(),y=E instanceof Error?E:new Error(`${E}`);}finally{m++;}g?.updatedMemory&&zb(t,g.updatedMemory,e);let T=g?.afterScreenshotOverride;if(T&&s.storeTraceAsset){let E=randomUUID();s.storeTraceAsset({snapshotId:E,data:T}),l.screenshotSnapshotId=E;}let v=g?.elementScreenshotOverride;if(v&&s.storeTraceAsset){let E=randomUUID();s.storeTraceAsset({snapshotId:E,data:v}),l.elementScreenshotSnapshotId=E;}if(n&&(l.attributes.useMemory=true,l.attributes.memoryTraces=g?.aiResult.rememberedTraces??[],g?.updatedMemory&&(l.attributes.memorySavedNewResult=true)),!g?.aiResult.result){l.result=g?.aiResult??{thoughts:y?.message??"AI check failed after all attempts",result:false};let E=`AI check still failing after ${m} attempts.`;throw y&&(E+=` Latest result: ${y.message}`),new O("AssertionFailureError",E)}return l.result=g.aiResult,{...g,thoughts:g.aiResult.thoughts,succeedImmediately:false,urlAfterCommand:c.url()}})}async function UJ(t,e,o){await t.waitForPageLoad({signal:o});let[n,r]=await Promise.all([nu(t,{abortSignal:o,skipWait:true,skipWaitForPageLoad:true,logger:e}),t.screenshot({retries:1,respectActiveFrame:true})]);return {...n,screenshotBuff:r}}async function zJ({command:t,state:e,fixtures:o,useConsensus:n,useMemory:r,highlightElementsOnFailure:i,attemptNumber:a,source:s,logger:l,recoveryHint:c}){let {browser:u,generator:d,abortSignal:m}=o,{serializedTree:f,tree:h}=e,g=e.screenshotBuff,b=g.toString("base64"),y=u.url(),T=t.contextChoice??"MULTIMODAL",v=f;T!=="VISION_ONLY"&&(v=await Bd({type:"assertion",serializedTree:f,tree:h,description:t.assertion,screenshot:b,fixtures:{generator:d,signal:m,logger:l,orgId:o.orgId}}),v);let E={goal:t.assertion,url:y,memory:r?t.cache?.memory:void 0,browserState:v,screenshot:b,contextChoice:T,source:s,recoveryHint:c},M=await(T==="VISION_ONLY"?(A,k)=>d.getVisualAssertionResult(A,k):(A,k)=>d.getAssertionResult(A,k))(E,{useConsensus:n,attemptNumber:a,useMemory:r,disableCache:!!t.disableCache,abortSignal:m,logger:l,loggerTags:$e(l)}),I;if((M.result||i)&&M.relevantElements?.length){M.relevantElements.map(A=>u.getSerializedFormFromA11yId(A)).filter(A=>!!A);try{let A=M.relevantElements[0],{resolution:k}=await u.createTargetFromA11yId({id:A,description:null,targetSource:"AI",skipSaveToCache:!0});I=await u.screenshot({locator:k.locator,clearHighlights:!0,respectActiveFrame:!0});}catch(A){l.debug({err:A},"Failed to capture element screenshot for trace, continuing...");}await HNe(M.relevantElements,u,l);}return {aiResult:M,afterScreenshotOverride:g,elementScreenshotOverride:I,updatedMemory:r?M.updatedMemory:void 0}}async function HNe(t,e,o){let n=Date.now();for(let r of t){if(Date.now()-n>2e3){o.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await re(e.highlightA11yId(r),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}});}catch(i){o.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}async function VJ(t){let{command:e,logger:o,fixtures:n,disableCache:r}=t,{browser:i,generator:a,abortSignal:s}=n;if(!e.goal.trim())throw new O("ActionFailureError","Cannot perform AI extraction without goal");if(e.schema){let d=pp(e.schema);if(d)throw new O("UserConfigurationError",d)}let l=await i.getCondensedHtml(),c=await i.screenshot({retries:2}),u=Wo();try{return await u.startAsyncSpan("AI_EXTRACTION_CALL",async d=>{let m=await a.getTextExtraction({goal:e.goal,browserState:l,returnSchema:e.schema,screenshot:`data:image/jpeg;base64,${c.toString("base64")}`},{disableCache:r,abortSignal:s,loggerTags:$e(o)});if(d.result=m,WNe({tracer:u,span:d,screenshot:c,htmlState:l,logger:o}),m.result==="NOT_FOUND")throw new O("ActionFailureError","No relevant data found for extraction goal on this page");if(m.thoughts?.includes("MaxGenerationLengthExceededError"))throw new O("UserConfigurationError",m.thoughts);return {thoughts:m.thoughts||void 0,data:m.result,succeedImmediately:!1,urlAfterCommand:i.url()}})}catch(d){let m=J(d);throw m.includes("MaxGenerationLengthExceededError")?new O("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."):m.includes("AIProviderError")&&m.includes("time")?new O("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}}function WNe(t){let{tracer:e,span:o,screenshot:n,htmlState:r,logger:i}=t;if(e.storeTraceAsset)try{let a=randomUUID();e.storeTraceAsset({snapshotId:a,data:n}),o.screenshotSnapshotId=a;let s=randomUUID();e.storeTraceAsset({snapshotId:s,data:Buffer.from(r),extension:"html"}),o.browserStateSnapshotId=s;}catch(a){i.debug({err:a},"Failed to store extraction trace assets");}}async function jJ(t,e){let{logger:o}=t,{abortSignal:n,browser:r}=e,i=Date.now();try{await GNe(i,t,e);}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;o.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=r.smartWaitingTimeout-(Date.now()-i);s>0&&await Te(s,n);}finally{o.debug({durationMs:Date.now()-i},"AI smart waiting complete");}}async function GNe(t,e,o){let{abortSignal:n,browser:r}=o;if(r.smartWaitingTimeout<3e3){await Te(r.smartWaitingTimeout,n);return}if(!e.description)throw new O("UserConfigurationError","Cannot locate element with empty description");await re(qNe(t,e,o),{milliseconds:r.smartWaitingTimeout});}async function qNe(t,e,o){let{logger:n,iframeUrl:r}=e,{browser:i}=o;for(;Date.now()-t<i.smartWaitingTimeout;)if(await ya({action:async()=>KNe(e,o),frameConfig:r?{type:"url",url:r}:void 0,browser:i,logger:n}))return}async function KNe(t,e){let{testContext:o,logger:n}=t,{browser:r,abortSignal:i,localCodeEvalTools:a,orgId:s,generator:l}=e,c=t.description;o&&(c=await kl({orgId:s,s:c,context:o,localTools:a,signal:i,logger:n})),i.throwIfAborted();let u;try{u=await r.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2});}catch(f){throw new O("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${f instanceof Error?f.message:f}`)}let m=`data:image/jpeg;base64,${u.toString("base64")}`;i.throwIfAborted();let p=await l.getSmartWaitingDecision({description:c,screenshot:m},{abortSignal:i,loggerTags:$e(n)});return n.debug({result:p},"Got smart waiting result"),p.isPageReady}var YNe=3e4;async function GJ(t){return Wo().startAsyncSpan("ELEMENT_ASSERTION",async o=>XNe(t,o),{name:"Element check"})}async function XNe(t,e){let{command:o,timeoutMs:n,fixtures:r,disableCache:i}=t,{abortSignal:a}=r,s=()=>sP(o.cache)?o.cache:void 0,l=s(),c=!i&&!!l?.target&&mm(l.target),u=cloneDeep(l),d=(v=false)=>{if(l=s(),!!l)if(v){let E=uK(u,l);l.target=E.target,l.updatedAt=E.updatedAt;}else {if(!u){l=void 0;return}l.target=u.target,l.updatedAt=u.updatedAt;}},m=Date.now(),p=c?Math.max(n/10,YNe):0,f=m,h=0,g,b=500,y=false;for(;h<2||Date.now()-m<n;){h++,h>1&&await Te(b,a),a?.throwIfAborted(),l=s();let v=h===1,E=c&&Date.now()-f>=p;E&&(f=Date.now());let{result:P,elementWasFound:M}=await HJ({cacheToUse:l,skipAISmartWaiting:!v,useAIIfCacheFails:!c||E,params:t});if(g=P,y=y||M,P.success)break;d(),b=Math.min(b*1.25,1e4);}if(!g)throw new O("InternalPlatformError",`Failed to evaluate manual element assertion in ${n}ms.`);if(a?.throwIfAborted(),!g.success){let v=s(),E=v?.target?.memory?{target:{id:-1,memory:v.target.memory}}:void 0,{result:P,elementWasFound:M}=await HJ({cacheToUse:E,skipAISmartWaiting:true,useAIIfCacheFails:true,params:t});g=P,y=y||M,g.success||d(true);}let T=s();return g.success&&T?.target&&!y&&(T.target=cD(T.target),T.updatedAt=new Date),e.result={success:g.success,message:g.err?.message},g}async function HJ({cacheToUse:t,skipAISmartWaiting:e,useAIIfCacheFails:o,params:n}){let{command:r,disableCache:i,fixtures:a,tracer:s,targetingWrapper:l}=n,{logger:c}=a;if(r.target&&!al(r.target))throw new Error("Element assertion with x/y is not supported yet");let u=jp(r.assertion),d=JNe(r.assertion),m,p=false,f=cloneDeep(t);try{let{elementInteractedDisplayString:h,result:g,thoughts:b}=await l({tracer:s,command:r,target:r.target,cache:f?.target,action:async y=>ZNe(y.locator,n),options:{...r,allowNotActionableNodesOverride:d,allowIneligibleTagRedirect:d,showZeroOpacityElementsOverride:!0,disableCache:i,memory:f?.target?.memory,disableGlobalLocatorRedirect:!0,source:fg(r),skipAISmartWaiting:e,targetName:"target"},retriesWithAI:o?1:0});return m={success:g.success,data:g.data,err:g.err,elementInteractedDisplayString:h,thoughts:b},p=!0,g.success||(c.warn({aiThoughts:b,elementString:h,err:g.err},"Element check found an element but failed"),m={...g,thoughts:b}),{result:m,elementWasFound:p}}catch(h){if(u)return m={success:true,thoughts:`The element described does not exist on the page: ${h.message}`,err:void 0,data:void 0},{result:m,elementWasFound:p};if(!(h instanceof O)||h.reason!="ActionFailureError")throw h;return m={success:false,err:h,data:void 0,thoughts:void 0},c.warn({err:h},"Element check did not find an element and failed"),{result:m,elementWasFound:p}}}function JNe(t){return !(t.type==="ELEMENT_EXISTENCE"&&t.condition==="VISIBLE"&&!t.negated)}async function ZNe(t,{command:e,fixtures:o}){return await o.browser.highlight(t),await QNe(t,e.assertion)}async function QNe(t,e){let o=true,n,r;switch(e.type){case "ELEMENT_CONTENT":{let a=await t.textContent()??"";if(r={elementTextContent:Xo(a,500,true)},!Hr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let s=Wn(e);o=false,n=new O("AssertionFailureError",`The content ${s} '${e.value}': ${a}`);}break}case "ELEMENT_ATTRIBUTE":{r={elementOuterHtml:Xo(await t.evaluate(s=>s.cloneNode(false).outerHTML),500,true)};let a=null;try{a=await t.getAttribute(e.attr,{timeout:3e3});}catch(s){n=new O("AssertionFailureError",J(s)),o=false;break}if(!Hr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let s=Wn(e);o=false,e.operation==="EXISTS"?n=new O("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new O("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`);}break}case "ELEMENT_EXISTENCE":{switch(e.condition){case "VISIBLE":{o=await t.evaluate(async(s,l)=>{let c=Date.now();for(;Date.now()-c<l;){await new Promise(d=>setTimeout(d,250));let u=s.getBoundingClientRect();if(!(u.width===0||u.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return true}return false},_n*1e3);break}case "EDITABLE":{o=await t.isEditable({timeout:_n*1e3});break}case "EXISTS":{o=true;break}case "ENABLED":{o=await t.isEnabled({timeout:_n*1e3});break}case "FOCUSED":{o=await t.evaluate(s=>s===document.activeElement);break}default:return (s=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})(e.condition)}if(o=e.negated?!o:o,!o){let a=Wn(e);n=new O("AssertionFailureError",`The element ${a}`);}break}case "ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!Hr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:true})){let s=Wn(e);o=false,n=new O("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`);}break}case "ELEMENT_STYLE":{let a=await t.evaluate((s,l)=>window.getComputedStyle(s).getPropertyValue(l),e.property);if(!Hr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let s=Wn(e);o=false,e.operation==="EXISTS"?n=new O("AssertionFailureError",`The style property ${e.property} ${s}`):n=new O("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"})()}return {thoughts:void 0,success:o,data:r,err:n}}function qJ(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}async function Dy(t,e){let o=await t.screenshot(e),{width:n,height:r}=imageSize(o);return {buffer:o,width:Math.ceil(n),height:Math.ceil(r)}}async function YJ(t){let{command:e,browser:o,logger:n}=t;if(e.target&&!al(e.target))throw new Error("Visual Diff with x/y is not supported yet");return await o.waitForStability({logger:n}),Wo().startAsyncSpan("VISUAL_DIFF",async i=>{try{let a=await oLe(t);return i.result={success:!a.fail,message:a.thoughts},a}catch(a){throw a instanceof O&&(i.result={success:false,message:a.message}),a}},{name:"Compare against golden"})}async function oLe({tracer:t,command:e,disableCache:o,browser:n,targetingWrapper:r,logger:i,screenshotStorage:a}){let s={clearHighlights:true,hideCaret:true},l=e.target&&al(e.target)?e.target:void 0,c;l?.elementDescriptor?c=(await r({tracer:t,command:e,target:l,cache:e.cache?.target,action:async _=>Dy(n,{locator:_.locator,...s}),options:{...e,disableCache:o,disableGlobalLocatorRedirect:true,memory:e.cache?.target?.memory,targetName:"target"}})).result:c=await Dy(n,s);let u=await a.prepareGoldenScreenshotForComparison(i,e,c);if((c.height!==u.height||c.width!==u.width)&&i.warn({currHeight:c.height,currWidth:c.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(c.height-u.height)>10||Math.abs(c.width-u.width)>10){let k=`${c.width}x${c.height}`,_=`${u.width}x${u.height}`;return {fail:true,thoughts:`Current screenshot (${k}) does not match saved screenshot dimensions (${_}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:c.buffer,succeedImmediately:false,urlAfterCommand:n.url()}}let d=await Jimp.fromBuffer(c.buffer),m={width:c.width,height:c.height},p=await Jimp.fromBuffer(u.buffer),f={width:u.width,height:u.height},h,g=m.width*m.height,b=f.width*f.height,y=Math.abs(m.height-f.height),T=Math.abs(m.width-f.width);if(g>b){let k=d.cover({w:f.width,h:f.height});c.buffer=await k.getBuffer("image/jpeg"),h="current",c.width=f.width,c.height=f.height;}else if(b>g){let k=p.cover({w:m.width,h:m.height});u.buffer=await k.getBuffer("image/jpeg"),h="saved";}let v={data:Buffer.alloc(c.width*c.height*4),width:c.width,height:c.height},E=e.threshold??.1,M=B6(VL.decode(u.buffer).data,VL.decode(c.buffer).data,v.data,c.width,c.height,{threshold:E,diffColorAlt:[0,255,0]})/(c.width*c.height)*100,I=M>E*100,A=`Visual diff of ${M.toFixed(2)}% detected, which is ${I?"over":"under"} the threshold of ${E*100}%.`;if(h&&(A+=` The ${h} screenshot was cropped since it was taller by ${y} pixels and wider by ${T} pixels.`),I)throw new O("ActionFailureError",A);return {fail:I,thoughts:A,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:VL.encode(v,75).data,succeedImmediately:false,urlAfterCommand:n.url()}}var nLe=3e4;function rLe(t){if(!t.body)return {};switch(t.body.type){case "json":return {content:t.body.content,contentType:"application/json"};case "form-urlencoded":{let e=new URLSearchParams;return Object.entries(t.body.content).forEach(([o,n])=>{e.append(o,n);}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function _f({command:t,logger:e,baseUrl:o,fetchImplementation:n=fetch}){let r=t.timeout??nLe/1e3,i=Object.fromEntries(Object.entries(t.headers||{}).filter(([f,h])=>f&&h)),a=new URLSearchParams;Object.entries(t.params||{}).filter(([f,h])=>f&&h).forEach(([f,h])=>{a.append(f,h);});let s=a.toString(),l;if(Wp(t.url)&&(l=t.url),o&&Gp(t.url,o)&&(l=new URL(t.url,o).toString()),!l)throw new O("ActionFailureError",`Invalid URL: ${t.url}`);let c=l;e.info({url:c,searchParams:s,headers:i,body:t.body,method:t.method},"Making HTTP request");let d=await re((async()=>{let f=s?`${c}?${s}`:c;try{let h=rLe(t),g=new Headers(i);return h.contentType&&!g.has("Content-Type")&&g.set("Content-Type",h.contentType),await n(f,{headers:g,method:t.method,body:h.content})}catch(h){throw new Error(`Failed to make HTTP request: ${h}`,{cause:h})}})(),{milliseconds:r*1e3,fallback:()=>{throw new O("ActionFailureError",`Fetch request timed out after ${r} seconds`)}});if(!d.ok){let f;try{f=await d.text();}catch(h){f=`Failed to read response body: ${h}`;}throw new O("ActionFailureError",`Fetch request failed with status ${d.status}: ${f}`)}let m={};d.headers.forEach((f,h)=>{m[h]=f;});let p={status:d.status,headers:m,request:{url:d.url,method:t.method,headers:i}};if(t.body?.type==="json"&&t.body.content)try{p.request.json=JSON.parse(t.body.content);}catch{}if(d.headers.get("content-type")?.includes("json"))try{p.json=await d.json();}catch{}else d.headers.get("content-type")?.includes("text")&&(p.text=await d.text());return p}var iLe=5e3;async function ZJ({timeout:t=_n,...e}){let o=Date.now(),n=t*1e3,r=n+1e4,i,a=0,s=500;for(;a-o<n;){if(Date.now()-o>r){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let l=Date.now();i=await XJ(e),a=Date.now();let c=a-l;if(c>1e3&&e.logger.warn({pageAssertDuration:c},"Page assertion took longer than expected"),!i.success)await Te(s,e.signal),s=Math.min(Math.floor(s*1.5),iLe);else return i}return i=await XJ(e),i}async function XJ(t){return Wo().startAsyncSpan("PAGE_ASSERTION",async o=>{let n=await jL(t);return o.result={success:n.success,message:n.err?.message},n},{name:"Page check"})}async function jL({assertion:t,browser:e,autoExpandIframes:o}){switch(t.type){case "CONTENT":case "CONTENT":{let r,i=false,a;try{let s;if(o){let l=await e.evaluateFunctionInAllFrames(JJ,{value:t.value,negated:!!t.negated,returnHtml:!1});i=t.negated?l.every(c=>c.evaluation):l.some(c=>c.evaluation),s=l.find(c=>c.pageHtml)?.pageHtml;}else ({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(JJ,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let l=t.negated?vl.CONTAINS:Cl.CONTAINS;a=new O("AssertionFailureError",`The page ${l} '${t.value}'.`),r=s;}}catch(s){a=new O("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`);}return {success:i,err:a,data:i||!r?void 0:{pageContent:r}}}default:return (r=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}}function JJ({value:t,negated:e,returnHtml:o}){let n=document.body.innerHTML,r=n.includes(t)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:r,pageHtml:!r&&o?n:void 0}}var aLe=3e4;async function QJ({command:t,logger:e,baseUrl:o,fetchImplementation:n=fetch}){let r=t.timeout??aLe/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,m])=>d&&m));a["Content-Type"]="application/json";let s;if(Wp(t.url)&&(s=t.url),o&&Gp(t.url,o)&&(s=new URL(t.url,o).toString()),!s)throw new O("ActionFailureError",`Invalid URL: ${t.url}`);let c=await re((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:t.query,variables:t.variables?JSON.parse(t.variables):void 0}),signal:i.signal})}catch(d){throw new Error(`Failed to make HTTP request: ${d}`,{cause:d})}})(),{milliseconds:r*1e3});if(!c)throw new O("ActionFailureError",`GraphQL request timed out after ${r} seconds`);if(!c.ok){let d,m=await c.text();try{d=JSON.parse(m);}catch{throw new O("ActionFailureError",`GraphQL request failed with status ${c.status}: ${m}`)}throw d?.errors?.length&&d?.errors[0]?.message?new O("ActionFailureError",`GraphQL request failed with status ${c.status}: ${d.errors[0].message}`):new O("ActionFailureError",`GraphQL request failed with status ${c.status}: ${m}`)}let u={};return c.headers.forEach((d,m)=>{u[m]=d;}),{status:c.status,headers:u,json:await c.json()}}var NA=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;executionOptionsStack=[];recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:o,logger:n,storage:r,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:l,options:c}){this.orgId=i,this.options=c,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=r,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=l,this.localCodeEvalTools=a,this.generator=o,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 withExecutionOptions(e,o){this.executionOptionsStack.push(e);try{return await o()}finally{this.executionOptionsStack.pop();}}getCurrentExecutionOptions(){return this.executionOptionsStack[this.executionOptionsStack.length-1]??{}}async evaluateAiAction({goal:e,startingScreenshot:o,history:n,disableCache:r,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[l,c]=await Promise.all([nu(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:true,skipWaitForPageLoad:true,logger:s}),this.browser.screenshot({retries:1,clearHighlights:true})]),u=`data:image/jpeg;base64,${c.toString("base64")}`,d=await Bd({type:"ai-action",description:e,screenshot:u,serializedTree:l.serializedTree,tree:l.tree,fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),m={url:this.browser.url(),browserState:d,startingScreenshot:o,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(m,{disableCache:r,abortSignal:this.executeAbortController.signal,loggerTags:{...$e(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:o,history:n,actionHint:r,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let l=this.browser.url(),[c,u]=await Promise.all([nu(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:true,skipWaitForPageLoad:true,logger:a}),this.browser.screenshot({retries:1,clearHighlights:true})]),d=`data:image/jpeg;base64,${u.toString("base64")}`,m=await Bd({type:"ai-action",description:e,screenshot:d,serializedTree:c.serializedTree,tree:c.tree,fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),p={url:l,browserState:m,startingScreenshot:o,history:n,goal:e,actionHint:r,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(p,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...$e(a)},langfuseSessionId:s})}catch(f){throw new O("InternalWebAgentError",`Error generating command: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}}async getBrowserState(e){return nu(this.browser,e)}async locateElement(e){return await $L(e,this.getControllerFixtures())}async locateElementWithSelector(e,o){return ya({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({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:o?{type:"url",url:o}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(){return {browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??true}async wrapMultiElementTargetingCommand({tracer:e,command:o,targetNames:n,descriptions:r,caches:i,action:a,options:s,retriesWithAI:l=1}){let c=[];for(let u=0;u<r.length;u++){let d=r[u],m=await this.wrapElementTargetingCommand({tracer:e,command:o,target:d,cache:i[u],action:async p=>p,options:{...s,targetName:n[u]}});c.push(m);}try{let u=await a(...c.map(p=>p.result)),d=p=>p==="fromTarget"?"From Target":p==="toTarget"?"To Target":"Target",m=c.map((p,f)=>p.thoughts?`${d(n[f])}: ${p.thoughts}`:void 0).filter(p=>!!p).join(" -------------- ")||void 0;return {result:u,elementInteractedDisplayStrings:c.map(p=>p.elementInteractedDisplayString),thoughts:m}}catch(u){if(this.throwIfClosed(),l>0)return this.logger.warn({err:u},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({tracer:e,command:o,targetNames:n,descriptions:r,caches:r.map(()=>{}),action:a,options:s,retriesWithAI:l-1});throw new O("ActionFailureError",u.message,{errOptions:{cause:u}})}}async wrapHardcodedCssTargetingCommandHelper({target:e,action:o,options:n,command:r}){let i=this.logger.child({commandId:r.id}),{targetName:a}=n;if(e.type!=="description")throw new O("ActionFailureError","Cannot use selector with non-description target");let s,l=Date.now(),c=Date.now();for(;Date.now()-c<this.browser.smartWaitingTimeout;){l=Date.now();try{let u=await this.browser.resolveHardcodedCssSelector({selector:e.elementDescriptor,targetName:a,logger:i});return {result:await o({locator:u.locator,originalElementLocationResult:void 0,serverSideBoundingBox:null}),elementInteractedDisplayString:u.displayString}}catch(u){if(u.name==="AbortError")throw u;s=u,i.warn({err:u},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await Te(500);}}throw s}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:o,disableGlobalLocatorRedirect:n,logger:r}=e,i=Wo(),a=!n&&this.browser.userBrowserSettings.globalLocatorRedirect!==false;(this.browser.userBrowserSettings.visualActions||a)&&await i.startAsyncSpan("SCROLL_ELEMENT_INTO_VIEW",async()=>{await this.browser.scrollIntoViewIfNeeded(o.locator);});let s;return a&&(s=await i.startAsyncSpan("LOCATOR_REDIRECT",async l=>{let{targetingResult:c,metadata:u}=await this.browser.performTargetRedirection(o,r);if(l.result=u,u.outcome==="redirected to new element"&&c&&i.storeTraceAsset&&!this.browser.userBrowserSettings.disableBrowserMonitoring){let d=randomUUID();(async()=>{try{let m=await this.browser.screenshot({locator:c.locator,clearHighlights:!0,boundingBoxOverride:c.serverSideBoundingBox??void 0});i.storeTraceAsset?.({snapshotId:d,data:m});}catch(m){r.debug({err:m},"Failed to capture element screenshot for redirect trace");}})(),l.elementScreenshotSnapshotId=d;}return c})),s||(s={locator:o.locator,serverSideBoundingBox:await o.locator.boundingBox({timeout:ze}),originalElementLocationResult:o.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{cache:o,options:n,logger:r}=e,a=await Wo().startAsyncSpan("CACHE_RESOLUTION",async l=>{l.targetSource=o.targetSource,l.attributes.smartWaitingTimeoutMs=this.browser.smartWaitingTimeout;try{let c=await this.browser.resolveTarget(o,{allowNotActionableNodesOverride:n.allowNotActionableNodesOverride,logger:r,signal:this.executeAbortController.signal,...n.resolveTargetOptions,acceptElementMovedError:n.force});l.attributes.targetDisplayString=c.displayString,l.attributes.decisions=c.decisions;let u=c.decisions.find(d=>d.matched);return u&&(l.resolutionMethod=u.type),c}catch(c){throw c instanceof Ne&&(l.cacheMissReason=c.cacheMissReason,l.attributes.decisions=c.decisions),c}}),s=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:a,disableGlobalLocatorRedirect:n.disableGlobalLocatorRedirect,logger:r});return n.force||await a.revalidator?.(),{resolutionResult:a,finalTarget:s}}async wrapElementTargetingCommand(e){return await ya({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{tracer:o,target:n,action:r,options:i,command:a,finalAttempt:s=false,originalCache:l=e.cache}=e,{retriesWithAI:c=1}=e,{disableCache:u,useSelector:d,targetName:m}=i,p=Wo(),f=this.logger.child({commandId:a.id}),h=this.shouldUseMemory(),g=cloneDeep(e.cache);if((!g||u)&&!HU(n))throw new O("ActionFailureError","Cannot target element with no cached data or element descriptor");if(d)return this.wrapHardcodedCssTargetingCommandHelper(e);let b=false,y;u&&(f.info("Cache explicitly disabled for this step"),b=true,y="Cache explicitly disabled",g=void 0);let T=OJ({cache:g,description:n.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:f});g=T.cache,b=b||T.cacheBustedBeforeAction,!y&&T.cacheBustReason&&(y=T.cacheBustReason);let v=true;if(!_J(g))return c--,v=false,this.executeTargetingCommandWithAI({tracer:p,stepTracer:o,target:n,options:i,command:a,action:r,originalCache:l,logger:f,useMemory:h,cacheBustedBeforeAction:b,cacheBustReason:y});try{let{resolutionResult:E,finalTarget:P}=await this.resolveCachedTargetForAction({cache:g,options:i,logger:f}),M=await r(P);if(Qe.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:1.4.6"]),kC({cmd:a,key:m,newTarget:g,logger:f,updatedWithAI:!1}),v){let I=E.decisions.filter(A=>A.matched);if(I.length!==1)f.warn({decisions:E.decisions},"Expected exactly 1 matching method for element location, got more or less");else {let A=I[0].type;o.recordTargetAutoHeal({healType:A});}}return {result:M,elementInteractedDisplayString:E.displayString}}catch(E){this.throwIfClosed();let P=EP(E);if(P&&!s)return f.warn({err:E},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({tracer:o,command:a,target:n,action:r,cache:l,originalCache:l,retriesWithAI:c,finalAttempt:true,options:i});if(E instanceof O&&!P)throw f.warn({err:E},"Failed to execute command with target (fatal)"),E;if(c>0&&n){f.info({err:E},"Failed to execute action with cached target, retrying with AI"),Qe.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:1.4.6",`missReason:${E instanceof Ne?E.cacheMissReason:"unknown"}`]);let M;g.memory&&WU(g.memory)&&(M=g.memory);let I=E instanceof Ne&&E.cacheMissReason==="failing-ldist";return this.wrapElementTargetingCommandHelper({tracer:o,command:a,target:n,cache:void 0,action:r,originalCache:l,retriesWithAI:c,finalAttempt:true,options:{...i,memory:M,targetHealingInProgress:true},skipInitialLocateWait:I})}throw new O("ActionFailureError",`Failed to execute interactive command: ${E instanceof Error?E.message:`${E}`}`,{errOptions:{cause:E}})}}async executeTargetingCommandWithAI(e){let{tracer:o,stepTracer:n,target:r,options:i,command:a,action:s,originalCache:l,logger:c,useMemory:u,cacheBustedBeforeAction:d,cacheBustReason:m,skipInitialLocateWait:p}=e;c.info({description:r.elementDescriptor,targetHealingInProgress:i.targetHealingInProgress,cacheBustedBeforeAction:d,memory:i.memory,useMemory:u},"Prompting AI for an updated element location");let f=false;(d||!l)&&!this.getCurrentExecutionOptions().skipAISmartWaiting&&!i.skipAISmartWaiting?(await o.startAsyncSpan("SMART_WAITING",async()=>await jJ({description:r.elementDescriptor,iframeUrl:i.iframeUrl,source:i.source,logger:c,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride},this.getControllerFixtures())),f=true):(d||!l)&&(i.skipAISmartWaiting?c.debug("Skipping AI smart waiting for this targeting attempt"):c.debug("Skipping AI smart waiting due to controller execution options"));let h=2;for(let g=1;g<=h;g++){let b=false,y=this.browser.getActiveFrameConfig(),T=i.force||g>1;try{let v;try{v=await $L({description:r.elementDescriptor,disableCache:!!i.disableCache,iframeUrl:i.iframeUrl,source:i.source,useMemory:u,memory:u?i.memory:void 0,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride,allowIneligibleTagRedirect:i.allowIneligibleTagRedirect,showZeroOpacityElementsOverride:i.showZeroOpacityElementsOverride,logger:c,skipWait:f||p,isAutoHeal:!!i.targetHealingInProgress,cacheBustReason:m,acceptElementMovedError:T},this.getControllerFixtures());}catch(M){if(M instanceof ds&&M.updatedLocatorMemory){let I={id:-1,...l,memory:M.updatedLocatorMemory};kC({cmd:a,key:i.targetName,newTarget:I,logger:c,updatedWithAI:!0});}throw M}v.frameConfig&&(this.browser.setActiveFrameConfig(v.frameConfig),b=!0);let E=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:v.resolution,disableGlobalLocatorRedirect:i.disableGlobalLocatorRedirect,logger:c}),P=await s(E);return kC({cmd:a,key:i.targetName,newTarget:v.target,logger:c,updatedWithAI:!0}),i.targetHealingInProgress&&(n.recordTargetAutoHeal({healType:"AI"}),v.target.targetSource="AI_HEALED",v.target.targetUpdateTime=new Date().toUTCString(),v.target.targetUpdateLoggerTags=$e(c)),{result:P,elementInteractedDisplayString:v.resolution.displayString,thoughts:v.thoughts}}catch(v){if(b&&this.browser.setActiveFrameConfig(y),this.throwIfClosed(),g<h&&EP(v)){c.warn({err:v,aiAttempt:g},"Encountered retryable AI targeting error; retrying with AI once");continue}throw v instanceof O?v:new O("ActionFailureError",v.message)}}throw new O("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return Dy(this.browser,e)}async executePresetCommand(e,o,n,r,i){this.options?.slowMoMs&&await Te(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),l;try{l=await this.resolveCommandTemplateStrings(o,n);}catch(c){throw this.throwIfClosed(),new O("ActionFailureError",`Failed to substitute template strings in command: ${c.message}`,{errOptions:{cause:c}})}try{let c=await We({name:`cli.command.${o.type}`,attributes:{"momentic.command_type":o.type,"momentic.command_id":o.id},fn:()=>this.executePresetCommandHelper(e,o,n,r,i)});return this.options?.autoFollowNewTabs&&await IJ({beforeUrl:s,command:o,beforePages:a.map(u=>u.url),browser:this.browser,logger:this.logger}),c}catch(c){throw c.name!=="AbortError"&&this.logger.error({err:c},"Error thrown in action controller"),c}finally{Rf(o,l);}}createCallbacksForBrowser(e){return {createIsolatedFolder:()=>bL(e)}}async traceBrowserInteraction(e,o,n){return Wo().startAsyncSpan("BROWSER_INTERACTION",async i=>o(i),{name:e,...n})}async resolveCommandTemplateStrings(e,o){return Af({obj:e,context:o,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,o,n,r,i){r=r||"disableCache"in o&&!!o.disableCache;let a=this.logger.child({commandId:o.id});switch(o.type){case "SUCCESS":{let s=o.condition;return s?.assertion.trim()?DA({command:s,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),logger:a,recoveryHint:i}):{succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "AI_ASSERTION":{if(!o.assertion.trim())throw new O("ActionFailureError","Missing assertion");if(o.timeout&&o.timeout>1800)throw new O("AssertionFailureError",`AI check timeout of ${o.timeout} exceeds the maximum allowed value of 30 minutes.`);return DA({command:o,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),logger:a,recoveryHint:i})}case "AI_EXTRACT":return VJ({command:o,logger:a,fixtures:this.getControllerFixtures(),disableCache:r});case "NAVIGATE":if(!Wp(o.url)&&!Gp(o.url,this.browser.baseUrl))throw new O("ActionFailureError",`Invalid URL provided to navigate command: ${o.url}`);await this.traceBrowserInteraction("Navigate",()=>this.browser.navigate({url:o.url,loadTimeoutMs:o.loadTimeout?o.loadTimeout*1e3:void 0}));break;case "DIALOG":this.browser.registerDialogHandler(o.action);break;case "CAPTCHA":throw new O("UserConfigurationError","Captcha solving is no longer available on Momentic");case "GO_BACK":await this.traceBrowserInteraction("Go back",()=>this.browser.goBack());break;case "GO_FORWARD":await this.traceBrowserInteraction("Go forward",()=>this.browser.goForward());break;case "SCROLL_LEFT":case "SCROLL_RIGHT":case "SCROLL_DOWN":case "SCROLL_UP":{let s,l;if(o.target&&ss(o.target)){let d=bo(o.target.pixels);await this.browser.hoverUsingVisualCoordinates(d);}else if(o.target&&o.target.elementDescriptor.trim()){let{elementInteractedDisplayString:d,thoughts:m}=await this.wrapElementTargetingCommand({tracer:e,command:o,target:o.target,cache:o.cache?.target,action:p=>this.browser.hover(p),options:{...o,targetName:"target",disableGlobalLocatorRedirect:true,disableCache:r}});s=d,l=m;}let c=this.browser.getViewport()?.height??oc.height,u=this.browser.getViewport()?.width??oc.width;switch(o.type){case "SCROLL_UP":await this.traceBrowserInteraction("Scroll up",()=>this.browser.scrollVertical(-(o.deltaY??c)));break;case "SCROLL_DOWN":await this.traceBrowserInteraction("Scroll down",()=>this.browser.scrollVertical(o.deltaY??c));break;case "SCROLL_LEFT":await this.traceBrowserInteraction("Scroll left",()=>this.browser.scrollHorizontal(-(o.deltaX??u)));break;case "SCROLL_RIGHT":await this.traceBrowserInteraction("Scroll right",()=>this.browser.scrollHorizontal(o.deltaX??u));break}return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "WAIT_FOR_URL":{if(o.timeout&&o.timeout>1800)throw new O("UserConfigurationError",`Wait for URL timeout of ${o.timeout} exceeds the maximum allowed value of 30 minutes.`);let s=o.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:s},{timeout:o.timeout?o.timeout*1e3:void 0,negated:o.negated,caseInsensitive:o.caseInsensitive});break}case "WAIT":{if(o.delay>1800)throw new O("UserConfigurationError",`Wait timeout of ${o.delay} seconds exceeds the maximum allowed value of 30 minutes`);let s=o.delay*1e3;await Te(s,this.executeAbortController.signal);break}case "REFRESH":await this.traceBrowserInteraction("Refresh",()=>this.browser.refresh({loadTimeoutMs:o.loadTimeout?o.loadTimeout*1e3:void 0}));break;case "CLICK":{if(ss(o.target)){let m=bo(o.target.pixels),p={...o,relativePosition:o.relativePosition?bo(o.relativePosition):void 0};await this.traceBrowserInteraction("Click",()=>this.browser.clickUsingVisualCoordinates(m,p),{coordinates:m});break}let s=this.browser.url(),{elementInteractedDisplayString:l,result:c,thoughts:u}=await this.wrapElementTargetingCommand({tracer:e,target:o.target,command:o,cache:o.cache?.target,action:m=>this.traceBrowserInteraction("Click",async p=>{let f={...o,relativePosition:o.relativePosition?bo(o.relativePosition):void 0},h=await this.browser.click(m,this.createCallbacksForBrowser(this.orgId),f);return h.coordinates&&(p.coordinates=h.coordinates),h},{selector:m.locator.toString()}),options:{...o,targetName:"target",disableCache:r}}),d={urlAfterCommand:this.browser.url(),succeedImmediately:false,elementInteracted:l,thoughts:u,data:c.downloadedFile?{downloadedFile:c.downloadedFile}:void 0};return KC(s,d.urlAfterCommand)&&(d.succeedImmediately=true,d.succeedImmediatelyReason="URL changed"),d}case "COPY":return await this.browser.copy(o.value),{succeedImmediately:false,data:o.value,urlAfterCommand:this.browser.url()};case "PASTE":{await this.browser.paste();break}case "DRAG":{if(ss(o.fromTarget)&&ss(o.toTarget)){let c=bo(o.fromTarget.pixels),u=bo(o.toTarget.pixels);await this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDropUsingVisualCoordinates(c,u,{hoverDurationMs:o.hoverSeconds?o.hoverSeconds*1e3:void 0}),{coordinates:c});break}if(ss(o.fromTarget)||ss(o.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:s,thoughts:l}=await this.wrapMultiElementTargetingCommand({tracer:e,command:o,targetNames:["fromTarget","toTarget"],descriptions:[o.fromTarget,o.toTarget],caches:[o.cache?.fromTarget,o.cache?.toTarget],action:(c,u)=>this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDrop(c,u,{hoverDurationMs:o.hoverSeconds?o.hoverSeconds*1e3:void 0,steps:o.steps})),options:{...o,disableCache:r}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s[0],thoughts:l}}case "MOUSE_DRAG":{let s=parseInt(o.deltaX),l=parseInt(o.deltaY),c=o.steps??5;if(isNaN(s)||isNaN(l))throw new O("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${o.deltaX}, ${o.deltaY})`);if(o.target&&ss(o.target)){let m=bo(o.target.pixels);await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDragUsingVisualCoordinates({deltaX:s,deltaY:l,steps:c,fromTarget:m}),{coordinates:m});break}let u,d;if(o.target?.elementDescriptor){let{elementInteractedDisplayString:m,thoughts:p}=await this.wrapElementTargetingCommand({tracer:e,command:o,target:o.target,cache:o.cache?.target,action:async f=>this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(s,l,c,f.locator,{force:o.force})),options:{...o,targetName:"target",disableCache:r}});u=m,d=p;}else await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(s,l,c,void 0,{force:o.force}));return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:u,thoughts:d}}case "SELECT_OPTION":{if(!al(o.target))throw new Error("Select with x/y is not supported yet");let s=o.target.elementDescriptor,l=o.choice,{elementInteractedDisplayString:c,thoughts:u}=await this.wrapElementTargetingCommand({tracer:e,command:o,target:{type:"description",elementDescriptor:s},cache:o.cache?.target,action:d=>this.traceBrowserInteraction("Select option",()=>this.browser.selectOption(d,l,o.force),{value:l.type==="LABEL"?l.label:l.type==="VALUE"?l.value:l.index}),options:{...o,targetName:"target",disableCache:r,source:fg(o)}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:c,thoughts:u}}case "TAB":{let s={loadTimeoutMs:o.loadTimeout?o.loadTimeout*1e3:void 0,retry:true};await this.browser.switchToPage(o.action,s);break}case "NEW_TAB":await this.browser.createNewTab(o.url,{loadTimeoutMs:o.loadTimeout?o.loadTimeout*1e3:void 0});break;case "CLOSE_TAB":await this.browser.closePage(o.action,{retry:true});break;case "COOKIE":{if(!o.value)break;let s=await this.browser.setCookie(o.value);a.debug({results:s},"Set cookies");break}case "LOCAL_STORAGE":if(!o.value||!o.key)break;await this.browser.setLocalStorage(o.key,o.value);break;case "JAVASCRIPT":{let s;try{o.environment==="BROWSER"?(s=await this.browser.evaluateCodeInPage({code:o.code,fragment:o.fragment??!1,context:n.toObjectCopy(),timeoutMs:o.timeout?o.timeout*1e3:void 0}),a.info({result:s},"Executed JavaScript in browser")):s=await fa({orgId:this.orgId,code:o.code,fragment:!!o.fragment,context:n,timeoutMs:o.timeout?o.timeout*1e3:void 0,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async l=>{if(!this.options?.scratchPadId){a.warn({updates:l},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:l,logger:a});}}});}catch(l){throw this.throwIfClosed(),new O("ActionFailureError",l instanceof Error?l.message:`${l}`,{errOptions:{cause:l}})}try{JSON.stringify(s);}catch(l){throw new O("ActionFailureError",`Return value is not serializable: ${l instanceof Error?l.message:`${l}`}`,{errOptions:{cause:l}})}return {urlAfterCommand:this.browser.url(),succeedImmediately:false,data:s}}case "TYPE":{if(o.target&&ss(o.target)){let p=bo(o.target.pixels),f={...o,relativePosition:o.relativePosition?bo(o.relativePosition):void 0};await this.browser.clickUsingVisualCoordinates(p,f),await this.traceBrowserInteraction("Type",()=>this.browser.type(o.value,{force:o.force,clearContent:o.clearContent,forceClearContent:o.forceClearContent,delay:o.delay,pressEnter:o.pressEnter},true),{value:o.value});break}let s=this.browser.url(),l,c,u=cloneDeep(o.target),d=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(u){let{elementInteractedDisplayString:p,thoughts:f}=await this.wrapElementTargetingCommand({tracer:e,command:o,target:u,cache:o.cache?.target,action:h=>this.traceBrowserInteraction("Type",()=>this.browser.typeIntoTarget(o.value,h,{force:o.force,clearContent:o.clearContent,forceClearContent:o.forceClearContent,delay:o.delay,pressEnter:o.pressEnter,relativePosition:o.relativePosition}),{value:o.value,selector:h.locator.toString()}),options:{...o,targetName:"target",disableCache:r,disableGlobalLocatorRedirect:!d,source:fg(o)}});l=p,c=f;}else await this.traceBrowserInteraction("Type",()=>this.browser.type(o.value,{force:o.force,clearContent:o.clearContent,forceClearContent:o.forceClearContent,delay:o.delay,pressEnter:o.pressEnter},true),{value:o.value});let m={urlAfterCommand:this.browser.url(),succeedImmediately:false,elementInteracted:l,thoughts:c};return KC(s,m.urlAfterCommand)&&(m.succeedImmediately=true,m.succeedImmediatelyReason="URL changed"),m}case "HOVER":{if(ss(o.target)){let c=bo(o.target.pixels);await this.traceBrowserInteraction("Hover",()=>this.browser.hoverUsingVisualCoordinates(c),{coordinates:c});break}let{elementInteractedDisplayString:s,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,command:o,target:o.target,cache:o.cache?.target,action:c=>this.traceBrowserInteraction("Hover",()=>this.browser.hover(c,{relativePosition:o.relativePosition?bo(o.relativePosition):void 0}),{selector:c.locator.toString()}),options:{...o,targetName:"target",disableCache:r}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "FOCUS":{if(!al(o.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:s,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,command:o,target:o.target,cache:o.cache?.target,action:c=>this.browser.focus(c),options:{...o,targetName:"target",disableCache:r}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "BLUR":{if(o.target&&!al(o.target))throw new Error("Blur with x/y is not supported yet");if(!o.target||!o.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:false,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:s,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,target:o.target,command:o,cache:o.cache?.target,action:c=>this.browser.blur(c),options:{...o,targetName:"target",disableCache:r}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "PRESS":{let s=this.browser.url();await this.traceBrowserInteraction("Press key",()=>this.browser.press(o.value,{repeat:o.repeat,convertMeta:o.convertMeta??true,delayMs:o.delayMs}),{value:o.value});let l={urlAfterCommand:this.browser.url(),succeedImmediately:false};return KC(s,l.urlAfterCommand)&&(l.succeedImmediately=true,l.succeedImmediatelyReason="URL changed"),l}case "KEY_DOWN":return await this.browser.keyDown(o.value,{convertMeta:o.convertMeta??true}),{urlAfterCommand:this.browser.url(),succeedImmediately:false};case "KEY_UP":return await this.browser.keyUp(o.value,{convertMeta:o.convertMeta??true}),{urlAfterCommand:this.browser.url(),succeedImmediately:false};case "REQUEST":{let s=new CookieJar,l=lLe(fetch,s),c;try{c=new URL(o.url).hostname;}catch{}let u=await _f({command:o,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:l});return {data:Du.parse({...u,cookies:Gm(s,c)}),succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "GRAPHQL_REQUEST":return {data:await QJ({command:o,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:false,urlAfterCommand:this.browser.url()};case "VISUAL_DIFF":return YJ({tracer:e,command:o,disableCache:r,browser:this.browser,logger:a,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:s=>this.wrapElementTargetingCommand(s)});case "FILE_UPLOAD":{let s,l;if(o.fileSource.type==="URL"?(l=o.fileSource.url,s=await bX({uri:o.fileSource.url,logger:a,orgId:this.orgId})):o.fileSource.type==="USER_FILE"&&(l=o.fileSource.name,s=await this.uploadedFileStorage?.getFileForUpload(o.fileSource.name,this.orgId)),!s)throw new O("UserConfigurationError",`Attempted to use non-existent file for upload step: ${l}`);await this.browser.setFileChooserHandler({...s,filename:o.filename});break}case "AUTH_SAVE":{let s=await this.browser.saveAuthState();if(o.storageState&&vD(o.storageState)){let l=Oo__default.resolve(o.storageState);Bn__default.mkdirSync(Oo__default.dirname(l),{recursive:true}),Bn__default.writeFileSync(l,`${JSON.stringify(s,null,2)}
5736
5736
  `,"utf8");}return {data:s,succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "AUTH_LOAD":{let s;if(vD(o.storageState))try{s=JSON.parse(Bn__default.readFileSync(Oo__default.resolve(o.storageState),"utf8"));}catch(c){throw new O("UserConfigurationError",`Failed to read auth state from '${o.storageState}': ${J(c)}`,{errOptions:{cause:c}})}else if(!o.storageState.trim())s=void 0;else if(s=await fa({orgId:this.orgId,code:o.storageState,fragment:false,context:n,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof s!="object")throw new O("ActionFailureError",`Credentials must evaluate to an object (received ${typeof s} instead)`);let l;try{l=mV.optional().parse(s);}catch(c){throw new O("ActionFailureError",`Credentials provided do not follow the required format: ${c}`)}await this.browser.loadAuthState(l);break}case "ELEMENT_CHECK":{let s=(o.timeout??_n)*1e3,l=this.generator.getAgentConfig()?.assertion;if(qJ(o.assertion)&&!o.useSelector&&o.target.type==="description"&&l&&l!=="v1"){let u={id:o.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: ${o.target.elementDescriptor}`,iframeUrl:o.iframeUrl,timeout:o.timeout,source:"NEGATED_CHECK",cache:o.cache&&"memory"in o.cache?{memory:o.cache?.memory}:void 0};try{let d=await DA({command:u,logger:a,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory()});return {succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${d.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:d.afterScreenshotOverride}}finally{u.cache?.memory&&zb(o,u.cache?.memory.traces,a);}}let c=await GJ({command:o,tracer:e,timeoutMs:s,targetingWrapper:u=>this.wrapElementTargetingCommand(u),fixtures:this.getControllerFixtures(),disableCache:r});return {fail:!c.success,data:c.data,elementInteracted:c.elementInteractedDisplayString,thoughts:c.err?.message??c.thoughts??`Element assertion ${c.success?"succeeded":"failed"}.`,succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "PAGE_CHECK":{let s=await ya({action:async()=>ZJ({assertion:o.assertion,browser:this.browser,logger:a,timeout:o.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:o.iframeUrl?{type:"url",url:o.iframeUrl}:void 0,browser:this.browser,logger:a});return {fail:!s.success,data:s.data,thoughts:s.success?"Page assertion passed.":s.err?.message??`Page assertion still failing after ${o.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:false}}case "REGISTER_REQUEST_LISTENER":{let s=new tu(o.requestMatcher),l=this.browser.registerRequestListener(s);return this.registeredListeners[o.key]=l.then(async c=>await EL(c)).catch(c=>{a.error({err:c},"Failed to get request listener response");}),{succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "AWAIT_LISTENER":{let s=this.registeredListeners[o.key];if(!s)throw new O("ActionFailureError",`No listener registered with key: ${o.key}`);let l=o.timeout??10;return {data:await re(s,{milliseconds:l*1e3,message:`Request listener timed out after ${l} seconds`}),succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "RECORD_REQUESTS":{let s=new tu(o.requestMatcher);return this.recordedRequests[o.key]={},this.browser.registerRequestRecorder(o.key,{matches:l=>s.matches({url:l.request.url,method:l.request.method}),onRequestStart:(l,c)=>{this.recordedRequests[o.key][l]=CA(c);},onRequestComplete:(l,c)=>{this.recordedRequests[o.key]?.[l]&&(this.recordedRequests[o.key][l]=CA(c));}}),{succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "GET_RECORDED_REQUESTS":{let s=this.recordedRequests[o.key];if(!s)throw new O("ActionFailureError",`No recorder registered with key: ${o.key}`);return delete this.recordedRequests[o.key],{data:Object.values(s),succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "SET_HEADER":{let s;return o.requestMatcher&&(s=new tu(o.requestMatcher)),this.browser.setHeader(o.name,o.value,s),{succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "MOCK_ROUTE":return {data:{key:this.browser.registerMock(o.key,new tu(o.requestMatcher),async(l,c)=>{let u=await fa({orgId:this.orgId,code:o.responseGenerator,fragment:false,context:n,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:l,response:c},disallowVariableUpdates:true,responseSerialization:"RESPONSE"}),d=qV.parse(u);return new Response(d.body,{status:d.status,headers:d.headers})},o.fetchOriginalResponse??false)},succeedImmediately:false,urlAfterCommand:this.browser.url()};case "REMOVE_ROUTE_MOCK":return this.browser.removeMock(o.key),{succeedImmediately:false,urlAfterCommand:this.browser.url()};case "OFFLINE_MODE":return await this.browser.setOfflineMode(o.enable),{succeedImmediately:false,urlAfterCommand:this.browser.url()};default:return (l=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}return {succeedImmediately:false,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:o,disableCache:n,screenshot:r}){return (await this.generator.getReverseMappedDescription({browserState:e,target:o,screenshot:r},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:$e(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights();}async startRecordMode({params:e,abortController:o,isClickToRecord:n}){this.recordAbortController=o;let r=new PA({signal:o.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,r,n),r}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:true,abortSignal:this.executeAbortController.signal,loggerTags:$e(this.logger)})}async getFailureRecoveryPlan(e,o){return this.generator.getFailureRecoveryPlan(e,{disableCache:true,abortSignal:this.executeAbortController.signal,loggerTags:$e(o??this.logger)})}};function Rt({text:t,section:e}){if(!e)return [{type:"text",text:t}];let o=`### ${e}`;return t.length===0?[{type:"text",text:o}]:[{type:"text",text:`${o}
5737
5737
  ${t}`}]}function qL({base64Data:t,mediaType:e,section:o}){return o?[{type:"text",text:`### ${o}`},{type:"media",data:t,mediaType:e}]:[{type:"media",data:t,mediaType:e}]}function Ny(t){if(t.length===0)throw new It("No content parts provided to construct the tool response content.");return {type:"content",value:t}}function Ly(t){return {type:"content",value:[{type:"text",text:t}]}}function t7({projectRoot:t,filePath:e,pathLabel:o="path"}){if(!e||!Oo__default.isAbsolute(e))return e;let n=Oo__default.relative(t,e);if(n.startsWith("..")||Oo__default.isAbsolute(n))throw new Error(`Error: ${o} "${e}" must be inside project root "${t}".`);return n}function o7(t){return t.map(e=>{switch(e.type){case "text":return e;case "media":return {type:"image",data:e.data,mimeType:e.mediaType};default:return (n=>{throw new Error("Unhandled content part")})()}})}var KL="We are scrolling the device in search of the element described below. Return -1 unless there is a strong match clearly visible in the current viewport. Description:";function LA(t){return `${KL} ${t}`}function ru(t,e){if(t===e)return true;let o=n=>n.startsWith(KL)?n.slice(KL.length).trim():n;return o(t)===o(e)}var uLe=[400,401,403,404,408,409,413,429,498,500,502,503,504],dLe=["overloaded","service unavailable","bad gateway","too many requests","toomanyrequests","internal server error","gateway timeout","timed out","rate_limit","ratelimit","rate limit","wrong-key","unexpected","capacity","timeout","terminated","other side closed","connection closed","upstream_closed","server_error","websocket unavailable","websocket connection closed","you can retry your request","socket disconnected before secure tls connection","socket hang up","econnreset","etimedout","econnrefused","eai_again","epipe","429","500","502","503","504"];function n7(t){if(t&&typeof t=="object"&&"statusCode"in t){let o=t.statusCode;if(typeof o=="number"&&(uLe.includes(o)||o>500))return true}let e=r7(t).toLowerCase();return dLe.some(o=>e.includes(o))}function r7(t){if(t instanceof Error){let e="cause"in t?t.cause:void 0,o="code"in t&&typeof t.code=="string"?t.code:"";return `${t.name} ${t.message} ${o} ${r7(e)}`}if(typeof t=="string")return t;if(t&&typeof t=="object")try{return JSON.stringify(t)}catch{return ""}return ""}var mLe="language model provider fallback failed (fatal)",pLe="Language model provider fallback committing partial step after client tool call",fLe={inputTokens:{total:0,noCache:0,cacheRead:0,cacheWrite:0},outputTokens:{total:0,text:0,reasoning:0}};function a7(t){return new YL(t)}var YL=class{specificationVersion="v3";settings;retryAfterOutput;models;constructor(e){if(this.settings=e,this.models=[...e.models],this.retryAfterOutput=e.retryAfterOutput??true,this.models.length===0)throw new Error("No models available in settings")}get supportedUrls(){return this.currentModel.supportedUrls}get modelId(){return this.currentModel.modelId}get provider(){return this.currentModel.provider}doGenerate(e){return this.retry(()=>this.currentModel.doGenerate(e))}doStream(e){return this.retry(async()=>{let o=await this.currentModel.doStream(e);return {...o,stream:this.createRetryingStream({stream:o.stream,options:e})}})}get currentModel(){let e=this.models[0];if(!e)throw new Error("No model available at current fallback index");return e}moveCurrentModelToBack(){let e=this.models.shift();e&&this.models.push(e);}shouldRetry(e){return this.settings.shouldRetryThisError?this.settings.shouldRetryThisError(e):n7(e)}async notifyError(e){await this.settings.onError?.(e,this.modelId);}logFatal(e){this.settings.logger.error({err:e,modelId:this.modelId,provider:this.provider},mLe);}async retry(e){let o=this.models.length;for(let n=0;n<o;n++)try{return await e()}catch(r){if(!this.shouldRetry(r))throw this.logFatal(r),r;await this.notifyError(r);let i=n===o-1;if(i&&this.logFatal(r),this.moveCurrentModelToBack(),i)throw r}throw new Error("No models available in settings")}createRetryingStream(e){let{stream:o,options:n}=e,r={hasStreamedAny:false,hasEmittedClientExecutedToolCall:false,remainingFallbackAttempts:this.models.length-1};return new ReadableStream({start:async i=>{let a;try{a=o.getReader(),await this.pipeStreamToController({reader:a,controller:i,retryState:r}),i.close();}catch(s){await this.retryStreamAfterError({error:s,options:n,controller:i,retryState:r});}finally{i7(a);}}})}async pipeStreamToController(e){let{reader:o,controller:n,retryState:r}=e,i=await o.read();for(;!i.done;){let a=i.value;if(r&&a.type==="error"&&this.shouldRetry(a.error))throw a.error;n.enqueue(a),r&&(r.hasStreamedAny||=a.type!=="stream-start",a.type==="tool-call"&&a.providerExecuted!==true&&(r.hasEmittedClientExecutedToolCall=true)),i=await o.read();}}async retryStreamAfterError(e){let{error:o,options:n,controller:r,retryState:i}=e;if(!this.shouldRetry(o)){this.logFatal(o),r.error(o);return}await this.notifyError(o);let a=i.hasStreamedAny&&!this.retryAfterOutput;if(i.hasEmittedClientExecutedToolCall&&!a&&i.remainingFallbackAttempts>0){this.commitPartialStepAndFailover({controller:r});return}if(i.hasEmittedClientExecutedToolCall||a||i.remainingFallbackAttempts<=0){this.logFatal(o),r.error(o);return}this.moveCurrentModelToBack(),i.remainingFallbackAttempts-=1;let s;try{s=(await this.currentModel.doStream(n)).stream.getReader(),await this.pipeStreamToController({reader:s,controller:r,retryState:i}),r.close();}catch(l){await this.retryStreamAfterError({error:l,options:n,controller:r,retryState:i});}finally{i7(s);}}commitPartialStepAndFailover(e){let{controller:o}=e;this.settings.logger.info({modelId:this.modelId,provider:this.provider},pLe),this.moveCurrentModelToBack(),o.enqueue({type:"finish",finishReason:{unified:"tool-calls",raw:"tool-calls"},usage:fLe}),o.close();}};function i7(t){try{t?.releaseLock();}catch{}}var gLe=new Set(["itemId","reasoningEncryptedContent"]);function s7({model:t,logger:e,logMessage:o}){return wrapLanguageModel({model:t,middleware:{specificationVersion:"v3",transformParams:async({params:r})=>{let{messages:i,wasPruned:a}=bLe(r.prompt);return a&&e.info({messageCount:i.length,fallbackModel:t.modelId},o),{...r,prompt:i}}}})}function bLe(t){let e=false,o=[];for(let n of t){let{message:r,wasPruned:i}=yLe(n);e=e||i,r&&o.push(r);}return {messages:o,wasPruned:e}}function yLe(t){let e=l7(t.providerOptions),o=e.wasPruned;switch(t.role){case "system":return {message:{...t,providerOptions:e.providerOptions},wasPruned:o};case "assistant":{let n=[];for(let i of t.content){if(i.type==="reasoning"){o=true;continue}n.push(i);}let r=XL(n);return o=o||r.wasPruned,r.parts.length===0?{message:void 0,wasPruned:true}:{message:{...t,content:r.parts,providerOptions:e.providerOptions},wasPruned:o}}case "user":{let n=XL(t.content);return o=o||n.wasPruned,{message:{...t,content:n.parts,providerOptions:e.providerOptions},wasPruned:o}}case "tool":{let n=XL(t.content);return o=o||n.wasPruned,{message:{...t,content:n.parts,providerOptions:e.providerOptions},wasPruned:o}}}}function l7(t){if(!t)return {providerOptions:t,wasPruned:false};let e=false,o={};for(let[n,r]of Object.entries(t)){let i={};for(let[a,s]of Object.entries(r)){if(gLe.has(a)){e=true;continue}s!==void 0&&(i[a]=s);}Object.keys(i).length>0&&(o[n]=i);}return {providerOptions:Object.keys(o).length>0?o:void 0,wasPruned:e}}function XL(t){let e=false;return {parts:t.map(o=>{let n=SLe(o);return e=e||n.wasPruned,n.part}),wasPruned:e}}function SLe(t){let e=l7(t.providerOptions);return e.wasPruned?{part:{...t,providerOptions:e.providerOptions},wasPruned:true}:{part:t,wasPruned:false}}var ky="openai-websocket",c7={cacheControl:{type:"ephemeral"}};function u7(t){if(!t||typeof t!="object"||!("modelId"in t))return false;let e=t.modelId;return typeof e=="string"&&e.startsWith(`${ky}/`)}function f7(){let t=new Map;return {get(e){return t.get(e)},set(e,o){t.set(e,o);}}}var CLe=f7(),wLe=createRequire(import.meta.url),d7;function ALe(){try{return wLe("@ai-sdk/devtools").devToolsMiddleware}catch{return}}function RLe(){if(!(process.env.AI_SDK_DEVTOOLS!=="true"||process.env.MOMENTIC_LOCAL_DEV!=="1"))try{return d7??=ALe(),d7?.()}catch{return}}function kA(t){let{providerFallback:e,prepareStep:o,onChunk:n,streamTelemetry:r,streamTextImpl:i=streamText,...a}=t,s=g7(e);return i({...a,prepareStep:_Le(o),onChunk:xLe({logger:e.logger,onChunk:n,telemetry:r}),model:s})}async function h7(t){let{providerFallback:e,schema:o,schemaDescription:n,schemaName:r,...i}=t,a={...e,websocketFirst:void 0},s=g7(a),l=streamText({...i,model:s,output:Output.object({schema:o,name:r,description:n})});return await consumeStream({stream:l.fullStream,onError(c){throw c}}),l.output}function xLe(t){let{logger:e,onChunk:o,telemetry:n}=t;if(!n)return o;let r=new Map;return async i=>{MLe({logger:e,buffers:r,telemetry:n,chunk:i.chunk}),await o?.(i);}}function MLe(t){let{logger:e,buffers:o,telemetry:n,chunk:r}=t;if(r.type==="text-delta"&&n.textDeltas){m7({logger:e,buffers:o,telemetry:n,chunk:r});return}if(r.type==="reasoning-delta"&&n.reasoningDeltas){m7({logger:e,buffers:o,telemetry:n,chunk:r});return}if(r.type==="text-end"||r.type==="reasoning-end"){QL({logger:e,buffers:o,telemetry:n,id:r.id,kind:r.type==="text-end"?"text-delta":"reasoning-delta",flushReason:"end"});return}(r.type==="finish"||r.type==="abort"||r.type==="error")&&ILe({logger:e,buffers:o,telemetry:n,flushReason:r.type});}function m7(t){let{logger:e,buffers:o,telemetry:n,chunk:r}=t,i=`${r.type}:${r.id}`,s=o.get(i)??{id:r.id,kind:r.type,text:"",deltaCount:0,timer:void 0};s.timer&&clearTimeout(s.timer),s.text+=r.text,s.deltaCount+=1,s.timer=setTimeout(()=>{QL({logger:e,buffers:o,telemetry:n,id:r.id,kind:r.type,flushReason:"debounce"});},n.debounceMs??2e3),PLe(s.timer),o.set(i,s);}function PLe(t){if(typeof t!="object"||t===null||!("unref"in t))return;let e=t.unref;typeof e=="function"&&e.call(t);}function QL(t){let{logger:e,buffers:o,telemetry:n,id:r,kind:i,flushReason:a}=t,s=`${i}:${r}`,l=o.get(s);if(!l)return;l.timer&&clearTimeout(l.timer),o.delete(s);let c=n.maxLoggedChars,u=typeof c=="number"&&l.text.length>c?l.text.slice(0,c):l.text;e.info({...n.attributes,chunkId:l.id,chunkType:l.kind,deltaCount:l.deltaCount,flushReason:a,text:u,textLength:l.text.length,truncated:u.length!==l.text.length},`streamText ${i}`);}function ILe(t){let{logger:e,buffers:o,telemetry:n,flushReason:r}=t;for(let i of Array.from(o.values()))QL({logger:e,buffers:o,telemetry:n,id:i.id,kind:i.kind,flushReason:r});}function _Le(t){if(t)return e=>{if(!u7(e.model))return t(e)}}function g7(t){let e=t.scopeKey,o=e?t.state??CLe:f7(),n=OLe({...t,scopeKey:e,state:o});if(n.length===0)throw new Error("No streamText fallback providers configured");let r=a7({models:n.map(a=>a.model),logger:t.logger,retryAfterOutput:true,onError:async(a,s)=>{let l=n.find(c=>c.model.modelId===s)?.id??s;t.logger.warn({err:a,modelId:s,providerId:l},"streamText provider failed, trying next fallback"),await t.onError?.({error:BT(a),failedProviderId:l,failedModelId:s});}}),i=RLe();return i?wrapLanguageModel({model:r,middleware:i}):r}function OLe(t){let e=t.scopeKey?t.state.get(t.scopeKey):void 0;if(t.websocketFirst?.enabled&&(!e||e===t.websocketFirst.provider.id))return [JL({candidate:t.websocketFirst.provider,config:t,pruneProviderState:false}),...t.providers.map(i=>JL({candidate:i,config:t,pruneProviderState:true}))];let o=e?t.providers.findIndex(i=>i.id===e):-1,n=o>=0?o:0;return [...t.providers.slice(n),...t.providers.slice(0,n)].map((i,a)=>JL({candidate:i,config:t,pruneProviderState:a>0}))}function JL(t){let{candidate:e,config:o,pruneProviderState:n}=t,r=LLe({model:e.model,providerId:e.id,scopeKey:o.scopeKey,state:o.state});return n&&(r=s7({model:r,logger:o.logger,logMessage:"Stripped provider-local state from streamText fallback step"})),e.id.includes("anthropic")&&(r=DLe({model:r})),{...e,model:r}}function DLe(t){return wrapLanguageModel({model:t.model,middleware:{specificationVersion:"v3",transformParams:async({params:e})=>NLe(e)}})}function NLe(t){return t.tools?.some(e=>"strict"in e)?{...t,tools:t.tools.map(e=>{if(!("strict"in e))return e;let{strict:o,...n}=e;return n})}:t}function LLe(t){let{model:e,providerId:o,scopeKey:n,state:r}=t;return wrapLanguageModel({model:e,middleware:{specificationVersion:"v3",overrideModelId:()=>`${o}/${e.modelId}`,wrapGenerate:async({doGenerate:i})=>{let a=await i();return n&&r.set(n,o),a},wrapStream:async({doStream:i})=>{let a=await i();return {...a,stream:kLe({stream:a.stream,providerId:o,scopeKey:n,state:r})}}}})}function kLe(t){let{stream:e,providerId:o,scopeKey:n,state:r}=t,i=false,a,s=false;return new ReadableStream({async start(l){a=e.getReader();try{for(;;){let{done:c,value:u}=await a.read();if(c)break;!i&&u.type!=="stream-start"&&u.type!=="error"&&(i=!0,n&&r.set(n,o)),l.enqueue(u);}s||l.close();}catch(c){s||l.error(c);}finally{a.releaseLock(),a=void 0;}},cancel(l){return s=true,a?.cancel(l)}})}async function FLe(t){let{agentConfig:e,streamResponseMessages:o,userMessage:n,...r}=t,i={role:"user",content:n};return h7({...r,providerFallback:e.providerFallback,system:e.system,providerOptions:e.providerOptions,messages:[...e.messages??[],...o,i]})}async function Fy({validate:t,maxAttempts:e,logger:o,...n}){let r;for(let i=1;i<=e;i++){n.abortSignal?.throwIfAborted();try{let a=await FLe(n);return t&&await t(a),a}catch(a){if(n.abortSignal?.aborted||(r=a,i===e))throw a;o.warn({err:a,attempt:i,nextAttempt:i+1},"Failed to repair missing submission tool call, retrying");}}throw r}var b7=500;function e0(t){return !t||typeof t!="object"||!("type"in t)||t.type!=="content"||!("value"in t)||!Array.isArray(t.value)?t:{type:t.type,value:t.value.map(e=>{if(!e||typeof e!="object"||!("type"in e))return e;if(e.type==="text"&&"text"in e){let o=typeof e.text=="string"?e.text:"";return {type:e.type,textLength:o.length,preview:o.slice(0,b7),truncated:o.length>b7}}if(e.type==="media"&&"data"in e){let o=typeof e.data=="string"?e.data:"";return {type:e.type,dataLength:o.length,mediaType:"mediaType"in e?e.mediaType:void 0}}return e})}}var y7=z.looseObject({type:z.literal("tool-call"),toolCallId:z.string(),toolName:z.string(),input:z.unknown().optional()}),FA=z.object({type:z.literal("content"),value:z.array(z.discriminatedUnion("type",[z.object({type:z.literal("text"),text:z.string()}),z.object({type:z.literal("media"),data:z.string(),mediaType:z.string()})]))}),BLe=z.discriminatedUnion("type",[z.object({type:z.literal("text"),value:z.string()}),z.object({type:z.literal("json"),value:z.unknown().optional()}),z.object({type:z.literal("error-text"),value:z.string()}),z.object({type:z.literal("error-json"),value:z.unknown().optional()}),FA]),S7=z.looseObject({type:z.literal("tool-result"),toolCallId:z.string(),toolName:z.string(),output:BLe}),T7=z.looseObject({text:z.string()});var E7=2,ULe=1600,zLe=.3,Ud="[trimmed: omitted due to context budget]",w7="[screenshot truncated]",A7="[browser state truncated]",R7={_momenticTrimmed:true,summary:Ud},x7={type:"text",value:Ud},$Le=z.object({type:z.literal("text"),value:z.literal(Ud)}),VLe=["reasoning","tool-result","image","tool-call","text"];function M7(t){let{messages:e,phase1:o,phase2:n,logger:r}=t,i=jLe(e,o.toolResultPruningRules??[],{trimReasoning:o.trimReasoning??false});if(typeof o.numScreenshots=="number"&&(i=HLe(i,o.numScreenshots)),o.browserStateMarkers&&o.browserStateMarkers.length>0&&(typeof o.browserStateTailMessageWindow=="number"&&(i=XLe(i,o.browserStateTailMessageWindow,o.browserStateMarkers)),typeof o.numBrowserStates=="number"&&(i=YLe(i,o.numBrowserStates,o.browserStateMarkers))),!n)return i;let a=Jt(i);return a<=n.tokensThreshold||(r.info({totalTokens:a,threshold:n.tokensThreshold,target:n.targetTokens,messageCount:i.length,breakdown:C7(i)},"Phase 2 triggered \u2014 token breakdown before compaction"),i=m0e(i,n.targetTokens,r),r.info({totalTokens:Jt(i),messageCount:i.length,breakdown:C7(i)},"Phase 2 complete \u2014 token breakdown after compaction")),i}function jLe(t,e,o){let n=t;o.trimReasoning&&(n=n.map((r,i)=>r.role!=="assistant"?r:l0e(r,i===t.length-1)));for(let r of e)n=e0e(n,r);return n}function HLe(t,e){let o={count:e},n=[...t];for(let r=n.length-1;r>=0;r--)n[r]=WLe(n[r],o);return n}function WLe(t,e){if(t.role==="user"){if(typeof t.content=="string")return t;let o=GLe(t.content,e);return {...t,content:o}}if(t.role==="tool"){let o=qLe(t.content,e);return {...t,content:o}}return t}function GLe(t,e){let o=[...t];for(let n=o.length-1;n>=0;n--)if(o[n].type==="image"){if(e.count>0){e.count--;continue}o[n]={type:"text",text:w7};}return o}function qLe(t,e){let o=[...t];for(let n=o.length-1;n>=0;n--){let r=o[n];if(r.type!=="tool-result")continue;let i=FA.safeParse(r.output);if(!i.success)continue;let a=KLe(i.data.value,e);a!==i.data.value&&(o[n]={...r,output:{...i.data,value:a}});}return o}function KLe(t,e){let o=[...t],n=false;for(let r=o.length-1;r>=0;r--)if(o[r].type==="media"){if(e.count>0){e.count--;continue}o[r]={type:"text",text:w7},n=true;}return n?o:t}function YLe(t,e,o){let n={count:e},r=[...t];for(let i=r.length-1;i>=0;i--)r[i]=P7(r[i],n,o);return r}function XLe(t,e,o){let n=Math.max(0,t.length-e);return t.map((r,i)=>i>=n?r:P7(r,{count:0},o))}function P7(t,e,o){if(t.role==="user"){if(typeof t.content=="string")return t;let n=JLe(t.content,e,o);return {...t,content:n}}if(t.role==="tool"){let n=ZLe(t.content,e,o);return {...t,content:n}}return t}function JLe(t,e,o){let n=[...t];for(let r=n.length-1;r>=0;r--){let i=n[r];if(!(i.type!=="text"||!I7(i.text,o))){if(e.count>0){e.count--;continue}n[r]={type:"text",text:A7};}}return n}function ZLe(t,e,o){let n=[...t];for(let r=n.length-1;r>=0;r--){let i=n[r];if(i.type!=="tool-result")continue;let a=FA.safeParse(i.output);if(!a.success)continue;let s=QLe(a.data.value,e,o);s!==a.data.value&&(n[r]={...i,output:{...a.data,value:s}});}return n}function QLe(t,e,o){let n=[...t],r=false;for(let i=n.length-1;i>=0;i--){let a=n[i];if(!(a.type!=="text"||!I7(a.text,o))){if(e.count>0){e.count--;continue}n[i]={type:"text",text:A7},r=true;}}return r?n:t}function I7(t,e){for(let o of e)if(t.includes(o))return true;return false}function e0e(t,e){let o=new Set;for(let n of t.slice(-e.keepLastMessages))if(typeof n.content!="string")for(let r of n.content)t0e(r)&&e.tools.includes(r.toolName)&&o.add(r.toolCallId);return t.map((n,r)=>r>=t.length-e.keepLastMessages?n:d0e(n,e,o))}function BA(t){return y7.safeParse(t).success}function n0(t){return S7.safeParse(t).success}function t0e(t){return BA(t)||n0(t)}function o0e(t){return T7.safeParse(t).success}function _7(t){return !t||typeof t!="object"||Array.isArray(t)?false:t._momenticTrimmed===true}function O7(t){return $Le.safeParse(t).success}function o0(t){return t.text===Ud?{part:t,trimmedTokens:0}:{part:{...t,text:Ud},trimmedTokens:Jt(t.text)}}function n0e(t){return t.input===void 0||_7(t.input)?{part:t,trimmedTokens:0}:{part:{...t,input:R7},trimmedTokens:Jt(t.input)}}function D7(t){return t.output===void 0||O7(t.output)?{part:t,trimmedTokens:0}:{part:{...t,output:x7},trimmedTokens:Jt(t.output)}}function r0e(t,e,o){let n=0,r=[];for(let i of t){if(n>=e){r.push(i);continue}switch(i.role){case "assistant":{let a=i0e(i,e-n,o);n+=a.trimmedTokens,r.push(a.message);continue}case "tool":{let a=s0e(i,e-n,o);n+=a.trimmedTokens,r.push(a.message);continue}case "user":{let a=a0e(i,e-n,o);n+=a.trimmedTokens,r.push(a.message);continue}default:r.push(i);}}return {messages:r,trimmedTokens:n}}function i0e(t,e,o){if(typeof t.content=="string")return {message:t,trimmedTokens:0};let n=[],r=0;for(let i of t.content){if(r>=e){n.push(i);continue}if(o==="image"){n.push(i);continue}if(o==="reasoning"){if(i.type!=="reasoning"){n.push(i);continue}let s=o0(i);r+=s.trimmedTokens,n.push(s.part);continue}if(o==="text"){if(i.type!=="text"){n.push(i);continue}let s=o0(i);r+=s.trimmedTokens,n.push(s.part);continue}if(o==="tool-call"){if(!BA(i)){n.push(i);continue}let s=n0e(i);r+=s.trimmedTokens,n.push(s.part);continue}if(!n0(i)){n.push(i);continue}let a=D7(i);r+=a.trimmedTokens,n.push(a.part);}return {message:{...t,content:n},trimmedTokens:r}}function a0e(t,e,o){if(typeof t.content=="string")return {message:t,trimmedTokens:0};let n=[],r=0;for(let i of t.content){if(r>=e){n.push(i);continue}if(o==="image"){if(i.type!=="image"){n.push(i);continue}r+=ULe;continue}if(o!=="text"||!o0e(i)){n.push(i);continue}let a=o0(i);r+=a.trimmedTokens,n.push(a.part);}return {message:{...t,content:n},trimmedTokens:r}}function s0e(t,e,o){if(o!=="tool-result")return {message:t,trimmedTokens:0};let n=[],r=0;for(let i of t.content){if(i.type==="tool-approval-response"){n.push(i);continue}if(r>=e){n.push(i);continue}let a=D7(i);r+=a.trimmedTokens,n.push(a.part);}return {message:{...t,content:n},trimmedTokens:r}}function l0e(t,e){return e||typeof t.content=="string"?t:{...t,content:t.content.map(o=>o.type!=="reasoning"||o.text===Ud?o:{...o,text:Ud})}}function c0e(t,e,o){return !e.tools.includes(t.toolName)||o.has(t.toolCallId)||t.input===void 0||_7(t.input)?t:{...t,input:R7}}function N7(t,e,o){return !e.tools.includes(t.toolName)||o.has(t.toolCallId)||t.output===void 0||O7(t.output)?t:{...t,output:x7}}function u0e(t,e,o){return BA(t)?c0e(t,e,o):n0(t)?N7(t,e,o):t}function d0e(t,e,o){return t.role==="assistant"&&typeof t.content!="string"?{...t,content:t.content.map(n=>u0e(n,e,o))}:t.role==="tool"?{...t,content:t.content.map(n=>n.type==="tool-approval-response"?n:N7(n,e,o))}:t}function By(t,e,o){let n=[...t];for(let r of VLe){let i=Jt(n);if(i<=e)break;let a=i-e,s=r0e(n,a,r);n=s.messages,s.trimmedTokens>0&&o.debug({contentType:r,trimmedTokens:s.trimmedTokens,newTokenCount:Jt(n)},"Trimmed content");}return n}function L7(t){return t.role!=="assistant"||typeof t.content=="string"?false:t.content.some(e=>BA(e))}function v7(t){if(t.length===0)return;let e=t[0];if(L7(e)){t.shift(),t.length>0&&t[0].role==="tool"&&t.shift();return}t.shift();}function C7(t){let e={};for(let o of t)if(o.role==="system")e.system=(e.system??0)+Jt(o);else if(o.role==="user")e.user=(e.user??0)+Jt(o);else if(o.role==="assistant")if(typeof o.content=="string")e.assistant_text=(e.assistant_text??0)+Jt(o);else for(let n of o.content)if(n.type==="tool-call"){let r=`tool_call:${n.toolName}`;e[r]=(e[r]??0)+Jt(n);}else e.assistant_text=(e.assistant_text??0)+Jt(n);else if(o.role==="tool"){for(let n of o.content)if(n.type==="tool-result"){let r=`tool_result:${n.toolName}`;e[r]=(e[r]??0)+Jt(n);}}return e}function m0e(t,e,o){let n=Jt(t);if(n<=e||t.length<=1)return t;let r=t[0],i=[],a=[];if(t.length>E7+1){let u=t.length-E7;u>1&&t[u]?.role==="tool"&&L7(t[u-1])&&u++,i=t.slice(1,u),a=t.slice(u);}else a=t.slice(1);if(i.length>0){i=By(i,e,o);let u=[r,...i,...a];if(n=Jt(u),n<=e)return u}let s=Jt(i),l=s/e;if(l<zLe){if(a.length>1){let u=a[a.length-1],d=[...i,...a.slice(0,-1)],m=By(d,e,o),p=[r,...m,u];if(n=Jt(p),n<=e)return p;let f=By([...m,u],e,o),h=[r,...f];if(n=Jt(h),n<=e)return h}else if(a.length===1){let u=[...i,...a],d=By(u,e,o),m=[r,...d];if(n=Jt(m),n<=e)return m}}else for(o.debug({headBudgetRatio:l,middleMsgTokens:s,targetTokens:e},"Middle exceeds 30% budget, removing messages");i.length>0;){v7(i);let u=[r,...i,...a];if(n=Jt(u),n<=e)return u}a=By(a,e,o);let c=[r,...i,...a];if(n=Jt(c),n<=e)return c;for(;a.length>0;)if(v7(a),c=[r,...i,...a],n=Jt(c),n<=e)return c;return n>e&&o.warn({targetTokens:e,finalTokenCount:n,remainingMessages:c.length},"Unable to meet token target after all pruning phases"),c}var r0=5e3,k7=2e4;function U7(t){let{tool:e,name:o,spanName:n,attributes:r}=t,i=e.execute;return i?{...e,execute:async(a,s)=>We({name:n,attributes:{"momentic.tool_name":o,...r},fn:async l=>{l?.setAttribute("momentic.tool_input",F7(a));let c=await i(a,s);return l?.setAttribute("momentic.tool_output",F7(e0(c))),c}})}:e}function F7(t){let e=Oc({json:t,maxJsonStringSize:r0});return typeof e=="string"?e:cc(e)??""}function UA(t){let{tool:e,name:o,logger:n,logPrefix:r,agentName:i,createToolSpan:a}=t,s=t.getResultForLogging??e0,l=e.execute;return l?{...e,strict:e.strict??false,execute:async(c,u)=>(t.onExecuteStart?.(),i0({logger:n,toolName:o,logPrefix:r,agentName:i,createToolSpan:a,input:c,execute:async()=>l(c,u),getResultForLogging:s}))}:{...e,strict:e.strict??false}}async function i0(t){let{logger:e,toolName:o,logPrefix:n="",agentName:r,createToolSpan:i,input:a}=t,s=t.getResultForLogging??(d=>d),l=Date.now(),c=i?.({name:o,input:a,metadata:r!=null?{agentName:r}:void 0}),u=B7({logger:e,toolName:o,agentName:r,value:a,label:"input"});e.info({...r!=null&&{agentName:r},...u!==void 0&&{inputTokenCount:u},params:Oc({json:a,maxJsonStringSize:r0}),toolName:o},`${n}Tool invoked: ${o}`);try{let d=await t.execute(),m=B7({logger:e,toolName:o,agentName:r,value:d,label:"output"}),p=s(d);return m!==void 0&&m>k7&&e.warn({...r!=null&&{agentName:r},largeToolOutputWarningThresholdTokens:k7,outputTokenCount:m,toolName:o},`${n}Tool output is large: ${o}`),e.info({...r!=null&&{agentName:r},duration:Date.now()-l,...m!==void 0&&{outputTokenCount:m},response:Oc({json:p,maxJsonStringSize:r0}),toolName:o},`${n}Tool completed: ${o}`),c?.end({output:d}),d}catch(d){throw e.error({...r!=null&&{agentName:r},duration:Date.now()-l,err:d,toolName:o},`${n}Tool failed: ${o}`),c?.end({level:"ERROR",statusMessage:J(d)}),d}}function B7(t){let{logger:e,toolName:o,agentName:n,value:r,label:i}=t;try{return Jt(r)}catch(a){e.warn({...n!=null&&{agentName:n},err:a,toolName:o},`Failed to calculate tool ${i} token count`);return}}var z7=".momentic-mcp",y0e=30*Sj;function s0(t){return t?Oo__default.join(t,z7):Oo__default.resolve(z7)}function Ks(t){let e=s0(t);mkdirSync(e,{recursive:true});}function S0e(){return `${Date.now()}`}function Ys({rootDir:t,entity:e,ext:o}){return Oo__default.join(s0(t),`${e}-${S0e()}.${o}`)}function T0e(t){let e=Oo__default.relative(process.cwd(),t);return e.startsWith(".")?e:`./${e}`}function Ga({filePath:t,title:e}){return `- [${e}](${T0e(t)})`}var zy="All relative paths/links returned by a tool are relative to the server's `cwd`. Use the advertised `cwd` to resolve relative paths, use `projectRootAbsolutePath` to find the project-local `.momentic-mcp` artifacts, and use `projectConfigAbsolutePath` for the active `momentic.config.yaml`.";function $7({projectRootAbsolutePath:t,projectConfigAbsolutePath:e,cwd:o}){return [zy,"",`- **projectRootAbsolutePath**: \`${t}\``,`- **projectConfigAbsolutePath**: \`${e}\``,`- **cwd**: \`${o}\``].join(`
5738
5738
  `)}async function V7({projectRootAbsolutePath:t,projectConfigAbsolutePath:e,cwd:o,stepSchema:n,stepSchemaTitle:r,supportsFileOutput:i}){let a="Step Authoring Guide",s="Read this Step Authoring Guide to understand momentic step input shapes. It explains the CLI-style step arguments accepted by the MCP tools and includes the project context.",l=[s,"","## Project context","",$7({projectRootAbsolutePath:t,projectConfigAbsolutePath:e,cwd:o}),"",`## ${r}`,"",n].join(`
@@ -5882,20 +5882,20 @@ ${l}
5882
5882
  `),section:"Diffs For Recovery"})),u}return u.push(...Rt({text:["",d].join(`
5883
5883
  `),section:"Diffs For Recovery"})),u}function Hoe({moduleName:t,existingModuleNames:e,parameterNames:o,defaultParameters:n,parameterEnums:r,moduleInputs:i,testPath:a,startIndex:s,endIndex:l,availableSteps:c,containsNestedModuleStep:u}){if(e.includes(t))throw new Error(`Error: module with the name "${t}" already exists. Please use a different name.`);let d=o??[],m=[...Object.keys(n??{}),...Object.keys(r??{})];for(let b of m)if(!d.includes(b)){let y=d.length?d.join(", "):"none";throw new Error(`Error: Parameter metadata "${b}" is not defined in parameters. Available parameters: ${y}`)}let p=new Set(d);for(let b of Object.keys(i??{}))if(!p.has(b)){let y=p.size?Array.from(p).join(", "):"none";throw new Error(`Error: Module input "${b}" is not defined in parameters. Available parameters: ${y}`)}let f=s??0,h=l??f+1;if(l!==void 0&&s===void 0)throw new Error("Error: startIndex is required when endIndex is provided for extraction.");if(s===void 0)return {stepsToExtract:[],startIndex:f,endIndex:h};if(!a)throw new Error("Error: testPath is required when extracting steps from the test.");if(!c)throw new Error("Error: resolved steps are required to validate module extraction.");if(f<0||f>=c.length)throw new Error(`Error: startIndex ${f} is out of bounds. Test has ${c.length} steps.`);if(h<=f||h>c.length)throw new Error(`Error: endIndex ${h} is out of bounds. Must be between ${f+1} and ${c.length}.`);let g=c.slice(f,h);for(let b of g)if(u(b))throw new Error("Error: Modules cannot be nested. Please select steps that do not include module references.");return {stepsToExtract:g,startIndex:f,endIndex:h}}var Nje=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 Lje(t){let e=t.toLowerCase();return e.endsWith("webview")||Nje.has(e)}function zS(t){return !!(Lje(t.tagName)||t.getAttribute("package")==="com.android.chrome"&&t.getAttribute("content-desc")==="Web View"&&Woe(t.tagName.toLowerCase()).startsWith("frame"))}function Woe(t){let e=["android.widget.","android.view.","android.webkit.","android.app.","android.support.","androidx.","com.android.inputmethod."];for(let o of e)if(t.startsWith(o))return t.substring(o.length);return t}var kje=new Set(["index","package","a11y-important","screen-reader-focusabl"]),Fje=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"]),Bje=new Set(["text","hint"]),Uje=new Set(["live-region","drawing-order"]),zje=new Set(["displayed","enabled"]);function $je(t,e){let o={};for(let[n,r]of Object.entries(e))kje.has(n)||n==="class"&&t===r||n==="focusable"&&r==="true"&&e.clickable==="true"||Fje.has(n)&&r==="false"||Bje.has(n)&&r===""||zje.has(n)&&r==="true"||Uje.has(n)&&r==="0"||n!=="id"&&(o[n]=r);return o}function Goe(t,e,o){let{prunedDocument:n,idToElement:r,prunedIdToElement:i,idCounter:a,opts:s}=t,l=a.value++;o.setAttribute("id",String(l));let c={};for(let m of e.attributes){let p=m.name,f=m.value;f!=null&&(c[p]=String(f));}let u=$je(e.tagName,c);for(let[m,p]of Object.entries(u))o.setAttribute(m,p);if(r.set(l,e),i.set(l,o),zS(e)){let m=s?.injectedWebviewContent??"";if(s?.removeWebviewContent){for(;o.firstChild;)o.removeChild(o.firstChild);return}else if(!s?.disableMomenticAccessibilityTree&&m.trim().length>0){for(;o.firstChild;)o.removeChild(o.firstChild);m.trim().length>0&&o.appendChild(n.createCDATASection(`
5884
5884
  ${m}
5885
- `));return}}let d=Array.from(e.childNodes??[]);for(let m of d){let p=m.nodeType;if(p===3){let f=m.nodeValue;f&&f.trim().length>0&&o.appendChild(n.createTextNode(f));continue}if(p===1){let f=m;if(!Hje(f,s?.viewportBounds))continue;let h=n.createElement(Woe(f.tagName));Goe(t,f,h),o.appendChild(h);}}}function Vje(t,e,o,n){let r=t.parseFromString("<hierarchy/>","text/xml"),i=new Map,a={prunedDocument:r,idToElement:o,prunedIdToElement:i,idCounter:{value:0},opts:n},s=r.documentElement;Goe(a,e,s);let l=new XMLSerializer().serializeToString(r);return {prunedDocument:r,prunedIdToElement:i,xml:l}}async function qoe(t,e,o){let n=new DOMParser,r=n.parseFromString(t,"text/xml"),i=new Map,a=r.documentElement;if(!a)throw new O("InternalWebAgentError","No root element found in XML");if(a.tagName!=="hierarchy")throw new O("InternalWebAgentError","No hierarchy element found in XML");let{prunedDocument:s,prunedIdToElement:l,xml:c}=Vje(n,a,i,o),u=c;try{u=await _je.format(c,{parser:"xml",plugins:[Ije],printWidth:120,tabWidth:1,singleAttributePerLine:!1});}catch(d){e.warn({err:d},"Failed to format XML");}return {xml:u,originalXml:t,document:r,idToElement:i,prunedDocument:s,prunedIdToElement:l}}function jje(t){let e=[],o=t;for(;o;){let n=o.tagName,r=o.parentElement,i=1;if(r){let a=Array.from(r.children).filter(s=>s.tagName===n);for(let s=0;s<a.length;s++)if(a[s]===o){i=s+1;break}}e.unshift(`${n}[${i}]`),o=r;}return `/${e.join("/")}`}function bx(t,e){let o=t.idToElement.get(e);if(o)return jje(o)}function UF(t,e){let o=t.idToElement.get(e);if(!o)return;let n=o.cloneNode(true);for(let r of Array.from(n.children)){let i=r;for(let a of Array.from(i.children))i.removeChild(a);}return n.outerHTML}function Vl(t){if(!t.hasAttribute("bounds"))return;let e=t.getAttribute("bounds");if(!e)return;let o=e.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);if(o){let n=parseInt(o[1],10),r=parseInt(o[2],10),i=parseInt(o[3],10),a=parseInt(o[4],10);if(Number.isFinite(n)&&Number.isFinite(r)&&Number.isFinite(i)&&Number.isFinite(a))return [n,r,i,a]}}function Hje(t,e){if(!e)return true;let o=Vl(t);if(!o||o.length<4)return true;let n=o[0],r=o[1],i=o[2],a=o[3];return !(i<=e.left||n>=e.right||a<=e.top||r>=e.bottom)}function Koe(t,e){if(t&&!(!e||e.length===0))return Object.fromEntries(e.map(o=>[o,t.getAttribute(o)]).filter(([,o])=>o!==null))}function Xoe({requirements:t,element:e}){let o;if((t?.positionSpecificity||t?.shapeSpecificity)&&(o=Vl(e),!o))throw new O("ActionFailureError","Element to cache has no bounds or unexpected bounds format");return {requiredText:t?.textRequired&&wf(e)||void 0,requiredAttributes:Koe(e,t?.attributesRequired),requiredBounds:t?.boundsRequired,position:t?.positionSpecificity?{x1:o[0],y1:o[1],x2:o[2],y2:o[3],tolerance:t?.positionSpecificity}:void 0,shape:t?.shapeSpecificity?{width:o[2]-o[0],height:o[3]-o[1],tolerance:t?.shapeSpecificity}:void 0}}function Zoe({aiResponse:t,description:e,emulatorState:o,memory:n,useMemory:r}){let i=o.graph.idToElement.get(t.id);if(!i)throw new O("InternalWebAgentError",`Could not find node with id: ${t.id}`);let a=Vl(i);if(!a)throw new O("InternalWebAgentError",`Node ${t.id} has no bounding box: ${i.outerHTML}`);let s=bx(o.graph,t.id)??"",l=UF(o.graph,t.id)??"",c=Xoe({requirements:t.requirements,element:i}),u=[];t.additionalElements&&(u=t.additionalElements.map(({id:m,requirements:p})=>{let f=o.graph.idToElement.get(m);if(!f)return;let h=bx(o.graph,m);return h?{xPath:h,requirements:Xoe({requirements:p,element:f})}:void 0}).filter(m=>!!m));let d;if(zS(i)&&t.inWebview!==false?d={type:"WEBVIEW",resolvedDescription:e,xPath:s}:d={type:"NATIVE",bounds:a,resolvedDescription:e,xPath:s,elementOnlySerializedXml:l,requirements:c,requiredRelatedElements:u},r)if(t.updatedMemory){let m={type:"GCS_TRACES",traces:t.updatedMemory};d.memory=m;}else n&&(d.memory=n);return {target:d,resolvedNode:i}}function Qoe(t){return t?.type==="WEBVIEW"?t.browserCache?.memory:void 0}function Wje(t,e){let o=e.x2-e.x1,n=(e.x1+e.x2)/2,r=(t[0]+t[2])/2;if(!Hs(e.tolerance,n,r,Math.min(1,o)))return false;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(t[1]+t[3])/2;return Hs(e.tolerance,a,s,Math.min(1,i))}function Gje(t,e){return Hs(e.tolerance,e.width,t[2]-t[0],Math.min(1,e.width))?Hs(e.tolerance,e.height,t[3]-t[1],Math.min(1,e.height)):false}var Joe=(t,e,o)=>{if(!e)return;let{requiredAttributes:n,requiredText:r,requiredBounds:i,position:a,shape:s}=e;if(r!==void 0&&r.length>0){let l=wf(t);if(l!==r)throw new Ne(`Resolved element text mismatch: expected ${r}, got ${l}`)}if(n)for(let[l,c]of Object.entries(n)){let u=t.getAttribute(l)??void 0;if(u!==c)throw new Ne(`Attribute ${l} mismatch: expected ${c}, got ${u}`)}if(i&&o&&!o.targetBounds.every((c,u)=>c===o.newElementBounds[u]))throw new Ne(`Bounds changed from [${o.targetBounds.join(",")} ] to [${o.newElementBounds.join(",")} ]`);if(a&&o&&!Wje(o.newElementBounds,a))throw new Ne(`Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(o.newElementBounds)}`);if(s&&o&&!Gje(o.newElementBounds,s))throw new Ne(`Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(o.newElementBounds)}`)};async function ih(t){let{target:e,domState:o}=t,{graph:n}=o,{document:r}=n,i=fe();if(e.type==="WEBVIEW")return qje(e,t);if(!e.xPath)throw new O("ActionFailureError","Native element cache has no XPath");let a=Yoe.evaluateXPathToFirstNode(e.xPath,r,null,null);if(!a)throw new Ne(`Could not resolve cached target via XPath: ${e.xPath}`);if(e.requiredRelatedElements){let m=e.requiredRelatedElements;i.startSection("Validate related elements are similar enough to past runs",()=>{for(let p of m){let f=Yoe.evaluateXPathToFirstNode(p.xPath,r);if(!f)throw new Ne(`Required related element not found for XPath: ${p.xPath}`);Joe(f,p.requirements);}});}let s=Vl(a);if(!s)throw new Ne("Resolved native element has no bounding box");if(!e.bounds)throw new Ne("Native element cache has no bounds");Joe(a,e.requirements,{targetBounds:e.bounds,newElementBounds:s});let l;for(let[m,p]of n.idToElement.entries())if(p===a){l=m;break}let c=e.elementOnlySerializedXml,u=e.xPath;return l!==void 0&&(c=UF(n,l)??c,u=bx(n,l)??u),{resolvedTarget:{...e,resolvedNode:a,bounds:s,elementOnlySerializedXml:c,xPath:u}}}async function qje(t,e){let{stateManager:o,logger:n,signal:r}=e,i=fe(),a=await o.getActiveWebview();if(!a||!a.browserController)throw n.error({webview:a?{...a,browserController:!!a.browserController}:void 0},"resolveTargetCacheInWebView: No browser controller attached"),new Ne("No browser controller is attached to the requested webview");let s=a.browserController;if(!t.browserCache)throw n.error({target:t},"resolveTargetCacheInWebView: No browser target available on cache"),new Ne("No browser target available on cache");let l=t.browserCache,{finalTarget:c}=await i.startAsyncSection("Resolve target in webview",()=>s.resolveCachedTargetForAction({cache:l,options:{resolveTargetOptions:{logger:n,signal:r,skipWaitForPageLoad:true,skipSavingVisualAttributes:true}},logger:n}));return {resolvedTarget:{...t,controller:a.browserController,browserTarget:c}}}function tm(t){let{command:e,cacheKey:o="cache",targetName:n="target",updatedCache:r}=t;Ym(e)&&(e[o]={...e[o],[n]:Lm.parse(r)},t.updatedWithAI&&(e[o].updatedAt=new Date,e[o].updatedAtLoggerTags=$e(t.logger)));}function Tu(t){if(t.type==="WEBVIEW")return {type:"WEBVIEW",resolvedDescription:t.resolvedDescription,xPath:t.xPath,browserCache:t.browserCache,memory:t.memory};let{resolvedNode:e,...o}=t;return {...o}}var hi=.15,ah=10,Yje=500,Bo=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:o,skipFetchingFullWebviewContent:n=false,removeWebviewContent:r=false,useMemory:i=false,memory:a,webviewMemory:s,metadata:l,cacheBustReason:c,knownState:u}){let d=this.logger.child({...l}),m=u??await o.startAsyncSection("Get emulator state",async()=>{let y=await this.stateManager.getCurrentScreenshotPngString();return {emulatorState:await this.stateManager.getDomState({skipFetchingFullWebviewContent:n,removeWebviewContent:r}),screenshot:y}}),p;try{p=await o.startAsyncSpan("AI_LOCATOR_CALL",async y=>{c&&(y.attributes.cacheBustReason=c);let T=await this.generator.getAndroidElementLocation({description:e,screenXml:m.emulatorState.graph.xml,screenshot:m.screenshot,source:l?.source==="SCROLL_TO"?"SCROLL_TO":void 0,memory:i?a:void 0},{logger:d,loggerTags:$e(d),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["android-locator"]});return y.result=T,T});}catch(y){throw this.throwIfAborted(),d.error({err:y},"Failed to locate element"),new O("InternalWebAgentError",`Failed to locate element: ${y instanceof Error?y.message:y}`,{errOptions:{cause:y}})}if(p.id===-1){let y=p.updatedMemory?{type:"GCS_TRACES",traces:p.updatedMemory}:void 0;return {success:false,thoughts:p.thoughts??"No matching element found",updatedLocatorMemory:y}}let{target:f,resolvedNode:h}=Zoe({aiResponse:p,description:e,emulatorState:m.emulatorState,memory:a,useMemory:i});if(f.type==="NATIVE")return o.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:f.elementOnlySerializedXml??"Unknown element"},attributes:{},subSpans:[]}),{success:true,resolvedTarget:{...f,resolvedNode:h},thoughts:p.thoughts};let{browserLocateResult:g,browserController:b}=await o.startWebviewTrace(async()=>{let y=await this.stateManager.getActiveWebview();if(!y||!y.browserController)throw new O("InternalWebAgentError","No browser controller is attached to the requested webview");return {browserLocateResult:await y.browserController.locateElement({description:e,disableCache:false,useMemory:i,memory:i?s:void 0,logger:this.logger,skipWait:true,skipSavingVisualAttributes:true}),browserController:y.browserController}});return o.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:g.target.nodeOnlySerializedHtml??"Unknown HTML element in webview"},attributes:{},subSpans:[]}),{success:true,resolvedTarget:{...f,controller:b,browserTarget:{...g.resolution,serverSideBoundingBox:await g.resolution.locator.boundingBox({timeout:5e3})},browserCache:g.target},thoughts:g.thoughts}}async targetingActionWithAILocator(e){let{action:o,command:n,description:r,tracer:i,cacheKey:a,targetName:s,cache:l,skipFetchingFullWebviewContent:c,removeWebviewContent:u,metadata:d,cacheBustReason:m}=e,p=await this.findElement({description:r,tracer:i,skipFetchingFullWebviewContent:c,removeWebviewContent:u,useMemory:this.shouldUseMemoryForCommand(n),memory:l?.memory,webviewMemory:Qoe(l),metadata:d,cacheBustReason:m});if(!p.success){if(p.updatedLocatorMemory&&l){let b={...l,memory:p.updatedLocatorMemory};tm({command:n,cacheKey:a,targetName:s,updatedCache:b,updatedWithAI:true,logger:this.logger});}throw new O("NoMatchingElementError",p.thoughts??"No matching element found")}let f=p.thoughts,{result:h,resolvedTarget:g}=await this.executeActionWithWebviewReconstructRetry({action:o,resolvedTarget:p.resolvedTarget,reason:"webview target closed during AI-located action"});return tm({command:n,cacheKey:a,targetName:s,updatedCache:Tu(g),updatedWithAI:true,logger:this.logger}),{result:h,thoughts:f}}async wrapTargetingAction(e){let{action:o,description:n,command:r,cacheKey:i="cache",targetName:a="target",cacheIsInvalidAfterResolution:s,tracer:l,skipFetchingFullWebviewContent:c=false,removeWebviewContent:u=false}=e,d,m={commandId:r.id};if(i==="cache"&&"cache"in r&&r.cache){let T=r.cache;a==="target"&&"target"in T?d=T.target:a==="fromTarget"&&"fromTarget"in T?d=T.fromTarget:a==="toTarget"&&"toTarget"in T&&(d=T.toTarget);}let p=false,f,h=cloneDeep(d);if(r.disableCache&&(this.logger.debug({command:r},"Cache explicitly disabled for command"),p=true,f="Cache explicitly disabled",h=void 0),s&&(p=true,f=f??"Cache invalidated after resolution",h=void 0),h&&!ru(h?.resolvedDescription??"",n)&&(this.logger.info({description:n,cacheDescription:h?.resolvedDescription},"Cache description mismatch, clearing it automatically"),p=true,f="Description mismatch",h=void 0),!h)return this.logger.info({description:n,cacheBustedBeforeAction:p},"Prompting AI for a new element location"),this.targetingActionWithAILocator({action:o,command:r,description:n,tracer:l,cacheKey:i,targetName:a,cache:d,skipFetchingFullWebviewContent:c,removeWebviewContent:u,metadata:m,cacheBustReason:f});let g=h.type==="NATIVE"?!!h.requirements:!!h.browserCache?.requirements,b=h.type==="NATIVE"?!!h.requiredRelatedElements?.length:!!h.browserCache?.additionalElements?.length,y;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:T}=await l.startAsyncSpan("CACHE_RESOLUTION",async P=>{let M=Date.now(),I;for(;Date.now()-M<3e3;){y=await this.stateManager.getDomState({skipFetchingFullWebviewContent:h?.type==="NATIVE"});let A;try{A=(await ih({target:h,domState:y,stateManager:this.stateManager,logger:this.logger})).resolvedTarget;}catch(H){if(I=H,H instanceof Ne){this.logger.warn({err:H},"Failed to resolve target cache, retrying"),await Os(100,this.aborter.controller?.signal);continue}throw this.logger.error({err:H},"Failed to resolve target cache"),H}let k=Tu(A),_=diff(h,k);return _&&Object.keys(_).length>0&&this.logger.info({cacheDiffs:_},"Successfully resolved target with cache"),P.attributes.serializedElement=A.type==="WEBVIEW"?A.browserCache?.nodeOnlySerializedHtml??"Unknown HTML element in webview":A.elementOnlySerializedXml??"Unknown element",{resolvedTarget:A,updatedCache:k}}throw I}),{result:v,resolvedTarget:E}=await this.executeActionWithWebviewReconstructRetry({action:o,resolvedTarget:T,reason:"webview target closed during cached action"});return tm({command:r,cacheKey:i,targetName:a,updatedCache:Tu(E),updatedWithAI:!1,logger:this.logger}),Qe.increment("cache_target_resolution_v2",1,["outcome:hit",`platform:mobile-${h.type.toLowerCase()}`,`hasRequirements:${g}`,`hasAdditionalElements:${b}`,`orgId:${this.orgId}`,"cliVersion:1.4.5"]),{result:v,thoughts:"Successfully executed preset action with cache"}}catch(T){if(this.throwIfAborted(),T instanceof O&&T.reason!=="InternalWebAgentError")throw this.logger.error({err:T},"Failed to execute action with target cache (fatal)"),T;return Qe.increment("cache_target_resolution_v2",1,["outcome:miss",`platform:mobile-${h.type.toLowerCase()}`,`hasRequirements:${g}`,`hasAdditionalElements:${b}`,`orgId:${this.orgId}`,"cliVersion:1.4.5"]),this.logger.warn({err:T},"Failed to execute action with target cache, retrying with AI"),this.targetingActionWithAILocator({action:o,command:r,description:n,tracer:l,cacheKey:i,targetName:a,cache:h,skipFetchingFullWebviewContent:c,removeWebviewContent:u,metadata:m})}}async executeActionWithWebviewReconstructRetry(e){let{action:o,resolvedTarget:n,reason:r}=e;try{return {result:await o(n),resolvedTarget:n}}catch(i){if(this.throwIfAborted(),n.type!=="WEBVIEW"||!this.errorLooksLikeClosedWebviewTarget(i)||(this.logger.warn({err:i},"Webview target appears closed or crashed during action, reconstructing browser and retrying once"),!(await this.stateManager.reconstructActiveWebviewBrowser(r))?.browserController))throw i;let s=await this.stateManager.getDomState({skipFetchingFullWebviewContent:true}),{resolvedTarget:l}=await ih({target:Tu(n),domState:s,stateManager:this.stateManager,logger:this.logger,signal:this.abortSignal});return {result:await o(l),resolvedTarget:l}}}errorLooksLikeClosedWebviewTarget(e){let o=J(e);return ["Target closed","Target crashed","Page crashed","Target page, context or browser has been closed","Session closed. Most likely the page has been closed"].some(n=>o.includes(n))}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 O("ActionFailureError","Native element cache has no bounds");let[o,n,r,i]=e.bounds;if(o===void 0||n===void 0||r===void 0||i===void 0)throw new O("ActionFailureError",`Native element cache has incomplete bounds: [${e.bounds.join(", ")}]`);return {left:o,top:n,width:r-o,height:i-n}}calculateSwipeCoordinates({containerBounds:e,direction:o,desiredDelta:n}){let r=e.left+e.width/2,i=e.top+e.height/2;if(o==="up"||o==="down"){let a=e.height*hi,s=e.top+a,l=e.top+e.height-a,c=l-s,u=Math.min(Math.abs(n),c),d=c-u,m=o==="down"?l-d/2:s+d/2;return {startX:r,startY:m,actualDelta:u}}else {let a=e.width*hi,s=e.left+a,l=e.left+e.width-a,c=l-s,u=Math.min(Math.abs(n),c),d=c-u;return {startX:o==="right"?l-d/2:s+d/2,startY:i,actualDelta:u}}}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:o,deltaPixels:n,direction:r,durationMs:i=300}){let a=Math.abs(n);if(a<ah)return;let s=e,l=o;r==="up"||r==="down"?l=r==="up"?o-a:o+a:s=r==="left"?e-a:e+a,await this.driver.executeInNativeContext(this.logger,async c=>{await c.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:e,y:o},{type:"pointerDown",button:0},{type:"pause",duration:250},{type:"pointerMove",duration:i,x:s,y:l},{type:"pause",duration:500},{type:"pointerUp",button:0}]}]),await c.releaseActions();},{operationName:"performRawSwipe"}),await Te(Yje,this.abortSignal);}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted();}get abortSignal(){return this.aborter.controller?.signal}get aiSettingsCopy(){return cloneDeep(this.aiSettings)}get optionsCopy(){return cloneDeep(this.options)}};function tl(t){if(t.type==="WEBVIEW"){let a=t.browserTarget.serverSideBoundingBox;return a?{left:a.x,top:a.y,width:a.width,height:a.height}:void 0}let{bounds:e}=t;if(!e)return;let[o,n,r,i]=e;if(!(o===void 0||n===void 0||r===void 0||i===void 0))return {left:o,top:n,width:r-o,height:i-n}}function tne(t){return "iterations"in t}function Zje(t){let e={relativePosition:t.relativePosition?bo(t.relativePosition):void 0};if(t.iterations!==void 0&&(!Number.isInteger(t.iterations)||t.iterations<1))throw new Error("UserConfigurationError: iterations must be a positive integer");if(t.tapDelayMs!==void 0&&(!Number.isInteger(t.tapDelayMs)||t.tapDelayMs<0))throw new Error("UserConfigurationError: tapDelayMs must be >= 0");if(t.iterations&&t.iterations>1&&t.longPress)throw new Error("UserConfigurationError: Cannot specify both more than one tap iteration and long press at the same time");if(t.tapDelayMs!==void 0&&(!t.iterations||t.iterations<2))throw new Error("UserConfigurationError: tapDelayMs requires iterations >= 2");if(t.longPress){if(t.tapDelayMs!==void 0)throw new Error("UserConfigurationError: tapDelayMs cannot be used with longPress");return {...e,longPress:true,longPressDurationMs:t.longPressDurationMs}}return t.iterations!==void 0?{...e,iterations:t.iterations,tapDelayMs:t.tapDelayMs}:e}var sh=class extends Bo{async tapOnNativeCoordinates(e){let o=e.x,n=e.y;if(this.logger.info({x:o,y:n},"Tap at coordinates"),"longPress"in e&&e.longPress)return await this.driver.executeInNativeContext(this.logger,r=>r.executeScript("mobile: longClickGesture",[{x:o,y:n,duration:e.longPressDurationMs??2e3}]),{operationName:"longPress"});if(tne(e)){let r=e.tapDelayMs??100;for(let i=0;i<e.iterations;i++)await this.driver.executeInNativeContext(this.logger,a=>a.tap({x:o,y:n}),{operationName:"tap"}),i<e.iterations-1&&await new Promise(a=>setTimeout(a,r));return}await this.driver.executeInNativeContext(this.logger,r=>r.tap({x:o,y:n}),{operationName:"tap"});}async tapOnNativeTarget(e,o){let[n,r,i,a]=e.bounds,s=i-n,l=a-r,c=o?.relativePosition?.x??s/2,u=o?.relativePosition?.y??l/2;c=Math.max(0,Math.min(c,s)),u=Math.max(0,Math.min(u,l));let d=n+c,m=r+u;return await this.tapOnNativeCoordinates({x:d,y:m,...o}),{x:d,y:m}}async tapOnWebviewTarget(e,o){let{controller:n}=e,r,i=1;return o&&tne(o)?(r=o.tapDelayMs,i=o.iterations):o&&"longPress"in o&&(r=o.longPressDurationMs),(await n.browser.click(e.browserTarget,{createIsolatedFolder:()=>{let s=Math.random().toString(36).substring(4),l=Oo__default.join(tmpdir(),"momentic","downloads"),c=Oo__default.join(l,this.orgId,s);return mkdirSync(c,{recursive:true}),c}},{delayMs:r,relativePosition:o?.relativePosition,iterations:i})).coordinates}async tapOnTarget({target:e,options:o}){return await fe().startAsyncSpan("EMULATOR_INTERACTION",async r=>{if(r.attributes.options=o,"type"in e&&e.type==="NATIVE"){let i=await this.tapOnNativeTarget(e,o);r.attributes.point=i,r.targetBounds=tl(e);}else {r.withinWebview=true;let i=await this.tapOnWebviewTarget(e,o);r.attributes.point=i,r.targetBounds=tl(e);}},{name:"Tap on target"})}async executeTap({command:e}){let o=fe(),n=Zje(e);if(e.target.type==="coordinates"||e.target.type==="absolute_percent"){let a=await this.driver.executeInNativeContext(this.logger,c=>c.getWindowSize(),{operationName:"getTapWindowSize"}),s,l;return e.target.type==="coordinates"?(s=e.target.xPercent*a.width,l=e.target.yPercent*a.height):(s=e.target.x/100*a.width,l=e.target.y/100*a.height),await o.startAsyncSpan("EMULATOR_INTERACTION",async c=>{await this.tapOnNativeCoordinates({...n,x:s,y:l}),c.attributes.point={x:s,y:l};},{name:`Tap at coordinates ${s}, ${l}`}),{success:true,message:`Tapped at ${s}, ${l}`}}let r=e.target.description,{thoughts:i}=await this.wrapTargetingAction({command:e,tracer:o,action:a=>this.tapOnTarget({target:a,options:n}),description:r});return {success:true,message:i}}};var Eu=class extends Bo{async doPress({keycode:e,repeat:o=1,keyPressDelayMs:n=0}){await fe().startAsyncSpan("EMULATOR_INTERACTION",async()=>{let i=Qje({keycode:e,repeat:o,keyPressDelayMs:n});return this.driver.executeInNativeContext(this.logger,a=>a.execute("mobile: shell",i),{operationName:"pressKey"})},{name:o>1?`Send ${o} key event(s) to emulator`:"Send key events to emulator"});}};function Qje({keycode:t,repeat:e,keyPressDelayMs:o}){if(e<=1)return {command:"input",args:["keyevent",`${t}`]};if(o<=0)return {command:"input",args:["keyevent",...Array(e).fill(`${t}`)]};let n=o/1e3;return {command:"sh",args:["-c",Array(e).fill(`input keyevent ${t}`).join(`; sleep ${n}; `)]}}var om=25,nne=150,rne=67,t2e=123,o2e=100,n2e=24,r2e=4,ine=1e3,Tx=class extends Bo{async doType(e){let o=fe();if(!e.target){if(e.clearContent)throw new O("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:true,message:"Successfully executed type action"}}if(e.target.type!=="description")throw new O("UserConfigurationError","x/y targets are not supported for the Type step");let{thoughts:n}=await this.wrapTargetingAction({command:e,tracer:o,action:async r=>{"type"in r&&r.type==="NATIVE"?await this.doNativeType(e,r):await this.doWebviewType(e,r);},description:e.target.description});return {success:true,message:n}}async doWebviewType(e,o){await fe().startAsyncSpan("EMULATOR_INTERACTION",async r=>{r.withinWebview=true;let i={clearContent:e.clearContent,forceClearContent:e.forceClearContent,delay:e.keyPressDelayMs??om};r.attributes.options=i;let{controller:a,browserTarget:s}=o;await a.browser.typeIntoTarget(e.text,s,i);},{name:"Typing within web view"});}async doNativeType(e,o){e.clearContent?await this.clearNativeContent(e,o):await this.tapNativeTargetForType(o),await this.stateManager.waitForPageSourceStability({timeoutMs:2e3,signal:this.aborter.controller?.signal,reason:"Waiting for keyboard to appear before typing"}),await this.sendKeys(e);}async tapNativeTargetForType(e,o){let n=fe(),r=new sh(this.constructPerformerParams());await n.startAsyncSpan("EMULATOR_INTERACTION",async i=>{i.attributes.options=o??{};let a=await r.tapOnNativeTarget(e,o);i.attributes.point=a,i.targetBounds=tl(e);},{name:"Tap on target"});}async sendKeys(e){let o=fe(),n=e.keyPressDelayMs??om;await o.startAsyncSection("Waiting for system keyboard to open",async(r,i)=>{let a=Date.now();for(;Date.now()-a<2e3;){this.throwIfAborted();let s=Date.now();if(await this.driver.executeInNativeContext(this.logger,c=>c.isKeyboardShown(),{operationName:"isKeyboardShown"}))return;let l=Date.now()-s;l<100&&await new Promise(c=>setTimeout(c,100-l));}i.attributes.timedOut=true;}),await o.startAsyncSpan("EMULATOR_INTERACTION",async()=>{try{n!==om&&await this.driver.executeInNativeContext(this.logger,async i=>i.updateSettings({keyInjectionDelay:n}),{operationName:"updateKeyInjectionDelay"});let r=[];for(let i=0;i<e.text.length;i+=nne)r.push(e.text.slice(i,i+nne));for(let i of r)await this.driver.executeInNativeContext(this.logger,async a=>a.keys(i),{operationName:"typeWithCustomKeyDelay",attemptTimeoutMs:cA(n,i),maxAttempts:1});}finally{n!==om&&await this.driver.executeInNativeContext(this.logger,async r=>r.updateSettings({keyInjectionDelay:om}),{operationName:"updateKeyInjectionDelay"});}},{name:`Typing with a ${n}ms delay`});}async clearNativeContent(e,o){let n=e.replaceStrategy??"auto";switch(this.logger.info({strategy:n,command:{targetDescription:e.target?.type==="description"?e.target.description:e.target?.type,textLength:e.text.length,clearContent:e.clearContent,forceClearContent:e.forceClearContent,replaceStrategy:e.replaceStrategy},target:Ra(o)},"Preparing to clear native input content"),n){case "auto":await this.clearNativeContentAutomatically(o);return;case "programmatic":await this.clearContentWithAppium(o,{verify:false});return;case "long-press":await this.clearContentWithSelectAll(o);return;case "backspace":await this.clearContentWithBackspace(o);return}}async clearNativeContentAutomatically(e){let o=ane(e),n=i2e(e);if(o===""&&n){this.logger.info({target:Ra(e)},"Skipping native clear because target text is already empty");return}n&&await this.clearContentWithAppium(e,{verify:true})||await this.clearContentWithSelectAll(e)||await this.clearContentWithBackspace(e);}async clearContentWithSelectAll(e){await this.tapNativeTargetForType(e,{longPress:true});let o=fe();try{return await o.startAsyncSection("Clearing any content from the focused field",()=>this.clearContentHelper()),!0}catch(n){return this.logger.warn({err:n},"Failed to find select all button, continuing..."),false}}async clearContentWithAppium(e,o){let n=e.xPath,r=VF(e);if(!n||r)return this.logger.info({rejectionReason:n?r:"missing_xpath",target:Ra(e)},"Skipping Appium clear for native target"),false;let i=fe();try{await i.startAsyncSection("Clearing content programmatically",()=>this.driver.executeInNativeContext(this.logger,async s=>{await(await s.$(n)).clearValue();},{operationName:"clearNativeTextInput",maxAttempts:1}));let a=o.verify?await this.waitForNativeTargetTextToClear(n):!0;return this.logger.info({target:Ra(e),verified:o.verify,cleared:a},"Finished Appium clear for native target"),a?(await this.focusNativeTargetAfterClear(e),!0):!1}catch(a){return this.logger.warn({err:a},"Failed to clear native input with Appium, falling back..."),false}}async focusNativeTargetAfterClear(e){let o=e.xPath;if(!o){await this.tapNativeTargetForType(e);return}let n=await this.resolveNativeTargetFocusAfterClear(o);if(n.resolved&&n.focused){this.logger.info({target:Ra(e)},"Target already focused after clear, skipping focus tap");return}if(n.resolved){let i=n.bounds;this.logger.info({target:Ra(e),bounds:i},"Tapping native target to focus after clear"),await this.tapNativeTargetForType(i?{...e,bounds:i}:e);return}if(await this.driver.executeInNativeContext(this.logger,i=>i.isKeyboardShown(),{operationName:"isKeyboardShown"})){this.logger.info({target:Ra(e)},"Target xPath no longer resolves but keyboard is open, skipping focus tap");return}this.logger.info({target:Ra(e)},"Target xPath no longer resolves and keyboard is closed, tapping cached bounds"),await this.tapNativeTargetForType(e);}async resolveNativeTargetFocusAfterClear(e){try{let o=await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0}),n=Yoe.evaluateXPathToFirstNode(e,o.graph.document,null,null);return n instanceof Element?{resolved:!0,focused:n.getAttribute("focused")==="true",bounds:Vl(n)}:{resolved:!1}}catch(o){return this.logger.debug({err:o},"Failed to resolve native target focus state after clear"),{resolved:false}}}async clearContentWithBackspace(e){let o=await this.readNativeTargetText(e.xPath);if(o===void 0)return this.logger.debug({target:Ra(e)},"Skipping native backspace clear because the target text is not readable"),false;if(o==="")return true;await this.tapNativeTargetForType(e);let r=await fe().startAsyncSection("Clearing content with bounded backspaces",async(i,a)=>{let s=o.length,l=1,c=0,u=0;for(let d=0;d<n2e;d++){let m=o2e-c;if(m<=0)break;let f=d===0||u>0?1:Math.max(1,Math.min(Math.ceil(s/2),Math.floor(s/l),m));this.logger.info({target:Ra(e),round:d,lengthBefore:s,keysToIssue:f,maxUnitsPerKey:l},"Issuing bounded backspaces"),await this.driver.executeInNativeContext(this.logger,b=>b.execute("mobile: shell",{command:"sh",args:["-c",`input keyevent ${t2e}; i=0; while [ $i -lt ${f} ]; do input keyevent ${rne}; i=$((i+1)); done`]}),{operationName:"backspaceClearNativeTextInput",maxAttempts:1}),c+=f;let h=await this.readRemainingNativeTextLength(e.xPath);if(h===void 0)return false;let g=s-h;if(this.logger.info({target:Ra(e),round:d,lengthAfter:h,deleted:g,totalKeys:c},"Bounded backspace iteration result"),h===0)return a.attributes.totalKeys=c,true;if(g<=0){if(u+=1,u>=2)return false;s=h;continue}u=0,l=Math.max(l,Math.ceil(g/f)),s=h;}return a.attributes.totalKeys=c,false});return this.logger.info({target:Ra(e),cleared:r},"Finished native backspace clear"),r}async readNativeTargetText(e){let o=await this.readNativeTargetTextResult(e);if(o.status==="readable")return o.text}async readRemainingNativeTextLength(e){for(let o=0;o<r2e;o++){let n=await this.readNativeTargetTextResult(e);if(n.status==="readable")return n.text?.length??0}}async readNativeTargetTextResult(e){if(!e)return {status:"unreadable"};try{return {status:"readable",text:await re(this.readNativeTargetTextFromXml(e),{milliseconds:ine,signal:this.aborter.controller?.signal,message:`readNativeTextInputValueFromXml timed out after ${ine}ms`})}}catch(o){return this.logger.debug({err:o},"Failed to read native input text from XML for clear verification"),{status:"unreadable"}}}async readNativeTargetTextFromXml(e){let o=await this.stateManager.getDomState({skipFetchingFullWebviewContent:true,removeWebviewContent:true}),n=Yoe.evaluateXPathToFirstNode(e,o.graph.document,null,null);if(!n)throw new Error(`Could not resolve native input via XPath: ${e}`);return sne({text:n.getAttribute("text"),hint:n.getAttribute("hint"),showingHint:n.getAttribute("showing-hint"),password:n.getAttribute("password")})}async waitForNativeTargetTextToClear(e){return await fe().startAsyncSection("Verifying programmatic clear result",async(n,r)=>{let i=[],a=Date.now(),s=false,l=0;for(;Date.now()-a<2e3;){this.throwIfAborted(),l+=1;let c=await this.readNativeTargetTextResult(e);if(c.status==="unreadable"){i.push({attempt:l,status:"unreadable"});break}if(c.text===void 0||c.text==="")return i.push({attempt:l,status:"cleared"}),r.attributes.observations=i,r.attributes.result="cleared",true;s=true,i.push({attempt:l,status:"non_empty",textLength:c.text.length}),await new Promise(u=>setTimeout(u,100));}return r.attributes.observations=i,s?(r.attributes.result="still_non_empty",false):(r.attributes.result="unverifiable",true)})}async clearContentHelper(){await this.driver.executeInNativeContext(this.logger,async o=>{let n=o.$('//android.widget.LinearLayout[@content-desc="Select all" and @clickable="true"]');await n.waitForExist({timeout:750}),await n.click();},{operationName:"selectAllText",maxAttempts:1}),await new Eu(this.constructPerformerParams()).doPress({keycode:rne});}};function ane(t){return sne({text:t.resolvedNode.getAttribute("text"),hint:t.resolvedNode.getAttribute("hint"),showingHint:t.resolvedNode.getAttribute("showing-hint"),password:t.resolvedNode.getAttribute("password")})}function sne({text:t,hint:e,showingHint:o,password:n}){if(!(t===null||o==="true"||n==="true")&&!(e!==null&&t.trim()!==""&&t.trim()===e.trim()))return t}function i2e(t){return VF(t)===void 0}function VF(t){if(!t.xPath)return "missing_xpath";if(t.resolvedNode.getAttribute("enabled")==="false")return "disabled";let e=t.resolvedNode.tagName.toLowerCase(),o=t.resolvedNode.getAttribute("class")?.toLowerCase();if(e.endsWith("edittext")||o?.endsWith("edittext"))return;let n=t.resolvedNode.getAttribute("input-type");if(!n||n==="0")return "not_text_input"}function Ra(t){let e=ane(t);return {xPath:t.xPath,tagName:t.resolvedNode.tagName,className:t.resolvedNode.getAttribute("class"),resourceId:t.resolvedNode.getAttribute("resource-id"),contentDescription:t.resolvedNode.getAttribute("content-desc"),hint:t.resolvedNode.getAttribute("hint"),inputType:t.resolvedNode.getAttribute("input-type"),enabled:t.resolvedNode.getAttribute("enabled"),focused:t.resolvedNode.getAttribute("focused"),showingHint:t.resolvedNode.getAttribute("showing-hint"),password:t.resolvedNode.getAttribute("password"),readableText:e===void 0?"unreadable":{length:e.length},appiumClearRejectionReason:VF(t)}}var lne=.8,a2e=w__default.object({navigationBar:w__default.object({visible:w__default.boolean(),x:w__default.number(),y:w__default.number(),width:w__default.number(),height:w__default.number()}),statusBar:w__default.object({visible:w__default.boolean(),x:w__default.number(),y:w__default.number(),width:w__default.number(),height:w__default.number()})});function jF(t,e){t.attributes.scrollableElementType=e.type,t.attributes.scrollableElementDisplay=fl(e),e.type==="CUSTOM"&&(t.attributes.scrollableElementDescription=e.target.description);}var lh=class extends Bo{async getHardcodedScrollableElementBounds(e,o){let n;switch(e.type){case "SCREEN":n=this.getContainerBoundsFromViewport(o);break;case "OPEN_APP":try{let r=a2e.parse(await this.driver.executeInNativeContext(this.logger,i=>i.executeScript("mobile: getSystemBars",[]),{operationName:"getSystemBars"}));n=this.getContainerBoundsFromViewport(o),r.navigationBar.visible&&(n.height=Math.max(1,n.height-r.navigationBar.height)),r.statusBar.visible&&(n.top+=r.statusBar.height,n.height=Math.max(1,n.height-r.statusBar.height));}catch(r){this.logger.warn({err:r},"Failed to get system bars, using hardcoded bounds"),n=this.getContainerBoundsFromViewport(o);}break;case "OPEN_WEBVIEW":{let r=await this.stateManager.getActiveWebviewNodes();if(r.length===0&&(await this.stateManager.refreshWebviewsManually("get active webview nodes"),r=await this.stateManager.getActiveWebviewNodes()),r.length===0)throw new Error("No active webviews found");if(r.length>1){let a=r.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=r[0]?.bounds;if(!i)throw new Error("No bounds found for active webview");n=this.getContainerBoundsFromBounds(i);break}default:{throw new Error("If Typescript complains about the line above, you missed a switch case")}}return n}getContainerBoundsFromViewport(e){return {left:e.x,top:e.y,width:Math.max(1,e.width),height:Math.max(1,e.height)}}getContainerBoundsFromBounds(e){let o=e[0],n=e[1],r=e[2],i=e[3],a=r-o,s=i-n;return {left:o,top:n,width:Math.max(1,a),height:Math.max(1,s)}}async executeSwipe(e){let o=fe(),n=fl(e.scrollableElement);if(e.scrollableElement.type==="CUSTOM_COORDINATES"){let{startX:i,startY:a,deltaPixels:s}=e.scrollableElement;return Math.abs(s)<ah?{success:true,message:"Successfully executed swipe action"}:(await o.startAsyncSpan("EMULATOR_INTERACTION",async l=>{jF(l,e.scrollableElement),l.attributes.startX=i,l.attributes.startY=a,l.attributes.deltaPixels=s,l.attributes.direction=e.direction,await this.performRawSwipe({startX:i,startY:a,deltaPixels:s,direction:e.direction,durationMs:e.durationMs});},{name:`Swipe ${e.direction} in ${n}`}),{success:true,message:"Successfully executed swipe action"})}if(e.scrollableElement.type!=="CUSTOM"){let i=await this.driver.executeInNativeContext(this.logger,s=>s.getWindowRect(),{operationName:"getSwipeViewportRect"}),a=await this.getHardcodedScrollableElementBounds(e.scrollableElement,i);return await o.startAsyncSpan("EMULATOR_INTERACTION",async s=>{jF(s,e.scrollableElement),await this.swipeByAbsoluteCoordinates({span:s,direction:e.direction,percent:e.viewportPercent,durationMs:e.durationMs,containerBounds:a,relativePosition:e.relativePosition?bo(e.relativePosition):void 0});},{name:`Swipe ${e.direction} in ${n}`}),{success:true,message:"Successfully executed swipe action"}}let{thoughts:r}=await this.wrapTargetingAction({command:e,description:e.scrollableElement.target.description,action:async i=>fe().startAsyncSpan("EMULATOR_INTERACTION",async s=>(jF(s,e.scrollableElement),"type"in i&&i.type==="NATIVE"?this.scrollInNativeContainer({span:s,cmd:e,target:i}):(s.withinWebview=true,this.swipeInWebview({span:s,cmd:e,target:i}))),{name:`Swipe ${e.direction} in ${n}`}),tracer:o});return {success:true,message:r}}async scrollInNativeContainer({span:e,cmd:o,target:n}){if(!n.bounds||n.bounds.length<4)throw new O("ActionFailureError","Native container cache has no bounds");let r=n.bounds,i=r[2]-r[0],a=r[3]-r[1];await this.swipeByAbsoluteCoordinates({span:e,direction:o.direction,percent:o.viewportPercent,durationMs:o.durationMs,containerBounds:{left:r[0],top:r[1],width:Math.max(1,i),height:Math.max(1,a)},relativePosition:o.relativePosition?bo(o.relativePosition):void 0});}async swipeInWebview({span:e,cmd:o,target:n}){let{controller:r,browserTarget:i}=n;if(!r.browser.getViewport())throw new Error("Failed to get viewport size from webview");let s=o.direction==="down"||o.direction==="up",l=await i.locator.boundingBox();if(!l)throw new Error("Failed to get bounds for webview container");let c=Math.floor(l.width*hi),u=Math.floor(l.height*hi),d=Math.max(1,l.width-c*2),m=Math.max(1,l.height-u*2),p,f;if(o.relativePosition){let b=bo(o.relativePosition);p=l.x+b.x,f=l.y+b.y;}else p=l.x+l.width/2,f=l.y+l.height/2;let h={x:p,y:f},g=(s?m:d)*(o.viewportPercent??lne)*(s?o.direction==="down"?1:-1:o.direction==="right"?1:-1);e.attributes.startPoint=h,e.attributes.scrollPixelAmount=g,await r.browser.mouseDragUsingVisualCoordinates({deltaX:s?0:g,deltaY:s?g:0,steps:10,dragDurationMs:o.durationMs,fromTarget:h});}async swipeByAbsoluteCoordinates({span:e,direction:o,percent:n=lne,durationMs:r=500,containerBounds:i,relativePosition:a}){e.attributes.containerBounds=i;let s=i.width*hi,l=i.height*hi,c,u;if(o==="up"||o==="down"?(c=(i.height-2*l)*n,u=Math.floor(c/(r/1e3))):(c=(i.width-2*s)*n,u=Math.floor(c/(r/1e3))),e.attributes.pixelDelta=c,e.attributes.pixelsPerSecond=u,a){let d=i.left+a.x,m=i.top+a.y;await this.performRawSwipe({startX:d,startY:m,deltaPixels:c,direction:o,durationMs:r});}else {let d=i.width*hi,m=i.height*hi,p={left:i.left+d,top:i.top+m,width:Math.max(1,i.width-2*d),height:Math.max(1,i.height-2*m)};await this.driver.executeInNativeContext(this.logger,f=>f.executeScript("mobile: swipeGesture",[{...p,direction:o,percent:n,speed:u}]),{operationName:"swipeGesture"});}}};var cne=20,HF=.9,s2e=2,ch=.5,WF=.2;var Ex=class extends lh{async executeScrollTo(e){let o=e.target.description,n=e.scrollStepPercent??HF,r=await this.tryUseCachedScrollPosition(e,o);return r||this.searchForElement({cmd:e,description:o,scrollStepPercent:n})}async resolveContainer({scrollableElement:e,containerCache:o,aiMetadata:n}){let r=await this.stateManager.getViewportBounds(),i={x:r.left,y:r.top,width:r.right-r.left,height:r.bottom-r.top};if(e.type==="CUSTOM_COORDINATES")return {bounds:{left:0,top:0,width:i.width,height:i.height},diffThresholdPercent:ch};if(e.type!=="CUSTOM")return {bounds:await this.getHardcodedScrollableElementBounds(e,i),diffThresholdPercent:ch};let a=fe(),s=e.target.description;if(o){let d=this.getBoundsFromNativeCache(o);return this.logger.info({bounds:d},"Got container bounds from native cache"),{bounds:d,cache:o,diffThresholdPercent:Sf({containerBounds:d,viewport:i,defaultThresholdPercent:ch})}}let l=await this.findElement({description:s,tracer:a,metadata:n});if(!l.success)throw new O("NoMatchingElementError",l.thoughts??"No matching element found");let{resolvedTarget:c}=l;if(c.type!=="NATIVE")throw new Error(`ActionFailureError: Custom scroll container "${s}" resolved to a webview element. Custom containers must be native elements.`);let u=this.getBoundsFromNativeCache(c);return this.logger.info({bounds:u},"Got container bounds from AI"),{bounds:u,cache:c,diffThresholdPercent:Sf({containerBounds:u,viewport:i,defaultThresholdPercent:ch})}}async tryUseCachedScrollPosition(e,o){let n=e.cache?.target;return n?n.type==="WEBVIEW"?this.tryUseWebviewCache(e,o):n.scrollDetails?this.tryUseNativeScrollCache(e,o,n):null:null}async tryUseWebviewCache(e,o){let n=fe();try{let{thoughts:r}=await this.wrapTargetingAction({command:e,tracer:n,description:o,action:async i=>{if(i.type==="NATIVE")throw new Error("Expected WEBVIEW target but got NATIVE");await this.scrollWebviewTargetIntoView(i);}});return {success:!0,message:r}}catch(r){return this.logger.warn({err:r},"Failed to use webview cache, falling back to search"),null}}async tryUseNativeScrollCache(e,o,n){let r=n.scrollDetails,i=fe(),a=e.scrollStepPercent??HF,s=r.scrollableElement.type==="CUSTOM"?r.scrollableElement.cache:void 0,l=await this.resolveContainer({scrollableElement:e.scrollableElement,containerCache:s,aiMetadata:{commandId:e.id}}),c=l.bounds,u=l.diffThresholdPercent,d=e.scrollableElement.type==="CUSTOM_COORDINATES"?e.scrollableElement:void 0,m=d?Math.abs(d.deltaPixels):this.calculateSwipeCoordinates({containerBounds:c,direction:e.direction,desiredDelta:js({containerBounds:c,containerInsetRatio:hi})*a}).actualDelta,p=await this.stateManager.getLastObservedState();if(p){let v=await this.tryFindElement({cmd:e,description:o,tracer:i,scrollDetails:this.buildScrollDetails(e,0,l.cache),knownState:p,useAIIfCacheFails:false});if(v)return this.logger.info("Element resolved from last observed state without scrolling"),v}else this.logger.debug("Skipping scroll-to preflight because no last observed state is available");let f=Math.abs(r.pixelDelta),h=0,g=m*s2e,b=0;for(;b<f;){this.throwIfAborted();let v=f-b,E=Math.min(v,g),P=await this.scrollByPixelDelta({pixelDelta:E,scrollableElement:e.scrollableElement,containerCache:l.cache,direction:e.direction,scrollStepPercent:a,aiMetadata:{commandId:e.id},useVisualDiff:false});if(P===0)break;b+=P,h+=e.direction==="down"?P:-P;let M=await this.tryFindElement({cmd:e,description:o,tracer:i,scrollDetails:this.buildScrollDetails(e,h,l.cache),useAIIfCacheFails:false});if(M)return this.logger.info({cumulativePixelDelta:h},"Element resolved during cache replay"),M}let y=Math.max(0,Math.min(e.maxScrollAttempts??cne,2)),T=true;for(let v=0;v<y&&T;v++){this.throwIfAborted(),T=await this.scrollByPage({direction:e.direction,containerBounds:c,scrollStepPercent:a,diffThresholdPercent:u,rawCoordinates:d}),T&&(h+=e.direction==="down"?m:-m);let E=await this.tryFindElement({cmd:e,description:o,tracer:i,scrollDetails:this.buildScrollDetails(e,h,l.cache),useAIIfCacheFails:false});if(E)return this.logger.info({attempt:v,cumulativePixelDelta:h},"Element resolved during cache buffer scroll"),E}if(h!==0){let v=e.direction==="down"?"up":"down";this.logger.info({cumulativePixelDelta:h,originalDirection:e.direction,undoDirection:v,scrollableElementType:e.scrollableElement.type},"Cache replay did not resolve target; undoing scroll"),await this.scrollByPixelDelta({pixelDelta:Math.abs(h),scrollableElement:e.scrollableElement,containerCache:l.cache,direction:v,scrollStepPercent:a,aiMetadata:{commandId:e.id}});}return null}async tryFindElement({cmd:e,description:o,tracer:n,scrollDetails:r,useAIIfCacheFails:i=true,knownState:a}){let s,l,c=false,u=r,d=GF(e.cache?.target);if(d&&d.resolvedDescription!==void 0&&ru(d.resolvedDescription,o)&&!e.disableCache){let f=a?.emulatorState??await this.stateManager.getDomState({skipFetchingFullWebviewContent:true,removeWebviewContent:true});try{let{resolvedTarget:h}=await ih({target:d,domState:f,stateManager:this.stateManager,logger:this.logger});s=h,c=!0,l="Successfully resolved scroll to target with cache.",this.logger.info("Successfully resolved scroll to target from cache");}catch(h){this.logger.warn({err:h},"Failed to resolve target from cache");}}if(s&&c&&s.type==="NATIVE"&&r){let f=await this.correctNativeTargetIntoView({cmd:e,resolvedTarget:s,scrollDetails:r});u=f.scrollDetails,f.resolvedTarget?s=f.resolvedTarget:(s=void 0,c=false);}if(!s&&!i)return null;if(!s)try{let f=LA(o),h=await this.findElement({description:f,tracer:n,knownState:a,metadata:{commandId:e.id,source:"SCROLL_TO"}});if(!h.success)return null;s=h.resolvedTarget,l=h.thoughts;}catch(f){if(f instanceof O&&f.reason==="NoMatchingElementError")return null;throw this.logger.warn({err:f},"Failed to find scroll-to target with AI"),f}if(s&&!c&&s.type==="NATIVE"&&r)try{let f=await this.correctNativeTargetIntoView({cmd:e,resolvedTarget:s,scrollDetails:r});u=f.scrollDetails,f.resolvedTarget&&(s=f.resolvedTarget);}catch(f){this.logger.warn({err:f},"Failed to reposition AI-resolved scroll-to target for stable cache generation");}if(s.type==="WEBVIEW"){await this.scrollWebviewTargetIntoView(s);let f=GF(Tu(s));return tm({command:e,updatedCache:f,updatedWithAI:!c,logger:this.logger}),{success:true,message:l}}let p=Tu(s);if(p.type!=="NATIVE")throw new Error("Expected native target cache for scroll-to");return tm({command:e,updatedCache:GF({...p,scrollDetails:u}),updatedWithAI:!c,logger:this.logger}),{success:true,message:l}}async correctNativeTargetIntoView({cmd:e,resolvedTarget:o,scrollDetails:n}){let r=await this.getCorrectiveScrollForTarget({resolvedTarget:o});if(!r)return {resolvedTarget:o,scrollDetails:n};this.logger.info({bounds:o.bounds,correction:r},"Repositioning scroll-to target to the preferred viewport anchor");let i=n.scrollableElement.type==="CUSTOM"?n.scrollableElement.cache:void 0,a=await this.scrollByPixelDelta({pixelDelta:r.pixelDelta,scrollableElement:n.scrollableElement,containerCache:i,direction:r.direction,scrollStepPercent:e.scrollStepPercent??HF,aiMetadata:{commandId:e.id},useVisualDiff:true});if(a===0)return this.logger.info({bounds:o.bounds,correction:r},"Skipping corrective scroll update because the viewport did not move"),{resolvedTarget:o,scrollDetails:n};let s=await this.stateManager.getDomState({skipFetchingFullWebviewContent:true,removeWebviewContent:true}),l;try{({resolvedTarget:l}=await ih({target:o,domState:s,stateManager:this.stateManager,logger:this.logger}));}catch(f){return this.logger.warn({err:f},"Failed to re-resolve scroll-to target after corrective scroll"),{resolvedTarget:o,scrollDetails:n}}if(l.type!=="NATIVE")return {resolvedTarget:o,scrollDetails:n};let c=o.bounds,u=l.bounds;if(c!==void 0&&u!==void 0&&c.length===u.length&&c.every((f,h)=>f===u[h]))return this.logger.info({bounds:o.bounds,correction:r,appliedCorrectionPixels:a},"Skipping corrective scroll update because the target did not move (viewport at scroll extent)"),{resolvedTarget:l,scrollDetails:n};let m={...n,pixelDelta:nA({currentPixelDelta:n.pixelDelta,baseDirection:n.direction,correctionDirection:r.direction,correctionPixels:a})},p=await this.getCorrectiveScrollForTarget({resolvedTarget:l});return p?(this.logger.warn({bounds:l.bounds,correction:p},"Corrective scroll still did not bring the scroll-to target into the preferred viewport anchor"),{resolvedTarget:l,scrollDetails:m}):{resolvedTarget:l,scrollDetails:m}}async searchForElement({cmd:e,description:o,scrollStepPercent:n}){let r=fe(),i=await this.resolveContainer({scrollableElement:e.scrollableElement,aiMetadata:{commandId:e.id}});return this.scrollAndSearch({cmd:e,description:o,tracer:r,scrollStepPercent:n,resolvedContainer:i})}async scrollAndSearch({cmd:e,description:o,tracer:n,scrollStepPercent:r,resolvedContainer:i}){let a=0,s=i.bounds,l=i.diffThresholdPercent,c=e.scrollableElement.type==="CUSTOM_COORDINATES"?e.scrollableElement:void 0,u;c?u=Math.abs(c.deltaPixels):u=this.calculateSwipeCoordinates({containerBounds:s,direction:e.direction,desiredDelta:js({containerBounds:s,containerInsetRatio:hi})*r}).actualDelta;let d=true,m=e.maxScrollAttempts??cne;for(let h=0;h<m;h++){this.throwIfAborted();let g=this.buildScrollDetails(e,a,i.cache),b=await this.tryFindElement({cmd:e,description:o,tracer:n,scrollDetails:g});if(b)return b;if(!d)throw new Error(`ActionFailureError: Could not find element "${o}" after scrolling to the end`);this.logger.debug({attempt:h,cumulativePixelDelta:a},"Element not found, scrolling further"),d=await this.scrollByPage({direction:e.direction,containerBounds:s,scrollStepPercent:r,diffThresholdPercent:l,rawCoordinates:c}),a+=e.direction==="down"?u:-u;}let p=this.buildScrollDetails(e,a,i.cache),f=await this.tryFindElement({cmd:e,description:o,tracer:n,scrollDetails:p});if(f)return f;throw new Error(`ActionFailureError: Could not find element "${o}" after ${m} scroll attempts`)}buildScrollDetails(e,o,n){return e.scrollableElement.type==="CUSTOM"?{pixelDelta:o,scrollableElement:{type:"CUSTOM",target:e.scrollableElement.target,cache:n},direction:e.direction}:e.scrollableElement.type==="CUSTOM_COORDINATES"?{pixelDelta:o,scrollableElement:e.scrollableElement,direction:e.direction}:{pixelDelta:o,scrollableElement:e.scrollableElement,direction:e.direction}}async scrollWebviewTargetIntoView(e){let{controller:o,browserTarget:n}=e;await o.browser.hover(n);}async scrollByPage({direction:e,containerBounds:o,scrollStepPercent:n,diffThresholdPercent:r,rawCoordinates:i}){return fe().startAsyncSpan("EMULATOR_INTERACTION",async s=>(s.attributes.containerBounds=o,s.attributes.direction=e,(await this.executeScrollGesture({direction:e,containerBounds:o,scrollStepPercent:n,diffThresholdPercent:r,rawCoordinates:i})).canScrollMore),{name:`Scroll ${e} by one page`})}async scrollByPixelDelta({pixelDelta:e,scrollableElement:o,containerCache:n,direction:r,scrollStepPercent:i,aiMetadata:a,useVisualDiff:s=false}){if(Math.abs(e)<ah)return 0;let l=fe(),c,u=ch,d,m,p;if(o.type==="CUSTOM_COORDINATES")d=o.startX,m=o.startY,p=o.deltaPixels;else {c=await this.resolveContainer({scrollableElement:o,containerCache:n,aiMetadata:a});let h=c.bounds;u=c.diffThresholdPercent;let g=js({containerBounds:h,containerInsetRatio:hi})*i,b=this.calculateSwipeCoordinates({containerBounds:h,direction:r,desiredDelta:g});d=b.startX,m=b.startY,p=b.actualDelta;}let f=Math.ceil(Math.abs(e)/p);return this.logger.debug({pixelDelta:e,direction:r,scrollableElementType:o.type,startX:d,startY:m,maxScrollPerStep:p,numScrolls:f},"scrollByPixelDelta calculated parameters"),l.startAsyncSpan("EMULATOR_INTERACTION",async h=>{h.attributes.pixelDelta=e,h.attributes.numScrolls=f,h.attributes.maxScrollPerStep=p,h.attributes.startX=d,h.attributes.startY=m;let g=this.invertDirection(r),b=0;for(let y=0;y<f;y++){this.throwIfAborted();let T=Math.abs(e)-b,v=Math.min(p,T);if(s){let E=await this.executeScrollGesture({direction:r,containerBounds:c?.bounds,scrollStepPercent:i,diffThresholdPercent:u,rawCoordinates:{type:"CUSTOM_COORDINATES",startX:d,startY:m,deltaPixels:v}});if(E.didScroll&&(b+=v),!E.canScrollMore)break}else {if(v<ah)break;await this.performRawSwipe({startX:d,startY:m,deltaPixels:v,direction:g}),b+=v;}}return h.attributes.appliedPixels=b,b},{name:`Scroll ${r} by ${Math.abs(e)}px`})}async executeScrollGesture({direction:e,containerBounds:o,scrollStepPercent:n,diffThresholdPercent:r=ch,rawCoordinates:i}){let a=await this.stateManager.getRawScreenshotBase64(),s,l,c;if(i)s=i.startX,l=i.startY,c=i.deltaPixels;else {if(!o)throw new Error("Expected container bounds for scroll gesture");let f=js({containerBounds:o,containerInsetRatio:hi})*n,h=this.calculateSwipeCoordinates({containerBounds:o,direction:e,desiredDelta:f});s=h.startX,l=h.startY,c=h.actualDelta;}await this.performRawSwipe({startX:s,startY:l,deltaPixels:c,direction:this.invertDirection(e)});let u=await this.stateManager.getRawScreenshotBase64(),d=Yc(a,u),m=d>r,p=d>r;return this.logger.debug({diffPercent:d,didScroll:m,diffThresholdPercent:r,canScrollMore:p,direction:e,actualDelta:c,rawCoordinates:i},"Scroll gesture visual diff result"),{didScroll:m,canScrollMore:p}}async getCorrectiveScrollForTarget({resolvedTarget:e}){let o=e.bounds;if(!o||o.length<4)return;let n=await this.stateManager.getViewportBounds(),r=Math.max(1,n.bottom-n.top),i=o[1],a=o[3],s=rA({viewportTop:n.top,viewportBottom:n.bottom,elementHeight:a-o[1],targetTopRatio:WF}),l=n.top+r*WF,c=n.bottom-r*WF,u=i>=n.top&&a<=n.bottom,d=i<l||a>c,m=e.resolvedNode.getAttribute("displayed")!=="false"&&e.resolvedNode.getAttribute("visible")!=="false",p=s-i;if(!(u&&m&&!d)){if(p>0)return {direction:"up",pixelDelta:p};if(p<0)return {direction:"down",pixelDelta:Math.abs(p)}}}};function GF(t){return !t||t.type!=="NATIVE"?t:iA(t)}var vx=class extends Bo{async doInstallApk(e){return await this.installApkFromUri(e.uri),{success:true,message:"Installed APK."}}async installApkFromUri(e){let o=await this.resolveUriToLocalApk(e);try{await this.stateManager.executeRawADBCommand(`install -r ${Oo__default.resolve(o.localPath)}`),this.logger.info({uri:e,localPath:o.localPath},"Installed APK on device");}finally{o.cleanup();}}async resolveUriToLocalApk(e){try{let o=new URL(e);if(o.protocol==="file:"){let n=o.href.slice(7),r;if(Bn__default.existsSync(n))r=n;else if(Bn__default.existsSync(Oo__default.join("/",n)))r=Oo__default.join("/",n);else throw new O("UserConfigurationError",`APK not found at path: ${n}`);return this.assertFileExists(r),{localPath:r,cleanup:()=>{}}}if(o.protocol==="http:"||o.protocol==="https:"){let n=await this.fetchWithTimeout(o);if(!n.ok)throw new O("UserInfrastructureError",`Failed to download APK from ${e} (status ${n.status})`);let r=await n.arrayBuffer(),i=Buffer.from(r),a=await this.writeBufferToTempFile(i,o.pathname);return {localPath:a,cleanup:()=>{try{Bn__default.unlinkSync(a);}catch(s){this.logger.warn({err:s,path:a},"Failed to remove temporary APK file");}}}}throw new O("UserConfigurationError",`Unsupported URI scheme for APK installation: ${o.protocol}`)}catch(o){if(o instanceof TypeError){let n=Oo__default.resolve(e);return this.assertFileExists(n),{localPath:n,cleanup:()=>{}}}throw o}}assertFileExists(e){try{Bn__default.accessSync(e);}catch{throw new O("UserConfigurationError",`APK not found at path: ${e}`)}}async fetchWithTimeout(e){let o=AbortSignal.timeout(9e4);return await fetch(e,{signal:o})}async writeBufferToTempFile(e,o){let n=Oo__default.extname(o)||".apk",r=Oo__default.join(tmpdir(),`momentic-apk-${randomUUID()}${n}`);return Bn__default.writeFileSync(r,e),r}};async function une({command:t,logger:e,generator:o,aiSettings:n,getEmulatorDomState:r,getScreenshotBase64:i,abortSignal:a}){let s=fe();if(!t.goal.trim())throw new O("ActionFailureError","Cannot perform AI extraction without goal");if(t.schema){let u=pp(t.schema);if(u)throw new O("UserConfigurationError",u)}let l="",c="";return await s.startAsyncSpan("EMULATOR_READ_STATE",async()=>{l=await r(),c=await i();},{name:"Get emulator state"}),await s.startAsyncSpan("AI_EXTRACTION_CALL",async u=>{try{let d=await o.getAndroidTextExtraction({goal:t.goal,emulatorState:l,returnSchema:t.schema,screenshot:`data:image/png;base64,${c}`},{disableCache:!!t.disableCache,abortSignal:a,loggerTags:$e(e),agentConfigVersion:n.agentConfig?.["android-text-extraction"]});if(u.result=d,aA({tracer:s,span:u,screenshot:c,emulatorState:l,logger:e}),d.result==="NOT_FOUND")return {success:!1,message:"No relevant data found for extraction goal on this page"};if(d.thoughts?.includes("MaxGenerationLengthExceededError"))throw new O("UserConfigurationError",d.thoughts);return {success:!0,output:d.result,message:d.thoughts}}catch(d){let m=J(d);throw m.includes("MaxGenerationLengthExceededError")?new O("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step instead."):m.includes("AIProviderError")&&m.includes("time")?new O("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}})}var Cx=class extends Bo{async dragNative(e,o,n){let{left:r,top:i,width:a,height:s}=this.getBoundsFromNativeCache(e),{left:l,top:c,width:u,height:d}=this.getBoundsFromNativeCache(o),m=r+a/2,p=i+s/2,f=l+u/2,h=c+d/2,g=n?.hoverDuration??500,b=n?.dragDuration??1e3;await this.driver.executeInNativeContext(this.logger,async y=>{await y.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:m,y:p},{type:"pointerDown",button:0},{type:"pause",duration:g},{type:"pointerMove",duration:b,x:f,y:h},{type:"pointerUp",button:0}]}]),await y.releaseActions();},{operationName:"dragAndDrop"});}async dragWebview(e,o,n){let{controller:r}=e;if(e.controller!==o.controller)throw new O("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 r.browser.dragAndDrop(e.browserTarget,o.browserTarget,{hoverDurationMs:a,steps:s,dragDurationMs:i});}async executeDragAndDrop({command:e}){let o=fe();if(e.fromTarget.type!=="description"||e.toTarget.type!=="description")throw new O("UserConfigurationError","Drag and drop only supports description targets for now");let n=e.fromTarget.description,{result:r,thoughts:i}=await this.wrapTargetingAction({command:e,tracer:o,description:n,cacheKey:"cache",targetName:"fromTarget",action:async c=>c}),a=e.toTarget.description,{result:s,thoughts:l}=await this.wrapTargetingAction({command:e,tracer:o,description:a,cacheKey:"cache",targetName:"toTarget",action:async c=>c});if(r.type!==s.type)throw new O("UserConfigurationError",`Drag and drop targets must be in the same context (both native or both webview). Found: From=${r.type}, To=${s.type}`);return await o.startAsyncSpan("EMULATOR_INTERACTION",async c=>{r.type==="NATIVE"&&s.type==="NATIVE"?await this.dragNative(r,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}):r.type==="WEBVIEW"&&s.type==="WEBVIEW"&&(c.withinWebview=true,await this.dragWebview(r,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}));},{name:"Drag and drop"}),{success:true,message:`${i}
5885
+ `));return}}let d=Array.from(e.childNodes??[]);for(let m of d){let p=m.nodeType;if(p===3){let f=m.nodeValue;f&&f.trim().length>0&&o.appendChild(n.createTextNode(f));continue}if(p===1){let f=m;if(!Hje(f,s?.viewportBounds))continue;let h=n.createElement(Woe(f.tagName));Goe(t,f,h),o.appendChild(h);}}}function Vje(t,e,o,n){let r=t.parseFromString("<hierarchy/>","text/xml"),i=new Map,a={prunedDocument:r,idToElement:o,prunedIdToElement:i,idCounter:{value:0},opts:n},s=r.documentElement;Goe(a,e,s);let l=new XMLSerializer().serializeToString(r);return {prunedDocument:r,prunedIdToElement:i,xml:l}}async function qoe(t,e,o){let n=new DOMParser,r=n.parseFromString(t,"text/xml"),i=new Map,a=r.documentElement;if(!a)throw new O("InternalWebAgentError","No root element found in XML");if(a.tagName!=="hierarchy")throw new O("InternalWebAgentError","No hierarchy element found in XML");let{prunedDocument:s,prunedIdToElement:l,xml:c}=Vje(n,a,i,o),u=c;try{u=await _je.format(c,{parser:"xml",plugins:[Ije],printWidth:120,tabWidth:1,singleAttributePerLine:!1});}catch(d){e.warn({err:d},"Failed to format XML");}return {xml:u,originalXml:t,document:r,idToElement:i,prunedDocument:s,prunedIdToElement:l}}function jje(t){let e=[],o=t;for(;o;){let n=o.tagName,r=o.parentElement,i=1;if(r){let a=Array.from(r.children).filter(s=>s.tagName===n);for(let s=0;s<a.length;s++)if(a[s]===o){i=s+1;break}}e.unshift(`${n}[${i}]`),o=r;}return `/${e.join("/")}`}function bx(t,e){let o=t.idToElement.get(e);if(o)return jje(o)}function UF(t,e){let o=t.idToElement.get(e);if(!o)return;let n=o.cloneNode(true);for(let r of Array.from(n.children)){let i=r;for(let a of Array.from(i.children))i.removeChild(a);}return n.outerHTML}function Vl(t){if(!t.hasAttribute("bounds"))return;let e=t.getAttribute("bounds");if(!e)return;let o=e.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);if(o){let n=parseInt(o[1],10),r=parseInt(o[2],10),i=parseInt(o[3],10),a=parseInt(o[4],10);if(Number.isFinite(n)&&Number.isFinite(r)&&Number.isFinite(i)&&Number.isFinite(a))return [n,r,i,a]}}function Hje(t,e){if(!e)return true;let o=Vl(t);if(!o||o.length<4)return true;let n=o[0],r=o[1],i=o[2],a=o[3];return !(i<=e.left||n>=e.right||a<=e.top||r>=e.bottom)}function Koe(t,e){if(t&&!(!e||e.length===0))return Object.fromEntries(e.map(o=>[o,t.getAttribute(o)]).filter(([,o])=>o!==null))}function Xoe({requirements:t,element:e}){let o;if((t?.positionSpecificity||t?.shapeSpecificity)&&(o=Vl(e),!o))throw new O("ActionFailureError","Element to cache has no bounds or unexpected bounds format");return {requiredText:t?.textRequired&&wf(e)||void 0,requiredAttributes:Koe(e,t?.attributesRequired),requiredBounds:t?.boundsRequired,position:t?.positionSpecificity?{x1:o[0],y1:o[1],x2:o[2],y2:o[3],tolerance:t?.positionSpecificity}:void 0,shape:t?.shapeSpecificity?{width:o[2]-o[0],height:o[3]-o[1],tolerance:t?.shapeSpecificity}:void 0}}function Zoe({aiResponse:t,description:e,emulatorState:o,memory:n,useMemory:r}){let i=o.graph.idToElement.get(t.id);if(!i)throw new O("InternalWebAgentError",`Could not find node with id: ${t.id}`);let a=Vl(i);if(!a)throw new O("InternalWebAgentError",`Node ${t.id} has no bounding box: ${i.outerHTML}`);let s=bx(o.graph,t.id)??"",l=UF(o.graph,t.id)??"",c=Xoe({requirements:t.requirements,element:i}),u=[];t.additionalElements&&(u=t.additionalElements.map(({id:m,requirements:p})=>{let f=o.graph.idToElement.get(m);if(!f)return;let h=bx(o.graph,m);return h?{xPath:h,requirements:Xoe({requirements:p,element:f})}:void 0}).filter(m=>!!m));let d;if(zS(i)&&t.inWebview!==false?d={type:"WEBVIEW",resolvedDescription:e,xPath:s}:d={type:"NATIVE",bounds:a,resolvedDescription:e,xPath:s,elementOnlySerializedXml:l,requirements:c,requiredRelatedElements:u},r)if(t.updatedMemory){let m={type:"GCS_TRACES",traces:t.updatedMemory};d.memory=m;}else n&&(d.memory=n);return {target:d,resolvedNode:i}}function Qoe(t){return t?.type==="WEBVIEW"?t.browserCache?.memory:void 0}function Wje(t,e){let o=e.x2-e.x1,n=(e.x1+e.x2)/2,r=(t[0]+t[2])/2;if(!Hs(e.tolerance,n,r,Math.min(1,o)))return false;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(t[1]+t[3])/2;return Hs(e.tolerance,a,s,Math.min(1,i))}function Gje(t,e){return Hs(e.tolerance,e.width,t[2]-t[0],Math.min(1,e.width))?Hs(e.tolerance,e.height,t[3]-t[1],Math.min(1,e.height)):false}var Joe=(t,e,o)=>{if(!e)return;let{requiredAttributes:n,requiredText:r,requiredBounds:i,position:a,shape:s}=e;if(r!==void 0&&r.length>0){let l=wf(t);if(l!==r)throw new Ne(`Resolved element text mismatch: expected ${r}, got ${l}`)}if(n)for(let[l,c]of Object.entries(n)){let u=t.getAttribute(l)??void 0;if(u!==c)throw new Ne(`Attribute ${l} mismatch: expected ${c}, got ${u}`)}if(i&&o&&!o.targetBounds.every((c,u)=>c===o.newElementBounds[u]))throw new Ne(`Bounds changed from [${o.targetBounds.join(",")} ] to [${o.newElementBounds.join(",")} ]`);if(a&&o&&!Wje(o.newElementBounds,a))throw new Ne(`Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(o.newElementBounds)}`);if(s&&o&&!Gje(o.newElementBounds,s))throw new Ne(`Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(o.newElementBounds)}`)};async function ih(t){let{target:e,domState:o}=t,{graph:n}=o,{document:r}=n,i=fe();if(e.type==="WEBVIEW")return qje(e,t);if(!e.xPath)throw new O("ActionFailureError","Native element cache has no XPath");let a=Yoe.evaluateXPathToFirstNode(e.xPath,r,null,null);if(!a)throw new Ne(`Could not resolve cached target via XPath: ${e.xPath}`);if(e.requiredRelatedElements){let m=e.requiredRelatedElements;i.startSection("Validate related elements are similar enough to past runs",()=>{for(let p of m){let f=Yoe.evaluateXPathToFirstNode(p.xPath,r);if(!f)throw new Ne(`Required related element not found for XPath: ${p.xPath}`);Joe(f,p.requirements);}});}let s=Vl(a);if(!s)throw new Ne("Resolved native element has no bounding box");if(!e.bounds)throw new Ne("Native element cache has no bounds");Joe(a,e.requirements,{targetBounds:e.bounds,newElementBounds:s});let l;for(let[m,p]of n.idToElement.entries())if(p===a){l=m;break}let c=e.elementOnlySerializedXml,u=e.xPath;return l!==void 0&&(c=UF(n,l)??c,u=bx(n,l)??u),{resolvedTarget:{...e,resolvedNode:a,bounds:s,elementOnlySerializedXml:c,xPath:u}}}async function qje(t,e){let{stateManager:o,logger:n,signal:r}=e,i=fe(),a=await o.getActiveWebview();if(!a||!a.browserController)throw n.error({webview:a?{...a,browserController:!!a.browserController}:void 0},"resolveTargetCacheInWebView: No browser controller attached"),new Ne("No browser controller is attached to the requested webview");let s=a.browserController;if(!t.browserCache)throw n.error({target:t},"resolveTargetCacheInWebView: No browser target available on cache"),new Ne("No browser target available on cache");let l=t.browserCache,{finalTarget:c}=await i.startAsyncSection("Resolve target in webview",()=>s.resolveCachedTargetForAction({cache:l,options:{resolveTargetOptions:{logger:n,signal:r,skipWaitForPageLoad:true,skipSavingVisualAttributes:true}},logger:n}));return {resolvedTarget:{...t,controller:a.browserController,browserTarget:c}}}function tm(t){let{command:e,cacheKey:o="cache",targetName:n="target",updatedCache:r}=t;Ym(e)&&(e[o]={...e[o],[n]:Lm.parse(r)},t.updatedWithAI&&(e[o].updatedAt=new Date,e[o].updatedAtLoggerTags=$e(t.logger)));}function Tu(t){if(t.type==="WEBVIEW")return {type:"WEBVIEW",resolvedDescription:t.resolvedDescription,xPath:t.xPath,browserCache:t.browserCache,memory:t.memory};let{resolvedNode:e,...o}=t;return {...o}}var hi=.15,ah=10,Yje=500,Bo=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:o,skipFetchingFullWebviewContent:n=false,removeWebviewContent:r=false,useMemory:i=false,memory:a,webviewMemory:s,metadata:l,cacheBustReason:c,knownState:u}){let d=this.logger.child({...l}),m=u??await o.startAsyncSection("Get emulator state",async()=>{let y=await this.stateManager.getCurrentScreenshotPngString();return {emulatorState:await this.stateManager.getDomState({skipFetchingFullWebviewContent:n,removeWebviewContent:r}),screenshot:y}}),p;try{p=await o.startAsyncSpan("AI_LOCATOR_CALL",async y=>{c&&(y.attributes.cacheBustReason=c);let T=await this.generator.getAndroidElementLocation({description:e,screenXml:m.emulatorState.graph.xml,screenshot:m.screenshot,source:l?.source==="SCROLL_TO"?"SCROLL_TO":void 0,memory:i?a:void 0},{logger:d,loggerTags:$e(d),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["android-locator"]});return y.result=T,T});}catch(y){throw this.throwIfAborted(),d.error({err:y},"Failed to locate element"),new O("InternalWebAgentError",`Failed to locate element: ${y instanceof Error?y.message:y}`,{errOptions:{cause:y}})}if(p.id===-1){let y=p.updatedMemory?{type:"GCS_TRACES",traces:p.updatedMemory}:void 0;return {success:false,thoughts:p.thoughts??"No matching element found",updatedLocatorMemory:y}}let{target:f,resolvedNode:h}=Zoe({aiResponse:p,description:e,emulatorState:m.emulatorState,memory:a,useMemory:i});if(f.type==="NATIVE")return o.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:f.elementOnlySerializedXml??"Unknown element"},attributes:{},subSpans:[]}),{success:true,resolvedTarget:{...f,resolvedNode:h},thoughts:p.thoughts};let{browserLocateResult:g,browserController:b}=await o.startWebviewTrace(async()=>{let y=await this.stateManager.getActiveWebview();if(!y||!y.browserController)throw new O("InternalWebAgentError","No browser controller is attached to the requested webview");return {browserLocateResult:await y.browserController.locateElement({description:e,disableCache:false,useMemory:i,memory:i?s:void 0,logger:this.logger,skipWait:true,skipSavingVisualAttributes:true}),browserController:y.browserController}});return o.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:g.target.nodeOnlySerializedHtml??"Unknown HTML element in webview"},attributes:{},subSpans:[]}),{success:true,resolvedTarget:{...f,controller:b,browserTarget:{...g.resolution,serverSideBoundingBox:await g.resolution.locator.boundingBox({timeout:5e3})},browserCache:g.target},thoughts:g.thoughts}}async targetingActionWithAILocator(e){let{action:o,command:n,description:r,tracer:i,cacheKey:a,targetName:s,cache:l,skipFetchingFullWebviewContent:c,removeWebviewContent:u,metadata:d,cacheBustReason:m}=e,p=await this.findElement({description:r,tracer:i,skipFetchingFullWebviewContent:c,removeWebviewContent:u,useMemory:this.shouldUseMemoryForCommand(n),memory:l?.memory,webviewMemory:Qoe(l),metadata:d,cacheBustReason:m});if(!p.success){if(p.updatedLocatorMemory&&l){let b={...l,memory:p.updatedLocatorMemory};tm({command:n,cacheKey:a,targetName:s,updatedCache:b,updatedWithAI:true,logger:this.logger});}throw new O("NoMatchingElementError",p.thoughts??"No matching element found")}let f=p.thoughts,{result:h,resolvedTarget:g}=await this.executeActionWithWebviewReconstructRetry({action:o,resolvedTarget:p.resolvedTarget,reason:"webview target closed during AI-located action"});return tm({command:n,cacheKey:a,targetName:s,updatedCache:Tu(g),updatedWithAI:true,logger:this.logger}),{result:h,thoughts:f}}async wrapTargetingAction(e){let{action:o,description:n,command:r,cacheKey:i="cache",targetName:a="target",cacheIsInvalidAfterResolution:s,tracer:l,skipFetchingFullWebviewContent:c=false,removeWebviewContent:u=false}=e,d,m={commandId:r.id};if(i==="cache"&&"cache"in r&&r.cache){let T=r.cache;a==="target"&&"target"in T?d=T.target:a==="fromTarget"&&"fromTarget"in T?d=T.fromTarget:a==="toTarget"&&"toTarget"in T&&(d=T.toTarget);}let p=false,f,h=cloneDeep(d);if(r.disableCache&&(this.logger.debug({command:r},"Cache explicitly disabled for command"),p=true,f="Cache explicitly disabled",h=void 0),s&&(p=true,f=f??"Cache invalidated after resolution",h=void 0),h&&!ru(h?.resolvedDescription??"",n)&&(this.logger.info({description:n,cacheDescription:h?.resolvedDescription},"Cache description mismatch, clearing it automatically"),p=true,f="Description mismatch",h=void 0),!h)return this.logger.info({description:n,cacheBustedBeforeAction:p},"Prompting AI for a new element location"),this.targetingActionWithAILocator({action:o,command:r,description:n,tracer:l,cacheKey:i,targetName:a,cache:d,skipFetchingFullWebviewContent:c,removeWebviewContent:u,metadata:m,cacheBustReason:f});let g=h.type==="NATIVE"?!!h.requirements:!!h.browserCache?.requirements,b=h.type==="NATIVE"?!!h.requiredRelatedElements?.length:!!h.browserCache?.additionalElements?.length,y;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:T}=await l.startAsyncSpan("CACHE_RESOLUTION",async P=>{let M=Date.now(),I;for(;Date.now()-M<3e3;){y=await this.stateManager.getDomState({skipFetchingFullWebviewContent:h?.type==="NATIVE"});let A;try{A=(await ih({target:h,domState:y,stateManager:this.stateManager,logger:this.logger})).resolvedTarget;}catch(H){if(I=H,H instanceof Ne){this.logger.warn({err:H},"Failed to resolve target cache, retrying"),await Os(100,this.aborter.controller?.signal);continue}throw this.logger.error({err:H},"Failed to resolve target cache"),H}let k=Tu(A),_=diff(h,k);return _&&Object.keys(_).length>0&&this.logger.info({cacheDiffs:_},"Successfully resolved target with cache"),P.attributes.serializedElement=A.type==="WEBVIEW"?A.browserCache?.nodeOnlySerializedHtml??"Unknown HTML element in webview":A.elementOnlySerializedXml??"Unknown element",{resolvedTarget:A,updatedCache:k}}throw I}),{result:v,resolvedTarget:E}=await this.executeActionWithWebviewReconstructRetry({action:o,resolvedTarget:T,reason:"webview target closed during cached action"});return tm({command:r,cacheKey:i,targetName:a,updatedCache:Tu(E),updatedWithAI:!1,logger:this.logger}),Qe.increment("cache_target_resolution_v2",1,["outcome:hit",`platform:mobile-${h.type.toLowerCase()}`,`hasRequirements:${g}`,`hasAdditionalElements:${b}`,`orgId:${this.orgId}`,"cliVersion:1.4.6"]),{result:v,thoughts:"Successfully executed preset action with cache"}}catch(T){if(this.throwIfAborted(),T instanceof O&&T.reason!=="InternalWebAgentError")throw this.logger.error({err:T},"Failed to execute action with target cache (fatal)"),T;return Qe.increment("cache_target_resolution_v2",1,["outcome:miss",`platform:mobile-${h.type.toLowerCase()}`,`hasRequirements:${g}`,`hasAdditionalElements:${b}`,`orgId:${this.orgId}`,"cliVersion:1.4.6"]),this.logger.warn({err:T},"Failed to execute action with target cache, retrying with AI"),this.targetingActionWithAILocator({action:o,command:r,description:n,tracer:l,cacheKey:i,targetName:a,cache:h,skipFetchingFullWebviewContent:c,removeWebviewContent:u,metadata:m})}}async executeActionWithWebviewReconstructRetry(e){let{action:o,resolvedTarget:n,reason:r}=e;try{return {result:await o(n),resolvedTarget:n}}catch(i){if(this.throwIfAborted(),n.type!=="WEBVIEW"||!this.errorLooksLikeClosedWebviewTarget(i)||(this.logger.warn({err:i},"Webview target appears closed or crashed during action, reconstructing browser and retrying once"),!(await this.stateManager.reconstructActiveWebviewBrowser(r))?.browserController))throw i;let s=await this.stateManager.getDomState({skipFetchingFullWebviewContent:true}),{resolvedTarget:l}=await ih({target:Tu(n),domState:s,stateManager:this.stateManager,logger:this.logger,signal:this.abortSignal});return {result:await o(l),resolvedTarget:l}}}errorLooksLikeClosedWebviewTarget(e){let o=J(e);return ["Target closed","Target crashed","Page crashed","Target page, context or browser has been closed","Session closed. Most likely the page has been closed"].some(n=>o.includes(n))}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 O("ActionFailureError","Native element cache has no bounds");let[o,n,r,i]=e.bounds;if(o===void 0||n===void 0||r===void 0||i===void 0)throw new O("ActionFailureError",`Native element cache has incomplete bounds: [${e.bounds.join(", ")}]`);return {left:o,top:n,width:r-o,height:i-n}}calculateSwipeCoordinates({containerBounds:e,direction:o,desiredDelta:n}){let r=e.left+e.width/2,i=e.top+e.height/2;if(o==="up"||o==="down"){let a=e.height*hi,s=e.top+a,l=e.top+e.height-a,c=l-s,u=Math.min(Math.abs(n),c),d=c-u,m=o==="down"?l-d/2:s+d/2;return {startX:r,startY:m,actualDelta:u}}else {let a=e.width*hi,s=e.left+a,l=e.left+e.width-a,c=l-s,u=Math.min(Math.abs(n),c),d=c-u;return {startX:o==="right"?l-d/2:s+d/2,startY:i,actualDelta:u}}}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:o,deltaPixels:n,direction:r,durationMs:i=300}){let a=Math.abs(n);if(a<ah)return;let s=e,l=o;r==="up"||r==="down"?l=r==="up"?o-a:o+a:s=r==="left"?e-a:e+a,await this.driver.executeInNativeContext(this.logger,async c=>{await c.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:e,y:o},{type:"pointerDown",button:0},{type:"pause",duration:250},{type:"pointerMove",duration:i,x:s,y:l},{type:"pause",duration:500},{type:"pointerUp",button:0}]}]),await c.releaseActions();},{operationName:"performRawSwipe"}),await Te(Yje,this.abortSignal);}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted();}get abortSignal(){return this.aborter.controller?.signal}get aiSettingsCopy(){return cloneDeep(this.aiSettings)}get optionsCopy(){return cloneDeep(this.options)}};function tl(t){if(t.type==="WEBVIEW"){let a=t.browserTarget.serverSideBoundingBox;return a?{left:a.x,top:a.y,width:a.width,height:a.height}:void 0}let{bounds:e}=t;if(!e)return;let[o,n,r,i]=e;if(!(o===void 0||n===void 0||r===void 0||i===void 0))return {left:o,top:n,width:r-o,height:i-n}}function tne(t){return "iterations"in t}function Zje(t){let e={relativePosition:t.relativePosition?bo(t.relativePosition):void 0};if(t.iterations!==void 0&&(!Number.isInteger(t.iterations)||t.iterations<1))throw new Error("UserConfigurationError: iterations must be a positive integer");if(t.tapDelayMs!==void 0&&(!Number.isInteger(t.tapDelayMs)||t.tapDelayMs<0))throw new Error("UserConfigurationError: tapDelayMs must be >= 0");if(t.iterations&&t.iterations>1&&t.longPress)throw new Error("UserConfigurationError: Cannot specify both more than one tap iteration and long press at the same time");if(t.tapDelayMs!==void 0&&(!t.iterations||t.iterations<2))throw new Error("UserConfigurationError: tapDelayMs requires iterations >= 2");if(t.longPress){if(t.tapDelayMs!==void 0)throw new Error("UserConfigurationError: tapDelayMs cannot be used with longPress");return {...e,longPress:true,longPressDurationMs:t.longPressDurationMs}}return t.iterations!==void 0?{...e,iterations:t.iterations,tapDelayMs:t.tapDelayMs}:e}var sh=class extends Bo{async tapOnNativeCoordinates(e){let o=e.x,n=e.y;if(this.logger.info({x:o,y:n},"Tap at coordinates"),"longPress"in e&&e.longPress)return await this.driver.executeInNativeContext(this.logger,r=>r.executeScript("mobile: longClickGesture",[{x:o,y:n,duration:e.longPressDurationMs??2e3}]),{operationName:"longPress"});if(tne(e)){let r=e.tapDelayMs??100;for(let i=0;i<e.iterations;i++)await this.driver.executeInNativeContext(this.logger,a=>a.tap({x:o,y:n}),{operationName:"tap"}),i<e.iterations-1&&await new Promise(a=>setTimeout(a,r));return}await this.driver.executeInNativeContext(this.logger,r=>r.tap({x:o,y:n}),{operationName:"tap"});}async tapOnNativeTarget(e,o){let[n,r,i,a]=e.bounds,s=i-n,l=a-r,c=o?.relativePosition?.x??s/2,u=o?.relativePosition?.y??l/2;c=Math.max(0,Math.min(c,s)),u=Math.max(0,Math.min(u,l));let d=n+c,m=r+u;return await this.tapOnNativeCoordinates({x:d,y:m,...o}),{x:d,y:m}}async tapOnWebviewTarget(e,o){let{controller:n}=e,r,i=1;return o&&tne(o)?(r=o.tapDelayMs,i=o.iterations):o&&"longPress"in o&&(r=o.longPressDurationMs),(await n.browser.click(e.browserTarget,{createIsolatedFolder:()=>{let s=Math.random().toString(36).substring(4),l=Oo__default.join(tmpdir(),"momentic","downloads"),c=Oo__default.join(l,this.orgId,s);return mkdirSync(c,{recursive:true}),c}},{delayMs:r,relativePosition:o?.relativePosition,iterations:i})).coordinates}async tapOnTarget({target:e,options:o}){return await fe().startAsyncSpan("EMULATOR_INTERACTION",async r=>{if(r.attributes.options=o,"type"in e&&e.type==="NATIVE"){let i=await this.tapOnNativeTarget(e,o);r.attributes.point=i,r.targetBounds=tl(e);}else {r.withinWebview=true;let i=await this.tapOnWebviewTarget(e,o);r.attributes.point=i,r.targetBounds=tl(e);}},{name:"Tap on target"})}async executeTap({command:e}){let o=fe(),n=Zje(e);if(e.target.type==="coordinates"||e.target.type==="absolute_percent"){let a=await this.driver.executeInNativeContext(this.logger,c=>c.getWindowSize(),{operationName:"getTapWindowSize"}),s,l;return e.target.type==="coordinates"?(s=e.target.xPercent*a.width,l=e.target.yPercent*a.height):(s=e.target.x/100*a.width,l=e.target.y/100*a.height),await o.startAsyncSpan("EMULATOR_INTERACTION",async c=>{await this.tapOnNativeCoordinates({...n,x:s,y:l}),c.attributes.point={x:s,y:l};},{name:`Tap at coordinates ${s}, ${l}`}),{success:true,message:`Tapped at ${s}, ${l}`}}let r=e.target.description,{thoughts:i}=await this.wrapTargetingAction({command:e,tracer:o,action:a=>this.tapOnTarget({target:a,options:n}),description:r});return {success:true,message:i}}};var Eu=class extends Bo{async doPress({keycode:e,repeat:o=1,keyPressDelayMs:n=0}){await fe().startAsyncSpan("EMULATOR_INTERACTION",async()=>{let i=Qje({keycode:e,repeat:o,keyPressDelayMs:n});return this.driver.executeInNativeContext(this.logger,a=>a.execute("mobile: shell",i),{operationName:"pressKey"})},{name:o>1?`Send ${o} key event(s) to emulator`:"Send key events to emulator"});}};function Qje({keycode:t,repeat:e,keyPressDelayMs:o}){if(e<=1)return {command:"input",args:["keyevent",`${t}`]};if(o<=0)return {command:"input",args:["keyevent",...Array(e).fill(`${t}`)]};let n=o/1e3;return {command:"sh",args:["-c",Array(e).fill(`input keyevent ${t}`).join(`; sleep ${n}; `)]}}var om=25,nne=150,rne=67,t2e=123,o2e=100,n2e=24,r2e=4,ine=1e3,Tx=class extends Bo{async doType(e){let o=fe();if(!e.target){if(e.clearContent)throw new O("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:true,message:"Successfully executed type action"}}if(e.target.type!=="description")throw new O("UserConfigurationError","x/y targets are not supported for the Type step");let{thoughts:n}=await this.wrapTargetingAction({command:e,tracer:o,action:async r=>{"type"in r&&r.type==="NATIVE"?await this.doNativeType(e,r):await this.doWebviewType(e,r);},description:e.target.description});return {success:true,message:n}}async doWebviewType(e,o){await fe().startAsyncSpan("EMULATOR_INTERACTION",async r=>{r.withinWebview=true;let i={clearContent:e.clearContent,forceClearContent:e.forceClearContent,delay:e.keyPressDelayMs??om};r.attributes.options=i;let{controller:a,browserTarget:s}=o;await a.browser.typeIntoTarget(e.text,s,i);},{name:"Typing within web view"});}async doNativeType(e,o){e.clearContent?await this.clearNativeContent(e,o):await this.tapNativeTargetForType(o),await this.stateManager.waitForPageSourceStability({timeoutMs:2e3,signal:this.aborter.controller?.signal,reason:"Waiting for keyboard to appear before typing"}),await this.sendKeys(e);}async tapNativeTargetForType(e,o){let n=fe(),r=new sh(this.constructPerformerParams());await n.startAsyncSpan("EMULATOR_INTERACTION",async i=>{i.attributes.options=o??{};let a=await r.tapOnNativeTarget(e,o);i.attributes.point=a,i.targetBounds=tl(e);},{name:"Tap on target"});}async sendKeys(e){let o=fe(),n=e.keyPressDelayMs??om;await o.startAsyncSection("Waiting for system keyboard to open",async(r,i)=>{let a=Date.now();for(;Date.now()-a<2e3;){this.throwIfAborted();let s=Date.now();if(await this.driver.executeInNativeContext(this.logger,c=>c.isKeyboardShown(),{operationName:"isKeyboardShown"}))return;let l=Date.now()-s;l<100&&await new Promise(c=>setTimeout(c,100-l));}i.attributes.timedOut=true;}),await o.startAsyncSpan("EMULATOR_INTERACTION",async()=>{try{n!==om&&await this.driver.executeInNativeContext(this.logger,async i=>i.updateSettings({keyInjectionDelay:n}),{operationName:"updateKeyInjectionDelay"});let r=[];for(let i=0;i<e.text.length;i+=nne)r.push(e.text.slice(i,i+nne));for(let i of r)await this.driver.executeInNativeContext(this.logger,async a=>a.keys(i),{operationName:"typeWithCustomKeyDelay",attemptTimeoutMs:cA(n,i),maxAttempts:1});}finally{n!==om&&await this.driver.executeInNativeContext(this.logger,async r=>r.updateSettings({keyInjectionDelay:om}),{operationName:"updateKeyInjectionDelay"});}},{name:`Typing with a ${n}ms delay`});}async clearNativeContent(e,o){let n=e.replaceStrategy??"auto";switch(this.logger.info({strategy:n,command:{targetDescription:e.target?.type==="description"?e.target.description:e.target?.type,textLength:e.text.length,clearContent:e.clearContent,forceClearContent:e.forceClearContent,replaceStrategy:e.replaceStrategy},target:Ra(o)},"Preparing to clear native input content"),n){case "auto":await this.clearNativeContentAutomatically(o);return;case "programmatic":await this.clearContentWithAppium(o,{verify:false});return;case "long-press":await this.clearContentWithSelectAll(o);return;case "backspace":await this.clearContentWithBackspace(o);return}}async clearNativeContentAutomatically(e){let o=ane(e),n=i2e(e);if(o===""&&n){this.logger.info({target:Ra(e)},"Skipping native clear because target text is already empty");return}n&&await this.clearContentWithAppium(e,{verify:true})||await this.clearContentWithSelectAll(e)||await this.clearContentWithBackspace(e);}async clearContentWithSelectAll(e){await this.tapNativeTargetForType(e,{longPress:true});let o=fe();try{return await o.startAsyncSection("Clearing any content from the focused field",()=>this.clearContentHelper()),!0}catch(n){return this.logger.warn({err:n},"Failed to find select all button, continuing..."),false}}async clearContentWithAppium(e,o){let n=e.xPath,r=VF(e);if(!n||r)return this.logger.info({rejectionReason:n?r:"missing_xpath",target:Ra(e)},"Skipping Appium clear for native target"),false;let i=fe();try{await i.startAsyncSection("Clearing content programmatically",()=>this.driver.executeInNativeContext(this.logger,async s=>{await(await s.$(n)).clearValue();},{operationName:"clearNativeTextInput",maxAttempts:1}));let a=o.verify?await this.waitForNativeTargetTextToClear(n):!0;return this.logger.info({target:Ra(e),verified:o.verify,cleared:a},"Finished Appium clear for native target"),a?(await this.focusNativeTargetAfterClear(e),!0):!1}catch(a){return this.logger.warn({err:a},"Failed to clear native input with Appium, falling back..."),false}}async focusNativeTargetAfterClear(e){let o=e.xPath;if(!o){await this.tapNativeTargetForType(e);return}let n=await this.resolveNativeTargetFocusAfterClear(o);if(n.resolved&&n.focused){this.logger.info({target:Ra(e)},"Target already focused after clear, skipping focus tap");return}if(n.resolved){let i=n.bounds;this.logger.info({target:Ra(e),bounds:i},"Tapping native target to focus after clear"),await this.tapNativeTargetForType(i?{...e,bounds:i}:e);return}if(await this.driver.executeInNativeContext(this.logger,i=>i.isKeyboardShown(),{operationName:"isKeyboardShown"})){this.logger.info({target:Ra(e)},"Target xPath no longer resolves but keyboard is open, skipping focus tap");return}this.logger.info({target:Ra(e)},"Target xPath no longer resolves and keyboard is closed, tapping cached bounds"),await this.tapNativeTargetForType(e);}async resolveNativeTargetFocusAfterClear(e){try{let o=await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0}),n=Yoe.evaluateXPathToFirstNode(e,o.graph.document,null,null);return n instanceof Element?{resolved:!0,focused:n.getAttribute("focused")==="true",bounds:Vl(n)}:{resolved:!1}}catch(o){return this.logger.debug({err:o},"Failed to resolve native target focus state after clear"),{resolved:false}}}async clearContentWithBackspace(e){let o=await this.readNativeTargetText(e.xPath);if(o===void 0)return this.logger.debug({target:Ra(e)},"Skipping native backspace clear because the target text is not readable"),false;if(o==="")return true;await this.tapNativeTargetForType(e);let r=await fe().startAsyncSection("Clearing content with bounded backspaces",async(i,a)=>{let s=o.length,l=1,c=0,u=0;for(let d=0;d<n2e;d++){let m=o2e-c;if(m<=0)break;let f=d===0||u>0?1:Math.max(1,Math.min(Math.ceil(s/2),Math.floor(s/l),m));this.logger.info({target:Ra(e),round:d,lengthBefore:s,keysToIssue:f,maxUnitsPerKey:l},"Issuing bounded backspaces"),await this.driver.executeInNativeContext(this.logger,b=>b.execute("mobile: shell",{command:"sh",args:["-c",`input keyevent ${t2e}; i=0; while [ $i -lt ${f} ]; do input keyevent ${rne}; i=$((i+1)); done`]}),{operationName:"backspaceClearNativeTextInput",maxAttempts:1}),c+=f;let h=await this.readRemainingNativeTextLength(e.xPath);if(h===void 0)return false;let g=s-h;if(this.logger.info({target:Ra(e),round:d,lengthAfter:h,deleted:g,totalKeys:c},"Bounded backspace iteration result"),h===0)return a.attributes.totalKeys=c,true;if(g<=0){if(u+=1,u>=2)return false;s=h;continue}u=0,l=Math.max(l,Math.ceil(g/f)),s=h;}return a.attributes.totalKeys=c,false});return this.logger.info({target:Ra(e),cleared:r},"Finished native backspace clear"),r}async readNativeTargetText(e){let o=await this.readNativeTargetTextResult(e);if(o.status==="readable")return o.text}async readRemainingNativeTextLength(e){for(let o=0;o<r2e;o++){let n=await this.readNativeTargetTextResult(e);if(n.status==="readable")return n.text?.length??0}}async readNativeTargetTextResult(e){if(!e)return {status:"unreadable"};try{return {status:"readable",text:await re(this.readNativeTargetTextFromXml(e),{milliseconds:ine,signal:this.aborter.controller?.signal,message:`readNativeTextInputValueFromXml timed out after ${ine}ms`})}}catch(o){return this.logger.debug({err:o},"Failed to read native input text from XML for clear verification"),{status:"unreadable"}}}async readNativeTargetTextFromXml(e){let o=await this.stateManager.getDomState({skipFetchingFullWebviewContent:true,removeWebviewContent:true}),n=Yoe.evaluateXPathToFirstNode(e,o.graph.document,null,null);if(!n)throw new Error(`Could not resolve native input via XPath: ${e}`);return sne({text:n.getAttribute("text"),hint:n.getAttribute("hint"),showingHint:n.getAttribute("showing-hint"),password:n.getAttribute("password")})}async waitForNativeTargetTextToClear(e){return await fe().startAsyncSection("Verifying programmatic clear result",async(n,r)=>{let i=[],a=Date.now(),s=false,l=0;for(;Date.now()-a<2e3;){this.throwIfAborted(),l+=1;let c=await this.readNativeTargetTextResult(e);if(c.status==="unreadable"){i.push({attempt:l,status:"unreadable"});break}if(c.text===void 0||c.text==="")return i.push({attempt:l,status:"cleared"}),r.attributes.observations=i,r.attributes.result="cleared",true;s=true,i.push({attempt:l,status:"non_empty",textLength:c.text.length}),await new Promise(u=>setTimeout(u,100));}return r.attributes.observations=i,s?(r.attributes.result="still_non_empty",false):(r.attributes.result="unverifiable",true)})}async clearContentHelper(){await this.driver.executeInNativeContext(this.logger,async o=>{let n=o.$('//android.widget.LinearLayout[@content-desc="Select all" and @clickable="true"]');await n.waitForExist({timeout:750}),await n.click();},{operationName:"selectAllText",maxAttempts:1}),await new Eu(this.constructPerformerParams()).doPress({keycode:rne});}};function ane(t){return sne({text:t.resolvedNode.getAttribute("text"),hint:t.resolvedNode.getAttribute("hint"),showingHint:t.resolvedNode.getAttribute("showing-hint"),password:t.resolvedNode.getAttribute("password")})}function sne({text:t,hint:e,showingHint:o,password:n}){if(!(t===null||o==="true"||n==="true")&&!(e!==null&&t.trim()!==""&&t.trim()===e.trim()))return t}function i2e(t){return VF(t)===void 0}function VF(t){if(!t.xPath)return "missing_xpath";if(t.resolvedNode.getAttribute("enabled")==="false")return "disabled";let e=t.resolvedNode.tagName.toLowerCase(),o=t.resolvedNode.getAttribute("class")?.toLowerCase();if(e.endsWith("edittext")||o?.endsWith("edittext"))return;let n=t.resolvedNode.getAttribute("input-type");if(!n||n==="0")return "not_text_input"}function Ra(t){let e=ane(t);return {xPath:t.xPath,tagName:t.resolvedNode.tagName,className:t.resolvedNode.getAttribute("class"),resourceId:t.resolvedNode.getAttribute("resource-id"),contentDescription:t.resolvedNode.getAttribute("content-desc"),hint:t.resolvedNode.getAttribute("hint"),inputType:t.resolvedNode.getAttribute("input-type"),enabled:t.resolvedNode.getAttribute("enabled"),focused:t.resolvedNode.getAttribute("focused"),showingHint:t.resolvedNode.getAttribute("showing-hint"),password:t.resolvedNode.getAttribute("password"),readableText:e===void 0?"unreadable":{length:e.length},appiumClearRejectionReason:VF(t)}}var lne=.8,a2e=w__default.object({navigationBar:w__default.object({visible:w__default.boolean(),x:w__default.number(),y:w__default.number(),width:w__default.number(),height:w__default.number()}),statusBar:w__default.object({visible:w__default.boolean(),x:w__default.number(),y:w__default.number(),width:w__default.number(),height:w__default.number()})});function jF(t,e){t.attributes.scrollableElementType=e.type,t.attributes.scrollableElementDisplay=fl(e),e.type==="CUSTOM"&&(t.attributes.scrollableElementDescription=e.target.description);}var lh=class extends Bo{async getHardcodedScrollableElementBounds(e,o){let n;switch(e.type){case "SCREEN":n=this.getContainerBoundsFromViewport(o);break;case "OPEN_APP":try{let r=a2e.parse(await this.driver.executeInNativeContext(this.logger,i=>i.executeScript("mobile: getSystemBars",[]),{operationName:"getSystemBars"}));n=this.getContainerBoundsFromViewport(o),r.navigationBar.visible&&(n.height=Math.max(1,n.height-r.navigationBar.height)),r.statusBar.visible&&(n.top+=r.statusBar.height,n.height=Math.max(1,n.height-r.statusBar.height));}catch(r){this.logger.warn({err:r},"Failed to get system bars, using hardcoded bounds"),n=this.getContainerBoundsFromViewport(o);}break;case "OPEN_WEBVIEW":{let r=await this.stateManager.getActiveWebviewNodes();if(r.length===0&&(await this.stateManager.refreshWebviewsManually("get active webview nodes"),r=await this.stateManager.getActiveWebviewNodes()),r.length===0)throw new Error("No active webviews found");if(r.length>1){let a=r.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=r[0]?.bounds;if(!i)throw new Error("No bounds found for active webview");n=this.getContainerBoundsFromBounds(i);break}default:{throw new Error("If Typescript complains about the line above, you missed a switch case")}}return n}getContainerBoundsFromViewport(e){return {left:e.x,top:e.y,width:Math.max(1,e.width),height:Math.max(1,e.height)}}getContainerBoundsFromBounds(e){let o=e[0],n=e[1],r=e[2],i=e[3],a=r-o,s=i-n;return {left:o,top:n,width:Math.max(1,a),height:Math.max(1,s)}}async executeSwipe(e){let o=fe(),n=fl(e.scrollableElement);if(e.scrollableElement.type==="CUSTOM_COORDINATES"){let{startX:i,startY:a,deltaPixels:s}=e.scrollableElement;return Math.abs(s)<ah?{success:true,message:"Successfully executed swipe action"}:(await o.startAsyncSpan("EMULATOR_INTERACTION",async l=>{jF(l,e.scrollableElement),l.attributes.startX=i,l.attributes.startY=a,l.attributes.deltaPixels=s,l.attributes.direction=e.direction,await this.performRawSwipe({startX:i,startY:a,deltaPixels:s,direction:e.direction,durationMs:e.durationMs});},{name:`Swipe ${e.direction} in ${n}`}),{success:true,message:"Successfully executed swipe action"})}if(e.scrollableElement.type!=="CUSTOM"){let i=await this.driver.executeInNativeContext(this.logger,s=>s.getWindowRect(),{operationName:"getSwipeViewportRect"}),a=await this.getHardcodedScrollableElementBounds(e.scrollableElement,i);return await o.startAsyncSpan("EMULATOR_INTERACTION",async s=>{jF(s,e.scrollableElement),await this.swipeByAbsoluteCoordinates({span:s,direction:e.direction,percent:e.viewportPercent,durationMs:e.durationMs,containerBounds:a,relativePosition:e.relativePosition?bo(e.relativePosition):void 0});},{name:`Swipe ${e.direction} in ${n}`}),{success:true,message:"Successfully executed swipe action"}}let{thoughts:r}=await this.wrapTargetingAction({command:e,description:e.scrollableElement.target.description,action:async i=>fe().startAsyncSpan("EMULATOR_INTERACTION",async s=>(jF(s,e.scrollableElement),"type"in i&&i.type==="NATIVE"?this.scrollInNativeContainer({span:s,cmd:e,target:i}):(s.withinWebview=true,this.swipeInWebview({span:s,cmd:e,target:i}))),{name:`Swipe ${e.direction} in ${n}`}),tracer:o});return {success:true,message:r}}async scrollInNativeContainer({span:e,cmd:o,target:n}){if(!n.bounds||n.bounds.length<4)throw new O("ActionFailureError","Native container cache has no bounds");let r=n.bounds,i=r[2]-r[0],a=r[3]-r[1];await this.swipeByAbsoluteCoordinates({span:e,direction:o.direction,percent:o.viewportPercent,durationMs:o.durationMs,containerBounds:{left:r[0],top:r[1],width:Math.max(1,i),height:Math.max(1,a)},relativePosition:o.relativePosition?bo(o.relativePosition):void 0});}async swipeInWebview({span:e,cmd:o,target:n}){let{controller:r,browserTarget:i}=n;if(!r.browser.getViewport())throw new Error("Failed to get viewport size from webview");let s=o.direction==="down"||o.direction==="up",l=await i.locator.boundingBox();if(!l)throw new Error("Failed to get bounds for webview container");let c=Math.floor(l.width*hi),u=Math.floor(l.height*hi),d=Math.max(1,l.width-c*2),m=Math.max(1,l.height-u*2),p,f;if(o.relativePosition){let b=bo(o.relativePosition);p=l.x+b.x,f=l.y+b.y;}else p=l.x+l.width/2,f=l.y+l.height/2;let h={x:p,y:f},g=(s?m:d)*(o.viewportPercent??lne)*(s?o.direction==="down"?1:-1:o.direction==="right"?1:-1);e.attributes.startPoint=h,e.attributes.scrollPixelAmount=g,await r.browser.mouseDragUsingVisualCoordinates({deltaX:s?0:g,deltaY:s?g:0,steps:10,dragDurationMs:o.durationMs,fromTarget:h});}async swipeByAbsoluteCoordinates({span:e,direction:o,percent:n=lne,durationMs:r=500,containerBounds:i,relativePosition:a}){e.attributes.containerBounds=i;let s=i.width*hi,l=i.height*hi,c,u;if(o==="up"||o==="down"?(c=(i.height-2*l)*n,u=Math.floor(c/(r/1e3))):(c=(i.width-2*s)*n,u=Math.floor(c/(r/1e3))),e.attributes.pixelDelta=c,e.attributes.pixelsPerSecond=u,a){let d=i.left+a.x,m=i.top+a.y;await this.performRawSwipe({startX:d,startY:m,deltaPixels:c,direction:o,durationMs:r});}else {let d=i.width*hi,m=i.height*hi,p={left:i.left+d,top:i.top+m,width:Math.max(1,i.width-2*d),height:Math.max(1,i.height-2*m)};await this.driver.executeInNativeContext(this.logger,f=>f.executeScript("mobile: swipeGesture",[{...p,direction:o,percent:n,speed:u}]),{operationName:"swipeGesture"});}}};var cne=20,HF=.9,s2e=2,ch=.5,WF=.2;var Ex=class extends lh{async executeScrollTo(e){let o=e.target.description,n=e.scrollStepPercent??HF,r=await this.tryUseCachedScrollPosition(e,o);return r||this.searchForElement({cmd:e,description:o,scrollStepPercent:n})}async resolveContainer({scrollableElement:e,containerCache:o,aiMetadata:n}){let r=await this.stateManager.getViewportBounds(),i={x:r.left,y:r.top,width:r.right-r.left,height:r.bottom-r.top};if(e.type==="CUSTOM_COORDINATES")return {bounds:{left:0,top:0,width:i.width,height:i.height},diffThresholdPercent:ch};if(e.type!=="CUSTOM")return {bounds:await this.getHardcodedScrollableElementBounds(e,i),diffThresholdPercent:ch};let a=fe(),s=e.target.description;if(o){let d=this.getBoundsFromNativeCache(o);return this.logger.info({bounds:d},"Got container bounds from native cache"),{bounds:d,cache:o,diffThresholdPercent:Sf({containerBounds:d,viewport:i,defaultThresholdPercent:ch})}}let l=await this.findElement({description:s,tracer:a,metadata:n});if(!l.success)throw new O("NoMatchingElementError",l.thoughts??"No matching element found");let{resolvedTarget:c}=l;if(c.type!=="NATIVE")throw new Error(`ActionFailureError: Custom scroll container "${s}" resolved to a webview element. Custom containers must be native elements.`);let u=this.getBoundsFromNativeCache(c);return this.logger.info({bounds:u},"Got container bounds from AI"),{bounds:u,cache:c,diffThresholdPercent:Sf({containerBounds:u,viewport:i,defaultThresholdPercent:ch})}}async tryUseCachedScrollPosition(e,o){let n=e.cache?.target;return n?n.type==="WEBVIEW"?this.tryUseWebviewCache(e,o):n.scrollDetails?this.tryUseNativeScrollCache(e,o,n):null:null}async tryUseWebviewCache(e,o){let n=fe();try{let{thoughts:r}=await this.wrapTargetingAction({command:e,tracer:n,description:o,action:async i=>{if(i.type==="NATIVE")throw new Error("Expected WEBVIEW target but got NATIVE");await this.scrollWebviewTargetIntoView(i);}});return {success:!0,message:r}}catch(r){return this.logger.warn({err:r},"Failed to use webview cache, falling back to search"),null}}async tryUseNativeScrollCache(e,o,n){let r=n.scrollDetails,i=fe(),a=e.scrollStepPercent??HF,s=r.scrollableElement.type==="CUSTOM"?r.scrollableElement.cache:void 0,l=await this.resolveContainer({scrollableElement:e.scrollableElement,containerCache:s,aiMetadata:{commandId:e.id}}),c=l.bounds,u=l.diffThresholdPercent,d=e.scrollableElement.type==="CUSTOM_COORDINATES"?e.scrollableElement:void 0,m=d?Math.abs(d.deltaPixels):this.calculateSwipeCoordinates({containerBounds:c,direction:e.direction,desiredDelta:js({containerBounds:c,containerInsetRatio:hi})*a}).actualDelta,p=await this.stateManager.getLastObservedState();if(p){let v=await this.tryFindElement({cmd:e,description:o,tracer:i,scrollDetails:this.buildScrollDetails(e,0,l.cache),knownState:p,useAIIfCacheFails:false});if(v)return this.logger.info("Element resolved from last observed state without scrolling"),v}else this.logger.debug("Skipping scroll-to preflight because no last observed state is available");let f=Math.abs(r.pixelDelta),h=0,g=m*s2e,b=0;for(;b<f;){this.throwIfAborted();let v=f-b,E=Math.min(v,g),P=await this.scrollByPixelDelta({pixelDelta:E,scrollableElement:e.scrollableElement,containerCache:l.cache,direction:e.direction,scrollStepPercent:a,aiMetadata:{commandId:e.id},useVisualDiff:false});if(P===0)break;b+=P,h+=e.direction==="down"?P:-P;let M=await this.tryFindElement({cmd:e,description:o,tracer:i,scrollDetails:this.buildScrollDetails(e,h,l.cache),useAIIfCacheFails:false});if(M)return this.logger.info({cumulativePixelDelta:h},"Element resolved during cache replay"),M}let y=Math.max(0,Math.min(e.maxScrollAttempts??cne,2)),T=true;for(let v=0;v<y&&T;v++){this.throwIfAborted(),T=await this.scrollByPage({direction:e.direction,containerBounds:c,scrollStepPercent:a,diffThresholdPercent:u,rawCoordinates:d}),T&&(h+=e.direction==="down"?m:-m);let E=await this.tryFindElement({cmd:e,description:o,tracer:i,scrollDetails:this.buildScrollDetails(e,h,l.cache),useAIIfCacheFails:false});if(E)return this.logger.info({attempt:v,cumulativePixelDelta:h},"Element resolved during cache buffer scroll"),E}if(h!==0){let v=e.direction==="down"?"up":"down";this.logger.info({cumulativePixelDelta:h,originalDirection:e.direction,undoDirection:v,scrollableElementType:e.scrollableElement.type},"Cache replay did not resolve target; undoing scroll"),await this.scrollByPixelDelta({pixelDelta:Math.abs(h),scrollableElement:e.scrollableElement,containerCache:l.cache,direction:v,scrollStepPercent:a,aiMetadata:{commandId:e.id}});}return null}async tryFindElement({cmd:e,description:o,tracer:n,scrollDetails:r,useAIIfCacheFails:i=true,knownState:a}){let s,l,c=false,u=r,d=GF(e.cache?.target);if(d&&d.resolvedDescription!==void 0&&ru(d.resolvedDescription,o)&&!e.disableCache){let f=a?.emulatorState??await this.stateManager.getDomState({skipFetchingFullWebviewContent:true,removeWebviewContent:true});try{let{resolvedTarget:h}=await ih({target:d,domState:f,stateManager:this.stateManager,logger:this.logger});s=h,c=!0,l="Successfully resolved scroll to target with cache.",this.logger.info("Successfully resolved scroll to target from cache");}catch(h){this.logger.warn({err:h},"Failed to resolve target from cache");}}if(s&&c&&s.type==="NATIVE"&&r){let f=await this.correctNativeTargetIntoView({cmd:e,resolvedTarget:s,scrollDetails:r});u=f.scrollDetails,f.resolvedTarget?s=f.resolvedTarget:(s=void 0,c=false);}if(!s&&!i)return null;if(!s)try{let f=LA(o),h=await this.findElement({description:f,tracer:n,knownState:a,metadata:{commandId:e.id,source:"SCROLL_TO"}});if(!h.success)return null;s=h.resolvedTarget,l=h.thoughts;}catch(f){if(f instanceof O&&f.reason==="NoMatchingElementError")return null;throw this.logger.warn({err:f},"Failed to find scroll-to target with AI"),f}if(s&&!c&&s.type==="NATIVE"&&r)try{let f=await this.correctNativeTargetIntoView({cmd:e,resolvedTarget:s,scrollDetails:r});u=f.scrollDetails,f.resolvedTarget&&(s=f.resolvedTarget);}catch(f){this.logger.warn({err:f},"Failed to reposition AI-resolved scroll-to target for stable cache generation");}if(s.type==="WEBVIEW"){await this.scrollWebviewTargetIntoView(s);let f=GF(Tu(s));return tm({command:e,updatedCache:f,updatedWithAI:!c,logger:this.logger}),{success:true,message:l}}let p=Tu(s);if(p.type!=="NATIVE")throw new Error("Expected native target cache for scroll-to");return tm({command:e,updatedCache:GF({...p,scrollDetails:u}),updatedWithAI:!c,logger:this.logger}),{success:true,message:l}}async correctNativeTargetIntoView({cmd:e,resolvedTarget:o,scrollDetails:n}){let r=await this.getCorrectiveScrollForTarget({resolvedTarget:o});if(!r)return {resolvedTarget:o,scrollDetails:n};this.logger.info({bounds:o.bounds,correction:r},"Repositioning scroll-to target to the preferred viewport anchor");let i=n.scrollableElement.type==="CUSTOM"?n.scrollableElement.cache:void 0,a=await this.scrollByPixelDelta({pixelDelta:r.pixelDelta,scrollableElement:n.scrollableElement,containerCache:i,direction:r.direction,scrollStepPercent:e.scrollStepPercent??HF,aiMetadata:{commandId:e.id},useVisualDiff:true});if(a===0)return this.logger.info({bounds:o.bounds,correction:r},"Skipping corrective scroll update because the viewport did not move"),{resolvedTarget:o,scrollDetails:n};let s=await this.stateManager.getDomState({skipFetchingFullWebviewContent:true,removeWebviewContent:true}),l;try{({resolvedTarget:l}=await ih({target:o,domState:s,stateManager:this.stateManager,logger:this.logger}));}catch(f){return this.logger.warn({err:f},"Failed to re-resolve scroll-to target after corrective scroll"),{resolvedTarget:o,scrollDetails:n}}if(l.type!=="NATIVE")return {resolvedTarget:o,scrollDetails:n};let c=o.bounds,u=l.bounds;if(c!==void 0&&u!==void 0&&c.length===u.length&&c.every((f,h)=>f===u[h]))return this.logger.info({bounds:o.bounds,correction:r,appliedCorrectionPixels:a},"Skipping corrective scroll update because the target did not move (viewport at scroll extent)"),{resolvedTarget:l,scrollDetails:n};let m={...n,pixelDelta:nA({currentPixelDelta:n.pixelDelta,baseDirection:n.direction,correctionDirection:r.direction,correctionPixels:a})},p=await this.getCorrectiveScrollForTarget({resolvedTarget:l});return p?(this.logger.warn({bounds:l.bounds,correction:p},"Corrective scroll still did not bring the scroll-to target into the preferred viewport anchor"),{resolvedTarget:l,scrollDetails:m}):{resolvedTarget:l,scrollDetails:m}}async searchForElement({cmd:e,description:o,scrollStepPercent:n}){let r=fe(),i=await this.resolveContainer({scrollableElement:e.scrollableElement,aiMetadata:{commandId:e.id}});return this.scrollAndSearch({cmd:e,description:o,tracer:r,scrollStepPercent:n,resolvedContainer:i})}async scrollAndSearch({cmd:e,description:o,tracer:n,scrollStepPercent:r,resolvedContainer:i}){let a=0,s=i.bounds,l=i.diffThresholdPercent,c=e.scrollableElement.type==="CUSTOM_COORDINATES"?e.scrollableElement:void 0,u;c?u=Math.abs(c.deltaPixels):u=this.calculateSwipeCoordinates({containerBounds:s,direction:e.direction,desiredDelta:js({containerBounds:s,containerInsetRatio:hi})*r}).actualDelta;let d=true,m=e.maxScrollAttempts??cne;for(let h=0;h<m;h++){this.throwIfAborted();let g=this.buildScrollDetails(e,a,i.cache),b=await this.tryFindElement({cmd:e,description:o,tracer:n,scrollDetails:g});if(b)return b;if(!d)throw new Error(`ActionFailureError: Could not find element "${o}" after scrolling to the end`);this.logger.debug({attempt:h,cumulativePixelDelta:a},"Element not found, scrolling further"),d=await this.scrollByPage({direction:e.direction,containerBounds:s,scrollStepPercent:r,diffThresholdPercent:l,rawCoordinates:c}),a+=e.direction==="down"?u:-u;}let p=this.buildScrollDetails(e,a,i.cache),f=await this.tryFindElement({cmd:e,description:o,tracer:n,scrollDetails:p});if(f)return f;throw new Error(`ActionFailureError: Could not find element "${o}" after ${m} scroll attempts`)}buildScrollDetails(e,o,n){return e.scrollableElement.type==="CUSTOM"?{pixelDelta:o,scrollableElement:{type:"CUSTOM",target:e.scrollableElement.target,cache:n},direction:e.direction}:e.scrollableElement.type==="CUSTOM_COORDINATES"?{pixelDelta:o,scrollableElement:e.scrollableElement,direction:e.direction}:{pixelDelta:o,scrollableElement:e.scrollableElement,direction:e.direction}}async scrollWebviewTargetIntoView(e){let{controller:o,browserTarget:n}=e;await o.browser.hover(n);}async scrollByPage({direction:e,containerBounds:o,scrollStepPercent:n,diffThresholdPercent:r,rawCoordinates:i}){return fe().startAsyncSpan("EMULATOR_INTERACTION",async s=>(s.attributes.containerBounds=o,s.attributes.direction=e,(await this.executeScrollGesture({direction:e,containerBounds:o,scrollStepPercent:n,diffThresholdPercent:r,rawCoordinates:i})).canScrollMore),{name:`Scroll ${e} by one page`})}async scrollByPixelDelta({pixelDelta:e,scrollableElement:o,containerCache:n,direction:r,scrollStepPercent:i,aiMetadata:a,useVisualDiff:s=false}){if(Math.abs(e)<ah)return 0;let l=fe(),c,u=ch,d,m,p;if(o.type==="CUSTOM_COORDINATES")d=o.startX,m=o.startY,p=o.deltaPixels;else {c=await this.resolveContainer({scrollableElement:o,containerCache:n,aiMetadata:a});let h=c.bounds;u=c.diffThresholdPercent;let g=js({containerBounds:h,containerInsetRatio:hi})*i,b=this.calculateSwipeCoordinates({containerBounds:h,direction:r,desiredDelta:g});d=b.startX,m=b.startY,p=b.actualDelta;}let f=Math.ceil(Math.abs(e)/p);return this.logger.debug({pixelDelta:e,direction:r,scrollableElementType:o.type,startX:d,startY:m,maxScrollPerStep:p,numScrolls:f},"scrollByPixelDelta calculated parameters"),l.startAsyncSpan("EMULATOR_INTERACTION",async h=>{h.attributes.pixelDelta=e,h.attributes.numScrolls=f,h.attributes.maxScrollPerStep=p,h.attributes.startX=d,h.attributes.startY=m;let g=this.invertDirection(r),b=0;for(let y=0;y<f;y++){this.throwIfAborted();let T=Math.abs(e)-b,v=Math.min(p,T);if(s){let E=await this.executeScrollGesture({direction:r,containerBounds:c?.bounds,scrollStepPercent:i,diffThresholdPercent:u,rawCoordinates:{type:"CUSTOM_COORDINATES",startX:d,startY:m,deltaPixels:v}});if(E.didScroll&&(b+=v),!E.canScrollMore)break}else {if(v<ah)break;await this.performRawSwipe({startX:d,startY:m,deltaPixels:v,direction:g}),b+=v;}}return h.attributes.appliedPixels=b,b},{name:`Scroll ${r} by ${Math.round(Math.abs(e))}px`})}async executeScrollGesture({direction:e,containerBounds:o,scrollStepPercent:n,diffThresholdPercent:r=ch,rawCoordinates:i}){let a=await this.stateManager.getRawScreenshotBase64(),s,l,c;if(i)s=i.startX,l=i.startY,c=i.deltaPixels;else {if(!o)throw new Error("Expected container bounds for scroll gesture");let f=js({containerBounds:o,containerInsetRatio:hi})*n,h=this.calculateSwipeCoordinates({containerBounds:o,direction:e,desiredDelta:f});s=h.startX,l=h.startY,c=h.actualDelta;}await this.performRawSwipe({startX:s,startY:l,deltaPixels:c,direction:this.invertDirection(e)});let u=await this.stateManager.getRawScreenshotBase64(),d=Yc(a,u),m=d>r,p=d>r;return this.logger.debug({diffPercent:d,didScroll:m,diffThresholdPercent:r,canScrollMore:p,direction:e,actualDelta:c,rawCoordinates:i},"Scroll gesture visual diff result"),{didScroll:m,canScrollMore:p}}async getCorrectiveScrollForTarget({resolvedTarget:e}){let o=e.bounds;if(!o||o.length<4)return;let n=await this.stateManager.getViewportBounds(),r=Math.max(1,n.bottom-n.top),i=o[1],a=o[3],s=rA({viewportTop:n.top,viewportBottom:n.bottom,elementHeight:a-o[1],targetTopRatio:WF}),l=n.top+r*WF,c=n.bottom-r*WF,u=i>=n.top&&a<=n.bottom,d=i<l||a>c,m=e.resolvedNode.getAttribute("displayed")!=="false"&&e.resolvedNode.getAttribute("visible")!=="false",p=s-i;if(!(u&&m&&!d)){if(p>0)return {direction:"up",pixelDelta:p};if(p<0)return {direction:"down",pixelDelta:Math.abs(p)}}}};function GF(t){return !t||t.type!=="NATIVE"?t:iA(t)}var vx=class extends Bo{async doInstallApk(e){return await this.installApkFromUri(e.uri),{success:true,message:"Installed APK."}}async installApkFromUri(e){let o=await this.resolveUriToLocalApk(e);try{await this.stateManager.executeRawADBCommand(`install -r ${Oo__default.resolve(o.localPath)}`),this.logger.info({uri:e,localPath:o.localPath},"Installed APK on device");}finally{o.cleanup();}}async resolveUriToLocalApk(e){try{let o=new URL(e);if(o.protocol==="file:"){let n=o.href.slice(7),r;if(Bn__default.existsSync(n))r=n;else if(Bn__default.existsSync(Oo__default.join("/",n)))r=Oo__default.join("/",n);else throw new O("UserConfigurationError",`APK not found at path: ${n}`);return this.assertFileExists(r),{localPath:r,cleanup:()=>{}}}if(o.protocol==="http:"||o.protocol==="https:"){let n=await this.fetchWithTimeout(o);if(!n.ok)throw new O("UserInfrastructureError",`Failed to download APK from ${e} (status ${n.status})`);let r=await n.arrayBuffer(),i=Buffer.from(r),a=await this.writeBufferToTempFile(i,o.pathname);return {localPath:a,cleanup:()=>{try{Bn__default.unlinkSync(a);}catch(s){this.logger.warn({err:s,path:a},"Failed to remove temporary APK file");}}}}throw new O("UserConfigurationError",`Unsupported URI scheme for APK installation: ${o.protocol}`)}catch(o){if(o instanceof TypeError){let n=Oo__default.resolve(e);return this.assertFileExists(n),{localPath:n,cleanup:()=>{}}}throw o}}assertFileExists(e){try{Bn__default.accessSync(e);}catch{throw new O("UserConfigurationError",`APK not found at path: ${e}`)}}async fetchWithTimeout(e){let o=AbortSignal.timeout(9e4);return await fetch(e,{signal:o})}async writeBufferToTempFile(e,o){let n=Oo__default.extname(o)||".apk",r=Oo__default.join(tmpdir(),`momentic-apk-${randomUUID()}${n}`);return Bn__default.writeFileSync(r,e),r}};async function une({command:t,logger:e,generator:o,aiSettings:n,getEmulatorDomState:r,getScreenshotBase64:i,abortSignal:a}){let s=fe();if(!t.goal.trim())throw new O("ActionFailureError","Cannot perform AI extraction without goal");if(t.schema){let u=pp(t.schema);if(u)throw new O("UserConfigurationError",u)}let l="",c="";return await s.startAsyncSpan("EMULATOR_READ_STATE",async()=>{l=await r(),c=await i();},{name:"Get emulator state"}),await s.startAsyncSpan("AI_EXTRACTION_CALL",async u=>{try{let d=await o.getAndroidTextExtraction({goal:t.goal,emulatorState:l,returnSchema:t.schema,screenshot:`data:image/png;base64,${c}`},{disableCache:!!t.disableCache,abortSignal:a,loggerTags:$e(e),agentConfigVersion:n.agentConfig?.["android-text-extraction"]});if(u.result=d,aA({tracer:s,span:u,screenshot:c,emulatorState:l,logger:e}),d.result==="NOT_FOUND")return {success:!1,message:"No relevant data found for extraction goal on this page"};if(d.thoughts?.includes("MaxGenerationLengthExceededError"))throw new O("UserConfigurationError",d.thoughts);return {success:!0,output:d.result,message:d.thoughts}}catch(d){let m=J(d);throw m.includes("MaxGenerationLengthExceededError")?new O("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step instead."):m.includes("AIProviderError")&&m.includes("time")?new O("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}})}var Cx=class extends Bo{async dragNative(e,o,n){let{left:r,top:i,width:a,height:s}=this.getBoundsFromNativeCache(e),{left:l,top:c,width:u,height:d}=this.getBoundsFromNativeCache(o),m=r+a/2,p=i+s/2,f=l+u/2,h=c+d/2,g=n?.hoverDuration??500,b=n?.dragDuration??1e3;await this.driver.executeInNativeContext(this.logger,async y=>{await y.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:m,y:p},{type:"pointerDown",button:0},{type:"pause",duration:g},{type:"pointerMove",duration:b,x:f,y:h},{type:"pointerUp",button:0}]}]),await y.releaseActions();},{operationName:"dragAndDrop"});}async dragWebview(e,o,n){let{controller:r}=e;if(e.controller!==o.controller)throw new O("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 r.browser.dragAndDrop(e.browserTarget,o.browserTarget,{hoverDurationMs:a,steps:s,dragDurationMs:i});}async executeDragAndDrop({command:e}){let o=fe();if(e.fromTarget.type!=="description"||e.toTarget.type!=="description")throw new O("UserConfigurationError","Drag and drop only supports description targets for now");let n=e.fromTarget.description,{result:r,thoughts:i}=await this.wrapTargetingAction({command:e,tracer:o,description:n,cacheKey:"cache",targetName:"fromTarget",action:async c=>c}),a=e.toTarget.description,{result:s,thoughts:l}=await this.wrapTargetingAction({command:e,tracer:o,description:a,cacheKey:"cache",targetName:"toTarget",action:async c=>c});if(r.type!==s.type)throw new O("UserConfigurationError",`Drag and drop targets must be in the same context (both native or both webview). Found: From=${r.type}, To=${s.type}`);return await o.startAsyncSpan("EMULATOR_INTERACTION",async c=>{r.type==="NATIVE"&&s.type==="NATIVE"?await this.dragNative(r,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}):r.type==="WEBVIEW"&&s.type==="WEBVIEW"&&(c.withinWebview=true,await this.dragWebview(r,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}));},{name:"Drag and drop"}),{success:true,message:`${i}
5886
5886
  ${l}`}}};var wx=class{async getTextContent(e){return await e.textContent()??""}async getAttribute(e,o){return await e.getAttribute(o,{timeout:3e3})??""}async getTagName(e){return await e.evaluate(o=>o.tagName)}async isEditable(e){return await e.isEditable({timeout:_n*1e3})}async isEnabled(e){return await e.isEnabled({timeout:_n*1e3})}async isFocused(e){return await e.evaluate(o=>o===document.activeElement)}async getStyleProperty(e,o){return await e.evaluate((n,r)=>window.getComputedStyle(n).getPropertyValue(r),o)}},Ax=class{async getTextContent(e){return wf(e)}async getAttribute(e,o){return e.getAttribute(o)??""}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,o){throw new Error("Cannot perform computed style checks on native element")}};var u2e=5e3,Rx=class extends Bo{async executeElementCheck(e){let o=Date.now(),n=(e.timeout??_n)*1e3,r=n+1e4,i,a=0,s=500,l=cloneDeep(e.cache);if(e.target.type!=="description")throw new O("UserConfigurationError","x/y targets are not supported for the Element check step");for(;a-o<n;){if(Date.now()-o>r){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=l,l=cloneDeep(l),await Te(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),u2e);else return i}let c=await this.executeElementCheckHelper(e,{cacheIsInvalidAfterResolution:true});if(!c.success&&l&&e.cache){let u=Vb({logger:this.logger,originalTarget:Km(l)?l.target:void 0,newTarget:e.cache.target});u&&wl(l.target,u)&&(e.cache={target:u,updatedAt:e.cache.updatedAt});}return c}async executeElementCheckHelper(e,o){let n=fe();if(e.target.type!=="description")throw new O("UserConfigurationError","x/y targets are not supported for the Element check step");let r=jp(e.assertion);try{return (await this.wrapTargetingAction({...o??{},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})).result}catch(i){return r&&(i instanceof O&&i.reason==="NoMatchingElementError"||i instanceof ds)?{success:true}:{success:false,message:`Failed to evaluate element content assertion: ${i instanceof Error?i.message:`${i}`}`}}}async executeNativeElementCheck(e,o){let n=fe(),{assertion:r}=e,i=o.resolvedNode;return await n.startAsyncSpan("ELEMENT_ASSERTION",async a=>{a.targetBounds=tl(o);let s=await this.executeElementAssertion({assertion:r,element:i,elementPropertyAccessors:new Ax,span:a});return a.result=s,s},{name:"Native element check"})}async executeWebviewElementCheck(e,o){let n=fe(),r=o.browserTarget.locator,i=e.assertion;return await n.startAsyncSpan("ELEMENT_ASSERTION",async a=>{a.withinWebview=true,a.targetBounds=tl(o),await o.controller.browser.highlight(r);let s=await this.executeElementAssertion({assertion:i,element:r,elementPropertyAccessors:new wx,span:a});return a.result=s,s},{name:"Webview element check"})}async executeElementAssertion({assertion:e,element:o,elementPropertyAccessors:n,span:r}){switch(e.type){case "ELEMENT_CONTENT":{let i=await n.getTextContent(o)??"";return r.attributes.elementTextContent=Xo(i,500,true),Hr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})?{success:true}:{success:false,message:`The content ${Wn(e)} '${e.value}': ${i}`}}case "ELEMENT_ATTRIBUTE":{"evaluate"in o&&(r.attributes.elementOuterHtml=Xo(await o.evaluate(a=>a.cloneNode(false).outerHTML),500,true));let i;try{i=await n.getAttribute(o,e.attr);}catch{i=null;}if(!Hr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let a=Wn(e);return {success:false,message:`The attribute ${e.attr} ${a}${e.operation==="EXISTS"?"":` '${e.value}': ${i}`}`}}return {success:true}}case "ELEMENT_EXISTENCE":{let i=false;switch(e.condition){case "EDITABLE":i=await n.isEditable(o);break;case "VISIBLE":case "EXISTS":i=true;break;case "ENABLED":{i=await n.isEnabled(o);break}case "FOCUSED":i=await n.isFocused(o);break;default:throw e.condition,new Error("Unrecognized element condition type")}return i=e.negated?!i:i,i?{success:true}:{success:false,message:`The element ${Wn(e)}`}}case "ELEMENT_NAME":{let i=await n.getTagName(o);return Hr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:true})?{success:true}:{success:false,message:`The element tag name ${Wn(e)} '${e.value}': ${i}`}}case "ELEMENT_STYLE":{let i=await n.getStyleProperty(o,e.property);if(!Hr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let a=Wn(e);return {success:false,message:`The style property ${e.property} ${a}${e.operation==="EXISTS"?"":` '${e.value}': ${i}`}`}}return {success:true}}default:throw new Error("Unrecognized element assertion type")}}};var d2e=5e3,xx=class extends Bo{async executeScreenCheck(e){let{timeout:o}=e,n=Date.now(),r=(o??_n)*1e3,i=r+1e4,a=0,s=500;for(;a-n<r;){if(Date.now()-n>i){this.logger.warn("Exceeded max system timeout for screen check, exiting...");break}this.throwIfAborted();let l=await this.executeScreenCheckHelper(e);if(a=Date.now(),!l.success)await Te(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),d2e);else return l}return await this.executeScreenCheckHelper(e)}async executeScreenCheckHelper(e){return await fe().startAsyncSection("Execute screen check",async(n,r)=>{let[i,a]=await Promise.all([this.executeNativeScreenCheckHelper({span:r,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:o}){let{assertion:n}=o;switch(n.type){case "CONTENT":try{let r=(await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0})).graph.document.documentElement?.outerHTML;if(!r)throw new Error("Failed to get screen HTML");let i=r.includes(n.value)===!n.negated;return r.length>1e4&&(r=r.slice(0,1e4)+"...TRUNCATED"),i?{success:!0}:(e.attributes.screenContent=r,{success:!1,message:`The screen ${Vp({...n,negated:!n.negated})}.`})}catch(r){return {success:false,message:`Failed to evaluate screen content assertion: ${r instanceof Error?r.message:`${r}`}`}}default:return n.type,{success:false,message:`Unsupported screen check assertion type: ${n.type}`}}}async executeWebviewScreenCheckHelper(e){let o=await this.stateManager.getActiveWebview();if(!o||!o.browserController)return;let n=o.browserController.browser,r=await jL({assertion:e.assertion,logger:this.logger,browser:n,autoExpandIframes:!!n.userBrowserSettings.autoExpandIframes});return {success:r.success,message:r.err?.message,output:r.data}}};var Mx=class extends Bo{async doUninstallApk(e){return await this.uninstallApkPackage(e.packageName),{success:true,message:"Uninstalled APK."}}async uninstallApkPackage(e){let o=e.replace(/^package:/,""),n=await this.stateManager.executeRawADBCommand(`shell pm list packages | grep -E "^package:${o}$" || true`);if(!n||n.length===0)throw new O("UserConfigurationError",`Package ${o} not found`);if(n.split(`
5887
5887
  `).filter(i=>!!i).length>1)throw new O("UserConfigurationError",`Multiple packages found for ${o}`);try{await this.stateManager.executeRawADBCommand(`uninstall ${o}`);}catch(i){throw new O("UserInfrastructureError",`Failed to uninstall package ${o}: ${i}`)}}};var Px=class extends Bo{async executeVisualDiff({command:e,updateGoldenFiles:o}){let n=this.fixtures.visualDiffGoldenStorage;await this.stateManager.waitForScreenshotStability({timeoutMs:1e4,reason:"visual diff",signal:this.abortSignal});let r=await this.stateManager.getRawScreenshotBase64();return lA({goldenStorage:n,command:e,currentScreenshotBase64:r,threshold:e.threshold??Og,updateGoldenFiles:o,tracer:fe(),logger:this.logger})}};var mne=z.object({"Android-Package":z.string(),Browser:z.string(),"Protocol-Version":z.string(),"User-Agent":z.string(),"V8-Version":z.string(),"WebKit-Version":z.string(),webSocketDebuggerUrl:z.string()}),pne=z.object({description:z.string(),devtoolsFrontendUrl:z.string(),id:z.string(),title:z.string(),type:z.string(),url:z.string(),webSocketDebuggerUrl:z.string()}),fne=z.object({proc:z.string(),webview:z.string(),webviewName:z.string()}),hne=z.array(fne.extend({info:mne.optional(),pages:z.array(pne).optional()}));z.array(fne.extend({info:mne,pages:z.array(pne)}));var Ix=class t{driver;limbarClient;device;logger;webviews=new Map;fixtures;orgId;options;lastDomState;lastRawPageSource;lastScreenshot;lastViewportBounds;aborter;constructor({driver:e,limbarClient:o,logger:n,device:r,fixtures:i,orgId:a,options:s,aborter:l}){this.driver=e,this.limbarClient=o,this.device=r,this.logger=n,this.fixtures=i,this.orgId=a,this.options=s,this.aborter=l;for(let c of ["SIGINT","SIGTERM"])process.on(c,async()=>{await this.cleanupWebviews();});}static async init({driver:e,logger:o,fixtures:n,limbarClient:r,orgId:i,adbPort:a,options:s,aborter:l,playwrightDevice:c}){let u;if(c)u=c;else {let m=(await _android.devices()).filter(p=>p._initializer?.serial?.endsWith(a.toString())||p._initializer?.serial?.endsWith((a-1).toString()));if(o.warn({devices:m.map(p=>({serial:p._initializer?.serial,model:p._initializer?.model}))},"No playwright device provided, using ADB to find device"),m.length===0)throw new O("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(m.length>1)throw new O("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.`);u=m[0];}return new t({driver:e,logger:o,device:u,fixtures:n,orgId:i,options:s,aborter:l,limbarClient:r})}async getContexts(){let e=await this.driver.executeInNativeContext(this.logger,n=>n.getContexts({}),{operationName:"getContexts"}),o=Array.from(this.webviews.values());return {contexts:e,webviews:o.map(n=>({contextId:n.contextId,packageName:n.packageName,active:n.active,hasPlaywright:!!n.browserController,lastSeen:n.lastSeen,socketName:n.socketName}))}}async getRawScreenshotBase64({maxAttempts:e=3,signal:o}={}){let n=fe(),r=o??this.aborter.controller?.signal,i={maxAttempts:e,signal:r,operationName:"takeScreenshot"},a=await n.startAsyncSpan("EMULATOR_READ_STATE",async()=>{if(this.limbarClient){let s=this.limbarClient,l=await yf(this.logger,async()=>s.screenshot(),i);if(l.dataUri.startsWith("data:image/png;base64,"))return l.dataUri.slice(22);throw new O("InternalWebAgentError",`Emulator provider returned unexpected screenshot URI: ${l.dataUri}`)}return this.driver.executeInNativeContext(this.logger,s=>s.takeScreenshot(),i)},{name:"Take screenshot",signal:r,timeoutMs:3e4});return this.lastScreenshot={pngString:`data:image/png;base64,${a}`,observedAt:Date.now()},a}async getCurrentScreenshotPngString(){return `data:image/png;base64,${await this.getRawScreenshotBase64({maxAttempts:1})}`}async waitForScreenshotStability({timeoutMs:e,signal:o,reason:n,tolerancePercent:r=1}){let i=Sp({signal:o,timeoutMs:e});await fe().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async a=>{a.attributes.reason=n;let s,l=false;for(;!i.aborted;){let c=Date.now();if(s)try{let d=await this.getRawScreenshotBase64({maxAttempts:1,signal:i});if(Yc(s,d)<=r){l=!0;break}s=d;}catch(d){this.logger.warn({err:d},"Failed to get screenshot during stability wait");}else try{s=await this.getRawScreenshotBase64({maxAttempts:1,signal:i});}catch(d){this.logger.warn({err:d},"Failed to get initial screenshot during stability wait");}let u=Math.max(250,Date.now()-c);await Os(Math.min(1e4,u),i);}l||(a.attributes.timedOut=true,this.logger.warn({purpose:n},"Timed out waiting for screenshot stability"));});}async waitForPageSourceStability({timeoutMs:e,signal:o,reason:n}){await fe().startAsyncSpan("WAIT_FOR_PAGE_STABILITY",async r=>{r.attributes.reason=n;let i=Sp({signal:o,timeoutMs:e}),a,s=false;for(;!i.aborted;){let l,c=Date.now();try{l=await this.getPageSource(i);let d=createHash("md5").update(l).digest("hex");if(a&&a===d){s=!0;break}a=d;}catch(d){this.logger.warn({err:d},"Failed to get page source during stability wait");}let u=Math.max(250,Date.now()-c);await Os(Math.min(1e4,u),i);}if(!s){r.attributes.timedOut=true,this.logger.warn({purpose:n},"Timed out waiting for page source stability");return}await this.recordLastDomStateFromRawPageSource({removeWebviewContent:true});});}async getLastObservedState(){if(this.lastRawPageSource&&this.lastViewportBounds&&(!this.lastDomState||this.lastRawPageSource.observedAt>this.lastDomState.observedAt)&&await this.recordLastDomStateFromRawPageSource({removeWebviewContent:true}),!this.lastDomState||!this.lastScreenshot)return;let e=Date.now(),o=3e4;if(!(e-this.lastDomState.observedAt>o||e-this.lastScreenshot.observedAt>o||Math.abs(this.lastDomState.observedAt-this.lastScreenshot.observedAt)>3e4))return {emulatorState:this.lastDomState.state,screenshot:this.lastScreenshot.pngString}}async recordLastDomStateFromRawPageSource({removeWebviewContent:e}){if(!this.lastRawPageSource||!this.lastViewportBounds)return;let o=await this.buildDomStateFromRawXml({rawXml:this.lastRawPageSource.xml,removeWebviewContent:e,viewportBounds:this.lastViewportBounds});this.lastDomState={state:o,observedAt:this.lastRawPageSource.observedAt};}async buildDomStateFromRawXml({rawXml:e,webviewContent:o,removeWebviewContent:n,viewportBounds:r}){return {graph:await qoe(e,this.logger,{injectedWebviewContent:o,disableMomenticAccessibilityTree:this.options.disableMomenticAccessibilityTree,removeWebviewContent:n,viewportBounds:r})}}recordRawPageSource(e){this.lastRawPageSource={xml:e,observedAt:Date.now()};}recordDomState(e){this.lastDomState={state:e,observedAt:Date.now()};}async getCurrentPackage(){let e=await this.driver.executeInNativeContext(this.logger,n=>n.execute("mobile: getCurrentPackage"),{operationName:"getCurrentPackage"});return typeof e=="string"?e:void 0}async getActiveWebviewNodes(){let o=(await this.getDomState({skipFetchingFullWebviewContent:true,removeWebviewContent:true})).graph,n=[];for(let[r,i]of o.idToElement.entries())n.some(a=>a.id===r)||zS(i)&&n.push({id:r,originalElement:i,bounds:Vl(i)});return n}async getActiveWebviewContent(){let e=await this.getActiveWebview();if(!e||!e.browserController)return;this.throwIfAborted();let o=e.browserController;return (await fe().startAsyncSpan("EMULATOR_READ_STATE",()=>o.getBrowserState({abortSignal:this.aborter.controller?.signal,skipWait:true,skipWaitForPageLoad:true,logger:this.logger,serializationOpts:{noId:true}}),{name:"Get webview content",signal:this.aborter.controller?.signal})).serializedTree}async getDomState(e){return await fe().startAsyncSection("Get emulator state XML",async()=>{let n;if(!e?.skipFetchingFullWebviewContent&&!this.options.disableMomenticAccessibilityTree)try{n=await this.getActiveWebviewContent();}catch(l){this.logger.error({err:l},"Could not get webview info to get the nested DOM state");}this.throwIfAborted();let i=e?.filterOffscreenElements??true?await this.getViewportBounds():void 0,a=await this.getPageSource(),s=await this.buildDomStateFromRawXml({rawXml:a,webviewContent:n,removeWebviewContent:e?.removeWebviewContent,viewportBounds:i});return this.recordDomState(s),s},{timeoutMs:3e4})}async getPageSource(e){let o=e??this.aborter.controller?.signal,r=await fe().startAsyncSpan("EMULATOR_READ_STATE",()=>this.driver.executeInNativeContext(this.logger,i=>i.getPageSource(),{signal:o,operationName:"getPageSource"}),{name:"Get Android page source",signal:o,timeoutMs:3e4});return this.recordRawPageSource(r),r}async getViewportBounds(){let e=await this.driver.executeInNativeContext(this.logger,n=>n.getWindowRect(),{operationName:"getViewportBounds"}),o={left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height};return this.lastViewportBounds=o,o}refreshPromise;refreshInterval;webviewConnectionPromises=new Map;async refreshWebviewsManually(e){if(!this.options.disableMomenticAccessibilityTree){if(this.refreshPromise){await this.refreshPromise;return}this.refreshInterval&&(clearInterval(this.refreshInterval),this.refreshInterval=void 0),this.refreshPromise=this.doRefreshWebview(e,{currentAppOnly:true}).catch(o=>{this.logger.warn({err:o},"Error refreshing webviews, continuing...");}).finally(()=>{this.refreshPromise=void 0;}),await this.refreshPromise;}}async doRefreshWebview(e,{currentAppOnly:o}){if(this.options.disableMomenticAccessibilityTree)return;this.logger.info({reason:e,currentAppOnly:o},"Refreshing webviews"),this.throwIfAborted();let n=await this.getCurrentPackage();if(o&&n==="com.android.permissioncontroller")return;let r=await this.getDetailedContexts();if(!r){this.logger.warn("No context details, not proceeding with refreshing webviews");return}let i=Date.now(),a=new Set;for(let s of r){if(this.throwIfAborted(),s.webview==="NATIVE_APP")continue;let l=s.info["Android-Package"];if(o&&n&&l!==n&&l!=="com.android.chrome"){this.logger.debug({packageName:l,currentPkgName:n},"Skipping webview outside the active package during manual refresh");continue}a.add(s.webview);let c=!this.webviews.has(s.webview),u=!this.webviews.get(s.webview)?.active;if(c||u){let d={contextId:s.webview,packageName:l,active:false,lastSeen:i,socketName:s.proc.startsWith("@")?s.proc.substring(1):s.proc};this.logger.info({contextId:d.contextId,packageName:d.packageName,socketName:d.socketName},c?"New webview detected":"Inactive webview detected"),this.webviews.set(s.webview,d),this.logger.info({webviewInfo:d},`Connecting Playwright to webview: ${s.webview}`);let m=await this.connectPlaywrightToAvailableWebview(d);if(!m)continue;d.browserController=m,d.active=true;}}for(let[s,l]of this.webviews.entries())o&&n&&l.packageName!==n||!a.has(s)&&l.active&&(this.logger.info(`Disconnecting dead webview ${s}`),this.disconnectPlaywrightFromWebview(l),l.active=false);this.logger.info("Refreshed webviews");}async getActiveWebview(){if(this.options.disableMomenticAccessibilityTree)return;await this.refreshPromise;let e=await this.driver.executeInNativeContext(this.logger,a=>a.execute("mobile: getCurrentPackage"),{operationName:"getActiveWebviewCurrentPackage"}),o=async()=>{e!==void 0&&typeof e!="string"&&this.logger.warn({currentPkg:e},"Unexpected getCurrentPackage result");let a=[];for(let s of this.webviews.values())s.packageName===e&&s.active&&a.push(s);return this.logger.info({currentPkg:e,allWebviews:Array.from(this.webviews.values()).map(s=>({contextId:s.contextId,packageName:s.packageName,active:s.active}))},`getActiveWebview: found ${a.length} matching webviews`),a},n=await o();if(n.length===0&&(await fe().startAsyncSection("Refresh webviews",async()=>{await this.refreshWebviewsManually("no matching webview during getActiveWebview");}),n=await o()),n.length>1)throw new O("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");let r=n[0];if(!r)return;if(this.hasUsableWebviewBrowser(r)||(this.logger.warn({contextId:r.contextId,packageName:r.packageName},"Active webview browser is unhealthy, reconstructing"),await this.reconstructWebviewBrowser(r,"active webview page or target crashed"),this.hasUsableWebviewBrowser(r)))return r;if(await fe().startAsyncSection("Refresh webviews after browser reconstruction failed",async()=>{await this.refreshWebviewsManually("active webview browser reconstruction failed");}),n=await o(),n.length>1)throw new O("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");let i=n[0];if(i){if(this.hasUsableWebviewBrowser(i))return i;this.logger.warn({contextId:i.contextId,packageName:i.packageName},"Refreshed active webview is still unhealthy after reconstruction");}}async reconstructActiveWebviewBrowser(e){if(this.options.disableMomenticAccessibilityTree)return;await this.refreshPromise;let o=await this.driver.executeInNativeContext(this.logger,i=>i.execute("mobile: getCurrentPackage"),{operationName:"reconstructActiveWebviewCurrentPackage"});if(o!==void 0&&typeof o!="string"){this.logger.warn({currentPkg:o},"Unexpected getCurrentPackage result");return}let n=[];for(let i of this.webviews.values())i.packageName===o&&i.active&&n.push(i);if(n.length>1)throw new O("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");let r=n[0];if(r)return await this.reconstructWebviewBrowser(r,e),this.hasUsableWebviewBrowser(r)?r:void 0}hasUsableWebviewBrowser(e){let o=e.browserController;if(!o||!e.active)return false;let n=o.browser;if(n.closed)return false;let r;try{r=n.getActivePage();}catch(i){return this.logger.warn({err:i,contextId:e.contextId},"Failed to resolve active page for webview browser health check"),false}return !r.isClosed()}async reconstructWebviewBrowser(e,o){this.logger.info({contextId:e.contextId,packageName:e.packageName,reason:o},"Reconstructing webview browser"),await this.disconnectPlaywrightFromWebview(e),e.active=false;let n=await this.connectPlaywrightToAvailableWebview(e);n&&(e.browserController=n,e.active=true);}getDeviceSerial(){let e=this.driver.capabilities,o=n=>{if(!e||typeof e!="object")return;let r=e[n];return typeof r=="string"?r:void 0};return o("deviceUDID")||o("udid")||o("appium:udid")||o("appium:deviceUDID")}async executeRawADBCommandWithArgs(e){let o=this.getDeviceSerial();this.logger.info({serial:o,args:e},"Executing ADB command");let n=await hn(e,{serial:o,timeoutMs:15e3,throwOnError:true});return this.logger.info({result:n},"ADB command result"),n}async executeRawADBCommand(e){let o=this.getDeviceSerial(),n=e.trim().split(/\s+/).filter(i=>i.length>0);this.logger.info({serial:o,cmdArgs:n},"Executing ADB command");let r=await hn(n,{serial:o,timeoutMs:15e3,throwOnError:true});return this.logger.info({result:r},"ADB command result"),r}async cleanupWebviews(){this.refreshInterval&&(clearInterval(this.refreshInterval),this.refreshInterval=void 0);for(let[e,o]of this.webviews.entries())this.logger.info(`Disconnecting webview ${e}`),this.disconnectPlaywrightFromWebview(o),o.active=false;}async getDetailedContexts(){return await fe().startAsyncSpan("EMULATOR_READ_STATE",async()=>{let o=await this.driver.executeInNativeContext(this.logger,r=>r.execute("mobile: getContexts"),{operationName:"getDetailedContexts"});this.aborter.controller?.signal.throwIfAborted();let n;try{n=hne.parse(o);}catch(r){throw new O("InternalWebAgentError",`Failed to parse contexts. Original error:
5888
5888
  ${r}
5889
5889
  Raw: ${JSON.stringify(o)}`)}return n.filter(r=>r.webviewName?!r.info||!r.pages?false:r.pages.filter(a=>{if(!a.title)return false;let s=a.url;return !(!s||s===""||s.startsWith("about:blank")||s.startsWith("chrome-error:"))}).length?true:(this.logger.debug({context:r},"Webview has no qualified pages, skipping"),false):true)},{name:"Get available contexts",signal:this.aborter.controller?.signal})}async createBrowserController({context:e,page:o}){return await fe().startSection("Run remote Chrome initialization",async(r,i)=>{let a={};i.attributes.timings=a;let s=await Oy.fromExistingContext({context:e,page:o,attachTimeoutMs:8e3,logger:this.logger,timingRecorder:a,userBrowserSettings:{...this.options.browserSettings,disableBrowserMonitoring:true},properties:{isNewHeadless:false,allowedA11yIgnoreReasonsOverride:[],isAndroid:true},storage:this.fixtures.storage,enricher:this.fixtures.browserEnricher});try{return new NA({browser:s,generator:this.fixtures.browserGenerator,logger:this.logger,orgId:this.orgId,storage:this.fixtures.storage,localCodeEvalTools:this.fixtures.localCodeEvalTools,visualDiffScreenshotStorage:new lv})}catch(l){throw await s.cleanup(),l}})}async connectPlaywrightToWebview(e,o){return fe().startAsyncSection("Connect headless browser client to webview",async()=>{for(let r=0;r<2;r++)try{let i=await this.connectPlaywrightToWebviewHelper(e,o);return i?{kind:"connected",browserController:i}:{kind:"failed"}}catch(i){if(i instanceof ag)return {kind:"not_found"};if(this.errorLooksLikeUnattachableWebview(i))return this.logger.info({err:i,packageName:e,socketName:o},"Skipping Playwright connection for webview because the target is not attachable"),{kind:"not_attachable"};this.logger.warn({err:i},"Failed to connect Playwright to webview, retrying...");}return {kind:"failed"}},{signal:this.aborter.controller?.signal})}errorLooksLikeUnattachableWebview(e){let o=J(e);return ["No page found in existing context","Target closed","Target crashed","Page crashed","Target page, context or browser has been closed","Session closed. Most likely the page has been closed"].some(n=>o.includes(n))}async connectPlaywrightToAvailableWebview(e){let o=this.webviewConnectionPromises.get(e.contextId);if(o)return this.logger.debug({contextId:e.contextId},"Waiting for existing webview connection attempt"),o;let n=fe().startAsyncSection("Connect Playwright to available webview",async()=>await this.connectPlaywrightToAvailableWebviewHelper(e),{signal:this.aborter.controller?.signal}).catch(r=>{this.logger.warn({err:r,contextId:e.contextId},"Failed to connect Playwright to webview, continuing...");});return this.webviewConnectionPromises.set(e.contextId,n),n.finally(()=>{this.webviewConnectionPromises.get(e.contextId)===n&&this.webviewConnectionPromises.delete(e.contextId);}),n}async connectPlaywrightToAvailableWebviewHelper(e){let{contextId:o,packageName:n}=e,r=await this.connectPlaywrightToWebview(n??"",e.socketName);if(r.kind==="connected")return this.logger.info(`Connected Playwright to webview ${o}`),r.browserController;if(n!=="com.android.chrome"||r.kind!=="not_found")return;this.logger.info({webviewInfo:e},`Connecting Playwright to Android Chrome: ${o}`);let i=await this.connectPlaywrightToChrome(e);return i&&this.logger.info(`Connected Playwright to Android Chrome: ${o}`),i}extractSocketNameFromWebview(e,o){if("_socketName"in e&&typeof e._socketName=="string")return e._socketName;if("_data"in e&&e._data?.socketName)return e._data.socketName;o.warn({pkg:e.pkg()},"Could not extract socket name from webview");}async connectPlaywrightToWebviewHelper(e,o){let n=this.device.webViews(),r=n.find(c=>!(c.pkg()!==e&&e!=="com.android.chrome"||this.extractSocketNameFromWebview(c,this.logger)!==o));if(!r)throw this.logger.warn({webviews:n.map(c=>({pkg:c.pkg,name:this.extractSocketNameFromWebview(c,this.logger)}))},"Could not find matching webview in Playwright device list"),new ag(e,o);let i=await r.page(),a=i.url();if(a===""||a.startsWith("about:blank")||a.startsWith("chrome-error:")){let c=`Webview ${e} with socket ${o} is not a valid webview`;this.logger.warn({pageUrl:a},c);return}let s=i.context();return await this.createBrowserController({context:s,page:i})}async connectPlaywrightToChrome(e){return await fe().startAsyncSpan("EMULATOR_READ_STATE",async()=>this.connectPlaywrightToChromeHelper(e),{name:"Connect headless browser client to Chrome",signal:this.aborter.controller?.signal})}async connectPlaywrightToChromeHelper(e){let{contextId:o,socketName:n}=e,r,i=e.forwardedPort;try{this.logger.info({contextId:o,socketName:n},"Connecting to Chrome webview");let a;if(e.forwardedPort)a=`http://127.0.0.1:${e.forwardedPort}`,this.logger.info({contextId:o,endpoint:a,socketName:n},"Using existing forwarded port");else {let c=await this.forwardDevToolsSocket(e.socketName);e.forwardedPort=c,i=c,a=`http://127.0.0.1:${c}`,this.logger.info({contextId:o,endpoint:a,socketName:n},`Forwarding DevTools socket for ${e.socketName}`);}this.logger.info({endpoint:a,socketName:n},"Connecting to CDP endpoint"),r=await chromium.connectOverCDP({endpointURL:a,timeout:8e3});let s=r.contexts()[0];if(!s){this.logger.warn("No browser context available after CDP connection"),await r.close(),r=void 0;return}let l=await this.createBrowserController({context:s});return i=void 0,r=void 0,l}catch(a){this.logger.warn({err:a},`Error connecting Playwright to webview ${e.contextId}, continuing...`);return}finally{if(r)try{await r.close();}catch(a){this.logger.warn({err:a,contextId:o},"Failed to close orphaned CDP browser after webview connection failure");}if(i)try{await this.removeDevToolsForwarding(i);}catch(a){this.logger.warn({err:a,contextId:o,forwardedPort:i},"Failed to remove forwarded port after webview connection failure");}finally{e.forwardedPort===i&&(e.forwardedPort=void 0);}}}async disconnectPlaywrightFromWebview(e){if(e.browserController)try{this.logger.info(`Disconnecting Playwright from webview: ${e.contextId}`),await e.browserController.browser.cleanup();}catch(o){this.logger.error({err:o},`Error disconnecting Playwright from webview ${e.contextId}:`);}finally{e.browserController=void 0;}if(e.forwardedPort)try{await this.removeDevToolsForwarding(e.forwardedPort);}catch(o){this.logger.error({err:o},`Error removing forwarded port for webview ${e.contextId}:`);}finally{e.forwardedPort=void 0;}}async forwardDevToolsSocket(e){this.logger.info("Setting up port forwarding for DevTools");let o=1e4+Math.floor(Math.random()*1e4),n=this.getDeviceSerial();this.logger.info({deviceId:n},`Device ID from capabilities: ${n||"not found"}`);let r=e&&e.trim().length>0?`localabstract:${e}`:"localabstract:chrome_devtools_remote";return await this.executeRawADBCommand(`forward tcp:${o} ${r}`),this.logger.info(`Successfully forwarded DevTools socket to port ${o}`),o}async removeDevToolsForwarding(e){await this.executeRawADBCommand(`forward --remove tcp:${e}`),this.logger.info("Successfully removed port forwarding");}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted();}};var vu=class t extends Bo{appsWithGrantedPermissions=new Set;parseInstalledPackageLines(e){return e?.split(`
5890
5890
  `).filter(o=>o.trim().startsWith("package:")).map(o=>o.replace("package:","").trim()).filter(o=>o.length>0&&!o.startsWith("io.appium"))??[]}constructor(e){super(e);}async locateElement({description:e}){let o=await this.findElement({description:e,tracer:fe(),metadata:{source:"EDITOR_LOCATE"}});if(!o.success)throw new Error(o.thoughts);let n=tl(o.resolvedTarget);if(!n)throw new Error("Located element has no visible bounds");return {bounds:n,thoughts:o.thoughts}}static async init({driver:e,generator:o,logger:n,fixtures:r,orgId:i,options:a,abortController:s,adbPort:l,limbarClient:c,playwrightDevice:u,aiSettings:d}){let m={controller:s},p=await Ix.init({driver:e,logger:n,fixtures:r,orgId:i,limbarClient:c,options:a?.emulator??{},aborter:m,adbPort:l,playwrightDevice:u}),f=new t({driver:e,generator:o,stateManager:p,logger:n,fixtures:r,options:a,aborter:m,orgId:i,aiSettings:d,adbPort:l});return await f.initializeSettings(),f}get emulatorSettings(){return this.options?.emulator??{}}async installApp(e){await this.stateManager.executeRawADBCommand(`install ${Oo__default.resolve(e)}`);}async isPackageInstalled(e){let o=await this.executeRawADBCommand(`shell pm list packages ${e}`);return this.parseInstalledPackageLines(o).includes(e)}async getInstalledApps(){let[e,o]=await Promise.all([this.executeRawADBCommand("shell pm list packages -3"),this.executeRawADBCommand("shell pm list packages")]),n=this.parseInstalledPackageLines(e).sort((a,s)=>a.localeCompare(s)),i=this.parseInstalledPackageLines(o).filter(a=>!n.includes(a)&&!JN(a)).sort((a,s)=>a.localeCompare(s));return {installedApps:n,prunedApps:i}}async executeCommand(e){let o=["type","a11yData","thoughts","cache","code"],n;try{n=await Af({obj:e.command,context:this.fixtures.testContext,bannedKeys:o,orgId:this.orgId,logger:this.logger,signal:this.abortSignal,localTools:this.fixtures.localCodeEvalTools});}catch(r){throw this.throwIfAborted(),new O("UserConfigurationError",`Failed to substitute template strings in command: ${r.message}`,{errOptions:{cause:r}})}try{let r=await this.executeCommandHelper(e);return !r.success&&(e.command.type==="SCREEN_CHECK"||e.command.type==="ELEMENT_CHECK")?{...r,message:_T(r.message)}:r}catch(r){throw r.name!=="AbortError"&&this.logger.error({err:r},"Error thrown in action controller"),r}finally{Rf(e.command,n);}}async executeCommandHelper({command:e,updateGoldenFiles:o}){let n=fe();switch(e.type){case "TAP":return new sh(this.constructPerformerParams()).executeTap({command:e});case "TYPE":return await new Tx(this.constructPerformerParams()).doType(e);case "AI_CHECK":{let r=this.shouldUseMemoryForCommand(e),i=e.contextChoice==="VISION_ONLY",a=15,s=e.timeoutSecs?e.timeoutSecs*1e3:5e3,l=GC(s),c=Date.now(),u=0,d,m=false,p;for(;u<a&&!m;){this.throwIfAborted(),m||d&&d-c>=s&&(m=true),u!==0&&await Te(l,this.abortSignal),d=Date.now();try{let f="",h="";await n.startAsyncSpan("EMULATOR_READ_STATE",async()=>{i||(f=await this.getEmulatorDomState()),h=await this.getScreenshotBase64();},{name:"Get emulator state"});let g=await n.startAsyncSpan("AI_ASSERTION_CALL",async b=>{let y=await this.generator.evaluateAndroidAssertion({assertion:e.assertion,screenXml:f,screenshot:h,contextChoice:e.contextChoice,memory:r?e.cache?.memory:void 0},{logger:this.logger,loggerTags:$e(this.logger),agentConfigVersion:this.aiSettings.agentConfig?.["android-assertion"],useMemory:r});return b.result={thoughts:y.thoughts,result:y.result},y});if(r&&g.updatedMemory){let b={type:"GCS_TRACES",traces:g.updatedMemory};e.cache={...e.cache??{},memory:b};}if(g.result)return {success:g.result,message:g.thoughts};{let b=`AssertionFailureError: ${g.thoughts}`;p=new Error(b);}}catch(f){this.throwIfAborted(),this.logger.info({err:f},`AI check assert attempt ${u} failed, retrying...`),p=f instanceof Error?f:new Error(`${f}`);}finally{u++;}}return {success:false,message:p?.message}}case "AI_EXTRACT":return une({command:e,logger:this.logger,generator:this.generator,aiSettings:this.aiSettings,getEmulatorDomState:()=>this.getEmulatorDomState(),getScreenshotBase64:()=>this.getScreenshotBase64(),abortSignal:this.abortSignal});case "SWIPE":return new lh(this.constructPerformerParams()).executeSwipe(e);case "SCREEN_CHECK":return new xx(this.constructPerformerParams()).executeScreenCheck(e);case "ELEMENT_CHECK":return await new Rx(this.constructPerformerParams()).executeElementCheck(e);case "DRAG_AND_DROP":return await new Cx(this.constructPerformerParams()).executeDragAndDrop({command:e});case "SCROLL_TO":{let r=new Ex(this.constructPerformerParams());return await this.waitForPageSourceStability({reason:"Waiting for stability before scrolling to ensure correct momentum"}),r.executeScrollTo(e)}case "JAVASCRIPT":{let r;try{r=await fa({orgId:this.orgId,code:e.code,fragment:!1,context:this.fixtures.testContext,timeoutMs:e.timeout?e.timeout*1e3:void 0,logger:this.logger,localTools:this.fixtures.localCodeEvalTools,signal:this.abortSignal});}catch(i){throw new O("ActionFailureError",i instanceof O?i.message:`${i}`,{errOptions:{cause:i}})}try{JSON.stringify(r);}catch(i){throw new O("UserConfigurationError",`Return value is not serializable: ${i instanceof Error?i.message:`${i}`}`)}return {success:true,output:r}}case "REQUEST":{let r;try{r=new URL(e.url).hostname;}catch(u){throw new O("UserConfigurationError",`Invalid URL: ${u instanceof Error?u.message:`${u}`}`)}let i=new CookieJar,a=lLe(fetch,i),s=Date.now(),l=await _f({command:e,baseUrl:void 0,logger:this.logger,fetchImplementation:a}),c=Gm(i,r);return {output:Du.parse({...l,cookies:c}),success:true,message:`Successfully executed request in ${Date.now()-s}ms`}}case "OPEN_NOTIFICATION_DRAWER":return await new Eu(this.constructPerformerParams()).doPress({keycode:83}),{success:true};case "OPEN_APP":{let r=e.activityName,i=["-a","android.intent.action.MAIN","-c","android.intent.category.LAUNCHER"];if(!r){let s=["resolve-activity","--brief",...i,e.packageName],l=await re(this.driver.executeInNativeContext(this.logger,c=>c.execute("mobile: shell",{command:"pm",args:s}),{operationName:"resolveMainActivity"}),{signal:this.abortSignal,milliseconds:1e4});if(typeof l!="string")throw new O("UserConfigurationError",`Could not find main activity name for package ${e.packageName}. Unexpected output: ${l}`);if(l.includes("No activity found"))throw await this.isPackageInstalled(e.packageName)?new O("UserConfigurationError",`App ${e.packageName} is installed but has no launchable MAIN/LAUNCHER activity. Set an explicit "activityName" on the Open App step.`):new O("UserConfigurationError",`App ${e.packageName} isn't installed on the device. Add an "Install App" step (or configure an APK to install) before opening it, or install the app manually, then re-run.`);if(r=l.trim().split(`
5891
- `).pop()?.replace(/^.*\//,""),!r)throw new O("UserConfigurationError",`Could not parse main activity name for package ${e.packageName}. Raw output: ${l}`)}if(this.options?.emulator?.autoGrantPermissions&&!this.appsWithGrantedPermissions.has(e.packageName)){let s={permissions:"all",appPackage:e.packageName,action:"grant"};await this.driver.executeInNativeContext(this.logger,l=>l.executeScript("mobile: changePermissions",[s]),{operationName:"changePermissions"}),this.appsWithGrantedPermissions.add(e.packageName);}let a=["start",...i,"-f","0x10200000"];if(e.intentExtras)try{let s=JSON.parse(e.intentExtras);for(let[l,c]of Object.entries(s))a.push("-e",l,typeof c=="string"?c:JSON.stringify(c));}catch(s){throw new O("UserConfigurationError",`Invalid intent extras does not parse as valid JSON: ${s instanceof Error?s.message:`${s}`}`)}return a.push("-n",`${e.packageName}/${r}`),await this.driver.executeInNativeContext(this.logger,s=>s.execute("mobile: shell",{command:"am",args:a}),{operationName:"startApp"}),await this.stateManager.waitForPageSourceStability({timeoutMs:3e3,signal:this.abortSignal,reason:"Waiting for stability after app launch"}),this.stateManager.refreshWebviewsManually("new app launch"),{success:true}}case "PRESS":{let r=new Eu(this.constructPerformerParams());switch(e.key){case "HOME":await r.doPress({keycode:3});break;case "BACK":await r.doPress({keycode:4});break;case "APP_SWITCHER":await r.doPress({keycode:187});break;case "POWER":await r.doPress({keycode:26});break;case "SEARCH":await r.doPress({keycode:84});break;case "VOLUME_UP":await r.doPress({keycode:24});break;case "VOLUME_DOWN":await r.doPress({keycode:25});break;case "VOLUME_MUTE":await r.doPress({keycode:164});break}return {success:true}}case "PRESS_KEYBOARD":{let r=new Eu(this.constructPerformerParams()),i=a=>r.doPress({keycode:a,repeat:e.repeat,keyPressDelayMs:e.keyPressDelayMs});switch(e.key){case "CLOSE_KEYBOARD":{let a=Date.now();for(;Date.now()-a<2e3&&(await this.driver.executeInNativeContext(this.logger,l=>l.hideKeyboard(),{operationName:"hideKeyboard"}),!!await this.driver.executeInNativeContext(this.logger,l=>l.isKeyboardShown(),{operationName:"isKeyboardShown"})););break}case "ENTER":await i(66);break;case "BACKSPACE":await i(67);break;}return {success:true}}case "WAIT":return await Te(e.timeoutSecs*1e3,this.aborter.controller?.signal),{success:true};case "VISUAL_DIFF":return new Px(this.constructPerformerParams()).executeVisualDiff({command:e,updateGoldenFiles:o});case "INSTALL_APP":return new vx(this.constructPerformerParams()).doInstallApk(e);case "UNINSTALL_APP":return new Mx(this.constructPerformerParams()).doUninstallApk(e);case "ADD_FILE":{let r=await Qw(e.file);return await this.driver.executeInNativeContext(this.logger,async i=>{await i.pushFile(e.storageLocation,r),await i.execute("mobile: shell",{command:"am",args:["broadcast","-a","android.intent.action.MEDIA_SCANNER_SCAN_FILE","-d",`file://${e.storageLocation}`]});},{operationName:"addFile",attemptTimeoutMs:12e4}),{success:true}}case "TOGGLE_SETTINGS":return await this.driver.executeInNativeContext(this.logger,async r=>{switch(e.settingsType){case "AIRPLANE_MODE":await r.appiumToggleAirplaneMode();break;case "DATA":await r.appiumToggleData();break;case "WIFI":await r.appiumToggleWiFi();break;case "LOCATION":await r.appiumToggleLocationServices();break;default:throw e.settingsType,new O("UserConfigurationError",`Unknown settings type: ${e.settingsType}`)}},{operationName:"toggleSettings"}),{success:true};case "ROTATE_ORIENTATION":return await this.driver.executeInNativeContext(this.logger,async r=>{await r.execute("mobile: shell",{command:"settings",args:["put","system","accelerometer_rotation","0"]}),await r.execute("mobile: shell",{command:"settings",args:["put","system","user_rotation",e.orientation==="LANDSCAPE"?"1":"0"]});},{operationName:"rotateOrientation"}),{success:true,output:{newViewportBounds:await this.getViewportBounds()}};case "ADB_COMMAND":{let r;try{r=JSON.parse(e.jsonArgs??"[]");}catch(s){throw new O("UserConfigurationError",`Invalid JSON for ADB command arguments: ${s instanceof Error?s.message:`${s}`}`)}let i=w__default.string().array().safeParse(r);if(!i.success)throw new O("UserConfigurationError",`Invalid ADB command arguments: ${i.error.message}`);let a=await this.executeRawADBCommandWithArgs([e.command,...i.data]);return this.logger.info({output:a},"ADB command executed successfully"),{success:true,output:a,message:"ADB command executed successfully"}}case "APPIUM_EXECUTE":{let r=JSON.parse(e.jsonArgs??"{}"),i=await this.driver.executeInNativeContext(this.logger,async a=>a.execute(e.command,r),{attemptTimeoutMs:6e4,maxAttempts:1,operationName:"userAppiumExecuteOperation"});return this.logger.info({output:i},"Appium command executed successfully"),{success:true,output:i,message:"Appium command executed successfully"}}case "KILL_APP":{let r=await this.stateManager.getCurrentPackage();if(!r)throw new O("UserConfigurationError","No package is currently active");await this.driver.executeInNativeContext(this.logger,async i=>{await i.execute("mobile: shell",{command:"input",args:["keyevent","KEYCODE_HOME"]}),await i.terminateApp(r);},{operationName:"killApp"});try{await vY({packageName:r,driver:this.driver,abortSignal:this.abortSignal,logger:this.logger});}catch(i){this.throwIfAborted(),this.logger.warn({err:i,packageName:r},"Failed to remove package from recents, continuing...");}return {success:true}}case "STATE":{await this.stateManager.refreshWebviewsManually("debug cmd");let r=await this.stateManager.getDomState(),i=await this.stateManager.getContexts(),a={xml:r.graph.xml,contexts:i};return this.logger.info({result:a},"State debug command output"),{output:a,success:true}}default:{return {success:true}}}}async initializeSettings(){let{latitude:e,longitude:o}=this.options?.emulator?.geolocation??Am;await this.driver.executeInNativeContext(this.logger,n=>n.execute("mobile: setGeolocation",{latitude:e,longitude:o}),{operationName:"setGeolocation"}),await Promise.all([this.driver.executeInNativeContext(this.logger,n=>n.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_COARSE_LOCATION"]}),{operationName:"grantCoarseLocationPermission"}),this.driver.executeInNativeContext(this.logger,n=>n.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_FINE_LOCATION"]}),{operationName:"grantFineLocationPermission"}),this.driver.executeInNativeContext(this.logger,n=>n.updateSettings({keyInjectionDelay:om}),{operationName:"initializeKeyInjectionDelay"})]);}async getScreenshotBase64(){return this.stateManager.getRawScreenshotBase64()}async getScreenshotPngString(){return this.stateManager.getCurrentScreenshotPngString()}async getEmulatorDomState(){return (await this.stateManager.getDomState({})).graph.xml}async executeRawADBCommandWithArgs(e){return this.stateManager.executeRawADBCommandWithArgs(e)}async executeRawADBCommand(e){return this.stateManager.executeRawADBCommand(e)}async softReset(){await wY(this,this.logger),this.fixtures.testContext.resetToInitial();}async getViewportBounds(){return this.stateManager.getViewportBounds()}async waitForScreenshotStability(e){return this.stateManager.waitForScreenshotStability({timeoutMs:e.timeoutMs??3e3,reason:e.reason,signal:this.aborter.controller?.signal})}async getMobileFailureRecoveryPlan(e){return this.generator.getAndroidFailureRecoveryPlan(e,{disableCache:true,abortSignal:this.abortSignal,loggerTags:$e(this.logger)})}async waitForPageSourceStability(e){await this.stateManager.waitForPageSourceStability({timeoutMs:e.timeoutMs??3e3,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(){await this.stateManager.cleanupWebviews();}get abortSignal(){return this.aborter.controller?.signal}get context(){return this.fixtures.testContext}get localCodeEvalTools(){return this.fixtures.localCodeEvalTools}};var v2e=new IC(30,60*1e3),KF="https://api.momentic.ai",dh,bne,mh=t=>{KF=t;},jS=()=>KF;var Lx=t=>{bne=t;},ol=()=>bne,ao=()=>dh,yne=()=>{if(!dh)throw new Error("Global API client has not been initialized.");return dh};var VS,qF,Sne,Tne,Ene,Ox,vne,Cne=({authInfo:t,apiKey:e,apiClient:o})=>{dh=o,VS=t.orgId,qF=t.userId,Sne=t.email,Tne=t.name,Ene=t.pylonEmailHash,Ox=e,vne=t.selfServe;},YF=async({apiClient:t,apiKey:e,skipPrompts:o})=>{let n=await by({client:t});return Cne({authInfo:n,apiKey:e,apiClient:t}),n},wne=async({apiKey:t,mode:e,runner:o})=>{if(dh&&VS&&Ox)return VS;let n=new on({baseUrl:KF,apiKey:t,logger:N,mode:e,runner:o});dh=n;try{let r=await n.getAuthInfo();return Cne({authInfo:r,apiKey:t,apiClient:n}),r.orgId}catch(r){throw new Error(`Error checking API key against server: ${r}`,{cause:r})}},xn=()=>{if(!VS)throw new Error("Your organization ID is invalid.");return VS},nm=()=>{if(!qF)throw new Error("Your user ID is invalid.");return qF};var kx=()=>Sne,Ane=()=>Tne,Rne=()=>Ene,Fx=()=>vne,xne=()=>{if(!Ox)throw new Error("Your API key is invalid.");return Ox},Dx,Nx,Cu=()=>{Nx?.abort(),Nx=void 0;},Bx=(t,e)=>{Dx=t,Cu(),Nx=new AbortController;let o=Nx.signal,n=[t.configFilePath];t.config.environments?.forEach(r=>{if(!r.envFile)return;let i=Oo__default.resolve(t.rootDir,r.envFile);try{if(Bn__default.lstatSync(i).isSymbolicLink())return;Bn__default.existsSync(i)&&n.push(i);}catch(a){N.warn({err:a},`Failed to check if env file ${i} exists`);}});try{C2e({filesToWatch:n,revalidator:e,signal:o,project:t});}catch(r){N.error({err:r},"Failed to start config file watchers");}};var vt=()=>{if(!Dx)throw new Ye("No Momentic project is currently loaded. Open or select a project before invoking this action.");return Dx};function C2e({filesToWatch:t,revalidator:e,signal:o,project:n}){N.debug("Starting watch on the following files:"),t.forEach(r=>{N.debug(`- ${r}`);}),t.forEach(r=>{let i=async(s,l)=>{if(s.mtime.getTime()!==l.mtime.getTime()){v2e.increment("setLocalProject")&&N.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.`);try{Dx=await Promise.resolve(e(n.configFilePath));}catch(c){N.warn({err:c},`Failed to reload Momentic configuration after a change to ${r}; continuing with the previously loaded configuration`);}}};Bn__default.watchFile(r,{persistent:false},i);let a=()=>{Bn__default.unwatchFile(r,i),o.removeEventListener("abort",a);};o.addEventListener("abort",a);});}function Xe(t){return function(...e){let o=e[e.length-1],n=t(...e);Promise.resolve(n).catch(o);}}var A2e="1.4.5",rm=yp({app:"desktop-server",hostname:hostname(),disableConsoleLogs:true}).child({cliVersion:A2e});(async()=>{try{let t=await sy(rm);t.gitBranchName&&rm.addBinding("branch",t.gitBranchName);}catch{}})();var Mne=Router();Mne.get("/",async(t,e)=>{let o=vt(),n=ao();if(!n){e.status(500).json({message:"API client not initialized"});return}let r=await Lo(rm,n,o),i=r?.gitProtectedBranches&&r?.gitBranchName&&r.gitProtectedBranches.includes(r.gitBranchName),{noCache:a,alwaysSaveCache:s}=ol(),l=!a&&(s||!i);e.status(200).json({saveCaches:l,checkedOutBranch:r?.gitBranchName});});var XF=Mne;var M2e=5e3,P2e=[".js",".mjs",".cjs",".ts"];function JF(t={}){let e=Router();function o(){let d=vt();return Oo__default.dirname(d.configFilePath)}function n(d){return Oo__default.join(o(),...d)}function r(d){let m=Oo__default.relative(o(),d);return m?m.split(Oo__default.sep):[]}function i(d,m){let p=Bn__default.statSync(d),f=r(d);return f_.parse({name:m,absolutePath:d,relativePath:f.join(Oo__default.sep),pathSegments:f,isDirectory:p.isDirectory(),size:p.size,createdAt:p.birthtime,modifiedAt:p.mtime,accessedAt:p.atime})}function a(d){let m=Oo__default.relative(o(),d);return m===""||!m.startsWith("..")&&!Oo__default.isAbsolute(m)}async function s(d){let m=vt();return yd(["*"],{cwd:d,ignore:m.config.exclude??[],maxDepth:1,nodir:false,signal:AbortSignal.timeout(M2e)})}function l(d){let m=d.trimStart().replace(/^file:\/\//,"").replaceAll("\\","/"),p=m.lastIndexOf("/");return p===-1?{directoryText:"",filePrefix:m}:{directoryText:m.slice(0,p+1),filePrefix:m.slice(p+1)}}function c(d){return d.replaceAll("\\","/").split("/").filter(m=>m&&m!==".")}function u({sourceDirectoryPath:d,targetPath:m,isDirectory:p}){let f=Oo__default.relative(d,m).split(Oo__default.sep).join("/");return p?f?`${f}/`:"./":f}return e.post("/file-reference-suggestions",Xe(async(d,m,p)=>{let f=fj.safeParse(d.body);if(!f.success){m.status(400).json({error:`Failed to parse file-reference-suggestions body: ${f.error.message}`});return}let{sourceDirectoryPath:h="",value:g}=f.data,b=new Set((f.data.allowedExtensions??P2e).map(A=>A.toLowerCase())),y=l(g);if(y.directoryText.startsWith("/")){m.status(200).json({suggestions:[]});return}let T=Oo__default.resolve(o(),...c(h)),v=Oo__default.resolve(T,...c(y.directoryText));if(!a(T)||!a(v)){m.status(200).json({suggestions:[]});return}if(!Bn__default.existsSync(v)||!Bn__default.statSync(v).isDirectory()){m.status(200).json({suggestions:[]});return}let E;try{E=await s(v);}catch(A){if(A instanceof Error&&A.name==="TimeoutError"){m.status(408).json({error:"Folder listing timed out. This directory may contain too many files."});return}throw A}let P=E.map(A=>{let k=Oo__default.join(v,A);return {entryName:A,targetPath:k,isDirectory:Bn__default.statSync(k).isDirectory()}}),M=y.filePrefix.toLowerCase(),I=P.filter(A=>A.entryName.startsWith(".")||!A.entryName.toLowerCase().startsWith(M)?false:A.isDirectory?true:b.has(Oo__default.extname(A.entryName).toLowerCase())).sort((A,k)=>A.isDirectory!==k.isDirectory?A.isDirectory?-1:1:A.entryName.localeCompare(k.entryName)).map(A=>({name:A.entryName,isDirectory:A.isDirectory,value:u({sourceDirectoryPath:T,targetPath:A.targetPath,isDirectory:A.isDirectory})}));m.status(200).json({suggestions:I});})),e.post("/",Xe(async(d,m,p)=>{let f;try{f=pj.parse(d.body).pathSegments;}catch(v){m.status(400).json({error:`Failed to parse folder read body: ${v}`});return}let h=n(f);if(!Bn__default.existsSync(h)){m.status(404).json({error:`Path not found: ${f.join(Oo__default.sep)}`});return}if(!Bn__default.statSync(h).isDirectory()){m.status(400).json({error:`Path is not a directory: ${f.join(Oo__default.sep)}`});return}let b;try{b=await s(h);}catch(v){if(v instanceof Error&&v.name==="TimeoutError"){m.status(408).json({error:"Folder listing timed out. This directory may contain too many files."});return}throw v}let y=b.map(v=>{let E=Oo__default.join(h,v);return i(E,v)});if(t.allowedFileTypes){let v=new Set(t.allowedFileTypes);y=(await Promise.all(y.map(async E=>{if(E.isDirectory||!(E.name.endsWith(".test.yaml")||E.name.endsWith(".module.yaml")))return E;let M=await I2e(E.absolutePath);return M!==void 0&&v.has(M)?E:null}))).filter(E=>E!==null);}let T={absolutePath:h,pathSegments:f,contents:y};m.status(200).json(T);})),e.put("/",Xe(async(d,m,p)=>{let f;try{f=hj.parse(d.body).pathSegments;}catch(b){m.status(400).json({error:`Failed to parse folder create body: ${b}`});return}let h=n(f);if(Bn__default.existsSync(h)){m.status(200).json({success:true,message:`Folder already exists: ${f.join(Oo__default.sep)}`,pathSegments:f});return}Bn__default.mkdirSync(h,{recursive:true});let g={success:true,message:`Folder created: ${f.join(Oo__default.sep)}`,pathSegments:f};m.status(201).json(g);})),e.patch("/",Xe(async(d,m,p)=>{let f,h;try{let v=gj.parse(d.body);f=v.pathSegments,h=v.newPathSegments;}catch(v){m.status(400).json({error:`Failed to parse folder update body: ${v}`});return}let g=n(f),b=n(h);if(!Bn__default.existsSync(g)){m.status(400).json({error:`Folder not found: ${f.join(Oo__default.sep)}`});return}if(Bn__default.existsSync(b)){m.status(400).json({error:`Destination already exists: ${h.join(Oo__default.sep)}`});return}let y=Oo__default.dirname(b);Bn__default.existsSync(y)||Bn__default.mkdirSync(y,{recursive:true}),Bn__default.renameSync(g,b);let T={success:true,message:`Folder moved from ${f.join(Oo__default.sep)} to ${h.join(Oo__default.sep)}`,pathSegments:h};m.status(200).json(T);})),e.delete("/",Xe(async(d,m,p)=>{let f,h=true;try{let T=bj.parse(d.body);f=T.pathSegments,h=T.recursive??!0;}catch(T){m.status(400).json({error:`Failed to parse folder delete body: ${T}`});return}let g=n(f);if(!Bn__default.existsSync(g)){m.status(200).json({success:true,message:`Folder not found: ${f.join(Oo__default.sep)}`,pathSegments:f});return}if(!Bn__default.statSync(g).isDirectory()){m.status(400).json({error:`Path is not a directory: ${f.join(Oo__default.sep)}`});return}try{if(h)Bn__default.rmSync(g,{recursive:!0,force:!0});else {if(Bn__default.readdirSync(g).length>0){m.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${f.join("/")}`});return}Bn__default.rmdirSync(g);}}catch(T){let{status:v,body:E}=W8(T,`delete folder ${f.join("/")}`);m.status(v).json(E);return}let y={success:true,message:`Folder deleted: ${f.join("/")}`,pathSegments:f};m.status(200).json(y);})),e}async function I2e(t){try{let e=await Bn__default.promises.open(t,"r");try{let o=Buffer.alloc(4096),{bytesRead:n}=await e.read(o,0,o.length,0);return o.toString("utf-8",0,n).match(/^fileType:\s*(.+)$/m)?.[1]?.trim()}finally{await e.close();}}catch{}}var Pne=Router();Pne.get("/",async(t,e)=>{let o=vt(),n=ao();if(!n){e.status(500).json({message:"API client not initialized"});return}let r=await Lo(rm,n,o);e.status(200).json(r);});var ZF=Pne;var Ux=class t extends Xc{static async init(e){let o=await Xc.connectAppium(e);return new t(o)}async executeWebViewScript(e,o,n,...r){let i=await this.executeInContext(e,o,async a=>{let s=new Function("...args",`${My.safariUtilsLibJs};
5891
+ `).pop()?.replace(/^.*\//,""),!r)throw new O("UserConfigurationError",`Could not parse main activity name for package ${e.packageName}. Raw output: ${l}`)}if(this.options?.emulator?.autoGrantPermissions&&!this.appsWithGrantedPermissions.has(e.packageName)){let s={permissions:"all",appPackage:e.packageName,action:"grant"};await this.driver.executeInNativeContext(this.logger,l=>l.executeScript("mobile: changePermissions",[s]),{operationName:"changePermissions"}),this.appsWithGrantedPermissions.add(e.packageName);}let a=["start",...i,"-f","0x10200000"];if(e.intentExtras)try{let s=JSON.parse(e.intentExtras);for(let[l,c]of Object.entries(s))a.push("-e",l,typeof c=="string"?c:JSON.stringify(c));}catch(s){throw new O("UserConfigurationError",`Invalid intent extras does not parse as valid JSON: ${s instanceof Error?s.message:`${s}`}`)}return a.push("-n",`${e.packageName}/${r}`),await this.driver.executeInNativeContext(this.logger,s=>s.execute("mobile: shell",{command:"am",args:a}),{operationName:"startApp"}),await this.stateManager.waitForPageSourceStability({timeoutMs:3e3,signal:this.abortSignal,reason:"Waiting for stability after app launch"}),this.stateManager.refreshWebviewsManually("new app launch"),{success:true}}case "PRESS":{let r=new Eu(this.constructPerformerParams());switch(e.key){case "HOME":await r.doPress({keycode:3});break;case "BACK":await r.doPress({keycode:4});break;case "APP_SWITCHER":await r.doPress({keycode:187});break;case "POWER":await r.doPress({keycode:26});break;case "SEARCH":await r.doPress({keycode:84});break;case "VOLUME_UP":await r.doPress({keycode:24});break;case "VOLUME_DOWN":await r.doPress({keycode:25});break;case "VOLUME_MUTE":await r.doPress({keycode:164});break}return {success:true}}case "PRESS_KEYBOARD":{let r=new Eu(this.constructPerformerParams()),i=a=>r.doPress({keycode:a,repeat:e.repeat,keyPressDelayMs:e.keyPressDelayMs});switch(e.key){case "CLOSE_KEYBOARD":{let a=Date.now();for(;Date.now()-a<2e3&&(await this.driver.executeInNativeContext(this.logger,l=>l.hideKeyboard(),{operationName:"hideKeyboard"}),!!await this.driver.executeInNativeContext(this.logger,l=>l.isKeyboardShown(),{operationName:"isKeyboardShown"})););break}case "ENTER":await i(66);break;case "BACKSPACE":await i(67);break;}return {success:true}}case "WAIT":return await Te(e.timeoutSecs*1e3,this.aborter.controller?.signal),{success:true};case "VISUAL_DIFF":return new Px(this.constructPerformerParams()).executeVisualDiff({command:e,updateGoldenFiles:o});case "INSTALL_APP":return new vx(this.constructPerformerParams()).doInstallApk(e);case "UNINSTALL_APP":return new Mx(this.constructPerformerParams()).doUninstallApk(e);case "ADD_FILE":{let r=await Qw(e.file);return await this.driver.executeInNativeContext(this.logger,async i=>{await i.pushFile(e.storageLocation,r),await i.execute("mobile: shell",{command:"am",args:["broadcast","-a","android.intent.action.MEDIA_SCANNER_SCAN_FILE","-d",`file://${e.storageLocation}`]});},{operationName:"addFile",attemptTimeoutMs:12e4}),{success:true}}case "TOGGLE_SETTINGS":return await this.driver.executeInNativeContext(this.logger,async r=>{switch(e.settingsType){case "AIRPLANE_MODE":await r.appiumToggleAirplaneMode();break;case "DATA":await r.appiumToggleData();break;case "WIFI":await r.appiumToggleWiFi();break;case "LOCATION":await r.appiumToggleLocationServices();break;default:throw e.settingsType,new O("UserConfigurationError",`Unknown settings type: ${e.settingsType}`)}},{operationName:"toggleSettings"}),{success:true};case "ROTATE_ORIENTATION":return await this.driver.executeInNativeContext(this.logger,async r=>{await r.execute("mobile: shell",{command:"settings",args:["put","system","accelerometer_rotation","0"]}),await r.execute("mobile: shell",{command:"settings",args:["put","system","user_rotation",e.orientation==="LANDSCAPE"?"1":"0"]});},{operationName:"rotateOrientation"}),{success:true,output:{newViewportBounds:await this.getViewportBounds()}};case "ADB_COMMAND":{let r;try{r=JSON.parse(e.jsonArgs??"[]");}catch(s){throw new O("UserConfigurationError",`Invalid JSON for ADB command arguments: ${s instanceof Error?s.message:`${s}`}`)}let i=w__default.string().array().safeParse(r);if(!i.success)throw new O("UserConfigurationError",`Invalid ADB command arguments: ${i.error.message}`);let a=await this.executeRawADBCommandWithArgs([e.command,...i.data]);return this.logger.info({output:a},"ADB command executed successfully"),{success:true,output:a,message:"ADB command executed successfully"}}case "APPIUM_EXECUTE":{let r=JSON.parse(e.jsonArgs??"{}"),i=await this.driver.executeInNativeContext(this.logger,async a=>a.execute(e.command,r),{attemptTimeoutMs:6e4,maxAttempts:1,operationName:"userAppiumExecuteOperation"});return this.logger.info({output:i},"Appium command executed successfully"),{success:true,output:i,message:"Appium command executed successfully"}}case "KILL_APP":{let r=await this.stateManager.getCurrentPackage();if(!r)throw new O("UserConfigurationError","No package is currently active");await this.driver.executeInNativeContext(this.logger,async i=>{await i.execute("mobile: shell",{command:"input",args:["keyevent","KEYCODE_HOME"]}),await i.terminateApp(r);},{operationName:"killApp"});try{await vY({packageName:r,driver:this.driver,abortSignal:this.abortSignal,logger:this.logger});}catch(i){this.throwIfAborted(),this.logger.warn({err:i,packageName:r},"Failed to remove package from recents, continuing...");}return {success:true}}case "STATE":{await this.stateManager.refreshWebviewsManually("debug cmd");let r=await this.stateManager.getDomState(),i=await this.stateManager.getContexts(),a={xml:r.graph.xml,contexts:i};return this.logger.info({result:a},"State debug command output"),{output:a,success:true}}default:{return {success:true}}}}async initializeSettings(){let{latitude:e,longitude:o}=this.options?.emulator?.geolocation??Am;await this.driver.executeInNativeContext(this.logger,n=>n.execute("mobile: setGeolocation",{latitude:e,longitude:o}),{operationName:"setGeolocation"}),await Promise.all([this.driver.executeInNativeContext(this.logger,n=>n.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_COARSE_LOCATION"]}),{operationName:"grantCoarseLocationPermission"}),this.driver.executeInNativeContext(this.logger,n=>n.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_FINE_LOCATION"]}),{operationName:"grantFineLocationPermission"}),this.driver.executeInNativeContext(this.logger,n=>n.updateSettings({keyInjectionDelay:om}),{operationName:"initializeKeyInjectionDelay"})]);}async getScreenshotBase64(){return this.stateManager.getRawScreenshotBase64()}async getScreenshotPngString(){return this.stateManager.getCurrentScreenshotPngString()}async getEmulatorDomState(){return (await this.stateManager.getDomState({})).graph.xml}async executeRawADBCommandWithArgs(e){return this.stateManager.executeRawADBCommandWithArgs(e)}async executeRawADBCommand(e){return this.stateManager.executeRawADBCommand(e)}async softReset(){await wY(this,this.logger),this.fixtures.testContext.resetToInitial();}async getViewportBounds(){return this.stateManager.getViewportBounds()}async waitForScreenshotStability(e){return this.stateManager.waitForScreenshotStability({timeoutMs:e.timeoutMs??3e3,reason:e.reason,signal:this.aborter.controller?.signal})}async getMobileFailureRecoveryPlan(e){return this.generator.getAndroidFailureRecoveryPlan(e,{disableCache:true,abortSignal:this.abortSignal,loggerTags:$e(this.logger)})}async waitForPageSourceStability(e){await this.stateManager.waitForPageSourceStability({timeoutMs:e.timeoutMs??3e3,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(){await this.stateManager.cleanupWebviews();}get abortSignal(){return this.aborter.controller?.signal}get context(){return this.fixtures.testContext}get localCodeEvalTools(){return this.fixtures.localCodeEvalTools}};var v2e=new IC(30,60*1e3),KF="https://api.momentic.ai",dh,bne,mh=t=>{KF=t;},jS=()=>KF;var Lx=t=>{bne=t;},ol=()=>bne,ao=()=>dh,yne=()=>{if(!dh)throw new Error("Global API client has not been initialized.");return dh};var VS,qF,Sne,Tne,Ene,Ox,vne,Cne=({authInfo:t,apiKey:e,apiClient:o})=>{dh=o,VS=t.orgId,qF=t.userId,Sne=t.email,Tne=t.name,Ene=t.pylonEmailHash,Ox=e,vne=t.selfServe;},YF=async({apiClient:t,apiKey:e,skipPrompts:o})=>{let n=await by({client:t});return Cne({authInfo:n,apiKey:e,apiClient:t}),n},wne=async({apiKey:t,mode:e,runner:o})=>{if(dh&&VS&&Ox)return VS;let n=new on({baseUrl:KF,apiKey:t,logger:N,mode:e,runner:o});dh=n;try{let r=await n.getAuthInfo();return Cne({authInfo:r,apiKey:t,apiClient:n}),r.orgId}catch(r){throw new Error(`Error checking API key against server: ${r}`,{cause:r})}},xn=()=>{if(!VS)throw new Error("Your organization ID is invalid.");return VS},nm=()=>{if(!qF)throw new Error("Your user ID is invalid.");return qF};var kx=()=>Sne,Ane=()=>Tne,Rne=()=>Ene,Fx=()=>vne,xne=()=>{if(!Ox)throw new Error("Your API key is invalid.");return Ox},Dx,Nx,Cu=()=>{Nx?.abort(),Nx=void 0;},Bx=(t,e)=>{Dx=t,Cu(),Nx=new AbortController;let o=Nx.signal,n=[t.configFilePath];t.config.environments?.forEach(r=>{if(!r.envFile)return;let i=Oo__default.resolve(t.rootDir,r.envFile);try{if(Bn__default.lstatSync(i).isSymbolicLink())return;Bn__default.existsSync(i)&&n.push(i);}catch(a){N.warn({err:a},`Failed to check if env file ${i} exists`);}});try{C2e({filesToWatch:n,revalidator:e,signal:o,project:t});}catch(r){N.error({err:r},"Failed to start config file watchers");}};var vt=()=>{if(!Dx)throw new Ye("No Momentic project is currently loaded. Open or select a project before invoking this action.");return Dx};function C2e({filesToWatch:t,revalidator:e,signal:o,project:n}){N.debug("Starting watch on the following files:"),t.forEach(r=>{N.debug(`- ${r}`);}),t.forEach(r=>{let i=async(s,l)=>{if(s.mtime.getTime()!==l.mtime.getTime()){v2e.increment("setLocalProject")&&N.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.`);try{Dx=await Promise.resolve(e(n.configFilePath));}catch(c){N.warn({err:c},`Failed to reload Momentic configuration after a change to ${r}; continuing with the previously loaded configuration`);}}};Bn__default.watchFile(r,{persistent:false},i);let a=()=>{Bn__default.unwatchFile(r,i),o.removeEventListener("abort",a);};o.addEventListener("abort",a);});}function Xe(t){return function(...e){let o=e[e.length-1],n=t(...e);Promise.resolve(n).catch(o);}}var A2e="1.4.6",rm=yp({app:"desktop-server",hostname:hostname(),disableConsoleLogs:true}).child({cliVersion:A2e});(async()=>{try{let t=await sy(rm);t.gitBranchName&&rm.addBinding("branch",t.gitBranchName);}catch{}})();var Mne=Router();Mne.get("/",async(t,e)=>{let o=vt(),n=ao();if(!n){e.status(500).json({message:"API client not initialized"});return}let r=await Lo(rm,n,o),i=r?.gitProtectedBranches&&r?.gitBranchName&&r.gitProtectedBranches.includes(r.gitBranchName),{noCache:a,alwaysSaveCache:s}=ol(),l=!a&&(s||!i);e.status(200).json({saveCaches:l,checkedOutBranch:r?.gitBranchName});});var XF=Mne;var M2e=5e3,P2e=[".js",".mjs",".cjs",".ts"];function JF(t={}){let e=Router();function o(){let d=vt();return Oo__default.dirname(d.configFilePath)}function n(d){return Oo__default.join(o(),...d)}function r(d){let m=Oo__default.relative(o(),d);return m?m.split(Oo__default.sep):[]}function i(d,m){let p=Bn__default.statSync(d),f=r(d);return f_.parse({name:m,absolutePath:d,relativePath:f.join(Oo__default.sep),pathSegments:f,isDirectory:p.isDirectory(),size:p.size,createdAt:p.birthtime,modifiedAt:p.mtime,accessedAt:p.atime})}function a(d){let m=Oo__default.relative(o(),d);return m===""||!m.startsWith("..")&&!Oo__default.isAbsolute(m)}async function s(d){let m=vt();return yd(["*"],{cwd:d,ignore:m.config.exclude??[],maxDepth:1,nodir:false,signal:AbortSignal.timeout(M2e)})}function l(d){let m=d.trimStart().replace(/^file:\/\//,"").replaceAll("\\","/"),p=m.lastIndexOf("/");return p===-1?{directoryText:"",filePrefix:m}:{directoryText:m.slice(0,p+1),filePrefix:m.slice(p+1)}}function c(d){return d.replaceAll("\\","/").split("/").filter(m=>m&&m!==".")}function u({sourceDirectoryPath:d,targetPath:m,isDirectory:p}){let f=Oo__default.relative(d,m).split(Oo__default.sep).join("/");return p?f?`${f}/`:"./":f}return e.post("/file-reference-suggestions",Xe(async(d,m,p)=>{let f=fj.safeParse(d.body);if(!f.success){m.status(400).json({error:`Failed to parse file-reference-suggestions body: ${f.error.message}`});return}let{sourceDirectoryPath:h="",value:g}=f.data,b=new Set((f.data.allowedExtensions??P2e).map(A=>A.toLowerCase())),y=l(g);if(y.directoryText.startsWith("/")){m.status(200).json({suggestions:[]});return}let T=Oo__default.resolve(o(),...c(h)),v=Oo__default.resolve(T,...c(y.directoryText));if(!a(T)||!a(v)){m.status(200).json({suggestions:[]});return}if(!Bn__default.existsSync(v)||!Bn__default.statSync(v).isDirectory()){m.status(200).json({suggestions:[]});return}let E;try{E=await s(v);}catch(A){if(A instanceof Error&&A.name==="TimeoutError"){m.status(408).json({error:"Folder listing timed out. This directory may contain too many files."});return}throw A}let P=E.map(A=>{let k=Oo__default.join(v,A);return {entryName:A,targetPath:k,isDirectory:Bn__default.statSync(k).isDirectory()}}),M=y.filePrefix.toLowerCase(),I=P.filter(A=>A.entryName.startsWith(".")||!A.entryName.toLowerCase().startsWith(M)?false:A.isDirectory?true:b.has(Oo__default.extname(A.entryName).toLowerCase())).sort((A,k)=>A.isDirectory!==k.isDirectory?A.isDirectory?-1:1:A.entryName.localeCompare(k.entryName)).map(A=>({name:A.entryName,isDirectory:A.isDirectory,value:u({sourceDirectoryPath:T,targetPath:A.targetPath,isDirectory:A.isDirectory})}));m.status(200).json({suggestions:I});})),e.post("/",Xe(async(d,m,p)=>{let f;try{f=pj.parse(d.body).pathSegments;}catch(v){m.status(400).json({error:`Failed to parse folder read body: ${v}`});return}let h=n(f);if(!Bn__default.existsSync(h)){m.status(404).json({error:`Path not found: ${f.join(Oo__default.sep)}`});return}if(!Bn__default.statSync(h).isDirectory()){m.status(400).json({error:`Path is not a directory: ${f.join(Oo__default.sep)}`});return}let b;try{b=await s(h);}catch(v){if(v instanceof Error&&v.name==="TimeoutError"){m.status(408).json({error:"Folder listing timed out. This directory may contain too many files."});return}throw v}let y=b.map(v=>{let E=Oo__default.join(h,v);return i(E,v)});if(t.allowedFileTypes){let v=new Set(t.allowedFileTypes);y=(await Promise.all(y.map(async E=>{if(E.isDirectory||!(E.name.endsWith(".test.yaml")||E.name.endsWith(".module.yaml")))return E;let M=await I2e(E.absolutePath);return M!==void 0&&v.has(M)?E:null}))).filter(E=>E!==null);}let T={absolutePath:h,pathSegments:f,contents:y};m.status(200).json(T);})),e.put("/",Xe(async(d,m,p)=>{let f;try{f=hj.parse(d.body).pathSegments;}catch(b){m.status(400).json({error:`Failed to parse folder create body: ${b}`});return}let h=n(f);if(Bn__default.existsSync(h)){m.status(200).json({success:true,message:`Folder already exists: ${f.join(Oo__default.sep)}`,pathSegments:f});return}Bn__default.mkdirSync(h,{recursive:true});let g={success:true,message:`Folder created: ${f.join(Oo__default.sep)}`,pathSegments:f};m.status(201).json(g);})),e.patch("/",Xe(async(d,m,p)=>{let f,h;try{let v=gj.parse(d.body);f=v.pathSegments,h=v.newPathSegments;}catch(v){m.status(400).json({error:`Failed to parse folder update body: ${v}`});return}let g=n(f),b=n(h);if(!Bn__default.existsSync(g)){m.status(400).json({error:`Folder not found: ${f.join(Oo__default.sep)}`});return}if(Bn__default.existsSync(b)){m.status(400).json({error:`Destination already exists: ${h.join(Oo__default.sep)}`});return}let y=Oo__default.dirname(b);Bn__default.existsSync(y)||Bn__default.mkdirSync(y,{recursive:true}),Bn__default.renameSync(g,b);let T={success:true,message:`Folder moved from ${f.join(Oo__default.sep)} to ${h.join(Oo__default.sep)}`,pathSegments:h};m.status(200).json(T);})),e.delete("/",Xe(async(d,m,p)=>{let f,h=true;try{let T=bj.parse(d.body);f=T.pathSegments,h=T.recursive??!0;}catch(T){m.status(400).json({error:`Failed to parse folder delete body: ${T}`});return}let g=n(f);if(!Bn__default.existsSync(g)){m.status(200).json({success:true,message:`Folder not found: ${f.join(Oo__default.sep)}`,pathSegments:f});return}if(!Bn__default.statSync(g).isDirectory()){m.status(400).json({error:`Path is not a directory: ${f.join(Oo__default.sep)}`});return}try{if(h)Bn__default.rmSync(g,{recursive:!0,force:!0});else {if(Bn__default.readdirSync(g).length>0){m.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${f.join("/")}`});return}Bn__default.rmdirSync(g);}}catch(T){let{status:v,body:E}=W8(T,`delete folder ${f.join("/")}`);m.status(v).json(E);return}let y={success:true,message:`Folder deleted: ${f.join("/")}`,pathSegments:f};m.status(200).json(y);})),e}async function I2e(t){try{let e=await Bn__default.promises.open(t,"r");try{let o=Buffer.alloc(4096),{bytesRead:n}=await e.read(o,0,o.length,0);return o.toString("utf-8",0,n).match(/^fileType:\s*(.+)$/m)?.[1]?.trim()}finally{await e.close();}}catch{}}var Pne=Router();Pne.get("/",async(t,e)=>{let o=vt(),n=ao();if(!n){e.status(500).json({message:"API client not initialized"});return}let r=await Lo(rm,n,o);e.status(200).json(r);});var ZF=Pne;var Ux=class t extends Xc{static async init(e){let o=await Xc.connectAppium(e);return new t(o)}async executeWebViewScript(e,o,n,...r){let i=await this.executeInContext(e,o,async a=>{let s=new Function("...args",`${My.safariUtilsLibJs};
5892
5892
  const userFn = ${n.toString()};
5893
5893
  try {
5894
5894
  return userFn(momenticFunctions, ...args);
5895
5895
  } catch (e) {
5896
5896
  return { _failed: true, _error: e.message }
5897
- }`);return a.execute(s,...r)},{operationName:"executeWebViewScript"});if(i&&typeof i=="object"&&"_failed"in i)throw new Error(`Error executing script in webview: ${i._error||"Unknown error"}`);return i}async healthcheck(){await this.driver.getWindowHandle();}};async function Ine({logger:t,driverLogLevel:e="error",emulator:o,callbacks:n,emulatorSettings:r}){let{onStatusUpdate:i}=n,a=t.child({emulatorName:o.name}),s={platformName:"iOS","appium:noReset":true,"appium:fullReset":false,"appium:shouldTerminateApp":false,"appium:forceAppLaunch":false,"appium:autoLaunch":false,"appium:newCommandTimeout":3600,"appium:autoWebview":false,"appium:webviewConnectTimeout":500,"appium:webviewConnectRetries":5,"appium:includeSafariInWebviews":true,"appium:fullContextList":false,"appium:additionalWebviewBundleIds":["*"],"appium:waitForIdleTimeout":0,"appium:reduceMotion":true,"appium:settings":{customSnapshotTimeout:0,animationCoolOffTimeout:0},...o.extraCapabilities,...r?.autoAcceptAlerts!=null&&{"appium:autoAcceptAlerts":r.autoAcceptAlerts},...r?.autoDismissAlerts!=null&&{"appium:autoDismissAlerts":r.autoDismissAlerts},...r?.locale!=null&&BE(r.locale)};i("Starting Appium session");let l={capabilities:s},c=await Ux.init({logger:a,logLevel:e,callbacks:{...n,restartWda:o.restartWda?async u=>{await o.restartWda?.(u);}:void 0,onFailure:async({err:u,attempt:d})=>{let m=oA(u),p=d<3&&m;return p&&a.warn({err:u},"Appium driver manifest race detected on first attempt, restarting Appium and retrying"),{shouldRetry:p}}},wdioOpts:l});return a.info({capabilities:s,emulatorName:o.name},"Started Appium driver"),c}async function QF({wdaUrl:t,token:e}){try{let o=new AbortController;return setTimeout(()=>o.abort(),3e3),await fetch(t+"/status",{headers:{Authorization:`Bearer ${e}`},signal:o.signal}),!0}catch{return false}}var zx={"appium:waitForIdleTimeout":2,"appium:commandTimeouts":"30000","appium:skipLogCapture":true,"appium:disableAutomaticScreenshots":true,"appium:simpleIsVisibleCheck":true};var k2e=["[com.apple.","loadConfigurationForEnvironment"],F2e=["com.apple.Accessibility","com.apple.news","com.apple.locationd","NewsToday","NewsTodayIntents","apsd","APSConfiguration","APSOutgoingQueue","APSCourierConnection","APSNetworkMonitor","loadConfigurationForEnvironment"],B2e=new Set(["D","Df","Db"]),U2e=new Set(["I"]),z2e=/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\s+(\S+)\s+/,$2e="https://storage.googleapis.com/mobile-drivers/WebDriverAgentRunner-Build-Sim-arm64-v10.4.5.zip",One=6e4,V2e=5e3,j2e=250,Dne=12e4;function H2e(t){let e=z2e.exec(t)?.[1];if(!e)return false;let o=k2e.some(r=>t.includes(r)),n=F2e.some(r=>t.includes(r));return B2e.has(e)?o||n:U2e.has(e)?n:false}async function Nne({wdaUrl:t,token:e,limbarClient:o,logger:n,onStatusUpdate:r}){if(await QF({wdaUrl:t,token:e}))return;r("Starting WebDriverAgent"),n.debug("WDA is not running on the iOS emulator"),await o.simctl(["launch","booted","com.facebook.WebDriverAgentRunner.xctrunner"]).wait();let i=Date.now()+V2e;do{if(await QF({wdaUrl:t,token:e})){n.debug("WDA launched");return}await Te(j2e);}while(Date.now()<i);throw new bm("WebDriverAgent did not become reachable after relaunch")}var HS=class t{apiClient;name;extraCapabilities;limbarToken;limbarWebRtcUrl;limbarApiUrl;limbarWdaUrl;limbarRegion;limbarTag;limbarClient;onStatusUpdate;logStream=void 0;constructor({apiClient:e,limbarToken:o,limbarWebRtcUrl:n,limbarApiUrl:r,limbarWdaUrl:i,limbarRegion:a,limbarTag:s,emulatorName:l,limbarClient:c,onStatusUpdate:u}){this.apiClient=e,this.name=l,this.limbarToken=o,this.limbarWebRtcUrl=n,this.limbarApiUrl=r,this.limbarWdaUrl=i,this.limbarRegion=a,this.limbarTag=s,this.limbarClient=c,this.extraCapabilities={...zx,"appium:automationName":"@limrun/xcuitest","appium:webDriverAgentUrl":this.limbarWdaUrl,"appium:wdaLocalPort":443,"appium:useNewWDA":false,"appium:usePreinstalledWDA":true,"appium:limInstanceApiUrl":r,"appium:limInstanceToken":o,"appium:wdaRequestHeaders":{Authorization:`Bearer ${o}`}},this.onStatusUpdate=u;}static async init(e){let{apiClient:o,logger:n,creationOpts:r,logLevel:i,orgId:a,sessionId:s,onStatusUpdate:l,onConnectionStateChange:c}=e,u=r.appToInstall?.channel,d=r.appToInstall?.tag;l("Creating iOS emulator");let{token:m,webRtcUrl:p,wdaUrl:f,apiUrl:h,id:g,region:b,appDownloadUrl:y,appMd5:T,resolvedTag:v}=await o.createIosEmulator({...r,hostname:hostname(),sessionId:s,installAppOnClient:true});n.info({emulatorName:g,region:b,sessionId:s},"ios instance creation ok"),l("Connecting to iOS emulator");let E;try{E=await Qe.recordDuration({fn:async()=>await createInstanceClient({apiUrl:h,token:m,logLevel:i}),name:"test_event_duration",tags:["name:limbar-client-creation","clientOs:ios",`orgId:${a}`],timeoutMs:One,timeoutMessage:`Timed out after ${One}ms creating Limbar iOS instance client for emulator ${g} after instance creation succeeded (region: ${b??"unknown"}, channel: ${u??"none"}, tag: ${d??"none"})`}),c&&E.onConnectionStateChange(c),l("Installing WebDriverAgent");let P=E;return await Qe.recordDuration({fn:async()=>{await Lne({limbarClient:P,url:$2e,md5:void 0,logger:n,emulatorName:g,assetLabel:"WebDriverAgent"});},name:"test_event_duration",tags:["name:limbar-wda-install","clientOs:ios",`orgId:${a}`]}),await Nne({wdaUrl:f,token:m,limbarClient:P,logger:n,onStatusUpdate:l}),y&&(l(`Installing iOS app${u?` with channel ${u}`:""}${d?` and tag ${d}`:""}`),await Qe.recordDuration({fn:async()=>{await Lne({limbarClient:P,url:y,md5:T,logger:n,emulatorName:g,assetLabel:"iOS app"});},name:"test_event_duration",tags:["name:limbar-app-install","clientOs:ios",`orgId:${a}`]})),(async()=>{try{let[M,I]=await Promise.allSettled([Fp("limserver-1.limrun.net"),Fp("125.253.92.199")]);n.info({limserver:M.status==="fulfilled"?M.value:M.reason,ip125:I.status==="fulfilled"?I.value:I.reason},"Limbar network diagnostics");}catch(M){n.warn({err:M},"Failed to run network diagnostics");}})(),new t({apiClient:o,limbarToken:m,limbarWebRtcUrl:p,limbarApiUrl:h,limbarWdaUrl:f,limbarRegion:b,limbarTag:v??d,emulatorName:g,limbarClient:P,onStatusUpdate:l})}catch(P){throw n.warn({err:P,emulatorName:g},"iOS emulator init failed after creation; cleaning up remote instance"),await W2e({apiClient:o,limbarClient:E,id:g,logger:n}),P}}tap(e,o){return this.limbarClient.tap(e,o)}nativeA11yTreeJson(){return this.limbarClient.elementTreeRaw()}async screenshotPngBase64(){let e=await this.limbarClient.screenshot(),o=Buffer.from(e.base64,"base64"),n=VL.decode(o),r=new PNG({width:n.width,height:n.height});return r.data=Buffer.from(n.data),PNG.sync.write(r).toString("base64")}listApps(){return this.limbarClient.listApps()}terminateApp(e){return this.limbarClient.terminateApp(e)}setOrientation(e){return this.limbarClient.setOrientation(e==="LANDSCAPE"?"Landscape":"Portrait")}pressKey(e){return this.limbarClient.pressKey(e)}async waitForHomescreen(e){e.debug({emulatorName:this.name},"Waiting for iOS simulator to finish booting (simctl bootstatus)");let o=await re(this.limbarClient.simctl(["bootstatus","booted","-b"]).wait(),{milliseconds:Dne,message:`Timed out after ${Dne}ms waiting for iOS device ${this.name} to finish booting`});if(o.code!==0)throw new bm(`iOS device ${this.name} did not finish booting (simctl bootstatus exited ${o.code}): ${o.stderr}`);e.debug({emulatorName:this.name},"iOS simulator finished booting");}async resetSettings(){let e=await this.limbarClient.simctl(["privacy","booted","reset","all"]).wait();if(e.code!==0)throw new Error(`simctl privacy reset returned non-zero exit code: ${e.code} stderr: ${e.stderr}`)}async startScreenRecording(){await this.limbarClient.startRecording({quality:RecordingQuality.Q5});}async stopScreenRecording(e){await this.limbarClient.stopRecording({localPath:e});}addSyslogListener(e){this.logStream||(this.logStream=this.limbarClient.streamSyslog());let o=n=>{H2e(n)||e(n);};return this.logStream.on("line",o),()=>{this.logStream?.off("line",o);}}async restartWda(e){await Nne({wdaUrl:this.limbarWdaUrl,token:this.limbarToken,limbarClient:this.limbarClient,logger:e,onStatusUpdate:this.onStatusUpdate});}async close(){try{this.logStream?.stop();}catch{}try{this.limbarClient.disconnect();}catch{}await this.apiClient.deleteIosEmulator(this.name);}};async function W2e(t){let{apiClient:e,limbarClient:o,id:n,logger:r}=t;if(o)try{o.disconnect();}catch(i){r.warn({err:i,emulatorName:n},"Failed to disconnect limbar client during init cleanup");}try{await e.deleteIosEmulator(n);}catch(i){r.warn({err:i,emulatorName:n},"Failed to delete iOS emulator during init cleanup");}}var eB=12e4,$x=6,G2e=1e3;async function Lne(t){let{limbarClient:e,url:o,md5:n,logger:r,emulatorName:i,assetLabel:a}=t,s;for(let l=1;l<=$x;l++)try{await re(e.installApp(o,{md5:n,timeoutMs:eB}),{milliseconds:eB,message:`Timed out after ${eB}ms installing ${a} on emulator ${i}`});return}catch(c){if(s=c,l===$x)break;let u=G2e*2**(l-1);r.warn({url:o,err:c,emulatorName:i,assetLabel:a,attempt:l,maxAttempts:$x,backoffMs:u},`Failed to install ${a} on Limbar emulator; retrying after backoff`),await Te(u);}throw r.error({url:o,err:s,emulatorName:i,assetLabel:a,maxAttempts:$x},`Failed to install ${a} on Limbar emulator (no more retries)`),new O("UserConfigurationError",`Failed to install ${a} on emulator ${i}: ${s}`)}var q2e=w__default.array(w__default.object({bundle_id:w__default.string(),name:w__default.string()})),jx=class{constructor(e){this.udid=e;}async exec(e,o=[]){return new Promise((n,r)=>{execFile$1("idb",[...e,"--udid",this.udid,...o],(i,a)=>{i?r(i):n(a.trim());});})}async execBuffer(e,o=[]){return new Promise((n,r)=>{execFile$1("idb",[...e,"--udid",this.udid,...o],{encoding:"buffer",maxBuffer:10*1024*1024},(i,a)=>{i?r(i):n(a);});})}async describeDevice(){return this.exec(["describe"])}async tap({x:e,y:o}){await this.exec(["ui","tap"],[Math.round(e).toString(),Math.round(o).toString()]);}async elementTree(){return this.exec(["ui","describe-all"])}async listApps(){let e=await this.exec(["list-apps","--json"]),o=JSON.parse(e);return q2e.parse(o).map(n=>({bundleId:n.bundle_id,name:n.name}))}async terminate(e){await this.exec(["terminate"],[e]);}async pressKey(e){await this.exec(["ui","press"],[e]);}async screenshot(){let e=await this.execBuffer(["screenshot"],["-"]),o=Buffer.from([137,80,78,71,13,10,26,10]);if(e.length<o.length||!e.subarray(0,o.length).equals(o))throw new Error(`idb screenshot returned invalid PNG data (got ${e.length} bytes)`);return e.toString("base64")}async disconnect(){await this.exec(["disconnect"]);}};async function WS(t){try{return (await new Simctl().getDeviceTypes()).filter(n=>n.includes("iPhone"))}catch(e){return t.warn({err:e},"Got error listing local iPhone device types, returning empty list"),[]}}var K2e=w__default.object({runtimes:w__default.array(w__default.object({version:w__default.string(),name:w__default.string(),isAvailable:w__default.boolean().optional()}))});async function Y2e(t){try{let e=new Simctl,{stdout:o}=await e.exec("list",{args:["runtimes","-j"]}),{runtimes:n}=K2e.parse(JSON.parse(o)),r=n.filter(i=>i.isAvailable!==!1&&i.name.toLowerCase().startsWith("ios")).map(i=>i.version);return r.length===0?void 0:r.sort((i,a)=>X2e(a,i))[0]}catch(e){t.warn({err:e},"Failed to detect latest installed iOS runtime version");return}}function X2e(t,e){let o=t.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<Math.max(o.length,n.length);r++){let i=(o[r]??0)-(n[r]??0);if(i!==0)return i}return 0}var Hx=class t{name;extraCapabilities;simctl;idb;constructor({name:e,simctl:o,idb:n}){this.name=e,this.simctl=o,this.idb=n,this.extraCapabilities={...zx,"appium:automationName":"XCUITest","appium:udid":o.udid??void 0};}static async init(e,o){let n=new Simctl,r=o.emulatorName??`momentic-${Date.now()}`,i=await WS(e);if(!i.includes(o.deviceType))throw new O("UserConfigurationError",`Invalid device type: ${o.deviceType}. Valid device types are: ${i.join(", ")}. If you are sure the device type is correct, please make sure it is installed and available in Xcode.`);let a=o.iosVersion??await Y2e(e);if(!a)throw new O("UserConfigurationError","Could not determine an installed iOS runtime version. Make sure an iOS simulator runtime is installed in Xcode, or specify one with --local-ios-version.");let s;try{let l=await n.createDevice(r,o.deviceType,a);n.udid=l,s=async()=>{try{await n.shutdownDevice();}catch{}await n.deleteDevice();},await n.bootDevice(),await n.startBootMonitor({timeout:12e4}),o.appFilePath&&await n.installApp(o.appFilePath);let c=new jx(l);return new t({name:r,simctl:n,idb:c})}catch(l){throw await s?.(),l instanceof O?l:new O("UserConfigurationError",`Failed to start local iOS simulator (device "${o.deviceType}", iOS ${a}). Verify Xcode and the iOS simulator runtime are installed and working: ${J(l)}`)}}async waitForHomescreen(){}async tap(e,o){await this.idb.tap({x:e,y:o});}async nativeA11yTreeJson(){return this.idb.elementTree()}async screenshotPngBase64(){return this.idb.screenshot()}async listApps(){return this.idb.listApps()}async terminateApp(e){await this.idb.terminate(e);}async pressKey(e){await this.idb.pressKey(e);}async resetSettings(){}async close(){try{await this.idb.disconnect();}catch{}try{await this.simctl.shutdownDevice();}catch{}await this.simctl.deleteDevice();}};var J2e=5e3;async function fh({creationOpts:t,apiClient:e,logger:o,driverLogLevel:n,orgId:r,sessionId:i,callbacks:a,emulatorSettings:s}){let l=Date.now();o.info("Starting ios driver creation");let{onLimbarConnectionStateChange:c,onStatusUpdate:u}=a,d=[],m=async()=>{let f=d.toReversed();for(let h of f)try{await re(h(),{milliseconds:J2e,fallback:()=>{}});}catch(g){if(md(g))continue;o.warn({err:g},"Error running cleanup task");}},p;switch(t.type){case "remote":{p=await HS.init({apiClient:e,logger:o,creationOpts:t,orgId:r,sessionId:i,onStatusUpdate:u,onConnectionStateChange:c,logLevel:n});break}case "local":{p=await Hx.init(o,t);break}}d.push(async()=>{await p.close();});try{let f=await Ine({logger:o,driverLogLevel:n,emulatorStart:l,emulator:p,apiClient:e,creationOpts:t,orgId:r,sessionId:i,callbacks:a,emulatorSettings:s});return d.push(()=>f.close()),u("Waiting for home screen"),await p.waitForHomescreen(o),f.executeInNativeContext(o,h=>h.getPageSource(),{operationName:"Warm up Appium cache"}).catch(()=>{}),{driver:f,emulator:p,limbarParams:p instanceof HS?{token:p.limbarToken,webRtcUrl:p.limbarWebRtcUrl,region:p.limbarRegion,tag:p.limbarTag,osVersion:t.type==="remote"?t.osVersion:void 0}:void 0,cleanup:m}}catch(f){throw await m(),new Error(`Failed to start Appium driver: ${f}`,{cause:f})}}var eHe=100,tHe=2500,Fne=4e3,oHe="...";async function Wx({emulator:t,onLogs:e}){if(!t.addSyslogListener)return;let o=create({fetcher:async r=>{e(r);},resolver:()=>{},scheduler:windowedFiniteBatchScheduler({windowMs:tHe,maxBatchSize:eHe})}),n=r=>{let i=r.toString().trim();i.length!==0&&(i.length>Fne&&(i=i.slice(0,Fne)+oHe),o.fetch(i).catch(()=>{}));};return t.addSyslogListener(n)}var Bne="NATIVE_APP";var rHe=new Set(["id","processId","bundleId","type","accessible","index","x","y","width","height"]),iHe=new Set([]),aHe=new Set(["name","label","traits"]),sHe=new Set(["live-region","drawing-order"]),lHe=new Set(["visible","enabled"]);function Une(t){let e={},o=t.tagName,n=reduce(t.attributes,(r,i)=>(r[i.name]=i.value,r),{});for(let[r,i]of Object.entries(n))rHe.has(r)||r==="class"&&o===i||r==="focusable"&&i==="true"&&n.clickable==="true"||iHe.has(r)&&i==="false"||aHe.has(r)&&i===""||lHe.has(r)&&i==="true"||sHe.has(r)&&i==="0"||(e[r]=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 jl(t){let e=t.getAttribute("x"),o=t.getAttribute("y"),n=t.getAttribute("width"),r=t.getAttribute("height");if(e===null||o===null||n===null||r===null)return;let i=parseFloat(e),a=parseFloat(o),s=parseFloat(n),l=parseFloat(r);if(!(isNaN(i)||isNaN(a)||isNaN(s)||isNaN(l)))return {x1:i,y1:a,x2:i+s,y2:a+l}}function oB(t,e){let{x1:o,y1:n,x2:r,y2:i}=e;t.setAttribute("bounds",`[${o},${n},${r},${i}]`);}function cHe(t){let e=t.match(/\[([-\d.]+),([-\d.]+),([-\d.]+),([-\d.]+)\]/);if(!e)return;let o=parseFloat(e[1]),n=parseFloat(e[2]),r=parseFloat(e[3]),i=parseFloat(e[4]);if(!(isNaN(o)||isNaN(n)||isNaN(r)||isNaN(i)||r<o||i<n))return {x1:o,y1:n,x2:r,y2:i}}function Gx(t){let e=t.getAttribute("bounds");if(e)return cHe(e)}function zne(t,e){if(!e)return true;let o=jl(t);return o?nB(o,e):true}function nB(t,e){if(!e)return true;let{x1:o,y1:n,x2:r,y2:i}=t;return !(r<e.left||o>e.right||i<e.top||n>e.bottom)}function qx(t){let e=t.cloneNode(true);for(let o of Array.from(e.children)){let n=o;for(let r of Array.from(n.children))n.removeChild(r);}return e.outerHTML}var $ne=new Set(["XCUIElementTypeWebView"]);function fHe(t){if($ne.has(t.tagName))return true;let e=t.getAttribute("name");if(e&&(e.startsWith("TabDocument")||e.startsWith("BrowserView"))){let o=e.match(/UUID=([A-F0-9-]+)/),n=e.match(/WebViewProcessID=(\d+)/);if(o&&n)return true}return false}function hHe(t){return t.startsWith("XCUIElementType")?t.substring(15):t}function Vne({state:t,originalElement:e,prunedElement:o,isInWebview:n,idInWebview:r}){let{idCounter:i,idToPrunedElement:a,idToOriginalElement:s,idToIdInWebview:l}=t,c=i.value++;o.setAttribute("id",String(c)),a.set(c,o),n?l.set(c,r):s.set(c,e);}function jne(t){if(!$ne.has(t.tagName)&&t.tagName==="XCUIElementTypeOther"&&t.hasAttribute("name")&&t.hasAttribute("label"))return t;for(let e of Array.from(t.children)){let o=jne(e);if(o)return o}}function gHe({webviewNativeRootBounds:t,webviewDocumentRootBounds:e}){let o=t.x1-e.x,n=t.y1-e.y;if(!Number.isFinite(o)||!Number.isFinite(n))return t;let r=t.x2-t.x1,i=t.y2-t.y1;return {x1:o,y1:n,x2:o+r,y2:n+i}}function Hne(t,e,o,n){let{document:r}=o,{parentFrameBounds:i,pruneElementsOutsideBounds:a}=n;if(e.type==="element"){let s=r.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 l=e.boundingRect,c={x1:i.x1+l.x,y1:i.y1+l.y,x2:i.x1+l.x+l.width,y2:i.y1+l.y+l.height};if(!nB(c,a))return;oB(s,c),Vne({state:o,prunedElement:s,isInWebview:true,idInWebview:e.momenticWebviewElementId}),t.appendChild(s);for(let u of e.children)Hne(s,u,o,n);}else if(e.type==="text"){let s=r.createElement("text");t.appendChild(s);let l=r.createTextNode(e.text);s.appendChild(l);}}function Wne(t,e,o,n){let{pruneElementsOutsideBounds:r}=n,{document:i}=o;Vne({state:o,originalElement:t,prunedElement:e,isInWebview:false});let a=Une(t);for(let[c,u]of Object.entries(a))e.setAttribute(c,u);let s=jl(t);if(s&&oB(e,s),fHe(t)){let{removeWebviewContent:c,injectedWebviewContent:u}=n;if(c)return;if(u&&jl(t)){let m=jne(t),p=m?jl(m):void 0;if(m&&p){o.webviewRootElement=m,o.webviewRootBounds=p,Hne(e,u.root,o,{parentFrameBounds:gHe({webviewNativeRootBounds:p,webviewDocumentRootBounds:u.rootBoundingBox}),pruneElementsOutsideBounds:r});return}}}let l=Array.from(t.childNodes??[]);for(let c of l){let u=c.nodeType;if(u===3){let d=c.nodeValue;d&&d.trim().length>0&&e.appendChild(i.createTextNode(d));continue}if(u===1){let d=c;if(!zne(d,r))continue;let m=i.createElement(hHe(d.tagName));Wne(d,m,o,n),e.appendChild(m);}}}async function rB(t,e,o){let n=t.parseFromString("<AppiumAUT/>","text/xml"),r=new Map,i=new Map,a=new Map,s={document:n,idToPrunedElement:r,idToOriginalElement:i,idToIdInWebview:a,idCounter:{value:0},webviewRootElement:void 0,webviewRootBounds:void 0},l=n.documentElement;Wne(e,l,s,o);let c=new XMLSerializer().serializeToString(n),u=await _je.format(c,{parser:"xml",plugins:[Ije],printWidth:120,tabWidth:1,singleAttributePerLine:false});return {prunedDocument:n,idToPrunedElement:r,idToOriginalElement:i,idToIdInWebview:a,webviewRootElement:s.webviewRootElement,webviewRootBounds:s.webviewRootBounds,prunedXml:u}}async function Gne(t,e){let o=new DOMParser,n=o.parseFromString(t,"text/xml"),r=n.documentElement;if(!r)throw new Error("No root element found in XML");if(r.tagName!=="AppiumAUT")throw new Error("No AppiumAUT element found in XML");let{prunedXml:i,idToPrunedElement:a,idToOriginalElement:s,idToIdInWebview:l,webviewRootElement:c,webviewRootBounds:u}=await rB(o,r,e);return {xml:i,idToPrunedElement:a,idToOriginalElement:s,idToIdInWebview:l,webviewRootElement:c,webviewRootBounds:u,originalDocument:n}}var qne=(R=>(R.GenericElement="GenericElement",R.Any="Any",R.Other="Other",R.Application="Application",R.Group="Group",R.Window="Window",R.Sheet="Sheet",R.Drawer="Drawer",R.Alert="Alert",R.Dialog="Dialog",R.Button="Button",R.RadioButton="RadioButton",R.RadioGroup="RadioGroup",R.CheckBox="CheckBox",R.DisclosureTriangle="DisclosureTriangle",R.PopUpButton="PopUpButton",R.ComboBox="ComboBox",R.MenuButton="MenuButton",R.ToolbarButton="ToolbarButton",R.Popover="Popover",R.Keyboard="Keyboard",R.Key="Key",R.NavigationBar="NavigationBar",R.TabBar="TabBar",R.TabGroup="TabGroup",R.Toolbar="Toolbar",R.StatusBar="StatusBar",R.Table="Table",R.TableRow="TableRow",R.TableColumn="TableColumn",R.Outline="Outline",R.OutlineRow="OutlineRow",R.Browser="Browser",R.CollectionView="CollectionView",R.Slider="Slider",R.PageIndicator="PageIndicator",R.ProgressIndicator="ProgressIndicator",R.ActivityIndicator="ActivityIndicator",R.SegmentedControl="SegmentedControl",R.Picker="Picker",R.PickerWheel="PickerWheel",R.Switch="Switch",R.Toggle="Toggle",R.Link="Link",R.Image="Image",R.Icon="Icon",R.SearchField="SearchField",R.ScrollView="ScrollView",R.ScrollBar="ScrollBar",R.StaticText="StaticText",R.TextField="TextField",R.SecureTextField="SecureTextField",R.DatePicker="DatePicker",R.TextView="TextView",R.Menu="Menu",R.MenuItem="MenuItem",R.MenuBar="MenuBar",R.MenuBarItem="MenuBarItem",R.Map="Map",R.WebView="WebView",R.IncrementArrow="IncrementArrow",R.DecrementArrow="DecrementArrow",R.Heading="Heading",R.Cell="Cell",R))(qne||{}),Kne=w__default.lazy(()=>w__default.object({AXFrame:w__default.string(),AXUniqueId:w__default.string().nullable(),AXLabel:w__default.string().nullable(),AXValue:w__default.string().nullable(),frame:w__default.object({x:w__default.number(),y:w__default.number(),width:w__default.number(),height:w__default.number()}),role:w__default.string(),role_description:w__default.string(),subrole:w__default.string().nullable(),type:w__default.nativeEnum(qne),title:w__default.string().nullable(),help:w__default.string().nullable(),content_required:w__default.boolean(),custom_actions:w__default.array(w__default.string()),enabled:w__default.boolean(),children:w__default.array(Kne).default([])}));function yHe(t){return w__default.array(Kne).parse(JSON.parse(t))}async function Kx(t,e){let o=new DOMParser,n=yHe(t),r=SHe(o,n),{prunedXml:i,idToPrunedElement:a,idToOriginalElement:s}=await rB(o,r.documentElement,{removeWebviewContent:false,injectedWebviewContent:void 0,pruneElementsOutsideBounds:e.pruneElementsOutsideBounds});return {xml:i,idToPrunedElement:a,idToOriginalElement:s,originalDocument:r,webviewRootElement:void 0,idToIdInWebview:new Map,webviewRootBounds:void 0}}function SHe(t,e){let o=t.parseFromString("<hierarchy/>","text/xml"),n=o.documentElement;for(let r=0;r<e.length;r++){let i=e[r],a=Yne(i,o);n.appendChild(a);}return o}function Yne(t,e){let o=t.type,n=e.createElement(o);if(n.setAttribute("type",o),n.setAttribute("x",String(t.frame.x.toFixed(2))),n.setAttribute("y",String(t.frame.y.toFixed(2))),n.setAttribute("width",String(t.frame.width.toFixed(2))),n.setAttribute("height",String(t.frame.height.toFixed(2))),t.AXLabel!==null&&n.setAttribute("label",t.AXLabel),t.AXValue!==null&&n.setAttribute("value",t.AXValue),t.title!==null&&n.setAttribute("title",t.title),t.help!==null&&n.setAttribute("help",t.help),n.setAttribute("enabled",String(t.enabled)),t.children)for(let r=0;r<t.children.length;r++){let i=t.children[r],a=Yne(i,e);n.appendChild(a);}return n}function im(t){let e=[],o=t;for(;o;){let n=o.parentElement;if(!n||n.tagName==="AppiumAUT"){e.unshift(`${o.tagName}[1]`);break}let r=o.tagName,i=Array.from(n.children).filter(s=>s.tagName===r),a=1;for(let s=0;s<i.length;s++)if(i[s]===o){a=s+1;break}e.unshift(`${r}[${a}]`),o=n;}return `/${e.join("/")}`}var Yx=class t{driver;emulator;options;lastDomState;lastScreenshot;aborter;constructor({driver:e,emulator:o,aborter:n,options:r}){this.driver=e,this.emulator=o,this.aborter=n,this.options=r;}static async init({driver:e,emulator:o,aborter:n,options:r}){return new t({driver:e,aborter:n,emulator:o,options:r})}async getContexts(e){let o=await this.driver.executeInNativeContext(e,async r=>await r.getContexts({}),{operationName:"getContexts"}),n=o.filter(r=>r!==Bne);return {contexts:o.map(r=>r),webviews:n}}async getRawScreenshotBase64({logger:e,totalAttempts:o=3,signal:n}){let r=fe(),i=n??this.aborter.controller?.signal,a=await r.startAsyncSpan("EMULATOR_READ_STATE",async()=>await yf(e,()=>this.emulator.screenshotPngBase64(),{maxAttempts:o,signal:i,operationName:"takeScreenshot"}),{name:"Take screenshot",signal:i,timeoutMs:3e4});return this.lastScreenshot={pngString:`data:image/png;base64,${a}`,observedAt:Date.now()},a}async getCurrentScreenshotPngString(e){return `data:image/png;base64,${await this.getRawScreenshotBase64({logger:e,totalAttempts:1})}`}async waitForScreenshotStability({logger:e,timeoutMs:o,signal:n,reason:r,tolerancePercent:i=1}){await fe().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async a=>{a.attributes.reason=r;let s=Sp({signal:n,timeoutMs:o}),l,c=false;for(;!s.aborted;){let u=Date.now();if(l)try{let m=await this.getRawScreenshotBase64({logger:e,totalAttempts:1,signal:s});if(Yc(l,m)<=i){c=!0;break}l=m;}catch(m){e.warn({err:m},"Failed to get screenshot during stability wait");}else try{l=await this.getRawScreenshotBase64({logger:e,totalAttempts:1,signal:s});}catch(m){e.warn({err:m},"Failed to get initial screenshot during stability wait");}let d=Math.max(250,Date.now()-u);await Os(Math.min(1e4,d),s);}c||(a.attributes.timedOut=true,e.warn({purpose:r},"Timed out waiting for screenshot stability"));});}async waitForPageSourceStability({logger:e,timeoutMs:o,signal:n,reason:r}){await fe().startAsyncSpan("WAIT_FOR_PAGE_STABILITY",async i=>{i.attributes.reason=r;let a=Sp({signal:n,timeoutMs:o}),s,l=false;for(;!a.aborted;){let c,u=Date.now();try{c=await re(this.emulator.nativeA11yTreeJson(),{milliseconds:1e4,signal:a,message:"Getting the native accessibility tree timed out after 10s"});let m=createHash("md5").update(c).digest("hex");if(s&&s===m){l=!0;break}s=m;}catch(m){e.warn({err:m},"Failed to get page source during stability wait");}let d=Math.max(250,Date.now()-u);await Os(Math.min(1e4,d),a);}l||(i.attributes.timedOut=true,e.warn({purpose:r},"Timed out waiting for page source stability"));});}async getActiveWebview(e){let n=(await this.getContexts(e)).webviews;if(n.length>1)throw new O("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");return n[0]}async getActiveWebviewContent(e){let o=await this.getActiveWebview(e);if(!o)return;this.throwIfAborted();let n=await this.driver.executeWebViewScript(e,o,r=>r.dumpA11yTree());return {context:o,...n}}async getDomState(e,o){let r=await fe().startAsyncSection("Get emulator state XML",async()=>{let a=o?.filterOffscreenElements??true?await this.getViewportBounds(e):void 0,s;if(!o?.skipFetchingFullWebviewContent)try{s=await this.getActiveWebviewContent(e);}catch(u){e.error({err:u},"Could not get webview info to get the nested DOM state");}if(this.throwIfAborted(),!s&&this.options?.disableMomenticAccessibilityTree){let u=await this.getNativePageSource();this.throwIfAborted();let d=await Kx(u,{pruneElementsOutsideBounds:a});return {sourceTree:"native",graph:d,webviewContent:void 0}}let l=await this.getAppiumPageSource(e);return this.throwIfAborted(),{graph:await Gne(l,{injectedWebviewContent:s,removeWebviewContent:o?.removeWebviewContent,pruneElementsOutsideBounds:a}),sourceTree:"appium",webviewContent:s}});return this.recordDomState(r),r}async getLastObservedState(){let e=this.lastDomState,o=this.lastScreenshot;if(!e||!o)return;let n=Date.now(),r=3e4;if(!(n-e.observedAt>r||n-o.observedAt>r||Math.abs(e.observedAt-o.observedAt)>5e3))return {emulatorState:e.state,screenshot:o.pngString}}recordDomState(e){this.lastDomState={state:e,observedAt:Date.now()};}async getNativePageSource(){return await fe().startAsyncSpan("EMULATOR_READ_STATE",async()=>this.emulator.nativeA11yTreeJson(),{name:"Get iOS page source",signal:this.aborter.controller?.signal,timeoutMs:3e4})}async getAppiumPageSource(e,o){let n=o??this.aborter.controller?.signal;return await fe().startAsyncSpan("EMULATOR_READ_STATE",()=>this.driver.executeInNativeContext(e,i=>i.getPageSource(),{signal:n,operationName:"getPageSource"}),{name:"Get page source",signal:n,timeoutMs:3e4})}async getViewportBounds(e){let o=await this.driver.executeInNativeContext(e,async n=>n.getWindowRect(),{operationName:"getViewportBounds"});return {left:o.x,top:o.y,right:o.x+o.width,bottom:o.y+o.height}}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted();}};async function Jne({command:t,logger:e,generator:o,aiSettings:n,getEmulatorDomState:r,getScreenshotBase64:i,throwIfAborted:a,abortSignal:s}){let l=fe(),c=t.contextChoice==="VISION_ONLY",u=15,d=t.timeoutSecs?t.timeoutSecs*1e3:5e3,m=GC(d),p=Date.now(),f=0,h,g=false,b;for(;f<u&&!g;){a(),g||h&&h-p>=d&&(g=true),f!==0&&await Te(m,s),h=Date.now();try{let y="",T="";await l.startAsyncSpan("EMULATOR_READ_STATE",async()=>{c||(y=await r()),T=await i();},{name:"Get emulator state"});let v=await o.evaluateIosAssertion({assertion:t.assertion,screenXml:y,screenshot:T,contextChoice:t.contextChoice},{logger:e,loggerTags:$e(e),agentConfigVersion:n.agentConfig?.["ios-assertion"]});if(v.result)return {success:v.result,message:v.thoughts};{let E=`AssertionFailureError: ${v.thoughts}`;b=new Error(E);}}catch(y){if(a(),FT(y))throw y;e.info({err:y},`AI check assert attempt ${f} failed, retrying...`),b=y instanceof Error?y:new Error(`${y}`);}finally{f++;}}return {success:false,message:b?.message}}async function Zne({command:t,logger:e,generator:o,aiSettings:n,getEmulatorDomState:r,getScreenshotBase64:i,abortSignal:a}){if(!t.goal.trim())throw new O("ActionFailureError","Cannot perform AI extraction without goal");if(t.schema){let u=pp(t.schema);if(u)throw new O("UserConfigurationError",u)}let s=fe(),l="",c="";return await s.startAsyncSpan("EMULATOR_READ_STATE",async()=>{l=await r(),c=await i();},{name:"Get emulator state"}),await s.startAsyncSpan("AI_EXTRACTION_CALL",async u=>{try{let d=await o.getIosTextExtraction({goal:t.goal,emulatorState:l,returnSchema:t.schema,screenshot:`data:image/png;base64,${c}`},{disableCache:!!t.disableCache,abortSignal:a,loggerTags:$e(e),agentConfigVersion:n.agentConfig?.["ios-text-extraction"]});if(u.result=d,aA({tracer:s,span:u,screenshot:c,emulatorState:l,logger:e}),d.result==="NOT_FOUND")return {success:!1,message:"No relevant data found for extraction goal on this page"};if(d.thoughts?.includes("MaxGenerationLengthExceededError"))throw new O("UserConfigurationError",d.thoughts);return {success:!0,output:d.result,message:d.thoughts}}catch(d){let m=J(d);throw m.includes("MaxGenerationLengthExceededError")?new O("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step instead."):m.includes("AIProviderError")&&m.includes("time")?new O("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}})}function Hl(t){let{x1:e,y1:o,x2:n,y2:r}=t.bounds;return {left:e,top:o,width:n-e,height:r-o}}var zi="element-6066-11e4-a52e-4f735466cecf";function Jx(t,e){return Math.abs(t-e)<1}function hh(t,e){return Jx(t.x1,e.x1)&&Jx(t.y1,e.y1)&&Jx(t.x2,e.x2)&&Jx(t.y2,e.y2)}function gh(t,e){let o=e.x2-e.x1,n=(e.x1+e.x2)/2,r=(t.x1+t.x2)/2;if(!Hs(e.tolerance,n,r,Math.min(1,o)))return false;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(t.y1+t.y2)/2;return Hs(e.tolerance,a,s,Math.min(1,i))}function bh(t,e){let o=t.x2-t.x1,n=t.y2-t.y1;return Hs(e.tolerance,e.width,o,Math.min(1,e.width))?Hs(e.tolerance,e.height,n,Math.min(1,e.height)):false}function am(t){return t.type==="WEBVIEW",t.cache}function sm(t){let{command:e,cacheKey:o="cache",targetName:n="target",updatedCache:r}=t;JI(e)&&(e[o]={...e[o],[n]:km.parse(r)},t.updatedWithAI&&(e[o].updatedAt=new Date,e[o].updatedAtLoggerTags=$e(t.logger)));}var GS="name";async function Qne(t,e,o){return await e.executeInNativeContext(t,n=>n.isElementDisplayed(o),{operationName:"isElementRendered"})}async function yh(t,e,o,n){return await e.executeInNativeContext(t,r=>r.getElementAttribute(o,n),{operationName:"getAttributeFromIosElement"})}async function iB(t,e,o){return await e.executeInNativeContext(t,async n=>{try{let r=await n.findElement("xpath",o);if(!r)return null;let i=r[zi];if(!i)return null;let a=await n.getElementRect(i);return {elementId:i,rect:a}}catch{return null}},{operationName:"findElementByXPath"})}async function ere(t,e,o){let n=im(o),r=await iB(t,e,n);if(r)return {xPath:n,...r}}async function aB({logger:t,emulatorState:e,driver:o,idInWebview:n,requirements:r}){let i=e.graph.webviewRootElement?im(e.graph.webviewRootElement):void 0;if(!i||!e.webviewContent||!e.graph.webviewRootBounds)throw new Error("Cannot build webview target cache without webview root information");let a=await vHe({logger:t,driver:o,webviewRootBounds:e.graph.webviewRootBounds,nodeIdInWebview:n,aiGeneratedRequirements:r,webviewContent:e.webviewContent});if(!a)throw new Error("Failed to build browser cache for webview element");return {xPath:i,bounds:[e.graph.webviewRootBounds.x1,e.graph.webviewRootBounds.y1,e.graph.webviewRootBounds.x2,e.graph.webviewRootBounds.y2],browserCache:a}}async function vHe({logger:t,driver:e,webviewRootBounds:o,nodeIdInWebview:n,aiGeneratedRequirements:r,webviewContent:i}){let a=await e.executeWebViewScript(t,i.context,(c,u,d,m)=>c.generateCacheFromWebviewElementId(u,d,m),i.generatedAt,n,{attributesToFetch:r?.attributesRequired??[]});if(!a)return;let s=a.textContent??void 0,l={x:o.x1-i.rootBoundingBox.x+a.boundingBox.x,y:o.y1-i.rootBoundingBox.y+a.boundingBox.y,width:a.boundingBox.width,height:a.boundingBox.height};return {id:a.id,generatedSelectors:a.selectors,boundingBox:l,requirements:{text:r?.textRequired?s:void 0,attributes:a.attributes,boundingBox:r?.boundsRequired?l:void 0,shape:r?.shapeSpecificity?{tolerance:r.shapeSpecificity,width:a.boundingBox.width,height:a.boundingBox.height}:void 0,position:r?.positionSpecificity?{tolerance:r.positionSpecificity,x1:l.x,y1:l.y,x2:l.x+l.width,y2:l.y+l.height}:void 0}}}async function CHe(t,e,o,n){if(!n||!n.length)return;let r={};for(let i of n){let a=await yh(t,e,o,i);a!==null&&(r[i]=a);}return Object.keys(r).length?r:void 0}async function tre({logger:t,driver:e,node:o,requirements:n}){let r=await ere(t,e,o);if(!r){t.warn("Failed to generate valid xPath selector for element");return}let{xPath:i,rect:a,elementId:s}=r,l={x1:a.x,y1:a.y,x2:a.x+a.width,y2:a.y+a.height};return {xPath:i,bounds:[l.x1,l.y1,l.x2,l.y2],requirements:{requiredText:n?.textRequired?await yh(t,e,s,GS)??void 0:void 0,requiredAttributes:await CHe(t,e,s,n?.attributesRequired?.filter(c=>!(n.textRequired&&c===GS))),requiredBounds:n?.boundsRequired,position:n?.positionSpecificity?{x1:l.x1,y1:l.y1,x2:l.x2,y2:l.y2,tolerance:n?.positionSpecificity}:void 0,shape:n?.shapeSpecificity?{width:l.x2-l.x1,height:l.y2-l.y1,tolerance:n?.shapeSpecificity}:void 0}}}async function ore({logger:t,driver:e,aiResponse:o,description:n,emulatorState:r}){let i=r.graph.idToPrunedElement.get(o.id);if(!i)throw new Error(`Could not find node with id: ${o.id}`);let a=Gx(i);if(!a)throw new Error(`Could not determine bounds for element with id: ${o.id}, description: ${n}`);let s=[];for(let{id:g,requirements:b}of o.additionalElements??[]){let y=r.graph.idToIdInWebview.get(g);if(y!==void 0){try{let E=await aB({logger:t,driver:e,emulatorState:r,idInWebview:y,requirements:b});s.push(E);}catch(E){t.warn({err:E},`Failed to build webview cache for related element with id: ${g}`);}continue}let T=r.graph.idToOriginalElement.get(g);if(!T){t.warn(`Could not find original element for additional element with id: ${g}`);continue}let v=await tre({logger:t,driver:e,node:T,requirements:b});v&&s.push(v);}let l=r.graph.idToIdInWebview.get(o.id);if(l!==void 0){let g={type:"WEBVIEW",bounds:a,cache:{type:"WEBVIEW"}};try{let b=await aB({logger:t,driver:e,emulatorState:r,idInWebview:l,requirements:o.requirements});return {...g,cache:{type:"WEBVIEW",resolvedDescription:n,requiredRelatedElements:s,...b}}}catch(b){return t.warn({err:b},"Failed to build webview target cache"),g}}let c=r.graph.idToOriginalElement.get(o.id);if(!c)throw new Error(`Node isn't in a webview but couldn't find original node for id: ${o.id}, description: ${n}`);let u=await tre({logger:t,driver:e,node:c,requirements:o.requirements});if(!u)return t.warn("Failed to generate valid cache for element"),{type:"NATIVE",cache:{type:"NATIVE"},bounds:a};let[d,m,p,f]=u.bounds,h={x1:d,y1:m,x2:p,y2:f};return hh(a,h)||t.warn({a11yTreeBounds:a,xpathBounds:h},"Element bounds differ between a11y tree and xpath resolution"),{type:"NATIVE",bounds:h,cache:{type:"NATIVE",...u,resolvedDescription:n,sourceTree:"appium",requiredRelatedElements:s,elementOnlySerializedXml:qx(c)}}}async function sB({logger:t,driver:e,stateManager:o,parentWebviewBounds:n,cache:r}){if(!r||!r.generatedSelectors)throw new Ne("Cache is missing required attributes");let i=await o.getActiveWebview(t);if(!i)throw new Ne("No active webview context found");let a=await e.executeWebViewScript(t,i,(u,d)=>u.resolveWebviewTargetCache(d),{selectors:r.generatedSelectors,attributesToFetch:Object.keys(r.requirements?.attributes??{})});if(!a)throw new Ne("Failed to resolve webview target using cache");let s=n.x1-a.rootBoundingBox.x+a.boundingBox.x,l=n.y1-a.rootBoundingBox.y+a.boundingBox.y,c={x1:s,y1:l,x2:s+a.boundingBox.width,y2:l+a.boundingBox.height};return r.requirements&&wHe(t,c,a,r.requirements),c}function wHe(t,e,o,n){if(!n)return;let{attributes:r,text:i,position:a,shape:s}=n;if(i!==void 0&&i.length>0&&o.textContent!==i)throw new Ne(`Text content mismatch: expected "${i}", got "${o.textContent}"`);if(r)for(let[l,c]of Object.entries(r)){let u=o.attributes[l];if(u!==c)throw new Ne(`Attribute ${l} mismatch: expected "${c}", got "${u}"`)}if(a&&!gh(e,a))throw new Ne(`Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(e)}`);if(s&&!bh(e,s))throw new Ne(`Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(e)}`)}async function nre(t,e,o,n,r){if(!n)return;let{requiredAttributes:i,requiredText:a,requiredBounds:s,position:l,shape:c}=n;if(a!==void 0&&a.length>0){let u=await yh(t,e,o,GS);if(u!==a)throw new Ne(`Resolved element text mismatch: expected ${a}, got ${u}`)}if(i)for(let[u,d]of Object.entries(i)){let m=await yh(t,e,o,u)??void 0;if(m!==d)throw new Ne(`Attribute ${u} mismatch: expected ${d}, got ${m}`)}if(s&&r){let{originalBounds:u,newBounds:d}=r;if(!u)throw new Ne("Cannot validate bounds requirements without original bounds in cache");if(!hh(u,d)){let m=p=>`[${p.x1},${p.y1},${p.x2},${p.y2}]`;throw new Ne(`Bounds changed from ${m(u)} to ${m(d)}`)}}if(l&&r&&!gh(r.newBounds,l))throw new Ne(`Position mismatch: expected ${JSON.stringify(l)}, got ${JSON.stringify(r.newBounds)}`);if(c&&r&&!bh(r.newBounds,c))throw new Ne(`Shape mismatch: expected ${JSON.stringify(c)}, got ${JSON.stringify(r.newBounds)}`)}async function rre({logger:t,driver:e,xPath:o,elementType:n,skipVisibilityCheck:r=false}){let i=await iB(t,e,o);if(!i)throw new Ne(`Could not resolve ${n} via XPath: ${o}`);let{elementId:a}=i;if(!r&&!await Qne(t,e,a))throw new Ne(`${n} resolved via XPath is not rendered: ${o}`);return i}async function ire({target:t,driver:e,stateManager:o,logger:n}){if(!t.xPath)throw new Ne(`Could not resolve cached target via XPath: ${t.xPath}`);if(t.requiredRelatedElements){let s=t.requiredRelatedElements;for(let l of s){let{elementId:c,rect:u}=await rre({logger:n,driver:e,xPath:l.xPath,elementType:"related element",skipVisibilityCheck:!!l.browserCache});if(l.browserCache){let d={x1:u.x,y1:u.y,x2:u.x+u.width,y2:u.y+u.height};await sB({logger:n,driver:e,stateManager:o,parentWebviewBounds:d,cache:l.browserCache});}else await nre(n,e,c,l.requirements);}}let{elementId:r,rect:i}=await rre({logger:n,driver:e,xPath:t.xPath,elementType:"element",skipVisibilityCheck:t.type==="WEBVIEW"}),a={x1:i.x,y1:i.y,x2:i.x+i.width,y2:i.y+i.height};if(t.type==="WEBVIEW"){let s=await sB({logger:n,driver:e,stateManager:o,parentWebviewBounds:a,cache:t.browserCache});return {type:"WEBVIEW",bounds:s,cache:t}}return await nre(n,e,r,t.requirements,{originalBounds:t.bounds?{x1:t.bounds[0],y1:t.bounds[1],x2:t.bounds[2],y2:t.bounds[3]}:void 0,newBounds:a}),{type:"NATIVE",bounds:a,cache:{...t,bounds:[a.x1,a.y1,a.x2,a.y2]}}}function sre({aiResponse:t,description:e,emulatorState:o}){let n=o.graph.idToPrunedElement.get(t.id);if(!n)throw new Error(`Could not find node with id: ${t.id}`);let r=Gx(n);if(!r)throw new Error(`Could not determine bounds for element with id: ${t.id}, description: ${e}`);let i=o.graph.idToOriginalElement.get(t.id);if(!i)throw new Error(`Node isn't in a webview but couldn't find original node for id: ${t.id}, description: ${e}`);let a=im(i),s=qx(i),l=are({requirements:t.requirements,element:i}),c=(t.additionalElements??[]).map(({id:u,requirements:d})=>{let m=o.graph.idToOriginalElement.get(u);return m?{xPath:im(m),requirements:are({requirements:d,element:m})}:void 0}).filter(u=>!!u);return {type:"NATIVE",bounds:r,cache:{type:"NATIVE",bounds:[r.x1,r.y1,r.x2,r.y2],resolvedDescription:e,sourceTree:o.sourceTree,xPath:a,elementOnlySerializedXml:s,requirements:l,requiredRelatedElements:c}}}function are({requirements:t,element:e}){let o;if((t?.positionSpecificity||t?.shapeSpecificity)&&(o=jl(e),!o))throw new O("ActionFailureError","Element to cache has no bounds or unexpected bounds format");return {requiredText:t?.textRequired?e.textContent??void 0:void 0,requiredAttributes:AHe(e,t?.attributesRequired),requiredBounds:t?.boundsRequired,position:t?.positionSpecificity?{x1:o.x1,y1:o.y1,x2:o.x2,y2:o.y2,tolerance:t?.positionSpecificity}:void 0,shape:t?.shapeSpecificity?{width:o.x2-o.x1,height:o.y2-o.y1,tolerance:t?.shapeSpecificity}:void 0}}function AHe(t,e){if(t&&!(!e||e.length===0))return Object.fromEntries(e.map(o=>[o,t.getAttribute(o)]).filter(([,o])=>o!==null))}async function cre(t,e,o,n){if(!o)return;let{requiredAttributes:r,requiredText:i,requiredBounds:a,position:s,shape:l}=o;if(i!==void 0&&i.length>0){let c=e.textContent;if(c!==i)throw new Ne(`Resolved element text mismatch: expected ${i}, got ${c}`)}if(r)for(let[c,u]of Object.entries(r)){let d=e.getAttribute(c)??void 0;if(d!==u)throw new Ne(`Attribute ${c} mismatch: expected ${u}, got ${d}`)}if(a&&n){let{originalBounds:c,newBounds:u}=n;if(!c)throw new Ne("Cannot validate bounds requirements without original bounds in cache");if(!hh(c,u)){let d=m=>`[${m.x1},${m.y1},${m.x2},${m.y2}]`;throw new Ne(`Bounds changed from ${d(c)} to ${d(u)}`)}}if(s&&n&&!gh(n.newBounds,s))throw new Ne(`Position mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(n.newBounds)}`);if(l&&n&&!bh(n.newBounds,l))throw new Ne(`Shape mismatch: expected ${JSON.stringify(l)}, got ${JSON.stringify(n.newBounds)}`)}async function ure({target:t,logger:e,emulator:o}){if(!t.xPath)throw new Ne(`Could not resolve cached target via XPath: ${t.xPath}`);let n=await o.nativeA11yTreeJson(),r=await Kx(n,{pruneElementsOutsideBounds:void 0});return await lB({target:t,logger:e,document:r.originalDocument})}async function lB({target:t,logger:e,document:o}){if(!t.xPath)throw new Ne(`Could not resolve cached target via XPath: ${t.xPath}`);let n=t.xPath;if(t.requiredRelatedElements){let a=t.requiredRelatedElements;for(let s of a){let l=Yoe.evaluateXPathToFirstNode(s.xPath,o);if(!l)throw new Ne(`Required related element not found for XPath: ${s.xPath}`);await cre(e,l,s.requirements);}}let r=Yoe.evaluateXPathToFirstNode(n,o);if(!r)throw new Ne(`Could not resolve cached target via XPath: ${n}`);let i=jl(r);if(!i)throw new Ne(`Could not determine bounds for cached target via XPath: ${n}`);return await cre(e,r,t.requirements,{originalBounds:t.bounds?{x1:t.bounds[0],y1:t.bounds[1],x2:t.bounds[2],y2:t.bounds[3]}:void 0,newBounds:i}),{type:"NATIVE",bounds:i,cache:{...t,bounds:[i.x1,i.y1,i.x2,i.y2]}}}async function dre({logger:t,driver:e,aiResponse:o,description:n,emulatorState:r}){switch(r.sourceTree){case "appium":return await ore({logger:t,driver:e,aiResponse:o,description:n,emulatorState:r});case "native":return await sre({aiResponse:o,description:n,emulatorState:r});default:{let i=r.sourceTree;throw new Error(`Unsupported source tree type for building iOS target cache: ${i}`)}}}async function mre({target:t,driver:e,stateManager:o,logger:n,emulator:r}){if(t.type==="WEBVIEW"||!t.sourceTree||t.sourceTree=="appium")return await ire({target:t,driver:e,stateManager:o,logger:n});switch(t.sourceTree){case "native":return await ure({target:t,logger:n,emulator:r});default:{let i=t.sourceTree;throw new Error(`Unsupported source tree type for resolving iOS target cache: ${i}`)}}}var nn=class{emulator;driver;stateManager;generator;fixtures;orgId;aiSettings;emulatorSettings;aborter;constructor(e){this.stateManager=e.stateManager,this.driver=e.driver,this.emulator=e.emulator,this.aborter=e.aborter,this.fixtures=e.fixtures,this.orgId=e.orgId,this.generator=e.generator,this.aiSettings=e.aiSettings,this.emulatorSettings=e.emulatorSettings;}async findElement({logger:e,tracer:o,description:n,skipFetchingFullWebviewContent:r=false,removeWebviewContent:i=false,filterOffscreenElements:a=true,useMemory:s=false,metadata:l,cacheBustReason:c,knownState:u}){let d=e.child({...l});u||await this.stateManager.waitForScreenshotStability({logger:e,timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before locating an element with AI"});let{emulatorState:m,screenshot:p}=u??await o.startAsyncSection("Get emulator state",async()=>{let g=await this.stateManager.getCurrentScreenshotPngString(e);return {emulatorState:await this.stateManager.getDomState(e,{skipFetchingFullWebviewContent:r,removeWebviewContent:i,filterOffscreenElements:a}),screenshot:g}}),f;try{f=await o.startAsyncSpan("AI_LOCATOR_CALL",async g=>{c&&(g.attributes.cacheBustReason=c);let b=await this.generator.getIosElementLocation({description:n,screenXml:m.graph.xml,screenshot:p,source:l?.source==="SCROLL_TO"?"SCROLL_TO":void 0},{logger:d,loggerTags:$e(d),abortSignal:this.aborter.controller?.signal,useMemory:s,agentConfigVersion:this.aiSettings.agentConfig?.["ios-locator"]});return g.result=b,b});}catch(g){throw this.throwIfAborted(),d.error({err:g},"Failed to locate element"),new Error(`ActionFailureError: Failed to locate element: ${g instanceof Error?g.message:g}`,{cause:g})}if(f.id===-1)throw new O("NoMatchingElementError",f.thoughts??"No matching element found");let h=await dre({logger:e,driver:this.driver,aiResponse:f,description:n,emulatorState:m});return o.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:(h.type==="NATIVE"?h.cache.elementOnlySerializedXml:void 0)??"Unknown element"},attributes:{},subSpans:[]}),{resolvedTarget:h,thoughts:f.thoughts}}async targetingActionWithAILocator(e){let{tracer:o,action:n,command:r,description:i,cacheKey:a,targetName:s,skipFetchingFullWebviewContent:l,removeWebviewContent:c,metadata:u,logger:d,cacheBustReason:m}=e,p=await this.findElement({logger:d,tracer:o,description:i,skipFetchingFullWebviewContent:l,removeWebviewContent:c,metadata:u,cacheBustReason:m}),f=p.thoughts,h=await n(p.resolvedTarget);return sm({command:r,cacheKey:a,targetName:s,updatedCache:am(p.resolvedTarget),updatedWithAI:true,logger:d}),{result:h,thoughts:f}}async targetingActionWithCache({logger:e,tracer:o,action:n,command:r,cacheKey:i,targetName:a,cacheCopyForAttempt:s}){this.emulatorSettings?.waitForStability!==false&&await this.stateManager.waitForScreenshotStability({logger:e,timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"});let l=await this.resolveTargetCacheWithTracing({logger:e,tracer:o,cache:s}),c=await n(l);return sm({command:r,cacheKey:i,targetName:a,updatedCache:am(l),updatedWithAI:false,logger:e}),{result:c,thoughts:"Successfully executed preset action with cache"}}async resolveTargetCacheWithTracing({logger:e,tracer:o,cache:n,retryWithinSmartWaiting:r=true}){let{resolvedTarget:i}=await o.startAsyncSpan("CACHE_RESOLUTION",async a=>{let s=Date.now(),l;for(;!r||Date.now()-s<3e3;)try{let c=await mre({target:n,driver:this.driver,stateManager:this.stateManager,logger:e,emulator:this.emulator});return a.attributes.serializedElement=(c.type==="NATIVE"?c.cache.elementOnlySerializedXml:void 0)??"Unknown element",{resolvedTarget:c}}catch(c){if(l=c,c instanceof Ne){if(!r)throw c;e.warn({err:c},"Failed to resolve target cache, retrying"),await Os(100,this.aborter.controller?.signal);continue}throw e.error({err:c},"Failed to resolve target cache"),c}throw l});return i}async wrapTargetingAction(e){let{tracer:o,logger:n,action:r,description:i,command:a,cacheKey:s="cache",targetName:l="target",cacheIsInvalidAfterResolution:c,skipFetchingFullWebviewContent:u=false,removeWebviewContent:d=false}=e,m={commandId:a.id},p=false,f,h;if(s==="cache"&&"cache"in a&&a.cache){let g=a.cache;l==="target"&&"target"in g?h=cloneDeep(g.target):l==="fromTarget"&&"fromTarget"in g?h=cloneDeep(g.fromTarget):l==="toTarget"&&"toTarget"in g&&(h=cloneDeep(g.toTarget));}if(a.disableCache&&(n.debug({command:a},"Cache explicitly disabled for command"),p=true,f="Cache explicitly disabled",h=void 0),c&&(p=true,f=f??"Cache invalidated after resolution",h=void 0),h&&!ru(h.resolvedDescription??"",i)&&(n.info({description:i,cacheDescription:h.resolvedDescription},"Cache description mismatch, clearing it automatically"),p=true,f="Description mismatch",h=void 0),h){let g=h.type==="NATIVE"?!!h.requirements:!!h.browserCache?.requirements;try{let b=await this.targetingActionWithCache({logger:n,tracer:o,action:r,command:a,cacheKey:s,targetName:l,cacheCopyForAttempt:h});return Qe.increment("cache_target_resolution_v2",1,["outcome:hit","platform:mobile-native",`hasRequirements:${g}`,`orgId:${this.orgId}`,"cliVersion:1.4.5"]),b}catch(b){if(this.throwIfAborted(),b instanceof O&&b.reason!=="InternalWebAgentError")throw n.error({err:b},"Failed to execute action with target cache (fatal)"),b;Qe.increment("cache_target_resolution_v2",1,["outcome:miss","platform:mobile-native",`hasRequirements:${g}`,`orgId:${this.orgId}`,"cliVersion:1.4.5"]),n.warn({err:b},"Failed to execute action with target cache, retrying with AI");}}return n.info({description:i,cacheBustedBeforeAction:p},"Prompting AI for a new element location"),await this.targetingActionWithAILocator({tracer:o,action:r,command:a,description:i,cacheKey:s,targetName:l,skipFetchingFullWebviewContent:u,removeWebviewContent:d,metadata:m,logger:n,cacheBustReason:f})}constructPerformerParams(){return {emulator:this.emulator,stateManager:this.stateManager,driver:this.driver,fixtures:this.fixtures,emulatorSettings:this.emulatorSettings,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 Zx=class extends nn{async doDrag(e,o,n,r,i){let{x1:a,y1:s,x2:l,y2:c}=n.bounds,u=a+(l-a)/2,d=s+(c-s)/2;o.attributes.startPoint={x:u,y:d};let{x1:m,y1:p,x2:f,y2:h}=r.bounds,g=m+(f-m)/2,b=p+(h-p)/2;o.attributes.endPoint={x:g,y:b};let y=i?.hoverDuration??500,T=i?.dragDuration??1e3;T===0&&(T=1);let E=Math.sqrt(Math.pow(g-u,2)+Math.pow(b-d,2))/T*1e3;await this.driver.executeInNativeContext(e,async P=>{await P.execute("mobile: dragFromToWithVelocity",{fromX:u,fromY:d,toX:g,toY:b,pressDuration:y/1e3,velocity:E,holdDuration:.5});},{operationName:"dragAndDrop"});}async executeDragAndDrop({logger:e,command:o}){let n=fe();if(o.fromTarget.type!=="description"||o.toTarget.type!=="description")throw new O("UserConfigurationError","Drag and drop only supports description targets for now");let r=o.fromTarget.description,{result:i,thoughts:a}=await this.wrapTargetingAction({command:o,tracer:n,description:r,cacheKey:"cache",targetName:"fromTarget",action:async u=>u,logger:e}),s=o.toTarget.description,{result:l,thoughts:c}=await this.wrapTargetingAction({command:o,tracer:n,description:s,cacheKey:"cache",targetName:"toTarget",action:async u=>u,logger:e});return await n.startAsyncSpan("EMULATOR_INTERACTION",async u=>{await this.doDrag(e,u,i,l,{hoverDuration:o.hoverDuration,dragDuration:o.dragDuration});},{name:"Drag and drop"}),{success:true,message:`${a}
5898
- ${c}`}}};var Qx=class{driver;logger;constructor(e,o){this.driver=e,this.logger=o;}async getTextContent(e){let o=e.cache.xPath;return o?await this.driver.executeInNativeContext(this.logger,async r=>{try{let a=(await r.findElement("xpath",o))[zi];if(!a)return "";let s=await r.getElementAttribute(a,"label"),l=await r.getElementAttribute(a,"value");return [s,l].filter(u=>!!u&&u.trim().length>0).join(" ").trim()}catch{return ""}},{operationName:"getNativeElementTextContent"})??"":""}async getAttribute(e,o){let n=e.cache.xPath;return n?await this.driver.executeInNativeContext(this.logger,async i=>{try{let s=(await i.findElement("xpath",n))[zi];return s?await i.getElementAttribute(s,o)??"":""}catch{return ""}},{operationName:"getNativeElementAttribute"})??"":""}async getTagName(e){let o=e.cache.xPath;return o?await this.driver.executeInNativeContext(this.logger,async r=>{try{let a=(await r.findElement("xpath",o))[zi];return a?await r.getElementTagName(a)??"":""}catch{return ""}},{operationName:"getNativeElementTagName"})??"":""}async isEditable(e){throw new O("UserConfigurationError","Editable checks are not supported on iOS native elements")}async isEnabled(e){let o=e.cache.xPath;return o?await this.driver.executeInNativeContext(this.logger,async n=>{try{let i=(await n.findElement("xpath",o))[zi];return i?await n.isElementEnabled(i):!1}catch{return false}},{operationName:"isNativeElementEnabled"}):false}async isFocused(e){let o=await this.getAttribute(e,"focused");return o==="true"||o==="1"}async getStyleProperty(e,o){throw new O("UserConfigurationError","Computed style checks are not supported on iOS native elements")}},eM=class{driver;webviewContext;logger;constructor(e,o,n){this.driver=e,this.webviewContext=o,this.logger=n;}getCenter(e){let{x1:o,y1:n,x2:r,y2:i}=e.bounds;return {x:(o+r)/2,y:(n+i)/2}}async getTextContent(e){let{x:o,y:n}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(i,a,s)=>{let l=document.elementFromPoint(a,s);return l?l.innerText??l.textContent??"":""},o,n)??""}async getAttribute(e,o){let{x:n,y:r}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(a,s,l,c)=>{let u=document.elementFromPoint(s,l);return u?u.getAttribute(c)??"":""},n,r,o)??""}async getTagName(e){let{x:o,y:n}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(i,a,s)=>{let l=document.elementFromPoint(a,s);return l?l.tagName:""},o,n)??""}async isEditable(e){let{x:o,y:n}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(i,a,s)=>{let l=document.elementFromPoint(a,s);if(!l)return false;let c=l.tagName;return c==="INPUT"||c==="TEXTAREA"||c==="SELECT"||l.isContentEditable},o,n)}async isEnabled(e){let{x:o,y:n}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(i,a,s)=>{let l=document.elementFromPoint(a,s);return l?!l.disabled:false},o,n)}async isFocused(e){let{x:o,y:n}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(i,a,s)=>{let l=document.elementFromPoint(a,s);return l?document.activeElement===l:false},o,n)}async getStyleProperty(e,o){let{x:n,y:r}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(a,s,l,c)=>{let u=document.elementFromPoint(s,l);return u?window.getComputedStyle(u).getPropertyValue(c):""},n,r,o)??""}};var RHe=5e3,tM=class extends nn{async executeElementCheck({logger:e,command:o}){let n=Date.now(),r=(o.timeout??_n)*1e3,i=r+1e4,a,s=0,l=500,c=cloneDeep(o.cache);if(o.target.type!=="description")throw new O("UserConfigurationError","x/y targets are not supported for the Element check step");for(;s-n<r;){if(Date.now()-n>i){e.warn("Exceeded max system timeout for element check, exiting...");break}if(this.throwIfAborted(),a=await this.executeElementCheckHelper({logger:e,command:o}),s=Date.now(),!a.success)o.cache=c,c=cloneDeep(c),await Te(l,this.abortSignal),l=Math.min(Math.floor(l*1.5),RHe);else return a}let u=await this.executeElementCheckHelper({logger:e,command:o,cacheIsInvalidAfterResolution:true});if(!u.success&&c&&o.cache){let d=CK({logger:e,originalTarget:YI(c)?c.target:void 0,newTarget:o.cache.target});d&&wl(c.target,d)&&(o.cache={target:d,updatedAt:o.cache.updatedAt});}return u}async executeElementCheckHelper({logger:e,command:o,cacheIsInvalidAfterResolution:n}){let r=fe();if(o.target.type!=="description")throw new O("UserConfigurationError","x/y targets are not supported for the Element check step");let i=jp(o.assertion);try{return (await this.wrapTargetingAction({...n?{cacheIsInvalidAfterResolution:n}:{},command:o,tracer:r,action:async s=>s.type==="NATIVE"?await this.executeNativeElementCheck(e,o,s):await this.executeWebviewElementCheck(e,o,s),description:o.target.description,logger:e})).result}catch(a){return i&&(a instanceof O&&a.reason==="NoMatchingElementError"||a instanceof ds)?{success:true}:{success:false,message:`Failed to evaluate element content assertion: ${a instanceof Error?a.message:`${a}`}`}}}async executeNativeElementCheck(e,o,n){let r=fe(),{assertion:i}=o;return await r.startAsyncSpan("ELEMENT_ASSERTION",async a=>{a.targetBounds=Hl(n);let s=await this.executeElementAssertion({assertion:i,element:n,elementPropertyAccessors:new Qx(this.driver,e),span:a});return a.result=s,s},{name:"Native element check"})}async executeWebviewElementCheck(e,o,n){let r=fe(),{assertion:i}=o,s=(await this.stateManager.getContexts(e)).webviews[0];if(!s)throw new O("UserConfigurationError","No active webview context found for element check");return await r.startAsyncSpan("ELEMENT_ASSERTION",async l=>{l.targetBounds=Hl(n);let c=await this.executeElementAssertion({assertion:i,element:n,elementPropertyAccessors:new eM(this.driver,s,e),span:l});return l.result=c,c},{name:"Webview element check"})}async executeElementAssertion({assertion:e,element:o,elementPropertyAccessors:n,span:r}){switch(e.type){case "ELEMENT_CONTENT":{let i=await n.getTextContent(o)??"";return r.attributes.elementTextContent=Xo(i,500,true),Hr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})?{success:true}:{success:false,message:`The content ${Wn(e)} '${e.value}': ${i}`}}case "ELEMENT_ATTRIBUTE":{let i=null;try{i=await n.getAttribute(o,e.attr);}catch{i=null;}if(!Hr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let a=Wn(e);return {success:false,message:`The attribute ${e.attr} ${a}${e.operation==="EXISTS"?"":` '${e.value}': ${i}`}`}}return {success:true}}case "ELEMENT_EXISTENCE":{let i=false;switch(e.condition){case "EDITABLE":i=await n.isEditable(o);break;case "VISIBLE":case "EXISTS":i=true;break;case "ENABLED":{i=await n.isEnabled(o);break}case "FOCUSED":i=await n.isFocused(o);break;default:throw e.condition,new Error("Unrecognized element condition type")}return i=e.negated?!i:i,i?{success:true}:{success:false,message:`The element ${Wn(e)}`}}case "ELEMENT_NAME":{let i=await n.getTagName(o);return Hr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:true})?{success:true}:{success:false,message:`The element tag name ${Wn(e)} '${e.value}': ${i}`}}case "ELEMENT_STYLE":{let i=await n.getStyleProperty(o,e.property);if(!Hr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let a=Wn(e);return {success:false,message:`The style property ${e.property} ${a}${e.operation==="EXISTS"?"":` '${e.value}': ${i}`}`}}return {success:true}}default:throw new Error("Unrecognized element assertion type")}}};async function fre({command:t,orgId:e,logger:o,fixtures:n,abortSignal:r}){let i;try{i=await fa({orgId:e,code:t.code,fragment:!1,context:n.testContext,timeoutMs:t.timeout?t.timeout*1e3:void 0,logger:o,localTools:n.localCodeEvalTools,signal:r});}catch(a){throw new O("ActionFailureError",a instanceof O?a.message:`${a}`,{errOptions:{cause:a}})}try{JSON.stringify(i);}catch(a){throw new O("UserConfigurationError",`Return value is not serializable: ${a instanceof Error?a.message:`${a}`}`)}return {success:true,output:i}}async function hre({command:t,emulator:e,abortSignal:o}){let n;switch(t.key){case "ENTER":n="enter";break;case "BACKSPACE":n="backspace";break;default:{t.key;return {success:true}}}let r=t.repeat??1,i=t.keyPressDelayMs??0;for(let a=0;a<r;a++)a>0&&i>0&&await Te(i,o),await e.pressKey(n);return {success:true}}var gre=w__default.object({name:w__default.string(),pid:w__default.number(),bundleId:w__default.string()});var Sh=class extends nn{async doPress(e,{name:o,longPress:n}){return this.driver.executeInNativeContext(e,r=>r.executeScript("mobile: pressButton",[{name:o,isLongPress:n}]),{operationName:"pressButton"})}};var xHe="com.apple.springboard",bre=5,nM=class extends nn{async execute(e){let o;for(let n=0;n<bre;n++){this.throwIfAborted();try{let i=await this.driver.executeInNativeContext(e,s=>s.executeScript("mobile: activeAppInfo",[]),{operationName:"getActiveAppInfo"});o=gre.parse(i).bundleId;}catch(i){throw new O("UserConfigurationError",`Failed to get active app info: ${i.message}`)}if(!o)return {success:true,message:"No active app found"};if(await new Sh(this.constructPerformerParams()).doPress(e,{name:"home"}),o!==xHe)return await this.emulator.terminateApp(o),{success:true};await Te(500,this.abortSignal);}throw new O("ActionFailureError",`Failed to dismiss notification after ${bre} attempts, cannot kill the underlying app`)}};var MHe="FBSApplicationLibrary) returned nil";function yre(t){return J(t).includes(MHe)}async function Sre({driver:t,logger:e,bundleId:o,launchArguments:n}){try{await t.executeInNativeContext(e,r=>r.execute("mobile: launchApp",{bundleId:o,arguments:n}),{operationName:"launchApp"});}catch(r){throw yre(r)?new Vn(`App "${o}" is not installed on the device. Install the app on the device before running this step, or update the step to reference a bundle ID that is installed.`,{cause:r}):r}}async function Tre({command:t,logger:e}){let o;try{o=new URL(t.url).hostname;}catch(l){throw new O("UserConfigurationError",`Invalid URL: ${l instanceof Error?l.message:`${l}`}`)}let n=new CookieJar,r=lLe(fetch,n),i=Date.now(),a=await _f({command:t,baseUrl:void 0,logger:e,fetchImplementation:r}),s=Gm(n,o);return {output:Du.parse({...a,cookies:s}),success:true,message:`Successfully executed request in ${Date.now()-i}ms`}}async function Ere({command:t,emulator:e,driver:o,logger:n,getViewportBounds:r}){return e.setOrientation?await e.setOrientation(t.orientation):await o.executeInNativeContext(n,async i=>{await i.setOrientation(t.orientation==="LANDSCAPE"?"landscape":"portrait");},{operationName:"setOrientation"}),{success:true,output:{newViewportBounds:await r()}}}var _He=5e3,rM=class extends nn{async executeScreenCheck(e,o){let{timeout:n}=o,r=Date.now(),i=(n??_n)*1e3,a=i+1e4,s=0,l=500;for(;s-r<i;){if(Date.now()-r>a){e.warn("Exceeded max system timeout for screen check, exiting...");break}this.throwIfAborted();let c=await this.executeScreenCheckHelper(e,o);if(s=Date.now(),!c.success)await Te(l,this.abortSignal),l=Math.min(Math.floor(l*1.5),_He);else return c}return await this.executeScreenCheckHelper(e,o)}async executeScreenCheckHelper(e,o){let n=await this.executeNativeScreenCheckHelper(e,o);if(!o.assertion.negated&&n.success)return n;let r=await this.executeWebviewScreenCheckHelper(e,o);return r?o.assertion.negated?n.success&&r.success?n:n.success?r:n:n.success?n:r:n}async executeNativeScreenCheckHelper(e,o){let{assertion:n}=o;switch(n.type){case "CONTENT":try{let i=(await this.stateManager.getDomState(e,{skipFetchingFullWebviewContent:!0,removeWebviewContent:!0,filterOffscreenElements:!1})).graph.xml;if(!i)throw new Error("Failed to get screen XML");let a=i.includes(n.value)===!n.negated;return i.length>1e4&&(i=i.slice(0,1e4)+"...TRUNCATED"),a?{success:!0}:{success:!1,message:`The screen ${Vp({...n,negated:!n.negated})}.`}}catch(r){if(FT(r))throw r;return {success:false,message:`Failed to evaluate screen content assertion: ${r instanceof Error?r.message:`${r}`}`}}default:return n.type,{success:false,message:`Unsupported screen check assertion type: ${n.type}`}}}async executeWebviewScreenCheckHelper(e,o){let n;try{if(n=await this.stateManager.getActiveWebview(e),!n)return}catch(i){e.warn({err:i},"Failed to get active webview context during screen check");return}let{assertion:r}=o;switch(r.type){case "CONTENT":try{return await this.driver.executeWebViewScript(e,n,(a,s,l)=>document.body.innerHTML.includes(s)===!l,r.value,!!r.negated)?{success:!0}:{success:!1,message:`The webview ${Vp({...r,negated:!r.negated})}.`}}catch(i){e.warn({err:i},"Failed to check webview content during screen check");return}default:return}}};var OHe=.9,Wl=.2,qS=10,DHe=500;function uB(t,e){t.attributes.scrollableElementType=e.type,t.attributes.scrollableElementDisplay=fl(e),e.type==="CUSTOM"&&(t.attributes.scrollableElementDescription=e.target.description);}var Th=class extends nn{async getHardcodedScrollableElementBounds(e,o){let n;switch(e.type){case "SCREEN":n=this.getContainerBoundsFromViewport(o);break;case "OPEN_APP":n=this.getContainerBoundsFromViewport(o);break;case "OPEN_WEBVIEW":{n=this.getContainerBoundsFromViewport(o);break}default:{throw new Error("If Typescript complains about the line above, you missed a switch case")}}return n}getContainerBoundsFromViewport(e){return {left:e.x,top:e.y,width:e.width,height:e.height}}getContainerBoundsFromBounds(e){let o=e.x1,n=e.y1,r=e.x2,i=e.y2,a=r-o,s=i-n;return {left:o,top:n,width:a,height:s}}async executeSwipe({logger:e,command:o}){let n=fe(),r=fl(o.scrollableElement);if(o.scrollableElement.type==="CUSTOM_COORDINATES"){let{startX:a,startY:s,deltaPixels:l}=o.scrollableElement;return Math.abs(l)<qS?{success:true,message:"Successfully executed swipe action"}:(await n.startAsyncSpan("EMULATOR_INTERACTION",async c=>{uB(c,o.scrollableElement),await this.performRawSwipe({logger:e,span:c,startX:a,startY:s,deltaPixels:l,direction:o.direction,durationMs:o.durationMs});},{name:`Swipe ${o.direction} in ${r}`}),{success:true,message:"Successfully executed swipe action"})}if(o.scrollableElement.type!=="CUSTOM"){let a=await this.driver.executeInNativeContext(e,async l=>l.getWindowRect(),{operationName:"getSwipeViewportRect"}),s=await this.getHardcodedScrollableElementBounds(o.scrollableElement,a);return await n.startAsyncSpan("EMULATOR_INTERACTION",async l=>{uB(l,o.scrollableElement),await this.swipeByAbsoluteCoordinates({logger:e,span:l,direction:o.direction,percent:o.viewportPercent,durationMs:o.durationMs,containerBounds:s,relativePosition:o.relativePosition?bo(o.relativePosition):void 0});},{name:`Swipe ${o.direction} in ${r}`}),{success:true,message:"Successfully executed swipe action"}}let{thoughts:i}=await this.wrapTargetingAction({command:o,description:o.scrollableElement.target.description,action:async a=>fe().startAsyncSpan("EMULATOR_INTERACTION",async l=>(uB(l,o.scrollableElement),this.scrollInNativeContainer({logger:e,span:l,cmd:o,target:a})),{name:`Swipe ${o.direction} in ${r}`}),tracer:n,logger:e});return {success:true,message:i}}async scrollInNativeContainer({logger:e,span:o,cmd:n,target:r}){let i=r.bounds,a=this.getContainerBoundsFromBounds(i);await this.swipeByAbsoluteCoordinates({logger:e,span:o,direction:n.direction,percent:n.viewportPercent,durationMs:n.durationMs,containerBounds:a,relativePosition:n.relativePosition?bo(n.relativePosition):void 0});}async swipeByAbsoluteCoordinates({logger:e,span:o,direction:n,percent:r=OHe,durationMs:i,containerBounds:a,relativePosition:s}){o.attributes.containerBounds=a;let l=n==="up"||n==="down",c=a.width*Wl,u=a.height*Wl,d=l?(a.height-2*u)*r:(a.width-2*c)*r,m,p,f;if(s)m=a.left+s.x,p=a.top+s.y,f=d;else {let h=this.calculateSwipeCoordinates({containerBounds:a,direction:this.invertDirection(n),desiredDelta:d});m=h.startX,p=h.startY,f=h.actualDelta;}await this.performRawSwipe({logger:e,span:o,startX:m,startY:p,deltaPixels:f,direction:n,durationMs:i});}calculateSwipeCoordinates({containerBounds:e,direction:o,desiredDelta:n}){let r=e.left+e.width/2,i=e.top+e.height/2;if(o==="up"||o==="down"){let a=e.height*Wl,s=e.top+a,l=e.top+e.height-a,c=l-s,u=Math.min(Math.abs(n),c),d=c-u,m=o==="down"?l-d/2:s+d/2;return {startX:r,startY:m,actualDelta:u}}else {let a=e.width*Wl,s=e.left+a,l=e.left+e.width-a,c=l-s,u=Math.min(Math.abs(n),c),d=c-u;return {startX:o==="right"?l-d/2:s+d/2,startY:i,actualDelta:u}}}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({logger:e,span:o,startX:n,startY:r,deltaPixels:i,direction:a,durationMs:s=300}){let l=Math.abs(i);if(l<qS)return;let c=Math.max(2,Math.round(s)),u=Math.max(1,Math.min(120,Math.floor(c*.25))),d=Math.max(1,c-u),m=Math.min(l/2,Math.min(12,Math.max(l*.05,1))),p=n,f=r,h=n,g=r;a==="up"||a==="down"?(f=a==="up"?r-l:r+l,h=p,g=a==="up"?f+m:f-m):(p=a==="left"?n-l:n+l,h=a==="left"?p+m:p-m,g=f),o.attributes.pixelDelta=l,o.attributes.startPoint={x:n,y:r},o.attributes.endPoint={x:p,y:f},o.attributes.durationMs=c,await this.driver.executeInNativeContext(e,async b=>{let y={type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:n,y:r},{type:"pointerDown",button:0},{type:"pause",duration:300},{type:"pointerMove",duration:d,x:h,y:g},{type:"pointerMove",duration:u,x:p,y:f},{type:"pause",duration:300},{type:"pointerUp",button:0}]};await b.performActions([y]),await b.releaseActions();},{operationName:"performRawSwipe"}),await Te(DHe,this.abortSignal);}};var vre=20,dB=.9,LHe=2,Eh=.5,mB=.2;function kHe(t){return t.type==="NATIVE"&&t.scrollDetails!==void 0}var iM=class extends Th{async executeScrollTo({logger:e,command:o}){let n=o.target.description,r=o.scrollStepPercent??dB,i=await this.tryUseCachedScrollPosition(e,o,n);return i||this.searchForElement({logger:e,cmd:o,description:n,scrollStepPercent:r})}async resolveContainer({logger:e,scrollableElement:o,containerCache:n}){let r=await this.driver.executeInNativeContext(e,async c=>c.getWindowRect(),{operationName:"getScrollContainerViewportRect"});if(o.type==="CUSTOM_COORDINATES")return {bounds:{left:0,top:0,width:r.width,height:r.height},diffThresholdPercent:Eh};if(o.type!=="CUSTOM")return {bounds:await this.getHardcodedScrollableElementBounds(o,r),diffThresholdPercent:Eh};let i=fe(),a=o.target.description;if(n){let c=this.getBoundsFromNativeCache(n);return e.info({bounds:c},"Got container bounds from native cache"),{bounds:c,cache:n,diffThresholdPercent:Sf({containerBounds:c,viewport:r,defaultThresholdPercent:Eh})}}let{resolvedTarget:s}=await this.findElement({logger:e,description:a,tracer:i});if(s.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(s.cache);return e.info({bounds:l},"Got container bounds from AI"),{bounds:l,cache:s.cache,diffThresholdPercent:Sf({containerBounds:l,viewport:r,defaultThresholdPercent:Eh})}}getBoundsFromNativeCache(e){if(!e.bounds||e.bounds.length<4)throw new O("ActionFailureError","Native target cache has no bounds");let[o,n,r,i]=e.bounds;return {left:o,top:n,width:r-o,height:i-n}}async tryUseCachedScrollPosition(e,o,n){let r=o.cache?.target;if(r){if(r.type==="WEBVIEW")return await this.tryUseWebviewCache(e,o,n);if(kHe(r))return this.tryUseNativeScrollCacheHelper(e,o,n,r)}}async tryUseWebviewCache(e,o,n){let r=fe();try{let{thoughts:i}=await this.wrapTargetingAction({logger:e,command:o,tracer:r,description:n,action:async a=>{if(a.type!=="WEBVIEW")throw new Error("Expected WEBVIEW target but got NATIVE");await this.scrollWebviewTargetIntoView({logger:e,target:a});}});return {success:!0,message:i}}catch(i){e.warn({err:i},"Failed to use webview scroll-to cache, falling back to search");return}}async tryUseNativeScrollCacheHelper(e,o,n,r){let i=r.scrollDetails,a=fe(),s=o.scrollStepPercent??dB,l=i.scrollableElement.type==="CUSTOM"&&i.scrollableElement.cache?.type==="NATIVE"?i.scrollableElement.cache:void 0,c=await this.resolveContainer({logger:e,scrollableElement:o.scrollableElement,containerCache:l}),u=c.bounds,d=c.diffThresholdPercent,m=wre(o.scrollableElement),p=m?Math.abs(m.deltaPixels):this.calculateSwipeCoordinates({containerBounds:u,direction:o.direction,desiredDelta:js({containerBounds:u,containerInsetRatio:Wl})*s}).actualDelta,f=await this.stateManager.getLastObservedState();if(f){let E=await this.tryFindElement({logger:e,cmd:o,description:n,tracer:a,scrollDetails:this.buildScrollDetails(o,0,c.cache),knownState:f,useAIIfCacheFails:false});if(E)return e.info("Element resolved from last observed state without scrolling"),E}else e.debug("Skipping scroll-to preflight because no last observed state is available");let h=Math.abs(i.pixelDelta),g=0,b=p*LHe,y=0;for(;y<h;){this.throwIfAborted();let E=h-y,P=Math.min(E,b),M=await this.scrollByPixelDelta({logger:e,pixelDelta:P,scrollableElement:o.scrollableElement,containerCache:c.cache,direction:o.direction,scrollStepPercent:s,useVisualDiff:false});if(M===0)break;y+=M,g+=o.direction==="down"?M:-M;let I=await this.tryFindElement({logger:e,cmd:o,description:n,tracer:a,scrollDetails:this.buildScrollDetails(o,g,c.cache),useAIIfCacheFails:false});if(I)return e.info({cumulativePixelDelta:g},"Element resolved during cache replay"),I}let T=Math.max(0,Math.min(o.maxScrollAttempts??vre,2)),v=true;for(let E=0;E<T&&v;E++){this.throwIfAborted(),v=await this.scrollByPage({logger:e,direction:o.direction,containerBounds:u,scrollStepPercent:s,diffThresholdPercent:d,rawCoordinates:m}),v&&(g+=o.direction==="down"?p:-p);let P=await this.tryFindElement({logger:e,cmd:o,description:n,tracer:a,scrollDetails:this.buildScrollDetails(o,g,c.cache),useAIIfCacheFails:false});if(P)return e.info({attempt:E,cumulativePixelDelta:g},"Element resolved during cache buffer scroll"),P}if(g!==0){let E=o.direction==="down"?"up":"down";e.info({cumulativePixelDelta:g,originalDirection:o.direction,undoDirection:E,scrollableElementType:o.scrollableElement.type},"Cache replay did not resolve target; undoing scroll"),await this.scrollByPixelDelta({logger:e,pixelDelta:Math.abs(g),scrollableElement:o.scrollableElement,containerCache:c.cache,direction:E,scrollStepPercent:s});}}async tryFindElement({logger:e,cmd:o,description:n,tracer:r,scrollDetails:i,useAIIfCacheFails:a=true,knownState:s}){let l,c,u=false,d=i,m=Cre(o.cache?.target);if(m&&m.type==="NATIVE"&&m.resolvedDescription!==void 0&&ru(m.resolvedDescription,n)&&!o.disableCache)try{l=s?await r.startAsyncSpan("CACHE_RESOLUTION",async h=>{let g=await lB({target:m,logger:e,document:s.emulatorState.graph.originalDocument});return h.attributes.serializedElement=g.cache.elementOnlySerializedXml??"Unknown element",{resolvedTarget:g}}).then(({resolvedTarget:h})=>h):await this.resolveTargetCacheWithTracing({logger:e,tracer:r,cache:m,retryWithinSmartWaiting:!1}),u=!0,c="Successfully resolved scroll to target with cache.",e.info("Successfully resolved scroll to target from cache");}catch(f){e.warn({err:f},"Failed to resolve target from cache");}if(l&&u&&i){let f=await this.correctNativeTargetIntoView({logger:e,tracer:r,cmd:o,resolvedTarget:l,scrollDetails:i});d=f.scrollDetails,f.resolvedTarget?l=f.resolvedTarget:(l=void 0,u=false);}if(!l&&!a)return null;if(!l)try{let f=LA(n),h=await this.findElement({logger:e,description:f,tracer:r,knownState:s,metadata:{commandId:o.id,source:"SCROLL_TO"}});if(h.resolvedTarget.type==="WEBVIEW")return await this.scrollWebviewTargetIntoView({logger:e,target:h.resolvedTarget}),sm({command:o,updatedCache:am(h.resolvedTarget),updatedWithAI:!0,logger:e}),{success:!0,message:h.thoughts};if(h.resolvedTarget.type!=="NATIVE")return null;l=h.resolvedTarget,c=h.thoughts;}catch(f){if(f instanceof O&&f.reason==="NoMatchingElementError")return null;throw e.warn({err:f},"Failed to find scroll-to target with AI"),f}if(l&&!u&&i)try{let f=await this.correctNativeTargetIntoView({logger:e,tracer:r,cmd:o,resolvedTarget:l,scrollDetails:i});d=f.scrollDetails,f.resolvedTarget&&(l=f.resolvedTarget);}catch(f){e.warn({err:f},"Failed to reposition AI-resolved scroll-to target for stable cache generation");}return sm({command:o,updatedCache:Cre({...am(l),...d?{scrollDetails:d}:{}}),updatedWithAI:!u,logger:e}),{success:true,message:c}}async scrollWebviewTargetIntoView({logger:e,target:o}){let n=await this.stateManager.getActiveWebview(e);if(!n)throw new Error("ActionFailureError: Found webview element for scroll_to, but no active webview context is available.");let r=o.cache.browserCache?.generatedSelectors;if(!r?.length)throw new Error("ActionFailureError: Found webview element for scroll_to, but the element has no webview selector cache.");let i=Object.keys(o.cache.browserCache?.requirements?.attributes??{});if(!await this.driver.executeWebViewScript(e,n,(s,l,c)=>{let u=s.resolveWebviewTargetCache({selectors:l,attributesToFetch:c});if(!u)return false;for(let d of u.workingSelectors){let m=document.querySelector(d);if(m)return m.scrollIntoView({block:"center",inline:"nearest"}),true}return false},r,i))throw new Error("ActionFailureError: Found webview element for scroll_to, but could not resolve the element using its webview selector cache.")}async correctNativeTargetIntoView({logger:e,tracer:o,cmd:n,resolvedTarget:r,scrollDetails:i}){let a=await this.getCorrectiveScrollForTarget({logger:e,resolvedTarget:r});if(!a)return {resolvedTarget:r,scrollDetails:i};e.info({bounds:r.bounds,correction:a},"Repositioning scroll-to target to the preferred viewport anchor");let s=i.scrollableElement.type==="CUSTOM"&&i.scrollableElement.cache?.type==="NATIVE"?i.scrollableElement.cache:void 0,l=await this.scrollByPixelDelta({logger:e,pixelDelta:a.pixelDelta,scrollableElement:i.scrollableElement,containerCache:s,direction:a.direction,scrollStepPercent:n.scrollStepPercent??dB,useVisualDiff:true});if(l===0)return e.info({bounds:r.bounds,correction:a},"Skipping corrective scroll update because the viewport did not move"),{resolvedTarget:r,scrollDetails:i};let c;try{c=await this.resolveTargetCacheWithTracing({logger:e,tracer:o,cache:r.cache,retryWithinSmartWaiting:!1});}catch(h){return e.warn({err:h},"Failed to re-resolve scroll-to target after corrective scroll"),{resolvedTarget:r,scrollDetails:i}}let u=r.bounds,d=c.bounds;if(u.x1===d.x1&&u.y1===d.y1&&u.x2===d.x2&&u.y2===d.y2)return e.info({bounds:r.bounds,correction:a,appliedCorrectionPixels:l},"Skipping corrective scroll update because the target did not move (viewport at scroll extent)"),{resolvedTarget:c,scrollDetails:i};let p={...i,pixelDelta:nA({currentPixelDelta:i.pixelDelta,baseDirection:i.direction,correctionDirection:a.direction,correctionPixels:l})},f=await this.getCorrectiveScrollForTarget({logger:e,resolvedTarget:c});return f?(e.warn({bounds:c.bounds,correction:f},"Corrective scroll did not bring the scroll-to target into the preferred viewport anchor"),{resolvedTarget:c,scrollDetails:p}):{resolvedTarget:c,scrollDetails:p}}async searchForElement({logger:e,cmd:o,description:n,scrollStepPercent:r}){let i=fe(),a=await this.resolveContainer({logger:e,scrollableElement:o.scrollableElement});return this.scrollAndSearch({logger:e,cmd:o,description:n,tracer:i,scrollStepPercent:r,resolvedContainer:a})}async scrollAndSearch({logger:e,cmd:o,description:n,tracer:r,scrollStepPercent:i,resolvedContainer:a}){let s=0,l=a.bounds,c=a.diffThresholdPercent,u=wre(o.scrollableElement),d=u?Math.abs(u.deltaPixels):this.calculateSwipeCoordinates({containerBounds:l,direction:o.direction,desiredDelta:js({containerBounds:l,containerInsetRatio:Wl})*i}).actualDelta,m=true,p=o.maxScrollAttempts??vre;for(let g=0;g<p;g++){this.throwIfAborted();let b=this.buildScrollDetails(o,s,a.cache),y=await this.tryFindElement({logger:e,cmd:o,description:n,tracer:r,scrollDetails:b});if(y)return y;if(!m)throw new Error(`ActionFailureError: Could not find element "${n}" after scrolling to the end`);e.debug({attempt:g,cumulativePixelDelta:s},"Element not found, scrolling further"),m=await this.scrollByPage({logger:e,direction:o.direction,containerBounds:l,scrollStepPercent:i,diffThresholdPercent:c,rawCoordinates:u}),s+=o.direction==="down"?d:-d;}let f=this.buildScrollDetails(o,s,a.cache),h=await this.tryFindElement({logger:e,cmd:o,description:n,tracer:r,scrollDetails:f});if(h)return h;throw new Error(`ActionFailureError: Could not find element "${n}" after ${p} scroll attempts`)}buildScrollDetails(e,o,n){return e.scrollableElement.type==="CUSTOM"?{pixelDelta:o,scrollableElement:{type:"CUSTOM",target:e.scrollableElement.target,cache:n},direction:e.direction}:e.scrollableElement.type==="CUSTOM_COORDINATES"?{pixelDelta:o,scrollableElement:e.scrollableElement,direction:e.direction}:{pixelDelta:o,scrollableElement:e.scrollableElement,direction:e.direction}}async scrollByPage({logger:e,direction:o,containerBounds:n,scrollStepPercent:r,diffThresholdPercent:i,rawCoordinates:a}){return fe().startAsyncSpan("EMULATOR_INTERACTION",async l=>(l.attributes.containerBounds=n,l.attributes.direction=o,(await this.executeScrollGesture({logger:e,span:l,direction:o,containerBounds:n,scrollStepPercent:r,diffThresholdPercent:i,rawCoordinates:a})).canScrollMore),{name:`Scroll ${o} by one page`})}async scrollByPixelDelta({logger:e,pixelDelta:o,scrollableElement:n,containerCache:r,direction:i,scrollStepPercent:a,useVisualDiff:s=false}){if(Math.abs(o)<qS)return 0;let l=fe(),c,u=Eh,d,m,p;if(n.type==="CUSTOM_COORDINATES")d=n.startX,m=n.startY,p=n.deltaPixels;else {c=await this.resolveContainer({logger:e,scrollableElement:n,containerCache:r});let g=c.bounds;u=c.diffThresholdPercent;let b=js({containerBounds:g,containerInsetRatio:Wl})*a,y=this.calculateSwipeCoordinates({containerBounds:g,direction:i,desiredDelta:b});d=y.startX,m=y.startY,p=y.actualDelta;}let f=Math.ceil(Math.abs(o)/p),h=this.invertDirection(i);return e.debug({pixelDelta:o,swipeDirection:h,scrollableElementType:n.type,startX:d,startY:m,maxScrollPerStep:p,numScrolls:f},"scrollByPixelDelta calculated parameters"),l.startAsyncSpan("EMULATOR_INTERACTION",async g=>{g.attributes.pixelDelta=o,g.attributes.numScrolls=f,g.attributes.maxScrollPerStep=p,g.attributes.startX=d,g.attributes.startY=m;let b=0;for(let y=0;y<f;y++){this.throwIfAborted();let T=Math.abs(o)-b,v=Math.min(p,T);if(s){let E=await this.executeScrollGesture({logger:e,span:g,direction:i,containerBounds:c?.bounds,scrollStepPercent:a,diffThresholdPercent:u,rawCoordinates:{type:"CUSTOM_COORDINATES",startX:d,startY:m,deltaPixels:v}});if(E.didScroll&&(b+=v),!E.canScrollMore)break}else {if(v<qS)break;await this.performRawSwipe({logger:e,span:g,startX:d,startY:m,deltaPixels:v,direction:h}),b+=v;}}return g.attributes.appliedPixels=b,b},{name:`Scroll ${i} by ${Math.abs(o)}px`})}async getCorrectiveScrollForTarget({logger:e,resolvedTarget:o}){let n=o.bounds,r=await this.stateManager.getViewportBounds(e),i=Math.max(1,r.bottom-r.top),a=r.top+i*mB,s=r.bottom-i*mB,l=rA({viewportTop:r.top,viewportBottom:r.bottom,elementHeight:n.y2-n.y1,targetTopRatio:mB}),c=n.y1>=r.top&&n.y2<=r.bottom,u=n.y1<a||n.y2>s,d=await this.isResolvedTargetVisible({logger:e,resolvedTarget:o}),m=l-n.y1;if(!(c&&d!==false&&!u)){if(m>0)return {direction:"up",pixelDelta:m};if(m<0)return {direction:"down",pixelDelta:Math.abs(m)}}}async isResolvedTargetVisible({logger:e,resolvedTarget:o}){if(o.type==="WEBVIEW")return null;let n=o.cache.xPath;if(!n)return Are(o.cache.elementOnlySerializedXml);let r=await this.getTargetVisibilityFromDriver({logger:e,xPath:n});return r!==null?r:Are(o.cache.elementOnlySerializedXml)}async getTargetVisibilityFromDriver({logger:e,xPath:o}){try{return await this.driver.executeInNativeContext(e,async n=>{let i=(await n.findElement("xpath",o))?.[zi];if(!i)return null;let a=await n.getElementAttribute(i,"visible");return a?a!=="false":null},{operationName:"getScrollToTargetVisibility"})}catch{return null}}async executeScrollGesture({logger:e,span:o,direction:n,containerBounds:r,scrollStepPercent:i,diffThresholdPercent:a=Eh,rawCoordinates:s}){let l=await this.stateManager.getRawScreenshotBase64({logger:e}),c,u,d;if(s)c=s.startX,u=s.startY,d=s.deltaPixels;else {if(!r)throw new Error("Expected container bounds for scroll gesture");let g=js({containerBounds:r,containerInsetRatio:Wl})*i,b=this.calculateSwipeCoordinates({containerBounds:r,direction:n,desiredDelta:g});c=b.startX,u=b.startY,d=b.actualDelta;}await this.performRawSwipe({logger:e,span:o,startX:c,startY:u,deltaPixels:d,direction:this.invertDirection(n)});let m=await this.stateManager.getRawScreenshotBase64({logger:e}),p=Yc(l,m),f=p>a,h=p>a;return e.debug({diffPercent:p,didScroll:f,diffThresholdPercent:a,canScrollMore:h,direction:n,actualDelta:d,rawCoordinates:s},"Scroll gesture visual diff result"),{didScroll:f,canScrollMore:h}}};function Cre(t){return !t||t.type!=="NATIVE"?t:iA(t)}function wre(t){if(t.type==="CUSTOM_COORDINATES")return t}function Are(t){if(!t)return null;let e=t.match(/\bvisible="(true|false)"/);return e?e[1]==="true":null}function FHe(t){return "iterations"in t}function BHe(t){let e={relativePosition:t.relativePosition?bo(t.relativePosition):void 0},o=t.iterations??(t.doubleTap?2:void 0),n=t.tapDelayMs??t.doubleTapDelayMs;if(o!==void 0&&(!Number.isInteger(o)||o<1))throw new O("UserConfigurationError","iterations must be a positive integer");if(n!==void 0&&(!Number.isInteger(n)||n<0))throw new O("UserConfigurationError","tapDelayMs must be >= 0");if(o&&o>1&&t.longPress)throw new O("UserConfigurationError","Cannot specify both more than one tap iteration and long press at the same time");if(n!==void 0&&(!o||o<2))throw new O("UserConfigurationError","tapDelayMs requires iterations >= 2");if(t.longPress){if(n!==void 0)throw new O("UserConfigurationError","tapDelayMs cannot be used with longPress");return {...e,longPress:true,longPressDurationMs:t.longPressDurationMs}}return o!==void 0?{...e,iterations:o,tapDelayMs:n}:e}var vh=class extends nn{async tapOnAbsoluteCoordinates(e,o){let n=o.x,r=o.y;if(e.info({x:n,y:r},"Tap at coordinates"),"longPress"in o&&o.longPress){let i=(o.longPressDurationMs??2e3)/1e3;await this.driver.executeInNativeContext(e,a=>a.executeScript("mobile: touchAndHold",[{x:n,y:r,duration:i}]),{operationName:"touchAndHold"});return}if(FHe(o)){let i=o.tapDelayMs??100;for(let a=0;a<o.iterations;a++)await this.emulator.tap(n,r),a<o.iterations-1&&await Te(i);return}await this.emulator.tap(n,r);}async tapOnTarget({logger:e,target:o,options:n,targetBounds:r=Hl(o)}){return await fe().startAsyncSpan("EMULATOR_INTERACTION",async a=>{a.attributes.options=n;let{x1:s,y1:l,x2:c,y2:u}=o.bounds,d=c-s,m=u-l,p=n?.relativePosition?.x??d/2,f=n?.relativePosition?.y??m/2;p=Math.max(0,Math.min(p,d)),f=Math.max(0,Math.min(f,m));let h=s+p,g=l+f;await this.tapOnAbsoluteCoordinates(e,{x:h,y:g,...n}),a.attributes.point={x:h,y:g},a.targetBounds=r;},{name:"Tap on target"})}async executeTap({logger:e,command:o}){let n=BHe(o),r=fe();if(o.target.type==="coordinates"||o.target.type==="absolute_percent"){let s=await this.driver.executeInNativeContext(e,async u=>u.getWindowSize(),{operationName:"getTapWindowSize"}),l,c;return o.target.type==="coordinates"?(l=o.target.xPercent*s.width,c=o.target.yPercent*s.height):(l=o.target.x/100*s.width,c=o.target.y/100*s.height),await r.startAsyncSpan("EMULATOR_INTERACTION",async u=>{await this.tapOnAbsoluteCoordinates(e,{...n,x:l,y:c}),u.attributes.point={x:l,y:c};},{name:`Tap at coordinates ${l}, ${c}`}),{success:true,message:`Tapped at ${l}, ${c}`}}let i=o.target.description,{thoughts:a}=await this.wrapTargetingAction({logger:e,tracer:r,command:o,action:s=>this.tapOnTarget({logger:e,target:s,options:n}),description:i});return {success:true,message:a}}};function Rre(t,e,o){let n=t.resolveWebviewTargetCache({selectors:e,attributesToFetch:o});if(!n)return {cleared:false,reason:"target_not_found"};let r=a(n.workingSelectors);if(!r)return {cleared:false,reason:"editable_not_found"};c(r,"");let i=l(r);return {cleared:i==="",reason:i===""?void 0:"still_non_empty",textLength:i.length};function a(u){for(let d of u){let m=document.querySelector(d);if(!m)continue;let p=s(m);if(p)return p;m instanceof HTMLElement&&(m.click(),m.focus());let f=s(document.activeElement);if(f)return f}}function s(u){if(u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement||u instanceof HTMLElement&&u.isContentEditable)return u}function l(u){return u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement?u.value:u.textContent??""}function c(u,d){if(u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement){let m=u instanceof HTMLTextAreaElement?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,p=Object.getOwnPropertyDescriptor(m,"value")?.set;p?p.call(u,d):u.value=d;}else u.textContent=d;u.dispatchEvent(new InputEvent("input",{bubbles:true,inputType:"deleteContentBackward"})),u.dispatchEvent(new Event("change",{bubbles:true}));}}var lm=25,xre=150,UHe=2,Mre=1500,Pre=100,zHe=6e3,$He=100,VHe=24,jHe=4,Ire="\uE003",HHe=new Set(["XCUIElementTypeTextField","XCUIElementTypeSecureTextField","XCUIElementTypeTextView","TextField","SecureTextField","TextView"]),aM=class extends nn{async doType(e,o){let n=fe();if(!o.target){if(o.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(e,o),{success:true,message:"Successfully executed type action"}}if(o.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Type step");let{thoughts:r}=await this.wrapTargetingAction({logger:e,tracer:n,command:o,action:async i=>{await this.doTypeHelper(e,o,i);},description:o.target.description});return {success:true,message:r}}async doTypeHelper(e,o,n){let r=new vh(this.constructPerformerParams()),i=Hl(n);o.clearContent&&await this.clearContent(e,o,n,r,i),await this.shouldTapToFocusTarget(e,n)&&await r.tapOnTarget({logger:e,target:n,options:{},targetBounds:i}),await this.ensureKeyboardOpen(e,n,r,i),await this.injectKeys(e,o);}async shouldTapToFocusTarget(e,o){return o.type==="WEBVIEW"?await this.shouldTapWebviewTarget(e,o):await this.shouldTapNativeTarget(e,o)}async shouldTapWebviewTarget(e,o){let n=await this.releaseCompetingWebviewFocus(e,o);return !(n.targetFocused||!n.targetResolved&&await this.isKeyboardOpen(e))}async shouldTapNativeTarget(e,o){let n=await this.resolveNativeTargetFocus(e,o);return !(n.resolved&&n.focused||!n.resolved&&await this.isKeyboardOpen(e))}async ensureKeyboardOpen(e,o,n,r){if(!await this.waitForKeyboard(e)){for(let i=0;i<UHe;i++)if(this.throwIfAborted(),e.info({attempt:i+1},"Keyboard did not open after tapping the target, re-tapping to recover"),await n.tapOnTarget({logger:e,target:o,options:{},targetBounds:r}),await this.waitForKeyboard(e))return;throw new Error("The system keyboard never opened after tapping the target, so the typed text would not be entered")}}async sendKeys(e,o){await this.waitForKeyboard(e),await this.injectKeys(e,o);}async waitForKeyboard(e){return await fe().startAsyncSection("Waiting for system keyboard to settle",async(n,r)=>{let i=Date.now()+zHe;for(;Date.now()<i;){if(this.throwIfAborted(),await this.waitForKeyboardSettle(e,i))return r.attributes.settleMs=Mre,true;await Te(Pre,this.aborter.controller?.signal);}return r.attributes.timedOut=true,false})}async waitForKeyboardSettle(e,o){if(!await this.isKeyboardOpen(e))return false;let n=Date.now()+Mre;for(;Date.now()<n;){if(this.throwIfAborted(),Date.now()>=o||!await this.isKeyboardOpen(e))return false;await Te(Math.min(Pre,n-Date.now()),this.aborter.controller?.signal);}return true}async isKeyboardOpen(e){return await this.driver.executeInNativeContext(e,o=>o.isKeyboardShown(),{operationName:"isKeyboardShown"})}async injectKeys(e,o){let n=fe(),r=o.keyPressDelayMs??lm;r<=0&&(r=lm),await n.startAsyncSpan("EMULATOR_INTERACTION",async()=>{try{r!==lm&&await this.driver.executeInNativeContext(e,async a=>a.updateSettings({maxTypingFrequency:1e3/r}),{operationName:"updateKeyInjectionDelay"});let i=[];for(let a=0;a<o.text.length;a+=xre)i.push(o.text.slice(a,a+xre));for(let a of i)await this.driver.executeInNativeContext(e,async s=>{await s.performActions(WHe(a)),await s.releaseActions();},{operationName:"typeText",maxAttempts:1,attemptTimeoutMs:cA(r,a)});}finally{r!==lm&&await this.driver.executeInNativeContext(e,async i=>i.updateSettings({maxTypingFrequency:1e3/lm}),{operationName:"resetKeyInjectionDelay"});}},{name:`Typing "${o.text}"${r?` with a ${r}ms delay`:""}`});}async clearContent(e,o,n,r,i){if(n.type==="WEBVIEW"){await this.clearWebviewContent(e,o,n,r,i);return}switch(o.replaceStrategy??"auto"){case "auto":await this.clearContentAutomatically(e,n,r,i);return;case "programmatic":await this.clearContentWithProgrammatic(n,e,{verify:false});return;case "long-press":await this.clearContentWithSelectAll(e,n,r,i);return;case "backspace":await this.clearContentWithBackspace(n,e,r,i);return}}async clearWebviewContent(e,o,n,r,i){switch(o.replaceStrategy??"auto"){case "long-press":await this.clearWebviewWithLongPress(e,n,r,i);return;case "programmatic":await this.clearWebviewProgrammatically(e,n);return;case "backspace":await this.clearWebviewWithBackspaceOnly(e,n,r,i);return;case "auto":await this.clearWebviewAutomatically(e,n,r,i);return}}async clearWebviewWithLongPress(e,o,n,r){if(!await this.clearContentWithSelectAll(e,o,n,r))throw new Error("ActionFailureError: Could not clear the iOS webview input with long-press Select All.")}async clearWebviewProgrammatically(e,o){if(!await this.clearWebviewContentWithDom(e,o))throw new Error("ActionFailureError: Could not clear the iOS webview input programmatically.")}async clearWebviewWithBackspaceOnly(e,o,n,r){if(!await this.clearWebviewContentWithBackspace(e,o,n,r))throw new Error("ActionFailureError: Could not clear the iOS webview input before typing.")}async clearWebviewAutomatically(e,o,n,r){if(!await this.clearWebviewContentWithDom(e,o)&&!await this.clearContentWithSelectAll(e,o,n,r)&&!await this.clearWebviewContentWithBackspace(e,o,n,r))throw new Error("ActionFailureError: Could not clear the iOS webview input before typing.")}async clearWebviewContentWithDom(e,o){let n=await this.stateManager.getActiveWebview(e);if(!n)throw new Error("ActionFailureError: Found webview element for type, but no active webview context is available.");let r=o.cache.browserCache?.generatedSelectors;if(!r?.length)throw new Error("ActionFailureError: Found webview element for type, but the element has no webview selector cache.");let i=Object.keys(o.cache.browserCache?.requirements?.attributes??{});return await fe().startAsyncSection("Clearing webview content programmatically",async(s,l)=>{let c=await this.driver.executeWebViewScript(e,n,Rre,r,i);return l.attributes.result=c,c.cleared})}async releaseCompetingWebviewFocus(e,o){let n=await this.stateManager.getActiveWebview(e);if(!n)return {targetResolved:false,targetFocused:false};let r=o.cache.browserCache?.generatedSelectors;if(!r?.length)return {targetResolved:false,targetFocused:false};let i=Object.keys(o.cache.browserCache?.requirements?.attributes??{});return await fe().startAsyncSection("Releasing focus from the competing webview element before typing",async(s,l)=>{let c=await this.driver.executeWebViewScript(e,n,(u,d,m)=>{let p=u.resolveWebviewTargetCache({selectors:d,attributesToFetch:m}),f=p?g(p.workingSelectors):void 0;if(!f)return {targetResolved:false,targetFocused:false,blurred:false};let h=document.activeElement;if(h===f)return {targetResolved:true,targetFocused:true,blurred:false};if(h instanceof HTMLElement)return h.blur(),{targetResolved:true,targetFocused:false,blurred:true};return {targetResolved:true,targetFocused:false,blurred:false};function g(y){for(let T of y){let v=b(document.querySelector(T));if(v)return v}}function b(y){if(y instanceof HTMLInputElement||y instanceof HTMLTextAreaElement||y instanceof HTMLElement&&y.isContentEditable)return y}},r,i);return l.attributes.result=c,{targetResolved:c.targetResolved,targetFocused:c.targetFocused}})}async resolveNativeTargetFocus(e,o){if(o.type!=="NATIVE")return {resolved:false};let n=o.cache.xPath;if(!pB(o)||!n)return {resolved:false};try{return await this.driver.executeInNativeContext(e,async r=>{let a=(await r.findElement("xpath",n))[zi];if(!a)return {resolved:!1};let s=await r.getElementAttribute(a,"focused");return {resolved:!0,focused:s==="true"||s==="1"}},{operationName:"readNativeTargetFocusState",maxAttempts:1})}catch(r){return e.debug({err:r},"Failed to read native target focus state before typing"),{resolved:false}}}async clearWebviewContentWithBackspace(e,o,n,r){let i=await this.readWebviewTargetText(o,e);return i===void 0?(e.debug("Skipping webview backspace clear because the target text is not readable"),false):i===""?true:(await n.tapOnTarget({logger:e,target:o,options:{},targetBounds:r}),await this.waitForKeyboard(e)?this.clearTextWithAdaptiveBackspace({logger:e,initialLength:i.length,readText:()=>this.readWebviewTargetText(o,e),spanName:"Clearing webview content with bounded backspaces",operationName:"backspaceClearWebviewTextInput"}):false)}async clearContentAutomatically(e,o,n,r){let i=await this.readNativeTargetText(o,e);i===""||(i!==void 0||_re(o))&&await this.clearContentWithProgrammatic(o,e,{verify:true})||await this.clearContentWithSelectAll(e,o,n,r)||await this.clearContentWithBackspace(o,e,n,r);}async clearContentWithSelectAll(e,o,n,r){await n.tapOnTarget({logger:e,target:o,options:{longPress:true},targetBounds:r});let i=fe();try{return await i.startAsyncSection("Clearing any content from the focused field",()=>this.clearContentHelper(e)),!0}catch(a){return e.warn({err:a},"Failed to find select all button, continuing..."),false}}async clearContentHelper(e){await this.driver.executeInNativeContext(e,async o=>{let n=o.$('-ios predicate string:label == "Select All"');await n.waitForExist({timeout:750}),await n.click();},{operationName:"selectAllText",maxAttempts:1}),await this.driver.executeInNativeContext(e,async o=>{await o.keys([Ire]);},{operationName:"deleteSelectedText"});}async clearContentWithProgrammatic(e,o,n){if(!_re(e))return false;let r=e.cache.xPath;if(!r)return false;let i=fe();try{if(await i.startAsyncSection("Clearing content programmatically",()=>this.driver.executeInNativeContext(o,async s=>{await(await s.$(r)).clearValue();},{operationName:"clearNativeTextInput",maxAttempts:1})),!n.verify)return !0;let a=await this.readNativeTargetText(e,o);return a===void 0||a===""}catch(a){return o.warn({err:a},"Failed to clear native input programmatically, falling back..."),false}}async clearContentWithBackspace(e,o,n,r){let i=await this.readNativeTargetText(e,o);return i===void 0?(o.debug("Skipping native backspace clear because the target text is not readable"),false):i===""?true:(await n.tapOnTarget({logger:o,target:e,options:{},targetBounds:r}),this.clearTextWithAdaptiveBackspace({logger:o,initialLength:i.length,readText:()=>this.readNativeTargetText(e,o),spanName:"Clearing content with bounded backspaces",operationName:"backspaceClearNativeTextInput"}))}async clearTextWithAdaptiveBackspace({logger:e,initialLength:o,readText:n,spanName:r,operationName:i}){return await fe().startAsyncSection(r,async(s,l)=>{let c=o,u=1,d=0,m=0;for(let p=0;p<VHe;p++){let f=$He-d;if(f<=0)break;let g=p===0||m>0?1:Math.max(1,Math.min(Math.ceil(c/2),Math.floor(c/u),f));e.info({round:p,lengthBefore:c,keysToIssue:g,maxUnitsPerKey:u},"Issuing bounded backspaces"),await this.driver.executeInNativeContext(e,async T=>{await T.keys(Array.from({length:g},()=>Ire));},{operationName:i,maxAttempts:1}),d+=g;let b;for(let T=0;T<jHe&&(b=await n(),b===void 0);T++);if(b===void 0)return false;let y=c-b.length;if(e.info({round:p,lengthAfter:b.length,deleted:y,totalKeys:d},"Bounded backspace iteration result"),b.length===0)return l.attributes.totalKeys=d,true;if(y<=0){if(m+=1,m>=2)return false;c=b.length;continue}m=0,u=Math.max(u,Math.ceil(y/g)),c=b.length;}return l.attributes.totalKeys=d,false})}async readNativeTargetText(e,o){if(e.type!=="NATIVE")return;let n=e.cache.xPath;if(!(!pB(e)||!n))try{return await this.driver.executeInNativeContext(o,async r=>{let a=(await r.findElement("xpath",n))[zi];return !a||await r.getElementTagName(a)==="XCUIElementTypeSecureTextField"?void 0:await r.getElementAttribute(a,"value")??""},{operationName:"readNativeTextInputValue",maxAttempts:1})}catch(r){o.debug({err:r},"Failed to read native input text for clear verification");return}}async readWebviewTargetText(e,o){let n=await this.stateManager.getActiveWebview(o);if(!n)return;let r=e.cache.browserCache?.generatedSelectors;if(!r?.length)return;let i=Object.keys(e.cache.browserCache?.requirements?.attributes??{});try{return await this.driver.executeWebViewScript(o,n,(s,l,c)=>{let u=s.resolveWebviewTargetCache({selectors:l,attributesToFetch:c});if(u)for(let d of u.workingSelectors){let m=document.querySelector(d);if(m instanceof HTMLInputElement||m instanceof HTMLTextAreaElement)return m.value;if(m instanceof HTMLElement&&m.isContentEditable)return m.textContent??""}},r,i)}catch(a){o.debug({err:a},"Failed to read webview input text for clear verification");return}}};function _re(t){if(t.type!=="NATIVE"||!pB(t)||!t.cache.xPath)return false;let e=t.cache.elementOnlySerializedXml;if(!e)return false;for(let o of HHe)if(e.includes(`<${o}`))return true;return false}function pB(t){return t.cache.sourceTree!=="native"}function WHe(t){let e={type:"key",id:"pressKeys",actions:[]};for(let o of [...t])e.actions.push({type:"keyDown",value:o},{type:"keyUp",value:o});return [e]}var sM=class extends nn{async executeVisualDiff({logger:e,command:o,updateGoldenFiles:n}){let r=this.fixtures.visualDiffGoldenStorage;await this.stateManager.waitForScreenshotStability({logger:e,timeoutMs:1e4,reason:"visual diff",signal:this.abortSignal});let i=await this.stateManager.getRawScreenshotBase64({logger:e});return lA({goldenStorage:r,command:o,currentScreenshotBase64:i,threshold:o.threshold??Og,updateGoldenFiles:n,tracer:fe(),logger:e})}};async function Ore({command:t,abortSignal:e}){return await Te(t.timeoutSecs*1e3,e),{success:true}}async function GHe(t,e){try{await t.executeInNativeContext(e,o=>o.executeScript("mobile: pressButton",[{name:"home"}]),{operationName:"pressHomeButton"}),e.info("Navigated to home screen");}catch(o){e.warn({err:o},"Failed to press home button");}}var fB=["io.appium."],hB=["com.facebook.WebDriverAgentRunner.xctrunner"];async function qHe(t,e){let o;try{o=await t.listApps();}catch(a){e.warn({err:a},"Failed to list installed apps");return}let n=o.filter(({bundleId:a})=>!hB.includes(a)&&!fB.some(s=>a.startsWith(s)));e.info({count:n.length},"Terminating all apps");let i=(await Promise.allSettled(n.map(async a=>{try{return await t.terminateApp(a.bundleId),a.bundleId}catch(s){return e.debug({err:s,bundleId:a.bundleId},"Failed to terminate app (may not be running)"),null}}))).filter(a=>a.status==="fulfilled"&&a.value!==null).length;i>0&&e.info({count:i},"Terminated apps");}async function KHe(t,e){e.info("Resetting privacy settings for all apps");try{await t.resetSettings();}catch(o){e.warn({err:o},"Failed to reset privacy settings");}}async function Dre(t){let{emulator:e,driver:o,logger:n}=t;await GHe(o,n),await qHe(e,n),await KHe(e,n);}var wu=class t extends nn{emulatorSettings;logger;splitInstalledApps(e){let o=[],n=[];for(let{bundleId:r}of e)if(!(hB.includes(r)||fB.some(i=>r.startsWith(i)))){if(r.startsWith("com.apple.")){n.push(r);continue}o.push(r);}return {installedApps:o,prunedApps:n}}constructor(e){super(e),this.logger=e.logger,this.emulatorSettings=e.emulatorSettings;}async locateElement({description:e}){let o=await this.findElement({logger:this.logger,tracer:fe(),description:e,metadata:{source:"EDITOR_LOCATE"}});return {bounds:Hl(o.resolvedTarget),thoughts:o.thoughts}}static async init({driver:e,logger:o,fixtures:n,orgId:r,options:i,abortController:a,emulator:s,generator:l,aiSettings:c}){let u={controller:a},d=i?.emulator??{},m=await Yx.init({driver:e,orgId:r,emulator:s,options:d,aborter:u}),p=new t({generator:l,aiSettings:c,emulator:s,driver:e,stateManager:m,logger:o,fixtures:n,aborter:u,orgId:r,emulatorSettings:d});return await p.initializeSettings(),p}async executeCommand(e){let o=["type","a11yData","thoughts","cache","code"],n;try{n=await Af({obj:e.command,context:this.fixtures.testContext,bannedKeys:o,orgId:this.orgId,logger:this.logger,signal:this.abortSignal,localTools:this.fixtures.localCodeEvalTools});}catch(r){throw this.throwIfAborted(),new Error(`ActionFailureError: Failed to substitute template strings in command: ${r.message}`,{cause:r})}try{let r=await this.executeCommandHelper(e);return !r.success&&(e.command.type==="SCREEN_CHECK"||e.command.type==="ELEMENT_CHECK")?{...r,message:_T(r.message)}:r}catch(r){throw r.name!=="AbortError"&&this.logger.error({err:r},"Error thrown in action controller"),r}finally{Rf(e.command,n);}}async executeCommandHelper({command:e,updateGoldenFiles:o}){switch(e.type){case "TAP":return new vh(this.constructPerformerParams()).executeTap({logger:this.logger,command:e});case "SWIPE":return new Th(this.constructPerformerParams()).executeSwipe({logger:this.logger,command:e});case "DRAG_AND_DROP":return new Zx(this.constructPerformerParams()).executeDragAndDrop({logger:this.logger,command:e});case "SCROLL_TO":return new iM(this.constructPerformerParams()).executeScrollTo({logger:this.logger,command:e});case "TYPE":return new aM(this.constructPerformerParams()).doType(this.logger,e);case "STATE":{let n=await this.stateManager.getDomState(this.logger),r=await this.stateManager.getContexts(this.logger);return {output:{xml:n.graph.xml,contexts:r},success:true}}case "OPEN_APP":{let n=[];if(e.intentExtras)try{let r=JSON.parse(e.intentExtras);n=w__default.string().array().parse(r);}catch(r){throw new Vn(`Invalid launch arguments: expected a JSON array of strings. ${J(r)}`)}return await Sre({driver:this.driver,logger:this.logger,bundleId:e.packageName,launchArguments:n}),{success:true}}case "KILL_APP":return new nM(this.constructPerformerParams()).execute(this.logger);case "PRESS":{let n=new Sh(this.constructPerformerParams());switch(e.key){case "HOME":await n.doPress(this.logger,{name:"home"});break;case "POWER":await this.driver.executeInNativeContext(this.logger,r=>r.isLocked(),{operationName:"isLocked"})?await this.driver.executeInNativeContext(this.logger,r=>r.unlock(),{operationName:"unlockDevice"}):await this.driver.executeInNativeContext(this.logger,r=>r.lock(),{operationName:"lockDevice"});break}return {success:true}}case "PRESS_KEYBOARD":return hre({command:e,emulator:this.emulator,abortSignal:this.abortSignal});case "AI_CHECK":return Jne({command:e,logger:this.logger,generator:this.generator,aiSettings:this.aiSettings,getEmulatorDomState:()=>this.getEmulatorDomState(),getScreenshotBase64:()=>this.getScreenshotBase64(),throwIfAborted:()=>this.throwIfAborted(),abortSignal:this.abortSignal});case "AI_EXTRACT":return Zne({command:e,logger:this.logger,generator:this.generator,aiSettings:this.aiSettings,getEmulatorDomState:()=>this.getEmulatorDomState(),getScreenshotBase64:()=>this.getScreenshotBase64(),abortSignal:this.abortSignal});case "JAVASCRIPT":return fre({command:e,orgId:this.orgId,logger:this.logger,fixtures:this.fixtures,abortSignal:this.abortSignal});case "WAIT":return Ore({command:e,abortSignal:this.aborter.controller?.signal});case "VISUAL_DIFF":return new sM(this.constructPerformerParams()).executeVisualDiff({logger:this.logger,command:e,updateGoldenFiles:o});case "REQUEST":return Tre({command:e,logger:this.logger});case "ROTATE_ORIENTATION":return Ere({command:e,emulator:this.emulator,driver:this.driver,logger:this.logger,getViewportBounds:()=>this.getViewportBounds()});case "ADD_FILE":{let n=await Qw(e.file);return await this.driver.executeInNativeContext(this.logger,r=>r.pushFile(e.storageLocation,n),{attemptTimeoutMs:12e4,operationName:"pushFile"}),{success:true}}case "SCREEN_CHECK":return new rM(this.constructPerformerParams()).executeScreenCheck(this.logger,e);case "ELEMENT_CHECK":return new tM(this.constructPerformerParams()).executeElementCheck({logger:this.logger,command:e});case "APPIUM_EXECUTE":{let n=JSON.parse(e.jsonArgs??"{}"),r=await this.driver.executeInNativeContext(this.logger,async i=>i.execute(e.command,n),{attemptTimeoutMs:6e4,maxAttempts:1,operationName:"userAppiumExecuteOperation"});return this.logger.info({output:r},"Appium command executed successfully"),{success:true,output:r,message:"Appium command executed successfully"}}default:{let n=e;throw new Error(`Unsupported mobile command type: ${n}`)}}}async getMobileFailureRecoveryPlan(){return {thoughts:"Failure recovery is not yet supported for iOS.",scenario:"INELIGIBLE",instructions:void 0}}async waitForPageSourceStability(e){await this.stateManager.waitForPageSourceStability({logger:this.logger,timeoutMs:e.timeoutMs??5e3,reason:e.reason,signal:this.aborter.controller?.signal});}async getInstalledApps(){let e=await this.emulator.listApps();return this.splitInstalledApps(e)}async initializeSettings(){let{latitude:e,longitude:o}=this.emulatorSettings?.geolocation??Am;await this.driver.executeInNativeContext(this.logger,async n=>{await n.setGeoLocation({latitude:e,longitude:o}),await n.updateSettings({pageSourceExcludedAttributes:"visible,accessible",maxTypingFrequency:1e3/lm,reduceMotion:true});},{operationName:"initializeDeviceSettings"});}async getScreenshotBase64(){return this.stateManager.getRawScreenshotBase64({logger: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(this.logger)}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 softReset(){await Dre({emulator:this.emulator,driver:this.driver,logger:this.logger}),this.fixtures.testContext.resetToInitial();}async cleanup(){}get abortSignal(){return this.aborter.controller?.signal}get context(){return this.fixtures.testContext}get localCodeEvalTools(){return this.fixtures.localCodeEvalTools}};function Ch({appFolderPath:t,source:e,overrideBaseDir:o}){let n=t?.trim();if(!n)return;if(e==="default")return n;let r=e==="override"&&o&&!Oo__default.isAbsolute(n)?Oo__default.resolve(o,n):Oo__default.resolve(n);if(e==="override"&&(!Bn__default.existsSync(r)||!Bn__default.statSync(r).isDirectory()))throw new Vn(`Local iOS app path "${r}" does not exist. Provide a valid directory path.`);return r}var JHe=3;async function Lre(t){let{results:e,fixtures:o,work:n}=t,{logger:r}=o,i=e[e.length-1],a=QHe(i,n);if(a)return r.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}`,shortMessage:a};r.info({failedResult:i},"Attempting failure recovery"),n.state.failureRecoveryAttempts=(n.state.failureRecoveryAttempts??0)+1;try{return await ZHe(t)}catch(s){return r.warn({err:s},"Error during failure recovery attempt, continuing..."),null}}async function ZHe(t){let{fixtures:e,results:o,failedStep:n,nextSteps:r,stepTracer:i,work:a,containerParentChain:s}=t,{controller:l,logger:c}=e,u=i.parentTracer,{testMetadata:d}=t.inputs;if(!o.length)throw new Error("Attempted failure recovery with no failed results");let m=s.length>0,p=m&&a.topLevelResults?[...a.topLevelResults,...o]:o,f=m&&a.fullTestSteps?kre(a.fullTestSteps,s):[],h=[...r,...f],g=await l.getScreenshotPngString(),b=await l.getEmulatorDomState(),{results:y}=await WC(c,u,p,{numStepsWithScreenshots:5,addIndices:true,includeBeforeScreenshots:false,screenshotMediaType:"image/png"}),T=h.map(j=>sa(j)),v=d.description.trim(),E=d?.settings?.ai?.failureRecoveryInstructions?.trim()||void 0,{scenario:P,thoughts:M,instructions:I,reasonSummary:A}=await l.getMobileFailureRecoveryPlan({currentScreenshot:g,failedResults:y,currentScreenXml:b,nextStepsSerialized:T,testDescription:v,customInstructions:E});if(P!=="RECOVERABLE")return c.info({scenario:P,thoughts:M,instructions:I},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${M}`,shortMessage:A?.trim()||void 0};if(!I)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let k={id:randomUUID(),type:"MOBILE_AI_ACTION_STEP",text:I},_,H=a.state.failureRecoveryDisabled;H||(a.state.failureRecoveryDisabled=true),c.info("executing mobile step list");try{_=await t.executeMobileStepList({...t,fixtures:{...t.fixtures},listParams:{steps:[k,n],containerName:"AI-recovered step list",tracer:u}});}finally{H||(a.state.failureRecoveryDisabled=H);}let V=_.results[0];if(V&&V.type==="MOBILE_AI_ACTION_STEP")if(jb({results:_.results,onPresetAction:j=>{j.aiSuggested=true;},onModule:j=>{j.aiSuggested=true;},onAiAction:j=>{j.aiSuggested=true;}}),_.status==="SUCCESS"){let j=`The following steps were automatically executed by the failure recovery agent. Analysis: ${M}`;return V.message=j,V.failureRecoveryReason=M,Qe.increment("test_event",1,["name:failure_recovery_success","platform:native",`orgId:${t.inputs.orgId}`]),c.info({thoughts:M},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:_,message:j}}else {Qe.increment("test_event",1,["name:failure_recovery_failure","platform:native",`orgId:${t.inputs.orgId}`]);let j=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${M}`;return V.message=j,V.failureRecoveryReason=M,V.status="FAILED",c.info({thoughts:M},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:_,message:j}}return null}function kre(t,e){if(e.length===0)return [];let o=e[0],n=t.findIndex(a=>a.id===o);if(n===-1)return [];let r=t.slice(n+1);if(e.length===1)return r;let i=t[n];return i.type!=="RESOLVED_MOBILE_MODULE"?r:[...kre(i.steps,e.slice(1)),...r]}function QHe(t,e){if(!t)return "There is no failed result";if(t.type!=="MOBILE_PRESET_STEP")return "The failed step is not a preset action";let o=t.message;return o?o.includes("AbortError:")?"The user aborted the test":Lz.some(n=>o.includes(n))?"The failed step is an irrecoverable configuration error":(e.state.failureRecoveryAttempts??0)>JHe?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}async function lM({fixtures:t,step:e,inputs:o,stepTracer:n,work:r}){let i=Date.now(),{logger:a,controller:s}=t,l,c="",u,d=s.emulatorSettings?.disableXmlSnapshots??true;if(!o.interactive){if(r.lastScreenshot&&Date.now()-r.lastScreenshot.capturedAtMs<500)l=r.lastScreenshot.screenshot,c=r.lastScreenshot.snapshotId;else {c=randomUUID();try{l=Buffer.from(await s.getScreenshotBase64(),"base64");}catch(h){a.warn({err:h},"Failed to take before screenshot");}}if(!d)if(r.lastScreenXml)u=r.lastScreenXml.screenXml;else try{u=await s.getEmulatorDomState();}catch(h){a.debug({err:h},"Failed to capture before XML snapshot");}}let m=fD(e.command,a),p=cloneDeep(m?.cache??{}),f={...e,status:"SUCCESS",startTime:i,endTime:Date.now()};try{let h=await s.executeCommand({command:e.command,updateGoldenFiles:o.updateGoldenFiles});f={...e,status:h.success?"SUCCESS":"FAILED",message:h.message,startTime:i,endTime:Date.now(),data:h.output};}catch(h){s.isAborted()?f={...e,status:"CANCELLED",message:"Step cancelled.",startTime:i,endTime:Date.now()}:(a.error({err:h},"Failed to execute preset step"),f={...e,status:"FAILED",message:J(h),startTime:i,endTime:Date.now()});}finally{if(!o.interactive){l&&(f.beforeSnapshot=c,n.attachBeforeScreenshot({snapshotId:c,screenshot:l}),!d&&u&&n.attachBeforeXmlSnapshot({snapshotId:c,xml:u}));let b=randomUUID();try{let y=await s.getScreenshotBase64();f.afterSnapshot=b;let T=Buffer.from(y,"base64");n.attachAfterScreenshot({snapshotId:b,screenshot:T}),r.lastScreenshot={capturedAtMs:Date.now(),snapshotId:b,screenshot:T};}catch(y){a.warn({err:y},"Failed to take after screenshot"),r.lastScreenshot=void 0;}if(!d)try{let y=await s.getEmulatorDomState();n.attachAfterXmlSnapshot({snapshotId:b,xml:y}),r.lastScreenXml={snapshotId:b,screenXml:y};}catch(y){a.debug({err:y},"Failed to capture after XML snapshot"),r.lastScreenXml=void 0;}}let h="cache"in e.command?e.command.cache??{}:{};f.status==="FAILED"&&vK({logger:a,step:e,originalAndroidCommandCache:m});let g=diff(p,h);g&&Object.keys(g).length>0&&a.info({diffs:Dm(g)},"Updated cache");}return f}async function oWe(t,e,o){let{logger:n,controller:r}=t.fixtures,{stepTracer:i}=t.conditionalParams,a=e.assertion.command;try{let s=await lM({...t,step:e.assertion,stepTracer:i}),l=a.type;switch(l){case "AI_CHECK":case "SCREEN_CHECK":case "ELEMENT_CHECK":return s.status==="SUCCESS"?{type:"passed",conditionResult:s,steps:e.steps}:(n.info(s.message,`${a.type} mobile condition ${o} resolved to false`),{type:"failed",conditionResult:s});case "JAVASCRIPT":{if(s.status!=="SUCCESS")return {type:"execution_error",conditionResult:s};let c=!!s.data;return s.status=c?"SUCCESS":"FAILED",s.message=c?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,n.info({returnValue:s.data,conditionPassed:c},`JavaScript mobile condition ${o} evaluated`),c?{type:"passed",conditionResult:s,steps:e.steps}:{type:"failed",conditionResult:s}}default:return (u=>{throw new Error(`Unsupported mobile conditional command type: ${u}`)})(l)}}catch(s){n.error({err:s},`Mobile condition ${o} failed with error`);let l=s instanceof Error?s.message:"Unknown error during mobile condition evaluation";return {type:"execution_error",conditionResult:{...e.assertion,status:"FAILED",message:l,startTime:Date.now(),endTime:Date.now()}}}finally{r.throwIfAborted();}}function nWe({step:t,fromStepId:e,conditionalChain:o,fromStepParentChain:n}){let r=n.slice(o.length+1);for(let i=0;i<t.blocks.length;i++){let a=t.blocks[i],{result:s}=_c(a.steps,e,r);if(s)return i}return -1}async function Bre(t){let e=Date.now(),{logger:o}=t.fixtures,{fromStep:n}=t.inputs,{step:r,stepTracer:i,executeMobileStepList:a}=t.conditionalParams,s=i.getParentStepIdChain(),l=!!n&&sK(s,n.parentStepIdChain),c=r.elseSteps,u=true,d=[],m,p=false;if(l&&n){let y=nWe({step:r,fromStepId:n.fromStepId,conditionalChain:s,fromStepParentChain:n.parentStepIdChain});y>=0&&(c=r.blocks[y].steps,u=false,p=true,o.info(`Skipping mobile conditional assertion (execution starts from block ${y}), running ${c.length} steps`));}if(!p)for(let y=0;y<r.blocks.length;y++){o.info(`Evaluating mobile condition ${y} in conditional step`);let T=r.blocks[y],v=await oWe(t,T,y);if(d.push(v.conditionResult),m=v.conditionResult,v.type==="execution_error"){let E=v.conditionResult.status==="CANCELLED"?"CANCELLED":"FAILED",P={...r,assertionResult:v.conditionResult,steps:[],startTime:e,endTime:Date.now(),status:E,message:v.conditionResult.message};return Di({result:P,...Oi(d)}),P}if(v.type==="passed"){o.info(`Mobile condition ${y} resolved to true, executing ${v.steps.length} steps`),u=false,c=v.steps;break}}if(!c){o.warn("No mobile conditions resolved to true and no else block was provided, skipping conditional step body");let y={...r,assertionResult:m,steps:[],status:"SUCCESS",startTime:e,endTime:Date.now(),data:d[d.length-1]?.data,message:d[d.length-1]?.message};return Di({result:y,...Oi(d)}),y}u&&o.info("No mobile conditions resolved to true, executing the else block steps"),o.info(`Executing ${c.length} steps in selected mobile conditional block`);let f=await i.startSubSteps(),{results:h,status:g}=await a({...t,listParams:{steps:c,containerName:"mobile conditional block",tracer:f}}),b={...r,assertionResult:m,steps:h,status:g,startTime:e,endTime:Date.now()};return Di({result:b,...Oi([...d,...h])}),b}async function Ure(t){let e=Date.now(),o=t.fixtures.controller;try{return await rWe(t)}catch(n){let r=o.isAborted();return {...t.moduleParams.step,steps:[],type:"MOBILE_MODULE_STEP",startTime:e,endTime:Date.now(),status:r?"CANCELLED":"FAILED",message:r?"Step cancelled.":J(n)}}}async function rWe({moduleParams:t,...e}){let o=Date.now(),{step:n,stepTracer:r,executeMobileStepList:i}=t,{controller:a,logger:s}=e.fixtures,l=await iWe({step:n,params:e});Object.keys(l).length>0&&(a.context.setInputs(l),s.info(Oc({json:{inputs:l,moduleId:n.moduleId},maxJsonStringSize:1e3}),"Set mobile module inputs"));let c={};Object.entries(l).forEach(([f,h])=>{c[f]=JSON.stringify(h);});let u={...n,type:"MOBILE_MODULE_STEP",inputs:c,startTime:o,steps:[],endTime:Date.now(),status:"SUCCESS"},d=await r.startSubSteps(),{status:m,results:p}=await i({...e,listParams:{steps:n.steps,containerName:`module ('${n.name}')`,tracer:d}});return u.steps=p,u.status=m,u.endTime=Date.now(),Di({result:u,...Oi(p)}),u}async function iWe({step:t,params:e}){let o={},{logger:n,controller:r}=e.fixtures;for(let i of t.parameters?.parameterNames??[]){let a=t.inputs?.[i]??t.parameters?.defaultParameters?.[i];if(!a){n.warn({k:i},"No value found for parameter in module");continue}o[i]=await fa({orgId:e.inputs.orgId,code:a,fragment:true,logger:n,context:r.context,localTools:r.localCodeEvalTools});}return o}var nl="finish",yB=w__default.object({message:w__default.string(),success:w__default.boolean()}),KS=3,zre=`You forgot to call ${nl}. Review the prior conversation and return only the JSON object that should have been passed as the ${nl} input. The object must include exactly the fields: "message" (a string describing what was accomplished or why you stopped) and "success" (a boolean indicating whether the goal was achieved).`,YS=t=>{let e=tool({description:"Signal that the AI action has reached a terminal state (either success or failure).",inputSchema:yB,toModelOutput:({output:o})=>o,execute:async({message:o,success:n})=>{let{contextManager:r,logger:i}=t;return i.info({finishMessage:o,success:n},"AI action tool called (finish)"),r.finalState={message:o,status:n?"SUCCESS":"FAILED"},{type:"content",value:[{type:"text",text:"Done"}]}}});return {name:nl,tool:e}};var $re=["TAP","TYPE","PRESS","PRESS_KEYBOARD","SWIPE","SCROLL_TO","AI_CHECK","AI_EXTRACT","ELEMENT_CHECK","SCREEN_CHECK","WAIT","OPEN_APP","KILL_APP","DRAG_AND_DROP","ROTATE_ORIENTATION","JAVASCRIPT"],sWe=[...$re,"OPEN_NOTIFICATION_DRAWER"],lWe=$re,cM={ANDROID:sWe,IOS:lWe};function cWe(t,e){return e!==void 0&&cM[t].includes(e)}function uM({platform:t,input:e,logger:o,tempCaches:n}){let r=US(e);if(!cWe(t,r.stepType))throw new Error(`Unsupported AI Action V3 step type: ${r.stepType}. Supported types: ${cM[t].join(", ")}`);let i=hx(r,t);if(i.type!=="MOBILE_PRESET_STEP")throw new Error(`AI Action V3 only supports preset steps, got: ${i.type}`);if(r.disableCache&&r.cacheId&&o.warn({cacheId:r.cacheId},"--disable-cache was provided with --cache-id; disable cache flag is taking precedent and the cache id will be ignored."),r.cacheId&&!r.disableCache&&ea(t,i.command)){let a=n[r.cacheId];a?i.command.cache=a.cache:o.warn({cacheId:r.cacheId,commandType:i.command.type},"Temp mobile cache not found for AI action V3 step");}return i}function wh(t){let{id:e,cache:o,...n}=t;return JSON.stringify(n)}function Au(t){if(t.length===0)return "Generated cached steps: (none)";let e=t.map((o,n)=>` ${n}: ${wh(o.command)}`).join(`
5897
+ }`);return a.execute(s,...r)},{operationName:"executeWebViewScript"});if(i&&typeof i=="object"&&"_failed"in i)throw new Error(`Error executing script in webview: ${i._error||"Unknown error"}`);return i}async healthcheck(){await this.driver.getWindowHandle();}};async function Ine({logger:t,driverLogLevel:e="error",emulator:o,callbacks:n,emulatorSettings:r}){let{onStatusUpdate:i}=n,a=t.child({emulatorName:o.name}),s={platformName:"iOS","appium:noReset":true,"appium:fullReset":false,"appium:shouldTerminateApp":false,"appium:forceAppLaunch":false,"appium:autoLaunch":false,"appium:newCommandTimeout":3600,"appium:autoWebview":false,"appium:webviewConnectTimeout":500,"appium:webviewConnectRetries":5,"appium:includeSafariInWebviews":true,"appium:fullContextList":false,"appium:additionalWebviewBundleIds":["*"],"appium:waitForIdleTimeout":0,"appium:reduceMotion":true,"appium:settings":{customSnapshotTimeout:0,animationCoolOffTimeout:0},...o.extraCapabilities,...r?.autoAcceptAlerts!=null&&{"appium:autoAcceptAlerts":r.autoAcceptAlerts},...r?.autoDismissAlerts!=null&&{"appium:autoDismissAlerts":r.autoDismissAlerts},...r?.locale!=null&&BE(r.locale)};i("Starting Appium session");let l={capabilities:s},c=await Ux.init({logger:a,logLevel:e,callbacks:{...n,restartWda:o.restartWda?async u=>{await o.restartWda?.(u);}:void 0,onFailure:async({err:u,attempt:d})=>{let m=oA(u),p=d<3&&m;return p&&a.warn({err:u},"Appium driver manifest race detected on first attempt, restarting Appium and retrying"),{shouldRetry:p}}},wdioOpts:l});return a.info({capabilities:s,emulatorName:o.name},"Started Appium driver"),c}async function QF({wdaUrl:t,token:e}){try{let o=new AbortController;return setTimeout(()=>o.abort(),3e3),await fetch(t+"/status",{headers:{Authorization:`Bearer ${e}`},signal:o.signal}),!0}catch{return false}}var zx={"appium:waitForIdleTimeout":2,"appium:commandTimeouts":"30000","appium:skipLogCapture":true,"appium:disableAutomaticScreenshots":true,"appium:simpleIsVisibleCheck":true};var k2e=["[com.apple.","loadConfigurationForEnvironment"],F2e=["com.apple.Accessibility","com.apple.news","com.apple.locationd","NewsToday","NewsTodayIntents","apsd","APSConfiguration","APSOutgoingQueue","APSCourierConnection","APSNetworkMonitor","loadConfigurationForEnvironment"],B2e=new Set(["D","Df","Db"]),U2e=new Set(["I"]),z2e=/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\s+(\S+)\s+/,$2e="https://storage.googleapis.com/mobile-drivers/WebDriverAgentRunner-Build-Sim-arm64-v10.4.5.zip",One=6e4,V2e=5e3,j2e=250,Dne=12e4;function H2e(t){let e=z2e.exec(t)?.[1];if(!e)return false;let o=k2e.some(r=>t.includes(r)),n=F2e.some(r=>t.includes(r));return B2e.has(e)?o||n:U2e.has(e)?n:false}async function Nne({wdaUrl:t,token:e,limbarClient:o,logger:n,onStatusUpdate:r}){if(await QF({wdaUrl:t,token:e}))return;r("Starting WebDriverAgent"),n.debug("WDA is not running on the iOS emulator"),await o.simctl(["launch","booted","com.facebook.WebDriverAgentRunner.xctrunner"]).wait();let i=Date.now()+V2e;do{if(await QF({wdaUrl:t,token:e})){n.debug("WDA launched");return}await Te(j2e);}while(Date.now()<i);throw new bm("WebDriverAgent did not become reachable after relaunch")}var HS=class t{apiClient;name;extraCapabilities;limbarToken;limbarWebRtcUrl;limbarApiUrl;limbarWdaUrl;limbarRegion;limbarTag;limbarClient;onStatusUpdate;logStream=void 0;constructor({apiClient:e,limbarToken:o,limbarWebRtcUrl:n,limbarApiUrl:r,limbarWdaUrl:i,limbarRegion:a,limbarTag:s,emulatorName:l,limbarClient:c,onStatusUpdate:u}){this.apiClient=e,this.name=l,this.limbarToken=o,this.limbarWebRtcUrl=n,this.limbarApiUrl=r,this.limbarWdaUrl=i,this.limbarRegion=a,this.limbarTag=s,this.limbarClient=c,this.extraCapabilities={...zx,"appium:automationName":"@limrun/xcuitest","appium:webDriverAgentUrl":this.limbarWdaUrl,"appium:wdaLocalPort":443,"appium:useNewWDA":false,"appium:usePreinstalledWDA":true,"appium:limInstanceApiUrl":r,"appium:limInstanceToken":o,"appium:wdaRequestHeaders":{Authorization:`Bearer ${o}`}},this.onStatusUpdate=u;}static async init(e){let{apiClient:o,logger:n,creationOpts:r,logLevel:i,orgId:a,sessionId:s,onStatusUpdate:l,onConnectionStateChange:c}=e,u=r.appToInstall?.channel,d=r.appToInstall?.tag;l("Creating iOS emulator");let{token:m,webRtcUrl:p,wdaUrl:f,apiUrl:h,id:g,region:b,appDownloadUrl:y,appMd5:T,resolvedTag:v}=await o.createIosEmulator({...r,hostname:hostname(),sessionId:s,installAppOnClient:true});n.info({emulatorName:g,region:b,sessionId:s},"ios instance creation ok"),l("Connecting to iOS emulator");let E;try{E=await Qe.recordDuration({fn:async()=>await createInstanceClient({apiUrl:h,token:m,logLevel:i}),name:"test_event_duration",tags:["name:limbar-client-creation","clientOs:ios",`orgId:${a}`],timeoutMs:One,timeoutMessage:`Timed out after ${One}ms creating Limbar iOS instance client for emulator ${g} after instance creation succeeded (region: ${b??"unknown"}, channel: ${u??"none"}, tag: ${d??"none"})`}),c&&E.onConnectionStateChange(c),l("Installing WebDriverAgent");let P=E;return await Qe.recordDuration({fn:async()=>{await Lne({limbarClient:P,url:$2e,md5:void 0,logger:n,emulatorName:g,assetLabel:"WebDriverAgent"});},name:"test_event_duration",tags:["name:limbar-wda-install","clientOs:ios",`orgId:${a}`]}),await Nne({wdaUrl:f,token:m,limbarClient:P,logger:n,onStatusUpdate:l}),y&&(l(`Installing iOS app${u?` with channel ${u}`:""}${d?` and tag ${d}`:""}`),await Qe.recordDuration({fn:async()=>{await Lne({limbarClient:P,url:y,md5:T,logger:n,emulatorName:g,assetLabel:"iOS app"});},name:"test_event_duration",tags:["name:limbar-app-install","clientOs:ios",`orgId:${a}`]})),(async()=>{try{let[M,I]=await Promise.allSettled([Fp("limserver-1.limrun.net"),Fp("125.253.92.199")]);n.info({limserver:M.status==="fulfilled"?M.value:M.reason,ip125:I.status==="fulfilled"?I.value:I.reason},"Limbar network diagnostics");}catch(M){n.warn({err:M},"Failed to run network diagnostics");}})(),new t({apiClient:o,limbarToken:m,limbarWebRtcUrl:p,limbarApiUrl:h,limbarWdaUrl:f,limbarRegion:b,limbarTag:v??d,emulatorName:g,limbarClient:P,onStatusUpdate:l})}catch(P){throw n.warn({err:P,emulatorName:g},"iOS emulator init failed after creation; cleaning up remote instance"),await W2e({apiClient:o,limbarClient:E,id:g,logger:n}),P}}tap(e,o){return this.limbarClient.tap(e,o)}nativeA11yTreeJson(){return this.limbarClient.elementTreeRaw()}async screenshotPngBase64(){let e=await this.limbarClient.screenshot(),o=Buffer.from(e.base64,"base64"),n=VL.decode(o),r=new PNG({width:n.width,height:n.height});return r.data=Buffer.from(n.data),PNG.sync.write(r).toString("base64")}listApps(){return this.limbarClient.listApps()}terminateApp(e){return this.limbarClient.terminateApp(e)}setOrientation(e){return this.limbarClient.setOrientation(e==="LANDSCAPE"?"Landscape":"Portrait")}pressKey(e){return this.limbarClient.pressKey(e)}async waitForHomescreen(e){e.debug({emulatorName:this.name},"Waiting for iOS simulator to finish booting (simctl bootstatus)");let o=await re(this.limbarClient.simctl(["bootstatus","booted","-b"]).wait(),{milliseconds:Dne,message:`Timed out after ${Dne}ms waiting for iOS device ${this.name} to finish booting`});if(o.code!==0)throw new bm(`iOS device ${this.name} did not finish booting (simctl bootstatus exited ${o.code}): ${o.stderr}`);e.debug({emulatorName:this.name},"iOS simulator finished booting");}async resetSettings(){let e=await this.limbarClient.simctl(["privacy","booted","reset","all"]).wait();if(e.code!==0)throw new Error(`simctl privacy reset returned non-zero exit code: ${e.code} stderr: ${e.stderr}`)}async startScreenRecording(){await this.limbarClient.startRecording({quality:RecordingQuality.Q5});}async stopScreenRecording(e){await this.limbarClient.stopRecording({localPath:e});}addSyslogListener(e){this.logStream||(this.logStream=this.limbarClient.streamSyslog());let o=n=>{H2e(n)||e(n);};return this.logStream.on("line",o),()=>{this.logStream?.off("line",o);}}async restartWda(e){await Nne({wdaUrl:this.limbarWdaUrl,token:this.limbarToken,limbarClient:this.limbarClient,logger:e,onStatusUpdate:this.onStatusUpdate});}async close(){try{this.logStream?.stop();}catch{}try{this.limbarClient.disconnect();}catch{}await this.apiClient.deleteIosEmulator(this.name);}};async function W2e(t){let{apiClient:e,limbarClient:o,id:n,logger:r}=t;if(o)try{o.disconnect();}catch(i){r.warn({err:i,emulatorName:n},"Failed to disconnect limbar client during init cleanup");}try{await e.deleteIosEmulator(n);}catch(i){r.warn({err:i,emulatorName:n},"Failed to delete iOS emulator during init cleanup");}}var eB=12e4,$x=6,G2e=1e3;async function Lne(t){let{limbarClient:e,url:o,md5:n,logger:r,emulatorName:i,assetLabel:a}=t,s;for(let l=1;l<=$x;l++)try{await re(e.installApp(o,{md5:n,timeoutMs:eB}),{milliseconds:eB,message:`Timed out after ${eB}ms installing ${a} on emulator ${i}`});return}catch(c){if(s=c,l===$x)break;let u=G2e*2**(l-1);r.warn({url:o,err:c,emulatorName:i,assetLabel:a,attempt:l,maxAttempts:$x,backoffMs:u},`Failed to install ${a} on Limbar emulator; retrying after backoff`),await Te(u);}throw r.error({url:o,err:s,emulatorName:i,assetLabel:a,maxAttempts:$x},`Failed to install ${a} on Limbar emulator (no more retries)`),new O("UserConfigurationError",`Failed to install ${a} on emulator ${i}: ${s}`)}var q2e=w__default.array(w__default.object({bundle_id:w__default.string(),name:w__default.string()})),jx=class{constructor(e){this.udid=e;}async exec(e,o=[]){return new Promise((n,r)=>{execFile$1("idb",[...e,"--udid",this.udid,...o],(i,a)=>{i?r(i):n(a.trim());});})}async execBuffer(e,o=[]){return new Promise((n,r)=>{execFile$1("idb",[...e,"--udid",this.udid,...o],{encoding:"buffer",maxBuffer:10*1024*1024},(i,a)=>{i?r(i):n(a);});})}async describeDevice(){return this.exec(["describe"])}async tap({x:e,y:o}){await this.exec(["ui","tap"],[Math.round(e).toString(),Math.round(o).toString()]);}async elementTree(){return this.exec(["ui","describe-all"])}async listApps(){let e=await this.exec(["list-apps","--json"]),o=JSON.parse(e);return q2e.parse(o).map(n=>({bundleId:n.bundle_id,name:n.name}))}async terminate(e){await this.exec(["terminate"],[e]);}async pressKey(e){await this.exec(["ui","press"],[e]);}async screenshot(){let e=await this.execBuffer(["screenshot"],["-"]),o=Buffer.from([137,80,78,71,13,10,26,10]);if(e.length<o.length||!e.subarray(0,o.length).equals(o))throw new Error(`idb screenshot returned invalid PNG data (got ${e.length} bytes)`);return e.toString("base64")}async disconnect(){await this.exec(["disconnect"]);}};async function WS(t){try{return (await new Simctl().getDeviceTypes()).filter(n=>n.includes("iPhone"))}catch(e){return t.warn({err:e},"Got error listing local iPhone device types, returning empty list"),[]}}var K2e=w__default.object({runtimes:w__default.array(w__default.object({version:w__default.string(),name:w__default.string(),isAvailable:w__default.boolean().optional()}))});async function Y2e(t){try{let e=new Simctl,{stdout:o}=await e.exec("list",{args:["runtimes","-j"]}),{runtimes:n}=K2e.parse(JSON.parse(o)),r=n.filter(i=>i.isAvailable!==!1&&i.name.toLowerCase().startsWith("ios")).map(i=>i.version);return r.length===0?void 0:r.sort((i,a)=>X2e(a,i))[0]}catch(e){t.warn({err:e},"Failed to detect latest installed iOS runtime version");return}}function X2e(t,e){let o=t.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<Math.max(o.length,n.length);r++){let i=(o[r]??0)-(n[r]??0);if(i!==0)return i}return 0}var Hx=class t{name;extraCapabilities;simctl;idb;constructor({name:e,simctl:o,idb:n}){this.name=e,this.simctl=o,this.idb=n,this.extraCapabilities={...zx,"appium:automationName":"XCUITest","appium:udid":o.udid??void 0};}static async init(e,o){let n=new Simctl,r=o.emulatorName??`momentic-${Date.now()}`,i=await WS(e);if(!i.includes(o.deviceType))throw new O("UserConfigurationError",`Invalid device type: ${o.deviceType}. Valid device types are: ${i.join(", ")}. If you are sure the device type is correct, please make sure it is installed and available in Xcode.`);let a=o.iosVersion??await Y2e(e);if(!a)throw new O("UserConfigurationError","Could not determine an installed iOS runtime version. Make sure an iOS simulator runtime is installed in Xcode, or specify one with --local-ios-version.");let s;try{let l=await n.createDevice(r,o.deviceType,a);n.udid=l,s=async()=>{try{await n.shutdownDevice();}catch{}await n.deleteDevice();},await n.bootDevice(),await n.startBootMonitor({timeout:12e4}),o.appFilePath&&await n.installApp(o.appFilePath);let c=new jx(l);return new t({name:r,simctl:n,idb:c})}catch(l){throw await s?.(),l instanceof O?l:new O("UserConfigurationError",`Failed to start local iOS simulator (device "${o.deviceType}", iOS ${a}). Verify Xcode and the iOS simulator runtime are installed and working: ${J(l)}`)}}async waitForHomescreen(){}async tap(e,o){await this.idb.tap({x:e,y:o});}async nativeA11yTreeJson(){return this.idb.elementTree()}async screenshotPngBase64(){return this.idb.screenshot()}async listApps(){return this.idb.listApps()}async terminateApp(e){await this.idb.terminate(e);}async pressKey(e){await this.idb.pressKey(e);}async resetSettings(){}async close(){try{await this.idb.disconnect();}catch{}try{await this.simctl.shutdownDevice();}catch{}await this.simctl.deleteDevice();}};var J2e=5e3;async function fh({creationOpts:t,apiClient:e,logger:o,driverLogLevel:n,orgId:r,sessionId:i,callbacks:a,emulatorSettings:s}){let l=Date.now();o.info("Starting ios driver creation");let{onLimbarConnectionStateChange:c,onStatusUpdate:u}=a,d=[],m=async()=>{let f=d.toReversed();for(let h of f)try{await re(h(),{milliseconds:J2e,fallback:()=>{}});}catch(g){if(md(g))continue;o.warn({err:g},"Error running cleanup task");}},p;switch(t.type){case "remote":{p=await HS.init({apiClient:e,logger:o,creationOpts:t,orgId:r,sessionId:i,onStatusUpdate:u,onConnectionStateChange:c,logLevel:n});break}case "local":{p=await Hx.init(o,t);break}}d.push(async()=>{await p.close();});try{let f=await Ine({logger:o,driverLogLevel:n,emulatorStart:l,emulator:p,apiClient:e,creationOpts:t,orgId:r,sessionId:i,callbacks:a,emulatorSettings:s});return d.push(()=>f.close()),u("Waiting for home screen"),await p.waitForHomescreen(o),f.executeInNativeContext(o,h=>h.getPageSource(),{operationName:"Warm up Appium cache"}).catch(()=>{}),{driver:f,emulator:p,limbarParams:p instanceof HS?{token:p.limbarToken,webRtcUrl:p.limbarWebRtcUrl,region:p.limbarRegion,tag:p.limbarTag,osVersion:t.type==="remote"?t.osVersion:void 0}:void 0,cleanup:m}}catch(f){throw await m(),new Error(`Failed to start Appium driver: ${f}`,{cause:f})}}var eHe=100,tHe=2500,Fne=4e3,oHe="...";async function Wx({emulator:t,onLogs:e}){if(!t.addSyslogListener)return;let o=create({fetcher:async r=>{e(r);},resolver:()=>{},scheduler:windowedFiniteBatchScheduler({windowMs:tHe,maxBatchSize:eHe})}),n=r=>{let i=r.toString().trim();i.length!==0&&(i.length>Fne&&(i=i.slice(0,Fne)+oHe),o.fetch(i).catch(()=>{}));};return t.addSyslogListener(n)}var Bne="NATIVE_APP";var rHe=new Set(["id","processId","bundleId","type","accessible","index","x","y","width","height"]),iHe=new Set([]),aHe=new Set(["name","label","traits"]),sHe=new Set(["live-region","drawing-order"]),lHe=new Set(["visible","enabled"]);function Une(t){let e={},o=t.tagName,n=reduce(t.attributes,(r,i)=>(r[i.name]=i.value,r),{});for(let[r,i]of Object.entries(n))rHe.has(r)||r==="class"&&o===i||r==="focusable"&&i==="true"&&n.clickable==="true"||iHe.has(r)&&i==="false"||aHe.has(r)&&i===""||lHe.has(r)&&i==="true"||sHe.has(r)&&i==="0"||(e[r]=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 jl(t){let e=t.getAttribute("x"),o=t.getAttribute("y"),n=t.getAttribute("width"),r=t.getAttribute("height");if(e===null||o===null||n===null||r===null)return;let i=parseFloat(e),a=parseFloat(o),s=parseFloat(n),l=parseFloat(r);if(!(isNaN(i)||isNaN(a)||isNaN(s)||isNaN(l)))return {x1:i,y1:a,x2:i+s,y2:a+l}}function oB(t,e){let{x1:o,y1:n,x2:r,y2:i}=e;t.setAttribute("bounds",`[${o},${n},${r},${i}]`);}function cHe(t){let e=t.match(/\[([-\d.]+),([-\d.]+),([-\d.]+),([-\d.]+)\]/);if(!e)return;let o=parseFloat(e[1]),n=parseFloat(e[2]),r=parseFloat(e[3]),i=parseFloat(e[4]);if(!(isNaN(o)||isNaN(n)||isNaN(r)||isNaN(i)||r<o||i<n))return {x1:o,y1:n,x2:r,y2:i}}function Gx(t){let e=t.getAttribute("bounds");if(e)return cHe(e)}function zne(t,e){if(!e)return true;let o=jl(t);return o?nB(o,e):true}function nB(t,e){if(!e)return true;let{x1:o,y1:n,x2:r,y2:i}=t;return !(r<e.left||o>e.right||i<e.top||n>e.bottom)}function qx(t){let e=t.cloneNode(true);for(let o of Array.from(e.children)){let n=o;for(let r of Array.from(n.children))n.removeChild(r);}return e.outerHTML}var $ne=new Set(["XCUIElementTypeWebView"]);function fHe(t){if($ne.has(t.tagName))return true;let e=t.getAttribute("name");if(e&&(e.startsWith("TabDocument")||e.startsWith("BrowserView"))){let o=e.match(/UUID=([A-F0-9-]+)/),n=e.match(/WebViewProcessID=(\d+)/);if(o&&n)return true}return false}function hHe(t){return t.startsWith("XCUIElementType")?t.substring(15):t}function Vne({state:t,originalElement:e,prunedElement:o,isInWebview:n,idInWebview:r}){let{idCounter:i,idToPrunedElement:a,idToOriginalElement:s,idToIdInWebview:l}=t,c=i.value++;o.setAttribute("id",String(c)),a.set(c,o),n?l.set(c,r):s.set(c,e);}function jne(t){if(!$ne.has(t.tagName)&&t.tagName==="XCUIElementTypeOther"&&t.hasAttribute("name")&&t.hasAttribute("label"))return t;for(let e of Array.from(t.children)){let o=jne(e);if(o)return o}}function gHe({webviewNativeRootBounds:t,webviewDocumentRootBounds:e}){let o=t.x1-e.x,n=t.y1-e.y;if(!Number.isFinite(o)||!Number.isFinite(n))return t;let r=t.x2-t.x1,i=t.y2-t.y1;return {x1:o,y1:n,x2:o+r,y2:n+i}}function Hne(t,e,o,n){let{document:r}=o,{parentFrameBounds:i,pruneElementsOutsideBounds:a}=n;if(e.type==="element"){let s=r.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 l=e.boundingRect,c={x1:i.x1+l.x,y1:i.y1+l.y,x2:i.x1+l.x+l.width,y2:i.y1+l.y+l.height};if(!nB(c,a))return;oB(s,c),Vne({state:o,prunedElement:s,isInWebview:true,idInWebview:e.momenticWebviewElementId}),t.appendChild(s);for(let u of e.children)Hne(s,u,o,n);}else if(e.type==="text"){let s=r.createElement("text");t.appendChild(s);let l=r.createTextNode(e.text);s.appendChild(l);}}function Wne(t,e,o,n){let{pruneElementsOutsideBounds:r}=n,{document:i}=o;Vne({state:o,originalElement:t,prunedElement:e,isInWebview:false});let a=Une(t);for(let[c,u]of Object.entries(a))e.setAttribute(c,u);let s=jl(t);if(s&&oB(e,s),fHe(t)){let{removeWebviewContent:c,injectedWebviewContent:u}=n;if(c)return;if(u&&jl(t)){let m=jne(t),p=m?jl(m):void 0;if(m&&p){o.webviewRootElement=m,o.webviewRootBounds=p,Hne(e,u.root,o,{parentFrameBounds:gHe({webviewNativeRootBounds:p,webviewDocumentRootBounds:u.rootBoundingBox}),pruneElementsOutsideBounds:r});return}}}let l=Array.from(t.childNodes??[]);for(let c of l){let u=c.nodeType;if(u===3){let d=c.nodeValue;d&&d.trim().length>0&&e.appendChild(i.createTextNode(d));continue}if(u===1){let d=c;if(!zne(d,r))continue;let m=i.createElement(hHe(d.tagName));Wne(d,m,o,n),e.appendChild(m);}}}async function rB(t,e,o){let n=t.parseFromString("<AppiumAUT/>","text/xml"),r=new Map,i=new Map,a=new Map,s={document:n,idToPrunedElement:r,idToOriginalElement:i,idToIdInWebview:a,idCounter:{value:0},webviewRootElement:void 0,webviewRootBounds:void 0},l=n.documentElement;Wne(e,l,s,o);let c=new XMLSerializer().serializeToString(n),u=await _je.format(c,{parser:"xml",plugins:[Ije],printWidth:120,tabWidth:1,singleAttributePerLine:false});return {prunedDocument:n,idToPrunedElement:r,idToOriginalElement:i,idToIdInWebview:a,webviewRootElement:s.webviewRootElement,webviewRootBounds:s.webviewRootBounds,prunedXml:u}}async function Gne(t,e){let o=new DOMParser,n=o.parseFromString(t,"text/xml"),r=n.documentElement;if(!r)throw new Error("No root element found in XML");if(r.tagName!=="AppiumAUT")throw new Error("No AppiumAUT element found in XML");let{prunedXml:i,idToPrunedElement:a,idToOriginalElement:s,idToIdInWebview:l,webviewRootElement:c,webviewRootBounds:u}=await rB(o,r,e);return {xml:i,idToPrunedElement:a,idToOriginalElement:s,idToIdInWebview:l,webviewRootElement:c,webviewRootBounds:u,originalDocument:n}}var qne=(R=>(R.GenericElement="GenericElement",R.Any="Any",R.Other="Other",R.Application="Application",R.Group="Group",R.Window="Window",R.Sheet="Sheet",R.Drawer="Drawer",R.Alert="Alert",R.Dialog="Dialog",R.Button="Button",R.RadioButton="RadioButton",R.RadioGroup="RadioGroup",R.CheckBox="CheckBox",R.DisclosureTriangle="DisclosureTriangle",R.PopUpButton="PopUpButton",R.ComboBox="ComboBox",R.MenuButton="MenuButton",R.ToolbarButton="ToolbarButton",R.Popover="Popover",R.Keyboard="Keyboard",R.Key="Key",R.NavigationBar="NavigationBar",R.TabBar="TabBar",R.TabGroup="TabGroup",R.Toolbar="Toolbar",R.StatusBar="StatusBar",R.Table="Table",R.TableRow="TableRow",R.TableColumn="TableColumn",R.Outline="Outline",R.OutlineRow="OutlineRow",R.Browser="Browser",R.CollectionView="CollectionView",R.Slider="Slider",R.PageIndicator="PageIndicator",R.ProgressIndicator="ProgressIndicator",R.ActivityIndicator="ActivityIndicator",R.SegmentedControl="SegmentedControl",R.Picker="Picker",R.PickerWheel="PickerWheel",R.Switch="Switch",R.Toggle="Toggle",R.Link="Link",R.Image="Image",R.Icon="Icon",R.SearchField="SearchField",R.ScrollView="ScrollView",R.ScrollBar="ScrollBar",R.StaticText="StaticText",R.TextField="TextField",R.SecureTextField="SecureTextField",R.DatePicker="DatePicker",R.TextView="TextView",R.Menu="Menu",R.MenuItem="MenuItem",R.MenuBar="MenuBar",R.MenuBarItem="MenuBarItem",R.Map="Map",R.WebView="WebView",R.IncrementArrow="IncrementArrow",R.DecrementArrow="DecrementArrow",R.Heading="Heading",R.Cell="Cell",R))(qne||{}),Kne=w__default.lazy(()=>w__default.object({AXFrame:w__default.string(),AXUniqueId:w__default.string().nullable(),AXLabel:w__default.string().nullable(),AXValue:w__default.string().nullable(),frame:w__default.object({x:w__default.number(),y:w__default.number(),width:w__default.number(),height:w__default.number()}),role:w__default.string(),role_description:w__default.string(),subrole:w__default.string().nullable(),type:w__default.nativeEnum(qne),title:w__default.string().nullable(),help:w__default.string().nullable(),content_required:w__default.boolean(),custom_actions:w__default.array(w__default.string()),enabled:w__default.boolean(),children:w__default.array(Kne).default([])}));function yHe(t){return w__default.array(Kne).parse(JSON.parse(t))}async function Kx(t,e){let o=new DOMParser,n=yHe(t),r=SHe(o,n),{prunedXml:i,idToPrunedElement:a,idToOriginalElement:s}=await rB(o,r.documentElement,{removeWebviewContent:false,injectedWebviewContent:void 0,pruneElementsOutsideBounds:e.pruneElementsOutsideBounds});return {xml:i,idToPrunedElement:a,idToOriginalElement:s,originalDocument:r,webviewRootElement:void 0,idToIdInWebview:new Map,webviewRootBounds:void 0}}function SHe(t,e){let o=t.parseFromString("<hierarchy/>","text/xml"),n=o.documentElement;for(let r=0;r<e.length;r++){let i=e[r],a=Yne(i,o);n.appendChild(a);}return o}function Yne(t,e){let o=t.type,n=e.createElement(o);if(n.setAttribute("type",o),n.setAttribute("x",String(t.frame.x.toFixed(2))),n.setAttribute("y",String(t.frame.y.toFixed(2))),n.setAttribute("width",String(t.frame.width.toFixed(2))),n.setAttribute("height",String(t.frame.height.toFixed(2))),t.AXLabel!==null&&n.setAttribute("label",t.AXLabel),t.AXValue!==null&&n.setAttribute("value",t.AXValue),t.title!==null&&n.setAttribute("title",t.title),t.help!==null&&n.setAttribute("help",t.help),n.setAttribute("enabled",String(t.enabled)),t.children)for(let r=0;r<t.children.length;r++){let i=t.children[r],a=Yne(i,e);n.appendChild(a);}return n}function im(t){let e=[],o=t;for(;o;){let n=o.parentElement;if(!n||n.tagName==="AppiumAUT"){e.unshift(`${o.tagName}[1]`);break}let r=o.tagName,i=Array.from(n.children).filter(s=>s.tagName===r),a=1;for(let s=0;s<i.length;s++)if(i[s]===o){a=s+1;break}e.unshift(`${r}[${a}]`),o=n;}return `/${e.join("/")}`}var Yx=class t{driver;emulator;options;lastDomState;lastScreenshot;aborter;constructor({driver:e,emulator:o,aborter:n,options:r}){this.driver=e,this.emulator=o,this.aborter=n,this.options=r;}static async init({driver:e,emulator:o,aborter:n,options:r}){return new t({driver:e,aborter:n,emulator:o,options:r})}async getContexts(e){let o=await this.driver.executeInNativeContext(e,async r=>await r.getContexts({}),{operationName:"getContexts"}),n=o.filter(r=>r!==Bne);return {contexts:o.map(r=>r),webviews:n}}async getRawScreenshotBase64({logger:e,totalAttempts:o=3,signal:n}){let r=fe(),i=n??this.aborter.controller?.signal,a=await r.startAsyncSpan("EMULATOR_READ_STATE",async()=>await yf(e,()=>this.emulator.screenshotPngBase64(),{maxAttempts:o,signal:i,operationName:"takeScreenshot"}),{name:"Take screenshot",signal:i,timeoutMs:3e4});return this.lastScreenshot={pngString:`data:image/png;base64,${a}`,observedAt:Date.now()},a}async getCurrentScreenshotPngString(e){return `data:image/png;base64,${await this.getRawScreenshotBase64({logger:e,totalAttempts:1})}`}async waitForScreenshotStability({logger:e,timeoutMs:o,signal:n,reason:r,tolerancePercent:i=1}){await fe().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async a=>{a.attributes.reason=r;let s=Sp({signal:n,timeoutMs:o}),l,c=false;for(;!s.aborted;){let u=Date.now();if(l)try{let m=await this.getRawScreenshotBase64({logger:e,totalAttempts:1,signal:s});if(Yc(l,m)<=i){c=!0;break}l=m;}catch(m){e.warn({err:m},"Failed to get screenshot during stability wait");}else try{l=await this.getRawScreenshotBase64({logger:e,totalAttempts:1,signal:s});}catch(m){e.warn({err:m},"Failed to get initial screenshot during stability wait");}let d=Math.max(250,Date.now()-u);await Os(Math.min(1e4,d),s);}c||(a.attributes.timedOut=true,e.warn({purpose:r},"Timed out waiting for screenshot stability"));});}async waitForPageSourceStability({logger:e,timeoutMs:o,signal:n,reason:r}){await fe().startAsyncSpan("WAIT_FOR_PAGE_STABILITY",async i=>{i.attributes.reason=r;let a=Sp({signal:n,timeoutMs:o}),s,l=false;for(;!a.aborted;){let c,u=Date.now();try{c=await re(this.emulator.nativeA11yTreeJson(),{milliseconds:1e4,signal:a,message:"Getting the native accessibility tree timed out after 10s"});let m=createHash("md5").update(c).digest("hex");if(s&&s===m){l=!0;break}s=m;}catch(m){e.warn({err:m},"Failed to get page source during stability wait");}let d=Math.max(250,Date.now()-u);await Os(Math.min(1e4,d),a);}l||(i.attributes.timedOut=true,e.warn({purpose:r},"Timed out waiting for page source stability"));});}async getActiveWebview(e){let n=(await this.getContexts(e)).webviews;if(n.length>1)throw new O("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");return n[0]}async getActiveWebviewContent(e){let o=await this.getActiveWebview(e);if(!o)return;this.throwIfAborted();let n=await this.driver.executeWebViewScript(e,o,r=>r.dumpA11yTree());return {context:o,...n}}async getDomState(e,o){let r=await fe().startAsyncSection("Get emulator state XML",async()=>{let a=o?.filterOffscreenElements??true?await this.getViewportBounds(e):void 0,s;if(!o?.skipFetchingFullWebviewContent)try{s=await this.getActiveWebviewContent(e);}catch(u){e.error({err:u},"Could not get webview info to get the nested DOM state");}if(this.throwIfAborted(),!s&&this.options?.disableMomenticAccessibilityTree){let u=await this.getNativePageSource();this.throwIfAborted();let d=await Kx(u,{pruneElementsOutsideBounds:a});return {sourceTree:"native",graph:d,webviewContent:void 0}}let l=await this.getAppiumPageSource(e);return this.throwIfAborted(),{graph:await Gne(l,{injectedWebviewContent:s,removeWebviewContent:o?.removeWebviewContent,pruneElementsOutsideBounds:a}),sourceTree:"appium",webviewContent:s}});return this.recordDomState(r),r}async getLastObservedState(){let e=this.lastDomState,o=this.lastScreenshot;if(!e||!o)return;let n=Date.now(),r=3e4;if(!(n-e.observedAt>r||n-o.observedAt>r||Math.abs(e.observedAt-o.observedAt)>5e3))return {emulatorState:e.state,screenshot:o.pngString}}recordDomState(e){this.lastDomState={state:e,observedAt:Date.now()};}async getNativePageSource(){return await fe().startAsyncSpan("EMULATOR_READ_STATE",async()=>this.emulator.nativeA11yTreeJson(),{name:"Get iOS page source",signal:this.aborter.controller?.signal,timeoutMs:3e4})}async getAppiumPageSource(e,o){let n=o??this.aborter.controller?.signal;return await fe().startAsyncSpan("EMULATOR_READ_STATE",()=>this.driver.executeInNativeContext(e,i=>i.getPageSource(),{signal:n,operationName:"getPageSource"}),{name:"Get page source",signal:n,timeoutMs:3e4})}async getViewportBounds(e){let o=await this.driver.executeInNativeContext(e,async n=>n.getWindowRect(),{operationName:"getViewportBounds"});return {left:o.x,top:o.y,right:o.x+o.width,bottom:o.y+o.height}}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted();}};async function Jne({command:t,logger:e,generator:o,aiSettings:n,getEmulatorDomState:r,getScreenshotBase64:i,throwIfAborted:a,abortSignal:s}){let l=fe(),c=t.contextChoice==="VISION_ONLY",u=15,d=t.timeoutSecs?t.timeoutSecs*1e3:5e3,m=GC(d),p=Date.now(),f=0,h,g=false,b;for(;f<u&&!g;){a(),g||h&&h-p>=d&&(g=true),f!==0&&await Te(m,s),h=Date.now();try{let y="",T="";await l.startAsyncSpan("EMULATOR_READ_STATE",async()=>{c||(y=await r()),T=await i();},{name:"Get emulator state"});let v=await o.evaluateIosAssertion({assertion:t.assertion,screenXml:y,screenshot:T,contextChoice:t.contextChoice},{logger:e,loggerTags:$e(e),agentConfigVersion:n.agentConfig?.["ios-assertion"]});if(v.result)return {success:v.result,message:v.thoughts};{let E=`AssertionFailureError: ${v.thoughts}`;b=new Error(E);}}catch(y){if(a(),FT(y))throw y;e.info({err:y},`AI check assert attempt ${f} failed, retrying...`),b=y instanceof Error?y:new Error(`${y}`);}finally{f++;}}return {success:false,message:b?.message}}async function Zne({command:t,logger:e,generator:o,aiSettings:n,getEmulatorDomState:r,getScreenshotBase64:i,abortSignal:a}){if(!t.goal.trim())throw new O("ActionFailureError","Cannot perform AI extraction without goal");if(t.schema){let u=pp(t.schema);if(u)throw new O("UserConfigurationError",u)}let s=fe(),l="",c="";return await s.startAsyncSpan("EMULATOR_READ_STATE",async()=>{l=await r(),c=await i();},{name:"Get emulator state"}),await s.startAsyncSpan("AI_EXTRACTION_CALL",async u=>{try{let d=await o.getIosTextExtraction({goal:t.goal,emulatorState:l,returnSchema:t.schema,screenshot:`data:image/png;base64,${c}`},{disableCache:!!t.disableCache,abortSignal:a,loggerTags:$e(e),agentConfigVersion:n.agentConfig?.["ios-text-extraction"]});if(u.result=d,aA({tracer:s,span:u,screenshot:c,emulatorState:l,logger:e}),d.result==="NOT_FOUND")return {success:!1,message:"No relevant data found for extraction goal on this page"};if(d.thoughts?.includes("MaxGenerationLengthExceededError"))throw new O("UserConfigurationError",d.thoughts);return {success:!0,output:d.result,message:d.thoughts}}catch(d){let m=J(d);throw m.includes("MaxGenerationLengthExceededError")?new O("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step instead."):m.includes("AIProviderError")&&m.includes("time")?new O("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}})}function Hl(t){let{x1:e,y1:o,x2:n,y2:r}=t.bounds;return {left:e,top:o,width:n-e,height:r-o}}var zi="element-6066-11e4-a52e-4f735466cecf";function Jx(t,e){return Math.abs(t-e)<1}function hh(t,e){return Jx(t.x1,e.x1)&&Jx(t.y1,e.y1)&&Jx(t.x2,e.x2)&&Jx(t.y2,e.y2)}function gh(t,e){let o=e.x2-e.x1,n=(e.x1+e.x2)/2,r=(t.x1+t.x2)/2;if(!Hs(e.tolerance,n,r,Math.min(1,o)))return false;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(t.y1+t.y2)/2;return Hs(e.tolerance,a,s,Math.min(1,i))}function bh(t,e){let o=t.x2-t.x1,n=t.y2-t.y1;return Hs(e.tolerance,e.width,o,Math.min(1,e.width))?Hs(e.tolerance,e.height,n,Math.min(1,e.height)):false}function am(t){return t.type==="WEBVIEW",t.cache}function sm(t){let{command:e,cacheKey:o="cache",targetName:n="target",updatedCache:r}=t;JI(e)&&(e[o]={...e[o],[n]:km.parse(r)},t.updatedWithAI&&(e[o].updatedAt=new Date,e[o].updatedAtLoggerTags=$e(t.logger)));}var GS="name";async function Qne(t,e,o){return await e.executeInNativeContext(t,n=>n.isElementDisplayed(o),{operationName:"isElementRendered"})}async function yh(t,e,o,n){return await e.executeInNativeContext(t,r=>r.getElementAttribute(o,n),{operationName:"getAttributeFromIosElement"})}async function iB(t,e,o){return await e.executeInNativeContext(t,async n=>{try{let r=await n.findElement("xpath",o);if(!r)return null;let i=r[zi];if(!i)return null;let a=await n.getElementRect(i);return {elementId:i,rect:a}}catch{return null}},{operationName:"findElementByXPath"})}async function ere(t,e,o){let n=im(o),r=await iB(t,e,n);if(r)return {xPath:n,...r}}async function aB({logger:t,emulatorState:e,driver:o,idInWebview:n,requirements:r}){let i=e.graph.webviewRootElement?im(e.graph.webviewRootElement):void 0;if(!i||!e.webviewContent||!e.graph.webviewRootBounds)throw new Error("Cannot build webview target cache without webview root information");let a=await vHe({logger:t,driver:o,webviewRootBounds:e.graph.webviewRootBounds,nodeIdInWebview:n,aiGeneratedRequirements:r,webviewContent:e.webviewContent});if(!a)throw new Error("Failed to build browser cache for webview element");return {xPath:i,bounds:[e.graph.webviewRootBounds.x1,e.graph.webviewRootBounds.y1,e.graph.webviewRootBounds.x2,e.graph.webviewRootBounds.y2],browserCache:a}}async function vHe({logger:t,driver:e,webviewRootBounds:o,nodeIdInWebview:n,aiGeneratedRequirements:r,webviewContent:i}){let a=await e.executeWebViewScript(t,i.context,(c,u,d,m)=>c.generateCacheFromWebviewElementId(u,d,m),i.generatedAt,n,{attributesToFetch:r?.attributesRequired??[]});if(!a)return;let s=a.textContent??void 0,l={x:o.x1-i.rootBoundingBox.x+a.boundingBox.x,y:o.y1-i.rootBoundingBox.y+a.boundingBox.y,width:a.boundingBox.width,height:a.boundingBox.height};return {id:a.id,generatedSelectors:a.selectors,boundingBox:l,requirements:{text:r?.textRequired?s:void 0,attributes:a.attributes,boundingBox:r?.boundsRequired?l:void 0,shape:r?.shapeSpecificity?{tolerance:r.shapeSpecificity,width:a.boundingBox.width,height:a.boundingBox.height}:void 0,position:r?.positionSpecificity?{tolerance:r.positionSpecificity,x1:l.x,y1:l.y,x2:l.x+l.width,y2:l.y+l.height}:void 0}}}async function CHe(t,e,o,n){if(!n||!n.length)return;let r={};for(let i of n){let a=await yh(t,e,o,i);a!==null&&(r[i]=a);}return Object.keys(r).length?r:void 0}async function tre({logger:t,driver:e,node:o,requirements:n}){let r=await ere(t,e,o);if(!r){t.warn("Failed to generate valid xPath selector for element");return}let{xPath:i,rect:a,elementId:s}=r,l={x1:a.x,y1:a.y,x2:a.x+a.width,y2:a.y+a.height};return {xPath:i,bounds:[l.x1,l.y1,l.x2,l.y2],requirements:{requiredText:n?.textRequired?await yh(t,e,s,GS)??void 0:void 0,requiredAttributes:await CHe(t,e,s,n?.attributesRequired?.filter(c=>!(n.textRequired&&c===GS))),requiredBounds:n?.boundsRequired,position:n?.positionSpecificity?{x1:l.x1,y1:l.y1,x2:l.x2,y2:l.y2,tolerance:n?.positionSpecificity}:void 0,shape:n?.shapeSpecificity?{width:l.x2-l.x1,height:l.y2-l.y1,tolerance:n?.shapeSpecificity}:void 0}}}async function ore({logger:t,driver:e,aiResponse:o,description:n,emulatorState:r}){let i=r.graph.idToPrunedElement.get(o.id);if(!i)throw new Error(`Could not find node with id: ${o.id}`);let a=Gx(i);if(!a)throw new Error(`Could not determine bounds for element with id: ${o.id}, description: ${n}`);let s=[];for(let{id:g,requirements:b}of o.additionalElements??[]){let y=r.graph.idToIdInWebview.get(g);if(y!==void 0){try{let E=await aB({logger:t,driver:e,emulatorState:r,idInWebview:y,requirements:b});s.push(E);}catch(E){t.warn({err:E},`Failed to build webview cache for related element with id: ${g}`);}continue}let T=r.graph.idToOriginalElement.get(g);if(!T){t.warn(`Could not find original element for additional element with id: ${g}`);continue}let v=await tre({logger:t,driver:e,node:T,requirements:b});v&&s.push(v);}let l=r.graph.idToIdInWebview.get(o.id);if(l!==void 0){let g={type:"WEBVIEW",bounds:a,cache:{type:"WEBVIEW"}};try{let b=await aB({logger:t,driver:e,emulatorState:r,idInWebview:l,requirements:o.requirements});return {...g,cache:{type:"WEBVIEW",resolvedDescription:n,requiredRelatedElements:s,...b}}}catch(b){return t.warn({err:b},"Failed to build webview target cache"),g}}let c=r.graph.idToOriginalElement.get(o.id);if(!c)throw new Error(`Node isn't in a webview but couldn't find original node for id: ${o.id}, description: ${n}`);let u=await tre({logger:t,driver:e,node:c,requirements:o.requirements});if(!u)return t.warn("Failed to generate valid cache for element"),{type:"NATIVE",cache:{type:"NATIVE"},bounds:a};let[d,m,p,f]=u.bounds,h={x1:d,y1:m,x2:p,y2:f};return hh(a,h)||t.warn({a11yTreeBounds:a,xpathBounds:h},"Element bounds differ between a11y tree and xpath resolution"),{type:"NATIVE",bounds:h,cache:{type:"NATIVE",...u,resolvedDescription:n,sourceTree:"appium",requiredRelatedElements:s,elementOnlySerializedXml:qx(c)}}}async function sB({logger:t,driver:e,stateManager:o,parentWebviewBounds:n,cache:r}){if(!r||!r.generatedSelectors)throw new Ne("Cache is missing required attributes");let i=await o.getActiveWebview(t);if(!i)throw new Ne("No active webview context found");let a=await e.executeWebViewScript(t,i,(u,d)=>u.resolveWebviewTargetCache(d),{selectors:r.generatedSelectors,attributesToFetch:Object.keys(r.requirements?.attributes??{})});if(!a)throw new Ne("Failed to resolve webview target using cache");let s=n.x1-a.rootBoundingBox.x+a.boundingBox.x,l=n.y1-a.rootBoundingBox.y+a.boundingBox.y,c={x1:s,y1:l,x2:s+a.boundingBox.width,y2:l+a.boundingBox.height};return r.requirements&&wHe(t,c,a,r.requirements),c}function wHe(t,e,o,n){if(!n)return;let{attributes:r,text:i,position:a,shape:s}=n;if(i!==void 0&&i.length>0&&o.textContent!==i)throw new Ne(`Text content mismatch: expected "${i}", got "${o.textContent}"`);if(r)for(let[l,c]of Object.entries(r)){let u=o.attributes[l];if(u!==c)throw new Ne(`Attribute ${l} mismatch: expected "${c}", got "${u}"`)}if(a&&!gh(e,a))throw new Ne(`Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(e)}`);if(s&&!bh(e,s))throw new Ne(`Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(e)}`)}async function nre(t,e,o,n,r){if(!n)return;let{requiredAttributes:i,requiredText:a,requiredBounds:s,position:l,shape:c}=n;if(a!==void 0&&a.length>0){let u=await yh(t,e,o,GS);if(u!==a)throw new Ne(`Resolved element text mismatch: expected ${a}, got ${u}`)}if(i)for(let[u,d]of Object.entries(i)){let m=await yh(t,e,o,u)??void 0;if(m!==d)throw new Ne(`Attribute ${u} mismatch: expected ${d}, got ${m}`)}if(s&&r){let{originalBounds:u,newBounds:d}=r;if(!u)throw new Ne("Cannot validate bounds requirements without original bounds in cache");if(!hh(u,d)){let m=p=>`[${p.x1},${p.y1},${p.x2},${p.y2}]`;throw new Ne(`Bounds changed from ${m(u)} to ${m(d)}`)}}if(l&&r&&!gh(r.newBounds,l))throw new Ne(`Position mismatch: expected ${JSON.stringify(l)}, got ${JSON.stringify(r.newBounds)}`);if(c&&r&&!bh(r.newBounds,c))throw new Ne(`Shape mismatch: expected ${JSON.stringify(c)}, got ${JSON.stringify(r.newBounds)}`)}async function rre({logger:t,driver:e,xPath:o,elementType:n,skipVisibilityCheck:r=false}){let i=await iB(t,e,o);if(!i)throw new Ne(`Could not resolve ${n} via XPath: ${o}`);let{elementId:a}=i;if(!r&&!await Qne(t,e,a))throw new Ne(`${n} resolved via XPath is not rendered: ${o}`);return i}async function ire({target:t,driver:e,stateManager:o,logger:n}){if(!t.xPath)throw new Ne(`Could not resolve cached target via XPath: ${t.xPath}`);if(t.requiredRelatedElements){let s=t.requiredRelatedElements;for(let l of s){let{elementId:c,rect:u}=await rre({logger:n,driver:e,xPath:l.xPath,elementType:"related element",skipVisibilityCheck:!!l.browserCache});if(l.browserCache){let d={x1:u.x,y1:u.y,x2:u.x+u.width,y2:u.y+u.height};await sB({logger:n,driver:e,stateManager:o,parentWebviewBounds:d,cache:l.browserCache});}else await nre(n,e,c,l.requirements);}}let{elementId:r,rect:i}=await rre({logger:n,driver:e,xPath:t.xPath,elementType:"element",skipVisibilityCheck:t.type==="WEBVIEW"}),a={x1:i.x,y1:i.y,x2:i.x+i.width,y2:i.y+i.height};if(t.type==="WEBVIEW"){let s=await sB({logger:n,driver:e,stateManager:o,parentWebviewBounds:a,cache:t.browserCache});return {type:"WEBVIEW",bounds:s,cache:t}}return await nre(n,e,r,t.requirements,{originalBounds:t.bounds?{x1:t.bounds[0],y1:t.bounds[1],x2:t.bounds[2],y2:t.bounds[3]}:void 0,newBounds:a}),{type:"NATIVE",bounds:a,cache:{...t,bounds:[a.x1,a.y1,a.x2,a.y2]}}}function sre({aiResponse:t,description:e,emulatorState:o}){let n=o.graph.idToPrunedElement.get(t.id);if(!n)throw new Error(`Could not find node with id: ${t.id}`);let r=Gx(n);if(!r)throw new Error(`Could not determine bounds for element with id: ${t.id}, description: ${e}`);let i=o.graph.idToOriginalElement.get(t.id);if(!i)throw new Error(`Node isn't in a webview but couldn't find original node for id: ${t.id}, description: ${e}`);let a=im(i),s=qx(i),l=are({requirements:t.requirements,element:i}),c=(t.additionalElements??[]).map(({id:u,requirements:d})=>{let m=o.graph.idToOriginalElement.get(u);return m?{xPath:im(m),requirements:are({requirements:d,element:m})}:void 0}).filter(u=>!!u);return {type:"NATIVE",bounds:r,cache:{type:"NATIVE",bounds:[r.x1,r.y1,r.x2,r.y2],resolvedDescription:e,sourceTree:o.sourceTree,xPath:a,elementOnlySerializedXml:s,requirements:l,requiredRelatedElements:c}}}function are({requirements:t,element:e}){let o;if((t?.positionSpecificity||t?.shapeSpecificity)&&(o=jl(e),!o))throw new O("ActionFailureError","Element to cache has no bounds or unexpected bounds format");return {requiredText:t?.textRequired?e.textContent??void 0:void 0,requiredAttributes:AHe(e,t?.attributesRequired),requiredBounds:t?.boundsRequired,position:t?.positionSpecificity?{x1:o.x1,y1:o.y1,x2:o.x2,y2:o.y2,tolerance:t?.positionSpecificity}:void 0,shape:t?.shapeSpecificity?{width:o.x2-o.x1,height:o.y2-o.y1,tolerance:t?.shapeSpecificity}:void 0}}function AHe(t,e){if(t&&!(!e||e.length===0))return Object.fromEntries(e.map(o=>[o,t.getAttribute(o)]).filter(([,o])=>o!==null))}async function cre(t,e,o,n){if(!o)return;let{requiredAttributes:r,requiredText:i,requiredBounds:a,position:s,shape:l}=o;if(i!==void 0&&i.length>0){let c=e.textContent;if(c!==i)throw new Ne(`Resolved element text mismatch: expected ${i}, got ${c}`)}if(r)for(let[c,u]of Object.entries(r)){let d=e.getAttribute(c)??void 0;if(d!==u)throw new Ne(`Attribute ${c} mismatch: expected ${u}, got ${d}`)}if(a&&n){let{originalBounds:c,newBounds:u}=n;if(!c)throw new Ne("Cannot validate bounds requirements without original bounds in cache");if(!hh(c,u)){let d=m=>`[${m.x1},${m.y1},${m.x2},${m.y2}]`;throw new Ne(`Bounds changed from ${d(c)} to ${d(u)}`)}}if(s&&n&&!gh(n.newBounds,s))throw new Ne(`Position mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(n.newBounds)}`);if(l&&n&&!bh(n.newBounds,l))throw new Ne(`Shape mismatch: expected ${JSON.stringify(l)}, got ${JSON.stringify(n.newBounds)}`)}async function ure({target:t,logger:e,emulator:o}){if(!t.xPath)throw new Ne(`Could not resolve cached target via XPath: ${t.xPath}`);let n=await o.nativeA11yTreeJson(),r=await Kx(n,{pruneElementsOutsideBounds:void 0});return await lB({target:t,logger:e,document:r.originalDocument})}async function lB({target:t,logger:e,document:o}){if(!t.xPath)throw new Ne(`Could not resolve cached target via XPath: ${t.xPath}`);let n=t.xPath;if(t.requiredRelatedElements){let a=t.requiredRelatedElements;for(let s of a){let l=Yoe.evaluateXPathToFirstNode(s.xPath,o);if(!l)throw new Ne(`Required related element not found for XPath: ${s.xPath}`);await cre(e,l,s.requirements);}}let r=Yoe.evaluateXPathToFirstNode(n,o);if(!r)throw new Ne(`Could not resolve cached target via XPath: ${n}`);let i=jl(r);if(!i)throw new Ne(`Could not determine bounds for cached target via XPath: ${n}`);return await cre(e,r,t.requirements,{originalBounds:t.bounds?{x1:t.bounds[0],y1:t.bounds[1],x2:t.bounds[2],y2:t.bounds[3]}:void 0,newBounds:i}),{type:"NATIVE",bounds:i,cache:{...t,bounds:[i.x1,i.y1,i.x2,i.y2]}}}async function dre({logger:t,driver:e,aiResponse:o,description:n,emulatorState:r}){switch(r.sourceTree){case "appium":return await ore({logger:t,driver:e,aiResponse:o,description:n,emulatorState:r});case "native":return await sre({aiResponse:o,description:n,emulatorState:r});default:{let i=r.sourceTree;throw new Error(`Unsupported source tree type for building iOS target cache: ${i}`)}}}async function mre({target:t,driver:e,stateManager:o,logger:n,emulator:r}){if(t.type==="WEBVIEW"||!t.sourceTree||t.sourceTree=="appium")return await ire({target:t,driver:e,stateManager:o,logger:n});switch(t.sourceTree){case "native":return await ure({target:t,logger:n,emulator:r});default:{let i=t.sourceTree;throw new Error(`Unsupported source tree type for resolving iOS target cache: ${i}`)}}}var nn=class{emulator;driver;stateManager;generator;fixtures;orgId;aiSettings;emulatorSettings;aborter;constructor(e){this.stateManager=e.stateManager,this.driver=e.driver,this.emulator=e.emulator,this.aborter=e.aborter,this.fixtures=e.fixtures,this.orgId=e.orgId,this.generator=e.generator,this.aiSettings=e.aiSettings,this.emulatorSettings=e.emulatorSettings;}async findElement({logger:e,tracer:o,description:n,skipFetchingFullWebviewContent:r=false,removeWebviewContent:i=false,filterOffscreenElements:a=true,useMemory:s=false,metadata:l,cacheBustReason:c,knownState:u}){let d=e.child({...l});u||await this.stateManager.waitForScreenshotStability({logger:e,timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before locating an element with AI"});let{emulatorState:m,screenshot:p}=u??await o.startAsyncSection("Get emulator state",async()=>{let g=await this.stateManager.getCurrentScreenshotPngString(e);return {emulatorState:await this.stateManager.getDomState(e,{skipFetchingFullWebviewContent:r,removeWebviewContent:i,filterOffscreenElements:a}),screenshot:g}}),f;try{f=await o.startAsyncSpan("AI_LOCATOR_CALL",async g=>{c&&(g.attributes.cacheBustReason=c);let b=await this.generator.getIosElementLocation({description:n,screenXml:m.graph.xml,screenshot:p,source:l?.source==="SCROLL_TO"?"SCROLL_TO":void 0},{logger:d,loggerTags:$e(d),abortSignal:this.aborter.controller?.signal,useMemory:s,agentConfigVersion:this.aiSettings.agentConfig?.["ios-locator"]});return g.result=b,b});}catch(g){throw this.throwIfAborted(),d.error({err:g},"Failed to locate element"),new Error(`ActionFailureError: Failed to locate element: ${g instanceof Error?g.message:g}`,{cause:g})}if(f.id===-1)throw new O("NoMatchingElementError",f.thoughts??"No matching element found");let h=await dre({logger:e,driver:this.driver,aiResponse:f,description:n,emulatorState:m});return o.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:(h.type==="NATIVE"?h.cache.elementOnlySerializedXml:void 0)??"Unknown element"},attributes:{},subSpans:[]}),{resolvedTarget:h,thoughts:f.thoughts}}async targetingActionWithAILocator(e){let{tracer:o,action:n,command:r,description:i,cacheKey:a,targetName:s,skipFetchingFullWebviewContent:l,removeWebviewContent:c,metadata:u,logger:d,cacheBustReason:m}=e,p=await this.findElement({logger:d,tracer:o,description:i,skipFetchingFullWebviewContent:l,removeWebviewContent:c,metadata:u,cacheBustReason:m}),f=p.thoughts,h=await n(p.resolvedTarget);return sm({command:r,cacheKey:a,targetName:s,updatedCache:am(p.resolvedTarget),updatedWithAI:true,logger:d}),{result:h,thoughts:f}}async targetingActionWithCache({logger:e,tracer:o,action:n,command:r,cacheKey:i,targetName:a,cacheCopyForAttempt:s}){this.emulatorSettings?.waitForStability!==false&&await this.stateManager.waitForScreenshotStability({logger:e,timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"});let l=await this.resolveTargetCacheWithTracing({logger:e,tracer:o,cache:s}),c=await n(l);return sm({command:r,cacheKey:i,targetName:a,updatedCache:am(l),updatedWithAI:false,logger:e}),{result:c,thoughts:"Successfully executed preset action with cache"}}async resolveTargetCacheWithTracing({logger:e,tracer:o,cache:n,retryWithinSmartWaiting:r=true}){let{resolvedTarget:i}=await o.startAsyncSpan("CACHE_RESOLUTION",async a=>{let s=Date.now(),l;for(;!r||Date.now()-s<3e3;)try{let c=await mre({target:n,driver:this.driver,stateManager:this.stateManager,logger:e,emulator:this.emulator});return a.attributes.serializedElement=(c.type==="NATIVE"?c.cache.elementOnlySerializedXml:void 0)??"Unknown element",{resolvedTarget:c}}catch(c){if(l=c,c instanceof Ne){if(!r)throw c;e.warn({err:c},"Failed to resolve target cache, retrying"),await Os(100,this.aborter.controller?.signal);continue}throw e.error({err:c},"Failed to resolve target cache"),c}throw l});return i}async wrapTargetingAction(e){let{tracer:o,logger:n,action:r,description:i,command:a,cacheKey:s="cache",targetName:l="target",cacheIsInvalidAfterResolution:c,skipFetchingFullWebviewContent:u=false,removeWebviewContent:d=false}=e,m={commandId:a.id},p=false,f,h;if(s==="cache"&&"cache"in a&&a.cache){let g=a.cache;l==="target"&&"target"in g?h=cloneDeep(g.target):l==="fromTarget"&&"fromTarget"in g?h=cloneDeep(g.fromTarget):l==="toTarget"&&"toTarget"in g&&(h=cloneDeep(g.toTarget));}if(a.disableCache&&(n.debug({command:a},"Cache explicitly disabled for command"),p=true,f="Cache explicitly disabled",h=void 0),c&&(p=true,f=f??"Cache invalidated after resolution",h=void 0),h&&!ru(h.resolvedDescription??"",i)&&(n.info({description:i,cacheDescription:h.resolvedDescription},"Cache description mismatch, clearing it automatically"),p=true,f="Description mismatch",h=void 0),h){let g=h.type==="NATIVE"?!!h.requirements:!!h.browserCache?.requirements;try{let b=await this.targetingActionWithCache({logger:n,tracer:o,action:r,command:a,cacheKey:s,targetName:l,cacheCopyForAttempt:h});return Qe.increment("cache_target_resolution_v2",1,["outcome:hit","platform:mobile-native",`hasRequirements:${g}`,`orgId:${this.orgId}`,"cliVersion:1.4.6"]),b}catch(b){if(this.throwIfAborted(),b instanceof O&&b.reason!=="InternalWebAgentError")throw n.error({err:b},"Failed to execute action with target cache (fatal)"),b;Qe.increment("cache_target_resolution_v2",1,["outcome:miss","platform:mobile-native",`hasRequirements:${g}`,`orgId:${this.orgId}`,"cliVersion:1.4.6"]),n.warn({err:b},"Failed to execute action with target cache, retrying with AI");}}return n.info({description:i,cacheBustedBeforeAction:p},"Prompting AI for a new element location"),await this.targetingActionWithAILocator({tracer:o,action:r,command:a,description:i,cacheKey:s,targetName:l,skipFetchingFullWebviewContent:u,removeWebviewContent:d,metadata:m,logger:n,cacheBustReason:f})}constructPerformerParams(){return {emulator:this.emulator,stateManager:this.stateManager,driver:this.driver,fixtures:this.fixtures,emulatorSettings:this.emulatorSettings,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 Zx=class extends nn{async doDrag(e,o,n,r,i){let{x1:a,y1:s,x2:l,y2:c}=n.bounds,u=a+(l-a)/2,d=s+(c-s)/2;o.attributes.startPoint={x:u,y:d};let{x1:m,y1:p,x2:f,y2:h}=r.bounds,g=m+(f-m)/2,b=p+(h-p)/2;o.attributes.endPoint={x:g,y:b};let y=i?.hoverDuration??500,T=i?.dragDuration??1e3;T===0&&(T=1);let E=Math.sqrt(Math.pow(g-u,2)+Math.pow(b-d,2))/T*1e3;await this.driver.executeInNativeContext(e,async P=>{await P.execute("mobile: dragFromToWithVelocity",{fromX:u,fromY:d,toX:g,toY:b,pressDuration:y/1e3,velocity:E,holdDuration:.5});},{operationName:"dragAndDrop"});}async executeDragAndDrop({logger:e,command:o}){let n=fe();if(o.fromTarget.type!=="description"||o.toTarget.type!=="description")throw new O("UserConfigurationError","Drag and drop only supports description targets for now");let r=o.fromTarget.description,{result:i,thoughts:a}=await this.wrapTargetingAction({command:o,tracer:n,description:r,cacheKey:"cache",targetName:"fromTarget",action:async u=>u,logger:e}),s=o.toTarget.description,{result:l,thoughts:c}=await this.wrapTargetingAction({command:o,tracer:n,description:s,cacheKey:"cache",targetName:"toTarget",action:async u=>u,logger:e});return await n.startAsyncSpan("EMULATOR_INTERACTION",async u=>{await this.doDrag(e,u,i,l,{hoverDuration:o.hoverDuration,dragDuration:o.dragDuration});},{name:"Drag and drop"}),{success:true,message:`${a}
5898
+ ${c}`}}};var Qx=class{driver;logger;constructor(e,o){this.driver=e,this.logger=o;}async getTextContent(e){let o=e.cache.xPath;return o?await this.driver.executeInNativeContext(this.logger,async r=>{try{let a=(await r.findElement("xpath",o))[zi];if(!a)return "";let s=await r.getElementAttribute(a,"label"),l=await r.getElementAttribute(a,"value");return [s,l].filter(u=>!!u&&u.trim().length>0).join(" ").trim()}catch{return ""}},{operationName:"getNativeElementTextContent"})??"":""}async getAttribute(e,o){let n=e.cache.xPath;return n?await this.driver.executeInNativeContext(this.logger,async i=>{try{let s=(await i.findElement("xpath",n))[zi];return s?await i.getElementAttribute(s,o)??"":""}catch{return ""}},{operationName:"getNativeElementAttribute"})??"":""}async getTagName(e){let o=e.cache.xPath;return o?await this.driver.executeInNativeContext(this.logger,async r=>{try{let a=(await r.findElement("xpath",o))[zi];return a?await r.getElementTagName(a)??"":""}catch{return ""}},{operationName:"getNativeElementTagName"})??"":""}async isEditable(e){throw new O("UserConfigurationError","Editable checks are not supported on iOS native elements")}async isEnabled(e){let o=e.cache.xPath;return o?await this.driver.executeInNativeContext(this.logger,async n=>{try{let i=(await n.findElement("xpath",o))[zi];return i?await n.isElementEnabled(i):!1}catch{return false}},{operationName:"isNativeElementEnabled"}):false}async isFocused(e){let o=await this.getAttribute(e,"focused");return o==="true"||o==="1"}async getStyleProperty(e,o){throw new O("UserConfigurationError","Computed style checks are not supported on iOS native elements")}},eM=class{driver;webviewContext;logger;constructor(e,o,n){this.driver=e,this.webviewContext=o,this.logger=n;}getCenter(e){let{x1:o,y1:n,x2:r,y2:i}=e.bounds;return {x:(o+r)/2,y:(n+i)/2}}async getTextContent(e){let{x:o,y:n}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(i,a,s)=>{let l=document.elementFromPoint(a,s);return l?l.innerText??l.textContent??"":""},o,n)??""}async getAttribute(e,o){let{x:n,y:r}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(a,s,l,c)=>{let u=document.elementFromPoint(s,l);return u?u.getAttribute(c)??"":""},n,r,o)??""}async getTagName(e){let{x:o,y:n}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(i,a,s)=>{let l=document.elementFromPoint(a,s);return l?l.tagName:""},o,n)??""}async isEditable(e){let{x:o,y:n}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(i,a,s)=>{let l=document.elementFromPoint(a,s);if(!l)return false;let c=l.tagName;return c==="INPUT"||c==="TEXTAREA"||c==="SELECT"||l.isContentEditable},o,n)}async isEnabled(e){let{x:o,y:n}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(i,a,s)=>{let l=document.elementFromPoint(a,s);return l?!l.disabled:false},o,n)}async isFocused(e){let{x:o,y:n}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(i,a,s)=>{let l=document.elementFromPoint(a,s);return l?document.activeElement===l:false},o,n)}async getStyleProperty(e,o){let{x:n,y:r}=this.getCenter(e);return await this.driver.executeWebViewScript(this.logger,this.webviewContext,(a,s,l,c)=>{let u=document.elementFromPoint(s,l);return u?window.getComputedStyle(u).getPropertyValue(c):""},n,r,o)??""}};var RHe=5e3,tM=class extends nn{async executeElementCheck({logger:e,command:o}){let n=Date.now(),r=(o.timeout??_n)*1e3,i=r+1e4,a,s=0,l=500,c=cloneDeep(o.cache);if(o.target.type!=="description")throw new O("UserConfigurationError","x/y targets are not supported for the Element check step");for(;s-n<r;){if(Date.now()-n>i){e.warn("Exceeded max system timeout for element check, exiting...");break}if(this.throwIfAborted(),a=await this.executeElementCheckHelper({logger:e,command:o}),s=Date.now(),!a.success)o.cache=c,c=cloneDeep(c),await Te(l,this.abortSignal),l=Math.min(Math.floor(l*1.5),RHe);else return a}let u=await this.executeElementCheckHelper({logger:e,command:o,cacheIsInvalidAfterResolution:true});if(!u.success&&c&&o.cache){let d=CK({logger:e,originalTarget:YI(c)?c.target:void 0,newTarget:o.cache.target});d&&wl(c.target,d)&&(o.cache={target:d,updatedAt:o.cache.updatedAt});}return u}async executeElementCheckHelper({logger:e,command:o,cacheIsInvalidAfterResolution:n}){let r=fe();if(o.target.type!=="description")throw new O("UserConfigurationError","x/y targets are not supported for the Element check step");let i=jp(o.assertion);try{return (await this.wrapTargetingAction({...n?{cacheIsInvalidAfterResolution:n}:{},command:o,tracer:r,action:async s=>s.type==="NATIVE"?await this.executeNativeElementCheck(e,o,s):await this.executeWebviewElementCheck(e,o,s),description:o.target.description,logger:e})).result}catch(a){return i&&(a instanceof O&&a.reason==="NoMatchingElementError"||a instanceof ds)?{success:true}:{success:false,message:`Failed to evaluate element content assertion: ${a instanceof Error?a.message:`${a}`}`}}}async executeNativeElementCheck(e,o,n){let r=fe(),{assertion:i}=o;return await r.startAsyncSpan("ELEMENT_ASSERTION",async a=>{a.targetBounds=Hl(n);let s=await this.executeElementAssertion({assertion:i,element:n,elementPropertyAccessors:new Qx(this.driver,e),span:a});return a.result=s,s},{name:"Native element check"})}async executeWebviewElementCheck(e,o,n){let r=fe(),{assertion:i}=o,s=(await this.stateManager.getContexts(e)).webviews[0];if(!s)throw new O("UserConfigurationError","No active webview context found for element check");return await r.startAsyncSpan("ELEMENT_ASSERTION",async l=>{l.targetBounds=Hl(n);let c=await this.executeElementAssertion({assertion:i,element:n,elementPropertyAccessors:new eM(this.driver,s,e),span:l});return l.result=c,c},{name:"Webview element check"})}async executeElementAssertion({assertion:e,element:o,elementPropertyAccessors:n,span:r}){switch(e.type){case "ELEMENT_CONTENT":{let i=await n.getTextContent(o)??"";return r.attributes.elementTextContent=Xo(i,500,true),Hr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})?{success:true}:{success:false,message:`The content ${Wn(e)} '${e.value}': ${i}`}}case "ELEMENT_ATTRIBUTE":{let i=null;try{i=await n.getAttribute(o,e.attr);}catch{i=null;}if(!Hr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let a=Wn(e);return {success:false,message:`The attribute ${e.attr} ${a}${e.operation==="EXISTS"?"":` '${e.value}': ${i}`}`}}return {success:true}}case "ELEMENT_EXISTENCE":{let i=false;switch(e.condition){case "EDITABLE":i=await n.isEditable(o);break;case "VISIBLE":case "EXISTS":i=true;break;case "ENABLED":{i=await n.isEnabled(o);break}case "FOCUSED":i=await n.isFocused(o);break;default:throw e.condition,new Error("Unrecognized element condition type")}return i=e.negated?!i:i,i?{success:true}:{success:false,message:`The element ${Wn(e)}`}}case "ELEMENT_NAME":{let i=await n.getTagName(o);return Hr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:true})?{success:true}:{success:false,message:`The element tag name ${Wn(e)} '${e.value}': ${i}`}}case "ELEMENT_STYLE":{let i=await n.getStyleProperty(o,e.property);if(!Hr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let a=Wn(e);return {success:false,message:`The style property ${e.property} ${a}${e.operation==="EXISTS"?"":` '${e.value}': ${i}`}`}}return {success:true}}default:throw new Error("Unrecognized element assertion type")}}};async function fre({command:t,orgId:e,logger:o,fixtures:n,abortSignal:r}){let i;try{i=await fa({orgId:e,code:t.code,fragment:!1,context:n.testContext,timeoutMs:t.timeout?t.timeout*1e3:void 0,logger:o,localTools:n.localCodeEvalTools,signal:r});}catch(a){throw new O("ActionFailureError",a instanceof O?a.message:`${a}`,{errOptions:{cause:a}})}try{JSON.stringify(i);}catch(a){throw new O("UserConfigurationError",`Return value is not serializable: ${a instanceof Error?a.message:`${a}`}`)}return {success:true,output:i}}async function hre({command:t,emulator:e,abortSignal:o}){let n;switch(t.key){case "ENTER":n="enter";break;case "BACKSPACE":n="backspace";break;default:{t.key;return {success:true}}}let r=t.repeat??1,i=t.keyPressDelayMs??0;for(let a=0;a<r;a++)a>0&&i>0&&await Te(i,o),await e.pressKey(n);return {success:true}}var gre=w__default.object({name:w__default.string(),pid:w__default.number(),bundleId:w__default.string()});var Sh=class extends nn{async doPress(e,{name:o,longPress:n}){return this.driver.executeInNativeContext(e,r=>r.executeScript("mobile: pressButton",[{name:o,isLongPress:n}]),{operationName:"pressButton"})}};var xHe="com.apple.springboard",bre=5,nM=class extends nn{async execute(e){let o;for(let n=0;n<bre;n++){this.throwIfAborted();try{let i=await this.driver.executeInNativeContext(e,s=>s.executeScript("mobile: activeAppInfo",[]),{operationName:"getActiveAppInfo"});o=gre.parse(i).bundleId;}catch(i){throw new O("UserConfigurationError",`Failed to get active app info: ${i.message}`)}if(!o)return {success:true,message:"No active app found"};if(await new Sh(this.constructPerformerParams()).doPress(e,{name:"home"}),o!==xHe)return await this.emulator.terminateApp(o),{success:true};await Te(500,this.abortSignal);}throw new O("ActionFailureError",`Failed to dismiss notification after ${bre} attempts, cannot kill the underlying app`)}};var MHe="FBSApplicationLibrary) returned nil";function yre(t){return J(t).includes(MHe)}async function Sre({driver:t,logger:e,bundleId:o,launchArguments:n}){try{await t.executeInNativeContext(e,r=>r.execute("mobile: launchApp",{bundleId:o,arguments:n}),{operationName:"launchApp"});}catch(r){throw yre(r)?new Vn(`App "${o}" is not installed on the device. Install the app on the device before running this step, or update the step to reference a bundle ID that is installed.`,{cause:r}):r}}async function Tre({command:t,logger:e}){let o;try{o=new URL(t.url).hostname;}catch(l){throw new O("UserConfigurationError",`Invalid URL: ${l instanceof Error?l.message:`${l}`}`)}let n=new CookieJar,r=lLe(fetch,n),i=Date.now(),a=await _f({command:t,baseUrl:void 0,logger:e,fetchImplementation:r}),s=Gm(n,o);return {output:Du.parse({...a,cookies:s}),success:true,message:`Successfully executed request in ${Date.now()-i}ms`}}async function Ere({command:t,emulator:e,driver:o,logger:n,getViewportBounds:r}){return e.setOrientation?await e.setOrientation(t.orientation):await o.executeInNativeContext(n,async i=>{await i.setOrientation(t.orientation==="LANDSCAPE"?"landscape":"portrait");},{operationName:"setOrientation"}),{success:true,output:{newViewportBounds:await r()}}}var _He=5e3,rM=class extends nn{async executeScreenCheck(e,o){let{timeout:n}=o,r=Date.now(),i=(n??_n)*1e3,a=i+1e4,s=0,l=500;for(;s-r<i;){if(Date.now()-r>a){e.warn("Exceeded max system timeout for screen check, exiting...");break}this.throwIfAborted();let c=await this.executeScreenCheckHelper(e,o);if(s=Date.now(),!c.success)await Te(l,this.abortSignal),l=Math.min(Math.floor(l*1.5),_He);else return c}return await this.executeScreenCheckHelper(e,o)}async executeScreenCheckHelper(e,o){let n=await this.executeNativeScreenCheckHelper(e,o);if(!o.assertion.negated&&n.success)return n;let r=await this.executeWebviewScreenCheckHelper(e,o);return r?o.assertion.negated?n.success&&r.success?n:n.success?r:n:n.success?n:r:n}async executeNativeScreenCheckHelper(e,o){let{assertion:n}=o;switch(n.type){case "CONTENT":try{let i=(await this.stateManager.getDomState(e,{skipFetchingFullWebviewContent:!0,removeWebviewContent:!0,filterOffscreenElements:!1})).graph.xml;if(!i)throw new Error("Failed to get screen XML");let a=i.includes(n.value)===!n.negated;return i.length>1e4&&(i=i.slice(0,1e4)+"...TRUNCATED"),a?{success:!0}:{success:!1,message:`The screen ${Vp({...n,negated:!n.negated})}.`}}catch(r){if(FT(r))throw r;return {success:false,message:`Failed to evaluate screen content assertion: ${r instanceof Error?r.message:`${r}`}`}}default:return n.type,{success:false,message:`Unsupported screen check assertion type: ${n.type}`}}}async executeWebviewScreenCheckHelper(e,o){let n;try{if(n=await this.stateManager.getActiveWebview(e),!n)return}catch(i){e.warn({err:i},"Failed to get active webview context during screen check");return}let{assertion:r}=o;switch(r.type){case "CONTENT":try{return await this.driver.executeWebViewScript(e,n,(a,s,l)=>document.body.innerHTML.includes(s)===!l,r.value,!!r.negated)?{success:!0}:{success:!1,message:`The webview ${Vp({...r,negated:!r.negated})}.`}}catch(i){e.warn({err:i},"Failed to check webview content during screen check");return}default:return}}};var OHe=.9,Wl=.2,qS=10,DHe=500;function uB(t,e){t.attributes.scrollableElementType=e.type,t.attributes.scrollableElementDisplay=fl(e),e.type==="CUSTOM"&&(t.attributes.scrollableElementDescription=e.target.description);}var Th=class extends nn{async getHardcodedScrollableElementBounds(e,o){let n;switch(e.type){case "SCREEN":n=this.getContainerBoundsFromViewport(o);break;case "OPEN_APP":n=this.getContainerBoundsFromViewport(o);break;case "OPEN_WEBVIEW":{n=this.getContainerBoundsFromViewport(o);break}default:{throw new Error("If Typescript complains about the line above, you missed a switch case")}}return n}getContainerBoundsFromViewport(e){return {left:e.x,top:e.y,width:e.width,height:e.height}}getContainerBoundsFromBounds(e){let o=e.x1,n=e.y1,r=e.x2,i=e.y2,a=r-o,s=i-n;return {left:o,top:n,width:a,height:s}}async executeSwipe({logger:e,command:o}){let n=fe(),r=fl(o.scrollableElement);if(o.scrollableElement.type==="CUSTOM_COORDINATES"){let{startX:a,startY:s,deltaPixels:l}=o.scrollableElement;return Math.abs(l)<qS?{success:true,message:"Successfully executed swipe action"}:(await n.startAsyncSpan("EMULATOR_INTERACTION",async c=>{uB(c,o.scrollableElement),await this.performRawSwipe({logger:e,span:c,startX:a,startY:s,deltaPixels:l,direction:o.direction,durationMs:o.durationMs});},{name:`Swipe ${o.direction} in ${r}`}),{success:true,message:"Successfully executed swipe action"})}if(o.scrollableElement.type!=="CUSTOM"){let a=await this.driver.executeInNativeContext(e,async l=>l.getWindowRect(),{operationName:"getSwipeViewportRect"}),s=await this.getHardcodedScrollableElementBounds(o.scrollableElement,a);return await n.startAsyncSpan("EMULATOR_INTERACTION",async l=>{uB(l,o.scrollableElement),await this.swipeByAbsoluteCoordinates({logger:e,span:l,direction:o.direction,percent:o.viewportPercent,durationMs:o.durationMs,containerBounds:s,relativePosition:o.relativePosition?bo(o.relativePosition):void 0});},{name:`Swipe ${o.direction} in ${r}`}),{success:true,message:"Successfully executed swipe action"}}let{thoughts:i}=await this.wrapTargetingAction({command:o,description:o.scrollableElement.target.description,action:async a=>fe().startAsyncSpan("EMULATOR_INTERACTION",async l=>(uB(l,o.scrollableElement),this.scrollInNativeContainer({logger:e,span:l,cmd:o,target:a})),{name:`Swipe ${o.direction} in ${r}`}),tracer:n,logger:e});return {success:true,message:i}}async scrollInNativeContainer({logger:e,span:o,cmd:n,target:r}){let i=r.bounds,a=this.getContainerBoundsFromBounds(i);await this.swipeByAbsoluteCoordinates({logger:e,span:o,direction:n.direction,percent:n.viewportPercent,durationMs:n.durationMs,containerBounds:a,relativePosition:n.relativePosition?bo(n.relativePosition):void 0});}async swipeByAbsoluteCoordinates({logger:e,span:o,direction:n,percent:r=OHe,durationMs:i,containerBounds:a,relativePosition:s}){o.attributes.containerBounds=a;let l=n==="up"||n==="down",c=a.width*Wl,u=a.height*Wl,d=l?(a.height-2*u)*r:(a.width-2*c)*r,m,p,f;if(s)m=a.left+s.x,p=a.top+s.y,f=d;else {let h=this.calculateSwipeCoordinates({containerBounds:a,direction:this.invertDirection(n),desiredDelta:d});m=h.startX,p=h.startY,f=h.actualDelta;}await this.performRawSwipe({logger:e,span:o,startX:m,startY:p,deltaPixels:f,direction:n,durationMs:i});}calculateSwipeCoordinates({containerBounds:e,direction:o,desiredDelta:n}){let r=e.left+e.width/2,i=e.top+e.height/2;if(o==="up"||o==="down"){let a=e.height*Wl,s=e.top+a,l=e.top+e.height-a,c=l-s,u=Math.min(Math.abs(n),c),d=c-u,m=o==="down"?l-d/2:s+d/2;return {startX:r,startY:m,actualDelta:u}}else {let a=e.width*Wl,s=e.left+a,l=e.left+e.width-a,c=l-s,u=Math.min(Math.abs(n),c),d=c-u;return {startX:o==="right"?l-d/2:s+d/2,startY:i,actualDelta:u}}}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({logger:e,span:o,startX:n,startY:r,deltaPixels:i,direction:a,durationMs:s=300}){let l=Math.abs(i);if(l<qS)return;let c=Math.max(2,Math.round(s)),u=Math.max(1,Math.min(120,Math.floor(c*.25))),d=Math.max(1,c-u),m=Math.min(l/2,Math.min(12,Math.max(l*.05,1))),p=n,f=r,h=n,g=r;a==="up"||a==="down"?(f=a==="up"?r-l:r+l,h=p,g=a==="up"?f+m:f-m):(p=a==="left"?n-l:n+l,h=a==="left"?p+m:p-m,g=f),o.attributes.pixelDelta=l,o.attributes.startPoint={x:n,y:r},o.attributes.endPoint={x:p,y:f},o.attributes.durationMs=c,await this.driver.executeInNativeContext(e,async b=>{let y={type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:n,y:r},{type:"pointerDown",button:0},{type:"pause",duration:300},{type:"pointerMove",duration:d,x:h,y:g},{type:"pointerMove",duration:u,x:p,y:f},{type:"pause",duration:300},{type:"pointerUp",button:0}]};await b.performActions([y]),await b.releaseActions();},{operationName:"performRawSwipe"}),await Te(DHe,this.abortSignal);}};var vre=20,dB=.9,LHe=2,Eh=.5,mB=.2;function kHe(t){return t.type==="NATIVE"&&t.scrollDetails!==void 0}var iM=class extends Th{async executeScrollTo({logger:e,command:o}){let n=o.target.description,r=o.scrollStepPercent??dB,i=await this.tryUseCachedScrollPosition(e,o,n);return i||this.searchForElement({logger:e,cmd:o,description:n,scrollStepPercent:r})}async resolveContainer({logger:e,scrollableElement:o,containerCache:n}){let r=await this.driver.executeInNativeContext(e,async c=>c.getWindowRect(),{operationName:"getScrollContainerViewportRect"});if(o.type==="CUSTOM_COORDINATES")return {bounds:{left:0,top:0,width:r.width,height:r.height},diffThresholdPercent:Eh};if(o.type!=="CUSTOM")return {bounds:await this.getHardcodedScrollableElementBounds(o,r),diffThresholdPercent:Eh};let i=fe(),a=o.target.description;if(n){let c=this.getBoundsFromNativeCache(n);return e.info({bounds:c},"Got container bounds from native cache"),{bounds:c,cache:n,diffThresholdPercent:Sf({containerBounds:c,viewport:r,defaultThresholdPercent:Eh})}}let{resolvedTarget:s}=await this.findElement({logger:e,description:a,tracer:i});if(s.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(s.cache);return e.info({bounds:l},"Got container bounds from AI"),{bounds:l,cache:s.cache,diffThresholdPercent:Sf({containerBounds:l,viewport:r,defaultThresholdPercent:Eh})}}getBoundsFromNativeCache(e){if(!e.bounds||e.bounds.length<4)throw new O("ActionFailureError","Native target cache has no bounds");let[o,n,r,i]=e.bounds;return {left:o,top:n,width:r-o,height:i-n}}async tryUseCachedScrollPosition(e,o,n){let r=o.cache?.target;if(r){if(r.type==="WEBVIEW")return await this.tryUseWebviewCache(e,o,n);if(kHe(r))return this.tryUseNativeScrollCacheHelper(e,o,n,r)}}async tryUseWebviewCache(e,o,n){let r=fe();try{let{thoughts:i}=await this.wrapTargetingAction({logger:e,command:o,tracer:r,description:n,action:async a=>{if(a.type!=="WEBVIEW")throw new Error("Expected WEBVIEW target but got NATIVE");await this.scrollWebviewTargetIntoView({logger:e,target:a});}});return {success:!0,message:i}}catch(i){e.warn({err:i},"Failed to use webview scroll-to cache, falling back to search");return}}async tryUseNativeScrollCacheHelper(e,o,n,r){let i=r.scrollDetails,a=fe(),s=o.scrollStepPercent??dB,l=i.scrollableElement.type==="CUSTOM"&&i.scrollableElement.cache?.type==="NATIVE"?i.scrollableElement.cache:void 0,c=await this.resolveContainer({logger:e,scrollableElement:o.scrollableElement,containerCache:l}),u=c.bounds,d=c.diffThresholdPercent,m=wre(o.scrollableElement),p=m?Math.abs(m.deltaPixels):this.calculateSwipeCoordinates({containerBounds:u,direction:o.direction,desiredDelta:js({containerBounds:u,containerInsetRatio:Wl})*s}).actualDelta,f=await this.stateManager.getLastObservedState();if(f){let E=await this.tryFindElement({logger:e,cmd:o,description:n,tracer:a,scrollDetails:this.buildScrollDetails(o,0,c.cache),knownState:f,useAIIfCacheFails:false});if(E)return e.info("Element resolved from last observed state without scrolling"),E}else e.debug("Skipping scroll-to preflight because no last observed state is available");let h=Math.abs(i.pixelDelta),g=0,b=p*LHe,y=0;for(;y<h;){this.throwIfAborted();let E=h-y,P=Math.min(E,b),M=await this.scrollByPixelDelta({logger:e,pixelDelta:P,scrollableElement:o.scrollableElement,containerCache:c.cache,direction:o.direction,scrollStepPercent:s,useVisualDiff:false});if(M===0)break;y+=M,g+=o.direction==="down"?M:-M;let I=await this.tryFindElement({logger:e,cmd:o,description:n,tracer:a,scrollDetails:this.buildScrollDetails(o,g,c.cache),useAIIfCacheFails:false});if(I)return e.info({cumulativePixelDelta:g},"Element resolved during cache replay"),I}let T=Math.max(0,Math.min(o.maxScrollAttempts??vre,2)),v=true;for(let E=0;E<T&&v;E++){this.throwIfAborted(),v=await this.scrollByPage({logger:e,direction:o.direction,containerBounds:u,scrollStepPercent:s,diffThresholdPercent:d,rawCoordinates:m}),v&&(g+=o.direction==="down"?p:-p);let P=await this.tryFindElement({logger:e,cmd:o,description:n,tracer:a,scrollDetails:this.buildScrollDetails(o,g,c.cache),useAIIfCacheFails:false});if(P)return e.info({attempt:E,cumulativePixelDelta:g},"Element resolved during cache buffer scroll"),P}if(g!==0){let E=o.direction==="down"?"up":"down";e.info({cumulativePixelDelta:g,originalDirection:o.direction,undoDirection:E,scrollableElementType:o.scrollableElement.type},"Cache replay did not resolve target; undoing scroll"),await this.scrollByPixelDelta({logger:e,pixelDelta:Math.abs(g),scrollableElement:o.scrollableElement,containerCache:c.cache,direction:E,scrollStepPercent:s});}}async tryFindElement({logger:e,cmd:o,description:n,tracer:r,scrollDetails:i,useAIIfCacheFails:a=true,knownState:s}){let l,c,u=false,d=i,m=Cre(o.cache?.target);if(m&&m.type==="NATIVE"&&m.resolvedDescription!==void 0&&ru(m.resolvedDescription,n)&&!o.disableCache)try{l=s?await r.startAsyncSpan("CACHE_RESOLUTION",async h=>{let g=await lB({target:m,logger:e,document:s.emulatorState.graph.originalDocument});return h.attributes.serializedElement=g.cache.elementOnlySerializedXml??"Unknown element",{resolvedTarget:g}}).then(({resolvedTarget:h})=>h):await this.resolveTargetCacheWithTracing({logger:e,tracer:r,cache:m,retryWithinSmartWaiting:!1}),u=!0,c="Successfully resolved scroll to target with cache.",e.info("Successfully resolved scroll to target from cache");}catch(f){e.warn({err:f},"Failed to resolve target from cache");}if(l&&u&&i){let f=await this.correctNativeTargetIntoView({logger:e,tracer:r,cmd:o,resolvedTarget:l,scrollDetails:i});d=f.scrollDetails,f.resolvedTarget?l=f.resolvedTarget:(l=void 0,u=false);}if(!l&&!a)return null;if(!l)try{let f=LA(n),h=await this.findElement({logger:e,description:f,tracer:r,knownState:s,metadata:{commandId:o.id,source:"SCROLL_TO"}});if(h.resolvedTarget.type==="WEBVIEW")return await this.scrollWebviewTargetIntoView({logger:e,target:h.resolvedTarget}),sm({command:o,updatedCache:am(h.resolvedTarget),updatedWithAI:!0,logger:e}),{success:!0,message:h.thoughts};if(h.resolvedTarget.type!=="NATIVE")return null;l=h.resolvedTarget,c=h.thoughts;}catch(f){if(f instanceof O&&f.reason==="NoMatchingElementError")return null;throw e.warn({err:f},"Failed to find scroll-to target with AI"),f}if(l&&!u&&i)try{let f=await this.correctNativeTargetIntoView({logger:e,tracer:r,cmd:o,resolvedTarget:l,scrollDetails:i});d=f.scrollDetails,f.resolvedTarget&&(l=f.resolvedTarget);}catch(f){e.warn({err:f},"Failed to reposition AI-resolved scroll-to target for stable cache generation");}return sm({command:o,updatedCache:Cre({...am(l),...d?{scrollDetails:d}:{}}),updatedWithAI:!u,logger:e}),{success:true,message:c}}async scrollWebviewTargetIntoView({logger:e,target:o}){let n=await this.stateManager.getActiveWebview(e);if(!n)throw new Error("ActionFailureError: Found webview element for scroll_to, but no active webview context is available.");let r=o.cache.browserCache?.generatedSelectors;if(!r?.length)throw new Error("ActionFailureError: Found webview element for scroll_to, but the element has no webview selector cache.");let i=Object.keys(o.cache.browserCache?.requirements?.attributes??{});if(!await this.driver.executeWebViewScript(e,n,(s,l,c)=>{let u=s.resolveWebviewTargetCache({selectors:l,attributesToFetch:c});if(!u)return false;for(let d of u.workingSelectors){let m=document.querySelector(d);if(m)return m.scrollIntoView({block:"center",inline:"nearest"}),true}return false},r,i))throw new Error("ActionFailureError: Found webview element for scroll_to, but could not resolve the element using its webview selector cache.")}async correctNativeTargetIntoView({logger:e,tracer:o,cmd:n,resolvedTarget:r,scrollDetails:i}){let a=await this.getCorrectiveScrollForTarget({logger:e,resolvedTarget:r});if(!a)return {resolvedTarget:r,scrollDetails:i};e.info({bounds:r.bounds,correction:a},"Repositioning scroll-to target to the preferred viewport anchor");let s=i.scrollableElement.type==="CUSTOM"&&i.scrollableElement.cache?.type==="NATIVE"?i.scrollableElement.cache:void 0,l=await this.scrollByPixelDelta({logger:e,pixelDelta:a.pixelDelta,scrollableElement:i.scrollableElement,containerCache:s,direction:a.direction,scrollStepPercent:n.scrollStepPercent??dB,useVisualDiff:true});if(l===0)return e.info({bounds:r.bounds,correction:a},"Skipping corrective scroll update because the viewport did not move"),{resolvedTarget:r,scrollDetails:i};let c;try{c=await this.resolveTargetCacheWithTracing({logger:e,tracer:o,cache:r.cache,retryWithinSmartWaiting:!1});}catch(h){return e.warn({err:h},"Failed to re-resolve scroll-to target after corrective scroll"),{resolvedTarget:r,scrollDetails:i}}let u=r.bounds,d=c.bounds;if(u.x1===d.x1&&u.y1===d.y1&&u.x2===d.x2&&u.y2===d.y2)return e.info({bounds:r.bounds,correction:a,appliedCorrectionPixels:l},"Skipping corrective scroll update because the target did not move (viewport at scroll extent)"),{resolvedTarget:c,scrollDetails:i};let p={...i,pixelDelta:nA({currentPixelDelta:i.pixelDelta,baseDirection:i.direction,correctionDirection:a.direction,correctionPixels:l})},f=await this.getCorrectiveScrollForTarget({logger:e,resolvedTarget:c});return f?(e.warn({bounds:c.bounds,correction:f},"Corrective scroll did not bring the scroll-to target into the preferred viewport anchor"),{resolvedTarget:c,scrollDetails:p}):{resolvedTarget:c,scrollDetails:p}}async searchForElement({logger:e,cmd:o,description:n,scrollStepPercent:r}){let i=fe(),a=await this.resolveContainer({logger:e,scrollableElement:o.scrollableElement});return this.scrollAndSearch({logger:e,cmd:o,description:n,tracer:i,scrollStepPercent:r,resolvedContainer:a})}async scrollAndSearch({logger:e,cmd:o,description:n,tracer:r,scrollStepPercent:i,resolvedContainer:a}){let s=0,l=a.bounds,c=a.diffThresholdPercent,u=wre(o.scrollableElement),d=u?Math.abs(u.deltaPixels):this.calculateSwipeCoordinates({containerBounds:l,direction:o.direction,desiredDelta:js({containerBounds:l,containerInsetRatio:Wl})*i}).actualDelta,m=true,p=o.maxScrollAttempts??vre;for(let g=0;g<p;g++){this.throwIfAborted();let b=this.buildScrollDetails(o,s,a.cache),y=await this.tryFindElement({logger:e,cmd:o,description:n,tracer:r,scrollDetails:b});if(y)return y;if(!m)throw new Error(`ActionFailureError: Could not find element "${n}" after scrolling to the end`);e.debug({attempt:g,cumulativePixelDelta:s},"Element not found, scrolling further"),m=await this.scrollByPage({logger:e,direction:o.direction,containerBounds:l,scrollStepPercent:i,diffThresholdPercent:c,rawCoordinates:u}),s+=o.direction==="down"?d:-d;}let f=this.buildScrollDetails(o,s,a.cache),h=await this.tryFindElement({logger:e,cmd:o,description:n,tracer:r,scrollDetails:f});if(h)return h;throw new Error(`ActionFailureError: Could not find element "${n}" after ${p} scroll attempts`)}buildScrollDetails(e,o,n){return e.scrollableElement.type==="CUSTOM"?{pixelDelta:o,scrollableElement:{type:"CUSTOM",target:e.scrollableElement.target,cache:n},direction:e.direction}:e.scrollableElement.type==="CUSTOM_COORDINATES"?{pixelDelta:o,scrollableElement:e.scrollableElement,direction:e.direction}:{pixelDelta:o,scrollableElement:e.scrollableElement,direction:e.direction}}async scrollByPage({logger:e,direction:o,containerBounds:n,scrollStepPercent:r,diffThresholdPercent:i,rawCoordinates:a}){return fe().startAsyncSpan("EMULATOR_INTERACTION",async l=>(l.attributes.containerBounds=n,l.attributes.direction=o,(await this.executeScrollGesture({logger:e,span:l,direction:o,containerBounds:n,scrollStepPercent:r,diffThresholdPercent:i,rawCoordinates:a})).canScrollMore),{name:`Scroll ${o} by one page`})}async scrollByPixelDelta({logger:e,pixelDelta:o,scrollableElement:n,containerCache:r,direction:i,scrollStepPercent:a,useVisualDiff:s=false}){if(Math.abs(o)<qS)return 0;let l=fe(),c,u=Eh,d,m,p;if(n.type==="CUSTOM_COORDINATES")d=n.startX,m=n.startY,p=n.deltaPixels;else {c=await this.resolveContainer({logger:e,scrollableElement:n,containerCache:r});let g=c.bounds;u=c.diffThresholdPercent;let b=js({containerBounds:g,containerInsetRatio:Wl})*a,y=this.calculateSwipeCoordinates({containerBounds:g,direction:i,desiredDelta:b});d=y.startX,m=y.startY,p=y.actualDelta;}let f=Math.ceil(Math.abs(o)/p),h=this.invertDirection(i);return e.debug({pixelDelta:o,swipeDirection:h,scrollableElementType:n.type,startX:d,startY:m,maxScrollPerStep:p,numScrolls:f},"scrollByPixelDelta calculated parameters"),l.startAsyncSpan("EMULATOR_INTERACTION",async g=>{g.attributes.pixelDelta=o,g.attributes.numScrolls=f,g.attributes.maxScrollPerStep=p,g.attributes.startX=d,g.attributes.startY=m;let b=0;for(let y=0;y<f;y++){this.throwIfAborted();let T=Math.abs(o)-b,v=Math.min(p,T);if(s){let E=await this.executeScrollGesture({logger:e,span:g,direction:i,containerBounds:c?.bounds,scrollStepPercent:a,diffThresholdPercent:u,rawCoordinates:{type:"CUSTOM_COORDINATES",startX:d,startY:m,deltaPixels:v}});if(E.didScroll&&(b+=v),!E.canScrollMore)break}else {if(v<qS)break;await this.performRawSwipe({logger:e,span:g,startX:d,startY:m,deltaPixels:v,direction:h}),b+=v;}}return g.attributes.appliedPixels=b,b},{name:`Scroll ${i} by ${Math.round(Math.abs(o))}px`})}async getCorrectiveScrollForTarget({logger:e,resolvedTarget:o}){let n=o.bounds,r=await this.stateManager.getViewportBounds(e),i=Math.max(1,r.bottom-r.top),a=r.top+i*mB,s=r.bottom-i*mB,l=rA({viewportTop:r.top,viewportBottom:r.bottom,elementHeight:n.y2-n.y1,targetTopRatio:mB}),c=n.y1>=r.top&&n.y2<=r.bottom,u=n.y1<a||n.y2>s,d=await this.isResolvedTargetVisible({logger:e,resolvedTarget:o}),m=l-n.y1;if(!(c&&d!==false&&!u)){if(m>0)return {direction:"up",pixelDelta:m};if(m<0)return {direction:"down",pixelDelta:Math.abs(m)}}}async isResolvedTargetVisible({logger:e,resolvedTarget:o}){if(o.type==="WEBVIEW")return null;let n=o.cache.xPath;if(!n)return Are(o.cache.elementOnlySerializedXml);let r=await this.getTargetVisibilityFromDriver({logger:e,xPath:n});return r!==null?r:Are(o.cache.elementOnlySerializedXml)}async getTargetVisibilityFromDriver({logger:e,xPath:o}){try{return await this.driver.executeInNativeContext(e,async n=>{let i=(await n.findElement("xpath",o))?.[zi];if(!i)return null;let a=await n.getElementAttribute(i,"visible");return a?a!=="false":null},{operationName:"getScrollToTargetVisibility"})}catch{return null}}async executeScrollGesture({logger:e,span:o,direction:n,containerBounds:r,scrollStepPercent:i,diffThresholdPercent:a=Eh,rawCoordinates:s}){let l=await this.stateManager.getRawScreenshotBase64({logger:e}),c,u,d;if(s)c=s.startX,u=s.startY,d=s.deltaPixels;else {if(!r)throw new Error("Expected container bounds for scroll gesture");let g=js({containerBounds:r,containerInsetRatio:Wl})*i,b=this.calculateSwipeCoordinates({containerBounds:r,direction:n,desiredDelta:g});c=b.startX,u=b.startY,d=b.actualDelta;}await this.performRawSwipe({logger:e,span:o,startX:c,startY:u,deltaPixels:d,direction:this.invertDirection(n)});let m=await this.stateManager.getRawScreenshotBase64({logger:e}),p=Yc(l,m),f=p>a,h=p>a;return e.debug({diffPercent:p,didScroll:f,diffThresholdPercent:a,canScrollMore:h,direction:n,actualDelta:d,rawCoordinates:s},"Scroll gesture visual diff result"),{didScroll:f,canScrollMore:h}}};function Cre(t){return !t||t.type!=="NATIVE"?t:iA(t)}function wre(t){if(t.type==="CUSTOM_COORDINATES")return t}function Are(t){if(!t)return null;let e=t.match(/\bvisible="(true|false)"/);return e?e[1]==="true":null}function FHe(t){return "iterations"in t}function BHe(t){let e={relativePosition:t.relativePosition?bo(t.relativePosition):void 0},o=t.iterations??(t.doubleTap?2:void 0),n=t.tapDelayMs??t.doubleTapDelayMs;if(o!==void 0&&(!Number.isInteger(o)||o<1))throw new O("UserConfigurationError","iterations must be a positive integer");if(n!==void 0&&(!Number.isInteger(n)||n<0))throw new O("UserConfigurationError","tapDelayMs must be >= 0");if(o&&o>1&&t.longPress)throw new O("UserConfigurationError","Cannot specify both more than one tap iteration and long press at the same time");if(n!==void 0&&(!o||o<2))throw new O("UserConfigurationError","tapDelayMs requires iterations >= 2");if(t.longPress){if(n!==void 0)throw new O("UserConfigurationError","tapDelayMs cannot be used with longPress");return {...e,longPress:true,longPressDurationMs:t.longPressDurationMs}}return o!==void 0?{...e,iterations:o,tapDelayMs:n}:e}var vh=class extends nn{async tapOnAbsoluteCoordinates(e,o){let n=o.x,r=o.y;if(e.info({x:n,y:r},"Tap at coordinates"),"longPress"in o&&o.longPress){let i=(o.longPressDurationMs??2e3)/1e3;await this.driver.executeInNativeContext(e,a=>a.executeScript("mobile: touchAndHold",[{x:n,y:r,duration:i}]),{operationName:"touchAndHold"});return}if(FHe(o)){let i=o.tapDelayMs??100;for(let a=0;a<o.iterations;a++)await this.emulator.tap(n,r),a<o.iterations-1&&await Te(i);return}await this.emulator.tap(n,r);}async tapOnTarget({logger:e,target:o,options:n,targetBounds:r=Hl(o)}){return await fe().startAsyncSpan("EMULATOR_INTERACTION",async a=>{a.attributes.options=n;let{x1:s,y1:l,x2:c,y2:u}=o.bounds,d=c-s,m=u-l,p=n?.relativePosition?.x??d/2,f=n?.relativePosition?.y??m/2;p=Math.max(0,Math.min(p,d)),f=Math.max(0,Math.min(f,m));let h=s+p,g=l+f;await this.tapOnAbsoluteCoordinates(e,{x:h,y:g,...n}),a.attributes.point={x:h,y:g},a.targetBounds=r;},{name:"Tap on target"})}async executeTap({logger:e,command:o}){let n=BHe(o),r=fe();if(o.target.type==="coordinates"||o.target.type==="absolute_percent"){let s=await this.driver.executeInNativeContext(e,async u=>u.getWindowSize(),{operationName:"getTapWindowSize"}),l,c;return o.target.type==="coordinates"?(l=o.target.xPercent*s.width,c=o.target.yPercent*s.height):(l=o.target.x/100*s.width,c=o.target.y/100*s.height),await r.startAsyncSpan("EMULATOR_INTERACTION",async u=>{await this.tapOnAbsoluteCoordinates(e,{...n,x:l,y:c}),u.attributes.point={x:l,y:c};},{name:`Tap at coordinates ${l}, ${c}`}),{success:true,message:`Tapped at ${l}, ${c}`}}let i=o.target.description,{thoughts:a}=await this.wrapTargetingAction({logger:e,tracer:r,command:o,action:s=>this.tapOnTarget({logger:e,target:s,options:n}),description:i});return {success:true,message:a}}};function Rre(t,e,o){let n=t.resolveWebviewTargetCache({selectors:e,attributesToFetch:o});if(!n)return {cleared:false,reason:"target_not_found"};let r=a(n.workingSelectors);if(!r)return {cleared:false,reason:"editable_not_found"};c(r,"");let i=l(r);return {cleared:i==="",reason:i===""?void 0:"still_non_empty",textLength:i.length};function a(u){for(let d of u){let m=document.querySelector(d);if(!m)continue;let p=s(m);if(p)return p;m instanceof HTMLElement&&(m.click(),m.focus());let f=s(document.activeElement);if(f)return f}}function s(u){if(u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement||u instanceof HTMLElement&&u.isContentEditable)return u}function l(u){return u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement?u.value:u.textContent??""}function c(u,d){if(u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement){let m=u instanceof HTMLTextAreaElement?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,p=Object.getOwnPropertyDescriptor(m,"value")?.set;p?p.call(u,d):u.value=d;}else u.textContent=d;u.dispatchEvent(new InputEvent("input",{bubbles:true,inputType:"deleteContentBackward"})),u.dispatchEvent(new Event("change",{bubbles:true}));}}var lm=25,xre=150,UHe=2,Mre=1500,Pre=100,zHe=6e3,$He=100,VHe=24,jHe=4,Ire="\uE003",HHe=new Set(["XCUIElementTypeTextField","XCUIElementTypeSecureTextField","XCUIElementTypeTextView","TextField","SecureTextField","TextView"]),aM=class extends nn{async doType(e,o){let n=fe();if(!o.target){if(o.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(e,o),{success:true,message:"Successfully executed type action"}}if(o.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Type step");let{thoughts:r}=await this.wrapTargetingAction({logger:e,tracer:n,command:o,action:async i=>{await this.doTypeHelper(e,o,i);},description:o.target.description});return {success:true,message:r}}async doTypeHelper(e,o,n){let r=new vh(this.constructPerformerParams()),i=Hl(n);o.clearContent&&await this.clearContent(e,o,n,r,i),await this.shouldTapToFocusTarget(e,n)&&await r.tapOnTarget({logger:e,target:n,options:{},targetBounds:i}),await this.ensureKeyboardOpen(e,n,r,i),await this.injectKeys(e,o);}async shouldTapToFocusTarget(e,o){return o.type==="WEBVIEW"?await this.shouldTapWebviewTarget(e,o):await this.shouldTapNativeTarget(e,o)}async shouldTapWebviewTarget(e,o){let n=await this.releaseCompetingWebviewFocus(e,o);return !(n.targetFocused||!n.targetResolved&&await this.isKeyboardOpen(e))}async shouldTapNativeTarget(e,o){let n=await this.resolveNativeTargetFocus(e,o);return !(n.resolved&&n.focused||!n.resolved&&await this.isKeyboardOpen(e))}async ensureKeyboardOpen(e,o,n,r){if(!await this.waitForKeyboard(e)){for(let i=0;i<UHe;i++)if(this.throwIfAborted(),e.info({attempt:i+1},"Keyboard did not open after tapping the target, re-tapping to recover"),await n.tapOnTarget({logger:e,target:o,options:{},targetBounds:r}),await this.waitForKeyboard(e))return;throw new Error("The system keyboard never opened after tapping the target, so the typed text would not be entered")}}async sendKeys(e,o){await this.waitForKeyboard(e),await this.injectKeys(e,o);}async waitForKeyboard(e){return await fe().startAsyncSection("Waiting for system keyboard to settle",async(n,r)=>{let i=Date.now()+zHe;for(;Date.now()<i;){if(this.throwIfAborted(),await this.waitForKeyboardSettle(e,i))return r.attributes.settleMs=Mre,true;await Te(Pre,this.aborter.controller?.signal);}return r.attributes.timedOut=true,false})}async waitForKeyboardSettle(e,o){if(!await this.isKeyboardOpen(e))return false;let n=Date.now()+Mre;for(;Date.now()<n;){if(this.throwIfAborted(),Date.now()>=o||!await this.isKeyboardOpen(e))return false;await Te(Math.min(Pre,n-Date.now()),this.aborter.controller?.signal);}return true}async isKeyboardOpen(e){return await this.driver.executeInNativeContext(e,o=>o.isKeyboardShown(),{operationName:"isKeyboardShown"})}async injectKeys(e,o){let n=fe(),r=o.keyPressDelayMs??lm;r<=0&&(r=lm),await n.startAsyncSpan("EMULATOR_INTERACTION",async()=>{try{r!==lm&&await this.driver.executeInNativeContext(e,async a=>a.updateSettings({maxTypingFrequency:1e3/r}),{operationName:"updateKeyInjectionDelay"});let i=[];for(let a=0;a<o.text.length;a+=xre)i.push(o.text.slice(a,a+xre));for(let a of i)await this.driver.executeInNativeContext(e,async s=>{await s.performActions(WHe(a)),await s.releaseActions();},{operationName:"typeText",maxAttempts:1,attemptTimeoutMs:cA(r,a)});}finally{r!==lm&&await this.driver.executeInNativeContext(e,async i=>i.updateSettings({maxTypingFrequency:1e3/lm}),{operationName:"resetKeyInjectionDelay"});}},{name:`Typing "${o.text}"${r?` with a ${r}ms delay`:""}`});}async clearContent(e,o,n,r,i){if(n.type==="WEBVIEW"){await this.clearWebviewContent(e,o,n,r,i);return}switch(o.replaceStrategy??"auto"){case "auto":await this.clearContentAutomatically(e,n,r,i);return;case "programmatic":await this.clearContentWithProgrammatic(n,e,{verify:false});return;case "long-press":await this.clearContentWithSelectAll(e,n,r,i);return;case "backspace":await this.clearContentWithBackspace(n,e,r,i);return}}async clearWebviewContent(e,o,n,r,i){switch(o.replaceStrategy??"auto"){case "long-press":await this.clearWebviewWithLongPress(e,n,r,i);return;case "programmatic":await this.clearWebviewProgrammatically(e,n);return;case "backspace":await this.clearWebviewWithBackspaceOnly(e,n,r,i);return;case "auto":await this.clearWebviewAutomatically(e,n,r,i);return}}async clearWebviewWithLongPress(e,o,n,r){if(!await this.clearContentWithSelectAll(e,o,n,r))throw new Error("ActionFailureError: Could not clear the iOS webview input with long-press Select All.")}async clearWebviewProgrammatically(e,o){if(!await this.clearWebviewContentWithDom(e,o))throw new Error("ActionFailureError: Could not clear the iOS webview input programmatically.")}async clearWebviewWithBackspaceOnly(e,o,n,r){if(!await this.clearWebviewContentWithBackspace(e,o,n,r))throw new Error("ActionFailureError: Could not clear the iOS webview input before typing.")}async clearWebviewAutomatically(e,o,n,r){if(!await this.clearWebviewContentWithDom(e,o)&&!await this.clearContentWithSelectAll(e,o,n,r)&&!await this.clearWebviewContentWithBackspace(e,o,n,r))throw new Error("ActionFailureError: Could not clear the iOS webview input before typing.")}async clearWebviewContentWithDom(e,o){let n=await this.stateManager.getActiveWebview(e);if(!n)throw new Error("ActionFailureError: Found webview element for type, but no active webview context is available.");let r=o.cache.browserCache?.generatedSelectors;if(!r?.length)throw new Error("ActionFailureError: Found webview element for type, but the element has no webview selector cache.");let i=Object.keys(o.cache.browserCache?.requirements?.attributes??{});return await fe().startAsyncSection("Clearing webview content programmatically",async(s,l)=>{let c=await this.driver.executeWebViewScript(e,n,Rre,r,i);return l.attributes.result=c,c.cleared})}async releaseCompetingWebviewFocus(e,o){let n=await this.stateManager.getActiveWebview(e);if(!n)return {targetResolved:false,targetFocused:false};let r=o.cache.browserCache?.generatedSelectors;if(!r?.length)return {targetResolved:false,targetFocused:false};let i=Object.keys(o.cache.browserCache?.requirements?.attributes??{});return await fe().startAsyncSection("Releasing focus from the competing webview element before typing",async(s,l)=>{let c=await this.driver.executeWebViewScript(e,n,(u,d,m)=>{let p=u.resolveWebviewTargetCache({selectors:d,attributesToFetch:m}),f=p?g(p.workingSelectors):void 0;if(!f)return {targetResolved:false,targetFocused:false,blurred:false};let h=document.activeElement;if(h===f)return {targetResolved:true,targetFocused:true,blurred:false};if(h instanceof HTMLElement)return h.blur(),{targetResolved:true,targetFocused:false,blurred:true};return {targetResolved:true,targetFocused:false,blurred:false};function g(y){for(let T of y){let v=b(document.querySelector(T));if(v)return v}}function b(y){if(y instanceof HTMLInputElement||y instanceof HTMLTextAreaElement||y instanceof HTMLElement&&y.isContentEditable)return y}},r,i);return l.attributes.result=c,{targetResolved:c.targetResolved,targetFocused:c.targetFocused}})}async resolveNativeTargetFocus(e,o){if(o.type!=="NATIVE")return {resolved:false};let n=o.cache.xPath;if(!pB(o)||!n)return {resolved:false};try{return await this.driver.executeInNativeContext(e,async r=>{let a=(await r.findElement("xpath",n))[zi];if(!a)return {resolved:!1};let s=await r.getElementAttribute(a,"focused");return {resolved:!0,focused:s==="true"||s==="1"}},{operationName:"readNativeTargetFocusState",maxAttempts:1})}catch(r){return e.debug({err:r},"Failed to read native target focus state before typing"),{resolved:false}}}async clearWebviewContentWithBackspace(e,o,n,r){let i=await this.readWebviewTargetText(o,e);return i===void 0?(e.debug("Skipping webview backspace clear because the target text is not readable"),false):i===""?true:(await n.tapOnTarget({logger:e,target:o,options:{},targetBounds:r}),await this.waitForKeyboard(e)?this.clearTextWithAdaptiveBackspace({logger:e,initialLength:i.length,readText:()=>this.readWebviewTargetText(o,e),spanName:"Clearing webview content with bounded backspaces",operationName:"backspaceClearWebviewTextInput"}):false)}async clearContentAutomatically(e,o,n,r){let i=await this.readNativeTargetText(o,e);i===""||(i!==void 0||_re(o))&&await this.clearContentWithProgrammatic(o,e,{verify:true})||await this.clearContentWithSelectAll(e,o,n,r)||await this.clearContentWithBackspace(o,e,n,r);}async clearContentWithSelectAll(e,o,n,r){await n.tapOnTarget({logger:e,target:o,options:{longPress:true},targetBounds:r});let i=fe();try{return await i.startAsyncSection("Clearing any content from the focused field",()=>this.clearContentHelper(e)),!0}catch(a){return e.warn({err:a},"Failed to find select all button, continuing..."),false}}async clearContentHelper(e){await this.driver.executeInNativeContext(e,async o=>{let n=o.$('-ios predicate string:label == "Select All"');await n.waitForExist({timeout:750}),await n.click();},{operationName:"selectAllText",maxAttempts:1}),await this.driver.executeInNativeContext(e,async o=>{await o.keys([Ire]);},{operationName:"deleteSelectedText"});}async clearContentWithProgrammatic(e,o,n){if(!_re(e))return false;let r=e.cache.xPath;if(!r)return false;let i=fe();try{if(await i.startAsyncSection("Clearing content programmatically",()=>this.driver.executeInNativeContext(o,async s=>{await(await s.$(r)).clearValue();},{operationName:"clearNativeTextInput",maxAttempts:1})),!n.verify)return !0;let a=await this.readNativeTargetText(e,o);return a===void 0||a===""}catch(a){return o.warn({err:a},"Failed to clear native input programmatically, falling back..."),false}}async clearContentWithBackspace(e,o,n,r){let i=await this.readNativeTargetText(e,o);return i===void 0?(o.debug("Skipping native backspace clear because the target text is not readable"),false):i===""?true:(await n.tapOnTarget({logger:o,target:e,options:{},targetBounds:r}),this.clearTextWithAdaptiveBackspace({logger:o,initialLength:i.length,readText:()=>this.readNativeTargetText(e,o),spanName:"Clearing content with bounded backspaces",operationName:"backspaceClearNativeTextInput"}))}async clearTextWithAdaptiveBackspace({logger:e,initialLength:o,readText:n,spanName:r,operationName:i}){return await fe().startAsyncSection(r,async(s,l)=>{let c=o,u=1,d=0,m=0;for(let p=0;p<VHe;p++){let f=$He-d;if(f<=0)break;let g=p===0||m>0?1:Math.max(1,Math.min(Math.ceil(c/2),Math.floor(c/u),f));e.info({round:p,lengthBefore:c,keysToIssue:g,maxUnitsPerKey:u},"Issuing bounded backspaces"),await this.driver.executeInNativeContext(e,async T=>{await T.keys(Array.from({length:g},()=>Ire));},{operationName:i,maxAttempts:1}),d+=g;let b;for(let T=0;T<jHe&&(b=await n(),b===void 0);T++);if(b===void 0)return false;let y=c-b.length;if(e.info({round:p,lengthAfter:b.length,deleted:y,totalKeys:d},"Bounded backspace iteration result"),b.length===0)return l.attributes.totalKeys=d,true;if(y<=0){if(m+=1,m>=2)return false;c=b.length;continue}m=0,u=Math.max(u,Math.ceil(y/g)),c=b.length;}return l.attributes.totalKeys=d,false})}async readNativeTargetText(e,o){if(e.type!=="NATIVE")return;let n=e.cache.xPath;if(!(!pB(e)||!n))try{return await this.driver.executeInNativeContext(o,async r=>{let a=(await r.findElement("xpath",n))[zi];return !a||await r.getElementTagName(a)==="XCUIElementTypeSecureTextField"?void 0:await r.getElementAttribute(a,"value")??""},{operationName:"readNativeTextInputValue",maxAttempts:1})}catch(r){o.debug({err:r},"Failed to read native input text for clear verification");return}}async readWebviewTargetText(e,o){let n=await this.stateManager.getActiveWebview(o);if(!n)return;let r=e.cache.browserCache?.generatedSelectors;if(!r?.length)return;let i=Object.keys(e.cache.browserCache?.requirements?.attributes??{});try{return await this.driver.executeWebViewScript(o,n,(s,l,c)=>{let u=s.resolveWebviewTargetCache({selectors:l,attributesToFetch:c});if(u)for(let d of u.workingSelectors){let m=document.querySelector(d);if(m instanceof HTMLInputElement||m instanceof HTMLTextAreaElement)return m.value;if(m instanceof HTMLElement&&m.isContentEditable)return m.textContent??""}},r,i)}catch(a){o.debug({err:a},"Failed to read webview input text for clear verification");return}}};function _re(t){if(t.type!=="NATIVE"||!pB(t)||!t.cache.xPath)return false;let e=t.cache.elementOnlySerializedXml;if(!e)return false;for(let o of HHe)if(e.includes(`<${o}`))return true;return false}function pB(t){return t.cache.sourceTree!=="native"}function WHe(t){let e={type:"key",id:"pressKeys",actions:[]};for(let o of [...t])e.actions.push({type:"keyDown",value:o},{type:"keyUp",value:o});return [e]}var sM=class extends nn{async executeVisualDiff({logger:e,command:o,updateGoldenFiles:n}){let r=this.fixtures.visualDiffGoldenStorage;await this.stateManager.waitForScreenshotStability({logger:e,timeoutMs:1e4,reason:"visual diff",signal:this.abortSignal});let i=await this.stateManager.getRawScreenshotBase64({logger:e});return lA({goldenStorage:r,command:o,currentScreenshotBase64:i,threshold:o.threshold??Og,updateGoldenFiles:n,tracer:fe(),logger:e})}};async function Ore({command:t,abortSignal:e}){return await Te(t.timeoutSecs*1e3,e),{success:true}}async function GHe(t,e){try{await t.executeInNativeContext(e,o=>o.executeScript("mobile: pressButton",[{name:"home"}]),{operationName:"pressHomeButton"}),e.info("Navigated to home screen");}catch(o){e.warn({err:o},"Failed to press home button");}}var fB=["io.appium."],hB=["com.facebook.WebDriverAgentRunner.xctrunner"];async function qHe(t,e){let o;try{o=await t.listApps();}catch(a){e.warn({err:a},"Failed to list installed apps");return}let n=o.filter(({bundleId:a})=>!hB.includes(a)&&!fB.some(s=>a.startsWith(s)));e.info({count:n.length},"Terminating all apps");let i=(await Promise.allSettled(n.map(async a=>{try{return await t.terminateApp(a.bundleId),a.bundleId}catch(s){return e.debug({err:s,bundleId:a.bundleId},"Failed to terminate app (may not be running)"),null}}))).filter(a=>a.status==="fulfilled"&&a.value!==null).length;i>0&&e.info({count:i},"Terminated apps");}async function KHe(t,e){e.info("Resetting privacy settings for all apps");try{await t.resetSettings();}catch(o){e.warn({err:o},"Failed to reset privacy settings");}}async function Dre(t){let{emulator:e,driver:o,logger:n}=t;await GHe(o,n),await qHe(e,n),await KHe(e,n);}var wu=class t extends nn{emulatorSettings;logger;splitInstalledApps(e){let o=[],n=[];for(let{bundleId:r}of e)if(!(hB.includes(r)||fB.some(i=>r.startsWith(i)))){if(r.startsWith("com.apple.")){n.push(r);continue}o.push(r);}return {installedApps:o,prunedApps:n}}constructor(e){super(e),this.logger=e.logger,this.emulatorSettings=e.emulatorSettings;}async locateElement({description:e}){let o=await this.findElement({logger:this.logger,tracer:fe(),description:e,metadata:{source:"EDITOR_LOCATE"}});return {bounds:Hl(o.resolvedTarget),thoughts:o.thoughts}}static async init({driver:e,logger:o,fixtures:n,orgId:r,options:i,abortController:a,emulator:s,generator:l,aiSettings:c}){let u={controller:a},d=i?.emulator??{},m=await Yx.init({driver:e,orgId:r,emulator:s,options:d,aborter:u}),p=new t({generator:l,aiSettings:c,emulator:s,driver:e,stateManager:m,logger:o,fixtures:n,aborter:u,orgId:r,emulatorSettings:d});return await p.initializeSettings(),p}async executeCommand(e){let o=["type","a11yData","thoughts","cache","code"],n;try{n=await Af({obj:e.command,context:this.fixtures.testContext,bannedKeys:o,orgId:this.orgId,logger:this.logger,signal:this.abortSignal,localTools:this.fixtures.localCodeEvalTools});}catch(r){throw this.throwIfAborted(),new Error(`ActionFailureError: Failed to substitute template strings in command: ${r.message}`,{cause:r})}try{let r=await this.executeCommandHelper(e);return !r.success&&(e.command.type==="SCREEN_CHECK"||e.command.type==="ELEMENT_CHECK")?{...r,message:_T(r.message)}:r}catch(r){throw r.name!=="AbortError"&&this.logger.error({err:r},"Error thrown in action controller"),r}finally{Rf(e.command,n);}}async executeCommandHelper({command:e,updateGoldenFiles:o}){switch(e.type){case "TAP":return new vh(this.constructPerformerParams()).executeTap({logger:this.logger,command:e});case "SWIPE":return new Th(this.constructPerformerParams()).executeSwipe({logger:this.logger,command:e});case "DRAG_AND_DROP":return new Zx(this.constructPerformerParams()).executeDragAndDrop({logger:this.logger,command:e});case "SCROLL_TO":return new iM(this.constructPerformerParams()).executeScrollTo({logger:this.logger,command:e});case "TYPE":return new aM(this.constructPerformerParams()).doType(this.logger,e);case "STATE":{let n=await this.stateManager.getDomState(this.logger),r=await this.stateManager.getContexts(this.logger);return {output:{xml:n.graph.xml,contexts:r},success:true}}case "OPEN_APP":{let n=[];if(e.intentExtras)try{let r=JSON.parse(e.intentExtras);n=w__default.string().array().parse(r);}catch(r){throw new Vn(`Invalid launch arguments: expected a JSON array of strings. ${J(r)}`)}return await Sre({driver:this.driver,logger:this.logger,bundleId:e.packageName,launchArguments:n}),{success:true}}case "KILL_APP":return new nM(this.constructPerformerParams()).execute(this.logger);case "PRESS":{let n=new Sh(this.constructPerformerParams());switch(e.key){case "HOME":await n.doPress(this.logger,{name:"home"});break;case "POWER":await this.driver.executeInNativeContext(this.logger,r=>r.isLocked(),{operationName:"isLocked"})?await this.driver.executeInNativeContext(this.logger,r=>r.unlock(),{operationName:"unlockDevice"}):await this.driver.executeInNativeContext(this.logger,r=>r.lock(),{operationName:"lockDevice"});break}return {success:true}}case "PRESS_KEYBOARD":return hre({command:e,emulator:this.emulator,abortSignal:this.abortSignal});case "AI_CHECK":return Jne({command:e,logger:this.logger,generator:this.generator,aiSettings:this.aiSettings,getEmulatorDomState:()=>this.getEmulatorDomState(),getScreenshotBase64:()=>this.getScreenshotBase64(),throwIfAborted:()=>this.throwIfAborted(),abortSignal:this.abortSignal});case "AI_EXTRACT":return Zne({command:e,logger:this.logger,generator:this.generator,aiSettings:this.aiSettings,getEmulatorDomState:()=>this.getEmulatorDomState(),getScreenshotBase64:()=>this.getScreenshotBase64(),abortSignal:this.abortSignal});case "JAVASCRIPT":return fre({command:e,orgId:this.orgId,logger:this.logger,fixtures:this.fixtures,abortSignal:this.abortSignal});case "WAIT":return Ore({command:e,abortSignal:this.aborter.controller?.signal});case "VISUAL_DIFF":return new sM(this.constructPerformerParams()).executeVisualDiff({logger:this.logger,command:e,updateGoldenFiles:o});case "REQUEST":return Tre({command:e,logger:this.logger});case "ROTATE_ORIENTATION":return Ere({command:e,emulator:this.emulator,driver:this.driver,logger:this.logger,getViewportBounds:()=>this.getViewportBounds()});case "ADD_FILE":{let n=await Qw(e.file);return await this.driver.executeInNativeContext(this.logger,r=>r.pushFile(e.storageLocation,n),{attemptTimeoutMs:12e4,operationName:"pushFile"}),{success:true}}case "SCREEN_CHECK":return new rM(this.constructPerformerParams()).executeScreenCheck(this.logger,e);case "ELEMENT_CHECK":return new tM(this.constructPerformerParams()).executeElementCheck({logger:this.logger,command:e});case "APPIUM_EXECUTE":{let n=JSON.parse(e.jsonArgs??"{}"),r=await this.driver.executeInNativeContext(this.logger,async i=>i.execute(e.command,n),{attemptTimeoutMs:6e4,maxAttempts:1,operationName:"userAppiumExecuteOperation"});return this.logger.info({output:r},"Appium command executed successfully"),{success:true,output:r,message:"Appium command executed successfully"}}default:{let n=e;throw new Error(`Unsupported mobile command type: ${n}`)}}}async getMobileFailureRecoveryPlan(){return {thoughts:"Failure recovery is not yet supported for iOS.",scenario:"INELIGIBLE",instructions:void 0}}async waitForPageSourceStability(e){await this.stateManager.waitForPageSourceStability({logger:this.logger,timeoutMs:e.timeoutMs??5e3,reason:e.reason,signal:this.aborter.controller?.signal});}async getInstalledApps(){let e=await this.emulator.listApps();return this.splitInstalledApps(e)}async initializeSettings(){let{latitude:e,longitude:o}=this.emulatorSettings?.geolocation??Am;await this.driver.executeInNativeContext(this.logger,async n=>{await n.setGeoLocation({latitude:e,longitude:o}),await n.updateSettings({pageSourceExcludedAttributes:"visible,accessible",maxTypingFrequency:1e3/lm,reduceMotion:true});},{operationName:"initializeDeviceSettings"});}async getScreenshotBase64(){return this.stateManager.getRawScreenshotBase64({logger: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(this.logger)}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 softReset(){await Dre({emulator:this.emulator,driver:this.driver,logger:this.logger}),this.fixtures.testContext.resetToInitial();}async cleanup(){}get abortSignal(){return this.aborter.controller?.signal}get context(){return this.fixtures.testContext}get localCodeEvalTools(){return this.fixtures.localCodeEvalTools}};function Ch({appFolderPath:t,source:e,overrideBaseDir:o}){let n=t?.trim();if(!n)return;if(e==="default")return n;let r=e==="override"&&o&&!Oo__default.isAbsolute(n)?Oo__default.resolve(o,n):Oo__default.resolve(n);if(e==="override"&&(!Bn__default.existsSync(r)||!Bn__default.statSync(r).isDirectory()))throw new Vn(`Local iOS app path "${r}" does not exist. Provide a valid directory path.`);return r}var JHe=3;async function Lre(t){let e=Date.now(),{results:o,fixtures:n,work:r}=t,{logger:i}=n,a=o[o.length-1],s=QHe(a,r);if(s)return i.info({failedResult:a,isNotEligible:s},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${s}`,shortMessage:s,durationMs:Date.now()-e};i.info({failedResult:a},"Attempting failure recovery"),r.state.failureRecoveryAttempts=(r.state.failureRecoveryAttempts??0)+1;try{let l=await ZHe(t);return l&&"type"in l&&(l.durationMs=Date.now()-e),l}catch(l){return i.warn({err:l},"Error during failure recovery attempt, continuing..."),null}}async function ZHe(t){let{fixtures:e,results:o,failedStep:n,nextSteps:r,stepTracer:i,work:a,containerParentChain:s}=t,{controller:l,logger:c}=e,u=i.parentTracer,{testMetadata:d}=t.inputs;if(!o.length)throw new Error("Attempted failure recovery with no failed results");let m=s.length>0,p=m&&a.topLevelResults?[...a.topLevelResults,...o]:o,f=m&&a.fullTestSteps?kre(a.fullTestSteps,s):[],h=[...r,...f],g=await l.getScreenshotPngString(),b=await l.getEmulatorDomState(),{results:y}=await WC(c,u,p,{numStepsWithScreenshots:5,addIndices:true,includeBeforeScreenshots:false,screenshotMediaType:"image/png"}),T=h.map(j=>sa(j)),v=d.description.trim(),E=d?.settings?.ai?.failureRecoveryInstructions?.trim()||void 0,{scenario:P,thoughts:M,instructions:I,reasonSummary:A}=await l.getMobileFailureRecoveryPlan({currentScreenshot:g,failedResults:y,currentScreenXml:b,nextStepsSerialized:T,testDescription:v,customInstructions:E});if(P!=="RECOVERABLE")return c.info({scenario:P,thoughts:M,instructions:I},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${M}`,shortMessage:A?.trim()||void 0};if(!I)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let k={id:randomUUID(),type:"MOBILE_AI_ACTION_STEP",text:I},_,H=a.state.failureRecoveryDisabled;H||(a.state.failureRecoveryDisabled=true),c.info("executing mobile step list");try{_=await t.executeMobileStepList({...t,fixtures:{...t.fixtures},listParams:{steps:[k,n],containerName:"AI-recovered step list",tracer:u}});}finally{H||(a.state.failureRecoveryDisabled=H);}let V=_.results[0];if(V&&V.type==="MOBILE_AI_ACTION_STEP")if(jb({results:_.results,onPresetAction:j=>{j.aiSuggested=true;},onModule:j=>{j.aiSuggested=true;},onAiAction:j=>{j.aiSuggested=true;}}),_.status==="SUCCESS"){let j=`The following steps were automatically executed by the failure recovery agent. Analysis: ${M}`;return V.message=j,V.failureRecoveryReason=M,Qe.increment("test_event",1,["name:failure_recovery_success","platform:native",`orgId:${t.inputs.orgId}`]),c.info({thoughts:M},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:_,message:j}}else {Qe.increment("test_event",1,["name:failure_recovery_failure","platform:native",`orgId:${t.inputs.orgId}`]);let j=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${M}`;return V.message=j,V.failureRecoveryReason=M,V.status="FAILED",c.info({thoughts:M},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:_,message:j}}return null}function kre(t,e){if(e.length===0)return [];let o=e[0],n=t.findIndex(a=>a.id===o);if(n===-1)return [];let r=t.slice(n+1);if(e.length===1)return r;let i=t[n];return i.type!=="RESOLVED_MOBILE_MODULE"?r:[...kre(i.steps,e.slice(1)),...r]}function QHe(t,e){if(!t)return "There is no failed result";if(t.type!=="MOBILE_PRESET_STEP")return "The failed step is not a preset action";let o=t.message;return o?o.includes("AbortError:")?"The user aborted the test":Lz.some(n=>o.includes(n))?"The failed step is an irrecoverable configuration error":(e.state.failureRecoveryAttempts??0)>JHe?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}async function lM({fixtures:t,step:e,inputs:o,stepTracer:n,work:r}){let i=Date.now(),{logger:a,controller:s}=t,l,c="",u,d=s.emulatorSettings?.disableXmlSnapshots??true;if(!o.interactive){if(r.lastScreenshot&&Date.now()-r.lastScreenshot.capturedAtMs<500)l=r.lastScreenshot.screenshot,c=r.lastScreenshot.snapshotId;else {c=randomUUID();try{l=Buffer.from(await s.getScreenshotBase64(),"base64");}catch(h){a.warn({err:h},"Failed to take before screenshot");}}if(!d)if(r.lastScreenXml)u=r.lastScreenXml.screenXml;else try{u=await s.getEmulatorDomState();}catch(h){a.debug({err:h},"Failed to capture before XML snapshot");}}let m=fD(e.command,a),p=cloneDeep(m?.cache??{}),f={...e,status:"SUCCESS",startTime:i,endTime:Date.now()};try{let h=await s.executeCommand({command:e.command,updateGoldenFiles:o.updateGoldenFiles});f={...e,status:h.success?"SUCCESS":"FAILED",message:h.message,startTime:i,endTime:Date.now(),data:h.output};}catch(h){s.isAborted()?f={...e,status:"CANCELLED",message:"Step cancelled.",startTime:i,endTime:Date.now()}:(a.error({err:h},"Failed to execute preset step"),f={...e,status:"FAILED",message:J(h),startTime:i,endTime:Date.now()});}finally{if(!o.interactive){l&&(f.beforeSnapshot=c,n.attachBeforeScreenshot({snapshotId:c,screenshot:l}),!d&&u&&n.attachBeforeXmlSnapshot({snapshotId:c,xml:u}));let b=randomUUID();try{let y=await s.getScreenshotBase64();f.afterSnapshot=b;let T=Buffer.from(y,"base64");n.attachAfterScreenshot({snapshotId:b,screenshot:T}),r.lastScreenshot={capturedAtMs:Date.now(),snapshotId:b,screenshot:T};}catch(y){a.warn({err:y},"Failed to take after screenshot"),r.lastScreenshot=void 0;}if(!d)try{let y=await s.getEmulatorDomState();n.attachAfterXmlSnapshot({snapshotId:b,xml:y}),r.lastScreenXml={snapshotId:b,screenXml:y};}catch(y){a.debug({err:y},"Failed to capture after XML snapshot"),r.lastScreenXml=void 0;}}let h="cache"in e.command?e.command.cache??{}:{};f.status==="FAILED"&&vK({logger:a,step:e,originalAndroidCommandCache:m});let g=diff(p,h);g&&Object.keys(g).length>0&&a.info({diffs:Dm(g)},"Updated cache");}return f}async function oWe(t,e,o){let{logger:n,controller:r}=t.fixtures,{stepTracer:i}=t.conditionalParams,a=e.assertion.command;try{let s=await lM({...t,step:e.assertion,stepTracer:i}),l=a.type;switch(l){case "AI_CHECK":case "SCREEN_CHECK":case "ELEMENT_CHECK":return s.status==="SUCCESS"?{type:"passed",conditionResult:s,steps:e.steps}:(n.info(s.message,`${a.type} mobile condition ${o} resolved to false`),{type:"failed",conditionResult:s});case "JAVASCRIPT":{if(s.status!=="SUCCESS")return {type:"execution_error",conditionResult:s};let c=!!s.data;return s.status=c?"SUCCESS":"FAILED",s.message=c?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,n.info({returnValue:s.data,conditionPassed:c},`JavaScript mobile condition ${o} evaluated`),c?{type:"passed",conditionResult:s,steps:e.steps}:{type:"failed",conditionResult:s}}default:return (u=>{throw new Error(`Unsupported mobile conditional command type: ${u}`)})(l)}}catch(s){n.error({err:s},`Mobile condition ${o} failed with error`);let l=s instanceof Error?s.message:"Unknown error during mobile condition evaluation";return {type:"execution_error",conditionResult:{...e.assertion,status:"FAILED",message:l,startTime:Date.now(),endTime:Date.now()}}}finally{r.throwIfAborted();}}function nWe({step:t,fromStepId:e,conditionalChain:o,fromStepParentChain:n}){let r=n.slice(o.length+1);for(let i=0;i<t.blocks.length;i++){let a=t.blocks[i],{result:s}=_c(a.steps,e,r);if(s)return i}return -1}async function Bre(t){let e=Date.now(),{logger:o}=t.fixtures,{fromStep:n}=t.inputs,{step:r,stepTracer:i,executeMobileStepList:a}=t.conditionalParams,s=i.getParentStepIdChain(),l=!!n&&sK(s,n.parentStepIdChain),c=r.elseSteps,u=true,d=[],m,p=false;if(l&&n){let y=nWe({step:r,fromStepId:n.fromStepId,conditionalChain:s,fromStepParentChain:n.parentStepIdChain});y>=0&&(c=r.blocks[y].steps,u=false,p=true,o.info(`Skipping mobile conditional assertion (execution starts from block ${y}), running ${c.length} steps`));}if(!p)for(let y=0;y<r.blocks.length;y++){o.info(`Evaluating mobile condition ${y} in conditional step`);let T=r.blocks[y],v=await oWe(t,T,y);if(d.push(v.conditionResult),m=v.conditionResult,v.type==="execution_error"){let E=v.conditionResult.status==="CANCELLED"?"CANCELLED":"FAILED",P={...r,assertionResult:v.conditionResult,steps:[],startTime:e,endTime:Date.now(),status:E,message:v.conditionResult.message};return Di({result:P,...Oi(d)}),P}if(v.type==="passed"){o.info(`Mobile condition ${y} resolved to true, executing ${v.steps.length} steps`),u=false,c=v.steps;break}}if(!c){o.warn("No mobile conditions resolved to true and no else block was provided, skipping conditional step body");let y={...r,assertionResult:m,steps:[],status:"SUCCESS",startTime:e,endTime:Date.now(),data:d[d.length-1]?.data,message:d[d.length-1]?.message};return Di({result:y,...Oi(d)}),y}u&&o.info("No mobile conditions resolved to true, executing the else block steps"),o.info(`Executing ${c.length} steps in selected mobile conditional block`);let f=await i.startSubSteps(),{results:h,status:g}=await a({...t,listParams:{steps:c,containerName:"mobile conditional block",tracer:f}}),b={...r,assertionResult:m,steps:h,status:g,startTime:e,endTime:Date.now()};return Di({result:b,...Oi([...d,...h])}),b}async function Ure(t){let e=Date.now(),o=t.fixtures.controller;try{return await rWe(t)}catch(n){let r=o.isAborted();return {...t.moduleParams.step,steps:[],type:"MOBILE_MODULE_STEP",startTime:e,endTime:Date.now(),status:r?"CANCELLED":"FAILED",message:r?"Step cancelled.":J(n)}}}async function rWe({moduleParams:t,...e}){let o=Date.now(),{step:n,stepTracer:r,executeMobileStepList:i}=t,{controller:a,logger:s}=e.fixtures,l=await iWe({step:n,params:e});Object.keys(l).length>0&&(a.context.setInputs(l),s.info(Oc({json:{inputs:l,moduleId:n.moduleId},maxJsonStringSize:1e3}),"Set mobile module inputs"));let c={};Object.entries(l).forEach(([f,h])=>{c[f]=JSON.stringify(h);});let u={...n,type:"MOBILE_MODULE_STEP",inputs:c,startTime:o,steps:[],endTime:Date.now(),status:"SUCCESS"},d=await r.startSubSteps(),{status:m,results:p}=await i({...e,listParams:{steps:n.steps,containerName:`module ('${n.name}')`,tracer:d}});return u.steps=p,u.status=m,u.endTime=Date.now(),Di({result:u,...Oi(p)}),u}async function iWe({step:t,params:e}){let o={},{logger:n,controller:r}=e.fixtures;for(let i of t.parameters?.parameterNames??[]){let a=t.inputs?.[i]??t.parameters?.defaultParameters?.[i];if(!a){n.warn({k:i},"No value found for parameter in module");continue}o[i]=await fa({orgId:e.inputs.orgId,code:a,fragment:true,logger:n,context:r.context,localTools:r.localCodeEvalTools});}return o}var nl="finish",yB=w__default.object({message:w__default.string(),success:w__default.boolean()}),KS=3,zre=`You forgot to call ${nl}. Review the prior conversation and return only the JSON object that should have been passed as the ${nl} input. The object must include exactly the fields: "message" (a string describing what was accomplished or why you stopped) and "success" (a boolean indicating whether the goal was achieved).`,YS=t=>{let e=tool({description:"Signal that the AI action has reached a terminal state (either success or failure).",inputSchema:yB,toModelOutput:({output:o})=>o,execute:async({message:o,success:n})=>{let{contextManager:r,logger:i}=t;return i.info({finishMessage:o,success:n},"AI action tool called (finish)"),r.finalState={message:o,status:n?"SUCCESS":"FAILED"},{type:"content",value:[{type:"text",text:"Done"}]}}});return {name:nl,tool:e}};var $re=["TAP","TYPE","PRESS","PRESS_KEYBOARD","SWIPE","SCROLL_TO","AI_CHECK","AI_EXTRACT","ELEMENT_CHECK","SCREEN_CHECK","WAIT","OPEN_APP","KILL_APP","DRAG_AND_DROP","ROTATE_ORIENTATION","JAVASCRIPT"],sWe=[...$re,"OPEN_NOTIFICATION_DRAWER"],lWe=$re,cM={ANDROID:sWe,IOS:lWe};function cWe(t,e){return e!==void 0&&cM[t].includes(e)}function uM({platform:t,input:e,logger:o,tempCaches:n}){let r=US(e);if(!cWe(t,r.stepType))throw new Error(`Unsupported AI Action V3 step type: ${r.stepType}. Supported types: ${cM[t].join(", ")}`);let i=hx(r,t);if(i.type!=="MOBILE_PRESET_STEP")throw new Error(`AI Action V3 only supports preset steps, got: ${i.type}`);if(r.disableCache&&r.cacheId&&o.warn({cacheId:r.cacheId},"--disable-cache was provided with --cache-id; disable cache flag is taking precedent and the cache id will be ignored."),r.cacheId&&!r.disableCache&&ea(t,i.command)){let a=n[r.cacheId];a?i.command.cache=a.cache:o.warn({cacheId:r.cacheId,commandType:i.command.type},"Temp mobile cache not found for AI action V3 step");}return i}function wh(t){let{id:e,cache:o,...n}=t;return JSON.stringify(n)}function Au(t){if(t.length===0)return "Generated cached steps: (none)";let e=t.map((o,n)=>` ${n}: ${wh(o.command)}`).join(`
5899
5899
  `);return `Generated cached steps (${t.length}):
5900
5900
  ${e}`}async function dM({storage:t,controller:e,onEvent:o,rootStep:n,stepIndex:r,logger:i}){if(!(!t||!o))try{let a=await e.getScreenshotBase64(),s=randomUUID();await t.createOnDemandScreenshot(s,Buffer.from(a,"base64"),"image/png"),o({type:"SCREENSHOT",stepIndex:r,screenshotId:s,rootStep:n});}catch(a){i.error({err:a,stepId:n.stepId,stepIndex:r},"Failed to capture AI action V3 trajectory screenshot");}}var mM=class{platform;controller;logger;rootStep;subStepIndex=0;callbacks;storage;results=[];generatedSteps=[];tempCaches={};finalState=void 0;postconditionAttempts=0;autoGeneratedPostcondition=void 0;postcondition;postconditionStep;constructor(e){this.platform=e.platform,this.controller=e.controller,this.logger=e.logger,this.rootStep=e.rootStep,this.callbacks=e.callbacks,this.storage=e.storage,this.subStepIndex=0,this.generatedSteps=[...e.initialGeneratedSteps??[]],this.postcondition=e.postcondition,this.postconditionStep=e.postconditionStep;}recordPostconditionRejected(e){this.postconditionAttempts+=1,this.logger.info({postconditionAttempts:this.postconditionAttempts,failureMessage:e},"AI action V3 postcondition rejected the finish call");}emitPhase(e,o){this.callbacks.onAiActionEvent?.({type:"PHASE",rootStep:this.rootStep,phase:e,failureMessage:o});}recordToolCall(e){this.callbacks.onAiActionEvent?.({type:"TOOL_CALL",rootStep:this.rootStep,toolName:e});}recordAutoGeneratedPostcondition(e){this.autoGeneratedPostcondition!==e&&(this.autoGeneratedPostcondition=e,this.callbacks.onAiActionEvent?.({type:"POSTCONDITION_AUTOGENERATED",rootStep:this.rootStep,postcondition:e}));}buildPostconditionStep(e){return Gg({platform:this.platform,step:{cache:void 0,precondition:void 0,postcondition:e}}).postconditionStep}async executeSteps(e,o){o&&this.emitPhase(o);let n=[];for(let r of e){let i=this.subStepIndex++;this.callbacks.onAiActionEvent?.({type:"STEP_UPDATE",rootStep:this.rootStep,stepIndex:i,step:r,status:"running"});let a=await this.callbacks.executeStep(r,i);if(this.callbacks.onAiActionEvent?.({type:"STEP_UPDATE",rootStep:this.rootStep,stepIndex:i,step:r,status:a.status==="SUCCESS"?"success":"failed",message:a.message}),await dM({storage:this.storage,controller:this.controller,onEvent:this.callbacks.onAiActionEvent,rootStep:this.rootStep,stepIndex:i,logger:this.logger}),n.push(a),a.status!=="SUCCESS")break}return this.results.push(...n),n}spliceGeneratedSteps(e,o,...n){return this.generatedSteps.splice(e,o,...n)}saveTempCacheForCommand(e,o){if(!ea(this.platform,e)||!e.cache)return;let n=o??crypto.randomUUID();return this.tempCaches[n]=kE[this.platform]({type:e.type,cache:cloneDeep(e.cache)}),n}};var jre="get_emulator_screenshot";function Hre(t){let e=tool({description:"Get the current device state. Returns the viewport size and a screenshot by default, and can optionally include the UI hierarchy XML.",inputSchema:w__default.object({includeEmulatorXml:w__default.boolean().optional()}),toModelOutput:({output:o})=>o,execute:async o=>{let{controller:n,contextManager:r,logger:i}=t,a={includeEmulatorXml:o.includeEmulatorXml??false};return i.info(a,"AI action V3 tool called (get_emulator_screenshot)"),r.recordToolCall(jre),Ah({controller:n,...a})}});return {name:jre,tool:e}}async function Ah(t){let{controller:e,includeEmulatorXml:o=false}=t,n=await e.getScreenshotBase64(),r=await e.getViewportBounds(),i=r.right-r.left,a=r.bottom-r.top,s=[{type:"text",text:`<viewportSize width="${i}" height="${a}" />`}];if(o){let l=await e.getEmulatorDomState();s.push({type:"text",text:`<emulatorXml>
5901
5901
  ${l}
@@ -6076,7 +6076,7 @@ ${t}
6076
6076
  </healingProgress>
6077
6077
  `}function iie(t,e){if(!t.userPostcondition)return e??t.existingAutoGeneratedPostcondition}async function aie(t,e){let{postcondition:o,postconditionStep:n}=t;if(!e.success)return {status:"FAILED",message:e.message};let r=e.autoGeneratedPostcondition?.trim(),i=!o;r&&i&&t.recordAutoGeneratedPostcondition(r);let a=o&&n?n:r&&i?t.buildPostconditionStep(r):void 0;if(!a)return {status:"SUCCESS",message:e.message};let l=(await t.executeSteps([a],"POSTCONDITION")).at(-1);if(l?.status==="SUCCESS")return {status:"SUCCESS",message:e.message};let c=l?.message??"Postcondition evaluation failed.";return t.recordPostconditionRejected(c),{status:"FAILED",message:c}}async function kWe(t,e){let{controller:o,logger:n}=t.fixtures;return kl({orgId:t.inputs.orgId,s:e.text,context:o.context,logger:n,localTools:o.localCodeEvalTools,signal:o.abortSignal})}async function vB(t,e,o,n,r,i){let{executeMobileStepList:a}=t.aiActionParams,{stepTracer:s}=t.aiActionParams,{controller:l}=t.fixtures,c=t.fixtures.logger.child({stepId:i.stepId,phase:n});if(e.length===0)return c.info("Replay skipped \u2014 no steps to replay"),{status:"SUCCESS",results:[]};c.info({stepCount:e.length},"Starting replay of cached steps");let u=[],d=await s.startSubSteps();for(let m=0;m<e.length;m++){let p=e[m];r?.({type:"STEP_UPDATE",stepIndex:m,step:p,status:"running",rootStep:i});let{status:f,results:h,terminalResult:g}=await a({...t,listParams:{steps:[p],containerName:`${o} [${m+1}/${e.length}]`,tracer:d}}),b=h[0];if(b&&u.push(b),r?.({type:"STEP_UPDATE",stepIndex:m,step:p,status:f==="SUCCESS"?"success":"failed",message:b?.message,rootStep:i}),await dM({storage:t.fixtures.storage,controller:l,onEvent:r,rootStep:i,stepIndex:m,logger:c}),f!=="SUCCESS")return c.info({failedAtIndex:m,totalSteps:e.length,status:f,message:b?.message},"Replay failed at step"),{status:f,results:u,terminalResult:g}}return await l.waitForPageSourceStability({reason:"Waiting for stability after replaying cached AI action V3 steps"}),c.info({stepCount:e.length},"Replay of cached steps completed successfully"),{status:"SUCCESS",results:u}}async function sie({params:t,systemPrompt:e,messages:o,initialGeneratedSteps:n,isHealing:r,postcondition:i,postconditionStep:a}){let{controller:s,logger:l}=t.fixtures,{step:c}=t.callbacks,{step:u,stepTracer:d}=t.aiActionParams,m=l.child({stepId:u.id}),p={stepId:u.id,parentStepIdChain:d.getParentStepIdChain()},f=new mM({platform:t.platform,controller:s,callbacks:{onAiActionEvent:c?.onAiActionEvent,executeStep:NWe(t,d)},logger:m,rootStep:p,initialGeneratedSteps:n,storage:t.fixtures.storage,postcondition:i,postconditionStep:a}),h=`${u.id}${r?"-heal":""}-${Date.now()}`,g=Zre({platform:t.platform,controller:s,logger:m,contextManager:f,aiActionSessionId:h}),b=Date.now();m.info({isHealing:r,aiActionSessionId:h},"Starting AI action V3 LLM stream");let y=kA({...g,system:e,messages:o,abortSignal:s.abortSignal});for await(let v of y.fullStream)s.throwIfAborted(),v.type==="text-delta"&&c?.onAiActionEvent?.({type:"THOUGHT",text:v.text,blockId:v.id,rootStep:p});let T=await y.response;return s.throwIfAborted(),m.info({isHealing:r,durationMs:Date.now()-b},"AI action V3 LLM stream completed"),{contextManager:f,logger:m,rootStep:p,abortSignal:s.abortSignal,repairConfig:{providerFallback:g.providerFallback,system:e,messages:o,providerOptions:g.providerOptions},streamResponseMessages:T.messages}}async function tie(t,e,o,n,r,i){let{step:a}=t.aiActionParams,{step:s}=t.callbacks,l=Date.now(),c=n.kind==="postcondition_failed"?e.length:n.successfulStepCount,u=await Ah({controller:t.fixtures.controller}),{contextManager:d,logger:m,rootStep:p,abortSignal:f,repairConfig:h,streamResponseMessages:g}=await sie({params:t,isHealing:true,initialGeneratedSteps:e,postcondition:r.postcondition,postconditionStep:r.postconditionStep,systemPrompt:Qre({platform:t.platform,goal:o,cachedSteps:e,reason:n,autoGeneratePostcondition:r.shouldAutoGeneratePostcondition}),messages:[{role:"user",content:[...eT(o),...rie(r.postcondition),...eT(`<cachedSteps>
6078
6078
  ${Au(e)}
6079
- </cachedSteps>`),...eT(LWe(n,c)),...nie(u)]}]});if(!d.finalState)try{m.warn("AI action finished without finish tool call, attempting repair");let v=await Fy({maxAttempts:KS,logger:m,agentConfig:h,streamResponseMessages:g,abortSignal:f,schema:ng,userMessage:SB});d.finalState=await aie(d,v);}catch(v){if(f?.aborted)throw v;m.error({err:v},"Finish tool repair failed during healing");}if(!d.finalState||d.finalState.status!=="SUCCESS")return m.info({status:d.finalState?.status??null,message:d.finalState?.message??null},"AI action V3 healing did not produce a successful result"),{type:"failed"};let b=d.generatedSteps;m.info({steps:d.generatedSteps.map(v=>`${v.type}:${v.command.type}`)},"AI action V3 healing generated steps");let y=iie(r,d.autoGeneratedPostcondition);s?.onAiActionEvent?.({type:"CACHED_STEPS_GENERATED",cachedSteps:b,resolvedGoal:o,rootStep:p}),a.cache=Rh(t.platform,o,b,y);let T={...a,type:"MOBILE_AI_ACTION_STEP",status:"SUCCESS",startTime:l,endTime:Date.now(),message:d.finalState.message,steps:[...i,...d.results],cache:Rh(t.platform,o,b,y)};return Di({result:T,...Oi(T.steps)}),{type:"healed",result:T}}async function FWe(t,e,o){let{step:n}=t.aiActionParams,{step:r}=t.callbacks,i=Date.now(),a=await Ah({controller:t.fixtures.controller}),{contextManager:s,logger:l,rootStep:c,abortSignal:u,repairConfig:d,streamResponseMessages:m}=await sie({params:t,isHealing:false,postcondition:o.postcondition,postconditionStep:o.postconditionStep,systemPrompt:EB({platform:t.platform,goal:e,autoGeneratePostcondition:o.shouldAutoGeneratePostcondition}),messages:[{role:"user",content:[...eT(e),...rie(o.postcondition),...nie(a)]}]});if(!s.finalState){l.warn("AI action finished without finish tool call, attempting repair");try{let T=await Fy({maxAttempts:KS,logger:l,agentConfig:d,streamResponseMessages:m,abortSignal:u,schema:ng,userMessage:SB});s.finalState=await aie(s,T);}catch(T){throw l.error({err:T},"Finish tool repair failed"),new O("InternalWebAgentError","AI action did not produce a final state")}}let p=s.finalState.status==="SUCCESS",f=s.generatedSteps,h=iie(o,s.autoGeneratedPostcondition);n.cache=void 0;let{cache:g,...b}=n;p?(n.cache=Rh(t.platform,e,f,h),l.info({steps:s.generatedSteps.map(T=>`${T.type}:${T.command.type}`)},"AI action V3 generated steps"),f.length>0&&r?.onAiActionEvent?.({type:"CACHED_STEPS_GENERATED",cachedSteps:f,resolvedGoal:e,rootStep:c})):l.info({finalStateStatus:s.finalState.status,finalStateMessage:s.finalState.message,generatedStepCount:s.generatedSteps.length},"AI action V3 generation failed");let y={...p?n:b,type:"MOBILE_AI_ACTION_STEP",status:s.finalState.status,startTime:i,endTime:Date.now(),message:s.finalState.message,steps:s.results,...p&&{cache:Rh(t.platform,e,f,h)}};return Di({result:y,...Oi(y.steps)}),y}async function BWe(t,e,o,n,r,i){let{step:a}=t.callbacks,s=t.fixtures.logger.child({stepId:e.id}),l=Date.now(),{cache:c,...u}=e,d=i.existingAutoGeneratedPostcondition,m=a?.onAiActionEvent;s.info({cachedStepCount:o.length,resolvedGoal:n},"Starting AI action V3 replay of cached steps");let p=await vB(t,o,"AI action V3 generated steps","REPLAY",m,r);if(p.status==="CANCELLED")return s.info("AI action V3 replay cancelled"),{...u,type:"MOBILE_AI_ACTION_STEP",status:"CANCELLED",startTime:l,endTime:Date.now(),message:p.terminalResult?.message??"AI action replay cancelled.",steps:p.results};if(p.status==="SUCCESS"){let g=await UWe(t,i.postconditionStep,r,m);if(g?.status==="CANCELLED")return {...u,type:"MOBILE_AI_ACTION_STEP",status:"CANCELLED",startTime:l,endTime:Date.now(),message:g.terminalResult?.message??"AI action replay cancelled.",steps:[...p.results,...g.results]};if(!g||g.status==="SUCCESS"){e.cache=Rh(t.platform,n,o,d),s.info({durationMs:Date.now()-l},"AI action V3 replay succeeded");let y={...e,type:"MOBILE_AI_ACTION_STEP",status:"SUCCESS",startTime:l,endTime:Date.now(),message:"Replayed cached steps successfully.",steps:[...p.results,...g?.results??[]],cache:Rh(t.platform,n,o,d)};return Di({result:y,...Oi(y.steps)}),y}let b=g.terminalResult?.message??"Postcondition evaluation failed.";return s.info({postconditionFailure:b},"AI action V3 postcondition failed after replay, attempting autoheal"),m?.({type:"PHASE",phase:"AUTOHEAL",rootStep:r}),oie(await tie(t,o,n,{kind:"postcondition_failed",postcondition:i.postcondition??"",failureMessage:b},i,p.results),{stepWithoutCache:u,startTime:l,logger:s,failureMessage:b,priorResults:[...p.results,...g.results??[]]})}let f=p.terminalResult?.message??"Unknown error";s.info({failureMessage:f,successfulSteps:p.results.length},"AI action V3 replay failed, attempting autoheal"),m?.({type:"PHASE",phase:"AUTOHEAL",rootStep:r});let h=p.terminalResult?Math.max(0,p.results.length-1):p.results.length;return oie(await tie(t,o,n,{kind:"step_failed",successfulStepCount:h,failureMessage:f},i,p.results.slice(0,h)),{stepWithoutCache:u,startTime:l,logger:s,failureMessage:f,priorResults:p.results})}async function UWe(t,e,o,n){if(e)return n?.({type:"PHASE",phase:"POSTCONDITION",rootStep:o}),vB(t,[e],"AI action V3 postcondition","POSTCONDITION",n,o)}function oie(t,e){return t.type==="healed"?(e.logger.info({durationMs:Date.now()-e.startTime},"AI action V3 autoheal succeeded"),t.result):(e.logger.info({durationMs:Date.now()-e.startTime,failureMessage:e.failureMessage},"AI action V3 autoheal failed \u2014 replay could not be recovered"),{...e.stepWithoutCache,type:"MOBILE_AI_ACTION_STEP",status:"FAILED",startTime:e.startTime,endTime:Date.now(),message:`Cached step replay failed and healing could not recover. Replay failure: ${e.failureMessage}`,steps:e.priorResults})}async function zWe(t){let{step:e}=t.callbacks,{controller:o}=t.fixtures,n=t.aiActionParams.step,r=Date.now();await o.waitForPageSourceStability({reason:"Waiting for stability before AI action"});let i=await kWe(t,n),a=n.cache,s=DWe(t.platform,a),l=a?.platform===t.platform&&s.length>0&&a.resolvedGoal===i,c={stepId:n.id,parentStepIdChain:t.aiActionParams.stepTracer.getParentStepIdChain()},u=e?.onAiActionEvent,d=(g,b)=>{u?.({type:"PHASE",phase:g,failureMessage:b,rootStep:c});},m=Gg({platform:t.platform,step:n}),p=[];if(m.preconditionStep){d("PRECONDITION");let g=await vB(t,[m.preconditionStep],"AI action V3 precondition","PRECONDITION",u,c);if(p.push(...g.results),g.status!=="SUCCESS"){let b=g.terminalResult?.message??"Precondition was not satisfied.",{cache:y,...T}=n;return {...T,type:"MOBILE_AI_ACTION_STEP",status:g.status,startTime:r,endTime:Date.now(),message:g.status==="CANCELLED"?b:`Precondition failed: ${b}`,steps:p}}}let f=await $We({params:t,originalStep:n,generatedSteps:s,canReplayCachedSteps:l,existingCache:a,resolvedGoal:i,rootStep:c,replaySteps:m,emitPhase:d});if(p.length===0||f.type!=="MOBILE_AI_ACTION_STEP")return f;let h={...f,steps:[...p,...f.steps]};return Di({result:h,...Oi(h.steps)}),h}async function $We({params:t,originalStep:e,generatedSteps:o,canReplayCachedSteps:n,existingCache:r,resolvedGoal:i,rootStep:a,replaySteps:s,emitPhase:l}){let c=e.postcondition?.trim()||void 0,{step:u}=t.callbacks;if(n){l("REPLAY");let p={userPostcondition:c,postcondition:AE(e),postconditionStep:s.postconditionStep,shouldAutoGeneratePostcondition:!AE(e),existingAutoGeneratedPostcondition:r?.autoGeneratedPostcondition};return BWe(t,e,o,i,a,p)}o.length>0&&r?.resolvedGoal!==i&&(u?.onAiActionEvent?.({type:"THOUGHT",text:"Skipping cached replay because the resolved goal no longer matches the cached goal.",rootStep:a}),t.fixtures.logger.info({stepId:e.id,rawGoal:e.text,cachedResolvedGoal:r?.resolvedGoal,resolvedGoal:i},"Skipping cached replay because the resolved goal no longer matches the cached goal.")),l("GENERATE");let d=Gg({platform:t.platform,step:{cache:void 0,precondition:void 0,postcondition:c}}),m={userPostcondition:c,postcondition:c,postconditionStep:d.postconditionStep,shouldAutoGeneratePostcondition:!c,existingAutoGeneratedPostcondition:void 0};return FWe(t,i,m)}function VWe(t,e){let{rootStep:o,...n}=e;switch(n.type){case "THOUGHT":case "TOOL_CALL":case "PHASE":case "STEP_UPDATE":case "POSTCONDITION_AUTOGENERATED":t.push(n);break;}}function lie(t,e={}){for(let o of t)o.afterSnapshot&&(e[o.id]=o.afterSnapshot),"steps"in o&&lie(o.steps,e);return e}function jWe(t,e){let o=lie(e);for(let n of t)n.type==="STEP_UPDATE"&&(n.afterSnapshotId=o[n.step.id]);}async function cie(t){await Ev({enabled:true,serviceName:"mobile-ai-action"});let{step:e}=t.aiActionParams,{logger:o,controller:n}=t.fixtures,r=Date.now(),{cache:i,...a}=e,s=[],l=t.callbacks.step?.onAiActionEvent,c={...t,callbacks:{...t.callbacks,step:{...t.callbacks.step,onAiActionEvent:u=>{VWe(s,u),l?.(u);}}}};return We({name:"mobile_ai_action_v3.run",root:true,attributes:{"momentic.org_id":t.inputs.orgId,"momentic.test_id":t.inputs.testMetadata.id,"momentic.step_id":e.id,"momentic.platform":t.platform},fn:async()=>{try{let u=await zWe(c);return u.type==="MOBILE_AI_ACTION_STEP"&&(jWe(s,u.steps),u.trajectory=s),u}catch(u){let d=n.isAborted()||u instanceof DOMException&&u.name==="AbortError";return d?o.info({stepId:e.id},"AI action V3 aborted"):o.error({err:u},"Failed to execute mobile AI action V3"),{...a,steps:[],type:"MOBILE_AI_ACTION_STEP",startTime:r,endTime:Date.now(),status:d?"CANCELLED":"FAILED",message:d?"Step cancelled.":J(u),trajectory:s}}}})}var pM=class{controller;logger;rootStep;subStepIndex=0;callbacks;finalState=void 0;results=[];constructor(e){let{controller:o,logger:n,callbacks:r,rootStep:i}=e;this.controller=o,this.logger=n,this.callbacks=r,this.rootStep=i;}async createAndExecuteStep(e){this.callbacks.onAiActionEvent?.({type:"SUBSTEP_CREATED",rootStep:this.rootStep,step:e});let o=this.subStepIndex++,n=await this.callbacks.executeStep(e,o);return this.results.push(n),n}recordGenericToolCall(e){this.callbacks.onAiActionEvent?.({type:"GENERIC_TOOL_CALLED",toolName:e,rootStep:this.rootStep});}};async function uie(t){return (t.aiActionParams.step.version??wE)==="3"?cie(t):WWe(t)}async function WWe(t){let e=Date.now(),{controller:o,logger:n}=t.fixtures;try{return await GWe(t)}catch(r){let i=o.isAborted();return i||n.error({err:r},"Failed to execute mobile AI action"),{...t.aiActionParams.step,steps:[],type:"MOBILE_AI_ACTION_STEP",startTime:e,endTime:Date.now(),status:i?"CANCELLED":"FAILED",message:i?"Step cancelled.":J(r)}}}async function GWe(t){let{helpers:e}=t,{initializeAIActionConfig:o}=e,{step:n,stepTracer:r,executeMobileStepList:i}=t.aiActionParams,{controller:a,logger:s}=t.fixtures,{orgId:l}=t.inputs,{step:c}=t.callbacks,u=await r.startSubSteps(),d=randomUUID(),m=s.child({stepId:n.id,aiActionSessionId:d}),p=Date.now(),f=async(M,I)=>{let A=await i({...t,listParams:{steps:[M],tracer:u,containerName:`AI action sub-step ${I}`}});if(A.results.length!==1)throw new O("InternalWebAgentError","Expected exactly one result from executeMobileStepList");return A.results[0]},h={stepId:n.id,parentStepIdChain:r.getParentStepIdChain()},g=new pM({controller:a,callbacks:{onAiActionEvent:c?.onAiActionEvent,executeStep:f},logger:m,rootStep:h});await a.waitForPageSourceStability({reason:"Waiting for stability before AI action"});let y=o({controller:a,logger:m,contextManager:g,aiActionSessionId:d}),T=await kl({orgId:l,s:n.text,context:a.context,logger:m,localTools:a.localCodeEvalTools,signal:a.abortSignal}),v=kA({...y,messages:[...y.messages??[],{role:"user",content:T}],abortSignal:a.abortSignal});for await(let M of v.fullStream)switch(a.throwIfAborted(),M.type){case "text-delta":c?.onAiActionEvent?.({type:"LLM_TEXT_OUTPUT",text:M.text,rootStep:h});}let E=await v.response;if(a.throwIfAborted(),!g.finalState){m.warn("AI action finished without finish tool call, attempting repair");try{let M=await Fy({maxAttempts:KS,logger:m,agentConfig:{providerFallback:y.providerFallback,system:y.system,messages:[...y.messages??[],{role:"user",content:T}],providerOptions:y.providerOptions},streamResponseMessages:E.messages,abortSignal:a.abortSignal,schema:yB,userMessage:zre});g.finalState={message:M.message,status:M.success?"SUCCESS":"FAILED"};}catch(M){throw m.error({err:M},"Finish tool repair failed"),new O("InternalWebAgentError","AI action did not produce a final state")}}let P={...n,status:g.finalState.status,startTime:p,endTime:Date.now(),message:g.finalState.message,steps:g.results};return Di({result:P,...Oi(g.results)}),P}var KWe=30*60*1e3;async function rl(t){let{fixtures:e,inputs:o,listParams:n,work:r}=t,{containerName:i,steps:a,tracer:s}=n,{logger:l,controller:c,usageTracker:u}=e,d=s.getParentStepIdChain(),m=[];d.length===0&&(r.topLevelResults=m,r.fullTestSteps=a);let p,f="SUCCESS",h,{fromStep:g,toStep:b}=o;for(let y=0;y<a.length;y++){let T=a[y];if(T.skipped)continue;if(r.fastForwardingToStep&&g){let I=JSON.stringify(d);if(T.id===g.fromStepId&&I===JSON.stringify(g.parentStepIdChain))r.fastForwardingToStep=false;else if(!wK({currentStep:T,currentParentChain:d,desiredStepId:g.fromStepId,desiredStepParentChain:g.parentStepIdChain}))continue}let v=0,E=1,P=Date.now();T.retries&&T.retries>0&&(E+=T.retries);let M=[];for(;v<E&&Date.now()-P<KWe;){v++;let I=`Executing step index ${y} in ${i} - ${sa(T)}`;v!==1&&(I+=` (attempt ${v})`),l.info({step:T},I);let A=Date.now(),k=await s.startStep({logger:l,step:T,attempt:v,parentStepIdChain:d});u.trackStepExecution(T);let _=cloneDeep(T),H=c.context.toRedactedDisplayCopy(),V;switch(T.type){case "MOBILE_PRESET_STEP":V=`mobile.execute_step.${T.command.type}`;break;case "MOBILE_AI_ACTION_STEP":V="mobile.execute_step.AI_ACTION";break;case "MOBILE_CONDITIONAL_STEP":V="mobile.execute_step.CONDITIONAL";break;case "RESOLVED_MOBILE_MODULE":V="mobile.execute_step.MODULE";break}let j=await We({name:V,attributes:{"momentic.platform":t.platform,"momentic.step_type":T.type,"momentic.step_id":T.id,"momentic.step_index":y,"momentic.step_attempt":v},fn:async()=>YWe({step:T,stepTracer:k,params:t})});j.beforeTestContext=H,j.afterTestContext=c.context.toRedactedDisplayCopy(),k.recordStepDuration({step:T,durationMs:Date.now()-A});let{trace:le}=await k.finish({parentStepIdChain:d,result:j});if(j.trace=le,I=`Finished step index ${y} in ${i} - ${sa(T)}`,v!==1&&(I+=` (attempt ${v})`),l.info({step:{id:T.id},trace:j.trace,status:j.status},I),j.status==="FAILED"&&v<E){M.push(j),Date.now()-A<1e3&&await Te(1e3-(Date.now()-A));continue}if(M.length>0&&(j.previousAttempts=M),m.push(j),h=await XWe({result:j,step:T,originalStep:_,steps:a,currentStepIndex:y,params:t,stepTracer:k,isLastAttempt:v===E,results:m,containerParentChain:d}),j.status!=="SUCCESS"&&h!=="SUCCESS")return f=j.status,p=j,{results:m,status:f,terminalResult:p};if(T.envKey&&j.status==="SUCCESS"&&(c.context.setVariable(T.envKey,j.data),j.afterTestContext=c.context.toRedactedDisplayCopy()),b){let Y=JSON.stringify(d);if(T.id===b.toStepId&&Y===JSON.stringify(b.parentStepIdChain))return r.shouldStopExecuting=true,{results:m,status:f,terminalResult:p}}if(r.shouldStopExecuting)return {results:m,status:f,terminalResult:p};break}}return {results:m,status:f,terminalResult:p}}async function YWe({step:t,params:e,stepTracer:o}){let{work:n}=e,r;switch(t.type){case "MOBILE_PRESET_STEP":{r=await lM({...e,step:t,stepTracer:o});break}case "RESOLVED_MOBILE_MODULE":{r=await Ure({...e,moduleParams:{step:t,stepTracer:o,executeMobileStepList:rl}});break}case "MOBILE_CONDITIONAL_STEP":{r=await Bre({...e,conditionalParams:{step:t,stepTracer:o,executeMobileStepList:rl}});break}case "MOBILE_AI_ACTION_STEP":{let i=n.state.failureRecoveryDisabled;i||(n.state.failureRecoveryDisabled=true);try{r=await uie({...e,aiActionParams:{step:t,stepTracer:o,executeMobileStepList:rl}});}finally{i||(n.state.failureRecoveryDisabled=i);}break}default:return (a=>{throw new Error(`Unsupported mobile step type: ${a}`)})(t)}return r}async function XWe({result:t,step:e,originalStep:o,steps:n,currentStepIndex:r,params:i,stepTracer:a,isLastAttempt:s,results:l,containerParentChain:c}){let u,d;if(s&&t.status==="FAILED"&&t.type==="MOBILE_PRESET_STEP"&&!i.work.state.failureRecoveryDisabled){let m=await Lre({...i,stepTracer:a,step:e,steps:n,currentStepIndex:r,isLastAttempt:s,executeMobileStepList:rl,failedStep:o,nextSteps:n.slice(r+1),results:l.concat(t),containerParentChain:c});m&&(m.type==="ATTEMPTED"&&(u=m.result.results,d=m.status),t.failureRecoveryStatus={type:m.type,message:m.message,shortMessage:"shortMessage"in m?m.shortMessage:void 0}),d==="SUCCESS"&&e.type==="MOBILE_PRESET_STEP"&&e.command.type==="AI_CHECK"&&e.command.cache!==void 0&&(i.fixtures.logger.info({stepId:e.id,commandType:e.command.type},"Clearing assertion cache after successful failure recovery"),e.command.cache=void 0);}return u&&l.push(...u),d}async function xh(t){let{tracer:e,containerName:o,platform:n}=t,{steps:r,beforeSteps:i,afterSteps:a,testMetadata:s}=t.inputs,{cacheStorage:l,logger:c}=t.fixtures,u=c.child({testId:t.inputs.testMetadata.id,testName:t.inputs.testName}),d=!t.inputs.fromStep&&!t.inputs.toStep;await l.populateCacheForRun({logger:u,platform:n,testId:s.id,environment:t.envName,stepLists:{steps:r,...i&&{beforeSteps:i},...a&&{afterSteps:a}},skipFetchingCacheFromStorage:t.inputs.interactive,useSnapshotIdentityCache:t.inputs.useSnapshotIdentityCache});let m=cloneDeep(r),p=i?cloneDeep(i):void 0,f=a?cloneDeep(a):void 0;u.info({platform:n,testMetadata:UE.parse(s)},"Starting mobile test");let h=EG(u);u.info({cpu:h?.cpuMetadata,platform:h?.platform},`Starting execution of ${o}`);let g,b;if(d&&p&&p.length>0){let I=await e.startBeforeStepList(),A=await rl({...t,listParams:{containerName:"setup",tracer:I,steps:p}});b=A.results,g=Cg(A.status),g!=="PASSED"&&u.error("Setup (beforeSteps) failed, skipping main steps");}let y,T=[],v;if(g===void 0||g==="PASSED"){let I=await e.startMainStepList(),A=await rl({...t,listParams:{containerName:o,tracer:I,steps:m}});y=A.status,T=A.results,v=A.terminalResult;}let E,P;if(d&&f&&f.length>0){let I=await e.startAfterStepList(),A=await rl({...t,listParams:{containerName:"teardown",tracer:I,steps:f}});P=A.results,E=Cg(A.status),E!=="PASSED"&&u.error("Teardown (afterSteps) failed");}clearInterval(h?.interval),await ZWe({originalStepLists:{steps:r,beforeSteps:i,afterSteps:a},executedStepLists:{steps:m,beforeSteps:p,afterSteps:f},logger:u,cacheStorage:l,orgId:t.inputs.orgId,testId:s.id,environment:t.envName,platform:n,useSnapshotIdentityCache:t.inputs.useSnapshotIdentityCache});let M=Y1({beforeStatus:g,mainStatus:y,afterStatus:E});return u.info({overallStatus:M,platform:n},"Mobile test final result"),{status:M,results:T,beforeResults:b,afterResults:P,terminalResult:v,failureRecoveryDetails:t.work.state.failureRecoveryAttempts?{attempts:t.work.state.failureRecoveryAttempts}:void 0}}async function ZWe({originalStepLists:t,executedStepLists:e,logger:o,cacheStorage:n,orgId:r,testId:i,environment:a,platform:s,useSnapshotIdentityCache:l}){let c=diff(t,e),u=Object.keys(c).length>0;if(!u&&!l){o.info("No cache entries to update");return}u?o.info({diffs:Dm(c)},"Saving mobile step cache entries"):o.info("No cache entries to update");let{cachesToSave:d,snapshotCachesToSave:m}=await Gn({platform:s,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},cacheCreationParams:{environment:a,orgId:r,testId:i},useSnapshotIdentityCache:l});u&&await n.saveEntries({platform:s,logger:o,entries:d}),l&&await n.saveSnapshotCacheEntries({platform:s,logger:o,entries:m});}var wB="get_emulator_state";var tGe=3,oGe=10,AB="TRUNCATED DUE TO CONVERSATION LENGTH",nGe={openai:{reasoningEffort:"medium",store:false,textVerbosity:"low",serviceTier:"priority"},azure:{reasoningEffort:"medium",store:false,textVerbosity:"low",serviceTier:"priority"},anthropic:{...c7,effort:"high"}};function fM(t,e,o,n={}){let{logger:r,controller:i,contextManager:a,aiActionSessionId:s}=t,l=i.generator,c={};for(let b of e){let y=b({contextManager:a,logger:r,controller:i});c[y.name]=UA({tool:y.tool,name:y.name,logger:r,logPrefix:"Mobile AI action ",agentName:"ai-action-tool-based"});}let u={logger:r,sessionId:s,streamType:"ai-action-tool-based"},d={...u,useOpenAIResponsesWebSocket:false},m=l.getOpenAIModelFactory(d),p=l.getAzureOpenAIModelFactory(u),f=l.getAnthropicModelFactory(u),h=n.providers??[{id:"openai",model:m("gpt-5.3-codex")},{id:"azure",model:p("gpt-5.3-codex")},{id:"anthropic",model:f("claude-sonnet-4-6")}];return r.info({providers:h.map(b=>({id:b.id,modelId:b.model.modelId}))},"AI action model config"),{providerFallback:{logger:r,providers:h,websocketFirst:n.openAIWebSocketModel?{enabled:true,provider:{id:ky,model:n.openAIWebSocketModel}}:void 0,onError:({error:b,failedModelId:y})=>{r.warn({err:b,modelId:y},"Mobile AI action model failed, trying next fallback");}},tools:c,prepareStep:rGe({logger:r}),stopWhen:[stepCountIs(MT),hasToolCall(nl)],system:o,providerOptions:n.providerOptions??nGe}}function rGe({logger:t}){return e=>{let{messages:o}=e,n=0,r=0;for(let i=o.length-1;i>=0;i--){let a=o[i];for(let s of a.content)if(!(typeof s!="object"||!("type"in s))&&!(s.type!=="tool-result"||s.output.type!=="content")&&!(s.output.value.length<3)){for(let l=0;l<s.output.value.length;l++){let c=s.output.value[l];if(c.type!=="text"||!c.text.includes("<emulatorXml>"))continue;if(n<tGe){n++;continue}let u=s.output.value[l+1];if(u?.type!=="text"){t.warn({msg:u},"Got unexpected part when truncating emulator state message");continue}u.text=AB;}for(let l=0;l<s.output.value.length;l++){let c=s.output.value[l];if(c.type!=="text"||!c.text.includes("<screenshot>"))continue;if(r<oGe){r++;continue}let u=s.output.value[l+1];if(!(u?.type==="text"&&u.text===AB)){if(u?.type!=="media"){t.warn({msg:u},"Got unexpected part when truncating screenshot message");continue}s.output.value[l+1]={type:"text",text:AB};}}}}return {...e,messages:o}}}var tT=t=>{let e=tool({description:"Get the current emulator state. Returns viewport + screenshot by default, and can optionally include emulator XML.",inputSchema:w__default.object({includeEmulatorXml:w__default.boolean()}),toModelOutput:({output:o})=>o,execute:async({includeEmulatorXml:o})=>{let{controller:n,logger:r,contextManager:i}=t;return i.recordGenericToolCall(wB),r.info({includeEmulatorXml:o},"AI action tool called (get_emulator_state)"),RB(n,{includeEmulatorXml:o})}});return {name:wB,tool:e}};async function RB(t,e){let{includeEmulatorXml:o}=e,n=await t.getScreenshotBase64(),r=await t.getViewportBounds(),i=r.right-r.left,a=r.bottom-r.top,s=[{type:"text",text:`<viewportSize width="${i}" height="${a}" />`}];if(o){let l=await t.getEmulatorDomState();s.push({type:"text",text:"<emulatorXml>"},{type:"text",text:l},{type:"text",text:"</emulatorXml>"});}return s.push({type:"text",text:"<screenshot>"},{type:"media",data:n,mediaType:"image/png"},{type:"text",text:"</screenshot>"}),{type:"content",value:s}}async function oT(t,e,o){let{contextManager:n,controller:r}=t,{useScreenshotStability:i=false}=o??{},a={id:randomUUID(),type:"MOBILE_PRESET_STEP",command:e},s=await n.createAndExecuteStep(a);s.status==="SUCCESS"&&(i?await r.waitForScreenshotStability({reason:"Waiting for stability after executing AI-generated sub-step"}):await r.waitForPageSourceStability({reason:"Waiting for stability after executing AI-generated sub-step"}));let l={...s,trace:void 0,beforeSnapshot:void 0,afterSnapshot:void 0},c=await RB(r,{includeEmulatorXml:false});return {type:"content",value:[{type:"text",text:"<result>"},{type:"text",text:JSON.stringify(l,null,2)},{type:"text",text:"</result>"},{type:"text",text:"<stateAfter>"},...c.value,{type:"text",text:"</stateAfter>"}]}}var mie=t=>({name:"create_execute_step",tool:tool({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:w__default.object({step:GI}),toModelOutput:({output:o})=>o,execute:async({step:o})=>{t.logger.info({step:o},"AI action tool called (create_execute_step)");let n=EV(o);return oT(t,n)}})});var pie=[mie,tT,YS];var cGe=Dr`
6079
+ </cachedSteps>`),...eT(LWe(n,c)),...nie(u)]}]});if(!d.finalState)try{m.warn("AI action finished without finish tool call, attempting repair");let v=await Fy({maxAttempts:KS,logger:m,agentConfig:h,streamResponseMessages:g,abortSignal:f,schema:ng,userMessage:SB});d.finalState=await aie(d,v);}catch(v){if(f?.aborted)throw v;m.error({err:v},"Finish tool repair failed during healing");}if(!d.finalState||d.finalState.status!=="SUCCESS")return m.info({status:d.finalState?.status??null,message:d.finalState?.message??null},"AI action V3 healing did not produce a successful result"),{type:"failed"};let b=d.generatedSteps;m.info({steps:d.generatedSteps.map(v=>`${v.type}:${v.command.type}`)},"AI action V3 healing generated steps");let y=iie(r,d.autoGeneratedPostcondition);s?.onAiActionEvent?.({type:"CACHED_STEPS_GENERATED",cachedSteps:b,resolvedGoal:o,rootStep:p}),a.cache=Rh(t.platform,o,b,y);let T={...a,type:"MOBILE_AI_ACTION_STEP",status:"SUCCESS",startTime:l,endTime:Date.now(),message:d.finalState.message,steps:[...i,...d.results],cache:Rh(t.platform,o,b,y)};return Di({result:T,...Oi(T.steps)}),{type:"healed",result:T}}async function FWe(t,e,o){let{step:n}=t.aiActionParams,{step:r}=t.callbacks,i=Date.now(),a=await Ah({controller:t.fixtures.controller}),{contextManager:s,logger:l,rootStep:c,abortSignal:u,repairConfig:d,streamResponseMessages:m}=await sie({params:t,isHealing:false,postcondition:o.postcondition,postconditionStep:o.postconditionStep,systemPrompt:EB({platform:t.platform,goal:e,autoGeneratePostcondition:o.shouldAutoGeneratePostcondition}),messages:[{role:"user",content:[...eT(e),...rie(o.postcondition),...nie(a)]}]});if(!s.finalState){l.warn("AI action finished without finish tool call, attempting repair");try{let T=await Fy({maxAttempts:KS,logger:l,agentConfig:d,streamResponseMessages:m,abortSignal:u,schema:ng,userMessage:SB});s.finalState=await aie(s,T);}catch(T){throw l.error({err:T},"Finish tool repair failed"),new O("InternalWebAgentError","AI action did not produce a final state")}}let p=s.finalState.status==="SUCCESS",f=s.generatedSteps,h=iie(o,s.autoGeneratedPostcondition);n.cache=void 0;let{cache:g,...b}=n;p?(n.cache=Rh(t.platform,e,f,h),l.info({steps:s.generatedSteps.map(T=>`${T.type}:${T.command.type}`)},"AI action V3 generated steps"),f.length>0&&r?.onAiActionEvent?.({type:"CACHED_STEPS_GENERATED",cachedSteps:f,resolvedGoal:e,rootStep:c})):l.info({finalStateStatus:s.finalState.status,finalStateMessage:s.finalState.message,generatedStepCount:s.generatedSteps.length},"AI action V3 generation failed");let y={...p?n:b,type:"MOBILE_AI_ACTION_STEP",status:s.finalState.status,startTime:i,endTime:Date.now(),message:s.finalState.message,steps:s.results,...p&&{cache:Rh(t.platform,e,f,h)}};return Di({result:y,...Oi(y.steps)}),y}async function BWe(t,e,o,n,r,i){let{step:a}=t.callbacks,s=t.fixtures.logger.child({stepId:e.id}),l=Date.now(),{cache:c,...u}=e,d=i.existingAutoGeneratedPostcondition,m=a?.onAiActionEvent;s.info({cachedStepCount:o.length,resolvedGoal:n},"Starting AI action V3 replay of cached steps");let p=await vB(t,o,"AI action V3 generated steps","REPLAY",m,r);if(p.status==="CANCELLED")return s.info("AI action V3 replay cancelled"),{...u,type:"MOBILE_AI_ACTION_STEP",status:"CANCELLED",startTime:l,endTime:Date.now(),message:p.terminalResult?.message??"AI action replay cancelled.",steps:p.results};if(p.status==="SUCCESS"){let g=await UWe(t,i.postconditionStep,r,m);if(g?.status==="CANCELLED")return {...u,type:"MOBILE_AI_ACTION_STEP",status:"CANCELLED",startTime:l,endTime:Date.now(),message:g.terminalResult?.message??"AI action replay cancelled.",steps:[...p.results,...g.results]};if(!g||g.status==="SUCCESS"){e.cache=Rh(t.platform,n,o,d),s.info({durationMs:Date.now()-l},"AI action V3 replay succeeded");let y={...e,type:"MOBILE_AI_ACTION_STEP",status:"SUCCESS",startTime:l,endTime:Date.now(),message:"Replayed cached steps successfully.",steps:[...p.results,...g?.results??[]],cache:Rh(t.platform,n,o,d)};return Di({result:y,...Oi(y.steps)}),y}let b=g.terminalResult?.message??"Postcondition evaluation failed.";return s.info({postconditionFailure:b},"AI action V3 postcondition failed after replay, attempting autoheal"),m?.({type:"PHASE",phase:"AUTOHEAL",rootStep:r}),oie(await tie(t,o,n,{kind:"postcondition_failed",postcondition:i.postcondition??"",failureMessage:b},i,p.results),{stepWithoutCache:u,startTime:l,logger:s,failureMessage:b,priorResults:[...p.results,...g.results??[]]})}let f=p.terminalResult?.message??"Unknown error";s.info({failureMessage:f,successfulSteps:p.results.length},"AI action V3 replay failed, attempting autoheal"),m?.({type:"PHASE",phase:"AUTOHEAL",rootStep:r});let h=p.terminalResult?Math.max(0,p.results.length-1):p.results.length;return oie(await tie(t,o,n,{kind:"step_failed",successfulStepCount:h,failureMessage:f},i,p.results.slice(0,h)),{stepWithoutCache:u,startTime:l,logger:s,failureMessage:f,priorResults:p.results})}async function UWe(t,e,o,n){if(e)return n?.({type:"PHASE",phase:"POSTCONDITION",rootStep:o}),vB(t,[e],"AI action V3 postcondition","POSTCONDITION",n,o)}function oie(t,e){return t.type==="healed"?(e.logger.info({durationMs:Date.now()-e.startTime},"AI action V3 autoheal succeeded"),t.result):(e.logger.info({durationMs:Date.now()-e.startTime,failureMessage:e.failureMessage},"AI action V3 autoheal failed \u2014 replay could not be recovered"),{...e.stepWithoutCache,type:"MOBILE_AI_ACTION_STEP",status:"FAILED",startTime:e.startTime,endTime:Date.now(),message:`Cached step replay failed and healing could not recover. Replay failure: ${e.failureMessage}`,steps:e.priorResults})}async function zWe(t){let{step:e}=t.callbacks,{controller:o}=t.fixtures,n=t.aiActionParams.step,r=Date.now();await o.waitForPageSourceStability({reason:"Waiting for stability before AI action"});let i=await kWe(t,n),a=n.cache,s=DWe(t.platform,a),l=a?.platform===t.platform&&s.length>0&&a.resolvedGoal===i,c={stepId:n.id,parentStepIdChain:t.aiActionParams.stepTracer.getParentStepIdChain()},u=e?.onAiActionEvent,d=(g,b)=>{u?.({type:"PHASE",phase:g,failureMessage:b,rootStep:c});},m=Gg({platform:t.platform,step:n}),p=[];if(m.preconditionStep){d("PRECONDITION");let g=await vB(t,[m.preconditionStep],"AI action V3 precondition","PRECONDITION",u,c);if(p.push(...g.results),g.status!=="SUCCESS"){let b=g.terminalResult?.message??"Precondition was not satisfied.",{cache:y,...T}=n;return {...T,type:"MOBILE_AI_ACTION_STEP",status:g.status,startTime:r,endTime:Date.now(),message:g.status==="CANCELLED"?b:`Precondition failed: ${b}`,steps:p}}}let f=await $We({params:t,originalStep:n,generatedSteps:s,canReplayCachedSteps:l,existingCache:a,resolvedGoal:i,rootStep:c,replaySteps:m,emitPhase:d});if(p.length===0||f.type!=="MOBILE_AI_ACTION_STEP")return f;let h={...f,steps:[...p,...f.steps]};return Di({result:h,...Oi(h.steps)}),h}async function $We({params:t,originalStep:e,generatedSteps:o,canReplayCachedSteps:n,existingCache:r,resolvedGoal:i,rootStep:a,replaySteps:s,emitPhase:l}){let c=e.postcondition?.trim()||void 0,{step:u}=t.callbacks;if(n){l("REPLAY");let p={userPostcondition:c,postcondition:AE(e),postconditionStep:s.postconditionStep,shouldAutoGeneratePostcondition:!AE(e),existingAutoGeneratedPostcondition:r?.autoGeneratedPostcondition};return BWe(t,e,o,i,a,p)}o.length>0&&r?.resolvedGoal!==i&&(u?.onAiActionEvent?.({type:"THOUGHT",text:"Skipping cached replay because the resolved goal no longer matches the cached goal.",rootStep:a}),t.fixtures.logger.info({stepId:e.id,rawGoal:e.text,cachedResolvedGoal:r?.resolvedGoal,resolvedGoal:i},"Skipping cached replay because the resolved goal no longer matches the cached goal.")),l("GENERATE");let d=Gg({platform:t.platform,step:{cache:void 0,precondition:void 0,postcondition:c}}),m={userPostcondition:c,postcondition:c,postconditionStep:d.postconditionStep,shouldAutoGeneratePostcondition:!c,existingAutoGeneratedPostcondition:void 0};return FWe(t,i,m)}function VWe(t,e){let{rootStep:o,...n}=e;switch(n.type){case "THOUGHT":case "TOOL_CALL":case "PHASE":case "STEP_UPDATE":case "POSTCONDITION_AUTOGENERATED":t.push(n);break;}}function lie(t,e={}){for(let o of t)o.afterSnapshot&&(e[o.id]=o.afterSnapshot),"steps"in o&&lie(o.steps,e);return e}function jWe(t,e){let o=lie(e);for(let n of t)n.type==="STEP_UPDATE"&&(n.afterSnapshotId=o[n.step.id]);}async function cie(t){await Ev({enabled:true,serviceName:"mobile-ai-action"});let{step:e}=t.aiActionParams,{logger:o,controller:n}=t.fixtures,r=Date.now(),{cache:i,...a}=e,s=[],l=t.callbacks.step?.onAiActionEvent,c={...t,callbacks:{...t.callbacks,step:{...t.callbacks.step,onAiActionEvent:u=>{VWe(s,u),l?.(u);}}}};return We({name:"mobile_ai_action_v3.run",root:true,attributes:{"momentic.org_id":t.inputs.orgId,"momentic.test_id":t.inputs.testMetadata.id,"momentic.step_id":e.id,"momentic.platform":t.platform},fn:async()=>{try{let u=await zWe(c);return u.type==="MOBILE_AI_ACTION_STEP"&&(jWe(s,u.steps),u.trajectory=s),u}catch(u){let d=n.isAborted()||u instanceof DOMException&&u.name==="AbortError";return d?o.info({stepId:e.id},"AI action V3 aborted"):o.error({err:u},"Failed to execute mobile AI action V3"),{...a,steps:[],type:"MOBILE_AI_ACTION_STEP",startTime:r,endTime:Date.now(),status:d?"CANCELLED":"FAILED",message:d?"Step cancelled.":J(u),trajectory:s}}}})}var pM=class{controller;logger;rootStep;subStepIndex=0;callbacks;finalState=void 0;results=[];constructor(e){let{controller:o,logger:n,callbacks:r,rootStep:i}=e;this.controller=o,this.logger=n,this.callbacks=r,this.rootStep=i;}async createAndExecuteStep(e){this.callbacks.onAiActionEvent?.({type:"SUBSTEP_CREATED",rootStep:this.rootStep,step:e});let o=this.subStepIndex++,n=await this.callbacks.executeStep(e,o);return this.results.push(n),n}recordGenericToolCall(e){this.callbacks.onAiActionEvent?.({type:"GENERIC_TOOL_CALLED",toolName:e,rootStep:this.rootStep});}};async function uie(t){return (t.aiActionParams.step.version??wE)==="3"?cie(t):WWe(t)}async function WWe(t){let e=Date.now(),{controller:o,logger:n}=t.fixtures;try{return await GWe(t)}catch(r){let i=o.isAborted();return i||n.error({err:r},"Failed to execute mobile AI action"),{...t.aiActionParams.step,steps:[],type:"MOBILE_AI_ACTION_STEP",startTime:e,endTime:Date.now(),status:i?"CANCELLED":"FAILED",message:i?"Step cancelled.":J(r)}}}async function GWe(t){let{helpers:e}=t,{initializeAIActionConfig:o}=e,{step:n,stepTracer:r,executeMobileStepList:i}=t.aiActionParams,{controller:a,logger:s}=t.fixtures,{orgId:l}=t.inputs,{step:c}=t.callbacks,u=await r.startSubSteps(),d=randomUUID(),m=s.child({stepId:n.id,aiActionSessionId:d}),p=Date.now(),f=async(M,I)=>{let A=await i({...t,listParams:{steps:[M],tracer:u,containerName:`AI action sub-step ${I}`}});if(A.results.length!==1)throw new O("InternalWebAgentError","Expected exactly one result from executeMobileStepList");return A.results[0]},h={stepId:n.id,parentStepIdChain:r.getParentStepIdChain()},g=new pM({controller:a,callbacks:{onAiActionEvent:c?.onAiActionEvent,executeStep:f},logger:m,rootStep:h});await a.waitForPageSourceStability({reason:"Waiting for stability before AI action"});let y=o({controller:a,logger:m,contextManager:g,aiActionSessionId:d}),T=await kl({orgId:l,s:n.text,context:a.context,logger:m,localTools:a.localCodeEvalTools,signal:a.abortSignal}),v=kA({...y,messages:[...y.messages??[],{role:"user",content:T}],abortSignal:a.abortSignal});for await(let M of v.fullStream)switch(a.throwIfAborted(),M.type){case "text-delta":c?.onAiActionEvent?.({type:"LLM_TEXT_OUTPUT",text:M.text,rootStep:h});}let E=await v.response;if(a.throwIfAborted(),!g.finalState){m.warn("AI action finished without finish tool call, attempting repair");try{let M=await Fy({maxAttempts:KS,logger:m,agentConfig:{providerFallback:y.providerFallback,system:y.system,messages:[...y.messages??[],{role:"user",content:T}],providerOptions:y.providerOptions},streamResponseMessages:E.messages,abortSignal:a.abortSignal,schema:yB,userMessage:zre});g.finalState={message:M.message,status:M.success?"SUCCESS":"FAILED"};}catch(M){throw m.error({err:M},"Finish tool repair failed"),new O("InternalWebAgentError","AI action did not produce a final state")}}let P={...n,status:g.finalState.status,startTime:p,endTime:Date.now(),message:g.finalState.message,steps:g.results};return Di({result:P,...Oi(g.results)}),P}var KWe=30*60*1e3;async function rl(t){let{fixtures:e,inputs:o,listParams:n,work:r}=t,{containerName:i,steps:a,tracer:s}=n,{logger:l,controller:c,usageTracker:u}=e,d=s.getParentStepIdChain(),m=[];d.length===0&&(r.topLevelResults=m,r.fullTestSteps=a);let p,f="SUCCESS",h,{fromStep:g,toStep:b}=o;for(let y=0;y<a.length;y++){let T=a[y];if(T.skipped)continue;if(r.fastForwardingToStep&&g){let I=JSON.stringify(d);if(T.id===g.fromStepId&&I===JSON.stringify(g.parentStepIdChain))r.fastForwardingToStep=false;else if(!wK({currentStep:T,currentParentChain:d,desiredStepId:g.fromStepId,desiredStepParentChain:g.parentStepIdChain}))continue}let v=0,E=1,P=Date.now();T.retries&&T.retries>0&&(E+=T.retries);let M=[];for(;v<E&&Date.now()-P<KWe;){v++;let I=`Executing step index ${y} in ${i} - ${sa(T)}`;v!==1&&(I+=` (attempt ${v})`),l.info({step:T},I);let A=Date.now(),k=await s.startStep({logger:l,step:T,attempt:v,parentStepIdChain:d});u.trackStepExecution(T);let _=cloneDeep(T),H=c.context.toRedactedDisplayCopy(),V;switch(T.type){case "MOBILE_PRESET_STEP":V=`mobile.execute_step.${T.command.type}`;break;case "MOBILE_AI_ACTION_STEP":V="mobile.execute_step.AI_ACTION";break;case "MOBILE_CONDITIONAL_STEP":V="mobile.execute_step.CONDITIONAL";break;case "RESOLVED_MOBILE_MODULE":V="mobile.execute_step.MODULE";break}let j=await We({name:V,attributes:{"momentic.platform":t.platform,"momentic.step_type":T.type,"momentic.step_id":T.id,"momentic.step_index":y,"momentic.step_attempt":v},fn:async()=>YWe({step:T,stepTracer:k,params:t})});j.beforeTestContext=H,j.afterTestContext=c.context.toRedactedDisplayCopy(),k.recordStepDuration({step:T,durationMs:Date.now()-A});let{trace:le}=await k.finish({parentStepIdChain:d,result:j});if(j.trace=le,I=`Finished step index ${y} in ${i} - ${sa(T)}`,v!==1&&(I+=` (attempt ${v})`),l.info({step:{id:T.id},trace:j.trace,status:j.status},I),j.status==="FAILED"&&v<E){M.push(j),Date.now()-A<1e3&&await Te(1e3-(Date.now()-A));continue}if(M.length>0&&(j.previousAttempts=M),m.push(j),h=await XWe({result:j,step:T,originalStep:_,steps:a,currentStepIndex:y,params:t,stepTracer:k,isLastAttempt:v===E,results:m,containerParentChain:d}),j.status!=="SUCCESS"&&h!=="SUCCESS")return f=j.status,p=j,{results:m,status:f,terminalResult:p};if(T.envKey&&j.status==="SUCCESS"&&(c.context.setVariable(T.envKey,j.data),j.afterTestContext=c.context.toRedactedDisplayCopy()),b){let Y=JSON.stringify(d);if(T.id===b.toStepId&&Y===JSON.stringify(b.parentStepIdChain))return r.shouldStopExecuting=true,{results:m,status:f,terminalResult:p}}if(r.shouldStopExecuting)return {results:m,status:f,terminalResult:p};break}}return {results:m,status:f,terminalResult:p}}async function YWe({step:t,params:e,stepTracer:o}){let{work:n}=e,r;switch(t.type){case "MOBILE_PRESET_STEP":{r=await lM({...e,step:t,stepTracer:o});break}case "RESOLVED_MOBILE_MODULE":{r=await Ure({...e,moduleParams:{step:t,stepTracer:o,executeMobileStepList:rl}});break}case "MOBILE_CONDITIONAL_STEP":{r=await Bre({...e,conditionalParams:{step:t,stepTracer:o,executeMobileStepList:rl}});break}case "MOBILE_AI_ACTION_STEP":{let i=n.state.failureRecoveryDisabled;i||(n.state.failureRecoveryDisabled=true);try{r=await uie({...e,aiActionParams:{step:t,stepTracer:o,executeMobileStepList:rl}});}finally{i||(n.state.failureRecoveryDisabled=i);}break}default:return (a=>{throw new Error(`Unsupported mobile step type: ${a}`)})(t)}return r}async function XWe({result:t,step:e,originalStep:o,steps:n,currentStepIndex:r,params:i,stepTracer:a,isLastAttempt:s,results:l,containerParentChain:c}){let u,d;if(s&&t.status==="FAILED"&&t.type==="MOBILE_PRESET_STEP"&&!i.work.state.failureRecoveryDisabled){let m=await Lre({...i,stepTracer:a,step:e,steps:n,currentStepIndex:r,isLastAttempt:s,executeMobileStepList:rl,failedStep:o,nextSteps:n.slice(r+1),results:l.concat(t),containerParentChain:c});m&&(m.type==="ATTEMPTED"&&(u=m.result.results,d=m.status),t.failureRecoveryStatus={type:m.type,message:m.message,shortMessage:"shortMessage"in m?m.shortMessage:void 0,durationMs:m.durationMs}),d==="SUCCESS"&&e.type==="MOBILE_PRESET_STEP"&&e.command.type==="AI_CHECK"&&e.command.cache!==void 0&&(i.fixtures.logger.info({stepId:e.id,commandType:e.command.type},"Clearing assertion cache after successful failure recovery"),e.command.cache=void 0);}return u&&l.push(...u),d}async function xh(t){let{tracer:e,containerName:o,platform:n}=t,{steps:r,beforeSteps:i,afterSteps:a,testMetadata:s}=t.inputs,{cacheStorage:l,logger:c}=t.fixtures,u=c.child({testId:t.inputs.testMetadata.id,testName:t.inputs.testName}),d=!t.inputs.fromStep&&!t.inputs.toStep;await l.populateCacheForRun({logger:u,platform:n,testId:s.id,environment:t.envName,stepLists:{steps:r,...i&&{beforeSteps:i},...a&&{afterSteps:a}},skipFetchingCacheFromStorage:t.inputs.interactive,useSnapshotIdentityCache:t.inputs.useSnapshotIdentityCache});let m=cloneDeep(r),p=i?cloneDeep(i):void 0,f=a?cloneDeep(a):void 0;u.info({platform:n,testMetadata:UE.parse(s)},"Starting mobile test");let h=EG(u);u.info({cpu:h?.cpuMetadata,platform:h?.platform},`Starting execution of ${o}`);let g,b;if(d&&p&&p.length>0){let I=await e.startBeforeStepList(),A=await rl({...t,listParams:{containerName:"setup",tracer:I,steps:p}});b=A.results,g=Cg(A.status),g!=="PASSED"&&u.error("Setup (beforeSteps) failed, skipping main steps");}let y,T=[],v;if(g===void 0||g==="PASSED"){let I=await e.startMainStepList(),A=await rl({...t,listParams:{containerName:o,tracer:I,steps:m}});y=A.status,T=A.results,v=A.terminalResult;}let E,P;if(d&&f&&f.length>0){let I=await e.startAfterStepList(),A=await rl({...t,listParams:{containerName:"teardown",tracer:I,steps:f}});P=A.results,E=Cg(A.status),E!=="PASSED"&&u.error("Teardown (afterSteps) failed");}clearInterval(h?.interval),await ZWe({originalStepLists:{steps:r,beforeSteps:i,afterSteps:a},executedStepLists:{steps:m,beforeSteps:p,afterSteps:f},logger:u,cacheStorage:l,orgId:t.inputs.orgId,testId:s.id,environment:t.envName,platform:n,useSnapshotIdentityCache:t.inputs.useSnapshotIdentityCache});let M=Y1({beforeStatus:g,mainStatus:y,afterStatus:E});return u.info({overallStatus:M,platform:n},"Mobile test final result"),{status:M,results:T,beforeResults:b,afterResults:P,terminalResult:v,failureRecoveryDetails:t.work.state.failureRecoveryAttempts?{attempts:t.work.state.failureRecoveryAttempts}:void 0}}async function ZWe({originalStepLists:t,executedStepLists:e,logger:o,cacheStorage:n,orgId:r,testId:i,environment:a,platform:s,useSnapshotIdentityCache:l}){let c=diff(t,e),u=Object.keys(c).length>0;if(!u&&!l){o.info("No cache entries to update");return}u?o.info({diffs:Dm(c)},"Saving mobile step cache entries"):o.info("No cache entries to update");let{cachesToSave:d,snapshotCachesToSave:m}=await Gn({platform:s,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},cacheCreationParams:{environment:a,orgId:r,testId:i},useSnapshotIdentityCache:l});u&&await n.saveEntries({platform:s,logger:o,entries:d}),l&&await n.saveSnapshotCacheEntries({platform:s,logger:o,entries:m});}var wB="get_emulator_state";var tGe=3,oGe=10,AB="TRUNCATED DUE TO CONVERSATION LENGTH",nGe={openai:{reasoningEffort:"medium",store:false,textVerbosity:"low",serviceTier:"priority"},azure:{reasoningEffort:"medium",store:false,textVerbosity:"low",serviceTier:"priority"},anthropic:{...c7,effort:"high"}};function fM(t,e,o,n={}){let{logger:r,controller:i,contextManager:a,aiActionSessionId:s}=t,l=i.generator,c={};for(let b of e){let y=b({contextManager:a,logger:r,controller:i});c[y.name]=UA({tool:y.tool,name:y.name,logger:r,logPrefix:"Mobile AI action ",agentName:"ai-action-tool-based"});}let u={logger:r,sessionId:s,streamType:"ai-action-tool-based"},d={...u,useOpenAIResponsesWebSocket:false},m=l.getOpenAIModelFactory(d),p=l.getAzureOpenAIModelFactory(u),f=l.getAnthropicModelFactory(u),h=n.providers??[{id:"openai",model:m("gpt-5.3-codex")},{id:"azure",model:p("gpt-5.3-codex")},{id:"anthropic",model:f("claude-sonnet-4-6")}];return r.info({providers:h.map(b=>({id:b.id,modelId:b.model.modelId}))},"AI action model config"),{providerFallback:{logger:r,providers:h,websocketFirst:n.openAIWebSocketModel?{enabled:true,provider:{id:ky,model:n.openAIWebSocketModel}}:void 0,onError:({error:b,failedModelId:y})=>{r.warn({err:b,modelId:y},"Mobile AI action model failed, trying next fallback");}},tools:c,prepareStep:rGe({logger:r}),stopWhen:[stepCountIs(MT),hasToolCall(nl)],system:o,providerOptions:n.providerOptions??nGe}}function rGe({logger:t}){return e=>{let{messages:o}=e,n=0,r=0;for(let i=o.length-1;i>=0;i--){let a=o[i];for(let s of a.content)if(!(typeof s!="object"||!("type"in s))&&!(s.type!=="tool-result"||s.output.type!=="content")&&!(s.output.value.length<3)){for(let l=0;l<s.output.value.length;l++){let c=s.output.value[l];if(c.type!=="text"||!c.text.includes("<emulatorXml>"))continue;if(n<tGe){n++;continue}let u=s.output.value[l+1];if(u?.type!=="text"){t.warn({msg:u},"Got unexpected part when truncating emulator state message");continue}u.text=AB;}for(let l=0;l<s.output.value.length;l++){let c=s.output.value[l];if(c.type!=="text"||!c.text.includes("<screenshot>"))continue;if(r<oGe){r++;continue}let u=s.output.value[l+1];if(!(u?.type==="text"&&u.text===AB)){if(u?.type!=="media"){t.warn({msg:u},"Got unexpected part when truncating screenshot message");continue}s.output.value[l+1]={type:"text",text:AB};}}}}return {...e,messages:o}}}var tT=t=>{let e=tool({description:"Get the current emulator state. Returns viewport + screenshot by default, and can optionally include emulator XML.",inputSchema:w__default.object({includeEmulatorXml:w__default.boolean()}),toModelOutput:({output:o})=>o,execute:async({includeEmulatorXml:o})=>{let{controller:n,logger:r,contextManager:i}=t;return i.recordGenericToolCall(wB),r.info({includeEmulatorXml:o},"AI action tool called (get_emulator_state)"),RB(n,{includeEmulatorXml:o})}});return {name:wB,tool:e}};async function RB(t,e){let{includeEmulatorXml:o}=e,n=await t.getScreenshotBase64(),r=await t.getViewportBounds(),i=r.right-r.left,a=r.bottom-r.top,s=[{type:"text",text:`<viewportSize width="${i}" height="${a}" />`}];if(o){let l=await t.getEmulatorDomState();s.push({type:"text",text:"<emulatorXml>"},{type:"text",text:l},{type:"text",text:"</emulatorXml>"});}return s.push({type:"text",text:"<screenshot>"},{type:"media",data:n,mediaType:"image/png"},{type:"text",text:"</screenshot>"}),{type:"content",value:s}}async function oT(t,e,o){let{contextManager:n,controller:r}=t,{useScreenshotStability:i=false}=o??{},a={id:randomUUID(),type:"MOBILE_PRESET_STEP",command:e},s=await n.createAndExecuteStep(a);s.status==="SUCCESS"&&(i?await r.waitForScreenshotStability({reason:"Waiting for stability after executing AI-generated sub-step"}):await r.waitForPageSourceStability({reason:"Waiting for stability after executing AI-generated sub-step"}));let l={...s,trace:void 0,beforeSnapshot:void 0,afterSnapshot:void 0},c=await RB(r,{includeEmulatorXml:false});return {type:"content",value:[{type:"text",text:"<result>"},{type:"text",text:JSON.stringify(l,null,2)},{type:"text",text:"</result>"},{type:"text",text:"<stateAfter>"},...c.value,{type:"text",text:"</stateAfter>"}]}}var mie=t=>({name:"create_execute_step",tool:tool({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:w__default.object({step:GI}),toModelOutput:({output:o})=>o,execute:async({step:o})=>{t.logger.info({step:o},"AI action tool called (create_execute_step)");let n=EV(o);return oT(t,n)}})});var pie=[mie,tT,YS];var cGe=Dr`
6080
6080
  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.
6081
6081
  `,hie=t=>Dr`
6082
6082
  <background>
@@ -6270,7 +6270,7 @@ Choose the SCROLL_TO container based on which region will actually move:
6270
6270
  - If an OPEN_APP scroll fails while a nested scrollable region is visible on screen, assume the container was probably wrong and retry with CUSTOM before giving up.
6271
6271
  </rule>
6272
6272
  </rules>
6273
- `;function Eie(t){return fM(t,yie,Tie())}var ql={initializeAIActionConfig:Eie,stepSchema:Tn,resultSchema:Qr};var fGe=5e3,xB=2;async function Cie({socket:t,logger:e,orgId:o,testMetadata:n,globalOrgSettings:r,androidDriverFactory:i,mobileGeneratorFactory:a,browserGeneratorFactory:s,browserEnricherFactory:l,storageFactory:c,visualDiffGoldenStorageFactory:u,cacheStorageFactory:d,localToolsFactory:m,onRemoteEmulatorCreated:p,onRemoteEmulatorDeleted:f,billingReporterFactory:h,globalStateManager:g,getGitMetadata:b,region:y,localApkPath:T,localAvdId:v}){let E=t.id,P=t.handshake.query?.fileName,M=P?Oo__default.basename(P,".test.yaml"):"",I=n.id;e=e.child({sessionId:E,testId:I,orgId:o});let A=await b(e);e=e.child({branch:A.gitBranchName});let k=await c(o),_=n.settings?.defaultEnv,H={};_&&(H=(await k.fetchEnvironment(_,e))?.variables??{});let V={...r.emulator,...n.settings?.emulator},j={...r.ai,useMemory:r.ai?.useMemory!==false,...n.settings?.ai},le=g.getSession(E);if(le){if(e.info("Reconnecting to existing Android session"),le.local)return t.emit("session",le.metadata),le.softDeleted=false,le.metadata;throw new Error("Restoring existing remote emulator sessions is not supported. Please reconnect to a new emulator.")}let Y=await d(o,A,e),L=bc.optional().parse(y??V.region),U=L==="local",x,X,B;if(U){if(await g.clearSoftDeletedLocalSessions(e),g.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");let{avdId:$n,apkFilePath:Or,apkFilePathSource:os}=rp({overrideAvdId:v,overrideApkFilePath:T,emulatorSettings:V,defaultApkFilePath:n.settings?.defaultApkFilePath,envVariables:H}),Zl=Cf({apkFilePath:Or,source:os});if(!$n)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 ${nc} key on the environment.`);B={avdId:$n,apkFilePath:Zl};}else x=n.settings?.defaultChannel,X=n.settings?.defaultTag,B={region:L===xi?void 0:L,apkToInstall:x?{channel:x,tag:X}:void 0,osVersion:V.remoteEmulatorSettings?.androidVersion??Jm};e.info({platform:"ANDROID",isLocalRegion:U,resolvedRegion:L,envName:_,emulatorSettings:V,aiSettings:j},"Starting mobile session with resolved configuration");let z=Date.now(),q,Q;for(let $n=1;$n<=xB;$n++)try{q=await i({socket:t,logger:e,creationOpts:B,emulatorSettings:V});break}catch(Or){if(Q=Or,$n===xB)break;e.warn({err:Or,attempt:$n,maxAttempts:xB},"Mobile session bootstrap failed; retrying bootstrap");}if(!q)throw Q||new Error("Mobile session bootstrap failed without an error");let{driver:Me,cleanup:rt,emulatorName:it,adbPort:kt}=q,ne,K,Re,Vt,lt,we;"limbarClient"in q&&(ne=q.limbarClient,K=q.limbarToken,Re=q.limbarUrl,Vt=q.limbarRegion,lt=q.limbarOsVersion,we=q.playwrightDevice);let bt=Oo__default.join(tmpdir(),`logcat-logs-${o}-${I}-${E}.txt`);U||await p?.({emulatorName:it,platform:"ANDROID"}),e.info({adbPort:kt,apkChannel:x,apkTag:X,duration:Date.now()-z,emulatorName:it},"Android emulator session initiated"),e=e.child({emulator:it});let ho=false,an=false,Ko,go,Mn,Zn,ts=async()=>{if(ho)return;ho=true,an=true,clearInterval(Mn),Mn=void 0;let Or=[async()=>{await go?.cleanup();},async()=>{await Ko?.();},async()=>{await rt(),U||await f?.({emulatorName:it,platform:"ANDROID"});},async()=>{await Zn?.dispose();}].map(os=>os().catch(Zl=>{e.warn({err:Zl},"Failed to clean up socket server resource");}));await re(Promise.allSettled(Or),{milliseconds:fGe,fallback:()=>{}});};g.registerPendingSession(E,{platform:"ANDROID",cleanup:ts,emulatorName:it,local:U});let Mu=async()=>{Ko=await Me.executeInNativeContext(e,mT=>pA({driver:mT,onLogs:ile=>{t.emit("logcatLogs",ile);},logFilePath:bt}),{operationName:"startLogcatListener"});let $n=await a(o,e),Or=await s(o,e),os=await l(o,e);Zn=m?await m(o):void 0;let Zl=new Ds({logger:e,reporter:await h(o),runType:"mobile-test-run",runId:E,testMetadata:{id:n.id,name:M},isInteractive:true,runner:"editor"}),R=new ta({variablesFromEnvironment:H,envName:_,testName:M});if(go=await vu.init({driver:Me,generator:$n,logger:e,limbarClient:ne,playwrightDevice:we,aiSettings:j,options:{emulator:{...V,browserSettings:r.browser}},fixtures:{storage:k,browserEnricher:os,browserGenerator:Or,localCodeEvalTools:Zn,testContext:R,visualDiffGoldenStorage:u()},orgId:o,adbPort:kt,abortController:new AbortController}),!go)throw new Error("Failed to initialize Android controller");let me=go;if(an||!t.connected)throw new Error("Socket not connected anymore, not proceeding with Android session setup");let co=await me.getViewportBounds();if(an||!t.connected)throw new Error("Socket not connected anymore, not proceeding with Android session setup");Mn=hGe({socket:t,testContext:R});let zo={sessionId:E,testId:I,orgId:o,emulatorName:it,testName:M,limbarUrl:Re,limbarToken:K,limbarRegion:Vt,limbarOsVersion:lt,viewportBounds:co,envName:_};return g.registerSession(E,{platform:"ANDROID",controller:me,cacheStorage:Y,cleanup:ts,emulatorName:it,local:U,metadata:zo,logFilePath:bt,helpers:Gl,usageTracker:Zl}),t.emit("session",zo),zo};try{return await Mu()}catch($n){throw await g.removeSession(E,e),$n}}function hGe({socket:t,testContext:e}){return setInterval(()=>{let o=e.toEditorDisplayCopy();t.emit("emulatorState",{context:o});},3e3)}async function wie({socket:t,logger:e,globalStateManager:o,authorization:n}){let r=t.id,i=o.getSession(r);i&&i.platform==="ANDROID"&&n&&i.logFilePath&&gGe({testId:i.metadata.testId,sessionId:r,logFilePath:i.logFilePath,authorization:n,logger:e}),await o.removeSession(r,e);}async function gGe({testId:t,sessionId:e,logFilePath:o,authorization:n,logger:r}){try{let i;try{i=await hM.stat(o);}catch{r.debug({logFilePath:o},"No logcat file found to upload");return}if(i.size===0){r.debug({logFilePath:o},"Logcat file is empty, skipping upload"),await hM.unlink(o);return}let a=new on({...n,mode:"interactive",runner:"editor"}),{uploadUrl:s}=await a.generateMobileLogcatUploadUrl({testId:t,sessionId:e}),l=await hM.readFile(o),c=await fetch(s,{headers:{"Content-Length":l.length.toString(),"Content-Type":"text/plain"},method:"PUT",body:l});if(c.status!==200)throw new Error(`Failed to upload logcat: ${c.status} ${await c.text()}`);r.info({testId:t,sessionId:e,objectUrl:DC(s)},"Logcat file uploaded successfully");}catch(i){r.warn({err:i,testId:t,sessionId:e},"Failed to upload logcat file");}finally{try{await hM.unlink(o);}catch(i){r.warn({err:i,logFilePath:o},"Failed to delete temp logcat file");}}}var bGe=({socket:t,globalStateManager:e})=>async()=>{let o=e.getSession(t.id);if(!o)throw new Error("No active Mobile session found");o.controller.abort();},Aie={event:"cancel",createHandler:bGe};var yGe=({logger:t,globalStateManager:e,socket:o})=>async(n,r)=>{let i=e.getSession(o.id);if(!i){r({err:"No active Mobile session found"});return}let a=i.controller;a.resetAbortController();let s=Date.now();try{let l=await a.getEmulatorDomState();t.info({durationMs:Date.now()-s},"Fetched screen XML"),r({screenXml:l});}catch(l){t.error({err:l},"Error fetching screen XML from the session controller"),r({err:l.message});}},Rie={event:"fetchScreenXml",createHandler:yGe};var MB=class{parentTracer;socket;step;orgId;interactionTracer;platform;constructor({step:e,socket:o,parentTracer:n,orgId:r,platform:i}){this.socket=o,this.parentTracer=n,this.step=e,this.orgId=r,this.platform=i,this.interactionTracer=new ha,Ar.initializeRootTracerContext(this.interactionTracer);}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeXmlSnapshot(){}attachAfterXmlSnapshot(){}recordStepDuration(e){let{durationMs:o,step:n}=e;if(!dv(n))return;let r=uv(n);Qe.distribution("test_mobile_step_duration",o,[`type:${r}`,`platform:${this.platform.toLowerCase()}`,"executor:editor",`orgId:${this.orgId}`]);}async finish(e){this.interactionTracer.finish();let o=this.interactionTracer.getRootSpan(),n={result:e.result,parentStepIdChain:e.parentStepIdChain,trace:s_.parse(o)};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:o}}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}async startSubSteps(){return new Mh({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId,platform:this.platform})}},Mh=class{parentTracer;parentStep;socket;orgId;platform;constructor({parentStep:e,socket:o,parentTracer:n,orgId:r,platform:i}){this.parentTracer=n,this.parentStep=e,this.socket=o,this.orgId=r,this.platform=i;}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 MB({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId,platform:this.platform})}async getScreenshot(e){}},gM=class{constructor(e,o,n){this.socket=e;this.orgId=o;this.platform=n;}appendLogs(){}setActiveVideo(){}async finish(){this.socket.emit("finished");}async startBeforeStepList(){return new Mh({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId,platform:this.platform})}async startMainStepList(){return new Mh({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId,platform:this.platform})}async startAfterStepList(){return new Mh({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId,platform:this.platform})}};var SGe=({metadata:t,logger:e,globalStateManager:o,socket:n,useSnapshotIdentityCache:r,storageFactory:i})=>async(a,s)=>{let l=o.getSession(n.id);if(!l)throw new Error("No active Mobile session found");let c=await i(t.orgId),u=e.child({testId:a.testMetadata.id});u.info({sessionId:t.sessionId,platform:l.platform,testName:t.testName,stepCount:a.steps.length,beforeStepCount:a.beforeSteps?.length??0,afterStepCount:a.afterSteps?.length??0,fromStep:a.fromStep,toStep:a.toStep,typeCommands:EGe(a.steps)},"Received mobile socket execute request"),l.controller.resetAbortController();let d=l.usageTracker,m;try{m=await TGe({session:l,params:a,metadata:t,testLogger:u,usageTracker:d,socket:n,useSnapshotIdentityCache:r,storage:c});}catch(f){if(l.controller.isAborted()||f instanceof DOMException&&f.name==="AbortError"){u.info("Mobile test execution cancelled by user");return}throw f}finally{await d.flush(u);}let p={results:l.helpers.resultSchema.array().parse(m.results),status:m.status};s?.(p);};async function TGe({session:t,...e}){switch(t.platform){case "ANDROID":return xie({session:t,...e});case "IOS":return xie({session:t,...e});default:return (n=>{throw new Error(`Unsupported platform: ${n}`)})(t)}}async function xie({session:t,params:e,metadata:o,testLogger:n,usageTracker:r,socket:i,useSnapshotIdentityCache:a,storage:s}){let l=new gM(i,o.orgId,t.platform);try{return await xh({platform:t.platform,work:{fastForwardingToStep:!!e.fromStep,state:{failureRecoveryDisabled:!0,failureRecoveryAttempts:0}},fixtures:{controller:t.controller,logger:n,cacheStorage:t.cacheStorage,usageTracker:r,storage:s},containerName:"entire test",inputs:{steps:t.helpers.stepSchema.array().parse(e.steps),beforeSteps:e.beforeSteps?t.helpers.stepSchema.array().parse(e.beforeSteps):void 0,afterSteps:e.afterSteps?t.helpers.stepSchema.array().parse(e.afterSteps):void 0,fromStep:e.fromStep,toStep:e.toStep,orgId:o.orgId,testName:o.testName,testMetadata:e.testMetadata,interactive:!0,useSnapshotIdentityCache:a,updateGoldenFiles:e.updateGoldenFiles},envName:o.envName,tracer:l,callbacks:{step:{onAiActionEvent:c=>{i.emit("aiActionEvent",c);}}},helpers:t.helpers})}finally{await l.finish();}}var Mie={event:"execute",createHandler:SGe};function EGe(t){return t.flatMap((e,o)=>!("command"in e)||e.command.type!=="TYPE"?[]:[{index:o,stepId:e.id,target:e.command.target?.type==="description"?e.command.target.description:e.command.target?.type,textLength:e.command.text.length,clearContent:e.command.clearContent,forceClearContent:e.command.forceClearContent,replaceStrategy:e.command.replaceStrategy,hasCache:e.command.cache!==void 0}])}var CGe=({socket:t,globalStateManager:e,keepSessionAlive:o})=>{let n=debounce(o,3e4,{maxWait:6e4});return async()=>{let r=e.getSession(t.id);if(!r)throw new Error("No active Mobile session found");r.emulatorName&&(r.local||n(r.platform,r.emulatorName));}},Pie={event:"keepalive",createHandler:CGe};var wGe=({logger:t,globalStateManager:e,socket:o})=>async({description:n},r)=>{let i=n.trim();if(!i){r({err:"Element description is required"});return}let a=e.getSession(o.id);if(!a){r({err:"No active Mobile session found"});return}let s=a.controller;s.resetAbortController();let l=Date.now();try{let c=await s.locateElement({description:i});t.info({durationMs:Date.now()-l},"Located element"),r({result:c});}catch(c){t.error({err:c},"Error locating element from mobile editor"),r({err:J(c)});}},Iie={event:"locateElement",createHandler:wGe};var AGe=({socket:t,globalStateManager:e,logger:o})=>async(n,r)=>{let i=e.getSession(t.id);if(!i){let s="No active session found";o.error(s),r?.({success:false,err:s});return}let a=i.controller;a.abort(),a.resetAbortController(),o.info({platform:i.platform},"Resetting emulator state");try{await a.softReset(),o.info({platform:i.platform},"Emulator reset completed"),r?.({success:!0,message:"Emulator reset successfully"});}catch(s){let l=J(s);o.error({err:s,platform:i.platform},"Failed to reset emulator"),r?.({success:false,err:`Failed to reset emulator: ${l}`});}},_ie={event:"reset",createHandler:AGe};var Oie=[Mie,Aie,_ie,Pie,Iie,Rie];var xGe=5e3,PB=2;async function Die({socket:t,logger:e,orgId:o,testMetadata:n,globalOrgSettings:r,localIosDeviceType:i,localIosVersion:a,iosDriverFactory:s,mobileGeneratorFactory:l,browserGeneratorFactory:c,browserEnricherFactory:u,billingReporterFactory:d,storageFactory:m,visualDiffGoldenStorageFactory:p,cacheStorageFactory:f,localToolsFactory:h,onRemoteEmulatorCreated:g,onRemoteEmulatorDeleted:b,globalStateManager:y,getGitMetadata:T,region:v,localAppPath:E}){let P=t.id,M=t.handshake.query?.fileName,I=M?Oo__default.basename(M,".test.yaml"):"",A=n.id,k=n.settings?.defaultChannel,_=n.settings?.defaultTag;e=e.child({sessionId:P,testId:A,orgId:o});let H=await T(e);e=e.child({branch:H.gitBranchName});let V=await m(o),j=n.settings?.defaultEnv,le={};j&&(le=(await V.fetchEnvironment(j,e))?.variables??{});let Y={...r.emulator,...n.settings?.emulator},L={...r.ai,useMemory:r.ai?.useMemory!==false,...n.settings?.ai},U=y.getSession(P);if(U){if(e.info("Reconnecting to existing iOS session"),U.local)return t.emit("session",U.metadata),U.softDeleted=false,U.metadata;throw new Error("Restoring existing remote emulator sessions is not supported. Please reconnect to a new emulator.")}let x=await f(o,H,e),X=bc.optional().parse(v??Y.region),B=X==="local",z;if(B){if(await y.clearSoftDeletedLocalSessions(e),y.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");let{deviceType:Ko,iosVersion:go,appFilePath:Mn,appFilePathSource:Zn}=ip({overrideDeviceType:i,overrideIosVersion:a,overrideAppFilePath:E,emulatorSettings:Y,defaultAppFilePath:n.settings?.defaultAppFilePath,envVariables:le});if(!Ko)throw new Error(`A device type is required when using a local region. Provide --local-ios-device-type, configure a default local iOS device type on the test's settings, or set the ${rc} key on the environment.`);let ts=Ch({appFolderPath:Mn,source:Zn});z={type:"local",deviceType:Ko,iosVersion:go,appFilePath:ts};}else z={type:"remote",region:X===xi?void 0:X,appToInstall:k?{channel:k,tag:_}:void 0,osVersion:Zm};e.info({platform:"IOS",isLocalRegion:B,resolvedRegion:X,envName:j,emulatorSettings:Y,aiSettings:L},"Starting mobile session with resolved configuration");let q=Date.now(),Q,Me;for(let Ko=1;Ko<=PB;Ko++)try{Q=await s({socket:t,logger:e,creationOpts:z,emulatorSettings:Y});break}catch(go){if(Me=go,Ko===PB)break;e.warn({err:go,attempt:Ko,maxAttempts:PB},"Mobile session bootstrap failed; retrying bootstrap");}if(!Q)throw Me||new Error("Mobile session bootstrap failed without an error");let{driver:rt,cleanup:it,emulator:kt,limbarParams:ne}=Q;e=e.child({emulator:kt.name}),e.info({duration:Date.now()-q},"iOS emulator session initiated"),B||await g?.({emulatorName:kt.name,platform:"IOS"});let K=false,Re=false,Vt,lt,we,bt,ho=async()=>{if(K)return;K=true,Re=true,we&&(clearInterval(we),we=void 0);let go=[async()=>{await lt?.cleanup();},async()=>{Vt?.();},async()=>{await it(),B||await b?.({emulatorName:kt.name,platform:"IOS"});},async()=>{await bt?.dispose();}].map(Mn=>Mn().catch(Zn=>{e.warn({err:Zn},"Failed to clean up socket server resource");}));await re(Promise.allSettled(go),{milliseconds:xGe,fallback:()=>{}});};y.registerPendingSession(P,{platform:"IOS",cleanup:ho,emulatorName:kt.name,local:B});let an=async()=>{Vt=await Wx({emulator:kt,onLogs:os=>{t.emit("syslogLogs",os);}});let Ko=await l(o,e),go=await c(o,e),Mn=await u(o,e);bt=h?await h(o):void 0;let Zn=new Ds({logger:e,reporter:await d(o),runType:"mobile-test-run",runId:P,runner:"editor",testMetadata:{id:n.id,name:I},isInteractive:true}),ts=new ta({variablesFromEnvironment:le,envName:j,testName:I});if(lt=await wu.init({driver:rt,generator:Ko,logger:e,emulator:kt,aiSettings:L,options:{emulator:{...Y,browserSettings:r.browser}},fixtures:{storage:V,browserEnricher:Mn,browserGenerator:go,localCodeEvalTools:bt,testContext:ts,visualDiffGoldenStorage:p()},orgId:o,abortController:new AbortController}),!lt)throw new Error("Failed to initialize iOS controller");let Mu=lt;if(Re||!t.connected)throw new Error("Socket not connected anymore, not proceeding with iOS session setup");let $n=await Mu.getViewportBounds();if(Re||!t.connected)throw new Error("Socket not connected anymore, not proceeding with iOS session setup");we=MGe({socket:t,testContext:ts});let Or={sessionId:P,testId:A,orgId:o,emulatorName:kt.name,testName:I,limbarUrl:ne?.webRtcUrl,limbarToken:ne?.token,limbarRegion:ne?.region,limbarOsVersion:ne?.osVersion,viewportBounds:$n,envName:j};return y.registerSession(P,{platform:"IOS",controller:Mu,cacheStorage:x,cleanup:ho,emulatorName:kt.name,local:B,metadata:Or,helpers:ql,usageTracker:Zn}),t.emit("session",Or),Or};try{return await an()}catch(Ko){throw await y.removeSession(P,e),Ko}}function MGe({socket:t,testContext:e}){return setInterval(()=>{let o=e.toEditorDisplayCopy();t.emit("emulatorState",{context:o});},3e3)}var bM=class{sessions=new Map;pendingSessions=new Map;registerPendingSession(e,o){this.pendingSessions.set(e,o);}registerSession(e,o){this.pendingSessions.delete(e),this.sessions.set(e,o);}getSession(e){return this.sessions.get(e)}getSessionForTest(e){for(let o of this.sessions.values())if(o.metadata.testId===e)return o}async clearSoftDeletedLocalSessions(e){for(let o of this.sessions.values())o.softDeleted===true&&o.local===true&&await this.removeSession(o.metadata.sessionId,e);}hasActiveLocalSession(){for(let e of [...this.sessions.values(),...this.pendingSessions.values()])if(e.local===true)return true;return false}async removeSession(e,o){let n=this.sessions.get(e)??this.pendingSessions.get(e);if(!n)return;let r=o.child({sessionId:e,emulatorName:n.emulatorName,platform:n.platform});try{await this.sessions.get(e)?.usageTracker.flush(r);}catch(i){r.error({err:i},"Error flushing usage tracker before cleanup");}try{await n.cleanup?.(),r.info("Emulator cleaned up by removeSession");}catch(i){r.error({err:i},"Error during emulator cleanup");}finally{this.sessions.delete(e),this.pendingSessions.delete(e);}}async removeAllSessions(e){let o=Array.from(new Set([...this.sessions.keys(),...this.pendingSessions.keys()]));await Promise.all(o.map(n=>this.removeSession(n,e)));}};function Nie(t){let{logger:e,baseServer:o,globalStateManager:n,settingsFactory:r,getOrgId:i}=t,a=new Server(o,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:true,connectionStateRecovery:{maxDisconnectionDuration:60*60*1e3,skipMiddlewares:true}}),s=async()=>{await n.removeAllSessions(e);};a.on("connection",async c=>{let u=c.id,d=e.child({sessionId:u});d.info({event:"connection",transport:c.conn.transport.name},"Mobile websocket connection initiated"),c.on("disconnect",async f=>{if(e.info({reason:f},"Disconnect received"),f.includes("namespace disconnect")){await wie({socket:c,globalStateManager:n,logger:d,authorization:t.authorization});return}let h=n.getSession(u);h&&(h.softDeleted=true);});let m,p;try{let f=c.handshake.query?.testMetadata,h=yc.parse(JSON.parse(f??"")),g=h.id,b=await i({testId:g});switch(p=await r(b,d),h.platform){case "ANDROID":m=await Cie({...t,orgId:b,socket:c,globalStateManager:n,logger:d,globalOrgSettings:p,testMetadata:h});break;case "IOS":m=await Die({...t,orgId:b,socket:c,globalStateManager:n,logger:d,globalOrgSettings:p,testMetadata:h});break;default:throw new Error("Unsupported platform")}}catch(f){d.error({err:f},"Failed to setup mobile connection"),c.emit("error",{message:f instanceof Error?f.message:JSON.stringify(f)}),c.disconnect(true);return}Oie.forEach(f=>l(f,{...t,socket:c,metadata:m,globalOrgSettings:p,logger:d}));});let l=(c,u)=>{let d=c.createHandler(u),m=(...p)=>{c.event!=="keepalive"&&u.logger.debug({event:c.event},`Websocket event (${c.event})`);let f=h=>{u.logger.error({event:c.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,p);h&&typeof h.catch=="function"&&h.catch(f);}catch(h){f(h);}};u.socket.on(c.event,m);};return {server:a,dispose:s}}async function NGe(t,e){switch(t){case "ANDROID":return {uploadPath:e,cleanup:async()=>{}};case "IOS":{let o=await Bn__default.promises.mkdtemp(Oo__default.join(Tl.tmpdir(),"momentic-mobile-asset-")),n=Oo__default.join(o,"app.zip");return await LGe(e,n),{uploadPath:n,cleanup:()=>Bn__default.promises.rm(o,{recursive:true,force:true})}}}}function LGe(t,e){return new Promise((o,n)=>{let r=IGe("zip",{zlib:{level:9}}),i=Bn__default.createWriteStream(e);i.on("close",()=>o()),i.on("error",n),r.on("error",n),r.on("warning",a=>{a.code!=="ENOENT"&&n(a);}),r.pipe(i),r.directory(t,false,a=>Oo__default.basename(a.name)===".DS_Store"?false:(a.mode=a.stats?.isDirectory()?493:420,a)),r.finalize().catch(n);})}async function kGe(t){let e=_Ge.createHash("md5");await new Promise((n,r)=>{Bn__default.createReadStream(t).on("data",i=>e.update(i)).on("end",()=>n()).on("error",r);});let o=e.digest();return {md5Base64:o.toString("base64"),md5Hex:o.toString("hex")}}async function yM({tag:t,channel:e,filePath:o,apiClient:n,logger:r,platform:i}){r.info({channel:e,tag:t,platform:i,filePath:o},"starting asset upload");let a=Date.now(),{uploadPath:s,cleanup:l}=await NGe(i,o);try{let{md5Base64:c,md5Hex:u}=await kGe(s),{size:d}=await Bn__default.promises.stat(s),m=await n.generateAssetUploadUrl({channel:e,tag:t??"latest",md5:c,platform:i});if(m.md5&&(m.md5===c||m.md5===u))return r.info({channel:e,tag:t,platform:i,filePath:o,size:d,durationMs:Date.now()-a,skipped:!0},"skipped asset upload (md5 match)"),{skipped:!0};if(!m.uploadUrl)throw new O("InternalPlatformError",`No upload URL was given for asset ${o}`);try{let p=await fetch$1(m.uploadUrl,{headers:{"Content-Length":d.toString(),"Content-Type":"application/octet-stream"},method:"PUT",body:Bn__default.createReadStream(s),duplex:"half"});if(p.status!==200)throw new O("InternalPlatformError",`Got error response from emulator platform: ${p.status} ${await p.text()}`);return r.info({channel:e,tag:t,platform:i,filePath:o,size:d,durationMs:Date.now()-a},"finished asset upload"),{skipped:!1}}catch(p){try{await n.deleteAsset(e,t??"latest",i);}catch(f){r.warn({err:f,tag:t,channel:e},"Failed to clean up asset after failed upload");}throw p}}finally{await l();}}async function SM({channel:t,tag:e,platform:o,apiClient:n,logger:r}){let i=e??"latest";r.info({channel:t,tag:i,platform:o},`Deleting asset ${t}:${i} (${o})...`),await n.deleteAsset(t,i,o),r.info({channel:t,tag:i,platform:o},`Asset ${t}:${i} (${o}) deleted successfully!`);}var FGe=z.object({emulatorName:z.string(),platform:z.enum(at)});z.object({runId:z.string(),emulators:z.array(FGe)});var Lie;async function TM(t){await Lie?.registerEmulator(t);}async function EM(t){await Lie?.unregisterEmulator(t);}var _h=new bM;var _B="1.4.5",Mt=yp({app:"mobile-desktop-server",hostname:hostname(),disableConsoleLogs:true}).child({cliVersion:_B});(async()=>{try{let t=await sy(Mt);t.gitBranchName&&Mt.addBinding("branch",t.gitBranchName);}catch{}})();var vM=Router();vM.get("/",Xe(async(t,e)=>{let o=ao();if(!o){e.status(500).json({message:"API client not initialized"});return}let n=await o.getMobileAssets();e.status(200).json(n);}));vM.post("/upload-url",Xe(async(t,e)=>{let o;try{o=Rj.parse(t.body);}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}let n=ao();if(!n){e.status(500).json({error:"API client not initialized"});return}let r=Oo__default.resolve(o.filePath);if(!existsSync(r)){e.status(400).json({error:`File not found: ${r}`});return}let i=/\.apk$/i.test(r),a=r.endsWith(".app")&&statSync(r).isDirectory();if(!i&&!a){e.status(400).json({error:"Unsupported file type. Only .apk files and .app directories are supported."});return}await yM({tag:o.tag,channel:o.channel,filePath:r,apiClient:n,logger:Mt,platform:i?"ANDROID":"IOS"}),e.sendStatus(204);}));vM.delete("/:channel/:tag/:platform",Xe(async(t,e)=>{let o=ao();if(!o){e.status(500).json({error:"API client not initialized"});return}let{channel:n,tag:r,platform:i}=t.params;if(!n||!r||!i){e.status(400).json({error:"Missing channel, tag, or platform."});return}let a=yg.safeParse(i.toUpperCase());if(!a.success){e.status(400).json({error:`Invalid platform "${i}". Expected "android" or "ios".`});return}let s=a.data;await SM({channel:n,tag:r,platform:s,apiClient:o,logger:Mt}),e.sendStatus(204);}));var kie=vM;var Oh=Router();async function CM(t){return (await j4(t,Mt)).map(n=>{let r=t.mobileModules[n.moduleId];if(!r){N.warn(`Found a dangling mobile module with ID ${n.moduleId} that could not be found on disk.`);return}return {...r,content:n}}).filter(n=>n!==void 0)}Oh.get("/",Xe(async(t,e)=>{let o=vt(),n=await _t(o),r=await CM(n);e.status(200).json(r);}));Oh.get("/tests-join",Xe(async(t,e)=>{let o=vt(),n=await _t(o),r=await CM(n),i={};for(let s of r)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 Po(s.fullFilePath,Mt,n)})));for(let{id:s,name:l,relativePath:c,test:u}of a){let d=new Set;ni({steps:u.steps,onPreset:()=>false,onModule:m=>(d.add(m.moduleId),false)});for(let m of d){let p=i[m];p&&p.tests.push({id:s,name:l,relativePath:c});}}e.status(200).json(i);}));Oh.get("/:moduleId",Xe(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let o=await _t(vt()),n=o.mobileModules[t.params.moduleId];if(!n){e.status(404).json({error:"Mobile module not found."});return}try{let r=await Rd(n,o,N);e.json(r);}catch(r){e.status(400).json({err:r});}}));Oh.patch("/:moduleId/metadata",Xe(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let o;try{o=Mj.parse(t.body);}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=vt(),r=await _t(n);V4({moduleId:t.params.moduleId,patch:o,momenticFiles:r,logger:N,project:n}),e.status(201).json({message:"ok"});}));Oh.post("/",Xe(async(t,e)=>{let o;try{o=Ij.parse(t.body);}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{qi(o.name);}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=vt(),r=await _t(n),i=r.mobileModules;if(Object.values(i).find(s=>s.name===o.name)){e.status(400).json({error:`A mobile module with the name "${o.name}" already exists. Please choose a different name.`});return}let a=Oo__default.join(n.rootDir,o.folderPath??Oo__default.dirname(o.testFilePath));if(!Bn__default.existsSync(a)||!Bn__default.statSync(a).isDirectory()){e.status(400).json({error:`The folder configured for mobile module creation does not exist: ${a}`});return}switch(o.platform){case "ANDROID":{let s=await cy({...o,folder:a,project:n,momenticFiles:r});e.status(201).json(s);return}case "IOS":{let s=await cy({...o,folder:a,project:n,momenticFiles:r});e.status(201).json(s);return}}}));var Uie=Oh;var OB=Router();OB.get("/",Xe(async(t,e)=>{let o=vt(),n=await _t(o),r=await CM(n),i=new Set;n?.mobileTests&&Object.values(n.mobileTests).forEach(c=>{c.labels?.forEach(u=>i.add(u));});let a=Array.from(i).sort(),s=Object.values(n.mobileTests),l={labels:a,modules:r,tests:s};e.status(200).json(l);}));OB.get("/folders",Xe(async(t,e)=>{let o=vt(),n=await x4(o);e.status(200).json(n);}));var zie=OB;var wM=Router();wM.get("/",Xe((t,e)=>{let o=bw(vt(),Mt);e.status(200).json(o);}));wM.get("/names",Xe((t,e)=>{let n=vt().config.environments?.map(r=>r.name)??[];e.status(200).json(n);}));wM.post("/",Xe((t,e)=>{let o;try{o=xj.parse(t.body);}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{qi(o.name);}catch(s){e.status(400).json({error:`Invalid environment name: ${s}`});return}let n=vt();if(n.config.environments?.find(s=>s.name===o.name)){e.status(400).json({error:`An environment with the name "${o.name}" already exists. Please choose a different name.`});return}let i={...n.config,environments:[...n.config.environments??[],{name:o.name}]};n.config=i,Ad(i,n.configFilePath);let a=Cd(o.name,n,Mt);e.status(201).json(a);}));var $ie=wM;var Vie=Router();Vie.get("/",Xe((t,e)=>{let o={userId:nm(),orgId:xn(),email:kx(),name:Ane(),pylonEmailHash:Rne(),cliVersion:_B};e.status(200).json(o);}));var jie=Vie;var Hie=Router();Hie.get("/",Xe(async(t,e)=>{let o=t.query.sessionId;if(!o){e.status(400).json({packages:[]});return}let n=_h.getSession(o);if(!n?.controller){e.status(200).json({packages:[]});return}try{let r=n.controller,{installedApps:i}=await r.getInstalledApps();e.status(200).json({packages:i});}catch(r){Mt.error({err:r},"Error fetching installed packages from the session controller"),e.status(200).json({packages:[]});}}));var Wie=Hie;var Gie=Router();Gie.get("/",Xe(async(t,e)=>{let o=await WS(Mt);e.status(200).json(o);}));var qie=Gie;var AM=Router(),Kie=async({platform:t,steps:e,cacheStorage:o,stepId:n,parentStepIdChain:r,testId:i,environment:a})=>{let{result:s,parentChain:l}=_c(e,n,r);if(!s)return;let c=l.filter(u=>u.type==="RESOLVED_MOBILE_MODULE").map(u=>u.id);return await o.getCacheKeyForStep({platform:t,logger:Mt,testId:i,environment:a,parentStepIdChain:c,step:s})};AM.patch("/",Xe(async(t,e)=>{let o=vt(),n=xn(),r=ao(),i=o.config?.advanced?.isolateCachesByEnvironment;if(!r){e.status(500).json({error:"API client not initialized"});return}let a;try{a=Dj.parse(t.body);}catch(u){e.status(400).json({error:`Invalid request body: ${u}`});return}let s=await Lo(Mt,r,o),l=wn({logger:Mt,orgId:n,client:r,gitMetadata:s,regenerateCache:false,noCache:false,alwaysSaveCache:false,isolateCachesByEnvironment:i}),c=await Kie({cacheStorage:l,platform:a.platform,steps:a.steps,stepId:a.stepId,parentStepIdChain:a.parentStepIdChain,testId:a.testId,environment:i?a.environment:void 0});if(!c){e.status(400).json({error:"Cache-supporting step not found"});return}await r.updateMobileStepCaches({platform:a.platform,body:{entries:[{key:c,organizationId:n,value:a.value,testId:a.testId,environment:i?a.environment:void 0}]},headers:td(s)}),e.status(204).send();}));AM.delete("/entry",Xe(async(t,e)=>{let o=vt(),n=xn(),r=ao(),i=o.config?.advanced?.isolateCachesByEnvironment;if(!r){e.status(500).json({error:"API client not initialized"});return}let a;try{a=Lj.parse(t.body);}catch(u){e.status(400).json({error:`Invalid request body: ${u}`});return}let s=await Lo(Mt,r,o),l=wn({logger:Mt,orgId:n,client:r,gitMetadata:s,regenerateCache:false,noCache:false,alwaysSaveCache:false,isolateCachesByEnvironment:i}),c=await Kie({cacheStorage:l,platform:a.platform,steps:a.steps,stepId:a.stepId,parentStepIdChain:a.parentStepIdChain,testId:a.testId,environment:i?a.environment:void 0});if(!c){e.status(400).json({error:"Cache-supporting step not found"});return}await r.deleteMobileStepCacheEntry({platform:a.platform,body:{testId:a.testId,key:c,environment:i?a.environment:void 0},headers:td(s)}),e.status(204).send();}));AM.post("/traces",Xe(async(t,e)=>{let o=ao();if(!o){e.status(500).json({error:"API client not initialized"});return}let n;try{n=kj.parse(t.body);}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let r=await o.getMobileStepCacheMemoryTraces(n.platform,n);e.status(200).json(r);}));var Yie=AM;L_e("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI","POSTHOG_WEB_WRITE_KEY is not set");var{captureEvent:$i,setAnalyticsIdentity:RM,shutdownAnalytics:xM}=pv({writeKey:"phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",host:"https://p.momentic.ai",platform:"local_mobile_app",identity:"stashed",flushImmediately:true});var cm=Router();cm.patch("/:testPath",Xe(async(t,e)=>{let o=t.params.testPath;if(!o){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=wj.parse(t.body);}catch(l){e.status(400).json({error:`Invalid request body: ${l}`});return}if(n.steps===void 0&&n.beforeSteps===void 0&&n.afterSteps===void 0&&n.settings===void 0&&n.labels===void 0){e.status(400).json({error:"At least one of steps, beforeSteps, afterSteps, settings, or labels is required"});return}let r=vt(),i=o.endsWith(".test.yaml")?o:`${o}.test.yaml`,a=await _t(r);await Pl({platform:n.platform,filePath:i,steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps,settings:n.settings,labels:n.labels,folder:r.rootDir,project:r,momenticFiles:a,schemaVersion:Ro});let s={message:"ok"};e.status(200).json(s);}));cm.post("/",Xe(async(t,e)=>{let o;try{o=vj.parse(t.body);}catch(g){e.status(400).json({error:`Invalid request body: ${g}`});return}let{name:n,description:r,settings:i,pathSegments:a,platform:s}=o;if(!n||typeof n!="string"){e.status(400).json({error:"Missing or invalid 'name' in body"});return}try{qi(n);}catch(g){e.status(400).json({error:J(g)});return}let l=vt(),c=await _t(l),u=Oo__default.join(l.rootDir,...a??[]),{fullPath:d,testId:m}=Sw({name:n,description:r,settings:i,folder:u,platform:s,project:l,momenticFiles:c});$i({type:"test_editor:test_create",test_platform:Qi(s)});let p=Oo__default.basename(d),f=Oo__default.relative(l.rootDir,d),h={id:m,fileName:p,fullPath:d,relativeFilePath:f};e.status(201).json(h);}));cm.get("/:fileName",Xe(async(t,e)=>{let o=ao(),n=xn(),r=t.params.fileName;if(!r){e.status(400).json({error:"Missing fileName in path"});return}if(!o){e.status(500).json({error:"API client not initialized"});return}let i=r.endsWith(".test.yaml")?r:`${r}.test.yaml`,a=Oo__default.basename(i).replace(".test.yaml",""),s=vt(),l=Oo__default.isAbsolute(i)?i:Oo__default.join(s.rootDir,i);if(!Bn__default.existsSync(l)){e.status(404).json({error:"Test not found."});return}let c=await _t(s),u=await Po(l,Mt,c),d=_h.getSessionForTest(u.id),m=d?Mt.child({sessionId:d.metadata.sessionId,testId:u.id,testName:d.metadata.testName}):Mt,p=await Lo(m,o,s,{includeHostingUsername:false});await wn({logger:m,orgId:n,client:o,gitMetadata:p,regenerateCache:false,noCache:false,alwaysSaveCache:false,isolateCachesByEnvironment:s.config?.advanced?.isolateCachesByEnvironment}).resolveEntries({logger:m,platform:u.platform,testId:u.id,environment:u.settings?.defaultEnv,stepLists:{steps:u.steps,...u.beforeSteps&&{beforeSteps:u.beforeSteps},...u.afterSteps&&{afterSteps:u.afterSteps}},useSnapshotIdentityCache:s.config.fileFormat==="v2"});let h={...u,name:a,absoluteFilePath:l};e.status(200).json(h);}));cm.patch("/:testPath/metadata",Xe(async(t,e)=>{let o=t.params.testPath;if(!o){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=Aj.parse(t.body);}catch(l){e.status(400).json({error:`Invalid request body: ${l}`});return}let r=vt(),i=o.endsWith(".test.yaml")?o:`${o}.test.yaml`,s={message:"ok",newRelativeTestPath:H4(i,n,r).newRelativeTestPath};e.status(200).json(s);}));cm.delete("/:testPath",Xe((t,e)=>{let o=t.params.testPath;if(!o){e.status(400).json({error:"Missing testPath in path"});return}let n=vt(),r=o.endsWith(".test.yaml")?o:`${o}.test.yaml`,i=Oo__default.join(n.rootDir,r);if(!Bn__default.existsSync(i)){e.status(404).json({error:"Test not found."});return}Bn__default.unlinkSync(i),e.status(200).json({message:"ok"});}));cm.post("/:testPath/duplicate",Xe(async(t,e)=>{let{testPath:o}=t.params;if(!o){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=_j.parse(t.body);}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{qi(n.name);}catch(h){e.status(400).json({error:J(h)});return}let r=vt(),i=Oo__default.join(r.rootDir,o);if(!Bn__default.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await _t(r),s;try{s=await Po(i,Mt,a);}catch(h){e.status(400).json({error:J(h)});return}let l=ef({projectConfig:r.config,momenticFiles:a,entityType:"mobile-test"}),{stepsToSave:c}=await Gn({platform:s.platform,stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:true}),u=Ln({fileType:Pe.MOBILE_TEST,id:l,schemaVersion:Ro,description:s.description,platform:s.platform,settings:s.settings,labels:s.labels,...c});VE.parse(u);let d=Oo__default.dirname(i),m=Oo__default.join(d,`${n.name}.test.yaml`);if(Bn__default.existsSync(m)){e.status(409).send("A test with this name already exists");return}let p=Ob.stringify(u);Bn__default.writeFileSync(m,p,"utf-8");let f={relativeFilePath:Oo__default.relative(r.rootDir,m)};e.status(201).json(f);}));var Xie=cm;var Jie=Router();Jie.get("/:id",Xe(async(t,e)=>{let{id:o}=t.params;if(!o){e.status(400).json({error:"Missing ID"});return}let n=ao();if(!n){e.status(500).json({error:"API client not initialized"});return}try{let{data:r,contentType:i}=await n.fetchOnDemandScreenshot(o);e.setHeader("Content-Type",i),e.status(200).send(r);}catch(r){Mt.error({err:r,screenshotId:o},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"});}}));var Zie=Jie;var Qie=Router();Qie.get("/",Xe((t,e)=>{let o=vt(),n={ai:o.config.ai,displayRoot:o.config.displayRoot};e.status(200).json(n);}));var eae=Qie;var tae=Router();tae.post("/traces",Xe(async(t,e)=>{let o=ao();if(!o){e.status(500).json({error:"API client not initialized"});return}let n;try{n=Fj.parse(t.body);}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let r=await o.getWebStepCacheMemoryTraces(n);e.status(200).json(r);}));var oae=tae;var Nh=class extends df{constructor(o,n){super(o,n);this.client=o;this.orgId=n;}async fetchEnvironment(o,n){let r=vt();return Cd(o,r,N)}};var rqe=promisify$1(execFile$1);async function nae({managedState:t,project:e,testEntity:o,resolvedTest:n,envName:r}){let{logger:i,sessionId:a}=t,s=xne(),l=xn(),c=jS(),u=yne(),d=new Nh(u,l),m=r??n.settings?.defaultEnv,p={};m&&(p=(await d.fetchEnvironment(m,i))?.variables??{});let f={...e.config.emulator,...n.settings?.emulator},h=new zs({baseUrl:c,apiKey:s,logger:i,mode:u.mode,runner:u.runner}),g=new Ol(e.config.ai?.agentConfig,{baseUrl:c,apiKey:s,logger:i,mode:u.mode,runner:u.runner}),b=new Gc({baseUrl:c,apiKey:s,logger:i,mode:u.mode,runner:u.runner},g),y=new qc({httpClient:u,fakerSeed:e.config.advanced?.fakerConstantSeed?ap:void 0}),T=new ta({variablesFromEnvironment:p,envName:m,testName:o.name}),v=new Ds({logger:i,reporter:new Wc(u),runType:"mobile-test-run",runId:a,testMetadata:o,isInteractive:true,runner:u.runner});return {logger:i,sessionId:a,orgId:l,apiClient:u,resolvedEnvName:m,variablesFromEnvironment:p,emulatorSettings:f,mobileGenerator:h,fixtures:{storage:d,browserEnricher:b,browserGenerator:g,localCodeEvalTools:y,testContext:T,visualDiffGoldenStorage:new Vs({baseDir:e.rootDir,updateGoldenFiles:false})},aiSettings:{useMemory:true,...e.config.ai,...n.settings?.ai},usageTracker:v}}function iqe(t){return {steps:t.steps,beforeSteps:t.beforeSteps,afterSteps:t.afterSteps}}async function MM({platform:t,project:e,logger:o,orgId:n,apiClient:r,resolvedTest:i,envName:a}){let s=iqe(i);if(e.config.fileFormat!=="v2")return s;let l=await Lo(o,r,e),{alwaysSaveCache:c,noCache:u}=ol();return await wn({logger:o,orgId:n,client:r,gitMetadata:l,regenerateCache:false,alwaysSaveCache:c,noCache:u,isolateCachesByEnvironment:e.config?.advanced?.isolateCachesByEnvironment}).resolveEntries({logger:o,platform:t,testId:i.id,environment:a,stepLists:s,useSnapshotIdentityCache:true}),s}async function rae({provider:t,platform:e,emulatorName:o,cleanupDriver:n}){let r=t==="remote";return r&&await TM({emulatorName:o,platform:e}),async()=>{await n(),r&&await EM({emulatorName:o,platform:e});}}async function iae({managedState:t,project:e,testEntity:o,resolvedTest:n,provider:r,envName:i,localAvdId:a,localApkPath:s}){let{logger:l,sessionId:c,orgId:u,apiClient:d,resolvedEnvName:m,variablesFromEnvironment:p,emulatorSettings:f,mobileGenerator:h,fixtures:g,aiSettings:b,usageTracker:y}=await nae({managedState:t,project:e,testEntity:o,resolvedTest:n,envName:i}),T=n.settings?.defaultChannel,v=n.settings?.defaultTag,E=await MM({platform:"ANDROID",project:e,logger:l,orgId:u,apiClient:d,resolvedTest:n,envName:m}),P=await aqe({provider:r,projectRoot:e.rootDir,emulatorSettings:f,resolvedTest:n,localAvdId:a,localApkPath:s,variablesFromEnvironment:p});l.info({platform:"ANDROID",provider:r,envName:m,emulatorSettings:f,aiSettings:b},"Starting mobile session with resolved configuration");let M=r==="local"?"local":"region"in P?P.region:void 0,I=await vf({apiClient:d,logger:l,creationOpts:r==="remote"?{...P,apkToInstall:T?{channel:T,tag:v}:void 0}:P,emulatorSettings:f,orgId:u,sessionId:c,callbacks:{onStatusUpdate:_=>{l.info({status:_},"Android session status update");}}}),A=await rae({provider:r,emulatorName:I.emulatorName,platform:"ANDROID",cleanupDriver:async()=>{await I.cleanup();}}),k;try{let _="limbarClient"in I?{limbarClient:I.limbarClient,limbarToken:I.limbarToken,limbarUrl:I.limbarUrl,limbarRegion:I.limbarRegion,playwrightDevice:I.playwrightDevice}:void 0;k=await vu.init({driver:I.driver,generator:h,logger:l,limbarClient:_?.limbarClient,playwrightDevice:_?.playwrightDevice,aiSettings:b,options:{emulator:{...f,region:M,browserSettings:e.config.browser}},fixtures:g,orgId:u,adbPort:I.adbPort,abortController:new AbortController});let H=await k.getViewportBounds(),V=k;return {...t,platform:"ANDROID",provider:r,controller:V,cleanup:[async()=>{await Promise.allSettled([V.cleanup(),A(),g.localCodeEvalTools.dispose()]);}],testName:o.name,relativeTestPath:o.relativePath,testFileAbsolutePath:Oo__default.join(e.rootDir,o.relativePath),envName:m,orgId:u,emulatorName:I.emulatorName,viewportBounds:H,adbPort:I.adbPort,tempCaches:{},limbarUrl:_?.limbarUrl,limbarToken:_?.limbarToken,limbarRegion:_?.limbarRegion,usageTracker:y,mutableStepState:{platform:"ANDROID",testId:n.id,stepLists:E}}}catch(_){let H=k?[k.cleanup(),A()]:[A()];throw await Promise.allSettled(H),_}}async function aae({managedState:t,project:e,testEntity:o,resolvedTest:n,provider:r,envName:i,localDeviceId:a,localIosVersion:s,localAppPath:l}){let{logger:c,sessionId:u,orgId:d,apiClient:m,resolvedEnvName:p,variablesFromEnvironment:f,emulatorSettings:h,mobileGenerator:g,fixtures:b,aiSettings:y,usageTracker:T}=await nae({managedState:t,project:e,testEntity:o,resolvedTest:n,envName:i}),v=n.settings?.defaultChannel,E=n.settings?.defaultTag,P=await MM({platform:"IOS",project:e,logger:c,orgId:d,apiClient:m,resolvedTest:n,envName:p}),M=sqe({provider:r,projectRoot:e.rootDir,emulatorSettings:h,resolvedTest:n,appChannel:v,appTag:E,localDeviceId:a,localIosVersion:s,localAppPath:l,variablesFromEnvironment:f});c.info({platform:"IOS",provider:r,envName:p,emulatorSettings:h,aiSettings:y},"Starting mobile session with resolved configuration");let I=r==="local"?"local":M.type==="remote"?M.region:void 0,A=await fh({apiClient:m,logger:c,creationOpts:M,emulatorSettings:h,orgId:d,sessionId:u,callbacks:{onStatusUpdate:H=>{c.info({status:H},"iOS session status update");}}}),k=await rae({provider:r,emulatorName:A.emulator.name,platform:"IOS",cleanupDriver:async()=>{await A.cleanup();}}),_;try{_=await wu.init({driver:A.driver,generator:g,logger:c,emulator:A.emulator,aiSettings:y,options:{emulator:{...h,region:I,browserSettings:e.config.browser}},fixtures:b,orgId:d,abortController:new AbortController});let H=await _.getViewportBounds(),V=_;return {...t,platform:"IOS",provider:r,controller:V,cleanup:[async()=>{await Promise.allSettled([V.cleanup(),k(),b.localCodeEvalTools.dispose()]);}],testName:o.name,relativeTestPath:o.relativePath,testFileAbsolutePath:Oo__default.join(e.rootDir,o.relativePath),envName:p,orgId:d,emulatorName:A.emulator.name,viewportBounds:H,tempCaches:{},limbarUrl:A.limbarParams?.webRtcUrl,limbarToken:A.limbarParams?.token,limbarRegion:A.limbarParams?.region,usageTracker:T,mutableStepState:{platform:"IOS",testId:n.id,stepLists:P}}}catch(H){let V=_?[_.cleanup(),k()]:[k()];throw await Promise.allSettled(V),H}}async function aqe({provider:t,projectRoot:e,emulatorSettings:o,resolvedTest:n,localAvdId:r,localApkPath:i,variablesFromEnvironment:a}){if(t==="remote")return {region:o?.region==="local"?void 0:o?.region,osVersion:o?.remoteEmulatorSettings?.androidVersion??Jm};let s=await NB(),{avdId:l,apkFilePath:c,apkFilePathSource:u}=rp({overrideAvdId:r,overrideApkFilePath:i,emulatorSettings:o,defaultApkFilePath:n.settings?.defaultApkFilePath,envVariables:a});if(!l){let d=s.availableAvdIds.length>0?` Known Available AVDs on this machine: ${s.availableAvdIds.join(", ")}.`:"",m=s.avdDiscoveryError?` Failed to list local AVDs: ${s.avdDiscoveryError}.`:"";throw new Error(`AVD ID is required when using a local emulator. Set it on the test (Options -> Emulator -> Local AVD ID), set ${nc} on the environment, or pass localDeviceId directly.${d}${m}`)}if(s.availableAvdIds.length>0&&!s.availableAvdIds.includes(l))throw new Error(`AVD '${l}' is not available on this machine. Available AVDs: ${s.availableAvdIds.join(", ")}.`);return {avdId:l,apkFilePath:Cf({apkFilePath:c,source:u,overrideBaseDir:e})}}function sqe({provider:t,projectRoot:e,emulatorSettings:o,resolvedTest:n,appChannel:r,appTag:i,localDeviceId:a,localIosVersion:s,localAppPath:l,variablesFromEnvironment:c}){if(t==="remote")return {type:"remote",region:o?.region==="local"?void 0:o?.region,appToInstall:r?{channel:r,tag:i}:void 0,osVersion:Zm};let{deviceType:u,iosVersion:d,appFilePath:m,appFilePathSource:p}=ip({overrideDeviceType:a,overrideIosVersion:s,overrideAppFilePath:l,emulatorSettings:o,defaultAppFilePath:n.settings?.defaultAppFilePath,envVariables:c});if(!u)throw new Error(`A device type is required when using a local region. Pass localDeviceId, configure a default local iOS device type on the test's settings, or set the ${rc} key on the environment.`);return {type:"local",deviceType:u,iosVersion:d,appFilePath:Ch({appFolderPath:m,source:p,overrideBaseDir:e})}}async function NB(){try{let{stdout:t}=await rqe(lqe(),["-list-avds"],{encoding:"utf8",timeout:5e3});return {availableAvdIds:t.split(/\r?\n/).map(o=>o.trim()).filter(Boolean)}}catch(t){return {availableAvdIds:[],avdDiscoveryError:J(t)}}}function lqe(){let t=process.platform==="win32"?"emulator.exe":"emulator";return process.env.ANDROID_HOME?Oo__default.join(process.env.ANDROID_HOME,"emulator",t):t}var sae=5,LB=class extends px{isStartingSession=false;constructor(){super({sessionTypeLabel:"mobile MCP session"});}async kill(e,o){try{let n;for(let i of e.cleanup)try{await i();}catch(a){n??=a;}if(n)throw n;await e.usageTracker.flush(e.logger);let r=Eoe(e);return await $oe({apiClient:ao(),logger:e.logger,orgId:e.orgId,testId:e.testId,sessionId:e.sessionId,reason:o,report:r}),e.logger.info({sessionId:e.sessionId,reason:o,emulatorName:e.emulatorName},"MCP session cleaned up"),{killed:!0,sessionId:e.sessionId,reason:o,report:r}}catch(n){return e.logger.error({err:n,sessionId:e.sessionId,reason:o},"Failed to clean up mobile MCP session"),{killed:false,sessionId:e.sessionId,reason:o}}}touchSession(e){let o=super.touchSession(e);return o?.provider==="remote"&&ao()?.extendEmulatorTtl(o.platform,o.emulatorName).catch(()=>{}),o}async createSession({logger:e,testId:o,idleTimeoutMs:n,provider:r,envName:i,localDeviceId:a,localIosVersion:s,localAppPath:l,project:c}){let u=this.listSessionIds();if(this.isStartingSession||u.length>0)throw new Error(JSON.stringify({message:"Another mobile MCP session is already active or starting. Please terminate the existing session before creating a new one.",activeSessionIds:u},null,2));this.isStartingSession=true;let d;try{let{entity:m,momenticFiles:p}=await $s(c,{id:o},"mobileTests"),f=await Po(m.fullFilePath,e,p),b=(f.settings?.emulator?.region??c.config.emulator?.region)==="local"?"local":"remote",y=r??b,T,{platform:v}=f,E=e.child({testId:f.id});switch(v){case "ANDROID":d=this.buildManagedSessionState({logger:E,idleTimeoutMs:n,testId:m.id}),T=await iae({managedState:d,project:c,testEntity:m,resolvedTest:f,provider:y,envName:i,localAvdId:a,localApkPath:l});break;case "IOS":d=this.buildManagedSessionState({logger:E,idleTimeoutMs:n,testId:m.id}),T=await aae({managedState:d,project:c,testEntity:m,resolvedTest:f,provider:y,envName:i,localDeviceId:a,localIosVersion:s,localAppPath:l});break;default:return Ct(v)}return E.info({sessionId:T.sessionId,testId:f.id},"Started MCP session for test"),T}catch(m){throw d&&clearTimeout(d.timeoutHandle),m}finally{this.isStartingSession=false;}}},Ir=new LB,Ru=({response:t,sessionId:e,toolName:o})=>{let n=Ir.touchSession(e);if(n)return t.addCleanupCallback(()=>{zoe({session:n,toolCallId:t.toolCallId});}),Uoe({session:n,toolCallId:t.toolCallId,toolName:o}),n;t.addError(JSON.stringify({message:`No active session found for id '${e}'.`,availableSessionIds:Ir.listSessionIds()},null,2));};var uqe=4e4,dqe=1e4,FB,cae=({staticDir:t})=>{FB=t;},PM=class t{url;server;constructor({url:e,server:o}){this.url=e,this.server=o;}static async init({logger:e,testId:o,testName:n,sessionId:r,platform:i,limbarUrl:a,limbarToken:s,limbarRegion:l,tabLabel:c}){let u=await hqe({logger:e,assets:mqe()}),d=new URL(`http://localhost:${u.port}/`);return d.searchParams.set("testId",o),n&&d.searchParams.set("testName",n),d.searchParams.set("sessionId",r),d.searchParams.set("platform",i),d.searchParams.set("url",a),d.searchParams.set("token",s),l&&d.searchParams.set("region",l),c&&d.searchParams.set("tabLabel",c),new t({url:d.toString(),server:u})}async shutdown(){this.server?.server.listening&&(await new Promise(e=>{this.server?.server.close(()=>{e();});}),this.server=void 0);}};function mqe(){if(!FB)throw new Error("Remote control viewer static directory is not configured. Pass remoteControlStaticDir when starting the mobile MCP server.");let t=Oo__default.resolve(FB),e=Oo__default.join(t,"index.html");if(!Bn__default.existsSync(e))throw new Error(`Remote control viewer index file not found at '${e}'. Ensure mobile-remote-control-frontend is built and copied into npm/mobile-cli/remote-control-static.`);return {staticDir:t,indexHtmlBuffer:Bn__default.readFileSync(e)}}function kB({response:t,statusCode:e,body:o,allow:n}){let r={"Content-Type":"text/plain; charset=utf-8","Cache-Control":"no-store"};n&&(r.Allow=n),t.writeHead(e,r),t.end(o);}function lae({request:t,response:e,buffer:o,contentType:n}){if(e.writeHead(200,{"Content-Type":n,"Cache-Control":"no-store"}),t.method==="HEAD"){e.end();return}e.end(o);}function pqe({staticDir:t,pathname:e}){let o;try{o=decodeURIComponent(e);}catch{return}let n=o==="/"?"index.html":o.replace(/^\/+/,""),r=Oo__default.resolve(t,n),i=Oo__default.relative(t,r);if(!(i.startsWith("..")||Oo__default.isAbsolute(i)))return r}function fqe({request:t,response:e,assets:o}){if(t.method!=="GET"&&t.method!=="HEAD"){kB({response:e,statusCode:405,body:"Method Not Allowed",allow:"GET, HEAD"});return}let n=new URL(t.url??"/","http://localhost").pathname;if(n==="/"||n==="/index.html"){lae({request:t,response:e,buffer:o.indexHtmlBuffer,contentType:"text/html; charset=utf-8"});return}let r=pqe({staticDir:o.staticDir,pathname:n});if(!r){kB({response:e,statusCode:403,body:"Forbidden"});return}if(!Bn__default.existsSync(r)||!Bn__default.statSync(r).isFile()){kB({response:e,statusCode:404,body:"Not Found"});return}let i=Oo__default.extname(r).toLowerCase(),a=Zu[i]??"application/octet-stream";lae({request:t,response:e,buffer:Bn__default.readFileSync(r),contentType:a});}async function hqe({logger:t,assets:e}){let o=createServer((i,a)=>fqe({request:i,response:a,assets:e})),n=Math.floor(Math.random()*dqe)+uqe,r=await Ic(n,"mobile-mcp-remote-control-viewer");return await new Promise((i,a)=>{let s=l=>{a(l);};o.once("error",s),o.listen(r,()=>{o.off("error",s),i();});}),t.info({port:r,staticDir:e.staticDir},"Started mobile MCP remote control viewer server"),{port:r,server:o}}function BB({logger:t,applicationName:e,cliVersion:o,serverId:n=randomUUID()}){let r={serverId:n,applicationName:e,cliVersion:o},i=xn(),a=t.child({orgId:i,userId:nm(),...r});return {info:r,mcpLogger:a,orgId:i}}function UB({sessionIdleTimeoutMinutes:t}){return (t&&t>=1?t:sae)*60*1e3}async function IM({project:t,serverUrl:e,alwaysSaveCache:o,noCache:n,remoteControlStaticDir:r}){cae({staticDir:r}),mh(e),Lx({alwaysSaveCache:o,noCache:n}),RM({userId:nm(),orgId:xn(),selfServe:Fx()}),Bx(t,i=>Ni({configFilePath:i}));}function _M({project:t,logger:e,apiKey:o,serverUrl:n,supportsFileOutput:r,headfulDefault:i,sessionIdleTimeoutMinutes:a,applicationName:s,cliVersion:l,serverId:c,apiClient:u}){let{info:d,mcpLogger:m,orgId:p}=BB({logger:e,applicationName:s,cliVersion:l,serverId:c}),f=new zs({baseUrl:n,apiKey:o,logger:m,mode:"interactive",runner:"mcp"});return {context:{project:t,orgId:p,logger:m,apiClient:u,generator:f,serverId:d.serverId,saveChangesToDisk:true,sessionIdleTimeoutMs:UB({sessionIdleTimeoutMinutes:a}),supportsFileOutput:r,headfulDefault:i},info:d}}async function Sqe({moduleId:t,name:e,description:o,enabled:n,platform:r,parameters:i,steps:a,project:s}){let l=await _t(s),{stepsToSave:{steps:c}}=await Gn({platform:r,stepLists:{steps:a}});ks({content:{platform:r,moduleId:t,name:e,description:o,enabled:n,parameters:i,steps:c},schemaVersion:Ro,momenticFiles:l,project:s});}function Tqe({module:t,inputs:e}){return {...t,id:randomUUID(),type:"RESOLVED_MOBILE_MODULE",inputs:e}}async function uae({project:t,logger:e,testPath:o,saveChangesToDisk:n,mutableStepState:r,params:i,initialMomenticFiles:a,platform:s,availableSteps:l,cacheContext:c}){let{stepsToExtract:u,startIndex:d,endIndex:m}=Hoe({moduleName:i.name,existingModuleNames:Object.values(a.mobileModules).map(h=>h.name),parameterNames:i.parameters?.parameterNames,defaultParameters:i.parameters?.defaultParameters,parameterEnums:i.parameters?.parameterEnums,moduleInputs:i.moduleInputs,testPath:o,startIndex:i.startIndex,endIndex:i.endIndex,availableSteps:l,containsNestedModuleStep:AK}),p=Oo__default.join(t.rootDir,i.folderPath??"");i.folderPath&&Bn__default.mkdirSync(p,{recursive:true});let f=await cy({name:i.name,platform:s,description:i.description??"",enabled:i.enabled??true,steps:u,folder:p,project:t,momenticFiles:a});if(i.parameters!==void 0&&(await Sqe({moduleId:f.moduleId,name:i.name,description:i.description??"",enabled:i.enabled??true,platform:s,parameters:i.parameters,steps:u,project:t}),f={...f,name:i.name,description:i.description??"",parameters:i.parameters}),n&&i.startIndex!==void 0&&o!==void 0){let h=await _t(t);if(!l)throw new Error("Mobile module was created successfully, but the source test steps were not available for replacement.");let g=Tqe({module:f,inputs:i.moduleInputs}),b=[...l];if(b.splice(d,m-d,g),await Pl({platform:s,filePath:o,steps:b,folder:t.rootDir,project:t,momenticFiles:h,schemaVersion:Ro}),r&&(r.stepLists={...r.stepLists,steps:b}),c){let{cachesToSave:y,snapshotCachesToSave:T}=await Gn({platform:s,stepLists:{steps:b},cacheCreationParams:{orgId:c.orgId,testId:c.testId,environment:c.envName},useSnapshotIdentityCache:c.useSnapshotIdentityCache});try{await c.cacheStorage.saveEntries({platform:s,logger:e,entries:y});}catch(v){e.warn({err:v},"Failed to save mobile step caches after module create, future runs may be slower");}if(c.useSnapshotIdentityCache)try{await c.cacheStorage.saveSnapshotCacheEntries({platform:s,logger:e,entries:T});}catch(v){e.warn({err:v},"Failed to save mobile snapshot identity cache after module create, future runs may regenerate step ids");}}}return f}function dae(t,e,o){if(!t)return {availableSteps:void 0,mutableStepState:void 0};if(t.platform!==e)throw new Error(`Internal error: test platform ${t.platform} does not match resolved platform ${e}`);return o&&o.testId===t.id&&o.platform===e?{availableSteps:o.stepLists.steps,mutableStepState:o}:{availableSteps:t.steps,mutableStepState:void 0}}async function pae({project:t,logger:e,testPath:o,saveChangesToDisk:n,mutableStepState:r,params:i}){qi(i.name);let a=await _t(t),s=o!==void 0?await Po(Oo__default.join(t.rootDir,o),e,a):void 0,l=s?.platform??i.platform??"ANDROID";if(i.platform&&l!==i.platform)throw new Error(`Error: Requested module platform ${i.platform} does not match source test platform ${s?.platform}.`);let c;if(s!==void 0){let d=ao();if(d){let m=await Lo(e,d,t),{alwaysSaveCache:p,noCache:f}=ol();c={cacheStorage:wn({logger:e,orgId:xn(),client:d,gitMetadata:m,regenerateCache:false,alwaysSaveCache:p,noCache:f,isolateCachesByEnvironment:t.config?.advanced?.isolateCachesByEnvironment}),testId:s.id,orgId:xn(),envName:s.settings?.defaultEnv,useSnapshotIdentityCache:t.config.fileFormat==="v2"};}}let u={project:t,logger:e,testPath:o,saveChangesToDisk:n,params:i,initialMomenticFiles:a,cacheContext:c};switch(l){case "ANDROID":return {module:await uae({...u,platform:"ANDROID",...dae(s,"ANDROID",r)})};case "IOS":return {module:await uae({...u,platform:"IOS",...dae(s,"IOS",r)})};default:return Ct(l)}}var fae=ir({schema:{name:HT,description:"Get a single fully loaded mobile module by id, exact name, or file path. This returns complete module details including parameters, description, and the full step list. Exactly one selector must be provided.",inputSchema:z.object({selector:Yz})},handle:async(t,e,o)=>{let{project:n,logger:r}=t;try{let i=await $s(n,e.selector,"mobileModules"),a=await Rd(i.entity,i.momenticFiles,r);o.addPartFromText(JSON.stringify({module:a},null,2));}catch(i){o.addError(J(i));}}}),hae=ir({schema:{name:Gz,description:"Create a mobile module. If startIndex is provided, testPath is required and the specified mobile test range is extracted into a module for that test's platform, then replaced with a module invocation in that test. For empty modules, platform defaults to Android unless platform or testPath identifies iOS.",inputSchema:h_},handle:async(t,e,o)=>{try{let n=h_.parse(e),{testPath:r,...i}=n,a=t7({projectRoot:t.project.rootDir,filePath:r,pathLabel:"testPath"}),s;if(a!==void 0){let c=Oo__default.join(t.project.rootDir,a);for(let u of Ir.listSessionIds()){let d=Ir.getSession(u);if(d!==void 0&&d.testFileAbsolutePath===c){s=d.mutableStepState;break}}}let l=await pae({project:t.project,logger:t.logger,testPath:a,saveChangesToDisk:t.saveChangesToDisk,mutableStepState:s,params:i});o.addPartFromText(JSON.stringify(l.module,null,2));}catch(n){o.addError(J(n));}}});function OM({step:t,parentChain:e}){let o=t;o.parentStepIdChain=e.map(n=>n.id),delete o.retries,delete o.skipped;}function Aqe(t){let e=cloneDeep(t);return ni({steps:e,earlyStop:false,onPreset:(o,n)=>{if(OM({step:o,parentChain:n.parentChain}),o.type==="MOBILE_PRESET_STEP"){let r=o.command;delete r.cache,delete r.id,delete r.thoughts;}return false},onModule:(o,n)=>{OM({step:o,parentChain:n.parentChain});let r=o;return delete r.enabled,delete r.schemaVersion,false},onConditional:(o,n)=>(OM({step:o,parentChain:n.parentChain}),false),onAiAction:(o,n)=>{OM({step:o,parentChain:n.parentChain});let r=o;return delete r.cache,false}}),e.map((o,n)=>{let r=o;return r.index=n,r})}function zB(t,e){if(t.length===0)return `${e}: (no steps)`;let o=["```json",JSON.stringify(Aqe(t),null,2),"```"].join(`
6273
+ `;function Eie(t){return fM(t,yie,Tie())}var ql={initializeAIActionConfig:Eie,stepSchema:Tn,resultSchema:Qr};var fGe=5e3,xB=2;async function Cie({socket:t,logger:e,orgId:o,testMetadata:n,globalOrgSettings:r,androidDriverFactory:i,mobileGeneratorFactory:a,browserGeneratorFactory:s,browserEnricherFactory:l,storageFactory:c,visualDiffGoldenStorageFactory:u,cacheStorageFactory:d,localToolsFactory:m,onRemoteEmulatorCreated:p,onRemoteEmulatorDeleted:f,billingReporterFactory:h,globalStateManager:g,getGitMetadata:b,region:y,localApkPath:T,localAvdId:v}){let E=t.id,P=t.handshake.query?.fileName,M=P?Oo__default.basename(P,".test.yaml"):"",I=n.id;e=e.child({sessionId:E,testId:I,orgId:o});let A=await b(e);e=e.child({branch:A.gitBranchName});let k=await c(o),_=n.settings?.defaultEnv,H={};_&&(H=(await k.fetchEnvironment(_,e))?.variables??{});let V={...r.emulator,...n.settings?.emulator},j={...r.ai,useMemory:r.ai?.useMemory!==false,...n.settings?.ai},le=g.getSession(E);if(le){if(e.info("Reconnecting to existing Android session"),le.local)return t.emit("session",le.metadata),le.softDeleted=false,le.metadata;throw new Error("Restoring existing remote emulator sessions is not supported. Please reconnect to a new emulator.")}let Y=await d(o,A,e),L=bc.optional().parse(y??V.region),U=L==="local",x,X,B;if(U){if(await g.clearSoftDeletedLocalSessions(e),g.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");let{avdId:$n,apkFilePath:Or,apkFilePathSource:os}=rp({overrideAvdId:v,overrideApkFilePath:T,emulatorSettings:V,defaultApkFilePath:n.settings?.defaultApkFilePath,envVariables:H}),Zl=Cf({apkFilePath:Or,source:os});if(!$n)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 ${nc} key on the environment.`);B={avdId:$n,apkFilePath:Zl};}else x=n.settings?.defaultChannel,X=n.settings?.defaultTag,B={region:L===xi?void 0:L,apkToInstall:x?{channel:x,tag:X}:void 0,osVersion:V.remoteEmulatorSettings?.androidVersion??Jm};e.info({platform:"ANDROID",isLocalRegion:U,resolvedRegion:L,envName:_,emulatorSettings:V,aiSettings:j},"Starting mobile session with resolved configuration");let z=Date.now(),q,Q;for(let $n=1;$n<=xB;$n++)try{q=await i({socket:t,logger:e,creationOpts:B,emulatorSettings:V});break}catch(Or){if(Q=Or,$n===xB)break;e.warn({err:Or,attempt:$n,maxAttempts:xB},"Mobile session bootstrap failed; retrying bootstrap");}if(!q)throw Q||new Error("Mobile session bootstrap failed without an error");let{driver:Me,cleanup:rt,emulatorName:it,adbPort:kt}=q,ne,K,Re,Vt,lt,we;"limbarClient"in q&&(ne=q.limbarClient,K=q.limbarToken,Re=q.limbarUrl,Vt=q.limbarRegion,lt=q.limbarOsVersion,we=q.playwrightDevice);let bt=Oo__default.join(tmpdir(),`logcat-logs-${o}-${I}-${E}.txt`);U||await p?.({emulatorName:it,platform:"ANDROID"}),e.info({adbPort:kt,apkChannel:x,apkTag:X,duration:Date.now()-z,emulatorName:it},"Android emulator session initiated"),e=e.child({emulator:it});let ho=false,an=false,Ko,go,Mn,Zn,ts=async()=>{if(ho)return;ho=true,an=true,clearInterval(Mn),Mn=void 0;let Or=[async()=>{await go?.cleanup();},async()=>{await Ko?.();},async()=>{await rt(),U||await f?.({emulatorName:it,platform:"ANDROID"});},async()=>{await Zn?.dispose();}].map(os=>os().catch(Zl=>{e.warn({err:Zl},"Failed to clean up socket server resource");}));await re(Promise.allSettled(Or),{milliseconds:fGe,fallback:()=>{}});};g.registerPendingSession(E,{platform:"ANDROID",cleanup:ts,emulatorName:it,local:U});let Mu=async()=>{Ko=await Me.executeInNativeContext(e,mT=>pA({driver:mT,onLogs:ile=>{t.emit("logcatLogs",ile);},logFilePath:bt}),{operationName:"startLogcatListener"});let $n=await a(o,e),Or=await s(o,e),os=await l(o,e);Zn=m?await m(o):void 0;let Zl=new Ds({logger:e,reporter:await h(o),runType:"mobile-test-run",runId:E,testMetadata:{id:n.id,name:M},isInteractive:true,runner:"editor"}),R=new ta({variablesFromEnvironment:H,envName:_,testName:M});if(go=await vu.init({driver:Me,generator:$n,logger:e,limbarClient:ne,playwrightDevice:we,aiSettings:j,options:{emulator:{...V,browserSettings:r.browser}},fixtures:{storage:k,browserEnricher:os,browserGenerator:Or,localCodeEvalTools:Zn,testContext:R,visualDiffGoldenStorage:u()},orgId:o,adbPort:kt,abortController:new AbortController}),!go)throw new Error("Failed to initialize Android controller");let me=go;if(an||!t.connected)throw new Error("Socket not connected anymore, not proceeding with Android session setup");let co=await me.getViewportBounds();if(an||!t.connected)throw new Error("Socket not connected anymore, not proceeding with Android session setup");Mn=hGe({socket:t,testContext:R});let zo={sessionId:E,testId:I,orgId:o,emulatorName:it,testName:M,limbarUrl:Re,limbarToken:K,limbarRegion:Vt,limbarOsVersion:lt,viewportBounds:co,envName:_};return g.registerSession(E,{platform:"ANDROID",controller:me,cacheStorage:Y,cleanup:ts,emulatorName:it,local:U,metadata:zo,logFilePath:bt,helpers:Gl,usageTracker:Zl}),t.emit("session",zo),zo};try{return await Mu()}catch($n){throw await g.removeSession(E,e),$n}}function hGe({socket:t,testContext:e}){return setInterval(()=>{let o=e.toEditorDisplayCopy();t.emit("emulatorState",{context:o});},3e3)}async function wie({socket:t,logger:e,globalStateManager:o,authorization:n}){let r=t.id,i=o.getSession(r);i&&i.platform==="ANDROID"&&n&&i.logFilePath&&gGe({testId:i.metadata.testId,sessionId:r,logFilePath:i.logFilePath,authorization:n,logger:e}),await o.removeSession(r,e);}async function gGe({testId:t,sessionId:e,logFilePath:o,authorization:n,logger:r}){try{let i;try{i=await hM.stat(o);}catch{r.debug({logFilePath:o},"No logcat file found to upload");return}if(i.size===0){r.debug({logFilePath:o},"Logcat file is empty, skipping upload"),await hM.unlink(o);return}let a=new on({...n,mode:"interactive",runner:"editor"}),{uploadUrl:s}=await a.generateMobileLogcatUploadUrl({testId:t,sessionId:e}),l=await hM.readFile(o),c=await fetch(s,{headers:{"Content-Length":l.length.toString(),"Content-Type":"text/plain"},method:"PUT",body:l});if(c.status!==200)throw new Error(`Failed to upload logcat: ${c.status} ${await c.text()}`);r.info({testId:t,sessionId:e,objectUrl:DC(s)},"Logcat file uploaded successfully");}catch(i){r.warn({err:i,testId:t,sessionId:e},"Failed to upload logcat file");}finally{try{await hM.unlink(o);}catch(i){r.warn({err:i,logFilePath:o},"Failed to delete temp logcat file");}}}var bGe=({socket:t,globalStateManager:e})=>async()=>{let o=e.getSession(t.id);if(!o)throw new Error("No active Mobile session found");o.controller.abort();},Aie={event:"cancel",createHandler:bGe};var yGe=({logger:t,globalStateManager:e,socket:o})=>async(n,r)=>{let i=e.getSession(o.id);if(!i){r({err:"No active Mobile session found"});return}let a=i.controller;a.resetAbortController();let s=Date.now();try{let l=await a.getEmulatorDomState();t.info({durationMs:Date.now()-s},"Fetched screen XML"),r({screenXml:l});}catch(l){t.error({err:l},"Error fetching screen XML from the session controller"),r({err:l.message});}},Rie={event:"fetchScreenXml",createHandler:yGe};var MB=class{parentTracer;socket;step;orgId;interactionTracer;platform;constructor({step:e,socket:o,parentTracer:n,orgId:r,platform:i}){this.socket=o,this.parentTracer=n,this.step=e,this.orgId=r,this.platform=i,this.interactionTracer=new ha,Ar.initializeRootTracerContext(this.interactionTracer);}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeXmlSnapshot(){}attachAfterXmlSnapshot(){}recordStepDuration(e){let{durationMs:o,step:n}=e;if(!dv(n))return;let r=uv(n);Qe.distribution("test_mobile_step_duration",o,[`type:${r}`,`platform:${this.platform.toLowerCase()}`,"executor:editor",`orgId:${this.orgId}`]);}async finish(e){this.interactionTracer.finish();let o=this.interactionTracer.getRootSpan(),n={result:e.result,parentStepIdChain:e.parentStepIdChain,trace:s_.parse(o)};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:o}}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}async startSubSteps(){return new Mh({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId,platform:this.platform})}},Mh=class{parentTracer;parentStep;socket;orgId;platform;constructor({parentStep:e,socket:o,parentTracer:n,orgId:r,platform:i}){this.parentTracer=n,this.parentStep=e,this.socket=o,this.orgId=r,this.platform=i;}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 MB({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId,platform:this.platform})}async getScreenshot(e){}},gM=class{constructor(e,o,n){this.socket=e;this.orgId=o;this.platform=n;}appendLogs(){}setActiveVideo(){}async finish(){this.socket.emit("finished");}async startBeforeStepList(){return new Mh({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId,platform:this.platform})}async startMainStepList(){return new Mh({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId,platform:this.platform})}async startAfterStepList(){return new Mh({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId,platform:this.platform})}};var SGe=({metadata:t,logger:e,globalStateManager:o,socket:n,useSnapshotIdentityCache:r,storageFactory:i})=>async(a,s)=>{let l=o.getSession(n.id);if(!l)throw new Error("No active Mobile session found");let c=await i(t.orgId),u=e.child({testId:a.testMetadata.id});u.info({sessionId:t.sessionId,platform:l.platform,testName:t.testName,stepCount:a.steps.length,beforeStepCount:a.beforeSteps?.length??0,afterStepCount:a.afterSteps?.length??0,fromStep:a.fromStep,toStep:a.toStep,typeCommands:EGe(a.steps)},"Received mobile socket execute request"),l.controller.resetAbortController();let d=l.usageTracker,m;try{m=await TGe({session:l,params:a,metadata:t,testLogger:u,usageTracker:d,socket:n,useSnapshotIdentityCache:r,storage:c});}catch(f){if(l.controller.isAborted()||f instanceof DOMException&&f.name==="AbortError"){u.info("Mobile test execution cancelled by user");return}throw f}finally{await d.flush(u);}let p={results:l.helpers.resultSchema.array().parse(m.results),status:m.status};s?.(p);};async function TGe({session:t,...e}){switch(t.platform){case "ANDROID":return xie({session:t,...e});case "IOS":return xie({session:t,...e});default:return (n=>{throw new Error(`Unsupported platform: ${n}`)})(t)}}async function xie({session:t,params:e,metadata:o,testLogger:n,usageTracker:r,socket:i,useSnapshotIdentityCache:a,storage:s}){let l=new gM(i,o.orgId,t.platform);try{return await xh({platform:t.platform,work:{fastForwardingToStep:!!e.fromStep,state:{failureRecoveryDisabled:!0,failureRecoveryAttempts:0}},fixtures:{controller:t.controller,logger:n,cacheStorage:t.cacheStorage,usageTracker:r,storage:s},containerName:"entire test",inputs:{steps:t.helpers.stepSchema.array().parse(e.steps),beforeSteps:e.beforeSteps?t.helpers.stepSchema.array().parse(e.beforeSteps):void 0,afterSteps:e.afterSteps?t.helpers.stepSchema.array().parse(e.afterSteps):void 0,fromStep:e.fromStep,toStep:e.toStep,orgId:o.orgId,testName:o.testName,testMetadata:e.testMetadata,interactive:!0,useSnapshotIdentityCache:a,updateGoldenFiles:e.updateGoldenFiles},envName:o.envName,tracer:l,callbacks:{step:{onAiActionEvent:c=>{i.emit("aiActionEvent",c);}}},helpers:t.helpers})}finally{await l.finish();}}var Mie={event:"execute",createHandler:SGe};function EGe(t){return t.flatMap((e,o)=>!("command"in e)||e.command.type!=="TYPE"?[]:[{index:o,stepId:e.id,target:e.command.target?.type==="description"?e.command.target.description:e.command.target?.type,textLength:e.command.text.length,clearContent:e.command.clearContent,forceClearContent:e.command.forceClearContent,replaceStrategy:e.command.replaceStrategy,hasCache:e.command.cache!==void 0}])}var CGe=({socket:t,globalStateManager:e,keepSessionAlive:o})=>{let n=debounce(o,3e4,{maxWait:6e4});return async()=>{let r=e.getSession(t.id);if(!r)throw new Error("No active Mobile session found");r.emulatorName&&(r.local||n(r.platform,r.emulatorName));}},Pie={event:"keepalive",createHandler:CGe};var wGe=({logger:t,globalStateManager:e,socket:o})=>async({description:n},r)=>{let i=n.trim();if(!i){r({err:"Element description is required"});return}let a=e.getSession(o.id);if(!a){r({err:"No active Mobile session found"});return}let s=a.controller;s.resetAbortController();let l=Date.now();try{let c=await s.locateElement({description:i});t.info({durationMs:Date.now()-l},"Located element"),r({result:c});}catch(c){t.error({err:c},"Error locating element from mobile editor"),r({err:J(c)});}},Iie={event:"locateElement",createHandler:wGe};var AGe=({socket:t,globalStateManager:e,logger:o})=>async(n,r)=>{let i=e.getSession(t.id);if(!i){let s="No active session found";o.error(s),r?.({success:false,err:s});return}let a=i.controller;a.abort(),a.resetAbortController(),o.info({platform:i.platform},"Resetting emulator state");try{await a.softReset(),o.info({platform:i.platform},"Emulator reset completed"),r?.({success:!0,message:"Emulator reset successfully"});}catch(s){let l=J(s);o.error({err:s,platform:i.platform},"Failed to reset emulator"),r?.({success:false,err:`Failed to reset emulator: ${l}`});}},_ie={event:"reset",createHandler:AGe};var Oie=[Mie,Aie,_ie,Pie,Iie,Rie];var xGe=5e3,PB=2;async function Die({socket:t,logger:e,orgId:o,testMetadata:n,globalOrgSettings:r,localIosDeviceType:i,localIosVersion:a,iosDriverFactory:s,mobileGeneratorFactory:l,browserGeneratorFactory:c,browserEnricherFactory:u,billingReporterFactory:d,storageFactory:m,visualDiffGoldenStorageFactory:p,cacheStorageFactory:f,localToolsFactory:h,onRemoteEmulatorCreated:g,onRemoteEmulatorDeleted:b,globalStateManager:y,getGitMetadata:T,region:v,localAppPath:E}){let P=t.id,M=t.handshake.query?.fileName,I=M?Oo__default.basename(M,".test.yaml"):"",A=n.id,k=n.settings?.defaultChannel,_=n.settings?.defaultTag;e=e.child({sessionId:P,testId:A,orgId:o});let H=await T(e);e=e.child({branch:H.gitBranchName});let V=await m(o),j=n.settings?.defaultEnv,le={};j&&(le=(await V.fetchEnvironment(j,e))?.variables??{});let Y={...r.emulator,...n.settings?.emulator},L={...r.ai,useMemory:r.ai?.useMemory!==false,...n.settings?.ai},U=y.getSession(P);if(U){if(e.info("Reconnecting to existing iOS session"),U.local)return t.emit("session",U.metadata),U.softDeleted=false,U.metadata;throw new Error("Restoring existing remote emulator sessions is not supported. Please reconnect to a new emulator.")}let x=await f(o,H,e),X=bc.optional().parse(v??Y.region),B=X==="local",z;if(B){if(await y.clearSoftDeletedLocalSessions(e),y.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");let{deviceType:Ko,iosVersion:go,appFilePath:Mn,appFilePathSource:Zn}=ip({overrideDeviceType:i,overrideIosVersion:a,overrideAppFilePath:E,emulatorSettings:Y,defaultAppFilePath:n.settings?.defaultAppFilePath,envVariables:le});if(!Ko)throw new Error(`A device type is required when using a local region. Provide --local-ios-device-type, configure a default local iOS device type on the test's settings, or set the ${rc} key on the environment.`);let ts=Ch({appFolderPath:Mn,source:Zn});z={type:"local",deviceType:Ko,iosVersion:go,appFilePath:ts};}else z={type:"remote",region:X===xi?void 0:X,appToInstall:k?{channel:k,tag:_}:void 0,osVersion:Zm};e.info({platform:"IOS",isLocalRegion:B,resolvedRegion:X,envName:j,emulatorSettings:Y,aiSettings:L},"Starting mobile session with resolved configuration");let q=Date.now(),Q,Me;for(let Ko=1;Ko<=PB;Ko++)try{Q=await s({socket:t,logger:e,creationOpts:z,emulatorSettings:Y});break}catch(go){if(Me=go,Ko===PB)break;e.warn({err:go,attempt:Ko,maxAttempts:PB},"Mobile session bootstrap failed; retrying bootstrap");}if(!Q)throw Me||new Error("Mobile session bootstrap failed without an error");let{driver:rt,cleanup:it,emulator:kt,limbarParams:ne}=Q;e=e.child({emulator:kt.name}),e.info({duration:Date.now()-q},"iOS emulator session initiated"),B||await g?.({emulatorName:kt.name,platform:"IOS"});let K=false,Re=false,Vt,lt,we,bt,ho=async()=>{if(K)return;K=true,Re=true,we&&(clearInterval(we),we=void 0);let go=[async()=>{await lt?.cleanup();},async()=>{Vt?.();},async()=>{await it(),B||await b?.({emulatorName:kt.name,platform:"IOS"});},async()=>{await bt?.dispose();}].map(Mn=>Mn().catch(Zn=>{e.warn({err:Zn},"Failed to clean up socket server resource");}));await re(Promise.allSettled(go),{milliseconds:xGe,fallback:()=>{}});};y.registerPendingSession(P,{platform:"IOS",cleanup:ho,emulatorName:kt.name,local:B});let an=async()=>{Vt=await Wx({emulator:kt,onLogs:os=>{t.emit("syslogLogs",os);}});let Ko=await l(o,e),go=await c(o,e),Mn=await u(o,e);bt=h?await h(o):void 0;let Zn=new Ds({logger:e,reporter:await d(o),runType:"mobile-test-run",runId:P,runner:"editor",testMetadata:{id:n.id,name:I},isInteractive:true}),ts=new ta({variablesFromEnvironment:le,envName:j,testName:I});if(lt=await wu.init({driver:rt,generator:Ko,logger:e,emulator:kt,aiSettings:L,options:{emulator:{...Y,browserSettings:r.browser}},fixtures:{storage:V,browserEnricher:Mn,browserGenerator:go,localCodeEvalTools:bt,testContext:ts,visualDiffGoldenStorage:p()},orgId:o,abortController:new AbortController}),!lt)throw new Error("Failed to initialize iOS controller");let Mu=lt;if(Re||!t.connected)throw new Error("Socket not connected anymore, not proceeding with iOS session setup");let $n=await Mu.getViewportBounds();if(Re||!t.connected)throw new Error("Socket not connected anymore, not proceeding with iOS session setup");we=MGe({socket:t,testContext:ts});let Or={sessionId:P,testId:A,orgId:o,emulatorName:kt.name,testName:I,limbarUrl:ne?.webRtcUrl,limbarToken:ne?.token,limbarRegion:ne?.region,limbarOsVersion:ne?.osVersion,viewportBounds:$n,envName:j};return y.registerSession(P,{platform:"IOS",controller:Mu,cacheStorage:x,cleanup:ho,emulatorName:kt.name,local:B,metadata:Or,helpers:ql,usageTracker:Zn}),t.emit("session",Or),Or};try{return await an()}catch(Ko){throw await y.removeSession(P,e),Ko}}function MGe({socket:t,testContext:e}){return setInterval(()=>{let o=e.toEditorDisplayCopy();t.emit("emulatorState",{context:o});},3e3)}var bM=class{sessions=new Map;pendingSessions=new Map;registerPendingSession(e,o){this.pendingSessions.set(e,o);}registerSession(e,o){this.pendingSessions.delete(e),this.sessions.set(e,o);}getSession(e){return this.sessions.get(e)}getSessionForTest(e){for(let o of this.sessions.values())if(o.metadata.testId===e)return o}async clearSoftDeletedLocalSessions(e){for(let o of this.sessions.values())o.softDeleted===true&&o.local===true&&await this.removeSession(o.metadata.sessionId,e);}hasActiveLocalSession(){for(let e of [...this.sessions.values(),...this.pendingSessions.values()])if(e.local===true)return true;return false}async removeSession(e,o){let n=this.sessions.get(e)??this.pendingSessions.get(e);if(!n)return;let r=o.child({sessionId:e,emulatorName:n.emulatorName,platform:n.platform});try{await this.sessions.get(e)?.usageTracker.flush(r);}catch(i){r.error({err:i},"Error flushing usage tracker before cleanup");}try{await n.cleanup?.(),r.info("Emulator cleaned up by removeSession");}catch(i){r.error({err:i},"Error during emulator cleanup");}finally{this.sessions.delete(e),this.pendingSessions.delete(e);}}async removeAllSessions(e){let o=Array.from(new Set([...this.sessions.keys(),...this.pendingSessions.keys()]));await Promise.all(o.map(n=>this.removeSession(n,e)));}};function Nie(t){let{logger:e,baseServer:o,globalStateManager:n,settingsFactory:r,getOrgId:i}=t,a=new Server(o,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:true,connectionStateRecovery:{maxDisconnectionDuration:60*60*1e3,skipMiddlewares:true}}),s=async()=>{await n.removeAllSessions(e);};a.on("connection",async c=>{let u=c.id,d=e.child({sessionId:u});d.info({event:"connection",transport:c.conn.transport.name},"Mobile websocket connection initiated"),c.on("disconnect",async f=>{if(e.info({reason:f},"Disconnect received"),f.includes("namespace disconnect")){await wie({socket:c,globalStateManager:n,logger:d,authorization:t.authorization});return}let h=n.getSession(u);h&&(h.softDeleted=true);});let m,p;try{let f=c.handshake.query?.testMetadata,h=yc.parse(JSON.parse(f??"")),g=h.id,b=await i({testId:g});switch(p=await r(b,d),h.platform){case "ANDROID":m=await Cie({...t,orgId:b,socket:c,globalStateManager:n,logger:d,globalOrgSettings:p,testMetadata:h});break;case "IOS":m=await Die({...t,orgId:b,socket:c,globalStateManager:n,logger:d,globalOrgSettings:p,testMetadata:h});break;default:throw new Error("Unsupported platform")}}catch(f){d.error({err:f},"Failed to setup mobile connection"),c.emit("error",{message:f instanceof Error?f.message:JSON.stringify(f)}),c.disconnect(true);return}Oie.forEach(f=>l(f,{...t,socket:c,metadata:m,globalOrgSettings:p,logger:d}));});let l=(c,u)=>{let d=c.createHandler(u),m=(...p)=>{c.event!=="keepalive"&&u.logger.debug({event:c.event},`Websocket event (${c.event})`);let f=h=>{u.logger.error({event:c.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,p);h&&typeof h.catch=="function"&&h.catch(f);}catch(h){f(h);}};u.socket.on(c.event,m);};return {server:a,dispose:s}}async function NGe(t,e){switch(t){case "ANDROID":return {uploadPath:e,cleanup:async()=>{}};case "IOS":{let o=await Bn__default.promises.mkdtemp(Oo__default.join(Tl.tmpdir(),"momentic-mobile-asset-")),n=Oo__default.join(o,"app.zip");return await LGe(e,n),{uploadPath:n,cleanup:()=>Bn__default.promises.rm(o,{recursive:true,force:true})}}}}function LGe(t,e){return new Promise((o,n)=>{let r=IGe("zip",{zlib:{level:9}}),i=Bn__default.createWriteStream(e);i.on("close",()=>o()),i.on("error",n),r.on("error",n),r.on("warning",a=>{a.code!=="ENOENT"&&n(a);}),r.pipe(i),r.directory(t,false,a=>Oo__default.basename(a.name)===".DS_Store"?false:(a.mode=a.stats?.isDirectory()?493:420,a)),r.finalize().catch(n);})}async function kGe(t){let e=_Ge.createHash("md5");await new Promise((n,r)=>{Bn__default.createReadStream(t).on("data",i=>e.update(i)).on("end",()=>n()).on("error",r);});let o=e.digest();return {md5Base64:o.toString("base64"),md5Hex:o.toString("hex")}}async function yM({tag:t,channel:e,filePath:o,apiClient:n,logger:r,platform:i}){r.info({channel:e,tag:t,platform:i,filePath:o},"starting asset upload");let a=Date.now(),{uploadPath:s,cleanup:l}=await NGe(i,o);try{let{md5Base64:c,md5Hex:u}=await kGe(s),{size:d}=await Bn__default.promises.stat(s),m=await n.generateAssetUploadUrl({channel:e,tag:t??"latest",md5:c,platform:i});if(m.md5&&(m.md5===c||m.md5===u))return r.info({channel:e,tag:t,platform:i,filePath:o,size:d,durationMs:Date.now()-a,skipped:!0},"skipped asset upload (md5 match)"),{skipped:!0};if(!m.uploadUrl)throw new O("InternalPlatformError",`No upload URL was given for asset ${o}`);try{let p=await fetch$1(m.uploadUrl,{headers:{"Content-Length":d.toString(),"Content-Type":"application/octet-stream"},method:"PUT",body:Bn__default.createReadStream(s),duplex:"half"});if(p.status!==200)throw new O("InternalPlatformError",`Got error response from emulator platform: ${p.status} ${await p.text()}`);return r.info({channel:e,tag:t,platform:i,filePath:o,size:d,durationMs:Date.now()-a},"finished asset upload"),{skipped:!1}}catch(p){try{await n.deleteAsset(e,t??"latest",i);}catch(f){r.warn({err:f,tag:t,channel:e},"Failed to clean up asset after failed upload");}throw p}}finally{await l();}}async function SM({channel:t,tag:e,platform:o,apiClient:n,logger:r}){let i=e??"latest";r.info({channel:t,tag:i,platform:o},`Deleting asset ${t}:${i} (${o})...`),await n.deleteAsset(t,i,o),r.info({channel:t,tag:i,platform:o},`Asset ${t}:${i} (${o}) deleted successfully!`);}var FGe=z.object({emulatorName:z.string(),platform:z.enum(at)});z.object({runId:z.string(),emulators:z.array(FGe)});var Lie;async function TM(t){await Lie?.registerEmulator(t);}async function EM(t){await Lie?.unregisterEmulator(t);}var _h=new bM;var _B="1.4.6",Mt=yp({app:"mobile-desktop-server",hostname:hostname(),disableConsoleLogs:true}).child({cliVersion:_B});(async()=>{try{let t=await sy(Mt);t.gitBranchName&&Mt.addBinding("branch",t.gitBranchName);}catch{}})();var vM=Router();vM.get("/",Xe(async(t,e)=>{let o=ao();if(!o){e.status(500).json({message:"API client not initialized"});return}let n=await o.getMobileAssets();e.status(200).json(n);}));vM.post("/upload-url",Xe(async(t,e)=>{let o;try{o=Rj.parse(t.body);}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}let n=ao();if(!n){e.status(500).json({error:"API client not initialized"});return}let r=Oo__default.resolve(o.filePath);if(!existsSync(r)){e.status(400).json({error:`File not found: ${r}`});return}let i=/\.apk$/i.test(r),a=r.endsWith(".app")&&statSync(r).isDirectory();if(!i&&!a){e.status(400).json({error:"Unsupported file type. Only .apk files and .app directories are supported."});return}await yM({tag:o.tag,channel:o.channel,filePath:r,apiClient:n,logger:Mt,platform:i?"ANDROID":"IOS"}),e.sendStatus(204);}));vM.delete("/:channel/:tag/:platform",Xe(async(t,e)=>{let o=ao();if(!o){e.status(500).json({error:"API client not initialized"});return}let{channel:n,tag:r,platform:i}=t.params;if(!n||!r||!i){e.status(400).json({error:"Missing channel, tag, or platform."});return}let a=yg.safeParse(i.toUpperCase());if(!a.success){e.status(400).json({error:`Invalid platform "${i}". Expected "android" or "ios".`});return}let s=a.data;await SM({channel:n,tag:r,platform:s,apiClient:o,logger:Mt}),e.sendStatus(204);}));var kie=vM;var Oh=Router();async function CM(t){return (await j4(t,Mt)).map(n=>{let r=t.mobileModules[n.moduleId];if(!r){N.warn(`Found a dangling mobile module with ID ${n.moduleId} that could not be found on disk.`);return}return {...r,content:n}}).filter(n=>n!==void 0)}Oh.get("/",Xe(async(t,e)=>{let o=vt(),n=await _t(o),r=await CM(n);e.status(200).json(r);}));Oh.get("/tests-join",Xe(async(t,e)=>{let o=vt(),n=await _t(o),r=await CM(n),i={};for(let s of r)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 Po(s.fullFilePath,Mt,n)})));for(let{id:s,name:l,relativePath:c,test:u}of a){let d=new Set;ni({steps:u.steps,onPreset:()=>false,onModule:m=>(d.add(m.moduleId),false)});for(let m of d){let p=i[m];p&&p.tests.push({id:s,name:l,relativePath:c});}}e.status(200).json(i);}));Oh.get("/:moduleId",Xe(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let o=await _t(vt()),n=o.mobileModules[t.params.moduleId];if(!n){e.status(404).json({error:"Mobile module not found."});return}try{let r=await Rd(n,o,N);e.json(r);}catch(r){e.status(400).json({err:r});}}));Oh.patch("/:moduleId/metadata",Xe(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let o;try{o=Mj.parse(t.body);}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=vt(),r=await _t(n);V4({moduleId:t.params.moduleId,patch:o,momenticFiles:r,logger:N,project:n}),e.status(201).json({message:"ok"});}));Oh.post("/",Xe(async(t,e)=>{let o;try{o=Ij.parse(t.body);}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{qi(o.name);}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=vt(),r=await _t(n),i=r.mobileModules;if(Object.values(i).find(s=>s.name===o.name)){e.status(400).json({error:`A mobile module with the name "${o.name}" already exists. Please choose a different name.`});return}let a=Oo__default.join(n.rootDir,o.folderPath??Oo__default.dirname(o.testFilePath));if(!Bn__default.existsSync(a)||!Bn__default.statSync(a).isDirectory()){e.status(400).json({error:`The folder configured for mobile module creation does not exist: ${a}`});return}switch(o.platform){case "ANDROID":{let s=await cy({...o,folder:a,project:n,momenticFiles:r});e.status(201).json(s);return}case "IOS":{let s=await cy({...o,folder:a,project:n,momenticFiles:r});e.status(201).json(s);return}}}));var Uie=Oh;var OB=Router();OB.get("/",Xe(async(t,e)=>{let o=vt(),n=await _t(o),r=await CM(n),i=new Set;n?.mobileTests&&Object.values(n.mobileTests).forEach(c=>{c.labels?.forEach(u=>i.add(u));});let a=Array.from(i).sort(),s=Object.values(n.mobileTests),l={labels:a,modules:r,tests:s};e.status(200).json(l);}));OB.get("/folders",Xe(async(t,e)=>{let o=vt(),n=await x4(o);e.status(200).json(n);}));var zie=OB;var wM=Router();wM.get("/",Xe((t,e)=>{let o=bw(vt(),Mt);e.status(200).json(o);}));wM.get("/names",Xe((t,e)=>{let n=vt().config.environments?.map(r=>r.name)??[];e.status(200).json(n);}));wM.post("/",Xe((t,e)=>{let o;try{o=xj.parse(t.body);}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{qi(o.name);}catch(s){e.status(400).json({error:`Invalid environment name: ${s}`});return}let n=vt();if(n.config.environments?.find(s=>s.name===o.name)){e.status(400).json({error:`An environment with the name "${o.name}" already exists. Please choose a different name.`});return}let i={...n.config,environments:[...n.config.environments??[],{name:o.name}]};n.config=i,Ad(i,n.configFilePath);let a=Cd(o.name,n,Mt);e.status(201).json(a);}));var $ie=wM;var Vie=Router();Vie.get("/",Xe((t,e)=>{let o={userId:nm(),orgId:xn(),email:kx(),name:Ane(),pylonEmailHash:Rne(),cliVersion:_B};e.status(200).json(o);}));var jie=Vie;var Hie=Router();Hie.get("/",Xe(async(t,e)=>{let o=t.query.sessionId;if(!o){e.status(400).json({packages:[]});return}let n=_h.getSession(o);if(!n?.controller){e.status(200).json({packages:[]});return}try{let r=n.controller,{installedApps:i}=await r.getInstalledApps();e.status(200).json({packages:i});}catch(r){Mt.error({err:r},"Error fetching installed packages from the session controller"),e.status(200).json({packages:[]});}}));var Wie=Hie;var Gie=Router();Gie.get("/",Xe(async(t,e)=>{let o=await WS(Mt);e.status(200).json(o);}));var qie=Gie;var AM=Router(),Kie=async({platform:t,steps:e,cacheStorage:o,stepId:n,parentStepIdChain:r,testId:i,environment:a})=>{let{result:s,parentChain:l}=_c(e,n,r);if(!s)return;let c=l.filter(u=>u.type==="RESOLVED_MOBILE_MODULE").map(u=>u.id);return await o.getCacheKeyForStep({platform:t,logger:Mt,testId:i,environment:a,parentStepIdChain:c,step:s})};AM.patch("/",Xe(async(t,e)=>{let o=vt(),n=xn(),r=ao(),i=o.config?.advanced?.isolateCachesByEnvironment;if(!r){e.status(500).json({error:"API client not initialized"});return}let a;try{a=Dj.parse(t.body);}catch(u){e.status(400).json({error:`Invalid request body: ${u}`});return}let s=await Lo(Mt,r,o),l=wn({logger:Mt,orgId:n,client:r,gitMetadata:s,regenerateCache:false,noCache:false,alwaysSaveCache:false,isolateCachesByEnvironment:i}),c=await Kie({cacheStorage:l,platform:a.platform,steps:a.steps,stepId:a.stepId,parentStepIdChain:a.parentStepIdChain,testId:a.testId,environment:i?a.environment:void 0});if(!c){e.status(400).json({error:"Cache-supporting step not found"});return}await r.updateMobileStepCaches({platform:a.platform,body:{entries:[{key:c,organizationId:n,value:a.value,testId:a.testId,environment:i?a.environment:void 0}]},headers:td(s)}),e.status(204).send();}));AM.delete("/entry",Xe(async(t,e)=>{let o=vt(),n=xn(),r=ao(),i=o.config?.advanced?.isolateCachesByEnvironment;if(!r){e.status(500).json({error:"API client not initialized"});return}let a;try{a=Lj.parse(t.body);}catch(u){e.status(400).json({error:`Invalid request body: ${u}`});return}let s=await Lo(Mt,r,o),l=wn({logger:Mt,orgId:n,client:r,gitMetadata:s,regenerateCache:false,noCache:false,alwaysSaveCache:false,isolateCachesByEnvironment:i}),c=await Kie({cacheStorage:l,platform:a.platform,steps:a.steps,stepId:a.stepId,parentStepIdChain:a.parentStepIdChain,testId:a.testId,environment:i?a.environment:void 0});if(!c){e.status(400).json({error:"Cache-supporting step not found"});return}await r.deleteMobileStepCacheEntry({platform:a.platform,body:{testId:a.testId,key:c,environment:i?a.environment:void 0},headers:td(s)}),e.status(204).send();}));AM.post("/traces",Xe(async(t,e)=>{let o=ao();if(!o){e.status(500).json({error:"API client not initialized"});return}let n;try{n=kj.parse(t.body);}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let r=await o.getMobileStepCacheMemoryTraces(n.platform,n);e.status(200).json(r);}));var Yie=AM;L_e("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI","POSTHOG_WEB_WRITE_KEY is not set");var{captureEvent:$i,setAnalyticsIdentity:RM,shutdownAnalytics:xM}=pv({writeKey:"phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",host:"https://p.momentic.ai",platform:"local_mobile_app",identity:"stashed",flushImmediately:true});var cm=Router();cm.patch("/:testPath",Xe(async(t,e)=>{let o=t.params.testPath;if(!o){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=wj.parse(t.body);}catch(l){e.status(400).json({error:`Invalid request body: ${l}`});return}if(n.steps===void 0&&n.beforeSteps===void 0&&n.afterSteps===void 0&&n.settings===void 0&&n.labels===void 0){e.status(400).json({error:"At least one of steps, beforeSteps, afterSteps, settings, or labels is required"});return}let r=vt(),i=o.endsWith(".test.yaml")?o:`${o}.test.yaml`,a=await _t(r);await Pl({platform:n.platform,filePath:i,steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps,settings:n.settings,labels:n.labels,folder:r.rootDir,project:r,momenticFiles:a,schemaVersion:Ro});let s={message:"ok"};e.status(200).json(s);}));cm.post("/",Xe(async(t,e)=>{let o;try{o=vj.parse(t.body);}catch(g){e.status(400).json({error:`Invalid request body: ${g}`});return}let{name:n,description:r,settings:i,pathSegments:a,platform:s}=o;if(!n||typeof n!="string"){e.status(400).json({error:"Missing or invalid 'name' in body"});return}try{qi(n);}catch(g){e.status(400).json({error:J(g)});return}let l=vt(),c=await _t(l),u=Oo__default.join(l.rootDir,...a??[]),{fullPath:d,testId:m}=Sw({name:n,description:r,settings:i,folder:u,platform:s,project:l,momenticFiles:c});$i({type:"test_editor:test_create",test_platform:Qi(s)});let p=Oo__default.basename(d),f=Oo__default.relative(l.rootDir,d),h={id:m,fileName:p,fullPath:d,relativeFilePath:f};e.status(201).json(h);}));cm.get("/:fileName",Xe(async(t,e)=>{let o=ao(),n=xn(),r=t.params.fileName;if(!r){e.status(400).json({error:"Missing fileName in path"});return}if(!o){e.status(500).json({error:"API client not initialized"});return}let i=r.endsWith(".test.yaml")?r:`${r}.test.yaml`,a=Oo__default.basename(i).replace(".test.yaml",""),s=vt(),l=Oo__default.isAbsolute(i)?i:Oo__default.join(s.rootDir,i);if(!Bn__default.existsSync(l)){e.status(404).json({error:"Test not found."});return}let c=await _t(s),u=await Po(l,Mt,c),d=_h.getSessionForTest(u.id),m=d?Mt.child({sessionId:d.metadata.sessionId,testId:u.id,testName:d.metadata.testName}):Mt,p=await Lo(m,o,s,{includeHostingUsername:false});await wn({logger:m,orgId:n,client:o,gitMetadata:p,regenerateCache:false,noCache:false,alwaysSaveCache:false,isolateCachesByEnvironment:s.config?.advanced?.isolateCachesByEnvironment}).resolveEntries({logger:m,platform:u.platform,testId:u.id,environment:u.settings?.defaultEnv,stepLists:{steps:u.steps,...u.beforeSteps&&{beforeSteps:u.beforeSteps},...u.afterSteps&&{afterSteps:u.afterSteps}},useSnapshotIdentityCache:s.config.fileFormat==="v2"});let h={...u,name:a,absoluteFilePath:l};e.status(200).json(h);}));cm.patch("/:testPath/metadata",Xe(async(t,e)=>{let o=t.params.testPath;if(!o){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=Aj.parse(t.body);}catch(l){e.status(400).json({error:`Invalid request body: ${l}`});return}let r=vt(),i=o.endsWith(".test.yaml")?o:`${o}.test.yaml`,s={message:"ok",newRelativeTestPath:H4(i,n,r).newRelativeTestPath};e.status(200).json(s);}));cm.delete("/:testPath",Xe((t,e)=>{let o=t.params.testPath;if(!o){e.status(400).json({error:"Missing testPath in path"});return}let n=vt(),r=o.endsWith(".test.yaml")?o:`${o}.test.yaml`,i=Oo__default.join(n.rootDir,r);if(!Bn__default.existsSync(i)){e.status(404).json({error:"Test not found."});return}Bn__default.unlinkSync(i),e.status(200).json({message:"ok"});}));cm.post("/:testPath/duplicate",Xe(async(t,e)=>{let{testPath:o}=t.params;if(!o){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=_j.parse(t.body);}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{qi(n.name);}catch(h){e.status(400).json({error:J(h)});return}let r=vt(),i=Oo__default.join(r.rootDir,o);if(!Bn__default.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await _t(r),s;try{s=await Po(i,Mt,a);}catch(h){e.status(400).json({error:J(h)});return}let l=ef({projectConfig:r.config,momenticFiles:a,entityType:"mobile-test"}),{stepsToSave:c}=await Gn({platform:s.platform,stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:true}),u=Ln({fileType:Pe.MOBILE_TEST,id:l,schemaVersion:Ro,description:s.description,platform:s.platform,settings:s.settings,labels:s.labels,...c});VE.parse(u);let d=Oo__default.dirname(i),m=Oo__default.join(d,`${n.name}.test.yaml`);if(Bn__default.existsSync(m)){e.status(409).send("A test with this name already exists");return}let p=Ob.stringify(u);Bn__default.writeFileSync(m,p,"utf-8");let f={relativeFilePath:Oo__default.relative(r.rootDir,m)};e.status(201).json(f);}));var Xie=cm;var Jie=Router();Jie.get("/:id",Xe(async(t,e)=>{let{id:o}=t.params;if(!o){e.status(400).json({error:"Missing ID"});return}let n=ao();if(!n){e.status(500).json({error:"API client not initialized"});return}try{let{data:r,contentType:i}=await n.fetchOnDemandScreenshot(o);e.setHeader("Content-Type",i),e.status(200).send(r);}catch(r){Mt.error({err:r,screenshotId:o},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"});}}));var Zie=Jie;var Qie=Router();Qie.get("/",Xe((t,e)=>{let o=vt(),n={ai:o.config.ai,displayRoot:o.config.displayRoot};e.status(200).json(n);}));var eae=Qie;var tae=Router();tae.post("/traces",Xe(async(t,e)=>{let o=ao();if(!o){e.status(500).json({error:"API client not initialized"});return}let n;try{n=Fj.parse(t.body);}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let r=await o.getWebStepCacheMemoryTraces(n);e.status(200).json(r);}));var oae=tae;var Nh=class extends df{constructor(o,n){super(o,n);this.client=o;this.orgId=n;}async fetchEnvironment(o,n){let r=vt();return Cd(o,r,N)}};var rqe=promisify$1(execFile$1);async function nae({managedState:t,project:e,testEntity:o,resolvedTest:n,envName:r}){let{logger:i,sessionId:a}=t,s=xne(),l=xn(),c=jS(),u=yne(),d=new Nh(u,l),m=r??n.settings?.defaultEnv,p={};m&&(p=(await d.fetchEnvironment(m,i))?.variables??{});let f={...e.config.emulator,...n.settings?.emulator},h=new zs({baseUrl:c,apiKey:s,logger:i,mode:u.mode,runner:u.runner}),g=new Ol(e.config.ai?.agentConfig,{baseUrl:c,apiKey:s,logger:i,mode:u.mode,runner:u.runner}),b=new Gc({baseUrl:c,apiKey:s,logger:i,mode:u.mode,runner:u.runner},g),y=new qc({httpClient:u,fakerSeed:e.config.advanced?.fakerConstantSeed?ap:void 0}),T=new ta({variablesFromEnvironment:p,envName:m,testName:o.name}),v=new Ds({logger:i,reporter:new Wc(u),runType:"mobile-test-run",runId:a,testMetadata:o,isInteractive:true,runner:u.runner});return {logger:i,sessionId:a,orgId:l,apiClient:u,resolvedEnvName:m,variablesFromEnvironment:p,emulatorSettings:f,mobileGenerator:h,fixtures:{storage:d,browserEnricher:b,browserGenerator:g,localCodeEvalTools:y,testContext:T,visualDiffGoldenStorage:new Vs({baseDir:e.rootDir,updateGoldenFiles:false})},aiSettings:{useMemory:true,...e.config.ai,...n.settings?.ai},usageTracker:v}}function iqe(t){return {steps:t.steps,beforeSteps:t.beforeSteps,afterSteps:t.afterSteps}}async function MM({platform:t,project:e,logger:o,orgId:n,apiClient:r,resolvedTest:i,envName:a}){let s=iqe(i);if(e.config.fileFormat!=="v2")return s;let l=await Lo(o,r,e),{alwaysSaveCache:c,noCache:u}=ol();return await wn({logger:o,orgId:n,client:r,gitMetadata:l,regenerateCache:false,alwaysSaveCache:c,noCache:u,isolateCachesByEnvironment:e.config?.advanced?.isolateCachesByEnvironment}).resolveEntries({logger:o,platform:t,testId:i.id,environment:a,stepLists:s,useSnapshotIdentityCache:true}),s}async function rae({provider:t,platform:e,emulatorName:o,cleanupDriver:n}){let r=t==="remote";return r&&await TM({emulatorName:o,platform:e}),async()=>{await n(),r&&await EM({emulatorName:o,platform:e});}}async function iae({managedState:t,project:e,testEntity:o,resolvedTest:n,provider:r,envName:i,localAvdId:a,localApkPath:s}){let{logger:l,sessionId:c,orgId:u,apiClient:d,resolvedEnvName:m,variablesFromEnvironment:p,emulatorSettings:f,mobileGenerator:h,fixtures:g,aiSettings:b,usageTracker:y}=await nae({managedState:t,project:e,testEntity:o,resolvedTest:n,envName:i}),T=n.settings?.defaultChannel,v=n.settings?.defaultTag,E=await MM({platform:"ANDROID",project:e,logger:l,orgId:u,apiClient:d,resolvedTest:n,envName:m}),P=await aqe({provider:r,projectRoot:e.rootDir,emulatorSettings:f,resolvedTest:n,localAvdId:a,localApkPath:s,variablesFromEnvironment:p});l.info({platform:"ANDROID",provider:r,envName:m,emulatorSettings:f,aiSettings:b},"Starting mobile session with resolved configuration");let M=r==="local"?"local":"region"in P?P.region:void 0,I=await vf({apiClient:d,logger:l,creationOpts:r==="remote"?{...P,apkToInstall:T?{channel:T,tag:v}:void 0}:P,emulatorSettings:f,orgId:u,sessionId:c,callbacks:{onStatusUpdate:_=>{l.info({status:_},"Android session status update");}}}),A=await rae({provider:r,emulatorName:I.emulatorName,platform:"ANDROID",cleanupDriver:async()=>{await I.cleanup();}}),k;try{let _="limbarClient"in I?{limbarClient:I.limbarClient,limbarToken:I.limbarToken,limbarUrl:I.limbarUrl,limbarRegion:I.limbarRegion,playwrightDevice:I.playwrightDevice}:void 0;k=await vu.init({driver:I.driver,generator:h,logger:l,limbarClient:_?.limbarClient,playwrightDevice:_?.playwrightDevice,aiSettings:b,options:{emulator:{...f,region:M,browserSettings:e.config.browser}},fixtures:g,orgId:u,adbPort:I.adbPort,abortController:new AbortController});let H=await k.getViewportBounds(),V=k;return {...t,platform:"ANDROID",provider:r,controller:V,cleanup:[async()=>{await Promise.allSettled([V.cleanup(),A(),g.localCodeEvalTools.dispose()]);}],testName:o.name,relativeTestPath:o.relativePath,testFileAbsolutePath:Oo__default.join(e.rootDir,o.relativePath),envName:m,orgId:u,emulatorName:I.emulatorName,viewportBounds:H,adbPort:I.adbPort,tempCaches:{},limbarUrl:_?.limbarUrl,limbarToken:_?.limbarToken,limbarRegion:_?.limbarRegion,usageTracker:y,mutableStepState:{platform:"ANDROID",testId:n.id,stepLists:E}}}catch(_){let H=k?[k.cleanup(),A()]:[A()];throw await Promise.allSettled(H),_}}async function aae({managedState:t,project:e,testEntity:o,resolvedTest:n,provider:r,envName:i,localDeviceId:a,localIosVersion:s,localAppPath:l}){let{logger:c,sessionId:u,orgId:d,apiClient:m,resolvedEnvName:p,variablesFromEnvironment:f,emulatorSettings:h,mobileGenerator:g,fixtures:b,aiSettings:y,usageTracker:T}=await nae({managedState:t,project:e,testEntity:o,resolvedTest:n,envName:i}),v=n.settings?.defaultChannel,E=n.settings?.defaultTag,P=await MM({platform:"IOS",project:e,logger:c,orgId:d,apiClient:m,resolvedTest:n,envName:p}),M=sqe({provider:r,projectRoot:e.rootDir,emulatorSettings:h,resolvedTest:n,appChannel:v,appTag:E,localDeviceId:a,localIosVersion:s,localAppPath:l,variablesFromEnvironment:f});c.info({platform:"IOS",provider:r,envName:p,emulatorSettings:h,aiSettings:y},"Starting mobile session with resolved configuration");let I=r==="local"?"local":M.type==="remote"?M.region:void 0,A=await fh({apiClient:m,logger:c,creationOpts:M,emulatorSettings:h,orgId:d,sessionId:u,callbacks:{onStatusUpdate:H=>{c.info({status:H},"iOS session status update");}}}),k=await rae({provider:r,emulatorName:A.emulator.name,platform:"IOS",cleanupDriver:async()=>{await A.cleanup();}}),_;try{_=await wu.init({driver:A.driver,generator:g,logger:c,emulator:A.emulator,aiSettings:y,options:{emulator:{...h,region:I,browserSettings:e.config.browser}},fixtures:b,orgId:d,abortController:new AbortController});let H=await _.getViewportBounds(),V=_;return {...t,platform:"IOS",provider:r,controller:V,cleanup:[async()=>{await Promise.allSettled([V.cleanup(),k(),b.localCodeEvalTools.dispose()]);}],testName:o.name,relativeTestPath:o.relativePath,testFileAbsolutePath:Oo__default.join(e.rootDir,o.relativePath),envName:p,orgId:d,emulatorName:A.emulator.name,viewportBounds:H,tempCaches:{},limbarUrl:A.limbarParams?.webRtcUrl,limbarToken:A.limbarParams?.token,limbarRegion:A.limbarParams?.region,usageTracker:T,mutableStepState:{platform:"IOS",testId:n.id,stepLists:P}}}catch(H){let V=_?[_.cleanup(),k()]:[k()];throw await Promise.allSettled(V),H}}async function aqe({provider:t,projectRoot:e,emulatorSettings:o,resolvedTest:n,localAvdId:r,localApkPath:i,variablesFromEnvironment:a}){if(t==="remote")return {region:o?.region==="local"?void 0:o?.region,osVersion:o?.remoteEmulatorSettings?.androidVersion??Jm};let s=await NB(),{avdId:l,apkFilePath:c,apkFilePathSource:u}=rp({overrideAvdId:r,overrideApkFilePath:i,emulatorSettings:o,defaultApkFilePath:n.settings?.defaultApkFilePath,envVariables:a});if(!l){let d=s.availableAvdIds.length>0?` Known Available AVDs on this machine: ${s.availableAvdIds.join(", ")}.`:"",m=s.avdDiscoveryError?` Failed to list local AVDs: ${s.avdDiscoveryError}.`:"";throw new Error(`AVD ID is required when using a local emulator. Set it on the test (Options -> Emulator -> Local AVD ID), set ${nc} on the environment, or pass localDeviceId directly.${d}${m}`)}if(s.availableAvdIds.length>0&&!s.availableAvdIds.includes(l))throw new Error(`AVD '${l}' is not available on this machine. Available AVDs: ${s.availableAvdIds.join(", ")}.`);return {avdId:l,apkFilePath:Cf({apkFilePath:c,source:u,overrideBaseDir:e})}}function sqe({provider:t,projectRoot:e,emulatorSettings:o,resolvedTest:n,appChannel:r,appTag:i,localDeviceId:a,localIosVersion:s,localAppPath:l,variablesFromEnvironment:c}){if(t==="remote")return {type:"remote",region:o?.region==="local"?void 0:o?.region,appToInstall:r?{channel:r,tag:i}:void 0,osVersion:Zm};let{deviceType:u,iosVersion:d,appFilePath:m,appFilePathSource:p}=ip({overrideDeviceType:a,overrideIosVersion:s,overrideAppFilePath:l,emulatorSettings:o,defaultAppFilePath:n.settings?.defaultAppFilePath,envVariables:c});if(!u)throw new Error(`A device type is required when using a local region. Pass localDeviceId, configure a default local iOS device type on the test's settings, or set the ${rc} key on the environment.`);return {type:"local",deviceType:u,iosVersion:d,appFilePath:Ch({appFolderPath:m,source:p,overrideBaseDir:e})}}async function NB(){try{let{stdout:t}=await rqe(lqe(),["-list-avds"],{encoding:"utf8",timeout:5e3});return {availableAvdIds:t.split(/\r?\n/).map(o=>o.trim()).filter(Boolean)}}catch(t){return {availableAvdIds:[],avdDiscoveryError:J(t)}}}function lqe(){let t=process.platform==="win32"?"emulator.exe":"emulator";return process.env.ANDROID_HOME?Oo__default.join(process.env.ANDROID_HOME,"emulator",t):t}var sae=5,LB=class extends px{isStartingSession=false;constructor(){super({sessionTypeLabel:"mobile MCP session"});}async kill(e,o){try{let n;for(let i of e.cleanup)try{await i();}catch(a){n??=a;}if(n)throw n;await e.usageTracker.flush(e.logger);let r=Eoe(e);return await $oe({apiClient:ao(),logger:e.logger,orgId:e.orgId,testId:e.testId,sessionId:e.sessionId,reason:o,report:r}),e.logger.info({sessionId:e.sessionId,reason:o,emulatorName:e.emulatorName},"MCP session cleaned up"),{killed:!0,sessionId:e.sessionId,reason:o,report:r}}catch(n){return e.logger.error({err:n,sessionId:e.sessionId,reason:o},"Failed to clean up mobile MCP session"),{killed:false,sessionId:e.sessionId,reason:o}}}touchSession(e){let o=super.touchSession(e);return o?.provider==="remote"&&ao()?.extendEmulatorTtl(o.platform,o.emulatorName).catch(()=>{}),o}async createSession({logger:e,testId:o,idleTimeoutMs:n,provider:r,envName:i,localDeviceId:a,localIosVersion:s,localAppPath:l,project:c}){let u=this.listSessionIds();if(this.isStartingSession||u.length>0)throw new Error(JSON.stringify({message:"Another mobile MCP session is already active or starting. Please terminate the existing session before creating a new one.",activeSessionIds:u},null,2));this.isStartingSession=true;let d;try{let{entity:m,momenticFiles:p}=await $s(c,{id:o},"mobileTests"),f=await Po(m.fullFilePath,e,p),b=(f.settings?.emulator?.region??c.config.emulator?.region)==="local"?"local":"remote",y=r??b,T,{platform:v}=f,E=e.child({testId:f.id});switch(v){case "ANDROID":d=this.buildManagedSessionState({logger:E,idleTimeoutMs:n,testId:m.id}),T=await iae({managedState:d,project:c,testEntity:m,resolvedTest:f,provider:y,envName:i,localAvdId:a,localApkPath:l});break;case "IOS":d=this.buildManagedSessionState({logger:E,idleTimeoutMs:n,testId:m.id}),T=await aae({managedState:d,project:c,testEntity:m,resolvedTest:f,provider:y,envName:i,localDeviceId:a,localIosVersion:s,localAppPath:l});break;default:return Ct(v)}return E.info({sessionId:T.sessionId,testId:f.id},"Started MCP session for test"),T}catch(m){throw d&&clearTimeout(d.timeoutHandle),m}finally{this.isStartingSession=false;}}},Ir=new LB,Ru=({response:t,sessionId:e,toolName:o})=>{let n=Ir.touchSession(e);if(n)return t.addCleanupCallback(()=>{zoe({session:n,toolCallId:t.toolCallId});}),Uoe({session:n,toolCallId:t.toolCallId,toolName:o}),n;t.addError(JSON.stringify({message:`No active session found for id '${e}'.`,availableSessionIds:Ir.listSessionIds()},null,2));};var uqe=4e4,dqe=1e4,FB,cae=({staticDir:t})=>{FB=t;},PM=class t{url;server;constructor({url:e,server:o}){this.url=e,this.server=o;}static async init({logger:e,testId:o,testName:n,sessionId:r,platform:i,limbarUrl:a,limbarToken:s,limbarRegion:l,tabLabel:c}){let u=await hqe({logger:e,assets:mqe()}),d=new URL(`http://localhost:${u.port}/`);return d.searchParams.set("testId",o),n&&d.searchParams.set("testName",n),d.searchParams.set("sessionId",r),d.searchParams.set("platform",i),d.searchParams.set("url",a),d.searchParams.set("token",s),l&&d.searchParams.set("region",l),c&&d.searchParams.set("tabLabel",c),new t({url:d.toString(),server:u})}async shutdown(){this.server?.server.listening&&(await new Promise(e=>{this.server?.server.close(()=>{e();});}),this.server=void 0);}};function mqe(){if(!FB)throw new Error("Remote control viewer static directory is not configured. Pass remoteControlStaticDir when starting the mobile MCP server.");let t=Oo__default.resolve(FB),e=Oo__default.join(t,"index.html");if(!Bn__default.existsSync(e))throw new Error(`Remote control viewer index file not found at '${e}'. Ensure mobile-remote-control-frontend is built and copied into npm/mobile-cli/remote-control-static.`);return {staticDir:t,indexHtmlBuffer:Bn__default.readFileSync(e)}}function kB({response:t,statusCode:e,body:o,allow:n}){let r={"Content-Type":"text/plain; charset=utf-8","Cache-Control":"no-store"};n&&(r.Allow=n),t.writeHead(e,r),t.end(o);}function lae({request:t,response:e,buffer:o,contentType:n}){if(e.writeHead(200,{"Content-Type":n,"Cache-Control":"no-store"}),t.method==="HEAD"){e.end();return}e.end(o);}function pqe({staticDir:t,pathname:e}){let o;try{o=decodeURIComponent(e);}catch{return}let n=o==="/"?"index.html":o.replace(/^\/+/,""),r=Oo__default.resolve(t,n),i=Oo__default.relative(t,r);if(!(i.startsWith("..")||Oo__default.isAbsolute(i)))return r}function fqe({request:t,response:e,assets:o}){if(t.method!=="GET"&&t.method!=="HEAD"){kB({response:e,statusCode:405,body:"Method Not Allowed",allow:"GET, HEAD"});return}let n=new URL(t.url??"/","http://localhost").pathname;if(n==="/"||n==="/index.html"){lae({request:t,response:e,buffer:o.indexHtmlBuffer,contentType:"text/html; charset=utf-8"});return}let r=pqe({staticDir:o.staticDir,pathname:n});if(!r){kB({response:e,statusCode:403,body:"Forbidden"});return}if(!Bn__default.existsSync(r)||!Bn__default.statSync(r).isFile()){kB({response:e,statusCode:404,body:"Not Found"});return}let i=Oo__default.extname(r).toLowerCase(),a=Zu[i]??"application/octet-stream";lae({request:t,response:e,buffer:Bn__default.readFileSync(r),contentType:a});}async function hqe({logger:t,assets:e}){let o=createServer((i,a)=>fqe({request:i,response:a,assets:e})),n=Math.floor(Math.random()*dqe)+uqe,r=await Ic(n,"mobile-mcp-remote-control-viewer");return await new Promise((i,a)=>{let s=l=>{a(l);};o.once("error",s),o.listen(r,()=>{o.off("error",s),i();});}),t.info({port:r,staticDir:e.staticDir},"Started mobile MCP remote control viewer server"),{port:r,server:o}}function BB({logger:t,applicationName:e,cliVersion:o,serverId:n=randomUUID()}){let r={serverId:n,applicationName:e,cliVersion:o},i=xn(),a=t.child({orgId:i,userId:nm(),...r});return {info:r,mcpLogger:a,orgId:i}}function UB({sessionIdleTimeoutMinutes:t}){return (t&&t>=1?t:sae)*60*1e3}async function IM({project:t,serverUrl:e,alwaysSaveCache:o,noCache:n,remoteControlStaticDir:r}){cae({staticDir:r}),mh(e),Lx({alwaysSaveCache:o,noCache:n}),RM({userId:nm(),orgId:xn(),selfServe:Fx()}),Bx(t,i=>Ni({configFilePath:i}));}function _M({project:t,logger:e,apiKey:o,serverUrl:n,supportsFileOutput:r,headfulDefault:i,sessionIdleTimeoutMinutes:a,applicationName:s,cliVersion:l,serverId:c,apiClient:u}){let{info:d,mcpLogger:m,orgId:p}=BB({logger:e,applicationName:s,cliVersion:l,serverId:c}),f=new zs({baseUrl:n,apiKey:o,logger:m,mode:"interactive",runner:"mcp"});return {context:{project:t,orgId:p,logger:m,apiClient:u,generator:f,serverId:d.serverId,saveChangesToDisk:true,sessionIdleTimeoutMs:UB({sessionIdleTimeoutMinutes:a}),supportsFileOutput:r,headfulDefault:i},info:d}}async function Sqe({moduleId:t,name:e,description:o,enabled:n,platform:r,parameters:i,steps:a,project:s}){let l=await _t(s),{stepsToSave:{steps:c}}=await Gn({platform:r,stepLists:{steps:a}});ks({content:{platform:r,moduleId:t,name:e,description:o,enabled:n,parameters:i,steps:c},schemaVersion:Ro,momenticFiles:l,project:s});}function Tqe({module:t,inputs:e}){return {...t,id:randomUUID(),type:"RESOLVED_MOBILE_MODULE",inputs:e}}async function uae({project:t,logger:e,testPath:o,saveChangesToDisk:n,mutableStepState:r,params:i,initialMomenticFiles:a,platform:s,availableSteps:l,cacheContext:c}){let{stepsToExtract:u,startIndex:d,endIndex:m}=Hoe({moduleName:i.name,existingModuleNames:Object.values(a.mobileModules).map(h=>h.name),parameterNames:i.parameters?.parameterNames,defaultParameters:i.parameters?.defaultParameters,parameterEnums:i.parameters?.parameterEnums,moduleInputs:i.moduleInputs,testPath:o,startIndex:i.startIndex,endIndex:i.endIndex,availableSteps:l,containsNestedModuleStep:AK}),p=Oo__default.join(t.rootDir,i.folderPath??"");i.folderPath&&Bn__default.mkdirSync(p,{recursive:true});let f=await cy({name:i.name,platform:s,description:i.description??"",enabled:i.enabled??true,steps:u,folder:p,project:t,momenticFiles:a});if(i.parameters!==void 0&&(await Sqe({moduleId:f.moduleId,name:i.name,description:i.description??"",enabled:i.enabled??true,platform:s,parameters:i.parameters,steps:u,project:t}),f={...f,name:i.name,description:i.description??"",parameters:i.parameters}),n&&i.startIndex!==void 0&&o!==void 0){let h=await _t(t);if(!l)throw new Error("Mobile module was created successfully, but the source test steps were not available for replacement.");let g=Tqe({module:f,inputs:i.moduleInputs}),b=[...l];if(b.splice(d,m-d,g),await Pl({platform:s,filePath:o,steps:b,folder:t.rootDir,project:t,momenticFiles:h,schemaVersion:Ro}),r&&(r.stepLists={...r.stepLists,steps:b}),c){let{cachesToSave:y,snapshotCachesToSave:T}=await Gn({platform:s,stepLists:{steps:b},cacheCreationParams:{orgId:c.orgId,testId:c.testId,environment:c.envName},useSnapshotIdentityCache:c.useSnapshotIdentityCache});try{await c.cacheStorage.saveEntries({platform:s,logger:e,entries:y});}catch(v){e.warn({err:v},"Failed to save mobile step caches after module create, future runs may be slower");}if(c.useSnapshotIdentityCache)try{await c.cacheStorage.saveSnapshotCacheEntries({platform:s,logger:e,entries:T});}catch(v){e.warn({err:v},"Failed to save mobile snapshot identity cache after module create, future runs may regenerate step ids");}}}return f}function dae(t,e,o){if(!t)return {availableSteps:void 0,mutableStepState:void 0};if(t.platform!==e)throw new Error(`Internal error: test platform ${t.platform} does not match resolved platform ${e}`);return o&&o.testId===t.id&&o.platform===e?{availableSteps:o.stepLists.steps,mutableStepState:o}:{availableSteps:t.steps,mutableStepState:void 0}}async function pae({project:t,logger:e,testPath:o,saveChangesToDisk:n,mutableStepState:r,params:i}){qi(i.name);let a=await _t(t),s=o!==void 0?await Po(Oo__default.join(t.rootDir,o),e,a):void 0,l=s?.platform??i.platform??"ANDROID";if(i.platform&&l!==i.platform)throw new Error(`Error: Requested module platform ${i.platform} does not match source test platform ${s?.platform}.`);let c;if(s!==void 0){let d=ao();if(d){let m=await Lo(e,d,t),{alwaysSaveCache:p,noCache:f}=ol();c={cacheStorage:wn({logger:e,orgId:xn(),client:d,gitMetadata:m,regenerateCache:false,alwaysSaveCache:p,noCache:f,isolateCachesByEnvironment:t.config?.advanced?.isolateCachesByEnvironment}),testId:s.id,orgId:xn(),envName:s.settings?.defaultEnv,useSnapshotIdentityCache:t.config.fileFormat==="v2"};}}let u={project:t,logger:e,testPath:o,saveChangesToDisk:n,params:i,initialMomenticFiles:a,cacheContext:c};switch(l){case "ANDROID":return {module:await uae({...u,platform:"ANDROID",...dae(s,"ANDROID",r)})};case "IOS":return {module:await uae({...u,platform:"IOS",...dae(s,"IOS",r)})};default:return Ct(l)}}var fae=ir({schema:{name:HT,description:"Get a single fully loaded mobile module by id, exact name, or file path. This returns complete module details including parameters, description, and the full step list. Exactly one selector must be provided.",inputSchema:z.object({selector:Yz})},handle:async(t,e,o)=>{let{project:n,logger:r}=t;try{let i=await $s(n,e.selector,"mobileModules"),a=await Rd(i.entity,i.momenticFiles,r);o.addPartFromText(JSON.stringify({module:a},null,2));}catch(i){o.addError(J(i));}}}),hae=ir({schema:{name:Gz,description:"Create a mobile module. If startIndex is provided, testPath is required and the specified mobile test range is extracted into a module for that test's platform, then replaced with a module invocation in that test. For empty modules, platform defaults to Android unless platform or testPath identifies iOS.",inputSchema:h_},handle:async(t,e,o)=>{try{let n=h_.parse(e),{testPath:r,...i}=n,a=t7({projectRoot:t.project.rootDir,filePath:r,pathLabel:"testPath"}),s;if(a!==void 0){let c=Oo__default.join(t.project.rootDir,a);for(let u of Ir.listSessionIds()){let d=Ir.getSession(u);if(d!==void 0&&d.testFileAbsolutePath===c){s=d.mutableStepState;break}}}let l=await pae({project:t.project,logger:t.logger,testPath:a,saveChangesToDisk:t.saveChangesToDisk,mutableStepState:s,params:i});o.addPartFromText(JSON.stringify(l.module,null,2));}catch(n){o.addError(J(n));}}});function OM({step:t,parentChain:e}){let o=t;o.parentStepIdChain=e.map(n=>n.id),delete o.retries,delete o.skipped;}function Aqe(t){let e=cloneDeep(t);return ni({steps:e,earlyStop:false,onPreset:(o,n)=>{if(OM({step:o,parentChain:n.parentChain}),o.type==="MOBILE_PRESET_STEP"){let r=o.command;delete r.cache,delete r.id,delete r.thoughts;}return false},onModule:(o,n)=>{OM({step:o,parentChain:n.parentChain});let r=o;return delete r.enabled,delete r.schemaVersion,false},onConditional:(o,n)=>(OM({step:o,parentChain:n.parentChain}),false),onAiAction:(o,n)=>{OM({step:o,parentChain:n.parentChain});let r=o;return delete r.cache,false}}),e.map((o,n)=>{let r=o;return r.index=n,r})}function zB(t,e){if(t.length===0)return `${e}: (no steps)`;let o=["```json",JSON.stringify(Aqe(t),null,2),"```"].join(`
6274
6274
  `);return `${e}:
6275
6275
  ${o}`}var Rqe=`## Note
6276
6276
  The "Installed apps" list may still include default or system packages; it is a best-effort view, not a guarantee of user-installed apps only. `;async function xqe({project:t,testFileAbsolutePath:e,supportsFileOutput:o,platform:n,description:r,activeStepLists:i}){let a=[];a.push(`Name: ${Oo__default.basename(e,".test.yaml")}`),a.push(`Platform: ${n}`),r&&a.push(`Description: ${r}`),a.push("");let s=i.beforeSteps??[],l=i.afterSteps??[];s.length>0&&(a.push(zB(s,"Setup Steps")),a.push("")),a.push(zB(i.steps,"Main Steps")),l.length>0&&(a.push(""),a.push(zB(l,"Teardown Steps")));let c=a.join(`
@@ -6288,7 +6288,7 @@ The "Installed apps" list may still include default or system packages; it is a
6288
6288
  for /f "tokens=5" %a in ('netstat -ano ^| findstr :${t}') do taskkill /PID %a /F
6289
6289
  `);}L_e("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI","POSTHOG_WEB_WRITE_KEY is not set");var{captureEvent:aT,setAnalyticsIdentity:Yae,shutdownAnalytics:Xae}=pv({writeKey:"phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",host:"https://p.momentic.ai",platform:"mobile_cli",identity:"stashed",flushImmediately:true,onIdentify:oY});async function Jae({project:t,logger:e}){let o=await _t(t),n=Object.values(o.mobileTests),r=0,i=new Set,a=[];for(let s of n)try{await Po(s.fullFilePath,e,o);}catch(l){e.error(`Failed to parse mobile test ${s.name} (${s.relativePath})`),xC(l,s.relativePath,a),r++,i.add(s.relativePath);}return {parsingErrors:r,parsingErrorDetails:a,failedTestFilePaths:i}}async function Zae({project:t,filePath:e}){let o={totalErrors:0,parsingErrors:0,parsingErrorDetails:[],failedTestFilePaths:new Set,failedModuleFilePaths:new Set},n=await _t(t);if(e!==void 0)return await n3e({project:t,momenticFiles:n,filePath:e,state:o}),o;for(let r of Object.values(n.mobileModules))await ese({momenticFiles:n,module:r,state:o});for(let r of Object.values(n.mobileTests))await Qae({momenticFiles:n,test:r,state:o});for(let r of n.metadataParseFailures)nse({failure:r,state:o});return r3e({momenticFiles:n,state:o}),i3e({momenticFiles:n,state:o}),o}function qB(t,e,o){t.totalErrors++,e==="test"?t.failedTestFilePaths.add(o):t.failedModuleFilePaths.add(o);}async function n3e({project:t,momenticFiles:e,filePath:o,state:n}){let r=Oo__default.isAbsolute(o)?o:Oo__default.resolve(t.rootDir,o),i=Oo__default.relative(t.rootDir,r);if(i.startsWith("..")||Oo__default.isAbsolute(i)){N.error(`File '${o}' is outside the resolved project at '${t.rootDir}'. Lint a file inside the project, or run without an argument to lint the whole project.`),n.totalErrors++;return}let a=Object.values(e.mobileTests).find(c=>c.fullFilePath===r);if(a){await Qae({momenticFiles:e,test:a,state:n});return}let s=Object.values(e.mobileModules).find(c=>c.fullFilePath===r);if(s){await ese({momenticFiles:e,module:s,state:n});return}let l=e.metadataParseFailures.find(c=>c.fullPath===r);if(l){nse({failure:l,state:n});return}N.error(`File '${o}' is not a recognized Momentic mobile test or module. Check the 'include' globs in your momentic.config.yaml.`),n.totalErrors++;}async function Qae({momenticFiles:t,test:e,state:o}){if(e.type!==Pe.MOBILE_TEST_V2)return;tse({kind:"test",name:e.name,relativePath:e.relativePath,id:e.id,state:o});let{parsed:n}=ca(e.fullFilePath);try{let r=vc.parse(n),i=mp(r.platform);await mw({testV2:r,platform:i,fileResolver:vd({sourceFilePath:e.fullFilePath,momenticFiles:{mobileModules:t.mobileModules}})});}catch(r){ose({err:r,kind:"test",relativePath:e.relativePath,state:o});}}async function ese({momenticFiles:t,module:e,state:o}){if(e.type!==Pe.MOBILE_MODULE_V2)return;tse({kind:"module",name:e.name,relativePath:e.relativePath,id:e.id,state:o});let{parsed:n}=ca(e.fullFilePath);try{pw({moduleV2:n,moduleName:e.name,fileResolver:vd({sourceFilePath:e.fullFilePath,momenticFiles:{mobileModules:t.mobileModules}})});}catch(r){ose({err:r,kind:"module",relativePath:e.relativePath,state:o});}}function tse({kind:t,name:e,relativePath:o,id:n,state:r}){if(cn.safeParse(n).success)return;let i=t==="test"?"Mobile test":"Mobile module";N.error(`${i} '${e}' (${o}) has an invalid ID: '${n}'. IDs must be kebab-case or a UUID, up to 36 characters.`),qB(r,t,o);}function ose({err:t,kind:e,relativePath:o,state:n}){if(qB(n,e,o),n.parsingErrors++,!xC(t,o,n.parsingErrorDetails)){if(t instanceof z.ZodError){RC(t.issues,o,n.parsingErrorDetails);return}n.parsingErrorDetails.push({file:o,field:"",issue:J(t)});}}function nse({failure:t,state:e}){qB(e,t.kind,t.relativePath),e.parsingErrors++,RC(t.issues,t.relativePath,e.parsingErrorDetails);}function r3e({momenticFiles:t,state:e}){let o=new Set(Object.values(t.mobileModules).map(r=>r.fullFilePath)),n=new Set(Object.values(t.mobileTests).map(r=>r.fullFilePath));for(let[r,i]of Object.entries(t.duplicateEntities)){let a=i.filter(s=>o.has(s)||n.has(s));if(!(a.length<2)){N.error(`Duplicate ID '${r}' found in the following mobile files:
6290
6290
  ${a.map(s=>` - ${s}`).join(`
6291
- `)}`),e.totalErrors++;for(let s of a){let l=Oo__default.relative(t.project.rootDir,s);o.has(s)?e.failedModuleFilePaths.add(l):e.failedTestFilePaths.add(l);}}}}function i3e({momenticFiles:t,state:e}){for(let[o,n]of Object.entries(t.mobileTests)){let r=t.mobileModules[o];r&&(N.error(`ID '${o}' is shared between mobile test '${n.relativePath}' and mobile module '${r.relativePath}'. Test and module IDs must be unique across the entire project.`),e.totalErrors++,e.failedTestFilePaths.add(n.relativePath),e.failedModuleFilePaths.add(r.relativePath));}}async function rse({project:t,filePath:e}){let{totalErrors:o,parsingErrors:n,parsingErrorDetails:r,failedTestFilePaths:i,failedModuleFilePaths:a}=await Zae({project:t,filePath:e});if(o===0){N.success("Mobile lint passed. No issues found.");return}r.length>0&&MC({parsingErrors:n,parsingErrorDetails:r,failedTestFilePaths:i,failedModuleFilePaths:a,rootDir:t.rootDir}),N.error(`Found ${o} mobile lint error${o===1?"":"s"} in project.`),process.exit(1);}async function KB({project:t}){if(t.config.fileFormat==="v2"){let{totalErrors:r,parsingErrors:i,parsingErrorDetails:a,failedTestFilePaths:s,failedModuleFilePaths:l}=await Zae({project:t});i>0&&(MC({parsingErrors:i,parsingErrorDetails:a,failedTestFilePaths:s,failedModuleFilePaths:l,rootDir:t.rootDir}),process.exit(1)),r>0&&(N.error(`Found ${r} lint errors`),N.warn("Run 'npx momentic-mobile lint' for details"),process.exit(1));return}let{parsingErrors:e,parsingErrorDetails:o,failedTestFilePaths:n}=await Jae({project:t,logger:N});e>0&&(MC({parsingErrors:e,parsingErrorDetails:o,failedTestFilePaths:n,rootDir:t.rootDir}),process.exit(1));}var l3e=createRequire(import.meta.url),c3e=z.object({engines:z.object({node:z.string()})});function ise(){let{engines:t}=c3e.parse(l3e("appium/package.json"));if(!Ll.satisfies(process.version,t.node))throw new Ye(`Unsupported Node.js version ${process.version}. Momentic Mobile requires Node.js ${t.node}. Switch to a supported version and try again.`)}async function JB({tests:t,momenticFiles:e,project:o,yes:n,include:r,exclude:i,labels:a,logger:s,quarantinedTestsMetadata:l}){let c=new Set;if(t&&t.length>0){let d=t.some(p=>Bn__default.existsSync(p)),m=cwd();d?(m!==o.rootDir&&s.warn(`Test paths resolve against the current directory ('${m}'), not the project root ('${o.rootDir}'). Run from the project root or use substring filters to avoid surprises.`),t.forEach(p=>{if(!Bn__default.existsSync(p))throw new Error(`Path '${p}' does not exist.`);let f,h;try{f=Bn__default.statSync(p),h=f.isDirectory();}catch(b){s.warn({err:b},`Skipping path ${p} because it cannot be read`);return}let g=Oo__default.resolve(p);Object.values(e.mobileTests).filter(b=>h?b.fullFilePath.startsWith(g):b.fullFilePath===g).forEach(b=>{c.add(b.fullFilePath);});})):Object.values(e.mobileTests).forEach(p=>{t.some(f=>p.relativePath.includes(f))&&c.add(p.fullFilePath);});}else !n&&!await Cc("No test paths or substrings were provided. Do you want to run all tests?")&&(s.error("Cancelled by user."),process.exit(1)),Object.values(e.mobileTests).forEach(m=>{c.add(m.fullFilePath);});for(let d of Array.from(c)){let m=Oo__default.relative(o.rootDir,d);r&&!r.some(p=>new RegExp(p).test(m))&&c.delete(d),i&&i.some(p=>new RegExp(p).test(m))&&c.delete(d);}return (await Promise.all(Array.from(c).map(async d=>{try{let m=Oo__default.relative(o.rootDir,d),p=await Po(d,s,e),f=Oo__default.basename(d,".test.yaml");if(p.disabled)return null;if(a&&a.length>0){let g=p.labels||[];if(!a.some(y=>g.includes(y)))return null}let h={id:p.id,name:f,description:p.description,schemaVersion:p.schemaVersion,settings:p.settings,fullFilePath:d,relativeFilePath:m,quarantined:!!l[p.id],quarantinedMetadata:l[p.id],labels:p.labels};switch(p.platform){case "ANDROID":return {...h,platform:"ANDROID",steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps};case "IOS":return {...h,platform:"IOS",steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps};default:return (b=>{throw new Error("You missed a case in the switch above")})(p)}}catch(m){s.error(`Failed to read and resolve mobile test at '${d}': ${m}`),process.exit(1);}}))).filter(d=>!!d)}function ase({testDefinitions:t,quarantinedTestsMetadata:e,onlyQuarantined:o=false,skipQuarantined:n=false}){let[r,i]=partition(t,a=>a.id in e);return {quarantinedTestsToSkip:n?r:[],testsToRun:o?[]:i,quarantinedTestsToRun:n?[]:r}}var sse=()=>process.exit(130),lse=()=>process.exit(143);process.on("SIGINT",sse);process.on("SIGTERM",lse);function cse(){process.off("SIGINT",sse),process.off("SIGTERM",lse);}async function ZB({project:t,apiClient:e,gitMetadata:o,orgId:n,dryRun:r=false}){let i=await _t(t),a=Object.values(i.mobileTests).filter(f=>f.type===Pe.MOBILE_TEST),s=Object.values(i.mobileModules).filter(f=>f.type===Pe.MOBILE_MODULE),l=Object.values(i.mobileTests).filter(f=>f.type===Pe.MOBILE_TEST_V2).length,c=Object.values(i.mobileModules).filter(f=>f.type===Pe.MOBILE_MODULE_V2).length,u={...UN(),alreadyV2TestCount:l,alreadyV2ModuleCount:c},d=t.config.fileFormat!=="v2",{v2ProjectConfig:m,migratedFilePaths:p}=I6(t);return !r&&a.length>0&&await f3e({legacyMobileTests:a,momenticFiles:i,project:t,apiClient:e,gitMetadata:o,orgId:n}),await Fz({dryRun:r,operation:()=>p3e({legacyMobileModules:s,legacyMobileTests:a,momenticFiles:i,project:t,v2ProjectConfig:m,migratedFilePaths:p,summary:u,fileFormatChanged:d,dryRun:r})}),u}async function p3e({legacyMobileModules:t,legacyMobileTests:e,momenticFiles:o,project:n,v2ProjectConfig:r,migratedFilePaths:i,summary:a,fileFormatChanged:s,dryRun:l}){await h3e({legacyMobileModules:t,momenticFiles:o,project:n,v2ProjectConfig:r,migratedFilePaths:i,summary:a,dryRun:l}),await y3e({legacyMobileTests:e,momenticFiles:o,project:n,v2ProjectConfig:r,migratedFilePaths:i,summary:a,dryRun:l});let c=a.migratedTestPaths.length>0||a.migratedModulePaths.length>0;!l&&(s||c)&&FN({project:n,newProjectConfig:r,fileFormatLabel:"v2",migratedFilePaths:i});}async function use({project:t,apiClient:e,gitMetadata:o}){let{legacyProjectConfig:n,migratedFilePaths:r}=_6(t),i=await _t(t),a=Object.values(i.mobileTests).filter(c=>c.type===Pe.MOBILE_TEST_V2),s=Object.values(i.mobileModules).filter(c=>c.type===Pe.MOBILE_MODULE_V2);N.info(`Migrating ${a.length} simplified format mobile tests and ${s.length} simplified format mobile modules to legacy YAML`);let l=new Set;await g3e({v2MobileTests:a,momenticFiles:i,project:t,legacyProjectConfig:n,migratedFilePaths:r,apiClient:e,gitMetadata:o,modulesCoveredByTests:l}),await b3e({v2MobileModules:s,momenticFiles:i,project:t,legacyProjectConfig:n,migratedFilePaths:r,modulesCoveredByTests:l}),FN({project:t,newProjectConfig:n,fileFormatLabel:"legacy",migratedFilePaths:r});}async function f3e({legacyMobileTests:t,momenticFiles:e,project:o,apiClient:n,gitMetadata:r,orgId:i}){if(t.length===0)return;let a={logger:N,orgId:i,client:n,regenerateCache:false,alwaysSaveCache:true,noCache:false,isolateCachesByEnvironment:o.config.advanced?.isolateCachesByEnvironment??false,bustOldestCachePercentage:void 0},s=[wn({...a,gitMetadata:r})];r.gitMainBranch&&r.gitBranchName!==r.gitMainBranch&&s.push(wn({...a,gitMetadata:{...r,gitBranchName:r.gitMainBranch,gitCommitTimestamp:r.lastCommitOnMainTimestamp??r.gitCommitTimestamp}})),N.info(`Pushing mobile test snapshots for ${t.length} legacy mobile tests so existing step caches survive the simplified format conversion`),await gf(t,hf,async l=>{let c=await Po(l.fullFilePath,N,e),{snapshotCachesToSave:u}=await Gn({platform:c.platform,stepLists:{steps:c.steps,beforeSteps:c.beforeSteps,afterSteps:c.afterSteps},useSnapshotIdentityCache:true,cacheCreationParams:{orgId:i,testId:c.id,environment:void 0}});for(let d of s)await d.saveSnapshotCacheEntries({logger:N,platform:c.platform,entries:u});N.dimmed(`Pushed mobile test snapshot for: ${l.relativePath}`);});}async function h3e({legacyMobileModules:t,momenticFiles:e,project:o,v2ProjectConfig:n,migratedFilePaths:r,summary:i,dryRun:a}){await gf(t,hf,async s=>{let l=Fc(s.fullFilePath,N);if(ty(l))throw new Error(`Expected a legacy mobile module while migrating '${s.relativePath}', but found the simplified format`);let c=Bc({module:l,moduleFilePath:s.fullFilePath,momenticFiles:e}),u=Es.parse(c),d={...u,name:c.name??s.name,steps:Na(u.platform).array().parse(c.steps)};a||ks({content:d,schemaVersion:Ro,momenticFiles:e,project:{...o,config:n},forceSaveOnNoDiffs:true}),r.push(s.fullFilePath),i.migratedModulePaths.push(s.fullFilePath),N.dimmed(` + ${s.relativePath}`);});}async function g3e({v2MobileTests:t,momenticFiles:e,project:o,legacyProjectConfig:n,migratedFilePaths:r,apiClient:i,gitMetadata:a,modulesCoveredByTests:s}){await gf(t,hf,async l=>{let c=await Po(l.fullFilePath,N,e),u=await T3e({platform:c.platform,stepLists:{steps:c.steps,beforeSteps:c.beforeSteps,afterSteps:c.afterSteps},apiClient:i,gitMetadata:a,testId:c.id,environment:void 0,missingSnapshotMessage:`Could not restore legacy step ids for '${l.fullFilePath}' because no mobile snapshot cache was found for test '${c.id}'. Run the simplified format migration before undoing it.`}),{moduleUpdates:d}=await Gn({platform:c.platform,stepLists:u});for(let m of d)s.add(m.moduleId);await Pl({platform:c.platform,filePath:l.fullFilePath,steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps,settings:c.settings,labels:c.labels,folder:o.rootDir,project:{...o,config:n},momenticFiles:e,schemaVersion:Ro,forceFileFormat:"v1"}),r.push(l.fullFilePath),N.dimmed(`Migrated simplified format mobile test to legacy: ${l.relativePath}`);});}async function b3e({v2MobileModules:t,momenticFiles:e,project:o,legacyProjectConfig:n,migratedFilePaths:r,modulesCoveredByTests:i}){await gf(t,hf,async a=>{if(i.has(a.id)){r.push(a.fullFilePath);return}let s=Fc(a.fullFilePath,N),l=Bc({module:s,moduleFilePath:a.fullFilePath,momenticFiles:e}),c=Es.parse(l),u={...c,name:l.name??a.name,steps:Na(c.platform).array().parse(l.steps)};ks({content:u,schemaVersion:Ro,momenticFiles:e,project:{...o,config:n},forceSaveOnNoDiffs:true,forceFileFormat:"v1"}),r.push(a.fullFilePath),N.dimmed(`Migrated unreferenced simplified format mobile module to legacy: ${a.relativePath}`);});}async function y3e({legacyMobileTests:t,momenticFiles:e,project:o,v2ProjectConfig:n,migratedFilePaths:r,summary:i,dryRun:a}){await gf(t,hf,async s=>{let l=await Po(s.fullFilePath,N,e);a||await Pl({platform:l.platform,filePath:s.fullFilePath,steps:l.steps,beforeSteps:l.beforeSteps,afterSteps:l.afterSteps,settings:l.settings,labels:l.labels,folder:o.rootDir,project:{...o,config:n},momenticFiles:e,schemaVersion:Ro}),r.push(s.fullFilePath),i.migratedTestPaths.push(s.fullFilePath),N.dimmed(` + ${s.relativePath}`);});}async function S3e({apiClient:t,gitMetadata:e,testId:o,platform:n,environment:r}){let i=await t.getSnapshotCacheForTest({testId:o,environment:r,platform:n==="ANDROID"?"android":"ios"},td(e));return ow({entries:i,logger:N})}async function T3e({platform:t,stepLists:e,apiClient:o,gitMetadata:n,testId:r,environment:i,missingSnapshotMessage:a}){let s=await S3e({apiClient:o,gitMetadata:n,testId:r,platform:t,environment:i});s.testStepLists||N.warn(`${a} Minting fresh legacy ids.`);let l=nw({currentStepLists:e,previousSnapshots:s,generateUuid:randomUUID});return l.stats.mintedSteps>0&&N.warn(`Restored legacy mobile YAML with ${l.stats.mintedSteps} newly generated step ids because some steps did not match the snapshot cache.`),l.stepLists}var dse=58890;function dm(t){let e=parseInt(t,10);if(isNaN(e))throw new InvalidArgumentError("Not a number.");return e}function C3e(t){if(t.toUpperCase()==="AUTO")return "AUTO";let e=Number(t);if(isNaN(e))throw new InvalidArgumentError("Not a number or AUTO.");if(!Number.isInteger(e))throw new InvalidArgumentError("Not a number or AUTO.");if(e<=0)throw new InvalidArgumentError("Not a number or AUTO.");return e}var mse=new Option("--port <port>",`Port to run the local app on. Defaults to ${dse}.`).env("PORT").default(dse).argParser(dm),Vi=new Option("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").default(Gw(),"value from ~/.momentic/auth.json").argParser(t=>{if(!t)throw new InvalidArgumentError("API key is required. Run `npx @momentic/wizard@latest login` or set MOMENTIC_API_KEY.");return t}).makeOptionMandatory(),Yl=new Option("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),UM=new Option("-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."),gi=new Option("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default(qw()??"https://api.momentic.ai").argParser(t=>{try{return z.url().parse(t),t}catch{throw new InvalidArgumentError("Not a valid URL.")}}),lT=new Option("-y, --yes","Skip all confirmation prompts.").env("CI"),QB=new Option("--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."),zM=new Option("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on protected branches.").env("CI"),$M=new Option("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes.").implies({saveCache:false});function VM(t){return e=>{let o=e.trim();if(o==="")throw new InvalidArgumentError(`${t} must be a non-empty string (whitespace is not allowed).`);return o}}var eU=new Option("--tag <tag>","Tag identifier for the asset.").argParser(VM("--tag")),tU=new Option("--channel <channel>","Channel name for the asset.").argParser(VM("--channel")),jM=new Option("--channel <channel>","Channel name for the asset.").argParser(VM("--channel")).makeOptionMandatory(),oU=new Option("--tag <tag>","Tag identifier for the asset.").argParser(VM("--tag")).makeOptionMandatory(),nU=new Option("--platform <platform>","Mobile platform for the asset."),pse=new Option("--platform <platform>","Mobile platform for the asset.").makeOptionMandatory(),fse=new Option("--tag-filter <tagFilter>","Case-insensitive substring filter applied to tags when listing a channel."),hse=new Option("--json","Emit machine-readable JSON output instead of a human-readable table.");function HM(t){if(!t)return "ANDROID";switch(t.toLowerCase()){case "android":return "ANDROID";case "ios":return "IOS";default:throw new InvalidArgumentError('Invalid platform. Valid options are "android" and "ios".')}}var gse=new Option("--env <env>","Environment to run all tests in (overrides test-level configuration)."),bse=new Option("--android-home <androidHome>","Path to the Android SDK root. Sets ANDROID_HOME for this command."),yse=new Option("--java-home <javaHome>","Path to the Java home directory. Sets JAVA_HOME for this command."),rU=new Option("--region <region>",`Region to run all tests in (overrides all other configuration). Valid values: ${Object.values(Jg).join(", ")}, ${Object.values(Xg).join(", ")}, ${xi}, ${Object.values(Cs).join(", ")}.`),iU=new Option("--local-avd-id <localAvdId>","Force tests to use a specific local Android Virtual Device (AVD) instead of remote emulators."),aU=new Option("--local-apk-path <localApkPath>","Path to a local APK file to install when running tests with a local emulator. Overrides remote asset configuration."),sU=new Option("--local-ios-device-type <localIosDeviceType>","Force tests to use a specific local iOS device type instead of remote emulators."),lU=new Option("--local-ios-version <localIosVersion>","Target a specific local iOS runtime version (e.g. 26.4). Defaults to the latest installed runtime."),cU=new Option("--local-app-path <localAppPath>","Path to a local app file to install when running tests with a local emulator. Overrides remote asset configuration."),Sse=new Option("-p, --parallel <parallel>",['The number of tests to run in parallel. Defaults to 1. Pass "AUTO" to use the number of tests in the current shard.',"Remote (Limbar) runs: each test gets an independent emulator session; parallelism is safe and any org quota is enforced server-side.","Local Android runs: each parallel test must target a distinct AVD. Running parallel > 1 against the same --local-avd-id will conflict.","Local iOS runs: concurrent Appium instances share a driver manifest and may race on startup; prefer parallel=1 for local iOS."].join(" ")).argParser(C3e),Tse=new Option("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(t=>{let e=dm(t);if(e<1)throw new InvalidArgumentError("Shard index must be greater than 0.");return e}),Ese=new Option("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(dm),uU=new Option("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),dU=new Option("--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."),mU=new Option("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),vse=new Option("--upload-results","Upload test results to the Momentic dashboard.").default(false),Cse=new Option("--share-diagnostics","Share local run diagnostics (OpenTelemetry traces) with Momentic to help diagnose performance issues.").env("MOMENTIC_SHARE_DIAGNOSTICS"),w3e=["true","false","on-fail"],wse=new Option("--video [value]","Record video of mobile test runs. By default, video is recorded but kept only for failing tests (on-fail). Use the bare flag or pass true, false, or on-fail.").choices(w3e),pU=new Option("--log-level <logLevel>","Log level for Momentic and dependent services.").choices(["error","warn","info","debug"]),Ase=new Option("--skip-quarantined","Skip quarantined tests entirely.").implies({onlyQuarantined:false,ignoreQuarantine:false}),Rse=new Option("--only-quarantined","Run only tests that are currently quarantined. When running with this option, any test failures will cause the pipeline to fail, even though the tests are quarantined.").implies({skipQuarantined:false,ignoreQuarantine:false}),xse=new Option("--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:false,onlyQuarantined:false}),Mse=new Option("--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(dm),Pse=new Option("--reporter <reporter>","Output reporter. Live: list (default). File: "+Jw.join(", ")+". File reporters write to --reporter-dir. Pass --reporter multiple times to combine reporters.").default([]).argParser(g6),Ise=new Option("--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"),_se=new Option("--name <name>","A name to associate with this run for easier identification in the Momentic dashboard."),Ose=new Option("--session-idle-timeout-minutes <timeoutMinutes>","Session idle timeout in minutes. When set, MCP sessions that remain idle for this duration will be automatically terminated. Defaults to 5 minutes.").env("MOMENTIC_SESSION_IDLE_TIMEOUT_MINUTES").argParser(dm),Dse=new Option("--headful [headful]","Launch mobile MCP remote control browsers headfully by default.").argParser(c_),Nse=new Option("--supports-file-output [supportsFileOutput]","Allow MCP tool responses to include file output references.").argParser(c_),Lse=new Option("--daemon","Keep session tools alive across MCP stdio calls by routing through a local daemon. Sets the daemon cwd to the directory of the config file, allowing multiple MCP servers to share the same project home."),kse=new Argument("[results]",`Path to the results archive. Defaults to "${iy}".`).default(iy);var Fh="screen-recording.mp4";var Fse={...Gl,prepareRunParams:async({runTracer:t,metadata:{orgId:e},fixtures:{logger:o,apiClient:n,mobileGenerator:r,storage:i,cacheStorage:a,usageTracker:s,browserEnricher:l,browserGenerator:c,localCodeEvalTools:u},inputs:{channel:d,tag:m,project:p,testDefinition:f},env:{envName:h,envVariables:g},settings:{emulatorSettings:b,aiSettings:y},options:{logLevel:T,localAvdId:v,localApkPath:E,region:P,updateGoldenFiles:M},registerCleanup:I})=>{let A=false,k=[()=>u.dispose()],_=async()=>{A=true;for(let B of k.toReversed())try{await B();}catch(z){Y.warn({err:z},"Failed to run cleanup function");}await s.flush(o);};I?.(async()=>_());let H=bc.optional().parse(P??b.region),V=H==="local",j;if(V){let{avdId:B,apkFilePath:z,apkFilePathSource:q}=rp({overrideAvdId:v,overrideApkFilePath:E,emulatorSettings:b,defaultApkFilePath:f.settings?.defaultApkFilePath,envVariables:g}),Q=Cf({apkFilePath:z,source:q});if(!B)throw new Vn(`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 ${nc} key on the environment.`);j={avdId:B,apkFilePath:Q};}else j={region:H===xi?void 0:H,apkToInstall:d?{channel:d,tag:m}:void 0,osVersion:b.remoteEmulatorSettings?.androidVersion??Jm};let le=randomUUID(),Y=o.child({runAttemptId:le}),L=await We({name:"mobile-cli.driver_setup",attributes:{"momentic.platform":"ANDROID","momentic.test_id":f.id},fn:async()=>vf({apiClient:n,logger:o,driverLogLevel:T,creationOpts:j,emulatorSettings:b,callbacks:{onStatusUpdate:B=>{o.debug({status:B},"Emulator status update");},onHeartbeatFailure:()=>{A||N.warn("Appium heartbeat connection lost. Possible ADB tunnel/emulator failure.");},onHeartbeatRestored:()=>{N.info("Appium heartbeat connection restored.");},onLimbarConnectionStateChange:B=>{B==="disconnected"?A||N.warn("Emulator websocket connection lost. Emulator may be unavailable."):(B==="reconnecting"||B==="connecting")&&N.info("Emulator websocket is reconnecting.");}},orgId:e,sessionId:le})});k.push(()=>L.cleanup());let U="limbarRegion"in L?L.limbarRegion:void 0,x="limbarTag"in L?L.limbarTag:void 0,X="limbarOsVersion"in L?L.limbarOsVersion:void 0;try{let B=await t.startAttempt({emulatorName:L.emulatorName,runAttemptId:le,assetDetails:{avdId:Ju in j?j.avdId:void 0,osVersion:X,tag:x??("apkToInstall"in j?j.apkToInstall?.tag:void 0),channel:"apkToInstall"in j?j.apkToInstall?.channel:void 0,region:U??H??xi}});Y=Y.child(B.loggerBindings||{});let z=await L.driver.executeInNativeContext(Y,async it=>pA({driver:it,onLogs:kt=>{B.appendLogs(kt);}}),{operationName:"startLogcatListener"});k.push(()=>z());let q=new ta({variablesFromEnvironment:g,envName:h,testName:f.name}),Q="limbarClient"in L?L.limbarClient:void 0,Me="playwrightDevice"in L?L.playwrightDevice:void 0,rt=await vu.init({driver:L.driver,generator:r,logger:Y,limbarClient:Q,playwrightDevice:Me,orgId:e,adbPort:L.adbPort,options:{emulator:{...b,browserSettings:p.config.browser}},aiSettings:y,fixtures:{storage:i,browserEnricher:l,browserGenerator:c,localCodeEvalTools:u,testContext:q,visualDiffGoldenStorage:new Vs({baseDir:p.rootDir,updateGoldenFiles:M})}});if(k.push(()=>rt.cleanup()),B.videoOutputPath&&Q)try{await Q.startRecording({quality:RecordingQuality$1.Q5}),B.setActiveVideo(Fh,new Date),Y.info("Started Android video recording"),k.push(async()=>{if(!B.videoOutputPath)return;let it=Oo__default.join(B.videoOutputPath,Fh);await Q.stopRecording({localPath:it}),Y.info({videoPath:it},"Saved Android video recording");});}catch(it){Y.warn({err:it},"Failed to start Android video recording");}return {platform:"ANDROID",envName:h,tracer:B,runAttemptId:le,fixtures:{controller:rt,logger:Y,cacheStorage:a,usageTracker:s},work:{state:{failureRecoveryDisabled:y.failureRecovery===!1,failureRecoveryAttempts:0}},inputs:{testName:f.name,steps:f.steps,beforeSteps:f.beforeSteps,afterSteps:f.afterSteps,orgId:e,testMetadata:f,useSnapshotIdentityCache:!1},callbacks:{},cleanup:_}}catch(B){throw await _(),B}}};var Bse={...ql,prepareRunParams:async({runTracer:t,metadata:{orgId:e},fixtures:{logger:o,apiClient:n,mobileGenerator:r,storage:i,cacheStorage:a,usageTracker:s,browserEnricher:l,browserGenerator:c,localCodeEvalTools:u},inputs:{channel:d,tag:m,project:p,testDefinition:f},env:{envName:h,envVariables:g},settings:{emulatorSettings:b,aiSettings:y},options:{logLevel:T,region:v,localIosDeviceType:E,localIosVersion:P,localAppPath:M,updateGoldenFiles:I},registerCleanup:A})=>{let k=false,_=[()=>u.dispose()],H=async()=>{k=true;for(let B of _.toReversed())try{await B();}catch(z){L.warn({err:z},"Failed to run cleanup function");}await s.flush(o);};A?.(async()=>H());let V=bc.optional().parse(v??b.region),j;if(V==="local"){let{deviceType:B,iosVersion:z,appFilePath:q,appFilePathSource:Q}=ip({overrideDeviceType:E,overrideIosVersion:P,overrideAppFilePath:M,emulatorSettings:b,defaultAppFilePath:f.settings?.defaultAppFilePath,envVariables:g});if(!B)throw new Vn(`A device type is required when using a local region. Provide --local-ios-device-type, configure a default local iOS device type on the test's settings, or set the ${rc} key on the environment.`);let Me=Ch({appFolderPath:q,source:Q});j={type:"local",deviceType:B,iosVersion:z,appFilePath:Me};}else j={type:"remote",region:V===xi?void 0:V,appToInstall:d?{channel:d,tag:m}:void 0,osVersion:Zm};let Y=randomUUID(),L=o.child({runAttemptId:Y}),U=await We({name:"mobile-cli.driver_setup",attributes:{"momentic.platform":"IOS","momentic.test_id":f.id},fn:async()=>fh({apiClient:n,logger:o,driverLogLevel:T,creationOpts:j,emulatorSettings:b,callbacks:{onStatusUpdate:B=>{o.debug({status:B},"Emulator status update");},onHeartbeatFailure:()=>{k||N.warn("Appium heartbeat connection lost. Possible emulator failure.");},onHeartbeatRestored:()=>{N.info("Appium heartbeat connection restored.");},onLimbarConnectionStateChange:B=>{B==="disconnected"?k||N.warn("Emulator websocket connection lost. Emulator may be unavailable."):(B==="reconnecting"||B==="connecting")&&N.info("Emulator websocket is reconnecting.");}},orgId:e,sessionId:Y})});_.push(()=>U.cleanup());let x=U.limbarParams?.region,X=U.limbarParams?.tag;try{let B=await t.startAttempt({emulatorName:U.emulator.name,runAttemptId:Y,assetDetails:{region:x??V??xi,osVersion:U.limbarParams?.osVersion,tag:X??(j.type==="remote"?j.appToInstall?.tag:void 0),channel:j.type==="remote"?j.appToInstall?.channel:void 0}});L=L.child(B.loggerBindings||{});let z=await Wx({emulator:U.emulator,onLogs:rt=>{B.appendLogs(rt);}});z&&_.push(async()=>z());let q=new ta({variablesFromEnvironment:g,envName:h,testName:f.name}),Q=await wu.init({driver:U.driver,generator:r,logger:L,emulator:U.emulator,orgId:e,options:{emulator:{...b,browserSettings:p.config.browser}},aiSettings:y,fixtures:{storage:i,browserEnricher:l,browserGenerator:c,localCodeEvalTools:u,testContext:q,visualDiffGoldenStorage:new Vs({baseDir:p.rootDir,updateGoldenFiles:I})}});_.push(()=>Q?.cleanup());let Me=U.emulator;if(B.videoOutputPath&&Me.startScreenRecording&&Me.stopScreenRecording)try{await Me.startScreenRecording(),B.setActiveVideo(Fh,new Date),L.info("Started iOS video recording"),_.push(async()=>{if(!B.videoOutputPath||!Me.stopScreenRecording)return;let rt=Oo__default.join(B.videoOutputPath,Fh);await Me.stopScreenRecording(rt),L.info({videoPath:rt},"Saved iOS video recording");});}catch(rt){L.warn({err:rt},"Failed to start iOS video recording");}return {platform:"IOS",envName:h,tracer:B,runAttemptId:Y,fixtures:{controller:Q,logger:L,cacheStorage:a,usageTracker:s},work:{state:{failureRecoveryDisabled:y.failureRecovery===!1,failureRecoveryAttempts:0}},inputs:{testName:f.name,steps:f.steps,beforeSteps:f.beforeSteps,afterSteps:f.afterSteps,orgId:e,testMetadata:f,useSnapshotIdentityCache:!1},callbacks:{},cleanup:H}}catch(B){throw await H(),B}}};var _r="1.4.5",{checkCLIVersion:WM}=M6({packageName:"momentic-mobile",currentVersion:_r,changelogUrl:"https://github.com/momentic-ai/mobile-cli/releases",updateCommand:"npx momentic-mobile@latest upgrade"});var hU=class{constructor(e,o,n,r,i,a,s){this.keepalive=e;this.testId=o;this.testName=n;this.platform=r;this.diskStorage=i;this.parentTracer=a;this.orgId=s;this.interactionTracer=new ha(void 0,l=>this.storeTraceAsset(l)),Ar.initializeRootTracerContext(this.interactionTracer);}children=[];finished=false;interactionTracer;getParentStepIdChain(){return []}recordStepDuration(e){let{durationMs:o,step:n}=e;if(!dv(n))return;let r=uv(n);Qe.distribution("test_mobile_step_duration",o,[`type:${r}`,`platform:${this.platform.toLowerCase()}`,"executor:cli",`orgId:${this.orgId}`]);}attachBeforeScreenshot(e){let{snapshotId:o,screenshot:n}=e;this.diskStorage.storeFile({name:`${ra}/${o}.png`,contents:n});}attachAfterScreenshot(e){let{snapshotId:o,screenshot:n}=e;this.diskStorage.storeFile({name:`${ra}/${o}.png`,contents:n});}storeTraceAsset(e){let{snapshotId:o,data:n,extension:r}=e;this.diskStorage.storeFile({name:`${ra}/${o}.${r??"png"}`,contents:n});}attachBeforeXmlSnapshot(e){let{snapshotId:o,xml:n}=e;this.diskStorage.storeFile({name:`${ra}/${o}.xml`,contents:n});}attachAfterXmlSnapshot(e){let{snapshotId:o,xml:n}=e;this.diskStorage.storeFile({name:`${ra}/${o}.xml`,contents:n});}async finishInternal(e){this.finished||(this.finished=true,this.interactionTracer.finish(),await Promise.all(this.children.map(o=>o.finish({status:Cg(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 Bh(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this.orgId);return this.children.push(e),e}},Bh=class{constructor(e,o,n,r,i,a){this.keepalive=e;this.testId=o;this.testName=n;this.platform=r;this.diskStorage=i;this.orgId=a;}children=[];finished=false;async getScreenshot(e){return this.diskStorage.readFile(`${ra}/${e}.png`)??this.diskStorage.readFile(`${ra}/${e}.jpeg`)}getParentStepIdChain(){return []}async startStep(e){this.keepalive();let o=new hU(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this,this.orgId);return this.children.push(o),o}async finish(e){this.finished||(this.finished=true,await Promise.all(this.children.map(o=>o.finishInternal({status:J1(e.status),finishedAt:e.finishedAt}))));}},gU=class{constructor(e,o,n,r,i,a,s,l,c,u,d){this.keepalive=e;this.testId=o;this.testName=n;this.platform=r;this.runAttemptId=i;this.metadata=a;this.diskStorage=s;this.orgId=l;this.resultSchema=c;this.recordVideo=u;this.assetDetails=d;this.diskStorage.mkdir("assets");let m=r==="IOS"?"assets/logs.syslog":"assets/logs.logcat";this.logStream=this.diskStorage.createFileStream(m),this.resourceUsageStream=this.diskStorage.createFileStream(`${ra}/resource-usage.ndjson`),this.resourceUsageSampler=TG({keepSamples:false,onSample:p=>{this.resourceUsageStream.write(`${JSON.stringify(p)}
6291
+ `)}`),e.totalErrors++;for(let s of a){let l=Oo__default.relative(t.project.rootDir,s);o.has(s)?e.failedModuleFilePaths.add(l):e.failedTestFilePaths.add(l);}}}}function i3e({momenticFiles:t,state:e}){for(let[o,n]of Object.entries(t.mobileTests)){let r=t.mobileModules[o];r&&(N.error(`ID '${o}' is shared between mobile test '${n.relativePath}' and mobile module '${r.relativePath}'. Test and module IDs must be unique across the entire project.`),e.totalErrors++,e.failedTestFilePaths.add(n.relativePath),e.failedModuleFilePaths.add(r.relativePath));}}async function rse({project:t,filePath:e}){let{totalErrors:o,parsingErrors:n,parsingErrorDetails:r,failedTestFilePaths:i,failedModuleFilePaths:a}=await Zae({project:t,filePath:e});if(o===0){N.success("Mobile lint passed. No issues found.");return}r.length>0&&MC({parsingErrors:n,parsingErrorDetails:r,failedTestFilePaths:i,failedModuleFilePaths:a,rootDir:t.rootDir}),N.error(`Found ${o} mobile lint error${o===1?"":"s"} in project.`),process.exit(1);}async function KB({project:t}){if(t.config.fileFormat==="v2"){let{totalErrors:r,parsingErrors:i,parsingErrorDetails:a,failedTestFilePaths:s,failedModuleFilePaths:l}=await Zae({project:t});i>0&&(MC({parsingErrors:i,parsingErrorDetails:a,failedTestFilePaths:s,failedModuleFilePaths:l,rootDir:t.rootDir}),process.exit(1)),r>0&&(N.error(`Found ${r} lint errors`),N.warn("Run 'npx momentic-mobile lint' for details"),process.exit(1));return}let{parsingErrors:e,parsingErrorDetails:o,failedTestFilePaths:n}=await Jae({project:t,logger:N});e>0&&(MC({parsingErrors:e,parsingErrorDetails:o,failedTestFilePaths:n,rootDir:t.rootDir}),process.exit(1));}var l3e=createRequire(import.meta.url),c3e=z.object({engines:z.object({node:z.string()})});function ise(){let{engines:t}=c3e.parse(l3e("appium/package.json"));if(!Ll.satisfies(process.version,t.node))throw new Ye(`Unsupported Node.js version ${process.version}. Momentic Mobile requires Node.js ${t.node}. Switch to a supported version and try again.`)}async function JB({tests:t,momenticFiles:e,project:o,yes:n,include:r,exclude:i,labels:a,logger:s,quarantinedTestsMetadata:l}){let c=new Set;if(t&&t.length>0){let d=t.some(p=>Bn__default.existsSync(p)),m=cwd();d?(m!==o.rootDir&&s.warn(`Test paths resolve against the current directory ('${m}'), not the project root ('${o.rootDir}'). Run from the project root or use substring filters to avoid surprises.`),t.forEach(p=>{if(!Bn__default.existsSync(p))throw new Error(`Path '${p}' does not exist.`);let f,h;try{f=Bn__default.statSync(p),h=f.isDirectory();}catch(b){s.warn({err:b},`Skipping path ${p} because it cannot be read`);return}let g=Oo__default.resolve(p);Object.values(e.mobileTests).filter(b=>h?b.fullFilePath.startsWith(g):b.fullFilePath===g).forEach(b=>{c.add(b.fullFilePath);});})):Object.values(e.mobileTests).forEach(p=>{t.some(f=>p.relativePath.includes(f))&&c.add(p.fullFilePath);});}else !n&&!await Cc("No test paths or substrings were provided. Do you want to run all tests?")&&(s.error("Cancelled by user."),process.exit(1)),Object.values(e.mobileTests).forEach(m=>{c.add(m.fullFilePath);});for(let d of Array.from(c)){let m=Oo__default.relative(o.rootDir,d);r&&!r.some(p=>new RegExp(p).test(m))&&c.delete(d),i&&i.some(p=>new RegExp(p).test(m))&&c.delete(d);}return (await Promise.all(Array.from(c).map(async d=>{try{let m=Oo__default.relative(o.rootDir,d),p=await Po(d,s,e),f=Oo__default.basename(d,".test.yaml");if(p.disabled)return null;if(a&&a.length>0){let g=p.labels||[];if(!a.some(y=>g.includes(y)))return null}let h={id:p.id,name:f,description:p.description,schemaVersion:p.schemaVersion,settings:p.settings,fullFilePath:d,relativeFilePath:m,quarantined:!!l[p.id],quarantinedMetadata:l[p.id],labels:p.labels};switch(p.platform){case "ANDROID":return {...h,platform:"ANDROID",steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps};case "IOS":return {...h,platform:"IOS",steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps};default:return (b=>{throw new Error("You missed a case in the switch above")})(p)}}catch(m){s.error(`Failed to read and resolve mobile test at '${d}': ${m}`),process.exit(1);}}))).filter(d=>!!d)}function ase({testDefinitions:t,quarantinedTestsMetadata:e,onlyQuarantined:o=false,skipQuarantined:n=false}){let[r,i]=partition(t,a=>a.id in e);return {quarantinedTestsToSkip:n?r:[],testsToRun:o?[]:i,quarantinedTestsToRun:n?[]:r}}var sse=()=>process.exit(130),lse=()=>process.exit(143);process.on("SIGINT",sse);process.on("SIGTERM",lse);function cse(){process.off("SIGINT",sse),process.off("SIGTERM",lse);}async function ZB({project:t,apiClient:e,gitMetadata:o,orgId:n,dryRun:r=false}){let i=await _t(t),a=Object.values(i.mobileTests).filter(f=>f.type===Pe.MOBILE_TEST),s=Object.values(i.mobileModules).filter(f=>f.type===Pe.MOBILE_MODULE),l=Object.values(i.mobileTests).filter(f=>f.type===Pe.MOBILE_TEST_V2).length,c=Object.values(i.mobileModules).filter(f=>f.type===Pe.MOBILE_MODULE_V2).length,u={...UN(),alreadyV2TestCount:l,alreadyV2ModuleCount:c},d=t.config.fileFormat!=="v2",{v2ProjectConfig:m,migratedFilePaths:p}=I6(t);return !r&&a.length>0&&await f3e({legacyMobileTests:a,momenticFiles:i,project:t,apiClient:e,gitMetadata:o,orgId:n}),await Fz({dryRun:r,operation:()=>p3e({legacyMobileModules:s,legacyMobileTests:a,momenticFiles:i,project:t,v2ProjectConfig:m,migratedFilePaths:p,summary:u,fileFormatChanged:d,dryRun:r})}),u}async function p3e({legacyMobileModules:t,legacyMobileTests:e,momenticFiles:o,project:n,v2ProjectConfig:r,migratedFilePaths:i,summary:a,fileFormatChanged:s,dryRun:l}){await h3e({legacyMobileModules:t,momenticFiles:o,project:n,v2ProjectConfig:r,migratedFilePaths:i,summary:a,dryRun:l}),await y3e({legacyMobileTests:e,momenticFiles:o,project:n,v2ProjectConfig:r,migratedFilePaths:i,summary:a,dryRun:l});let c=a.migratedTestPaths.length>0||a.migratedModulePaths.length>0;!l&&(s||c)&&FN({project:n,newProjectConfig:r,fileFormatLabel:"v2",migratedFilePaths:i});}async function use({project:t,apiClient:e,gitMetadata:o}){let{legacyProjectConfig:n,migratedFilePaths:r}=_6(t),i=await _t(t),a=Object.values(i.mobileTests).filter(c=>c.type===Pe.MOBILE_TEST_V2),s=Object.values(i.mobileModules).filter(c=>c.type===Pe.MOBILE_MODULE_V2);N.info(`Migrating ${a.length} simplified format mobile tests and ${s.length} simplified format mobile modules to legacy YAML`);let l=new Set;await g3e({v2MobileTests:a,momenticFiles:i,project:t,legacyProjectConfig:n,migratedFilePaths:r,apiClient:e,gitMetadata:o,modulesCoveredByTests:l}),await b3e({v2MobileModules:s,momenticFiles:i,project:t,legacyProjectConfig:n,migratedFilePaths:r,modulesCoveredByTests:l}),FN({project:t,newProjectConfig:n,fileFormatLabel:"legacy",migratedFilePaths:r});}async function f3e({legacyMobileTests:t,momenticFiles:e,project:o,apiClient:n,gitMetadata:r,orgId:i}){if(t.length===0)return;let a={logger:N,orgId:i,client:n,regenerateCache:false,alwaysSaveCache:true,noCache:false,isolateCachesByEnvironment:o.config.advanced?.isolateCachesByEnvironment??false,bustOldestCachePercentage:void 0},s=[wn({...a,gitMetadata:r})];r.gitMainBranch&&r.gitBranchName!==r.gitMainBranch&&s.push(wn({...a,gitMetadata:{...r,gitBranchName:r.gitMainBranch,gitCommitTimestamp:r.lastCommitOnMainTimestamp??r.gitCommitTimestamp}})),N.info(`Pushing mobile test snapshots for ${t.length} legacy mobile tests so existing step caches survive the simplified format conversion`),await gf(t,hf,async l=>{let c=await Po(l.fullFilePath,N,e),{snapshotCachesToSave:u}=await Gn({platform:c.platform,stepLists:{steps:c.steps,beforeSteps:c.beforeSteps,afterSteps:c.afterSteps},useSnapshotIdentityCache:true,cacheCreationParams:{orgId:i,testId:c.id,environment:void 0}});for(let d of s)await d.saveSnapshotCacheEntries({logger:N,platform:c.platform,entries:u});N.dimmed(`Pushed mobile test snapshot for: ${l.relativePath}`);});}async function h3e({legacyMobileModules:t,momenticFiles:e,project:o,v2ProjectConfig:n,migratedFilePaths:r,summary:i,dryRun:a}){await gf(t,hf,async s=>{let l=Fc(s.fullFilePath,N);if(ty(l))throw new Error(`Expected a legacy mobile module while migrating '${s.relativePath}', but found the simplified format`);let c=Bc({module:l,moduleFilePath:s.fullFilePath,momenticFiles:e}),u=Es.parse(c),d={...u,name:c.name??s.name,steps:Na(u.platform).array().parse(c.steps)};a||ks({content:d,schemaVersion:Ro,momenticFiles:e,project:{...o,config:n},forceSaveOnNoDiffs:true}),r.push(s.fullFilePath),i.migratedModulePaths.push(s.fullFilePath),N.dimmed(` + ${s.relativePath}`);});}async function g3e({v2MobileTests:t,momenticFiles:e,project:o,legacyProjectConfig:n,migratedFilePaths:r,apiClient:i,gitMetadata:a,modulesCoveredByTests:s}){await gf(t,hf,async l=>{let c=await Po(l.fullFilePath,N,e),u=await T3e({platform:c.platform,stepLists:{steps:c.steps,beforeSteps:c.beforeSteps,afterSteps:c.afterSteps},apiClient:i,gitMetadata:a,testId:c.id,environment:void 0,missingSnapshotMessage:`Could not restore legacy step ids for '${l.fullFilePath}' because no mobile snapshot cache was found for test '${c.id}'. Run the simplified format migration before undoing it.`}),{moduleUpdates:d}=await Gn({platform:c.platform,stepLists:u});for(let m of d)s.add(m.moduleId);await Pl({platform:c.platform,filePath:l.fullFilePath,steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps,settings:c.settings,labels:c.labels,folder:o.rootDir,project:{...o,config:n},momenticFiles:e,schemaVersion:Ro,forceFileFormat:"v1"}),r.push(l.fullFilePath),N.dimmed(`Migrated simplified format mobile test to legacy: ${l.relativePath}`);});}async function b3e({v2MobileModules:t,momenticFiles:e,project:o,legacyProjectConfig:n,migratedFilePaths:r,modulesCoveredByTests:i}){await gf(t,hf,async a=>{if(i.has(a.id)){r.push(a.fullFilePath);return}let s=Fc(a.fullFilePath,N),l=Bc({module:s,moduleFilePath:a.fullFilePath,momenticFiles:e}),c=Es.parse(l),u={...c,name:l.name??a.name,steps:Na(c.platform).array().parse(l.steps)};ks({content:u,schemaVersion:Ro,momenticFiles:e,project:{...o,config:n},forceSaveOnNoDiffs:true,forceFileFormat:"v1"}),r.push(a.fullFilePath),N.dimmed(`Migrated unreferenced simplified format mobile module to legacy: ${a.relativePath}`);});}async function y3e({legacyMobileTests:t,momenticFiles:e,project:o,v2ProjectConfig:n,migratedFilePaths:r,summary:i,dryRun:a}){await gf(t,hf,async s=>{let l=await Po(s.fullFilePath,N,e);a||await Pl({platform:l.platform,filePath:s.fullFilePath,steps:l.steps,beforeSteps:l.beforeSteps,afterSteps:l.afterSteps,settings:l.settings,labels:l.labels,folder:o.rootDir,project:{...o,config:n},momenticFiles:e,schemaVersion:Ro}),r.push(s.fullFilePath),i.migratedTestPaths.push(s.fullFilePath),N.dimmed(` + ${s.relativePath}`);});}async function S3e({apiClient:t,gitMetadata:e,testId:o,platform:n,environment:r}){let i=await t.getSnapshotCacheForTest({testId:o,environment:r,platform:n==="ANDROID"?"android":"ios"},td(e));return ow({entries:i,logger:N})}async function T3e({platform:t,stepLists:e,apiClient:o,gitMetadata:n,testId:r,environment:i,missingSnapshotMessage:a}){let s=await S3e({apiClient:o,gitMetadata:n,testId:r,platform:t,environment:i});s.testStepLists||N.warn(`${a} Minting fresh legacy ids.`);let l=nw({currentStepLists:e,previousSnapshots:s,generateUuid:randomUUID});return l.stats.mintedSteps>0&&N.warn(`Restored legacy mobile YAML with ${l.stats.mintedSteps} newly generated step ids because some steps did not match the snapshot cache.`),l.stepLists}var dse=58890;function dm(t){let e=parseInt(t,10);if(isNaN(e))throw new InvalidArgumentError("Not a number.");return e}function C3e(t){if(t.toUpperCase()==="AUTO")return "AUTO";let e=Number(t);if(isNaN(e))throw new InvalidArgumentError("Not a number or AUTO.");if(!Number.isInteger(e))throw new InvalidArgumentError("Not a number or AUTO.");if(e<=0)throw new InvalidArgumentError("Not a number or AUTO.");return e}var mse=new Option("--port <port>",`Port to run the local app on. Defaults to ${dse}.`).env("PORT").default(dse).argParser(dm),Vi=new Option("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").default(Gw(),"value from ~/.momentic/auth.json").argParser(t=>{if(!t)throw new InvalidArgumentError("API key is required. Run `npx @momentic/wizard@latest login` or set MOMENTIC_API_KEY.");return t}).makeOptionMandatory(),Yl=new Option("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),UM=new Option("-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."),gi=new Option("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default(qw()??"https://api.momentic.ai").argParser(t=>{try{return z.url().parse(t),t}catch{throw new InvalidArgumentError("Not a valid URL.")}}),lT=new Option("-y, --yes","Skip all confirmation prompts.").env("CI"),QB=new Option("--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."),zM=new Option("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on protected branches.").env("CI"),$M=new Option("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes.").implies({saveCache:false});function VM(t){return e=>{let o=e.trim();if(o==="")throw new InvalidArgumentError(`${t} must be a non-empty string (whitespace is not allowed).`);return o}}var eU=new Option("--tag <tag>","Tag identifier for the asset.").argParser(VM("--tag")),tU=new Option("--channel <channel>","Channel name for the asset.").argParser(VM("--channel")),jM=new Option("--channel <channel>","Channel name for the asset.").argParser(VM("--channel")).makeOptionMandatory(),oU=new Option("--tag <tag>","Tag identifier for the asset.").argParser(VM("--tag")).makeOptionMandatory(),nU=new Option("--platform <platform>","Mobile platform for the asset."),pse=new Option("--platform <platform>","Mobile platform for the asset.").makeOptionMandatory(),fse=new Option("--tag-filter <tagFilter>","Case-insensitive substring filter applied to tags when listing a channel."),hse=new Option("--json","Emit machine-readable JSON output instead of a human-readable table.");function HM(t){if(!t)return "ANDROID";switch(t.toLowerCase()){case "android":return "ANDROID";case "ios":return "IOS";default:throw new InvalidArgumentError('Invalid platform. Valid options are "android" and "ios".')}}var gse=new Option("--env <env>","Environment to run all tests in (overrides test-level configuration)."),bse=new Option("--android-home <androidHome>","Path to the Android SDK root. Sets ANDROID_HOME for this command."),yse=new Option("--java-home <javaHome>","Path to the Java home directory. Sets JAVA_HOME for this command."),rU=new Option("--region <region>",`Region to run all tests in (overrides all other configuration). Valid values: ${Object.values(Jg).join(", ")}, ${Object.values(Xg).join(", ")}, ${xi}, ${Object.values(Cs).join(", ")}.`),iU=new Option("--local-avd-id <localAvdId>","Force tests to use a specific local Android Virtual Device (AVD) instead of remote emulators."),aU=new Option("--local-apk-path <localApkPath>","Path to a local APK file to install when running tests with a local emulator. Overrides remote asset configuration."),sU=new Option("--local-ios-device-type <localIosDeviceType>","Force tests to use a specific local iOS device type instead of remote emulators."),lU=new Option("--local-ios-version <localIosVersion>","Target a specific local iOS runtime version (e.g. 26.4). Defaults to the latest installed runtime."),cU=new Option("--local-app-path <localAppPath>","Path to a local app file to install when running tests with a local emulator. Overrides remote asset configuration."),Sse=new Option("-p, --parallel <parallel>",['The number of tests to run in parallel. Defaults to 1. Pass "AUTO" to use the number of tests in the current shard.',"Remote (Limbar) runs: each test gets an independent emulator session; parallelism is safe and any org quota is enforced server-side.","Local Android runs: each parallel test must target a distinct AVD. Running parallel > 1 against the same --local-avd-id will conflict.","Local iOS runs: concurrent Appium instances share a driver manifest and may race on startup; prefer parallel=1 for local iOS."].join(" ")).argParser(C3e),Tse=new Option("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(t=>{let e=dm(t);if(e<1)throw new InvalidArgumentError("Shard index must be greater than 0.");return e}),Ese=new Option("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(dm),uU=new Option("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),dU=new Option("--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."),mU=new Option("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),vse=new Option("--upload-results","Upload test results to the Momentic dashboard.").default(false),Cse=new Option("--share-diagnostics","Share local run diagnostics (OpenTelemetry traces) with Momentic to help diagnose performance issues.").env("MOMENTIC_SHARE_DIAGNOSTICS"),w3e=["true","false","on-fail"],wse=new Option("--video [value]","Record video of mobile test runs. By default, video is recorded but kept only for failing tests (on-fail). Use the bare flag or pass true, false, or on-fail.").choices(w3e),pU=new Option("--log-level <logLevel>","Log level for Momentic and dependent services.").choices(["error","warn","info","debug"]),Ase=new Option("--skip-quarantined","Skip quarantined tests entirely.").implies({onlyQuarantined:false,ignoreQuarantine:false}),Rse=new Option("--only-quarantined","Run only tests that are currently quarantined. When running with this option, any test failures will cause the pipeline to fail, even though the tests are quarantined.").implies({skipQuarantined:false,ignoreQuarantine:false}),xse=new Option("--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:false,onlyQuarantined:false}),Mse=new Option("--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(dm),Pse=new Option("--reporter <reporter>","Output reporter. Live: list (default). File: "+Jw.join(", ")+". File reporters write to --reporter-dir. Pass --reporter multiple times to combine reporters.").default([]).argParser(g6),Ise=new Option("--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"),_se=new Option("--name <name>","A name to associate with this run for easier identification in the Momentic dashboard."),Ose=new Option("--session-idle-timeout-minutes <timeoutMinutes>","Session idle timeout in minutes. When set, MCP sessions that remain idle for this duration will be automatically terminated. Defaults to 5 minutes.").env("MOMENTIC_SESSION_IDLE_TIMEOUT_MINUTES").argParser(dm),Dse=new Option("--headful [headful]","Launch mobile MCP remote control browsers headfully by default.").argParser(c_),Nse=new Option("--supports-file-output [supportsFileOutput]","Allow MCP tool responses to include file output references.").argParser(c_),Lse=new Option("--daemon","Keep session tools alive across MCP stdio calls by routing through a local daemon. Sets the daemon cwd to the directory of the config file, allowing multiple MCP servers to share the same project home."),kse=new Argument("[results]",`Path to the results archive. Defaults to "${iy}".`).default(iy);var Fh="screen-recording.mp4";var Fse={...Gl,prepareRunParams:async({runTracer:t,metadata:{orgId:e},fixtures:{logger:o,apiClient:n,mobileGenerator:r,storage:i,cacheStorage:a,usageTracker:s,browserEnricher:l,browserGenerator:c,localCodeEvalTools:u},inputs:{channel:d,tag:m,project:p,testDefinition:f},env:{envName:h,envVariables:g},settings:{emulatorSettings:b,aiSettings:y},options:{logLevel:T,localAvdId:v,localApkPath:E,region:P,updateGoldenFiles:M},registerCleanup:I})=>{let A=false,k=[()=>u.dispose()],_=async()=>{A=true;for(let B of k.toReversed())try{await B();}catch(z){Y.warn({err:z},"Failed to run cleanup function");}await s.flush(o);};I?.(async()=>_());let H=bc.optional().parse(P??b.region),V=H==="local",j;if(V){let{avdId:B,apkFilePath:z,apkFilePathSource:q}=rp({overrideAvdId:v,overrideApkFilePath:E,emulatorSettings:b,defaultApkFilePath:f.settings?.defaultApkFilePath,envVariables:g}),Q=Cf({apkFilePath:z,source:q});if(!B)throw new Vn(`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 ${nc} key on the environment.`);j={avdId:B,apkFilePath:Q};}else j={region:H===xi?void 0:H,apkToInstall:d?{channel:d,tag:m}:void 0,osVersion:b.remoteEmulatorSettings?.androidVersion??Jm};let le=randomUUID(),Y=o.child({runAttemptId:le}),L=await We({name:"mobile-cli.driver_setup",attributes:{"momentic.platform":"ANDROID","momentic.test_id":f.id},fn:async()=>vf({apiClient:n,logger:o,driverLogLevel:T,creationOpts:j,emulatorSettings:b,callbacks:{onStatusUpdate:B=>{o.debug({status:B},"Emulator status update");},onHeartbeatFailure:()=>{A||N.warn("Appium heartbeat connection lost. Possible ADB tunnel/emulator failure.");},onHeartbeatRestored:()=>{N.info("Appium heartbeat connection restored.");},onLimbarConnectionStateChange:B=>{B==="disconnected"?A||N.warn("Emulator websocket connection lost. Emulator may be unavailable."):(B==="reconnecting"||B==="connecting")&&N.info("Emulator websocket is reconnecting.");}},orgId:e,sessionId:le})});k.push(()=>L.cleanup());let U="limbarRegion"in L?L.limbarRegion:void 0,x="limbarTag"in L?L.limbarTag:void 0,X="limbarOsVersion"in L?L.limbarOsVersion:void 0;try{let B=await t.startAttempt({emulatorName:L.emulatorName,runAttemptId:le,assetDetails:{avdId:Ju in j?j.avdId:void 0,osVersion:X,tag:x??("apkToInstall"in j?j.apkToInstall?.tag:void 0),channel:"apkToInstall"in j?j.apkToInstall?.channel:void 0,region:U??H??xi}});Y=Y.child(B.loggerBindings||{});let z=await L.driver.executeInNativeContext(Y,async it=>pA({driver:it,onLogs:kt=>{B.appendLogs(kt);}}),{operationName:"startLogcatListener"});k.push(()=>z());let q=new ta({variablesFromEnvironment:g,envName:h,testName:f.name}),Q="limbarClient"in L?L.limbarClient:void 0,Me="playwrightDevice"in L?L.playwrightDevice:void 0,rt=await vu.init({driver:L.driver,generator:r,logger:Y,limbarClient:Q,playwrightDevice:Me,orgId:e,adbPort:L.adbPort,options:{emulator:{...b,browserSettings:p.config.browser}},aiSettings:y,fixtures:{storage:i,browserEnricher:l,browserGenerator:c,localCodeEvalTools:u,testContext:q,visualDiffGoldenStorage:new Vs({baseDir:p.rootDir,updateGoldenFiles:M})}});if(k.push(()=>rt.cleanup()),B.videoOutputPath&&Q)try{await Q.startRecording({quality:RecordingQuality$1.Q5}),B.setActiveVideo(Fh,new Date),Y.info("Started Android video recording"),k.push(async()=>{if(!B.videoOutputPath)return;let it=Oo__default.join(B.videoOutputPath,Fh);await Q.stopRecording({localPath:it}),Y.info({videoPath:it},"Saved Android video recording");});}catch(it){Y.warn({err:it},"Failed to start Android video recording");}return {platform:"ANDROID",envName:h,tracer:B,runAttemptId:le,fixtures:{controller:rt,logger:Y,cacheStorage:a,usageTracker:s},work:{state:{failureRecoveryDisabled:y.failureRecovery===!1,failureRecoveryAttempts:0}},inputs:{testName:f.name,steps:f.steps,beforeSteps:f.beforeSteps,afterSteps:f.afterSteps,orgId:e,testMetadata:f,useSnapshotIdentityCache:!1},callbacks:{},cleanup:_}}catch(B){throw await _(),B}}};var Bse={...ql,prepareRunParams:async({runTracer:t,metadata:{orgId:e},fixtures:{logger:o,apiClient:n,mobileGenerator:r,storage:i,cacheStorage:a,usageTracker:s,browserEnricher:l,browserGenerator:c,localCodeEvalTools:u},inputs:{channel:d,tag:m,project:p,testDefinition:f},env:{envName:h,envVariables:g},settings:{emulatorSettings:b,aiSettings:y},options:{logLevel:T,region:v,localIosDeviceType:E,localIosVersion:P,localAppPath:M,updateGoldenFiles:I},registerCleanup:A})=>{let k=false,_=[()=>u.dispose()],H=async()=>{k=true;for(let B of _.toReversed())try{await B();}catch(z){L.warn({err:z},"Failed to run cleanup function");}await s.flush(o);};A?.(async()=>H());let V=bc.optional().parse(v??b.region),j;if(V==="local"){let{deviceType:B,iosVersion:z,appFilePath:q,appFilePathSource:Q}=ip({overrideDeviceType:E,overrideIosVersion:P,overrideAppFilePath:M,emulatorSettings:b,defaultAppFilePath:f.settings?.defaultAppFilePath,envVariables:g});if(!B)throw new Vn(`A device type is required when using a local region. Provide --local-ios-device-type, configure a default local iOS device type on the test's settings, or set the ${rc} key on the environment.`);let Me=Ch({appFolderPath:q,source:Q});j={type:"local",deviceType:B,iosVersion:z,appFilePath:Me};}else j={type:"remote",region:V===xi?void 0:V,appToInstall:d?{channel:d,tag:m}:void 0,osVersion:Zm};let Y=randomUUID(),L=o.child({runAttemptId:Y}),U=await We({name:"mobile-cli.driver_setup",attributes:{"momentic.platform":"IOS","momentic.test_id":f.id},fn:async()=>fh({apiClient:n,logger:o,driverLogLevel:T,creationOpts:j,emulatorSettings:b,callbacks:{onStatusUpdate:B=>{o.debug({status:B},"Emulator status update");},onHeartbeatFailure:()=>{k||N.warn("Appium heartbeat connection lost. Possible emulator failure.");},onHeartbeatRestored:()=>{N.info("Appium heartbeat connection restored.");},onLimbarConnectionStateChange:B=>{B==="disconnected"?k||N.warn("Emulator websocket connection lost. Emulator may be unavailable."):(B==="reconnecting"||B==="connecting")&&N.info("Emulator websocket is reconnecting.");}},orgId:e,sessionId:Y})});_.push(()=>U.cleanup());let x=U.limbarParams?.region,X=U.limbarParams?.tag;try{let B=await t.startAttempt({emulatorName:U.emulator.name,runAttemptId:Y,assetDetails:{region:x??V??xi,osVersion:U.limbarParams?.osVersion,tag:X??(j.type==="remote"?j.appToInstall?.tag:void 0),channel:j.type==="remote"?j.appToInstall?.channel:void 0}});L=L.child(B.loggerBindings||{});let z=await Wx({emulator:U.emulator,onLogs:rt=>{B.appendLogs(rt);}});z&&_.push(async()=>z());let q=new ta({variablesFromEnvironment:g,envName:h,testName:f.name}),Q=await wu.init({driver:U.driver,generator:r,logger:L,emulator:U.emulator,orgId:e,options:{emulator:{...b,browserSettings:p.config.browser}},aiSettings:y,fixtures:{storage:i,browserEnricher:l,browserGenerator:c,localCodeEvalTools:u,testContext:q,visualDiffGoldenStorage:new Vs({baseDir:p.rootDir,updateGoldenFiles:I})}});_.push(()=>Q?.cleanup());let Me=U.emulator;if(B.videoOutputPath&&Me.startScreenRecording&&Me.stopScreenRecording)try{await Me.startScreenRecording(),B.setActiveVideo(Fh,new Date),L.info("Started iOS video recording"),_.push(async()=>{if(!B.videoOutputPath||!Me.stopScreenRecording)return;let rt=Oo__default.join(B.videoOutputPath,Fh);await Me.stopScreenRecording(rt),L.info({videoPath:rt},"Saved iOS video recording");});}catch(rt){L.warn({err:rt},"Failed to start iOS video recording");}return {platform:"IOS",envName:h,tracer:B,runAttemptId:Y,fixtures:{controller:Q,logger:L,cacheStorage:a,usageTracker:s},work:{state:{failureRecoveryDisabled:y.failureRecovery===!1,failureRecoveryAttempts:0}},inputs:{testName:f.name,steps:f.steps,beforeSteps:f.beforeSteps,afterSteps:f.afterSteps,orgId:e,testMetadata:f,useSnapshotIdentityCache:!1},callbacks:{},cleanup:H}}catch(B){throw await H(),B}}};var _r="1.4.6",{checkCLIVersion:WM}=M6({packageName:"momentic-mobile",currentVersion:_r,changelogUrl:"https://github.com/momentic-ai/mobile-cli/releases",updateCommand:"npx momentic-mobile@latest upgrade"});var hU=class{constructor(e,o,n,r,i,a,s){this.keepalive=e;this.testId=o;this.testName=n;this.platform=r;this.diskStorage=i;this.parentTracer=a;this.orgId=s;this.interactionTracer=new ha(void 0,l=>this.storeTraceAsset(l)),Ar.initializeRootTracerContext(this.interactionTracer);}children=[];finished=false;interactionTracer;getParentStepIdChain(){return []}recordStepDuration(e){let{durationMs:o,step:n}=e;if(!dv(n))return;let r=uv(n);Qe.distribution("test_mobile_step_duration",o,[`type:${r}`,`platform:${this.platform.toLowerCase()}`,"executor:cli",`orgId:${this.orgId}`]);}attachBeforeScreenshot(e){let{snapshotId:o,screenshot:n}=e;this.diskStorage.storeFile({name:`${ra}/${o}.png`,contents:n});}attachAfterScreenshot(e){let{snapshotId:o,screenshot:n}=e;this.diskStorage.storeFile({name:`${ra}/${o}.png`,contents:n});}storeTraceAsset(e){let{snapshotId:o,data:n,extension:r}=e;this.diskStorage.storeFile({name:`${ra}/${o}.${r??"png"}`,contents:n});}attachBeforeXmlSnapshot(e){let{snapshotId:o,xml:n}=e;this.diskStorage.storeFile({name:`${ra}/${o}.xml`,contents:n});}attachAfterXmlSnapshot(e){let{snapshotId:o,xml:n}=e;this.diskStorage.storeFile({name:`${ra}/${o}.xml`,contents:n});}async finishInternal(e){this.finished||(this.finished=true,this.interactionTracer.finish(),await Promise.all(this.children.map(o=>o.finish({status:Cg(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 Bh(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this.orgId);return this.children.push(e),e}},Bh=class{constructor(e,o,n,r,i,a){this.keepalive=e;this.testId=o;this.testName=n;this.platform=r;this.diskStorage=i;this.orgId=a;}children=[];finished=false;async getScreenshot(e){return this.diskStorage.readFile(`${ra}/${e}.png`)??this.diskStorage.readFile(`${ra}/${e}.jpeg`)}getParentStepIdChain(){return []}async startStep(e){this.keepalive();let o=new hU(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this,this.orgId);return this.children.push(o),o}async finish(e){this.finished||(this.finished=true,await Promise.all(this.children.map(o=>o.finishInternal({status:J1(e.status),finishedAt:e.finishedAt}))));}},gU=class{constructor(e,o,n,r,i,a,s,l,c,u,d){this.keepalive=e;this.testId=o;this.testName=n;this.platform=r;this.runAttemptId=i;this.metadata=a;this.diskStorage=s;this.orgId=l;this.resultSchema=c;this.recordVideo=u;this.assetDetails=d;this.diskStorage.mkdir("assets");let m=r==="IOS"?"assets/logs.syslog":"assets/logs.logcat";this.logStream=this.diskStorage.createFileStream(m),this.resourceUsageStream=this.diskStorage.createFileStream(`${ra}/resource-usage.ndjson`),this.resourceUsageSampler=TG({keepSamples:false,onSample:p=>{this.resourceUsageStream.write(`${JSON.stringify(p)}
6292
6292
  `);}});}finished=false;children=[];logStream;resourceUsageStream;resourceUsageSampler;get loggerBindings(){return {runAttemptId:this.runAttemptId}}get videoOutputPath(){if(this.recordVideo)return Oo.resolve(this.diskStorage.cwd(),ra)}appendLogs(e){let o=e.join(`
6293
6293
  `);this.logStream.write(o+`
6294
6294
  `);}setActiveVideo(e,o){this.recordVideo&&(this.metadata.activeVideos=this.metadata.activeVideos||[],this.metadata.activeVideos.push({videoName:e,timestamp:o}));}async finish(e){if(this.finished)return;this.finished=true;let{logger:o,status:n,results:r,beforeResults:i,afterResults:a}=e,s={...this.metadata,status:n,assetDetails:this.assetDetails,finishedAt:new Date,results:eA(r,this.resultSchema,o),beforeResults:i?eA(i,this.resultSchema,o):void 0,afterResults:a?eA(a,this.resultSchema,o):void 0};await Promise.all(this.children.map(l=>l.finish({status:s.status,finishedAt:s.finishedAt})));try{this.logStream.end();}catch{}try{this.resourceUsageSampler.stop(),this.resourceUsageStream.end();}catch{}this.recordVideo==="on-fail"&&n==="PASSED"&&(oK(o,this.videoOutputPath),s.activeVideos=void 0),this.diskStorage.storeFile({name:pn,contents:JSON.stringify(s,null,2)});}async startBeforeStepList(){let e=new Bh(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this.orgId);return this.children.push(e),e}async startMainStepList(){let e=new Bh(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this.orgId);return this.children.push(e),e}async startAfterStepList(){let e=new Bh(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this.orgId);return this.children.push(e),e}async getScreenshot(e,o){return this.diskStorage.readFile(`${ra}/${o}.png`)??this.diskStorage.readFile(`${ra}/${o}.jpeg`)}},bU=class{constructor(e,o,n,r,i,a,s,l,c,u){this.client=e;this.testId=o;this.testName=n;this.platform=r;this.runId=i;this.metadata=a;this.diskStorage=s;this.orgId=l;this.resultSchema=c;this.recordVideo=u;}children=[];finished=false;get loggerBindings(){return {runId:this.runId}}async finish(e){if(this.finished)return;this.finished=true;let o={...this.metadata,finishedAt:e.finishedAt||new Date,status:e.status,failureDetails:e.failureDetails,failureReason:e.failureReason,flake:e.isFlake||false,failureRecoveryDetails:e.failureRecoveryDetails};await Promise.all(this.children.map(n=>n.finish({logger:e.logger,status:o.status,results:[],beforeResults:[],afterResults:[]}))),this.diskStorage.storeFile({name:pn,contents:JSON.stringify(o,null,2)}),this.diskStorage.close();}async startAttempt(e){let{runAttemptId:o}=e;this.metadata.attempts=this.metadata.attempts+1,this.metadata.status="RUNNING",this.diskStorage.storeFile({name:pn,contents:JSON.stringify(this.metadata,null,2)});let n=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),r={id:o,schemaVersion:VT,runAttemptSchemaVersion:oG,startedAt:new Date,status:"RUNNING"};n.storeFile({name:pn,contents:JSON.stringify(r,null,2)});let i=debounce(async()=>{await this.client.extendEmulatorTtl(this.platform,e.emulatorName);},3e4,{maxWait:6e4}),a=new gU(()=>void i(),this.testId,this.testName,this.platform,o,r,n,this.orgId,this.resultSchema,this.recordVideo,e.assetDetails);return this.children.push(a),a}},GM=class t{constructor(e,o,n,r,i,a){this.orgId=e;this.runGroupId=o;this.metadata=n;this.client=r;this.diskStorage=i;this.recordVideo=a;}children=[];finished=false;get loggerBindings(){return {orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start({orgId:e,runGroupId:o,outputDir:n,client:r,gitMetadata:i,labels:a,suiteName:s,recordVideo:l}){let c={...i,suiteName:s&&Ti(s),id:o,trigger:Ei.CLI,startedAt:new Date,status:"RUNNING",cliVersion:_r,labels:a??[]},u=new yy(n);return u.storeFile({name:pn,contents:JSON.stringify(c,null,2)}),new t(e,o,c,r,u,l??false)}async finish(e){if(this.finished)return;this.finished=true;let{status:o}=e,n={...this.metadata,status:o,updatedAt:new Date,finishedAt:new Date};await Promise.all(this.children.map(r=>r.finish({logger:e.logger,status:n.status,finishedAt:n.finishedAt}))),this.diskStorage.storeFile({name:pn,contents:JSON.stringify(n,null,2)});}async startRun(e){let o=this.diskStorage.createRunArchive(e.runId,e.logger),n={stepsSnapshot:e.originalSteps.steps,beforeStepsSnapshot:e.originalSteps.beforeSteps??void 0,afterStepsSnapshot:e.originalSteps.afterSteps??void 0,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName?Ti(e.testName):e.testName,testDescription:e.testDescription,directory:e.directory,labels:e.testLabels,trigger:"CLI",status:"RUNNING",healStatus:"NOT_ATTEMPTED",environmentName:e.environmentName,cliVersion:_r,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0,quarantined:e.quarantined,quarantinedReason:e.quarantinedReason,executionType:e.platform,aiSettings:e.aiSettings};o.storeFile({name:pn,contents:JSON.stringify(n,null,2)});let r=new bU(this.client,e.testId,e.testName,e.platform,e.runId,n,o,this.orgId,e.resultSchema,this.recordVideo);return this.children.push(r),r}};function zse(t){return {platform:t.platform,originalSteps:{steps:cloneDeep(t.steps),beforeSteps:t.beforeSteps?cloneDeep(t.beforeSteps):void 0,afterSteps:t.afterSteps?cloneDeep(t.afterSteps):void 0}}}var cT=2;async function yU(t){let{inputs:e,fixtures:o,metadata:n,helpers:r}=t,{tracer:i,logger:a}=o,{runId:s}=n,{platform:l,testDefinition:c,project:u}=e,d=new Date,m=await i.startRun({...zse(c),logger:a,testId:c.id,testName:c.name,directory:dirname(c.relativeFilePath),runId:s,testDescription:c.description,testLabels:c.labels,schemaVersion:c.schemaVersion,quarantined:c.quarantined,quarantinedReason:c.quarantinedMetadata?.quarantinedReason,aiSettings:u.config.ai,resultSchema:r.resultSchema}),p=a.child(m.loggerBindings||{}),f=1+(c.settings?.retries??u.config.retries??cE),h=false;for(let g=0;g<f;g++){let b=new Date,y=await D3e({...t,runTracer:m,fixtures:{...o,logger:p},constants:{attemptNumber:g+1,totalAttempts:f}}),T=new Date;if(h||=y.results.length>0||(y.beforeResults?.length??0)>0||(y.afterResults?.length??0)>0,y.status!=="FAILED")return await m.finish({logger:p,status:y.status,failureRecoveryDetails:y.failureRecoveryDetails,finishedAt:T}),{...y,testMetadata:c,platformType:l,steps:c.steps,startedAt:d,lastAttemptStartedAt:b,finishedAt:T,runId:s,attempts:g+1,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedMetadata:c.quarantinedMetadata,status:y.status};if(g!==f-1){p.warn("Retrying failed mobile run");continue}p.error("Mobile test failed after all exhausting attempts"),h||p.error({err:y.error,failureReason:y.error?.reason,testId:c.id,testName:c.name,attempts:f},`Mobile test ran ZERO steps across all ${f} attempt(s) - likely an emulator/driver startup failure`);let v={failureReason:y.error?.reason,failureDetails:y.error?{errorMessage:y.error.message,errorStack:y.error.stack}:void 0};return await m.finish({logger:p,status:y.status,...v,failureRecoveryDetails:y.failureRecoveryDetails,finishedAt:T}),{...y,testMetadata:c,platformType:l,steps:c.steps,startedAt:d,lastAttemptStartedAt:b,finishedAt:T,runId:s,...v,attempts:g+1,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedMetadata:c.quarantinedMetadata,status:y.status}}throw new Error("This code should not be reachable")}async function D3e(t){let{metadata:e,constants:o,fixtures:n,inputs:r,options:i}=t,{attemptNumber:a,totalAttempts:s}=o,{orgId:l,gitMetadata:c}=e,{apiClient:u,logger:d}=n,{testDefinition:m,logUpdate:p,project:f,envOverride:h}=r,{regenerateCache:g,alwaysSaveCache:b,noCache:y}=i;a!==1&&p("RETRY",`attempt ${a}/${s}`);let T={...r.project.config.emulator,...m.settings?.emulator},v={...f.config.ai,useMemory:f.config.ai?.useMemory!==false,...m.settings?.ai},E=h||m.settings?.defaultEnv,M=(E?Cd(E,f,d):void 0)?.variables??{},I=wn({logger:d,orgId:l,client:u,gitMetadata:c,regenerateCache:g,alwaysSaveCache:b,noCache:y,isolateCachesByEnvironment:f.config?.advanced?.isolateCachesByEnvironment}),A=new df(u,l),k={type:"API_KEY",baseUrl:u.baseUrl,apiKey:u.apiKey,logger:d,mode:"runner",runner:"test-runner"},_=new zs(k),H=new Ol(v.agentConfig,k),V=new Gc(k,H),j=new qc({httpClient:u,fakerSeed:f.config.advanced?.fakerConstantSeed?ap:void 0});return await N3e({...t,fixtures:{...t.fixtures,mobileGenerator:_,storage:A,cacheStorage:I,browserEnricher:V,browserGenerator:H,localCodeEvalTools:j},env:{envName:E,envVariables:M},settings:{aiSettings:v,emulatorSettings:T}})}async function N3e(t){let{inputs:{testDefinition:e,logUpdate:o},env:{envName:n},fixtures:{logger:r},helpers:i}=t,a=t.inputs.platform,s,l;for(let m=1;m<=cT;m++)try{s=await We({name:"mobile-cli.session_setup",attributes:{"momentic.platform":a,"momentic.test_id":e.id},fn:async()=>i.prepareRunParams(t)});break}catch(p){if(l=p,m===cT)break;o("RETRY",`emulator setup failed, retrying on a fresh emulator (${m+1}/${cT})`),r.warn({err:p,attempt:m,maxAttempts:cT},"Mobile emulator bootstrap failed; retrying bootstrap");}if(!s){let m=O.reasonFor(l,"InternalPlatformError"),p=J(l);return {status:"FAILED",results:[],error:new O(m,`Mobile driver setup failed before any test steps ran after ${cT} bootstrap attempt(s). This usually means the emulator or Appium driver failed to start, not that the test file is empty or that its steps were skipped. Last setup error: ${p}`)}}let c=t.inputs.project.config.fileFormat==="v2",u;try{u=await We({name:"mobile-cli.execute_test",attributes:{"momentic.platform":a,"momentic.test_id":e.id},fn:async()=>xh({...s,containerName:`mobile test ${e.name}`,envName:n,helpers:i,inputs:{...s.inputs,useSnapshotIdentityCache:c}})});}finally{await We({name:"mobile-cli.teardown",attributes:{"momentic.platform":a,"momentic.test_id":e.id},fn:async()=>s.cleanup()});}await s.tracer.finish({logger:s.fixtures.logger,results:u.results,beforeResults:u.beforeResults,afterResults:u.afterResults,status:u.status});let d;if(u.status==="FAILED"&&u.terminalResult){let m=u.terminalResult.message;d=m?O.fromMessage(m):new O("UnknownError","Unknown failure");}return {...u,error:d,runAttemptId:s.runAttemptId}}function k3e(t){switch(t){case "SUCCESS":return "passed";case "CANCELLED":return "skipped";case "FAILED":case "IDLE":case "RUNNING":return "failed";default:return Ct(t)}}function F3e(t){switch(t){case "PASSED":return "passed";case "CANCELLED":return "skipped";case "FAILED":case "PENDING":case "RETRYING":case "RUNNING":case "WAITING_FOR_USER":return "failed";default:return Ct(t)}}async function B3e(t){let{step:e,logger:o,debugDataStorage:n,folder:r,beforeSnapshot:i,afterSnapshot:a}=t,s=await Vse({logger:o,debugDataStorage:n,folder:r,label:"before",snapshotId:i});s&&e.attachments.push({name:"Screenshot before step",source:s,type:"image/jpeg"});let l=await Vse({logger:o,debugDataStorage:n,folder:r,label:"after",snapshotId:a});l&&e.attachments.push({name:"Screenshot after step",source:l,type:"image/jpeg"});}function U3e(t,e,o){let n=z.union([z.looseObject({}),z.array(z.unknown().optional())]).safeParse(o).success,r=`output-attachment-${randomUUID()}.json`;Bn__default.writeFileSync(Oo__default.join(e,r),JSON.stringify(o,null,2)),t.attachments.push({name:"Step output data",source:r,type:n?"application/json":"text/plain"});}function z3e(t){let{step:e,folder:o,beforeTestContext:n,afterTestContext:r}=t;if(n){let i=`before-context-${randomUUID()}.json`;writeFileSync(Oo__default.join(o,i),Hse(n.env)),e.attachments.push({name:"Test context before step",source:i,type:"application/json"});}if(r){let i=`after-context-${randomUUID()}.json`;writeFileSync(Oo__default.join(o,i),Hse(r.env)),e.attachments.push({name:"Test context after step",source:i,type:"application/json"});}}function $3e(t){let e=[{name:"suite",value:t.suiteName},{name:"host",value:hostname()},{name:"platform",value:"momentic"},{name:"attempts",value:t.attempts.toString()}];return t.runId&&e.push({name:"runUrl",value:`https://app.momentic.ai/runs/${t.runId}`}),t.quarantined&&e.push({name:"quarantined",value:"true"}),t.quarantinedReason&&e.push({name:"quarantinedReason",value:t.quarantinedReason}),t.quarantinedAt&&e.push({name:"quarantinedAt",value:t.quarantinedAt.toISOString()}),e}async function Vse(t){let{logger:e,debugDataStorage:o,folder:n,label:r,snapshotId:i}=t;if(!i)return;let a=await o.getScreenshot(e,i);if(!a)return;let s=`screenshot-${r}-${i}.jpeg`;return Bn__default.writeFileSync(Oo__default.join(n,s),a),s}async function SU(t,e,o,n,r){for(let i of r){if(!i.runId||!i.runAttemptId){t.warn({filePath:i.filePath,status:i.status},"Skipping Allure report for mobile test with no run attempt (driver setup likely failed before any steps ran)");continue}let a=e.createDebugDataReaderForRunAttempt(i.runId,i.runAttemptId);try{await V3e(t,a,{folder:o,suiteName:n.suiteName},i);}finally{a.close();}}}async function V3e(t,e,o,n){let r=o.folder,i=Oo__default.basename(n.filePath,".test.yaml")||n.filePath,a={uuid:n.runAttemptId??randomUUID(),historyId:n.runId??randomUUID(),testCaseId:n.testMetadata.id,fullName:i,name:Ti(i),status:F3e(n.status),start:n.lastAttemptStartedAt.getTime(),stop:n.finishedAt.getTime(),parameters:[],labels:$3e({suiteName:o.suiteName,attempts:n.attempts,runId:n.runId,quarantined:n.quarantined,quarantinedReason:n.quarantinedMetadata?.quarantinedReason,quarantinedAt:n.quarantinedMetadata?.quarantinedAt}),steps:[]};a.labels.push({name:"platformType",value:n.platformType}),n.parameters?.envName&&a.parameters.push({name:"env",value:n.parameters.envName});for(let[u,d]of Object.entries(n.parameters?.testInputs??{}))a.parameters.push({name:u,value:d});let s=[...n.beforeResults??[],...n.results,...n.afterResults??[]];await KM(t,e,o.folder,a.steps,s);let l=j3e(e,r,n.runAttemptId);l.length>0&&(a.attachments=l);let c=`${n.runAttemptId}-result.json`;Bn__default.writeFileSync(Oo__default.join(r,c),JSON.stringify(a,void 0,2));}async function jse(t,e,o,n){let r={name:sa(n),start:n.startTime,stop:n.endTime,status:k3e(n.status),labels:[],steps:[],attachments:[]};return await B3e({step:r,logger:t,debugDataStorage:e,folder:o,beforeSnapshot:n.beforeSnapshot,afterSnapshot:n.afterSnapshot}),n.message&&(r.statusDetails={message:n.message}),n.data&&U3e(r,o,n.data),r}async function KM(t,e,o,n,r){for(let i of r){let a=await jse(t,e,o,i);switch(i.type){case "MOBILE_PRESET_STEP":break;case "MOBILE_AI_ACTION_STEP":await KM(t,e,o,a.steps,i.steps);break;case "MOBILE_MODULE_STEP":if(await KM(t,e,o,a.steps,i.steps),i.inputs){a.parameters=[];for(let[s,l]of Object.entries(i.inputs))a.parameters.push({name:s,value:l});}break;case "MOBILE_CONDITIONAL_STEP":i.assertionResult&&a.steps.push(await jse(t,e,o,i.assertionResult)),await KM(t,e,o,a.steps,i.steps);break;}a.attachments||(a.attachments=[]),z3e({step:a,folder:o,beforeTestContext:i.beforeTestContext,afterTestContext:i.afterTestContext}),n.push(a);}}function Hse(t){try{return JSON.stringify(t,void 0,2)??JSON.stringify({value:null},void 0,2)}catch(e){let o=e instanceof Error?e.message:"unknown error";return JSON.stringify({error:o},void 0,2)}}function j3e(t,e,o){let n=t.listVideoAssetPaths();if(n.length===0)return [];let r=[];for(let i of n){let a=Oo__default.basename(i),s=o?`${o}-${a}`:a;try{Bn__default.copyFileSync(i,Oo__default.join(e,s));}catch{continue}let l,c=Oo__default.extname(i).toLowerCase();c===".webm"?l="video/webm":c===".mp4"?l="video/mp4":l="application/octet-stream",r.push({name:a,source:s,type:l});}return r}function XM(t){if(t.status!=="FAILED")return "none";switch(t.failureReason){case "SetupFailureError":return "setup";case "TeardownFailureError":return "teardown";default:return "main"}}function W3e(t){switch(t){case "PASSED":return "passed";case "FAILED":return "failed";case "CANCELLED":return "skipped";case "RETRYING":case "WAITING_FOR_USER":case "PENDING":case "RUNNING":return "unknown";default:return Ct(t)}}function Kse(t){let e=Oo__default.relative(".",t);return e===""?t:e}function Wse(t,e){return Math.max(0,(t.getTime()-e.getTime())/1e3)}function G3e(t,e,o){let n=Wse(e,t),r=Wse(o,t);return {start_at:n,end_at:r,duration:Math.max(0,r-n)}}function Yse(t){let e=t.reduce((o,[n,r])=>(!r||Object.keys(o).length>=10||(o[n]=r),o),{});return Object.keys(e).length>0?e:void 0}function q3e(t){if(t.status!=="FAILED"||!t.failureReason)return;let e=tc({failureReason:t.failureReason,classification:t.failureDetails?.classification,manualClassification:t.failureDetails?.manualClassification,errorMessage:t.failureDetails?.errorMessage});if(!(e.title==null||e.description==null))return `${e.title}: ${e.description}`}function K3e(t){if(t.status!=="FAILED")return;let e=[t.failureDetails?.classification?.summary,t.failureDetails?.classification?.rootCause,t.failureDetails?.errorMessage].filter(n=>!!n),o=t.failureDetails?.errorStack?.split(`
@@ -6301,4 +6301,4 @@ ${a.map(s=>` - ${s}`).join(`
6301
6301
  Upgrade your plan to keep running tests: ${Mc(le,m)}`),await rn(),process.exit(1);}let _=await Lo(Bt,T,p);A.debug({gitMetadata:_,config:p.config,nodeVersion:process.versions.node},"Got local git metadata");let H=await nle(A,T,e.ignoreQuarantine),V=await _t(p),j=await JB({tests:t,yes:e.yes,project:p,momenticFiles:V,include:e.include,exclude:e.exclude,labels:e.labels,logger:N,quarantinedTestsMetadata:H});await Ev({serviceName:"mobile-cli",enabled:e.shareDiagnostics===true});try{let le=await We({name:"mobile-cli.run",root:!0,attributes:{"momentic.org_id":v,"momentic.run_group_id":I,"momentic.parallel":g,"momentic.tests_requested":j.length},fn:async()=>tle({options:{...e,parallel:g,outputDir:f,alwaysSaveCache:d.alwaysSaveCache,regenerateCache:d.regenerateCache,noCache:d.noCache,logLevel:u,timeoutMinutes:e.timeoutMinutes,shardIndex:e.shardIndex,shardCount:e.shardCount,reporter:l,reporterDir:c,labels:e.labels,suiteName:o,recordVideo:y,updateGoldenFiles:e.updateGoldenFiles??!1},fixtures:{logger:A,project:p,apiClient:T},inputs:{envOverride:e.env,tag:i,channel:a,testDefinitions:j,quarantinedTestsMetadata:H},metadata:{gitMetadata:_,runGroupId:I,orgId:v}})});await rn(),process.exit(Zq(le,{onlyQuarantined:e.onlyQuarantined})?1:0);}catch(le){Bt.error({err:le},"Failed to run tests locally"),N.error({err:le},"Failed to run tests locally. Rerun with --verbose for more detail."),await rn(),process.exit(1);}});dr.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new Option("--name <name>","Name of the project")).action(async t=>{N.info("Momentic Mobile project setup"),N.dimmed(" Bootstrap a new Momentic mobile project."),Bn__default.existsSync(kc)&&(N.error(`${kc} already exists in this directory. Rename or remove it to initialize a new project.`),process.exit(1));let e=t.name??await cG("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),o=await K8({cwd:process.cwd(),projectName:e});N.success(`Initialized Momentic project file at ${o.configPath}.`),Y8({platform:"mobile"}),await rn(),process.exit(0);});dr.command("upgrade").description("Upgrade your configuration to the latest recommended settings").addOption(Yl).addOption(UM).addOption(gi).addOption(Vi).option("--dry-run","Preview the upgrade without writing any files or pushing snapshots.").action(async t=>{let e=await Ni({configFilePath:t.config,nameFilter:t.filter}),o=t.dryRun??false;o||await ole();let n=new on({baseUrl:t.server,apiKey:t.apiKey,logger:Bt,mode:"runner",runner:"test-runner"}),{orgId:r}=await n.getAuthInfo(),i=await Lo(Bt,n,e),a=await O6({project:e,dryRun:o,migrate:()=>ZB({project:e,apiClient:n,gitMetadata:i,orgId:r,dryRun:o})});zN({summary:a.migration,fileFormatChanged:a.fileFormatChanged,aiSettings:a.aiSettings,dryRun:o,testNoun:"mobile test",moduleNoun:"mobile module"}),a.fileFormatChanged||BN(a.aiSettings)?o?N.success("Dry run complete. Rerun without --dry-run to apply."):(N.success("Upgraded project to latest recommended settings."),N.dimmed(" Optional: rerun tests with --regenerate-cache to rebuild caches from scratch (slower).")):N.success("Project is already up to date."),await rn(),process.exit(0);});dr.command("install-browsers").description("Install browser executables onto the local machine.").option("-f, --force","Force reinstallation even if the browser executables already exist on disk.").option("-a, --all","Install all browsers types.").argument("[browsers...]",`Browsers to install. Available choices: ${EC.join(", ")}.`).action(async(t,e)=>{!e.all&&t.length===0&&(N.error("No browsers specified."),process.exit(1)),await vC({rawBrowsers:t,force:e.force,all:e.all}),await rn(),process.exit(0);});dr.command("install-skills").description("[DEPRECATED] Install the Momentic skill markdown as SKILL.md. Prefer `npx skills@latest add momentic-ai/skills`.").addOption(new Option("--editor <editor>","Editor to install skills for.").choices(X8).makeOptionMandatory()).action(async t=>{N.warn("`momentic-mobile install-skills` is deprecated. Run `npx skills@latest add momentic-ai/skills` instead.");let e=t.editor,o=fileURLToPath(import.meta.url),n=Oo__default.dirname(o),r=Oo__default.resolve(n,"..","skills");J8({editor:e,skillsDir:r}),await rn(),process.exit(0);});dr.command("login").description("Sign in with your Momentic account via WorkOS and save an API key.").addOption(gi).addOption(new Option("--no-browser","Do not try to open a browser automatically")).action(async t=>{await s6({serverUrl:t.server,openBrowser:t.browser,ui:l6(Er())}),N.success(`Credentials saved to ${Nl}.`),await rn(),process.exit(0);});dr.command("logout").description("Sign out and remove the saved API key.").action(async()=>{o6()?N.info(`Removed ${Nl}.`):N.dimmed("No signed-in session found."),await rn(),process.exit(0);});async function RKe(){try{ise(),await dr.parseAsync(process.argv),await rn();}catch(t){let e=yP(t,Ye);e?(Bt.error({err:t},"User-facing error in CLI"),N.error(e.message)):(Bt.error({err:t},"Uncaught error in CLI"),N.error({err:t},"Momentic Mobile CLI exited unexpectedly")),await rn(),process.exit(1);}}RKe();
6302
6302
  //# sourceMappingURL=out.js.map
6303
6303
  //# sourceMappingURL=cli.js.map
6304
- //# debugId=e8125d5e-4ef4-575b-8718-1573be81fe8f
6304
+ //# debugId=50dd5e96-ea7c-5d9c-b214-a52be91a645b