momentic-mobile 0.111.0 → 0.111.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +13 -13
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/remote-control-static/assets/index-o-0hJced.css +1 -0
- package/remote-control-static/index.html +2 -2
- package/run-viewer-static/assets/index-6YBWwMr7.css +1 -0
- package/run-viewer-static/assets/{index-DB4QYGU0.js → index-DtTpvRGS.js} +2 -2
- package/run-viewer-static/index.html +2 -2
- package/static/assets/index-CgWx75XK.css +1 -0
- package/static/assets/{index-Czy7tmDW.js → index-DSqshQCS.js} +5 -5
- package/static/index.html +2 -2
- package/remote-control-static/assets/index-Bz5j4K9x.css +0 -1
- package/run-viewer-static/assets/index-CzFPpVia.css +0 -1
- package/static/assets/index-2uYX3yRD.css +0 -1
- /package/remote-control-static/assets/{index-B11GLUJY.js → index-U5tTIOkd.js} +0 -0
package/bin/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
3
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="20dcb4e9-9689-5aa4-8fdc-ce43e1504d1d")}catch(e){}}();
|
|
4
4
|
import * as ST from 'http';
|
|
5
5
|
import ST__default, { createServer } from 'http';
|
|
6
6
|
import * as ET from 'https';
|
|
@@ -167,7 +167,7 @@ ${this.decisions.map(e=>e.toString()).join(`
|
|
|
167
167
|
`).map((r,o)=>o>0?`${n}${r}`:r).join(`
|
|
168
168
|
`)}logWithLevelHelper(e,n,...r){if(e<this.minLogLevel)return;let o=this.forcedStream??(e>=40?"stderr":"stdout"),i=(...u)=>o==="stderr"?console.error(...u):console.log(...u),a;Array.isArray(r[0])?(a=r[0],r=r.slice(1)):typeof r[0]=="object"&&!(r[0]instanceof Error)&&Object.entries(r[0]).length&&(a={...r[0],...this.logBindings},r=r.slice(1));let s=Qi.level===0,l=s&&e===50?"Error:":s&&e===40?"Warning:":"",c=[];if(l&&c.push(l),c.push(...r),i(n(...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(n(` ${d}:`,p)),i(n(" stack:",m.stack));let h=Object.entries(m).filter(([b])=>b!=="message"&&b!=="stack");for(let[b,y]of h){if(y instanceof Error){i(n(` ${d}.${b}:`,y.message)),y.stack&&i(n(` ${d}.${b}.stack:`,y.stack));continue}if(typeof y=="object"&&y!==null){let S=this.indentMultiline(Rl(y,void 0,2)," ");i(n(` ${d}.${b}:`,S));continue}i(n(` ${d}.${b}:`,y));}}else typeof m=="object"?(p=Rl(m,void 0,2),p=this.indentMultiline(p),i(n(` ${d}:`,p))):i(n(` ${d}:`,p));}}else if(a)for(let u of a){let d=u;typeof u=="object"&&(d=Rl(u,void 0,2),d=d.split(`
|
|
169
169
|
`).map((m,p)=>p>0?` ${m}`:m).join(`
|
|
170
|
-
`)),i(" ",n(d));}}setMinLevel(e){typeof e=="string"?this.minLogLevel=dh[e]:this.minLogLevel=e;}setOutputStream(e){this.forcedStream=e;}log(...e){this.logWithLevel(30,Qi.reset,...e);}info(...e){this.logWithLevel(30,Qi.white,...e);}debug(...e){this.logWithLevel(20,Qi.dim,...e);}warn(...e){this.logWithLevel(40,Qi.yellow,...e);}error(...e){this.logWithLevel(50,Qi.red,...e);}success(...e){this.logWithLevel(30,Qi.green,...e);}dimmed(...e){this.logWithLevel(30,Qi.dim,...e);}underline(...e){this.logWithLevel(30,Qi.underline,...e);}bold(...e){this.logWithLevel(30,Qi.bold,...e);}grey(...e){this.logWithLevel(30,Qi.grey,...e);}child(e){let n=new t(this.minLogLevel,{...this.logBindings,...e});return n.forcedStream=this.forcedStream,n}async flush(){}bindings(){return this.logBindings}},P=kx._internalSingleton(),tu={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>tu,flush:async()=>{},bindings:()=>({})},OS={},Bx=({logger:t,logKey:e,maxCount:n,intervalMs:r},o,i,...a)=>{let s=OS[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},OS[e]=s),s.totalCount++,s.count<n&&(s.count++,t.debug(o,i,...a)),s.timer=setTimeout(()=>{let l=OS[e];l?.totalCount!==l?.count&&t.debug({logKey:e,totalCount:l?.totalCount,count:l?.count},`Debug logs were rate-limited for ${e}`),delete OS[e];},r);};var eU=1e4,NS=1,Ux=_s.extend({browserType:z.enum(La).optional(),slowMoMs:z.number().optional().refine(t=>t===void 0||t<=eU&&t>=-1,{message:`Slow motion must be between 0 and ${eU} 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(AS).optional(),colorScheme:z.enum(["light","dark"]).optional()});var zx=z.object({useMemory:z.boolean().optional(),failureRecovery:z.boolean().optional().describe("undefined means inherit org settings")}),$x=zx.extend({disableAICaching:z.boolean().optional(),failureRecoveryInstructions:z.string().optional()}),bse=z.object({viewport:Is.optional()}),nu=bse.extend($x.shape).extend(Ux.shape),LS=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()}),kS=z.object({onSuccess:z.boolean().default(false),failureMessage:z.string().optional(),onFailure:z.boolean().default(true),successMessage:z.string().optional()}),yse=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")}),tU=yse.array(),Sse=z.object({name:z.string(),value:z.string()}),FS=Sse.array(),nU=z.object({name:z.string(),default:z.boolean().optional(),fixtures:FB.array().optional()});var Fa=zx.extend({agentConfig:z.record(z.string(),z.string()).optional(),aiFailureAnalysis:z.boolean().optional(),classification:rB.optional(),triage:nB.optional(),healing:tB.optional(),explore:JB.optional(),select:YB.optional()}),Ese=z.object({cliOnly:z.boolean().optional(),neverShowUsageBanner:z.boolean().optional(),hideInternalTraceInfo:z.boolean().optional(),bypassUsageLimits:z.boolean().optional()}),Vx=z.object({fakerConstantSeed:z.boolean().optional(),isolateCachesByEnvironment:z.boolean().optional()}),Tse=z.enum(["flaky_tests","low_test_coverage","frequent_bugs","fix_flaky_tests","migrate_tests","increase_test_coverage","catch_more_bugs"]),vse=z.enum(["ios","android","web"]),Cse=z.enum(["selenium","playwright","cypress","puppeteer","maestro","appium","detox","manual_qa","nothing_yet","other"]),wse=z.enum(["advertisement","ai_search","google_search","hacker_news","linkedin","reddit","referral_from_customer","twitter_x","word_of_mouth","youtube","other"]),Ase=z.object({helpIntents:z.array(Tse).optional(),helpIntentOtherText:z.string().optional(),deviceTypeIntent:vse.optional(),currentTestingTool:Cse.optional(),heardAboutSource:wse.optional()}),Rse=z.object({discovery:Ase.optional(),needsToCompleteOnboarding:z.boolean().optional(),wizardCompletedAt:z.iso.datetime().optional()}),BS=z.object({ai:Fa.optional(),githubAppInstallationId:z.number().nullish(),githubAppSummaryMessageEnabled:z.boolean().nullish(),githubReleaseAppInstallationId:z.number().nullish(),gitlabAppAccessToken:z.string().nullish(),gitlabAppBaseUrl:z.string().nullish(),browser:Px.optional(),internal:Ese.optional(),advanced:Vx.optional(),onboarding:Rse.optional()});function rU(t){try{return BS.parse(t)}catch{return P.warn("Cloud settings contain values this version of the CLI does not support. Please upgrade. Falling back to defaults."),BS.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 iU=(n=>(n.CANNOT_FIX_TEST="CANNOT_FIX_TEST",n.FIXED="FIXED",n))(iU||{}),oU=z.object({index:z.int().nonnegative(),section:vx,step:Na}),xse=z.object({additions:oU.array(),deletions:oU.array()}),Mse=z.object({subAgentStatus:z.enum(iU).default("CANNOT_FIX_TEST"),rootCause:z.string(),solution:z.string(),verificationNotes:z.string().optional().default(""),diffs:xse.optional(),pullRequestUrl:z.string().optional(),branchUrl:z.string().optional()}),aU=Mse.optional().catch(void 0);var qo={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},en=(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))(en||{});var jx=(o=>(o.NOT_ATTEMPTED="NOT_ATTEMPTED",o.PERM_HEAL_SUCCEEDED="PERM_HEAL_SUCCEEDED",o.PERM_HEAL_FAILED="PERM_HEAL_FAILED",o.PERM_HEAL_ON_SUCCESS_FAILED="PERM_HEAL_ON_SUCCESS_FAILED",o))(jx||{});var Hx=z.enum(jx).default("NOT_ATTEMPTED"),US=(n=>(n.BEFORE_ALL="BEFORE_ALL",n.AFTER_ALL="AFTER_ALL",n))(US||{});var Pse=z.object({attempts:z.int().nonnegative()}),Tn=z.string().pipe(z.coerce.date()).or(z.date()),Os=z.object({id:z.string(),runKey:z.string(),organizationId:z.string(),executionType:$d.optional().default("WEB"),createdAt:Tn,createdBy:z.string(),flake:z.boolean().nullish(),scheduledAt:Tn.or(z.null()),startedAt:Tn.or(z.null()),updatedAt:Tn.nullish(),finishedAt:Tn.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:Tn.nullish(),gitCommitMessage:z.string().nullish(),schemaVersion:z.string().nullish(),cliVersion:z.string().nullish(),section:z.enum(US).nullish(),status:z.enum(en),healStatus:Hx,healDetails:aU.nullish(),trigger:z.enum(qo),attempts:z.number(),runAttempts:z.array(z.object({id:z.string(),status:z.enum(en),startedAt:Tn.or(z.null()),finishedAt:Tn.or(z.null())})).optional(),videos:z.array(z.string()).optional(),failureReason:z.string().nullish(),failureDetails:iB.nullish(),failureRecoveryDetails:Pse.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:Fa.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()}),Ise={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},zS=Os.pick({...Ise,test:true}),Wx=Os.omit({failureReason:true,failureDetails:true,test:true}),Gx=Os.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:nu.nullish()}).nullish()}).extend(Dx.shape);var sU=z.enum(["error","warning","passing"]);var lU=z.enum(["safe_to_merge","confirm_intended_change","investigate_regression","fix_test","resolve_infra","review_coverage"]);var cU=z.object({kind:lU,detail:z.string().min(1).max(280)}),ru=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:cU.optional()});ru.extend({riskLevel:sU.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:cU.extend({kind:lU.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 uU=z.object({id:z.string(),status:z.enum(en),trigger:z.enum(qo),createdAt:Tn,startedAt:Tn.nullish(),finishedAt:Tn.nullish(),gitCommitSha:z.string().nullish(),gitCommitShaShort:z.string().nullish(),gitCommitTimestamp:Tn.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:ru.optional(),localSuiteName:z.string().optional(),suite:z.object({id:z.string(),name:z.string()}).nullish(),runs:z.object({status:z.enum(en),environmentName:z.string().nullish()}).array()}),dU=uU.pick({id:true,createdAt:true,startedAt:true,finishedAt:true,status:true,trigger:true,suite:true,localSuiteName:true}).extend({runs:zS.array()}),mU=uU.extend({runs:Os.array()});var Ose=z.object({id:z.string(),name:z.string()});Ose.extend(z.object({createdAt:Tn,createdBy:z.string(),schedule:LS,notification:kS,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 pU=z.object({id:z.guid(),orgId:z.string(),createdAt:Tn,startedAt:Tn.or(z.null()),finishedAt:Tn.or(z.null()),status:z.enum(en),trigger:z.enum(qo),suite:z.object({id:z.string(),name:z.string()}).nullish(),runs:Os.array()});pU.pick({id:true,createdAt:true,startedAt:true,finishedAt:true,status:true,trigger:true,suite:true});var fU=pU.extend({runs:zS.array()});function hU({beforeStatus:t,mainStatus:e,afterStatus:n}){return t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":n==="FAILED"?"FAILED":n==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}function gU(t,e){return t.some(o=>e?.onlyQuarantined?o.status==="FAILED":!o.quarantined&&o.status==="FAILED")?"FAILED":t.some(o=>o.status==="CANCELLED")?"CANCELLED":"PASSED"}function mh(t){switch(t){case "SUCCESS":return "PASSED";case "FAILED":return "FAILED";case "CANCELLED":return "CANCELLED";case "RUNNING":return "RUNNING";case "IDLE":return "PENDING"}}function bU(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 qx=z.object({content:z.string(),ids:z.string().array(),tokenLength:z.number()}),Dse=z.object({chunks:qx.array()});z.object({ids:z.string().array(),score:z.number(),tokenLength:z.number()});Dse.extend({description:z.string().describe("Input to pass to RAG engine"),tokenLimit:z.number()});var yU=z.object({ids:z.number().array()}),SU=z.object({indices:z.number().array()});var ur=z.object({disableCache:z.boolean().optional(),useMemory:z.boolean().optional(),clientMode:z.enum(["interactive","runner"]).optional(),loggerTags:z.record(z.string(),z.string()).optional(),langfuseSessionId:z.string().optional(),agentConfigVersion:z.string().optional(),cacheBustReason:z.enum(Kc).optional()});ur.extend({chunks:qx.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 Nse=z.object({screenshotBase64AfterCommand:z.string(),urlAfterCommand:z.string(),serializedCommand:z.string(),elementInteracted:z.string().optional(),thoughts:z.string().optional()}),EU=z.object({goal:z.string(),browserState:z.string(),screenshot:z.string(),source:IB.optional().catch(void 0),isTieBreakerCall:z.boolean().optional(),memory:z.discriminatedUnion("type",[Xi,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional(),firstPassModelResults:CS.array().optional(),knowledgeBaseSection:z.string().optional()}),TU=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()}),vU=z.object({goal:z.string(),browserState:z.string(),screenshot:z.string().optional(),returnSchema:z.string().optional()}),CU=z.object({goal:z.string(),emulatorState:z.string(),screenshot:z.string().optional(),returnSchema:z.string().optional()}),Kx=z.union([z.literal("NEGATED_CHECK"),z.literal("CONDITIONAL_CHECK")]),wU=z.object({goal:z.string(),browserState:z.string(),screenshot:z.string(),url:z.string(),contextChoice:sx.optional(),memory:z.discriminatedUnion("type",[qc,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional(),source:Kx.optional(),recoveryHint:z.string().optional(),knowledgeBaseSection:z.string().optional()}),AU=z.object({command:Id}),Yx=z.object({goal:z.string(),browserState:z.string(),startingScreenshot:z.string().optional(),screenshot:z.string(),url:z.string(),history:Nse.array(),actionHint:z.string().optional(),lastError:z.string().optional()}),RU=z.object({results:xS.array(),errorMessage:z.string(),errorStack:z.string().optional()}),xU=z.object({results:xS.array(),goal:z.string(),errorMessage:z.string()}),MU=z.object({failedResults:xS.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 PU=z.object({type:z.string(),browserContext:z.string(),currentStep:z.string(),screenshot:z.string()}),IU=z.object({description:z.string(),browserState:z.string().optional(),screenshot:z.string()}),Lse=z.enum(["locator","assertion"]);z.object({completionType:Lse,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 _U=z.object({keywords:z.array(z.string())});var $S=(i=>(i.LOCATOR="locator",i.ASSERTION="assertion",i.VISUAL_ASSERTION="visual-assertion",i.TEXT_EXTRACTION="text-extraction",i.FAILURE_RECOVERY="failure-recovery",i))($S||{}),kse=["locator","assertion","visual-assertion","text-extraction","failure-recovery"];z.enum($S);var Fse=new Set(kse);function Bse(t){return Fse.has(t)}var Use=z.enum(["v1","v2","v3","v4"]),zse=z.string().regex(/^v\d+\.\d+$/).describe("pinned sub-version like v3.1");z.union([Use,zse,z.string().describe("for people with special configurations")]);var jd={locator:"v4",assertion:"v4","visual-assertion":"v4","text-extraction":"v3","failure-recovery":"v2"};var $se={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"]}},xl=(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))(xl||{});z.enum(xl);function OU(t){for(let[e,n]of Object.entries(t)){if(!Bse(e))continue;let r=$se[e];if(!r)continue;let o=new Set;for(let[i,a]of Object.entries(r)){o.add(i);for(let s of a)o.add(s);}if(!o.has(n)){let i=[...o].sort();throw new M("UserConfigurationError",`Invalid agent config: "${n}" is not a valid version for "${e}". Valid versions: ${i.join(", ")}`)}}}var Ds=v__default.object({id:v__default.guid(),envKey:v__default.string().optional(),skipped:v__default.boolean().optional(),retries:v__default.number().optional()});var xn=(o=>(o.PRESET="MOBILE_PRESET_STEP",o.MODULE="MOBILE_MODULE_STEP",o.AI_ACTION="MOBILE_AI_ACTION_STEP",o.CONDITIONAL="MOBILE_CONDITIONAL_STEP",o))(xn||{});var Hd=Ds.extend({type:v__default.literal("MOBILE_CONDITIONAL_STEP")});var Ua=z.object({id:z.string(),name:Jc,baseUrl:bS,description:z.string().optional().nullish(),schemaVersion:z.string(),advanced:nu,retries:z.number().optional().nullish(),envs:z.array(nU).nullish(),parameters:tU.nullish(),disabled:z.boolean().optional(),labels:z.array(z.string()).optional().catch([])}),DU=z.enum(["INHERIT","ENABLED","DISABLED"]);var jse=nu.extend({failureRecovery:DU.optional(),useMemory:DU.optional()});Ua.pick({name:true,description:true,baseUrl:true,retries:true,disabled:true,parameters:true}).extend({advanced:jse});Ua.pick({name:true,description:true,baseUrl:true,retries:true,disabled:true,advanced:true,parameters:true});var Hse=z.object({labels:z.array(z.string()).optional(),outputs:FS.nullish()}),hh=Ua.extend(Hse.shape),Wse=z.object({createdAt:z.coerce.date(),updatedAt:z.coerce.date(),updatedBy:z.string().nullable(),schedule:LS,notification:kS,createdBy:z.string(),organizationId:z.string(),folderId:z.string().nullable().optional()}),Gse=Ua.extend(Wse.shape);Gse.extend(Ld.shape);var Xx=Ua.extend(Ld.shape);Ua.extend(Xc.shape);var qse="test",Kse="module",Yse="mobile-test",Xse="mobile-module",Jse="test/v2",Zse="module/v2",Qse="mobile-test/v2",ele="mobile-module/v2";var ve=(l=>(l.TEST=`momentic/${qse}`,l.MODULE=`momentic/${Kse}`,l.TEST_V2=`momentic/${Jse}`,l.MODULE_V2=`momentic/${Zse}`,l.MOBILE_TEST=`momentic/${Yse}`,l.MOBILE_MODULE=`momentic/${Xse}`,l.MOBILE_TEST_V2=`momentic/${Qse}`,l.MOBILE_MODULE_V2=`momentic/${ele}`,l))(ve||{});Ua.merge(Xc);var tle=Da.extend({steps:z.array(z.record(z.string(),z.unknown().optional())),schemaVersion:z.string()});tle.extend({fileType:z.literal(ve.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 Wd(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(Wd);let e={};for(let[n,r]of Object.entries(t))e[n]=Wd(r);return e}var nle=/^[a-z0-9]+(?:-[a-z0-9]+){2,}$/,NU=36,Un=z.union([z.guid().max(NU,"V2 IDs must be 36 characters or fewer"),z.string().max(NU,"V2 IDs must be 36 characters or fewer").regex(nle,"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||{}),gh=v.discriminatedUnion("type",[v.object({type:v.literal("SCREEN")}),v.object({type:v.literal("OPEN_APP")}),v.object({type:v.literal("OPEN_WEBVIEW")})]),Ns=v.object({type:v.literal("description"),description:v.string()}),Zx=v.object({type:v.literal("CUSTOM_COORDINATES"),startX:v.number().describe("Starting X coordinate in pixels"),startY:v.number().describe("Starting Y coordinate in pixels"),deltaPixels:v.number().describe("Number of pixels to scroll in the specified direction")}),VS=v.discriminatedUnion("type",[...gh.options,v.object({type:v.literal("CUSTOM"),target:Ns}),Zx]);function rle(t){return t.toLowerCase().replaceAll("_"," ")}function Ls(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 rle(t.type);default:{throw new Error("Unreachable")}}}var ole=v.object({type:v.literal("coordinates"),xPercent:v.number(),yPercent:v.number()}),ile=v.object({type:v.literal("absolute_percent"),x:v.number(),y:v.number()}),Gd=v.discriminatedUnion("type",[Ns,ole,ile]);var ale=v.object({x1:v.number(),y1:v.number(),x2:v.number(),y2:v.number(),tolerance:v.nativeEnum(Ro),preciseTolerance:v.boolean().optional()}),sle=v.object({width:v.number(),height:v.number(),tolerance:v.nativeEnum(Ro),preciseTolerance:v.boolean().optional()}),Qx=v.object({requiredText:v.string().optional(),requiredAttributes:v.record(v.string(),v.string()).optional(),requiredBounds:v.boolean().optional(),position:ale.optional(),shape:sle.optional()}),LU=v.object({xPath:v.string(),requirements:Qx.optional()}),lle=v.object({type:v.literal("CUSTOM"),target:Ns,cache:v.lazy(()=>kU).optional()}),cle=v.object({pixelDelta:v.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:v.union([gh,lle,Zx]),direction:v.enum(["up","down"])}),kU=v.object({type:v.literal("NATIVE"),bounds:v.number().array().optional(),resolvedDescription:v.string().optional(),xPath:v.string().optional(),elementOnlySerializedXml:v.string().optional(),scrollDetails:cle.optional(),requirements:Qx.optional(),requiredRelatedElements:LU.array().optional(),memory:Xi.optional()}),ule=v.object({type:v.literal("WEBVIEW"),resolvedDescription:v.string().optional(),xPath:v.string().optional(),browserCache:Aa.optional(),memory:Xi.optional()}),qd=v.union([kU,ule]);var dle=v.object({left:v.number(),top:v.number(),right:v.number(),bottom:v.number()});v.object({newViewportBounds:dle});var mle=v.object({type:v.literal("CUSTOM"),target:Ns,cache:v.lazy(()=>UU).optional()}),FU=v.object({pixelDelta:v.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:v.union([gh,mle,Zx]),direction:v.enum(["up","down"])}),eM=(n=>(n.Native="native",n.Appium="appium",n))(eM||{}),tM=v.tuple([v.number(),v.number(),v.number(),v.number()]),BU=LU.extend({bounds:tM.optional(),browserCache:Aa.optional()}),UU=v.object({type:v.literal("NATIVE"),bounds:tM.optional(),resolvedDescription:v.string().optional(),sourceTree:v.nativeEnum(eM).optional(),xPath:v.string().optional(),elementOnlySerializedXml:v.string().optional(),scrollDetails:FU.optional(),requirements:Qx.optional(),requiredRelatedElements:BU.array().optional(),memory:Xi.optional()}),ple=v.object({type:v.literal("WEBVIEW"),bounds:tM.optional(),resolvedDescription:v.string().optional(),xPath:v.string().optional(),scrollDetails:FU.optional(),browserCache:Aa.optional(),requiredRelatedElements:BU.array().optional(),memory:Xi.optional()}),Kd=v.discriminatedUnion("type",[UU,ple]);var Ze=(A=>(A.AI_CHECK="AI_CHECK",A.AI_EXTRACT="AI_EXTRACT",A.TAP="TAP",A.TYPE="TYPE",A.PRESS="PRESS",A.PRESS_KEYBOARD="PRESS_KEYBOARD",A.OPEN_APP="OPEN_APP",A.KILL_APP="KILL_APP",A.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",A.SWIPE="SWIPE",A.SCROLL_TO="SCROLL_TO",A.SCREEN_CHECK="SCREEN_CHECK",A.ELEMENT_CHECK="ELEMENT_CHECK",A.DRAG_AND_DROP="DRAG_AND_DROP",A.JAVASCRIPT="JAVASCRIPT",A.REQUEST="REQUEST",A.WAIT="WAIT",A.ADD_FILE="ADD_FILE",A.INSTALL_APP="INSTALL_APP",A.UNINSTALL_APP="UNINSTALL_APP",A.TOGGLE_SETTINGS="TOGGLE_SETTINGS",A.ROTATE_ORIENTATION="ROTATE_ORIENTATION",A.ADB_COMMAND="ADB_COMMAND",A.APPIUM_EXECUTE="APPIUM_EXECUTE",A.STATE="STATE",A))(Ze||{}),ke=v__default.object({id:v__default.guid(),disableCache:v__default.boolean().optional()}),Yd=v__default.object({updatedAt:v__default.coerce.date().optional(),updatedAtLoggerTags:v__default.record(v__default.string(),v__default.string()).optional()}),Ko=Yd.extend({target:qd}),bh=Yd.extend({fromTarget:qd,toTarget:qd}),Ci=Yd.extend({target:Kd}),nM=Yd.extend({fromTarget:Kd,toTarget:Kd}),ta=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 zU=ke.extend({type:v__default.literal("ADB_COMMAND"),command:v__default.string(),jsonArgs:v__default.string().optional()});var fle=v__default.string().trim(),VU=ke.extend({type:v__default.literal("INSTALL_APP"),uri:fle});var jU=ke.extend({type:v__default.literal("OPEN_NOTIFICATION_DRAWER")});var za=(o=>(o.AIRPLANE_MODE="AIRPLANE_MODE",o.DATA="DATA",o.WIFI="WIFI",o.LOCATION="LOCATION",o))(za||{}),oM=ke.extend({type:v__default.literal("TOGGLE_SETTINGS"),settingsType:v__default.nativeEnum(za)});var GU=ke.extend({type:v__default.literal("UNINSTALL_APP"),packageName:v__default.string()});var jS=ke.extend({type:v__default.literal("APPIUM_EXECUTE"),command:v__default.string(),jsonArgs:v__default.string().optional()});var qU=ke.extend({type:v__default.literal("ADD_FILE"),file:v__default.string(),storageLocation:v__default.string()});var ks=ke.extend({type:v__default.literal("AI_CHECK"),assertion:v__default.string(),timeoutSecs:v__default.number().optional(),cache:Yd.extend({memory:qc.optional()}).optional()});var KU=ke.extend({type:v__default.literal("AI_EXTRACT"),goal:v__default.string(),schema:v__default.string().optional()});var Xd=ke.extend({type:v__default.literal("JAVASCRIPT"),code:v__default.string(),timeout:v__default.number().int().max(600).optional().describe("Max seconds for the code to complete")});var YU=ke.extend({type:v__default.literal("KILL_APP")});var Hr=(n=>(n.HOME="HOME",n.POWER="POWER",n))(Hr||{}),na=(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))(na||{}),Sh=ke.extend({type:v__default.literal("PRESS"),key:v__default.nativeEnum(Hr),longPress:v__default.boolean().optional()}),uM=Sh.extend({key:v__default.nativeEnum(na).or(v__default.nativeEnum(Hr))}),dM=Sh;var XU=ke.extend({type:v__default.literal("REQUEST")}).merge(Ff);var Fs=(n=>(n.PORTRAIT="PORTRAIT",n.LANDSCAPE="LANDSCAPE",n))(Fs||{}),mM=ke.extend({type:v__default.literal("ROTATE_ORIENTATION"),orientation:v__default.nativeEnum(Fs)});var yle=v__default.object({type:v__default.literal("CONTENT"),negated:v__default.boolean().optional(),value:v__default.string()}),Zd=ke.extend({type:v__default.literal("SCREEN_CHECK"),assertion:yle,timeout:v__default.number().int().min(0).max(Md).optional().describe("max seconds to wait for the assertion to be true")});var ZU=ke.extend({type:v__default.literal("STATE")});var ez=ke.extend({type:v__default.literal("WAIT"),timeoutSecs:v__default.number()});var Eh=v__default.discriminatedUnion("type",[ZU,ks,KU,Xd,ez,XU,mM,Zd,qU,YU]);v__default.discriminatedUnion("type",[...Eh.options,Sh]);var fM=ke.extend({type:v__default.literal("DRAG_AND_DROP"),fromTarget:Ns,toTarget:Ns,hoverDuration:v__default.number().optional(),dragDuration:v__default.number().optional()}),Th=fM.extend({cache:bh.optional()}),vh=fM.extend({cache:nM.optional()});var hM=ke.extend({type:v__default.literal("ELEMENT_CHECK"),target:Gd,assertion:Hy,timeout:v__default.number().int().min(0).max(Md).optional().describe("max seconds to wait for the assertion to be true")}),ou=hM.extend({cache:Ko.optional()}),iu=hM.extend({cache:Ci.optional()});var po=(n=>(n.ENTER="ENTER",n.BACKSPACE="BACKSPACE",n))(po||{}),Bs=(e=>(e.CLOSE_KEYBOARD="CLOSE_KEYBOARD",e))(Bs||{}),gM=ke.extend({type:v__default.literal("PRESS_KEYBOARD"),key:v__default.nativeEnum(po)}),bM=ke.extend({type:v__default.literal("PRESS_KEYBOARD"),key:v__default.nativeEnum(Bs).or(v__default.nativeEnum(po))});var rz=ke.extend({type:v__default.literal("OPEN_APP"),packageName:v__default.string(),activityName:v__default.string().optional(),intentExtras:v__default.string().optional()}),oz=ke.extend({type:v__default.literal("OPEN_APP"),packageName:v__default.string(),intentExtras:v__default.string().optional()});var yM=ke.extend({type:v__default.literal("SCROLL_TO"),target:Ns,direction:v__default.enum(["down","up"]),scrollableElement:VS,scrollStepPercent:v__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:v__default.number().int().min(1).max(50).optional().describe("Maximum number of scroll attempts before giving up. Default is 20.")}),wh=yM.extend({cache:Ko.optional()}),Ah=yM.extend({cache:Ci.optional()});var SM=ke.extend({type:v__default.literal("SWIPE"),direction:v__default.enum(["up","down","left","right"]),scrollableElement:VS,viewportPercent:v__default.number().optional(),durationMs:v__default.number().optional(),relativePosition:Rd.optional()}),Rh=SM.extend({cache:Ko.optional()}),xh=SM.extend({cache:Ci.optional()});var EM=ke.extend({type:v__default.literal("TAP"),target:Gd,longPress:v__default.boolean().optional(),longPressDurationMs:v__default.number().optional(),iterations:v__default.number().optional(),tapDelayMs:v__default.number().optional(),relativePosition:Rd.optional(),doubleTap:v__default.boolean().optional(),doubleTapDelayMs:v__default.number().optional()}),Mh=EM.extend({cache:Ko.optional()}),Ph=EM.extend({cache:Ci.optional()});var TM=ke.extend({type:v__default.literal("TYPE"),target:Gd.optional(),keyPressDelayMs:v__default.number().optional(),text:v__default.string(),clearContent:v__default.boolean().optional(),forceClearContent:v__default.boolean().optional()});var _h=TM.extend({cache:Ko.optional()}),Oh=TM.extend({cache:Ci.optional()});var lu=v__default.discriminatedUnion("type",[...Eh.options,Mh,_h,uM,bM,GU,VU,zU,jS,Th,jU,wh,Rh,oM,ou,rz]);var cu=v__default.discriminatedUnion("type",[...Eh.options,Ph,Oh,dM,gM,oz,xh,vh,Ah,iu,jS]);var GS={ANDROID:t=>lu.parse(t),IOS:t=>cu.parse(t)};var qS=v__default.union([v__default.string(),v__default.record(v__default.string(),v__default.unknown().optional())]),KS=Ds.extend({type:v__default.literal("MOBILE_PRESET_STEP"),keyPressDelayMs:v__default.number().optional()}),Pl=KS.extend({command:lu}),Il=KS.extend({command:cu}),em=v__default.object({moduleId:v__default.string(),inputs:v__default.record(v__default.string(),v__default.string()).optional()}),uu=Ds.merge(em.extend({type:v__default.literal("MOBILE_MODULE_STEP")}));em.extend({steps:v__default.lazy(()=>$a.array())});em.extend({steps:v__default.lazy(()=>Us.array())});var _l=(n=>(n.V2="2",n.V3="3",n))(_l||{});var vM=v__default.nativeEnum(_l),vle=Ca.extend({platform:v__default.literal("ANDROID"),resolvedGoal:v__default.string(),steps:v__default.lazy(()=>Pl.array()),autoGeneratedPostcondition:v__default.string().optional()}),Cle=Ca.extend({platform:v__default.literal("IOS"),resolvedGoal:v__default.string(),steps:v__default.lazy(()=>Il.array()),autoGeneratedPostcondition:v__default.string().optional()}),Dh=v__default.discriminatedUnion("platform",[vle,Cle]),Nh={ANDROID:t=>t.platform==="ANDROID"?t.steps:[],IOS:t=>t.platform==="IOS"?t.steps:[]},Ol=Ds.extend({type:v__default.literal("MOBILE_AI_ACTION_STEP"),text:v__default.string(),version:vM.optional(),cache:Dh.optional(),precondition:v__default.string().optional(),postcondition:v__default.string().optional()});function sz(t,e){let n={id:v4$1(),type:"AI_CHECK",assertion:e,timeoutSecs:5};return {id:v4$1(),type:"MOBILE_PRESET_STEP",command:GS[t](n)}}function YS(t){let e=t.postcondition?.trim();return e||t.cache?.autoGeneratedPostcondition?.trim()||void 0}function Lh({platform:t,step:e}){let n=YS(e);return {preconditionStep:e.precondition?.trim()?sz(t,e.precondition):void 0,generatedSteps:e.cache?Nh[t](e.cache):[],postconditionStep:n?sz(t,n):void 0}}var wle=v__default.discriminatedUnion("type",[ks,Zd,ou,Xd]),CM=KS.extend({command:wle}),Ale=v__default.discriminatedUnion("type",[ks,Zd,iu,Xd]),wM=KS.extend({command:Ale}),Rle=v__default.object({assertion:CM,steps:v__default.lazy(()=>$a.array())}),xle=v__default.object({assertion:wM,steps:v__default.lazy(()=>Us.array())}),Mle=Hd.extend({blocks:v__default.lazy(()=>Rle.array()),elseSteps:v__default.lazy(()=>$a.array()).optional()}),Ple=Hd.extend({blocks:v__default.lazy(()=>xle.array()),elseSteps:v__default.lazy(()=>Us.array()).optional()}),$a=v__default.discriminatedUnion("type",[Pl,uu,Ol,Mle]),Us=v__default.discriminatedUnion("type",[Il,uu,Ol,Ple]),tm=v__default.union([$a.array(),Us.array()]),Ile={ANDROID:$a,IOS:Us};function ra(t){return Ile[t]}var kh=v__default.object({parameterNames:v__default.string().array(),defaultParameters:v__default.record(v__default.string(),v__default.string()).optional(),parameterEnums:v__default.record(v__default.string(),v__default.string().array()).optional()}),nm=v__default.object({moduleId:Un,name:v__default.string(),description:v__default.string().nullish(),platform:v__default.nativeEnum(Je).optional().default("ANDROID"),parameters:kh.optional(),enabled:v__default.boolean().nullish(),schemaVersion:v__default.string()}),Va=nm.omit({name:true}),AM=Va.extend({steps:qS.array()}),RM=v__default.object({fileType:v__default.literal(ve.MOBILE_MODULE)}).merge(AM),lz=nm.omit({platform:true,schemaVersion:true}),_le={ANDROID:lz.extend({platform:v__default.literal("ANDROID"),steps:$a.array()}),IOS:lz.extend({platform:v__default.literal("IOS"),steps:Us.array()})};function cz(t){return _le[t]}var wi=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(wi||{}),uz=v__default.object({description:v__default.string().optional(),name:v__default.string().describe("name of the module"),parameters:kh.optional()}),XS=em.merge(uz).extend({platform:v__default.literal("ANDROID"),get steps(){return Kn.array()}}),JS=em.merge(uz).extend({platform:v__default.literal("IOS"),get steps(){return Yn.array()}});v__default.discriminatedUnion("platform",[XS,JS]);var xM=Ds.merge(XS).extend({type:v__default.literal("RESOLVED_MOBILE_MODULE")}),MM=Ds.merge(JS).extend({type:v__default.literal("RESOLVED_MOBILE_MODULE")}),dz={ANDROID:xM,IOS:MM};v__default.discriminatedUnion("platform",[xM,MM]);var Ole=v__default.object({assertion:CM,get steps(){return Kn.array()}}),PM=Hd.extend({get blocks(){return Ole.array()},get elseSteps(){return Kn.array().optional()}}),Dle=v__default.object({assertion:wM,get steps(){return Yn.array()}}),IM=Hd.extend({get blocks(){return Dle.array()},get elseSteps(){return Yn.array().optional()}}),Kn=v__default.discriminatedUnion("type",[xM,Pl,Ol,PM]),Yn=v__default.discriminatedUnion("type",[MM,Il,Ol,IM]);function mz(t){return Object.values(wi).includes(t)||Object.values(xn).includes(t)}var _M=(i=>(i.PRECONDITION="PRECONDITION",i.REPLAY="REPLAY",i.GENERATE="GENERATE",i.AUTOHEAL="AUTOHEAL",i.POSTCONDITION="POSTCONDITION",i))(_M||{}),pz=z.enum(["pending","running","success","failed"]),fz=z.object({type:z.literal("THOUGHT"),text:z.string(),blockId:z.string().optional()}),hz=z.object({type:z.literal("TOOL_CALL"),toolName:z.string()}),gz=z.object({type:z.literal("PHASE"),phase:z.nativeEnum(_M),failureMessage:z.string().optional()}),Nle=z.object({type:z.literal("STEP_UPDATE"),stepIndex:z.number(),step:Kn,status:pz,message:z.string().optional(),afterSnapshotId:z.string().optional()}),Lle=z.object({type:z.literal("STEP_UPDATE"),stepIndex:z.number(),step:Yn,status:pz,message:z.string().optional(),afterSnapshotId:z.string().optional()}),bz=z.object({type:z.literal("POSTCONDITION_AUTOGENERATED"),postcondition:z.string()}),kle=z.object({type:z.literal("CACHED_STEPS_GENERATED"),cachedSteps:Pl.array(),resolvedGoal:z.string()}),Fle=z.object({type:z.literal("CACHED_STEPS_GENERATED"),cachedSteps:Il.array(),resolvedGoal:z.string()}),yz=z.discriminatedUnion("type",[fz,hz,gz,Nle,kle,bz]),Sz=z.discriminatedUnion("type",[fz,hz,gz,Lle,Fle,bz]);var ja=v__default.object({message:v__default.string().optional(),startTime:v__default.number(),endTime:v__default.number(),status:v__default.nativeEnum(rn),trace:v__default.unknown().optional().optional(),beforeSnapshot:v__default.string().optional(),afterSnapshot:v__default.string().optional(),data:v__default.unknown().optional().optional().describe("output data from the step"),aiSuggested:v__default.boolean().optional(),beforeTestContext:zd.optional(),afterTestContext:zd.optional()}),Ez=ja.merge(Pl).extend({previousAttempts:v__default.lazy(()=>Mo.array()).optional()}),Ble=ja.merge(uu).extend({steps:v__default.lazy(()=>Mo.array()),name:v__default.string().optional(),previousAttempts:v__default.lazy(()=>Mo.array()).optional()}),Ule=ja.merge(Ol).extend({steps:v__default.lazy(()=>Mo.array()),previousAttempts:v__default.lazy(()=>Mo.array()).optional(),failureRecoveryReason:v__default.string().optional(),trajectory:yz.array().optional()}),zle=ja.merge(PM).extend({assertionResult:Ez.optional(),steps:v__default.lazy(()=>Mo.array()),previousAttempts:v__default.lazy(()=>Mo.array()).optional()}),Mo=v__default.discriminatedUnion("type",[Ez,Ble,Ule,zle]),Tz=ja.merge(Il).extend({previousAttempts:v__default.lazy(()=>Po.array()).optional()}),$le=ja.merge(uu).extend({steps:v__default.lazy(()=>Po.array()),name:v__default.string().optional(),previousAttempts:v__default.lazy(()=>Po.array()).optional()}),Vle=ja.merge(Ol).extend({steps:v__default.lazy(()=>Po.array()),previousAttempts:v__default.lazy(()=>Po.array()).optional(),failureRecoveryReason:v__default.string().optional(),trajectory:Sz.array().optional()}),jle=ja.merge(IM).extend({assertionResult:Tz.optional(),steps:v__default.lazy(()=>Po.array()),previousAttempts:v__default.lazy(()=>Po.array()).optional()}),Po=v__default.discriminatedUnion("type",[Tz,$le,Vle,jle]);var Hle=ja.extend({index:v__default.number().optional(),userFacingStepReference:v__default.string().optional(),description:v__default.string()}),vz=Hle.extend({beforeScreenshot:v__default.string().optional(),afterScreenshot:v__default.string().optional()});var Cz=z.object({attributesRequired:z.array(z.string()).optional(),textRequired:z.boolean().optional(),boundsRequired:z.boolean().optional(),positionSpecificity:z.enum(Ro).optional(),shapeSpecificity:z.enum(Ro).optional()}),Wle=z.object({id:z.number(),requirements:Cz}).array(),OM=z.object({thoughts:z.string(),id:z.number(),updatedMemory:Df.optional(),inWebview:z.boolean().optional(),requirements:Cz.optional(),additionalElements:Wle.optional()}),Gle=z.literal("SCROLL_TO"),wz=z.object({description:z.string(),screenXml:z.string(),screenshot:z.string(),source:Gle.optional(),memory:z.discriminatedUnion("type",[Xi,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional()}),Az=z.object({assertion:z.string(),screenXml:z.string(),screenshot:z.string(),memory:z.discriminatedUnion("type",[qc,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional()}),DM=z.object({thoughts:z.string(),result:z.boolean(),relevantElements:z.array(z.number()).optional(),updatedMemory:Nf.optional()}),Rz=z.object({failedResults:vz.array(),nextStepsSerialized:z.string().array(),currentScreenXml:z.string(),currentScreenshot:z.string(),customInstructions:z.string().optional(),testDescription:z.string()}),ZS=(r=>(r.LEGITIMATE="LEGITIMATE",r.RECOVERABLE="RECOVERABLE",r.INELIGIBLE="INELIGIBLE",r))(ZS||{}),NM=z.object({thoughts:z.string(),scenario:z.enum(ZS),instructions:z.string().nullish(),reasonSummary:z.string().nullish()});z.looseObject({type:z.literal("response.create")});var xz=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 Ai(t){switch(t){case "ANDROID":return "android";case "IOS":return "ios"}}var Dl=(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))(Dl||{}),qle=3;function Kle(t){return t==="MODULE"||t==="CONDITIONAL"||t==="SECTION"||t==="RESOLVED_MODULE"}function Mz(t){if(!Kle(t))switch(t){case "PRESET_ACTION":return 0;case "AI_ACTION":return 3;case "AI_ACTION_DYNAMIC":return 5;default:(n=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})();}}function Pz(t){switch(t.type){case "AI_EXTRACT":case "AI_ASSERTION":return qle;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:(n=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})();}}var LM=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 QS(t,e){let n=[],r=splitCookiesString(t);for(let o of r){let i=parseString(o,{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=LM.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});n.push(s);let l=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),c=o.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())||n.push({...s,name:d,value:m});}}return n}var Jle=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()}),Zle=z.object({entries:z.record(z.string(),z.array(z.tuple([z.unknown().optional(),z.unknown().optional()]))),version:z.number().optional()}),Iz=z.object({cookies:LM.array().optional(),origins:Jle.array().optional(),idb:z.record(z.string(),Zle).optional().describe("key is db name")});function rm(t,e){let n=[];return t.cloneSync()?.serializeSync()?.cookies.forEach(r=>{let o=LM.safeParse({name:r.key,...r});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),n.push(i);}),n}var Qle=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM","CUSTOM_COORDINATES"],_z=v__default.object({type:v__default.enum(Qle).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:v__default.string().or(v__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:v__default.number().or(v__default.null()).describe("Starting X coordinate in pixels. Only used if the container type is CUSTOM_COORDINATES, else set to null."),startY:v__default.number().or(v__default.null()).describe("Starting Y coordinate in pixels. Only used if the container type is CUSTOM_COORDINATES, else set to null."),deltaPixels:v__default.number().or(v__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.")}),ece=v__default.object({xPercent:v__default.number().min(0).max(1).describe("X coordinate as a fraction of the viewport width (0 = left edge, 1 = right edge)."),yPercent:v__default.number().min(0).max(1).describe("Y coordinate as a fraction of the viewport height (0 = top edge, 1 = bottom edge).")}),tce=v__default.string().or(ece).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."),Oz=v__default.object({type:v__default.literal("TAP"),target:tce,longPress:v__default.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),iterations:v__default.null().or(v__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:Rd.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."),nce=v__default.object({type:v__default.literal("PRESS"),key:v__default.nativeEnum(na)}).describe("Press a button on the device. Some buttons are physical (volume) while others are virtual (Back/Home/App Switcher)."),Dz=v__default.object({type:v__default.literal("AI_CHECK"),assertion:v__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:v__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."),Nz=v__default.object({type:v__default.literal("WAIT"),timeoutSecs:v__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.");v__default.object({type:v__default.literal("AI_EXTRACT"),goal:v__default.string().describe("Natural language description of what to extract from the current emulator state."),schema:v__default.string().or(v__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 Lz=v__default.object({type:v__default.literal("TYPE"),target:v__default.string().or(v__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:v__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:v__default.number().or(v__default.null()).describe("Milliseconds to wait between each key press. Useful for triggering auto-complete and other event listeners."),clearContent:v__default.boolean().or(v__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.")}),kz=v__default.object({type:v__default.literal("SWIPE"),direction:v__default.enum(["up","down","left","right"]).describe("Direction to swipe. Important: swiping up will scroll down, and vice versa."),container:_z,viewportPercent:v__default.number().min(.1).max(1).or(v__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:v__default.number().int().positive().or(v__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."),Fz=v__default.object({type:v__default.literal("SCROLL_TO"),targetDescription:v__default.string().describe("Description of the element to scroll to inside the container."),direction:v__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:_z,scrollStepPercent:v__default.number().min(.1).max(1).or(v__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:v__default.number().int().min(1).max(50).or(v__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."),kM=v__default.discriminatedUnion("type",[Oz,nce,Dz,Nz,Lz,kz,Fz]),rce=v__default.object({type:v__default.literal("PRESS"),key:v__default.nativeEnum(Hr)}).describe("Press a physical button on the device. Only HOME and POWER are available on iOS."),oce=v__default.object({type:v__default.literal("PRESS_KEYBOARD"),key:v__default.nativeEnum(po)}).describe("Press a key on the keyboard. Available keys: ENTER, BACKSPACE."),FM=v__default.discriminatedUnion("type",[Oz,rce,oce,Dz,Nz,Lz,kz,Fz]),eE=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 pn("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 pn("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")}}},Bz=t=>typeof t=="string"?{type:"description",description:t}:{type:"coordinates",xPercent:t.xPercent,yPercent:t.yPercent},Uz=t=>{let e=kM.parse(t);switch(e.type){case "TAP":return {id:v4$1(),type:"TAP",target:Bz(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};case "SWIPE":return {id:v4$1(),type:"SWIPE",direction:e.direction,scrollableElement:eE(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:eE(e.container),scrollStepPercent:e.scrollStepPercent??void 0,maxScrollAttempts:e.maxScrollAttempts??void 0};default:{throw new Error("Unreachable")}}},zz=t=>{let e=FM.parse(t);switch(e.type){case "TAP":return {id:v4$1(),type:"TAP",target:Bz(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};case "SWIPE":return {id:v4$1(),type:"SWIPE",direction:e.direction,scrollableElement:eE(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:eE(e.container),scrollStepPercent:e.scrollStepPercent??void 0,maxScrollAttempts:e.maxScrollAttempts??void 0};default:{throw new Error("Unreachable")}}};var $z=v__default.object({left:v__default.number(),top:v__default.number(),width:v__default.number(),height:v__default.number()});var Io={type:true,cache:true},Vz=[ks.pick(Io),ou.pick(Io),Mh.pick(Io),_h.pick(Io),Rh.pick(Io),wh.pick(Io),Th.pick(Io)],du=v__default.discriminatedUnion("type",Vz),jz=[ks.pick(Io),iu.pick(Io),Ph.pick(Io),Oh.pick(Io),xh.pick(Io),vh.pick(Io),Ah.pick(Io)],BM=v__default.discriminatedUnion("type",jz),im=t=>Ko.safeParse(t).success,mu=t=>bh.safeParse(t).success,UM=t=>Ci.safeParse(t).success;function zM(t){return !!t&&(t.type==="AI_ASSERTION"||t.type==="AI_CHECK")&&!!t.cache}var ice=Object.values(Ze).filter(t=>Vz.some(e=>e.shape.type.safeParse(t).success));function am(t){return ice.includes(t.type)}var ace=Object.values(Ze).filter(t=>jz.some(e=>e.shape.type.safeParse(t).success));function $M(t){return ace.includes(t.type)}function Ha(t,e){return t==="ANDROID"&&am(e)||t==="IOS"&&$M(e)}var tE=v__default.object({type:v__default.literal("MOBILE_AI_ACTION_STEP"),cache:Dh}),nE=v__default.union([du,tE]),rE=v__default.union([BM,tE]),oE={ANDROID:du,IOS:BM},Hz={ANDROID:t=>nE.parse(t),IOS:t=>rE.parse(t)},iE={ANDROID:t=>du.parse(t),IOS:t=>BM.parse(t)};var Uh=(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))(Uh||{}),zh=(r=>(r.US="us",r.EU="eu",r.AS="as",r))(zh||{}),Wa=(e=>(e.LOCAL="local",e))(Wa||{}),VM=v__default.nativeEnum(Uh).or(v__default.nativeEnum(zh)),jM=v__default.nativeEnum(Uh).or(v__default.nativeEnum(zh)).or(v__default.nativeEnum(Wa)),Jo="closest",Nl=jM.or(v__default.literal(Jo)),$h=(n=>(n.ANDROID_14="14",n.ANDROID_15="15",n))($h||{}),lm="14",HM=(e=>(e.IOS_26="26",e))(HM||{}),cm="26";var sce="-",lce=[Ud,sh],Gz=[Ud,sh],WM=2e4,Ri=class t{env={};varsFromMomenticEnvironment={};initialParams;constructor(e){this.initialParams=cloneDeep(e),this.reset(e);}static dummyContext(e=void 0,n=void 0,r={}){return new t({testName:e,envName:n,variablesFromEnvironment:r})}static fromSnapshot({snapshot:e,environmentVariables:n}){let r=e.env[Ud],o=e.env[sh],i={};for(let[s,l]of Object.entries(e.env))Gz.includes(s)||(n??{})[s]===void 0&&(i[s]=l);return new t({dynamicVariables:i,envName:r,testName:o,variablesFromEnvironment:n??{}})}setEnvVariables(e){let n=cloneDeep(e);this.env=Object.assign(this.env,n);}setInputs(e){e&&this.setEnvVariables(e);}setMomenticSystemVariable(e,n){this.varsFromMomenticEnvironment[e]=n;}getVariable(e){return this.env[e]}setVariable(e,n){lce.includes(e)||(this.env[e]=n);}getEnvName(){return this.env[Ud]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return cloneDeep(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy(),n=new Set;e.env=Object.fromEntries(Object.entries(e.env).map(([o,i])=>Gz.includes(o)||this.varsFromMomenticEnvironment[o]===void 0?[o,i]:(n.add(o),[o,sce])));for(let[o,i]of Object.entries(e.env)){if(!i)continue;let{jsonString:a}=Wz(JSON.stringify(i),1e3);try{e.env[o]=JSON.parse(a);}catch{e.env[o]=void 0;}}if(JSON.stringify(e.env).length>WM){for(let o of n)if(delete e.env[o],JSON.stringify(e.env).length<=WM)break}let{jsonString:r}=Wz(JSON.stringify(e.env),WM);try{e.env=JSON.parse(r);}catch{e.env={};}return e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.varsFromMomenticEnvironment=cloneDeep(e.variablesFromEnvironment),e.envName&&this.setMomenticSystemVariable(Ud,e.envName),e.testName&&this.setMomenticSystemVariable(sh,e.testName);}resetToInitial(){this.reset(this.initialParams);}getDynamicVariablesCopy(){return cloneDeep(this.env)}getVariablesFromEnvironmentCopy(){return cloneDeep(this.varsFromMomenticEnvironment)}};v.custom().refine(t=>t&&t.length>0).refine(t=>t&&t[0]instanceof File,{message:"Please upload a valid file."});var dr=t=>v.preprocess(e=>e==null?void 0:Array.isArray(e)?e:[e],v.array(t).optional()),dm=v.string().transform(t=>{let e=t.trim();return e.length===0?void 0:e}).optional();var cce=v__default.object({disableMomenticAccessibilityTree:v__default.boolean().optional(),autoGrantPermissions:v__default.boolean().optional(),disableXmlSnapshots:v__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:Ux.optional()}),pu="avdId",GM="iosDeviceType",qM="iosVersion",KM=cce.extend({region:jM.optional().describe("Do you want local or Limbar? Default behavior is Limbar (remote emulators)"),remoteEmulatorSettings:v__default.object({androidVersion:v__default.nativeEnum($h).optional()}).optional(),localEmulatorSettings:v__default.object({[pu]:dm,[GM]:dm,[qM]:dm}).optional(),geolocation:v__default.object({latitude:v__default.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:v__default.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),waitForStability:v__default.boolean().optional().describe("wait for stability before every targeting action")}),ho=v__default.object({retries:v__default.number().optional().describe("number of retries to run"),defaultChannel:v__default.string().optional().describe("Default app release channel to use when installing from managed mobile artifacts."),defaultTag:v__default.string().optional().describe("Default app artifact tag to use. If not set, the latest available tag is used."),defaultEnv:v__default.string().optional().describe("Default mobile environment name to load variables from at runtime."),defaultApkFilePath:dm.describe("APK to install when using the emulator in the local region."),defaultAppFilePath:dm.describe("App file (e.g. .app or .ipa) to install when using the emulator in the local region."),emulator:KM.optional().describe("Emulator configuration for local or remote mobile execution, including region and local emulator overrides."),ai:$x.optional().describe("AI behavior overrides for this mobile test, such as memory and failure recovery settings.")}),aE=v__default.object({id:Un,description:v__default.string(),schemaVersion:v__default.string(),settings:ho.optional(),disabled:v__default.boolean().optional(),labels:v__default.array(v__default.string()).optional()}),mm=aE.extend({platform:v__default.literal("ANDROID").optional().default("ANDROID")}),pm=aE.extend({platform:v__default.literal("IOS")}),kl=v__default.discriminatedUnion("platform",[mm,pm]),qz=v__default.object({fileType:v__default.literal(ve.MOBILE_TEST)}),sE=qz.merge(mm),lE=qz.merge(pm),cE=v__default.discriminatedUnion("platform",[sE,lE]),Kz=mm.merge(v__default.object({steps:v__default.array($a)})),Yz=pm.merge(v__default.object({steps:v__default.array(Us)}));v__default.discriminatedUnion("platform",[Kz,Yz]);var uce=sE.merge(Kz),dce=lE.merge(Yz),Xz=v__default.discriminatedUnion("platform",[uce,dce]);v__default.object({name:v__default.string(),steps:v__default.array($a).optional(),settings:ho.optional()});var Jz=mm.extend({steps:Kn.array(),beforeSteps:Kn.array().optional(),afterSteps:Kn.array().optional()}),Zz=pm.extend({steps:Yn.array(),beforeSteps:Yn.array().optional(),afterSteps:Yn.array().optional()});v__default.discriminatedUnion("platform",[Jz,Zz]);var mce=Jz.extend({name:v__default.string()}),pce=Zz.extend({name:v__default.string()});v__default.discriminatedUnion("platform",[mce,pce]);var Pr=v__default.object({startTime:v__default.number(),endTime:v__default.number().optional(),durationMs:v__default.number().optional(),error:v__default.string().optional(),result:v__default.unknown().optional().optional(),attributes:v__default.record(v__default.string(),v__default.unknown().optional()),subSpans:v__default.lazy(()=>_ce.array())});var YM=Pr.extend({type:v__default.literal("SECTION"),name:v__default.string()}),hce=Pr.extend({type:v__default.literal("GET_PAGE_STATE")}),gce=Pr.extend({type:v__default.literal("GET_PAGE_SCREENSHOT")}),bce=Pr.extend({type:v__default.literal("SMART_WAITING")}),yce=Pr.extend({type:v__default.literal("SCROLL_ELEMENT_INTO_VIEW")}),Sce=Pr.extend({type:v__default.literal("AI_LOCATOR_CALL"),screenshotSnapshotId:v__default.string().optional(),result:v__default.object({id:v__default.number(),thoughts:v__default.string(),citations:sr.array().optional()}).optional()}),Ece=Pr.extend({type:v__default.literal("AI_ASSERTION_CALL"),screenshotSnapshotId:v__default.string().optional(),elementScreenshotSnapshotId:v__default.string().optional(),result:v__default.object({thoughts:v__default.string(),result:v__default.boolean(),citations:sr.array().optional()}).optional()}),Tce=Pr.extend({type:v__default.literal("AI_EXTRACTION_CALL"),screenshotSnapshotId:v__default.string().optional(),browserStateSnapshotId:v__default.string().optional(),result:v__default.object({thoughts:v__default.string().optional(),result:v__default.unknown().optional().optional()}).optional()}),vce=Pr.extend({type:v__default.literal("ELEMENT_ASSERTION"),name:v__default.string(),result:v__default.object({success:v__default.boolean(),message:v__default.string().optional()}).optional()}),Cce=Pr.extend({type:v__default.literal("BROWSER_INTERACTION"),name:v__default.string(),coordinates:v__default.object({x:v__default.number(),y:v__default.number()}).optional(),value:v__default.string().optional(),selector:v__default.string().optional()}),wce=Pr.extend({type:v__default.literal("CACHE_RESOLUTION"),resolutionMethod:v__default.string().optional(),cacheMissReason:v__default.nativeEnum(xd).optional(),targetSource:v__default.string().optional(),elementScreenshotSnapshotId:v__default.string().optional(),result:v__default.object({serializedElement:v__default.string()}).optional()}),Ace=Pr.extend({type:v__default.literal("TARGET_RESOLUTION"),elementScreenshotSnapshotId:v__default.string().optional(),result:v__default.object({serializedElement:v__default.string()}).optional()}),Rce=Pr.extend({type:v__default.literal("LOCATOR_REDIRECT"),elementScreenshotSnapshotId:v__default.string().optional(),result:v__default.object({outcome:v__default.string(),logs:v__default.string().array().optional(),serializedElement:v__default.string().optional(),relativeClickPoint:v__default.object({x:v__default.number(),y:v__default.number()}).optional(),force:v__default.boolean().optional()}).optional()}),xce=Pr.extend({type:v__default.literal("WAIT_FOR_STABILITY")}),Mce=Pr.extend({type:v__default.literal("GENERIC"),name:v__default.string()}),Pce=Pr.extend({type:v__default.literal("PAGE_ASSERTION"),name:v__default.string(),result:v__default.object({success:v__default.boolean(),message:v__default.string().optional()}).optional()}),Ice=Pr.extend({type:v__default.literal("AUTO_FOLLOW_NEW_TABS"),result:v__default.object({followed:v__default.boolean()}).optional()});function Qz(t){return t.type==="CACHE_RESOLUTION"||t.type==="TARGET_RESOLUTION"}var _ce=v__default.discriminatedUnion("type",[YM,hce,gce,bce,yce,Sce,Ece,Tce,vce,Cce,Ace,wce,Rce,xce,Pce,Mce,Ice]);var Zo=v__default.object({startTime:v__default.number(),endTime:v__default.number().optional(),durationMs:v__default.number().optional(),error:v__default.string().optional(),targetBounds:$z.optional(),result:v__default.unknown().optional().optional(),attributes:v__default.record(v__default.string(),v__default.unknown().optional()),subSpans:v__default.lazy(()=>XM.array())});var Oce=Zo.extend({type:v__default.literal("SECTION"),name:v__default.string()}),Dce=Zo.extend({type:v__default.literal("AI_LOCATOR_CALL"),result:v__default.object({id:v__default.number(),thoughts:v__default.string()}).optional()}),Nce=Zo.extend({type:v__default.literal("AI_ASSERTION_CALL"),result:v__default.object({thoughts:v__default.string(),result:v__default.boolean()}).optional()}),Lce=Zo.extend({type:v__default.literal("AI_EXTRACTION_CALL"),screenshotSnapshotId:v__default.string().optional(),emulatorStateSnapshotId:v__default.string().optional(),result:v__default.object({thoughts:v__default.string().optional(),result:v__default.unknown().optional().optional()}).optional()}),kce=Zo.extend({type:v__default.literal("TARGET_RESOLUTION"),result:v__default.object({serializedElement:v__default.string()}).optional()}),Fce=Zo.extend({type:v__default.literal("EMULATOR_INTERACTION"),name:v__default.string(),withinWebview:v__default.boolean().optional()}),Bce=Zo.extend({type:v__default.literal("EMULATOR_READ_STATE"),name:v__default.string()}),Uce=Zo.extend({type:v__default.literal("ELEMENT_ASSERTION"),name:v__default.string(),result:v__default.object({success:v__default.boolean(),message:v__default.string().optional()}).optional()}),zce=Zo.extend({type:v__default.literal("CACHE_RESOLUTION")}),$ce=Zo.extend({type:v__default.literal("WAIT_FOR_SCREENSHOT_STABILITY")}),Vce=Zo.extend({type:v__default.literal("WAIT_FOR_PAGE_STABILITY")}),jce=Zo.extend({type:v__default.literal("WEBVIEW_LOCATOR_CALL"),webTrace:YM}),Hce=Zo.extend({type:v__default.literal("GENERIC"),name:v__default.string()}),XM=v__default.discriminatedUnion("type",[Oce,Dce,Nce,Lce,kce,Fce,Bce,Uce,zce,$ce,Vce,jce,Hce]);z.object({testId:z.string(),sessionId:z.string()});var e1=z.object({uploadUrl:z.string(),id:z.string()});var hm=(n=>(n.LOCAL="local",n.REMOTE="remote",n))(hm||{});v__default.nativeEnum(hm);function gm({overrideAvdId:t,overrideApkFilePath:e,emulatorSettings:n,defaultApkFilePath:r,envVariables:o}){let i=Qo(o?.[Cl]),{filePath:a,source:s}=t1({overrideFilePath:e,defaultFilePath:r,envFilePath:Qo(o?.[zB])});return {avdId:Qo(t)??Qo(n?.localEmulatorSettings?.[pu])??i,apkFilePath:a,apkFilePathSource:s}}function bm({overrideDeviceType:t,overrideIosVersion:e,overrideAppFilePath:n,emulatorSettings:r,defaultAppFilePath:o,envVariables:i}){let a=Qo(i?.[wl]),s=Qo(i?.[$B]),{filePath:l,source:c}=t1({overrideFilePath:n,defaultFilePath:o,envFilePath:Qo(i?.[VB])});return {deviceType:Qo(t)??Qo(r?.localEmulatorSettings?.[GM])??a,iosVersion:Qo(e)??Qo(r?.localEmulatorSettings?.[qM])??s,appFilePath:l,appFilePathSource:c}}function Qo(t){if(typeof t!="string")return;let e=t.trim();return e||void 0}function t1({overrideFilePath:t,defaultFilePath:e,envFilePath:n}){let r=Qo(t),o=Qo(e);return {filePath:r??o??n,source:r?"override":o?"default":n?"env":void 0}}z.string().refine(t=>ap.valid(t),{error:"must be a valid semver string"});function JM(t){if(t!==void 0)return t===true||t==="true"||t==="1"}function n1(t){return t==="on-fail"?"on-fail":t==="false"?false:!!t}var ym=55555,uE="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 Kce=z.union([z.string(),z.date()]).transform(t=>t instanceof Date?t:new Date(t)),r1=z.object({phoneNumber:z.string(),expiresAt:Kce,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 o1=z.object({email:z.string(),prefix:z.string(),expiresAt:z.coerce.date()}),dE=(n=>(n.RAW="RAW",n.RESPONSE="RESPONSE",n))(dE||{}),i1=z.object({body:z.string().nullish(),status:z.number().optional(),headers:z.array(z.tuple([z.string(),z.string()])).optional()}),Yce=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(),Xce=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(),a1=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:Yce,response:Xce,additionalBindings:z.record(z.string(),z.unknown().optional()).optional()}),timeoutMs:z.number().optional(),disallowVariableUpdates:z.boolean().optional(),responseSerialization:z.enum(dE).optional()});var Fl=9e4;var s1=(f=>(f.DisableClickhouseCaches="disable_clickhouse_caches",f.ShowZeroOpacityElements="show_zero_opacity_elements",f.VisualActions="visual_actions",f.RagV2="rag_v2",f.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",f.GlobalLocatorRedirect="global_locator_redirect",f.FakerConstantSeed="faker_constant_seed",f.AutoExpandIframes="auto_expand_iframes",f.MobileNewAiActionStepsUseV3="mobile_new_ai_action_steps_use_v3",f.PerformanceInsights="performance_insights",f.ShowKnowledgeBase="show_knowledge_base",f.AppGraphBackend="app_graph_backend",f.AppGraphUI="app_graph_ui",f.WebEditorV3="web_editor_v3",f))(s1||{});var Bl=z.union([z.string(),z.number(),z.boolean(),z.null(),z.record(z.string(),z.lazy(()=>Bl)),z.array(z.lazy(()=>Bl))]);var fu={".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"},l1=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"];var c1=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)})]),Zce=z.object({githubLogin:z.string().optional(),email:z.string().optional()}),Qce=z.object({baseSha:z.string().min(1),headSha:z.string().min(1)}),eue=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()}),tue=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()});eue.extend(tue.shape).extend({changes:z.array(c1).min(1),coAuthorRange:Qce.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 u1=z.object({pullRequestUrl:z.url(),pullRequestNumber:z.number(),headBranch:z.string(),commitSha:z.string(),created:z.boolean(),authors:z.array(Zce).optional()});z.object({branch:z.string().min(1).max(255),commitMessage:z.string().min(1),changes:z.array(c1).min(1)});var d1=z.object({branch:z.string(),commitSha:z.string(),committed:z.boolean()}),m1=z.object({issueNumber:z.number(),htmlUrl:z.url(),headBranch:z.string().min(1),baseBranch:z.string().min(1),latestCommitSha:z.string().min(1),title:z.string().optional(),body:z.string().optional()}),nue=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()}),rue=z.object({sha:z.string().min(1),author:z.string().optional(),email:z.string().optional(),date:z.string().optional(),message:z.string()}),p1=z.object({mergeBaseSha:z.string().min(1),totalCommits:z.number(),commits:z.array(rue),files:z.array(nue)}),f1=z.object({content:z.string().nullable()}),h1=z.object({name:z.string().min(1),protected:z.boolean()}),g1=z.object({iid:z.number(),webUrl:z.url(),sourceBranch:z.string().min(1),targetBranch:z.string().min(1),latestCommitSha:z.string().min(1)}),oue=z.object({name:z.string(),path:z.string(),body:z.string()}),b1=z.object({template:oue});function y1(t){let[e,n,...r]=t.split("/");if(!(!e||!n||r.length>0))return {owner:e,repo:n}}function S1(t){let e=y1(t);if(e)return e;throw new pn(`Invalid GitHub repository string: ${t}. Expected format "owner/repo".`)}var mE=z.enum(["TERMINOLOGY","AGENT_RULE","FLOW"]),Vh=z.enum(["CANDIDATE","ACTIVE","PENDING_CONFLICT","REJECTED","ARCHIVED"]),QM=z.enum(["MANUAL","CRAWLER","SYSTEM","GENERATED","IMPORTED"]),iue=z.enum(["PENDING","INDEXING","INDEXED","FAILED"]);var eP=z.enum(["locator","assertion","visual-assertion","text-extraction","failure-recovery","result-classification","ai-action"]),aue=z.object({canonicalTerm:z.string().min(1),definition:z.string().min(1),examples:z.array(z.string().min(1)).default([])}),sue=z.object({agentSubtype:eP,instruction:z.string().min(1)}),lue=z.object({intent:z.string().min(1),steps:z.string().min(1),successState:z.string().min(1)}),pE=z.discriminatedUnion("type",[z.object({type:z.literal("TERMINOLOGY"),data:aue}),z.object({type:z.literal("AGENT_RULE"),data:sue}),z.object({type:z.literal("FLOW"),data:lue})]);var E1=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()})]),tP=z.object({id:z.string(),organizationId:z.string(),appId:z.string().nullable(),testId:z.string().nullable(),environmentId:z.string().nullable(),type:mE,status:Vh,source:QM,trust:z.int().min(0).max(100),title:z.string(),body:z.string(),data:pE,provenance:E1,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:pE,status:Vh,trust:z.int().min(0).max(100),changedByUserId:z.string().nullable(),changedBySystem:z.string().nullable(),changeNote:z.string().nullable(),changedAt:z.iso.datetime()});var cue=z.object({appId:z.string().nullable().optional(),testId:z.string().nullable().optional(),environmentId:z.string().nullable().optional()});cue.extend({type:mE,status:Vh.optional(),source:QM,trust:z.int().min(0).max(100).optional(),title:z.string().min(1).max(500),data:pE,provenance:E1});z.object({title:z.string().min(1).max(500).optional(),data:pE.optional(),status:Vh.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,n])=>e!=="changeNote"&&n!==void 0),{error:"at least one updatable field is required"});z.object({appId:z.string().nullable().optional(),type:dr(mE),status:dr(Vh),source:dr(QM),agentSubtype:dr(eP),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 T1=z.enum(["active-only","active-plus-candidates","review"]);z.object({query:z.string().min(1),appId:z.string().nullable().optional(),types:mE.array().min(1).max(3).optional(),agentSubtype:eP.optional(),testId:z.string().nullable().optional(),environmentId:z.string().nullable().optional(),mode:T1.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 uue=z.object({combined:z.number(),lexical:z.number().nullable(),vector:z.number().nullable()}),due=z.object({item:tP,rank:z.int().min(1),score:uue,topChunkIndex:z.int().nullable()}),v1=z.object({hits:z.array(due),mode:T1});var Sm=v__default.object({platformSep:v__default.string(),fullPathSegments:v__default.string().array(),relativePathSegments:v__default.string().array(),relativePath:v__default.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:v__default.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:v__default.coerce.date(),createdAt:v__default.coerce.date()});var mue=z.array(Sm.extend({id:z.string(),name:z.string(),description:z.string().optional(),labels:z.string().array().optional()})),pue=Sm.extend({id:z.string(),name:z.string(),description:z.string().optional(),content:fS}),fue=z.array(pue);z.object({tests:mue,modules:fue,labels:z.string().array()});z.string().array();z.object({pathSegments:z.string().array()});Xx.merge(hh);z.object({schemaVersion:z.string(),stepLists:Ld});hh.partial().merge(Ua.pick({id:true}));var fE="1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID.",hue={name:z.string().min(1).max(255).describe(fE),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(La).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:Is.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(hue);Xx.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:fS});z.object({relativeFilePath:z.string()});z.object({name:z.string(),description:z.string(),enabled:z.boolean(),steps:z.lazy(()=>fn.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(UB);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 nP=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()}),C1=z.object({pathSegments:z.array(z.string())});z.object({absolutePath:z.string(),pathSegments:z.array(z.string()),contents:z.array(nP)});var w1=z.object({sourceDirectoryPath:z.string().optional(),value:z.string(),allowedExtensions:z.array(z.string()).optional()}),gue=z.object({name:z.string(),value:z.string(),isDirectory:z.boolean()});z.object({suggestions:z.array(gue)});var A1=z.object({pathSegments:z.array(z.string())}),R1=z.object({pathSegments:z.array(z.string()),newPathSegments:z.array(z.string())}),x1=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 M1=typeof process<"u"&&true&&true,hE=58889;var bue=z.array(Sm.extend({id:z.string(),name:z.string(),description:z.string().optional(),labels:z.string().array().optional()})),yue=z.array(Sm.extend({id:z.string(),name:z.string(),description:z.string().optional(),content:z.discriminatedUnion("platform",[XS,JS])})),P1={name:z.string().min(1).max(255).describe(fE),description:z.string().optional(),settings:ho.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 ${Zc} 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:ch.optional().default("ANDROID").describe("For LLM: Never assign this unless the user explicitly asks for iOS. Defaults to Android.")},{defaultEnv:o7e,...I1}=P1;var _1=z.object(P1);z.object({id:z.string(),fileName:z.string(),fullPath:z.string(),relativeFilePath:z.string().describe("relative to project root")});var O1=z.object({settings:ho.optional(),labels:z.array(z.string()).optional()}),Sue=O1.extend({platform:z.literal("IOS"),steps:Yn.array().optional(),beforeSteps:Yn.array().optional(),afterSteps:Yn.array().optional()}),Eue=O1.extend({platform:z.literal("ANDROID"),steps:Kn.array().optional(),beforeSteps:Kn.array().optional(),afterSteps:Kn.array().optional()}),D1=z.discriminatedUnion("platform",[Sue,Eue]);z.object({message:z.literal("ok")});var N1=z.object({name:Jc.optional(),description:z.string().min(1).optional(),settings:ho.optional(),disabled:z.boolean().optional(),labels:z.array(z.string()).optional()});z.object({message:z.string(),newRelativeTestPath:z.string().optional()});var L1=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")}),k1=z.object({name:Jc});z.object({tests:bue,modules:yue,labels:z.string().array()});var F1=z.object({name:z.string(),description:z.string(),enabled:z.boolean()}).partial(),B1=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")}),Tue=B1.extend({platform:z.literal("ANDROID"),steps:Kn.array()}),vue=B1.extend({platform:z.literal("IOS"),steps:Yn.array()}),U1=z.discriminatedUnion("platform",[Tue,vue]),rP=z.object({name:z.string().describe(fE),description:z.string().optional(),enabled:z.boolean().default(true),platform:ch.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:kh.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 z1=z.object({name:z.string()});z.object({relativeFilePath:z.string()});var $1=z.object({stepId:z.string(),testId:z.string(),environment:z.string().optional(),parentStepIdChain:z.array(z.string()),value:du}),Cue=$1.extend({platform:z.literal("ANDROID"),steps:Kn.array()}),wue=$1.extend({platform:z.literal("IOS"),steps:Yn.array()}),V1=z.discriminatedUnion("platform",[Cue,wue]),j1=z.object({stepId:z.string(),testId:z.string(),environment:z.string().optional(),parentStepIdChain:z.array(z.string())}),Aue=j1.extend({platform:z.literal("ANDROID"),steps:Kn.array()}),Rue=j1.extend({platform:z.literal("IOS"),steps:Yn.array()}),H1=z.discriminatedUnion("platform",[Aue,Rue]),W1=z.object({platform:z.enum(Je),completionType:z.string(),traceIds:z.string().array()}),G1=z.object({completionType:z.string(),traceIds:z.string().array()});var q1=(r=>(r.AZURE="AZURE",r.KERNEL="KERNEL",r.BROWSERBASE="BROWSERBASE",r))(q1||{}),oP=z.enum(q1);z.object({azureRegion:z.string().optional(),azureWorkspaceId:z.string().optional()});z.object({});var xue=z.enum(["us-west-2","us-east-1","eu-central-1","ap-southeast-1"]);z.object({region:xue.optional()});var iP=(e=>(e.TEST_REVIEW="TEST_REVIEW",e))(iP||{});var Mue=z.object({type:z.literal("DESCRIPTION_UPDATE"),thoughts:z.string()}),gE=z.discriminatedUnion("type",[Mue]),Pue=z.object({testId:z.string(),name:z.string(),orgId:z.string(),runId:z.string(),steps:fn.array(),purpose:z.enum(iP),details:gE.or(gE.array()).optional()});Pue.pick({name:true,orgId:true});var Iue=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(iP),details:gE.or(gE.array()).optional(),applied:z.boolean().nullish(),appliedAt:z.coerce.date().nullish()}),K1=Iue.extend({steps:fn.array()});var Y1=z.enum(["v1","v2"]);var Oue=z.enum(["element","content","attribute","tag_name","style"]),bE=z.enum(["exists","visible","enabled","editable","focused","contains","equals","starts_with"]);[...dF,...uF].forEach(t=>{if(!bE.options.includes(t.toLowerCase()))throw new Error(`V2CheckConditionSchema is missing option: ${t}`)});var aP={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}},Z1={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"}},Q1={ELEMENT_EXISTENCE:"element",ELEMENT_CONTENT:"content",ELEMENT_ATTRIBUTE:"attribute",ELEMENT_NAME:"tag_name",ELEMENT_STYLE:"style"};function X1(t){return {alias:sP(t),subject:t.subject,condition:t.condition,negated:t.negated,assertionType:aP[t.subject].assertionType,requiresName:aP[t.subject].requiresName,requiresValue:t.subject!=="element"&&t.condition!=="exists"}}function sP(t){let e=aP[t.subject],n=Z1[t.condition];if(!e$(t.subject,t.condition))throw new Error(`Unsupported element check alias for subject '${t.subject}' and condition '${t.condition}'.`);let r=t.negated?n.negativeAliasSuffix:n.positiveAliasSuffix;return `checkElement${e.aliasPrefix}${r}`}function e$(t,e){let n=Z1[e],r=n.elementCondition,o=n.contentOperation;return t==="element"?r!==void 0:o!==void 0}var Due=Oue.options.flatMap(t=>bE.options.flatMap(e=>e$(t,e)?[X1({subject:t,condition:e,negated:false}),X1({subject:t,condition:e,negated:true})]:[])),t$=new Map(Due.map(t=>[t.alias,t]));var Nue=z.enum(hi),Lue=z.enum(Vr);function _o(t){return t$.get(t)}function r$(t){let e=Q1[t.type],n=t.type==="ELEMENT_EXISTENCE"?t.condition:t.operation;return sP({subject:e,condition:kue(n),negated:t.negated})}function o$(t){return Nue.parse(t.toUpperCase())}function jh(t){return Lue.parse(t.toUpperCase())}function kue(t){return bE.parse(t.toLowerCase())}var Be={saveAs:z.string().optional(),retries:z.number().optional(),skipped:z.boolean().optional(),comment:z.string().optional()};z.object(Be);var yE=Object.keys(Be);function _e(t){return z.union([z.strictObject({[t.key]:t.simplified}),z.strictObject({[t.key]:t.detailed})])}function on(t){return z.strictObject({[t.key]:t.detailed})}var i$='Coordinates must be "x, y" pixel values, e.g. "100, 200"',Em=z.union([Ra,z.string().regex(/^\s*-?\d+(?:\.\d+)?\s*,\s*-?\d+(?:\.\d+)?\s*$/,i$)],{error:i$});z.union([z.string(),Ra]);var ei={css:z.string().optional(),coords:Em.optional(),x:z.union([z.number(),z.string()]).optional(),y:z.union([z.number(),z.string()]).optional()},cP={on:z.string().optional(),...ei},ti={...Be,useSelector:z.boolean().optional(),force:z.boolean().optional(),DANGEROUS_FORCE_DYNAMIC:z.boolean().optional(),iframe:z.string().optional()},Hh={...ti,offset:Em.optional()};function go({schema:t,descriptionKey:e,required:n=true}){return t.superRefine((r,o)=>{let a=[e in r?Object.entries(r).find(([s])=>s===e)?.[1]:void 0,"css"in r?r.css:void 0,"coords"in r?r.coords:void 0,"x"in r||"y"in r?true:void 0].filter(s=>s!==void 0).length;n&&a!==1&&o.addIssue({code:"custom",message:`Use exactly one target: ${e}, css, coords, or x/y.`}),!n&&a>1&&o.addIssue({code:"custom",message:`Use at most one target: ${e}, css, coords, or x/y.`}),("x"in r||"y"in r)&&(!("x"in r)||r.x===void 0||!("y"in r)||r.y===void 0)&&o.addIssue({code:"custom",message:"x and y must be provided together."});})}var Fue=go({descriptionKey:"on",schema:z.strictObject({...cP,...Hh,times:z.int().min(1).optional(),rightClick:z.boolean().optional(),waitForDownload:z.boolean().optional(),delay:z.number().optional(),downloadTimeout:z.number().optional()})}),Bue=go({descriptionKey:"on",schema:z.strictObject({...cP,...Hh,rightClick:z.boolean().optional(),waitForDownload:z.boolean().optional(),delay:z.number().optional(),downloadTimeout:z.number().optional()})}),Uue=go({descriptionKey:"on",schema:z.strictObject({...cP,...Hh,times:z.int().min(1).optional(),waitForDownload:z.boolean().optional(),delay:z.number().optional(),downloadTimeout:z.number().optional()})}),a$=_e({key:"click",simplified:z.string(),detailed:Fue}),s$=_e({key:"doubleClick",simplified:z.string(),detailed:Bue}),l$=_e({key:"rightClick",simplified:z.string(),detailed:Uue}),zue=go({descriptionKey:"into",required:false,schema:z.strictObject({text:z.string(),into:z.string().optional(),...ei,...Hh,pressEnter:z.boolean().optional(),clear:z.union([z.literal("inputs"),z.literal("always"),z.literal("never"),z.boolean()]).optional(),delay:z.number().optional()})}),c$=_e({key:"type",simplified:z.string(),detailed:zue}),u$=on({key:"select",detailed:go({descriptionKey:"from",schema:z.strictObject({from:z.string().optional(),...ei,label:z.string().optional(),value:z.string().optional(),index:z.union([z.string(),z.number()]).optional(),...ti})}).superRefine((t,e)=>{[t.label,t.value,t.index].filter(r=>r!==void 0).length!==1&&e.addIssue({code:"custom",message:"select requires exactly one of label, value, or index"});})}),d$=_e({key:"hover",simplified:z.string(),detailed:go({descriptionKey:"on",schema:z.strictObject({on:z.string().optional(),...ei,...Hh})})}),m$=on({key:"blur",detailed:go({descriptionKey:"on",required:false,schema:z.strictObject({on:z.string().optional(),...ei,...ti})})}),p$=_e({key:"focus",simplified:z.string(),detailed:go({descriptionKey:"on",schema:z.strictObject({on:z.string().optional(),...ei,...ti})})}),f$=on({key:"dragAndDrop",detailed:z.strictObject({from:z.string().optional(),to:z.string().optional(),fromCss:z.string().optional(),toCss:z.string().optional(),fromCoords:Em.optional(),toCoords:Em.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(),...ti}).superRefine((t,e)=>{let n=[t.from,t.fromCss,t.fromCoords,t.fromX!==void 0||t.fromY!==void 0?true:void 0].filter(o=>o!==void 0).length,r=[t.to,t.toCss,t.toCoords,t.toX!==void 0||t.toY!==void 0?true:void 0].filter(o=>o!==void 0).length;n!==1&&e.addIssue({code:"custom",message:"Use exactly one from target."}),r!==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."});})}),h$=z.union([z.strictObject({mouseDrag:Em}),z.strictObject({mouseDrag:go({descriptionKey:"from",required:false,schema:z.strictObject({from:z.string().optional(),...ei,delta:Em,steps:z.number().optional(),...ti})})})]),g$=_e({key:"press",simplified:z.string(),detailed:z.strictObject({key:z.string(),repeat:z.number().optional(),delay:z.number().optional(),convertMeta:z.boolean().optional(),...Be})}),b$=_e({key:"keyDown",simplified:z.string(),detailed:z.strictObject({key:z.string(),convertMeta:z.boolean().optional(),...Be})}),y$=_e({key:"keyUp",simplified:z.string(),detailed:z.strictObject({key:z.string(),convertMeta:z.boolean().optional(),...Be})}),S$=_e({key:"navigate",simplified:z.string(),detailed:z.strictObject({url:z.string(),timeout:z.number().optional(),...Be})}),E$=_e({key:"newTab",simplified:z.string(),detailed:z.strictObject({url:z.string(),timeout:z.number().optional(),...Be})}),T$=_e({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(),...Be}).superRefine((t,e)=>{[t.substring,t.regex,t.index].filter(r=>r!==void 0).length!==1&&e.addIssue({code:"custom",message:"switchTab requires exactly one of substring, regex, or index"});})}),v$=on({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(),...Be}).superRefine((t,e)=>{[t.substring,t.regex,t.index].filter(r=>r!==void 0).length<=1||e.addIssue({code:"custom",message:"closeTab accepts at most one of substring, regex, or index"});})}),C$=on({key:"goBack",detailed:z.strictObject(Be)}),w$=on({key:"goForward",detailed:z.strictObject(Be)}),A$=on({key:"refresh",detailed:z.strictObject({timeout:z.number().optional(),...Be})}),R$=z.enum(["goBack","goForward","refresh","paste","authSave","offline","online","blur","visualDiff","captcha","closeTab"]),x$=_e({key:"scrollUp",simplified:z.number().nonnegative(),detailed:go({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...ei,...ti})})}),M$=_e({key:"scrollDown",simplified:z.number().nonnegative(),detailed:go({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...ei,...ti})})}),P$=_e({key:"scrollLeft",simplified:z.number().nonnegative(),detailed:go({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...ei,...ti})})}),I$=_e({key:"scrollRight",simplified:z.number().nonnegative(),detailed:go({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...ei,...ti})})}),_$=_e({key:"wait",simplified:z.number(),detailed:z.strictObject({ms:z.number(),...Be})}),$ue=_e({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(),...Be})}),Vue=_e({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(),...Be})}),SE=$ue,EE=Vue,O$=_e({key:"checkPageContains",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),iframe:z.string().optional(),...Be})}),D$=_e({key:"checkPageDoesNotContain",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),iframe:z.string().optional(),...Be})}),uP=z.union([O$,D$]),jue=z.record(z.string(),z.unknown().optional()),TE=jue.superRefine((t,e)=>{let n=Object.keys(t),r=n[0];if(n.length!==1||r===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}let o=_o(r);if(o===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}if(typeof t[o.alias]=="string")return;let i=go({descriptionKey:"element",schema:z.looseObject({element:z.string().optional(),...ei,...ti,timeout:z.number().optional(),name:z.string().optional(),value:z.string().optional()})}).safeParse(t[o.alias]);if(!i.success){e.addIssue({code:"custom",message:`element check alias '${o.alias}' must be a string target or detailed object`,path:[o.alias]});return}o.requiresName&&i.data.name===void 0&&e.addIssue({code:"custom",message:`element check alias '${o.alias}' requires a name`,path:[o.alias,"name"]}),o.requiresValue&&i.data.value===void 0&&e.addIssue({code:"custom",message:`element check alias '${o.alias}' requires a value`,path:[o.alias,"value"]});}),N$=_e({key:"extract",simplified:z.string(),detailed:z.strictObject({goal:z.string(),schema:Bl.optional(),DANGEROUS_FORCE_DYNAMIC:z.boolean().optional(),iframe:z.string().optional(),...Be})}),L$=_e({key:"cookie",simplified:z.string(),detailed:z.strictObject({value:z.string(),...Be})}),k$=on({key:"localStorage",detailed:z.strictObject({key:z.string(),value:z.string(),...Be})}),F$=_e({key:"request",simplified:z.string(),detailed:z.strictObject({url:z.string(),method:Ji.optional(),headers:z.record(z.string(),z.string()).optional(),params:z.record(z.string(),z.string()).optional(),body:Bl.optional(),contentType:z.enum(Pa).optional(),timeout:z.number().optional(),...Be})}),B$=on({key:"graphqlRequest",detailed:z.strictObject({url:z.string(),query:z.string(),variables:Bl.optional(),headers:z.record(z.string(),z.string()).optional(),timeout:z.number().optional(),...Be})}),vE=_e({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(),...Be})}),Tm={substring:z.string().optional(),glob:z.string().optional(),regex:z.string().optional(),domain:z.string().optional()};function Hue(t){return [t.substring,t.glob,t.regex,t.domain].filter(e=>e!==void 0).length}function vm(t){let e=Hue(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 U$=on({key:"header",detailed:z.strictObject({name:z.string(),value:z.string(),...Tm,method:z.string().optional(),...Be}).superRefine((t,e)=>{vm({payload:t,ctx:e,required:false});})}),z$=on({key:"mock",detailed:z.strictObject({...Tm,method:z.string().optional(),responseGenerator:z.string(),fetchOriginalResponse:z.boolean().optional(),key:z.string().optional(),...Be}).superRefine((t,e)=>{vm({payload:t,ctx:e,required:true});})}),$$=_e({key:"removeRouteMock",simplified:z.string(),detailed:z.strictObject({key:z.string(),...Be})}),V$=_e({key:"waitForUrl",simplified:z.string(),detailed:z.strictObject({...Tm,caseInsensitive:z.boolean().optional(),timeout:z.number().optional(),...Be}).superRefine((t,e)=>{vm({payload:t,ctx:e,required:true});})}),j$=_e({key:"waitForUrlNotToMatch",simplified:z.string(),detailed:z.strictObject({...Tm,caseInsensitive:z.boolean().optional(),timeout:z.number().optional(),...Be}).superRefine((t,e)=>{vm({payload:t,ctx:e,required:true});})}),Wue=z.union([V$,j$]),H$=_e({key:"dialog",simplified:z.enum(["ACCEPT","DISMISS"]),detailed:z.strictObject({action:z.enum(["ACCEPT","DISMISS"]),...Be})}),W$=_e({key:"fileUpload",simplified:z.string(),detailed:z.strictObject({path:z.string(),name:z.string().optional(),...Be})}),G$=_e({key:"copy",simplified:z.union([z.string(),z.boolean(),z.null()]),detailed:z.strictObject({value:z.union([z.string(),z.boolean(),z.null()]),...Be})}),q$=on({key:"paste",detailed:z.strictObject(Be)}),K$=on({key:"captcha",detailed:z.strictObject({...ti})}),Gue=z.strictObject({data:z.union([z.string(),wa]),width:z.number(),height:z.number()}),Y$=_e({key:"visualDiff",simplified:z.string(),detailed:go({descriptionKey:"on",required:false,schema:z.strictObject({on:z.string().optional(),...ei,threshold:z.number().optional(),screenshot:Gue.optional(),...ti})})}),X$=on({key:"offline",detailed:z.strictObject(Be)}),J$=on({key:"online",detailed:z.strictObject(Be)}),Z$=on({key:"registerRequestListener",detailed:z.strictObject({...Tm,key:z.string(),method:z.string().optional(),...Be}).superRefine((t,e)=>{vm({payload:t,ctx:e,required:true});})}),Q$=_e({key:"awaitListener",simplified:z.string(),detailed:z.strictObject({key:z.string(),timeout:z.number().optional(),...Be})}),e2=on({key:"recordRequests",detailed:z.strictObject({...Tm,key:z.string(),method:z.string().optional(),...Be}).superRefine((t,e)=>{vm({payload:t,ctx:e,required:true});})}),t2=_e({key:"getRecordedRequests",simplified:z.string(),detailed:z.strictObject({key:z.string(),...Be})}),n2=_e({key:"authLoad",simplified:z.string(),detailed:z.strictObject({path:z.string(),...Be})}),r2=_e({key:"authSave",simplified:z.string(),detailed:z.strictObject({path:z.string().optional(),...Be})});z.union([a$,s$,l$,T$,v$,c$,u$,d$,m$,p$,f$,h$,g$,b$,y$,S$,E$,C$,w$,A$,x$,M$,P$,I$,_$,SE,EE,uP,N$,L$,k$,F$,B$,vE,U$,z$,$$,Wue,H$,W$,G$,q$,K$,Y$,X$,J$,Z$,Q$,e2,t2,n2,r2,TE]);var o2=new Map([["click",a$],["doubleClick",s$],["rightClick",l$],["switchTab",T$],["closeTab",v$],["type",c$],["select",u$],["hover",d$],["blur",m$],["focus",p$],["dragAndDrop",f$],["mouseDrag",h$],["press",g$],["keyDown",b$],["keyUp",y$],["navigate",S$],["newTab",E$],["goBack",C$],["goForward",w$],["refresh",A$],["scrollUp",x$],["scrollDown",M$],["scrollLeft",P$],["scrollRight",I$],["wait",_$],["assert",SE],["assertVisually",EE],["checkPageContains",O$],["checkPageDoesNotContain",D$],["extract",N$],["cookie",L$],["localStorage",k$],["request",F$],["graphqlRequest",B$],["javascript",vE],["header",U$],["mock",z$],["removeRouteMock",$$],["waitForUrl",V$],["waitForUrlNotToMatch",j$],["dialog",H$],["fileUpload",W$],["copy",G$],["paste",q$],["captcha",K$],["visualDiff",Y$],["offline",X$],["online",J$],["registerRequestListener",Z$],["awaitListener",Q$],["recordRequests",e2],["getRecordedRequests",t2],["authLoad",n2],["authSave",r2]]);Object.freeze([...o2.keys()]);var i2=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 n=Object.keys(t),r=n[0];if(n.length!==1||r===void 0){e.addIssue({code:"custom",message:"Steps must have exactly one action key."});return}let o=o2.get(r)??(_o(r)?TE:void 0);if(!o){e.addIssue({code:"custom",message:`Unsupported step type '${r}'.`});return}let i=o.safeParse(t);if(!i.success){let a=que(i.error.issues,r);a.length>0&&a2(e,a);}});function que(t,e){return Kue(t).filter(n=>!Yue(n,e))}function a2(t,e){for(let n of e){if(n.code==="invalid_union"){a2(t,dP(n));continue}t.addIssue({...n});}}function Kue(t){let e=[];for(let n of t){if(n.code==="invalid_union"){e.push(...dP(n));continue}e.push(n);}return e}function Yue(t,e){return t.code!=="unrecognized_keys"?false:e===void 0?t.path.length===0:t.path.length===1&&t.path[0]===e}function dP(t){let e=t.errors[0]??[],n=lP(e);for(let r of t.errors.slice(1)){let o=lP(r);o>n&&(e=r,n=o);}return e}function lP(t){return t.reduce((e,n)=>{let r=n.code==="invalid_union"?lP(dP(n)):0;return e+n.path.length+r},0)}var s2=z.strictObject({string:z.string()}),Xue=z.strictObject({javascript:z.string()}),l2=z.union([s2,Xue]),Jue=z.union([z.strictObject({name:z.string(),required:z.boolean().optional(),default:s2.optional()}),z.strictObject({name:z.string(),required:z.boolean().optional(),defaultValue:z.string()})]),c2=Jue.array(),Zue=z.strictObject({name:z.string(),default:l2.optional(),enum:z.array(z.string()).optional()}),u2=Zue.array(),Wh=z.union([l2,z.string()]),d2=z.record(z.string(),Wh);var Que=z.preprocess(t=>typeof t=="number"?String(t):t,dx),ede=z.looseObject({goal:z.string(),version:Que.optional(),...Be}),tde=z.union([z.strictObject({act:z.string()}),z.strictObject({act:ede})]),nde=z.looseObject({path:z.string(),inputs:z.record(z.string(),Wh).optional(),...Be}),rde=z.union([z.strictObject({module:z.string()}),z.strictObject({module:nde})]),ode=z.union([SE,EE,uP,vE,TE]),ide=new Set(["then",...yE]),ade=z.looseObject({then:z.lazy(()=>qa.array()),...Be}).superRefine((t,e)=>{Object.entries(t).filter(([r,o])=>!ide.has(r)&&ode.safeParse({[r]:o}).success).length!==1&&e.addIssue({code:"custom",message:"Conditional steps require exactly one assertion condition at the top level."});}),sde=z.strictObject({if:ade}),qa=z.lazy(()=>z.union([R$,tde,rde,sde,i2]));z.object({before:qa.array().optional(),steps:qa.array(),after:qa.array().optional()});var lde=z.union([Is,z.string().refine(t=>{let e=t.match(/^\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*$/);if(!e)return false;let[,n,r]=e;return Is.safeParse({width:Number(n),height:Number(r)}).success},"Viewport must be two numeric values, e.g. 1920, 1080")]),cde=nu.omit({viewport:true}).extend({viewport:lde.optional()}),mP=z.object({id:Un,version:z.string(),url:bS.optional(),description:z.string().optional(),retries:z.number().optional(),defaultEnv:z.string().optional(),parameters:c2.optional(),outputs:FS.optional(),disabled:z.boolean().optional(),labels:z.array(z.string()).optional()}).extend(cde.shape);z.looseObject({fileType:z.literal(ve.TEST_V2)}).extend(mP.shape).extend({before:qa.array().optional(),steps:qa.array(),after:qa.array().optional()});var ude=z.array(z.string()),dde=z.union([z.string(),z.record(z.string(),z.unknown().optional())]),CE=Da.omit({moduleId:true,name:true,parameters:true,defaultParameters:true,parameterEnums:true}).extend({id:Un,version:z.string(),name:z.string().optional(),parameters:z.union([u2,ude]).optional(),defaultParameters:z.record(z.string(),z.string()).optional(),parameterEnums:z.record(z.string(),z.array(z.string())).optional()});z.looseObject(CE.extend({fileType:z.literal(ve.MODULE_V2),steps:dde.array().optional()}).shape).superRefine(m2);z.looseObject(CE.extend({fileType:z.literal(ve.MODULE_V2),steps:qa.array().optional()}).shape).superRefine(m2);function m2(t,e){"main"in t&&e.addIssue({code:"custom",message:"v2 modules must use steps, not main",path:["main"]});}var wE=(r=>(r.WEB="web",r.ANDROID="android",r.IOS="ios",r))(wE||{}),pP=z.nativeEnum(wE);var p2=z.object({entity_type:z.string(),value:z.string()}),f2=Vf(p2),h2=p2.extend({cache_key:z.string()});function qh({entityType:t,entityId:e}){return `${t}:${e}`}var mde=/^\s*-?\d+(?:\.\d+)?\s*%\s*,\s*-?\d+(?:\.\d+)?\s*%\s*$/,gu=z.string();function E2(t){return mde.test(t)}var g2='Coordinates must be "x, y" pixel values, e.g. "100, 200"',T2=z.union([Ra,z.string().regex(/^\s*-?\d+(?:\.\d+)?\s*,\s*-?\d+(?:\.\d+)?\s*$/,g2)],{error:g2}),b2='Percent must be a number or a percent string, e.g. 90 or "90%"',v2=z.union([z.number(),z.string().regex(/^-?\d+(?:\.\d+)?%$/,b2)],{error:b2}).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"})),pde=z.strictObject({x:z.number(),y:z.number(),delta:z.number()}),C2=z.union([z.string(),pde]),AE={screen:"SCREEN",app:"OPEN_APP",webview:"OPEN_WEBVIEW"},tn={...Be,DANGEROUS_FORCE_DYNAMIC:z.boolean().optional()},fde=["home","power","back","app_switcher","search","volume_up","volume_down","volume_mute"],w2={HOME:"home",POWER:"power",BACK:"back",APP_SWITCHER:"app_switcher",SEARCH:"search",VOLUME_UP:"volume_up",VOLUME_DOWN:"volume_down",VOLUME_MUTE:"volume_mute"},fP={home:"HOME",power:"POWER",back:"BACK",app_switcher:"APP_SWITCHER",search:"SEARCH",volume_up:"VOLUME_UP",volume_down:"VOLUME_DOWN",volume_mute:"VOLUME_MUTE"},hde=["enter","backspace","close_keyboard"],A2={ENTER:"enter",BACKSPACE:"backspace",CLOSE_KEYBOARD:"close_keyboard"},hP={enter:"ENTER",backspace:"BACKSPACE",close_keyboard:"CLOSE_KEYBOARD"},y2=["airplane_mode","data","wifi","location"],R2={AIRPLANE_MODE:"airplane_mode",DATA:"data",WIFI:"wifi",LOCATION:"location"},gP={airplane_mode:"AIRPLANE_MODE",data:"DATA",wifi:"WIFI",location:"LOCATION"},S2=["portrait","landscape"],x2={PORTRAIT:"portrait",LANDSCAPE:"landscape"},bP={portrait:"PORTRAIT",landscape:"LANDSCAPE"},gde=z.strictObject({on:gu.optional(),longPress:z.boolean().optional(),longPressDuration:z.number().optional(),iterations:z.number().optional(),tapDelay:z.number().optional(),offset:T2.optional(),...tn}),M2=_e({key:"tap",simplified:gu,detailed:gde}),bde=z.strictObject({text:z.string(),into:gu.optional(),clearContent:z.boolean().optional(),forceClearContent:z.boolean().optional(),keyPressDelay:z.number().optional(),...tn}),P2=_e({key:"type",simplified:z.string(),detailed:bde}),I2=z.enum(fde),yde=z.strictObject({key:I2,longPress:z.boolean().optional(),...tn}),_2=_e({key:"press",simplified:I2,detailed:yde}),O2=z.enum(hde),Sde=z.strictObject({key:O2,...tn}),D2=_e({key:"pressKey",simplified:O2,detailed:Sde}),Ede=z.strictObject({package:z.string(),activity:z.string().optional(),intentExtras:z.string().optional(),...tn}),N2=_e({key:"openApp",simplified:z.string(),detailed:Ede}),L2=on({key:"killApp",detailed:z.strictObject(tn)}),k2=on({key:"openNotifications",detailed:z.strictObject(tn)}),F2=z.enum(["up","down","left","right"]),Tde=z.strictObject({direction:F2,in:C2.optional(),viewportPercent:v2.optional(),duration:z.number().optional(),offset:T2.optional(),...tn}),B2=_e({key:"swipe",simplified:F2,detailed:Tde}),vde=z.enum(["up","down"]),Cde=z.strictObject({on:gu,direction:vde.optional(),in:C2.optional(),scrollStepPercent:v2.optional(),maxScrollAttempts:z.number().optional(),...tn}),U2=_e({key:"scrollTo",simplified:z.string(),detailed:Cde}),yP=_e({key:"assert",simplified:z.string(),detailed:z.strictObject({that:z.string(),timeout:z.number().optional(),...tn})}),z2=_e({key:"extract",simplified:z.string(),detailed:z.strictObject({goal:z.string(),schema:Bl.optional(),...tn})}),$2=_e({key:"checkScreenContains",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),...tn})}),V2=_e({key:"checkScreenDoesNotContain",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),...tn})}),j2=z.union([$2,V2]),wde=z.record(z.string(),z.unknown().optional()),SP=wde.superRefine((t,e)=>{let n=Object.keys(t),r=n[0];if(n.length!==1||r===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}let o=_o(r);if(o===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}if(typeof t[o.alias]=="string")return;let i=z.looseObject({on:gu.optional(),timeout:z.number().optional(),name:z.string().optional(),value:z.string().optional(),...tn}).safeParse(t[o.alias]);if(!i.success){e.addIssue({code:"custom",message:`element check alias '${o.alias}' must be a string target or detailed object`,path:[o.alias]});return}i.data.on===void 0&&e.addIssue({code:"custom",message:`element check alias '${o.alias}' requires a target via 'on'`,path:[o.alias,"on"]}),o.requiresName&&i.data.name===void 0&&e.addIssue({code:"custom",message:`element check alias '${o.alias}' requires a name`,path:[o.alias,"name"]}),o.requiresValue&&i.data.value===void 0&&e.addIssue({code:"custom",message:`element check alias '${o.alias}' requires a value`,path:[o.alias,"value"]});}),Ade=z.strictObject({from:gu,to:gu,hoverDuration:z.number().optional(),dragDuration:z.number().optional(),...tn}),H2=on({key:"dragAndDrop",detailed:Ade}),EP=_e({key:"javascript",simplified:z.string(),detailed:z.strictObject({code:z.string(),timeout:z.number().optional(),...tn})}),W2=_e({key:"request",simplified:z.string(),detailed:z.strictObject({url:z.string(),method:Ji.optional(),headers:z.record(z.string(),z.string()).optional(),params:z.record(z.string(),z.string()).optional(),body:z.string().optional(),bodyType:z.nativeEnum(Pa).optional(),timeout:z.number().optional(),...tn})}),G2=_e({key:"wait",simplified:z.number(),detailed:z.strictObject({ms:z.number(),...tn})}),q2=on({key:"addFile",detailed:z.strictObject({path:z.string(),location:z.string(),...tn})}),K2=_e({key:"installApp",simplified:z.string(),detailed:z.strictObject({path:z.string(),...tn})}),Y2=_e({key:"uninstallApp",simplified:z.string(),detailed:z.strictObject({package:z.string(),...tn})}),X2=_e({key:"toggleSettings",simplified:z.enum(y2),detailed:z.strictObject({setting:z.enum(y2),...tn})}),J2=_e({key:"rotate",simplified:z.enum(S2),detailed:z.strictObject({orientation:z.enum(S2),...tn})}),Z2=_e({key:"adb",simplified:z.string(),detailed:z.strictObject({command:z.string(),args:z.string().optional(),...tn})}),Q2=on({key:"appium",detailed:z.strictObject({script:z.string(),args:z.string().optional(),...tn})}),eV=on({key:"debugState",detailed:z.strictObject(tn)}),RE=z.enum(["killApp","openNotifications","debugState"]);z.union([M2,P2,_2,D2,N2,L2,k2,B2,U2,yP,z2,j2,H2,EP,W2,G2,q2,K2,Y2,X2,J2,Z2,Q2,eV,SP]);var tV=new Map([["tap",M2],["type",P2],["press",_2],["pressKey",D2],["openApp",N2],["killApp",L2],["openNotifications",k2],["swipe",B2],["scrollTo",U2],["assert",yP],["extract",z2],["checkScreenContains",$2],["checkScreenDoesNotContain",V2],["dragAndDrop",H2],["javascript",EP],["request",W2],["wait",G2],["addFile",q2],["installApp",K2],["uninstallApp",Y2],["toggleSettings",X2],["rotate",J2],["adb",Z2],["appium",Q2],["debugState",eV]]);Object.freeze([...tV.keys()]);var nV=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 n=Object.keys(t),r=n[0];if(n.length!==1||r===void 0){e.addIssue({code:"custom",message:"v2 mobile commands must have exactly one action key."});return}let o=tV.get(r)??(_o(r)?SP:void 0);if(!o){e.addIssue({code:"custom",message:`Unsupported v2 mobile command '${r}'.`});return}let i=o.safeParse(t);if(!i.success)for(let a of i.error.issues)e.addIssue({...a});}),Kh=z.union([yP,j2,EP,SP]);var Rde=z.preprocess(t=>typeof t=="number"?String(t):t,vM),xde=z.looseObject({goal:z.string(),version:Rde.optional(),precondition:z.string().optional(),postcondition:z.string().optional(),...Be}),Mde=z.union([z.strictObject({act:z.string()}),z.strictObject({act:xde})]),Pde=z.looseObject({path:z.string(),inputs:z.record(z.string(),Wh).optional(),...Be}),Ide=z.union([z.strictObject({module:z.string()}),z.strictObject({module:Pde})]),_de=new Set(["then",...yE]),Ode=z.looseObject({then:z.lazy(()=>Ka.array()),...Be}).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(([r,o])=>!_de.has(r)&&Kh.safeParse({[r]:o}).success).length!==1&&e.addIssue({code:"custom",message:"v2 mobile conditional steps require exactly one assertion condition at the top level."});}),Dde=z.strictObject({if:Ode}),Ka=z.lazy(()=>z.union([RE,Mde,Ide,Dde,nV]));z.object({before:Ka.array().optional(),steps:Ka.array(),after:Ka.array().optional()});var TP=["android","ios"],Nde=z.literal("android"),Lde=z.literal("ios");z.enum(TP);function Cm(t){return t==="android"?"ANDROID":"IOS"}function vP(t){return t==="ANDROID"?"android":"ios"}function xE(t){if(typeof t!="object"||t===null)return t;let e=t;if(typeof e.platform!="string")return t;let n=e.platform.toLowerCase();return n===e.platform?t:{...e,platform:n}}var rV=mm.omit({schemaVersion:true,settings:true,platform:true}).extend({version:z.string(),platform:Nde,...ho.shape}),oV=pm.omit({schemaVersion:true,settings:true,platform:true}).extend({version:z.string(),platform:Lde,...ho.shape}),kde=z.discriminatedUnion("platform",[rV,oV]),iV=z.preprocess(xE,kde),aV={before:Ka.array().optional(),steps:Ka.array(),after:Ka.array().optional()},sV=z.looseObject({fileType:z.literal(ve.MOBILE_TEST_V2)}).extend(rV.shape).extend(aV);z.preprocess(xE,sV);var lV=z.looseObject({fileType:z.literal(ve.MOBILE_TEST_V2)}).extend(oV.shape).extend(aV);z.preprocess(xE,lV);var Fde=z.discriminatedUnion("platform",[sV,lV]),zl=z.preprocess(xE,Fde);var Bde=z.preprocess(t=>typeof t=="string"?t.toLowerCase():t,z.enum(TP).optional().default("android")),ME=nm.omit({moduleId:true,name:true,schemaVersion:true,platform:true}).extend({id:Un,name:z.string().optional(),version:z.string(),platform:Bde});z.looseObject(ME.extend({fileType:z.literal(ve.MOBILE_MODULE_V2),steps:z.array(z.record(z.string(),z.unknown().optional())).optional()}).shape);var PE=z.looseObject(ME.extend({fileType:z.literal(ve.MOBILE_MODULE_V2),steps:Ka.array().optional()}).shape);function cV(t){return t.steps??[]}var IE="x-momentic-cli-version",dV="x-momentic-client-mode",mV="x-momentic-cli-type",pV="x-momentic-logger-tags",Ude="x-momentic-main-branch-name",zde="x-momentic-branch-name",$de="x-momentic-commit-timestamp",Vde="x-momentic-last-commit-on-main",jde="x-momentic-last-commit-on-main-timestamp",Hde="x-momentic-merged-branch-name",fV="x-momentic-session-id";v.object({error:v.boolean(),reason:v.string(),message:v.string()});ur.merge(Yx);var hV=tS;ur.merge(Yx);ur.merge(wU).extend({useConsensus:v.boolean().optional(),attemptNumber:v.number().optional()});var CP=cF;ur.merge(AU);var gV=vB;ur.merge(EU);var bV=CS;ur.merge(nF);ur.merge(TU);var yV=SB;ur.merge(vU);ur.merge(CU);ur.merge(PU);ur.merge(IU);v.object({testPaths:v.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:v.string().optional(),all:v.boolean().optional(),urlOverride:v.string().optional(),customHeaders:v.record(v.string(),v.string()).optional(),testInputMatrix:v.record(v.string(),v.string()).array().optional()});var SV=v.object({queuedTests:v.unknown().optional().array(),runIds:v.guid().array(),runGroupId:v.string().optional()});v.string().array();v.union([v.object({paths:v.string().array().describe("Export specific test paths or folder paths (e.g. todo-test, auth/onboarding)"),all:v.boolean().describe("run all tests").optional()}),v.object({path:v.string().describe("deprecated; present for backcompat")})]);var Wde=v.object({tests:v.record(v.string().describe("Test name (keys correspond to entries in `tests`)"),v.string().describe("Slash-separated folder name path that the test lives in (e.g. 'Auth/Login'). Top-level entities are omitted.")),modules:v.record(v.string().describe("Module name (keys correspond to entries in `modules`)"),v.string().describe("Slash-separated folder name path that the module lives in."))}),EV=v.object({tests:v.record(v.string().describe("Test name"),v.string().describe("Test YAML")),modules:v.record(v.string().describe("Module name"),v.string().describe("Module YAML")),folderPaths:Wde.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.")}),Gde=v.object({test:v.string().describe("test YAML"),modules:v.record(v.string().describe("moduleId"),v.string().describe("module YAML"))});Gde.array();v.object({testId:v.string(),schemaVersion:v.string()}).merge(Xc);function bu(t){let{gitMainBranch:e,gitBranchName:n,gitCommitTimestamp:r,lastCommitOnMainSha:o,lastCommitOnMainTimestamp:i}=t,a={};return e&&(a[Ude]=encodeURIComponent(e)),n&&(a[zde]=encodeURIComponent(n)),r&&(a[$de]=r.toISOString()),o&&(a[Vde]=encodeURIComponent(o)),i&&(a[jde]=i.toISOString()),t.mergedGitBranchName&&(a[Hde]=encodeURIComponent(t.mergedGitBranchName)),a}v.object({entries:v.array(XF)});v.object({platform:pP.optional(),entries:v.array(f2)});v.object({testId:v.string(),environment:v.string().optional(),platform:pP.optional()});v.object({testId:v.string(),key:v.string(),environment:v.string().optional()});function TV(t){return v.record(v.string(),v.unknown().optional()).transform(e=>{let n={};for(let[r,o]of Object.entries(e)){let i=t.safeParse(o);i.success&&(n[r]=i.data);}return n})}var vV=TV(JF),CV=h2.array();function uV(t){return TV(jf(t))}var wV={ANDROID:t=>uV(nE).parse(t),IOS:t=>uV(rE).parse(t)},qde=v.object({id:v.string(),completionType:v.string(),description:v.string().optional(),thoughts:v.string(),result:v.string(),sessionType:v.string(),timeCreated:v.string().optional(),citations:v.array(sr).optional()}),Kde=v.object({id:v.string(),assertion:v.string().optional(),result:v.string(),thoughts:v.string(),sessionType:v.string(),timeCreated:v.string().optional(),citations:v.array(sr).optional()});v.object({completionType:v.string(),traceIds:v.string().array()});var wP=v.union([qde,Kde]).array(),AV=v.object({trigger:v.nativeEnum(qo),status:v.nativeEnum(en),startedAt:v.coerce.date().optional(),gitCommitSha:v.string().optional(),gitCommitShaShort:v.string().optional(),gitCommitTimestamp:v.coerce.date().optional(),gitBranchName:v.string().optional(),gitOriginUrl:v.string().optional(),gitCommitMessage:v.string().optional(),gitCommitAuthorName:v.string().optional(),githubRepository:v.string().optional(),gitlabProjectPath:v.string().optional(),pipelineId:v.string().optional(),cliVersion:v.string().optional()});v.object({id:v.string()});var RV=v.object({status:v.nativeEnum(en),updatedAt:v.coerce.date().optional(),finishedAt:v.coerce.date().optional()});v.object({summary:ru,githubRepository:v.string().optional(),gitBranchName:v.string().optional()});var xV=v.object({stepsSnapshot:v.array(v.record(v.string(),v.unknown().optional())).optional(),beforeStepsSnapshot:v.array(v.record(v.string(),v.unknown().optional())).optional(),afterStepsSnapshot:v.array(v.record(v.string(),v.unknown().optional())).optional(),runGroupId:v.string().optional(),testId:v.string(),testName:v.string(),resolvedBaseUrl:v.string().optional(),environmentName:v.string().optional(),labels:v.array(v.string()).optional(),cliVersion:v.string().optional(),trigger:v.nativeEnum(qo),schemaVersion:v.string().optional(),section:v.nativeEnum(US).optional(),resolvedInputs:v.record(v.string(),v.string()).optional(),quarantined:v.boolean().optional().default(false),quarantinedReason:v.string().optional(),aiSettings:Fa.optional()});v.object({id:v.string()});var Yde=Gx.pick({id:true,status:true,healStatus:true,healDetails:true,testName:true,testId:true,test:true,failureReason:true,failureDetails:true}),MV=Yde.array(),PV=Gx.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();v.object({id:v.string()});var IV=v.object({run:Os.omit({runAttempts:true}),attemptZipUrls:v.array(v.string().url().nullish())}),_V=v.object({status:v.nativeEnum(en),finishedAt:v.coerce.date().optional(),schemaVersion:v.string().optional().default("1.0.19"),results:v.record(v.string(),v.unknown().optional()).array().optional(),beforeResults:v.record(v.string(),v.unknown().optional()).array().optional(),afterResults:v.record(v.string(),v.unknown().optional()).array().optional()});v.object({screenshot:v.string(),contentType:v.enum(["image/jpeg","image/png"]).optional()});v.object({id:v.string(),screenshot:v.string(),contentType:v.enum(["image/jpeg","image/png"])});var OV=v.object({key:v.string()}),DV=v.object({orgId:v.string(),userId:v.string(),email:v.string().optional(),name:v.string().optional(),pylonEmailHash:v.string().optional(),selfServe:v.boolean().optional()}),NV=v.object({blocked:v.boolean()}),LV=v.array(BB);v.record(v.string(),v.union([v.string(),v.boolean()]));v.object({workosAccessToken:v.string().min(1),organizationId:v.string().optional(),clientName:v.string().min(1).max(80).optional()});var kV=v.object({apiKey:v.string(),apiKeyName:v.string(),organizationId:v.string(),user:v.object({id:v.string(),email:v.string().optional()}),selfServe:v.boolean().optional()}),FV=v.object({error:v.literal("multiple_organizations"),organizations:v.array(v.object({id:v.string(),name:v.string()}))}),Xde=["web","ios","android"];v.object({platforms:v.array(v.enum(Xde)),packageManager:v.enum(["npm","pnpm","yarn","bun"]),wizardVersion:v.string().min(1).max(40),cliVersions:v.object({momentic:v.string().max(40).optional(),momenticMobile:v.string().max(40).optional()}).optional(),firstRunIds:v.array(v.guid()).max(10).optional()});v.object({ok:v.literal(true)});v.object({paths:v.string().array(),env:v.string().optional(),urlOverride:v.string().optional(),customHeaders:v.record(v.string(),v.string()).optional()});var BV=v.object({suiteRunIds:v.string().array(),runGroupIds:v.string().array()});v.object({suiteRunIds:v.string().array()});fU.array();v.object({runGroupIds:v.string().array()});var AP=v.object({uploadUrl:v.string()});ur.merge(RU);ur.merge(MU);ur.merge(xU);var Jde=v.object({testId:v.string().optional().default(""),testName:v.string().optional().default(""),suiteId:v.string().optional().default(""),suiteName:v.string().optional().default(""),isInteractive:v.boolean().optional().default(false),creditsUsed:v.number().optional(),stepsExecuted:v.number().optional(),tokensUsed:v.number().optional()}),Zde=v.object({transactionId:v.string(),timestamp:v.string(),event:v.nativeEnum(Dl),properties:Jde});Zde.array();var UV=K1.omit({steps:true}).extend({steps:v.array(v.record(v.string(),v.unknown().optional())).describe("unparsed ResolvedStep[]")});v.object({limit:v.number().min(1).max(10).optional(),page:v.number().min(1).optional(),start:Tn.optional(),end:Tn.optional(),gitBranchName:v.string().optional(),status:v.nativeEnum(en).optional()});var zV=Wx.array(),Qde=v.object({testId:Un.optional(),gitBranchName:v.string().optional(),status:v.nativeEnum(en).optional(),label:v.string().array().optional(),limit:v.number().min(1).max(100).optional(),page:v.number().min(1).optional(),start:Tn.optional(),end:Tn.optional(),quarantined:v.boolean().optional(),recovered:v.boolean().optional()});Qde.extend({orgId:v.string().optional(),testId:dr(Un),status:dr(v.nativeEnum(en)),gitBranchName:dr(v.string()),label:dr(v.string()),testName:v.string().optional(),trigger:dr(v.nativeEnum(qo)),executionType:dr($d),cliVersion:dr(v.string()),githubRepository:dr(v.string()),gitlabProjectPath:dr(v.string()),environment:dr(v.string()),directory:dr(v.string()),failureCategory:dr(v.string()),exclude:dr(v.string()),healed:v.boolean().optional()});var $V=v.object({runs:Wx.array(),page:v.number(),pageSize:v.number(),pageCount:v.number()});v.object({applied:v.boolean().optional(),appliedAt:v.coerce.date().optional()});var VV=AP.extend({id:v.string()});v.object({runGroupId:v.guid().optional(),persist:v.boolean().optional()});var jV=v.object({runGroupId:v.guid()}),HV=v.object({quarantined:v.object({testId:Un,quarantinedAt:v.coerce.date(),quarantinedBy:v.string().optional(),quarantinedReason:v.string()}).array()}),WV=v.object({gitLocalUsername:v.string().optional(),gitLocalEmail:v.string().optional(),gitLocalName:v.string().optional()});v.object({testId:Un,testName:v.string().optional(),reason:v.string()}).merge(WV);v.object({testName:v.string().optional(),reason:v.string().optional()}).merge(WV);ur.merge(wz);ur.merge(Az);ur.merge(Rz);v.object({apkToInstall:v.object({channel:v.string(),tag:v.string().optional()}).optional(),hostname:v.string().optional(),region:VM.optional(),osVersion:v.nativeEnum($h).optional(),sessionId:v.string().optional()});var GV=v.object({name:v.string(),apiUrl:v.string(),webRtcUrl:v.string(),adbUrl:v.string(),token:v.string(),apkDownloadUrl:v.string().optional(),playwrightServerUrl:v.string().optional(),region:v.string().optional(),resolvedTag:v.string().optional()});v.object({appToInstall:v.object({channel:v.string(),tag:v.string().optional()}).optional(),hostname:v.string().optional(),region:VM.optional(),osVersion:v.nativeEnum(HM).optional(),sessionId:v.string().optional(),installAppOnClient:v.boolean().optional()});var qV=v.object({id:v.string(),apiUrl:v.string(),webRtcUrl:v.string(),wdaUrl:v.string(),token:v.string(),appDownloadUrl:v.string().optional(),appMd5:v.string().optional(),region:v.string().optional(),resolvedTag:v.string().optional()});v.object({channel:v.string().trim().min(1,"channel must be a non-empty string"),tag:v.string().trim().min(1,"tag must be a non-empty string"),md5:v.string()});var KV=v.object({id:v.string(),uploadUrl:v.string().optional(),downloadUrl:v.string(),md5:v.string().optional()}),eme=v.object({channel:v.string(),tag:v.string(),md5:v.string(),platform:v.nativeEnum(Je).default("ANDROID"),createdAt:v.number().describe("Unix timestamp in milliseconds")}),YV=v.object({assets:v.array(eme)}),XV=v.object({downloadUrl:v.string()}),RP=(n=>(n.PLAYWRIGHT="PLAYWRIGHT",n.CDP="CDP",n))(RP||{}),tme=v.nativeEnum(RP);v.object({runId:v.guid().optional(),attemptedProviders:v.array(oP).optional()});var JV=v.object({wsEndpoint:v.string(),accessToken:v.string().optional(),endpointType:tme.optional(),provider:oP.optional()});z.object({repositoriesIndexed:z.boolean(),indexingInProgress:z.boolean(),indexesOutdated:z.boolean()});var ZV=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(ZV||{}),QV=(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))(QV||{});z.object({name:z.string(),status:z.enum(ZV),conclusion:z.enum(QV).nullable()});var Yh=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()})}),xP=z.object({mergedBranch:z.string().optional()});var ej=z.object({orgId:z.string(),cacheKeys:z.string().array()});z.object({keyParams:ej,clientMetadata:z.string(),lockAcquisitionTimeoutMs:z.number().optional()});var tj=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()}),ej]);var nme=z.object({remainingTtlMs:z.number(),value:z.string().nullish()});z.object({results:z.record(z.string(),nme),activeLocks:z.string().array()});function Xh(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 rme=z.object({version:z.string(),json:z.record(z.string(),z.unknown().optional()),hash:z.string()}),nj=z.record(z.string(),z.unknown().optional());z.object({newSvgs:z.array(rme),metadata:nj.optional()});var ome=z.object({version:z.string(),json:z.record(z.string(),z.unknown().optional()).nullish(),hash:z.string(),description:z.string().nullish(),metadata:nj.nullish()}),rj=z.record(z.string().describe("icon hash"),ome);function wm(t){let e;try{e=JSON.parse(t);}catch(n){return `The schema is not valid JSON. ${n}`}try{validator(e);}catch(n){return `The schema is not a valid JSON schema. ${n}`}}var oj=t=>{t.extraHeaders&&(t.extraHeaders=Object.fromEntries(Object.entries(t.extraHeaders).filter(([e,n])=>e.trim()&&n.trim())));};var _E=class{async prepareGoldenScreenshotForComparison(e,n,r){return r}};var OE=class{async resolveEntries(){}async populateCacheForRun(){}async getCacheKeyForStep(){}async saveEntries(){}async saveSnapshotCacheEntries(){}};function ame(t){return t.map(e=>({...e,environment:void 0}))}function MP(t,e){return e?t:ame(t)}var mr="metadata.json",Pi="assets",yo="runs",sme=z.object({step:fn,status:z.enum(rn),startedAt:z.coerce.date(),finishedAt:z.coerce.date().optional(),healMetadata:z.object({healType:z.enum(ah).or(z.literal("AI")),healedAt:z.coerce.date()}).optional(),beforeSnapshotId:z.guid().optional(),afterSnapshotId:z.guid().optional(),message:z.string().optional()}),lme=sme.extend({finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});lme.extend({step:z.unknown().optional()});var PP=z.object({avdId:z.string().optional(),channel:z.string().optional(),tag:z.string().optional(),region:z.string().optional()}),aj="1.0.0",sj=_V.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:PP.optional(),viewport:Is.optional(),activeVideos:z.array(z.object({videoName:z.string(),timestamp:z.coerce.date()})).optional()}),IP=sj.extend({assetDetails:PP.optional(),finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});sj.extend(Nx.shape);var lj=IP.extend(Nx.shape),cme=z.object({results:z.array(Mo),beforeResults:z.array(Mo).optional(),afterResults:z.array(Mo).optional()});IP.extend(cme.shape);var ume=z.object({results:z.array(Po),beforeResults:z.array(Po).optional(),afterResults:z.array(Po).optional()});IP.extend(ume.shape);var cj=PV.merge(xV).extend({executionType:$d.optional().default("WEB"),testId:Un,testDescription:z.string().optional(),directory:z.string().optional(),runGroupId:z.guid(),status:z.enum(en),healStatus:Hx,startedAt:z.coerce.date(),schemaVersion:z.string().nullish(),attempts:z.number(),failureRecoveryDetails:z.object({attempts:z.number()}).optional(),aiSettings:Fa.optional(),avgCpuUsage:z.number().optional(),avgMemoryUsage:z.number().optional()}),dme=cj.extend(PP.shape),uj=cj.extend({finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});dme.extend({finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});var ij=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(z.object({testId:z.string(),name:z.string(),testPath:z.string().nullable(),relevanceLabel:z.enum(["high","medium","low"]),rationale:z.string()})),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()}),mme=AV.merge(RV).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:Fa.optional(),browser:_s.optional(),aiSelect:z.union([ij.transform(t=>[t]),z.array(ij)]).optional()}),Am=mme.extend({healRiskSummary:ru.optional(),updatedAt:z.coerce.date().optional().transform(t=>t??new Date),finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});var pme=new Set(["MOBILE_MODULE_STEP","MOBILE_CONDITIONAL_STEP","RESOLVED_MOBILE_MODULE"]);function DE(t){return t.type!=="MOBILE_PRESET_STEP"?t.type:t.command.type}function NE(t){return !pme.has(t.type)}var dj="CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih",LE="https://us-west.metrics.momentic.ai",kE="c60c6a0f-60da-41a7-a61b-07969a0aa303",yu=!!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 mj=(()=>{try{return statSync("/.dockerenv"),!0}catch{return false}})();async function $l(t){return yu||mj?true:(await P.flush(),await new Promise(n=>setTimeout(n,100)),await confirm({message:t}))}async function pj(t,e){return yu||mj?e:(await input({message:t,default:e})).trim()||e}var Rm=new Map,hj="Log throttle exceeded",xme=100,Mme=5e3,Pme=Tme(global.fetch,{retries:2,retryOn:function(t,e,n){return !!(e!==null||n&&n.status>=500)},retryDelay:function(t){return Math.pow(2,t)*500}}),Ime="https://ingest.us.signoz.cloud:443/logs/json",_P=class{constructor(e,n){this.flushIntervalMs=e;this.maxBatchSize=n;}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 n=await Pme(Ime,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":dj},body:Rl(e),signal:AbortSignal.timeout(5e3)});if(!n.ok)throw new Error(`Got error status (${n.statusText}) from SigNoz`)}catch{}}},OP=class t{consoleLogger;hostname;bindingAttributes;disableConsoleLogs;minLevelValue=20;logsInCurrentWindow=0;droppedLogsInWindow=false;lastWindowStart=Date.now();flushIntervalMs;maxBatchSize;buffer;constructor({bindings:e,hostname:n,disableConsoleLogs:r,flushIntervalMs:o,maxBatchSize:i,buffer:a}){this.hostname=n??$s.hostname(),this.disableConsoleLogs=r,this.bindingAttributes={...e,env:"production"},this.flushIntervalMs=o??5e3,this.maxBatchSize=i??10,this.buffer=a??new _P(this.flushIntervalMs,this.maxBatchSize);let s={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=fj(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===hj)return true;let n=Date.now();return n-this.lastWindowStart>Mme&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,hj),this.droppedLogsInWindow=false,this.lastWindowStart=n),this.logsInCurrentWindow<xme?(this.logsInCurrentWindow++,true):(this.droppedLogsInWindow=true,false)}log(e,n,r,...o){try{this.logHelper(e,n,r,...o);}catch(i){this.consoleLogger.warn(`Failed to log to Signoz: ${i}`);}}logHelper(e,n,r,...o){if(dh[e]<this.minLevelValue||!this.shouldAllowLog(r))return;typeof n=="string"&&!r&&(n={message:n}),typeof n=="object"&&n&&"err"in n&&n.err instanceof Error&&(n.err=Ame.err(n.err));let i={...this.bindingAttributes,...n&&typeof n=="object"?n:{},...o.length>0?{args:o}:{}},a={host:this.hostname,env:this.bindingAttributes.env},s=_me();this.disableConsoleLogs||this.consoleLogger[e]({...i,...s??{}},r,...o);let l={timestamp:Math.round(Date.now()*1e6),...s??{},severity_text:e.toUpperCase(),resources:a,attributes:{},body:ZB({message:r||"",...i})};this.buffer.push(l);}setApp(e){let n=this.bindingAttributes.app;this.bindingAttributes.app=e,Rm.set("app",this),Rm.delete(n);}debug(e,n,...r){this.log("debug",e,n,...r);}info(e,n,...r){this.log("info",e,n,...r);}warn(e,n,...r){this.log("warn",e,n,...r);}error(e,n,...r){this.log("error",e,n,...r);}bindings(){return this.bindingAttributes}addBinding(e,n){this.bindingAttributes[e]=n;}setMinLevel(e){typeof e=="number"?(this.minLevelValue=e,this.consoleLogger.level=QB[e]):(this.minLevelValue=dh[e],this.consoleLogger.level=e);}enableConsoleLogs(){this.disableConsoleLogs=false;}},xm=({app:t,hostname:e,disableConsoleLogs:n})=>(Rm.has(t)||Rm.set(t,new OP({bindings:{app:t},hostname:e,disableConsoleLogs:n})),Rm.get(t));function _me(){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 FE(){await Promise.all([...Rm.values()].map(t=>t.flush()));}var Vl=class extends Error{constructor(e){super(e),this.name="TimeoutError";}};var gj=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 te(t,e){let{milliseconds:n,fallback:r,message:o,customTimers:i={setTimeout,clearTimeout}}=e,a;if(typeof n!="number"||Math.sign(n)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${n}\``);return new Promise((s,l)=>{let c;if(e.signal){let{signal:m}=e;if(m.aborted)return l(gj(m));c=()=>l(gj(m)),m.addEventListener("abort",c,{once:true});}let u=()=>{if(e.signal&&e.signal.removeEventListener("abort",c),r)try{s(r());}catch(m){l(m);}else {typeof t.cancel=="function"&&Promise.resolve().then(()=>t.cancel()).catch(()=>{});let m=o instanceof Error?o:new Vl(o??`Promise timed out after ${n}ms`);l(m);}};n<1/0&&(a=i.setTimeout(u,n));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 Mm({signal:t,timeoutMs:e}){let n=AbortSignal.timeout(e);return t?AbortSignal.any([t,n]):n}var bj="organization";function BE(t){let e=new PostHog(t.writeKey,{host:t.host,...t.flushImmediately?{flushAt:1,flushInterval:0}:{}}),n=t.platform,r=(l,c,u)=>{let{type:d,...m}=l;e.capture({distinctId:c??u??randomUUID(),event:d,...u&&{groups:{[bj]:u}},properties:{platform:n,user_id:c??void 0,org_id:u??void 0,...m,organizationId:u??void 0,...c==null&&{$process_person_profile:false}}});},o=({orgId:l,properties:c})=>{e.groupIdentify({groupType:bj,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:o,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=>r(u,l?.userId??null,l?.orgId??null)}}return {shutdownAnalytics:a,groupIdentifyOrg:o,identifyUser:i,captureEvent:(l,{userId:c,orgId:u})=>r(l,c,u),captureBillingEvent:(l,{userId:c,orgId:u})=>r(l,c,u)}}var kme=2e3,Su=t=>Number.parseInt(t,10),NP=t=>readFileSync(t,"utf8").trim(),Pm=t=>Su(NP(t)),yj,UE,Jh={samples:0,lowMemorySamples:0,highCpuSamples:0,highHeapSamples:0};function vj(){return {...Jh}}var zE=$s.platform(),Fme=$s.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 DP(t=Date.now()){let e=$s.cpus(),n={measurementTime:t,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let r of e)n.user+=r.times.user,n.nice+=r.times.nice,n.sys+=r.times.sys,n.idle+=r.times.idle,n.irq+=r.times.irq;return n.total=n.user+n.nice+n.sys+n.idle+n.irq,n}function Cj(t,e){let n={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 n.total<=0?null:{measurementTime:e.measurementTime,intervalMs:e.measurementTime-t.measurementTime,user:n.user/n.total*100,nice:n.nice/n.total*100,sys:n.sys/n.total*100,idle:n.idle/n.total*100,irq:n.irq/n.total*100,total:100-n.idle/n.total*100}}function Bme(){let t=DP();return ()=>{let e=DP(),n=Cj(t,e);return t=e,n}}function Sj(){try{let e=readFileSync("/sys/fs/cgroup/cpu.stat","utf8").match(/^usage_usec\s+(\d+)/m);if(e?.[1])return Su(e[1])}catch{}try{let t=Pm("/sys/fs/cgroup/cpuacct/cpuacct.usage");if(!isNaN(t))return t/1e3}catch{}return null}function Ume(){try{let e=NP("/sys/fs/cgroup/cpu.max").split(" "),n=e[0],r=e[1];return !n||!r||n==="max"?null:Su(n)/Su(r)}catch{}try{let t=Pm("/sys/fs/cgroup/cpu/cpu.cfs_quota_us"),e=Pm("/sys/fs/cgroup/cpu/cpu.cfs_period_us");return t===-1||isNaN(e)?null:t/e}catch{return null}}function zme(){if(zE!=="linux")return null;let t=Sj();if(t===null)return null;let e=Ume()??$s.cpus().length,n=t,r=Date.now();return ()=>{let o=Sj();if(o===null)return null;let i=Date.now(),a=i-r;if(a<=0)return null;let s=o-n,l=a*1e3,c=Math.max(0,Math.min(100,s/l/e*100));return n=o,r=i,{measurementTime:i,intervalMs:a,user:c,nice:0,sys:0,idle:Math.max(0,100-c),irq:0,total:c}}}function $me(){let t=process.cpuUsage(),e=process.hrtime.bigint();return ()=>{let n=process.cpuUsage(),r=process.hrtime.bigint(),o=Number(r-e)/1e6,i=n.user-t.user,a=n.system-t.system;if(t=n,e=r,o<=0)return null;let s=Math.max($s.cpus().length,1),l=c=>Math.max(0,c/1e3/o*100/s);return {total:l(i+a),user:l(i),sys:l(a),intervalMs:o}}}function wj({intervalMs:t=kme,maxSamples:e=1e4,keepSamples:n=true,onSample:r}={}){let o=[],i=zme()??Bme(),a=$me(),s=()=>{let u=Date.now(),d=Rj(),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}}};r?.(h),n&&(o.push(h),o.length>e&&o.shift());};s();let l=setInterval(s,t),c=u=>({samples:n?[...o]:[]});return {stop:()=>(clearInterval(l),c()),getSeries:()=>c()}}var Ej=t=>{try{let e={},n=!1,r=Rj(),o=jme();Jh.samples++,r.freePercentage<.05&&(Object.assign(e,process.memoryUsage()),n=!0,Jh.lowMemorySamples++),o&&o?.total>80&&(n=!0,Jh.highCpuSamples++);let i=Lme.getHeapStatistics(),a=i.used_heap_size,s=i.heap_size_limit;a/s>.9&&(n=!0,Jh.highHeapSamples++),n?t.warn({memory:r,cpu:o,heapStats:i,...e},"Critical resource usage metrics detected"):t.debug({memory:r,cpu:o},"Got machine resource usage metrics");}catch{}};function Aj(t){return Ej(t),{interval:setInterval(()=>Ej(t),2e4),cpuMetadata:Fme,platform:zE}}function Vme(){if(zE!=="linux")return null;try{let t=NP("/sys/fs/cgroup/memory.max"),e=Pm("/sys/fs/cgroup/memory.current");if(t==="max"||isNaN(e))return null;let n=Su(t);if(isNaN(n))return null;let r=Math.max(0,n-e);return {totalMemory:n,freeMemory:r,freePercentage:r/n}}catch{}try{let t=Pm("/sys/fs/cgroup/memory/memory.limit_in_bytes"),e=Pm("/sys/fs/cgroup/memory/memory.usage_in_bytes");if(isNaN(t)||isNaN(e))return null;let n=$s.totalmem();if(t>=n)return null;let r=Math.max(0,t-e);return {totalMemory:t,freeMemory:r,freePercentage:r/t}}catch{return null}}function Rj(){let t=Vme();if(t)return t;let e=$s.totalmem(),n=zE==="darwin"?Hme():(()=>{let o=$s.freemem();return {availableMemory:o,rawFreeMemory:o,cachedMemory:0}})(),r=n.availableMemory/e;return {totalMemory:e,freeMemory:n.availableMemory,freePercentage:r}}function jme(){let t=DP();if(!UE)return UE=t,null;let e=Cj(UE,t);return UE=t,e?(yj=e,yj):null}function Hme(){try{let t=execSync("/usr/bin/vm_stat",{encoding:"utf8",stdio:["pipe","pipe","ignore"]}),n=t.match(/page size of (\d+) bytes/)?.[1],r=n?Su(n):4096,o=u=>{let m=t.match(new RegExp(`${u}:\\s+(\\d+)\\.`,"i"))?.[1];return m?Su(m):0},i=o("Pages free"),a=o("Pages inactive"),s=o("Pages speculative"),l=i*r,c=(a+s)*r;return {availableMemory:l+c,rawFreeMemory:l,cachedMemory:c}}catch{let t=$s.freemem();return {availableMemory:t,rawFreeMemory:t,cachedMemory:0}}}var Im=false,$E,Zh,Qh,tpe=[];function VE(){return Im}async function npe(){for(let t of tpe)try{await t();}catch{}}function rpe(){return VE()&&trace.getSpan(context.active())!==void 0}function ope(){return process.env.MOMENTIC_LOCAL_DEV==="1"&&process.env.LOCAL_SIGNOZ==="true"?new OTLPTraceExporter({url:"http://localhost:4318/v1/traces"}):new OTLPTraceExporter({url:`${LE}/v1/traces`,headers:{"x-momentic-metrics-api-key":kE}})}function ipe(t){let e="production",n=v4$1(),r=ope(),o=new NodeTracerProvider({resource:new Resource({[SEMRESATTRS_SERVICE_NAME]:t,[SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]:e,[SEMRESATTRS_SERVICE_INSTANCE_ID]:n})});return o.addSpanProcessor(new BatchSpanProcessor(r)),o}function ape(t){return !t&&!$E?trace.getTracer("momentic-serverless"):Qh?.getTracer("momentic-serverless")??trace.getTracer("momentic-serverless")}async function jE(t){if(!(!t.enabled||Im))try{$E=t.serviceName;let e=ipe(t.serviceName);Qh=e,Zh=new AsyncLocalStorageContextManager,e.register({contextManager:Zh.enable()}),Im=!0;}catch{Im=false,$E=void 0,Qh=void 0,Zh=void 0;}}async function HE(){if(Im)try{await npe(),await Qh?.shutdown();}catch{}finally{try{Zh?.disable();}catch{}Im=false,$E=void 0,Zh=void 0,Qh=void 0;}}async function Xe(t){if(!VE()||!t.root&&!rpe())return t.fn(void 0);let e=t.serviceName===void 0?t.attributes:{...t.attributes??{},"momentic.span_service_name":t.serviceName};return await ape(t.serviceName).startActiveSpan(t.name,{attributes:e,kind:t.kind??SpanKind.CLIENT},async n=>{try{let r=await t.fn(n);return n.setStatus({code:SpanStatusCode.OK}),r}catch(r){throw n.setStatus({code:SpanStatusCode.ERROR,message:r instanceof Error?r.message.slice(0,300):void 0}),r instanceof Error&&n.recordException(r),r}finally{n.end();}})}var eg=class{increment(e,n,r){}gauge(e,n){}distribution(e,n,r){}async flush(){}async recordDuration(e){return await kP(e)}};async function kP({fn:t,name:e,timeoutMs:n,trace:r}){let o=r?()=>Xe({name:r.name,attributes:r.attributes,fn:t}):t,i=Promise.resolve(o());return n===void 0?await i:await te(i,{milliseconds:n,message:`Timed out after ${n}ms recording duration for ${e}`})}function spe(t){if(!t||t.length===0)return {};let e={};for(let n of t){let r=n.indexOf(":");if(r>-1){let o=n.slice(0,r).trim(),i=n.slice(r+1).trim();o&&(e[o]=i);continue}e[n]=true;}return e}function FP(t,e){let n=spe(t);return !e||Object.keys(e).length===0?n:{...e,...n}}var cpe=createContextKey("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function Pj(t){return t.setValue(cpe,true)}var Ij="=",WE=";",BP=",";var _j=8192;var upe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i};function Oj(t){return t.reduce(function(e,n){var r=""+e+(e!==""?BP:"")+n;return r.length>_j?e:r},"")}function Dj(t){return t.getAllEntries().map(function(e){var n=upe(e,2),r=n[0],o=n[1],i=encodeURIComponent(r)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=WE+o.metadata.toString()),i})}function UP(t){var e=t.split(WE);if(!(e.length<=0)){var n=e.shift();if(n){var r=n.indexOf(Ij);if(!(r<=0)){var o=decodeURIComponent(n.substring(0,r).trim()),i=decodeURIComponent(n.substring(r+1).trim()),a;return e.length>0&&(a=baggageEntryMetadataFromString(e.join(WE))),{key:o,value:i,metadata:a}}}}}function Nj(t){return typeof t!="string"||t.length===0?{}:t.split(BP).map(function(e){return UP(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,n){return e[n.key]=n.value,e},{})}function Lj(){return function(t){diag.error(ppe(t));}}function ppe(t){return typeof t=="string"?t:JSON.stringify(fpe(t))}function fpe(t){for(var e={},n=t;n!==null;)Object.getOwnPropertyNames(n).forEach(function(r){if(!e[r]){var o=n[r];o&&(e[r]=String(o));}}),n=Object.getPrototypeOf(n);return e}var hpe=Lj();function GE(t){try{hpe(t);}catch{}}var qE;(function(t){t.AlwaysOff="always_off",t.AlwaysOn="always_on",t.ParentBasedAlwaysOff="parentbased_always_off",t.ParentBasedAlwaysOn="parentbased_always_on",t.ParentBasedTraceIdRatio="parentbased_traceidratio",t.TraceIdRatio="traceidratio";})(qE||(qE={}));var gpe=",",bpe=["OTEL_SDK_DISABLED"];function ype(t){return bpe.indexOf(t)>-1}var Spe=["OTEL_BSP_EXPORT_TIMEOUT","OTEL_BSP_MAX_EXPORT_BATCH_SIZE","OTEL_BSP_MAX_QUEUE_SIZE","OTEL_BSP_SCHEDULE_DELAY","OTEL_BLRP_EXPORT_TIMEOUT","OTEL_BLRP_MAX_EXPORT_BATCH_SIZE","OTEL_BLRP_MAX_QUEUE_SIZE","OTEL_BLRP_SCHEDULE_DELAY","OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_EVENT_COUNT_LIMIT","OTEL_SPAN_LINK_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT","OTEL_EXPORTER_OTLP_TIMEOUT","OTEL_EXPORTER_OTLP_TRACES_TIMEOUT","OTEL_EXPORTER_OTLP_METRICS_TIMEOUT","OTEL_EXPORTER_OTLP_LOGS_TIMEOUT","OTEL_EXPORTER_JAEGER_AGENT_PORT"];function Epe(t){return Spe.indexOf(t)>-1}var Tpe=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS","OTEL_SEMCONV_STABILITY_OPT_IN"];function vpe(t){return Tpe.indexOf(t)>-1}var zP=1/0,$P=128,Cpe=128,wpe=128,VP={OTEL_SDK_DISABLED:false,CONTAINER_NAME:"",ECS_CONTAINER_METADATA_URI_V4:"",ECS_CONTAINER_METADATA_URI:"",HOSTNAME:"",KUBERNETES_SERVICE_HOST:"",NAMESPACE:"",OTEL_BSP_EXPORT_TIMEOUT:3e4,OTEL_BSP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BSP_MAX_QUEUE_SIZE:2048,OTEL_BSP_SCHEDULE_DELAY:5e3,OTEL_BLRP_EXPORT_TIMEOUT:3e4,OTEL_BLRP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BLRP_MAX_QUEUE_SIZE:2048,OTEL_BLRP_SCHEDULE_DELAY:5e3,OTEL_EXPORTER_JAEGER_AGENT_HOST:"",OTEL_EXPORTER_JAEGER_AGENT_PORT:6832,OTEL_EXPORTER_JAEGER_ENDPOINT:"",OTEL_EXPORTER_JAEGER_PASSWORD:"",OTEL_EXPORTER_JAEGER_USER:"",OTEL_EXPORTER_OTLP_ENDPOINT:"",OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:"",OTEL_EXPORTER_OTLP_METRICS_ENDPOINT:"",OTEL_EXPORTER_OTLP_LOGS_ENDPOINT:"",OTEL_EXPORTER_OTLP_HEADERS:"",OTEL_EXPORTER_OTLP_TRACES_HEADERS:"",OTEL_EXPORTER_OTLP_METRICS_HEADERS:"",OTEL_EXPORTER_OTLP_LOGS_HEADERS:"",OTEL_EXPORTER_OTLP_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_METRICS_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_LOGS_TIMEOUT:1e4,OTEL_EXPORTER_ZIPKIN_ENDPOINT:"http://localhost:9411/api/v2/spans",OTEL_LOG_LEVEL:DiagLogLevel.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:["tracecontext","baggage"],OTEL_RESOURCE_ATTRIBUTES:"",OTEL_SERVICE_NAME:"",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:zP,OTEL_ATTRIBUTE_COUNT_LIMIT:$P,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:zP,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:$P,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:zP,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:$P,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:Cpe,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:wpe,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:qE.ParentBasedAlwaysOn,OTEL_TRACES_SAMPLER_ARG:"",OTEL_LOGS_EXPORTER:"",OTEL_EXPORTER_OTLP_INSECURE:"",OTEL_EXPORTER_OTLP_TRACES_INSECURE:"",OTEL_EXPORTER_OTLP_METRICS_INSECURE:"",OTEL_EXPORTER_OTLP_LOGS_INSECURE:"",OTEL_EXPORTER_OTLP_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_COMPRESSION:"",OTEL_EXPORTER_OTLP_TRACES_COMPRESSION:"",OTEL_EXPORTER_OTLP_METRICS_COMPRESSION:"",OTEL_EXPORTER_OTLP_LOGS_COMPRESSION:"",OTEL_EXPORTER_OTLP_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_TRACES_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_LOGS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE:"cumulative",OTEL_SEMCONV_STABILITY_OPT_IN:[]};function Ape(t,e,n){if(!(typeof n[t]>"u")){var r=String(n[t]);e[t]=r.toLowerCase()==="true";}}function Rpe(t,e,n,r,o){if(r===void 0&&(r=-1/0),o===void 0&&(o=1/0),typeof n[t]<"u"){var i=Number(n[t]);isNaN(i)||(i<r?e[t]=r:i>o?e[t]=o:e[t]=i);}}function xpe(t,e,n,r){r===void 0&&(r=gpe);var o=n[t];typeof o=="string"&&(e[t]=o.split(r).map(function(i){return i.trim()}));}var Mpe={ALL:DiagLogLevel.ALL,VERBOSE:DiagLogLevel.VERBOSE,DEBUG:DiagLogLevel.DEBUG,INFO:DiagLogLevel.INFO,WARN:DiagLogLevel.WARN,ERROR:DiagLogLevel.ERROR,NONE:DiagLogLevel.NONE};function Ppe(t,e,n){var r=n[t];if(typeof r=="string"){var o=Mpe[r.toUpperCase()];o!=null&&(e[t]=o);}}function kj(t){var e={};for(var n in VP){var r=n;switch(r){case "OTEL_LOG_LEVEL":Ppe(r,e,t);break;default:if(ype(r))Ape(r,e,t);else if(Epe(r))Rpe(r,e,t);else if(vpe(r))xpe(r,e,t);else {var o=t[r];typeof o<"u"&&o!==null&&(e[r]=String(o));}}}return e}function tg(){var t=kj(process.env);return Object.assign({},VP,t)}function Fj(t){return t>=48&&t<=57?t-48:t>=97&&t<=102?t-87:t-55}function ng(t){for(var e=new Uint8Array(t.length/2),n=0,r=0;r<t.length;r+=2){var o=Fj(t.charCodeAt(r)),i=Fj(t.charCodeAt(r+1));e[n++]=o<<4|i;}return e}function rg(t){t.unref();}var Lpe=9,kpe=6,Fpe=Math.pow(10,kpe),Bpe=Math.pow(10,Lpe);function Eu(t){var e=t/1e3,n=Math.trunc(e),r=Math.round(t%1e3*Fpe);return [n,r]}function jP(t){return t[0]*Bpe+t[1]}function _m(t){return t[0]*1e6+t[1]/1e3}var ni;(function(t){t[t.SUCCESS=0]="SUCCESS",t[t.FAILED=1]="FAILED";})(ni||(ni={}));function zj(t,e){return new Promise(function(n){context.with(Pj(context.active()),function(){t.export(e,function(r){n(r);});});})}var og={getKeyPairs:Dj,serializeKeyPairs:Oj,parseKeyPairsIntoRecord:Nj,parsePairKeyValue:UP},$j={_export:zj};var Wr;(function(t){t[t.DELTA=0]="DELTA",t[t.CUMULATIVE=1]="CUMULATIVE";})(Wr||(Wr={}));var Gr;(function(t){t[t.HISTOGRAM=0]="HISTOGRAM",t[t.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",t[t.GAUGE=2]="GAUGE",t[t.SUM=3]="SUM";})(Gr||(Gr={}));var Upe=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),Vj=function(t,e,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(t,[])).next());})},jj=function(t,e){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=e.call(t,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:true}}},zpe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},$pe=function(t,e,n){if(arguments.length===2)for(var r=0,o=e.length,i;r<o;r++)(i||!(r in e))&&(i||(i=Array.prototype.slice.call(e,0,r)),i[r]=e[r]);return t.concat(i||Array.prototype.slice.call(e))},Vpe=function(t){var e=typeof Symbol=="function"&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&typeof t.length=="number")return {next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function Hj(t){return t!=null}function KE(t){var e=Object.keys(t);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(n){return [n,t[n]]})))}function Wj(t){var e,n;return t.name+":"+((e=t.version)!==null&&e!==void 0?e:"")+":"+((n=t.schemaUrl)!==null&&n!==void 0?n:"")}var HP=function(t){Upe(e,t);function e(n){var r=t.call(this,n)||this;return Object.setPrototypeOf(r,e.prototype),r}return e}(Error);function Hl(t,e){var n,r=new Promise(function(i,a){n=setTimeout(function(){a(new HP("Operation timed out."));},e);});return Promise.race([t,r]).then(function(o){return clearTimeout(n),o},function(o){throw clearTimeout(n),o})}function Gj(t){return Vj(this,void 0,void 0,function(){var e=this;return jj(this,function(n){return [2,Promise.all(t.map(function(r){return Vj(e,void 0,void 0,function(){var o,i;return jj(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,r];case 1:return o=a.sent(),[2,{status:"fulfilled",value:o}];case 2:return i=a.sent(),[2,{status:"rejected",reason:i}];case 3:return [2]}})})}))]})})}function qj(t){return t.status==="rejected"}function WP(t,e){var n=[];return t.forEach(function(r){n.push.apply(n,$pe([],zpe(e(r)),false));}),n}function Kj(t,e){var n,r;if(t.size!==e.size)return false;try{for(var o=Vpe(t),i=o.next();!i.done;i=o.next()){var a=i.value;if(!e.has(a))return !1}}catch(s){n={error:s};}finally{try{i&&!i.done&&(r=o.return)&&r.call(o);}finally{if(n)throw n.error}}return true}function Yj(t,e){for(var n=0,r=t.length-1,o=t.length;r>=n;){var i=n+Math.trunc((r-n)/2);t[i]<e?n=i+1:(o=i,r=i-1);}return o}function Xj(t,e){return t.toLowerCase()===e.toLowerCase()}var Ii;(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";})(Ii||(Ii={}));var GP=function(){function t(){this.kind=Ii.DROP;}return t.prototype.createAccumulation=function(){},t.prototype.merge=function(e,n){},t.prototype.diff=function(e,n){},t.prototype.toMetricData=function(e,n,r,o){},t}();var Ue;(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";})(Ue||(Ue={}));function Ya(t,e,n){var r,o,i,a;return Gpe(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:(r=n?.description)!==null&&r!==void 0?r:"",unit:(o=n?.unit)!==null&&o!==void 0?o:"",valueType:(i=n?.valueType)!==null&&i!==void 0?i:ValueType.DOUBLE,advice:(a=n?.advice)!==null&&a!==void 0?a:{}}}function Jj(t,e){var n,r;return {name:(n=t.name)!==null&&n!==void 0?n:e.name,description:(r=t.description)!==null&&r!==void 0?r:e.description,type:e.type,unit:e.unit,valueType:e.valueType,advice:e.advice}}function Zj(t,e){return Xj(t.name,e.name)&&t.unit===e.unit&&t.type===e.type&&t.valueType===e.valueType}var Wpe=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function Gpe(t){return t.match(Wpe)!=null}var qpe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i};function Kpe(t){var e=t.map(function(){return 0});return e.push(0),{buckets:{boundaries:t,counts:e},sum:0,count:0,hasMinMax:false,min:1/0,max:-1/0}}var YE=function(){function t(e,n,r,o){r===void 0&&(r=true),o===void 0&&(o=Kpe(n)),this.startTime=e,this._boundaries=n,this._recordMinMax=r,this._current=o;}return t.prototype.record=function(e){if(!Number.isNaN(e)){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);var n=Yj(this._boundaries,e);this._current.buckets.counts[n]+=1;}},t.prototype.setStartTime=function(e){this.startTime=e;},t.prototype.toPointValue=function(){return this._current},t}();var XE=function(){function t(e,n){this._boundaries=e,this._recordMinMax=n,this.kind=Ii.HISTOGRAM;}return t.prototype.createAccumulation=function(e){return new YE(e,this._boundaries,this._recordMinMax)},t.prototype.merge=function(e,n){for(var r=e.toPointValue(),o=n.toPointValue(),i=r.buckets.counts,a=o.buckets.counts,s=new Array(i.length),l=0;l<i.length;l++)s[l]=i[l]+a[l];var c=1/0,u=-1/0;return this._recordMinMax&&(r.hasMinMax&&o.hasMinMax?(c=Math.min(r.min,o.min),u=Math.max(r.max,o.max)):r.hasMinMax?(c=r.min,u=r.max):o.hasMinMax&&(c=o.min,u=o.max)),new YE(e.startTime,r.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:r.buckets.boundaries,counts:s},count:r.count+o.count,sum:r.sum+o.sum,hasMinMax:this._recordMinMax&&(r.hasMinMax||o.hasMinMax),min:c,max:u})},t.prototype.diff=function(e,n){for(var r=e.toPointValue(),o=n.toPointValue(),i=r.buckets.counts,a=o.buckets.counts,s=new Array(i.length),l=0;l<i.length;l++)s[l]=a[l]-i[l];return new YE(n.startTime,r.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:r.buckets.boundaries,counts:s},count:o.count-r.count,sum:o.sum-r.sum,hasMinMax:false,min:1/0,max:-1/0})},t.prototype.toMetricData=function(e,n,r,o){return {descriptor:e,aggregationTemporality:n,dataPointType:Gr.HISTOGRAM,dataPoints:r.map(function(i){var a=qpe(i,2),s=a[0],l=a[1],c=l.toPointValue(),u=e.type===Ue.GAUGE||e.type===Ue.UP_DOWN_COUNTER||e.type===Ue.OBSERVABLE_GAUGE||e.type===Ue.OBSERVABLE_UP_DOWN_COUNTER;return {attributes:s,startTime:l.startTime,endTime:o,value:{min:c.hasMinMax?c.min:void 0,max:c.hasMinMax?c.max:void 0,sum:u?void 0:c.sum,buckets:c.buckets,count:c.count}}})}},t}();var qP=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},KP=function(t,e,n){if(arguments.length===2)for(var r=0,o=e.length,i;r<o;r++)(i||!(r in e))&&(i||(i=Array.prototype.slice.call(e,0,r)),i[r]=e[r]);return t.concat(i||Array.prototype.slice.call(e))},YP=function(){function t(e,n,r,o){e===void 0&&(e=new Ype),n===void 0&&(n=0),r===void 0&&(r=0),o===void 0&&(o=0),this.backing=e,this.indexBase=n,this.indexStart=r,this.indexEnd=o;}return Object.defineProperty(t.prototype,"offset",{get:function(){return this.indexStart},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"length",{get:function(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1},enumerable:false,configurable:true}),t.prototype.counts=function(){var e=this;return Array.from({length:this.length},function(n,r){return e.at(r)})},t.prototype.at=function(e){var n=this.indexBase-this.indexStart;return e<n&&(e+=this.backing.length),e-=n,this.backing.countAt(e)},t.prototype.incrementBucket=function(e,n){this.backing.increment(e,n);},t.prototype.decrementBucket=function(e,n){this.backing.decrement(e,n);},t.prototype.trim=function(){for(var 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(var e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate();},t.prototype.downscale=function(e){this._rotate();for(var n=1+this.indexEnd-this.indexStart,r=1<<e,o=0,i=0,a=this.indexStart;a<=this.indexEnd;){var s=a%r;s<0&&(s+=r);for(var l=s;l<r&&o<n;l++)this._relocateBucket(i,o),o++,a++;i++;}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart;},t.prototype.clone=function(){return new t(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)},t.prototype._rotate=function(){var 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);},t.prototype._relocateBucket=function(e,n){e!==n&&this.incrementBucket(e,this.backing.emptyBucket(n));},t}();var Ype=function(){function t(e){e===void 0&&(e=[0]),this._counts=e;}return Object.defineProperty(t.prototype,"length",{get:function(){return this._counts.length},enumerable:false,configurable:true}),t.prototype.countAt=function(e){return this._counts[e]},t.prototype.growTo=function(e,n,r){var o=new Array(e).fill(0);o.splice.apply(o,KP([r,this._counts.length-n],qP(this._counts.slice(n)),false)),o.splice.apply(o,KP([0,n],qP(this._counts.slice(0,n)),false)),this._counts=o;},t.prototype.reverse=function(e,n){for(var r=Math.floor((e+n)/2)-e,o=0;o<r;o++){var i=this._counts[e+o];this._counts[e+o]=this._counts[n-o-1],this._counts[n-o-1]=i;}},t.prototype.emptyBucket=function(e){var n=this._counts[e];return this._counts[e]=0,n},t.prototype.increment=function(e,n){this._counts[e]+=n;},t.prototype.decrement=function(e,n){this._counts[e]>=n?this._counts[e]-=n:this._counts[e]=0;},t.prototype.clone=function(){return new t(KP([],qP(this._counts),false))},t}();var Qj=52,Xpe=2146435072,Jpe=1048575,XP=1023,JE=-1023+1,ZE=XP,ig=Math.pow(2,-1022);function QE(t){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,t);var n=e.getUint32(0),r=(n&Xpe)>>20;return r-XP}function eT(t){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,t);var n=e.getUint32(0),r=e.getUint32(4),o=(n&Jpe)*Math.pow(2,32);return o+r}function ag(t,e){return t===0||t===Number.POSITIVE_INFINITY||t===Number.NEGATIVE_INFINITY||Number.isNaN(t)?t:t*Math.pow(2,e)}function tH(t){return t--,t|=t>>1,t|=t>>2,t|=t>>4,t|=t>>8,t|=t>>16,t++,t}var Zpe=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),Wl=function(t){Zpe(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Error);var rH=function(){function t(e){this._shift=-e;}return t.prototype.mapToIndex=function(e){if(e<ig)return this._minNormalLowerBoundaryIndex();var n=QE(e),r=this._rightShift(eT(e)-1,Qj);return n+r>>this._shift},t.prototype.lowerBoundary=function(e){var n=this._minNormalLowerBoundaryIndex();if(e<n)throw new Wl("underflow: "+e+" is < minimum lower boundary: "+n);var r=this._maxNormalLowerBoundaryIndex();if(e>r)throw new Wl("overflow: "+e+" is > maximum lower boundary: "+r);return ag(1,e<<this._shift)},Object.defineProperty(t.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:false,configurable:true}),t.prototype._minNormalLowerBoundaryIndex=function(){var e=JE>>this._shift;return this._shift<2&&e--,e},t.prototype._maxNormalLowerBoundaryIndex=function(){return ZE>>this._shift},t.prototype._rightShift=function(e,n){return Math.floor(e*Math.pow(2,-n))},t}();var oH=function(){function t(e){this._scale=e,this._scaleFactor=ag(Math.LOG2E,e),this._inverseFactor=ag(Math.LN2,-e);}return t.prototype.mapToIndex=function(e){if(e<=ig)return this._minNormalLowerBoundaryIndex()-1;if(eT(e)===0){var n=QE(e);return (n<<this._scale)-1}var r=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return r>=o?o:r},t.prototype.lowerBoundary=function(e){var n=this._maxNormalLowerBoundaryIndex();if(e>=n){if(e===n)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Wl("overflow: "+e+" is > maximum lower boundary: "+n)}var r=this._minNormalLowerBoundaryIndex();if(e<=r){if(e===r)return ig;if(e===r-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Wl("overflow: "+e+" is < minimum lower boundary: "+r)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(t.prototype,"scale",{get:function(){return this._scale},enumerable:false,configurable:true}),t.prototype._minNormalLowerBoundaryIndex=function(){return JE<<this._scale},t.prototype._maxNormalLowerBoundaryIndex=function(){return (ZE+1<<this._scale)-1},t}();var iH=-10,aH=20,Qpe=Array.from({length:31},function(t,e){return e>10?new oH(e-10):new rH(e-10)});function JP(t){if(t>aH||t<iH)throw new Wl("expected scale >= "+iH+" && <= "+aH+", got: "+t);return Qpe[t+10]}var efe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},tT=function(){function t(e,n){this.low=e,this.high=n;}return t.combine=function(e,n){return new t(Math.min(e.low,n.low),Math.max(e.high,n.high))},t}(),nfe=20,rfe=160,ZP=2,sH=function(){function t(e,n,r,o,i,a,s,l,c,u,d){e===void 0&&(e=e),n===void 0&&(n=rfe),r===void 0&&(r=true),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),s===void 0&&(s=Number.POSITIVE_INFINITY),l===void 0&&(l=Number.NEGATIVE_INFINITY),c===void 0&&(c=new YP),u===void 0&&(u=new YP),d===void 0&&(d=JP(nfe)),this.startTime=e,this._maxSize=n,this._recordMinMax=r,this._sum=o,this._count=i,this._zeroCount=a,this._min=s,this._max=l,this._positive=c,this._negative=u,this._mapping=d,this._maxSize<ZP&&(diag.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+ZP),this._maxSize=ZP);}return t.prototype.record=function(e){this.updateByIncrement(e,1);},t.prototype.setStartTime=function(e){this.startTime=e;},t.prototype.toPointValue=function(){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}},Object.defineProperty(t.prototype,"sum",{get:function(){return this._sum},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"min",{get:function(){return this._min},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"max",{get:function(){return this._max},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"count",{get:function(){return this._count},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"zeroCount",{get:function(){return this._zeroCount},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"scale",{get:function(){return this._count===this._zeroCount?0:this._mapping.scale},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"positive",{get:function(){return this._positive},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"negative",{get:function(){return this._negative},enumerable:false,configurable:true}),t.prototype.updateByIncrement=function(e,n){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=n,e===0){this._zeroCount+=n;return}this._sum+=e*n,e>0?this._updateBuckets(this._positive,e,n):this._updateBuckets(this._negative,-e,n);}},t.prototype.merge=function(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;var n=this._minScale(e);this._downscale(this.scale-n),this._mergeBuckets(this.positive,e,e.positive,n),this._mergeBuckets(this.negative,e,e.negative,n);},t.prototype.diff=function(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;var n=this._minScale(e);this._downscale(this.scale-n),this._diffBuckets(this.positive,e,e.positive,n),this._diffBuckets(this.negative,e,e.negative,n);},t.prototype.clone=function(){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)},t.prototype._updateBuckets=function(e,n,r){var o=this._mapping.mapToIndex(n),i=false,a=0,s=0;if(e.length===0?(e.indexStart=o,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):o<e.indexStart&&e.indexEnd-o>=this._maxSize?(i=true,s=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=true,s=e.indexStart,a=o),i){var l=this._changeScale(a,s);this._downscale(l),o=this._mapping.mapToIndex(n);}this._incrementIndexBy(e,o,r);},t.prototype._incrementIndexBy=function(e,n,r){if(r!==0){if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=n),n<e.indexStart){var o=e.indexEnd-n;o>=e.backing.length&&this._grow(e,o+1),e.indexStart=n;}else if(n>e.indexEnd){var o=n-e.indexStart;o>=e.backing.length&&this._grow(e,o+1),e.indexEnd=n;}var i=n-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,r);}},t.prototype._grow=function(e,n){var r=e.backing.length,o=e.indexBase-e.indexStart,i=r-o,a=tH(n);a>this._maxSize&&(a=this._maxSize);var s=a-o;e.backing.growTo(a,i,s);},t.prototype._changeScale=function(e,n){for(var r=0;e-n>=this._maxSize;)e>>=1,n>>=1,r++;return r},t.prototype._downscale=function(e){if(e!==0){if(e<0)throw new Error("impossible change of scale: "+this.scale);var n=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=JP(n);}},t.prototype._minScale=function(e){var n=Math.min(this.scale,e.scale),r=tT.combine(this._highLowAtScale(this.positive,this.scale,n),this._highLowAtScale(e.positive,e.scale,n)),o=tT.combine(this._highLowAtScale(this.negative,this.scale,n),this._highLowAtScale(e.negative,e.scale,n));return Math.min(n-this._changeScale(r.high,r.low),n-this._changeScale(o.high,o.low))},t.prototype._highLowAtScale=function(e,n,r){if(e.length===0)return new tT(0,-1);var o=n-r;return new tT(e.indexStart>>o,e.indexEnd>>o)},t.prototype._mergeBuckets=function(e,n,r,o){for(var i=r.offset,a=n.scale-o,s=0;s<r.length;s++)this._incrementIndexBy(e,i+s>>a,r.at(s));},t.prototype._diffBuckets=function(e,n,r,o){for(var i=r.offset,a=n.scale-o,s=0;s<r.length;s++){var l=i+s>>a,c=l-e.indexBase;c<0&&(c+=e.backing.length),e.decrementBucket(c,r.at(s));}e.trim();},t}();var QP=function(){function t(e,n){this._maxSize=e,this._recordMinMax=n,this.kind=Ii.EXPONENTIAL_HISTOGRAM;}return t.prototype.createAccumulation=function(e){return new sH(e,this._maxSize,this._recordMinMax)},t.prototype.merge=function(e,n){var r=n.clone();return r.merge(e),r},t.prototype.diff=function(e,n){var r=n.clone();return r.diff(e),r},t.prototype.toMetricData=function(e,n,r,o){return {descriptor:e,aggregationTemporality:n,dataPointType:Gr.EXPONENTIAL_HISTOGRAM,dataPoints:r.map(function(i){var a=efe(i,2),s=a[0],l=a[1],c=l.toPointValue(),u=e.type===Ue.GAUGE||e.type===Ue.UP_DOWN_COUNTER||e.type===Ue.OBSERVABLE_GAUGE||e.type===Ue.OBSERVABLE_UP_DOWN_COUNTER;return {attributes:s,startTime:l.startTime,endTime:o,value:{min:c.hasMinMax?c.min:void 0,max:c.hasMinMax?c.max:void 0,sum:u?void 0:c.sum,positive:{offset:c.positive.offset,bucketCounts:c.positive.bucketCounts},negative:{offset:c.negative.offset,bucketCounts:c.negative.bucketCounts},count:c.count,scale:c.scale,zeroCount:c.zeroCount}}})}},t}();var ofe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},nT=function(){function t(e,n,r){n===void 0&&(n=0),r===void 0&&(r=[0,0]),this.startTime=e,this._current=n,this.sampleTime=r;}return t.prototype.record=function(e){this._current=e,this.sampleTime=Eu(Date.now());},t.prototype.setStartTime=function(e){this.startTime=e;},t.prototype.toPointValue=function(){return this._current},t}();var eI=function(){function t(){this.kind=Ii.LAST_VALUE;}return t.prototype.createAccumulation=function(e){return new nT(e)},t.prototype.merge=function(e,n){var r=_m(n.sampleTime)>=_m(e.sampleTime)?n:e;return new nT(e.startTime,r.toPointValue(),r.sampleTime)},t.prototype.diff=function(e,n){var r=_m(n.sampleTime)>=_m(e.sampleTime)?n:e;return new nT(n.startTime,r.toPointValue(),r.sampleTime)},t.prototype.toMetricData=function(e,n,r,o){return {descriptor:e,aggregationTemporality:n,dataPointType:Gr.GAUGE,dataPoints:r.map(function(i){var a=ofe(i,2),s=a[0],l=a[1];return {attributes:s,startTime:l.startTime,endTime:o,value:l.toPointValue()}})}},t}();var ife=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},Om=function(){function t(e,n,r,o){r===void 0&&(r=0),o===void 0&&(o=false),this.startTime=e,this.monotonic=n,this._current=r,this.reset=o;}return t.prototype.record=function(e){this.monotonic&&e<0||(this._current+=e);},t.prototype.setStartTime=function(e){this.startTime=e;},t.prototype.toPointValue=function(){return this._current},t}();var rT=function(){function t(e){this.monotonic=e,this.kind=Ii.SUM;}return t.prototype.createAccumulation=function(e){return new Om(e,this.monotonic)},t.prototype.merge=function(e,n){var r=e.toPointValue(),o=n.toPointValue();return n.reset?new Om(n.startTime,this.monotonic,o,n.reset):new Om(e.startTime,this.monotonic,r+o)},t.prototype.diff=function(e,n){var r=e.toPointValue(),o=n.toPointValue();return this.monotonic&&r>o?new Om(n.startTime,this.monotonic,o,true):new Om(n.startTime,this.monotonic,o-r)},t.prototype.toMetricData=function(e,n,r,o){return {descriptor:e,aggregationTemporality:n,dataPointType:Gr.SUM,dataPoints:r.map(function(i){var a=ife(i,2),s=a[0],l=a[1];return {attributes:s,startTime:l.startTime,endTime:o,value:l.toPointValue()}}),isMonotonic:this.monotonic}},t}();var Tu=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),Oo=function(){function t(){}return t.Drop=function(){return hH},t.Sum=function(){return gH},t.LastValue=function(){return bH},t.Histogram=function(){return yH},t.ExponentialHistogram=function(){return afe},t.Default=function(){return sfe},t}();var cH=function(t){Tu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.createAggregator=function(n){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new GP,e}(Oo);var uH=function(t){Tu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.createAggregator=function(n){switch(n.type){case Ue.COUNTER:case Ue.OBSERVABLE_COUNTER:case Ue.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new rT(true),e.NON_MONOTONIC_INSTANCE=new rT(false),e}(Oo);var dH=function(t){Tu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.createAggregator=function(n){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new eI,e}(Oo);var mH=function(t){Tu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.createAggregator=function(n){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new XE([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],true),e}(Oo);var vu=function(t){Tu(e,t);function e(n,r){r===void 0&&(r=true);var o=t.call(this)||this;if(o._recordMinMax=r,n==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");n=n.concat(),n=n.sort(function(s,l){return s-l});var i=n.lastIndexOf(-1/0),a=n.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=n.slice(i+1,a),o}return e.prototype.createAggregator=function(n){return new XE(this._boundaries,this._recordMinMax)},e}(Oo);var pH=function(t){Tu(e,t);function e(n,r){n===void 0&&(n=160),r===void 0&&(r=true);var o=t.call(this)||this;return o._maxSize=n,o._recordMinMax=r,o}return e.prototype.createAggregator=function(n){return new QP(this._maxSize,this._recordMinMax)},e}(Oo);var fH=function(t){Tu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype._resolve=function(n){switch(n.type){case Ue.COUNTER:case Ue.UP_DOWN_COUNTER:case Ue.OBSERVABLE_COUNTER:case Ue.OBSERVABLE_UP_DOWN_COUNTER:return gH;case Ue.GAUGE:case Ue.OBSERVABLE_GAUGE:return bH;case Ue.HISTOGRAM:return n.advice.explicitBucketBoundaries?new vu(n.advice.explicitBucketBoundaries):yH}return aT.diag.warn("Unable to recognize instrument type: "+n.type),hH},e.prototype.createAggregator=function(n){return this._resolve(n).createAggregator(n)},e}(Oo);var hH=new cH,gH=new uH,bH=new dH,yH=new mH,afe=new pH,sfe=new fH;var SH=function(t){return Oo.Default()},EH=function(t){return Wr.CUMULATIVE};var tI=function(t,e,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(t,[])).next());})},nI=function(t,e){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=e.call(t,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:true}}},TH=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},lfe=function(t,e,n){if(arguments.length===2)for(var r=0,o=e.length,i;r<o;r++)(i||!(r in e))&&(i||(i=Array.prototype.slice.call(e,0,r)),i[r]=e[r]);return t.concat(i||Array.prototype.slice.call(e))},vH=function(){function t(e){var n,r,o;this._shutdown=false,this._aggregationSelector=(n=e?.aggregationSelector)!==null&&n!==void 0?n:SH,this._aggregationTemporalitySelector=(r=e?.aggregationTemporalitySelector)!==null&&r!==void 0?r:EH,this._metricProducers=(o=e?.metricProducers)!==null&&o!==void 0?o:[],this._cardinalitySelector=e?.cardinalitySelector;}return t.prototype.setMetricProducer=function(e){if(this._sdkMetricProducer)throw new Error("MetricReader can not be bound to a MeterProvider again.");this._sdkMetricProducer=e,this.onInitialized();},t.prototype.selectAggregation=function(e){return this._aggregationSelector(e)},t.prototype.selectAggregationTemporality=function(e){return this._aggregationTemporalitySelector(e)},t.prototype.selectCardinalityLimit=function(e){return this._cardinalitySelector?this._cardinalitySelector(e):2e3},t.prototype.onInitialized=function(){},t.prototype.collect=function(e){return tI(this,void 0,void 0,function(){var n,r,o,i,a,s;return nI(this,function(l){switch(l.label){case 0:if(this._sdkMetricProducer===void 0)throw new Error("MetricReader is not bound to a MetricProducer");if(this._shutdown)throw new Error("MetricReader is shutdown");return [4,Promise.all(lfe([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],TH(this._metricProducers.map(function(c){return c.collect({timeoutMillis:e?.timeoutMillis})})),false))];case 1:return n=TH.apply(void 0,[l.sent()]),r=n[0],o=n.slice(1),i=r.errors.concat(WP(o,function(c){return c.errors})),a=r.resourceMetrics.resource,s=r.resourceMetrics.scopeMetrics.concat(WP(o,function(c){return c.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:s},errors:i}]}})})},t.prototype.shutdown=function(e){return tI(this,void 0,void 0,function(){return nI(this,function(n){switch(n.label){case 0:return this._shutdown?(aT.diag.error("Cannot call shutdown twice."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onShutdown()];case 1:return n.sent(),[3,4];case 2:return [4,Hl(this.onShutdown(),e.timeoutMillis)];case 3:n.sent(),n.label=4;case 4:return this._shutdown=true,[2]}})})},t.prototype.forceFlush=function(e){return tI(this,void 0,void 0,function(){return nI(this,function(n){switch(n.label){case 0:return this._shutdown?(aT.diag.warn("Cannot forceFlush on already shutdown MetricReader."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onForceFlush()];case 1:return n.sent(),[2];case 2:return [4,Hl(this.onForceFlush(),e.timeoutMillis)];case 3:return n.sent(),[2]}})})},t}();var cfe=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),oT=function(t,e,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(t,[])).next());})},iT=function(t,e){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=e.call(t,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:true}}},ufe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},dfe=function(t,e,n){if(arguments.length===2)for(var r=0,o=e.length,i;r<o;r++)(i||!(r in e))&&(i||(i=Array.prototype.slice.call(e,0,r)),i[r]=e[r]);return t.concat(i||Array.prototype.slice.call(e))},oI=function(t){cfe(e,t);function e(n){var r,o,i,a,s=t.call(this,{aggregationSelector:(r=n.exporter.selectAggregation)===null||r===void 0?void 0:r.bind(n.exporter),aggregationTemporalitySelector:(o=n.exporter.selectAggregationTemporality)===null||o===void 0?void 0:o.bind(n.exporter),metricProducers:n.metricProducers})||this;if(n.exportIntervalMillis!==void 0&&n.exportIntervalMillis<=0)throw Error("exportIntervalMillis must be greater than 0");if(n.exportTimeoutMillis!==void 0&&n.exportTimeoutMillis<=0)throw Error("exportTimeoutMillis must be greater than 0");if(n.exportTimeoutMillis!==void 0&&n.exportIntervalMillis!==void 0&&n.exportIntervalMillis<n.exportTimeoutMillis)throw Error("exportIntervalMillis must be greater than or equal to exportTimeoutMillis");return s._exportInterval=(i=n.exportIntervalMillis)!==null&&i!==void 0?i:6e4,s._exportTimeout=(a=n.exportTimeoutMillis)!==null&&a!==void 0?a:3e4,s._exporter=n.exporter,s}return e.prototype._runOnce=function(){return oT(this,void 0,void 0,function(){var n;return iT(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,Hl(this._doRun(),this._exportTimeout)];case 1:return r.sent(),[3,3];case 2:return n=r.sent(),n instanceof HP?(aT.diag.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(GE(n),[3,3]);case 3:return [2]}})})},e.prototype._doRun=function(){var n,r;return oT(this,void 0,void 0,function(){var o,i,a,s,l,c;return iT(this,function(u){switch(u.label){case 0:return [4,this.collect({timeoutMillis:this._exportTimeout})];case 1:if(o=u.sent(),i=o.resourceMetrics,a=o.errors,a.length>0&&(c=aT.diag).error.apply(c,dfe(["PeriodicExportingMetricReader: metrics collection errors"],ufe(a),false)),!i.resource.asyncAttributesPending)return [3,5];u.label=2;case 2:return u.trys.push([2,4,,5]),[4,(r=(n=i.resource).waitForAsyncAttributes)===null||r===void 0?void 0:r.call(n)];case 3:return u.sent(),[3,5];case 4:return s=u.sent(),aT.diag.debug("Error while resolving async portion of resource: ",s),GE(s),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,$j._export(this._exporter,i)];case 6:if(l=u.sent(),l.code!==ni.SUCCESS)throw new Error("PeriodicExportingMetricReader: metrics export failed (error "+l.error+")");return [2]}})})},e.prototype.onInitialized=function(){var n=this;this._interval=setInterval(function(){n._runOnce();},this._exportInterval),rg(this._interval);},e.prototype.onForceFlush=function(){return oT(this,void 0,void 0,function(){return iT(this,function(n){switch(n.label){case 0:return [4,this._runOnce()];case 1:return n.sent(),[4,this._exporter.forceFlush()];case 2:return n.sent(),[2]}})})},e.prototype.onShutdown=function(){return oT(this,void 0,void 0,function(){return iT(this,function(n){switch(n.label){case 0:return this._interval&&clearInterval(this._interval),[4,this.onForceFlush()];case 1:return n.sent(),[4,this._exporter.shutdown()];case 2:return n.sent(),[2]}})})},e}(vH);var CH=function(){function t(){this._registeredViews=[];}return t.prototype.addView=function(e){this._registeredViews.push(e);},t.prototype.findViews=function(e,n){var r=this,o=this._registeredViews.filter(function(i){return r._matchInstrument(i.instrumentSelector,e)&&r._matchMeter(i.meterSelector,n)});return o},t.prototype._matchInstrument=function(e,n){return (e.getType()===void 0||n.type===e.getType())&&e.getNameFilter().match(n.name)&&e.getUnitFilter().match(n.unit)},t.prototype._matchMeter=function(e,n){return e.getNameFilter().match(n.name)&&(n.version===void 0||e.getVersionFilter().match(n.version))&&(n.schemaUrl===void 0||e.getSchemaUrlFilter().match(n.schemaUrl))},t}();var Cu=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),lT=function(){function t(e,n){this._writableMetricStorage=e,this._descriptor=n;}return t.prototype._record=function(e,n,r){if(n===void 0&&(n={}),r===void 0&&(r=context.active()),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,n,r,Eu(Date.now()));},t}();var wH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(n,r,o){this._record(n,r,o);},e}(lT);var AH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(n,r,o){if(n<0){diag.warn("negative value provided to counter "+this._descriptor.name+": "+n);return}this._record(n,r,o);},e}(lT);var RH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(n,r,o){this._record(n,r,o);},e}(lT);var xH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(n,r,o){if(n<0){diag.warn("negative value provided to histogram "+this._descriptor.name+": "+n);return}this._record(n,r,o);},e}(lT);var cT=function(){function t(e,n,r){this._observableRegistry=r,this._descriptor=e,this._metricStorages=n;}return t.prototype.addCallback=function(e){this._observableRegistry.addCallback(e,this);},t.prototype.removeCallback=function(e){this._observableRegistry.removeCallback(e,this);},t}();var MH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(cT);var PH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(cT);var IH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(cT);function sg(t){return t instanceof cT}var _H=function(){function t(e){this._meterSharedState=e;}return t.prototype.createGauge=function(e,n){var r=Ya(e,Ue.GAUGE,n),o=this._meterSharedState.registerMetricStorage(r);return new RH(o,r)},t.prototype.createHistogram=function(e,n){var r=Ya(e,Ue.HISTOGRAM,n),o=this._meterSharedState.registerMetricStorage(r);return new xH(o,r)},t.prototype.createCounter=function(e,n){var r=Ya(e,Ue.COUNTER,n),o=this._meterSharedState.registerMetricStorage(r);return new AH(o,r)},t.prototype.createUpDownCounter=function(e,n){var r=Ya(e,Ue.UP_DOWN_COUNTER,n),o=this._meterSharedState.registerMetricStorage(r);return new wH(o,r)},t.prototype.createObservableGauge=function(e,n){var r=Ya(e,Ue.OBSERVABLE_GAUGE,n),o=this._meterSharedState.registerAsyncMetricStorage(r);return new PH(r,o,this._meterSharedState.observableRegistry)},t.prototype.createObservableCounter=function(e,n){var r=Ya(e,Ue.OBSERVABLE_COUNTER,n),o=this._meterSharedState.registerAsyncMetricStorage(r);return new MH(r,o,this._meterSharedState.observableRegistry)},t.prototype.createObservableUpDownCounter=function(e,n){var r=Ya(e,Ue.OBSERVABLE_UP_DOWN_COUNTER,n),o=this._meterSharedState.registerAsyncMetricStorage(r);return new IH(r,o,this._meterSharedState.observableRegistry)},t.prototype.addBatchObservableCallback=function(e,n){this._meterSharedState.observableRegistry.addBatchCallback(e,n);},t.prototype.removeBatchObservableCallback=function(e,n){this._meterSharedState.observableRegistry.removeBatchCallback(e,n);},t}();var uT=function(){function t(e){this._instrumentDescriptor=e;}return t.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},t.prototype.updateDescription=function(e){this._instrumentDescriptor=Ya(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice});},t}();var ffe=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),OH=function(t,e){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=e.call(t,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:true}}},hfe=function(){function t(e){this._hash=e,this._valueMap=new Map,this._keyMap=new Map;}return t.prototype.get=function(e,n){return n??(n=this._hash(e)),this._valueMap.get(n)},t.prototype.getOrDefault=function(e,n){var r=this._hash(e);if(this._valueMap.has(r))return this._valueMap.get(r);var o=n();return this._keyMap.has(r)||this._keyMap.set(r,e),this._valueMap.set(r,o),o},t.prototype.set=function(e,n,r){r??(r=this._hash(e)),this._keyMap.has(r)||this._keyMap.set(r,e),this._valueMap.set(r,n);},t.prototype.has=function(e,n){return n??(n=this._hash(e)),this._valueMap.has(n)},t.prototype.keys=function(){var e,n;return OH(this,function(r){switch(r.label){case 0:e=this._keyMap.entries(),n=e.next(),r.label=1;case 1:return n.done===true?[3,3]:[4,[n.value[1],n.value[0]]];case 2:return r.sent(),n=e.next(),[3,1];case 3:return [2]}})},t.prototype.entries=function(){var e,n;return OH(this,function(r){switch(r.label){case 0:e=this._valueMap.entries(),n=e.next(),r.label=1;case 1:return n.done===true?[3,3]:[4,[this._keyMap.get(n.value[0]),n.value[1],n.value[0]]];case 2:return r.sent(),n=e.next(),[3,1];case 3:return [2]}})},Object.defineProperty(t.prototype,"size",{get:function(){return this._valueMap.size},enumerable:false,configurable:true}),t}();var ia=function(t){ffe(e,t);function e(){return t.call(this,KE)||this}return e}(hfe);var gfe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},dT=function(){function t(e,n){this._aggregator=e,this._activeCollectionStorage=new ia,this._cumulativeMemoStorage=new ia,this._overflowAttributes={"otel.metric.overflow":true},this._cardinalityLimit=(n??2e3)-1,this._overflowHashCode=KE(this._overflowAttributes);}return t.prototype.record=function(e,n,r,o){var i=this,a=this._activeCollectionStorage.get(n);if(!a){if(this._activeCollectionStorage.size>=this._cardinalityLimit){var s=this._activeCollectionStorage.getOrDefault(this._overflowAttributes,function(){return i._aggregator.createAccumulation(o)});s?.record(e);return}a=this._aggregator.createAccumulation(o),this._activeCollectionStorage.set(n,a);}a?.record(e);},t.prototype.batchCumulate=function(e,n){var r=this;Array.from(e.entries()).forEach(function(o){var i=gfe(o,3),a=i[0],s=i[1],l=i[2],c=r._aggregator.createAccumulation(n);c?.record(s);var u=c;if(r._cumulativeMemoStorage.has(a,l)){var d=r._cumulativeMemoStorage.get(a,l);u=r._aggregator.diff(d,c);}else if(r._cumulativeMemoStorage.size>=r._cardinalityLimit&&(a=r._overflowAttributes,l=r._overflowHashCode,r._cumulativeMemoStorage.has(a,l))){var d=r._cumulativeMemoStorage.get(a,l);u=r._aggregator.diff(d,c);}if(r._activeCollectionStorage.has(a,l)){var m=r._activeCollectionStorage.get(a,l);u=r._aggregator.merge(m,u);}r._cumulativeMemoStorage.set(a,c,l),r._activeCollectionStorage.set(a,u,l);});},t.prototype.collect=function(){var e=this._activeCollectionStorage;return this._activeCollectionStorage=new ia,e},t}();var iI=function(t){var e=typeof Symbol=="function"&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&typeof t.length=="number")return {next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},DH=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},mT=function(){function t(e,n){var r=this;this._aggregator=e,this._unreportedAccumulations=new Map,this._reportHistory=new Map,n.forEach(function(o){r._unreportedAccumulations.set(o,[]);});}return t.prototype.buildMetrics=function(e,n,r,o){this._stashAccumulations(r);var i=this._getMergedUnreportedAccumulations(e),a=i,s;if(this._reportHistory.has(e)){var l=this._reportHistory.get(e),c=l.collectionTime;s=l.aggregationTemporality,s===Wr.CUMULATIVE?a=t.merge(l.accumulations,i,this._aggregator):a=t.calibrateStartTime(l.accumulations,i,c);}else s=e.selectAggregationTemporality(n.type);this._reportHistory.set(e,{accumulations:a,collectionTime:o,aggregationTemporality:s});var u=bfe(a);if(u.length!==0)return this._aggregator.toMetricData(n,s,u,o)},t.prototype._stashAccumulations=function(e){var n,r,o=this._unreportedAccumulations.keys();try{for(var i=iI(o),a=i.next();!a.done;a=i.next()){var s=a.value,l=this._unreportedAccumulations.get(s);l===void 0&&(l=[],this._unreportedAccumulations.set(s,l)),l.push(e);}}catch(c){n={error:c};}finally{try{a&&!a.done&&(r=i.return)&&r.call(i);}finally{if(n)throw n.error}}},t.prototype._getMergedUnreportedAccumulations=function(e){var n,r,o=new ia,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=iI(i),s=a.next();!s.done;s=a.next()){var l=s.value;o=t.merge(o,l,this._aggregator);}}catch(c){n={error:c};}finally{try{s&&!s.done&&(r=a.return)&&r.call(a);}finally{if(n)throw n.error}}return o},t.merge=function(e,n,r){for(var o=e,i=n.entries(),a=i.next();a.done!==true;){var s=DH(a.value,3),l=s[0],c=s[1],u=s[2];if(e.has(l,u)){var d=e.get(l,u),m=r.merge(d,c);o.set(l,m,u);}else o.set(l,c,u);a=i.next();}return o},t.calibrateStartTime=function(e,n,r){var o,i;try{for(var a=iI(e.keys()),s=a.next();!s.done;s=a.next()){var l=DH(s.value,2),c=l[0],u=l[1],d=n.get(c,u);d?.setStartTime(r);}}catch(m){o={error:m};}finally{try{s&&!s.done&&(i=a.return)&&i.call(a);}finally{if(o)throw o.error}}return n},t}();function bfe(t){return Array.from(t.entries())}var yfe=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),Sfe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},NH=function(t){yfe(e,t);function e(n,r,o,i,a){var s=t.call(this,n)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new dT(r,s._aggregationCardinalityLimit),s._temporalMetricStorage=new mT(r,i),s}return e.prototype.record=function(n,r){var o=this,i=new ia;Array.from(n.entries()).forEach(function(a){var s=Sfe(a,2),l=s[0],c=s[1];i.set(o._attributesProcessor.process(l),c);}),this._deltaMetricStorage.batchCumulate(i,r);},e.prototype.collect=function(n,r){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(n,this._instrumentDescriptor,o,r)},e}(uT);function aI(t,e){var n="";return t.unit!==e.unit&&(n+=" - Unit '"+t.unit+"' does not match '"+e.unit+`'
|
|
170
|
+
`)),i(" ",n(d));}}setMinLevel(e){typeof e=="string"?this.minLogLevel=dh[e]:this.minLogLevel=e;}setOutputStream(e){this.forcedStream=e;}log(...e){this.logWithLevel(30,Qi.reset,...e);}info(...e){this.logWithLevel(30,Qi.white,...e);}debug(...e){this.logWithLevel(20,Qi.dim,...e);}warn(...e){this.logWithLevel(40,Qi.yellow,...e);}error(...e){this.logWithLevel(50,Qi.red,...e);}success(...e){this.logWithLevel(30,Qi.green,...e);}dimmed(...e){this.logWithLevel(30,Qi.dim,...e);}underline(...e){this.logWithLevel(30,Qi.underline,...e);}bold(...e){this.logWithLevel(30,Qi.bold,...e);}grey(...e){this.logWithLevel(30,Qi.grey,...e);}child(e){let n=new t(this.minLogLevel,{...this.logBindings,...e});return n.forcedStream=this.forcedStream,n}async flush(){}bindings(){return this.logBindings}},P=kx._internalSingleton(),tu={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>tu,flush:async()=>{},bindings:()=>({})},OS={},Bx=({logger:t,logKey:e,maxCount:n,intervalMs:r},o,i,...a)=>{let s=OS[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},OS[e]=s),s.totalCount++,s.count<n&&(s.count++,t.debug(o,i,...a)),s.timer=setTimeout(()=>{let l=OS[e];l?.totalCount!==l?.count&&t.debug({logKey:e,totalCount:l?.totalCount,count:l?.count},`Debug logs were rate-limited for ${e}`),delete OS[e];},r);};var eU=1e4,NS=1,Ux=_s.extend({browserType:z.enum(La).optional(),slowMoMs:z.number().optional().refine(t=>t===void 0||t<=eU&&t>=-1,{message:`Slow motion must be between 0 and ${eU} 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(AS).optional(),colorScheme:z.enum(["light","dark"]).optional()});var zx=z.object({useMemory:z.boolean().optional(),failureRecovery:z.boolean().optional().describe("undefined means inherit org settings")}),$x=zx.extend({disableAICaching:z.boolean().optional(),failureRecoveryInstructions:z.string().optional()}),bse=z.object({viewport:Is.optional()}),nu=bse.extend($x.shape).extend(Ux.shape),LS=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()}),kS=z.object({onSuccess:z.boolean().default(false),failureMessage:z.string().optional(),onFailure:z.boolean().default(true),successMessage:z.string().optional()}),yse=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")}),tU=yse.array(),Sse=z.object({name:z.string(),value:z.string()}),FS=Sse.array(),nU=z.object({name:z.string(),default:z.boolean().optional(),fixtures:FB.array().optional()});var Fa=zx.extend({agentConfig:z.record(z.string(),z.string()).optional(),aiFailureAnalysis:z.boolean().optional(),classification:rB.optional(),triage:nB.optional(),healing:tB.optional(),explore:JB.optional(),select:YB.optional()}),Ese=z.object({cliOnly:z.boolean().optional(),neverShowUsageBanner:z.boolean().optional(),hideInternalTraceInfo:z.boolean().optional(),bypassUsageLimits:z.boolean().optional()}),Vx=z.object({fakerConstantSeed:z.boolean().optional(),isolateCachesByEnvironment:z.boolean().optional()}),Tse=z.enum(["flaky_tests","low_test_coverage","frequent_bugs","fix_flaky_tests","migrate_tests","increase_test_coverage","catch_more_bugs"]),vse=z.enum(["ios","android","web"]),Cse=z.enum(["selenium","playwright","cypress","puppeteer","maestro","appium","detox","manual_qa","nothing_yet","other"]),wse=z.enum(["advertisement","ai_search","google_search","hacker_news","linkedin","reddit","referral_from_customer","twitter_x","word_of_mouth","youtube","other"]),Ase=z.object({helpIntents:z.array(Tse).optional(),helpIntentOtherText:z.string().optional(),deviceTypeIntent:vse.optional(),currentTestingTool:Cse.optional(),heardAboutSource:wse.optional()}),Rse=z.object({discovery:Ase.optional(),needsToCompleteOnboarding:z.boolean().optional(),wizardCompletedAt:z.iso.datetime().optional()}),BS=z.object({ai:Fa.optional(),githubAppInstallationId:z.number().nullish(),githubAppSummaryMessageEnabled:z.boolean().nullish(),githubReleaseAppInstallationId:z.number().nullish(),gitlabAppAccessToken:z.string().nullish(),gitlabAppBaseUrl:z.string().nullish(),browser:Px.optional(),internal:Ese.optional(),advanced:Vx.optional(),onboarding:Rse.optional()});function rU(t){try{return BS.parse(t)}catch{return P.warn("Cloud settings contain values this version of the CLI does not support. Please upgrade. Falling back to defaults."),BS.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 iU=(n=>(n.CANNOT_FIX_TEST="CANNOT_FIX_TEST",n.FIXED="FIXED",n))(iU||{}),oU=z.object({index:z.int().nonnegative(),section:vx,step:Na}),xse=z.object({additions:oU.array(),deletions:oU.array()}),Mse=z.object({subAgentStatus:z.enum(iU).default("CANNOT_FIX_TEST"),rootCause:z.string(),solution:z.string(),verificationNotes:z.string().optional().default(""),diffs:xse.optional(),pullRequestUrl:z.string().optional(),branchUrl:z.string().optional()}),aU=Mse.optional().catch(void 0);var qo={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},en=(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))(en||{});var jx=(o=>(o.NOT_ATTEMPTED="NOT_ATTEMPTED",o.PERM_HEAL_SUCCEEDED="PERM_HEAL_SUCCEEDED",o.PERM_HEAL_FAILED="PERM_HEAL_FAILED",o.PERM_HEAL_ON_SUCCESS_FAILED="PERM_HEAL_ON_SUCCESS_FAILED",o))(jx||{});var Hx=z.enum(jx).default("NOT_ATTEMPTED"),US=(n=>(n.BEFORE_ALL="BEFORE_ALL",n.AFTER_ALL="AFTER_ALL",n))(US||{});var Pse=z.object({attempts:z.int().nonnegative()}),Tn=z.string().pipe(z.coerce.date()).or(z.date()),Os=z.object({id:z.string(),runKey:z.string(),organizationId:z.string(),executionType:$d.optional().default("WEB"),createdAt:Tn,createdBy:z.string(),flake:z.boolean().nullish(),scheduledAt:Tn.or(z.null()),startedAt:Tn.or(z.null()),updatedAt:Tn.nullish(),finishedAt:Tn.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:Tn.nullish(),gitCommitMessage:z.string().nullish(),schemaVersion:z.string().nullish(),cliVersion:z.string().nullish(),section:z.enum(US).nullish(),status:z.enum(en),healStatus:Hx,healDetails:aU.nullish(),trigger:z.enum(qo),attempts:z.number(),runAttempts:z.array(z.object({id:z.string(),status:z.enum(en),startedAt:Tn.or(z.null()),finishedAt:Tn.or(z.null())})).optional(),videos:z.array(z.string()).optional(),failureReason:z.string().nullish(),failureDetails:iB.nullish(),failureRecoveryDetails:Pse.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:Fa.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()}),Ise={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},zS=Os.pick({...Ise,test:true}),Wx=Os.omit({failureReason:true,failureDetails:true,test:true}),Gx=Os.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:nu.nullish()}).nullish()}).extend(Dx.shape);var sU=z.enum(["error","warning","passing"]);var lU=z.enum(["safe_to_merge","confirm_intended_change","investigate_regression","fix_test","resolve_infra","review_coverage"]);var cU=z.object({kind:lU,detail:z.string().min(1).max(280)}),ru=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:cU.optional()});ru.extend({riskLevel:sU.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:cU.extend({kind:lU.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 uU=z.object({id:z.string(),status:z.enum(en),trigger:z.enum(qo),createdAt:Tn,startedAt:Tn.nullish(),finishedAt:Tn.nullish(),gitCommitSha:z.string().nullish(),gitCommitShaShort:z.string().nullish(),gitCommitTimestamp:Tn.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:ru.optional(),localSuiteName:z.string().optional(),suite:z.object({id:z.string(),name:z.string()}).nullish(),runs:z.object({status:z.enum(en),environmentName:z.string().nullish()}).array()}),dU=uU.pick({id:true,createdAt:true,startedAt:true,finishedAt:true,status:true,trigger:true,suite:true,localSuiteName:true}).extend({runs:zS.array()}),mU=uU.extend({runs:Os.array()});var Ose=z.object({id:z.string(),name:z.string()});Ose.extend(z.object({createdAt:Tn,createdBy:z.string(),schedule:LS,notification:kS,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 pU=z.object({id:z.guid(),orgId:z.string(),createdAt:Tn,startedAt:Tn.or(z.null()),finishedAt:Tn.or(z.null()),status:z.enum(en),trigger:z.enum(qo),suite:z.object({id:z.string(),name:z.string()}).nullish(),runs:Os.array()});pU.pick({id:true,createdAt:true,startedAt:true,finishedAt:true,status:true,trigger:true,suite:true});var fU=pU.extend({runs:zS.array()});function hU({beforeStatus:t,mainStatus:e,afterStatus:n}){return t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":n==="FAILED"?"FAILED":n==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}function gU(t,e){return t.some(o=>e?.onlyQuarantined?o.status==="FAILED":!o.quarantined&&o.status==="FAILED")?"FAILED":t.some(o=>o.status==="CANCELLED")?"CANCELLED":"PASSED"}function mh(t){switch(t){case "SUCCESS":return "PASSED";case "FAILED":return "FAILED";case "CANCELLED":return "CANCELLED";case "RUNNING":return "RUNNING";case "IDLE":return "PENDING"}}function bU(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 qx=z.object({content:z.string(),ids:z.string().array(),tokenLength:z.number()}),Dse=z.object({chunks:qx.array()});z.object({ids:z.string().array(),score:z.number(),tokenLength:z.number()});Dse.extend({description:z.string().describe("Input to pass to RAG engine"),tokenLimit:z.number()});var yU=z.object({ids:z.number().array()}),SU=z.object({indices:z.number().array()});var ur=z.object({disableCache:z.boolean().optional(),useMemory:z.boolean().optional(),clientMode:z.enum(["interactive","runner"]).optional(),loggerTags:z.record(z.string(),z.string()).optional(),langfuseSessionId:z.string().optional(),agentConfigVersion:z.string().optional(),cacheBustReason:z.enum(Kc).optional()});ur.extend({chunks:qx.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 Nse=z.object({screenshotBase64AfterCommand:z.string(),urlAfterCommand:z.string(),serializedCommand:z.string(),elementInteracted:z.string().optional(),thoughts:z.string().optional()}),EU=z.object({goal:z.string(),browserState:z.string(),screenshot:z.string(),source:IB.optional().catch(void 0),isTieBreakerCall:z.boolean().optional(),memory:z.discriminatedUnion("type",[Xi,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional(),firstPassModelResults:CS.array().optional(),knowledgeBaseSection:z.string().optional()}),TU=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()}),vU=z.object({goal:z.string(),browserState:z.string(),screenshot:z.string().optional(),returnSchema:z.string().optional()}),CU=z.object({goal:z.string(),emulatorState:z.string(),screenshot:z.string().optional(),returnSchema:z.string().optional()}),Kx=z.union([z.literal("NEGATED_CHECK"),z.literal("CONDITIONAL_CHECK")]),wU=z.object({goal:z.string(),browserState:z.string(),screenshot:z.string(),url:z.string(),contextChoice:sx.optional(),memory:z.discriminatedUnion("type",[qc,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional(),source:Kx.optional(),recoveryHint:z.string().optional(),knowledgeBaseSection:z.string().optional()}),AU=z.object({command:Id}),Yx=z.object({goal:z.string(),browserState:z.string(),startingScreenshot:z.string().optional(),screenshot:z.string(),url:z.string(),history:Nse.array(),actionHint:z.string().optional(),lastError:z.string().optional()}),RU=z.object({results:xS.array(),errorMessage:z.string(),errorStack:z.string().optional()}),xU=z.object({results:xS.array(),goal:z.string(),errorMessage:z.string()}),MU=z.object({failedResults:xS.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 PU=z.object({type:z.string(),browserContext:z.string(),currentStep:z.string(),screenshot:z.string()}),IU=z.object({description:z.string(),browserState:z.string().optional(),screenshot:z.string()}),Lse=z.enum(["locator","assertion"]);z.object({completionType:Lse,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 _U=z.object({keywords:z.array(z.string())});var $S=(i=>(i.LOCATOR="locator",i.ASSERTION="assertion",i.VISUAL_ASSERTION="visual-assertion",i.TEXT_EXTRACTION="text-extraction",i.FAILURE_RECOVERY="failure-recovery",i))($S||{}),kse=["locator","assertion","visual-assertion","text-extraction","failure-recovery"];z.enum($S);var Fse=new Set(kse);function Bse(t){return Fse.has(t)}var Use=z.enum(["v1","v2","v3","v4"]),zse=z.string().regex(/^v\d+\.\d+$/).describe("pinned sub-version like v3.1");z.union([Use,zse,z.string().describe("for people with special configurations")]);var jd={locator:"v4",assertion:"v4","visual-assertion":"v4","text-extraction":"v3","failure-recovery":"v2"};var $se={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"]}},xl=(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))(xl||{});z.enum(xl);function OU(t){for(let[e,n]of Object.entries(t)){if(!Bse(e))continue;let r=$se[e];if(!r)continue;let o=new Set;for(let[i,a]of Object.entries(r)){o.add(i);for(let s of a)o.add(s);}if(!o.has(n)){let i=[...o].sort();throw new M("UserConfigurationError",`Invalid agent config: "${n}" is not a valid version for "${e}". Valid versions: ${i.join(", ")}`)}}}var Ds=v__default.object({id:v__default.guid(),envKey:v__default.string().optional(),skipped:v__default.boolean().optional(),retries:v__default.number().optional()});var xn=(o=>(o.PRESET="MOBILE_PRESET_STEP",o.MODULE="MOBILE_MODULE_STEP",o.AI_ACTION="MOBILE_AI_ACTION_STEP",o.CONDITIONAL="MOBILE_CONDITIONAL_STEP",o))(xn||{});var Hd=Ds.extend({type:v__default.literal("MOBILE_CONDITIONAL_STEP")});var Ua=z.object({id:z.string(),name:Jc,baseUrl:bS,description:z.string().optional().nullish(),schemaVersion:z.string(),advanced:nu,retries:z.number().optional().nullish(),envs:z.array(nU).nullish(),parameters:tU.nullish(),disabled:z.boolean().optional(),labels:z.array(z.string()).optional().catch([])}),DU=z.enum(["INHERIT","ENABLED","DISABLED"]);var jse=nu.extend({failureRecovery:DU.optional(),useMemory:DU.optional()});Ua.pick({name:true,description:true,baseUrl:true,retries:true,disabled:true,parameters:true}).extend({advanced:jse});Ua.pick({name:true,description:true,baseUrl:true,retries:true,disabled:true,advanced:true,parameters:true});var Hse=z.object({labels:z.array(z.string()).optional(),outputs:FS.nullish()}),hh=Ua.extend(Hse.shape),Wse=z.object({createdAt:z.coerce.date(),updatedAt:z.coerce.date(),updatedBy:z.string().nullable(),schedule:LS,notification:kS,createdBy:z.string(),organizationId:z.string(),folderId:z.string().nullable().optional()}),Gse=Ua.extend(Wse.shape);Gse.extend(Ld.shape);var Xx=Ua.extend(Ld.shape);Ua.extend(Xc.shape);var qse="test",Kse="module",Yse="mobile-test",Xse="mobile-module",Jse="test/v2",Zse="module/v2",Qse="mobile-test/v2",ele="mobile-module/v2";var ve=(l=>(l.TEST=`momentic/${qse}`,l.MODULE=`momentic/${Kse}`,l.TEST_V2=`momentic/${Jse}`,l.MODULE_V2=`momentic/${Zse}`,l.MOBILE_TEST=`momentic/${Yse}`,l.MOBILE_MODULE=`momentic/${Xse}`,l.MOBILE_TEST_V2=`momentic/${Qse}`,l.MOBILE_MODULE_V2=`momentic/${ele}`,l))(ve||{});Ua.merge(Xc);var tle=Da.extend({steps:z.array(z.record(z.string(),z.unknown().optional())),schemaVersion:z.string()});tle.extend({fileType:z.literal(ve.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 Wd(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(Wd);let e={};for(let[n,r]of Object.entries(t))e[n]=Wd(r);return e}var nle=/^[a-z0-9]+(?:-[a-z0-9]+){2,}$/,NU=36,Un=z.union([z.guid().max(NU,"V2 IDs must be 36 characters or fewer"),z.string().max(NU,"V2 IDs must be 36 characters or fewer").regex(nle,"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||{}),gh=v.discriminatedUnion("type",[v.object({type:v.literal("SCREEN")}),v.object({type:v.literal("OPEN_APP")}),v.object({type:v.literal("OPEN_WEBVIEW")})]),Ns=v.object({type:v.literal("description"),description:v.string()}),Zx=v.object({type:v.literal("CUSTOM_COORDINATES"),startX:v.number().describe("Starting X coordinate in pixels"),startY:v.number().describe("Starting Y coordinate in pixels"),deltaPixels:v.number().describe("Number of pixels to scroll in the specified direction")}),VS=v.discriminatedUnion("type",[...gh.options,v.object({type:v.literal("CUSTOM"),target:Ns}),Zx]);function rle(t){return t.toLowerCase().replaceAll("_"," ")}function Ls(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 rle(t.type);default:{throw new Error("Unreachable")}}}var ole=v.object({type:v.literal("coordinates"),xPercent:v.number(),yPercent:v.number()}),ile=v.object({type:v.literal("absolute_percent"),x:v.number(),y:v.number()}),Gd=v.discriminatedUnion("type",[Ns,ole,ile]);var ale=v.object({x1:v.number(),y1:v.number(),x2:v.number(),y2:v.number(),tolerance:v.nativeEnum(Ro),preciseTolerance:v.boolean().optional()}),sle=v.object({width:v.number(),height:v.number(),tolerance:v.nativeEnum(Ro),preciseTolerance:v.boolean().optional()}),Qx=v.object({requiredText:v.string().optional(),requiredAttributes:v.record(v.string(),v.string()).optional(),requiredBounds:v.boolean().optional(),position:ale.optional(),shape:sle.optional()}),LU=v.object({xPath:v.string(),requirements:Qx.optional()}),lle=v.object({type:v.literal("CUSTOM"),target:Ns,cache:v.lazy(()=>kU).optional()}),cle=v.object({pixelDelta:v.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:v.union([gh,lle,Zx]),direction:v.enum(["up","down"])}),kU=v.object({type:v.literal("NATIVE"),bounds:v.number().array().optional(),resolvedDescription:v.string().optional(),xPath:v.string().optional(),elementOnlySerializedXml:v.string().optional(),scrollDetails:cle.optional(),requirements:Qx.optional(),requiredRelatedElements:LU.array().optional(),memory:Xi.optional()}),ule=v.object({type:v.literal("WEBVIEW"),resolvedDescription:v.string().optional(),xPath:v.string().optional(),browserCache:Aa.optional(),memory:Xi.optional()}),qd=v.union([kU,ule]);var dle=v.object({left:v.number(),top:v.number(),right:v.number(),bottom:v.number()});v.object({newViewportBounds:dle});var mle=v.object({type:v.literal("CUSTOM"),target:Ns,cache:v.lazy(()=>UU).optional()}),FU=v.object({pixelDelta:v.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:v.union([gh,mle,Zx]),direction:v.enum(["up","down"])}),eM=(n=>(n.Native="native",n.Appium="appium",n))(eM||{}),tM=v.tuple([v.number(),v.number(),v.number(),v.number()]),BU=LU.extend({bounds:tM.optional(),browserCache:Aa.optional()}),UU=v.object({type:v.literal("NATIVE"),bounds:tM.optional(),resolvedDescription:v.string().optional(),sourceTree:v.nativeEnum(eM).optional(),xPath:v.string().optional(),elementOnlySerializedXml:v.string().optional(),scrollDetails:FU.optional(),requirements:Qx.optional(),requiredRelatedElements:BU.array().optional(),memory:Xi.optional()}),ple=v.object({type:v.literal("WEBVIEW"),bounds:tM.optional(),resolvedDescription:v.string().optional(),xPath:v.string().optional(),scrollDetails:FU.optional(),browserCache:Aa.optional(),requiredRelatedElements:BU.array().optional(),memory:Xi.optional()}),Kd=v.discriminatedUnion("type",[UU,ple]);var Ze=(A=>(A.AI_CHECK="AI_CHECK",A.AI_EXTRACT="AI_EXTRACT",A.TAP="TAP",A.TYPE="TYPE",A.PRESS="PRESS",A.PRESS_KEYBOARD="PRESS_KEYBOARD",A.OPEN_APP="OPEN_APP",A.KILL_APP="KILL_APP",A.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",A.SWIPE="SWIPE",A.SCROLL_TO="SCROLL_TO",A.SCREEN_CHECK="SCREEN_CHECK",A.ELEMENT_CHECK="ELEMENT_CHECK",A.DRAG_AND_DROP="DRAG_AND_DROP",A.JAVASCRIPT="JAVASCRIPT",A.REQUEST="REQUEST",A.WAIT="WAIT",A.ADD_FILE="ADD_FILE",A.INSTALL_APP="INSTALL_APP",A.UNINSTALL_APP="UNINSTALL_APP",A.TOGGLE_SETTINGS="TOGGLE_SETTINGS",A.ROTATE_ORIENTATION="ROTATE_ORIENTATION",A.ADB_COMMAND="ADB_COMMAND",A.APPIUM_EXECUTE="APPIUM_EXECUTE",A.STATE="STATE",A))(Ze||{}),ke=v__default.object({id:v__default.guid(),disableCache:v__default.boolean().optional()}),Yd=v__default.object({updatedAt:v__default.coerce.date().optional(),updatedAtLoggerTags:v__default.record(v__default.string(),v__default.string()).optional()}),Ko=Yd.extend({target:qd}),bh=Yd.extend({fromTarget:qd,toTarget:qd}),Ci=Yd.extend({target:Kd}),nM=Yd.extend({fromTarget:Kd,toTarget:Kd}),ta=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 zU=ke.extend({type:v__default.literal("ADB_COMMAND"),command:v__default.string(),jsonArgs:v__default.string().optional()});var fle=v__default.string().trim(),VU=ke.extend({type:v__default.literal("INSTALL_APP"),uri:fle});var jU=ke.extend({type:v__default.literal("OPEN_NOTIFICATION_DRAWER")});var za=(o=>(o.AIRPLANE_MODE="AIRPLANE_MODE",o.DATA="DATA",o.WIFI="WIFI",o.LOCATION="LOCATION",o))(za||{}),oM=ke.extend({type:v__default.literal("TOGGLE_SETTINGS"),settingsType:v__default.nativeEnum(za)});var GU=ke.extend({type:v__default.literal("UNINSTALL_APP"),packageName:v__default.string()});var jS=ke.extend({type:v__default.literal("APPIUM_EXECUTE"),command:v__default.string(),jsonArgs:v__default.string().optional()});var qU=ke.extend({type:v__default.literal("ADD_FILE"),file:v__default.string(),storageLocation:v__default.string()});var ks=ke.extend({type:v__default.literal("AI_CHECK"),assertion:v__default.string(),timeoutSecs:v__default.number().optional(),cache:Yd.extend({memory:qc.optional()}).optional()});var KU=ke.extend({type:v__default.literal("AI_EXTRACT"),goal:v__default.string(),schema:v__default.string().optional()});var Xd=ke.extend({type:v__default.literal("JAVASCRIPT"),code:v__default.string(),timeout:v__default.number().int().max(600).optional().describe("Max seconds for the code to complete")});var YU=ke.extend({type:v__default.literal("KILL_APP")});var Hr=(n=>(n.HOME="HOME",n.POWER="POWER",n))(Hr||{}),na=(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))(na||{}),Sh=ke.extend({type:v__default.literal("PRESS"),key:v__default.nativeEnum(Hr),longPress:v__default.boolean().optional()}),uM=Sh.extend({key:v__default.nativeEnum(na).or(v__default.nativeEnum(Hr))}),dM=Sh;var XU=ke.extend({type:v__default.literal("REQUEST")}).merge(Ff);var Fs=(n=>(n.PORTRAIT="PORTRAIT",n.LANDSCAPE="LANDSCAPE",n))(Fs||{}),mM=ke.extend({type:v__default.literal("ROTATE_ORIENTATION"),orientation:v__default.nativeEnum(Fs)});var yle=v__default.object({type:v__default.literal("CONTENT"),negated:v__default.boolean().optional(),value:v__default.string()}),Zd=ke.extend({type:v__default.literal("SCREEN_CHECK"),assertion:yle,timeout:v__default.number().int().min(0).max(Md).optional().describe("max seconds to wait for the assertion to be true")});var ZU=ke.extend({type:v__default.literal("STATE")});var ez=ke.extend({type:v__default.literal("WAIT"),timeoutSecs:v__default.number()});var Eh=v__default.discriminatedUnion("type",[ZU,ks,KU,Xd,ez,XU,mM,Zd,qU,YU]);v__default.discriminatedUnion("type",[...Eh.options,Sh]);var fM=ke.extend({type:v__default.literal("DRAG_AND_DROP"),fromTarget:Ns,toTarget:Ns,hoverDuration:v__default.number().optional(),dragDuration:v__default.number().optional()}),Th=fM.extend({cache:bh.optional()}),vh=fM.extend({cache:nM.optional()});var hM=ke.extend({type:v__default.literal("ELEMENT_CHECK"),target:Gd,assertion:Hy,timeout:v__default.number().int().min(0).max(Md).optional().describe("max seconds to wait for the assertion to be true")}),ou=hM.extend({cache:Ko.optional()}),iu=hM.extend({cache:Ci.optional()});var po=(n=>(n.ENTER="ENTER",n.BACKSPACE="BACKSPACE",n))(po||{}),Bs=(e=>(e.CLOSE_KEYBOARD="CLOSE_KEYBOARD",e))(Bs||{}),gM=ke.extend({type:v__default.literal("PRESS_KEYBOARD"),key:v__default.nativeEnum(po)}),bM=ke.extend({type:v__default.literal("PRESS_KEYBOARD"),key:v__default.nativeEnum(Bs).or(v__default.nativeEnum(po))});var rz=ke.extend({type:v__default.literal("OPEN_APP"),packageName:v__default.string(),activityName:v__default.string().optional(),intentExtras:v__default.string().optional()}),oz=ke.extend({type:v__default.literal("OPEN_APP"),packageName:v__default.string(),intentExtras:v__default.string().optional()});var yM=ke.extend({type:v__default.literal("SCROLL_TO"),target:Ns,direction:v__default.enum(["down","up"]),scrollableElement:VS,scrollStepPercent:v__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:v__default.number().int().min(1).max(50).optional().describe("Maximum number of scroll attempts before giving up. Default is 20.")}),wh=yM.extend({cache:Ko.optional()}),Ah=yM.extend({cache:Ci.optional()});var SM=ke.extend({type:v__default.literal("SWIPE"),direction:v__default.enum(["up","down","left","right"]),scrollableElement:VS,viewportPercent:v__default.number().optional(),durationMs:v__default.number().optional(),relativePosition:Rd.optional()}),Rh=SM.extend({cache:Ko.optional()}),xh=SM.extend({cache:Ci.optional()});var EM=ke.extend({type:v__default.literal("TAP"),target:Gd,longPress:v__default.boolean().optional(),longPressDurationMs:v__default.number().optional(),iterations:v__default.number().optional(),tapDelayMs:v__default.number().optional(),relativePosition:Rd.optional(),doubleTap:v__default.boolean().optional(),doubleTapDelayMs:v__default.number().optional()}),Mh=EM.extend({cache:Ko.optional()}),Ph=EM.extend({cache:Ci.optional()});var TM=ke.extend({type:v__default.literal("TYPE"),target:Gd.optional(),keyPressDelayMs:v__default.number().optional(),text:v__default.string(),clearContent:v__default.boolean().optional(),forceClearContent:v__default.boolean().optional()});var _h=TM.extend({cache:Ko.optional()}),Oh=TM.extend({cache:Ci.optional()});var lu=v__default.discriminatedUnion("type",[...Eh.options,Mh,_h,uM,bM,GU,VU,zU,jS,Th,jU,wh,Rh,oM,ou,rz]);var cu=v__default.discriminatedUnion("type",[...Eh.options,Ph,Oh,dM,gM,oz,xh,vh,Ah,iu,jS]);var GS={ANDROID:t=>lu.parse(t),IOS:t=>cu.parse(t)};var qS=v__default.union([v__default.string(),v__default.record(v__default.string(),v__default.unknown().optional())]),KS=Ds.extend({type:v__default.literal("MOBILE_PRESET_STEP"),keyPressDelayMs:v__default.number().optional()}),Pl=KS.extend({command:lu}),Il=KS.extend({command:cu}),em=v__default.object({moduleId:v__default.string(),inputs:v__default.record(v__default.string(),v__default.string()).optional()}),uu=Ds.merge(em.extend({type:v__default.literal("MOBILE_MODULE_STEP")}));em.extend({steps:v__default.lazy(()=>$a.array())});em.extend({steps:v__default.lazy(()=>Us.array())});var _l=(n=>(n.V2="2",n.V3="3",n))(_l||{});var vM=v__default.nativeEnum(_l),vle=Ca.extend({platform:v__default.literal("ANDROID"),resolvedGoal:v__default.string(),steps:v__default.lazy(()=>Pl.array()),autoGeneratedPostcondition:v__default.string().optional()}),Cle=Ca.extend({platform:v__default.literal("IOS"),resolvedGoal:v__default.string(),steps:v__default.lazy(()=>Il.array()),autoGeneratedPostcondition:v__default.string().optional()}),Dh=v__default.discriminatedUnion("platform",[vle,Cle]),Nh={ANDROID:t=>t.platform==="ANDROID"?t.steps:[],IOS:t=>t.platform==="IOS"?t.steps:[]},Ol=Ds.extend({type:v__default.literal("MOBILE_AI_ACTION_STEP"),text:v__default.string(),version:vM.optional(),cache:Dh.optional(),precondition:v__default.string().optional(),postcondition:v__default.string().optional()});function sz(t,e){let n={id:v4$1(),type:"AI_CHECK",assertion:e,timeoutSecs:5};return {id:v4$1(),type:"MOBILE_PRESET_STEP",command:GS[t](n)}}function YS(t){let e=t.postcondition?.trim();return e||t.cache?.autoGeneratedPostcondition?.trim()||void 0}function Lh({platform:t,step:e}){let n=YS(e);return {preconditionStep:e.precondition?.trim()?sz(t,e.precondition):void 0,generatedSteps:e.cache?Nh[t](e.cache):[],postconditionStep:n?sz(t,n):void 0}}var wle=v__default.discriminatedUnion("type",[ks,Zd,ou,Xd]),CM=KS.extend({command:wle}),Ale=v__default.discriminatedUnion("type",[ks,Zd,iu,Xd]),wM=KS.extend({command:Ale}),Rle=v__default.object({assertion:CM,steps:v__default.lazy(()=>$a.array())}),xle=v__default.object({assertion:wM,steps:v__default.lazy(()=>Us.array())}),Mle=Hd.extend({blocks:v__default.lazy(()=>Rle.array()),elseSteps:v__default.lazy(()=>$a.array()).optional()}),Ple=Hd.extend({blocks:v__default.lazy(()=>xle.array()),elseSteps:v__default.lazy(()=>Us.array()).optional()}),$a=v__default.discriminatedUnion("type",[Pl,uu,Ol,Mle]),Us=v__default.discriminatedUnion("type",[Il,uu,Ol,Ple]),tm=v__default.union([$a.array(),Us.array()]),Ile={ANDROID:$a,IOS:Us};function ra(t){return Ile[t]}var kh=v__default.object({parameterNames:v__default.string().array(),defaultParameters:v__default.record(v__default.string(),v__default.string()).optional(),parameterEnums:v__default.record(v__default.string(),v__default.string().array()).optional()}),nm=v__default.object({moduleId:Un,name:v__default.string(),description:v__default.string().nullish(),platform:v__default.nativeEnum(Je).optional().default("ANDROID"),parameters:kh.optional(),enabled:v__default.boolean().nullish(),schemaVersion:v__default.string()}),Va=nm.omit({name:true}),AM=Va.extend({steps:qS.array()}),RM=v__default.object({fileType:v__default.literal(ve.MOBILE_MODULE)}).merge(AM),lz=nm.omit({platform:true,schemaVersion:true}),_le={ANDROID:lz.extend({platform:v__default.literal("ANDROID"),steps:$a.array()}),IOS:lz.extend({platform:v__default.literal("IOS"),steps:Us.array()})};function cz(t){return _le[t]}var wi=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(wi||{}),uz=v__default.object({description:v__default.string().optional(),name:v__default.string().describe("name of the module"),parameters:kh.optional()}),XS=em.merge(uz).extend({platform:v__default.literal("ANDROID"),get steps(){return Kn.array()}}),JS=em.merge(uz).extend({platform:v__default.literal("IOS"),get steps(){return Yn.array()}});v__default.discriminatedUnion("platform",[XS,JS]);var xM=Ds.merge(XS).extend({type:v__default.literal("RESOLVED_MOBILE_MODULE")}),MM=Ds.merge(JS).extend({type:v__default.literal("RESOLVED_MOBILE_MODULE")}),dz={ANDROID:xM,IOS:MM};v__default.discriminatedUnion("platform",[xM,MM]);var Ole=v__default.object({assertion:CM,get steps(){return Kn.array()}}),PM=Hd.extend({get blocks(){return Ole.array()},get elseSteps(){return Kn.array().optional()}}),Dle=v__default.object({assertion:wM,get steps(){return Yn.array()}}),IM=Hd.extend({get blocks(){return Dle.array()},get elseSteps(){return Yn.array().optional()}}),Kn=v__default.discriminatedUnion("type",[xM,Pl,Ol,PM]),Yn=v__default.discriminatedUnion("type",[MM,Il,Ol,IM]);function mz(t){return Object.values(wi).includes(t)||Object.values(xn).includes(t)}var _M=(i=>(i.PRECONDITION="PRECONDITION",i.REPLAY="REPLAY",i.GENERATE="GENERATE",i.AUTOHEAL="AUTOHEAL",i.POSTCONDITION="POSTCONDITION",i))(_M||{}),pz=z.enum(["pending","running","success","failed"]),fz=z.object({type:z.literal("THOUGHT"),text:z.string(),blockId:z.string().optional()}),hz=z.object({type:z.literal("TOOL_CALL"),toolName:z.string()}),gz=z.object({type:z.literal("PHASE"),phase:z.nativeEnum(_M),failureMessage:z.string().optional()}),Nle=z.object({type:z.literal("STEP_UPDATE"),stepIndex:z.number(),step:Kn,status:pz,message:z.string().optional(),afterSnapshotId:z.string().optional()}),Lle=z.object({type:z.literal("STEP_UPDATE"),stepIndex:z.number(),step:Yn,status:pz,message:z.string().optional(),afterSnapshotId:z.string().optional()}),bz=z.object({type:z.literal("POSTCONDITION_AUTOGENERATED"),postcondition:z.string()}),kle=z.object({type:z.literal("CACHED_STEPS_GENERATED"),cachedSteps:Pl.array(),resolvedGoal:z.string()}),Fle=z.object({type:z.literal("CACHED_STEPS_GENERATED"),cachedSteps:Il.array(),resolvedGoal:z.string()}),yz=z.discriminatedUnion("type",[fz,hz,gz,Nle,kle,bz]),Sz=z.discriminatedUnion("type",[fz,hz,gz,Lle,Fle,bz]);var ja=v__default.object({message:v__default.string().optional(),startTime:v__default.number(),endTime:v__default.number(),status:v__default.nativeEnum(rn),trace:v__default.unknown().optional().optional(),beforeSnapshot:v__default.string().optional(),afterSnapshot:v__default.string().optional(),data:v__default.unknown().optional().optional().describe("output data from the step"),aiSuggested:v__default.boolean().optional(),beforeTestContext:zd.optional(),afterTestContext:zd.optional()}),Ez=ja.merge(Pl).extend({previousAttempts:v__default.lazy(()=>Mo.array()).optional()}),Ble=ja.merge(uu).extend({steps:v__default.lazy(()=>Mo.array()),name:v__default.string().optional(),previousAttempts:v__default.lazy(()=>Mo.array()).optional()}),Ule=ja.merge(Ol).extend({steps:v__default.lazy(()=>Mo.array()),previousAttempts:v__default.lazy(()=>Mo.array()).optional(),failureRecoveryReason:v__default.string().optional(),trajectory:yz.array().optional()}),zle=ja.merge(PM).extend({assertionResult:Ez.optional(),steps:v__default.lazy(()=>Mo.array()),previousAttempts:v__default.lazy(()=>Mo.array()).optional()}),Mo=v__default.discriminatedUnion("type",[Ez,Ble,Ule,zle]),Tz=ja.merge(Il).extend({previousAttempts:v__default.lazy(()=>Po.array()).optional()}),$le=ja.merge(uu).extend({steps:v__default.lazy(()=>Po.array()),name:v__default.string().optional(),previousAttempts:v__default.lazy(()=>Po.array()).optional()}),Vle=ja.merge(Ol).extend({steps:v__default.lazy(()=>Po.array()),previousAttempts:v__default.lazy(()=>Po.array()).optional(),failureRecoveryReason:v__default.string().optional(),trajectory:Sz.array().optional()}),jle=ja.merge(IM).extend({assertionResult:Tz.optional(),steps:v__default.lazy(()=>Po.array()),previousAttempts:v__default.lazy(()=>Po.array()).optional()}),Po=v__default.discriminatedUnion("type",[Tz,$le,Vle,jle]);var Hle=ja.extend({index:v__default.number().optional(),userFacingStepReference:v__default.string().optional(),description:v__default.string()}),vz=Hle.extend({beforeScreenshot:v__default.string().optional(),afterScreenshot:v__default.string().optional()});var Cz=z.object({attributesRequired:z.array(z.string()).optional(),textRequired:z.boolean().optional(),boundsRequired:z.boolean().optional(),positionSpecificity:z.enum(Ro).optional(),shapeSpecificity:z.enum(Ro).optional()}),Wle=z.object({id:z.number(),requirements:Cz}).array(),OM=z.object({thoughts:z.string(),id:z.number(),updatedMemory:Df.optional(),inWebview:z.boolean().optional(),requirements:Cz.optional(),additionalElements:Wle.optional()}),Gle=z.literal("SCROLL_TO"),wz=z.object({description:z.string(),screenXml:z.string(),screenshot:z.string(),source:Gle.optional(),memory:z.discriminatedUnion("type",[Xi,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional()}),Az=z.object({assertion:z.string(),screenXml:z.string(),screenshot:z.string(),memory:z.discriminatedUnion("type",[qc,z.object({type:z.literal("RESOLVED_TRACES"),traces:z.unknown().optional().array()})]).optional()}),DM=z.object({thoughts:z.string(),result:z.boolean(),relevantElements:z.array(z.number()).optional(),updatedMemory:Nf.optional()}),Rz=z.object({failedResults:vz.array(),nextStepsSerialized:z.string().array(),currentScreenXml:z.string(),currentScreenshot:z.string(),customInstructions:z.string().optional(),testDescription:z.string()}),ZS=(r=>(r.LEGITIMATE="LEGITIMATE",r.RECOVERABLE="RECOVERABLE",r.INELIGIBLE="INELIGIBLE",r))(ZS||{}),NM=z.object({thoughts:z.string(),scenario:z.enum(ZS),instructions:z.string().nullish(),reasonSummary:z.string().nullish()});z.looseObject({type:z.literal("response.create")});var xz=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 Ai(t){switch(t){case "ANDROID":return "android";case "IOS":return "ios"}}var Dl=(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))(Dl||{}),qle=3;function Kle(t){return t==="MODULE"||t==="CONDITIONAL"||t==="SECTION"||t==="RESOLVED_MODULE"}function Mz(t){if(!Kle(t))switch(t){case "PRESET_ACTION":return 0;case "AI_ACTION":return 3;case "AI_ACTION_DYNAMIC":return 5;default:(n=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})();}}function Pz(t){switch(t.type){case "AI_EXTRACT":case "AI_ASSERTION":return qle;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:(n=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})();}}var LM=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 QS(t,e){let n=[],r=splitCookiesString(t);for(let o of r){let i=parseString(o,{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=LM.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});n.push(s);let l=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),c=o.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())||n.push({...s,name:d,value:m});}}return n}var Jle=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()}),Zle=z.object({entries:z.record(z.string(),z.array(z.tuple([z.unknown().optional(),z.unknown().optional()]))),version:z.number().optional()}),Iz=z.object({cookies:LM.array().optional(),origins:Jle.array().optional(),idb:z.record(z.string(),Zle).optional().describe("key is db name")});function rm(t,e){let n=[];return t.cloneSync()?.serializeSync()?.cookies.forEach(r=>{let o=LM.safeParse({name:r.key,...r});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),n.push(i);}),n}var Qle=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM","CUSTOM_COORDINATES"],_z=v__default.object({type:v__default.enum(Qle).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:v__default.string().or(v__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:v__default.number().or(v__default.null()).describe("Starting X coordinate in pixels. Only used if the container type is CUSTOM_COORDINATES, else set to null."),startY:v__default.number().or(v__default.null()).describe("Starting Y coordinate in pixels. Only used if the container type is CUSTOM_COORDINATES, else set to null."),deltaPixels:v__default.number().or(v__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.")}),ece=v__default.object({xPercent:v__default.number().min(0).max(1).describe("X coordinate as a fraction of the viewport width (0 = left edge, 1 = right edge)."),yPercent:v__default.number().min(0).max(1).describe("Y coordinate as a fraction of the viewport height (0 = top edge, 1 = bottom edge).")}),tce=v__default.string().or(ece).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."),Oz=v__default.object({type:v__default.literal("TAP"),target:tce,longPress:v__default.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),iterations:v__default.null().or(v__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:Rd.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."),nce=v__default.object({type:v__default.literal("PRESS"),key:v__default.nativeEnum(na)}).describe("Press a button on the device. Some buttons are physical (volume) while others are virtual (Back/Home/App Switcher)."),Dz=v__default.object({type:v__default.literal("AI_CHECK"),assertion:v__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:v__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."),Nz=v__default.object({type:v__default.literal("WAIT"),timeoutSecs:v__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.");v__default.object({type:v__default.literal("AI_EXTRACT"),goal:v__default.string().describe("Natural language description of what to extract from the current emulator state."),schema:v__default.string().or(v__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 Lz=v__default.object({type:v__default.literal("TYPE"),target:v__default.string().or(v__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:v__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:v__default.number().or(v__default.null()).describe("Milliseconds to wait between each key press. Useful for triggering auto-complete and other event listeners."),clearContent:v__default.boolean().or(v__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.")}),kz=v__default.object({type:v__default.literal("SWIPE"),direction:v__default.enum(["up","down","left","right"]).describe("Direction to swipe. Important: swiping up will scroll down, and vice versa."),container:_z,viewportPercent:v__default.number().min(.1).max(1).or(v__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:v__default.number().int().positive().or(v__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."),Fz=v__default.object({type:v__default.literal("SCROLL_TO"),targetDescription:v__default.string().describe("Description of the element to scroll to inside the container."),direction:v__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:_z,scrollStepPercent:v__default.number().min(.1).max(1).or(v__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:v__default.number().int().min(1).max(50).or(v__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."),kM=v__default.discriminatedUnion("type",[Oz,nce,Dz,Nz,Lz,kz,Fz]),rce=v__default.object({type:v__default.literal("PRESS"),key:v__default.nativeEnum(Hr)}).describe("Press a physical button on the device. Only HOME and POWER are available on iOS."),oce=v__default.object({type:v__default.literal("PRESS_KEYBOARD"),key:v__default.nativeEnum(po)}).describe("Press a key on the keyboard. Available keys: ENTER, BACKSPACE."),FM=v__default.discriminatedUnion("type",[Oz,rce,oce,Dz,Nz,Lz,kz,Fz]),eE=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 pn("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 pn("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")}}},Bz=t=>typeof t=="string"?{type:"description",description:t}:{type:"coordinates",xPercent:t.xPercent,yPercent:t.yPercent},Uz=t=>{let e=kM.parse(t);switch(e.type){case "TAP":return {id:v4$1(),type:"TAP",target:Bz(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};case "SWIPE":return {id:v4$1(),type:"SWIPE",direction:e.direction,scrollableElement:eE(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:eE(e.container),scrollStepPercent:e.scrollStepPercent??void 0,maxScrollAttempts:e.maxScrollAttempts??void 0};default:{throw new Error("Unreachable")}}},zz=t=>{let e=FM.parse(t);switch(e.type){case "TAP":return {id:v4$1(),type:"TAP",target:Bz(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};case "SWIPE":return {id:v4$1(),type:"SWIPE",direction:e.direction,scrollableElement:eE(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:eE(e.container),scrollStepPercent:e.scrollStepPercent??void 0,maxScrollAttempts:e.maxScrollAttempts??void 0};default:{throw new Error("Unreachable")}}};var $z=v__default.object({left:v__default.number(),top:v__default.number(),width:v__default.number(),height:v__default.number()});var Io={type:true,cache:true},Vz=[ks.pick(Io),ou.pick(Io),Mh.pick(Io),_h.pick(Io),Rh.pick(Io),wh.pick(Io),Th.pick(Io)],du=v__default.discriminatedUnion("type",Vz),jz=[ks.pick(Io),iu.pick(Io),Ph.pick(Io),Oh.pick(Io),xh.pick(Io),vh.pick(Io),Ah.pick(Io)],BM=v__default.discriminatedUnion("type",jz),im=t=>Ko.safeParse(t).success,mu=t=>bh.safeParse(t).success,UM=t=>Ci.safeParse(t).success;function zM(t){return !!t&&(t.type==="AI_ASSERTION"||t.type==="AI_CHECK")&&!!t.cache}var ice=Object.values(Ze).filter(t=>Vz.some(e=>e.shape.type.safeParse(t).success));function am(t){return ice.includes(t.type)}var ace=Object.values(Ze).filter(t=>jz.some(e=>e.shape.type.safeParse(t).success));function $M(t){return ace.includes(t.type)}function Ha(t,e){return t==="ANDROID"&&am(e)||t==="IOS"&&$M(e)}var tE=v__default.object({type:v__default.literal("MOBILE_AI_ACTION_STEP"),cache:Dh}),nE=v__default.union([du,tE]),rE=v__default.union([BM,tE]),oE={ANDROID:du,IOS:BM},Hz={ANDROID:t=>nE.parse(t),IOS:t=>rE.parse(t)},iE={ANDROID:t=>du.parse(t),IOS:t=>BM.parse(t)};var Uh=(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))(Uh||{}),zh=(r=>(r.US="us",r.EU="eu",r.AS="as",r))(zh||{}),Wa=(e=>(e.LOCAL="local",e))(Wa||{}),VM=v__default.nativeEnum(Uh).or(v__default.nativeEnum(zh)),jM=v__default.nativeEnum(Uh).or(v__default.nativeEnum(zh)).or(v__default.nativeEnum(Wa)),Jo="closest",Nl=jM.or(v__default.literal(Jo)),$h=(n=>(n.ANDROID_14="14",n.ANDROID_15="15",n))($h||{}),lm="14",HM=(e=>(e.IOS_26="26",e))(HM||{}),cm="26";var sce="-",lce=[Ud,sh],Gz=[Ud,sh],WM=2e4,Ri=class t{env={};varsFromMomenticEnvironment={};initialParams;constructor(e){this.initialParams=cloneDeep(e),this.reset(e);}static dummyContext(e=void 0,n=void 0,r={}){return new t({testName:e,envName:n,variablesFromEnvironment:r})}static fromSnapshot({snapshot:e,environmentVariables:n}){let r=e.env[Ud],o=e.env[sh],i={};for(let[s,l]of Object.entries(e.env))Gz.includes(s)||(n??{})[s]===void 0&&(i[s]=l);return new t({dynamicVariables:i,envName:r,testName:o,variablesFromEnvironment:n??{}})}setEnvVariables(e){let n=cloneDeep(e);this.env=Object.assign(this.env,n);}setInputs(e){e&&this.setEnvVariables(e);}setMomenticSystemVariable(e,n){this.varsFromMomenticEnvironment[e]=n;}getVariable(e){return this.env[e]}setVariable(e,n){lce.includes(e)||(this.env[e]=n);}getEnvName(){return this.env[Ud]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return cloneDeep(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy(),n=new Set;e.env=Object.fromEntries(Object.entries(e.env).map(([o,i])=>Gz.includes(o)||this.varsFromMomenticEnvironment[o]===void 0?[o,i]:(n.add(o),[o,sce])));for(let[o,i]of Object.entries(e.env)){if(!i)continue;let{jsonString:a}=Wz(JSON.stringify(i),1e3);try{e.env[o]=JSON.parse(a);}catch{e.env[o]=void 0;}}if(JSON.stringify(e.env).length>WM){for(let o of n)if(delete e.env[o],JSON.stringify(e.env).length<=WM)break}let{jsonString:r}=Wz(JSON.stringify(e.env),WM);try{e.env=JSON.parse(r);}catch{e.env={};}return e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.varsFromMomenticEnvironment=cloneDeep(e.variablesFromEnvironment),e.envName&&this.setMomenticSystemVariable(Ud,e.envName),e.testName&&this.setMomenticSystemVariable(sh,e.testName);}resetToInitial(){this.reset(this.initialParams);}getDynamicVariablesCopy(){return cloneDeep(this.env)}getVariablesFromEnvironmentCopy(){return cloneDeep(this.varsFromMomenticEnvironment)}};v.custom().refine(t=>t&&t.length>0).refine(t=>t&&t[0]instanceof File,{message:"Please upload a valid file."});var dr=t=>v.preprocess(e=>e==null?void 0:Array.isArray(e)?e:[e],v.array(t).optional()),dm=v.string().transform(t=>{let e=t.trim();return e.length===0?void 0:e}).optional();var cce=v__default.object({disableMomenticAccessibilityTree:v__default.boolean().optional(),autoGrantPermissions:v__default.boolean().optional(),disableXmlSnapshots:v__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:Ux.optional()}),pu="avdId",GM="iosDeviceType",qM="iosVersion",KM=cce.extend({region:jM.optional().describe("Do you want local or Limbar? Default behavior is Limbar (remote emulators)"),remoteEmulatorSettings:v__default.object({androidVersion:v__default.nativeEnum($h).optional()}).optional(),localEmulatorSettings:v__default.object({[pu]:dm,[GM]:dm,[qM]:dm}).optional(),geolocation:v__default.object({latitude:v__default.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:v__default.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),waitForStability:v__default.boolean().optional().describe("wait for stability before every targeting action")}),ho=v__default.object({retries:v__default.number().optional().describe("number of retries to run"),defaultChannel:v__default.string().optional().describe("Default app release channel to use when installing from managed mobile artifacts."),defaultTag:v__default.string().optional().describe("Default app artifact tag to use. If not set, the latest available tag is used."),defaultEnv:v__default.string().optional().describe("Default mobile environment name to load variables from at runtime."),defaultApkFilePath:dm.describe("APK to install when using the emulator in the local region."),defaultAppFilePath:dm.describe("App file (e.g. .app or .ipa) to install when using the emulator in the local region."),emulator:KM.optional().describe("Emulator configuration for local or remote mobile execution, including region and local emulator overrides."),ai:$x.optional().describe("AI behavior overrides for this mobile test, such as memory and failure recovery settings.")}),aE=v__default.object({id:Un,description:v__default.string(),schemaVersion:v__default.string(),settings:ho.optional(),disabled:v__default.boolean().optional(),labels:v__default.array(v__default.string()).optional()}),mm=aE.extend({platform:v__default.literal("ANDROID").optional().default("ANDROID")}),pm=aE.extend({platform:v__default.literal("IOS")}),kl=v__default.discriminatedUnion("platform",[mm,pm]),qz=v__default.object({fileType:v__default.literal(ve.MOBILE_TEST)}),sE=qz.merge(mm),lE=qz.merge(pm),cE=v__default.discriminatedUnion("platform",[sE,lE]),Kz=mm.merge(v__default.object({steps:v__default.array($a)})),Yz=pm.merge(v__default.object({steps:v__default.array(Us)}));v__default.discriminatedUnion("platform",[Kz,Yz]);var uce=sE.merge(Kz),dce=lE.merge(Yz),Xz=v__default.discriminatedUnion("platform",[uce,dce]);v__default.object({name:v__default.string(),steps:v__default.array($a).optional(),settings:ho.optional()});var Jz=mm.extend({steps:Kn.array(),beforeSteps:Kn.array().optional(),afterSteps:Kn.array().optional()}),Zz=pm.extend({steps:Yn.array(),beforeSteps:Yn.array().optional(),afterSteps:Yn.array().optional()});v__default.discriminatedUnion("platform",[Jz,Zz]);var mce=Jz.extend({name:v__default.string()}),pce=Zz.extend({name:v__default.string()});v__default.discriminatedUnion("platform",[mce,pce]);var Pr=v__default.object({startTime:v__default.number(),endTime:v__default.number().optional(),durationMs:v__default.number().optional(),error:v__default.string().optional(),result:v__default.unknown().optional().optional(),attributes:v__default.record(v__default.string(),v__default.unknown().optional()),subSpans:v__default.lazy(()=>_ce.array())});var YM=Pr.extend({type:v__default.literal("SECTION"),name:v__default.string()}),hce=Pr.extend({type:v__default.literal("GET_PAGE_STATE")}),gce=Pr.extend({type:v__default.literal("GET_PAGE_SCREENSHOT")}),bce=Pr.extend({type:v__default.literal("SMART_WAITING")}),yce=Pr.extend({type:v__default.literal("SCROLL_ELEMENT_INTO_VIEW")}),Sce=Pr.extend({type:v__default.literal("AI_LOCATOR_CALL"),screenshotSnapshotId:v__default.string().optional(),result:v__default.object({id:v__default.number(),thoughts:v__default.string(),citations:sr.array().optional()}).optional()}),Ece=Pr.extend({type:v__default.literal("AI_ASSERTION_CALL"),screenshotSnapshotId:v__default.string().optional(),elementScreenshotSnapshotId:v__default.string().optional(),result:v__default.object({thoughts:v__default.string(),result:v__default.boolean(),citations:sr.array().optional()}).optional()}),Tce=Pr.extend({type:v__default.literal("AI_EXTRACTION_CALL"),screenshotSnapshotId:v__default.string().optional(),browserStateSnapshotId:v__default.string().optional(),result:v__default.object({thoughts:v__default.string().optional(),result:v__default.unknown().optional().optional()}).optional()}),vce=Pr.extend({type:v__default.literal("ELEMENT_ASSERTION"),name:v__default.string(),result:v__default.object({success:v__default.boolean(),message:v__default.string().optional()}).optional()}),Cce=Pr.extend({type:v__default.literal("BROWSER_INTERACTION"),name:v__default.string(),coordinates:v__default.object({x:v__default.number(),y:v__default.number()}).optional(),value:v__default.string().optional(),selector:v__default.string().optional()}),wce=Pr.extend({type:v__default.literal("CACHE_RESOLUTION"),resolutionMethod:v__default.string().optional(),cacheMissReason:v__default.nativeEnum(xd).optional(),targetSource:v__default.string().optional(),elementScreenshotSnapshotId:v__default.string().optional(),result:v__default.object({serializedElement:v__default.string()}).optional()}),Ace=Pr.extend({type:v__default.literal("TARGET_RESOLUTION"),elementScreenshotSnapshotId:v__default.string().optional(),result:v__default.object({serializedElement:v__default.string()}).optional()}),Rce=Pr.extend({type:v__default.literal("LOCATOR_REDIRECT"),elementScreenshotSnapshotId:v__default.string().optional(),result:v__default.object({outcome:v__default.string(),logs:v__default.string().array().optional(),serializedElement:v__default.string().optional(),relativeClickPoint:v__default.object({x:v__default.number(),y:v__default.number()}).optional(),force:v__default.boolean().optional()}).optional()}),xce=Pr.extend({type:v__default.literal("WAIT_FOR_STABILITY")}),Mce=Pr.extend({type:v__default.literal("GENERIC"),name:v__default.string()}),Pce=Pr.extend({type:v__default.literal("PAGE_ASSERTION"),name:v__default.string(),result:v__default.object({success:v__default.boolean(),message:v__default.string().optional()}).optional()}),Ice=Pr.extend({type:v__default.literal("AUTO_FOLLOW_NEW_TABS"),result:v__default.object({followed:v__default.boolean()}).optional()});function Qz(t){return t.type==="CACHE_RESOLUTION"||t.type==="TARGET_RESOLUTION"}var _ce=v__default.discriminatedUnion("type",[YM,hce,gce,bce,yce,Sce,Ece,Tce,vce,Cce,Ace,wce,Rce,xce,Pce,Mce,Ice]);var Zo=v__default.object({startTime:v__default.number(),endTime:v__default.number().optional(),durationMs:v__default.number().optional(),error:v__default.string().optional(),targetBounds:$z.optional(),result:v__default.unknown().optional().optional(),attributes:v__default.record(v__default.string(),v__default.unknown().optional()),subSpans:v__default.lazy(()=>XM.array())});var Oce=Zo.extend({type:v__default.literal("SECTION"),name:v__default.string()}),Dce=Zo.extend({type:v__default.literal("AI_LOCATOR_CALL"),result:v__default.object({id:v__default.number(),thoughts:v__default.string()}).optional()}),Nce=Zo.extend({type:v__default.literal("AI_ASSERTION_CALL"),result:v__default.object({thoughts:v__default.string(),result:v__default.boolean()}).optional()}),Lce=Zo.extend({type:v__default.literal("AI_EXTRACTION_CALL"),screenshotSnapshotId:v__default.string().optional(),emulatorStateSnapshotId:v__default.string().optional(),result:v__default.object({thoughts:v__default.string().optional(),result:v__default.unknown().optional().optional()}).optional()}),kce=Zo.extend({type:v__default.literal("TARGET_RESOLUTION"),result:v__default.object({serializedElement:v__default.string()}).optional()}),Fce=Zo.extend({type:v__default.literal("EMULATOR_INTERACTION"),name:v__default.string(),withinWebview:v__default.boolean().optional()}),Bce=Zo.extend({type:v__default.literal("EMULATOR_READ_STATE"),name:v__default.string()}),Uce=Zo.extend({type:v__default.literal("ELEMENT_ASSERTION"),name:v__default.string(),result:v__default.object({success:v__default.boolean(),message:v__default.string().optional()}).optional()}),zce=Zo.extend({type:v__default.literal("CACHE_RESOLUTION")}),$ce=Zo.extend({type:v__default.literal("WAIT_FOR_SCREENSHOT_STABILITY")}),Vce=Zo.extend({type:v__default.literal("WAIT_FOR_PAGE_STABILITY")}),jce=Zo.extend({type:v__default.literal("WEBVIEW_LOCATOR_CALL"),webTrace:YM}),Hce=Zo.extend({type:v__default.literal("GENERIC"),name:v__default.string()}),XM=v__default.discriminatedUnion("type",[Oce,Dce,Nce,Lce,kce,Fce,Bce,Uce,zce,$ce,Vce,jce,Hce]);z.object({testId:z.string(),sessionId:z.string()});var e1=z.object({uploadUrl:z.string(),id:z.string()});var hm=(n=>(n.LOCAL="local",n.REMOTE="remote",n))(hm||{});v__default.nativeEnum(hm);function gm({overrideAvdId:t,overrideApkFilePath:e,emulatorSettings:n,defaultApkFilePath:r,envVariables:o}){let i=Qo(o?.[Cl]),{filePath:a,source:s}=t1({overrideFilePath:e,defaultFilePath:r,envFilePath:Qo(o?.[zB])});return {avdId:Qo(t)??Qo(n?.localEmulatorSettings?.[pu])??i,apkFilePath:a,apkFilePathSource:s}}function bm({overrideDeviceType:t,overrideIosVersion:e,overrideAppFilePath:n,emulatorSettings:r,defaultAppFilePath:o,envVariables:i}){let a=Qo(i?.[wl]),s=Qo(i?.[$B]),{filePath:l,source:c}=t1({overrideFilePath:n,defaultFilePath:o,envFilePath:Qo(i?.[VB])});return {deviceType:Qo(t)??Qo(r?.localEmulatorSettings?.[GM])??a,iosVersion:Qo(e)??Qo(r?.localEmulatorSettings?.[qM])??s,appFilePath:l,appFilePathSource:c}}function Qo(t){if(typeof t!="string")return;let e=t.trim();return e||void 0}function t1({overrideFilePath:t,defaultFilePath:e,envFilePath:n}){let r=Qo(t),o=Qo(e);return {filePath:r??o??n,source:r?"override":o?"default":n?"env":void 0}}z.string().refine(t=>ap.valid(t),{error:"must be a valid semver string"});function JM(t){if(t!==void 0)return t===true||t==="true"||t==="1"}function n1(t){return t==="on-fail"?"on-fail":t==="false"?false:!!t}var ym=55555,uE="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 Kce=z.union([z.string(),z.date()]).transform(t=>t instanceof Date?t:new Date(t)),r1=z.object({phoneNumber:z.string(),expiresAt:Kce,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 o1=z.object({email:z.string(),prefix:z.string(),expiresAt:z.coerce.date()}),dE=(n=>(n.RAW="RAW",n.RESPONSE="RESPONSE",n))(dE||{}),i1=z.object({body:z.string().nullish(),status:z.number().optional(),headers:z.array(z.tuple([z.string(),z.string()])).optional()}),Yce=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(),Xce=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(),a1=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:Yce,response:Xce,additionalBindings:z.record(z.string(),z.unknown().optional()).optional()}),timeoutMs:z.number().optional(),disallowVariableUpdates:z.boolean().optional(),responseSerialization:z.enum(dE).optional()});var Fl=9e4;var s1=(y=>(y.DisableClickhouseCaches="disable_clickhouse_caches",y.ShowZeroOpacityElements="show_zero_opacity_elements",y.VisualActions="visual_actions",y.RagV2="rag_v2",y.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",y.GlobalLocatorRedirect="global_locator_redirect",y.FakerConstantSeed="faker_constant_seed",y.AutoExpandIframes="auto_expand_iframes",y.MobileNewAiActionStepsUseV3="mobile_new_ai_action_steps_use_v3",y.PerformanceInsights="performance_insights",y.ShowKnowledgeBase="show_knowledge_base",y.AppGraphBackend="app_graph_backend",y.AppGraphUI="app_graph_ui",y.WebEditorV3="web_editor_v3",y.ClassificationUI="classification_ui",y.HealingUI="healing_ui",y.ExploreUI="explore_ui",y))(s1||{});var Bl=z.union([z.string(),z.number(),z.boolean(),z.null(),z.record(z.string(),z.lazy(()=>Bl)),z.array(z.lazy(()=>Bl))]);var fu={".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"},l1=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"];var c1=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)})]),Zce=z.object({githubLogin:z.string().optional(),email:z.string().optional()}),Qce=z.object({baseSha:z.string().min(1),headSha:z.string().min(1)}),eue=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()}),tue=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()});eue.extend(tue.shape).extend({changes:z.array(c1).min(1),coAuthorRange:Qce.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 u1=z.object({pullRequestUrl:z.url(),pullRequestNumber:z.number(),headBranch:z.string(),commitSha:z.string(),created:z.boolean(),authors:z.array(Zce).optional()});z.object({branch:z.string().min(1).max(255),commitMessage:z.string().min(1),changes:z.array(c1).min(1)});var d1=z.object({branch:z.string(),commitSha:z.string(),committed:z.boolean()}),m1=z.object({issueNumber:z.number(),htmlUrl:z.url(),headBranch:z.string().min(1),baseBranch:z.string().min(1),latestCommitSha:z.string().min(1),title:z.string().optional(),body:z.string().optional()}),nue=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()}),rue=z.object({sha:z.string().min(1),author:z.string().optional(),email:z.string().optional(),date:z.string().optional(),message:z.string()}),p1=z.object({mergeBaseSha:z.string().min(1),totalCommits:z.number(),commits:z.array(rue),files:z.array(nue)}),f1=z.object({content:z.string().nullable()}),h1=z.object({name:z.string().min(1),protected:z.boolean()}),g1=z.object({iid:z.number(),webUrl:z.url(),sourceBranch:z.string().min(1),targetBranch:z.string().min(1),latestCommitSha:z.string().min(1)}),oue=z.object({name:z.string(),path:z.string(),body:z.string()}),b1=z.object({template:oue});function y1(t){let[e,n,...r]=t.split("/");if(!(!e||!n||r.length>0))return {owner:e,repo:n}}function S1(t){let e=y1(t);if(e)return e;throw new pn(`Invalid GitHub repository string: ${t}. Expected format "owner/repo".`)}var mE=z.enum(["TERMINOLOGY","AGENT_RULE","FLOW"]),Vh=z.enum(["CANDIDATE","ACTIVE","PENDING_CONFLICT","REJECTED","ARCHIVED"]),QM=z.enum(["MANUAL","CRAWLER","SYSTEM","GENERATED","IMPORTED"]),iue=z.enum(["PENDING","INDEXING","INDEXED","FAILED"]);var eP=z.enum(["locator","assertion","visual-assertion","text-extraction","failure-recovery","result-classification","ai-action"]),aue=z.object({canonicalTerm:z.string().min(1),definition:z.string().min(1),examples:z.array(z.string().min(1)).default([])}),sue=z.object({agentSubtype:eP,instruction:z.string().min(1)}),lue=z.object({intent:z.string().min(1),steps:z.string().min(1),successState:z.string().min(1)}),pE=z.discriminatedUnion("type",[z.object({type:z.literal("TERMINOLOGY"),data:aue}),z.object({type:z.literal("AGENT_RULE"),data:sue}),z.object({type:z.literal("FLOW"),data:lue})]);var E1=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()})]),tP=z.object({id:z.string(),organizationId:z.string(),appId:z.string().nullable(),testId:z.string().nullable(),environmentId:z.string().nullable(),type:mE,status:Vh,source:QM,trust:z.int().min(0).max(100),title:z.string(),body:z.string(),data:pE,provenance:E1,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:pE,status:Vh,trust:z.int().min(0).max(100),changedByUserId:z.string().nullable(),changedBySystem:z.string().nullable(),changeNote:z.string().nullable(),changedAt:z.iso.datetime()});var cue=z.object({appId:z.string().nullable().optional(),testId:z.string().nullable().optional(),environmentId:z.string().nullable().optional()});cue.extend({type:mE,status:Vh.optional(),source:QM,trust:z.int().min(0).max(100).optional(),title:z.string().min(1).max(500),data:pE,provenance:E1});z.object({title:z.string().min(1).max(500).optional(),data:pE.optional(),status:Vh.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,n])=>e!=="changeNote"&&n!==void 0),{error:"at least one updatable field is required"});z.object({appId:z.string().nullable().optional(),type:dr(mE),status:dr(Vh),source:dr(QM),agentSubtype:dr(eP),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 T1=z.enum(["active-only","active-plus-candidates","review"]);z.object({query:z.string().min(1),appId:z.string().nullable().optional(),types:mE.array().min(1).max(3).optional(),agentSubtype:eP.optional(),testId:z.string().nullable().optional(),environmentId:z.string().nullable().optional(),mode:T1.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 uue=z.object({combined:z.number(),lexical:z.number().nullable(),vector:z.number().nullable()}),due=z.object({item:tP,rank:z.int().min(1),score:uue,topChunkIndex:z.int().nullable()}),v1=z.object({hits:z.array(due),mode:T1});var Sm=v__default.object({platformSep:v__default.string(),fullPathSegments:v__default.string().array(),relativePathSegments:v__default.string().array(),relativePath:v__default.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:v__default.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:v__default.coerce.date(),createdAt:v__default.coerce.date()});var mue=z.array(Sm.extend({id:z.string(),name:z.string(),description:z.string().optional(),labels:z.string().array().optional()})),pue=Sm.extend({id:z.string(),name:z.string(),description:z.string().optional(),content:fS}),fue=z.array(pue);z.object({tests:mue,modules:fue,labels:z.string().array()});z.string().array();z.object({pathSegments:z.string().array()});Xx.merge(hh);z.object({schemaVersion:z.string(),stepLists:Ld});hh.partial().merge(Ua.pick({id:true}));var fE="1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID.",hue={name:z.string().min(1).max(255).describe(fE),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(La).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:Is.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(hue);Xx.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:fS});z.object({relativeFilePath:z.string()});z.object({name:z.string(),description:z.string(),enabled:z.boolean(),steps:z.lazy(()=>fn.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(UB);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 nP=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()}),C1=z.object({pathSegments:z.array(z.string())});z.object({absolutePath:z.string(),pathSegments:z.array(z.string()),contents:z.array(nP)});var w1=z.object({sourceDirectoryPath:z.string().optional(),value:z.string(),allowedExtensions:z.array(z.string()).optional()}),gue=z.object({name:z.string(),value:z.string(),isDirectory:z.boolean()});z.object({suggestions:z.array(gue)});var A1=z.object({pathSegments:z.array(z.string())}),R1=z.object({pathSegments:z.array(z.string()),newPathSegments:z.array(z.string())}),x1=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 M1=typeof process<"u"&&true&&true,hE=58889;var bue=z.array(Sm.extend({id:z.string(),name:z.string(),description:z.string().optional(),labels:z.string().array().optional()})),yue=z.array(Sm.extend({id:z.string(),name:z.string(),description:z.string().optional(),content:z.discriminatedUnion("platform",[XS,JS])})),P1={name:z.string().min(1).max(255).describe(fE),description:z.string().optional(),settings:ho.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 ${Zc} 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:ch.optional().default("ANDROID").describe("For LLM: Never assign this unless the user explicitly asks for iOS. Defaults to Android.")},{defaultEnv:o7e,...I1}=P1;var _1=z.object(P1);z.object({id:z.string(),fileName:z.string(),fullPath:z.string(),relativeFilePath:z.string().describe("relative to project root")});var O1=z.object({settings:ho.optional(),labels:z.array(z.string()).optional()}),Sue=O1.extend({platform:z.literal("IOS"),steps:Yn.array().optional(),beforeSteps:Yn.array().optional(),afterSteps:Yn.array().optional()}),Eue=O1.extend({platform:z.literal("ANDROID"),steps:Kn.array().optional(),beforeSteps:Kn.array().optional(),afterSteps:Kn.array().optional()}),D1=z.discriminatedUnion("platform",[Sue,Eue]);z.object({message:z.literal("ok")});var N1=z.object({name:Jc.optional(),description:z.string().min(1).optional(),settings:ho.optional(),disabled:z.boolean().optional(),labels:z.array(z.string()).optional()});z.object({message:z.string(),newRelativeTestPath:z.string().optional()});var L1=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")}),k1=z.object({name:Jc});z.object({tests:bue,modules:yue,labels:z.string().array()});var F1=z.object({name:z.string(),description:z.string(),enabled:z.boolean()}).partial(),B1=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")}),Tue=B1.extend({platform:z.literal("ANDROID"),steps:Kn.array()}),vue=B1.extend({platform:z.literal("IOS"),steps:Yn.array()}),U1=z.discriminatedUnion("platform",[Tue,vue]),rP=z.object({name:z.string().describe(fE),description:z.string().optional(),enabled:z.boolean().default(true),platform:ch.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:kh.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 z1=z.object({name:z.string()});z.object({relativeFilePath:z.string()});var $1=z.object({stepId:z.string(),testId:z.string(),environment:z.string().optional(),parentStepIdChain:z.array(z.string()),value:du}),Cue=$1.extend({platform:z.literal("ANDROID"),steps:Kn.array()}),wue=$1.extend({platform:z.literal("IOS"),steps:Yn.array()}),V1=z.discriminatedUnion("platform",[Cue,wue]),j1=z.object({stepId:z.string(),testId:z.string(),environment:z.string().optional(),parentStepIdChain:z.array(z.string())}),Aue=j1.extend({platform:z.literal("ANDROID"),steps:Kn.array()}),Rue=j1.extend({platform:z.literal("IOS"),steps:Yn.array()}),H1=z.discriminatedUnion("platform",[Aue,Rue]),W1=z.object({platform:z.enum(Je),completionType:z.string(),traceIds:z.string().array()}),G1=z.object({completionType:z.string(),traceIds:z.string().array()});var q1=(r=>(r.AZURE="AZURE",r.KERNEL="KERNEL",r.BROWSERBASE="BROWSERBASE",r))(q1||{}),oP=z.enum(q1);z.object({azureRegion:z.string().optional(),azureWorkspaceId:z.string().optional()});z.object({});var xue=z.enum(["us-west-2","us-east-1","eu-central-1","ap-southeast-1"]);z.object({region:xue.optional()});var iP=(e=>(e.TEST_REVIEW="TEST_REVIEW",e))(iP||{});var Mue=z.object({type:z.literal("DESCRIPTION_UPDATE"),thoughts:z.string()}),gE=z.discriminatedUnion("type",[Mue]),Pue=z.object({testId:z.string(),name:z.string(),orgId:z.string(),runId:z.string(),steps:fn.array(),purpose:z.enum(iP),details:gE.or(gE.array()).optional()});Pue.pick({name:true,orgId:true});var Iue=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(iP),details:gE.or(gE.array()).optional(),applied:z.boolean().nullish(),appliedAt:z.coerce.date().nullish()}),K1=Iue.extend({steps:fn.array()});var Y1=z.enum(["v1","v2"]);var Oue=z.enum(["element","content","attribute","tag_name","style"]),bE=z.enum(["exists","visible","enabled","editable","focused","contains","equals","starts_with"]);[...dF,...uF].forEach(t=>{if(!bE.options.includes(t.toLowerCase()))throw new Error(`V2CheckConditionSchema is missing option: ${t}`)});var aP={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}},Z1={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"}},Q1={ELEMENT_EXISTENCE:"element",ELEMENT_CONTENT:"content",ELEMENT_ATTRIBUTE:"attribute",ELEMENT_NAME:"tag_name",ELEMENT_STYLE:"style"};function X1(t){return {alias:sP(t),subject:t.subject,condition:t.condition,negated:t.negated,assertionType:aP[t.subject].assertionType,requiresName:aP[t.subject].requiresName,requiresValue:t.subject!=="element"&&t.condition!=="exists"}}function sP(t){let e=aP[t.subject],n=Z1[t.condition];if(!e$(t.subject,t.condition))throw new Error(`Unsupported element check alias for subject '${t.subject}' and condition '${t.condition}'.`);let r=t.negated?n.negativeAliasSuffix:n.positiveAliasSuffix;return `checkElement${e.aliasPrefix}${r}`}function e$(t,e){let n=Z1[e],r=n.elementCondition,o=n.contentOperation;return t==="element"?r!==void 0:o!==void 0}var Due=Oue.options.flatMap(t=>bE.options.flatMap(e=>e$(t,e)?[X1({subject:t,condition:e,negated:false}),X1({subject:t,condition:e,negated:true})]:[])),t$=new Map(Due.map(t=>[t.alias,t]));var Nue=z.enum(hi),Lue=z.enum(Vr);function _o(t){return t$.get(t)}function r$(t){let e=Q1[t.type],n=t.type==="ELEMENT_EXISTENCE"?t.condition:t.operation;return sP({subject:e,condition:kue(n),negated:t.negated})}function o$(t){return Nue.parse(t.toUpperCase())}function jh(t){return Lue.parse(t.toUpperCase())}function kue(t){return bE.parse(t.toLowerCase())}var Be={saveAs:z.string().optional(),retries:z.number().optional(),skipped:z.boolean().optional(),comment:z.string().optional()};z.object(Be);var yE=Object.keys(Be);function _e(t){return z.union([z.strictObject({[t.key]:t.simplified}),z.strictObject({[t.key]:t.detailed})])}function on(t){return z.strictObject({[t.key]:t.detailed})}var i$='Coordinates must be "x, y" pixel values, e.g. "100, 200"',Em=z.union([Ra,z.string().regex(/^\s*-?\d+(?:\.\d+)?\s*,\s*-?\d+(?:\.\d+)?\s*$/,i$)],{error:i$});z.union([z.string(),Ra]);var ei={css:z.string().optional(),coords:Em.optional(),x:z.union([z.number(),z.string()]).optional(),y:z.union([z.number(),z.string()]).optional()},cP={on:z.string().optional(),...ei},ti={...Be,useSelector:z.boolean().optional(),force:z.boolean().optional(),DANGEROUS_FORCE_DYNAMIC:z.boolean().optional(),iframe:z.string().optional()},Hh={...ti,offset:Em.optional()};function go({schema:t,descriptionKey:e,required:n=true}){return t.superRefine((r,o)=>{let a=[e in r?Object.entries(r).find(([s])=>s===e)?.[1]:void 0,"css"in r?r.css:void 0,"coords"in r?r.coords:void 0,"x"in r||"y"in r?true:void 0].filter(s=>s!==void 0).length;n&&a!==1&&o.addIssue({code:"custom",message:`Use exactly one target: ${e}, css, coords, or x/y.`}),!n&&a>1&&o.addIssue({code:"custom",message:`Use at most one target: ${e}, css, coords, or x/y.`}),("x"in r||"y"in r)&&(!("x"in r)||r.x===void 0||!("y"in r)||r.y===void 0)&&o.addIssue({code:"custom",message:"x and y must be provided together."});})}var Fue=go({descriptionKey:"on",schema:z.strictObject({...cP,...Hh,times:z.int().min(1).optional(),rightClick:z.boolean().optional(),waitForDownload:z.boolean().optional(),delay:z.number().optional(),downloadTimeout:z.number().optional()})}),Bue=go({descriptionKey:"on",schema:z.strictObject({...cP,...Hh,rightClick:z.boolean().optional(),waitForDownload:z.boolean().optional(),delay:z.number().optional(),downloadTimeout:z.number().optional()})}),Uue=go({descriptionKey:"on",schema:z.strictObject({...cP,...Hh,times:z.int().min(1).optional(),waitForDownload:z.boolean().optional(),delay:z.number().optional(),downloadTimeout:z.number().optional()})}),a$=_e({key:"click",simplified:z.string(),detailed:Fue}),s$=_e({key:"doubleClick",simplified:z.string(),detailed:Bue}),l$=_e({key:"rightClick",simplified:z.string(),detailed:Uue}),zue=go({descriptionKey:"into",required:false,schema:z.strictObject({text:z.string(),into:z.string().optional(),...ei,...Hh,pressEnter:z.boolean().optional(),clear:z.union([z.literal("inputs"),z.literal("always"),z.literal("never"),z.boolean()]).optional(),delay:z.number().optional()})}),c$=_e({key:"type",simplified:z.string(),detailed:zue}),u$=on({key:"select",detailed:go({descriptionKey:"from",schema:z.strictObject({from:z.string().optional(),...ei,label:z.string().optional(),value:z.string().optional(),index:z.union([z.string(),z.number()]).optional(),...ti})}).superRefine((t,e)=>{[t.label,t.value,t.index].filter(r=>r!==void 0).length!==1&&e.addIssue({code:"custom",message:"select requires exactly one of label, value, or index"});})}),d$=_e({key:"hover",simplified:z.string(),detailed:go({descriptionKey:"on",schema:z.strictObject({on:z.string().optional(),...ei,...Hh})})}),m$=on({key:"blur",detailed:go({descriptionKey:"on",required:false,schema:z.strictObject({on:z.string().optional(),...ei,...ti})})}),p$=_e({key:"focus",simplified:z.string(),detailed:go({descriptionKey:"on",schema:z.strictObject({on:z.string().optional(),...ei,...ti})})}),f$=on({key:"dragAndDrop",detailed:z.strictObject({from:z.string().optional(),to:z.string().optional(),fromCss:z.string().optional(),toCss:z.string().optional(),fromCoords:Em.optional(),toCoords:Em.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(),...ti}).superRefine((t,e)=>{let n=[t.from,t.fromCss,t.fromCoords,t.fromX!==void 0||t.fromY!==void 0?true:void 0].filter(o=>o!==void 0).length,r=[t.to,t.toCss,t.toCoords,t.toX!==void 0||t.toY!==void 0?true:void 0].filter(o=>o!==void 0).length;n!==1&&e.addIssue({code:"custom",message:"Use exactly one from target."}),r!==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."});})}),h$=z.union([z.strictObject({mouseDrag:Em}),z.strictObject({mouseDrag:go({descriptionKey:"from",required:false,schema:z.strictObject({from:z.string().optional(),...ei,delta:Em,steps:z.number().optional(),...ti})})})]),g$=_e({key:"press",simplified:z.string(),detailed:z.strictObject({key:z.string(),repeat:z.number().optional(),delay:z.number().optional(),convertMeta:z.boolean().optional(),...Be})}),b$=_e({key:"keyDown",simplified:z.string(),detailed:z.strictObject({key:z.string(),convertMeta:z.boolean().optional(),...Be})}),y$=_e({key:"keyUp",simplified:z.string(),detailed:z.strictObject({key:z.string(),convertMeta:z.boolean().optional(),...Be})}),S$=_e({key:"navigate",simplified:z.string(),detailed:z.strictObject({url:z.string(),timeout:z.number().optional(),...Be})}),E$=_e({key:"newTab",simplified:z.string(),detailed:z.strictObject({url:z.string(),timeout:z.number().optional(),...Be})}),T$=_e({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(),...Be}).superRefine((t,e)=>{[t.substring,t.regex,t.index].filter(r=>r!==void 0).length!==1&&e.addIssue({code:"custom",message:"switchTab requires exactly one of substring, regex, or index"});})}),v$=on({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(),...Be}).superRefine((t,e)=>{[t.substring,t.regex,t.index].filter(r=>r!==void 0).length<=1||e.addIssue({code:"custom",message:"closeTab accepts at most one of substring, regex, or index"});})}),C$=on({key:"goBack",detailed:z.strictObject(Be)}),w$=on({key:"goForward",detailed:z.strictObject(Be)}),A$=on({key:"refresh",detailed:z.strictObject({timeout:z.number().optional(),...Be})}),R$=z.enum(["goBack","goForward","refresh","paste","authSave","offline","online","blur","visualDiff","captcha","closeTab"]),x$=_e({key:"scrollUp",simplified:z.number().nonnegative(),detailed:go({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...ei,...ti})})}),M$=_e({key:"scrollDown",simplified:z.number().nonnegative(),detailed:go({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...ei,...ti})})}),P$=_e({key:"scrollLeft",simplified:z.number().nonnegative(),detailed:go({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...ei,...ti})})}),I$=_e({key:"scrollRight",simplified:z.number().nonnegative(),detailed:go({descriptionKey:"in",required:false,schema:z.strictObject({pixels:z.number().nonnegative().optional(),in:z.string().optional(),...ei,...ti})})}),_$=_e({key:"wait",simplified:z.number(),detailed:z.strictObject({ms:z.number(),...Be})}),$ue=_e({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(),...Be})}),Vue=_e({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(),...Be})}),SE=$ue,EE=Vue,O$=_e({key:"checkPageContains",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),iframe:z.string().optional(),...Be})}),D$=_e({key:"checkPageDoesNotContain",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),iframe:z.string().optional(),...Be})}),uP=z.union([O$,D$]),jue=z.record(z.string(),z.unknown().optional()),TE=jue.superRefine((t,e)=>{let n=Object.keys(t),r=n[0];if(n.length!==1||r===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}let o=_o(r);if(o===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}if(typeof t[o.alias]=="string")return;let i=go({descriptionKey:"element",schema:z.looseObject({element:z.string().optional(),...ei,...ti,timeout:z.number().optional(),name:z.string().optional(),value:z.string().optional()})}).safeParse(t[o.alias]);if(!i.success){e.addIssue({code:"custom",message:`element check alias '${o.alias}' must be a string target or detailed object`,path:[o.alias]});return}o.requiresName&&i.data.name===void 0&&e.addIssue({code:"custom",message:`element check alias '${o.alias}' requires a name`,path:[o.alias,"name"]}),o.requiresValue&&i.data.value===void 0&&e.addIssue({code:"custom",message:`element check alias '${o.alias}' requires a value`,path:[o.alias,"value"]});}),N$=_e({key:"extract",simplified:z.string(),detailed:z.strictObject({goal:z.string(),schema:Bl.optional(),DANGEROUS_FORCE_DYNAMIC:z.boolean().optional(),iframe:z.string().optional(),...Be})}),L$=_e({key:"cookie",simplified:z.string(),detailed:z.strictObject({value:z.string(),...Be})}),k$=on({key:"localStorage",detailed:z.strictObject({key:z.string(),value:z.string(),...Be})}),F$=_e({key:"request",simplified:z.string(),detailed:z.strictObject({url:z.string(),method:Ji.optional(),headers:z.record(z.string(),z.string()).optional(),params:z.record(z.string(),z.string()).optional(),body:Bl.optional(),contentType:z.enum(Pa).optional(),timeout:z.number().optional(),...Be})}),B$=on({key:"graphqlRequest",detailed:z.strictObject({url:z.string(),query:z.string(),variables:Bl.optional(),headers:z.record(z.string(),z.string()).optional(),timeout:z.number().optional(),...Be})}),vE=_e({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(),...Be})}),Tm={substring:z.string().optional(),glob:z.string().optional(),regex:z.string().optional(),domain:z.string().optional()};function Hue(t){return [t.substring,t.glob,t.regex,t.domain].filter(e=>e!==void 0).length}function vm(t){let e=Hue(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 U$=on({key:"header",detailed:z.strictObject({name:z.string(),value:z.string(),...Tm,method:z.string().optional(),...Be}).superRefine((t,e)=>{vm({payload:t,ctx:e,required:false});})}),z$=on({key:"mock",detailed:z.strictObject({...Tm,method:z.string().optional(),responseGenerator:z.string(),fetchOriginalResponse:z.boolean().optional(),key:z.string().optional(),...Be}).superRefine((t,e)=>{vm({payload:t,ctx:e,required:true});})}),$$=_e({key:"removeRouteMock",simplified:z.string(),detailed:z.strictObject({key:z.string(),...Be})}),V$=_e({key:"waitForUrl",simplified:z.string(),detailed:z.strictObject({...Tm,caseInsensitive:z.boolean().optional(),timeout:z.number().optional(),...Be}).superRefine((t,e)=>{vm({payload:t,ctx:e,required:true});})}),j$=_e({key:"waitForUrlNotToMatch",simplified:z.string(),detailed:z.strictObject({...Tm,caseInsensitive:z.boolean().optional(),timeout:z.number().optional(),...Be}).superRefine((t,e)=>{vm({payload:t,ctx:e,required:true});})}),Wue=z.union([V$,j$]),H$=_e({key:"dialog",simplified:z.enum(["ACCEPT","DISMISS"]),detailed:z.strictObject({action:z.enum(["ACCEPT","DISMISS"]),...Be})}),W$=_e({key:"fileUpload",simplified:z.string(),detailed:z.strictObject({path:z.string(),name:z.string().optional(),...Be})}),G$=_e({key:"copy",simplified:z.union([z.string(),z.boolean(),z.null()]),detailed:z.strictObject({value:z.union([z.string(),z.boolean(),z.null()]),...Be})}),q$=on({key:"paste",detailed:z.strictObject(Be)}),K$=on({key:"captcha",detailed:z.strictObject({...ti})}),Gue=z.strictObject({data:z.union([z.string(),wa]),width:z.number(),height:z.number()}),Y$=_e({key:"visualDiff",simplified:z.string(),detailed:go({descriptionKey:"on",required:false,schema:z.strictObject({on:z.string().optional(),...ei,threshold:z.number().optional(),screenshot:Gue.optional(),...ti})})}),X$=on({key:"offline",detailed:z.strictObject(Be)}),J$=on({key:"online",detailed:z.strictObject(Be)}),Z$=on({key:"registerRequestListener",detailed:z.strictObject({...Tm,key:z.string(),method:z.string().optional(),...Be}).superRefine((t,e)=>{vm({payload:t,ctx:e,required:true});})}),Q$=_e({key:"awaitListener",simplified:z.string(),detailed:z.strictObject({key:z.string(),timeout:z.number().optional(),...Be})}),e2=on({key:"recordRequests",detailed:z.strictObject({...Tm,key:z.string(),method:z.string().optional(),...Be}).superRefine((t,e)=>{vm({payload:t,ctx:e,required:true});})}),t2=_e({key:"getRecordedRequests",simplified:z.string(),detailed:z.strictObject({key:z.string(),...Be})}),n2=_e({key:"authLoad",simplified:z.string(),detailed:z.strictObject({path:z.string(),...Be})}),r2=_e({key:"authSave",simplified:z.string(),detailed:z.strictObject({path:z.string().optional(),...Be})});z.union([a$,s$,l$,T$,v$,c$,u$,d$,m$,p$,f$,h$,g$,b$,y$,S$,E$,C$,w$,A$,x$,M$,P$,I$,_$,SE,EE,uP,N$,L$,k$,F$,B$,vE,U$,z$,$$,Wue,H$,W$,G$,q$,K$,Y$,X$,J$,Z$,Q$,e2,t2,n2,r2,TE]);var o2=new Map([["click",a$],["doubleClick",s$],["rightClick",l$],["switchTab",T$],["closeTab",v$],["type",c$],["select",u$],["hover",d$],["blur",m$],["focus",p$],["dragAndDrop",f$],["mouseDrag",h$],["press",g$],["keyDown",b$],["keyUp",y$],["navigate",S$],["newTab",E$],["goBack",C$],["goForward",w$],["refresh",A$],["scrollUp",x$],["scrollDown",M$],["scrollLeft",P$],["scrollRight",I$],["wait",_$],["assert",SE],["assertVisually",EE],["checkPageContains",O$],["checkPageDoesNotContain",D$],["extract",N$],["cookie",L$],["localStorage",k$],["request",F$],["graphqlRequest",B$],["javascript",vE],["header",U$],["mock",z$],["removeRouteMock",$$],["waitForUrl",V$],["waitForUrlNotToMatch",j$],["dialog",H$],["fileUpload",W$],["copy",G$],["paste",q$],["captcha",K$],["visualDiff",Y$],["offline",X$],["online",J$],["registerRequestListener",Z$],["awaitListener",Q$],["recordRequests",e2],["getRecordedRequests",t2],["authLoad",n2],["authSave",r2]]);Object.freeze([...o2.keys()]);var i2=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 n=Object.keys(t),r=n[0];if(n.length!==1||r===void 0){e.addIssue({code:"custom",message:"Steps must have exactly one action key."});return}let o=o2.get(r)??(_o(r)?TE:void 0);if(!o){e.addIssue({code:"custom",message:`Unsupported step type '${r}'.`});return}let i=o.safeParse(t);if(!i.success){let a=que(i.error.issues,r);a.length>0&&a2(e,a);}});function que(t,e){return Kue(t).filter(n=>!Yue(n,e))}function a2(t,e){for(let n of e){if(n.code==="invalid_union"){a2(t,dP(n));continue}t.addIssue({...n});}}function Kue(t){let e=[];for(let n of t){if(n.code==="invalid_union"){e.push(...dP(n));continue}e.push(n);}return e}function Yue(t,e){return t.code!=="unrecognized_keys"?false:e===void 0?t.path.length===0:t.path.length===1&&t.path[0]===e}function dP(t){let e=t.errors[0]??[],n=lP(e);for(let r of t.errors.slice(1)){let o=lP(r);o>n&&(e=r,n=o);}return e}function lP(t){return t.reduce((e,n)=>{let r=n.code==="invalid_union"?lP(dP(n)):0;return e+n.path.length+r},0)}var s2=z.strictObject({string:z.string()}),Xue=z.strictObject({javascript:z.string()}),l2=z.union([s2,Xue]),Jue=z.union([z.strictObject({name:z.string(),required:z.boolean().optional(),default:s2.optional()}),z.strictObject({name:z.string(),required:z.boolean().optional(),defaultValue:z.string()})]),c2=Jue.array(),Zue=z.strictObject({name:z.string(),default:l2.optional(),enum:z.array(z.string()).optional()}),u2=Zue.array(),Wh=z.union([l2,z.string()]),d2=z.record(z.string(),Wh);var Que=z.preprocess(t=>typeof t=="number"?String(t):t,dx),ede=z.looseObject({goal:z.string(),version:Que.optional(),...Be}),tde=z.union([z.strictObject({act:z.string()}),z.strictObject({act:ede})]),nde=z.looseObject({path:z.string(),inputs:z.record(z.string(),Wh).optional(),...Be}),rde=z.union([z.strictObject({module:z.string()}),z.strictObject({module:nde})]),ode=z.union([SE,EE,uP,vE,TE]),ide=new Set(["then",...yE]),ade=z.looseObject({then:z.lazy(()=>qa.array()),...Be}).superRefine((t,e)=>{Object.entries(t).filter(([r,o])=>!ide.has(r)&&ode.safeParse({[r]:o}).success).length!==1&&e.addIssue({code:"custom",message:"Conditional steps require exactly one assertion condition at the top level."});}),sde=z.strictObject({if:ade}),qa=z.lazy(()=>z.union([R$,tde,rde,sde,i2]));z.object({before:qa.array().optional(),steps:qa.array(),after:qa.array().optional()});var lde=z.union([Is,z.string().refine(t=>{let e=t.match(/^\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*$/);if(!e)return false;let[,n,r]=e;return Is.safeParse({width:Number(n),height:Number(r)}).success},"Viewport must be two numeric values, e.g. 1920, 1080")]),cde=nu.omit({viewport:true}).extend({viewport:lde.optional()}),mP=z.object({id:Un,version:z.string(),url:bS.optional(),description:z.string().optional(),retries:z.number().optional(),defaultEnv:z.string().optional(),parameters:c2.optional(),outputs:FS.optional(),disabled:z.boolean().optional(),labels:z.array(z.string()).optional()}).extend(cde.shape);z.looseObject({fileType:z.literal(ve.TEST_V2)}).extend(mP.shape).extend({before:qa.array().optional(),steps:qa.array(),after:qa.array().optional()});var ude=z.array(z.string()),dde=z.union([z.string(),z.record(z.string(),z.unknown().optional())]),CE=Da.omit({moduleId:true,name:true,parameters:true,defaultParameters:true,parameterEnums:true}).extend({id:Un,version:z.string(),name:z.string().optional(),parameters:z.union([u2,ude]).optional(),defaultParameters:z.record(z.string(),z.string()).optional(),parameterEnums:z.record(z.string(),z.array(z.string())).optional()});z.looseObject(CE.extend({fileType:z.literal(ve.MODULE_V2),steps:dde.array().optional()}).shape).superRefine(m2);z.looseObject(CE.extend({fileType:z.literal(ve.MODULE_V2),steps:qa.array().optional()}).shape).superRefine(m2);function m2(t,e){"main"in t&&e.addIssue({code:"custom",message:"v2 modules must use steps, not main",path:["main"]});}var wE=(r=>(r.WEB="web",r.ANDROID="android",r.IOS="ios",r))(wE||{}),pP=z.nativeEnum(wE);var p2=z.object({entity_type:z.string(),value:z.string()}),f2=Vf(p2),h2=p2.extend({cache_key:z.string()});function qh({entityType:t,entityId:e}){return `${t}:${e}`}var mde=/^\s*-?\d+(?:\.\d+)?\s*%\s*,\s*-?\d+(?:\.\d+)?\s*%\s*$/,gu=z.string();function E2(t){return mde.test(t)}var g2='Coordinates must be "x, y" pixel values, e.g. "100, 200"',T2=z.union([Ra,z.string().regex(/^\s*-?\d+(?:\.\d+)?\s*,\s*-?\d+(?:\.\d+)?\s*$/,g2)],{error:g2}),b2='Percent must be a number or a percent string, e.g. 90 or "90%"',v2=z.union([z.number(),z.string().regex(/^-?\d+(?:\.\d+)?%$/,b2)],{error:b2}).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"})),pde=z.strictObject({x:z.number(),y:z.number(),delta:z.number()}),C2=z.union([z.string(),pde]),AE={screen:"SCREEN",app:"OPEN_APP",webview:"OPEN_WEBVIEW"},tn={...Be,DANGEROUS_FORCE_DYNAMIC:z.boolean().optional()},fde=["home","power","back","app_switcher","search","volume_up","volume_down","volume_mute"],w2={HOME:"home",POWER:"power",BACK:"back",APP_SWITCHER:"app_switcher",SEARCH:"search",VOLUME_UP:"volume_up",VOLUME_DOWN:"volume_down",VOLUME_MUTE:"volume_mute"},fP={home:"HOME",power:"POWER",back:"BACK",app_switcher:"APP_SWITCHER",search:"SEARCH",volume_up:"VOLUME_UP",volume_down:"VOLUME_DOWN",volume_mute:"VOLUME_MUTE"},hde=["enter","backspace","close_keyboard"],A2={ENTER:"enter",BACKSPACE:"backspace",CLOSE_KEYBOARD:"close_keyboard"},hP={enter:"ENTER",backspace:"BACKSPACE",close_keyboard:"CLOSE_KEYBOARD"},y2=["airplane_mode","data","wifi","location"],R2={AIRPLANE_MODE:"airplane_mode",DATA:"data",WIFI:"wifi",LOCATION:"location"},gP={airplane_mode:"AIRPLANE_MODE",data:"DATA",wifi:"WIFI",location:"LOCATION"},S2=["portrait","landscape"],x2={PORTRAIT:"portrait",LANDSCAPE:"landscape"},bP={portrait:"PORTRAIT",landscape:"LANDSCAPE"},gde=z.strictObject({on:gu.optional(),longPress:z.boolean().optional(),longPressDuration:z.number().optional(),iterations:z.number().optional(),tapDelay:z.number().optional(),offset:T2.optional(),...tn}),M2=_e({key:"tap",simplified:gu,detailed:gde}),bde=z.strictObject({text:z.string(),into:gu.optional(),clearContent:z.boolean().optional(),forceClearContent:z.boolean().optional(),keyPressDelay:z.number().optional(),...tn}),P2=_e({key:"type",simplified:z.string(),detailed:bde}),I2=z.enum(fde),yde=z.strictObject({key:I2,longPress:z.boolean().optional(),...tn}),_2=_e({key:"press",simplified:I2,detailed:yde}),O2=z.enum(hde),Sde=z.strictObject({key:O2,...tn}),D2=_e({key:"pressKey",simplified:O2,detailed:Sde}),Ede=z.strictObject({package:z.string(),activity:z.string().optional(),intentExtras:z.string().optional(),...tn}),N2=_e({key:"openApp",simplified:z.string(),detailed:Ede}),L2=on({key:"killApp",detailed:z.strictObject(tn)}),k2=on({key:"openNotifications",detailed:z.strictObject(tn)}),F2=z.enum(["up","down","left","right"]),Tde=z.strictObject({direction:F2,in:C2.optional(),viewportPercent:v2.optional(),duration:z.number().optional(),offset:T2.optional(),...tn}),B2=_e({key:"swipe",simplified:F2,detailed:Tde}),vde=z.enum(["up","down"]),Cde=z.strictObject({on:gu,direction:vde.optional(),in:C2.optional(),scrollStepPercent:v2.optional(),maxScrollAttempts:z.number().optional(),...tn}),U2=_e({key:"scrollTo",simplified:z.string(),detailed:Cde}),yP=_e({key:"assert",simplified:z.string(),detailed:z.strictObject({that:z.string(),timeout:z.number().optional(),...tn})}),z2=_e({key:"extract",simplified:z.string(),detailed:z.strictObject({goal:z.string(),schema:Bl.optional(),...tn})}),$2=_e({key:"checkScreenContains",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),...tn})}),V2=_e({key:"checkScreenDoesNotContain",simplified:z.string(),detailed:z.strictObject({text:z.string(),timeout:z.number().optional(),...tn})}),j2=z.union([$2,V2]),wde=z.record(z.string(),z.unknown().optional()),SP=wde.superRefine((t,e)=>{let n=Object.keys(t),r=n[0];if(n.length!==1||r===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}let o=_o(r);if(o===void 0){e.addIssue({code:"custom",message:"element checks require exactly one checkElement... key"});return}if(typeof t[o.alias]=="string")return;let i=z.looseObject({on:gu.optional(),timeout:z.number().optional(),name:z.string().optional(),value:z.string().optional(),...tn}).safeParse(t[o.alias]);if(!i.success){e.addIssue({code:"custom",message:`element check alias '${o.alias}' must be a string target or detailed object`,path:[o.alias]});return}i.data.on===void 0&&e.addIssue({code:"custom",message:`element check alias '${o.alias}' requires a target via 'on'`,path:[o.alias,"on"]}),o.requiresName&&i.data.name===void 0&&e.addIssue({code:"custom",message:`element check alias '${o.alias}' requires a name`,path:[o.alias,"name"]}),o.requiresValue&&i.data.value===void 0&&e.addIssue({code:"custom",message:`element check alias '${o.alias}' requires a value`,path:[o.alias,"value"]});}),Ade=z.strictObject({from:gu,to:gu,hoverDuration:z.number().optional(),dragDuration:z.number().optional(),...tn}),H2=on({key:"dragAndDrop",detailed:Ade}),EP=_e({key:"javascript",simplified:z.string(),detailed:z.strictObject({code:z.string(),timeout:z.number().optional(),...tn})}),W2=_e({key:"request",simplified:z.string(),detailed:z.strictObject({url:z.string(),method:Ji.optional(),headers:z.record(z.string(),z.string()).optional(),params:z.record(z.string(),z.string()).optional(),body:z.string().optional(),bodyType:z.nativeEnum(Pa).optional(),timeout:z.number().optional(),...tn})}),G2=_e({key:"wait",simplified:z.number(),detailed:z.strictObject({ms:z.number(),...tn})}),q2=on({key:"addFile",detailed:z.strictObject({path:z.string(),location:z.string(),...tn})}),K2=_e({key:"installApp",simplified:z.string(),detailed:z.strictObject({path:z.string(),...tn})}),Y2=_e({key:"uninstallApp",simplified:z.string(),detailed:z.strictObject({package:z.string(),...tn})}),X2=_e({key:"toggleSettings",simplified:z.enum(y2),detailed:z.strictObject({setting:z.enum(y2),...tn})}),J2=_e({key:"rotate",simplified:z.enum(S2),detailed:z.strictObject({orientation:z.enum(S2),...tn})}),Z2=_e({key:"adb",simplified:z.string(),detailed:z.strictObject({command:z.string(),args:z.string().optional(),...tn})}),Q2=on({key:"appium",detailed:z.strictObject({script:z.string(),args:z.string().optional(),...tn})}),eV=on({key:"debugState",detailed:z.strictObject(tn)}),RE=z.enum(["killApp","openNotifications","debugState"]);z.union([M2,P2,_2,D2,N2,L2,k2,B2,U2,yP,z2,j2,H2,EP,W2,G2,q2,K2,Y2,X2,J2,Z2,Q2,eV,SP]);var tV=new Map([["tap",M2],["type",P2],["press",_2],["pressKey",D2],["openApp",N2],["killApp",L2],["openNotifications",k2],["swipe",B2],["scrollTo",U2],["assert",yP],["extract",z2],["checkScreenContains",$2],["checkScreenDoesNotContain",V2],["dragAndDrop",H2],["javascript",EP],["request",W2],["wait",G2],["addFile",q2],["installApp",K2],["uninstallApp",Y2],["toggleSettings",X2],["rotate",J2],["adb",Z2],["appium",Q2],["debugState",eV]]);Object.freeze([...tV.keys()]);var nV=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 n=Object.keys(t),r=n[0];if(n.length!==1||r===void 0){e.addIssue({code:"custom",message:"v2 mobile commands must have exactly one action key."});return}let o=tV.get(r)??(_o(r)?SP:void 0);if(!o){e.addIssue({code:"custom",message:`Unsupported v2 mobile command '${r}'.`});return}let i=o.safeParse(t);if(!i.success)for(let a of i.error.issues)e.addIssue({...a});}),Kh=z.union([yP,j2,EP,SP]);var Rde=z.preprocess(t=>typeof t=="number"?String(t):t,vM),xde=z.looseObject({goal:z.string(),version:Rde.optional(),precondition:z.string().optional(),postcondition:z.string().optional(),...Be}),Mde=z.union([z.strictObject({act:z.string()}),z.strictObject({act:xde})]),Pde=z.looseObject({path:z.string(),inputs:z.record(z.string(),Wh).optional(),...Be}),Ide=z.union([z.strictObject({module:z.string()}),z.strictObject({module:Pde})]),_de=new Set(["then",...yE]),Ode=z.looseObject({then:z.lazy(()=>Ka.array()),...Be}).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(([r,o])=>!_de.has(r)&&Kh.safeParse({[r]:o}).success).length!==1&&e.addIssue({code:"custom",message:"v2 mobile conditional steps require exactly one assertion condition at the top level."});}),Dde=z.strictObject({if:Ode}),Ka=z.lazy(()=>z.union([RE,Mde,Ide,Dde,nV]));z.object({before:Ka.array().optional(),steps:Ka.array(),after:Ka.array().optional()});var TP=["android","ios"],Nde=z.literal("android"),Lde=z.literal("ios");z.enum(TP);function Cm(t){return t==="android"?"ANDROID":"IOS"}function vP(t){return t==="ANDROID"?"android":"ios"}function xE(t){if(typeof t!="object"||t===null)return t;let e=t;if(typeof e.platform!="string")return t;let n=e.platform.toLowerCase();return n===e.platform?t:{...e,platform:n}}var rV=mm.omit({schemaVersion:true,settings:true,platform:true}).extend({version:z.string(),platform:Nde,...ho.shape}),oV=pm.omit({schemaVersion:true,settings:true,platform:true}).extend({version:z.string(),platform:Lde,...ho.shape}),kde=z.discriminatedUnion("platform",[rV,oV]),iV=z.preprocess(xE,kde),aV={before:Ka.array().optional(),steps:Ka.array(),after:Ka.array().optional()},sV=z.looseObject({fileType:z.literal(ve.MOBILE_TEST_V2)}).extend(rV.shape).extend(aV);z.preprocess(xE,sV);var lV=z.looseObject({fileType:z.literal(ve.MOBILE_TEST_V2)}).extend(oV.shape).extend(aV);z.preprocess(xE,lV);var Fde=z.discriminatedUnion("platform",[sV,lV]),zl=z.preprocess(xE,Fde);var Bde=z.preprocess(t=>typeof t=="string"?t.toLowerCase():t,z.enum(TP).optional().default("android")),ME=nm.omit({moduleId:true,name:true,schemaVersion:true,platform:true}).extend({id:Un,name:z.string().optional(),version:z.string(),platform:Bde});z.looseObject(ME.extend({fileType:z.literal(ve.MOBILE_MODULE_V2),steps:z.array(z.record(z.string(),z.unknown().optional())).optional()}).shape);var PE=z.looseObject(ME.extend({fileType:z.literal(ve.MOBILE_MODULE_V2),steps:Ka.array().optional()}).shape);function cV(t){return t.steps??[]}var IE="x-momentic-cli-version",dV="x-momentic-client-mode",mV="x-momentic-cli-type",pV="x-momentic-logger-tags",Ude="x-momentic-main-branch-name",zde="x-momentic-branch-name",$de="x-momentic-commit-timestamp",Vde="x-momentic-last-commit-on-main",jde="x-momentic-last-commit-on-main-timestamp",Hde="x-momentic-merged-branch-name",fV="x-momentic-session-id";v.object({error:v.boolean(),reason:v.string(),message:v.string()});ur.merge(Yx);var hV=tS;ur.merge(Yx);ur.merge(wU).extend({useConsensus:v.boolean().optional(),attemptNumber:v.number().optional()});var CP=cF;ur.merge(AU);var gV=vB;ur.merge(EU);var bV=CS;ur.merge(nF);ur.merge(TU);var yV=SB;ur.merge(vU);ur.merge(CU);ur.merge(PU);ur.merge(IU);v.object({testPaths:v.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:v.string().optional(),all:v.boolean().optional(),urlOverride:v.string().optional(),customHeaders:v.record(v.string(),v.string()).optional(),testInputMatrix:v.record(v.string(),v.string()).array().optional()});var SV=v.object({queuedTests:v.unknown().optional().array(),runIds:v.guid().array(),runGroupId:v.string().optional()});v.string().array();v.union([v.object({paths:v.string().array().describe("Export specific test paths or folder paths (e.g. todo-test, auth/onboarding)"),all:v.boolean().describe("run all tests").optional()}),v.object({path:v.string().describe("deprecated; present for backcompat")})]);var Wde=v.object({tests:v.record(v.string().describe("Test name (keys correspond to entries in `tests`)"),v.string().describe("Slash-separated folder name path that the test lives in (e.g. 'Auth/Login'). Top-level entities are omitted.")),modules:v.record(v.string().describe("Module name (keys correspond to entries in `modules`)"),v.string().describe("Slash-separated folder name path that the module lives in."))}),EV=v.object({tests:v.record(v.string().describe("Test name"),v.string().describe("Test YAML")),modules:v.record(v.string().describe("Module name"),v.string().describe("Module YAML")),folderPaths:Wde.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.")}),Gde=v.object({test:v.string().describe("test YAML"),modules:v.record(v.string().describe("moduleId"),v.string().describe("module YAML"))});Gde.array();v.object({testId:v.string(),schemaVersion:v.string()}).merge(Xc);function bu(t){let{gitMainBranch:e,gitBranchName:n,gitCommitTimestamp:r,lastCommitOnMainSha:o,lastCommitOnMainTimestamp:i}=t,a={};return e&&(a[Ude]=encodeURIComponent(e)),n&&(a[zde]=encodeURIComponent(n)),r&&(a[$de]=r.toISOString()),o&&(a[Vde]=encodeURIComponent(o)),i&&(a[jde]=i.toISOString()),t.mergedGitBranchName&&(a[Hde]=encodeURIComponent(t.mergedGitBranchName)),a}v.object({entries:v.array(XF)});v.object({platform:pP.optional(),entries:v.array(f2)});v.object({testId:v.string(),environment:v.string().optional(),platform:pP.optional()});v.object({testId:v.string(),key:v.string(),environment:v.string().optional()});function TV(t){return v.record(v.string(),v.unknown().optional()).transform(e=>{let n={};for(let[r,o]of Object.entries(e)){let i=t.safeParse(o);i.success&&(n[r]=i.data);}return n})}var vV=TV(JF),CV=h2.array();function uV(t){return TV(jf(t))}var wV={ANDROID:t=>uV(nE).parse(t),IOS:t=>uV(rE).parse(t)},qde=v.object({id:v.string(),completionType:v.string(),description:v.string().optional(),thoughts:v.string(),result:v.string(),sessionType:v.string(),timeCreated:v.string().optional(),citations:v.array(sr).optional()}),Kde=v.object({id:v.string(),assertion:v.string().optional(),result:v.string(),thoughts:v.string(),sessionType:v.string(),timeCreated:v.string().optional(),citations:v.array(sr).optional()});v.object({completionType:v.string(),traceIds:v.string().array()});var wP=v.union([qde,Kde]).array(),AV=v.object({trigger:v.nativeEnum(qo),status:v.nativeEnum(en),startedAt:v.coerce.date().optional(),gitCommitSha:v.string().optional(),gitCommitShaShort:v.string().optional(),gitCommitTimestamp:v.coerce.date().optional(),gitBranchName:v.string().optional(),gitOriginUrl:v.string().optional(),gitCommitMessage:v.string().optional(),gitCommitAuthorName:v.string().optional(),githubRepository:v.string().optional(),gitlabProjectPath:v.string().optional(),pipelineId:v.string().optional(),cliVersion:v.string().optional()});v.object({id:v.string()});var RV=v.object({status:v.nativeEnum(en),updatedAt:v.coerce.date().optional(),finishedAt:v.coerce.date().optional()});v.object({summary:ru,githubRepository:v.string().optional(),gitBranchName:v.string().optional()});var xV=v.object({stepsSnapshot:v.array(v.record(v.string(),v.unknown().optional())).optional(),beforeStepsSnapshot:v.array(v.record(v.string(),v.unknown().optional())).optional(),afterStepsSnapshot:v.array(v.record(v.string(),v.unknown().optional())).optional(),runGroupId:v.string().optional(),testId:v.string(),testName:v.string(),resolvedBaseUrl:v.string().optional(),environmentName:v.string().optional(),labels:v.array(v.string()).optional(),cliVersion:v.string().optional(),trigger:v.nativeEnum(qo),schemaVersion:v.string().optional(),section:v.nativeEnum(US).optional(),resolvedInputs:v.record(v.string(),v.string()).optional(),quarantined:v.boolean().optional().default(false),quarantinedReason:v.string().optional(),aiSettings:Fa.optional()});v.object({id:v.string()});var Yde=Gx.pick({id:true,status:true,healStatus:true,healDetails:true,testName:true,testId:true,test:true,failureReason:true,failureDetails:true}),MV=Yde.array(),PV=Gx.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();v.object({id:v.string()});var IV=v.object({run:Os.omit({runAttempts:true}),attemptZipUrls:v.array(v.string().url().nullish())}),_V=v.object({status:v.nativeEnum(en),finishedAt:v.coerce.date().optional(),schemaVersion:v.string().optional().default("1.0.19"),results:v.record(v.string(),v.unknown().optional()).array().optional(),beforeResults:v.record(v.string(),v.unknown().optional()).array().optional(),afterResults:v.record(v.string(),v.unknown().optional()).array().optional()});v.object({screenshot:v.string(),contentType:v.enum(["image/jpeg","image/png"]).optional()});v.object({id:v.string(),screenshot:v.string(),contentType:v.enum(["image/jpeg","image/png"])});var OV=v.object({key:v.string()}),DV=v.object({orgId:v.string(),userId:v.string(),email:v.string().optional(),name:v.string().optional(),pylonEmailHash:v.string().optional(),selfServe:v.boolean().optional()}),NV=v.object({blocked:v.boolean()}),LV=v.array(BB);v.record(v.string(),v.union([v.string(),v.boolean()]));v.object({workosAccessToken:v.string().min(1),organizationId:v.string().optional(),clientName:v.string().min(1).max(80).optional()});var kV=v.object({apiKey:v.string(),apiKeyName:v.string(),organizationId:v.string(),user:v.object({id:v.string(),email:v.string().optional()}),selfServe:v.boolean().optional()}),FV=v.object({error:v.literal("multiple_organizations"),organizations:v.array(v.object({id:v.string(),name:v.string()}))}),Xde=["web","ios","android"];v.object({platforms:v.array(v.enum(Xde)),packageManager:v.enum(["npm","pnpm","yarn","bun"]),wizardVersion:v.string().min(1).max(40),cliVersions:v.object({momentic:v.string().max(40).optional(),momenticMobile:v.string().max(40).optional()}).optional(),firstRunIds:v.array(v.guid()).max(10).optional()});v.object({ok:v.literal(true)});v.object({paths:v.string().array(),env:v.string().optional(),urlOverride:v.string().optional(),customHeaders:v.record(v.string(),v.string()).optional()});var BV=v.object({suiteRunIds:v.string().array(),runGroupIds:v.string().array()});v.object({suiteRunIds:v.string().array()});fU.array();v.object({runGroupIds:v.string().array()});var AP=v.object({uploadUrl:v.string()});ur.merge(RU);ur.merge(MU);ur.merge(xU);var Jde=v.object({testId:v.string().optional().default(""),testName:v.string().optional().default(""),suiteId:v.string().optional().default(""),suiteName:v.string().optional().default(""),isInteractive:v.boolean().optional().default(false),creditsUsed:v.number().optional(),stepsExecuted:v.number().optional(),tokensUsed:v.number().optional()}),Zde=v.object({transactionId:v.string(),timestamp:v.string(),event:v.nativeEnum(Dl),properties:Jde});Zde.array();var UV=K1.omit({steps:true}).extend({steps:v.array(v.record(v.string(),v.unknown().optional())).describe("unparsed ResolvedStep[]")});v.object({limit:v.number().min(1).max(10).optional(),page:v.number().min(1).optional(),start:Tn.optional(),end:Tn.optional(),gitBranchName:v.string().optional(),status:v.nativeEnum(en).optional()});var zV=Wx.array(),Qde=v.object({testId:Un.optional(),gitBranchName:v.string().optional(),status:v.nativeEnum(en).optional(),label:v.string().array().optional(),limit:v.number().min(1).max(100).optional(),page:v.number().min(1).optional(),start:Tn.optional(),end:Tn.optional(),quarantined:v.boolean().optional(),recovered:v.boolean().optional()});Qde.extend({orgId:v.string().optional(),testId:dr(Un),status:dr(v.nativeEnum(en)),gitBranchName:dr(v.string()),label:dr(v.string()),testName:v.string().optional(),trigger:dr(v.nativeEnum(qo)),executionType:dr($d),cliVersion:dr(v.string()),githubRepository:dr(v.string()),gitlabProjectPath:dr(v.string()),environment:dr(v.string()),directory:dr(v.string()),failureCategory:dr(v.string()),exclude:dr(v.string()),healed:v.boolean().optional()});var $V=v.object({runs:Wx.array(),page:v.number(),pageSize:v.number(),pageCount:v.number()});v.object({applied:v.boolean().optional(),appliedAt:v.coerce.date().optional()});var VV=AP.extend({id:v.string()});v.object({runGroupId:v.guid().optional(),persist:v.boolean().optional()});var jV=v.object({runGroupId:v.guid()}),HV=v.object({quarantined:v.object({testId:Un,quarantinedAt:v.coerce.date(),quarantinedBy:v.string().optional(),quarantinedReason:v.string()}).array()}),WV=v.object({gitLocalUsername:v.string().optional(),gitLocalEmail:v.string().optional(),gitLocalName:v.string().optional()});v.object({testId:Un,testName:v.string().optional(),reason:v.string()}).merge(WV);v.object({testName:v.string().optional(),reason:v.string().optional()}).merge(WV);ur.merge(wz);ur.merge(Az);ur.merge(Rz);v.object({apkToInstall:v.object({channel:v.string(),tag:v.string().optional()}).optional(),hostname:v.string().optional(),region:VM.optional(),osVersion:v.nativeEnum($h).optional(),sessionId:v.string().optional()});var GV=v.object({name:v.string(),apiUrl:v.string(),webRtcUrl:v.string(),adbUrl:v.string(),token:v.string(),apkDownloadUrl:v.string().optional(),playwrightServerUrl:v.string().optional(),region:v.string().optional(),resolvedTag:v.string().optional()});v.object({appToInstall:v.object({channel:v.string(),tag:v.string().optional()}).optional(),hostname:v.string().optional(),region:VM.optional(),osVersion:v.nativeEnum(HM).optional(),sessionId:v.string().optional(),installAppOnClient:v.boolean().optional()});var qV=v.object({id:v.string(),apiUrl:v.string(),webRtcUrl:v.string(),wdaUrl:v.string(),token:v.string(),appDownloadUrl:v.string().optional(),appMd5:v.string().optional(),region:v.string().optional(),resolvedTag:v.string().optional()});v.object({channel:v.string().trim().min(1,"channel must be a non-empty string"),tag:v.string().trim().min(1,"tag must be a non-empty string"),md5:v.string()});var KV=v.object({id:v.string(),uploadUrl:v.string().optional(),downloadUrl:v.string(),md5:v.string().optional()}),eme=v.object({channel:v.string(),tag:v.string(),md5:v.string(),platform:v.nativeEnum(Je).default("ANDROID"),createdAt:v.number().describe("Unix timestamp in milliseconds")}),YV=v.object({assets:v.array(eme)}),XV=v.object({downloadUrl:v.string()}),RP=(n=>(n.PLAYWRIGHT="PLAYWRIGHT",n.CDP="CDP",n))(RP||{}),tme=v.nativeEnum(RP);v.object({runId:v.guid().optional(),attemptedProviders:v.array(oP).optional()});var JV=v.object({wsEndpoint:v.string(),accessToken:v.string().optional(),endpointType:tme.optional(),provider:oP.optional()});z.object({repositoriesIndexed:z.boolean(),indexingInProgress:z.boolean(),indexesOutdated:z.boolean()});var ZV=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(ZV||{}),QV=(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))(QV||{});z.object({name:z.string(),status:z.enum(ZV),conclusion:z.enum(QV).nullable()});var Yh=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()})}),xP=z.object({mergedBranch:z.string().optional()});var ej=z.object({orgId:z.string(),cacheKeys:z.string().array()});z.object({keyParams:ej,clientMetadata:z.string(),lockAcquisitionTimeoutMs:z.number().optional()});var tj=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()}),ej]);var nme=z.object({remainingTtlMs:z.number(),value:z.string().nullish()});z.object({results:z.record(z.string(),nme),activeLocks:z.string().array()});function Xh(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 rme=z.object({version:z.string(),json:z.record(z.string(),z.unknown().optional()),hash:z.string()}),nj=z.record(z.string(),z.unknown().optional());z.object({newSvgs:z.array(rme),metadata:nj.optional()});var ome=z.object({version:z.string(),json:z.record(z.string(),z.unknown().optional()).nullish(),hash:z.string(),description:z.string().nullish(),metadata:nj.nullish()}),rj=z.record(z.string().describe("icon hash"),ome);function wm(t){let e;try{e=JSON.parse(t);}catch(n){return `The schema is not valid JSON. ${n}`}try{validator(e);}catch(n){return `The schema is not a valid JSON schema. ${n}`}}var oj=t=>{t.extraHeaders&&(t.extraHeaders=Object.fromEntries(Object.entries(t.extraHeaders).filter(([e,n])=>e.trim()&&n.trim())));};var _E=class{async prepareGoldenScreenshotForComparison(e,n,r){return r}};var OE=class{async resolveEntries(){}async populateCacheForRun(){}async getCacheKeyForStep(){}async saveEntries(){}async saveSnapshotCacheEntries(){}};function ame(t){return t.map(e=>({...e,environment:void 0}))}function MP(t,e){return e?t:ame(t)}var mr="metadata.json",Pi="assets",yo="runs",sme=z.object({step:fn,status:z.enum(rn),startedAt:z.coerce.date(),finishedAt:z.coerce.date().optional(),healMetadata:z.object({healType:z.enum(ah).or(z.literal("AI")),healedAt:z.coerce.date()}).optional(),beforeSnapshotId:z.guid().optional(),afterSnapshotId:z.guid().optional(),message:z.string().optional()}),lme=sme.extend({finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});lme.extend({step:z.unknown().optional()});var PP=z.object({avdId:z.string().optional(),channel:z.string().optional(),tag:z.string().optional(),region:z.string().optional()}),aj="1.0.0",sj=_V.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:PP.optional(),viewport:Is.optional(),activeVideos:z.array(z.object({videoName:z.string(),timestamp:z.coerce.date()})).optional()}),IP=sj.extend({assetDetails:PP.optional(),finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});sj.extend(Nx.shape);var lj=IP.extend(Nx.shape),cme=z.object({results:z.array(Mo),beforeResults:z.array(Mo).optional(),afterResults:z.array(Mo).optional()});IP.extend(cme.shape);var ume=z.object({results:z.array(Po),beforeResults:z.array(Po).optional(),afterResults:z.array(Po).optional()});IP.extend(ume.shape);var cj=PV.merge(xV).extend({executionType:$d.optional().default("WEB"),testId:Un,testDescription:z.string().optional(),directory:z.string().optional(),runGroupId:z.guid(),status:z.enum(en),healStatus:Hx,startedAt:z.coerce.date(),schemaVersion:z.string().nullish(),attempts:z.number(),failureRecoveryDetails:z.object({attempts:z.number()}).optional(),aiSettings:Fa.optional(),avgCpuUsage:z.number().optional(),avgMemoryUsage:z.number().optional()}),dme=cj.extend(PP.shape),uj=cj.extend({finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});dme.extend({finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});var ij=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(z.object({testId:z.string(),name:z.string(),testPath:z.string().nullable(),relevanceLabel:z.enum(["high","medium","low"]),rationale:z.string()})),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()}),mme=AV.merge(RV).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:Fa.optional(),browser:_s.optional(),aiSelect:z.union([ij.transform(t=>[t]),z.array(ij)]).optional()}),Am=mme.extend({healRiskSummary:ru.optional(),updatedAt:z.coerce.date().optional().transform(t=>t??new Date),finishedAt:z.coerce.date().optional().transform(t=>t??new Date)});var pme=new Set(["MOBILE_MODULE_STEP","MOBILE_CONDITIONAL_STEP","RESOLVED_MOBILE_MODULE"]);function DE(t){return t.type!=="MOBILE_PRESET_STEP"?t.type:t.command.type}function NE(t){return !pme.has(t.type)}var dj="CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih",LE="https://us-west.metrics.momentic.ai",kE="c60c6a0f-60da-41a7-a61b-07969a0aa303",yu=!!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 mj=(()=>{try{return statSync("/.dockerenv"),!0}catch{return false}})();async function $l(t){return yu||mj?true:(await P.flush(),await new Promise(n=>setTimeout(n,100)),await confirm({message:t}))}async function pj(t,e){return yu||mj?e:(await input({message:t,default:e})).trim()||e}var Rm=new Map,hj="Log throttle exceeded",xme=100,Mme=5e3,Pme=Tme(global.fetch,{retries:2,retryOn:function(t,e,n){return !!(e!==null||n&&n.status>=500)},retryDelay:function(t){return Math.pow(2,t)*500}}),Ime="https://ingest.us.signoz.cloud:443/logs/json",_P=class{constructor(e,n){this.flushIntervalMs=e;this.maxBatchSize=n;}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 n=await Pme(Ime,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":dj},body:Rl(e),signal:AbortSignal.timeout(5e3)});if(!n.ok)throw new Error(`Got error status (${n.statusText}) from SigNoz`)}catch{}}},OP=class t{consoleLogger;hostname;bindingAttributes;disableConsoleLogs;minLevelValue=20;logsInCurrentWindow=0;droppedLogsInWindow=false;lastWindowStart=Date.now();flushIntervalMs;maxBatchSize;buffer;constructor({bindings:e,hostname:n,disableConsoleLogs:r,flushIntervalMs:o,maxBatchSize:i,buffer:a}){this.hostname=n??$s.hostname(),this.disableConsoleLogs=r,this.bindingAttributes={...e,env:"production"},this.flushIntervalMs=o??5e3,this.maxBatchSize=i??10,this.buffer=a??new _P(this.flushIntervalMs,this.maxBatchSize);let s={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=fj(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===hj)return true;let n=Date.now();return n-this.lastWindowStart>Mme&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,hj),this.droppedLogsInWindow=false,this.lastWindowStart=n),this.logsInCurrentWindow<xme?(this.logsInCurrentWindow++,true):(this.droppedLogsInWindow=true,false)}log(e,n,r,...o){try{this.logHelper(e,n,r,...o);}catch(i){this.consoleLogger.warn(`Failed to log to Signoz: ${i}`);}}logHelper(e,n,r,...o){if(dh[e]<this.minLevelValue||!this.shouldAllowLog(r))return;typeof n=="string"&&!r&&(n={message:n}),typeof n=="object"&&n&&"err"in n&&n.err instanceof Error&&(n.err=Ame.err(n.err));let i={...this.bindingAttributes,...n&&typeof n=="object"?n:{},...o.length>0?{args:o}:{}},a={host:this.hostname,env:this.bindingAttributes.env},s=_me();this.disableConsoleLogs||this.consoleLogger[e]({...i,...s??{}},r,...o);let l={timestamp:Math.round(Date.now()*1e6),...s??{},severity_text:e.toUpperCase(),resources:a,attributes:{},body:ZB({message:r||"",...i})};this.buffer.push(l);}setApp(e){let n=this.bindingAttributes.app;this.bindingAttributes.app=e,Rm.set("app",this),Rm.delete(n);}debug(e,n,...r){this.log("debug",e,n,...r);}info(e,n,...r){this.log("info",e,n,...r);}warn(e,n,...r){this.log("warn",e,n,...r);}error(e,n,...r){this.log("error",e,n,...r);}bindings(){return this.bindingAttributes}addBinding(e,n){this.bindingAttributes[e]=n;}setMinLevel(e){typeof e=="number"?(this.minLevelValue=e,this.consoleLogger.level=QB[e]):(this.minLevelValue=dh[e],this.consoleLogger.level=e);}enableConsoleLogs(){this.disableConsoleLogs=false;}},xm=({app:t,hostname:e,disableConsoleLogs:n})=>(Rm.has(t)||Rm.set(t,new OP({bindings:{app:t},hostname:e,disableConsoleLogs:n})),Rm.get(t));function _me(){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 FE(){await Promise.all([...Rm.values()].map(t=>t.flush()));}var Vl=class extends Error{constructor(e){super(e),this.name="TimeoutError";}};var gj=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 te(t,e){let{milliseconds:n,fallback:r,message:o,customTimers:i={setTimeout,clearTimeout}}=e,a;if(typeof n!="number"||Math.sign(n)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${n}\``);return new Promise((s,l)=>{let c;if(e.signal){let{signal:m}=e;if(m.aborted)return l(gj(m));c=()=>l(gj(m)),m.addEventListener("abort",c,{once:true});}let u=()=>{if(e.signal&&e.signal.removeEventListener("abort",c),r)try{s(r());}catch(m){l(m);}else {typeof t.cancel=="function"&&Promise.resolve().then(()=>t.cancel()).catch(()=>{});let m=o instanceof Error?o:new Vl(o??`Promise timed out after ${n}ms`);l(m);}};n<1/0&&(a=i.setTimeout(u,n));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 Mm({signal:t,timeoutMs:e}){let n=AbortSignal.timeout(e);return t?AbortSignal.any([t,n]):n}var bj="organization";function BE(t){let e=new PostHog(t.writeKey,{host:t.host,...t.flushImmediately?{flushAt:1,flushInterval:0}:{}}),n=t.platform,r=(l,c,u)=>{let{type:d,...m}=l;e.capture({distinctId:c??u??randomUUID(),event:d,...u&&{groups:{[bj]:u}},properties:{platform:n,user_id:c??void 0,org_id:u??void 0,...m,organizationId:u??void 0,...c==null&&{$process_person_profile:false}}});},o=({orgId:l,properties:c})=>{e.groupIdentify({groupType:bj,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:o,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=>r(u,l?.userId??null,l?.orgId??null)}}return {shutdownAnalytics:a,groupIdentifyOrg:o,identifyUser:i,captureEvent:(l,{userId:c,orgId:u})=>r(l,c,u),captureBillingEvent:(l,{userId:c,orgId:u})=>r(l,c,u)}}var kme=2e3,Su=t=>Number.parseInt(t,10),NP=t=>readFileSync(t,"utf8").trim(),Pm=t=>Su(NP(t)),yj,UE,Jh={samples:0,lowMemorySamples:0,highCpuSamples:0,highHeapSamples:0};function vj(){return {...Jh}}var zE=$s.platform(),Fme=$s.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 DP(t=Date.now()){let e=$s.cpus(),n={measurementTime:t,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let r of e)n.user+=r.times.user,n.nice+=r.times.nice,n.sys+=r.times.sys,n.idle+=r.times.idle,n.irq+=r.times.irq;return n.total=n.user+n.nice+n.sys+n.idle+n.irq,n}function Cj(t,e){let n={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 n.total<=0?null:{measurementTime:e.measurementTime,intervalMs:e.measurementTime-t.measurementTime,user:n.user/n.total*100,nice:n.nice/n.total*100,sys:n.sys/n.total*100,idle:n.idle/n.total*100,irq:n.irq/n.total*100,total:100-n.idle/n.total*100}}function Bme(){let t=DP();return ()=>{let e=DP(),n=Cj(t,e);return t=e,n}}function Sj(){try{let e=readFileSync("/sys/fs/cgroup/cpu.stat","utf8").match(/^usage_usec\s+(\d+)/m);if(e?.[1])return Su(e[1])}catch{}try{let t=Pm("/sys/fs/cgroup/cpuacct/cpuacct.usage");if(!isNaN(t))return t/1e3}catch{}return null}function Ume(){try{let e=NP("/sys/fs/cgroup/cpu.max").split(" "),n=e[0],r=e[1];return !n||!r||n==="max"?null:Su(n)/Su(r)}catch{}try{let t=Pm("/sys/fs/cgroup/cpu/cpu.cfs_quota_us"),e=Pm("/sys/fs/cgroup/cpu/cpu.cfs_period_us");return t===-1||isNaN(e)?null:t/e}catch{return null}}function zme(){if(zE!=="linux")return null;let t=Sj();if(t===null)return null;let e=Ume()??$s.cpus().length,n=t,r=Date.now();return ()=>{let o=Sj();if(o===null)return null;let i=Date.now(),a=i-r;if(a<=0)return null;let s=o-n,l=a*1e3,c=Math.max(0,Math.min(100,s/l/e*100));return n=o,r=i,{measurementTime:i,intervalMs:a,user:c,nice:0,sys:0,idle:Math.max(0,100-c),irq:0,total:c}}}function $me(){let t=process.cpuUsage(),e=process.hrtime.bigint();return ()=>{let n=process.cpuUsage(),r=process.hrtime.bigint(),o=Number(r-e)/1e6,i=n.user-t.user,a=n.system-t.system;if(t=n,e=r,o<=0)return null;let s=Math.max($s.cpus().length,1),l=c=>Math.max(0,c/1e3/o*100/s);return {total:l(i+a),user:l(i),sys:l(a),intervalMs:o}}}function wj({intervalMs:t=kme,maxSamples:e=1e4,keepSamples:n=true,onSample:r}={}){let o=[],i=zme()??Bme(),a=$me(),s=()=>{let u=Date.now(),d=Rj(),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}}};r?.(h),n&&(o.push(h),o.length>e&&o.shift());};s();let l=setInterval(s,t),c=u=>({samples:n?[...o]:[]});return {stop:()=>(clearInterval(l),c()),getSeries:()=>c()}}var Ej=t=>{try{let e={},n=!1,r=Rj(),o=jme();Jh.samples++,r.freePercentage<.05&&(Object.assign(e,process.memoryUsage()),n=!0,Jh.lowMemorySamples++),o&&o?.total>80&&(n=!0,Jh.highCpuSamples++);let i=Lme.getHeapStatistics(),a=i.used_heap_size,s=i.heap_size_limit;a/s>.9&&(n=!0,Jh.highHeapSamples++),n?t.warn({memory:r,cpu:o,heapStats:i,...e},"Critical resource usage metrics detected"):t.debug({memory:r,cpu:o},"Got machine resource usage metrics");}catch{}};function Aj(t){return Ej(t),{interval:setInterval(()=>Ej(t),2e4),cpuMetadata:Fme,platform:zE}}function Vme(){if(zE!=="linux")return null;try{let t=NP("/sys/fs/cgroup/memory.max"),e=Pm("/sys/fs/cgroup/memory.current");if(t==="max"||isNaN(e))return null;let n=Su(t);if(isNaN(n))return null;let r=Math.max(0,n-e);return {totalMemory:n,freeMemory:r,freePercentage:r/n}}catch{}try{let t=Pm("/sys/fs/cgroup/memory/memory.limit_in_bytes"),e=Pm("/sys/fs/cgroup/memory/memory.usage_in_bytes");if(isNaN(t)||isNaN(e))return null;let n=$s.totalmem();if(t>=n)return null;let r=Math.max(0,t-e);return {totalMemory:t,freeMemory:r,freePercentage:r/t}}catch{return null}}function Rj(){let t=Vme();if(t)return t;let e=$s.totalmem(),n=zE==="darwin"?Hme():(()=>{let o=$s.freemem();return {availableMemory:o,rawFreeMemory:o,cachedMemory:0}})(),r=n.availableMemory/e;return {totalMemory:e,freeMemory:n.availableMemory,freePercentage:r}}function jme(){let t=DP();if(!UE)return UE=t,null;let e=Cj(UE,t);return UE=t,e?(yj=e,yj):null}function Hme(){try{let t=execSync("/usr/bin/vm_stat",{encoding:"utf8",stdio:["pipe","pipe","ignore"]}),n=t.match(/page size of (\d+) bytes/)?.[1],r=n?Su(n):4096,o=u=>{let m=t.match(new RegExp(`${u}:\\s+(\\d+)\\.`,"i"))?.[1];return m?Su(m):0},i=o("Pages free"),a=o("Pages inactive"),s=o("Pages speculative"),l=i*r,c=(a+s)*r;return {availableMemory:l+c,rawFreeMemory:l,cachedMemory:c}}catch{let t=$s.freemem();return {availableMemory:t,rawFreeMemory:t,cachedMemory:0}}}var Im=false,$E,Zh,Qh,tpe=[];function VE(){return Im}async function npe(){for(let t of tpe)try{await t();}catch{}}function rpe(){return VE()&&trace.getSpan(context.active())!==void 0}function ope(){return process.env.MOMENTIC_LOCAL_DEV==="1"&&process.env.LOCAL_SIGNOZ==="true"?new OTLPTraceExporter({url:"http://localhost:4318/v1/traces"}):new OTLPTraceExporter({url:`${LE}/v1/traces`,headers:{"x-momentic-metrics-api-key":kE}})}function ipe(t){let e="production",n=v4$1(),r=ope(),o=new NodeTracerProvider({resource:new Resource({[SEMRESATTRS_SERVICE_NAME]:t,[SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]:e,[SEMRESATTRS_SERVICE_INSTANCE_ID]:n})});return o.addSpanProcessor(new BatchSpanProcessor(r)),o}function ape(t){return !t&&!$E?trace.getTracer("momentic-serverless"):Qh?.getTracer("momentic-serverless")??trace.getTracer("momentic-serverless")}async function jE(t){if(!(!t.enabled||Im))try{$E=t.serviceName;let e=ipe(t.serviceName);Qh=e,Zh=new AsyncLocalStorageContextManager,e.register({contextManager:Zh.enable()}),Im=!0;}catch{Im=false,$E=void 0,Qh=void 0,Zh=void 0;}}async function HE(){if(Im)try{await npe(),await Qh?.shutdown();}catch{}finally{try{Zh?.disable();}catch{}Im=false,$E=void 0,Zh=void 0,Qh=void 0;}}async function Xe(t){if(!VE()||!t.root&&!rpe())return t.fn(void 0);let e=t.serviceName===void 0?t.attributes:{...t.attributes??{},"momentic.span_service_name":t.serviceName};return await ape(t.serviceName).startActiveSpan(t.name,{attributes:e,kind:t.kind??SpanKind.CLIENT},async n=>{try{let r=await t.fn(n);return n.setStatus({code:SpanStatusCode.OK}),r}catch(r){throw n.setStatus({code:SpanStatusCode.ERROR,message:r instanceof Error?r.message.slice(0,300):void 0}),r instanceof Error&&n.recordException(r),r}finally{n.end();}})}var eg=class{increment(e,n,r){}gauge(e,n){}distribution(e,n,r){}async flush(){}async recordDuration(e){return await kP(e)}};async function kP({fn:t,name:e,timeoutMs:n,trace:r}){let o=r?()=>Xe({name:r.name,attributes:r.attributes,fn:t}):t,i=Promise.resolve(o());return n===void 0?await i:await te(i,{milliseconds:n,message:`Timed out after ${n}ms recording duration for ${e}`})}function spe(t){if(!t||t.length===0)return {};let e={};for(let n of t){let r=n.indexOf(":");if(r>-1){let o=n.slice(0,r).trim(),i=n.slice(r+1).trim();o&&(e[o]=i);continue}e[n]=true;}return e}function FP(t,e){let n=spe(t);return !e||Object.keys(e).length===0?n:{...e,...n}}var cpe=createContextKey("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function Pj(t){return t.setValue(cpe,true)}var Ij="=",WE=";",BP=",";var _j=8192;var upe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i};function Oj(t){return t.reduce(function(e,n){var r=""+e+(e!==""?BP:"")+n;return r.length>_j?e:r},"")}function Dj(t){return t.getAllEntries().map(function(e){var n=upe(e,2),r=n[0],o=n[1],i=encodeURIComponent(r)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=WE+o.metadata.toString()),i})}function UP(t){var e=t.split(WE);if(!(e.length<=0)){var n=e.shift();if(n){var r=n.indexOf(Ij);if(!(r<=0)){var o=decodeURIComponent(n.substring(0,r).trim()),i=decodeURIComponent(n.substring(r+1).trim()),a;return e.length>0&&(a=baggageEntryMetadataFromString(e.join(WE))),{key:o,value:i,metadata:a}}}}}function Nj(t){return typeof t!="string"||t.length===0?{}:t.split(BP).map(function(e){return UP(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,n){return e[n.key]=n.value,e},{})}function Lj(){return function(t){diag.error(ppe(t));}}function ppe(t){return typeof t=="string"?t:JSON.stringify(fpe(t))}function fpe(t){for(var e={},n=t;n!==null;)Object.getOwnPropertyNames(n).forEach(function(r){if(!e[r]){var o=n[r];o&&(e[r]=String(o));}}),n=Object.getPrototypeOf(n);return e}var hpe=Lj();function GE(t){try{hpe(t);}catch{}}var qE;(function(t){t.AlwaysOff="always_off",t.AlwaysOn="always_on",t.ParentBasedAlwaysOff="parentbased_always_off",t.ParentBasedAlwaysOn="parentbased_always_on",t.ParentBasedTraceIdRatio="parentbased_traceidratio",t.TraceIdRatio="traceidratio";})(qE||(qE={}));var gpe=",",bpe=["OTEL_SDK_DISABLED"];function ype(t){return bpe.indexOf(t)>-1}var Spe=["OTEL_BSP_EXPORT_TIMEOUT","OTEL_BSP_MAX_EXPORT_BATCH_SIZE","OTEL_BSP_MAX_QUEUE_SIZE","OTEL_BSP_SCHEDULE_DELAY","OTEL_BLRP_EXPORT_TIMEOUT","OTEL_BLRP_MAX_EXPORT_BATCH_SIZE","OTEL_BLRP_MAX_QUEUE_SIZE","OTEL_BLRP_SCHEDULE_DELAY","OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_EVENT_COUNT_LIMIT","OTEL_SPAN_LINK_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT","OTEL_EXPORTER_OTLP_TIMEOUT","OTEL_EXPORTER_OTLP_TRACES_TIMEOUT","OTEL_EXPORTER_OTLP_METRICS_TIMEOUT","OTEL_EXPORTER_OTLP_LOGS_TIMEOUT","OTEL_EXPORTER_JAEGER_AGENT_PORT"];function Epe(t){return Spe.indexOf(t)>-1}var Tpe=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS","OTEL_SEMCONV_STABILITY_OPT_IN"];function vpe(t){return Tpe.indexOf(t)>-1}var zP=1/0,$P=128,Cpe=128,wpe=128,VP={OTEL_SDK_DISABLED:false,CONTAINER_NAME:"",ECS_CONTAINER_METADATA_URI_V4:"",ECS_CONTAINER_METADATA_URI:"",HOSTNAME:"",KUBERNETES_SERVICE_HOST:"",NAMESPACE:"",OTEL_BSP_EXPORT_TIMEOUT:3e4,OTEL_BSP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BSP_MAX_QUEUE_SIZE:2048,OTEL_BSP_SCHEDULE_DELAY:5e3,OTEL_BLRP_EXPORT_TIMEOUT:3e4,OTEL_BLRP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BLRP_MAX_QUEUE_SIZE:2048,OTEL_BLRP_SCHEDULE_DELAY:5e3,OTEL_EXPORTER_JAEGER_AGENT_HOST:"",OTEL_EXPORTER_JAEGER_AGENT_PORT:6832,OTEL_EXPORTER_JAEGER_ENDPOINT:"",OTEL_EXPORTER_JAEGER_PASSWORD:"",OTEL_EXPORTER_JAEGER_USER:"",OTEL_EXPORTER_OTLP_ENDPOINT:"",OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:"",OTEL_EXPORTER_OTLP_METRICS_ENDPOINT:"",OTEL_EXPORTER_OTLP_LOGS_ENDPOINT:"",OTEL_EXPORTER_OTLP_HEADERS:"",OTEL_EXPORTER_OTLP_TRACES_HEADERS:"",OTEL_EXPORTER_OTLP_METRICS_HEADERS:"",OTEL_EXPORTER_OTLP_LOGS_HEADERS:"",OTEL_EXPORTER_OTLP_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_METRICS_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_LOGS_TIMEOUT:1e4,OTEL_EXPORTER_ZIPKIN_ENDPOINT:"http://localhost:9411/api/v2/spans",OTEL_LOG_LEVEL:DiagLogLevel.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:["tracecontext","baggage"],OTEL_RESOURCE_ATTRIBUTES:"",OTEL_SERVICE_NAME:"",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:zP,OTEL_ATTRIBUTE_COUNT_LIMIT:$P,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:zP,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:$P,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:zP,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:$P,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:Cpe,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:wpe,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:qE.ParentBasedAlwaysOn,OTEL_TRACES_SAMPLER_ARG:"",OTEL_LOGS_EXPORTER:"",OTEL_EXPORTER_OTLP_INSECURE:"",OTEL_EXPORTER_OTLP_TRACES_INSECURE:"",OTEL_EXPORTER_OTLP_METRICS_INSECURE:"",OTEL_EXPORTER_OTLP_LOGS_INSECURE:"",OTEL_EXPORTER_OTLP_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_COMPRESSION:"",OTEL_EXPORTER_OTLP_TRACES_COMPRESSION:"",OTEL_EXPORTER_OTLP_METRICS_COMPRESSION:"",OTEL_EXPORTER_OTLP_LOGS_COMPRESSION:"",OTEL_EXPORTER_OTLP_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_TRACES_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_LOGS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE:"cumulative",OTEL_SEMCONV_STABILITY_OPT_IN:[]};function Ape(t,e,n){if(!(typeof n[t]>"u")){var r=String(n[t]);e[t]=r.toLowerCase()==="true";}}function Rpe(t,e,n,r,o){if(r===void 0&&(r=-1/0),o===void 0&&(o=1/0),typeof n[t]<"u"){var i=Number(n[t]);isNaN(i)||(i<r?e[t]=r:i>o?e[t]=o:e[t]=i);}}function xpe(t,e,n,r){r===void 0&&(r=gpe);var o=n[t];typeof o=="string"&&(e[t]=o.split(r).map(function(i){return i.trim()}));}var Mpe={ALL:DiagLogLevel.ALL,VERBOSE:DiagLogLevel.VERBOSE,DEBUG:DiagLogLevel.DEBUG,INFO:DiagLogLevel.INFO,WARN:DiagLogLevel.WARN,ERROR:DiagLogLevel.ERROR,NONE:DiagLogLevel.NONE};function Ppe(t,e,n){var r=n[t];if(typeof r=="string"){var o=Mpe[r.toUpperCase()];o!=null&&(e[t]=o);}}function kj(t){var e={};for(var n in VP){var r=n;switch(r){case "OTEL_LOG_LEVEL":Ppe(r,e,t);break;default:if(ype(r))Ape(r,e,t);else if(Epe(r))Rpe(r,e,t);else if(vpe(r))xpe(r,e,t);else {var o=t[r];typeof o<"u"&&o!==null&&(e[r]=String(o));}}}return e}function tg(){var t=kj(process.env);return Object.assign({},VP,t)}function Fj(t){return t>=48&&t<=57?t-48:t>=97&&t<=102?t-87:t-55}function ng(t){for(var e=new Uint8Array(t.length/2),n=0,r=0;r<t.length;r+=2){var o=Fj(t.charCodeAt(r)),i=Fj(t.charCodeAt(r+1));e[n++]=o<<4|i;}return e}function rg(t){t.unref();}var Lpe=9,kpe=6,Fpe=Math.pow(10,kpe),Bpe=Math.pow(10,Lpe);function Eu(t){var e=t/1e3,n=Math.trunc(e),r=Math.round(t%1e3*Fpe);return [n,r]}function jP(t){return t[0]*Bpe+t[1]}function _m(t){return t[0]*1e6+t[1]/1e3}var ni;(function(t){t[t.SUCCESS=0]="SUCCESS",t[t.FAILED=1]="FAILED";})(ni||(ni={}));function zj(t,e){return new Promise(function(n){context.with(Pj(context.active()),function(){t.export(e,function(r){n(r);});});})}var og={getKeyPairs:Dj,serializeKeyPairs:Oj,parseKeyPairsIntoRecord:Nj,parsePairKeyValue:UP},$j={_export:zj};var Wr;(function(t){t[t.DELTA=0]="DELTA",t[t.CUMULATIVE=1]="CUMULATIVE";})(Wr||(Wr={}));var Gr;(function(t){t[t.HISTOGRAM=0]="HISTOGRAM",t[t.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",t[t.GAUGE=2]="GAUGE",t[t.SUM=3]="SUM";})(Gr||(Gr={}));var Upe=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),Vj=function(t,e,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(t,[])).next());})},jj=function(t,e){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=e.call(t,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:true}}},zpe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},$pe=function(t,e,n){if(arguments.length===2)for(var r=0,o=e.length,i;r<o;r++)(i||!(r in e))&&(i||(i=Array.prototype.slice.call(e,0,r)),i[r]=e[r]);return t.concat(i||Array.prototype.slice.call(e))},Vpe=function(t){var e=typeof Symbol=="function"&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&typeof t.length=="number")return {next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function Hj(t){return t!=null}function KE(t){var e=Object.keys(t);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(n){return [n,t[n]]})))}function Wj(t){var e,n;return t.name+":"+((e=t.version)!==null&&e!==void 0?e:"")+":"+((n=t.schemaUrl)!==null&&n!==void 0?n:"")}var HP=function(t){Upe(e,t);function e(n){var r=t.call(this,n)||this;return Object.setPrototypeOf(r,e.prototype),r}return e}(Error);function Hl(t,e){var n,r=new Promise(function(i,a){n=setTimeout(function(){a(new HP("Operation timed out."));},e);});return Promise.race([t,r]).then(function(o){return clearTimeout(n),o},function(o){throw clearTimeout(n),o})}function Gj(t){return Vj(this,void 0,void 0,function(){var e=this;return jj(this,function(n){return [2,Promise.all(t.map(function(r){return Vj(e,void 0,void 0,function(){var o,i;return jj(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,r];case 1:return o=a.sent(),[2,{status:"fulfilled",value:o}];case 2:return i=a.sent(),[2,{status:"rejected",reason:i}];case 3:return [2]}})})}))]})})}function qj(t){return t.status==="rejected"}function WP(t,e){var n=[];return t.forEach(function(r){n.push.apply(n,$pe([],zpe(e(r)),false));}),n}function Kj(t,e){var n,r;if(t.size!==e.size)return false;try{for(var o=Vpe(t),i=o.next();!i.done;i=o.next()){var a=i.value;if(!e.has(a))return !1}}catch(s){n={error:s};}finally{try{i&&!i.done&&(r=o.return)&&r.call(o);}finally{if(n)throw n.error}}return true}function Yj(t,e){for(var n=0,r=t.length-1,o=t.length;r>=n;){var i=n+Math.trunc((r-n)/2);t[i]<e?n=i+1:(o=i,r=i-1);}return o}function Xj(t,e){return t.toLowerCase()===e.toLowerCase()}var Ii;(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";})(Ii||(Ii={}));var GP=function(){function t(){this.kind=Ii.DROP;}return t.prototype.createAccumulation=function(){},t.prototype.merge=function(e,n){},t.prototype.diff=function(e,n){},t.prototype.toMetricData=function(e,n,r,o){},t}();var Ue;(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";})(Ue||(Ue={}));function Ya(t,e,n){var r,o,i,a;return Gpe(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:(r=n?.description)!==null&&r!==void 0?r:"",unit:(o=n?.unit)!==null&&o!==void 0?o:"",valueType:(i=n?.valueType)!==null&&i!==void 0?i:ValueType.DOUBLE,advice:(a=n?.advice)!==null&&a!==void 0?a:{}}}function Jj(t,e){var n,r;return {name:(n=t.name)!==null&&n!==void 0?n:e.name,description:(r=t.description)!==null&&r!==void 0?r:e.description,type:e.type,unit:e.unit,valueType:e.valueType,advice:e.advice}}function Zj(t,e){return Xj(t.name,e.name)&&t.unit===e.unit&&t.type===e.type&&t.valueType===e.valueType}var Wpe=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function Gpe(t){return t.match(Wpe)!=null}var qpe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i};function Kpe(t){var e=t.map(function(){return 0});return e.push(0),{buckets:{boundaries:t,counts:e},sum:0,count:0,hasMinMax:false,min:1/0,max:-1/0}}var YE=function(){function t(e,n,r,o){r===void 0&&(r=true),o===void 0&&(o=Kpe(n)),this.startTime=e,this._boundaries=n,this._recordMinMax=r,this._current=o;}return t.prototype.record=function(e){if(!Number.isNaN(e)){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);var n=Yj(this._boundaries,e);this._current.buckets.counts[n]+=1;}},t.prototype.setStartTime=function(e){this.startTime=e;},t.prototype.toPointValue=function(){return this._current},t}();var XE=function(){function t(e,n){this._boundaries=e,this._recordMinMax=n,this.kind=Ii.HISTOGRAM;}return t.prototype.createAccumulation=function(e){return new YE(e,this._boundaries,this._recordMinMax)},t.prototype.merge=function(e,n){for(var r=e.toPointValue(),o=n.toPointValue(),i=r.buckets.counts,a=o.buckets.counts,s=new Array(i.length),l=0;l<i.length;l++)s[l]=i[l]+a[l];var c=1/0,u=-1/0;return this._recordMinMax&&(r.hasMinMax&&o.hasMinMax?(c=Math.min(r.min,o.min),u=Math.max(r.max,o.max)):r.hasMinMax?(c=r.min,u=r.max):o.hasMinMax&&(c=o.min,u=o.max)),new YE(e.startTime,r.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:r.buckets.boundaries,counts:s},count:r.count+o.count,sum:r.sum+o.sum,hasMinMax:this._recordMinMax&&(r.hasMinMax||o.hasMinMax),min:c,max:u})},t.prototype.diff=function(e,n){for(var r=e.toPointValue(),o=n.toPointValue(),i=r.buckets.counts,a=o.buckets.counts,s=new Array(i.length),l=0;l<i.length;l++)s[l]=a[l]-i[l];return new YE(n.startTime,r.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:r.buckets.boundaries,counts:s},count:o.count-r.count,sum:o.sum-r.sum,hasMinMax:false,min:1/0,max:-1/0})},t.prototype.toMetricData=function(e,n,r,o){return {descriptor:e,aggregationTemporality:n,dataPointType:Gr.HISTOGRAM,dataPoints:r.map(function(i){var a=qpe(i,2),s=a[0],l=a[1],c=l.toPointValue(),u=e.type===Ue.GAUGE||e.type===Ue.UP_DOWN_COUNTER||e.type===Ue.OBSERVABLE_GAUGE||e.type===Ue.OBSERVABLE_UP_DOWN_COUNTER;return {attributes:s,startTime:l.startTime,endTime:o,value:{min:c.hasMinMax?c.min:void 0,max:c.hasMinMax?c.max:void 0,sum:u?void 0:c.sum,buckets:c.buckets,count:c.count}}})}},t}();var qP=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},KP=function(t,e,n){if(arguments.length===2)for(var r=0,o=e.length,i;r<o;r++)(i||!(r in e))&&(i||(i=Array.prototype.slice.call(e,0,r)),i[r]=e[r]);return t.concat(i||Array.prototype.slice.call(e))},YP=function(){function t(e,n,r,o){e===void 0&&(e=new Ype),n===void 0&&(n=0),r===void 0&&(r=0),o===void 0&&(o=0),this.backing=e,this.indexBase=n,this.indexStart=r,this.indexEnd=o;}return Object.defineProperty(t.prototype,"offset",{get:function(){return this.indexStart},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"length",{get:function(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1},enumerable:false,configurable:true}),t.prototype.counts=function(){var e=this;return Array.from({length:this.length},function(n,r){return e.at(r)})},t.prototype.at=function(e){var n=this.indexBase-this.indexStart;return e<n&&(e+=this.backing.length),e-=n,this.backing.countAt(e)},t.prototype.incrementBucket=function(e,n){this.backing.increment(e,n);},t.prototype.decrementBucket=function(e,n){this.backing.decrement(e,n);},t.prototype.trim=function(){for(var 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(var e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate();},t.prototype.downscale=function(e){this._rotate();for(var n=1+this.indexEnd-this.indexStart,r=1<<e,o=0,i=0,a=this.indexStart;a<=this.indexEnd;){var s=a%r;s<0&&(s+=r);for(var l=s;l<r&&o<n;l++)this._relocateBucket(i,o),o++,a++;i++;}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart;},t.prototype.clone=function(){return new t(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)},t.prototype._rotate=function(){var 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);},t.prototype._relocateBucket=function(e,n){e!==n&&this.incrementBucket(e,this.backing.emptyBucket(n));},t}();var Ype=function(){function t(e){e===void 0&&(e=[0]),this._counts=e;}return Object.defineProperty(t.prototype,"length",{get:function(){return this._counts.length},enumerable:false,configurable:true}),t.prototype.countAt=function(e){return this._counts[e]},t.prototype.growTo=function(e,n,r){var o=new Array(e).fill(0);o.splice.apply(o,KP([r,this._counts.length-n],qP(this._counts.slice(n)),false)),o.splice.apply(o,KP([0,n],qP(this._counts.slice(0,n)),false)),this._counts=o;},t.prototype.reverse=function(e,n){for(var r=Math.floor((e+n)/2)-e,o=0;o<r;o++){var i=this._counts[e+o];this._counts[e+o]=this._counts[n-o-1],this._counts[n-o-1]=i;}},t.prototype.emptyBucket=function(e){var n=this._counts[e];return this._counts[e]=0,n},t.prototype.increment=function(e,n){this._counts[e]+=n;},t.prototype.decrement=function(e,n){this._counts[e]>=n?this._counts[e]-=n:this._counts[e]=0;},t.prototype.clone=function(){return new t(KP([],qP(this._counts),false))},t}();var Qj=52,Xpe=2146435072,Jpe=1048575,XP=1023,JE=-1023+1,ZE=XP,ig=Math.pow(2,-1022);function QE(t){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,t);var n=e.getUint32(0),r=(n&Xpe)>>20;return r-XP}function eT(t){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,t);var n=e.getUint32(0),r=e.getUint32(4),o=(n&Jpe)*Math.pow(2,32);return o+r}function ag(t,e){return t===0||t===Number.POSITIVE_INFINITY||t===Number.NEGATIVE_INFINITY||Number.isNaN(t)?t:t*Math.pow(2,e)}function tH(t){return t--,t|=t>>1,t|=t>>2,t|=t>>4,t|=t>>8,t|=t>>16,t++,t}var Zpe=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),Wl=function(t){Zpe(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Error);var rH=function(){function t(e){this._shift=-e;}return t.prototype.mapToIndex=function(e){if(e<ig)return this._minNormalLowerBoundaryIndex();var n=QE(e),r=this._rightShift(eT(e)-1,Qj);return n+r>>this._shift},t.prototype.lowerBoundary=function(e){var n=this._minNormalLowerBoundaryIndex();if(e<n)throw new Wl("underflow: "+e+" is < minimum lower boundary: "+n);var r=this._maxNormalLowerBoundaryIndex();if(e>r)throw new Wl("overflow: "+e+" is > maximum lower boundary: "+r);return ag(1,e<<this._shift)},Object.defineProperty(t.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:false,configurable:true}),t.prototype._minNormalLowerBoundaryIndex=function(){var e=JE>>this._shift;return this._shift<2&&e--,e},t.prototype._maxNormalLowerBoundaryIndex=function(){return ZE>>this._shift},t.prototype._rightShift=function(e,n){return Math.floor(e*Math.pow(2,-n))},t}();var oH=function(){function t(e){this._scale=e,this._scaleFactor=ag(Math.LOG2E,e),this._inverseFactor=ag(Math.LN2,-e);}return t.prototype.mapToIndex=function(e){if(e<=ig)return this._minNormalLowerBoundaryIndex()-1;if(eT(e)===0){var n=QE(e);return (n<<this._scale)-1}var r=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return r>=o?o:r},t.prototype.lowerBoundary=function(e){var n=this._maxNormalLowerBoundaryIndex();if(e>=n){if(e===n)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Wl("overflow: "+e+" is > maximum lower boundary: "+n)}var r=this._minNormalLowerBoundaryIndex();if(e<=r){if(e===r)return ig;if(e===r-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Wl("overflow: "+e+" is < minimum lower boundary: "+r)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(t.prototype,"scale",{get:function(){return this._scale},enumerable:false,configurable:true}),t.prototype._minNormalLowerBoundaryIndex=function(){return JE<<this._scale},t.prototype._maxNormalLowerBoundaryIndex=function(){return (ZE+1<<this._scale)-1},t}();var iH=-10,aH=20,Qpe=Array.from({length:31},function(t,e){return e>10?new oH(e-10):new rH(e-10)});function JP(t){if(t>aH||t<iH)throw new Wl("expected scale >= "+iH+" && <= "+aH+", got: "+t);return Qpe[t+10]}var efe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},tT=function(){function t(e,n){this.low=e,this.high=n;}return t.combine=function(e,n){return new t(Math.min(e.low,n.low),Math.max(e.high,n.high))},t}(),nfe=20,rfe=160,ZP=2,sH=function(){function t(e,n,r,o,i,a,s,l,c,u,d){e===void 0&&(e=e),n===void 0&&(n=rfe),r===void 0&&(r=true),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),s===void 0&&(s=Number.POSITIVE_INFINITY),l===void 0&&(l=Number.NEGATIVE_INFINITY),c===void 0&&(c=new YP),u===void 0&&(u=new YP),d===void 0&&(d=JP(nfe)),this.startTime=e,this._maxSize=n,this._recordMinMax=r,this._sum=o,this._count=i,this._zeroCount=a,this._min=s,this._max=l,this._positive=c,this._negative=u,this._mapping=d,this._maxSize<ZP&&(diag.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+ZP),this._maxSize=ZP);}return t.prototype.record=function(e){this.updateByIncrement(e,1);},t.prototype.setStartTime=function(e){this.startTime=e;},t.prototype.toPointValue=function(){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}},Object.defineProperty(t.prototype,"sum",{get:function(){return this._sum},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"min",{get:function(){return this._min},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"max",{get:function(){return this._max},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"count",{get:function(){return this._count},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"zeroCount",{get:function(){return this._zeroCount},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"scale",{get:function(){return this._count===this._zeroCount?0:this._mapping.scale},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"positive",{get:function(){return this._positive},enumerable:false,configurable:true}),Object.defineProperty(t.prototype,"negative",{get:function(){return this._negative},enumerable:false,configurable:true}),t.prototype.updateByIncrement=function(e,n){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=n,e===0){this._zeroCount+=n;return}this._sum+=e*n,e>0?this._updateBuckets(this._positive,e,n):this._updateBuckets(this._negative,-e,n);}},t.prototype.merge=function(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;var n=this._minScale(e);this._downscale(this.scale-n),this._mergeBuckets(this.positive,e,e.positive,n),this._mergeBuckets(this.negative,e,e.negative,n);},t.prototype.diff=function(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;var n=this._minScale(e);this._downscale(this.scale-n),this._diffBuckets(this.positive,e,e.positive,n),this._diffBuckets(this.negative,e,e.negative,n);},t.prototype.clone=function(){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)},t.prototype._updateBuckets=function(e,n,r){var o=this._mapping.mapToIndex(n),i=false,a=0,s=0;if(e.length===0?(e.indexStart=o,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):o<e.indexStart&&e.indexEnd-o>=this._maxSize?(i=true,s=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=true,s=e.indexStart,a=o),i){var l=this._changeScale(a,s);this._downscale(l),o=this._mapping.mapToIndex(n);}this._incrementIndexBy(e,o,r);},t.prototype._incrementIndexBy=function(e,n,r){if(r!==0){if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=n),n<e.indexStart){var o=e.indexEnd-n;o>=e.backing.length&&this._grow(e,o+1),e.indexStart=n;}else if(n>e.indexEnd){var o=n-e.indexStart;o>=e.backing.length&&this._grow(e,o+1),e.indexEnd=n;}var i=n-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,r);}},t.prototype._grow=function(e,n){var r=e.backing.length,o=e.indexBase-e.indexStart,i=r-o,a=tH(n);a>this._maxSize&&(a=this._maxSize);var s=a-o;e.backing.growTo(a,i,s);},t.prototype._changeScale=function(e,n){for(var r=0;e-n>=this._maxSize;)e>>=1,n>>=1,r++;return r},t.prototype._downscale=function(e){if(e!==0){if(e<0)throw new Error("impossible change of scale: "+this.scale);var n=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=JP(n);}},t.prototype._minScale=function(e){var n=Math.min(this.scale,e.scale),r=tT.combine(this._highLowAtScale(this.positive,this.scale,n),this._highLowAtScale(e.positive,e.scale,n)),o=tT.combine(this._highLowAtScale(this.negative,this.scale,n),this._highLowAtScale(e.negative,e.scale,n));return Math.min(n-this._changeScale(r.high,r.low),n-this._changeScale(o.high,o.low))},t.prototype._highLowAtScale=function(e,n,r){if(e.length===0)return new tT(0,-1);var o=n-r;return new tT(e.indexStart>>o,e.indexEnd>>o)},t.prototype._mergeBuckets=function(e,n,r,o){for(var i=r.offset,a=n.scale-o,s=0;s<r.length;s++)this._incrementIndexBy(e,i+s>>a,r.at(s));},t.prototype._diffBuckets=function(e,n,r,o){for(var i=r.offset,a=n.scale-o,s=0;s<r.length;s++){var l=i+s>>a,c=l-e.indexBase;c<0&&(c+=e.backing.length),e.decrementBucket(c,r.at(s));}e.trim();},t}();var QP=function(){function t(e,n){this._maxSize=e,this._recordMinMax=n,this.kind=Ii.EXPONENTIAL_HISTOGRAM;}return t.prototype.createAccumulation=function(e){return new sH(e,this._maxSize,this._recordMinMax)},t.prototype.merge=function(e,n){var r=n.clone();return r.merge(e),r},t.prototype.diff=function(e,n){var r=n.clone();return r.diff(e),r},t.prototype.toMetricData=function(e,n,r,o){return {descriptor:e,aggregationTemporality:n,dataPointType:Gr.EXPONENTIAL_HISTOGRAM,dataPoints:r.map(function(i){var a=efe(i,2),s=a[0],l=a[1],c=l.toPointValue(),u=e.type===Ue.GAUGE||e.type===Ue.UP_DOWN_COUNTER||e.type===Ue.OBSERVABLE_GAUGE||e.type===Ue.OBSERVABLE_UP_DOWN_COUNTER;return {attributes:s,startTime:l.startTime,endTime:o,value:{min:c.hasMinMax?c.min:void 0,max:c.hasMinMax?c.max:void 0,sum:u?void 0:c.sum,positive:{offset:c.positive.offset,bucketCounts:c.positive.bucketCounts},negative:{offset:c.negative.offset,bucketCounts:c.negative.bucketCounts},count:c.count,scale:c.scale,zeroCount:c.zeroCount}}})}},t}();var ofe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},nT=function(){function t(e,n,r){n===void 0&&(n=0),r===void 0&&(r=[0,0]),this.startTime=e,this._current=n,this.sampleTime=r;}return t.prototype.record=function(e){this._current=e,this.sampleTime=Eu(Date.now());},t.prototype.setStartTime=function(e){this.startTime=e;},t.prototype.toPointValue=function(){return this._current},t}();var eI=function(){function t(){this.kind=Ii.LAST_VALUE;}return t.prototype.createAccumulation=function(e){return new nT(e)},t.prototype.merge=function(e,n){var r=_m(n.sampleTime)>=_m(e.sampleTime)?n:e;return new nT(e.startTime,r.toPointValue(),r.sampleTime)},t.prototype.diff=function(e,n){var r=_m(n.sampleTime)>=_m(e.sampleTime)?n:e;return new nT(n.startTime,r.toPointValue(),r.sampleTime)},t.prototype.toMetricData=function(e,n,r,o){return {descriptor:e,aggregationTemporality:n,dataPointType:Gr.GAUGE,dataPoints:r.map(function(i){var a=ofe(i,2),s=a[0],l=a[1];return {attributes:s,startTime:l.startTime,endTime:o,value:l.toPointValue()}})}},t}();var ife=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},Om=function(){function t(e,n,r,o){r===void 0&&(r=0),o===void 0&&(o=false),this.startTime=e,this.monotonic=n,this._current=r,this.reset=o;}return t.prototype.record=function(e){this.monotonic&&e<0||(this._current+=e);},t.prototype.setStartTime=function(e){this.startTime=e;},t.prototype.toPointValue=function(){return this._current},t}();var rT=function(){function t(e){this.monotonic=e,this.kind=Ii.SUM;}return t.prototype.createAccumulation=function(e){return new Om(e,this.monotonic)},t.prototype.merge=function(e,n){var r=e.toPointValue(),o=n.toPointValue();return n.reset?new Om(n.startTime,this.monotonic,o,n.reset):new Om(e.startTime,this.monotonic,r+o)},t.prototype.diff=function(e,n){var r=e.toPointValue(),o=n.toPointValue();return this.monotonic&&r>o?new Om(n.startTime,this.monotonic,o,true):new Om(n.startTime,this.monotonic,o-r)},t.prototype.toMetricData=function(e,n,r,o){return {descriptor:e,aggregationTemporality:n,dataPointType:Gr.SUM,dataPoints:r.map(function(i){var a=ife(i,2),s=a[0],l=a[1];return {attributes:s,startTime:l.startTime,endTime:o,value:l.toPointValue()}}),isMonotonic:this.monotonic}},t}();var Tu=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),Oo=function(){function t(){}return t.Drop=function(){return hH},t.Sum=function(){return gH},t.LastValue=function(){return bH},t.Histogram=function(){return yH},t.ExponentialHistogram=function(){return afe},t.Default=function(){return sfe},t}();var cH=function(t){Tu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.createAggregator=function(n){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new GP,e}(Oo);var uH=function(t){Tu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.createAggregator=function(n){switch(n.type){case Ue.COUNTER:case Ue.OBSERVABLE_COUNTER:case Ue.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new rT(true),e.NON_MONOTONIC_INSTANCE=new rT(false),e}(Oo);var dH=function(t){Tu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.createAggregator=function(n){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new eI,e}(Oo);var mH=function(t){Tu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.createAggregator=function(n){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new XE([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],true),e}(Oo);var vu=function(t){Tu(e,t);function e(n,r){r===void 0&&(r=true);var o=t.call(this)||this;if(o._recordMinMax=r,n==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");n=n.concat(),n=n.sort(function(s,l){return s-l});var i=n.lastIndexOf(-1/0),a=n.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=n.slice(i+1,a),o}return e.prototype.createAggregator=function(n){return new XE(this._boundaries,this._recordMinMax)},e}(Oo);var pH=function(t){Tu(e,t);function e(n,r){n===void 0&&(n=160),r===void 0&&(r=true);var o=t.call(this)||this;return o._maxSize=n,o._recordMinMax=r,o}return e.prototype.createAggregator=function(n){return new QP(this._maxSize,this._recordMinMax)},e}(Oo);var fH=function(t){Tu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype._resolve=function(n){switch(n.type){case Ue.COUNTER:case Ue.UP_DOWN_COUNTER:case Ue.OBSERVABLE_COUNTER:case Ue.OBSERVABLE_UP_DOWN_COUNTER:return gH;case Ue.GAUGE:case Ue.OBSERVABLE_GAUGE:return bH;case Ue.HISTOGRAM:return n.advice.explicitBucketBoundaries?new vu(n.advice.explicitBucketBoundaries):yH}return aT.diag.warn("Unable to recognize instrument type: "+n.type),hH},e.prototype.createAggregator=function(n){return this._resolve(n).createAggregator(n)},e}(Oo);var hH=new cH,gH=new uH,bH=new dH,yH=new mH,afe=new pH,sfe=new fH;var SH=function(t){return Oo.Default()},EH=function(t){return Wr.CUMULATIVE};var tI=function(t,e,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(t,[])).next());})},nI=function(t,e){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=e.call(t,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:true}}},TH=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},lfe=function(t,e,n){if(arguments.length===2)for(var r=0,o=e.length,i;r<o;r++)(i||!(r in e))&&(i||(i=Array.prototype.slice.call(e,0,r)),i[r]=e[r]);return t.concat(i||Array.prototype.slice.call(e))},vH=function(){function t(e){var n,r,o;this._shutdown=false,this._aggregationSelector=(n=e?.aggregationSelector)!==null&&n!==void 0?n:SH,this._aggregationTemporalitySelector=(r=e?.aggregationTemporalitySelector)!==null&&r!==void 0?r:EH,this._metricProducers=(o=e?.metricProducers)!==null&&o!==void 0?o:[],this._cardinalitySelector=e?.cardinalitySelector;}return t.prototype.setMetricProducer=function(e){if(this._sdkMetricProducer)throw new Error("MetricReader can not be bound to a MeterProvider again.");this._sdkMetricProducer=e,this.onInitialized();},t.prototype.selectAggregation=function(e){return this._aggregationSelector(e)},t.prototype.selectAggregationTemporality=function(e){return this._aggregationTemporalitySelector(e)},t.prototype.selectCardinalityLimit=function(e){return this._cardinalitySelector?this._cardinalitySelector(e):2e3},t.prototype.onInitialized=function(){},t.prototype.collect=function(e){return tI(this,void 0,void 0,function(){var n,r,o,i,a,s;return nI(this,function(l){switch(l.label){case 0:if(this._sdkMetricProducer===void 0)throw new Error("MetricReader is not bound to a MetricProducer");if(this._shutdown)throw new Error("MetricReader is shutdown");return [4,Promise.all(lfe([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],TH(this._metricProducers.map(function(c){return c.collect({timeoutMillis:e?.timeoutMillis})})),false))];case 1:return n=TH.apply(void 0,[l.sent()]),r=n[0],o=n.slice(1),i=r.errors.concat(WP(o,function(c){return c.errors})),a=r.resourceMetrics.resource,s=r.resourceMetrics.scopeMetrics.concat(WP(o,function(c){return c.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:s},errors:i}]}})})},t.prototype.shutdown=function(e){return tI(this,void 0,void 0,function(){return nI(this,function(n){switch(n.label){case 0:return this._shutdown?(aT.diag.error("Cannot call shutdown twice."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onShutdown()];case 1:return n.sent(),[3,4];case 2:return [4,Hl(this.onShutdown(),e.timeoutMillis)];case 3:n.sent(),n.label=4;case 4:return this._shutdown=true,[2]}})})},t.prototype.forceFlush=function(e){return tI(this,void 0,void 0,function(){return nI(this,function(n){switch(n.label){case 0:return this._shutdown?(aT.diag.warn("Cannot forceFlush on already shutdown MetricReader."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onForceFlush()];case 1:return n.sent(),[2];case 2:return [4,Hl(this.onForceFlush(),e.timeoutMillis)];case 3:return n.sent(),[2]}})})},t}();var cfe=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),oT=function(t,e,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(t,[])).next());})},iT=function(t,e){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=e.call(t,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:true}}},ufe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},dfe=function(t,e,n){if(arguments.length===2)for(var r=0,o=e.length,i;r<o;r++)(i||!(r in e))&&(i||(i=Array.prototype.slice.call(e,0,r)),i[r]=e[r]);return t.concat(i||Array.prototype.slice.call(e))},oI=function(t){cfe(e,t);function e(n){var r,o,i,a,s=t.call(this,{aggregationSelector:(r=n.exporter.selectAggregation)===null||r===void 0?void 0:r.bind(n.exporter),aggregationTemporalitySelector:(o=n.exporter.selectAggregationTemporality)===null||o===void 0?void 0:o.bind(n.exporter),metricProducers:n.metricProducers})||this;if(n.exportIntervalMillis!==void 0&&n.exportIntervalMillis<=0)throw Error("exportIntervalMillis must be greater than 0");if(n.exportTimeoutMillis!==void 0&&n.exportTimeoutMillis<=0)throw Error("exportTimeoutMillis must be greater than 0");if(n.exportTimeoutMillis!==void 0&&n.exportIntervalMillis!==void 0&&n.exportIntervalMillis<n.exportTimeoutMillis)throw Error("exportIntervalMillis must be greater than or equal to exportTimeoutMillis");return s._exportInterval=(i=n.exportIntervalMillis)!==null&&i!==void 0?i:6e4,s._exportTimeout=(a=n.exportTimeoutMillis)!==null&&a!==void 0?a:3e4,s._exporter=n.exporter,s}return e.prototype._runOnce=function(){return oT(this,void 0,void 0,function(){var n;return iT(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,Hl(this._doRun(),this._exportTimeout)];case 1:return r.sent(),[3,3];case 2:return n=r.sent(),n instanceof HP?(aT.diag.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(GE(n),[3,3]);case 3:return [2]}})})},e.prototype._doRun=function(){var n,r;return oT(this,void 0,void 0,function(){var o,i,a,s,l,c;return iT(this,function(u){switch(u.label){case 0:return [4,this.collect({timeoutMillis:this._exportTimeout})];case 1:if(o=u.sent(),i=o.resourceMetrics,a=o.errors,a.length>0&&(c=aT.diag).error.apply(c,dfe(["PeriodicExportingMetricReader: metrics collection errors"],ufe(a),false)),!i.resource.asyncAttributesPending)return [3,5];u.label=2;case 2:return u.trys.push([2,4,,5]),[4,(r=(n=i.resource).waitForAsyncAttributes)===null||r===void 0?void 0:r.call(n)];case 3:return u.sent(),[3,5];case 4:return s=u.sent(),aT.diag.debug("Error while resolving async portion of resource: ",s),GE(s),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,$j._export(this._exporter,i)];case 6:if(l=u.sent(),l.code!==ni.SUCCESS)throw new Error("PeriodicExportingMetricReader: metrics export failed (error "+l.error+")");return [2]}})})},e.prototype.onInitialized=function(){var n=this;this._interval=setInterval(function(){n._runOnce();},this._exportInterval),rg(this._interval);},e.prototype.onForceFlush=function(){return oT(this,void 0,void 0,function(){return iT(this,function(n){switch(n.label){case 0:return [4,this._runOnce()];case 1:return n.sent(),[4,this._exporter.forceFlush()];case 2:return n.sent(),[2]}})})},e.prototype.onShutdown=function(){return oT(this,void 0,void 0,function(){return iT(this,function(n){switch(n.label){case 0:return this._interval&&clearInterval(this._interval),[4,this.onForceFlush()];case 1:return n.sent(),[4,this._exporter.shutdown()];case 2:return n.sent(),[2]}})})},e}(vH);var CH=function(){function t(){this._registeredViews=[];}return t.prototype.addView=function(e){this._registeredViews.push(e);},t.prototype.findViews=function(e,n){var r=this,o=this._registeredViews.filter(function(i){return r._matchInstrument(i.instrumentSelector,e)&&r._matchMeter(i.meterSelector,n)});return o},t.prototype._matchInstrument=function(e,n){return (e.getType()===void 0||n.type===e.getType())&&e.getNameFilter().match(n.name)&&e.getUnitFilter().match(n.unit)},t.prototype._matchMeter=function(e,n){return e.getNameFilter().match(n.name)&&(n.version===void 0||e.getVersionFilter().match(n.version))&&(n.schemaUrl===void 0||e.getSchemaUrlFilter().match(n.schemaUrl))},t}();var Cu=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),lT=function(){function t(e,n){this._writableMetricStorage=e,this._descriptor=n;}return t.prototype._record=function(e,n,r){if(n===void 0&&(n={}),r===void 0&&(r=context.active()),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,n,r,Eu(Date.now()));},t}();var wH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(n,r,o){this._record(n,r,o);},e}(lT);var AH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(n,r,o){if(n<0){diag.warn("negative value provided to counter "+this._descriptor.name+": "+n);return}this._record(n,r,o);},e}(lT);var RH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(n,r,o){this._record(n,r,o);},e}(lT);var xH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(n,r,o){if(n<0){diag.warn("negative value provided to histogram "+this._descriptor.name+": "+n);return}this._record(n,r,o);},e}(lT);var cT=function(){function t(e,n,r){this._observableRegistry=r,this._descriptor=e,this._metricStorages=n;}return t.prototype.addCallback=function(e){this._observableRegistry.addCallback(e,this);},t.prototype.removeCallback=function(e){this._observableRegistry.removeCallback(e,this);},t}();var MH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(cT);var PH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(cT);var IH=function(t){Cu(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(cT);function sg(t){return t instanceof cT}var _H=function(){function t(e){this._meterSharedState=e;}return t.prototype.createGauge=function(e,n){var r=Ya(e,Ue.GAUGE,n),o=this._meterSharedState.registerMetricStorage(r);return new RH(o,r)},t.prototype.createHistogram=function(e,n){var r=Ya(e,Ue.HISTOGRAM,n),o=this._meterSharedState.registerMetricStorage(r);return new xH(o,r)},t.prototype.createCounter=function(e,n){var r=Ya(e,Ue.COUNTER,n),o=this._meterSharedState.registerMetricStorage(r);return new AH(o,r)},t.prototype.createUpDownCounter=function(e,n){var r=Ya(e,Ue.UP_DOWN_COUNTER,n),o=this._meterSharedState.registerMetricStorage(r);return new wH(o,r)},t.prototype.createObservableGauge=function(e,n){var r=Ya(e,Ue.OBSERVABLE_GAUGE,n),o=this._meterSharedState.registerAsyncMetricStorage(r);return new PH(r,o,this._meterSharedState.observableRegistry)},t.prototype.createObservableCounter=function(e,n){var r=Ya(e,Ue.OBSERVABLE_COUNTER,n),o=this._meterSharedState.registerAsyncMetricStorage(r);return new MH(r,o,this._meterSharedState.observableRegistry)},t.prototype.createObservableUpDownCounter=function(e,n){var r=Ya(e,Ue.OBSERVABLE_UP_DOWN_COUNTER,n),o=this._meterSharedState.registerAsyncMetricStorage(r);return new IH(r,o,this._meterSharedState.observableRegistry)},t.prototype.addBatchObservableCallback=function(e,n){this._meterSharedState.observableRegistry.addBatchCallback(e,n);},t.prototype.removeBatchObservableCallback=function(e,n){this._meterSharedState.observableRegistry.removeBatchCallback(e,n);},t}();var uT=function(){function t(e){this._instrumentDescriptor=e;}return t.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},t.prototype.updateDescription=function(e){this._instrumentDescriptor=Ya(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice});},t}();var ffe=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),OH=function(t,e){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=e.call(t,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:true}}},hfe=function(){function t(e){this._hash=e,this._valueMap=new Map,this._keyMap=new Map;}return t.prototype.get=function(e,n){return n??(n=this._hash(e)),this._valueMap.get(n)},t.prototype.getOrDefault=function(e,n){var r=this._hash(e);if(this._valueMap.has(r))return this._valueMap.get(r);var o=n();return this._keyMap.has(r)||this._keyMap.set(r,e),this._valueMap.set(r,o),o},t.prototype.set=function(e,n,r){r??(r=this._hash(e)),this._keyMap.has(r)||this._keyMap.set(r,e),this._valueMap.set(r,n);},t.prototype.has=function(e,n){return n??(n=this._hash(e)),this._valueMap.has(n)},t.prototype.keys=function(){var e,n;return OH(this,function(r){switch(r.label){case 0:e=this._keyMap.entries(),n=e.next(),r.label=1;case 1:return n.done===true?[3,3]:[4,[n.value[1],n.value[0]]];case 2:return r.sent(),n=e.next(),[3,1];case 3:return [2]}})},t.prototype.entries=function(){var e,n;return OH(this,function(r){switch(r.label){case 0:e=this._valueMap.entries(),n=e.next(),r.label=1;case 1:return n.done===true?[3,3]:[4,[this._keyMap.get(n.value[0]),n.value[1],n.value[0]]];case 2:return r.sent(),n=e.next(),[3,1];case 3:return [2]}})},Object.defineProperty(t.prototype,"size",{get:function(){return this._valueMap.size},enumerable:false,configurable:true}),t}();var ia=function(t){ffe(e,t);function e(){return t.call(this,KE)||this}return e}(hfe);var gfe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},dT=function(){function t(e,n){this._aggregator=e,this._activeCollectionStorage=new ia,this._cumulativeMemoStorage=new ia,this._overflowAttributes={"otel.metric.overflow":true},this._cardinalityLimit=(n??2e3)-1,this._overflowHashCode=KE(this._overflowAttributes);}return t.prototype.record=function(e,n,r,o){var i=this,a=this._activeCollectionStorage.get(n);if(!a){if(this._activeCollectionStorage.size>=this._cardinalityLimit){var s=this._activeCollectionStorage.getOrDefault(this._overflowAttributes,function(){return i._aggregator.createAccumulation(o)});s?.record(e);return}a=this._aggregator.createAccumulation(o),this._activeCollectionStorage.set(n,a);}a?.record(e);},t.prototype.batchCumulate=function(e,n){var r=this;Array.from(e.entries()).forEach(function(o){var i=gfe(o,3),a=i[0],s=i[1],l=i[2],c=r._aggregator.createAccumulation(n);c?.record(s);var u=c;if(r._cumulativeMemoStorage.has(a,l)){var d=r._cumulativeMemoStorage.get(a,l);u=r._aggregator.diff(d,c);}else if(r._cumulativeMemoStorage.size>=r._cardinalityLimit&&(a=r._overflowAttributes,l=r._overflowHashCode,r._cumulativeMemoStorage.has(a,l))){var d=r._cumulativeMemoStorage.get(a,l);u=r._aggregator.diff(d,c);}if(r._activeCollectionStorage.has(a,l)){var m=r._activeCollectionStorage.get(a,l);u=r._aggregator.merge(m,u);}r._cumulativeMemoStorage.set(a,c,l),r._activeCollectionStorage.set(a,u,l);});},t.prototype.collect=function(){var e=this._activeCollectionStorage;return this._activeCollectionStorage=new ia,e},t}();var iI=function(t){var e=typeof Symbol=="function"&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&typeof t.length=="number")return {next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},DH=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},mT=function(){function t(e,n){var r=this;this._aggregator=e,this._unreportedAccumulations=new Map,this._reportHistory=new Map,n.forEach(function(o){r._unreportedAccumulations.set(o,[]);});}return t.prototype.buildMetrics=function(e,n,r,o){this._stashAccumulations(r);var i=this._getMergedUnreportedAccumulations(e),a=i,s;if(this._reportHistory.has(e)){var l=this._reportHistory.get(e),c=l.collectionTime;s=l.aggregationTemporality,s===Wr.CUMULATIVE?a=t.merge(l.accumulations,i,this._aggregator):a=t.calibrateStartTime(l.accumulations,i,c);}else s=e.selectAggregationTemporality(n.type);this._reportHistory.set(e,{accumulations:a,collectionTime:o,aggregationTemporality:s});var u=bfe(a);if(u.length!==0)return this._aggregator.toMetricData(n,s,u,o)},t.prototype._stashAccumulations=function(e){var n,r,o=this._unreportedAccumulations.keys();try{for(var i=iI(o),a=i.next();!a.done;a=i.next()){var s=a.value,l=this._unreportedAccumulations.get(s);l===void 0&&(l=[],this._unreportedAccumulations.set(s,l)),l.push(e);}}catch(c){n={error:c};}finally{try{a&&!a.done&&(r=i.return)&&r.call(i);}finally{if(n)throw n.error}}},t.prototype._getMergedUnreportedAccumulations=function(e){var n,r,o=new ia,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=iI(i),s=a.next();!s.done;s=a.next()){var l=s.value;o=t.merge(o,l,this._aggregator);}}catch(c){n={error:c};}finally{try{s&&!s.done&&(r=a.return)&&r.call(a);}finally{if(n)throw n.error}}return o},t.merge=function(e,n,r){for(var o=e,i=n.entries(),a=i.next();a.done!==true;){var s=DH(a.value,3),l=s[0],c=s[1],u=s[2];if(e.has(l,u)){var d=e.get(l,u),m=r.merge(d,c);o.set(l,m,u);}else o.set(l,c,u);a=i.next();}return o},t.calibrateStartTime=function(e,n,r){var o,i;try{for(var a=iI(e.keys()),s=a.next();!s.done;s=a.next()){var l=DH(s.value,2),c=l[0],u=l[1],d=n.get(c,u);d?.setStartTime(r);}}catch(m){o={error:m};}finally{try{s&&!s.done&&(i=a.return)&&i.call(a);}finally{if(o)throw o.error}}return n},t}();function bfe(t){return Array.from(t.entries())}var yfe=function(){var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},t(e,n)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function r(){this.constructor=e;}e.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),Sfe=function(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var r=n.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},NH=function(t){yfe(e,t);function e(n,r,o,i,a){var s=t.call(this,n)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new dT(r,s._aggregationCardinalityLimit),s._temporalMetricStorage=new mT(r,i),s}return e.prototype.record=function(n,r){var o=this,i=new ia;Array.from(n.entries()).forEach(function(a){var s=Sfe(a,2),l=s[0],c=s[1];i.set(o._attributesProcessor.process(l),c);}),this._deltaMetricStorage.batchCumulate(i,r);},e.prototype.collect=function(n,r){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(n,this._instrumentDescriptor,o,r)},e}(uT);function aI(t,e){var n="";return t.unit!==e.unit&&(n+=" - Unit '"+t.unit+"' does not match '"+e.unit+`'
|
|
171
171
|
`),t.type!==e.type&&(n+=" - Type '"+t.type+"' does not match '"+e.type+`'
|
|
172
172
|
`),t.valueType!==e.valueType&&(n+=" - Value Type '"+t.valueType+"' does not match '"+e.valueType+`'
|
|
173
173
|
`),t.description!==e.description&&(n+=" - Description '"+t.description+"' does not match '"+e.description+`'
|
|
@@ -186,11 +186,11 @@ To resolve the conflict:`,sI(c,e))),i=l):aT.diag.warn("A view or instrument with
|
|
|
186
186
|
`);if(n<1||n>r.length)return;let o=Math.max(1,n-KW),i=Math.min(r.length,n+KW),a=String(i).length,s=[];for(let l=o;l<=i;l++){let c=l===n?rge:nge;s.push(`${c}${String(l).padStart(a)} | ${r[l-1]??""}`);}return s.join(`
|
|
187
187
|
`)}var JW="\r",ZW="\x1B[1A",QW="\x1B[J",sge="\u280B\u2819\u2839\u2838\u283C\u2834\u2826\u2827\u2807\u280F",lge="|/-\\",cge="#0891b2",uge={pass:{glyph:"\u2713",ascii:"v",paint:Qi.green},fail:{glyph:"\u2718",ascii:"x",paint:Qi.red},skip:{glyph:"\u2212",ascii:"-",paint:Qi.dim},cancel:{glyph:"\u2298",ascii:"o",paint:Qi.yellow},retry:{glyph:"\u21BB",ascii:"~",paint:Qi.yellow}};function fg(t){let e=t.colorLevel>0&&t.isTTY,n=(r,o)=>e?o(r):r;return {unicode:t.unicode,color:e,bold:r=>n(r,Qi.bold),dim:r=>n(r,Qi.gray),code:r=>n(r,Qi.hex(cge)),spinner:r=>{let o=t.unicode?sge:lge,i=(r%o.length+o.length)%o.length;return n(o.charAt(i),Qi.cyan)},statusGlyph:r=>{let o=uge[r],i=t.unicode?o.glyph:o.ascii;return e?o.paint(i):i},separator:t.unicode?" \xB7 ":" | "}}function eG(t,e=""){let n=process.stdout?.columns||process.stderr?.columns||80,r=Math.max(n-e.length,20),o=[];for(let i of t.split(`
|
|
188
188
|
`)){let a="";for(let s of i.split(" ")){if(!a.length){a=s;continue}let l=`${a} ${s}`;if(l.length<=r){a=l;continue}o.push(e+a),a=s;}o.push(e+a);}return o.join(`
|
|
189
|
-
`)}var dge={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}},mge={PASSED:"PASS",FAILED:"FAIL",CANCELLED:"CANCEL",RETRYING:"RETRY",RUNNING:"RUNNING",SKIP:"SKIP",RUN:"RUNNING",RETRY:"RETRY"};function tG(t,e,n=0){let r=mge[t];if(!r)return;let o=fg(e);if(r==="RUNNING")return {badge:o.spinner(n),isTerminal:false};let{glyph:i,isTerminal:a}=dge[r];return {badge:o.statusGlyph(i),isTerminal:a}}function ql(t,e){return !e.isTTY||e.colorLevel===0?t:`\x1B]8;;${t}\x07${t}\x1B]8;;\x07`}function nG(){let t=vj(),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&&(P.log(""),P.warn(`Machine was under pressure during this run (${e.join(", ")}). Slowdowns and timeouts may be related.`));}var Lt=xm({app:"cli",hostname:hostname(),disableConsoleLogs:true}).child({cliVersion:"0.111.
|
|
189
|
+
`)}var dge={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}},mge={PASSED:"PASS",FAILED:"FAIL",CANCELLED:"CANCEL",RETRYING:"RETRY",RUNNING:"RUNNING",SKIP:"SKIP",RUN:"RUNNING",RETRY:"RETRY"};function tG(t,e,n=0){let r=mge[t];if(!r)return;let o=fg(e);if(r==="RUNNING")return {badge:o.spinner(n),isTerminal:false};let{glyph:i,isTerminal:a}=dge[r];return {badge:o.statusGlyph(i),isTerminal:a}}function ql(t,e){return !e.isTTY||e.colorLevel===0?t:`\x1B]8;;${t}\x07${t}\x1B]8;;\x07`}function nG(){let t=vj(),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&&(P.log(""),P.warn(`Machine was under pressure during this run (${e.join(", ")}). Slowdowns and timeouts may be related.`));}var Lt=xm({app:"cli",hostname:hostname(),disableConsoleLogs:true}).child({cliVersion:"0.111.1"});function RI(t){if(!t)return;t=t.toLowerCase();let e=DS.safeParse(t);if(e.success)return P.setMinLevel(e.data),e.data}var Au=" ";function rG(t){let e={passed:[],failed:[],cancelled:[],quarantinedPassed:[],quarantinedFailed:[]};for(let n of t)switch(n.status){case "PASSED":(n.quarantined?e.quarantinedPassed:e.passed).push(n);break;case "FAILED":(n.quarantined?e.quarantinedFailed:e.failed).push(n);break;case "CANCELLED":e.cancelled.push(n);break}return e}function oG(t){let e=rG(t),n=e.failed.filter(o=>o.failureDetails?.classification?.action==="heal"),r=e.failed.filter(o=>o.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:n.length,warnElectedFailures:r.length}}function iG(t,{onlyQuarantined:e=false,overrideExitCode:n=false}={}){let r=n?t.healElectedFailures+t.warnElectedFailures:0,o=t.failed-r,i=e?t.quarantinedFailed:0;return o+i>0||t.cancelled>0}function aG({results:t,startTime:e,getPath:n,getUrl:r,printFailureBody:o,getCancellationReason:i,recoveredCount:a,skippedCount:s,videoRecordingActive:l}){let{passed:c,failed:u,cancelled:d,quarantinedPassed:m,quarantinedFailed:p}=rG(t),f=qr(),h=f.unicode?"\u2500":"-",b=process.stdout?.columns||80,y=(S,T,C,w)=>{let _=` ${T+1}) ${n(S)} `,N=Math.max(3,b-_.length-2);P.log(""),P.log(C(`${_}${h.repeat(N)}`)),P.log(""),w();let I=r(S);I&&(P.log(""),P.log(`${Au}${ql(I,f)}`));};GW(()=>{u.forEach((I,A)=>{y(I,A,Qi.red.bold,()=>o?.(I));}),d.forEach((I,A)=>{y(I,u.length+A,Qi.yellow.bold,()=>{let z=i?.(I)??"Cancelled";P.log(`${Au}${Qi.yellow.bold(z)}`);});});let S=(I,A,z)=>{I.length!==0&&(P.log(""),P.log(` ${z(`${I.length} ${A}`)}`),I.forEach(D=>{P.dimmed(`${Au}${n(D)}`);}));};S(u,"failed",Qi.red.bold),S(p,"failed",I=>Qi.red.bold(`${I} (quarantined)`)),S(d,"cancelled",Qi.yellow.bold),s&&(P.log(""),P.log(` ${Qi.yellow.bold(`${s} skipped`)}`));let T=c.length+m.length,C=Math.max(1,Math.round((Date.now()-e)/1e3)),w=[];m.length>0&&w.push(`${m.length} quarantined`),a&&a>0&&w.push(`${a} recovered`);let _=w.length>0?` (${w.join(", ")})`:"",N=fge(t,f,l);P.log(""),P.log(` ${Qi.green.bold(`${T} passed${_} (${C}s)`)}${N}`),nG();});}function fge(t,e,n=false){let r=t.length;if(r===0)return "";let o=t.filter(s=>s.usedRemoteBrowser).length;return o===0?"":`${e.unicode?" \xB7 ":" | "}${o}/${r} ran on remote browser${n?" (video saved async)":""}`}function sG(t){if(!t.failureDetails||!t.failureReason)return;let e=El({failureReason:t.failureReason,classification:t.failureDetails.classification,manualClassification:t.failureDetails.manualClassification}),n=e.title??t.failureReason,r=t.failureDetails.classification?.rootCause??e.description??e.title??t.failureReason;P.log(`${Au}${Qi.red.bold(n)}`),r&&r!==n&&(P.log(""),P.log(eG(r,Au)));let o=YW({failureDetails:t.failureDetails,filePath:t.filePath,results:t.results,beforeResults:t.beforeResults,afterResults:t.afterResults});o&&(P.log(""),P.log(o));let i=t.failureDetails.classification?.citations;if(i&&i.length>0){P.log(""),P.log(`${Au}${Qi.bold("Sources:")}`);for(let a of i)P.log(`${Au} [${a.refId}] ${a.title}`);}}var lG=" ".repeat(6);var hge=(t,e,n,r)=>{if(n==="length"||n==="prototype"||n==="arguments"||n==="caller")return;let o=Object.getOwnPropertyDescriptor(t,n),i=Object.getOwnPropertyDescriptor(e,n);!gge(o,i)&&r||Object.defineProperty(t,n,i);},gge=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)},bge=(t,e)=>{let n=Object.getPrototypeOf(e);n!==Object.getPrototypeOf(t)&&Object.setPrototypeOf(t,n);},yge=(t,e)=>`/* Wrapped ${t}*/
|
|
190
190
|
${e}`,Sge=Object.getOwnPropertyDescriptor(Function.prototype,"toString"),Ege=Object.getOwnPropertyDescriptor(Function.prototype.toString,"name"),Tge=(t,e,n)=>{let r=n===""?"":`with ${n.trim()}() `,o=yge.bind(null,r,e.toString());Object.defineProperty(o,"name",Ege);let{writable:i,enumerable:a,configurable:s}=Sge;Object.defineProperty(t,"toString",{value:o,writable:i,enumerable:a,configurable:s});};function xI(t,e,{ignoreNonConfigurable:n=false}={}){let{name:r}=t;for(let o of Reflect.ownKeys(e))hge(t,e,o,n);return bge(t,e),Tge(t,e,r),t}var RT=new WeakMap,cG=(t,e={})=>{if(typeof t!="function")throw new TypeError("Expected a function");let n,r=0,o=t.displayName||t.name||"<anonymous>",i=function(...a){if(RT.set(i,++r),r===1)n=t.apply(this,a),t=void 0;else if(e.throw===true)throw new Error(`Function \`${o}\` can only be called once`);return n};return xI(i,t),RT.set(i,r),i};cG.callCount=t=>{if(!RT.has(t))throw new Error(`The given function \`${t.name}\` is not wrapped by the \`onetime\` package`);return RT.get(t)};var uG=cG;var Ru=[];Ru.push("SIGHUP","SIGINT","SIGTERM");process.platform!=="win32"&&Ru.push("SIGALRM","SIGABRT","SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&Ru.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT");var xT=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",MI=Symbol.for("signal-exit emitter"),PI=globalThis,vge=Object.defineProperty.bind(Object),II=class{emitted={afterExit:false,exit:false};listeners={afterExit:[],exit:[]};count=0;id=Math.random();constructor(){if(PI[MI])return PI[MI];vge(PI,MI,{value:this,writable:false,enumerable:false,configurable:false});}on(e,n){this.listeners[e].push(n);}removeListener(e,n){let r=this.listeners[e],o=r.indexOf(n);o!==-1&&(o===0&&r.length===1?r.length=0:r.splice(o,1));}emit(e,n,r){if(this.emitted[e])return false;this.emitted[e]=true;let o=false;for(let i of this.listeners[e])o=i(n,r)===true||o;return e==="exit"&&(o=this.emit("afterExit",n,r)||o),o}},MT=class{},Cge=t=>({onExit(e,n){return t.onExit(e,n)},load(){return t.load()},unload(){return t.unload()}}),_I=class extends MT{onExit(){return ()=>{}}load(){}unload(){}},OI=class extends MT{#a=DI.platform==="win32"?"SIGINT":"SIGHUP";#n=new II;#e;#o;#m;#t={};#i=false;constructor(e){super(),this.#e=e,this.#t={};for(let n of Ru)this.#t[n]=()=>{let r=this.#e.listeners(n),{count:o}=this.#n,i=e;if(typeof i.__signal_exit_emitter__=="object"&&typeof i.__signal_exit_emitter__.count=="number"&&(o+=i.__signal_exit_emitter__.count),r.length===o){this.unload();let a=this.#n.emit("exit",null,n),s=n==="SIGHUP"?this.#a:n;a||e.kill(e.pid,s);}};this.#m=e.reallyExit,this.#o=e.emit;}onExit(e,n){if(!xT(this.#e))return ()=>{};this.#i===false&&this.load();let r=n?.alwaysLast?"afterExit":"exit";return this.#n.on(r,e),()=>{this.#n.removeListener(r,e),this.#n.listeners.exit.length===0&&this.#n.listeners.afterExit.length===0&&this.unload();}}load(){if(!this.#i){this.#i=true,this.#n.count+=1;for(let e of Ru)try{let n=this.#t[e];n&&this.#e.on(e,n);}catch{}this.#e.emit=(e,...n)=>this.#p(e,...n),this.#e.reallyExit=e=>this.#r(e);}}unload(){this.#i&&(this.#i=false,Ru.forEach(e=>{let n=this.#t[e];if(!n)throw new Error("Listener not defined for signal: "+e);try{this.#e.removeListener(e,n);}catch{}}),this.#e.emit=this.#o,this.#e.reallyExit=this.#m,this.#n.count-=1);}#r(e){return xT(this.#e)?(this.#e.exitCode=e||0,this.#n.emit("exit",this.#e.exitCode,null),this.#m.call(this.#e,this.#e.exitCode)):0}#p(e,...n){let r=this.#o;if(e==="exit"&&xT(this.#e)){typeof n[0]=="number"&&(this.#e.exitCode=n[0]);let o=r.call(this.#e,e,...n);return this.#n.emit("exit",this.#e.exitCode,null),o}else return r.call(this.#e,e,...n)}},DI=globalThis.process,{onExit:dG}=Cge(xT(DI)?new OI(DI):new _I);var mG=aa.stderr.isTTY?aa.stderr:aa.stdout.isTTY?aa.stdout:void 0,wge=mG?uG(()=>{dG(()=>{mG.write("\x1B[?25h");},{alwaysLast:true});}):()=>{},pG=wge;var IT=false,Fm={};Fm.show=(t=aa.stderr)=>{t.isTTY&&(IT=false,t.write("\x1B[?25h"));};Fm.hide=(t=aa.stderr)=>{t.isTTY&&(pG(),IT=true,t.write("\x1B[?25l"));};Fm.toggle=(t,e)=>{t!==void 0&&(IT=t),IT?Fm.show(e):Fm.hide(e);};var NI=Fm;var bg=_f(LI());function kI(){return aa.platform!=="win32"?aa.env.TERM!=="linux":!!aa.env.CI||!!aa.env.WT_SESSION||!!aa.env.TERMINUS_SUBLIME||aa.env.ConEmuTask==="{cmd::Cmder}"||aa.env.TERM_PROGRAM==="Terminus-Sublime"||aa.env.TERM_PROGRAM==="vscode"||aa.env.TERM==="xterm-256color"||aa.env.TERM==="alacritty"||aa.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var Rge={info:Qi.blue("\u2139"),success:Qi.green("\u2714"),warning:Qi.yellow("\u26A0"),error:Qi.red("\u2716")},xge={info:Qi.blue("i"),success:Qi.green("\u221A"),warning:Qi.yellow("\u203C"),error:Qi.red("\xD7")},Mge=kI()?Rge:xge,hg=Mge;function FI({onlyFirst:t=false}={}){let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t?void 0:"g")}var Pge=FI();function gg(t){if(typeof t!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof t}\``);return t.replace(Pge,"")}function yG(t){return t===161||t===164||t===167||t===168||t===170||t===173||t===174||t>=176&&t<=180||t>=182&&t<=186||t>=188&&t<=191||t===198||t===208||t===215||t===216||t>=222&&t<=225||t===230||t>=232&&t<=234||t===236||t===237||t===240||t===242||t===243||t>=247&&t<=250||t===252||t===254||t===257||t===273||t===275||t===283||t===294||t===295||t===299||t>=305&&t<=307||t===312||t>=319&&t<=322||t===324||t>=328&&t<=331||t===333||t===338||t===339||t===358||t===359||t===363||t===462||t===464||t===466||t===468||t===470||t===472||t===474||t===476||t===593||t===609||t===708||t===711||t>=713&&t<=715||t===717||t===720||t>=728&&t<=731||t===733||t===735||t>=768&&t<=879||t>=913&&t<=929||t>=931&&t<=937||t>=945&&t<=961||t>=963&&t<=969||t===1025||t>=1040&&t<=1103||t===1105||t===8208||t>=8211&&t<=8214||t===8216||t===8217||t===8220||t===8221||t>=8224&&t<=8226||t>=8228&&t<=8231||t===8240||t===8242||t===8243||t===8245||t===8251||t===8254||t===8308||t===8319||t>=8321&&t<=8324||t===8364||t===8451||t===8453||t===8457||t===8467||t===8470||t===8481||t===8482||t===8486||t===8491||t===8531||t===8532||t>=8539&&t<=8542||t>=8544&&t<=8555||t>=8560&&t<=8569||t===8585||t>=8592&&t<=8601||t===8632||t===8633||t===8658||t===8660||t===8679||t===8704||t===8706||t===8707||t===8711||t===8712||t===8715||t===8719||t===8721||t===8725||t===8730||t>=8733&&t<=8736||t===8739||t===8741||t>=8743&&t<=8748||t===8750||t>=8756&&t<=8759||t===8764||t===8765||t===8776||t===8780||t===8786||t===8800||t===8801||t>=8804&&t<=8807||t===8810||t===8811||t===8814||t===8815||t===8834||t===8835||t===8838||t===8839||t===8853||t===8857||t===8869||t===8895||t===8978||t>=9312&&t<=9449||t>=9451&&t<=9547||t>=9552&&t<=9587||t>=9600&&t<=9615||t>=9618&&t<=9621||t===9632||t===9633||t>=9635&&t<=9641||t===9650||t===9651||t===9654||t===9655||t===9660||t===9661||t===9664||t===9665||t>=9670&&t<=9672||t===9675||t>=9678&&t<=9681||t>=9698&&t<=9701||t===9711||t===9733||t===9734||t===9737||t===9742||t===9743||t===9756||t===9758||t===9792||t===9794||t===9824||t===9825||t>=9827&&t<=9829||t>=9831&&t<=9834||t===9836||t===9837||t===9839||t===9886||t===9887||t===9919||t>=9926&&t<=9933||t>=9935&&t<=9939||t>=9941&&t<=9953||t===9955||t===9960||t===9961||t>=9963&&t<=9969||t===9972||t>=9974&&t<=9977||t===9979||t===9980||t===9982||t===9983||t===10045||t>=10102&&t<=10111||t>=11094&&t<=11097||t>=12872&&t<=12879||t>=57344&&t<=63743||t>=65024&&t<=65039||t===65533||t>=127232&&t<=127242||t>=127248&&t<=127277||t>=127280&&t<=127337||t>=127344&&t<=127373||t===127375||t===127376||t>=127387&&t<=127404||t>=917760&&t<=917999||t>=983040&&t<=1048573||t>=1048576&&t<=1114109}function SG(t){return t===12288||t>=65281&&t<=65376||t>=65504&&t<=65510}function EG(t){return t>=4352&&t<=4447||t===8986||t===8987||t===9001||t===9002||t>=9193&&t<=9196||t===9200||t===9203||t===9725||t===9726||t===9748||t===9749||t>=9776&&t<=9783||t>=9800&&t<=9811||t===9855||t>=9866&&t<=9871||t===9875||t===9889||t===9898||t===9899||t===9917||t===9918||t===9924||t===9925||t===9934||t===9940||t===9962||t===9970||t===9971||t===9973||t===9978||t===9981||t===9989||t===9994||t===9995||t===10024||t===10060||t===10062||t>=10067&&t<=10069||t===10071||t>=10133&&t<=10135||t===10160||t===10175||t===11035||t===11036||t===11088||t===11093||t>=11904&&t<=11929||t>=11931&&t<=12019||t>=12032&&t<=12245||t>=12272&&t<=12287||t>=12289&&t<=12350||t>=12353&&t<=12438||t>=12441&&t<=12543||t>=12549&&t<=12591||t>=12593&&t<=12686||t>=12688&&t<=12773||t>=12783&&t<=12830||t>=12832&&t<=12871||t>=12880&&t<=42124||t>=42128&&t<=42182||t>=43360&&t<=43388||t>=44032&&t<=55203||t>=63744&&t<=64255||t>=65040&&t<=65049||t>=65072&&t<=65106||t>=65108&&t<=65126||t>=65128&&t<=65131||t>=94176&&t<=94180||t>=94192&&t<=94198||t>=94208&&t<=101589||t>=101631&&t<=101662||t>=101760&&t<=101874||t>=110576&&t<=110579||t>=110581&&t<=110587||t===110589||t===110590||t>=110592&&t<=110882||t===110898||t>=110928&&t<=110930||t===110933||t>=110948&&t<=110951||t>=110960&&t<=111355||t>=119552&&t<=119638||t>=119648&&t<=119670||t===126980||t===127183||t===127374||t>=127377&&t<=127386||t>=127488&&t<=127490||t>=127504&&t<=127547||t>=127552&&t<=127560||t===127568||t===127569||t>=127584&&t<=127589||t>=127744&&t<=127776||t>=127789&&t<=127797||t>=127799&&t<=127868||t>=127870&&t<=127891||t>=127904&&t<=127946||t>=127951&&t<=127955||t>=127968&&t<=127984||t===127988||t>=127992&&t<=128062||t===128064||t>=128066&&t<=128252||t>=128255&&t<=128317||t>=128331&&t<=128334||t>=128336&&t<=128359||t===128378||t===128405||t===128406||t===128420||t>=128507&&t<=128591||t>=128640&&t<=128709||t===128716||t>=128720&&t<=128722||t>=128725&&t<=128728||t>=128732&&t<=128735||t===128747||t===128748||t>=128756&&t<=128764||t>=128992&&t<=129003||t===129008||t>=129292&&t<=129338||t>=129340&&t<=129349||t>=129351&&t<=129535||t>=129648&&t<=129660||t>=129664&&t<=129674||t>=129678&&t<=129734||t===129736||t>=129741&&t<=129756||t>=129759&&t<=129770||t>=129775&&t<=129784||t>=131072&&t<=196605||t>=196608&&t<=262141}function Ige(t){if(!Number.isSafeInteger(t))throw new TypeError(`Expected a code point, got \`${typeof t}\`.`)}function TG(t,{ambiguousAsWide:e=false}={}){return Ige(t),SG(t)||EG(t)||e&&yG(t)?2:1}var vG=()=>/[#*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\uDC70\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-\uDED7\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\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\uDD3D\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-\uDE89\uDE8F-\uDEC2\uDEC6\uDECE-\uDEDC\uDEDF-\uDEE9]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\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]|\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\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]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\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 _ge=new Intl.Segmenter,Oge=/^\p{Default_Ignorable_Code_Point}$/u;function BI(t,e={}){if(typeof t!="string"||t.length===0)return 0;let{ambiguousIsNarrow:n=true,countAnsiEscapeCodes:r=false}=e;if(r||(t=gg(t)),t.length===0)return 0;let o=0,i={ambiguousAsWide:!n};for(let{segment:a}of _ge.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)&&!Oge.test(a)){if(vG().test(a)){o+=2;continue}o+=TG(s,i);}}return o}function UI({stream:t=process.stdout}={}){return !!(t&&t.isTTY&&process.env.TERM!=="dumb"&&!("CI"in process.env))}function zI(){let{env:t}=aa,{TERM:e,TERM_PROGRAM:n}=t;return aa.platform!=="win32"?e!=="linux":!!t.WT_SESSION||!!t.TERMINUS_SUBLIME||t.ConEmuTask==="{cmd::Cmder}"||n==="Terminus-Sublime"||n==="vscode"||e==="xterm-256color"||e==="alacritty"||e==="rxvt-unicode"||e==="rxvt-unicode-256color"||t.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var Dge=3,$I=class{#a=0;start(){this.#a++,this.#a===1&&this.#n();}stop(){if(this.#a<=0)throw new Error("`stop` called more times than `start`");this.#a--,this.#a===0&&this.#e();}#n(){aa.platform==="win32"||!aa.stdin.isTTY||(aa.stdin.setRawMode(true),aa.stdin.on("data",this.#o),aa.stdin.resume());}#e(){aa.stdin.isTTY&&(aa.stdin.off("data",this.#o),aa.stdin.pause(),aa.stdin.setRawMode(false));}#o(e){e[0]===Dge&&aa.emit("SIGINT");}},Nge=new $I,VI=Nge;_f(LI());var jI=class{#a=0;#n=false;#e=0;#o=-1;#m=0;#t;#i;#r;#p;#h;#c;#u;#d;#g;#s;#l;color;constructor(e){typeof e=="string"&&(e={text:e}),this.#t={color:"cyan",stream:aa.stderr,discardStdin:true,hideCursor:true,...e},this.color=this.#t.color,this.spinner=this.#t.spinner,this.#h=this.#t.interval,this.#r=this.#t.stream,this.#c=typeof this.#t.isEnabled=="boolean"?this.#t.isEnabled:UI({stream:this.#r}),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,aa.env.NODE_ENV==="test"&&(this._stream=this.#r,this._isEnabled=this.#c,Object.defineProperty(this,"_linesToClear",{get(){return this.#a},set(n){this.#a=n;}}),Object.defineProperty(this,"_frameIndex",{get(){return this.#o}}),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.#o=-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(!zI())this.#i=bg.default.line;else if(e===void 0)this.#i=bg.default.dots;else if(e!=="default"&&bg.default[e])this.#i=bg.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,n=" "){return typeof e=="string"&&e!==""?e+n:typeof e=="function"?e()+n:""}#y(e=this.#l,n=" "){return typeof e=="string"&&e!==""?n+e:typeof e=="function"?n+e():""}#f(){let e=this.#r.columns??80,n=this.#b(this.#s,"-"),r=this.#y(this.#l,"-"),o=" ".repeat(this.#d)+n+"--"+this.#g+"--"+r;this.#e=0;for(let i of gg(o).split(`
|
|
191
191
|
`))this.#e+=Math.max(1,Math.ceil(BI(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.#o===-1||e-this.#m>=this.interval)&&(this.#o=++this.#o%this.#i.frames.length,this.#m=e);let{frames:n}=this.#i,r=n[this.#o];this.color&&(r=Qi[this.color](r));let o=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 o+r+i+a}clear(){if(!this.#c||!this.#r.isTTY)return this;this.#r.cursorTo(0);for(let e=0;e<this.#a;e++)e>0&&this.#r.moveCursor(0,-1),this.#r.clearLine(1);return (this.#d||this.lastIndent!==this.#d)&&this.#r.cursorTo(this.#d),this.lastIndent=this.#d,this.#a=0,this}render(){return this.#u?this:(this.clear(),this.#r.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&&NI.hide(this.#r),this.#t.discardStdin&&aa.stdin.isTTY&&(this.#n=true,VI.start()),this.render(),this.#p=setInterval(this.render.bind(this),this.interval),this):(this.text&&this.#r.write(`- ${this.text}
|
|
192
192
|
`),this)}stop(){return this.#c?(clearInterval(this.#p),this.#p=void 0,this.#o=0,this.clear(),this.#t.hideCursor&&NI.show(this.#r),this.#t.discardStdin&&aa.stdin.isTTY&&this.#n&&(VI.stop(),this.#n=false),this):this}succeed(e){return this.stopAndPersist({symbol:hg.success,text:e})}fail(e){return this.stopAndPersist({symbol:hg.error,text:e})}warn(e){return this.stopAndPersist({symbol:hg.warning,text:e})}info(e){return this.stopAndPersist({symbol:hg.info,text:e})}stopAndPersist(e={}){if(this.#u)return this;let n=e.prefixText??this.#s,r=this.#b(n," "),o=e.symbol??" ",i=e.text??this.text,s=typeof i=="string"?(o?" ":"")+i:"",l=e.suffixText??this.#l,c=this.#y(l," "),u=r+o+s+c+`
|
|
193
|
-
`;return this.stop(),this.#r.write(u),this}};function yg(t){return new jI(t)}async function _i(t,e){let{text:n,screen:r}=t;if(!r.isTTY)return e();let o=yg({text:n,stream:process.stdout,discardStdin:false}).start();try{let i=await e();return o.stop(),i}catch(i){throw o.fail(),i}}var AG=mn__default.join(tmpdir(),"momenticBrowserInstallation");var NT=["chrome","chromium","chrome-for-testing","ffmpeg"];NT.filter(t=>t!=="ffmpeg");var Vge={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"};var RG={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function xG(t){let e=RG[Vge[t]],n=registry.findExecutable(e);return !n||n.installType==="none"?false:HI(n)}function HI(t){let e=t.executablePath();return br.existsSync(e)}function jge(t
|
|
193
|
+
`;return this.stop(),this.#r.write(u),this}};function yg(t){return new jI(t)}async function _i(t,e){let{text:n,screen:r}=t;if(!r.isTTY)return e();let o=yg({text:n,stream:process.stdout,discardStdin:false}).start();try{let i=await e();return o.stop(),i}catch(i){throw o.fail(),i}}var AG=mn__default.join(tmpdir(),"momenticBrowserInstallation");var NT=["chrome","chromium","chrome-for-testing","ffmpeg"];NT.filter(t=>t!=="ffmpeg");var Vge={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"};var RG={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function xG(t){let e=RG[Vge[t]],n=registry.findExecutable(e);return !n||n.installType==="none"?false:HI(n)}function HI(t){let e=t.executablePath();return br.existsSync(e)}function jge(t){let e=RG[t],n=registry.findExecutable(e);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${t}`);return n}async function Hge({browser:t,force:e,screen:n}){let r=jge(t),o=!e&&HI(r);try{await _i({text:o?`Verifying browser '${t}'\u2026`:`Installing browser '${t}'\u2026`,screen:n},async()=>{o||await registry.installDeps([r],!1),await registry.install([r],e);}),o?P.dimmed(`Browser '${t}' is already installed.`):P.success(`Installed browser '${t}'`);}catch(i){if(!H(i).includes("Lock file is already being held"))throw i;let a=5*60*1e3,s=Date.now();await _i({text:`Waiting for another process to finish installing '${t}'\u2026`,screen:n},async()=>{for(;Date.now()-s<a&&!HI(r);)await new Promise(l=>setTimeout(l,5e3));}),o?P.dimmed(`Browser '${t}' is already installed.`):P.success(`Installed browser '${t}'`);}}async function Wge(t){if(platform()==="win32")try{await _i({text:"Installing Windows dependencies for Playwright\u2026",screen:t},async()=>{await program.parseAsync(["","","install","winldd"]);}),P.success("Installed Windows dependencies");}catch(e){Lt.warn({err:e},"Failed to install Windows dependencies"),P.warn(`Failed to install Windows dependencies: ${H(e)}. Continuing with browser installation.`);}}async function LT({rawBrowsers:t,force:e=false,all:n=false}){let r=qr();await Wge(r);let o=n?NT:Array.from(new Set(t));try{await wG.lock(AG,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}});}catch(a){Lt.warn({err:a},"Failed to acquire browser install lock"),P.warn(`Could not acquire the browser install lock within 5 minutes: ${H(a)}. Continuing without installation.`);return}let i;try{for(let a of o)try{await Hge({browser:a,force:e,screen:r});}catch(s){i=pS(s),Lt.error({err:s,browser:a},"Failed to install browser"),P.error(`Failed to install the ${a} browser: ${H(s)}.`);}}finally{await wG.unlock(AG,{realpath:false});}if(i)throw i}async function Yl(t,e,n=30){for(let r=0;r<n;r+=1){let o=t+r;if(await kT(o))return o}P.error(`Could not find an available port for ${e} starting from ${t} after ${n} attempts.`),process.exit(1);}async function kT(t){return new Promise(e=>{let n=createServer();n.once("error",r=>{if(("code"in r?r.code:void 0)==="EADDRINUSE"){e(false);return}P.warn({err:r},"Unexpected error checking for open ports; continuing."),n.close(),e(true);}),n.once("listening",()=>{n.close(()=>{e(true);});}),n.listen(t);})}function MG(t){let e=t?.shardIndex??1,n=t?.shardCount??1;if(e<1)throw new Error("Shard index must be greater than 0.");if(n<1)throw new Error("Shard count must be greater than 0.");if(e>n)throw new Error("Shard index cannot be greater than shard count")}function qge(t,e,n,r){if(n>t.length&&(P.warn(`Shard count ${n} is greater than the number of tests ${t.length}! Some workers won't have any tests to run.`),e>n))return [];let o=Math.floor((e-1)*(t.length/n)),i=Math.floor(e*(t.length/n));return (r?[...t].sort((s,l)=>r(s).localeCompare(r(l))):[...t].sort()).slice(o,i)}function PG(t){let{items:e,shardIndex:n,shardCount:r,sortKey:o}=t;return r>1?qge(e,n,r,o):e}function FT({disableCache:t,saveCache:e,regenerateCache:n,bustOldestCachePercentage:r}){if(t&&n)throw new Error("--disable-cache and --regenerate-cache cannot be used together.");if(t&&e)throw new Error("--disable-cache and --save-cache cannot be used together.");return {regenerateCache:n??false,alwaysSaveCache:e??false,noCache:t??false,bustOldestCachePercentage:r}}function Yge(t){let e=t[0],n=t[1];return (e==="before"||e==="steps"||e==="after")&&typeof n=="number"?{stepList:e,stepIndex:n,field:t.slice(2).map(String).join(".")}:typeof e=="number"?{stepList:void 0,stepIndex:e,field:t.slice(1).map(String).join(".")}:{stepList:void 0,stepIndex:void 0,field:t.map(String).join(".")}}function UT(t,e,n){for(let r of t){let{stepList:o,stepIndex:i,field:a}=Yge(r.path);n.push({file:e,stepList:o,stepIndex:i,field:a,issue:r.message,nodePath:r.path});}}function zT(t,e,n){return t instanceof _d?(UT(t.zodIssues,e,n),true):false}function $T({parsingErrors:t,parsingErrorDetails:e,failedTestFilePaths:n,failedModuleFilePaths:r,rootDir:o}){if(P.log(""),P.error(`Found ${t} file${t===1?"":"s"} with validation errors that must be fixed manually.`),e.length>0){let i=new Map;for(let a of e){let s=i.get(a.file)??[];s.push(a),i.set(a.file,s);}for(let[a,s]of i)P.log(""),P.log(` ${Qi.underline(a)}`),Jge({file:a,errors:s,rootDir:o});P.log("");return}IG("test",n),IG("module",r);}function Xge({stepList:t,stepIndex:e,field:n}){if(e===void 0)return n||"(file)";let r=`${t??"steps"}[${e}]`;return n?`${r}.${n}`:r}function Jge({file:t,errors:e,rootDir:n}){let r=n!==void 0?AT(mn__default.resolve(n,t)):void 0,o=e.map(s=>({error:s,position:r&&s.nodePath?XW(r,s.nodePath):void 0})),i=Math.max(0,...o.map(({position:s})=>s?`${s.line}:${s.col}`.length:0));Zge(o).forEach(({startOffset:s,errors:l},c)=>{c>0&&P.log("");for(let{error:u,position:d}of l){let m=d?Qi.dim(`${d.line}:${d.col}`.padStart(i)):" ".repeat(i);P.log(` ${m} ${Qi.red("error")} ${u.issue} ${Qi.dim(Xge(u))}`);}if(s!==void 0&&r){let u=AI(r,s);u&&(P.log(""),P.log(u));}});}function Zge(t){let e=[],n=new Map;for(let r of t){let o=r.position?.startOffset;if(o===void 0){e.push({errors:[r]});continue}let i=n.get(o);if(i){i.push(r);continue}let a=[r];n.set(o,a),e.push({startOffset:o,errors:a});}return e}function IG(t,e){if(!(!e||e.size===0)){P.dimmed(` Failed ${t} files:`);for(let n of e)P.dimmed(`${lG}- ${n}`);}}var WI=[],_G=false,Qge=once(async({reason:t,logger:e,exitCode:n})=>{e.info({reason:t,exitCode:n},"Exiting process"),WI.push(async()=>FE(),async()=>Ge.flush(),async()=>HE()),await te(Promise.allSettled(WI.toReversed().map(r=>r(t,e))),{milliseconds:5e3,fallback:()=>{}}),process.exit(n);}),Bm=once((t,e)=>{let n=({exitCode:r,logger:o,reason:i})=>{if(_G){o.info({reason:i},"Shutdown already in progress; ignoring signal");return}_G=true,Qge({reason:i,logger:o,exitCode:r});};process.on("SIGINT",()=>n({reason:"SIGINT",logger:t,exitCode:0})),process.on("SIGTERM",()=>n({reason:"SIGTERM",logger:t,exitCode:0})),e&&(process.on("uncaughtException",r=>{t.error({err:r},"Uncaught exception, shutting down"),n({reason:"uncaughtException",logger:t,exitCode:1});}),process.on("unhandledRejection",r=>{t.error({reason:r},"Unhandled rejection, shutting down"),n({reason:"unhandledRejection",logger:t,exitCode:1});}));});function xu(t){WI.push(t);}function DG(t){return t instanceof Error?"code"in t&&t.code==="EPIPE"?true:t.message.includes("EPIPE"):false}function NG(t){return t instanceof Error?t.name==="AbortError":false}function LG(t){return t instanceof Error?t.message.includes("Target page, context or browser has been closed"):false}function kG(t){return !(t instanceof Error)||!t.stack?false:t.stack.includes(uE)}async function FG({url:t}){await ebe(t);}var nbe=[".mp4",".mov",".webm"];function UG(t,e){if(e)try{let n=br.readdirSync(e);for(let r of n)nbe.some(i=>r.endsWith(i))&&(br.unlinkSync(mn__default.join(e,r)),t.info({file:r},"Deleted video artifact for passing test"));}catch(n){t.warn({err:n},"Failed to delete video artifacts for passing test");}}var Mu=3.1783027;function rbe(t){let e=0;for(let n=0;n<t.length;n++){let r=t.charCodeAt(n);!(r>=48&&r<=57)&&!(r>=65&&r<=90)&&!(r>=97&&r<=122)&&e++;}return e}function kt(t){return Math.ceil(GI(t)/Mu)}function GI(t){let e=0;if(typeof t=="string"){let n=t;n=n.replaceAll(`
|
|
194
194
|
`,""),n=n.replaceAll(" ","");let r=rbe(n);return n.length-r+Mu*r}if(typeof t>"u"||t===null)return 0;if(typeof t=="number")return String(t).length;if(Array.isArray(t))return t.forEach(n=>{e+=GI(n);}),e;if(typeof t=="object"){let n=t;return n.type==="image"||n.type==="image-data"||(n.type==="media"||n.type==="file"||n.type==="file-data")&&"data"in n&&"mediaType"in n&&typeof n.mediaType=="string"&&n.mediaType.startsWith("image/")?1600*Mu:(Object.keys(n).forEach(r=>{e+=String(r).length,r==="image_url"?(n[r]??{}).detail==="high"?e+=1105*Mu:e+=85*Mu:r==="source"&&typeof n[r]=="object"&&n[r]?.type==="base64"?e+=1600*Mu:e+=GI(n[r]);}),e)}if(typeof t=="boolean")return t?4:5;throw new Error(`Unsupported type passed to token length calculator '${typeof t}': ${t}`)}var Sg=class{diff(e,n,r={}){let o;typeof r=="function"?(o=r,r={}):"callback"in r&&(o=r.callback);let i=this.castInput(e,r),a=this.castInput(n,r),s=this.removeEmpty(this.tokenize(i,r)),l=this.removeEmpty(this.tokenize(a,r));return this.diffWithOptionsObj(s,l,r,o)}diffWithOptionsObj(e,n,r,o){var i;let a=S=>{if(S=this.postProcess(S,r),o){setTimeout(function(){o(S);},0);return}else return S},s=n.length,l=e.length,c=1,u=s+l;r.maxEditLength!=null&&(u=Math.min(u,r.maxEditLength));let d=(i=r.timeout)!==null&&i!==void 0?i:1/0,m=Date.now()+d,p=[{oldPos:-1,lastComponent:void 0}],f=this.extractCommon(p[0],n,e,0,r);if(p[0].oldPos+1>=l&&f+1>=s)return a(this.buildValues(p[0].lastComponent,n,e));let h=-1/0,b=1/0,y=()=>{for(let S=Math.max(h,-c);S<=Math.min(b,c);S+=2){let T,C=p[S-1],w=p[S+1];C&&(p[S-1]=void 0);let _=false;if(w){let I=w.oldPos-S;_=w&&0<=I&&I<s;}let N=C&&C.oldPos+1<l;if(!_&&!N){p[S]=void 0;continue}if(!N||_&&C.oldPos<w.oldPos?T=this.addToPath(w,true,false,0,r):T=this.addToPath(C,false,true,1,r),f=this.extractCommon(T,n,e,S,r),T.oldPos+1>=l&&f+1>=s)return a(this.buildValues(T.lastComponent,n,e))||true;p[S]=T,T.oldPos+1>=l&&(b=Math.min(b,S-1)),f+1>=s&&(h=Math.max(h,S+1));}c++;};if(o)(function S(){setTimeout(function(){if(c>u||Date.now()>m)return o(void 0);y()||S();},0);})();else for(;c<=u&&Date.now()<=m;){let S=y();if(S)return S}}addToPath(e,n,r,o,i){let a=e.lastComponent;return a&&!i.oneChangePerToken&&a.added===n&&a.removed===r?{oldPos:e.oldPos+o,lastComponent:{count:a.count+1,added:n,removed:r,previousComponent:a.previousComponent}}:{oldPos:e.oldPos+o,lastComponent:{count:1,added:n,removed:r,previousComponent:a}}}extractCommon(e,n,r,o,i){let a=n.length,s=r.length,l=e.oldPos,c=l-o,u=0;for(;c+1<a&&l+1<s&&this.equals(r[l+1],n[c+1],i);)c++,l++,u++,i.oneChangePerToken&&(e.lastComponent={count:1,previousComponent:e.lastComponent,added:false,removed:false});return u&&!i.oneChangePerToken&&(e.lastComponent={count:u,previousComponent:e.lastComponent,added:false,removed:false}),e.oldPos=l,c}equals(e,n,r){return r.comparator?r.comparator(e,n):e===n||!!r.ignoreCase&&e.toLowerCase()===n.toLowerCase()}removeEmpty(e){let n=[];for(let r=0;r<e.length;r++)e[r]&&n.push(e[r]);return n}castInput(e,n){return e}tokenize(e,n){return Array.from(e)}join(e){return e.join("")}postProcess(e,n){return e}get useLongestToken(){return false}buildValues(e,n,r){let o=[],i;for(;e;)o.push(e),i=e.previousComponent,delete e.previousComponent,e=i;o.reverse();let a=o.length,s=0,l=0,c=0;for(;s<a;s++){let u=o[s];if(u.removed)u.value=this.join(r.slice(c,c+u.count)),c+=u.count;else {if(!u.added&&this.useLongestToken){let d=n.slice(l,l+u.count);d=d.map(function(m,p){let f=r[c+p];return f.length>m.length?f:m}),u.value=this.join(d);}else u.value=this.join(n.slice(l,l+u.count));l+=u.count,u.added||(c+=u.count);}}return o}};var qI=class extends Sg{constructor(){super(...arguments),this.tokenize=obe;}equals(e,n,r){return r.ignoreWhitespace?((!r.newlineIsToken||!e.includes(`
|
|
195
195
|
`))&&(e=e.trim()),(!r.newlineIsToken||!n.includes(`
|
|
196
196
|
`))&&(n=n.trim())):r.ignoreNewlineAtEof&&!r.newlineIsToken&&(e.endsWith(`
|
|
@@ -215,7 +215,7 @@ ${n}`:n}var Obe="[FAILED]";async function rv(t,e,n,{numStepsWithScreenshots:r=5,
|
|
|
215
215
|
`),s;try{s=pg.parse(a);}catch(l){throw l instanceof YAMLParseError?new uS(`Invalid YAML in ${n}: ${l.message}`,{cause:l}):l}return b3.set(n,{mtimeMs:r.mtimeMs,size:r.size,parsed:s}),{parsed:structuredClone(s),stats:r}}var v3=false,hSe=z.object({fileType:z.enum(ve)});async function Et(t,e=false,n=Lu){return w3({project:t,includeGlobs:t.config.include??Jm,disableLogging:e,fileSystem:n})}async function C3(t,e=false){let n=t.config.include??["**/*.module.yaml"];return {mobileModules:(await w3({project:t,includeGlobs:n,disableLogging:e,filePathPredicate:o=>o.endsWith(".module.yaml")})).mobileModules}}async function w3({project:t,includeGlobs:e,disableLogging:n,filePathPredicate:r,fileSystem:o=Lu}){let i={project:t,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{},metadataParseFailures:[]},a=t.config.exclude??[],s=AbortSignal.timeout(5e3),l;try{l=await Nu(e,{cwd:t.rootDir,ignore:a,maxDepth:Bg,nodir:!0,signal:s,fs:o});}catch(c){throw P.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(r&&!r(c))continue;let u=bSe(t.rootDir,c,i,n?tu:P,o);u&&(i.duplicateEntities[u.id]=u.paths);}return v3=true,i}async function A3(t){let e=t.config.exclude??[],n=AbortSignal.timeout(5e3),r;try{r=await Nu(["**"],{cwd:t.rootDir,ignore:e,maxDepth:Bg,nodir:!1,onlyDirectories:!0,signal:n});}catch(i){throw n.aborted?(P.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 o=r.map(i=>i.split(mn__default.sep).join("/")).filter(i=>gSe(t,i));return Array.from(new Set(o)).sort()}function gSe(t,e){let n=t.config.exclude??[],r=t.config.include??Jm;return ["test.yaml","module.yaml"].some(i=>{let a=e?`${e}/placeholder.${i}`:`placeholder.${i}`;return Fg(a,n)?false:Fg(a,r)})}function xv({project:t,relativeFilePath:e}){let n=e.split(mn__default.sep).join("/"),r=t.config.exclude??[];if(Fg(n,r))throw new pn(`Cannot create "${n}" because it matches this project's "exclude" patterns (${r.join(", ")}). Choose a folder that is part of the project.`);let o=t.config.include??Jm;if(!Fg(n,o))throw new pn(`Cannot create "${n}" because it is outside this project's "include" patterns (${o.join(", ")}). Choose a folder that is part of the project.`)}function bSe(t,e,n,r,o){let i=mn__default.join(t,e),a=ySe(i,r,o);if(!a)return;let{entityJs:s,stats:l}=a,c=hSe.safeParse(s);if(c.success===false){r.warn(`Possible Momentic file at ${i} does not have a 'fileType', skipping: ${H(c.error)}`);return}let u=c.data.fileType,d=SSe(e,i,l);switch(u){case ve.TEST:try{return y3(s,u,n,d,i,r)}catch(m){r.warn(`Skipping file '${i}' because it is missing Momentic test metadata: ${H(m)}`);return}case ve.TEST_V2:try{return y3(s,u,n,d,i,r)}catch(m){Rv({err:m,fullPath:i,fsAttributes:d,kind:"test",suffix:"test.yaml",resultsCollector:n,logger:r});return}case ve.MODULE:try{return S3(s,u,n,d,i,r)}catch(m){r.warn(`Skipping file '${i}' because it is missing Momentic module metadata: ${H(m)}`);return}case ve.MODULE_V2:try{return S3(s,u,n,d,i,r)}catch(m){Rv({err:m,fullPath:i,fsAttributes:d,kind:"module",suffix:"module.yaml",resultsCollector:n,logger:r});return}case ve.MOBILE_TEST:try{return T3(s,u,n,d,i,r)}catch(m){r.warn(`Skipping file '${i}' because it is missing Momentic mobile test metadata: ${H(m)}`);return}case ve.MOBILE_TEST_V2:try{return T3(s,u,n,d,i,r)}catch(m){Rv({err:m,fullPath:i,fsAttributes:d,kind:"test",suffix:"test.yaml",resultsCollector:n,logger:r});return}case ve.MOBILE_MODULE:try{return E3(s,u,n,d,i,r)}catch(m){r.warn(`Skipping file '${i}' because it is missing Momentic mobile module metadata: ${H(m)}`);return}case ve.MOBILE_MODULE_V2:try{return E3(s,u,n,d,i,r)}catch(m){Rv({err:m,fullPath:i,fsAttributes:d,kind:"module",suffix:"module.yaml",resultsCollector:n,logger:r});return}default:{return}}}function ySe(t,e,n){try{let{parsed:r,stats:o}=Ni(t,n);if(typeof r!="object"||r===null)throw new Error("The YAML document should parse as a map with key-value pairs");return {entityJs:r,stats:o}}catch(r){e.warn(`Could not parse possible Momentic file at ${t}, skipping: ${H(r)}`);return}}function Rv({err:t,fullPath:e,fsAttributes:n,kind:r,suffix:o,resultsCollector:i,logger:a}){if(t instanceof z.ZodError){i.metadataParseFailures.push({fullPath:e,relativePath:n.relativePath,name:n.fileName.replace(`.${o}`,""),kind:r,issues:t.issues});return}a.warn(`Skipping file '${e}': failed to read Momentic v2 ${r} metadata: ${H(t)}`);}function SSe(t,e,n){return {relativePath:t,fullFilePath:e,platformSep:mn__default.sep,fullPathSegments:e.split(mn__default.sep),relativePathSegments:t.split(mn__default.sep),fileName:mn__default.basename(e),lastModified:n.mtime,createdAt:n.birthtime}}function y3(t,e,n,r,o,i){let a=r.fileName.replace(".test.yaml",""),s,l;e===ve.TEST_V2?(s=mP.parse(t),l=a):(s=hh.parse(t),l=s.name);let c;if(n.tests[s.id]){let u=n.tests[s.id].fullFilePath;c={id:s.id,paths:[u,o]};}return n.tests[s.id]={type:e,name:l,id:s.id,description:s.description??void 0,labels:s.labels,...r},c}function S3(t,e,n,r,o,i){let a,s,l,c=r.fileName.replace(".module.yaml","");if(e===ve.MODULE_V2){let d=CE.parse(t);a=d.id,s=d.name??c,l=d.description;}else {let d=Da.parse(t);a=d.moduleId,s=d.name,l=d.description;}let u;if(n.modules[a]){let d=n.modules[a].fullFilePath;u={id:a,paths:[d,o]};}return n.modules[a]={type:e,name:s,id:a,description:l??void 0,...r},!v3&&Zi(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 E3(t,e,n,r,o,i){let a=r.fileName.replace(".module.yaml",""),s,l,c;if(e===ve.MOBILE_MODULE_V2){let d=ME.parse(t);s=d.id,l=d.description,c=d.name??a;}else {let d=Va.parse(t);s=d.moduleId,l=d.description,c=a;}let u;if(n.mobileModules[s]){let d=n.mobileModules[s].fullFilePath;u={id:s,paths:[d,o]};}return n.mobileModules[s]={type:e,name:c,id:s,description:l??void 0,...r},u}function T3(t,e,n,r,o,i){let a=e===ve.MOBILE_TEST_V2?iV.parse(t):kl.parse(t),s;if(n.mobileTests[a.id]){let c=n.mobileTests[a.id].fullFilePath;s={id:a.id,paths:[c,o]};}let l=r.fileName.replace(".test.yaml","");return n.mobileTests[a.id]={type:e,name:l,id:a.id,description:a.description??void 0,labels:a.labels,...r},s}var R3=100;function Ks(t,e){let n=e.hooks?.postSave;if(!n)return;let r;n.includes("$1")?r=n.replaceAll("$1",t):r=`${n} ${t}`,M3(r);}function x3(t,e){let n=e.hooks?.postSave;if(!(!n||t.length===0)){if(n.includes("$1")){for(let r of t)Ks(r,e);return}for(let r=0;r<t.length;r+=R3){let o=t.slice(r,r+R3).map(TSe).join(" ");M3(`${n} ${o}`);}}}function M3(t){P.debug({postSaveCommand:t},"Executing post-save hook command");try{execSync(t,{encoding:"utf-8"});}catch(e){P.warn({err:e,postSaveCommand:t},"Post-save hook command failed; continuing.");}}function TSe(t){return `'${t.replaceAll("'","'\\''")}'`}function Fu({sourceFilePath:t,momenticFiles:e}){return CSe({sourceFilePath:t,moduleEntities:e?.mobileModules})}function CSe({sourceFilePath:t,moduleEntities:e}){return {sourceFilePath:t,getModuleReference:n=>{let r=e?.[n]?.fullFilePath;if(!r)return;let o=mn__default.relative(mn__default.dirname(t),r).split(mn__default.sep).join("/");return I_(o)},getRelativeJsonFileReference:n=>{if(!mn__default.isAbsolute(n))return I_(n);let r=mn__default.relative(mn__default.dirname(t),n).split(mn__default.sep).join("/");return I_(r)}}}function Bu({sourceFilePath:t,momenticFiles:e}){return wSe({sourceFilePath:t,moduleEntities:e.mobileModules})}function wSe({sourceFilePath:t,moduleEntities:e}){let n=new Map(Object.values(e).map(r=>[mn__default.resolve(r.fullFilePath),r]));return {sourceFilePath:t,readRelativeFile:r=>gv(r)||mn__default.isAbsolute(r)||Qq(r)?readFileSync(mn__default.resolve(mn__default.dirname(t),r),"utf8"):r,resolveRelativeJsonPath:r=>mn__default.isAbsolute(r)?r:mn__default.resolve(mn__default.dirname(t),r),resolveModuleReference:r=>{if(!bv(r))return;let o=mn__default.resolve(mn__default.dirname(t),r),i=n.get(o);if(!i)throw new Ye(`Could not find module file '${r}' referenced from '${t}'.`);return {moduleId:i.id,moduleName:i.name}}}}function I_(t){return gv(t)||mn__default.isAbsolute(t)?t.split(mn__default.sep).join("/"):`./${t.split(mn__default.sep).join("/")}`}var P3=100;function Zm({projectConfig:t,momenticFiles:e,entityType:n}){if(t.fileFormat!=="v2")return v4$1();let r;switch(n){case "test":r=Object.keys(e.tests);break;case "module":r=Object.keys(e.modules);break;case "mobile-test":r=Object.keys(e.mobileTests);break;case "mobile-module":r=Object.keys(e.mobileModules);break}return ASe({existingIds:r})}function ASe({existingIds:t}){let e=new Set(t);for(let n=0;n<P3;n++){let r=Un.parse(ZG(v4$1()));if(!e.has(r))return r}throw new Error(`Failed to generate a unique readable v2 entity ID after ${P3} attempts`)}function Mv(t,e){let n=[];for(let r of t.config.environments??[]){if(r.baseUrl)continue;let o=Uu(r.name,t,e);o.variables[Ix]||n.push(o);}return n}function MSe(t){return t.includes("${")?t.replace(/\$\{([^}]+)\}/g,(e,n)=>{let r=n.match(/^([A-Za-z_][A-Za-z0-9_]*)(?:(:-|-)([\s\S]*))?$/);if(!r)return process.env[n]||"";let o=r[1];if(!o)return "";let i=r[2],a=r[3],s=process.env[o];return i===":-"?s&&s!==""?s:a||"":i==="-"?s!==void 0?s:a||"":s||""}):t}function PSe(t){let{envVariables:e,project:n}=t;if(!e)return {};let r={};for(let[o,i]of Object.entries(e)){if(typeof i=="string"){let s=MSe(i);s&&(r[o]=s);continue}let a;try{a=br.readFileSync(mn__default.resolve(n.rootDir,i.fromFile),"utf-8");}catch(s){throw new Error(`Failed to read environment variable '${o}' from file '${i.fromFile}': ${s}`)}if(i.json)try{r[o]=JSON.parse(a);}catch(s){throw new Error(`Failed to parse environment variable '${o}' from file '${i.fromFile}' as JSON: ${s}`)}else r[o]=a;}return Object.keys(r).length>0&&P.debug(r,"Set environment variables with interpolation from project configuration"),r}function ISe(t){let{project:e,envFile:n,logger:r}=t,o={};if(!n)return o;let i=RSe.config({path:mn__default.resolve(e.rootDir,n),processEnv:o,logLevel:"error",quiet:true});if(i.error)throw new Ye(`Failed to load .env file: ${i.error.message}`,{cause:i.error});return r.debug("Set environment variables from .env file"),o}function Uu(t,e,n){let r=(e.config.environments??[]).find(l=>l.name===t);if(!r)throw new Ye(`Environment ${t} not found in local project configuration file`);let o={},i=PSe({envVariables:r.envVariables,project:e});Object.assign(o,i);let a=ISe({project:e,envFile:r.envFile,logger:n});return Object.assign(o,a),r.inheritFromShell&&(n.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:t,variables:o}}var nc="momentic.config.yaml",O_="momentic.workspace.yaml",kSe=z.object({projects:z.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),FSe=z.union([z.string(),z.object({fromFile:z.string(),json:z.boolean().optional()})]),BSe=z.object({name:x_,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(),FSe).optional(),inheritFromShell:z.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:_s.optional().describe("NB: most things should use project-level configuration only")}),USe=z.object({postSave:z.string().optional()}),zSe=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."),$Se=z.object({name:x_,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:Y1.optional().describe("file format version to use"),goldenFileDir:z.string().optional(),reporterDir:z.string().optional(),outputDir:z.string().optional(),recordVideo:zSe.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(BSe).optional(),gitMainBranch:z.string().optional().readonly(),gitProtectedBranches:z.string().array().optional().readonly(),ai:Fa.optional(),browser:_s.optional(),emulator:KM.optional(),advanced:Vx.optional(),displayRoot:z.string().optional().describe("relative path from project root to use as the Repository root"),hooks:USe.optional()});function N3(t,e){let n;try{n=readFileSync(t,"utf-8");}catch(o){P.warn(`Could not read possible Momentic ${e} file at ${t}: ${H(o)}`);return}let r;try{if(r=pg.parse(n),typeof r!="object"||r===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof r} instead`)}catch(o){P.warn(`Possible Momentic ${e} file at ${t} does not parse as valid YAML: ${H(o)}`);return}return r}function L3(t,e){let n=[];for(let[r,o]of Object.entries(t)){let a=/^\d+$/.test(r)?`${e}[${r}]`:e?`${e}.${r}`:r;o!==null&&typeof o=="object"?n.push(...L3(o,a)):n.push(a);}return n}var VSe=["healing","explore"];function jSe(t){let e=t.ai;if(!e)return [];let n=[];for(let r of VSe)e[r]!==void 0&&(delete e[r],n.push(`ai.${r}`));return n}var HSe=z.object({ai:z.object({classification:z.object({categories:z.unknown()})})});function WSe(t){let e=HSe.safeParse(t);return e.success&&e.data.ai.classification.categories!==void 0}function D_(t){let e=N3(t,"project configuration");if(e===void 0)return;let n;try{n=$Se.parse(e);}catch(a){let s=a instanceof z.ZodError?`
|
|
216
216
|
${z.prettifyError(a)}`:`: ${H(a)}`;P.warn(`Project config at ${t} does not match the required schema${s}`);return}let r=deletedDiff(e,n),o=L3(r,"");o.length>0&&P.warn(`Momentic config file at ${t} contains unrecognized keys: ${o.join(", ")}. These keys will be ignored.`);let i=jSe(n);return WSe(e)&&i.push("ai.classification.categories"),i.length>0&&P.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.`),n}function GSe(t){let e=N3(t,"workspace configuration");if(e!==void 0)try{return kSe.parse(e)}catch(n){P.warn(`Possible Momentic workspace configuration file at ${t} does not adhere to the required schema: ${H(n)}`);return}}function qSe(){let t=[],e=cwd(),n=mn__default.parse(e).root,r=15,o=0;for(;o<r;){o++;let i=mn__default.basename(e);if(R_.includes(i))return P.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(nc)){let s=mn__default.join(e,a),l=D_(s);l&&t.push({configFilePath:s,config:l,rootDir:dirname(s)});}if(t.length)return t;if(e=mn__default.dirname(e),e===n)break}return t}async function ai(t={}){let{configFilePath:e,nameFilter:n,skipExitOnError:r}=t,o=await YSe(e,r);if(n&&(o=o.filter(i=>i.config.name===n)),o.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
|
|
217
217
|
${o.map(i=>i.configFilePath)}`);if(o.length===0)throw new Error("No valid Momentic project file available.");return P.debug(`Found valid project configuration at ${o[0].configFilePath}`),o[0]}async function KSe(t){let e=GSe(t);if(!e||!e.projects||!e.projects.length)return;let n=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${nc}`)),r=AbortSignal.timeout(2e3),o;try{o=await Nu(n,{cwd:cwd(),maxDepth:Bg,ignore:[],nodir:!0,signal:r});}catch(a){throw P.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${O_} is misconfigured.`),a}let i=[];for(let a of o){let s=mn__default.join(cwd(),a),l=D_(s);l&&i.push({configFilePath:s,config:l,rootDir:dirname(s)});}return i}async function YSe(t,e){if(t){t=mn__default.resolve(t);let r=D_(t);return r?[{config:r,configFilePath:t,rootDir:mn__default.dirname(t)}]:(console.error(`No valid Momentic project file found at ${t}.`),e||process.exit(1),[])}if(existsSync(O_)){let r=await KSe(O_);if(r)return r}return qSe()}function $u(t,e){let n=pg.stringify(t);writeFileSync(e,n);}var Ug="test-results";var k3=3e3,Bt=F3(),ZSe=promisify(execFile);async function Li(t){let{logger:e,operation:n,fn:r,context:o}=t,i=Date.now();try{return await r()}finally{let a=Date.now()-i;a>k3&&!process.env.CI&&e.warn({operation:n,durationMs:a,thresholdMs:k3,...o??{}},"[timing] slow git metadata operation");}}function ns(t){if(t)try{let e=new Date(t);return isNaN(e.getTime())?void 0:e}catch{return}}async function QSe(t){let e=await Ut(t,Bt.raw(["config","--list"])),n={};if(!e)return n;for(let r of e.split(`
|
|
218
|
-
`)){let o=r.indexOf("=");if(o===-1)continue;let i=r.slice(0,o),a=r.slice(o+1).trim();n[i]=a;}return n}async function eEe(t,e,n){try{let o=n["github.user"]||void 0;if(o)return o}catch{}let r;try{if(e?.startsWith("http://")||e?.startsWith("https://"))r=new URL(e).host;else if(e?.startsWith("git@")){let o=e.indexOf("@"),i=e.indexOf(":",o+1);o!==-1&&i!==-1&&(r=e.slice(o+1,i));}}catch{}if(r=r?.toLowerCase(),!!r&&e?.startsWith("git@")&&r.includes("github"))try{let{stdout:o,stderr:i}=await ZSe("ssh",["-T","-o","BatchMode=yes",`git@${r}`],{timeout:5e3}),s=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}catch{return}}async function tEe(t,e,n){let r=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(r)return eEe(t,e,n);if(o)return}catch{}}function zg(t){if(t.startsWith("git@")){let e=t.split(":");if(e.length===2){let n=e[1].replace(".git","").split("/");if(n.length===2){let r=n[0],o=n[1];return `${r}/${o}`}}}else if(t.startsWith("http")||t.startsWith("https")){let n=new URL(t).pathname.split("/").filter(Boolean);if(n.length>=2){let r=n[0],o=n[1].replace(".git","");return `${r}/${o}`}}}function nEe(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 Ut(t,e){try{return (await e).trim()}catch(n){if(nEe(n))return;t.error({err:n},"Failed to run git command");return}}function rEe(){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 oEe(t){let[e,n,r]=await Promise.all([Ut(t,Bt.show(["--no-patch","--format=%ci"])),Ut(t,Bt.show(["-s","--pretty=%B"])),Ut(t,Bt.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return {ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?ns(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function iEe(t){let[e,n,r]=await Promise.all([Ut(t,Bt.listRemote(["--get-url","origin"])),Ut(t,Bt.show(["-s","--pretty=%B"])),Ut(t,Bt.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?ns(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:n,gitCommitAuthorName:r,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function aEe(t){let[e,n,r,o]=await Promise.all([Ut(t,Bt.show(["--no-patch","--format=%ci"])),Ut(t,Bt.listRemote(["--get-url","origin"])),Ut(t,Bt.show(["-s","--pretty=%B"])),Ut(t,Bt.show(["-s","--pretty=%an"]))]),a=process.env.CIRCLE_REPOSITORY_URL?.trim()||void 0||n||void 0,s=a?.includes("github.com")??false,l=a?.includes("gitlab.com")??false,c=a?zg(a):void 0;return {ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?ns(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:a,gitCommitMessage:r,gitCommitAuthorName:o,githubRepository:s?c:void 0,gitlabProjectPath:l?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function sEe(t){let[e,n,r]=await Promise.all([Ut(t,Bt.show(["--no-patch","--format=%ci"])),Ut(t,Bt.show(["-s","--pretty=%B"])),Ut(t,Bt.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?zg(o):void 0;return {ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?ns(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function lEe(t){let[e,n,r]=await Promise.all([Ut(t,Bt.show(["--no-patch","--format=%ci"])),Ut(t,Bt.show(["-s","--pretty=%B"])),Ut(t,Bt.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?zg(o):void 0;return {ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?ns(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function cEe(t,e,n){let[r,o,i,a,s,l,c,u,d]=await Promise.all([Ut(t,Bt.revparse(["HEAD"])),Ut(t,Bt.revparse(["--short","HEAD"])),Ut(t,Bt.revparse(["--abbrev-ref","HEAD"])),Ut(t,Bt.listRemote(["--get-url","origin"])),Ut(t,Bt.show(["--no-patch","--format=%ci"])),Ut(t,Bt.show(["-s","--pretty=%B"])),Ut(t,Bt.show(["-s","--pretty=%an"])),e?Ut(t,Bt.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),QSe(t)]),m=u||(e?await Ut(t,Bt.raw(["merge-base",e,"HEAD"])):void 0),p=m?await Ut(t,Bt.show(["--no-patch","--format=%ci",m])):void 0,f=a?.includes("github.com"),h=a?.includes("gitlab.com"),b=a?zg(a):void 0,y=d["user.email"]||void 0,S=d["user.name"]||void 0,T=d["user.username"]||void 0,C=d["github.user"]||void 0,N=(n?.includeHostingUsername??true?await tEe(t,a,d):void 0)??T??C??void 0;return {ciProvider:"none",gitCommitSha:r,gitCommitShaShort:o,gitBranchName:i,gitOriginUrl:a,gitCommitTimestamp:s?ns(s):void 0,gitCommitMessage:l,gitCommitAuthorName:c,gitLocalUsername:N,gitLocalEmail:y,gitLocalName:S,lastCommitOnMainSha:m,lastCommitOnMainTimestamp:p?ns(p):void 0,githubRepository:f?b:void 0,gitlabProjectPath:h?b:void 0,pipelineId:void 0}}async function uEe(t){let[e,n]=await Promise.all([Ut(t,Bt.show(["--no-patch","--format=%ci"])),Ut(t,Bt.show(["-s","--pretty=%an"]))]),r=process.env.GIT_REPOSITORY_URL,o=r?.includes("github.com"),i=r?.includes("gitlab.com"),a=r?zg(r):void 0;return {ciProvider:"Bitrise",gitCommitSha:process.env.BITRISE_GIT_COMMIT,gitCommitShaShort:process.env.BITRISE_GIT_COMMIT?.slice(0,6),gitCommitTimestamp:e?ns(e):void 0,gitBranchName:process.env.BITRISE_GIT_BRANCH,gitOriginUrl:r,gitCommitMessage:process.env.BITRISE_GIT_MESSAGE,gitCommitAuthorName:n,githubRepository:o?a:void 0,gitlabProjectPath:i?a:void 0,pipelineId:`${process.env.BITRISE_APP_SLUG}:${process.env.BITRISE_BUILD_SLUG}`}}async function dEe(){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 mEe(){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:ns(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:ns(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 pEe(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function $g(t,e,n){let r=rEe();if(!r)return cEe(t,e,n);switch(r){case "GithubActions":return oEe(t);case "GitlabCI":return iEe(t);case "CircleCI":return aEe(t);case "Buildkite":return sEe(t);case "AzureDevOps":return lEe(t);case "GCPCloudBuild":return dEe();case "Bitrise":return uEe(t);case "Custom":return mEe()}}async function fEe(t,e,n,r){let o=r,i=r.gitCommitSha;if(!i)return o;let a=r.gitMainBranch;if(a&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let s=await Li({logger:t,operation:"getRemoteMetadataFromGitlab.getMergeBaseCommitFromGitlab",fn:()=>e.getMergeBaseCommitFromGitlab(n,a,i),context:{projectPath:n,mainBranch:a}});o={...o,lastCommitOnMainSha:s.sha,lastCommitOnMainTimestamp:s.committer.date};}catch(s){t.warn({err:s},"Failed to get merge base commit from Gitlab");}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let s=await Li({logger:t,operation:"getRemoteMetadataFromGitlab.getCommitFromGitlab",fn:()=>e.getCommitFromGitlab(n,i),context:{projectPath:n,gitCommitSha:i}});s&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??s.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??s.author.name,gitCommitMessage:o.gitCommitMessage??s.message});}catch(s){t.warn({err:s},"Failed to get commit from Gitlab");}if(r.gitBranchName&&r.gitBranchName===r.gitMainBranch&&!o.mergedGitBranchName){let s=r.gitBranchName;try{let l=await Li({logger:t,operation:"getRemoteMetadataFromGitlab.getMergedBranchFromGitlab",fn:()=>e.getMergedBranchFromGitlab(n,s,i),context:{projectPath:n,branchName:s,gitCommitSha:i}});l.mergedBranch&&(o={...o,mergedGitBranchName:l.mergedBranch});}catch(l){t.warn({err:l},"Failed to get merged branch from Gitlab");}}return o}async function hEe(t,e,n,r,o){let i=o,a=o.gitCommitSha;if(!a)return i;let s=o.gitMainBranch;if(s&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let l=await Li({logger:t,operation:"getRemoteMetadataFromGitHub.getMergeBaseCommitFromGithub",fn:()=>e.getMergeBaseCommitFromGithub(n,r,s,a),context:{owner:n,repo:r,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 Li({logger:t,operation:"getRemoteMetadataFromGitHub.getCommitFromGithub",fn:()=>e.getCommitFromGithub(n,r,a),context:{owner:n,repo:r,gitCommitSha:a}});l&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??l.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??l.author.name,gitCommitMessage:i.gitCommitMessage??l.message});}catch(l){t.warn({err:l},"Failed to get commit from GitHub");}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName){let l=o.gitBranchName;try{let c=await Li({logger:t,operation:"getRemoteMetadataFromGitHub.getMergedBranchFromGithub",fn:()=>e.getMergedBranchFromGithub(n,r,l,a),context:{owner:n,repo:r,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 gEe(t,e,n){try{if(n.githubRepository){let{owner:r,repo:o}=S1(n.githubRepository);return await Li({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitHub",fn:()=>hEe(t,e,r,o,n),context:{githubRepository:n.githubRepository}})}else if(n.gitlabProjectPath){let r=n.gitlabProjectPath;return await Li({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitlab",fn:()=>fEe(t,e,r,n),context:{gitlabProjectPath:r}})}}catch(r){t.warn({err:r},"Failed to get remote git metadata");}return n}async function bEe(t,e,n,r){let o={},i={gitMainBranch:n.config.gitMainBranch};return Li({logger:t,operation:"getGitMetadata.total",fn:async()=>{let[a,s]=await Promise.all([Li({logger:t,operation:"getGitMetadata.getConfiguredGitMetadata",fn:()=>pEe(n),context:{projectConfigPath:n.configFilePath}}),Li({logger:t,operation:"getGitMetadata.getEnvironmentGitMetadata",fn:async()=>{let u=await $g(t,n.config.gitMainBranch,r);return i.ciProvider=u.ciProvider,u},context:i})]),l={...a,...s};o.gitBranchName=l.gitBranchName,o.githubRepository=l.githubRepository,o.gitlabProjectPath=l.gitlabProjectPath,(!l.lastCommitOnMainSha||!l.lastCommitOnMainTimestamp)&&l.gitBranchName===a.gitMainBranch&&(l.lastCommitOnMainSha=l.gitCommitSha,l.lastCommitOnMainTimestamp=l.gitCommitTimestamp);let c=await Li({logger:t,operation:"getGitMetadata.getRemoteMetadataIfNeeded",fn:()=>gEe(t,e,l),context:{githubRepository:l.githubRepository,gitlabProjectPath:l.gitlabProjectPath,gitBranchName:l.gitBranchName}});return {...a,...s,...c}},context:o})}async function B3(t){try{let e=await F3(t).remote(["show","origin"]);return e?e.match(/HEAD branch: (.*)$/m)?.[1]?.trim():void 0}catch{return}}var N_=new Map;async function yEe(t,e,n){let r,o;try{[r,o]=await Promise.all([Ut(t,Bt.raw(["symbolic-ref","--short","-q","HEAD"]).then(s=>s.trim())),Ut(t,Bt.revparse(["--verify","HEAD"]).then(s=>s.trim()))]);}catch{return}if(!r||!o)return;let i=`${e.configFilePath}:${e.config.gitMainBranch}:${e.config.gitProtectedBranches?.join(",")}`,a=`${n?.includeHostingUsername}`;return `${r}:${o}:${i}:${a}`}async function gn(t,e,n,r){let o=await yEe(t,n,r);if(o&&N_.has(o))return t.debug("Using cached git metadata"),N_.get(o);let i=await bEe(t,e,n,r);return o&&N_.set(o,i),i}function TEe(t,e){let n=`${Zi(e)}.module.yaml`,r=mn__default.join(mn__default.dirname(t),n);if(br.existsSync(r))throw new Error(`A conflicting file already exists at the following path: ${r}`);return br.renameSync(t,r),r}function rs({content:t,schemaVersion:e,momenticFiles:n,project:r,forceSaveOnNoDiffs:o,forceFileFormat:i}){let a=n.mobileModules[t.moduleId]?.fullFilePath,s=n.mobileModules[t.moduleId]?.name;if(!a||!br.existsSync(a))throw new Error(`Tried to update mobile module ${t.moduleId} that could not be found on disk`);let{parsed:l}=Ni(a),c=r.config.fileFormat==="v2";i!==void 0&&(c=i==="v2");let u=!!t.name&&t.name!==s,d={...l,...t,schemaVersion:e},m=Va.parse(d),p=ra(t.platform).array().parse(t.steps),f=c?Av({metadata:{...m,moduleId:t.moduleId,name:t.name??s??""},steps:p,fileResolver:Fu({sourceFilePath:a,momenticFiles:{mobileModules:n.mobileModules}})}):pr({fileType:ve.MOBILE_MODULE,...m,steps:p}),h=diff(f,l);if(h&&Object.keys(h).length===0&&!o&&!u)return;br.writeFileSync(a,pg.stringify(f),"utf-8");let b=u?TEe(a,t.name):void 0;Ks(b??a,r.config);}function z3({moduleId:t,patch:e,momenticFiles:n,project:r,logger:o}){let i=n.mobileModules[t]?.fullFilePath;if(!i)throw new Error(`Tried to update mobile module ${t} that could not be found on disk`);let a=rc(i,o),s=oc({module:a,moduleFilePath:i,momenticFiles:n}),l=AM.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:ra(l.platform).array().parse(l.steps)};rs({content:c,schemaVersion:l.schemaVersion,momenticFiles:n,project:r});}async function jg({name:t,description:e,enabled:n,platform:r,steps:o,folder:i,project:a,momenticFiles:s}){let l=Zi(t),c=mn__default.join(i,`${l}.module.yaml`);xv({project:a,relativeFilePath:mn__default.relative(a.rootDir,c)});let u=Zm({projectConfig:a.config,momenticFiles:s,entityType:"mobile-module"}),{stepsToSave:{steps:d}}=await Tr({platform:r,stepLists:{steps:o}}),m={schemaVersion:gS,platform:r,moduleId:u,description:e,enabled:n},p=a.config.fileFormat==="v2"?Av({metadata:{...m,moduleId:u,name:t},steps:d,fileResolver:Fu({sourceFilePath:c,momenticFiles:{mobileModules:s.mobileModules}})}):RM.parse({fileType:ve.MOBILE_MODULE,...m,steps:d});return br.mkdirSync(i,{recursive:true}),br.writeFileSync(c,pg.stringify(p),"utf-8"),Ks(c,a.config),{moduleId:u,platform:r,name:t,description:e||void 0,steps:o}}function rc(t,e){let{parsed:n}=Ni(t);if(Lg(n))try{return PE.parse(n)}catch(r){throw e.error({err:r,moduleFilePath:t,existingModule:n},`${t} does not parse as a valid V2 Momentic mobile module`),r}try{return RM.parse(n)}catch(r){throw e.error({err:r,moduleFilePath:t,existingModule:n},`${t} does not parse as a valid Momentic mobile module`),r}}function oc({module:t,moduleFilePath:e,momenticFiles:n}){let r=mn__default.basename(e,".module.yaml");if(!Lg(t))return {...t,name:r};let{module:o}=wv({moduleV2:t,moduleName:r,fileResolver:Bu({sourceFilePath:e,momenticFiles:n})});return o}async function Vu(t,e,n,r){let o=rc(t.fullFilePath,n),i=oc({module:o,moduleFilePath:t.fullFilePath,momenticFiles:e}),a=i.platform==="ANDROID"?r?.android:r?.ios,{resolvedSteps:s}=await JT({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=rc(u,n);return oc({module:d,moduleFilePath:u,momenticFiles:e})},logger:n,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 $3(t,e){let n={},r={};return await Promise.all(Object.values(t.mobileModules).map(async o=>{await Vu(o,t,e,{ios:n,android:r});})),[...Object.values(n),...Object.values(r)]}var ep=qS.array(),Pv=v__default.discriminatedUnion("platform",[sE.extend({beforeSteps:ep.optional(),steps:ep,afterSteps:ep.optional()}),lE.extend({beforeSteps:ep.optional(),steps:ep,afterSteps:ep.optional()})]);function Iv({name:t,description:e="",settings:n,folder:r,platform:o,project:i,momenticFiles:a}){try{Ei(t);}catch(p){throw new pn(`${p} when validating the test entity name`)}let l=`${Zi(t)}.test.yaml`,c=mn__default.join(r,l);if(br.existsSync(c))throw new Xf({name:t,path:c});xv({project:i,relativeFilePath:mn__default.relative(i.rootDir,c)});let u=Zm({projectConfig:i.config,momenticFiles:a,entityType:"mobile-test"}),d={fileType:ve.MOBILE_TEST,id:u,description:e,schemaVersion:cr,platform:o,settings:n,steps:[]},m=i.config.fileFormat==="v2"?Xm({metadata:d,stepLists:{steps:[]},fileResolver:Fu({sourceFilePath:c,momenticFiles:{mobileModules:a.mobileModules}})}):Xz.parse(d);return br.mkdirSync(r,{recursive:true}),br.writeFileSync(c,pg.stringify(m),"utf-8"),{fullPath:c,testId:u}}function CEe(t){if(!br.existsSync(t))throw new Error(`Test file not found: ${t}`);let{parsed:e}=Ni(t);if(Ng(e))return e;if(!e.steps||!Array.isArray(e.steps))throw new Error(`Test ${t} is missing steps`);return e}async function cn(t,e,n){let r=CEe(t),o,i;if(Ng(r)){let s;try{s=zl.parse(r);}catch(c){throw new Error(`Mobile test ${t} is missing metadata or has invalid metadata: ${H(c)}`,{cause:c})}o=kg({testV2:s});let l=await Cv({testV2:s,platform:o.platform,fileResolver:Bu({sourceFilePath:t,momenticFiles:{mobileModules:n.mobileModules}})});i={steps:l.stepLists.steps,beforeSteps:l.stepLists.beforeSteps,afterSteps:l.stepLists.afterSteps};}else {try{o=kl.parse(r);}catch(s){throw new Error(`Mobile test ${t} is missing metadata or has invalid metadata: ${H(s)}`,{cause:s})}i={steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps};}let a={rawStepLists:i,logger:e,testMetadata:o,onFetchModule:async s=>{let l=n.mobileModules[s]?.fullFilePath;if(!l)throw new Error(`Mobile module ${s} not found`);let c=rc(l,e);return oc({module:c,moduleFilePath:l,momenticFiles:n})}};switch(o.platform){case "ANDROID":{let{resolvedStepLists:s}=await o_({...a,platform:o.platform});return {...o,steps:s.steps,...s.beforeSteps?.length&&{beforeSteps:s.beforeSteps},...s.afterSteps?.length&&{afterSteps:s.afterSteps}}}case "IOS":{let{resolvedStepLists:s}=await o_({...a,platform:o.platform});return {...o,steps:s.steps,...s.beforeSteps?.length&&{beforeSteps:s.beforeSteps},...s.afterSteps?.length&&{afterSteps:s.afterSteps}}}}}async function Xs({platform:t,filePath:e,steps:n,beforeSteps:r,afterSteps:o,settings:i,labels:a,folder:s,project:l,momenticFiles:c,schemaVersion:u,forceFileFormat:d}){let m=mn__default.isAbsolute(e)?e:mn__default.join(s,e);if(!br.existsSync(m))throw new Error(`Test file not found: ${m}`);let{parsed:p}=Ni(m),f=Ng(p),h,b;if(f?(b=zl.parse(p),h={...kg({testV2:b}),schemaVersion:u,fileType:ve.MOBILE_TEST,steps:[]}):h=Pv.parse({...p,schemaVersion:u}),h.fileType!==ve.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 y=n||r||o,S=y?await Tr({platform:t,stepLists:{steps:n??[],beforeSteps:r,afterSteps:o}}):void 0,T=S?.moduleUpdates??[],C;f&&b&&!y&&(C={steps:b.steps??[],before:b.before,after:b.after});let w=l.config.fileFormat==="v2"||f;d!==void 0&&(w=d==="v2");for(let I of T)rs({content:I,schemaVersion:cr,momenticFiles:c,project:l,forceFileFormat:d});if(w){let I={...h};a!==void 0&&(I.labels=a),i!==void 0&&(I.settings=i);let A={...I,steps:[]},z;if(y&&S){let D;S.stepsToSave.beforeSteps&&S.stepsToSave.beforeSteps.length>0&&(D=S.stepsToSave.beforeSteps);let B;S.stepsToSave.afterSteps&&S.stepsToSave.afterSteps.length>0&&(B=S.stepsToSave.afterSteps),z={steps:S.stepsToSave.steps,beforeSteps:D,afterSteps:B};let F=Fu({sourceFilePath:m,momenticFiles:{mobileModules:c.mobileModules}}),$=Xm({metadata:A,stepLists:z,fileResolver:F});br.writeFileSync(m,pg.stringify($),"utf-8");}else {let D=Xm({metadata:A,stepLists:{steps:[]},fileResolver:Fu({sourceFilePath:m,momenticFiles:{mobileModules:c.mobileModules}})}),B=j3({formatted:D,stepLists:C??{steps:[]}});br.writeFileSync(m,B,"utf-8");}Ks(m,l.config);return}let _={...h,steps:h.steps};if(n&&(_.steps=S?.stepsToSave.steps??[]),a!==void 0&&(_.labels=a),r){let I=S?.stepsToSave.beforeSteps;I&&I.length>0?_.beforeSteps=I:delete _.beforeSteps;}else h.beforeSteps&&h.beforeSteps.length>0&&(_.beforeSteps=h.beforeSteps);if(o){let I=S?.stepsToSave.afterSteps;I&&I.length>0?_.afterSteps=I:delete _.afterSteps;}else h.afterSteps&&h.afterSteps.length>0&&(_.afterSteps=h.afterSteps);i&&(_.settings=i);let N=pg.stringify(Pv.parse(_));br.writeFileSync(m,N,"utf-8"),Ks(m,l.config);}function V3(t,e,n){let r=mn__default.join(n.rootDir,t);if(!br.existsSync(r))throw new Ye(`Test not found at path '${t}' in project '${n.rootDir}'`);let{parsed:o}=Ni(r),i=Ng(o),a=mn__default.basename(t,".test.yaml"),s,l;if(e.name&&e.name!==a){let u=`${Zi(e.name)}.test.yaml`;if(s=mn__default.join(mn__default.dirname(t),u),l=mn__default.join(n.rootDir,s),br.existsSync(l))throw new Xf({name:e.name,path:l})}let c=i?wEe({existingTestRaw:o,updates:e}):AEe({existingTestRaw:o,updates:e});return br.writeFileSync(r,c,"utf-8"),l&&l!==r?(br.renameSync(r,l),Ks(l,n.config)):Ks(r,n.config),{newRelativeTestPath:s}}function wEe({existingTestRaw:t,updates:e}){let n=zl.parse(t),r=kg({testV2:n}),o={...r,description:e.description??r.description,disabled:e.disabled??r.disabled,labels:e.labels??r.labels,settings:e.settings??r.settings,fileType:ve.MOBILE_TEST,steps:[]};return j3({formatted:Xm({metadata:o,stepLists:{steps:[]}}),stepLists:{before:n.before,steps:n.steps??[],after:n.after}})}function j3({formatted:t,stepLists:e}){let{steps:n,...r}=t,o=e.before;o&&o.length===0&&(o=void 0);let i=e.after;i&&i.length===0&&(i=void 0);let a=pr({...r,before:o,steps:e.steps,after:i});return pg.stringify(a)}function AEe({existingTestRaw:t,updates:e}){let r={...Pv.parse(t),...e};if(r.fileType!==ve.MOBILE_TEST)throw new Error(`Existing legacy mobile test has unexpected fileType=${r.fileType}.`);return pg.stringify(Pv.parse(r))}var H3=new Set([".DS_Store","__MACOSX"]),W3={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 n=new Set([...t.labels??[],...e.labels??[]]);return Array.from(n)},ai:(t,e)=>t.ai??e.ai,browser:(t,e)=>t.browser??e.browser,aiSelect:(t,e)=>{let n=[...t.aiSelect??[],...e.aiSelect??[]];return n.length>0?n:void 0},healRiskSummary:()=>{}};function xEe(t,e,n){if(W3[n]){let i=W3[n];return i(t,e)}let r=t[n],o=e[n];if(r===void 0)return o;if(o===void 0)return r;if(r!==o)throw new Error(`Metadata values for key "${n}" do not match: "${r}" vs "${o}"`);return r}var L_=class extends Error{constructor(e,n){let r=`${e} contains invalid Momentic results: ${n}. Please ensure that the path points to a folder containing only valid results. If you passed \`--output-dir test-results/results-1\` to the \`run\` command, your results path for merging should be \`test-results\`.`;super(r),this.name="InvalidMomenticResultsPathError";}};function G3(t,e){try{let n=mn__default.join(e,mr);return Am.parse(JSON.parse(br.readFileSync(n,"utf-8")))}catch{throw new L_(t,e)}}function q3(t,e,n){let r=randomUUID(),o=t.child({runGroupId:r});br.rmSync(e,{recursive:true,force:true});let i=br.readdirSync(n).filter(l=>!H3.has(l)).map(l=>mn__default.join(n,l));if(i.length===0)throw new Error(`No run groups found in results path: ${n}`);br.mkdirSync(e,{recursive:true});let a={...G3(n,i[0]),id:r,healRiskSummary:void 0,aiSelect:void 0};for(let l of i){let c=mn__default.join(l,yo);if(!br.existsSync(c))continue;let u=G3(n,l);o.info({oldRunGroupId:u.id},"Merging run groups");for(let m in u){if(m==="id")continue;let p=m;a[p]=xEe(a,u,p);}let d=br.readdirSync(c);for(let m of d){if(H3.has(m))continue;let p=mn__default.join(c,m),f=mn__default.join(e,yo,m);br.cpSync(p,f,{recursive:true});}}let s=mn__default.join(e,mr);br.writeFileSync(s,JSON.stringify(a,null,2));}var Q="v1",k_="mobile-cli",ju="0.111.0";var MEe=9e4,PEe=3,IEe=1500,_Ee=15e3,_n=class extends Error{status;rawError;constructor(e,n,r,o={}){super(r,o),this.status=e,this.rawError=n;}},F_=class extends Ye{constructor(e,n={}){super(e,n),this.name="PlanLimitExceededError";}};async function OEe(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var B_=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger;}getHeaders(){let e={"Content-Type":"application/json"};return (e[IE]=ju),(e[mV]=k_),e}async sendRequest(e,n){let{retries:r=PEe,requestTimeoutMs:o=MEe,initialRetryDelayMs:i=IEe,maxRetryDelayMs:a=_Ee,onFailedRequest:s}=n,l=r,c=r,u,d={path:e,baseUrl:this.baseUrl,method:n.method};for(;l>0;)try{return l--,await this.sendSingleRequestWithOTEL(e,n,o)}catch(m){u=m;try{s?.(u);}catch{}if(m instanceof _n&&m.status>=400&&m.status<500)throw m.status===402?new F_(m.rawError,{cause:m}):m;if(m instanceof Error&&m.name==="AbortError"&&(u=new Vl),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 sendSingleRequestWithOTEL(e,n,r){let o=DEe(e);return Xe({name:`cli.api.${n.method.toLowerCase()}.${o}`,serviceName:"api-server",attributes:{"http.request.method":n.method,"url.path":o},fn:i=>this.sendSingleRequestHelper(e,n,r,a=>{i?.setAttribute("http.response.status_code",a);})})}async sendSingleRequestHelper(e,n,r,o){let i={path:e,baseUrl:this.baseUrl,method:n.method},a=new AbortController,s=setTimeout(()=>a.abort(),r),l=()=>a.abort();n.signal&&n.signal.addEventListener("abort",l,{once:true});let c=Date.now(),u={...this.getHeaders(),...n.extraHeaders};try{let d=await fetch(`${this.baseUrl}${e}`,{method:n.method,body:n.body?JSON.stringify(n.body):void 0,headers:u,signal:a.signal});if(o?.(d.status),!d.ok){let f=await OEe(d);throw new _n(d.status,f,`Request to ${n.method} ${e} failed with status ${d.status}: ${f}`)}let m;if(d.status===204)m={};else if(n.responseType==="buffer"){let f=await d.arrayBuffer();m=Buffer.from(f);}else {let f=await d.text();try{m=JSON.parse(f);}catch{m=f;}}this.logger&&n.logResponse===!0&&m&&this.logger.debug({result:m,status:d.status,durationMs:Date.now()-c,...i},"Got response from Momentic server");let p=n.responseHeadersObject;return p&&d.headers.forEach((f,h)=>{p[h.toLowerCase()]=f;}),m}finally{clearTimeout(s),n.signal&&n.signal.removeEventListener("abort",l);}}};function DEe(t){return (t.split("?")[0]??t).replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,":id")}var os=class extends B_{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode;}getHeaders(){return {...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[dV]:this.mode??""}}};var vK="vercel.ai.error",NEe=Symbol.for(vK),K3,Y3,qt=class CK extends(Y3=Error,K3=NEe,Y3){constructor({name:e,message:n,cause:r}){super(n),this[K3]=true,this.name=e,this.cause=r;}static isInstance(e){return CK.hasMarker(e,vK)}static hasMarker(e,n){let r=Symbol.for(n);return e!=null&&typeof e=="object"&&r in e&&typeof e[r]=="boolean"&&e[r]===true}},wK="AI_APICallError",AK=`vercel.ai.error.${wK}`,LEe=Symbol.for(AK),X3,J3,Ir=class extends(J3=qt,X3=LEe,J3){constructor({message:t,url:e,requestBodyValues:n,statusCode:r,responseHeaders:o,responseBody:i,cause:a,isRetryable:s=r!=null&&(r===408||r===409||r===429||r>=500),data:l}){super({name:wK,message:t,cause:a}),this[X3]=true,this.url=e,this.requestBodyValues=n,this.statusCode=r,this.responseHeaders=o,this.responseBody=i,this.isRetryable=s,this.data=l;}static isInstance(t){return qt.hasMarker(t,AK)}},RK="AI_EmptyResponseBodyError",xK=`vercel.ai.error.${RK}`,kEe=Symbol.for(xK),Z3,Q3,MK=class extends(Q3=qt,Z3=kEe,Q3){constructor({message:t="Empty response body"}={}){super({name:RK,message:t}),this[Z3]=true;}static isInstance(t){return qt.hasMarker(t,xK)}};function PK(t){return t==null?"unknown error":typeof t=="string"?t:t instanceof Error?t.message:JSON.stringify(t)}var IK="AI_InvalidArgumentError",_K=`vercel.ai.error.${IK}`,FEe=Symbol.for(_K),eK,tK,_v=class extends(tK=qt,eK=FEe,tK){constructor({message:t,cause:e,argument:n}){super({name:IK,message:t,cause:e}),this[eK]=true,this.argument=n;}static isInstance(t){return qt.hasMarker(t,_K)}},OK="AI_InvalidPromptError",DK=`vercel.ai.error.${OK}`,BEe=Symbol.for(DK),nK,rK,NK=class extends(rK=qt,nK=BEe,rK){constructor({prompt:t,message:e,cause:n}){super({name:OK,message:`Invalid prompt: ${e}`,cause:n}),this[nK]=true,this.prompt=t;}static isInstance(t){return qt.hasMarker(t,DK)}},LK="AI_InvalidResponseDataError",kK=`vercel.ai.error.${LK}`,UEe=Symbol.for(kK),oK,iK,Ov=class extends(iK=qt,oK=UEe,iK){constructor({data:t,message:e=`Invalid response data: ${JSON.stringify(t)}.`}){super({name:LK,message:e}),this[oK]=true,this.data=t;}static isInstance(t){return qt.hasMarker(t,kK)}},FK="AI_JSONParseError",BK=`vercel.ai.error.${FK}`,zEe=Symbol.for(BK),aK,sK,Wg=class extends(sK=qt,aK=zEe,sK){constructor({text:t,cause:e}){super({name:FK,message:`JSON parsing failed: Text: ${t}.
|
|
218
|
+
`)){let o=r.indexOf("=");if(o===-1)continue;let i=r.slice(0,o),a=r.slice(o+1).trim();n[i]=a;}return n}async function eEe(t,e,n){try{let o=n["github.user"]||void 0;if(o)return o}catch{}let r;try{if(e?.startsWith("http://")||e?.startsWith("https://"))r=new URL(e).host;else if(e?.startsWith("git@")){let o=e.indexOf("@"),i=e.indexOf(":",o+1);o!==-1&&i!==-1&&(r=e.slice(o+1,i));}}catch{}if(r=r?.toLowerCase(),!!r&&e?.startsWith("git@")&&r.includes("github"))try{let{stdout:o,stderr:i}=await ZSe("ssh",["-T","-o","BatchMode=yes",`git@${r}`],{timeout:5e3}),s=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}catch{return}}async function tEe(t,e,n){let r=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(r)return eEe(t,e,n);if(o)return}catch{}}function zg(t){if(t.startsWith("git@")){let e=t.split(":");if(e.length===2){let n=e[1].replace(".git","").split("/");if(n.length===2){let r=n[0],o=n[1];return `${r}/${o}`}}}else if(t.startsWith("http")||t.startsWith("https")){let n=new URL(t).pathname.split("/").filter(Boolean);if(n.length>=2){let r=n[0],o=n[1].replace(".git","");return `${r}/${o}`}}}function nEe(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 Ut(t,e){try{return (await e).trim()}catch(n){if(nEe(n))return;t.error({err:n},"Failed to run git command");return}}function rEe(){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 oEe(t){let[e,n,r]=await Promise.all([Ut(t,Bt.show(["--no-patch","--format=%ci"])),Ut(t,Bt.show(["-s","--pretty=%B"])),Ut(t,Bt.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return {ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?ns(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function iEe(t){let[e,n,r]=await Promise.all([Ut(t,Bt.listRemote(["--get-url","origin"])),Ut(t,Bt.show(["-s","--pretty=%B"])),Ut(t,Bt.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?ns(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:n,gitCommitAuthorName:r,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function aEe(t){let[e,n,r,o]=await Promise.all([Ut(t,Bt.show(["--no-patch","--format=%ci"])),Ut(t,Bt.listRemote(["--get-url","origin"])),Ut(t,Bt.show(["-s","--pretty=%B"])),Ut(t,Bt.show(["-s","--pretty=%an"]))]),a=process.env.CIRCLE_REPOSITORY_URL?.trim()||void 0||n||void 0,s=a?.includes("github.com")??false,l=a?.includes("gitlab.com")??false,c=a?zg(a):void 0;return {ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?ns(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:a,gitCommitMessage:r,gitCommitAuthorName:o,githubRepository:s?c:void 0,gitlabProjectPath:l?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function sEe(t){let[e,n,r]=await Promise.all([Ut(t,Bt.show(["--no-patch","--format=%ci"])),Ut(t,Bt.show(["-s","--pretty=%B"])),Ut(t,Bt.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?zg(o):void 0;return {ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?ns(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function lEe(t){let[e,n,r]=await Promise.all([Ut(t,Bt.show(["--no-patch","--format=%ci"])),Ut(t,Bt.show(["-s","--pretty=%B"])),Ut(t,Bt.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?zg(o):void 0;return {ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?ns(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function cEe(t,e,n){let[r,o,i,a,s,l,c,u,d]=await Promise.all([Ut(t,Bt.revparse(["HEAD"])),Ut(t,Bt.revparse(["--short","HEAD"])),Ut(t,Bt.revparse(["--abbrev-ref","HEAD"])),Ut(t,Bt.listRemote(["--get-url","origin"])),Ut(t,Bt.show(["--no-patch","--format=%ci"])),Ut(t,Bt.show(["-s","--pretty=%B"])),Ut(t,Bt.show(["-s","--pretty=%an"])),e?Ut(t,Bt.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),QSe(t)]),m=u||(e?await Ut(t,Bt.raw(["merge-base",e,"HEAD"])):void 0),p=m?await Ut(t,Bt.show(["--no-patch","--format=%ci",m])):void 0,f=a?.includes("github.com"),h=a?.includes("gitlab.com"),b=a?zg(a):void 0,y=d["user.email"]||void 0,S=d["user.name"]||void 0,T=d["user.username"]||void 0,C=d["github.user"]||void 0,N=(n?.includeHostingUsername??true?await tEe(t,a,d):void 0)??T??C??void 0;return {ciProvider:"none",gitCommitSha:r,gitCommitShaShort:o,gitBranchName:i,gitOriginUrl:a,gitCommitTimestamp:s?ns(s):void 0,gitCommitMessage:l,gitCommitAuthorName:c,gitLocalUsername:N,gitLocalEmail:y,gitLocalName:S,lastCommitOnMainSha:m,lastCommitOnMainTimestamp:p?ns(p):void 0,githubRepository:f?b:void 0,gitlabProjectPath:h?b:void 0,pipelineId:void 0}}async function uEe(t){let[e,n]=await Promise.all([Ut(t,Bt.show(["--no-patch","--format=%ci"])),Ut(t,Bt.show(["-s","--pretty=%an"]))]),r=process.env.GIT_REPOSITORY_URL,o=r?.includes("github.com"),i=r?.includes("gitlab.com"),a=r?zg(r):void 0;return {ciProvider:"Bitrise",gitCommitSha:process.env.BITRISE_GIT_COMMIT,gitCommitShaShort:process.env.BITRISE_GIT_COMMIT?.slice(0,6),gitCommitTimestamp:e?ns(e):void 0,gitBranchName:process.env.BITRISE_GIT_BRANCH,gitOriginUrl:r,gitCommitMessage:process.env.BITRISE_GIT_MESSAGE,gitCommitAuthorName:n,githubRepository:o?a:void 0,gitlabProjectPath:i?a:void 0,pipelineId:`${process.env.BITRISE_APP_SLUG}:${process.env.BITRISE_BUILD_SLUG}`}}async function dEe(){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 mEe(){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:ns(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:ns(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 pEe(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function $g(t,e,n){let r=rEe();if(!r)return cEe(t,e,n);switch(r){case "GithubActions":return oEe(t);case "GitlabCI":return iEe(t);case "CircleCI":return aEe(t);case "Buildkite":return sEe(t);case "AzureDevOps":return lEe(t);case "GCPCloudBuild":return dEe();case "Bitrise":return uEe(t);case "Custom":return mEe()}}async function fEe(t,e,n,r){let o=r,i=r.gitCommitSha;if(!i)return o;let a=r.gitMainBranch;if(a&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let s=await Li({logger:t,operation:"getRemoteMetadataFromGitlab.getMergeBaseCommitFromGitlab",fn:()=>e.getMergeBaseCommitFromGitlab(n,a,i),context:{projectPath:n,mainBranch:a}});o={...o,lastCommitOnMainSha:s.sha,lastCommitOnMainTimestamp:s.committer.date};}catch(s){t.warn({err:s},"Failed to get merge base commit from Gitlab");}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let s=await Li({logger:t,operation:"getRemoteMetadataFromGitlab.getCommitFromGitlab",fn:()=>e.getCommitFromGitlab(n,i),context:{projectPath:n,gitCommitSha:i}});s&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??s.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??s.author.name,gitCommitMessage:o.gitCommitMessage??s.message});}catch(s){t.warn({err:s},"Failed to get commit from Gitlab");}if(r.gitBranchName&&r.gitBranchName===r.gitMainBranch&&!o.mergedGitBranchName){let s=r.gitBranchName;try{let l=await Li({logger:t,operation:"getRemoteMetadataFromGitlab.getMergedBranchFromGitlab",fn:()=>e.getMergedBranchFromGitlab(n,s,i),context:{projectPath:n,branchName:s,gitCommitSha:i}});l.mergedBranch&&(o={...o,mergedGitBranchName:l.mergedBranch});}catch(l){t.warn({err:l},"Failed to get merged branch from Gitlab");}}return o}async function hEe(t,e,n,r,o){let i=o,a=o.gitCommitSha;if(!a)return i;let s=o.gitMainBranch;if(s&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let l=await Li({logger:t,operation:"getRemoteMetadataFromGitHub.getMergeBaseCommitFromGithub",fn:()=>e.getMergeBaseCommitFromGithub(n,r,s,a),context:{owner:n,repo:r,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 Li({logger:t,operation:"getRemoteMetadataFromGitHub.getCommitFromGithub",fn:()=>e.getCommitFromGithub(n,r,a),context:{owner:n,repo:r,gitCommitSha:a}});l&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??l.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??l.author.name,gitCommitMessage:i.gitCommitMessage??l.message});}catch(l){t.warn({err:l},"Failed to get commit from GitHub");}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName){let l=o.gitBranchName;try{let c=await Li({logger:t,operation:"getRemoteMetadataFromGitHub.getMergedBranchFromGithub",fn:()=>e.getMergedBranchFromGithub(n,r,l,a),context:{owner:n,repo:r,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 gEe(t,e,n){try{if(n.githubRepository){let{owner:r,repo:o}=S1(n.githubRepository);return await Li({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitHub",fn:()=>hEe(t,e,r,o,n),context:{githubRepository:n.githubRepository}})}else if(n.gitlabProjectPath){let r=n.gitlabProjectPath;return await Li({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitlab",fn:()=>fEe(t,e,r,n),context:{gitlabProjectPath:r}})}}catch(r){t.warn({err:r},"Failed to get remote git metadata");}return n}async function bEe(t,e,n,r){let o={},i={gitMainBranch:n.config.gitMainBranch};return Li({logger:t,operation:"getGitMetadata.total",fn:async()=>{let[a,s]=await Promise.all([Li({logger:t,operation:"getGitMetadata.getConfiguredGitMetadata",fn:()=>pEe(n),context:{projectConfigPath:n.configFilePath}}),Li({logger:t,operation:"getGitMetadata.getEnvironmentGitMetadata",fn:async()=>{let u=await $g(t,n.config.gitMainBranch,r);return i.ciProvider=u.ciProvider,u},context:i})]),l={...a,...s};o.gitBranchName=l.gitBranchName,o.githubRepository=l.githubRepository,o.gitlabProjectPath=l.gitlabProjectPath,(!l.lastCommitOnMainSha||!l.lastCommitOnMainTimestamp)&&l.gitBranchName===a.gitMainBranch&&(l.lastCommitOnMainSha=l.gitCommitSha,l.lastCommitOnMainTimestamp=l.gitCommitTimestamp);let c=await Li({logger:t,operation:"getGitMetadata.getRemoteMetadataIfNeeded",fn:()=>gEe(t,e,l),context:{githubRepository:l.githubRepository,gitlabProjectPath:l.gitlabProjectPath,gitBranchName:l.gitBranchName}});return {...a,...s,...c}},context:o})}async function B3(t){try{let e=await F3(t).remote(["show","origin"]);return e?e.match(/HEAD branch: (.*)$/m)?.[1]?.trim():void 0}catch{return}}var N_=new Map;async function yEe(t,e,n){let r,o;try{[r,o]=await Promise.all([Ut(t,Bt.raw(["symbolic-ref","--short","-q","HEAD"]).then(s=>s.trim())),Ut(t,Bt.revparse(["--verify","HEAD"]).then(s=>s.trim()))]);}catch{return}if(!r||!o)return;let i=`${e.configFilePath}:${e.config.gitMainBranch}:${e.config.gitProtectedBranches?.join(",")}`,a=`${n?.includeHostingUsername}`;return `${r}:${o}:${i}:${a}`}async function gn(t,e,n,r){let o=await yEe(t,n,r);if(o&&N_.has(o))return t.debug("Using cached git metadata"),N_.get(o);let i=await bEe(t,e,n,r);return o&&N_.set(o,i),i}function TEe(t,e){let n=`${Zi(e)}.module.yaml`,r=mn__default.join(mn__default.dirname(t),n);if(br.existsSync(r))throw new Error(`A conflicting file already exists at the following path: ${r}`);return br.renameSync(t,r),r}function rs({content:t,schemaVersion:e,momenticFiles:n,project:r,forceSaveOnNoDiffs:o,forceFileFormat:i}){let a=n.mobileModules[t.moduleId]?.fullFilePath,s=n.mobileModules[t.moduleId]?.name;if(!a||!br.existsSync(a))throw new Error(`Tried to update mobile module ${t.moduleId} that could not be found on disk`);let{parsed:l}=Ni(a),c=r.config.fileFormat==="v2";i!==void 0&&(c=i==="v2");let u=!!t.name&&t.name!==s,d={...l,...t,schemaVersion:e},m=Va.parse(d),p=ra(t.platform).array().parse(t.steps),f=c?Av({metadata:{...m,moduleId:t.moduleId,name:t.name??s??""},steps:p,fileResolver:Fu({sourceFilePath:a,momenticFiles:{mobileModules:n.mobileModules}})}):pr({fileType:ve.MOBILE_MODULE,...m,steps:p}),h=diff(f,l);if(h&&Object.keys(h).length===0&&!o&&!u)return;br.writeFileSync(a,pg.stringify(f),"utf-8");let b=u?TEe(a,t.name):void 0;Ks(b??a,r.config);}function z3({moduleId:t,patch:e,momenticFiles:n,project:r,logger:o}){let i=n.mobileModules[t]?.fullFilePath;if(!i)throw new Error(`Tried to update mobile module ${t} that could not be found on disk`);let a=rc(i,o),s=oc({module:a,moduleFilePath:i,momenticFiles:n}),l=AM.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:ra(l.platform).array().parse(l.steps)};rs({content:c,schemaVersion:l.schemaVersion,momenticFiles:n,project:r});}async function jg({name:t,description:e,enabled:n,platform:r,steps:o,folder:i,project:a,momenticFiles:s}){let l=Zi(t),c=mn__default.join(i,`${l}.module.yaml`);xv({project:a,relativeFilePath:mn__default.relative(a.rootDir,c)});let u=Zm({projectConfig:a.config,momenticFiles:s,entityType:"mobile-module"}),{stepsToSave:{steps:d}}=await Tr({platform:r,stepLists:{steps:o}}),m={schemaVersion:gS,platform:r,moduleId:u,description:e,enabled:n},p=a.config.fileFormat==="v2"?Av({metadata:{...m,moduleId:u,name:t},steps:d,fileResolver:Fu({sourceFilePath:c,momenticFiles:{mobileModules:s.mobileModules}})}):RM.parse({fileType:ve.MOBILE_MODULE,...m,steps:d});return br.mkdirSync(i,{recursive:true}),br.writeFileSync(c,pg.stringify(p),"utf-8"),Ks(c,a.config),{moduleId:u,platform:r,name:t,description:e||void 0,steps:o}}function rc(t,e){let{parsed:n}=Ni(t);if(Lg(n))try{return PE.parse(n)}catch(r){throw e.error({err:r,moduleFilePath:t,existingModule:n},`${t} does not parse as a valid V2 Momentic mobile module`),r}try{return RM.parse(n)}catch(r){throw e.error({err:r,moduleFilePath:t,existingModule:n},`${t} does not parse as a valid Momentic mobile module`),r}}function oc({module:t,moduleFilePath:e,momenticFiles:n}){let r=mn__default.basename(e,".module.yaml");if(!Lg(t))return {...t,name:r};let{module:o}=wv({moduleV2:t,moduleName:r,fileResolver:Bu({sourceFilePath:e,momenticFiles:n})});return o}async function Vu(t,e,n,r){let o=rc(t.fullFilePath,n),i=oc({module:o,moduleFilePath:t.fullFilePath,momenticFiles:e}),a=i.platform==="ANDROID"?r?.android:r?.ios,{resolvedSteps:s}=await JT({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=rc(u,n);return oc({module:d,moduleFilePath:u,momenticFiles:e})},logger:n,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 $3(t,e){let n={},r={};return await Promise.all(Object.values(t.mobileModules).map(async o=>{await Vu(o,t,e,{ios:n,android:r});})),[...Object.values(n),...Object.values(r)]}var ep=qS.array(),Pv=v__default.discriminatedUnion("platform",[sE.extend({beforeSteps:ep.optional(),steps:ep,afterSteps:ep.optional()}),lE.extend({beforeSteps:ep.optional(),steps:ep,afterSteps:ep.optional()})]);function Iv({name:t,description:e="",settings:n,folder:r,platform:o,project:i,momenticFiles:a}){try{Ei(t);}catch(p){throw new pn(`${p} when validating the test entity name`)}let l=`${Zi(t)}.test.yaml`,c=mn__default.join(r,l);if(br.existsSync(c))throw new Xf({name:t,path:c});xv({project:i,relativeFilePath:mn__default.relative(i.rootDir,c)});let u=Zm({projectConfig:i.config,momenticFiles:a,entityType:"mobile-test"}),d={fileType:ve.MOBILE_TEST,id:u,description:e,schemaVersion:cr,platform:o,settings:n,steps:[]},m=i.config.fileFormat==="v2"?Xm({metadata:d,stepLists:{steps:[]},fileResolver:Fu({sourceFilePath:c,momenticFiles:{mobileModules:a.mobileModules}})}):Xz.parse(d);return br.mkdirSync(r,{recursive:true}),br.writeFileSync(c,pg.stringify(m),"utf-8"),{fullPath:c,testId:u}}function CEe(t){if(!br.existsSync(t))throw new Error(`Test file not found: ${t}`);let{parsed:e}=Ni(t);if(Ng(e))return e;if(!e.steps||!Array.isArray(e.steps))throw new Error(`Test ${t} is missing steps`);return e}async function cn(t,e,n){let r=CEe(t),o,i;if(Ng(r)){let s;try{s=zl.parse(r);}catch(c){throw new Error(`Mobile test ${t} is missing metadata or has invalid metadata: ${H(c)}`,{cause:c})}o=kg({testV2:s});let l=await Cv({testV2:s,platform:o.platform,fileResolver:Bu({sourceFilePath:t,momenticFiles:{mobileModules:n.mobileModules}})});i={steps:l.stepLists.steps,beforeSteps:l.stepLists.beforeSteps,afterSteps:l.stepLists.afterSteps};}else {try{o=kl.parse(r);}catch(s){throw new Error(`Mobile test ${t} is missing metadata or has invalid metadata: ${H(s)}`,{cause:s})}i={steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps};}let a={rawStepLists:i,logger:e,testMetadata:o,onFetchModule:async s=>{let l=n.mobileModules[s]?.fullFilePath;if(!l)throw new Error(`Mobile module ${s} not found`);let c=rc(l,e);return oc({module:c,moduleFilePath:l,momenticFiles:n})}};switch(o.platform){case "ANDROID":{let{resolvedStepLists:s}=await o_({...a,platform:o.platform});return {...o,steps:s.steps,...s.beforeSteps?.length&&{beforeSteps:s.beforeSteps},...s.afterSteps?.length&&{afterSteps:s.afterSteps}}}case "IOS":{let{resolvedStepLists:s}=await o_({...a,platform:o.platform});return {...o,steps:s.steps,...s.beforeSteps?.length&&{beforeSteps:s.beforeSteps},...s.afterSteps?.length&&{afterSteps:s.afterSteps}}}}}async function Xs({platform:t,filePath:e,steps:n,beforeSteps:r,afterSteps:o,settings:i,labels:a,folder:s,project:l,momenticFiles:c,schemaVersion:u,forceFileFormat:d}){let m=mn__default.isAbsolute(e)?e:mn__default.join(s,e);if(!br.existsSync(m))throw new Error(`Test file not found: ${m}`);let{parsed:p}=Ni(m),f=Ng(p),h,b;if(f?(b=zl.parse(p),h={...kg({testV2:b}),schemaVersion:u,fileType:ve.MOBILE_TEST,steps:[]}):h=Pv.parse({...p,schemaVersion:u}),h.fileType!==ve.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 y=n||r||o,S=y?await Tr({platform:t,stepLists:{steps:n??[],beforeSteps:r,afterSteps:o}}):void 0,T=S?.moduleUpdates??[],C;f&&b&&!y&&(C={steps:b.steps??[],before:b.before,after:b.after});let w=l.config.fileFormat==="v2"||f;d!==void 0&&(w=d==="v2");for(let I of T)rs({content:I,schemaVersion:cr,momenticFiles:c,project:l,forceFileFormat:d});if(w){let I={...h};a!==void 0&&(I.labels=a),i!==void 0&&(I.settings=i);let A={...I,steps:[]},z;if(y&&S){let D;S.stepsToSave.beforeSteps&&S.stepsToSave.beforeSteps.length>0&&(D=S.stepsToSave.beforeSteps);let B;S.stepsToSave.afterSteps&&S.stepsToSave.afterSteps.length>0&&(B=S.stepsToSave.afterSteps),z={steps:S.stepsToSave.steps,beforeSteps:D,afterSteps:B};let F=Fu({sourceFilePath:m,momenticFiles:{mobileModules:c.mobileModules}}),$=Xm({metadata:A,stepLists:z,fileResolver:F});br.writeFileSync(m,pg.stringify($),"utf-8");}else {let D=Xm({metadata:A,stepLists:{steps:[]},fileResolver:Fu({sourceFilePath:m,momenticFiles:{mobileModules:c.mobileModules}})}),B=j3({formatted:D,stepLists:C??{steps:[]}});br.writeFileSync(m,B,"utf-8");}Ks(m,l.config);return}let _={...h,steps:h.steps};if(n&&(_.steps=S?.stepsToSave.steps??[]),a!==void 0&&(_.labels=a),r){let I=S?.stepsToSave.beforeSteps;I&&I.length>0?_.beforeSteps=I:delete _.beforeSteps;}else h.beforeSteps&&h.beforeSteps.length>0&&(_.beforeSteps=h.beforeSteps);if(o){let I=S?.stepsToSave.afterSteps;I&&I.length>0?_.afterSteps=I:delete _.afterSteps;}else h.afterSteps&&h.afterSteps.length>0&&(_.afterSteps=h.afterSteps);i&&(_.settings=i);let N=pg.stringify(Pv.parse(_));br.writeFileSync(m,N,"utf-8"),Ks(m,l.config);}function V3(t,e,n){let r=mn__default.join(n.rootDir,t);if(!br.existsSync(r))throw new Ye(`Test not found at path '${t}' in project '${n.rootDir}'`);let{parsed:o}=Ni(r),i=Ng(o),a=mn__default.basename(t,".test.yaml"),s,l;if(e.name&&e.name!==a){let u=`${Zi(e.name)}.test.yaml`;if(s=mn__default.join(mn__default.dirname(t),u),l=mn__default.join(n.rootDir,s),br.existsSync(l))throw new Xf({name:e.name,path:l})}let c=i?wEe({existingTestRaw:o,updates:e}):AEe({existingTestRaw:o,updates:e});return br.writeFileSync(r,c,"utf-8"),l&&l!==r?(br.renameSync(r,l),Ks(l,n.config)):Ks(r,n.config),{newRelativeTestPath:s}}function wEe({existingTestRaw:t,updates:e}){let n=zl.parse(t),r=kg({testV2:n}),o={...r,description:e.description??r.description,disabled:e.disabled??r.disabled,labels:e.labels??r.labels,settings:e.settings??r.settings,fileType:ve.MOBILE_TEST,steps:[]};return j3({formatted:Xm({metadata:o,stepLists:{steps:[]}}),stepLists:{before:n.before,steps:n.steps??[],after:n.after}})}function j3({formatted:t,stepLists:e}){let{steps:n,...r}=t,o=e.before;o&&o.length===0&&(o=void 0);let i=e.after;i&&i.length===0&&(i=void 0);let a=pr({...r,before:o,steps:e.steps,after:i});return pg.stringify(a)}function AEe({existingTestRaw:t,updates:e}){let r={...Pv.parse(t),...e};if(r.fileType!==ve.MOBILE_TEST)throw new Error(`Existing legacy mobile test has unexpected fileType=${r.fileType}.`);return pg.stringify(Pv.parse(r))}var H3=new Set([".DS_Store","__MACOSX"]),W3={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 n=new Set([...t.labels??[],...e.labels??[]]);return Array.from(n)},ai:(t,e)=>t.ai??e.ai,browser:(t,e)=>t.browser??e.browser,aiSelect:(t,e)=>{let n=[...t.aiSelect??[],...e.aiSelect??[]];return n.length>0?n:void 0},healRiskSummary:()=>{}};function xEe(t,e,n){if(W3[n]){let i=W3[n];return i(t,e)}let r=t[n],o=e[n];if(r===void 0)return o;if(o===void 0)return r;if(r!==o)throw new Error(`Metadata values for key "${n}" do not match: "${r}" vs "${o}"`);return r}var L_=class extends Error{constructor(e,n){let r=`${e} contains invalid Momentic results: ${n}. Please ensure that the path points to a folder containing only valid results. If you passed \`--output-dir test-results/results-1\` to the \`run\` command, your results path for merging should be \`test-results\`.`;super(r),this.name="InvalidMomenticResultsPathError";}};function G3(t,e){try{let n=mn__default.join(e,mr);return Am.parse(JSON.parse(br.readFileSync(n,"utf-8")))}catch{throw new L_(t,e)}}function q3(t,e,n){let r=randomUUID(),o=t.child({runGroupId:r});br.rmSync(e,{recursive:true,force:true});let i=br.readdirSync(n).filter(l=>!H3.has(l)).map(l=>mn__default.join(n,l));if(i.length===0)throw new Error(`No run groups found in results path: ${n}`);br.mkdirSync(e,{recursive:true});let a={...G3(n,i[0]),id:r,healRiskSummary:void 0,aiSelect:void 0};for(let l of i){let c=mn__default.join(l,yo);if(!br.existsSync(c))continue;let u=G3(n,l);o.info({oldRunGroupId:u.id},"Merging run groups");for(let m in u){if(m==="id")continue;let p=m;a[p]=xEe(a,u,p);}let d=br.readdirSync(c);for(let m of d){if(H3.has(m))continue;let p=mn__default.join(c,m),f=mn__default.join(e,yo,m);br.cpSync(p,f,{recursive:true});}}let s=mn__default.join(e,mr);br.writeFileSync(s,JSON.stringify(a,null,2));}var Q="v1",k_="mobile-cli",ju="0.111.1";var MEe=9e4,PEe=3,IEe=1500,_Ee=15e3,_n=class extends Error{status;rawError;constructor(e,n,r,o={}){super(r,o),this.status=e,this.rawError=n;}},F_=class extends Ye{constructor(e,n={}){super(e,n),this.name="PlanLimitExceededError";}};async function OEe(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var B_=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger;}getHeaders(){let e={"Content-Type":"application/json"};return (e[IE]=ju),(e[mV]=k_),e}async sendRequest(e,n){let{retries:r=PEe,requestTimeoutMs:o=MEe,initialRetryDelayMs:i=IEe,maxRetryDelayMs:a=_Ee,onFailedRequest:s}=n,l=r,c=r,u,d={path:e,baseUrl:this.baseUrl,method:n.method};for(;l>0;)try{return l--,await this.sendSingleRequestWithOTEL(e,n,o)}catch(m){u=m;try{s?.(u);}catch{}if(m instanceof _n&&m.status>=400&&m.status<500)throw m.status===402?new F_(m.rawError,{cause:m}):m;if(m instanceof Error&&m.name==="AbortError"&&(u=new Vl),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 sendSingleRequestWithOTEL(e,n,r){let o=DEe(e);return Xe({name:`cli.api.${n.method.toLowerCase()}.${o}`,serviceName:"api-server",attributes:{"http.request.method":n.method,"url.path":o},fn:i=>this.sendSingleRequestHelper(e,n,r,a=>{i?.setAttribute("http.response.status_code",a);})})}async sendSingleRequestHelper(e,n,r,o){let i={path:e,baseUrl:this.baseUrl,method:n.method},a=new AbortController,s=setTimeout(()=>a.abort(),r),l=()=>a.abort();n.signal&&n.signal.addEventListener("abort",l,{once:true});let c=Date.now(),u={...this.getHeaders(),...n.extraHeaders};try{let d=await fetch(`${this.baseUrl}${e}`,{method:n.method,body:n.body?JSON.stringify(n.body):void 0,headers:u,signal:a.signal});if(o?.(d.status),!d.ok){let f=await OEe(d);throw new _n(d.status,f,`Request to ${n.method} ${e} failed with status ${d.status}: ${f}`)}let m;if(d.status===204)m={};else if(n.responseType==="buffer"){let f=await d.arrayBuffer();m=Buffer.from(f);}else {let f=await d.text();try{m=JSON.parse(f);}catch{m=f;}}this.logger&&n.logResponse===!0&&m&&this.logger.debug({result:m,status:d.status,durationMs:Date.now()-c,...i},"Got response from Momentic server");let p=n.responseHeadersObject;return p&&d.headers.forEach((f,h)=>{p[h.toLowerCase()]=f;}),m}finally{clearTimeout(s),n.signal&&n.signal.removeEventListener("abort",l);}}};function DEe(t){return (t.split("?")[0]??t).replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,":id")}var os=class extends B_{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode;}getHeaders(){return {...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[dV]:this.mode??""}}};var vK="vercel.ai.error",NEe=Symbol.for(vK),K3,Y3,qt=class CK extends(Y3=Error,K3=NEe,Y3){constructor({name:e,message:n,cause:r}){super(n),this[K3]=true,this.name=e,this.cause=r;}static isInstance(e){return CK.hasMarker(e,vK)}static hasMarker(e,n){let r=Symbol.for(n);return e!=null&&typeof e=="object"&&r in e&&typeof e[r]=="boolean"&&e[r]===true}},wK="AI_APICallError",AK=`vercel.ai.error.${wK}`,LEe=Symbol.for(AK),X3,J3,Ir=class extends(J3=qt,X3=LEe,J3){constructor({message:t,url:e,requestBodyValues:n,statusCode:r,responseHeaders:o,responseBody:i,cause:a,isRetryable:s=r!=null&&(r===408||r===409||r===429||r>=500),data:l}){super({name:wK,message:t,cause:a}),this[X3]=true,this.url=e,this.requestBodyValues=n,this.statusCode=r,this.responseHeaders=o,this.responseBody=i,this.isRetryable=s,this.data=l;}static isInstance(t){return qt.hasMarker(t,AK)}},RK="AI_EmptyResponseBodyError",xK=`vercel.ai.error.${RK}`,kEe=Symbol.for(xK),Z3,Q3,MK=class extends(Q3=qt,Z3=kEe,Q3){constructor({message:t="Empty response body"}={}){super({name:RK,message:t}),this[Z3]=true;}static isInstance(t){return qt.hasMarker(t,xK)}};function PK(t){return t==null?"unknown error":typeof t=="string"?t:t instanceof Error?t.message:JSON.stringify(t)}var IK="AI_InvalidArgumentError",_K=`vercel.ai.error.${IK}`,FEe=Symbol.for(_K),eK,tK,_v=class extends(tK=qt,eK=FEe,tK){constructor({message:t,cause:e,argument:n}){super({name:IK,message:t,cause:e}),this[eK]=true,this.argument=n;}static isInstance(t){return qt.hasMarker(t,_K)}},OK="AI_InvalidPromptError",DK=`vercel.ai.error.${OK}`,BEe=Symbol.for(DK),nK,rK,NK=class extends(rK=qt,nK=BEe,rK){constructor({prompt:t,message:e,cause:n}){super({name:OK,message:`Invalid prompt: ${e}`,cause:n}),this[nK]=true,this.prompt=t;}static isInstance(t){return qt.hasMarker(t,DK)}},LK="AI_InvalidResponseDataError",kK=`vercel.ai.error.${LK}`,UEe=Symbol.for(kK),oK,iK,Ov=class extends(iK=qt,oK=UEe,iK){constructor({data:t,message:e=`Invalid response data: ${JSON.stringify(t)}.`}){super({name:LK,message:e}),this[oK]=true,this.data=t;}static isInstance(t){return qt.hasMarker(t,kK)}},FK="AI_JSONParseError",BK=`vercel.ai.error.${FK}`,zEe=Symbol.for(BK),aK,sK,Wg=class extends(sK=qt,aK=zEe,sK){constructor({text:t,cause:e}){super({name:FK,message:`JSON parsing failed: Text: ${t}.
|
|
219
219
|
Error message: ${PK(e)}`,cause:e}),this[aK]=true,this.text=t;}static isInstance(t){return qt.hasMarker(t,BK)}},UK="AI_LoadAPIKeyError",zK=`vercel.ai.error.${UK}`,$Ee=Symbol.for(zK),lK,cK,Gg=class extends(cK=qt,lK=$Ee,cK){constructor({message:t}){super({name:UK,message:t}),this[lK]=true;}static isInstance(t){return qt.hasMarker(t,zK)}},qK="AI_TooManyEmbeddingValuesForCallError",KK=`vercel.ai.error.${qK}`,WEe=Symbol.for(KK),gK,bK,YK=class extends(bK=qt,gK=WEe,bK){constructor(t){super({name:qK,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[gK]=true,this.provider=t.provider,this.modelId=t.modelId,this.maxEmbeddingsPerCall=t.maxEmbeddingsPerCall,this.values=t.values;}static isInstance(t){return qt.hasMarker(t,KK)}},XK="AI_TypeValidationError",JK=`vercel.ai.error.${XK}`,GEe=Symbol.for(JK),yK,SK,ac=class U_ extends(SK=qt,yK=GEe,SK){constructor({value:e,cause:n,context:r}){let o="Type validation failed";if(r?.field&&(o+=` for ${r.field}`),r?.entityName||r?.entityId){o+=" (";let i=[];r.entityName&&i.push(r.entityName),r.entityId&&i.push(`id: "${r.entityId}"`),o+=i.join(", "),o+=")";}super({name:XK,message:`${o}: Value: ${JSON.stringify(e)}.
|
|
220
220
|
Error message: ${PK(n)}`,cause:n}),this[yK]=true,this.value=e,this.context=r;}static isInstance(e){return qt.hasMarker(e,JK)}static wrap({value:e,cause:n,context:r}){var o,i,a;return U_.isInstance(n)&&n.value===e&&((o=n.context)==null?void 0:o.field)===r?.field&&((i=n.context)==null?void 0:i.entityName)===r?.entityName&&((a=n.context)==null?void 0:a.entityId)===r?.entityId?n:new U_({value:e,cause:n,context:r})}},ZK="AI_UnsupportedFunctionalityError",QK=`vercel.ai.error.${ZK}`,qEe=Symbol.for(QK),EK,TK,No=class extends(TK=qt,EK=qEe,TK){constructor({functionality:t,message:e=`'${t}' functionality not supported.`}){super({name:ZK,message:e}),this[EK]=true,this.functionality=t;}static isInstance(t){return qt.hasMarker(t,QK)}};var Dv=class extends Error{constructor(e,n){super(e),this.name="ParseError",this.type=n.type,this.field=n.field,this.value=n.value,this.line=n.line;}};function z_(t){}function e4(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=z_,onError:n=z_,onRetry:r=z_,onComment:o}=t,i="",a=true,s,l="",c="";function u(h){let b=a?h.replace(/^\xEF\xBB\xBF/,""):h,[y,S]=KEe(`${i}${b}`);for(let T of y)d(T);i=S,a=false;}function d(h){if(h===""){p();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let b=h.indexOf(":");if(b!==-1){let y=h.slice(0,b),S=h[b+1]===" "?2:1,T=h.slice(b+S);m(y,T,h);return}m(h,"",h);}function m(h,b,y){switch(h){case "event":c=b;break;case "data":l=`${l}${b}
|
|
221
221
|
`;break;case "id":s=b.includes("\0")?void 0:b;break;case "retry":/^\d+$/.test(b)?r(parseInt(b,10)):n(new Dv(`Invalid \`retry\` value: "${b}"`,{type:"invalid-retry",value:b,line:y}));break;default:n(new Dv(`Unknown field "${h.length>20?`${h.slice(0,20)}\u2026`:h}"`,{type:"unknown-field",field:h,value:b,line:y}));break}}function p(){l.length>0&&e({id:s,event:c||void 0,data:l.endsWith(`
|
|
@@ -259,7 +259,7 @@ ${l}`:s}function Kwe(t,e,n={}){if(t.length===0)return "";let r=fg(e),o=Math.max(
|
|
|
259
259
|
`);return Lwe(l,{borderStyle:e.unicode?"round":"classic",borderColor:e.colorLevel>0?"yellow":void 0,padding:1,margin:{left:2},textAlignment:"center"})}var Xwe="https://registry.npmjs.org",Jwe=z.object({versions:z.record(z.string(),z.unknown().optional()).optional()});async function L5({packageName:t,currentVersion:e}){let n=await te(fetch(`${Xwe}/${t}`),{milliseconds:5e3});if(!n.ok)throw new Error(`Got error status code ${n.status} ${n.statusText}`);let r=await n.json(),o=Jwe.parse(r).versions;if(!o)throw new Error("Failed to fetch npm registry data. Skipping version check.");let i=ap.major(e),a=e;for(let s of Object.keys(o))ap.valid(s)&&ap.prerelease(s)===null&&ap.major(s)===i&&ap.gt(s,a)&&(a=s);return a}function k5(t){return {checkCLIVersion:e=>Zwe({...t,logger:e}),getLatestCLIVersion:()=>L5({packageName:t.packageName,currentVersion:t.currentVersion})}}async function Zwe(t){let e=t.screen??qr();if(!(process.env.NO_UPDATE_NOTIFIER||e.ci||!e.isTTY))try{let n=await L5({packageName:t.packageName,currentVersion:t.currentVersion});if(ap.eq(t.currentVersion,n))return;let r=N5({currentVersion:t.currentVersion,latestVersion:n,changelogUrl:t.changelogUrl,updateCommand:t.updateCommand},e);P.log(`
|
|
260
260
|
${r}
|
|
261
261
|
`);}catch(n){t.logger.warn({err:n},"Failed to check CLI version against npm");}}var sp=25;function F5(t){let e="v2";return {v2ProjectConfig:{...t.config,fileFormat:e},migratedFilePaths:[]}}function B5(t){let e="v1";return {legacyProjectConfig:{...t.config,fileFormat:e},migratedFilePaths:[]}}function TO({project:t,newProjectConfig:e,fileFormatLabel:n,migratedFilePaths:r}){t.config=e,$u(t.config,t.configFilePath),r.push(t.configFilePath),P.info(`Updated ${t.configFilePath} to use ${n} file format`),e.hooks?.postSave&&(P.info(`Running post-save hook for ${r.length} migrated files`),x3([...new Set(r)],e));}async function lp(t,e,n){for(let r=0;r<t.length;r+=e)await Promise.all(t.slice(r,r+e).map(n));}function vO(t){return t.upgradedAgents.length>0||t.enabledUseMemory||t.enabledFailureRecovery}function Qwe(t){let e=t.ai??={},n=e.agentConfig??={},r=[];for(let[a,s]of Object.entries(jd)){let l=n[a];l!==s&&(l?.startsWith(`${s}.`)||(n[a]=s,r.push({type:a,newValue:s})));}let o=e.useMemory!==true;o&&(e.useMemory=true);let i=e.failureRecovery!==true;return i&&(e.failureRecovery=true),{upgradedAgents:r,enabledUseMemory:o,enabledFailureRecovery:i}}async function U5({project:t,dryRun:e,migrate:n}){let r=t.config.fileFormat!=="v2",o=Qwe(t.config);return r?{fileFormatChanged:r,aiSettings:o,migration:await n()}:(!e&&vO(o)&&$u(t.config,t.configFilePath),{fileFormatChanged:false,aiSettings:o,migration:CO()})}function CO(){return {migratedTestPaths:[],migratedModulePaths:[],alreadyV2TestCount:0,alreadyV2ModuleCount:0}}function wO({summary:t,fileFormatChanged:e,aiSettings:n,dryRun:r,testNoun:o="test",moduleNoun:i="module"}){let a=r?"Would migrate":"Migrated",s=Iu(o,t.migratedTestPaths.length),l=Iu(i,t.migratedModulePaths.length);P.info(`${a} ${t.migratedTestPaths.length} ${s} and ${t.migratedModulePaths.length} ${l} to v2.`),(t.alreadyV2TestCount>0||t.alreadyV2ModuleCount>0)&&P.dimmed(` Skipped ${t.alreadyV2TestCount} already-v2 ${Iu(o,t.alreadyV2TestCount)} and ${t.alreadyV2ModuleCount} already-v2 ${Iu(i,t.alreadyV2ModuleCount)}.`),e&&P.dimmed(" + fileFormat: v2");for(let c of n.upgradedAgents)P.dimmed(` + ai.agentConfig.${c.type}: ${c.newValue}`);n.enabledUseMemory&&P.dimmed(" + ai.useMemory: true"),n.enabledFailureRecovery&&P.dimmed(" + ai.failureRecovery: true");}var rAe=v__default.string().url();async function nC(t){if(rAe.safeParse(t).success){let e=new AbortController,n=setTimeout(()=>e.abort(),1e4),r;try{r=await fetch(t,{signal:e.signal});}catch(i){throw new M("UserInfrastructureError",`Fetch failed or timed out for URL: ${t}`,{errOptions:{cause:i}})}finally{clearTimeout(n);}if(!r.ok)throw new M("UserInfrastructureError",`Failed to fetch file from URL: ${t}, status: ${r.status}`);let o=await r.arrayBuffer();return Buffer.from(o).toString("base64")}if(!existsSync(t))throw new M("UserInfrastructureError",`File does not exist at path: ${t}`);return readFileSync(t).toString("base64")}var z5=1e3,$5=5e6,iAe=5*1024*1024;function AO(t,e){for(let n=0;n<t.length;n++){let r=t[n];try{if(r.data){let{jsonString:o}=Wz(JSON.stringify(r.data),1e3);r.data=JSON.parse(o);}}catch(o){e.error({err:o},"Failed to serialize individual result output data"),r.data=`Result output data could not be serialized: ${o}`;}switch(r.type){case "MOBILE_PRESET_STEP":V5(r);break;case "MOBILE_AI_ACTION_STEP":case "MOBILE_MODULE_STEP":AO(r.steps,e);break;case "MOBILE_CONDITIONAL_STEP":r.assertionResult&&V5(r.assertionResult),AO(r.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 V5(t){let e=t.command;"cache"in e&&e.cache&&(e.cache=void 0);}function j5(t,e){let n=JSON.stringify(t),r=n.replaceAll("\\u0000","");if(n.length!==r.length){let o=n.indexOf("\\u0000");e.warn({input:n.slice(Math.max(0,o-500),Math.min(n.length,o+500))},"Database content violation: stripped unicode character from input");}return r}function rC(t,e,n){let r=cloneDeep(t);if(AO(r,n),r.length>z5)return n.error("Database content violation: results too long, truncating before insertion"),r.slice(0,z5);let o=j5(r,n);if(o.length>$5)for(n.error({serializedLength:o.length,resultsArrayLength:r.length},"Database content violation: results too large, truncating before insertion");o.length>$5;)r.pop(),o=j5(r,n);let{jsonString:i}=Wz(o,iAe);try{return e.array().parse(JSON.parse(i))}catch(a){throw n.error({serialized:o,err:a},"Could not parse serialized results into JSON structure after processing"),a}}function fc(t,e,n=.01){let r=Buffer.from(t,"base64"),o=Buffer.from(e,"base64"),i=PNG.sync.read(r),a=PNG.sync.read(o);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 aAe(i.data,a.data,c,s,l,{threshold:n})/(s*l)*100}var G5=1e4,q5=2e4,uAe=250,dAe=5e3,mAe=2e3,pAe=[/dbug Appium Creating hash file directory/];function fAe(t){return pAe.some(e=>e.test(t))}var hAe=createRequire(import.meta.url),gAe=hAe.resolve("appium/build/lib/main.js");function bAe(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 yAe(t,e){let n=`Appium subprocess exited before becoming ready with exit code ${t}`;if(e.nodeVersionUnsupported)return `${n}. The current Node.js version is not supported by Appium; see the Appium log for the required version range.`;let r=e.lastError??e.lastWarn;return r?`${n}. Appium reported: ${r}`:n}async function RO(t){try{let e=await fetch(`http://localhost:${t}/status`,{method:"GET",signal:AbortSignal.timeout(dAe)}),n=await e.text();return {ok:!0,statusCode:e.status,body:n}}catch(e){return {ok:false,error:H(e)}}}async function SAe({appiumPort:t,child:e,appiumLogHints:n,waitForOutputFlush:r}){let o=Date.now();for(;Date.now()-o<q5;){if(e.exitCode!==null)throw await r(),new Error(yAe(e.exitCode,n));if((await RO(t)).ok)return;await new Promise(a=>setTimeout(a,uAe));}throw new Error(`Timed out waiting for Appium to become ready after ${q5}ms`)}async function K5({child:t,logger:e}){t.exitCode!==null||t.killed||(t.kill("SIGTERM"),await te(new Promise(n=>{t.once("exit",()=>n());}),{milliseconds:G5,fallback:()=>{e.warn({timeoutMs:G5},"Appium subprocess close timed out; sending SIGKILL"),t.kill("SIGKILL");}}));}function Y5(t,e,n,r){let o=createInterface({input:t,terminal:false}),i=[],a=l=>{let c=bAe(l);r.deviceOffline||=c.deviceOffline,r.instrumentationCrashed||=c.instrumentationCrashed,r.uiAutomatorCrashed||=c.uiAutomatorCrashed,r.nodeVersionUnsupported||=c.nodeVersionUnsupported;},s=()=>{if(i.length===0)return;let l=i.join(`
|
|
262
|
-
`);a(l),n==="warn"&&(r.lastWarn=l),e[n]({appium:true,logLine:l},"Appium log"),i.length=0;};return o.on("line",l=>{if(!l.trim()||fAe(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"?r.lastError=d:u==="warn"&&(r.lastWarn=d)),e[n]({appium:true,parsed:c},"Appium log");}else !/^\s/.test(l)&&i.length>0&&s(),i.push(l);}),new Promise(l=>{o.on("close",()=>{s(),l();});})}async function xO({logger:t,logLevel:e,appiumPort:n}){let r=Date.now(),o=spawn(process.execPath,[gAe,"--address","127.0.0.1","--port",`${n}`,"--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=[];o.stdout&&a.push(Y5(o.stdout,t,"info",i)),o.stderr&&a.push(Y5(o.stderr,t,"warn",i));let s=()=>te(Promise.all(a).then(()=>{}),{milliseconds:mAe,fallback:()=>{}});try{await SAe({appiumPort:n,child:o,appiumLogHints:i,waitForOutputFlush:s});}catch(l){throw await K5({child:o,logger:t}),l}return t.info({duration:Date.now()-r},"Started Appium server"),{close:()=>K5({child:o,logger:t}),appiumLogHints:i}}function J5(t){let e=H(t);return e.includes("/session")&&(e.toLowerCase().includes("timeout")||e.toLowerCase().includes("socket hang up"))}function oC(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 MAe(t,e){let n=new EAe(e);return await n.start(),RAe.createInterface({input:n}).on("line",o=>{t.info({wdio:true,logLine:o},"WebdriverIO log");}),()=>n.quit()}async function PAe(t){let e=mn__default.join(tmpdir(),"momentic","wdio",randomUUID());mkdirSync(e,{recursive:true});let n=new Set,r=[],o=watch(e,async(i,a)=>{if(i!=="rename"||!a||n.has(a))return;n.add(a);let s=mn__default.join(e,a.toString());if(!existsSync(s)){n.delete(a);return}try{let l=await MAe(t,s);r.push(l);}catch(l){n.delete(a),t.warn({err:l,fileName:a},"Failed to start forwarding logs from new WDIO log file");}});return {stop:async()=>{o.close(),await Promise.all(r.map(i=>i().catch(a=>{t.warn({err:a},"Failed to stop forwarding logs from WDIO log file");})));},logDir:e}}async function Z5({logger:t,callbacks:e,logLevel:n,wdioOpts:r}){let{onStatusUpdate:o,onFailure:i}=e,a=Math.floor(Math.random()*1e4)+4e4,s=await Yl(a,"appium"),{close:l,appiumLogHints:c}=await xO({logger:t,logLevel:n,appiumPort:s}),u=async()=>{try{await l();}catch(p){t.warn({err:p},"Failed to close Appium server");}},{logDir:d,stop:m}=await PAe(t);for(let p=1;p<=2;p++)try{p>1&&o("Retrying Appium session");let f=Date.now(),h=await remote({connectionRetryTimeout:3e4,connectionRetryCount:0,...r,outputDir:d,hostname:"localhost",port:s,path:"/",protocol:"http",logLevel:n});return t.info({duration:Date.now()-f},"Created Wdio driver"),{driver:h,appiumServerClose:async()=>{await m(),await l();}}}catch(f){let h,b;try{let y=i?await i({err:f,attempt:p,appiumPort:s,appiumLogHints:c}):{shouldRetry:!1,recover:void 0};h=y.shouldRetry,b=y.recover;}catch(y){throw await m(),await u(),y}if(!h||p>=2)throw await m(),await u(),f;if(b)try{await b();}catch(y){t.warn({err:y},"Recovery failed before Appium restart");}await u(),{close:l,appiumLogHints:c}=await xO({logger:t,logLevel:n,appiumPort:s});}throw new Error("createWdioDriverWithRecovery: unexpected state")}function Q5(t,e){let n=new Map;e.on("command",r=>{n.set(r.command,Date.now());}),e.on("result",r=>{let o=n.get(r.command);if(!o)return;let i=Date.now()-o;r.result instanceof Error?t.warn({err:r.result,command:r.command,args:r.body,durationMs:i},"Appium cmd failed"):i>1e4&&t.warn({command:r.command,args:r.body,durationMs:i},"Appium cmd took very long"),n.delete(r.command);});}var eY=1e4,IAe=15e3,_Ae=15e3;function tY(t,e,n,r){let{onHeartbeatFailure:o,onHeartbeatRestored:i}=r||{},a=0,s=false,l,c,u=[];t.on("command",m=>{u.push(m.command);}),t.on("result",m=>{m.result instanceof Error||(c=Date.now());});async function d(){let m=IAe,p=Date.now()-(c??0);if(p>eY)try{await te(e(),{milliseconds:_Ae}),a>0&&(n.info("Driver heartbeat restored"),i?.()),a=0;}catch(f){a++;let h=f instanceof Error?f.message:`${f}`;if(n.warn({attempt:a,error:h,recentCommands:u},"Driver heartbeat failed"),a===3){let b="The driver appears unresponsive, indicating a possible emulator failure";n.error({err:f},b),P.error(b),o?.();}}else a>0&&(n.info("Driver heartbeat restored"),i?.()),a=0,m-=p;u=[],s||(l=setTimeout(()=>void d(),Math.max(m,eY)));}return d(),()=>{s=true,clearTimeout(l);}}async function cp(t,e,n,r){let{maxAttempts:o=3,signal:i,slowThresholdMs:a=3e3,initialBackoffMs:s=3e3,backoffMultiplier:l=2,attemptTimeoutMs:c=1e4,operationName:u}=n,d;for(let m=0;m<o;m++){i?.throwIfAborted();let p=r?.reconnectingPromise?.();if(p){t.info("Waiting for reconnect to finish before attempt");try{await p;}catch(h){t.error({err:h},"Error while waiting for reconnect");}}else o>1&&m===o-1&&r?.tryReconnect&&(t.info({attempt:m+1,maxAttempts:o},`Attempting reconnect before final attempt ${m+1}`),await r.tryReconnect(t));let f=Date.now();try{let h=await te(e(),{milliseconds:c,signal:i,message:`${u} timed out after ${c}ms`}),b=Date.now()-f;return b>a&&t.warn({durationMs:b},`${u} took very long`),h}catch(h){if(i?.throwIfAborted(),d=h,m===o-1)throw t.error({err:h,attempt:m+1,maxAttempts:o},`${u} failed on final attempt`),h;if(!OAe(h))throw t.error({err:h,attempt:m+1,maxAttempts:o},`${u} failed and does not look retryable`),h;let b=Math.min(1e4,s*Math.pow(l,m));t.warn({err:h,attempt:m+1,maxAttempts:o,backoffMs:b},`${u} failed, sleeping ${b}ms for recovery`),await fe(b,i);}}throw d}function OAe(t){return t instanceof Error?["socket hang up","read ECONNRESET","timeout","timed out","UND_ERR_HEADERS_TIMEOUT"].some(n=>t.message.includes(n)):false}var DAe="NATIVE_APP",hc=class t{currentContext;driver;appiumClose;stopHeartbeat;initializationParams;reconnectingPromise;async close(){try{this.stopHeartbeat();}catch{}try{await this.appiumClose();}catch{}}startHeartbeat(e,n){return tY(this.driver,()=>this.healthcheck(),e,{...n,onHeartbeatFailure:()=>{n.onHeartbeatFailure?.(),this.reconnect(e).catch(r=>{e.error({err:r},"Failed to reconnect after heartbeat failure");});}})}constructor({logger:e,driver:n,appiumClose:r,callbacks:o,initializationParams:i}){this.initializationParams=i,this.driver=n,this.appiumClose=r,this.stopHeartbeat=this.startHeartbeat(e,o);}static async connectAppium(e){let{logger:n}=e,{driver:r,appiumServerClose:o}=await Z5(e);return Q5(n,r),{...e,driver:r,appiumClose:o,initializationParams:e}}async executeInNativeContext(e,n,r){return this.executeInContext(e,DAe,n,r)}async reconnect(e){if(e.info("Attempting to reconnect to Appium"),this.reconnectingPromise)return this.reconnectingPromise;this.reconnectingPromise=(async()=>{try{await this.close();}catch(i){e.error({err:i},"Error while closing Appium during reconnect");}this.initializationParams.callbacks.restartWda&&await this.initializationParams.callbacks.restartWda(e);let{driver:n,appiumClose:r,callbacks:o}=await t.connectAppium(this.initializationParams);this.currentContext=void 0,this.driver=n,this.appiumClose=r,this.stopHeartbeat=this.startHeartbeat(e,o);})();try{await this.reconnectingPromise;}finally{this.reconnectingPromise=void 0;}}async executeInContext(e,n,r,o){return cp(e,async()=>(this.currentContext!==n&&(e.info({from:this.currentContext,to:n},"Switching Appium context"),this.currentContext=void 0,await this.driver.switchContext(n),this.currentContext=n),await r(this.driver)),o,{reconnectingPromise:()=>this.reconnectingPromise,tryReconnect:async a=>{await this.reconnect(a);}})}};function up({containerBounds:t,viewport:e,defaultThresholdPercent:n}){let r=e.width*e.height;if(r<=0)return n;let o=nY({start:t.left,size:t.width,maxSize:e.width}),i=nY({start:t.top,size:t.height,maxSize:e.height});if(o<=0||i<=0)return n;let a=Math.min(o*i/r,1);return n*a}function iC({currentPixelDelta:t,baseDirection:e,correctionDirection:n,correctionPixels:r}){let o=Math.abs(t),i;n===e?i=o+r:i=Math.max(0,o-r);let a;return t===0?a=e==="down"?1:-1:a=Math.sign(t),a*i}function ls({containerBounds:t,containerInsetRatio:e}){let n=t.height*e;return t.height-2*n}function aC({viewportTop:t,viewportBottom:e,elementHeight:n,targetTopRatio:r}){let o=Math.max(1,e-t),i=t+o*r,a=Math.max(t,e-n);return Math.max(t,Math.min(i,a))}function nY({start:t,size:e,maxSize:n}){let r=t+e;return Math.max(0,Math.min(r,n)-Math.max(t,0))}function rY(t){return t?.position?{...t,position:void 0}:t}function NAe(t){return t?.map(e=>({...e,requirements:rY(e.requirements)}))}function sC(t){return {...t,requirements:rY(t.requirements),requiredRelatedElements:NAe(t.requiredRelatedElements)}}function lC(t){let{tracer:e,span:n,screenshot:r,emulatorState:o,logger:i}=t;if(e.storeTraceAsset)try{let a=randomUUID$1();e.storeTraceAsset({snapshotId:a,data:Buffer.from(r,"base64"),extension:"png"}),n.screenshotSnapshotId=a;let s=randomUUID$1();e.storeTraceAsset({snapshotId:s,data:Buffer.from(o),extension:"xml"}),n.emulatorStateSnapshotId=s;}catch(a){i.debug({err:a},"Failed to store extraction trace assets");}}function cC(t,e){return e.length*(t+50)+4e3}var LAe=["WebSocket was closed before the connection was","Intentional disconnect"];function tb(t){return t instanceof Error&&LAe.some(e=>t.message.includes(e))}var MO=false,iY;try{let t=await import('@sentry/node');t.init({dsn:"https://67a6ef469598f8880478f33863d05873@o4506426201800704.ingest.us.sentry.io/4510914396291072",environment:"production",dist:"production",release:"mobile-cli-0.111.0",tracesSampleRate:0,skipOpenTelemetrySetup:!0,sendDefaultPii:!0,beforeSend(e,n){return DG(n?.originalException)||NG(n?.originalException)||LG(n?.originalException)||Pu(n?.originalException)||eh(n?.originalException,Ye)||tb(n?.originalException)||kG(n?.originalException)?null:e}}),jW(t.captureException),iY=e=>{if(!e){t.setUser(null);return}t.setUser({id:e.userId,organizationId:e.orgId,...e.email&&{email:e.email}});},MO=!0;}catch{}var aY=t=>iY?.(t);var kAe="https://api.momentic.ai";function sY(t){let e=process.env.MOMENTIC_API_KEY??Kv();if(!e)return;let n=(process.env.MOMENTIC_SERVER??Yv()??kAe).replace(/\/+$/,"");return new bn({apiKey:e,baseUrl:n,logger:t})}function lY({apiClient:t,logger:e}){let n=Router();return n.get("/:id",async(r,o)=>{let{id:i}=r.params;if(!i){o.status(400).json({error:"Missing screenshot ID"});return}if(!t){o.status(401).json({error:"Missing Momentic API key"});return}try{let{data:a,contentType:s}=await t.fetchOnDemandScreenshot(i);o.setHeader("Content-Type",s),o.send(a);}catch(a){e.error({err:a,screenshotId:i},"Failed to proxy on-demand screenshot"),o.status(502).json({error:"Failed to fetch screenshot"});}}),n}function cY(t){let e=Router(),n=mn__default.join(t,yo);return e.get("/",async(r,o)=>{try{let i=zAe(t);if(!i){o.status(404).json({error:"No run group found"});return}if(!br.existsSync(n)){o.status(404).json({error:"No runs found for run group"});return}let a=$Ae(n,i),s={...i,id:i.id??"local-run-group",createdAt:i.startedAt,runs:a};o.status(200).json(s);}catch(i){o.status(500).json({error:`Error loading run group: ${i.message}`});}}),e}function zAe(t){let e=mn__default.join(t,mr);if(!br.existsSync(e))return P.error("Run group metadata file not found"),null;try{let n=br.readFileSync(e,"utf-8");return Am.parse(JSON.parse(n))}catch(n){return P.error({err:n},"Error reading run group metadata"),null}}function $Ae(t,e){let n=br.readdirSync(t).filter(o=>o.endsWith(".zip")).sort((o,i)=>{let a=br.statSync(mn__default.join(t,o));return br.statSync(mn__default.join(t,i)).mtime.getTime()-a.mtime.getTime()}),r=[];for(let o of n){let i=mn__default.join(t,o),a=o.replace(/\.zip$/i,"");r.push(VAe(i,a,e));}return r}function VAe(t,e,n){let r=new o5(t),o=r.getEntry(mr);if(!o)throw new Error(`No entry found for file ${t}/${mr}`);try{let i=o.getData().toString("utf-8"),a=JSON.parse(i),s=uj.parse(a),l=HAe(r,t);return Pq(s,e,{runGroupMetadata:n,runAttempts:l,organizationId:"local"})}catch(i){throw P.error({err:i,zipPath:t},`Error parsing ${mr} for run`),new Error(`Error parsing ${mr} for run ${t}`,{cause:i})}}var jAe=/^attempts\/(\d+)\/metadata\.json$/;function HAe(t,e){let n=[];for(let o of t.getEntries()){let i=jAe.exec(o.entryName);!i||!i[1]||n.push({index:parseInt(i[1],10),entry:o});}n.sort((o,i)=>o.index-i.index);let r=[];for(let{entry:o}of n){let i=WAe(o,e);!i||!i.id||r.push({id:i.id,status:i.status,startedAt:i.startedAt,finishedAt:i.finishedAt??null});}return r}function WAe(t,e){try{let n=t.getData().toString("utf-8");return lj.parse(JSON.parse(n))}catch(n){return P.warn({err:n,zipPath:e,entryName:t.entryName},"Skipping attempt metadata that failed to parse"),null}}function dY(t){let e=Router(),n=mn__default.join(t,yo);return e.get("/:filename",(r,o)=>{let i=r.params.filename;if(!i||!i.endsWith(".zip")){o.status(404).send("Not found");return}let a=mn__default.join(n,i),s=mn__default.resolve(a),l=mn__default.resolve(n);if(!s.startsWith(l)){o.status(403).send("Forbidden");return}if(!br.existsSync(a)){o.status(404).send("File not found");return}try{o.setHeader("Content-Type","application/zip"),o.setHeader("Content-Disposition",`attachment; filename="${i}"`);let c=br.readFileSync(a);o.send(c);}catch(c){o.status(500).send(`Error reading file: ${c.message}`);}}),e}function mY(t){let e=Router();return e.get("*",(n,r)=>{let o=n.path==="/"?mn__default.join(t,"index.html"):mn__default.join(t,n.path),i=mn__default.resolve(o),a=mn__default.resolve(t);if(!i.startsWith(a)){r.status(403).send("Forbidden");return}if(!br.existsSync(o)&&(o=mn__default.join(t,"index.html"),!br.existsSync(o))){r.status(404).send("File not found");return}try{let s=mn__default.extname(o).toLowerCase(),l=fu[s]||"application/octet-stream";r.setHeader("Content-Type",l);let c=br.readFileSync(o);r.send(c);}catch(s){r.status(500).send(`Error reading file: ${s.message}`);}}),e}async function pY(t,e,n,r){Bm(t);let o=n??await Yl(hE,"local-run-viewer-server"),i=kre();i.use((s,l,c)=>{l.setHeader("Access-Control-Allow-Origin","*"),l.setHeader("Cache-Control","no-cache"),c();});let a=sY(t);return i.use("/api/runs",dY(e)),i.use("/api/run-group",cY(e)),i.use("/api/on-demand-screenshots",lY({apiClient:a,logger:t})),r&&i.use("/",mY(r)),new Promise((s,l)=>{let c=i.listen(o,()=>{let u=`http://localhost:${o}`;xu(async()=>{await c.close();}),s({port:o,url:u});});c.on("error",u=>{l(u);});})}async function _O(t){let{logger:e,staticDir:n,resultsPath:r,runId:o,port:i}=t,a=mn__default.resolve(r),s=mn__default.join(a,yo),l;if(o){l=`${o.replace(/\.zip$/i,"")}.zip`;let u=mn__default.join(s,l);if(!br.existsSync(u)){let d=[];if(br.existsSync(s))for(let m of br.readdirSync(s))m.endsWith(".zip")&&d.push(m.replace(/\.zip$/i,""));P.error(`Run not found: ${l} in ${s}`),d.length>0&&P.error(`Available runs: ${d.join(", ")}`),process.exit(1);}}br.existsSync(n)||(P.error(`Static frontend files not found at ${n}. Please ensure the CLI is properly built.`),process.exit(1));try{let u=(await pY(e,a,i,n)).url;P.info(`Run viewer running at ${u}`);let d=new URL(u);l&&d.searchParams.set("zipUrl",`${u}/api/runs/${l}`),await ebe(d.toString());}catch(c){P.error(`Failed to start run viewer: ${c.message}`),process.exit(1);}}function ZAe(){let t=process.env.ANDROID_HOME;if(!t)return "adb";let e=process.platform==="win32"?"adb.exe":"adb";return mn__default.join(t,"platform-tools",e)}async function Hn(t,e){let{timeoutMs:n=5e3,serial:r,throwOnError:o=false,encoding:i="utf8"}=e,a=ZAe(),s=r?["-s",r,...t]:t;return await new Promise((l,c)=>{execFile$1(a,s,{encoding:i,timeout:n,maxBuffer:1024*1024*20},(u,d)=>{if(u){if(o){c(u);return}l(void 0);return}l(d);});})}var mC=class t extends hc{get capabilities(){return this.driver.capabilities}get sessionId(){return this.driver.sessionId}get sessionOptions(){let{hostname:e,port:n,protocol:r}=this.driver.options;return {hostname:e,port:n,protocol:r}}static async init(e){let n=await hc.connectAppium(e);return new t(n)}async healthcheck(){await this.driver.execute("mobile: shell",{command:"echo",args:["ping"]});}};var OO=12e4,oRe=6e4,pC=2,iRe=1e3;async function fY(t){let{apiClient:e,logger:n,creationOpts:r,onStatusUpdate:o,logLevel:i,orgId:a,sessionId:s,onConnectionStateChange:l}=t,{token:c,webRtcUrl:u,adbUrl:d,apiUrl:m,name:p,apkDownloadUrl:f,region:h,resolvedTag:b,playwrightServerUrl:y}=await e.createAndroidEmulator({...r,hostname:hostname(),sessionId:s}),S;try{execSync("adb --version"),S="adb";}catch{if(process.env.ANDROID_HOME)S=mn__default.join(process.env.ANDROID_HOME,"platform-tools","adb");else throw new M("UserInfrastructureError","The ADB binary was not found in PATH and ANDROID_HOME is not set either")}n.info({creationOpts:r,emulatorName:p,apkToInstall:r.apkToInstall,region:h,apkDownloadUrl:f,sessionId:s,playwrightServerUrl:y},"Android instance creation ok");let T=await Ge.recordDuration({fn:async()=>await createInstanceClient$1({adbUrl:d,apiUrl:m,token:c,logLevel:i,adbPath:S}),name:"test_event_duration",tags:["name:limbar-client-creation","clientOs:android",`orgId:${a}`],timeoutMs:oRe}),C;l&&(C=T.onConnectionStateChange(l));let w=["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&&w.push(f);let _=r.apkToInstall?.channel,N=r.apkToInstall?.tag;o(`Installing APK${_?` with channel ${_}`:""}${N?` and tag ${N}`:""}`),await Ge.recordDuration({fn:async()=>{await Promise.all(w.map(D=>aRe({client:T,url:D,logger:n,emulatorName:p})));},name:"test_event_duration",tags:["name:limbar-asset-upload",`orgId:${a}`]}),o("Starting ADB tunnel");let I=await Ge.recordDuration({fn:async()=>await T.startAdbTunnel(),name:"test_event_duration",tags:["name:limbar-tunnel-connect",`orgId:${a}`]}),A=()=>{C?.(),I.close(),T.disconnect();},z;return y&&(o("Opening Playwright connection"),z=await Ge.recordDuration({fn:async()=>{let D=await _android.connect(y,{timeout:3e4});return n.info("Playwright connection opened"),D},name:"test_event_duration",tags:["name:playwright-device-connect",`orgId:${a}`]})),{adbPort:I.address.port,close:A,limbarToken:c,limbarUrl:u,limbarRegion:h,limbarTag:b,limbarOsVersion:r.osVersion,emulatorName:p,playwrightDevice:z,limbarClient:T}}async function aRe(t){let{client:e,url:n,logger:r,emulatorName:o}=t,i;for(let a=1;a<=pC;a++)try{await te(e.sendAsset(n,OO),{milliseconds:OO,message:`Timed out after ${OO}ms sending asset to emulator ${o}: ${n}`});return}catch(s){if(i=s,a===pC)break;let l=iRe*2**(a-1);r.warn({url:n,err:s,emulatorName:o,attempt:a,maxAttempts:pC,backoffMs:l},"Failed to send asset to Limbar client; retrying after backoff"),await fe(l);}throw r.error({url:n,err:i,emulatorName:o,maxAttempts:pC},"Failed to send asset to Limbar client (no more retries)"),new M("UserConfigurationError",`Failed to send asset to emulator ${o}: ${i}`)}var sRe=["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 hY(t,e){if(!t||!e)return;let n=t.split(/\r?\n/).map(r=>r.trim()).filter(r=>r.length>0);for(let r of n){if(r.startsWith("List of devices attached")||!r.startsWith(e))continue;let i=r.split(/\s+/)[1]?.toLowerCase();return i==="device"?"device":i==="offline"?"offline":i==="unauthorized"?"unauthorized":"unknown"}}function lRe(t){return t&&(/^\d{1,3}(\.\d{1,3}){3}:\d+$/.test(t)||/^localhost:\d+$/.test(t))?t:null}async function cRe(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 uRe({logger:t,adbSerial:e,adbSnapshot:n,appiumLogHints:r,transportMode:o}){let i=hY(n.devices,e);if(!(i==="offline"||r.deviceOffline||r.instrumentationCrashed||r.uiAutomatorCrashed))return;let s=o==="tunneled"?lRe(e):void 0;if(t.warn({adbSerial:e,deviceState:i,appiumLogHints:r,transportMode:o},"Attempting best-effort recovery of Android transport"),o==="tunneled"&&s?(await Hn(["start-server"],{timeoutMs:5e3}),await fe(500),await Hn(["disconnect",s],{timeoutMs:5e3}),await fe(500),await Hn(["connect",s],{timeoutMs:5e3}),await fe(500)):(await Hn(["kill-server"],{timeoutMs:5e3}),await fe(500),await Hn(["start-server"],{timeoutMs:5e3}),await fe(500),await Hn(["reconnect","offline"],{timeoutMs:5e3}),await fe(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 gY({logger:t,onStatusUpdate:e,adbSerial:n,transportMode:r}){return async({err:o,attempt:i,appiumPort:a,appiumLogHints:s})=>{let l=o instanceof M?o:new M("UserInfrastructureError",H(o),{errOptions:{cause:o}}),c=await RO(a),u=await cRe(n),d=hY(u.devices,n);t.error({err:o,appiumPort:a,appiumStatus:c,adbSnapshot:u,adbDeviceState:d,appiumLogHints:s},"Failed to create Appium WebDriver session"),e(`Appium session creation failed: ${H(o)}`);let m=i===1&&(J5(o)||oC(o)||d==="offline"||s.instrumentationCrashed||s.deviceOffline);if(!m)throw P.error(`Failed to create Appium WebDriver session. Troubleshooting:
|
|
262
|
+
`);a(l),n==="warn"&&(r.lastWarn=l),e[n]({appium:true,logLine:l},"Appium log"),i.length=0;};return o.on("line",l=>{if(!l.trim()||fAe(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"?r.lastError=d:u==="warn"&&(r.lastWarn=d)),e[n]({appium:true,parsed:c},"Appium log");}else !/^\s/.test(l)&&i.length>0&&s(),i.push(l);}),new Promise(l=>{o.on("close",()=>{s(),l();});})}async function xO({logger:t,logLevel:e,appiumPort:n}){let r=Date.now(),o=spawn(process.execPath,[gAe,"--address","127.0.0.1","--port",`${n}`,"--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=[];o.stdout&&a.push(Y5(o.stdout,t,"info",i)),o.stderr&&a.push(Y5(o.stderr,t,"warn",i));let s=()=>te(Promise.all(a).then(()=>{}),{milliseconds:mAe,fallback:()=>{}});try{await SAe({appiumPort:n,child:o,appiumLogHints:i,waitForOutputFlush:s});}catch(l){throw await K5({child:o,logger:t}),l}return t.info({duration:Date.now()-r},"Started Appium server"),{close:()=>K5({child:o,logger:t}),appiumLogHints:i}}function J5(t){let e=H(t);return e.includes("/session")&&(e.toLowerCase().includes("timeout")||e.toLowerCase().includes("socket hang up"))}function oC(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 MAe(t,e){let n=new EAe(e);return await n.start(),RAe.createInterface({input:n}).on("line",o=>{t.info({wdio:true,logLine:o},"WebdriverIO log");}),()=>n.quit()}async function PAe(t){let e=mn__default.join(tmpdir(),"momentic","wdio",randomUUID());mkdirSync(e,{recursive:true});let n=new Set,r=[],o=watch(e,async(i,a)=>{if(i!=="rename"||!a||n.has(a))return;n.add(a);let s=mn__default.join(e,a.toString());if(!existsSync(s)){n.delete(a);return}try{let l=await MAe(t,s);r.push(l);}catch(l){n.delete(a),t.warn({err:l,fileName:a},"Failed to start forwarding logs from new WDIO log file");}});return {stop:async()=>{o.close(),await Promise.all(r.map(i=>i().catch(a=>{t.warn({err:a},"Failed to stop forwarding logs from WDIO log file");})));},logDir:e}}async function Z5({logger:t,callbacks:e,logLevel:n,wdioOpts:r}){let{onStatusUpdate:o,onFailure:i}=e,a=Math.floor(Math.random()*1e4)+4e4,s=await Yl(a,"appium"),{close:l,appiumLogHints:c}=await xO({logger:t,logLevel:n,appiumPort:s}),u=async()=>{try{await l();}catch(p){t.warn({err:p},"Failed to close Appium server");}},{logDir:d,stop:m}=await PAe(t);for(let p=1;p<=2;p++)try{p>1&&o("Retrying Appium session");let f=Date.now(),h=await remote({connectionRetryTimeout:3e4,connectionRetryCount:0,...r,outputDir:d,hostname:"localhost",port:s,path:"/",protocol:"http",logLevel:n});return t.info({duration:Date.now()-f},"Created Wdio driver"),{driver:h,appiumServerClose:async()=>{await m(),await l();}}}catch(f){let h,b;try{let y=i?await i({err:f,attempt:p,appiumPort:s,appiumLogHints:c}):{shouldRetry:!1,recover:void 0};h=y.shouldRetry,b=y.recover;}catch(y){throw await m(),await u(),y}if(!h||p>=2)throw await m(),await u(),f;if(b)try{await b();}catch(y){t.warn({err:y},"Recovery failed before Appium restart");}await u(),{close:l,appiumLogHints:c}=await xO({logger:t,logLevel:n,appiumPort:s});}throw new Error("createWdioDriverWithRecovery: unexpected state")}function Q5(t,e){let n=new Map;e.on("command",r=>{n.set(r.command,Date.now());}),e.on("result",r=>{let o=n.get(r.command);if(!o)return;let i=Date.now()-o;r.result instanceof Error?t.warn({err:r.result,command:r.command,args:r.body,durationMs:i},"Appium cmd failed"):i>1e4&&t.warn({command:r.command,args:r.body,durationMs:i},"Appium cmd took very long"),n.delete(r.command);});}var eY=1e4,IAe=15e3,_Ae=15e3;function tY(t,e,n,r){let{onHeartbeatFailure:o,onHeartbeatRestored:i}=r||{},a=0,s=false,l,c,u=[];t.on("command",m=>{u.push(m.command);}),t.on("result",m=>{m.result instanceof Error||(c=Date.now());});async function d(){let m=IAe,p=Date.now()-(c??0);if(p>eY)try{await te(e(),{milliseconds:_Ae}),a>0&&(n.info("Driver heartbeat restored"),i?.()),a=0;}catch(f){a++;let h=f instanceof Error?f.message:`${f}`;if(n.warn({attempt:a,error:h,recentCommands:u},"Driver heartbeat failed"),a===3){let b="The driver appears unresponsive, indicating a possible emulator failure";n.error({err:f},b),P.error(b),o?.();}}else a>0&&(n.info("Driver heartbeat restored"),i?.()),a=0,m-=p;u=[],s||(l=setTimeout(()=>void d(),Math.max(m,eY)));}return d(),()=>{s=true,clearTimeout(l);}}async function cp(t,e,n,r){let{maxAttempts:o=3,signal:i,slowThresholdMs:a=3e3,initialBackoffMs:s=3e3,backoffMultiplier:l=2,attemptTimeoutMs:c=1e4,operationName:u}=n,d;for(let m=0;m<o;m++){i?.throwIfAborted();let p=r?.reconnectingPromise?.();if(p){t.info("Waiting for reconnect to finish before attempt");try{await p;}catch(h){t.error({err:h},"Error while waiting for reconnect");}}else o>1&&m===o-1&&r?.tryReconnect&&(t.info({attempt:m+1,maxAttempts:o},`Attempting reconnect before final attempt ${m+1}`),await r.tryReconnect(t));let f=Date.now();try{let h=await te(e(),{milliseconds:c,signal:i,message:`${u} timed out after ${c}ms`}),b=Date.now()-f;return b>a&&t.warn({durationMs:b},`${u} took very long`),h}catch(h){if(i?.throwIfAborted(),d=h,m===o-1)throw t.error({err:h,attempt:m+1,maxAttempts:o},`${u} failed on final attempt`),h;if(!OAe(h))throw t.error({err:h,attempt:m+1,maxAttempts:o},`${u} failed and does not look retryable`),h;let b=Math.min(1e4,s*Math.pow(l,m));t.warn({err:h,attempt:m+1,maxAttempts:o,backoffMs:b},`${u} failed, sleeping ${b}ms for recovery`),await fe(b,i);}}throw d}function OAe(t){return t instanceof Error?["socket hang up","read ECONNRESET","timeout","timed out","UND_ERR_HEADERS_TIMEOUT"].some(n=>t.message.includes(n)):false}var DAe="NATIVE_APP",hc=class t{currentContext;driver;appiumClose;stopHeartbeat;initializationParams;reconnectingPromise;async close(){try{this.stopHeartbeat();}catch{}try{await this.appiumClose();}catch{}}startHeartbeat(e,n){return tY(this.driver,()=>this.healthcheck(),e,{...n,onHeartbeatFailure:()=>{n.onHeartbeatFailure?.(),this.reconnect(e).catch(r=>{e.error({err:r},"Failed to reconnect after heartbeat failure");});}})}constructor({logger:e,driver:n,appiumClose:r,callbacks:o,initializationParams:i}){this.initializationParams=i,this.driver=n,this.appiumClose=r,this.stopHeartbeat=this.startHeartbeat(e,o);}static async connectAppium(e){let{logger:n}=e,{driver:r,appiumServerClose:o}=await Z5(e);return Q5(n,r),{...e,driver:r,appiumClose:o,initializationParams:e}}async executeInNativeContext(e,n,r){return this.executeInContext(e,DAe,n,r)}async reconnect(e){if(e.info("Attempting to reconnect to Appium"),this.reconnectingPromise)return this.reconnectingPromise;this.reconnectingPromise=(async()=>{try{await this.close();}catch(i){e.error({err:i},"Error while closing Appium during reconnect");}this.initializationParams.callbacks.restartWda&&await this.initializationParams.callbacks.restartWda(e);let{driver:n,appiumClose:r,callbacks:o}=await t.connectAppium(this.initializationParams);this.currentContext=void 0,this.driver=n,this.appiumClose=r,this.stopHeartbeat=this.startHeartbeat(e,o);})();try{await this.reconnectingPromise;}finally{this.reconnectingPromise=void 0;}}async executeInContext(e,n,r,o){return cp(e,async()=>(this.currentContext!==n&&(e.info({from:this.currentContext,to:n},"Switching Appium context"),this.currentContext=void 0,await this.driver.switchContext(n),this.currentContext=n),await r(this.driver)),o,{reconnectingPromise:()=>this.reconnectingPromise,tryReconnect:async a=>{await this.reconnect(a);}})}};function up({containerBounds:t,viewport:e,defaultThresholdPercent:n}){let r=e.width*e.height;if(r<=0)return n;let o=nY({start:t.left,size:t.width,maxSize:e.width}),i=nY({start:t.top,size:t.height,maxSize:e.height});if(o<=0||i<=0)return n;let a=Math.min(o*i/r,1);return n*a}function iC({currentPixelDelta:t,baseDirection:e,correctionDirection:n,correctionPixels:r}){let o=Math.abs(t),i;n===e?i=o+r:i=Math.max(0,o-r);let a;return t===0?a=e==="down"?1:-1:a=Math.sign(t),a*i}function ls({containerBounds:t,containerInsetRatio:e}){let n=t.height*e;return t.height-2*n}function aC({viewportTop:t,viewportBottom:e,elementHeight:n,targetTopRatio:r}){let o=Math.max(1,e-t),i=t+o*r,a=Math.max(t,e-n);return Math.max(t,Math.min(i,a))}function nY({start:t,size:e,maxSize:n}){let r=t+e;return Math.max(0,Math.min(r,n)-Math.max(t,0))}function rY(t){return t?.position?{...t,position:void 0}:t}function NAe(t){return t?.map(e=>({...e,requirements:rY(e.requirements)}))}function sC(t){return {...t,requirements:rY(t.requirements),requiredRelatedElements:NAe(t.requiredRelatedElements)}}function lC(t){let{tracer:e,span:n,screenshot:r,emulatorState:o,logger:i}=t;if(e.storeTraceAsset)try{let a=randomUUID$1();e.storeTraceAsset({snapshotId:a,data:Buffer.from(r,"base64"),extension:"png"}),n.screenshotSnapshotId=a;let s=randomUUID$1();e.storeTraceAsset({snapshotId:s,data:Buffer.from(o),extension:"xml"}),n.emulatorStateSnapshotId=s;}catch(a){i.debug({err:a},"Failed to store extraction trace assets");}}function cC(t,e){return e.length*(t+50)+4e3}var LAe=["WebSocket was closed before the connection was","Intentional disconnect"];function tb(t){return t instanceof Error&&LAe.some(e=>t.message.includes(e))}var MO=false,iY;try{let t=await import('@sentry/node');t.init({dsn:"https://67a6ef469598f8880478f33863d05873@o4506426201800704.ingest.us.sentry.io/4510914396291072",environment:"production",dist:"production",release:"mobile-cli-0.111.1",tracesSampleRate:0,skipOpenTelemetrySetup:!0,sendDefaultPii:!0,beforeSend(e,n){return DG(n?.originalException)||NG(n?.originalException)||LG(n?.originalException)||Pu(n?.originalException)||eh(n?.originalException,Ye)||tb(n?.originalException)||kG(n?.originalException)?null:e}}),jW(t.captureException),iY=e=>{if(!e){t.setUser(null);return}t.setUser({id:e.userId,organizationId:e.orgId,...e.email&&{email:e.email}});},MO=!0;}catch{}var aY=t=>iY?.(t);var kAe="https://api.momentic.ai";function sY(t){let e=process.env.MOMENTIC_API_KEY??Kv();if(!e)return;let n=(process.env.MOMENTIC_SERVER??Yv()??kAe).replace(/\/+$/,"");return new bn({apiKey:e,baseUrl:n,logger:t})}function lY({apiClient:t,logger:e}){let n=Router();return n.get("/:id",async(r,o)=>{let{id:i}=r.params;if(!i){o.status(400).json({error:"Missing screenshot ID"});return}if(!t){o.status(401).json({error:"Missing Momentic API key"});return}try{let{data:a,contentType:s}=await t.fetchOnDemandScreenshot(i);o.setHeader("Content-Type",s),o.send(a);}catch(a){e.error({err:a,screenshotId:i},"Failed to proxy on-demand screenshot"),o.status(502).json({error:"Failed to fetch screenshot"});}}),n}function cY(t){let e=Router(),n=mn__default.join(t,yo);return e.get("/",async(r,o)=>{try{let i=zAe(t);if(!i){o.status(404).json({error:"No run group found"});return}if(!br.existsSync(n)){o.status(404).json({error:"No runs found for run group"});return}let a=$Ae(n,i),s={...i,id:i.id??"local-run-group",createdAt:i.startedAt,runs:a};o.status(200).json(s);}catch(i){o.status(500).json({error:`Error loading run group: ${i.message}`});}}),e}function zAe(t){let e=mn__default.join(t,mr);if(!br.existsSync(e))return P.error("Run group metadata file not found"),null;try{let n=br.readFileSync(e,"utf-8");return Am.parse(JSON.parse(n))}catch(n){return P.error({err:n},"Error reading run group metadata"),null}}function $Ae(t,e){let n=br.readdirSync(t).filter(o=>o.endsWith(".zip")).sort((o,i)=>{let a=br.statSync(mn__default.join(t,o));return br.statSync(mn__default.join(t,i)).mtime.getTime()-a.mtime.getTime()}),r=[];for(let o of n){let i=mn__default.join(t,o),a=o.replace(/\.zip$/i,"");r.push(VAe(i,a,e));}return r}function VAe(t,e,n){let r=new o5(t),o=r.getEntry(mr);if(!o)throw new Error(`No entry found for file ${t}/${mr}`);try{let i=o.getData().toString("utf-8"),a=JSON.parse(i),s=uj.parse(a),l=HAe(r,t);return Pq(s,e,{runGroupMetadata:n,runAttempts:l,organizationId:"local"})}catch(i){throw P.error({err:i,zipPath:t},`Error parsing ${mr} for run`),new Error(`Error parsing ${mr} for run ${t}`,{cause:i})}}var jAe=/^attempts\/(\d+)\/metadata\.json$/;function HAe(t,e){let n=[];for(let o of t.getEntries()){let i=jAe.exec(o.entryName);!i||!i[1]||n.push({index:parseInt(i[1],10),entry:o});}n.sort((o,i)=>o.index-i.index);let r=[];for(let{entry:o}of n){let i=WAe(o,e);!i||!i.id||r.push({id:i.id,status:i.status,startedAt:i.startedAt,finishedAt:i.finishedAt??null});}return r}function WAe(t,e){try{let n=t.getData().toString("utf-8");return lj.parse(JSON.parse(n))}catch(n){return P.warn({err:n,zipPath:e,entryName:t.entryName},"Skipping attempt metadata that failed to parse"),null}}function dY(t){let e=Router(),n=mn__default.join(t,yo);return e.get("/:filename",(r,o)=>{let i=r.params.filename;if(!i||!i.endsWith(".zip")){o.status(404).send("Not found");return}let a=mn__default.join(n,i),s=mn__default.resolve(a),l=mn__default.resolve(n);if(!s.startsWith(l)){o.status(403).send("Forbidden");return}if(!br.existsSync(a)){o.status(404).send("File not found");return}try{o.setHeader("Content-Type","application/zip"),o.setHeader("Content-Disposition",`attachment; filename="${i}"`);let c=br.readFileSync(a);o.send(c);}catch(c){o.status(500).send(`Error reading file: ${c.message}`);}}),e}function mY(t){let e=Router();return e.get("*",(n,r)=>{let o=n.path==="/"?mn__default.join(t,"index.html"):mn__default.join(t,n.path),i=mn__default.resolve(o),a=mn__default.resolve(t);if(!i.startsWith(a)){r.status(403).send("Forbidden");return}if(!br.existsSync(o)&&(o=mn__default.join(t,"index.html"),!br.existsSync(o))){r.status(404).send("File not found");return}try{let s=mn__default.extname(o).toLowerCase(),l=fu[s]||"application/octet-stream";r.setHeader("Content-Type",l);let c=br.readFileSync(o);r.send(c);}catch(s){r.status(500).send(`Error reading file: ${s.message}`);}}),e}async function pY(t,e,n,r){Bm(t);let o=n??await Yl(hE,"local-run-viewer-server"),i=kre();i.use((s,l,c)=>{l.setHeader("Access-Control-Allow-Origin","*"),l.setHeader("Cache-Control","no-cache"),c();});let a=sY(t);return i.use("/api/runs",dY(e)),i.use("/api/run-group",cY(e)),i.use("/api/on-demand-screenshots",lY({apiClient:a,logger:t})),r&&i.use("/",mY(r)),new Promise((s,l)=>{let c=i.listen(o,()=>{let u=`http://localhost:${o}`;xu(async()=>{await c.close();}),s({port:o,url:u});});c.on("error",u=>{l(u);});})}async function _O(t){let{logger:e,staticDir:n,resultsPath:r,runId:o,port:i}=t,a=mn__default.resolve(r),s=mn__default.join(a,yo),l;if(o){l=`${o.replace(/\.zip$/i,"")}.zip`;let u=mn__default.join(s,l);if(!br.existsSync(u)){let d=[];if(br.existsSync(s))for(let m of br.readdirSync(s))m.endsWith(".zip")&&d.push(m.replace(/\.zip$/i,""));P.error(`Run not found: ${l} in ${s}`),d.length>0&&P.error(`Available runs: ${d.join(", ")}`),process.exit(1);}}br.existsSync(n)||(P.error(`Static frontend files not found at ${n}. Please ensure the CLI is properly built.`),process.exit(1));try{let u=(await pY(e,a,i,n)).url;P.info(`Run viewer running at ${u}`);let d=new URL(u);l&&d.searchParams.set("zipUrl",`${u}/api/runs/${l}`),await ebe(d.toString());}catch(c){P.error(`Failed to start run viewer: ${c.message}`),process.exit(1);}}function ZAe(){let t=process.env.ANDROID_HOME;if(!t)return "adb";let e=process.platform==="win32"?"adb.exe":"adb";return mn__default.join(t,"platform-tools",e)}async function Hn(t,e){let{timeoutMs:n=5e3,serial:r,throwOnError:o=false,encoding:i="utf8"}=e,a=ZAe(),s=r?["-s",r,...t]:t;return await new Promise((l,c)=>{execFile$1(a,s,{encoding:i,timeout:n,maxBuffer:1024*1024*20},(u,d)=>{if(u){if(o){c(u);return}l(void 0);return}l(d);});})}var mC=class t extends hc{get capabilities(){return this.driver.capabilities}get sessionId(){return this.driver.sessionId}get sessionOptions(){let{hostname:e,port:n,protocol:r}=this.driver.options;return {hostname:e,port:n,protocol:r}}static async init(e){let n=await hc.connectAppium(e);return new t(n)}async healthcheck(){await this.driver.execute("mobile: shell",{command:"echo",args:["ping"]});}};var OO=12e4,oRe=6e4,pC=2,iRe=1e3;async function fY(t){let{apiClient:e,logger:n,creationOpts:r,onStatusUpdate:o,logLevel:i,orgId:a,sessionId:s,onConnectionStateChange:l}=t,{token:c,webRtcUrl:u,adbUrl:d,apiUrl:m,name:p,apkDownloadUrl:f,region:h,resolvedTag:b,playwrightServerUrl:y}=await e.createAndroidEmulator({...r,hostname:hostname(),sessionId:s}),S;try{execSync("adb --version"),S="adb";}catch{if(process.env.ANDROID_HOME)S=mn__default.join(process.env.ANDROID_HOME,"platform-tools","adb");else throw new M("UserInfrastructureError","The ADB binary was not found in PATH and ANDROID_HOME is not set either")}n.info({creationOpts:r,emulatorName:p,apkToInstall:r.apkToInstall,region:h,apkDownloadUrl:f,sessionId:s,playwrightServerUrl:y},"Android instance creation ok");let T=await Ge.recordDuration({fn:async()=>await createInstanceClient$1({adbUrl:d,apiUrl:m,token:c,logLevel:i,adbPath:S}),name:"test_event_duration",tags:["name:limbar-client-creation","clientOs:android",`orgId:${a}`],timeoutMs:oRe}),C;l&&(C=T.onConnectionStateChange(l));let w=["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&&w.push(f);let _=r.apkToInstall?.channel,N=r.apkToInstall?.tag;o(`Installing APK${_?` with channel ${_}`:""}${N?` and tag ${N}`:""}`),await Ge.recordDuration({fn:async()=>{await Promise.all(w.map(D=>aRe({client:T,url:D,logger:n,emulatorName:p})));},name:"test_event_duration",tags:["name:limbar-asset-upload",`orgId:${a}`]}),o("Starting ADB tunnel");let I=await Ge.recordDuration({fn:async()=>await T.startAdbTunnel(),name:"test_event_duration",tags:["name:limbar-tunnel-connect",`orgId:${a}`]}),A=()=>{C?.(),I.close(),T.disconnect();},z;return y&&(o("Opening Playwright connection"),z=await Ge.recordDuration({fn:async()=>{let D=await _android.connect(y,{timeout:3e4});return n.info("Playwright connection opened"),D},name:"test_event_duration",tags:["name:playwright-device-connect",`orgId:${a}`]})),{adbPort:I.address.port,close:A,limbarToken:c,limbarUrl:u,limbarRegion:h,limbarTag:b,limbarOsVersion:r.osVersion,emulatorName:p,playwrightDevice:z,limbarClient:T}}async function aRe(t){let{client:e,url:n,logger:r,emulatorName:o}=t,i;for(let a=1;a<=pC;a++)try{await te(e.sendAsset(n,OO),{milliseconds:OO,message:`Timed out after ${OO}ms sending asset to emulator ${o}: ${n}`});return}catch(s){if(i=s,a===pC)break;let l=iRe*2**(a-1);r.warn({url:n,err:s,emulatorName:o,attempt:a,maxAttempts:pC,backoffMs:l},"Failed to send asset to Limbar client; retrying after backoff"),await fe(l);}throw r.error({url:n,err:i,emulatorName:o,maxAttempts:pC},"Failed to send asset to Limbar client (no more retries)"),new M("UserConfigurationError",`Failed to send asset to emulator ${o}: ${i}`)}var sRe=["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 hY(t,e){if(!t||!e)return;let n=t.split(/\r?\n/).map(r=>r.trim()).filter(r=>r.length>0);for(let r of n){if(r.startsWith("List of devices attached")||!r.startsWith(e))continue;let i=r.split(/\s+/)[1]?.toLowerCase();return i==="device"?"device":i==="offline"?"offline":i==="unauthorized"?"unauthorized":"unknown"}}function lRe(t){return t&&(/^\d{1,3}(\.\d{1,3}){3}:\d+$/.test(t)||/^localhost:\d+$/.test(t))?t:null}async function cRe(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 uRe({logger:t,adbSerial:e,adbSnapshot:n,appiumLogHints:r,transportMode:o}){let i=hY(n.devices,e);if(!(i==="offline"||r.deviceOffline||r.instrumentationCrashed||r.uiAutomatorCrashed))return;let s=o==="tunneled"?lRe(e):void 0;if(t.warn({adbSerial:e,deviceState:i,appiumLogHints:r,transportMode:o},"Attempting best-effort recovery of Android transport"),o==="tunneled"&&s?(await Hn(["start-server"],{timeoutMs:5e3}),await fe(500),await Hn(["disconnect",s],{timeoutMs:5e3}),await fe(500),await Hn(["connect",s],{timeoutMs:5e3}),await fe(500)):(await Hn(["kill-server"],{timeoutMs:5e3}),await fe(500),await Hn(["start-server"],{timeoutMs:5e3}),await fe(500),await Hn(["reconnect","offline"],{timeoutMs:5e3}),await fe(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 gY({logger:t,onStatusUpdate:e,adbSerial:n,transportMode:r}){return async({err:o,attempt:i,appiumPort:a,appiumLogHints:s})=>{let l=o instanceof M?o:new M("UserInfrastructureError",H(o),{errOptions:{cause:o}}),c=await RO(a),u=await cRe(n),d=hY(u.devices,n);t.error({err:o,appiumPort:a,appiumStatus:c,adbSnapshot:u,adbDeviceState:d,appiumLogHints:s},"Failed to create Appium WebDriver session"),e(`Appium session creation failed: ${H(o)}`);let m=i===1&&(J5(o)||oC(o)||d==="offline"||s.instrumentationCrashed||s.deviceOffline);if(!m)throw P.error(`Failed to create Appium WebDriver session. Troubleshooting:
|
|
263
263
|
- ${sRe.join(`
|
|
264
264
|
- `)}`),l;return {shouldRetry:m,recover:()=>uRe({logger:t,adbSerial:n,adbSnapshot:u,appiumLogHints:s,transportMode:r})}}}var bY=5e3;async function pp({callbacks:t,creationOpts:e,apiClient:n,logger:r,driverLogLevel:o,socket:i,orgId:a,sessionId:s}){let l=Date.now();r.info("Starting android driver creation");let c=[],u,d;if("avdId"in e)d=e;else {d=await fY({apiClient:n,logger:r,creationOpts:e,onStatusUpdate:t.onStatusUpdate,orgId:a,sessionId:s,onConnectionStateChange:t.onLimbarConnectionStateChange});let f=d.emulatorName,h=d.close;u=async()=>n.deleteAndroidEmulator(f),c.push(h),r=r.child({emulatorName:f}),(async()=>{try{let[b,y]=await Promise.allSettled([km("limserver-1.limrun.net"),km("125.253.92.199")]);r.info({limserver:b.status==="fulfilled"?b.value:b.reason,ip125:y.status==="fulfilled"?y.value:y.reason},"Limbar network diagnostics");}catch(b){r.warn({err:b},"Failed to run network diagnostics");}})();}let m=async()=>{let f=c.toReversed();u&&(f.push(u),u=void 0);let h=f.map(b=>Promise.resolve(b()).catch(y=>{Pu(y)||r.warn({err:y},"Error running cleanup task");}));try{await te(Promise.allSettled(h),{milliseconds:bY,message:`Android driver cleanup timed out after ${bY}ms`});}catch(b){r.warn({err:b},"Android driver cleanup timed out");}},p=async()=>{if(i&&!i.connected)throw await m(),new M("UserInfrastructureError","Client disconnected before Appium driver could be started, cleaning up...")};await p();try{let f=await fRe({logger:r,driverLogLevel:o,emulatorStart:l,emulatorCreationParams:d,apiClient:n,callbacks:t,creationOpts:e,orgId:a,sessionId:s}),h=f.driver;return c.push(f.appiumClose),await p(),{...d,...f,driver:h,cleanup:m}}catch(f){throw await m(),new M("UserInfrastructureError",`Failed to start Appium driver: ${f.message}`)}}async function fRe({logger:t,driverLogLevel:e="error",emulatorCreationParams:n,callbacks:r,creationOpts:o}){let i=[],{adbPort:a,emulatorName:s}=n,l,c="tunneled";if(!a){c="local";let f=0;for(;f<10;){let h=5555+Math.floor(Math.random()*30);if(h%2!==0&&(h=Math.min(h+1,5584)),await kT(h)&&await kT(h+1)){l=h,a=h+1;break}f+=1;}if(!a)throw new M("UserInfrastructureError",`Failed to find an available ADB port after ${f} attempts`)}s||(s=`emulator-${l}`,r.onStatusUpdate("Killing existing emulators"),await yY(t),i.push(()=>yY(t)),r.onStatusUpdate("Starting new emulator"));let u={platformName:"Android","appium:automationName":"UiAutomator2","appium:deviceName":"Android","appium:udid":`127.0.0.1:${a}`,"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},d={capabilities:u,connectionRetryTimeout:3e4,connectionRetryCount:3};if("avdId"in n){u["appium:avd"]=n.avdId,u["appium:avdLaunchTimeout"]=18e4,u["appium:avdReadyTimeout"]=18e4,u["appium:skipDeviceInitialization"]=false,u["appium:skipServerInstallation"]=false,u["appium:udid"]=void 0;let f=hRe();u["appium:avdArgs"]=`-port ${l} -memory ${f} -no-snapshot-save -no-boot-anim -noaudio`,d.connectionRetryTimeout=12e4,d.connectionRetryCount=3;}let m=pu in n?s:`127.0.0.1:${a}`,p=await mC.init({logger:t,callbacks:{...r,onFailure:gY({logger:t,onStatusUpdate:r.onStatusUpdate,adbSerial:m,transportMode:c})},logLevel:e,wdioOpts:d});try{if("avdId"in o){let y=o.apkFilePath?.trim();if(y){let S=mn__default.resolve(y);if(!br.existsSync(S))throw new M("UserConfigurationError",`APK not found at path: ${S}`);r.onStatusUpdate("Installing local APK");let T=Date.now();try{await p.executeInNativeContext(t,C=>C.installApp(S),{operationName:"installApp"}),t.info({apkFilePath:S,installDurationMs:Date.now()-T},"Installed local APK");}catch(C){throw t.error({err:C,apkFilePath:S},"Failed to install local APK"),new M("UserConfigurationError",`Failed to install APK from ${S}: ${C.message}`)}}}let[f,h]=await Promise.all([Hn(["shell","wm","size"],{serial:m,timeoutMs:5e3}),Hn(["shell","wm","density"],{serial:m,timeoutMs:5e3}),p.executeInNativeContext(t,y=>y.updateSettings({enableMultiWindows:!0,waitForIdleTimeout:250,simpleBoundsCalculation:!0}),{operationName:"updateSettings"})]);return t.info({capabilities:u,emulatorName:s,viewport:{size:f?.trim(),density:h?.trim()}},"Started Appium driver"),{driver:p,appiumClose:async()=>{await p.close(),await Promise.all(i.map(y=>y()));},emulatorName:s,adbPort:a}}catch(f){throw t.error({err:f},"Failed to initialize emulator"),await p.close(),f}}async function yY(t){let r=(await Hn(["devices"],{timeoutMs:5e3})??"").split(`
|
|
265
265
|
`).map(o=>o.trim().split(/\s+/)[0]).filter(o=>!!o?.startsWith("emulator-"));await Promise.all(r.map(async o=>{t.info({emulatorName:o},"Killing emulator");let i=await Hn(["emu","kill"],{serial:o,timeoutMs:5e3});i&&t.warn({emulatorName:o,killResult:i},"Failed to kill emulator, continuing...");}));}function hRe(){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 yRe="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.",SRe="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.",ERe="Follow the instructions at https://developer.android.com/tools/variables to set the ANDROID_HOME environment variable.",TY="On Mac OS, the SDK is typically installed at /Users/<username>/Library/Android/sdk.",vY="On Windows, the SDK is typically installed at C:\\Users\\<username>\\AppData\\Local\\Android\\Sdk.";function TRe(){if(!process.env.JAVA_HOME)P.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)&&P.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=((n,r)=>join(n,"bin",process.platform==="win32"?`${r}.exe`:r))(process.env.JAVA_HOME,"java");existsSync(e)||P.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"})||P.warn(`Could not find a Java installation. Some Appium drivers and Android tools may not work as expected. ${yRe}`);}catch(t){P.warn(`Got error while checking if the Java JDK is installed: ${H(t)}`);}}function vRe(){process.env.ANDROID_HOME||P.warn(`The ANDROID_HOME environment variable is not set. Some Appium drivers and Android tools may not work as expected. ${ERe} ${platform()==="darwin"?TY:vY}`);}function CRe(){let t=process.env.ANDROID_HOME?`${process.env.ANDROID_HOME}/platform-tools/adb`:"adb";try{execSync(`${t} version`,{stdio:"pipe",encoding:"utf-8"})||P.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. ${SRe} Finally, ensure that the 'adb' command is available in your shell. ${platform()==="darwin"?TY:vY}`);}catch(e){P.warn(`Got error while checking if ADB is installed: ${H(e)}`);}}function CY(){TRe(),vRe(),CRe();}var MRe=100,PRe=2500,wY=4e3,IRe="\u2026",_Re=1e3;async function fC({driver:t,onLogs:e,logFilePath:n}){await t.execute("mobile: startLogsBroadcast");let r=n?br.createWriteStream(n,{flags:"a"}):void 0,o=[],i=()=>{o.length===0||!r||(r.write(o.join(`
|
|
@@ -5719,7 +5719,7 @@ ${t}`;case "ELEMENT_CHECK":return `${_X}
|
|
|
5719
5719
|
${t}`;default:return t}}async function $i({frameConfig:t,action:e,browser:n}){let r=n.getActiveFrameConfig();t?n.setActiveFrameConfig(t):r?.type==="auto"&&n.setActiveFrameConfig(void 0);try{return await e()}finally{n.setActiveFrameConfig(r);}}var _Pe=["NAVIGATE","NEW_TAB","CLOSE_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function NX({beforeUrl:t,beforePages:e,browser:n,command:r,logger:o}){if(_Pe.includes(r.type))return;await Wn().startAsyncSpan("AUTO_FOLLOW_NEW_TABS",async a=>{let c=("cache"in r&&r.cache&&"target"in r.cache?r.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??false?300:3e3,u=Date.now(),d=0;for(o.info({command:r.type,beforePages:e,beforeUrl:t,timeout:c},"Checking for new tabs to auto-follow");d===0||Date.now()-u<c;){await fe(250),d++;let m=(await n.getOpenPages()).map(f=>f.url),p=n.url();if(m.length!==e.length)for(let f=m.length-1;f>=e.length;f--){let h=m[f];if(Zl(h,o)&&h!==t&&h!==p){o.info({beforePages:e,afterPages:m,beforeUrl:t},"Auto-following new tab after preset action"),await n.switchToPage({type:"INDEX",index:String(f)}),a.result={followed:true};return}}}a.result={followed:false};});}async function Tc(t,e={}){let n=await t.getBrowserState(e);return {serializedTree:n.serialize(e.serializationOpts),tree:n}}var LX=t=>!!t&&Ad(t),kX=t=>{let{cache:e,description:n,disableSecondaryCacheResolution:r,logger:o}=t,i=e,a=false,s;return i&&r&&i.targetSource==="HEURISTIC_HEALED"&&(a=true,s="Heuristic healed cache incompatible",i=void 0),i?.inputDescription&&!OX(n,i.inputDescription)&&(o.warn({old:i.inputDescription,new:n},"Target cache was generated with a different description, clearing it automatically"),a=true,s="Description changed",i=void 0),{cache:i,cacheBustedBeforeAction:a,cacheBustReason:s}};var BX={minChunkTokenCount:1e4,acceptableChunkTokenCount:25e3,maxChunkTokenCount:5e4,maxLineLength:4e3},FX=/<(\S+) id="(\d+)".*?>/g,OPe=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,UX=["h1","h2","section","footer","nav","aside","form","label","dialog"],DPe=[...UX,"span","div","h3"],NPe=["table","select","form","ul","ol","menu","pre","code","dialog"],LPe=["table","form","dialog","nav","section","ul","select"];function zX(t){return kPe(t)}function kPe({logger:t,serializedTree:e,options:n}){let{minChunkTokenCount:r,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=n,s=[],l=e.split(`
|
|
5720
5720
|
`),c=0,u=[],d=0,m=[],p=[],f=false;for(;c<l.length;){f&&(s.push({ids:m,content:u.join(`
|
|
5721
5721
|
`),tokenLength:d}),u=[],d=0,m=p.length?[p[p.length-1].id]:[],f=false);let h=l[c],b=kt(h);d+=b,h.length>a&&(h=h.slice(0,a));let T=Array.from(h.matchAll(FX)).map($=>$&&$.length>=3?{tagName:$[1],id:$[2]}:void 0).filter($=>!!$),w=Array.from(h.matchAll(OPe)).map($=>$&&($[2]||$[4])).filter($=>!!$);w.reverse();let _=h.replace(/ id="[0-9]+"/g,"");u.push(_);for(let $ of T)m.push($.id),p.push($);for(let $ of w){let le=p[p.length-1];le&&le.tagName===$&&p.pop();}let N=p.some($=>NPe.includes($.tagName)),I=l[c+1]??"",A=kt(I),D=Array.from(I.matchAll(FX)).map($=>$&&$.length>2?$[1]:void 0).filter($=>!!$),B=D.some($=>UX.includes($)),F=D.some($=>DPe.includes($));d+A>=i&&(f=true),d>=r&&(B&&!N||w.some($=>LPe.includes($)))&&(f=true),d>=o&&F&&!N&&(f=true),c++;}return u.length&&s.push({ids:m,content:u.join(`
|
|
5722
|
-
`),tokenLength:d}),s.forEach((h,b)=>{let y=h.ids[0],S=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:y,maxId:S},`Chunk for page filtering (index ${b+1}/${s.length})`);}),{chunks:s}}var $X=5e6,BPe=1e5,UPe=3e4,zPe=6e4,$Pe=1e5;async function Zu(t){let{fixtures:e}=t,{logger:n}=e,r=t.tree,o=t.serializedTree,i=kt(o);if(i>$X)throw new M("UserConfigurationError",`Page accessibility tree is too large for AI page filtering (${i} tokens). Maximum supported size is ${$X} tokens.`);if(i>BPe){let a=zX({serializedTree:o,options:BX,logger:n}),s=randomUUID();r=await VPe({...t,chunks:a.chunks,callId:s}),o=r.serialize();let l=kt(o);n.info({oldTokens:i,newTokens:l,langfuseCallId:s},"Filtered page using AI chunk ranking");}return o}async function VPe({type:t,callId:e,chunks:n,description:r,fixtures:o,tree:i}){let{generator:a,signal:s,logger:l}=o,c=await a.rankChunksWithAi({chunks:n,description:r,type:t,softTokenLimit:UPe,mediumTokenLimit:zPe,hardTokenLimit:$Pe,callId:e},{abortSignal:s,logger:l,loggerTags:De(l)}),u=[];return n.forEach((m,p)=>{c.indices.includes(p)&&(u=u.concat(m.ids));}),i.pruneUsingRelevantIds(new Set(u))}async function wD(t,e){if(!t.description)throw new M("UserConfigurationError","Cannot locate element with empty description");return $i({action:async()=>HPe(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function HPe(t,e){let{disableCache:n,testContext:r,filterByViewport:o,skipWait:i,source:a,memory:s,logger:l,allowNotActionableNodesOverride:c,allowIneligibleTagRedirect:u,showZeroOpacityElementsOverride:d,skipSavingVisualAttributes:m,isAutoHeal:p,cacheBustReason:f,acceptElementMovedError:h}=t,{orgId:b,browser:y,localCodeEvalTools:S,generator:T,abortSignal:C}=e,w=t.description,_=Wn(),N=t.useMemory&&!n;r&&(w=await tl({orgId:b,s:w,context:r,localTools:S,signal:C,logger:l})),a&&(w=DX(w,a));let{serializedTree:I,tree:A}=await _.startAsyncSpan("GET_PAGE_STATE",async()=>Tc(y,{allowNotActionableNodesOverride:c,allowIneligibleTagRedirect:u,showZeroOpacityElementsOverride:d,filterByViewport:o,abortSignal:C,skipWait:i,logger:l}),{}),z=await _.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let q,V=Date.now(),pe;for(;!q&&Date.now()-V<3e3;){C.throwIfAborted();try{q=await y.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2});}catch(Te){pe=Te;}}if(!q)throw new M("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${pe?.message}`);return q}),D=I,B=false,$=`data:image/jpeg;base64,${z.toString("base64")}`,le=De(l);D=await Zu({type:"locator",description:w,screenshot:$,serializedTree:I,tree:A,fixtures:{generator:T,signal:C,logger:l,orgId:b}}),D!==I&&(B=true);let j=await _.startAsyncSpan("AI_LOCATOR_CALL",async q=>{p&&(q.attributes.isAutoHeal=true),f&&(q.attributes.cacheBustReason=f);let V=await T.getElementLocation({browserState:D,goal:w,screenshot:$,source:a,memory:N?s:void 0},{disableCache:n,abortSignal:C,logger:l,loggerTags:le,useMemory:N,cacheBustReason:f});if(q.result=V,_.storeTraceAsset){let pe=randomUUID();_.storeTraceAsset({snapshotId:pe,data:z}),q.screenshotSnapshotId=pe;}return V});if(l.debug({usedRag:B,result:j},"Got locator result"),!(j.id>0))throw new _a(`Could not find any relevant element: ${j.thoughts}`,j.updatedMemory?{type:"GCS_TRACES",traces:j.updatedMemory}:void 0);let{resolution:U,target:k,frameConfig:W}=await _.startAsyncSpan("TARGET_RESOLUTION",async q=>{let V=await y.createTargetFromA11yId({id:j.id,requirements:j.requirements,additionalElements:j.additionalElements,description:w,targetSource:"AI",logger:l,skipSavingVisualAttributes:m,acceptElementMovedError:h});return q.result={serializedElement:V.target.nodeOnlySerializedHtml??"Unknown HTML element"},V});if(U.a11yNode?.properties?.hidden&&U.a11yNode?.properties?.hidden!=="false")throw new M("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${U.displayString}`);return N&&(j.updatedMemory?k.memory={type:"GCS_TRACES",traces:j.updatedMemory}:s&&(k.memory=s)),{thoughts:j.thoughts,target:k,resolution:U,frameConfig:W,screenshot:$}}var WPe=15;async function NC({command:t,logger:e,fixtures:n,useMemory:r,maxRetries:o=WPe,recoveryHint:i}){if(!t.assertion.trim())throw new M("ActionFailureError","Assertion command is missing the assertion content");let a=Kx.optional().catch(void 0).parse(t.source);t.source&&!a&&e.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let s=Wn();return s.startAsyncSpan("AI_ASSERTION_CALL",async l=>{let{browser:c}=n,u=t.timeout?t.timeout*1e3:c.smartWaitingTimeout,d=xq(u,o-1),m=0,p=Date.now(),f=p+u,h=p,b,y,S;try{await $i({action:()=>c.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:c,logger:e});}catch(w){e.warn({err:w},"Failed to clear highlights before AI check, continuing...");}for(;m<o;){n.abortSignal.throwIfAborted();let w=Date.now();if(m>0){if(w>=f)break;let I=f-w,A=h-w,z=Math.min(A,I);z>0&&await fe(z,n.abortSignal);}let _=Date.now();if(m>0&&_>=f)break;let N=false;try{if(b=await $i({action:async()=>{let A=await jX(c,e,n.abortSignal);return y&&y.serializedTree===A.serializedTree&&y.screenshotBuff.equals(A.screenshotBuff)?(N=!0,b):(y=A,HX({command:t,state:A,fixtures:n,useMemory:r,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}),b?.aiResult.result){b?.updatedMemory&&Eg(t,b.updatedMemory,e);break}else throw b?.aiResult.thoughts?new M("AssertionFailureError",b.aiResult.thoughts):new M("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(I){n.abortSignal.throwIfAborted(),S=I instanceof Error?I:new Error(`${I}`),N?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=_+d;}}if(!b?.aiResult.result){let w=f-Date.now();w>0&&await fe(w,n.abortSignal);}if(!b?.aiResult.result)try{b=await $i({action:async()=>HX({command:t,state:await jX(c,e,n.abortSignal),fixtures:n,useMemory:r,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(w){n.abortSignal.throwIfAborted(),S=w instanceof Error?w:new Error(`${w}`);}finally{m++;}b?.updatedMemory&&Eg(t,b.updatedMemory,e);let T=b?.afterScreenshotOverride;if(T&&s.storeTraceAsset){let w=randomUUID();s.storeTraceAsset({snapshotId:w,data:T}),l.screenshotSnapshotId=w;}let C=b?.elementScreenshotOverride;if(C&&s.storeTraceAsset){let w=randomUUID();s.storeTraceAsset({snapshotId:w,data:C}),l.elementScreenshotSnapshotId=w;}if(!b?.aiResult.result){l.result=b?.aiResult??{thoughts:S?.message??"AI check failed after all attempts",result:false};let w=`AI check still failing after ${m} attempts.`;throw S&&(w+=` Latest result: ${S.message}`),new M("AssertionFailureError",w)}return l.result=b.aiResult,{...b,thoughts:b.aiResult.thoughts,succeedImmediately:false,urlAfterCommand:c.url()}})}async function jX(t,e,n){await t.waitForPageLoad({signal:n});let[r,o]=await Promise.all([Tc(t,{abortSignal:n,skipWait:true,skipWaitForPageLoad:true,logger:e}),t.screenshot({retries:1,respectActiveFrame:true})]);return {...r,screenshotBuff:o}}async function HX({command:t,state:e,fixtures:n,useConsensus:r,useMemory:o,highlightElementsOnFailure:i,attemptNumber:a,source:s,logger:l,recoveryHint:c}){let {browser:u,generator:d,abortSignal:m}=n,{serializedTree:f,tree:h}=e,b=e.screenshotBuff,y=b.toString("base64"),S=u.url(),T=t.contextChoice??"MULTIMODAL",C=f;T!=="VISION_ONLY"&&(C=await Zu({type:"assertion",serializedTree:f,tree:h,description:t.assertion,screenshot:y,fixtures:{generator:d,signal:m,logger:l,orgId:n.orgId}}),C);let w={goal:t.assertion,url:S,memory:o?t.cache?.memory:void 0,browserState:C,screenshot:y,contextChoice:T,source:s,recoveryHint:c},N=await(T==="VISION_ONLY"?(A,z)=>d.getVisualAssertionResult(A,z):(A,z)=>d.getAssertionResult(A,z))(w,{useConsensus:r,attemptNumber:a,useMemory:o,disableCache:!!t.disableCache,abortSignal:m,logger:l,loggerTags:De(l)}),I;if((N.result||i)&&N.relevantElements?.length){N.relevantElements.map(A=>u.getSerializedFormFromA11yId(A)).filter(A=>!!A);try{let A=N.relevantElements[0],{resolution:z}=await u.createTargetFromA11yId({id:A,description:null,targetSource:"AI",skipSaveToCache:!0});I=await u.screenshot({locator:z.locator,clearHighlights:!0,respectActiveFrame:!0});}catch(A){l.debug({err:A},"Failed to capture element screenshot for trace, continuing...");}await GPe(N.relevantElements,u,l);}return {aiResult:N,afterScreenshotOverride:b,elementScreenshotOverride:I,updatedMemory:o?N.updatedMemory:void 0}}async function GPe(t,e,n){let r=Date.now();for(let o of t){if(Date.now()-r>2e3){n.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await te(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}});}catch(i){n.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}async function GX(t){let{command:e,logger:n,fixtures:r,disableCache:o}=t,{browser:i,generator:a,abortSignal:s}=r;if(!e.goal.trim())throw new M("ActionFailureError","Cannot perform AI extraction without goal");if(e.schema){let d=wm(e.schema);if(d)throw new M("UserConfigurationError",d)}let l=await i.getCondensedHtml(),c=await i.screenshot({retries:2}),u=Wn();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:o,abortSignal:s,loggerTags:De(n)});if(d.result=m,qPe({tracer:u,span:d,screenshot:c,htmlState:l,logger:n}),m.result==="NOT_FOUND")throw new M("ActionFailureError","No relevant data found for extraction goal on this page");if(m.thoughts?.includes("MaxGenerationLengthExceededError"))throw new M("UserConfigurationError",m.thoughts);return {thoughts:m.thoughts||void 0,data:m.result,succeedImmediately:!1,urlAfterCommand:i.url()}})}catch(d){let m=H(d);throw m.includes("MaxGenerationLengthExceededError")?new M("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):m.includes("AIProviderError")&&m.includes("time")?new M("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}}function qPe(t){let{tracer:e,span:n,screenshot:r,htmlState:o,logger:i}=t;if(e.storeTraceAsset)try{let a=randomUUID();e.storeTraceAsset({snapshotId:a,data:r}),n.screenshotSnapshotId=a;let s=randomUUID();e.storeTraceAsset({snapshotId:s,data:Buffer.from(o),extension:"html"}),n.browserStateSnapshotId=s;}catch(a){i.debug({err:a},"Failed to store extraction trace assets");}}async function qX(t,e){let{logger:n}=t,{abortSignal:r,browser:o}=e,i=Date.now();try{await KPe(i,t,e);}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||r.aborted)return;n.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await fe(s,r);}finally{n.debug({durationMs:Date.now()-i},"AI smart waiting complete");}}async function KPe(t,e,n){let{abortSignal:r,browser:o}=n;if(o.smartWaitingTimeout<3e3){await fe(o.smartWaitingTimeout,r);return}if(!e.description)throw new M("UserConfigurationError","Cannot locate element with empty description");await te(YPe(t,e,n),{milliseconds:o.smartWaitingTimeout});}async function YPe(t,e,n){let{logger:r,iframeUrl:o}=e,{browser:i}=n;for(;Date.now()-t<i.smartWaitingTimeout;)if(await $i({action:async()=>XPe(e,n),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:r}))return}async function XPe(t,e){let{testContext:n,logger:r}=t,{browser:o,abortSignal:i,localCodeEvalTools:a,orgId:s,generator:l}=e,c=t.description;n&&(c=await tl({orgId:s,s:c,context:n,localTools:a,signal:i,logger:r})),i.throwIfAborted();let u;try{u=await o.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2});}catch(f){throw new M("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${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:De(r)});return r.debug({result:p},"Got smart waiting result"),p.isPageReady}var JPe=15e3,ZPe=6e4;async function XX(t){return Wn().startAsyncSpan("ELEMENT_ASSERTION",async n=>QPe(t,n),{name:"Element check"})}async function QPe(t,e){let{command:n,timeoutMs:r,fixtures:o,disableCache:i}=t,{abortSignal:a}=o,s=()=>ox(n.cache)?n.cache:void 0,l=s(),c=!i&&!!l?.target&&Ad(l.target),u=cloneDeep(l),d=(C=false)=>{if(l=s(),!!l)if(C){let w=lq(u,l);l.target=w.target,l.updatedAt=w.updatedAt;}else {if(!u){l=void 0;return}l.target=u.target,l.updatedAt=u.updatedAt;}},m=Date.now(),p=c?Math.min(Math.max(r/10,JPe),ZPe):0,f=m,h=0,b,y=500,S=false;for(;h<2||Date.now()-m<r;){h++,h>1&&await fe(y,a),a?.throwIfAborted(),l=s();let C=h===1,w=c&&Date.now()-f>=p;w&&(f=Date.now());let{result:_,elementWasFound:N}=await KX({cacheToUse:l,skipAISmartWaiting:!C,useAIIfCacheFails:!c||w,params:t});if(b=_,S=S||N,_.success)break;d(),y=Math.min(y*1.25,1e4);}if(!b)throw new M("InternalPlatformError",`Failed to evaluate manual element assertion in ${r}ms.`);if(a?.throwIfAborted(),!b.success){let C=s(),w=C?.target?.memory?{target:{id:-1,memory:C.target.memory}}:void 0,{result:_,elementWasFound:N}=await KX({cacheToUse:w,skipAISmartWaiting:true,useAIIfCacheFails:true,params:t});b=_,S=S||N,b.success||d(true);}let T=s();return b.success&&T?.target&&!S&&(T.target=t_(T.target),T.updatedAt=new Date),e.result={success:b.success,message:b.err?.message},b}async function KX({cacheToUse:t,skipAISmartWaiting:e,useAIIfCacheFails:n,params:r}){let{command:o,disableCache:i,fixtures:a,tracer:s,targetingWrapper:l}=r,{logger:c}=a;if(o.target&&!yl(o.target))throw new Error("Element assertion with x/y is not supported yet");let u=zm(o.assertion),d=eIe(o.assertion),m,p=false,f=cloneDeep(t);try{let{elementInteractedDisplayString:h,result:b,thoughts:y}=await l({tracer:s,command:o,target:o.target,cache:f?.target,action:async S=>tIe(S.locator,r),options:{...o,allowNotActionableNodesOverride:d,allowIneligibleTagRedirect:d,showZeroOpacityElementsOverride:!0,disableCache:i,memory:f?.target?.memory,disableGlobalLocatorRedirect:!0,source:ih(o),skipAISmartWaiting:e,targetName:"target"},retriesWithAI:n?1:0});return m={success:b.success,data:b.data,err:b.err,elementInteractedDisplayString:h,thoughts:y},p=!0,b.success||(c.warn({aiThoughts:y,elementString:h,err:b.err},"Element check found an element but failed"),m={...b,thoughts:y}),{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 M)||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 eIe(t){return !(t.type==="ELEMENT_EXISTENCE"&&t.condition==="VISIBLE"&&!t.negated)}async function tIe(t,{command:e,fixtures:n}){return await n.browser.highlight(t),await nIe(t,e.assertion)}async function nIe(t,e){let n=true,r,o;switch(e.type){case "ELEMENT_CONTENT":{let a=await t.textContent()??"";if(o={elementTextContent:In(a,500,true)},!So(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let s=Er(e);n=false,r=new M("AssertionFailureError",`The content ${s} '${e.value}': ${a}`);}break}case "ELEMENT_ATTRIBUTE":{o={elementOuterHtml:In(await t.evaluate(s=>s.cloneNode(false).outerHTML),500,true)};let a=null;try{a=await t.getAttribute(e.attr,{timeout:3e3});}catch(s){r=new M("AssertionFailureError",H(s)),n=false;break}if(!So(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let s=Er(e);n=false,e.operation==="EXISTS"?r=new M("AssertionFailureError",`The attribute ${e.attr} ${s}`):r=new M("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`);}break}case "ELEMENT_EXISTENCE":{switch(e.condition){case "VISIBLE":{n=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},lr*1e3);break}case "EDITABLE":{n=await t.isEditable({timeout:lr*1e3});break}case "EXISTS":{n=true;break}case "ENABLED":{n=await t.isEnabled({timeout:lr*1e3});break}case "FOCUSED":{n=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(n=e.negated?!n:n,!n){let a=Er(e);r=new M("AssertionFailureError",`The element ${a}`);}break}case "ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!So(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:true})){let s=Er(e);n=false,r=new M("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(!So(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let s=Er(e);n=false,e.operation==="EXISTS"?r=new M("AssertionFailureError",`The style property ${e.property} ${s}`):r=new M("AssertionFailureError",`The style property ${e.property} ${s} '${e.value}': ${a}`);}break}default:return (a=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}return {thoughts:void 0,success:n,data:o,err:r}}function JX(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}async function db(t,e){let n=await t.screenshot(e),{width:r,height:o}=imageSize(n);return {buffer:n,width:Math.ceil(r),height:Math.ceil(o)}}async function QX({tracer:t,command:e,disableCache:n,browser:r,targetingWrapper:o,logger:i,screenshotStorage:a}){if(e.target&&!yl(e.target))throw new Error("Visual Diff with x/y is not supported yet");await r.waitForStability({logger:i});let s={clearHighlights:true,hideCaret:true},l;e.target?.elementDescriptor?l=(await o({tracer:t,command:e,target:e.target,cache:e.cache?.target,action:async z=>db(r,{locator:z.locator,...s}),options:{...e,disableCache:n,disableGlobalLocatorRedirect:true,memory:e.cache?.target?.memory,targetName:"target"}})).result:l=await db(r,s);let c=await a.prepareGoldenScreenshotForComparison(i,e,l);if((l.height!==c.height||l.width!==c.width)&&i.warn({currHeight:l.height,currWidth:l.width,savedHeight:c.height,savedWidth:c.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-c.height)>10||Math.abs(l.width-c.width)>10){let A=`${l.width}x${l.height}`,z=`${c.width}x${c.height}`;return {fail:true,thoughts:`Current screenshot (${A}) does not match saved screenshot dimensions (${z}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:false,urlAfterCommand:r.url()}}let u=await Jimp.fromBuffer(l.buffer),d={width:l.width,height:l.height},m=await Jimp.fromBuffer(c.buffer),p={width:c.width,height:c.height},f,h=d.width*d.height,b=p.width*p.height,y=Math.abs(d.height-p.height),S=Math.abs(d.width-p.width);if(h>b){let A=u.cover({w:p.width,h:p.height});l.buffer=await A.getBuffer("image/jpeg"),f="current",l.width=p.width,l.height=p.height;}else if(b>h){let A=m.cover({w:d.width,h:d.height});c.buffer=await A.getBuffer("image/jpeg"),f="saved";}let T={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},C=e.threshold??.1,_=aAe(AD.decode(c.buffer).data,AD.decode(l.buffer).data,T.data,l.width,l.height,{threshold:C,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,N=_>C*100,I=`Visual diff of ${_.toFixed(2)}% detected, which is ${N?"over":"under"} the threshold of ${C*100}%.`;if(f&&(I+=` The ${f} screenshot was cropped since it was taller by ${y} pixels and wider by ${S} pixels.`),N)throw new M("ActionFailureError",I);return {fail:N,thoughts:I,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:AD.encode(T,75).data,succeedImmediately:false,urlAfterCommand:r.url()}}var iIe=3e4;function aIe(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(([n,r])=>{e.append(n,r);}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function vp({command:t,logger:e,baseUrl:n,fetchImplementation:r=fetch}){let o=t.timeout??iIe/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(Vm(t.url)&&(l=t.url),n&&jm(t.url,n)&&(l=new URL(t.url,n).toString()),!l)throw new M("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 te((async()=>{let f=s?`${c}?${s}`:c;try{let h=aIe(t),b=new Headers(i);return h.contentType&&!b.has("Content-Type")&&b.set("Content-Type",h.contentType),await r(f,{headers:b,method:t.method,body:h.content})}catch(h){throw new Error(`Failed to make HTTP request: ${h}`,{cause:h})}})(),{milliseconds:o*1e3,fallback:()=>{throw new M("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let f;try{f=await d.text();}catch(h){f=`Failed to read response body: ${h}`;}throw new M("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 sIe=5e3;async function n9({timeout:t=lr,...e}){let n=Date.now(),r=t*1e3,o=r+1e4,i,a=0,s=500;for(;a-n<r;){if(Date.now()-n>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let l=Date.now();i=await e9(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 fe(s,e.signal),s=Math.min(Math.floor(s*1.5),sIe);else return i}return i=await e9(e),i}async function e9(t){return Wn().startAsyncSpan("PAGE_ASSERTION",async n=>{let r=await RD(t);return n.result={success:r.success,message:r.err?.message},r},{name:"Page check"})}async function RD({assertion:t,browser:e,autoExpandIframes:n}){switch(t.type){case "CONTENT":case "CONTENT":{let o,i=false,a;try{let s;if(n){let l=await e.evaluateFunctionInAllFrames(t9,{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(t9,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let l=t.negated?Hs.CONTAINS:Ws.CONTAINS;a=new M("AssertionFailureError",`The page ${l} '${t.value}'.`),o=s;}}catch(s){a=new M("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`);}return {success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return (o=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}}function t9({value:t,negated:e,returnHtml:n}){let r=document.body.innerHTML,o=r.includes(t)===!e;return r.length>1e4&&(r=r.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&n?r:void 0}}var lIe=3e4;async function r9({command:t,logger:e,baseUrl:n,fetchImplementation:r=fetch}){let o=t.timeout??lIe/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,m])=>d&&m));a["Content-Type"]="application/json";let s;if(Vm(t.url)&&(s=t.url),n&&jm(t.url,n)&&(s=new URL(t.url,n).toString()),!s)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let c=await te((async()=>{try{return await r(s,{headers:a,method:"POST",body:JSON.stringify({query:t.query,variables:t.variables?JSON.parse(t.variables):void 0}),signal:i.signal})}catch(d){throw new Error(`Failed to make HTTP request: ${d}`,{cause:d})}})(),{milliseconds:o*1e3});if(!c)throw new M("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!c.ok){let d,m=await c.text();try{d=JSON.parse(m);}catch{throw new M("ActionFailureError",`GraphQL request failed with status ${c.status}: ${m}`)}throw d?.errors?.length&&d?.errors[0]?.message?new M("ActionFailureError",`GraphQL request failed with status ${c.status}: ${d.errors[0].message}`):new M("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 LC=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;executionOptionsStack=[];recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:n,logger:r,storage:o,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=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=l,this.localCodeEvalTools=a,this.generator=n,this.logger=r;}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal);}setClosed(){this.executeAbortController.abort();}throwIfClosed(){this.executeAbortController.signal.throwIfAborted();}get closed(){return this.executeAbortController.signal.aborted}async withExecutionOptions(e,n){this.executionOptionsStack.push(e);try{return await n()}finally{this.executionOptionsStack.pop();}}getCurrentExecutionOptions(){return this.executionOptionsStack[this.executionOptionsStack.length-1]??{}}async evaluateAiAction({goal:e,startingScreenshot:n,history:r,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[l,c]=await Promise.all([Tc(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 Zu({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:n,history:r,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(m,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...De(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:n,history:r,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let l=this.browser.url(),[c,u]=await Promise.all([Tc(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 Zu({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:n,history:r,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(p,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...De(a)},langfuseSessionId:s})}catch(f){throw new M("InternalWebAgentError",`Error generating command: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}}async getBrowserState(e){return Tc(this.browser,e)}async locateElement(e){return await wD(e,this.getControllerFixtures())}async locateElementWithSelector(e,n){return $i({action:async()=>{let r=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:r}},frameConfig:n?{type:"url",url:n}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(){return {browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??true}async wrapMultiElementTargetingCommand({tracer:e,command:n,targetNames:r,descriptions:o,caches:i,action:a,options:s,retriesWithAI:l=1}){let c=[];for(let u=0;u<o.length;u++){let d=o[u],m=await this.wrapElementTargetingCommand({tracer:e,command:n,target:d,cache:i[u],action:async p=>p,options:{...s,targetName:r[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(r[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:n,targetNames:r,descriptions:o,caches:o.map(()=>{}),action:a,options:s,retriesWithAI:l-1});throw new M("ActionFailureError",u.message,{errOptions:{cause:u}})}}async wrapHardcodedCssTargetingCommandHelper({target:e,action:n,options:r,command:o}){let i=this.logger.child({commandId:o.id}),{targetName:a}=r;if(e.type!=="description")throw new M("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 n({locator:u.locator,originalElementLocationResult:void 0,serverSideBoundingBox:null}),elementInteractedDisplayString:u.displayString}}catch(u){if(u.name==="AbortError")throw u;s=u,i.warn({err:u},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await fe(500);}}throw s}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:n,disableGlobalLocatorRedirect:r,logger:o}=e,i=Wn(),a=!r&&this.browser.userBrowserSettings.globalLocatorRedirect!==false;(this.browser.userBrowserSettings.visualActions||a)&&await i.startAsyncSpan("SCROLL_ELEMENT_INTO_VIEW",async()=>{await this.browser.scrollIntoViewIfNeeded(n.locator);});let s;return a&&(s=await i.startAsyncSpan("LOCATOR_REDIRECT",async l=>{let{targetingResult:c,metadata:u}=await this.browser.performTargetRedirection(n,o);if(l.result=u,u.outcome==="redirected to new element"&&c&&i.storeTraceAsset&&!this.browser.userBrowserSettings.disableBrowserMonitoring){let d=randomUUID();(async()=>{try{let m=await this.browser.screenshot({locator:c.locator,clearHighlights:!0,boundingBoxOverride:c.serverSideBoundingBox??void 0});i.storeTraceAsset?.({snapshotId:d,data:m});}catch(m){o.debug({err:m},"Failed to capture element screenshot for redirect trace");}})(),l.elementScreenshotSnapshotId=d;}return c})),s||(s={locator:n.locator,serverSideBoundingBox:await n.locator.boundingBox({timeout:Le}),originalElementLocationResult:n.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{cache:n,options:r,logger:o}=e,a=await Wn().startAsyncSpan("CACHE_RESOLUTION",async l=>{l.targetSource=n.targetSource,l.attributes.smartWaitingTimeoutMs=this.browser.smartWaitingTimeout;try{let c=await this.browser.resolveTarget(n,{allowNotActionableNodesOverride:r.allowNotActionableNodesOverride,logger:o,signal:this.executeAbortController.signal,...r.resolveTargetOptions,acceptElementMovedError:r.force});l.attributes.targetDisplayString=c.displayString,l.attributes.decisions=c.decisions;let u=c.decisions.find(d=>d.matched);return u&&(l.resolutionMethod=u.type),c}catch(c){throw c instanceof Pe&&(l.cacheMissReason=c.cacheMissReason,l.attributes.decisions=c.decisions),c}}),s=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:a,disableGlobalLocatorRedirect:r.disableGlobalLocatorRedirect,logger:o});return r.force||await a.revalidator?.(),{resolutionResult:a,finalTarget:s}}async wrapElementTargetingCommand(e){return await $i({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:n,target:r,action:o,options:i,command:a,finalAttempt:s=false,originalCache:l=e.cache}=e,{retriesWithAI:c=1}=e,{disableCache:u,useSelector:d,targetName:m}=i,p=Wn(),f=this.logger.child({commandId:a.id}),h=this.shouldUseMemory(),b=cloneDeep(e.cache);if((!b||u)&&!sF(r))throw new M("ActionFailureError","Cannot target element with no cached data or element descriptor");if(d)return this.wrapHardcodedCssTargetingCommandHelper(e);let y=false,S;u&&(f.info("Cache explicitly disabled for this step"),y=true,S="Cache explicitly disabled",b=void 0);let T=kX({cache:b,description:r.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:f});b=T.cache,y=y||T.cacheBustedBeforeAction,!S&&T.cacheBustReason&&(S=T.cacheBustReason);let C=true;if(!LX(b))return c--,C=false,this.executeTargetingCommandWithAI({tracer:p,stepTracer:n,target:r,options:i,command:a,action:o,originalCache:l,logger:f,useMemory:h,cacheBustedBeforeAction:y,cacheBustReason:S});try{let{resolutionResult:w,finalTarget:_}=await this.resolveCachedTargetForAction({cache:b,options:i,logger:f}),N=await o(_);if(Ge.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!b.requirements}`,`hasAdditionalElements:${!!b.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.111.0"]),KT({cmd:a,key:m,newTarget:b,logger:f,updatedWithAI:!1}),C){let I=w.decisions.filter(A=>A.matched);if(I.length!==1)f.warn({decisions:w.decisions},"Expected exactly 1 matching method for element location, got more or less");else {let A=I[0].type;n.recordTargetAutoHeal({healType:A});}}return {result:N,elementInteractedDisplayString:w.displayString}}catch(w){this.throwIfClosed();let _=Sx(w);if(_&&!s)return f.warn({err:w},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({tracer:n,command:a,target:r,action:o,cache:l,originalCache:l,retriesWithAI:c,finalAttempt:true,options:i});if(w instanceof M&&!_)throw f.warn({err:w},"Failed to execute command with target (fatal)"),w;if(c>0&&r){f.info({err:w},"Failed to execute action with cached target, retrying with AI"),Ge.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!b.requirements}`,`hasAdditionalElements:${!!b.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.111.0",`missReason:${w instanceof Pe?w.cacheMissReason:"unknown"}`]);let N;b.memory&&lF(b.memory)&&(N=b.memory);let I=w instanceof Pe&&w.cacheMissReason==="failing-ldist";return this.wrapElementTargetingCommandHelper({tracer:n,command:a,target:r,cache:void 0,action:o,originalCache:l,retriesWithAI:c,finalAttempt:true,options:{...i,memory:N,targetHealingInProgress:true},skipInitialLocateWait:I})}throw new M("ActionFailureError",`Failed to execute interactive command: ${w instanceof Error?w.message:`${w}`}`,{errOptions:{cause:w}})}}async executeTargetingCommandWithAI(e){let{tracer:n,stepTracer:r,target:o,options:i,command:a,action:s,originalCache:l,logger:c,useMemory:u,cacheBustedBeforeAction:d,cacheBustReason:m,skipInitialLocateWait:p}=e;c.info({description:o.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 n.startAsyncSpan("SMART_WAITING",async()=>await qX({description:o.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 b=1;b<=h;b++){let y=false,S=this.browser.getActiveFrameConfig(),T=i.force||b>1;try{let C;try{C=await wD({description:o.elementDescriptor,disableCache:!!i.disableCache,iframeUrl:i.iframeUrl,source:i.source,useMemory:u,memory:u?i.memory:void 0,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride,allowIneligibleTagRedirect:i.allowIneligibleTagRedirect,showZeroOpacityElementsOverride:i.showZeroOpacityElementsOverride,logger:c,skipWait:f||p,isAutoHeal:!!i.targetHealingInProgress,cacheBustReason:m,acceptElementMovedError:T},this.getControllerFixtures());}catch(N){if(N instanceof _a&&N.updatedLocatorMemory){let I={id:-1,...l,memory:N.updatedLocatorMemory};KT({cmd:a,key:i.targetName,newTarget:I,logger:c,updatedWithAI:!0});}throw N}C.frameConfig&&(this.browser.setActiveFrameConfig(C.frameConfig),y=!0);let w=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:C.resolution,disableGlobalLocatorRedirect:i.disableGlobalLocatorRedirect,logger:c}),_=await s(w);return KT({cmd:a,key:i.targetName,newTarget:C.target,logger:c,updatedWithAI:!0}),i.targetHealingInProgress&&(r.recordTargetAutoHeal({healType:"AI"}),C.target.targetSource="AI_HEALED",C.target.targetUpdateTime=new Date().toUTCString(),C.target.targetUpdateLoggerTags=De(c)),{result:_,elementInteractedDisplayString:C.resolution.displayString,thoughts:C.thoughts}}catch(C){if(y&&this.browser.setActiveFrameConfig(S),this.throwIfClosed(),b<h&&Sx(C)){c.warn({err:C,aiAttempt:b},"Encountered retryable AI targeting error; retrying with AI once");continue}throw C instanceof M?C:new M("ActionFailureError",C.message)}}throw new M("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return db(this.browser,e)}async executePresetCommand(e,n,r,o,i){this.options?.slowMoMs&&await fe(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),l;try{l=await this.resolveCommandTemplateStrings(n,r);}catch(c){throw this.throwIfClosed(),new M("ActionFailureError",`Failed to substitute template strings in command: ${c.message}`,{errOptions:{cause:c}})}try{let c=await Xe({name:`cli.command.${n.type}`,attributes:{"momentic.command_type":n.type,"momentic.command_id":n.id},fn:()=>this.executePresetCommandHelper(e,n,r,o,i)});return this.options?.autoFollowNewTabs&&await NX({beforeUrl:s,command:n,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{bp(n,l);}}createCallbacksForBrowser(e){return {createIsolatedFolder:()=>tD(e)}}async traceBrowserInteraction(e,n,r){return Wn().startAsyncSpan("BROWSER_INTERACTION",async i=>n(i),{name:e,...r})}async resolveCommandTemplateStrings(e,n){return gp({obj:e,context:n,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,n,r,o,i){o=o||"disableCache"in n&&!!n.disableCache;let a=this.logger.child({commandId:n.id});switch(n.type){case "SUCCESS":{let s=n.condition;return s?.assertion.trim()?NC({command:s,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),logger:a,recoveryHint:i}):{succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "AI_ASSERTION":{if(!n.assertion.trim())throw new M("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new M("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return NC({command:n,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),logger:a,recoveryHint:i})}case "AI_EXTRACT":return GX({command:n,logger:a,fixtures:this.getControllerFixtures(),disableCache:o});case "NAVIGATE":if(!Vm(n.url)&&!jm(n.url,this.browser.baseUrl))throw new M("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.traceBrowserInteraction("Navigate",()=>this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0}));break;case "DIALOG":this.browser.registerDialogHandler(n.action);break;case "CAPTCHA":throw new M("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(n.target&&xa(n.target)){let d=Zt(n.target.pixels);await this.browser.hoverUsingVisualCoordinates(d);}else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:d,thoughts:m}=await this.wrapElementTargetingCommand({tracer:e,command:n,target:n.target,cache:n.cache?.target,action:p=>this.browser.hover(p),options:{...n,targetName:"target",disableGlobalLocatorRedirect:true,disableCache:o}});s=d,l=m;}let c=this.browser.getViewport()?.height??vl.height,u=this.browser.getViewport()?.width??vl.width;switch(n.type){case "SCROLL_UP":await this.traceBrowserInteraction("Scroll up",()=>this.browser.scrollVertical(-(n.deltaY??c)));break;case "SCROLL_DOWN":await this.traceBrowserInteraction("Scroll down",()=>this.browser.scrollVertical(n.deltaY??c));break;case "SCROLL_LEFT":await this.traceBrowserInteraction("Scroll left",()=>this.browser.scrollHorizontal(-(n.deltaX??u)));break;case "SCROLL_RIGHT":await this.traceBrowserInteraction("Scroll right",()=>this.browser.scrollHorizontal(n.deltaX??u));break}return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new M("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let s=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:s},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case "WAIT":{if(n.delay>1800)throw new M("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let s=n.delay*1e3;await fe(s,this.executeAbortController.signal);break}case "REFRESH":await this.traceBrowserInteraction("Refresh",()=>this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0}));break;case "CLICK":{if(xa(n.target)){let m=Zt(n.target.pixels),p={...n,relativePosition:n.relativePosition?Zt(n.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:n.target,command:n,cache:n.cache?.target,action:m=>this.traceBrowserInteraction("Click",async p=>{let f={...n,relativePosition:n.relativePosition?Zt(n.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:{...n,targetName:"target",disableCache:o}}),d={urlAfterCommand:this.browser.url(),succeedImmediately:false,elementInteracted:l,thoughts:u,data:c.downloadedFile?{downloadedFile:c.downloadedFile}:void 0};return av(s,d.urlAfterCommand)&&(d.succeedImmediately=true,d.succeedImmediatelyReason="URL changed"),d}case "COPY":return await this.browser.copy(n.value),{succeedImmediately:false,data:n.value,urlAfterCommand:this.browser.url()};case "PASTE":{await this.browser.paste();break}case "DRAG":{if(xa(n.fromTarget)&&xa(n.toTarget)){let c=Zt(n.fromTarget.pixels),u=Zt(n.toTarget.pixels);await this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDropUsingVisualCoordinates(c,u,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0}),{coordinates:c});break}if(xa(n.fromTarget)||xa(n.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:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(c,u)=>this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDrop(c,u,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0,steps:n.steps})),options:{...n,disableCache:o}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s[0],thoughts:l}}case "MOUSE_DRAG":{let s=parseInt(n.deltaX),l=parseInt(n.deltaY),c=n.steps??5;if(isNaN(s)||isNaN(l))throw new M("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&xa(n.target)){let m=Zt(n.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(n.target?.elementDescriptor){let{elementInteractedDisplayString:m,thoughts:p}=await this.wrapElementTargetingCommand({tracer:e,command:n,target:n.target,cache:n.cache?.target,action:async f=>this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(s,l,c,f.locator,{force:n.force})),options:{...n,targetName:"target",disableCache:o}});u=m,d=p;}else await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(s,l,c,void 0,{force:n.force}));return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:u,thoughts:d}}case "SELECT_OPTION":{if(!yl(n.target))throw new Error("Select with x/y is not supported yet");let s=n.target.elementDescriptor,l=n.choice,{elementInteractedDisplayString:c,thoughts:u}=await this.wrapElementTargetingCommand({tracer:e,command:n,target:{type:"description",elementDescriptor:s},cache:n.cache?.target,action:d=>this.traceBrowserInteraction("Select option",()=>this.browser.selectOption(d,l,n.force),{value:l.type==="LABEL"?l.label:l.type==="VALUE"?l.value:l.index}),options:{...n,targetName:"target",disableCache:o,source:ih(n)}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:c,thoughts:u}}case "TAB":{let s={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:true};await this.browser.switchToPage(n.action,s);break}case "NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case "CLOSE_TAB":await this.browser.closePage(n.action,{retry:true});break;case "COOKIE":{if(!n.value)break;let s=await this.browser.setCookie(n.value);a.debug({results:s},"Set cookies");break}case "LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case "JAVASCRIPT":{let s;try{n.environment==="BROWSER"?(s=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:r.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),a.info({result:s},"Executed JavaScript in browser")):s=await Fi({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:r,timeoutMs:n.timeout?n.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 M("ActionFailureError",l instanceof Error?l.message:`${l}`,{errOptions:{cause:l}})}try{JSON.stringify(s);}catch(l){throw new M("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(n.target&&xa(n.target)){let p=Zt(n.target.pixels),f={...n,relativePosition:n.relativePosition?Zt(n.relativePosition):void 0};await this.browser.clickUsingVisualCoordinates(p,f),await this.traceBrowserInteraction("Type",()=>this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},true),{value:n.value});break}let s=this.browser.url(),l,c,u=cloneDeep(n.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:n,target:u,cache:n.cache?.target,action:h=>this.traceBrowserInteraction("Type",()=>this.browser.typeIntoTarget(n.value,h,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),{value:n.value,selector:h.locator.toString()}),options:{...n,targetName:"target",disableCache:o,disableGlobalLocatorRedirect:!d,source:ih(n)}});l=p,c=f;}else await this.traceBrowserInteraction("Type",()=>this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},true),{value:n.value});let m={urlAfterCommand:this.browser.url(),succeedImmediately:false,elementInteracted:l,thoughts:c};return av(s,m.urlAfterCommand)&&(m.succeedImmediately=true,m.succeedImmediatelyReason="URL changed"),m}case "HOVER":{if(xa(n.target)){let c=Zt(n.target.pixels);await this.traceBrowserInteraction("Hover",()=>this.browser.hoverUsingVisualCoordinates(c),{coordinates:c});break}let{elementInteractedDisplayString:s,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,command:n,target:n.target,cache:n.cache?.target,action:c=>this.traceBrowserInteraction("Hover",()=>this.browser.hover(c,{relativePosition:n.relativePosition?Zt(n.relativePosition):void 0}),{selector:c.locator.toString()}),options:{...n,targetName:"target",disableCache:o}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "FOCUS":{if(!yl(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:s,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,command:n,target:n.target,cache:n.cache?.target,action:c=>this.browser.focus(c),options:{...n,targetName:"target",disableCache:o}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "BLUR":{if(n.target&&!yl(n.target))throw new Error("Blur with x/y is not supported yet");if(!n.target||!n.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:false,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:s,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,target:n.target,command:n,cache:n.cache?.target,action:c=>this.browser.blur(c),options:{...n,targetName:"target",disableCache:o}});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(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??true,delayMs:n.delayMs}),{value:n.value});let l={urlAfterCommand:this.browser.url(),succeedImmediately:false};return av(s,l.urlAfterCommand)&&(l.succeedImmediately=true,l.succeedImmediatelyReason="URL changed"),l}case "KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??true}),{urlAfterCommand:this.browser.url(),succeedImmediately:false};case "KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??true}),{urlAfterCommand:this.browser.url(),succeedImmediately:false};case "REQUEST":{let s=new CookieJar,l=uIe(fetch,s),c;try{c=new URL(n.url).hostname;}catch{}let u=await vp({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:l});return {data:Pd.parse({...u,cookies:rm(s,c)}),succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "GRAPHQL_REQUEST":return {data:await r9({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:false,urlAfterCommand:this.browser.url()};case "VISUAL_DIFF":return QX({tracer:e,command:n,disableCache:o,browser:this.browser,logger:a,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:s=>this.wrapElementTargetingCommand(s)});case "FILE_UPLOAD":{let s,l;if(n.fileSource.type==="URL"?(l=n.fileSource.url,s=await E6({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(l=n.fileSource.name,s=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!s)throw new M("UserConfigurationError",`Attempted to use non-existent file for upload step: ${l}`);await this.browser.setFileChooserHandler({...s,filename:n.filename});break}case "AUTH_SAVE":{let s=await this.browser.saveAuthState();if(n.storageState&&f_(n.storageState)){let l=mn__default.resolve(n.storageState);br.mkdirSync(mn__default.dirname(l),{recursive:true}),br.writeFileSync(l,`${JSON.stringify(s,null,2)}
|
|
5722
|
+
`),tokenLength:d}),s.forEach((h,b)=>{let y=h.ids[0],S=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:y,maxId:S},`Chunk for page filtering (index ${b+1}/${s.length})`);}),{chunks:s}}var $X=5e6,BPe=1e5,UPe=3e4,zPe=6e4,$Pe=1e5;async function Zu(t){let{fixtures:e}=t,{logger:n}=e,r=t.tree,o=t.serializedTree,i=kt(o);if(i>$X)throw new M("UserConfigurationError",`Page accessibility tree is too large for AI page filtering (${i} tokens). Maximum supported size is ${$X} tokens.`);if(i>BPe){let a=zX({serializedTree:o,options:BX,logger:n}),s=randomUUID();r=await VPe({...t,chunks:a.chunks,callId:s}),o=r.serialize();let l=kt(o);n.info({oldTokens:i,newTokens:l,langfuseCallId:s},"Filtered page using AI chunk ranking");}return o}async function VPe({type:t,callId:e,chunks:n,description:r,fixtures:o,tree:i}){let{generator:a,signal:s,logger:l}=o,c=await a.rankChunksWithAi({chunks:n,description:r,type:t,softTokenLimit:UPe,mediumTokenLimit:zPe,hardTokenLimit:$Pe,callId:e},{abortSignal:s,logger:l,loggerTags:De(l)}),u=[];return n.forEach((m,p)=>{c.indices.includes(p)&&(u=u.concat(m.ids));}),i.pruneUsingRelevantIds(new Set(u))}async function wD(t,e){if(!t.description)throw new M("UserConfigurationError","Cannot locate element with empty description");return $i({action:async()=>HPe(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function HPe(t,e){let{disableCache:n,testContext:r,filterByViewport:o,skipWait:i,source:a,memory:s,logger:l,allowNotActionableNodesOverride:c,allowIneligibleTagRedirect:u,showZeroOpacityElementsOverride:d,skipSavingVisualAttributes:m,isAutoHeal:p,cacheBustReason:f,acceptElementMovedError:h}=t,{orgId:b,browser:y,localCodeEvalTools:S,generator:T,abortSignal:C}=e,w=t.description,_=Wn(),N=t.useMemory&&!n;r&&(w=await tl({orgId:b,s:w,context:r,localTools:S,signal:C,logger:l})),a&&(w=DX(w,a));let{serializedTree:I,tree:A}=await _.startAsyncSpan("GET_PAGE_STATE",async()=>Tc(y,{allowNotActionableNodesOverride:c,allowIneligibleTagRedirect:u,showZeroOpacityElementsOverride:d,filterByViewport:o,abortSignal:C,skipWait:i,logger:l}),{}),z=await _.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let q,V=Date.now(),pe;for(;!q&&Date.now()-V<3e3;){C.throwIfAborted();try{q=await y.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2});}catch(Te){pe=Te;}}if(!q)throw new M("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${pe?.message}`);return q}),D=I,B=false,$=`data:image/jpeg;base64,${z.toString("base64")}`,le=De(l);D=await Zu({type:"locator",description:w,screenshot:$,serializedTree:I,tree:A,fixtures:{generator:T,signal:C,logger:l,orgId:b}}),D!==I&&(B=true);let j=await _.startAsyncSpan("AI_LOCATOR_CALL",async q=>{p&&(q.attributes.isAutoHeal=true),f&&(q.attributes.cacheBustReason=f);let V=await T.getElementLocation({browserState:D,goal:w,screenshot:$,source:a,memory:N?s:void 0},{disableCache:n,abortSignal:C,logger:l,loggerTags:le,useMemory:N,cacheBustReason:f});if(q.result=V,_.storeTraceAsset){let pe=randomUUID();_.storeTraceAsset({snapshotId:pe,data:z}),q.screenshotSnapshotId=pe;}return V});if(l.debug({usedRag:B,result:j},"Got locator result"),!(j.id>0))throw new _a(`Could not find any relevant element: ${j.thoughts}`,j.updatedMemory?{type:"GCS_TRACES",traces:j.updatedMemory}:void 0);let{resolution:U,target:k,frameConfig:W}=await _.startAsyncSpan("TARGET_RESOLUTION",async q=>{let V=await y.createTargetFromA11yId({id:j.id,requirements:j.requirements,additionalElements:j.additionalElements,description:w,targetSource:"AI",logger:l,skipSavingVisualAttributes:m,acceptElementMovedError:h});return q.result={serializedElement:V.target.nodeOnlySerializedHtml??"Unknown HTML element"},V});if(U.a11yNode?.properties?.hidden&&U.a11yNode?.properties?.hidden!=="false")throw new M("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${U.displayString}`);return N&&(j.updatedMemory?k.memory={type:"GCS_TRACES",traces:j.updatedMemory}:s&&(k.memory=s)),{thoughts:j.thoughts,target:k,resolution:U,frameConfig:W,screenshot:$}}var WPe=15;async function NC({command:t,logger:e,fixtures:n,useMemory:r,maxRetries:o=WPe,recoveryHint:i}){if(!t.assertion.trim())throw new M("ActionFailureError","Assertion command is missing the assertion content");let a=Kx.optional().catch(void 0).parse(t.source);t.source&&!a&&e.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let s=Wn();return s.startAsyncSpan("AI_ASSERTION_CALL",async l=>{let{browser:c}=n,u=t.timeout?t.timeout*1e3:c.smartWaitingTimeout,d=xq(u,o-1),m=0,p=Date.now(),f=p+u,h=p,b,y,S;try{await $i({action:()=>c.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:c,logger:e});}catch(w){e.warn({err:w},"Failed to clear highlights before AI check, continuing...");}for(;m<o;){n.abortSignal.throwIfAborted();let w=Date.now();if(m>0){if(w>=f)break;let I=f-w,A=h-w,z=Math.min(A,I);z>0&&await fe(z,n.abortSignal);}let _=Date.now();if(m>0&&_>=f)break;let N=false;try{if(b=await $i({action:async()=>{let A=await jX(c,e,n.abortSignal);return y&&y.serializedTree===A.serializedTree&&y.screenshotBuff.equals(A.screenshotBuff)?(N=!0,b):(y=A,HX({command:t,state:A,fixtures:n,useMemory:r,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}),b?.aiResult.result){b?.updatedMemory&&Eg(t,b.updatedMemory,e);break}else throw b?.aiResult.thoughts?new M("AssertionFailureError",b.aiResult.thoughts):new M("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(I){n.abortSignal.throwIfAborted(),S=I instanceof Error?I:new Error(`${I}`),N?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=_+d;}}if(!b?.aiResult.result){let w=f-Date.now();w>0&&await fe(w,n.abortSignal);}if(!b?.aiResult.result)try{b=await $i({action:async()=>HX({command:t,state:await jX(c,e,n.abortSignal),fixtures:n,useMemory:r,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(w){n.abortSignal.throwIfAborted(),S=w instanceof Error?w:new Error(`${w}`);}finally{m++;}b?.updatedMemory&&Eg(t,b.updatedMemory,e);let T=b?.afterScreenshotOverride;if(T&&s.storeTraceAsset){let w=randomUUID();s.storeTraceAsset({snapshotId:w,data:T}),l.screenshotSnapshotId=w;}let C=b?.elementScreenshotOverride;if(C&&s.storeTraceAsset){let w=randomUUID();s.storeTraceAsset({snapshotId:w,data:C}),l.elementScreenshotSnapshotId=w;}if(!b?.aiResult.result){l.result=b?.aiResult??{thoughts:S?.message??"AI check failed after all attempts",result:false};let w=`AI check still failing after ${m} attempts.`;throw S&&(w+=` Latest result: ${S.message}`),new M("AssertionFailureError",w)}return l.result=b.aiResult,{...b,thoughts:b.aiResult.thoughts,succeedImmediately:false,urlAfterCommand:c.url()}})}async function jX(t,e,n){await t.waitForPageLoad({signal:n});let[r,o]=await Promise.all([Tc(t,{abortSignal:n,skipWait:true,skipWaitForPageLoad:true,logger:e}),t.screenshot({retries:1,respectActiveFrame:true})]);return {...r,screenshotBuff:o}}async function HX({command:t,state:e,fixtures:n,useConsensus:r,useMemory:o,highlightElementsOnFailure:i,attemptNumber:a,source:s,logger:l,recoveryHint:c}){let {browser:u,generator:d,abortSignal:m}=n,{serializedTree:f,tree:h}=e,b=e.screenshotBuff,y=b.toString("base64"),S=u.url(),T=t.contextChoice??"MULTIMODAL",C=f;T!=="VISION_ONLY"&&(C=await Zu({type:"assertion",serializedTree:f,tree:h,description:t.assertion,screenshot:y,fixtures:{generator:d,signal:m,logger:l,orgId:n.orgId}}),C);let w={goal:t.assertion,url:S,memory:o?t.cache?.memory:void 0,browserState:C,screenshot:y,contextChoice:T,source:s,recoveryHint:c},N=await(T==="VISION_ONLY"?(A,z)=>d.getVisualAssertionResult(A,z):(A,z)=>d.getAssertionResult(A,z))(w,{useConsensus:r,attemptNumber:a,useMemory:o,disableCache:!!t.disableCache,abortSignal:m,logger:l,loggerTags:De(l)}),I;if((N.result||i)&&N.relevantElements?.length){N.relevantElements.map(A=>u.getSerializedFormFromA11yId(A)).filter(A=>!!A);try{let A=N.relevantElements[0],{resolution:z}=await u.createTargetFromA11yId({id:A,description:null,targetSource:"AI",skipSaveToCache:!0});I=await u.screenshot({locator:z.locator,clearHighlights:!0,respectActiveFrame:!0});}catch(A){l.debug({err:A},"Failed to capture element screenshot for trace, continuing...");}await GPe(N.relevantElements,u,l);}return {aiResult:N,afterScreenshotOverride:b,elementScreenshotOverride:I,updatedMemory:o?N.updatedMemory:void 0}}async function GPe(t,e,n){let r=Date.now();for(let o of t){if(Date.now()-r>2e3){n.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await te(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}});}catch(i){n.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}async function GX(t){let{command:e,logger:n,fixtures:r,disableCache:o}=t,{browser:i,generator:a,abortSignal:s}=r;if(!e.goal.trim())throw new M("ActionFailureError","Cannot perform AI extraction without goal");if(e.schema){let d=wm(e.schema);if(d)throw new M("UserConfigurationError",d)}let l=await i.getCondensedHtml(),c=await i.screenshot({retries:2}),u=Wn();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:o,abortSignal:s,loggerTags:De(n)});if(d.result=m,qPe({tracer:u,span:d,screenshot:c,htmlState:l,logger:n}),m.result==="NOT_FOUND")throw new M("ActionFailureError","No relevant data found for extraction goal on this page");if(m.thoughts?.includes("MaxGenerationLengthExceededError"))throw new M("UserConfigurationError",m.thoughts);return {thoughts:m.thoughts||void 0,data:m.result,succeedImmediately:!1,urlAfterCommand:i.url()}})}catch(d){let m=H(d);throw m.includes("MaxGenerationLengthExceededError")?new M("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):m.includes("AIProviderError")&&m.includes("time")?new M("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}}function qPe(t){let{tracer:e,span:n,screenshot:r,htmlState:o,logger:i}=t;if(e.storeTraceAsset)try{let a=randomUUID();e.storeTraceAsset({snapshotId:a,data:r}),n.screenshotSnapshotId=a;let s=randomUUID();e.storeTraceAsset({snapshotId:s,data:Buffer.from(o),extension:"html"}),n.browserStateSnapshotId=s;}catch(a){i.debug({err:a},"Failed to store extraction trace assets");}}async function qX(t,e){let{logger:n}=t,{abortSignal:r,browser:o}=e,i=Date.now();try{await KPe(i,t,e);}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||r.aborted)return;n.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await fe(s,r);}finally{n.debug({durationMs:Date.now()-i},"AI smart waiting complete");}}async function KPe(t,e,n){let{abortSignal:r,browser:o}=n;if(o.smartWaitingTimeout<3e3){await fe(o.smartWaitingTimeout,r);return}if(!e.description)throw new M("UserConfigurationError","Cannot locate element with empty description");await te(YPe(t,e,n),{milliseconds:o.smartWaitingTimeout});}async function YPe(t,e,n){let{logger:r,iframeUrl:o}=e,{browser:i}=n;for(;Date.now()-t<i.smartWaitingTimeout;)if(await $i({action:async()=>XPe(e,n),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:r}))return}async function XPe(t,e){let{testContext:n,logger:r}=t,{browser:o,abortSignal:i,localCodeEvalTools:a,orgId:s,generator:l}=e,c=t.description;n&&(c=await tl({orgId:s,s:c,context:n,localTools:a,signal:i,logger:r})),i.throwIfAborted();let u;try{u=await o.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2});}catch(f){throw new M("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${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:De(r)});return r.debug({result:p},"Got smart waiting result"),p.isPageReady}var JPe=15e3,ZPe=6e4;async function XX(t){return Wn().startAsyncSpan("ELEMENT_ASSERTION",async n=>QPe(t,n),{name:"Element check"})}async function QPe(t,e){let{command:n,timeoutMs:r,fixtures:o,disableCache:i}=t,{abortSignal:a}=o,s=()=>ox(n.cache)?n.cache:void 0,l=s(),c=!i&&!!l?.target&&Ad(l.target),u=cloneDeep(l),d=(C=false)=>{if(l=s(),!!l)if(C){let w=lq(u,l);l.target=w.target,l.updatedAt=w.updatedAt;}else {if(!u){l=void 0;return}l.target=u.target,l.updatedAt=u.updatedAt;}},m=Date.now(),p=c?Math.min(Math.max(r/10,JPe),ZPe):0,f=m,h=0,b,y=500,S=false;for(;h<2||Date.now()-m<r;){h++,h>1&&await fe(y,a),a?.throwIfAborted(),l=s();let C=h===1,w=c&&Date.now()-f>=p;w&&(f=Date.now());let{result:_,elementWasFound:N}=await KX({cacheToUse:l,skipAISmartWaiting:!C,useAIIfCacheFails:!c||w,params:t});if(b=_,S=S||N,_.success)break;d(),y=Math.min(y*1.25,1e4);}if(!b)throw new M("InternalPlatformError",`Failed to evaluate manual element assertion in ${r}ms.`);if(a?.throwIfAborted(),!b.success){let C=s(),w=C?.target?.memory?{target:{id:-1,memory:C.target.memory}}:void 0,{result:_,elementWasFound:N}=await KX({cacheToUse:w,skipAISmartWaiting:true,useAIIfCacheFails:true,params:t});b=_,S=S||N,b.success||d(true);}let T=s();return b.success&&T?.target&&!S&&(T.target=t_(T.target),T.updatedAt=new Date),e.result={success:b.success,message:b.err?.message},b}async function KX({cacheToUse:t,skipAISmartWaiting:e,useAIIfCacheFails:n,params:r}){let{command:o,disableCache:i,fixtures:a,tracer:s,targetingWrapper:l}=r,{logger:c}=a;if(o.target&&!yl(o.target))throw new Error("Element assertion with x/y is not supported yet");let u=zm(o.assertion),d=eIe(o.assertion),m,p=false,f=cloneDeep(t);try{let{elementInteractedDisplayString:h,result:b,thoughts:y}=await l({tracer:s,command:o,target:o.target,cache:f?.target,action:async S=>tIe(S.locator,r),options:{...o,allowNotActionableNodesOverride:d,allowIneligibleTagRedirect:d,showZeroOpacityElementsOverride:!0,disableCache:i,memory:f?.target?.memory,disableGlobalLocatorRedirect:!0,source:ih(o),skipAISmartWaiting:e,targetName:"target"},retriesWithAI:n?1:0});return m={success:b.success,data:b.data,err:b.err,elementInteractedDisplayString:h,thoughts:y},p=!0,b.success||(c.warn({aiThoughts:y,elementString:h,err:b.err},"Element check found an element but failed"),m={...b,thoughts:y}),{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 M)||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 eIe(t){return !(t.type==="ELEMENT_EXISTENCE"&&t.condition==="VISIBLE"&&!t.negated)}async function tIe(t,{command:e,fixtures:n}){return await n.browser.highlight(t),await nIe(t,e.assertion)}async function nIe(t,e){let n=true,r,o;switch(e.type){case "ELEMENT_CONTENT":{let a=await t.textContent()??"";if(o={elementTextContent:In(a,500,true)},!So(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let s=Er(e);n=false,r=new M("AssertionFailureError",`The content ${s} '${e.value}': ${a}`);}break}case "ELEMENT_ATTRIBUTE":{o={elementOuterHtml:In(await t.evaluate(s=>s.cloneNode(false).outerHTML),500,true)};let a=null;try{a=await t.getAttribute(e.attr,{timeout:3e3});}catch(s){r=new M("AssertionFailureError",H(s)),n=false;break}if(!So(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let s=Er(e);n=false,e.operation==="EXISTS"?r=new M("AssertionFailureError",`The attribute ${e.attr} ${s}`):r=new M("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`);}break}case "ELEMENT_EXISTENCE":{switch(e.condition){case "VISIBLE":{n=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},lr*1e3);break}case "EDITABLE":{n=await t.isEditable({timeout:lr*1e3});break}case "EXISTS":{n=true;break}case "ENABLED":{n=await t.isEnabled({timeout:lr*1e3});break}case "FOCUSED":{n=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(n=e.negated?!n:n,!n){let a=Er(e);r=new M("AssertionFailureError",`The element ${a}`);}break}case "ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!So(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:true})){let s=Er(e);n=false,r=new M("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(!So(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let s=Er(e);n=false,e.operation==="EXISTS"?r=new M("AssertionFailureError",`The style property ${e.property} ${s}`):r=new M("AssertionFailureError",`The style property ${e.property} ${s} '${e.value}': ${a}`);}break}default:return (a=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}return {thoughts:void 0,success:n,data:o,err:r}}function JX(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}async function db(t,e){let n=await t.screenshot(e),{width:r,height:o}=imageSize(n);return {buffer:n,width:Math.ceil(r),height:Math.ceil(o)}}async function QX({tracer:t,command:e,disableCache:n,browser:r,targetingWrapper:o,logger:i,screenshotStorage:a}){if(e.target&&!yl(e.target))throw new Error("Visual Diff with x/y is not supported yet");await r.waitForStability({logger:i});let s={clearHighlights:true,hideCaret:true},l;e.target?.elementDescriptor?l=(await o({tracer:t,command:e,target:e.target,cache:e.cache?.target,action:async z=>db(r,{locator:z.locator,...s}),options:{...e,disableCache:n,disableGlobalLocatorRedirect:true,memory:e.cache?.target?.memory,targetName:"target"}})).result:l=await db(r,s);let c=await a.prepareGoldenScreenshotForComparison(i,e,l);if((l.height!==c.height||l.width!==c.width)&&i.warn({currHeight:l.height,currWidth:l.width,savedHeight:c.height,savedWidth:c.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-c.height)>10||Math.abs(l.width-c.width)>10){let A=`${l.width}x${l.height}`,z=`${c.width}x${c.height}`;return {fail:true,thoughts:`Current screenshot (${A}) does not match saved screenshot dimensions (${z}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:false,urlAfterCommand:r.url()}}let u=await Jimp.fromBuffer(l.buffer),d={width:l.width,height:l.height},m=await Jimp.fromBuffer(c.buffer),p={width:c.width,height:c.height},f,h=d.width*d.height,b=p.width*p.height,y=Math.abs(d.height-p.height),S=Math.abs(d.width-p.width);if(h>b){let A=u.cover({w:p.width,h:p.height});l.buffer=await A.getBuffer("image/jpeg"),f="current",l.width=p.width,l.height=p.height;}else if(b>h){let A=m.cover({w:d.width,h:d.height});c.buffer=await A.getBuffer("image/jpeg"),f="saved";}let T={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},C=e.threshold??.1,_=aAe(AD.decode(c.buffer).data,AD.decode(l.buffer).data,T.data,l.width,l.height,{threshold:C,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,N=_>C*100,I=`Visual diff of ${_.toFixed(2)}% detected, which is ${N?"over":"under"} the threshold of ${C*100}%.`;if(f&&(I+=` The ${f} screenshot was cropped since it was taller by ${y} pixels and wider by ${S} pixels.`),N)throw new M("ActionFailureError",I);return {fail:N,thoughts:I,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:AD.encode(T,75).data,succeedImmediately:false,urlAfterCommand:r.url()}}var iIe=3e4;function aIe(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(([n,r])=>{e.append(n,r);}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function vp({command:t,logger:e,baseUrl:n,fetchImplementation:r=fetch}){let o=t.timeout??iIe/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(Vm(t.url)&&(l=t.url),n&&jm(t.url,n)&&(l=new URL(t.url,n).toString()),!l)throw new M("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 te((async()=>{let f=s?`${c}?${s}`:c;try{let h=aIe(t),b=new Headers(i);return h.contentType&&!b.has("Content-Type")&&b.set("Content-Type",h.contentType),await r(f,{headers:b,method:t.method,body:h.content})}catch(h){throw new Error(`Failed to make HTTP request: ${h}`,{cause:h})}})(),{milliseconds:o*1e3,fallback:()=>{throw new M("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let f;try{f=await d.text();}catch(h){f=`Failed to read response body: ${h}`;}throw new M("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 sIe=5e3;async function n9({timeout:t=lr,...e}){let n=Date.now(),r=t*1e3,o=r+1e4,i,a=0,s=500;for(;a-n<r;){if(Date.now()-n>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let l=Date.now();i=await e9(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 fe(s,e.signal),s=Math.min(Math.floor(s*1.5),sIe);else return i}return i=await e9(e),i}async function e9(t){return Wn().startAsyncSpan("PAGE_ASSERTION",async n=>{let r=await RD(t);return n.result={success:r.success,message:r.err?.message},r},{name:"Page check"})}async function RD({assertion:t,browser:e,autoExpandIframes:n}){switch(t.type){case "CONTENT":case "CONTENT":{let o,i=false,a;try{let s;if(n){let l=await e.evaluateFunctionInAllFrames(t9,{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(t9,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let l=t.negated?Hs.CONTAINS:Ws.CONTAINS;a=new M("AssertionFailureError",`The page ${l} '${t.value}'.`),o=s;}}catch(s){a=new M("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`);}return {success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return (o=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}}function t9({value:t,negated:e,returnHtml:n}){let r=document.body.innerHTML,o=r.includes(t)===!e;return r.length>1e4&&(r=r.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&n?r:void 0}}var lIe=3e4;async function r9({command:t,logger:e,baseUrl:n,fetchImplementation:r=fetch}){let o=t.timeout??lIe/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,m])=>d&&m));a["Content-Type"]="application/json";let s;if(Vm(t.url)&&(s=t.url),n&&jm(t.url,n)&&(s=new URL(t.url,n).toString()),!s)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let c=await te((async()=>{try{return await r(s,{headers:a,method:"POST",body:JSON.stringify({query:t.query,variables:t.variables?JSON.parse(t.variables):void 0}),signal:i.signal})}catch(d){throw new Error(`Failed to make HTTP request: ${d}`,{cause:d})}})(),{milliseconds:o*1e3});if(!c)throw new M("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!c.ok){let d,m=await c.text();try{d=JSON.parse(m);}catch{throw new M("ActionFailureError",`GraphQL request failed with status ${c.status}: ${m}`)}throw d?.errors?.length&&d?.errors[0]?.message?new M("ActionFailureError",`GraphQL request failed with status ${c.status}: ${d.errors[0].message}`):new M("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 LC=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;executionOptionsStack=[];recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:n,logger:r,storage:o,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=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=l,this.localCodeEvalTools=a,this.generator=n,this.logger=r;}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal);}setClosed(){this.executeAbortController.abort();}throwIfClosed(){this.executeAbortController.signal.throwIfAborted();}get closed(){return this.executeAbortController.signal.aborted}async withExecutionOptions(e,n){this.executionOptionsStack.push(e);try{return await n()}finally{this.executionOptionsStack.pop();}}getCurrentExecutionOptions(){return this.executionOptionsStack[this.executionOptionsStack.length-1]??{}}async evaluateAiAction({goal:e,startingScreenshot:n,history:r,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[l,c]=await Promise.all([Tc(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 Zu({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:n,history:r,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(m,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...De(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:n,history:r,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let l=this.browser.url(),[c,u]=await Promise.all([Tc(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 Zu({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:n,history:r,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(p,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...De(a)},langfuseSessionId:s})}catch(f){throw new M("InternalWebAgentError",`Error generating command: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}}async getBrowserState(e){return Tc(this.browser,e)}async locateElement(e){return await wD(e,this.getControllerFixtures())}async locateElementWithSelector(e,n){return $i({action:async()=>{let r=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:r}},frameConfig:n?{type:"url",url:n}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(){return {browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??true}async wrapMultiElementTargetingCommand({tracer:e,command:n,targetNames:r,descriptions:o,caches:i,action:a,options:s,retriesWithAI:l=1}){let c=[];for(let u=0;u<o.length;u++){let d=o[u],m=await this.wrapElementTargetingCommand({tracer:e,command:n,target:d,cache:i[u],action:async p=>p,options:{...s,targetName:r[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(r[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:n,targetNames:r,descriptions:o,caches:o.map(()=>{}),action:a,options:s,retriesWithAI:l-1});throw new M("ActionFailureError",u.message,{errOptions:{cause:u}})}}async wrapHardcodedCssTargetingCommandHelper({target:e,action:n,options:r,command:o}){let i=this.logger.child({commandId:o.id}),{targetName:a}=r;if(e.type!=="description")throw new M("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 n({locator:u.locator,originalElementLocationResult:void 0,serverSideBoundingBox:null}),elementInteractedDisplayString:u.displayString}}catch(u){if(u.name==="AbortError")throw u;s=u,i.warn({err:u},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await fe(500);}}throw s}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:n,disableGlobalLocatorRedirect:r,logger:o}=e,i=Wn(),a=!r&&this.browser.userBrowserSettings.globalLocatorRedirect!==false;(this.browser.userBrowserSettings.visualActions||a)&&await i.startAsyncSpan("SCROLL_ELEMENT_INTO_VIEW",async()=>{await this.browser.scrollIntoViewIfNeeded(n.locator);});let s;return a&&(s=await i.startAsyncSpan("LOCATOR_REDIRECT",async l=>{let{targetingResult:c,metadata:u}=await this.browser.performTargetRedirection(n,o);if(l.result=u,u.outcome==="redirected to new element"&&c&&i.storeTraceAsset&&!this.browser.userBrowserSettings.disableBrowserMonitoring){let d=randomUUID();(async()=>{try{let m=await this.browser.screenshot({locator:c.locator,clearHighlights:!0,boundingBoxOverride:c.serverSideBoundingBox??void 0});i.storeTraceAsset?.({snapshotId:d,data:m});}catch(m){o.debug({err:m},"Failed to capture element screenshot for redirect trace");}})(),l.elementScreenshotSnapshotId=d;}return c})),s||(s={locator:n.locator,serverSideBoundingBox:await n.locator.boundingBox({timeout:Le}),originalElementLocationResult:n.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{cache:n,options:r,logger:o}=e,a=await Wn().startAsyncSpan("CACHE_RESOLUTION",async l=>{l.targetSource=n.targetSource,l.attributes.smartWaitingTimeoutMs=this.browser.smartWaitingTimeout;try{let c=await this.browser.resolveTarget(n,{allowNotActionableNodesOverride:r.allowNotActionableNodesOverride,logger:o,signal:this.executeAbortController.signal,...r.resolveTargetOptions,acceptElementMovedError:r.force});l.attributes.targetDisplayString=c.displayString,l.attributes.decisions=c.decisions;let u=c.decisions.find(d=>d.matched);return u&&(l.resolutionMethod=u.type),c}catch(c){throw c instanceof Pe&&(l.cacheMissReason=c.cacheMissReason,l.attributes.decisions=c.decisions),c}}),s=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:a,disableGlobalLocatorRedirect:r.disableGlobalLocatorRedirect,logger:o});return r.force||await a.revalidator?.(),{resolutionResult:a,finalTarget:s}}async wrapElementTargetingCommand(e){return await $i({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:n,target:r,action:o,options:i,command:a,finalAttempt:s=false,originalCache:l=e.cache}=e,{retriesWithAI:c=1}=e,{disableCache:u,useSelector:d,targetName:m}=i,p=Wn(),f=this.logger.child({commandId:a.id}),h=this.shouldUseMemory(),b=cloneDeep(e.cache);if((!b||u)&&!sF(r))throw new M("ActionFailureError","Cannot target element with no cached data or element descriptor");if(d)return this.wrapHardcodedCssTargetingCommandHelper(e);let y=false,S;u&&(f.info("Cache explicitly disabled for this step"),y=true,S="Cache explicitly disabled",b=void 0);let T=kX({cache:b,description:r.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:f});b=T.cache,y=y||T.cacheBustedBeforeAction,!S&&T.cacheBustReason&&(S=T.cacheBustReason);let C=true;if(!LX(b))return c--,C=false,this.executeTargetingCommandWithAI({tracer:p,stepTracer:n,target:r,options:i,command:a,action:o,originalCache:l,logger:f,useMemory:h,cacheBustedBeforeAction:y,cacheBustReason:S});try{let{resolutionResult:w,finalTarget:_}=await this.resolveCachedTargetForAction({cache:b,options:i,logger:f}),N=await o(_);if(Ge.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!b.requirements}`,`hasAdditionalElements:${!!b.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.111.1"]),KT({cmd:a,key:m,newTarget:b,logger:f,updatedWithAI:!1}),C){let I=w.decisions.filter(A=>A.matched);if(I.length!==1)f.warn({decisions:w.decisions},"Expected exactly 1 matching method for element location, got more or less");else {let A=I[0].type;n.recordTargetAutoHeal({healType:A});}}return {result:N,elementInteractedDisplayString:w.displayString}}catch(w){this.throwIfClosed();let _=Sx(w);if(_&&!s)return f.warn({err:w},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({tracer:n,command:a,target:r,action:o,cache:l,originalCache:l,retriesWithAI:c,finalAttempt:true,options:i});if(w instanceof M&&!_)throw f.warn({err:w},"Failed to execute command with target (fatal)"),w;if(c>0&&r){f.info({err:w},"Failed to execute action with cached target, retrying with AI"),Ge.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!b.requirements}`,`hasAdditionalElements:${!!b.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.111.1",`missReason:${w instanceof Pe?w.cacheMissReason:"unknown"}`]);let N;b.memory&&lF(b.memory)&&(N=b.memory);let I=w instanceof Pe&&w.cacheMissReason==="failing-ldist";return this.wrapElementTargetingCommandHelper({tracer:n,command:a,target:r,cache:void 0,action:o,originalCache:l,retriesWithAI:c,finalAttempt:true,options:{...i,memory:N,targetHealingInProgress:true},skipInitialLocateWait:I})}throw new M("ActionFailureError",`Failed to execute interactive command: ${w instanceof Error?w.message:`${w}`}`,{errOptions:{cause:w}})}}async executeTargetingCommandWithAI(e){let{tracer:n,stepTracer:r,target:o,options:i,command:a,action:s,originalCache:l,logger:c,useMemory:u,cacheBustedBeforeAction:d,cacheBustReason:m,skipInitialLocateWait:p}=e;c.info({description:o.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 n.startAsyncSpan("SMART_WAITING",async()=>await qX({description:o.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 b=1;b<=h;b++){let y=false,S=this.browser.getActiveFrameConfig(),T=i.force||b>1;try{let C;try{C=await wD({description:o.elementDescriptor,disableCache:!!i.disableCache,iframeUrl:i.iframeUrl,source:i.source,useMemory:u,memory:u?i.memory:void 0,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride,allowIneligibleTagRedirect:i.allowIneligibleTagRedirect,showZeroOpacityElementsOverride:i.showZeroOpacityElementsOverride,logger:c,skipWait:f||p,isAutoHeal:!!i.targetHealingInProgress,cacheBustReason:m,acceptElementMovedError:T},this.getControllerFixtures());}catch(N){if(N instanceof _a&&N.updatedLocatorMemory){let I={id:-1,...l,memory:N.updatedLocatorMemory};KT({cmd:a,key:i.targetName,newTarget:I,logger:c,updatedWithAI:!0});}throw N}C.frameConfig&&(this.browser.setActiveFrameConfig(C.frameConfig),y=!0);let w=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:C.resolution,disableGlobalLocatorRedirect:i.disableGlobalLocatorRedirect,logger:c}),_=await s(w);return KT({cmd:a,key:i.targetName,newTarget:C.target,logger:c,updatedWithAI:!0}),i.targetHealingInProgress&&(r.recordTargetAutoHeal({healType:"AI"}),C.target.targetSource="AI_HEALED",C.target.targetUpdateTime=new Date().toUTCString(),C.target.targetUpdateLoggerTags=De(c)),{result:_,elementInteractedDisplayString:C.resolution.displayString,thoughts:C.thoughts}}catch(C){if(y&&this.browser.setActiveFrameConfig(S),this.throwIfClosed(),b<h&&Sx(C)){c.warn({err:C,aiAttempt:b},"Encountered retryable AI targeting error; retrying with AI once");continue}throw C instanceof M?C:new M("ActionFailureError",C.message)}}throw new M("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return db(this.browser,e)}async executePresetCommand(e,n,r,o,i){this.options?.slowMoMs&&await fe(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),l;try{l=await this.resolveCommandTemplateStrings(n,r);}catch(c){throw this.throwIfClosed(),new M("ActionFailureError",`Failed to substitute template strings in command: ${c.message}`,{errOptions:{cause:c}})}try{let c=await Xe({name:`cli.command.${n.type}`,attributes:{"momentic.command_type":n.type,"momentic.command_id":n.id},fn:()=>this.executePresetCommandHelper(e,n,r,o,i)});return this.options?.autoFollowNewTabs&&await NX({beforeUrl:s,command:n,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{bp(n,l);}}createCallbacksForBrowser(e){return {createIsolatedFolder:()=>tD(e)}}async traceBrowserInteraction(e,n,r){return Wn().startAsyncSpan("BROWSER_INTERACTION",async i=>n(i),{name:e,...r})}async resolveCommandTemplateStrings(e,n){return gp({obj:e,context:n,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,n,r,o,i){o=o||"disableCache"in n&&!!n.disableCache;let a=this.logger.child({commandId:n.id});switch(n.type){case "SUCCESS":{let s=n.condition;return s?.assertion.trim()?NC({command:s,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),logger:a,recoveryHint:i}):{succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "AI_ASSERTION":{if(!n.assertion.trim())throw new M("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new M("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return NC({command:n,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),logger:a,recoveryHint:i})}case "AI_EXTRACT":return GX({command:n,logger:a,fixtures:this.getControllerFixtures(),disableCache:o});case "NAVIGATE":if(!Vm(n.url)&&!jm(n.url,this.browser.baseUrl))throw new M("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.traceBrowserInteraction("Navigate",()=>this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0}));break;case "DIALOG":this.browser.registerDialogHandler(n.action);break;case "CAPTCHA":throw new M("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(n.target&&xa(n.target)){let d=Zt(n.target.pixels);await this.browser.hoverUsingVisualCoordinates(d);}else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:d,thoughts:m}=await this.wrapElementTargetingCommand({tracer:e,command:n,target:n.target,cache:n.cache?.target,action:p=>this.browser.hover(p),options:{...n,targetName:"target",disableGlobalLocatorRedirect:true,disableCache:o}});s=d,l=m;}let c=this.browser.getViewport()?.height??vl.height,u=this.browser.getViewport()?.width??vl.width;switch(n.type){case "SCROLL_UP":await this.traceBrowserInteraction("Scroll up",()=>this.browser.scrollVertical(-(n.deltaY??c)));break;case "SCROLL_DOWN":await this.traceBrowserInteraction("Scroll down",()=>this.browser.scrollVertical(n.deltaY??c));break;case "SCROLL_LEFT":await this.traceBrowserInteraction("Scroll left",()=>this.browser.scrollHorizontal(-(n.deltaX??u)));break;case "SCROLL_RIGHT":await this.traceBrowserInteraction("Scroll right",()=>this.browser.scrollHorizontal(n.deltaX??u));break}return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new M("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let s=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:s},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case "WAIT":{if(n.delay>1800)throw new M("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let s=n.delay*1e3;await fe(s,this.executeAbortController.signal);break}case "REFRESH":await this.traceBrowserInteraction("Refresh",()=>this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0}));break;case "CLICK":{if(xa(n.target)){let m=Zt(n.target.pixels),p={...n,relativePosition:n.relativePosition?Zt(n.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:n.target,command:n,cache:n.cache?.target,action:m=>this.traceBrowserInteraction("Click",async p=>{let f={...n,relativePosition:n.relativePosition?Zt(n.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:{...n,targetName:"target",disableCache:o}}),d={urlAfterCommand:this.browser.url(),succeedImmediately:false,elementInteracted:l,thoughts:u,data:c.downloadedFile?{downloadedFile:c.downloadedFile}:void 0};return av(s,d.urlAfterCommand)&&(d.succeedImmediately=true,d.succeedImmediatelyReason="URL changed"),d}case "COPY":return await this.browser.copy(n.value),{succeedImmediately:false,data:n.value,urlAfterCommand:this.browser.url()};case "PASTE":{await this.browser.paste();break}case "DRAG":{if(xa(n.fromTarget)&&xa(n.toTarget)){let c=Zt(n.fromTarget.pixels),u=Zt(n.toTarget.pixels);await this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDropUsingVisualCoordinates(c,u,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0}),{coordinates:c});break}if(xa(n.fromTarget)||xa(n.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:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(c,u)=>this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDrop(c,u,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0,steps:n.steps})),options:{...n,disableCache:o}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s[0],thoughts:l}}case "MOUSE_DRAG":{let s=parseInt(n.deltaX),l=parseInt(n.deltaY),c=n.steps??5;if(isNaN(s)||isNaN(l))throw new M("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&xa(n.target)){let m=Zt(n.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(n.target?.elementDescriptor){let{elementInteractedDisplayString:m,thoughts:p}=await this.wrapElementTargetingCommand({tracer:e,command:n,target:n.target,cache:n.cache?.target,action:async f=>this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(s,l,c,f.locator,{force:n.force})),options:{...n,targetName:"target",disableCache:o}});u=m,d=p;}else await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(s,l,c,void 0,{force:n.force}));return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:u,thoughts:d}}case "SELECT_OPTION":{if(!yl(n.target))throw new Error("Select with x/y is not supported yet");let s=n.target.elementDescriptor,l=n.choice,{elementInteractedDisplayString:c,thoughts:u}=await this.wrapElementTargetingCommand({tracer:e,command:n,target:{type:"description",elementDescriptor:s},cache:n.cache?.target,action:d=>this.traceBrowserInteraction("Select option",()=>this.browser.selectOption(d,l,n.force),{value:l.type==="LABEL"?l.label:l.type==="VALUE"?l.value:l.index}),options:{...n,targetName:"target",disableCache:o,source:ih(n)}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:c,thoughts:u}}case "TAB":{let s={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:true};await this.browser.switchToPage(n.action,s);break}case "NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case "CLOSE_TAB":await this.browser.closePage(n.action,{retry:true});break;case "COOKIE":{if(!n.value)break;let s=await this.browser.setCookie(n.value);a.debug({results:s},"Set cookies");break}case "LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case "JAVASCRIPT":{let s;try{n.environment==="BROWSER"?(s=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:r.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),a.info({result:s},"Executed JavaScript in browser")):s=await Fi({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:r,timeoutMs:n.timeout?n.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 M("ActionFailureError",l instanceof Error?l.message:`${l}`,{errOptions:{cause:l}})}try{JSON.stringify(s);}catch(l){throw new M("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(n.target&&xa(n.target)){let p=Zt(n.target.pixels),f={...n,relativePosition:n.relativePosition?Zt(n.relativePosition):void 0};await this.browser.clickUsingVisualCoordinates(p,f),await this.traceBrowserInteraction("Type",()=>this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},true),{value:n.value});break}let s=this.browser.url(),l,c,u=cloneDeep(n.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:n,target:u,cache:n.cache?.target,action:h=>this.traceBrowserInteraction("Type",()=>this.browser.typeIntoTarget(n.value,h,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),{value:n.value,selector:h.locator.toString()}),options:{...n,targetName:"target",disableCache:o,disableGlobalLocatorRedirect:!d,source:ih(n)}});l=p,c=f;}else await this.traceBrowserInteraction("Type",()=>this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},true),{value:n.value});let m={urlAfterCommand:this.browser.url(),succeedImmediately:false,elementInteracted:l,thoughts:c};return av(s,m.urlAfterCommand)&&(m.succeedImmediately=true,m.succeedImmediatelyReason="URL changed"),m}case "HOVER":{if(xa(n.target)){let c=Zt(n.target.pixels);await this.traceBrowserInteraction("Hover",()=>this.browser.hoverUsingVisualCoordinates(c),{coordinates:c});break}let{elementInteractedDisplayString:s,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,command:n,target:n.target,cache:n.cache?.target,action:c=>this.traceBrowserInteraction("Hover",()=>this.browser.hover(c,{relativePosition:n.relativePosition?Zt(n.relativePosition):void 0}),{selector:c.locator.toString()}),options:{...n,targetName:"target",disableCache:o}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "FOCUS":{if(!yl(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:s,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,command:n,target:n.target,cache:n.cache?.target,action:c=>this.browser.focus(c),options:{...n,targetName:"target",disableCache:o}});return {succeedImmediately:false,urlAfterCommand:this.browser.url(),elementInteracted:s,thoughts:l}}case "BLUR":{if(n.target&&!yl(n.target))throw new Error("Blur with x/y is not supported yet");if(!n.target||!n.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:false,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:s,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,target:n.target,command:n,cache:n.cache?.target,action:c=>this.browser.blur(c),options:{...n,targetName:"target",disableCache:o}});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(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??true,delayMs:n.delayMs}),{value:n.value});let l={urlAfterCommand:this.browser.url(),succeedImmediately:false};return av(s,l.urlAfterCommand)&&(l.succeedImmediately=true,l.succeedImmediatelyReason="URL changed"),l}case "KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??true}),{urlAfterCommand:this.browser.url(),succeedImmediately:false};case "KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??true}),{urlAfterCommand:this.browser.url(),succeedImmediately:false};case "REQUEST":{let s=new CookieJar,l=uIe(fetch,s),c;try{c=new URL(n.url).hostname;}catch{}let u=await vp({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:l});return {data:Pd.parse({...u,cookies:rm(s,c)}),succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "GRAPHQL_REQUEST":return {data:await r9({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:false,urlAfterCommand:this.browser.url()};case "VISUAL_DIFF":return QX({tracer:e,command:n,disableCache:o,browser:this.browser,logger:a,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:s=>this.wrapElementTargetingCommand(s)});case "FILE_UPLOAD":{let s,l;if(n.fileSource.type==="URL"?(l=n.fileSource.url,s=await E6({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(l=n.fileSource.name,s=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!s)throw new M("UserConfigurationError",`Attempted to use non-existent file for upload step: ${l}`);await this.browser.setFileChooserHandler({...s,filename:n.filename});break}case "AUTH_SAVE":{let s=await this.browser.saveAuthState();if(n.storageState&&f_(n.storageState)){let l=mn__default.resolve(n.storageState);br.mkdirSync(mn__default.dirname(l),{recursive:true}),br.writeFileSync(l,`${JSON.stringify(s,null,2)}
|
|
5723
5723
|
`,"utf8");}return {data:s,succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "AUTH_LOAD":{let s;if(f_(n.storageState))try{s=JSON.parse(br.readFileSync(mn__default.resolve(n.storageState),"utf8"));}catch(c){throw new M("UserConfigurationError",`Failed to read auth state from '${n.storageState}': ${H(c)}`,{errOptions:{cause:c}})}else if(!n.storageState.trim())s=void 0;else if(s=await Fi({orgId:this.orgId,code:n.storageState,fragment:false,context:r,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof s!="object")throw new M("ActionFailureError",`Credentials must evaluate to an object (received ${typeof s} instead)`);let l;try{l=Iz.optional().parse(s);}catch(c){throw new M("ActionFailureError",`Credentials provided do not follow the required format: ${c}`)}await this.browser.loadAuthState(l);break}case "ELEMENT_CHECK":{let s=(n.timeout??lr)*1e3,l=this.generator.getAgentConfig()?.assertion;if(JX(n.assertion)&&!n.useSelector&&n.target.type==="description"&&l&&l!=="v1"){let u={id:n.id,type:"AI_ASSERTION",assertion:`There is no element on the page closely matches the following description. If the description has single quotes, remember that requires an exact text substring match. Description: ${n.target.elementDescriptor}`,iframeUrl:n.iframeUrl,timeout:n.timeout,source:"NEGATED_CHECK",cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let d=await NC({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&&Eg(n,u.cache?.memory.traces,a);}}let c=await XX({command:n,tracer:e,timeoutMs:s,targetingWrapper:u=>this.wrapElementTargetingCommand(u),fixtures:this.getControllerFixtures(),disableCache:o});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 $i({action:async()=>n9({assertion:n.assertion,browser:this.browser,logger:a,timeout:n.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:this.browser,logger:a});return {fail:!s.success,data:s.data,thoughts:s.success?"Page assertion passed.":s.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:false}}case "REGISTER_REQUEST_LISTENER":{let s=new Sc(n.requestMatcher),l=this.browser.registerRequestListener(s);return this.registeredListeners[n.key]=l.then(async c=>await iD(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[n.key];if(!s)throw new M("ActionFailureError",`No listener registered with key: ${n.key}`);let l=n.timeout??10;return {data:await te(s,{milliseconds:l*1e3,message:`Request listener timed out after ${l} seconds`}),succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "RECORD_REQUESTS":{let s=new Sc(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:l=>s.matches({url:l.request.url,method:l.request.method}),onRequestStart:(l,c)=>{this.recordedRequests[n.key][l]=wC(c);},onRequestComplete:(l,c)=>{this.recordedRequests[n.key]?.[l]&&(this.recordedRequests[n.key][l]=wC(c));}}),{succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "GET_RECORDED_REQUESTS":{let s=this.recordedRequests[n.key];if(!s)throw new M("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(s),succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "SET_HEADER":{let s;return n.requestMatcher&&(s=new Sc(n.requestMatcher)),this.browser.setHeader(n.name,n.value,s),{succeedImmediately:false,urlAfterCommand:this.browser.url()}}case "MOCK_ROUTE":return {data:{key:this.browser.registerMock(n.key,new Sc(n.requestMatcher),async(l,c)=>{let u=await Fi({orgId:this.orgId,code:n.responseGenerator,fragment:false,context:r,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:l,response:c},disallowVariableUpdates:true,responseSerialization:"RESPONSE"}),d=i1.parse(u);return new Response(d.body,{status:d.status,headers:d.headers})},n.fetchOriginalResponse??false)},succeedImmediately:false,urlAfterCommand:this.browser.url()};case "REMOVE_ROUTE_MOCK":return this.browser.removeMock(n.key),{succeedImmediately:false,urlAfterCommand:this.browser.url()};case "OFFLINE_MODE":return await this.browser.setOfflineMode(n.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:n,disableCache:r,screenshot:o}){return (await this.generator.getReverseMappedDescription({browserState:e,target:n,screenshot:o},{disableCache:r,abortSignal:this.executeAbortController.signal,loggerTags:De(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights();}async startRecordMode({params:e,abortController:n,isClickToRecord:r}){this.recordAbortController=n;let o=new IC({signal:n.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,r),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:true,abortSignal:this.executeAbortController.signal,loggerTags:De(this.logger)})}async getFailureRecoveryPlan(e,n){return this.generator.getFailureRecoveryPlan(e,{disableCache:true,abortSignal:this.executeAbortController.signal,loggerTags:De(n??this.logger)})}};function gt({text:t,section:e}){if(!e)return [{type:"text",text:t}];let n=`### ${e}`;return t.length===0?[{type:"text",text:n}]:[{type:"text",text:`${n}
|
|
5724
5724
|
${t}`}]}function ID({base64Data:t,mediaType:e,section:n}){return n?[{type:"text",text:`### ${n}`},{type:"media",data:t,mediaType:e}]:[{type:"media",data:t,mediaType:e}]}function mb(t){if(t.length===0)throw new pn("No content parts provided to construct the tool response content.");return {type:"content",value:t}}function pb(t){return {type:"content",value:[{type:"text",text:t}]}}function i9({projectRoot:t,filePath:e,pathLabel:n="path"}){if(!e||!mn__default.isAbsolute(e))return e;let r=mn__default.relative(t,e);if(r.startsWith("..")||mn__default.isAbsolute(r))throw new Error(`Error: ${n} "${e}" must be inside project root "${t}".`);return r}function a9(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 (r=>{throw new Error("Unhandled content part")})()}})}var _D="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 kC(t){return `${_D} ${t}`}function vc(t,e){if(t===e)return true;let n=r=>r.startsWith(_D)?r.slice(_D.length).trim():r;return n(t)===n(e)}var mIe=[400,401,403,404,408,409,413,429,498,500,502,503,504],pIe=["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","you can retry your request","429","500","502","503","504"];function s9(t){if(t&&typeof t=="object"&&"statusCode"in t){let n=t.statusCode;if(typeof n=="number"&&(mIe.includes(n)||n>500))return true}let e=l9(t).toLowerCase();return pIe.some(n=>e.includes(n))}function l9(t){if(t instanceof Error){let e="cause"in t?t.cause:void 0,n="code"in t&&typeof t.code=="string"?t.code:"";return `${t.name} ${t.message} ${n} ${l9(e)}`}if(typeof t=="string")return t;if(t&&typeof t=="object")try{return JSON.stringify(t)}catch{return ""}return ""}function u9(t){return new OD(t)}var OD=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 n=await this.currentModel.doStream(e);return {...n,stream:this.createRetryingStream({stream:n.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):s9(e)}async notifyError(e){await this.settings.onError?.(e,this.modelId);}async retry(e){let n=this.models.length;for(let r=0;r<n;r++)try{return await e()}catch(o){if(!this.shouldRetry(o)||(await this.notifyError(o),this.moveCurrentModelToBack(),r===n-1))throw o}throw new Error("No models available in settings")}createRetryingStream(e){let{stream:n,options:r}=e,o={hasStreamedAny:false,hasEmittedClientExecutedToolCall:false,remainingFallbackAttempts:this.models.length-1};return new ReadableStream({start:async i=>{let a;try{a=n.getReader(),await this.pipeStreamToController({reader:a,controller:i,retryState:o}),i.close();}catch(s){await this.retryStreamAfterError({error:s,options:r,controller:i,retryState:o});}finally{c9(a);}}})}async pipeStreamToController(e){let{reader:n,controller:r,retryState:o}=e,i=await n.read();for(;!i.done;){let a=i.value;if(o&&a.type==="error"&&this.shouldRetry(a.error))throw a.error;r.enqueue(a),o&&(o.hasStreamedAny||=a.type!=="stream-start",a.type==="tool-call"&&a.providerExecuted!==true&&(o.hasEmittedClientExecutedToolCall=true)),i=await n.read();}}async retryStreamAfterError(e){let{error:n,options:r,controller:o,retryState:i}=e;if(!this.shouldRetry(n)){o.error(n);return}if(await this.notifyError(n),i.hasEmittedClientExecutedToolCall||i.hasStreamedAny&&!this.retryAfterOutput||i.remainingFallbackAttempts<=0){o.error(n);return}this.moveCurrentModelToBack(),i.remainingFallbackAttempts-=1;let a;try{a=(await this.currentModel.doStream(r)).stream.getReader(),await this.pipeStreamToController({reader:a,controller:o,retryState:i}),o.close();}catch(s){await this.retryStreamAfterError({error:s,options:r,controller:o,retryState:i});}finally{c9(a);}}};function c9(t){try{t?.releaseLock();}catch{}}var hIe=new Set(["itemId","reasoningEncryptedContent"]);function d9({model:t,logger:e,logMessage:n}){return wrapLanguageModel({model:t,middleware:{specificationVersion:"v3",transformParams:async({params:o})=>{let{messages:i,wasPruned:a}=gIe(o.prompt);return a&&e.info({messageCount:i.length,fallbackModel:t.modelId},n),{...o,prompt:i}}}})}function gIe(t){let e=false,n=[];for(let r of t){let{message:o,wasPruned:i}=bIe(r);e=e||i,o&&n.push(o);}return {messages:n,wasPruned:e}}function bIe(t){let e=m9(t.providerOptions),n=e.wasPruned;switch(t.role){case "system":return {message:{...t,providerOptions:e.providerOptions},wasPruned:n};case "assistant":{let r=[];for(let i of t.content){if(i.type==="reasoning"){n=true;continue}r.push(i);}let o=DD(r);return n=n||o.wasPruned,o.parts.length===0?{message:void 0,wasPruned:true}:{message:{...t,content:o.parts,providerOptions:e.providerOptions},wasPruned:n}}case "user":{let r=DD(t.content);return n=n||r.wasPruned,{message:{...t,content:r.parts,providerOptions:e.providerOptions},wasPruned:n}}case "tool":{let r=DD(t.content);return n=n||r.wasPruned,{message:{...t,content:r.parts,providerOptions:e.providerOptions},wasPruned:n}}}}function m9(t){if(!t)return {providerOptions:t,wasPruned:false};let e=false,n={};for(let[r,o]of Object.entries(t)){let i={};for(let[a,s]of Object.entries(o)){if(hIe.has(a)){e=true;continue}s!==void 0&&(i[a]=s);}Object.keys(i).length>0&&(n[r]=i);}return {providerOptions:Object.keys(n).length>0?n:void 0,wasPruned:e}}function DD(t){let e=false;return {parts:t.map(n=>{let r=yIe(n);return e=e||r.wasPruned,r.part}),wasPruned:e}}function yIe(t){let e=m9(t.providerOptions);return e.wasPruned?{part:{...t,providerOptions:e.providerOptions},wasPruned:true}:{part:t,wasPruned:false}}var fb="openai-websocket",p9={cacheControl:{type:"ephemeral"}};function f9(t){if(!t||typeof t!="object"||!("modelId"in t))return false;let e=t.modelId;return typeof e=="string"&&e.startsWith(`${fb}/`)}function y9(){let t=new Map;return {get(e){return t.get(e)},set(e,n){t.set(e,n);}}}var vIe=y9(),CIe=createRequire(import.meta.url),h9;function wIe(){try{return CIe("@ai-sdk/devtools").devToolsMiddleware}catch{return}}function AIe(){if(!(process.env.AI_SDK_DEVTOOLS!=="true"||process.env.MOMENTIC_LOCAL_DEV!=="1"))try{return h9??=wIe(),h9?.()}catch{return}}function FC(t){let{providerFallback:e,prepareStep:n,onChunk:r,streamTelemetry:o,streamTextImpl:i=streamText,...a}=t,s=E9(e);return i({...a,prepareStep:IIe(n),onChunk:RIe({logger:e.logger,onChunk:r,telemetry:o}),model:s})}async function S9(t){let{providerFallback:e,schema:n,schemaDescription:r,schemaName:o,...i}=t,a={...e,websocketFirst:void 0},s=E9(a),l=streamText({...i,model:s,output:Output.object({schema:n,name:o,description:r})});return await consumeStream({stream:l.fullStream,onError(c){throw c}}),l.output}function RIe(t){let{logger:e,onChunk:n,telemetry:r}=t;if(!r)return n;let o=new Map;return async i=>{xIe({logger:e,buffers:o,telemetry:r,chunk:i.chunk}),await n?.(i);}}function xIe(t){let{logger:e,buffers:n,telemetry:r,chunk:o}=t;if(o.type==="text-delta"&&r.textDeltas){g9({logger:e,buffers:n,telemetry:r,chunk:o});return}if(o.type==="reasoning-delta"&&r.reasoningDeltas){g9({logger:e,buffers:n,telemetry:r,chunk:o});return}if(o.type==="text-end"||o.type==="reasoning-end"){kD({logger:e,buffers:n,telemetry:r,id:o.id,kind:o.type==="text-end"?"text-delta":"reasoning-delta",flushReason:"end"});return}(o.type==="finish"||o.type==="abort"||o.type==="error")&&PIe({logger:e,buffers:n,telemetry:r,flushReason:o.type});}function g9(t){let{logger:e,buffers:n,telemetry:r,chunk:o}=t,i=`${o.type}:${o.id}`,s=n.get(i)??{id:o.id,kind:o.type,text:"",deltaCount:0,timer:void 0};s.timer&&clearTimeout(s.timer),s.text+=o.text,s.deltaCount+=1,s.timer=setTimeout(()=>{kD({logger:e,buffers:n,telemetry:r,id:o.id,kind:o.type,flushReason:"debounce"});},r.debounceMs??2e3),MIe(s.timer),n.set(i,s);}function MIe(t){if(typeof t!="object"||t===null||!("unref"in t))return;let e=t.unref;typeof e=="function"&&e.call(t);}function kD(t){let{logger:e,buffers:n,telemetry:r,id:o,kind:i,flushReason:a}=t,s=`${i}:${o}`,l=n.get(s);if(!l)return;l.timer&&clearTimeout(l.timer),n.delete(s);let c=r.maxLoggedChars,u=typeof c=="number"&&l.text.length>c?l.text.slice(0,c):l.text;e.info({...r.attributes,chunkId:l.id,chunkType:l.kind,deltaCount:l.deltaCount,flushReason:a,text:u,textLength:l.text.length,truncated:u.length!==l.text.length},`streamText ${i}`);}function PIe(t){let{logger:e,buffers:n,telemetry:r,flushReason:o}=t;for(let i of Array.from(n.values()))kD({logger:e,buffers:n,telemetry:r,id:i.id,kind:i.kind,flushReason:o});}function IIe(t){if(t)return e=>{if(!f9(e.model))return t(e)}}function E9(t){let e=t.scopeKey,n=e?t.state??vIe:y9(),r=_Ie({...t,scopeKey:e,state:n});if(r.length===0)throw new Error("No streamText fallback providers configured");let o=u9({models:r.map(a=>a.model),retryAfterOutput:true,onError:async(a,s)=>{let l=r.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:pS(a),failedProviderId:l,failedModelId:s});}}),i=AIe();return i?wrapLanguageModel({model:o,middleware:i}):o}function _Ie(t){let e=t.scopeKey?t.state.get(t.scopeKey):void 0;if(t.websocketFirst?.enabled&&(!e||e===t.websocketFirst.provider.id))return [ND({candidate:t.websocketFirst.provider,config:t,pruneProviderState:false}),...t.providers.map(i=>ND({candidate:i,config:t,pruneProviderState:true}))];let n=e?t.providers.findIndex(i=>i.id===e):-1,r=n>=0?n:0;return [...t.providers.slice(r),...t.providers.slice(0,r)].map((i,a)=>ND({candidate:i,config:t,pruneProviderState:a>0}))}function ND(t){let{candidate:e,config:n,pruneProviderState:r}=t,o=NIe({model:e.model,providerId:e.id,scopeKey:n.scopeKey,state:n.state});return r&&(o=d9({model:o,logger:n.logger,logMessage:"Stripped provider-local state from streamText fallback step"})),e.id.includes("anthropic")&&(o=OIe({model:o})),{...e,model:o}}function OIe(t){return wrapLanguageModel({model:t.model,middleware:{specificationVersion:"v3",transformParams:async({params:e})=>DIe(e)}})}function DIe(t){return t.tools?.some(e=>"strict"in e)?{...t,tools:t.tools.map(e=>{if(!("strict"in e))return e;let{strict:n,...r}=e;return r})}:t}function NIe(t){let{model:e,providerId:n,scopeKey:r,state:o}=t;return wrapLanguageModel({model:e,middleware:{specificationVersion:"v3",overrideModelId:()=>`${n}/${e.modelId}`,wrapGenerate:async({doGenerate:i})=>{let a=await i();return r&&o.set(r,n),a},wrapStream:async({doStream:i})=>{let a=await i();return {...a,stream:LIe({stream:a.stream,providerId:n,scopeKey:r,state:o})}}}})}function LIe(t){let{stream:e,providerId:n,scopeKey:r,state:o}=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,r&&o.set(r,n)),l.enqueue(u);}s||l.close();}catch(c){s||l.error(c);}finally{a.releaseLock(),a=void 0;}},cancel(l){return s=true,a?.cancel(l)}})}async function kIe(t){let{agentConfig:e,streamResponseMessages:n,userMessage:r,...o}=t,i={role:"user",content:r};return S9({...o,providerFallback:e.providerFallback,system:e.system,providerOptions:e.providerOptions,messages:[...e.messages??[],...n,i]})}async function hb({validate:t,maxAttempts:e,logger:n,...r}){let o;for(let i=1;i<=e;i++){r.abortSignal?.throwIfAborted();try{let a=await kIe(r);return await t(a),a}catch(a){if(r.abortSignal?.aborted||(o=a,i===e))throw a;n.warn({err:a,attempt:i,nextAttempt:i+1},"Failed to validate generated object to repair missing submission tool call, retrying");}}throw o}var T9=500;function FD(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 n=typeof e.text=="string"?e.text:"";return {type:e.type,textLength:n.length,preview:n.slice(0,T9),truncated:n.length>T9}}if(e.type==="media"&&"data"in e){let n=typeof e.data=="string"?e.data:"";return {type:e.type,dataLength:n.length,mediaType:"mediaType"in e?e.mediaType:void 0}}return e})}}var v9=z.looseObject({type:z.literal("tool-call"),toolCallId:z.string(),toolName:z.string(),input:z.unknown().optional()}),BC=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()})]))}),FIe=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()}),BC]),C9=z.looseObject({type:z.literal("tool-result"),toolCallId:z.string(),toolName:z.string(),output:FIe}),w9=z.looseObject({text:z.string()});var A9=2,BIe=1600,UIe=.3,Qu="[trimmed: omitted due to context budget]",M9="[screenshot truncated]",P9="[browser state truncated]",I9={_momenticTrimmed:true,summary:Qu},_9={type:"text",value:Qu},zIe=z.object({type:z.literal("text"),value:z.literal(Qu)}),$Ie=["reasoning","tool-result","image","tool-call","text"];function O9(t){let{messages:e,phase1:n,phase2:r,logger:o}=t,i=VIe(e,n.toolResultPruningRules??[],{trimReasoning:n.trimReasoning??false});if(typeof n.numScreenshots=="number"&&(i=jIe(i,n.numScreenshots)),n.browserStateMarkers&&n.browserStateMarkers.length>0&&(typeof n.browserStateTailMessageWindow=="number"&&(i=YIe(i,n.browserStateTailMessageWindow,n.browserStateMarkers)),typeof n.numBrowserStates=="number"&&(i=KIe(i,n.numBrowserStates,n.browserStateMarkers))),!r)return i;let a=kt(i);return a<=r.tokensThreshold||(o.info({totalTokens:a,threshold:r.tokensThreshold,target:r.targetTokens,messageCount:i.length,breakdown:x9(i)},"Phase 2 triggered \u2014 token breakdown before compaction"),i=d_e(i,r.targetTokens,o),o.info({totalTokens:kt(i),messageCount:i.length,breakdown:x9(i)},"Phase 2 complete \u2014 token breakdown after compaction")),i}function VIe(t,e,n){let r=t;n.trimReasoning&&(r=r.map((o,i)=>o.role!=="assistant"?o:s_e(o,i===t.length-1)));for(let o of e)r=QIe(r,o);return r}function jIe(t,e){let n={count:e},r=[...t];for(let o=r.length-1;o>=0;o--)r[o]=HIe(r[o],n);return r}function HIe(t,e){if(t.role==="user"){if(typeof t.content=="string")return t;let n=WIe(t.content,e);return {...t,content:n}}if(t.role==="tool"){let n=GIe(t.content,e);return {...t,content:n}}return t}function WIe(t,e){let n=[...t];for(let r=n.length-1;r>=0;r--)if(n[r].type==="image"){if(e.count>0){e.count--;continue}n[r]={type:"text",text:M9};}return n}function GIe(t,e){let n=[...t];for(let r=n.length-1;r>=0;r--){let o=n[r];if(o.type!=="tool-result")continue;let i=BC.safeParse(o.output);if(!i.success)continue;let a=qIe(i.data.value,e);a!==i.data.value&&(n[r]={...o,output:{...i.data,value:a}});}return n}function qIe(t,e){let n=[...t],r=false;for(let o=n.length-1;o>=0;o--)if(n[o].type==="media"){if(e.count>0){e.count--;continue}n[o]={type:"text",text:M9},r=true;}return r?n:t}function KIe(t,e,n){let r={count:e},o=[...t];for(let i=o.length-1;i>=0;i--)o[i]=D9(o[i],r,n);return o}function YIe(t,e,n){let r=Math.max(0,t.length-e);return t.map((o,i)=>i>=r?o:D9(o,{count:0},n))}function D9(t,e,n){if(t.role==="user"){if(typeof t.content=="string")return t;let r=XIe(t.content,e,n);return {...t,content:r}}if(t.role==="tool"){let r=JIe(t.content,e,n);return {...t,content:r}}return t}function XIe(t,e,n){let r=[...t];for(let o=r.length-1;o>=0;o--){let i=r[o];if(!(i.type!=="text"||!N9(i.text,n))){if(e.count>0){e.count--;continue}r[o]={type:"text",text:P9};}}return r}function JIe(t,e,n){let r=[...t];for(let o=r.length-1;o>=0;o--){let i=r[o];if(i.type!=="tool-result")continue;let a=BC.safeParse(i.output);if(!a.success)continue;let s=ZIe(a.data.value,e,n);s!==a.data.value&&(r[o]={...i,output:{...a.data,value:s}});}return r}function ZIe(t,e,n){let r=[...t],o=false;for(let i=r.length-1;i>=0;i--){let a=r[i];if(!(a.type!=="text"||!N9(a.text,n))){if(e.count>0){e.count--;continue}r[i]={type:"text",text:P9},o=true;}}return o?r:t}function N9(t,e){for(let n of e)if(t.includes(n))return true;return false}function QIe(t,e){let n=new Set;for(let r of t.slice(-e.keepLastMessages))if(typeof r.content!="string")for(let o of r.content)e_e(o)&&e.tools.includes(o.toolName)&&n.add(o.toolCallId);return t.map((r,o)=>o>=t.length-e.keepLastMessages?r:u_e(r,e,n))}function UC(t){return v9.safeParse(t).success}function zD(t){return C9.safeParse(t).success}function e_e(t){return UC(t)||zD(t)}function t_e(t){return w9.safeParse(t).success}function L9(t){return !t||typeof t!="object"||Array.isArray(t)?false:t._momenticTrimmed===true}function k9(t){return zIe.safeParse(t).success}function UD(t){return t.text===Qu?{part:t,trimmedTokens:0}:{part:{...t,text:Qu},trimmedTokens:kt(t.text)}}function n_e(t){return t.input===void 0||L9(t.input)?{part:t,trimmedTokens:0}:{part:{...t,input:I9},trimmedTokens:kt(t.input)}}function F9(t){return t.output===void 0||k9(t.output)?{part:t,trimmedTokens:0}:{part:{...t,output:_9},trimmedTokens:kt(t.output)}}function r_e(t,e,n){let r=0,o=[];for(let i of t){if(r>=e){o.push(i);continue}switch(i.role){case "assistant":{let a=o_e(i,e-r,n);r+=a.trimmedTokens,o.push(a.message);continue}case "tool":{let a=a_e(i,e-r,n);r+=a.trimmedTokens,o.push(a.message);continue}case "user":{let a=i_e(i,e-r,n);r+=a.trimmedTokens,o.push(a.message);continue}default:o.push(i);}}return {messages:o,trimmedTokens:r}}function o_e(t,e,n){if(typeof t.content=="string")return {message:t,trimmedTokens:0};let r=[],o=0;for(let i of t.content){if(o>=e){r.push(i);continue}if(n==="image"){r.push(i);continue}if(n==="reasoning"){if(i.type!=="reasoning"){r.push(i);continue}let s=UD(i);o+=s.trimmedTokens,r.push(s.part);continue}if(n==="text"){if(i.type!=="text"){r.push(i);continue}let s=UD(i);o+=s.trimmedTokens,r.push(s.part);continue}if(n==="tool-call"){if(!UC(i)){r.push(i);continue}let s=n_e(i);o+=s.trimmedTokens,r.push(s.part);continue}if(!zD(i)){r.push(i);continue}let a=F9(i);o+=a.trimmedTokens,r.push(a.part);}return {message:{...t,content:r},trimmedTokens:o}}function i_e(t,e,n){if(typeof t.content=="string")return {message:t,trimmedTokens:0};let r=[],o=0;for(let i of t.content){if(o>=e){r.push(i);continue}if(n==="image"){if(i.type!=="image"){r.push(i);continue}o+=BIe;continue}if(n!=="text"||!t_e(i)){r.push(i);continue}let a=UD(i);o+=a.trimmedTokens,r.push(a.part);}return {message:{...t,content:r},trimmedTokens:o}}function a_e(t,e,n){if(n!=="tool-result")return {message:t,trimmedTokens:0};let r=[],o=0;for(let i of t.content){if(i.type==="tool-approval-response"){r.push(i);continue}if(o>=e){r.push(i);continue}let a=F9(i);o+=a.trimmedTokens,r.push(a.part);}return {message:{...t,content:r},trimmedTokens:o}}function s_e(t,e){return e||typeof t.content=="string"?t:{...t,content:t.content.map(n=>n.type!=="reasoning"||n.text===Qu?n:{...n,text:Qu})}}function l_e(t,e,n){return !e.tools.includes(t.toolName)||n.has(t.toolCallId)||t.input===void 0||L9(t.input)?t:{...t,input:I9}}function B9(t,e,n){return !e.tools.includes(t.toolName)||n.has(t.toolCallId)||t.output===void 0||k9(t.output)?t:{...t,output:_9}}function c_e(t,e,n){return UC(t)?l_e(t,e,n):zD(t)?B9(t,e,n):t}function u_e(t,e,n){return t.role==="assistant"&&typeof t.content!="string"?{...t,content:t.content.map(r=>c_e(r,e,n))}:t.role==="tool"?{...t,content:t.content.map(r=>r.type==="tool-approval-response"?r:B9(r,e,n))}:t}function gb(t,e,n){let r=[...t];for(let o of $Ie){let i=kt(r);if(i<=e)break;let a=i-e,s=r_e(r,a,o);r=s.messages,s.trimmedTokens>0&&n.debug({contentType:o,trimmedTokens:s.trimmedTokens,newTokenCount:kt(r)},"Trimmed content");}return r}function U9(t){return t.role!=="assistant"||typeof t.content=="string"?false:t.content.some(e=>UC(e))}function R9(t){if(t.length===0)return;let e=t[0];if(U9(e)){t.shift(),t.length>0&&t[0].role==="tool"&&t.shift();return}t.shift();}function x9(t){let e={};for(let n of t)if(n.role==="system")e.system=(e.system??0)+kt(n);else if(n.role==="user")e.user=(e.user??0)+kt(n);else if(n.role==="assistant")if(typeof n.content=="string")e.assistant_text=(e.assistant_text??0)+kt(n);else for(let r of n.content)if(r.type==="tool-call"){let o=`tool_call:${r.toolName}`;e[o]=(e[o]??0)+kt(r);}else e.assistant_text=(e.assistant_text??0)+kt(r);else if(n.role==="tool"){for(let r of n.content)if(r.type==="tool-result"){let o=`tool_result:${r.toolName}`;e[o]=(e[o]??0)+kt(r);}}return e}function d_e(t,e,n){let r=kt(t);if(r<=e||t.length<=1)return t;let o=t[0],i=[],a=[];if(t.length>A9+1){let u=t.length-A9;u>1&&t[u]?.role==="tool"&&U9(t[u-1])&&u++,i=t.slice(1,u),a=t.slice(u);}else a=t.slice(1);if(i.length>0){i=gb(i,e,n);let u=[o,...i,...a];if(r=kt(u),r<=e)return u}let s=kt(i),l=s/e;if(l<UIe){if(a.length>1){let u=a[a.length-1],d=[...i,...a.slice(0,-1)],m=gb(d,e,n),p=[o,...m,u];if(r=kt(p),r<=e)return p;let f=gb([...m,u],e,n),h=[o,...f];if(r=kt(h),r<=e)return h}else if(a.length===1){let u=[...i,...a],d=gb(u,e,n),m=[o,...d];if(r=kt(m),r<=e)return m}}else for(n.debug({headBudgetRatio:l,middleMsgTokens:s,targetTokens:e},"Middle exceeds 30% budget, removing messages");i.length>0;){R9(i);let u=[o,...i,...a];if(r=kt(u),r<=e)return u}a=gb(a,e,n);let c=[o,...i,...a];if(r=kt(c),r<=e)return c;for(;a.length>0;)if(R9(a),c=[o,...i,...a],r=kt(c),r<=e)return c;return r>e&&n.warn({targetTokens:e,finalTokenCount:r,remainingMessages:c.length},"Unable to meet token target after all pruning phases"),c}var $D=5e3,z9=2e4;function j9(t){let{tool:e,name:n,spanName:r,attributes:o}=t,i=e.execute;return i?{...e,execute:async(a,s)=>Xe({name:r,attributes:{"momentic.tool_name":n,...o},fn:async l=>{l?.setAttribute("momentic.tool_input",$9(a));let c=await i(a,s);return l?.setAttribute("momentic.tool_output",$9(FD(c))),c}})}:e}function $9(t){let e=Jl({json:t,maxJsonStringSize:$D});return typeof e=="string"?e:Rl(e)??""}function zC(t){let{tool:e,name:n,logger:r,logPrefix:o,agentName:i,agentTrace:a}=t,s=t.getResultForLogging??FD,l=e.execute;return l?{...e,strict:e.strict??false,execute:async(c,u)=>VD({logger:r,toolName:n,logPrefix:o,agentName:i,agentTrace:a,input:c,execute:async()=>l(c,u),getResultForLogging:s})}:{...e,strict:e.strict??false}}async function VD(t){let{logger:e,toolName:n,logPrefix:r="",agentName:o,agentTrace:i,input:a}=t,s=t.getResultForLogging??(d=>d),l=Date.now(),c=i?.span({name:n,input:a,metadata:o!=null?{agentName:o}:void 0}),u=V9({logger:e,toolName:n,agentName:o,value:a,label:"input"});e.info({...o!=null&&{agentName:o},...u!==void 0&&{inputTokenCount:u},params:Jl({json:a,maxJsonStringSize:$D}),toolName:n},`${r}Tool invoked: ${n}`);try{let d=await t.execute(),m=V9({logger:e,toolName:n,agentName:o,value:d,label:"output"}),p=s(d);return m!==void 0&&m>z9&&e.warn({...o!=null&&{agentName:o},largeToolOutputWarningThresholdTokens:z9,outputTokenCount:m,toolName:n},`${r}Tool output is large: ${n}`),e.info({...o!=null&&{agentName:o},duration:Date.now()-l,...m!==void 0&&{outputTokenCount:m},response:Jl({json:p,maxJsonStringSize:$D}),toolName:n},`${r}Tool completed: ${n}`),c?.end({output:d}),d}catch(d){throw e.error({...o!=null&&{agentName:o},duration:Date.now()-l,err:d,toolName:n},`${r}Tool failed: ${n}`),c?.end({level:"ERROR",statusMessage:H(d)}),d}}function V9(t){let{logger:e,toolName:n,agentName:r,value:o,label:i}=t;try{return kt(o)}catch(a){e.warn({...r!=null&&{agentName:r},err:a,toolName:n},`Failed to calculate tool ${i} token count`);return}}var H9=".momentic-mcp",b_e=30*24*60*60*1e3;function HD(t){return t?mn__default.join(t,H9):mn__default.resolve(H9)}function ps(t){let e=HD(t);mkdirSync(e,{recursive:true});}function y_e(){return `${Date.now()}`}function fs({rootDir:t,entity:e,ext:n}){return mn__default.join(HD(t),`${e}-${y_e()}.${n}`)}function S_e(t){let e=mn__default.relative(process.cwd(),t);return e.startsWith(".")?e:`./${e}`}function pa({filePath:t,title:e}){return `- [${e}](${S_e(t)})`}var yb="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 W9({projectRootAbsolutePath:t,projectConfigAbsolutePath:e,cwd:n}){return [yb,"",`- **projectRootAbsolutePath**: \`${t}\``,`- **projectConfigAbsolutePath**: \`${e}\``,`- **cwd**: \`${n}\``].join(`
|
|
5725
5725
|
`)}async function G9({projectRootAbsolutePath:t,projectConfigAbsolutePath:e,cwd:n,stepSchema:r,stepSchemaTitle:o,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","",W9({projectRootAbsolutePath:t,projectConfigAbsolutePath:e,cwd:n}),"",`## ${o}`,"",r].join(`
|
|
@@ -5865,19 +5865,19 @@ ${s}`}]}async function Y9({rootDir:t,cutoffTime:e}){let n=await readdir$1(t,{wit
|
|
|
5865
5865
|
`),section:"Diffs For Recovery"})),u}return u.push(...gt({text:["",d].join(`
|
|
5866
5866
|
`),section:"Diffs For Recovery"})),u}function KQ({moduleName:t,existingModuleNames:e,parameterNames:n,defaultParameters:r,parameterEnums:o,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=n??[],m=[...Object.keys(r??{}),...Object.keys(o??{})];for(let y of m)if(!d.includes(y)){let S=d.length?d.join(", "):"none";throw new Error(`Error: Parameter metadata "${y}" is not defined in parameters. Available parameters: ${S}`)}let p=new Set(d);for(let y of Object.keys(i??{}))if(!p.has(y)){let S=p.size?Array.from(p).join(", "):"none";throw new Error(`Error: Module input "${y}" is not defined in parameters. Available parameters: ${S}`)}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 b=c.slice(f,h);for(let y of b)if(u(y))throw new Error("Error: Modules cannot be nested. Please select steps that do not include module references.");return {stepsToExtract:b,startIndex:f,endIndex:h}}var SUe=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 EUe(t){let e=t.toLowerCase();return e.endsWith("webview")||SUe.has(e)}function Sy(t){return !!(EUe(t.tagName)||t.getAttribute("package")==="com.android.chrome"&&t.getAttribute("content-desc")==="Web View"&&YQ(t.tagName.toLowerCase()).startsWith("frame"))}function YQ(t){let e=["android.widget.","android.view.","android.webkit.","android.app.","android.support.","androidx.","com.android.inputmethod."];for(let n of e)if(t.startsWith(n))return t.substring(n.length);return t}var TUe=new Set(["index","package","a11y-important","screen-reader-focusabl"]),vUe=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"]),CUe=new Set(["text","hint"]),wUe=new Set(["live-region","drawing-order"]),AUe=new Set(["displayed","enabled"]);function RUe(t,e){let n={};for(let[r,o]of Object.entries(e))TUe.has(r)||r==="class"&&t===o||r==="focusable"&&o==="true"&&e.clickable==="true"||vUe.has(r)&&o==="false"||CUe.has(r)&&o===""||AUe.has(r)&&o==="true"||wUe.has(r)&&o==="0"||r!=="id"&&(n[r]=o);return n}function XQ(t,e,n){let{prunedDocument:r,idToElement:o,prunedIdToElement:i,idCounter:a,opts:s}=t,l=a.value++;n.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=RUe(e.tagName,c);for(let[m,p]of Object.entries(u))n.setAttribute(m,p);if(o.set(l,e),i.set(l,n),Sy(e)){let m=s?.injectedWebviewContent??"";if(s?.removeWebviewContent){for(;n.firstChild;)n.removeChild(n.firstChild);return}else if(!s?.disableMomenticAccessibilityTree&&m.trim().length>0){for(;n.firstChild;)n.removeChild(n.firstChild);m.trim().length>0&&n.appendChild(r.createCDATASection(`
|
|
5867
5867
|
${m}
|
|
5868
|
-
`));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&&n.appendChild(r.createTextNode(f));continue}if(p===1){let f=m;if(!PUe(f,s?.viewportBounds))continue;let h=r.createElement(YQ(f.tagName));XQ(t,f,h),n.appendChild(h);}}}function xUe(t,e,n,r){let o=t.parseFromString("<hierarchy/>","text/xml"),i=new Map,a={prunedDocument:o,idToElement:n,prunedIdToElement:i,idCounter:{value:0},opts:r},s=o.documentElement;XQ(a,e,s);let l=new XMLSerializer().serializeToString(o);return {prunedDocument:o,prunedIdToElement:i,xml:l}}async function JQ(t,e,n){let r=new DOMParser,o=r.parseFromString(t,"text/xml"),i=new Map,a=o.documentElement;if(!a)throw new M("InternalWebAgentError","No root element found in XML");if(a.tagName!=="hierarchy")throw new M("InternalWebAgentError","No hierarchy element found in XML");let{prunedDocument:s,prunedIdToElement:l,xml:c}=xUe(r,a,i,n),u=c;try{u=await gUe.format(c,{parser:"xml",plugins:[hUe],printWidth:120,tabWidth:1,singleAttributePerLine:!1});}catch(d){e.warn({err:d},"Failed to format XML");}return {xml:u,originalXml:t,document:o,idToElement:i,prunedDocument:s,prunedIdToElement:l}}function MUe(t){let e=[],n=t;for(;n;){let r=n.tagName,o=n.parentElement,i=1;if(o){let a=Array.from(o.children).filter(s=>s.tagName===r);for(let s=0;s<a.length;s++)if(a[s]===n){i=s+1;break}}e.unshift(`${r}[${i}]`),n=o;}return `/${e.join("/")}`}function yA(t,e){let n=t.idToElement.get(e);if(n)return MUe(n)}function E0(t,e){let n=t.idToElement.get(e);if(!n)return;let r=n.cloneNode(true);for(let o of Array.from(r.children)){let i=o;for(let a of Array.from(i.children))i.removeChild(a);}return r.outerHTML}function pd(t){if(!t.hasAttribute("bounds"))return;let e=t.getAttribute("bounds");if(!e)return;let n=e.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);if(n){let r=parseInt(n[1],10),o=parseInt(n[2],10),i=parseInt(n[3],10),a=parseInt(n[4],10);if(Number.isFinite(r)&&Number.isFinite(o)&&Number.isFinite(i)&&Number.isFinite(a))return [r,o,i,a]}}function PUe(t,e){if(!e)return true;let n=pd(t);if(!n||n.length<4)return true;let r=n[0],o=n[1],i=n[2],a=n[3];return !(i<=e.left||r>=e.right||a<=e.top||o>=e.bottom)}function ZQ(t,e){if(t&&!(!e||e.length===0))return Object.fromEntries(e.map(n=>[n,t.getAttribute(n)]).filter(([,n])=>n!==null))}function eee({requirements:t,element:e}){let n;if((t?.positionSpecificity||t?.shapeSpecificity)&&(n=pd(e),!n))throw new M("ActionFailureError","Element to cache has no bounds or unexpected bounds format");return {requiredText:t?.textRequired&&hp(e)||void 0,requiredAttributes:ZQ(e,t?.attributesRequired),requiredBounds:t?.boundsRequired,position:t?.positionSpecificity?{x1:n[0],y1:n[1],x2:n[2],y2:n[3],tolerance:t?.positionSpecificity}:void 0,shape:t?.shapeSpecificity?{width:n[2]-n[0],height:n[3]-n[1],tolerance:t?.shapeSpecificity}:void 0}}function nee({aiResponse:t,description:e,emulatorState:n,memory:r,useMemory:o}){let i=n.graph.idToElement.get(t.id);if(!i)throw new M("InternalWebAgentError",`Could not find node with id: ${t.id}`);let a=pd(i);if(!a)throw new M("InternalWebAgentError",`Node ${t.id} has no bounding box: ${i.outerHTML}`);let s=yA(n.graph,t.id)??"",l=E0(n.graph,t.id)??"",c=eee({requirements:t.requirements,element:i}),u=[];t.additionalElements&&(u=t.additionalElements.map(({id:m,requirements:p})=>{let f=n.graph.idToElement.get(m);if(!f)return;let h=yA(n.graph,m);return h?{xPath:h,requirements:eee({requirements:p,element:f})}:void 0}).filter(m=>!!m));let d;if(Sy(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},o)if(t.updatedMemory){let m={type:"GCS_TRACES",traces:t.updatedMemory};d.memory=m;}else r&&(d.memory=r);return {target:d,resolvedNode:i}}function ree(t){return t?.type==="WEBVIEW"?t.browserCache?.memory:void 0}function IUe(t,e){let n=e.x2-e.x1,r=(e.x1+e.x2)/2,o=(t[0]+t[2])/2;if(!cs(e.tolerance,r,o,Math.min(1,n)))return false;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(t[1]+t[3])/2;return cs(e.tolerance,a,s,Math.min(1,i))}function _Ue(t,e){return cs(e.tolerance,e.width,t[2]-t[0],Math.min(1,e.width))?cs(e.tolerance,e.height,t[3]-t[1],Math.min(1,e.height)):false}var tee=(t,e,n)=>{if(!e)return;let{requiredAttributes:r,requiredText:o,requiredBounds:i,position:a,shape:s}=e;if(o!==void 0&&o.length>0){let l=hp(t);if(l!==o)throw new Pe(`Resolved element text mismatch: expected ${o}, got ${l}`)}if(r)for(let[l,c]of Object.entries(r)){let u=t.getAttribute(l)??void 0;if(u!==c)throw new Pe(`Attribute ${l} mismatch: expected ${c}, got ${u}`)}if(i&&n&&!n.targetBounds.every((c,u)=>c===n.newElementBounds[u]))throw new Pe(`Bounds changed from [${n.targetBounds.join(",")} ] to [${n.newElementBounds.join(",")} ]`);if(a&&n&&!IUe(n.newElementBounds,a))throw new Pe(`Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(n.newElementBounds)}`);if(s&&n&&!_Ue(n.newElementBounds,s))throw new Pe(`Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(n.newElementBounds)}`)};async function Yp(t){let{target:e,domState:n}=t,{graph:r}=n,{document:o}=r,i=me();if(e.type==="WEBVIEW")return OUe(e,t);if(!e.xPath)throw new M("ActionFailureError","Native element cache has no XPath");let a=QQ.evaluateXPathToFirstNode(e.xPath,o,null,null);if(!a)throw new Pe(`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=QQ.evaluateXPathToFirstNode(p.xPath,o);if(!f)throw new Pe(`Required related element not found for XPath: ${p.xPath}`);tee(f,p.requirements);}});}let s=pd(a);if(!s)throw new Pe("Resolved native element has no bounding box");if(!e.bounds)throw new Pe("Native element cache has no bounds");tee(a,e.requirements,{targetBounds:e.bounds,newElementBounds:s});let l;for(let[m,p]of r.idToElement.entries())if(p===a){l=m;break}let c=e.elementOnlySerializedXml,u=e.xPath;return l!==void 0&&(c=E0(r,l)??c,u=yA(r,l)??u),{resolvedTarget:{...e,resolvedNode:a,bounds:s,elementOnlySerializedXml:c,xPath:u}}}async function OUe(t,e){let{stateManager:n,logger:r,signal:o}=e,i=me(),a=await n.getActiveWebview();if(!a||!a.browserController)throw r.error({webview:a?{...a,browserController:!!a.browserController}:void 0},"resolveTargetCacheInWebView: No browser controller attached"),new Pe("No browser controller is attached to the requested webview");let s=a.browserController;if(!t.browserCache)throw r.error({target:t},"resolveTargetCacheInWebView: No browser target available on cache"),new Pe("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:r,signal:o,skipWaitForPageLoad:true,skipSavingVisualAttributes:true}},logger:r}));return {resolvedTarget:{...t,controller:a.browserController,browserTarget:c}}}function fd(t){let{command:e,cacheKey:n="cache",targetName:r="target",updatedCache:o}=t;am(e)&&(e[n]={...e[n],[r]:qd.parse(o)},t.updatedWithAI&&(e[n].updatedAt=new Date,e[n].updatedAtLoggerTags=De(t.logger)));}function Bc(t){if(t.type==="WEBVIEW")return {type:"WEBVIEW",resolvedDescription:t.resolvedDescription,xPath:t.xPath,browserCache:t.browserCache,memory:t.memory};let{resolvedNode:e,...n}=t;return {...n}}var jo=.15,NUe=500,Nn=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:n,skipFetchingFullWebviewContent:r=false,removeWebviewContent:o=false,useMemory:i=false,memory:a,webviewMemory:s,metadata:l,cacheBustReason:c}){let u=this.logger.child({...l}),d=await n.startAsyncSection("Get emulator state",async()=>{let y=await this.stateManager.getCurrentScreenshotPngString();return {emulatorState:await this.stateManager.getDomState({skipFetchingFullWebviewContent:r,removeWebviewContent:o}),screenshot:y}}),m;try{m=await n.startAsyncSpan("AI_LOCATOR_CALL",async y=>{c&&(y.attributes.cacheBustReason=c);let S=await this.generator.getAndroidElementLocation({description:e,screenXml:d.emulatorState.graph.xml,screenshot:d.screenshot,source:l?.source==="SCROLL_TO"?"SCROLL_TO":void 0,memory:i?a:void 0},{logger:u,loggerTags:De(u),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["android-locator"]});return y.result=S,S});}catch(y){throw this.throwIfAborted(),u.error({err:y},"Failed to locate element"),new M("InternalWebAgentError",`Failed to locate element: ${y instanceof Error?y.message:y}`,{errOptions:{cause:y}})}if(m.id===-1){let y=m.updatedMemory?{type:"GCS_TRACES",traces:m.updatedMemory}:void 0;return {success:false,thoughts:m.thoughts??"No matching element found",updatedLocatorMemory:y}}let{target:p,resolvedNode:f}=nee({aiResponse:m,description:e,emulatorState:d.emulatorState,memory:a,useMemory:i});if(p.type==="NATIVE")return n.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:p.elementOnlySerializedXml??"Unknown element"},attributes:{},subSpans:[]}),{success:true,resolvedTarget:{...p,resolvedNode:f},thoughts:m.thoughts};let{browserLocateResult:h,browserController:b}=await n.startWebviewTrace(async()=>{let y=await this.stateManager.getActiveWebview();if(!y||!y.browserController)throw new M("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 n.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:h.target.nodeOnlySerializedHtml??"Unknown HTML element in webview"},attributes:{},subSpans:[]}),{success:true,resolvedTarget:{...p,controller:b,browserTarget:{...h.resolution,serverSideBoundingBox:await h.resolution.locator.boundingBox({timeout:5e3})},browserCache:h.target},thoughts:h.thoughts}}async targetingActionWithAILocator(e){let{action:n,command:r,description:o,tracer:i,cacheKey:a,targetName:s,cache:l,skipFetchingFullWebviewContent:c,removeWebviewContent:u,metadata:d,cacheBustReason:m}=e,p=await this.findElement({description:o,tracer:i,skipFetchingFullWebviewContent:c,removeWebviewContent:u,useMemory:this.shouldUseMemoryForCommand(r),memory:l?.memory,webviewMemory:ree(l),metadata:d,cacheBustReason:m});if(!p.success){if(p.updatedLocatorMemory&&l){let y={...l,memory:p.updatedLocatorMemory};fd({command:r,cacheKey:a,targetName:s,updatedCache:y,updatedWithAI:true,logger:this.logger});}throw new M("NoMatchingElementError",p.thoughts??"No matching element found")}let f=p.thoughts,{result:h,resolvedTarget:b}=await this.executeActionWithWebviewReconstructRetry({action:n,resolvedTarget:p.resolvedTarget,reason:"webview target closed during AI-located action"});return fd({command:r,cacheKey:a,targetName:s,updatedCache:Bc(b),updatedWithAI:true,logger:this.logger}),{result:h,thoughts:f}}async wrapTargetingAction(e){let{action:n,description:r,command:o,cacheKey:i="cache",targetName:a="target",cacheIsInvalidAfterResolution:s,tracer:l,skipFetchingFullWebviewContent:c=false,removeWebviewContent:u=false}=e,d,m={commandId:o.id};if(i==="cache"&&"cache"in o&&o.cache){let T=o.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(o.disableCache&&(this.logger.debug({command:o},"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&&!vc(h?.resolvedDescription??"",r)&&(this.logger.info({description:r,cacheDescription:h?.resolvedDescription},"Cache description mismatch, clearing it automatically"),p=true,f="Description mismatch",h=void 0),!h)return this.logger.info({description:r,cacheBustedBeforeAction:p},"Prompting AI for a new element location"),this.targetingActionWithAILocator({action:n,command:o,description:r,tracer:l,cacheKey:i,targetName:a,cache:d,skipFetchingFullWebviewContent:c,removeWebviewContent:u,metadata:m,cacheBustReason:f});let b=h.type==="NATIVE"?!!h.requirements:!!h.browserCache?.requirements,y=h.type==="NATIVE"?!!h.requiredRelatedElements?.length:!!h.browserCache?.additionalElements?.length,S;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 _=>{let N=Date.now(),I;for(;Date.now()-N<3e3;){S=await this.stateManager.getDomState({skipFetchingFullWebviewContent:h?.type==="NATIVE"});let A;try{A=(await Yp({target:h,domState:S,stateManager:this.stateManager,logger:this.logger})).resolvedTarget;}catch(B){if(I=B,B instanceof Pe){this.logger.warn({err:B},"Failed to resolve target cache, retrying"),await Za(500,this.aborter.controller?.signal);continue}throw this.logger.error({err:B},"Failed to resolve target cache"),B}let z=Bc(A),D=diff(h,z);return D&&Object.keys(D).length>0&&this.logger.info({cacheDiffs:D},"Successfully resolved target with cache"),_.attributes.serializedElement=A.type==="WEBVIEW"?A.browserCache?.nodeOnlySerializedHtml??"Unknown HTML element in webview":A.elementOnlySerializedXml??"Unknown element",{resolvedTarget:A,updatedCache:z}}throw I}),{result:C,resolvedTarget:w}=await this.executeActionWithWebviewReconstructRetry({action:n,resolvedTarget:T,reason:"webview target closed during cached action"});return fd({command:o,cacheKey:i,targetName:a,updatedCache:Bc(w),updatedWithAI:!1,logger:this.logger}),Ge.increment("cache_target_resolution_v2",1,["outcome:hit",`platform:mobile-${h.type.toLowerCase()}`,`hasRequirements:${b}`,`hasAdditionalElements:${y}`,`orgId:${this.orgId}`,"cliVersion:0.111.0"]),{result:C,thoughts:"Successfully executed preset action with cache"}}catch(T){if(this.throwIfAborted(),T instanceof M&&T.reason!=="InternalWebAgentError")throw this.logger.error({err:T},"Failed to execute action with target cache (fatal)"),T;return Ge.increment("cache_target_resolution_v2",1,["outcome:miss",`platform:mobile-${h.type.toLowerCase()}`,`hasRequirements:${b}`,`hasAdditionalElements:${y}`,`orgId:${this.orgId}`,"cliVersion:0.111.0"]),this.logger.warn({err:T},"Failed to execute action with target cache, retrying with AI"),this.targetingActionWithAILocator({action:n,command:o,description:r,tracer:l,cacheKey:i,targetName:a,cache:h,skipFetchingFullWebviewContent:c,removeWebviewContent:u,metadata:m})}}async executeActionWithWebviewReconstructRetry(e){let{action:n,resolvedTarget:r,reason:o}=e;try{return {result:await n(r),resolvedTarget:r}}catch(i){if(this.throwIfAborted(),r.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(o))?.browserController))throw i;let s=await this.stateManager.getDomState({skipFetchingFullWebviewContent:true}),{resolvedTarget:l}=await Yp({target:Bc(r),domState:s,stateManager:this.stateManager,logger:this.logger,signal:this.abortSignal});return {result:await n(l),resolvedTarget:l}}}errorLooksLikeClosedWebviewTarget(e){let n=H(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(r=>n.includes(r))}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 M("ActionFailureError","Native element cache has no bounds");let[n,r,o,i]=e.bounds;if(n===void 0||r===void 0||o===void 0||i===void 0)throw new M("ActionFailureError",`Native element cache has incomplete bounds: [${e.bounds.join(", ")}]`);return {left:n,top:r,width:o-n,height:i-r}}calculateSwipeCoordinates({containerBounds:e,direction:n,desiredDelta:r}){let o=e.left+e.width/2,i=e.top+e.height/2;if(n==="up"||n==="down"){let a=e.height*jo,s=e.top+a,l=e.top+e.height-a,c=l-s,u=Math.min(Math.abs(r),c),d=c-u,m=n==="down"?l-d/2:s+d/2;return {startX:o,startY:m,actualDelta:u}}else {let a=e.width*jo,s=e.left+a,l=e.left+e.width-a,c=l-s,u=Math.min(Math.abs(r),c),d=c-u;return {startX:n==="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:n,deltaPixels:r,direction:o,durationMs:i=300}){let a=Math.abs(r),s=e,l=n;o==="up"||o==="down"?l=o==="up"?n-a:n+a:s=o==="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:n},{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 fe(NUe,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 Uc(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[n,r,o,i]=e;if(!(n===void 0||r===void 0||o===void 0||i===void 0))return {left:n,top:r,width:o-n,height:i-r}}function aee(t){return "iterations"in t}function FUe(t){let e={relativePosition:t.relativePosition?Zt(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 Xp=class extends Nn{async tapOnNativeCoordinates(e){let n=e.x,r=e.y;if(this.logger.info({x:n,y:r},"Tap at coordinates"),"longPress"in e&&e.longPress)return await this.driver.executeInNativeContext(this.logger,o=>o.executeScript("mobile: longClickGesture",[{x:n,y:r,duration:e.longPressDurationMs??2e3}]),{operationName:"longPress"});if(aee(e)){let o=e.tapDelayMs??100;for(let i=0;i<e.iterations;i++)await this.driver.executeInNativeContext(this.logger,a=>a.tap({x:n,y:r}),{operationName:"tap"}),i<e.iterations-1&&await new Promise(a=>setTimeout(a,o));return}await this.driver.executeInNativeContext(this.logger,o=>o.tap({x:n,y:r}),{operationName:"tap"});}async tapOnNativeTarget(e,n){let[r,o,i,a]=e.bounds,s=i-r,l=a-o,c=n?.relativePosition?.x??s/2,u=n?.relativePosition?.y??l/2;c=Math.max(0,Math.min(c,s)),u=Math.max(0,Math.min(u,l));let d=r+c,m=o+u;return await this.tapOnNativeCoordinates({x:d,y:m,...n}),{x:d,y:m}}async tapOnWebviewTarget(e,n){let{controller:r}=e,o,i=1;return n&&aee(n)?(o=n.tapDelayMs,i=n.iterations):n&&"longPress"in n&&(o=n.longPressDurationMs),(await r.browser.click(e.browserTarget,{createIsolatedFolder:()=>{let s=Math.random().toString(36).substring(4),l=mn__default.join(tmpdir(),"momentic","downloads"),c=mn__default.join(l,this.orgId,s);return mkdirSync(c,{recursive:true}),c}},{delayMs:o,relativePosition:n?.relativePosition,iterations:i})).coordinates}async tapOnTarget({target:e,options:n}){return await me().startAsyncSpan("EMULATOR_INTERACTION",async o=>{if(o.attributes.options=n,"type"in e&&e.type==="NATIVE"){let i=await this.tapOnNativeTarget(e,n);o.attributes.point=i,o.targetBounds=Uc(e);}else {o.withinWebview=true;let i=await this.tapOnWebviewTarget(e,n);o.attributes.point=i,o.targetBounds=Uc(e);}},{name:"Tap on target"})}async executeTap({command:e}){let n=me(),r=FUe(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 n.startAsyncSpan("EMULATOR_INTERACTION",async c=>{await this.tapOnNativeCoordinates({...r,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 o=e.target.description,{thoughts:i}=await this.wrapTargetingAction({command:e,tracer:n,action:a=>this.tapOnTarget({target:a,options:r}),description:o});return {success:true,message:i}}};var zc=class extends Nn{async doPress({keycode:e,longPress:n}){await me().startAsyncSpan("EMULATOR_INTERACTION",async()=>this.driver.executeInNativeContext(this.logger,o=>o.executeScript("mobile: pressKey",[{keycode:e,isLongPress:n}]),{operationName:"pressKey"}),{name:"Send key events to emulator"});}};var hd=25,see=150,EA=class extends Nn{async doType(e){let n=me();if(!e.target){if(e.clearContent)throw new M("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 M("UserConfigurationError","x/y targets are not supported for the Type step");let{thoughts:r}=await this.wrapTargetingAction({command:e,tracer:n,action:async o=>{"type"in o&&o.type==="NATIVE"?await this.doNativeType(e,o):await this.doWebviewType(e,o);},description:e.target.description});return {success:true,message:r}}async doWebviewType(e,n){await me().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.withinWebview=true;let i={clearContent:e.clearContent,forceClearContent:e.forceClearContent,delay:e.keyPressDelayMs??hd};o.attributes.options=i;let{controller:a,browserTarget:s}=n;await a.browser.typeIntoTarget(e.text,s,i);},{name:"Typing within web view"});}async doNativeType(e,n){e.clearContent?(await this.tapNativeTargetForType(n,{longPress:true}),await this.clearContent()):await this.tapNativeTargetForType(n),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,n){let r=me(),o=new Xp(this.constructPerformerParams());await r.startAsyncSpan("EMULATOR_INTERACTION",async i=>{i.attributes.options=n??{};let a=await o.tapOnNativeTarget(e,n);i.attributes.point=a,i.targetBounds=Uc(e);},{name:"Tap on target"});}async sendKeys(e){let n=me(),r=e.keyPressDelayMs??hd;await n.startAsyncSection("Waiting for system keyboard to open",async(o,i)=>{let a=Date.now();for(;Date.now()-a<2e3;){this.throwIfAborted();let s=Date.now();if(await this.driver.executeInNativeContext(this.logger,c=>c.isKeyboardShown(),{operationName:"isKeyboardShown"}))return;let l=Date.now()-s;l<500&&await new Promise(c=>setTimeout(c,500-l));}i.attributes.timedOut=true;}),await n.startAsyncSpan("EMULATOR_INTERACTION",async()=>{try{r!==hd&&await this.driver.executeInNativeContext(this.logger,async i=>i.updateSettings({keyInjectionDelay:r}),{operationName:"updateKeyInjectionDelay"});let o=[];for(let i=0;i<e.text.length;i+=see)o.push(e.text.slice(i,i+see));for(let i of o)await this.driver.executeInNativeContext(this.logger,async a=>a.keys(i),{operationName:"typeWithCustomKeyDelay",attemptTimeoutMs:cC(r,i),maxAttempts:1});}finally{r!==hd&&await this.driver.executeInNativeContext(this.logger,async o=>o.updateSettings({keyInjectionDelay:hd}),{operationName:"updateKeyInjectionDelay"});}},{name:`Typing with a ${r}ms delay`});}async clearContent(){let e=me();try{await e.startAsyncSection("Clearing any content from the focused field",()=>this.clearContentHelper());}catch(n){this.logger.warn({err:n},"Failed to find select all button, continuing...");}}async clearContentHelper(){await this.driver.executeInNativeContext(this.logger,async n=>{let r=n.$('//android.widget.LinearLayout[@content-desc="Select all" and @clickable="true"]');await r.waitForExist({timeout:750}),await r.click();},{operationName:"selectAllText",maxAttempts:1}),await new zc(this.constructPerformerParams()).doPress({keycode:67});}};var lee=.8,BUe=v__default.object({navigationBar:v__default.object({visible:v__default.boolean(),x:v__default.number(),y:v__default.number(),width:v__default.number(),height:v__default.number()}),statusBar:v__default.object({visible:v__default.boolean(),x:v__default.number(),y:v__default.number(),width:v__default.number(),height:v__default.number()})});function C0(t,e){t.attributes.scrollableElementType=e.type,t.attributes.scrollableElementDisplay=Ls(e),e.type==="CUSTOM"&&(t.attributes.scrollableElementDescription=e.target.description);}var Jp=class extends Nn{async getHardcodedScrollableElementBounds(e,n){let r;switch(e.type){case "SCREEN":r=this.getContainerBoundsFromViewport(n);break;case "OPEN_APP":try{let o=BUe.parse(await this.driver.executeInNativeContext(this.logger,i=>i.executeScript("mobile: getSystemBars",[]),{operationName:"getSystemBars"}));r=this.getContainerBoundsFromViewport(n),o.navigationBar.visible&&(r.height=Math.max(1,r.height-o.navigationBar.height)),o.statusBar.visible&&(r.top+=o.statusBar.height,r.height=Math.max(1,r.height-o.statusBar.height));}catch(o){this.logger.warn({err:o},"Failed to get system bars, using hardcoded bounds"),r=this.getContainerBoundsFromViewport(n);}break;case "OPEN_WEBVIEW":{let o=await this.stateManager.getActiveWebviewNodes();if(o.length===0&&(await this.stateManager.refreshWebviewsManually("get active webview nodes"),o=await this.stateManager.getActiveWebviewNodes()),o.length===0)throw new Error("No active webviews found");if(o.length>1){let a=o.map(s=>({id:s.id,ele:s.originalElement.outerHTML,bounds:s.bounds}));throw new Error(`Multiple active webviews found. Momentic currently only supports a single active webview at a time. Discovered nodes: ${JSON.stringify(a)}`)}let i=o[0]?.bounds;if(!i)throw new Error("No bounds found for active webview");r=this.getContainerBoundsFromBounds(i);break}default:{throw new Error("If Typescript complains about the line above, you missed a switch case")}}return r}getContainerBoundsFromViewport(e){return {left:e.x,top:e.y,width:Math.max(1,e.width),height:Math.max(1,e.height)}}getContainerBoundsFromBounds(e){let n=e[0],r=e[1],o=e[2],i=e[3],a=o-n,s=i-r;return {left:n,top:r,width:Math.max(1,a),height:Math.max(1,s)}}async executeSwipe(e){let n=me(),r=Ls(e.scrollableElement);if(e.scrollableElement.type==="CUSTOM_COORDINATES"){let{startX:i,startY:a,deltaPixels:s}=e.scrollableElement;return await n.startAsyncSpan("EMULATOR_INTERACTION",async l=>{C0(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 ${r}`}),{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 n.startAsyncSpan("EMULATOR_INTERACTION",async s=>{C0(s,e.scrollableElement),await this.swipeByAbsoluteCoordinates({span:s,direction:e.direction,percent:e.viewportPercent,durationMs:e.durationMs,containerBounds:a,relativePosition:e.relativePosition?Zt(e.relativePosition):void 0});},{name:`Swipe ${e.direction} in ${r}`}),{success:true,message:"Successfully executed swipe action"}}let{thoughts:o}=await this.wrapTargetingAction({command:e,description:e.scrollableElement.target.description,action:async i=>me().startAsyncSpan("EMULATOR_INTERACTION",async s=>(C0(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 ${r}`}),tracer:n});return {success:true,message:o}}async scrollInNativeContainer({span:e,cmd:n,target:r}){if(!r.bounds||r.bounds.length<4)throw new M("ActionFailureError","Native container cache has no bounds");let o=r.bounds,i=o[2]-o[0],a=o[3]-o[1];await this.swipeByAbsoluteCoordinates({span:e,direction:n.direction,percent:n.viewportPercent,durationMs:n.durationMs,containerBounds:{left:o[0],top:o[1],width:Math.max(1,i),height:Math.max(1,a)},relativePosition:n.relativePosition?Zt(n.relativePosition):void 0});}async swipeInWebview({span:e,cmd:n,target:r}){let{controller:o,browserTarget:i}=r;if(!o.browser.getViewport())throw new Error("Failed to get viewport size from webview");let s=n.direction==="down"||n.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*jo),u=Math.floor(l.height*jo),d=Math.max(1,l.width-c*2),m=Math.max(1,l.height-u*2),p,f;if(n.relativePosition){let y=Zt(n.relativePosition);p=l.x+y.x,f=l.y+y.y;}else p=l.x+l.width/2,f=l.y+l.height/2;let h={x:p,y:f},b=(s?m:d)*(n.viewportPercent??lee)*(s?n.direction==="down"?1:-1:n.direction==="right"?1:-1);e.attributes.startPoint=h,e.attributes.scrollPixelAmount=b,await o.browser.mouseDragUsingVisualCoordinates({deltaX:s?0:b,deltaY:s?b:0,steps:10,dragDurationMs:n.durationMs,fromTarget:h});}async swipeByAbsoluteCoordinates({span:e,direction:n,percent:r=lee,durationMs:o=500,containerBounds:i,relativePosition:a}){e.attributes.containerBounds=i;let s=i.width*jo,l=i.height*jo,c,u;if(n==="up"||n==="down"?(c=(i.height-2*l)*r,u=Math.floor(c/(o/1e3))):(c=(i.width-2*s)*r,u=Math.floor(c/(o/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:n,durationMs:o});}else {let d=i.width*jo,m=i.height*jo,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:n,percent:r,speed:u}]),{operationName:"swipeGesture"});}}};var cee=20,w0=.9,UUe=2,Zp=.5,A0=.2;var TA=class extends Jp{async executeScrollTo(e){let n=e.target.description,r=e.scrollStepPercent??w0,o=await this.tryUseCachedScrollPosition(e,n);return o||this.searchForElement({cmd:e,description:n,scrollStepPercent:r})}async resolveContainer({scrollableElement:e,containerCache:n,aiMetadata:r}){let o=await this.driver.executeInNativeContext(this.logger,u=>u.getWindowRect(),{operationName:"getScrollContainerViewportRect"});if(e.type==="CUSTOM_COORDINATES")return {bounds:{left:0,top:0,width:o.width,height:o.height},diffThresholdPercent:Zp};if(e.type!=="CUSTOM")return {bounds:await this.getHardcodedScrollableElementBounds(e,o),diffThresholdPercent:Zp};let i=me(),a=e.target.description;if(n){let u=this.getBoundsFromNativeCache(n);return this.logger.info({bounds:u},"Got container bounds from native cache"),{bounds:u,cache:n,diffThresholdPercent:up({containerBounds:u,viewport:o,defaultThresholdPercent:Zp})}}let s=await this.findElement({description:a,tracer:i,metadata:r});if(!s.success)throw new M("NoMatchingElementError",s.thoughts??"No matching element found");let{resolvedTarget:l}=s;if(l.type!=="NATIVE")throw new Error(`ActionFailureError: Custom scroll container "${a}" resolved to a webview element. Custom containers must be native elements.`);let c=this.getBoundsFromNativeCache(l);return this.logger.info({bounds:c},"Got container bounds from AI"),{bounds:c,cache:l,diffThresholdPercent:up({containerBounds:c,viewport:o,defaultThresholdPercent:Zp})}}async tryUseCachedScrollPosition(e,n){let r=e.cache?.target;return r?r.type==="WEBVIEW"?this.tryUseWebviewCache(e,n):r.scrollDetails?this.tryUseNativeScrollCache(e,n,r):null:null}async tryUseWebviewCache(e,n){let r=me();try{let{thoughts:o}=await this.wrapTargetingAction({command:e,tracer:r,description:n,action:async i=>{if(i.type==="NATIVE")throw new Error("Expected WEBVIEW target but got NATIVE");await this.scrollWebviewTargetIntoView(i);}});return {success:!0,message:o}}catch(o){return this.logger.warn({err:o},"Failed to use webview cache, falling back to search"),null}}async tryUseNativeScrollCache(e,n,r){let o=r.scrollDetails,i=me(),a=e.scrollStepPercent??w0,s=o.scrollableElement.type==="CUSTOM"?o.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:ls({containerBounds:c,containerInsetRatio:jo})*a}).actualDelta,p=await this.tryFindElement({cmd:e,description:n,tracer:i,scrollDetails:this.buildScrollDetails(e,0,l.cache),useAIIfCacheFails:false});if(p)return this.logger.info("Element resolved at current position without scrolling"),p;let f=Math.abs(o.pixelDelta),h=0,b=m*UUe,y=0;for(;y<f;){this.throwIfAborted();let C=f-y,w=Math.min(C,b),_=await this.scrollByPixelDelta({pixelDelta:w,scrollableElement:e.scrollableElement,containerCache:l.cache,direction:e.direction,scrollStepPercent:a,aiMetadata:{commandId:e.id},useVisualDiff:false});if(_===0)break;y+=_,h+=e.direction==="down"?_:-_;let N=await this.tryFindElement({cmd:e,description:n,tracer:i,scrollDetails:this.buildScrollDetails(e,h,l.cache),useAIIfCacheFails:false});if(N)return this.logger.info({cumulativePixelDelta:h},"Element resolved during cache replay"),N}let S=Math.max(0,Math.min(e.maxScrollAttempts??cee,2)),T=true;for(let C=0;C<S&&T;C++){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 w=await this.tryFindElement({cmd:e,description:n,tracer:i,scrollDetails:this.buildScrollDetails(e,h,l.cache),useAIIfCacheFails:false});if(w)return this.logger.info({attempt:C,cumulativePixelDelta:h},"Element resolved during cache buffer scroll"),w}if(h!==0){let C=e.direction==="down"?"up":"down";this.logger.info({cumulativePixelDelta:h,originalDirection:e.direction,undoDirection:C,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:C,scrollStepPercent:a,aiMetadata:{commandId:e.id}});}return null}async tryFindElement({cmd:e,description:n,tracer:r,scrollDetails:o,useAIIfCacheFails:i=true}){let a,s,l=false,c=o,u=R0(e.cache?.target);if(u&&u.resolvedDescription!==void 0&&vc(u.resolvedDescription,n)&&!e.disableCache){let p=await this.stateManager.getDomState({skipFetchingFullWebviewContent:true,removeWebviewContent:true});try{let{resolvedTarget:f}=await Yp({target:u,domState:p,stateManager:this.stateManager,logger:this.logger});a=f,l=!0,s="Successfully resolved scroll to target with cache.",this.logger.info("Successfully resolved scroll to target from cache");}catch(f){this.logger.warn({err:f},"Failed to resolve target from cache");}}if(a&&l&&a.type==="NATIVE"&&o){let p=await this.correctNativeTargetIntoView({cmd:e,resolvedTarget:a,scrollDetails:o});c=p.scrollDetails,p.resolvedTarget?a=p.resolvedTarget:(a=void 0,l=false);}if(!a&&!i)return null;if(!a)try{let p=kC(n),f=await this.findElement({description:p,tracer:r,metadata:{commandId:e.id,source:"SCROLL_TO"}});if(!f.success)return null;a=f.resolvedTarget,s=f.thoughts;}catch(p){if(p instanceof M&&p.reason==="NoMatchingElementError")return null;throw this.logger.warn({err:p},"Failed to find scroll-to target with AI"),p}if(a&&!l&&a.type==="NATIVE"&&o)try{let p=await this.correctNativeTargetIntoView({cmd:e,resolvedTarget:a,scrollDetails:o});c=p.scrollDetails,p.resolvedTarget&&(a=p.resolvedTarget);}catch(p){this.logger.warn({err:p},"Failed to reposition AI-resolved scroll-to target for stable cache generation");}if(a.type==="WEBVIEW"){await this.scrollWebviewTargetIntoView(a);let p=R0(Bc(a));return fd({command:e,updatedCache:p,updatedWithAI:!l,logger:this.logger}),{success:true,message:s}}let m=Bc(a);if(m.type!=="NATIVE")throw new Error("Expected native target cache for scroll-to");return fd({command:e,updatedCache:R0({...m,scrollDetails:c}),updatedWithAI:!l,logger:this.logger}),{success:true,message:s}}async correctNativeTargetIntoView({cmd:e,resolvedTarget:n,scrollDetails:r}){let o=await this.getCorrectiveScrollForTarget({resolvedTarget:n});if(!o)return {resolvedTarget:n,scrollDetails:r};this.logger.info({bounds:n.bounds,correction:o},"Repositioning scroll-to target to the preferred viewport anchor");let i=r.scrollableElement.type==="CUSTOM"?r.scrollableElement.cache:void 0,a=await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:r.scrollableElement,containerCache:i,direction:o.direction,scrollStepPercent:e.scrollStepPercent??w0,aiMetadata:{commandId:e.id},useVisualDiff:true});if(a===0)return this.logger.info({bounds:n.bounds,correction:o},"Skipping corrective scroll update because the viewport did not move"),{resolvedTarget:n,scrollDetails:r};let s=await this.stateManager.getDomState({skipFetchingFullWebviewContent:true,removeWebviewContent:true}),l;try{({resolvedTarget:l}=await Yp({target:n,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:n,scrollDetails:r}}if(l.type!=="NATIVE")return {resolvedTarget:n,scrollDetails:r};let c=n.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:n.bounds,correction:o,appliedCorrectionPixels:a},"Skipping corrective scroll update because the target did not move (viewport at scroll extent)"),{resolvedTarget:l,scrollDetails:r};let m={...r,pixelDelta:iC({currentPixelDelta:r.pixelDelta,baseDirection:r.direction,correctionDirection:o.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:n,scrollStepPercent:r}){let o=me(),i=await this.resolveContainer({scrollableElement:e.scrollableElement,aiMetadata:{commandId:e.id}});return this.scrollAndSearch({cmd:e,description:n,tracer:o,scrollStepPercent:r,resolvedContainer:i})}async scrollAndSearch({cmd:e,description:n,tracer:r,scrollStepPercent:o,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:ls({containerBounds:s,containerInsetRatio:jo})*o}).actualDelta;let d=true,m=e.maxScrollAttempts??cee;for(let h=0;h<m;h++){this.throwIfAborted();let b=this.buildScrollDetails(e,a,i.cache),y=await this.tryFindElement({cmd:e,description:n,tracer:r,scrollDetails:b});if(y)return y;if(!d)throw new Error(`ActionFailureError: Could not find element "${n}" 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:o,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:n,tracer:r,scrollDetails:p});if(f)return f;throw new Error(`ActionFailureError: Could not find element "${n}" after ${m} scroll attempts`)}buildScrollDetails(e,n,r){return e.scrollableElement.type==="CUSTOM"?{pixelDelta:n,scrollableElement:{type:"CUSTOM",target:e.scrollableElement.target,cache:r},direction:e.direction}:e.scrollableElement.type==="CUSTOM_COORDINATES"?{pixelDelta:n,scrollableElement:e.scrollableElement,direction:e.direction}:{pixelDelta:n,scrollableElement:e.scrollableElement,direction:e.direction}}async scrollWebviewTargetIntoView(e){let{controller:n,browserTarget:r}=e;await n.browser.hover(r);}async scrollByPage({direction:e,containerBounds:n,scrollStepPercent:r,diffThresholdPercent:o,rawCoordinates:i}){return me().startAsyncSpan("EMULATOR_INTERACTION",async s=>(s.attributes.containerBounds=n,s.attributes.direction=e,(await this.executeScrollGesture({direction:e,containerBounds:n,scrollStepPercent:r,diffThresholdPercent:o,rawCoordinates:i})).canScrollMore),{name:`Scroll ${e} by one page`})}async scrollByPixelDelta({pixelDelta:e,scrollableElement:n,containerCache:r,direction:o,scrollStepPercent:i,aiMetadata:a,useVisualDiff:s=false}){if(e===0)return 0;let l=me(),c,u=Zp,d,m,p;if(n.type==="CUSTOM_COORDINATES")d=n.startX,m=n.startY,p=n.deltaPixels;else {c=await this.resolveContainer({scrollableElement:n,containerCache:r,aiMetadata:a});let h=c.bounds;u=c.diffThresholdPercent;let b=ls({containerBounds:h,containerInsetRatio:jo})*i,y=this.calculateSwipeCoordinates({containerBounds:h,direction:o,desiredDelta:b});d=y.startX,m=y.startY,p=y.actualDelta;}let f=Math.ceil(Math.abs(e)/p);return this.logger.debug({pixelDelta:e,direction:o,scrollableElementType:n.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 b=this.invertDirection(o),y=0;for(let S=0;S<f;S++){this.throwIfAborted();let T=Math.abs(e)-y,C=Math.min(p,T);if(s){let w=await this.executeScrollGesture({direction:o,containerBounds:c?.bounds,scrollStepPercent:i,diffThresholdPercent:u,rawCoordinates:{type:"CUSTOM_COORDINATES",startX:d,startY:m,deltaPixels:C}});if(w.didScroll&&(y+=C),!w.canScrollMore)break}else await this.performRawSwipe({startX:d,startY:m,deltaPixels:C,direction:b}),y+=C;}return h.attributes.appliedPixels=y,y},{name:`Scroll ${o} by ${Math.abs(e)}px`})}async executeScrollGesture({direction:e,containerBounds:n,scrollStepPercent:r,diffThresholdPercent:o=Zp,rawCoordinates:i}){let a=await this.stateManager.getRawScreenshotBase64(),s,l,c;if(i)s=i.startX,l=i.startY,c=i.deltaPixels;else {if(!n)throw new Error("Expected container bounds for scroll gesture");let f=ls({containerBounds:n,containerInsetRatio:jo})*r,h=this.calculateSwipeCoordinates({containerBounds:n,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=fc(a,u),m=d>o,p=d>o;return this.logger.debug({diffPercent:d,didScroll:m,diffThresholdPercent:o,canScrollMore:p,direction:e,actualDelta:c,rawCoordinates:i},"Scroll gesture visual diff result"),{didScroll:m,canScrollMore:p}}async getCorrectiveScrollForTarget({resolvedTarget:e}){let n=e.bounds;if(!n||n.length<4)return;let r=await this.stateManager.getViewportBounds(),o=Math.max(1,r.bottom-r.top),i=n[1],a=n[3],s=aC({viewportTop:r.top,viewportBottom:r.bottom,elementHeight:a-n[1],targetTopRatio:A0}),l=r.top+o*A0,c=r.bottom-o*A0,u=i>=r.top&&a<=r.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 R0(t){return !t||t.type!=="NATIVE"?t:sC(t)}var vA=class extends Nn{async doInstallApk(e){return await this.installApkFromUri(e.uri),{success:true,message:"Installed APK."}}async installApkFromUri(e){let n=await this.resolveUriToLocalApk(e);try{await this.stateManager.executeRawADBCommand(`install -r ${mn__default.resolve(n.localPath)}`),this.logger.info({uri:e,localPath:n.localPath},"Installed APK on device");}finally{n.cleanup();}}async resolveUriToLocalApk(e){try{let n=new URL(e);if(n.protocol==="file:"){let r=n.href.slice(7),o;if(br.existsSync(r))o=r;else if(br.existsSync(mn__default.join("/",r)))o=mn__default.join("/",r);else throw new M("UserConfigurationError",`APK not found at path: ${r}`);return this.assertFileExists(o),{localPath:o,cleanup:()=>{}}}if(n.protocol==="http:"||n.protocol==="https:"){let r=await this.fetchWithTimeout(n);if(!r.ok)throw new M("UserInfrastructureError",`Failed to download APK from ${e} (status ${r.status})`);let o=await r.arrayBuffer(),i=Buffer.from(o),a=await this.writeBufferToTempFile(i,n.pathname);return {localPath:a,cleanup:()=>{try{br.unlinkSync(a);}catch(s){this.logger.warn({err:s,path:a},"Failed to remove temporary APK file");}}}}throw new M("UserConfigurationError",`Unsupported URI scheme for APK installation: ${n.protocol}`)}catch(n){if(n instanceof TypeError){let r=mn__default.resolve(e);return this.assertFileExists(r),{localPath:r,cleanup:()=>{}}}throw n}}assertFileExists(e){try{br.accessSync(e);}catch{throw new M("UserConfigurationError",`APK not found at path: ${e}`)}}async fetchWithTimeout(e){let n=AbortSignal.timeout(9e4);return await fetch(e,{signal:n})}async writeBufferToTempFile(e,n){let r=mn__default.extname(n)||".apk",o=mn__default.join(tmpdir(),`momentic-apk-${randomUUID()}${r}`);return br.writeFileSync(o,e),o}};async function uee({command:t,logger:e,generator:n,aiSettings:r,getEmulatorDomState:o,getScreenshotBase64:i,abortSignal:a}){let s=me();if(!t.goal.trim())throw new M("ActionFailureError","Cannot perform AI extraction without goal");if(t.schema){let u=wm(t.schema);if(u)throw new M("UserConfigurationError",u)}let l="",c="";return await s.startAsyncSpan("EMULATOR_READ_STATE",async()=>{l=await o(),c=await i();},{name:"Get emulator state"}),await s.startAsyncSpan("AI_EXTRACTION_CALL",async u=>{try{let d=await n.getAndroidTextExtraction({goal:t.goal,emulatorState:l,returnSchema:t.schema,screenshot:`data:image/png;base64,${c}`},{disableCache:!!t.disableCache,abortSignal:a,loggerTags:De(e),agentConfigVersion:r.agentConfig?.["android-text-extraction"]});if(u.result=d,lC({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 M("UserConfigurationError",d.thoughts);return {success:!0,output:d.result,message:d.thoughts}}catch(d){let m=H(d);throw m.includes("MaxGenerationLengthExceededError")?new M("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step instead."):m.includes("AIProviderError")&&m.includes("time")?new M("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}})}var CA=class extends Nn{async dragNative(e,n,r){let{left:o,top:i,width:a,height:s}=this.getBoundsFromNativeCache(e),{left:l,top:c,width:u,height:d}=this.getBoundsFromNativeCache(n),m=o+a/2,p=i+s/2,f=l+u/2,h=c+d/2,b=r?.hoverDuration??500,y=r?.dragDuration??1e3;await this.driver.executeInNativeContext(this.logger,async S=>{await S.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:m,y:p},{type:"pointerDown",button:0},{type:"pause",duration:b},{type:"pointerMove",duration:y,x:f,y:h},{type:"pointerUp",button:0}]}]),await S.releaseActions();},{operationName:"dragAndDrop"});}async dragWebview(e,n,r){let{controller:o}=e;if(e.controller!==n.controller)throw new M("UserConfigurationError","Cannot drag and drop between different webviews");let i=r?.dragDuration??1e3,a=r?.hoverDuration??1e3,s;r?.dragDuration&&(s=Math.max(1,Math.floor(i/200))),await o.browser.dragAndDrop(e.browserTarget,n.browserTarget,{hoverDurationMs:a,steps:s,dragDurationMs:i});}async executeDragAndDrop({command:e}){let n=me();if(e.fromTarget.type!=="description"||e.toTarget.type!=="description")throw new M("UserConfigurationError","Drag and drop only supports description targets for now");let r=e.fromTarget.description,{result:o,thoughts:i}=await this.wrapTargetingAction({command:e,tracer:n,description:r,cacheKey:"cache",targetName:"fromTarget",action:async c=>c}),a=e.toTarget.description,{result:s,thoughts:l}=await this.wrapTargetingAction({command:e,tracer:n,description:a,cacheKey:"cache",targetName:"toTarget",action:async c=>c});if(o.type!==s.type)throw new M("UserConfigurationError",`Drag and drop targets must be in the same context (both native or both webview). Found: From=${o.type}, To=${s.type}`);return await n.startAsyncSpan("EMULATOR_INTERACTION",async c=>{o.type==="NATIVE"&&s.type==="NATIVE"?await this.dragNative(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}):o.type==="WEBVIEW"&&s.type==="WEBVIEW"&&(c.withinWebview=true,await this.dragWebview(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}));},{name:"Drag and drop"}),{success:true,message:`${i}
|
|
5868
|
+
`));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&&n.appendChild(r.createTextNode(f));continue}if(p===1){let f=m;if(!PUe(f,s?.viewportBounds))continue;let h=r.createElement(YQ(f.tagName));XQ(t,f,h),n.appendChild(h);}}}function xUe(t,e,n,r){let o=t.parseFromString("<hierarchy/>","text/xml"),i=new Map,a={prunedDocument:o,idToElement:n,prunedIdToElement:i,idCounter:{value:0},opts:r},s=o.documentElement;XQ(a,e,s);let l=new XMLSerializer().serializeToString(o);return {prunedDocument:o,prunedIdToElement:i,xml:l}}async function JQ(t,e,n){let r=new DOMParser,o=r.parseFromString(t,"text/xml"),i=new Map,a=o.documentElement;if(!a)throw new M("InternalWebAgentError","No root element found in XML");if(a.tagName!=="hierarchy")throw new M("InternalWebAgentError","No hierarchy element found in XML");let{prunedDocument:s,prunedIdToElement:l,xml:c}=xUe(r,a,i,n),u=c;try{u=await gUe.format(c,{parser:"xml",plugins:[hUe],printWidth:120,tabWidth:1,singleAttributePerLine:!1});}catch(d){e.warn({err:d},"Failed to format XML");}return {xml:u,originalXml:t,document:o,idToElement:i,prunedDocument:s,prunedIdToElement:l}}function MUe(t){let e=[],n=t;for(;n;){let r=n.tagName,o=n.parentElement,i=1;if(o){let a=Array.from(o.children).filter(s=>s.tagName===r);for(let s=0;s<a.length;s++)if(a[s]===n){i=s+1;break}}e.unshift(`${r}[${i}]`),n=o;}return `/${e.join("/")}`}function yA(t,e){let n=t.idToElement.get(e);if(n)return MUe(n)}function E0(t,e){let n=t.idToElement.get(e);if(!n)return;let r=n.cloneNode(true);for(let o of Array.from(r.children)){let i=o;for(let a of Array.from(i.children))i.removeChild(a);}return r.outerHTML}function pd(t){if(!t.hasAttribute("bounds"))return;let e=t.getAttribute("bounds");if(!e)return;let n=e.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);if(n){let r=parseInt(n[1],10),o=parseInt(n[2],10),i=parseInt(n[3],10),a=parseInt(n[4],10);if(Number.isFinite(r)&&Number.isFinite(o)&&Number.isFinite(i)&&Number.isFinite(a))return [r,o,i,a]}}function PUe(t,e){if(!e)return true;let n=pd(t);if(!n||n.length<4)return true;let r=n[0],o=n[1],i=n[2],a=n[3];return !(i<=e.left||r>=e.right||a<=e.top||o>=e.bottom)}function ZQ(t,e){if(t&&!(!e||e.length===0))return Object.fromEntries(e.map(n=>[n,t.getAttribute(n)]).filter(([,n])=>n!==null))}function eee({requirements:t,element:e}){let n;if((t?.positionSpecificity||t?.shapeSpecificity)&&(n=pd(e),!n))throw new M("ActionFailureError","Element to cache has no bounds or unexpected bounds format");return {requiredText:t?.textRequired&&hp(e)||void 0,requiredAttributes:ZQ(e,t?.attributesRequired),requiredBounds:t?.boundsRequired,position:t?.positionSpecificity?{x1:n[0],y1:n[1],x2:n[2],y2:n[3],tolerance:t?.positionSpecificity}:void 0,shape:t?.shapeSpecificity?{width:n[2]-n[0],height:n[3]-n[1],tolerance:t?.shapeSpecificity}:void 0}}function nee({aiResponse:t,description:e,emulatorState:n,memory:r,useMemory:o}){let i=n.graph.idToElement.get(t.id);if(!i)throw new M("InternalWebAgentError",`Could not find node with id: ${t.id}`);let a=pd(i);if(!a)throw new M("InternalWebAgentError",`Node ${t.id} has no bounding box: ${i.outerHTML}`);let s=yA(n.graph,t.id)??"",l=E0(n.graph,t.id)??"",c=eee({requirements:t.requirements,element:i}),u=[];t.additionalElements&&(u=t.additionalElements.map(({id:m,requirements:p})=>{let f=n.graph.idToElement.get(m);if(!f)return;let h=yA(n.graph,m);return h?{xPath:h,requirements:eee({requirements:p,element:f})}:void 0}).filter(m=>!!m));let d;if(Sy(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},o)if(t.updatedMemory){let m={type:"GCS_TRACES",traces:t.updatedMemory};d.memory=m;}else r&&(d.memory=r);return {target:d,resolvedNode:i}}function ree(t){return t?.type==="WEBVIEW"?t.browserCache?.memory:void 0}function IUe(t,e){let n=e.x2-e.x1,r=(e.x1+e.x2)/2,o=(t[0]+t[2])/2;if(!cs(e.tolerance,r,o,Math.min(1,n)))return false;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(t[1]+t[3])/2;return cs(e.tolerance,a,s,Math.min(1,i))}function _Ue(t,e){return cs(e.tolerance,e.width,t[2]-t[0],Math.min(1,e.width))?cs(e.tolerance,e.height,t[3]-t[1],Math.min(1,e.height)):false}var tee=(t,e,n)=>{if(!e)return;let{requiredAttributes:r,requiredText:o,requiredBounds:i,position:a,shape:s}=e;if(o!==void 0&&o.length>0){let l=hp(t);if(l!==o)throw new Pe(`Resolved element text mismatch: expected ${o}, got ${l}`)}if(r)for(let[l,c]of Object.entries(r)){let u=t.getAttribute(l)??void 0;if(u!==c)throw new Pe(`Attribute ${l} mismatch: expected ${c}, got ${u}`)}if(i&&n&&!n.targetBounds.every((c,u)=>c===n.newElementBounds[u]))throw new Pe(`Bounds changed from [${n.targetBounds.join(",")} ] to [${n.newElementBounds.join(",")} ]`);if(a&&n&&!IUe(n.newElementBounds,a))throw new Pe(`Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(n.newElementBounds)}`);if(s&&n&&!_Ue(n.newElementBounds,s))throw new Pe(`Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(n.newElementBounds)}`)};async function Yp(t){let{target:e,domState:n}=t,{graph:r}=n,{document:o}=r,i=me();if(e.type==="WEBVIEW")return OUe(e,t);if(!e.xPath)throw new M("ActionFailureError","Native element cache has no XPath");let a=QQ.evaluateXPathToFirstNode(e.xPath,o,null,null);if(!a)throw new Pe(`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=QQ.evaluateXPathToFirstNode(p.xPath,o);if(!f)throw new Pe(`Required related element not found for XPath: ${p.xPath}`);tee(f,p.requirements);}});}let s=pd(a);if(!s)throw new Pe("Resolved native element has no bounding box");if(!e.bounds)throw new Pe("Native element cache has no bounds");tee(a,e.requirements,{targetBounds:e.bounds,newElementBounds:s});let l;for(let[m,p]of r.idToElement.entries())if(p===a){l=m;break}let c=e.elementOnlySerializedXml,u=e.xPath;return l!==void 0&&(c=E0(r,l)??c,u=yA(r,l)??u),{resolvedTarget:{...e,resolvedNode:a,bounds:s,elementOnlySerializedXml:c,xPath:u}}}async function OUe(t,e){let{stateManager:n,logger:r,signal:o}=e,i=me(),a=await n.getActiveWebview();if(!a||!a.browserController)throw r.error({webview:a?{...a,browserController:!!a.browserController}:void 0},"resolveTargetCacheInWebView: No browser controller attached"),new Pe("No browser controller is attached to the requested webview");let s=a.browserController;if(!t.browserCache)throw r.error({target:t},"resolveTargetCacheInWebView: No browser target available on cache"),new Pe("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:r,signal:o,skipWaitForPageLoad:true,skipSavingVisualAttributes:true}},logger:r}));return {resolvedTarget:{...t,controller:a.browserController,browserTarget:c}}}function fd(t){let{command:e,cacheKey:n="cache",targetName:r="target",updatedCache:o}=t;am(e)&&(e[n]={...e[n],[r]:qd.parse(o)},t.updatedWithAI&&(e[n].updatedAt=new Date,e[n].updatedAtLoggerTags=De(t.logger)));}function Bc(t){if(t.type==="WEBVIEW")return {type:"WEBVIEW",resolvedDescription:t.resolvedDescription,xPath:t.xPath,browserCache:t.browserCache,memory:t.memory};let{resolvedNode:e,...n}=t;return {...n}}var jo=.15,NUe=500,Nn=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:n,skipFetchingFullWebviewContent:r=false,removeWebviewContent:o=false,useMemory:i=false,memory:a,webviewMemory:s,metadata:l,cacheBustReason:c}){let u=this.logger.child({...l}),d=await n.startAsyncSection("Get emulator state",async()=>{let y=await this.stateManager.getCurrentScreenshotPngString();return {emulatorState:await this.stateManager.getDomState({skipFetchingFullWebviewContent:r,removeWebviewContent:o}),screenshot:y}}),m;try{m=await n.startAsyncSpan("AI_LOCATOR_CALL",async y=>{c&&(y.attributes.cacheBustReason=c);let S=await this.generator.getAndroidElementLocation({description:e,screenXml:d.emulatorState.graph.xml,screenshot:d.screenshot,source:l?.source==="SCROLL_TO"?"SCROLL_TO":void 0,memory:i?a:void 0},{logger:u,loggerTags:De(u),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["android-locator"]});return y.result=S,S});}catch(y){throw this.throwIfAborted(),u.error({err:y},"Failed to locate element"),new M("InternalWebAgentError",`Failed to locate element: ${y instanceof Error?y.message:y}`,{errOptions:{cause:y}})}if(m.id===-1){let y=m.updatedMemory?{type:"GCS_TRACES",traces:m.updatedMemory}:void 0;return {success:false,thoughts:m.thoughts??"No matching element found",updatedLocatorMemory:y}}let{target:p,resolvedNode:f}=nee({aiResponse:m,description:e,emulatorState:d.emulatorState,memory:a,useMemory:i});if(p.type==="NATIVE")return n.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:p.elementOnlySerializedXml??"Unknown element"},attributes:{},subSpans:[]}),{success:true,resolvedTarget:{...p,resolvedNode:f},thoughts:m.thoughts};let{browserLocateResult:h,browserController:b}=await n.startWebviewTrace(async()=>{let y=await this.stateManager.getActiveWebview();if(!y||!y.browserController)throw new M("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 n.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:h.target.nodeOnlySerializedHtml??"Unknown HTML element in webview"},attributes:{},subSpans:[]}),{success:true,resolvedTarget:{...p,controller:b,browserTarget:{...h.resolution,serverSideBoundingBox:await h.resolution.locator.boundingBox({timeout:5e3})},browserCache:h.target},thoughts:h.thoughts}}async targetingActionWithAILocator(e){let{action:n,command:r,description:o,tracer:i,cacheKey:a,targetName:s,cache:l,skipFetchingFullWebviewContent:c,removeWebviewContent:u,metadata:d,cacheBustReason:m}=e,p=await this.findElement({description:o,tracer:i,skipFetchingFullWebviewContent:c,removeWebviewContent:u,useMemory:this.shouldUseMemoryForCommand(r),memory:l?.memory,webviewMemory:ree(l),metadata:d,cacheBustReason:m});if(!p.success){if(p.updatedLocatorMemory&&l){let y={...l,memory:p.updatedLocatorMemory};fd({command:r,cacheKey:a,targetName:s,updatedCache:y,updatedWithAI:true,logger:this.logger});}throw new M("NoMatchingElementError",p.thoughts??"No matching element found")}let f=p.thoughts,{result:h,resolvedTarget:b}=await this.executeActionWithWebviewReconstructRetry({action:n,resolvedTarget:p.resolvedTarget,reason:"webview target closed during AI-located action"});return fd({command:r,cacheKey:a,targetName:s,updatedCache:Bc(b),updatedWithAI:true,logger:this.logger}),{result:h,thoughts:f}}async wrapTargetingAction(e){let{action:n,description:r,command:o,cacheKey:i="cache",targetName:a="target",cacheIsInvalidAfterResolution:s,tracer:l,skipFetchingFullWebviewContent:c=false,removeWebviewContent:u=false}=e,d,m={commandId:o.id};if(i==="cache"&&"cache"in o&&o.cache){let T=o.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(o.disableCache&&(this.logger.debug({command:o},"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&&!vc(h?.resolvedDescription??"",r)&&(this.logger.info({description:r,cacheDescription:h?.resolvedDescription},"Cache description mismatch, clearing it automatically"),p=true,f="Description mismatch",h=void 0),!h)return this.logger.info({description:r,cacheBustedBeforeAction:p},"Prompting AI for a new element location"),this.targetingActionWithAILocator({action:n,command:o,description:r,tracer:l,cacheKey:i,targetName:a,cache:d,skipFetchingFullWebviewContent:c,removeWebviewContent:u,metadata:m,cacheBustReason:f});let b=h.type==="NATIVE"?!!h.requirements:!!h.browserCache?.requirements,y=h.type==="NATIVE"?!!h.requiredRelatedElements?.length:!!h.browserCache?.additionalElements?.length,S;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 _=>{let N=Date.now(),I;for(;Date.now()-N<3e3;){S=await this.stateManager.getDomState({skipFetchingFullWebviewContent:h?.type==="NATIVE"});let A;try{A=(await Yp({target:h,domState:S,stateManager:this.stateManager,logger:this.logger})).resolvedTarget;}catch(B){if(I=B,B instanceof Pe){this.logger.warn({err:B},"Failed to resolve target cache, retrying"),await Za(500,this.aborter.controller?.signal);continue}throw this.logger.error({err:B},"Failed to resolve target cache"),B}let z=Bc(A),D=diff(h,z);return D&&Object.keys(D).length>0&&this.logger.info({cacheDiffs:D},"Successfully resolved target with cache"),_.attributes.serializedElement=A.type==="WEBVIEW"?A.browserCache?.nodeOnlySerializedHtml??"Unknown HTML element in webview":A.elementOnlySerializedXml??"Unknown element",{resolvedTarget:A,updatedCache:z}}throw I}),{result:C,resolvedTarget:w}=await this.executeActionWithWebviewReconstructRetry({action:n,resolvedTarget:T,reason:"webview target closed during cached action"});return fd({command:o,cacheKey:i,targetName:a,updatedCache:Bc(w),updatedWithAI:!1,logger:this.logger}),Ge.increment("cache_target_resolution_v2",1,["outcome:hit",`platform:mobile-${h.type.toLowerCase()}`,`hasRequirements:${b}`,`hasAdditionalElements:${y}`,`orgId:${this.orgId}`,"cliVersion:0.111.1"]),{result:C,thoughts:"Successfully executed preset action with cache"}}catch(T){if(this.throwIfAborted(),T instanceof M&&T.reason!=="InternalWebAgentError")throw this.logger.error({err:T},"Failed to execute action with target cache (fatal)"),T;return Ge.increment("cache_target_resolution_v2",1,["outcome:miss",`platform:mobile-${h.type.toLowerCase()}`,`hasRequirements:${b}`,`hasAdditionalElements:${y}`,`orgId:${this.orgId}`,"cliVersion:0.111.1"]),this.logger.warn({err:T},"Failed to execute action with target cache, retrying with AI"),this.targetingActionWithAILocator({action:n,command:o,description:r,tracer:l,cacheKey:i,targetName:a,cache:h,skipFetchingFullWebviewContent:c,removeWebviewContent:u,metadata:m})}}async executeActionWithWebviewReconstructRetry(e){let{action:n,resolvedTarget:r,reason:o}=e;try{return {result:await n(r),resolvedTarget:r}}catch(i){if(this.throwIfAborted(),r.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(o))?.browserController))throw i;let s=await this.stateManager.getDomState({skipFetchingFullWebviewContent:true}),{resolvedTarget:l}=await Yp({target:Bc(r),domState:s,stateManager:this.stateManager,logger:this.logger,signal:this.abortSignal});return {result:await n(l),resolvedTarget:l}}}errorLooksLikeClosedWebviewTarget(e){let n=H(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(r=>n.includes(r))}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 M("ActionFailureError","Native element cache has no bounds");let[n,r,o,i]=e.bounds;if(n===void 0||r===void 0||o===void 0||i===void 0)throw new M("ActionFailureError",`Native element cache has incomplete bounds: [${e.bounds.join(", ")}]`);return {left:n,top:r,width:o-n,height:i-r}}calculateSwipeCoordinates({containerBounds:e,direction:n,desiredDelta:r}){let o=e.left+e.width/2,i=e.top+e.height/2;if(n==="up"||n==="down"){let a=e.height*jo,s=e.top+a,l=e.top+e.height-a,c=l-s,u=Math.min(Math.abs(r),c),d=c-u,m=n==="down"?l-d/2:s+d/2;return {startX:o,startY:m,actualDelta:u}}else {let a=e.width*jo,s=e.left+a,l=e.left+e.width-a,c=l-s,u=Math.min(Math.abs(r),c),d=c-u;return {startX:n==="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:n,deltaPixels:r,direction:o,durationMs:i=300}){let a=Math.abs(r),s=e,l=n;o==="up"||o==="down"?l=o==="up"?n-a:n+a:s=o==="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:n},{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 fe(NUe,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 Uc(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[n,r,o,i]=e;if(!(n===void 0||r===void 0||o===void 0||i===void 0))return {left:n,top:r,width:o-n,height:i-r}}function aee(t){return "iterations"in t}function FUe(t){let e={relativePosition:t.relativePosition?Zt(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 Xp=class extends Nn{async tapOnNativeCoordinates(e){let n=e.x,r=e.y;if(this.logger.info({x:n,y:r},"Tap at coordinates"),"longPress"in e&&e.longPress)return await this.driver.executeInNativeContext(this.logger,o=>o.executeScript("mobile: longClickGesture",[{x:n,y:r,duration:e.longPressDurationMs??2e3}]),{operationName:"longPress"});if(aee(e)){let o=e.tapDelayMs??100;for(let i=0;i<e.iterations;i++)await this.driver.executeInNativeContext(this.logger,a=>a.tap({x:n,y:r}),{operationName:"tap"}),i<e.iterations-1&&await new Promise(a=>setTimeout(a,o));return}await this.driver.executeInNativeContext(this.logger,o=>o.tap({x:n,y:r}),{operationName:"tap"});}async tapOnNativeTarget(e,n){let[r,o,i,a]=e.bounds,s=i-r,l=a-o,c=n?.relativePosition?.x??s/2,u=n?.relativePosition?.y??l/2;c=Math.max(0,Math.min(c,s)),u=Math.max(0,Math.min(u,l));let d=r+c,m=o+u;return await this.tapOnNativeCoordinates({x:d,y:m,...n}),{x:d,y:m}}async tapOnWebviewTarget(e,n){let{controller:r}=e,o,i=1;return n&&aee(n)?(o=n.tapDelayMs,i=n.iterations):n&&"longPress"in n&&(o=n.longPressDurationMs),(await r.browser.click(e.browserTarget,{createIsolatedFolder:()=>{let s=Math.random().toString(36).substring(4),l=mn__default.join(tmpdir(),"momentic","downloads"),c=mn__default.join(l,this.orgId,s);return mkdirSync(c,{recursive:true}),c}},{delayMs:o,relativePosition:n?.relativePosition,iterations:i})).coordinates}async tapOnTarget({target:e,options:n}){return await me().startAsyncSpan("EMULATOR_INTERACTION",async o=>{if(o.attributes.options=n,"type"in e&&e.type==="NATIVE"){let i=await this.tapOnNativeTarget(e,n);o.attributes.point=i,o.targetBounds=Uc(e);}else {o.withinWebview=true;let i=await this.tapOnWebviewTarget(e,n);o.attributes.point=i,o.targetBounds=Uc(e);}},{name:"Tap on target"})}async executeTap({command:e}){let n=me(),r=FUe(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 n.startAsyncSpan("EMULATOR_INTERACTION",async c=>{await this.tapOnNativeCoordinates({...r,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 o=e.target.description,{thoughts:i}=await this.wrapTargetingAction({command:e,tracer:n,action:a=>this.tapOnTarget({target:a,options:r}),description:o});return {success:true,message:i}}};var zc=class extends Nn{async doPress({keycode:e,longPress:n}){await me().startAsyncSpan("EMULATOR_INTERACTION",async()=>this.driver.executeInNativeContext(this.logger,o=>o.executeScript("mobile: pressKey",[{keycode:e,isLongPress:n}]),{operationName:"pressKey"}),{name:"Send key events to emulator"});}};var hd=25,see=150,EA=class extends Nn{async doType(e){let n=me();if(!e.target){if(e.clearContent)throw new M("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 M("UserConfigurationError","x/y targets are not supported for the Type step");let{thoughts:r}=await this.wrapTargetingAction({command:e,tracer:n,action:async o=>{"type"in o&&o.type==="NATIVE"?await this.doNativeType(e,o):await this.doWebviewType(e,o);},description:e.target.description});return {success:true,message:r}}async doWebviewType(e,n){await me().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.withinWebview=true;let i={clearContent:e.clearContent,forceClearContent:e.forceClearContent,delay:e.keyPressDelayMs??hd};o.attributes.options=i;let{controller:a,browserTarget:s}=n;await a.browser.typeIntoTarget(e.text,s,i);},{name:"Typing within web view"});}async doNativeType(e,n){e.clearContent?(await this.tapNativeTargetForType(n,{longPress:true}),await this.clearContent()):await this.tapNativeTargetForType(n),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,n){let r=me(),o=new Xp(this.constructPerformerParams());await r.startAsyncSpan("EMULATOR_INTERACTION",async i=>{i.attributes.options=n??{};let a=await o.tapOnNativeTarget(e,n);i.attributes.point=a,i.targetBounds=Uc(e);},{name:"Tap on target"});}async sendKeys(e){let n=me(),r=e.keyPressDelayMs??hd;await n.startAsyncSection("Waiting for system keyboard to open",async(o,i)=>{let a=Date.now();for(;Date.now()-a<2e3;){this.throwIfAborted();let s=Date.now();if(await this.driver.executeInNativeContext(this.logger,c=>c.isKeyboardShown(),{operationName:"isKeyboardShown"}))return;let l=Date.now()-s;l<500&&await new Promise(c=>setTimeout(c,500-l));}i.attributes.timedOut=true;}),await n.startAsyncSpan("EMULATOR_INTERACTION",async()=>{try{r!==hd&&await this.driver.executeInNativeContext(this.logger,async i=>i.updateSettings({keyInjectionDelay:r}),{operationName:"updateKeyInjectionDelay"});let o=[];for(let i=0;i<e.text.length;i+=see)o.push(e.text.slice(i,i+see));for(let i of o)await this.driver.executeInNativeContext(this.logger,async a=>a.keys(i),{operationName:"typeWithCustomKeyDelay",attemptTimeoutMs:cC(r,i),maxAttempts:1});}finally{r!==hd&&await this.driver.executeInNativeContext(this.logger,async o=>o.updateSettings({keyInjectionDelay:hd}),{operationName:"updateKeyInjectionDelay"});}},{name:`Typing with a ${r}ms delay`});}async clearContent(){let e=me();try{await e.startAsyncSection("Clearing any content from the focused field",()=>this.clearContentHelper());}catch(n){this.logger.warn({err:n},"Failed to find select all button, continuing...");}}async clearContentHelper(){await this.driver.executeInNativeContext(this.logger,async n=>{let r=n.$('//android.widget.LinearLayout[@content-desc="Select all" and @clickable="true"]');await r.waitForExist({timeout:750}),await r.click();},{operationName:"selectAllText",maxAttempts:1}),await new zc(this.constructPerformerParams()).doPress({keycode:67});}};var lee=.8,BUe=v__default.object({navigationBar:v__default.object({visible:v__default.boolean(),x:v__default.number(),y:v__default.number(),width:v__default.number(),height:v__default.number()}),statusBar:v__default.object({visible:v__default.boolean(),x:v__default.number(),y:v__default.number(),width:v__default.number(),height:v__default.number()})});function C0(t,e){t.attributes.scrollableElementType=e.type,t.attributes.scrollableElementDisplay=Ls(e),e.type==="CUSTOM"&&(t.attributes.scrollableElementDescription=e.target.description);}var Jp=class extends Nn{async getHardcodedScrollableElementBounds(e,n){let r;switch(e.type){case "SCREEN":r=this.getContainerBoundsFromViewport(n);break;case "OPEN_APP":try{let o=BUe.parse(await this.driver.executeInNativeContext(this.logger,i=>i.executeScript("mobile: getSystemBars",[]),{operationName:"getSystemBars"}));r=this.getContainerBoundsFromViewport(n),o.navigationBar.visible&&(r.height=Math.max(1,r.height-o.navigationBar.height)),o.statusBar.visible&&(r.top+=o.statusBar.height,r.height=Math.max(1,r.height-o.statusBar.height));}catch(o){this.logger.warn({err:o},"Failed to get system bars, using hardcoded bounds"),r=this.getContainerBoundsFromViewport(n);}break;case "OPEN_WEBVIEW":{let o=await this.stateManager.getActiveWebviewNodes();if(o.length===0&&(await this.stateManager.refreshWebviewsManually("get active webview nodes"),o=await this.stateManager.getActiveWebviewNodes()),o.length===0)throw new Error("No active webviews found");if(o.length>1){let a=o.map(s=>({id:s.id,ele:s.originalElement.outerHTML,bounds:s.bounds}));throw new Error(`Multiple active webviews found. Momentic currently only supports a single active webview at a time. Discovered nodes: ${JSON.stringify(a)}`)}let i=o[0]?.bounds;if(!i)throw new Error("No bounds found for active webview");r=this.getContainerBoundsFromBounds(i);break}default:{throw new Error("If Typescript complains about the line above, you missed a switch case")}}return r}getContainerBoundsFromViewport(e){return {left:e.x,top:e.y,width:Math.max(1,e.width),height:Math.max(1,e.height)}}getContainerBoundsFromBounds(e){let n=e[0],r=e[1],o=e[2],i=e[3],a=o-n,s=i-r;return {left:n,top:r,width:Math.max(1,a),height:Math.max(1,s)}}async executeSwipe(e){let n=me(),r=Ls(e.scrollableElement);if(e.scrollableElement.type==="CUSTOM_COORDINATES"){let{startX:i,startY:a,deltaPixels:s}=e.scrollableElement;return await n.startAsyncSpan("EMULATOR_INTERACTION",async l=>{C0(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 ${r}`}),{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 n.startAsyncSpan("EMULATOR_INTERACTION",async s=>{C0(s,e.scrollableElement),await this.swipeByAbsoluteCoordinates({span:s,direction:e.direction,percent:e.viewportPercent,durationMs:e.durationMs,containerBounds:a,relativePosition:e.relativePosition?Zt(e.relativePosition):void 0});},{name:`Swipe ${e.direction} in ${r}`}),{success:true,message:"Successfully executed swipe action"}}let{thoughts:o}=await this.wrapTargetingAction({command:e,description:e.scrollableElement.target.description,action:async i=>me().startAsyncSpan("EMULATOR_INTERACTION",async s=>(C0(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 ${r}`}),tracer:n});return {success:true,message:o}}async scrollInNativeContainer({span:e,cmd:n,target:r}){if(!r.bounds||r.bounds.length<4)throw new M("ActionFailureError","Native container cache has no bounds");let o=r.bounds,i=o[2]-o[0],a=o[3]-o[1];await this.swipeByAbsoluteCoordinates({span:e,direction:n.direction,percent:n.viewportPercent,durationMs:n.durationMs,containerBounds:{left:o[0],top:o[1],width:Math.max(1,i),height:Math.max(1,a)},relativePosition:n.relativePosition?Zt(n.relativePosition):void 0});}async swipeInWebview({span:e,cmd:n,target:r}){let{controller:o,browserTarget:i}=r;if(!o.browser.getViewport())throw new Error("Failed to get viewport size from webview");let s=n.direction==="down"||n.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*jo),u=Math.floor(l.height*jo),d=Math.max(1,l.width-c*2),m=Math.max(1,l.height-u*2),p,f;if(n.relativePosition){let y=Zt(n.relativePosition);p=l.x+y.x,f=l.y+y.y;}else p=l.x+l.width/2,f=l.y+l.height/2;let h={x:p,y:f},b=(s?m:d)*(n.viewportPercent??lee)*(s?n.direction==="down"?1:-1:n.direction==="right"?1:-1);e.attributes.startPoint=h,e.attributes.scrollPixelAmount=b,await o.browser.mouseDragUsingVisualCoordinates({deltaX:s?0:b,deltaY:s?b:0,steps:10,dragDurationMs:n.durationMs,fromTarget:h});}async swipeByAbsoluteCoordinates({span:e,direction:n,percent:r=lee,durationMs:o=500,containerBounds:i,relativePosition:a}){e.attributes.containerBounds=i;let s=i.width*jo,l=i.height*jo,c,u;if(n==="up"||n==="down"?(c=(i.height-2*l)*r,u=Math.floor(c/(o/1e3))):(c=(i.width-2*s)*r,u=Math.floor(c/(o/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:n,durationMs:o});}else {let d=i.width*jo,m=i.height*jo,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:n,percent:r,speed:u}]),{operationName:"swipeGesture"});}}};var cee=20,w0=.9,UUe=2,Zp=.5,A0=.2;var TA=class extends Jp{async executeScrollTo(e){let n=e.target.description,r=e.scrollStepPercent??w0,o=await this.tryUseCachedScrollPosition(e,n);return o||this.searchForElement({cmd:e,description:n,scrollStepPercent:r})}async resolveContainer({scrollableElement:e,containerCache:n,aiMetadata:r}){let o=await this.driver.executeInNativeContext(this.logger,u=>u.getWindowRect(),{operationName:"getScrollContainerViewportRect"});if(e.type==="CUSTOM_COORDINATES")return {bounds:{left:0,top:0,width:o.width,height:o.height},diffThresholdPercent:Zp};if(e.type!=="CUSTOM")return {bounds:await this.getHardcodedScrollableElementBounds(e,o),diffThresholdPercent:Zp};let i=me(),a=e.target.description;if(n){let u=this.getBoundsFromNativeCache(n);return this.logger.info({bounds:u},"Got container bounds from native cache"),{bounds:u,cache:n,diffThresholdPercent:up({containerBounds:u,viewport:o,defaultThresholdPercent:Zp})}}let s=await this.findElement({description:a,tracer:i,metadata:r});if(!s.success)throw new M("NoMatchingElementError",s.thoughts??"No matching element found");let{resolvedTarget:l}=s;if(l.type!=="NATIVE")throw new Error(`ActionFailureError: Custom scroll container "${a}" resolved to a webview element. Custom containers must be native elements.`);let c=this.getBoundsFromNativeCache(l);return this.logger.info({bounds:c},"Got container bounds from AI"),{bounds:c,cache:l,diffThresholdPercent:up({containerBounds:c,viewport:o,defaultThresholdPercent:Zp})}}async tryUseCachedScrollPosition(e,n){let r=e.cache?.target;return r?r.type==="WEBVIEW"?this.tryUseWebviewCache(e,n):r.scrollDetails?this.tryUseNativeScrollCache(e,n,r):null:null}async tryUseWebviewCache(e,n){let r=me();try{let{thoughts:o}=await this.wrapTargetingAction({command:e,tracer:r,description:n,action:async i=>{if(i.type==="NATIVE")throw new Error("Expected WEBVIEW target but got NATIVE");await this.scrollWebviewTargetIntoView(i);}});return {success:!0,message:o}}catch(o){return this.logger.warn({err:o},"Failed to use webview cache, falling back to search"),null}}async tryUseNativeScrollCache(e,n,r){let o=r.scrollDetails,i=me(),a=e.scrollStepPercent??w0,s=o.scrollableElement.type==="CUSTOM"?o.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:ls({containerBounds:c,containerInsetRatio:jo})*a}).actualDelta,p=await this.tryFindElement({cmd:e,description:n,tracer:i,scrollDetails:this.buildScrollDetails(e,0,l.cache),useAIIfCacheFails:false});if(p)return this.logger.info("Element resolved at current position without scrolling"),p;let f=Math.abs(o.pixelDelta),h=0,b=m*UUe,y=0;for(;y<f;){this.throwIfAborted();let C=f-y,w=Math.min(C,b),_=await this.scrollByPixelDelta({pixelDelta:w,scrollableElement:e.scrollableElement,containerCache:l.cache,direction:e.direction,scrollStepPercent:a,aiMetadata:{commandId:e.id},useVisualDiff:false});if(_===0)break;y+=_,h+=e.direction==="down"?_:-_;let N=await this.tryFindElement({cmd:e,description:n,tracer:i,scrollDetails:this.buildScrollDetails(e,h,l.cache),useAIIfCacheFails:false});if(N)return this.logger.info({cumulativePixelDelta:h},"Element resolved during cache replay"),N}let S=Math.max(0,Math.min(e.maxScrollAttempts??cee,2)),T=true;for(let C=0;C<S&&T;C++){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 w=await this.tryFindElement({cmd:e,description:n,tracer:i,scrollDetails:this.buildScrollDetails(e,h,l.cache),useAIIfCacheFails:false});if(w)return this.logger.info({attempt:C,cumulativePixelDelta:h},"Element resolved during cache buffer scroll"),w}if(h!==0){let C=e.direction==="down"?"up":"down";this.logger.info({cumulativePixelDelta:h,originalDirection:e.direction,undoDirection:C,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:C,scrollStepPercent:a,aiMetadata:{commandId:e.id}});}return null}async tryFindElement({cmd:e,description:n,tracer:r,scrollDetails:o,useAIIfCacheFails:i=true}){let a,s,l=false,c=o,u=R0(e.cache?.target);if(u&&u.resolvedDescription!==void 0&&vc(u.resolvedDescription,n)&&!e.disableCache){let p=await this.stateManager.getDomState({skipFetchingFullWebviewContent:true,removeWebviewContent:true});try{let{resolvedTarget:f}=await Yp({target:u,domState:p,stateManager:this.stateManager,logger:this.logger});a=f,l=!0,s="Successfully resolved scroll to target with cache.",this.logger.info("Successfully resolved scroll to target from cache");}catch(f){this.logger.warn({err:f},"Failed to resolve target from cache");}}if(a&&l&&a.type==="NATIVE"&&o){let p=await this.correctNativeTargetIntoView({cmd:e,resolvedTarget:a,scrollDetails:o});c=p.scrollDetails,p.resolvedTarget?a=p.resolvedTarget:(a=void 0,l=false);}if(!a&&!i)return null;if(!a)try{let p=kC(n),f=await this.findElement({description:p,tracer:r,metadata:{commandId:e.id,source:"SCROLL_TO"}});if(!f.success)return null;a=f.resolvedTarget,s=f.thoughts;}catch(p){if(p instanceof M&&p.reason==="NoMatchingElementError")return null;throw this.logger.warn({err:p},"Failed to find scroll-to target with AI"),p}if(a&&!l&&a.type==="NATIVE"&&o)try{let p=await this.correctNativeTargetIntoView({cmd:e,resolvedTarget:a,scrollDetails:o});c=p.scrollDetails,p.resolvedTarget&&(a=p.resolvedTarget);}catch(p){this.logger.warn({err:p},"Failed to reposition AI-resolved scroll-to target for stable cache generation");}if(a.type==="WEBVIEW"){await this.scrollWebviewTargetIntoView(a);let p=R0(Bc(a));return fd({command:e,updatedCache:p,updatedWithAI:!l,logger:this.logger}),{success:true,message:s}}let m=Bc(a);if(m.type!=="NATIVE")throw new Error("Expected native target cache for scroll-to");return fd({command:e,updatedCache:R0({...m,scrollDetails:c}),updatedWithAI:!l,logger:this.logger}),{success:true,message:s}}async correctNativeTargetIntoView({cmd:e,resolvedTarget:n,scrollDetails:r}){let o=await this.getCorrectiveScrollForTarget({resolvedTarget:n});if(!o)return {resolvedTarget:n,scrollDetails:r};this.logger.info({bounds:n.bounds,correction:o},"Repositioning scroll-to target to the preferred viewport anchor");let i=r.scrollableElement.type==="CUSTOM"?r.scrollableElement.cache:void 0,a=await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:r.scrollableElement,containerCache:i,direction:o.direction,scrollStepPercent:e.scrollStepPercent??w0,aiMetadata:{commandId:e.id},useVisualDiff:true});if(a===0)return this.logger.info({bounds:n.bounds,correction:o},"Skipping corrective scroll update because the viewport did not move"),{resolvedTarget:n,scrollDetails:r};let s=await this.stateManager.getDomState({skipFetchingFullWebviewContent:true,removeWebviewContent:true}),l;try{({resolvedTarget:l}=await Yp({target:n,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:n,scrollDetails:r}}if(l.type!=="NATIVE")return {resolvedTarget:n,scrollDetails:r};let c=n.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:n.bounds,correction:o,appliedCorrectionPixels:a},"Skipping corrective scroll update because the target did not move (viewport at scroll extent)"),{resolvedTarget:l,scrollDetails:r};let m={...r,pixelDelta:iC({currentPixelDelta:r.pixelDelta,baseDirection:r.direction,correctionDirection:o.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:n,scrollStepPercent:r}){let o=me(),i=await this.resolveContainer({scrollableElement:e.scrollableElement,aiMetadata:{commandId:e.id}});return this.scrollAndSearch({cmd:e,description:n,tracer:o,scrollStepPercent:r,resolvedContainer:i})}async scrollAndSearch({cmd:e,description:n,tracer:r,scrollStepPercent:o,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:ls({containerBounds:s,containerInsetRatio:jo})*o}).actualDelta;let d=true,m=e.maxScrollAttempts??cee;for(let h=0;h<m;h++){this.throwIfAborted();let b=this.buildScrollDetails(e,a,i.cache),y=await this.tryFindElement({cmd:e,description:n,tracer:r,scrollDetails:b});if(y)return y;if(!d)throw new Error(`ActionFailureError: Could not find element "${n}" 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:o,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:n,tracer:r,scrollDetails:p});if(f)return f;throw new Error(`ActionFailureError: Could not find element "${n}" after ${m} scroll attempts`)}buildScrollDetails(e,n,r){return e.scrollableElement.type==="CUSTOM"?{pixelDelta:n,scrollableElement:{type:"CUSTOM",target:e.scrollableElement.target,cache:r},direction:e.direction}:e.scrollableElement.type==="CUSTOM_COORDINATES"?{pixelDelta:n,scrollableElement:e.scrollableElement,direction:e.direction}:{pixelDelta:n,scrollableElement:e.scrollableElement,direction:e.direction}}async scrollWebviewTargetIntoView(e){let{controller:n,browserTarget:r}=e;await n.browser.hover(r);}async scrollByPage({direction:e,containerBounds:n,scrollStepPercent:r,diffThresholdPercent:o,rawCoordinates:i}){return me().startAsyncSpan("EMULATOR_INTERACTION",async s=>(s.attributes.containerBounds=n,s.attributes.direction=e,(await this.executeScrollGesture({direction:e,containerBounds:n,scrollStepPercent:r,diffThresholdPercent:o,rawCoordinates:i})).canScrollMore),{name:`Scroll ${e} by one page`})}async scrollByPixelDelta({pixelDelta:e,scrollableElement:n,containerCache:r,direction:o,scrollStepPercent:i,aiMetadata:a,useVisualDiff:s=false}){if(e===0)return 0;let l=me(),c,u=Zp,d,m,p;if(n.type==="CUSTOM_COORDINATES")d=n.startX,m=n.startY,p=n.deltaPixels;else {c=await this.resolveContainer({scrollableElement:n,containerCache:r,aiMetadata:a});let h=c.bounds;u=c.diffThresholdPercent;let b=ls({containerBounds:h,containerInsetRatio:jo})*i,y=this.calculateSwipeCoordinates({containerBounds:h,direction:o,desiredDelta:b});d=y.startX,m=y.startY,p=y.actualDelta;}let f=Math.ceil(Math.abs(e)/p);return this.logger.debug({pixelDelta:e,direction:o,scrollableElementType:n.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 b=this.invertDirection(o),y=0;for(let S=0;S<f;S++){this.throwIfAborted();let T=Math.abs(e)-y,C=Math.min(p,T);if(s){let w=await this.executeScrollGesture({direction:o,containerBounds:c?.bounds,scrollStepPercent:i,diffThresholdPercent:u,rawCoordinates:{type:"CUSTOM_COORDINATES",startX:d,startY:m,deltaPixels:C}});if(w.didScroll&&(y+=C),!w.canScrollMore)break}else await this.performRawSwipe({startX:d,startY:m,deltaPixels:C,direction:b}),y+=C;}return h.attributes.appliedPixels=y,y},{name:`Scroll ${o} by ${Math.abs(e)}px`})}async executeScrollGesture({direction:e,containerBounds:n,scrollStepPercent:r,diffThresholdPercent:o=Zp,rawCoordinates:i}){let a=await this.stateManager.getRawScreenshotBase64(),s,l,c;if(i)s=i.startX,l=i.startY,c=i.deltaPixels;else {if(!n)throw new Error("Expected container bounds for scroll gesture");let f=ls({containerBounds:n,containerInsetRatio:jo})*r,h=this.calculateSwipeCoordinates({containerBounds:n,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=fc(a,u),m=d>o,p=d>o;return this.logger.debug({diffPercent:d,didScroll:m,diffThresholdPercent:o,canScrollMore:p,direction:e,actualDelta:c,rawCoordinates:i},"Scroll gesture visual diff result"),{didScroll:m,canScrollMore:p}}async getCorrectiveScrollForTarget({resolvedTarget:e}){let n=e.bounds;if(!n||n.length<4)return;let r=await this.stateManager.getViewportBounds(),o=Math.max(1,r.bottom-r.top),i=n[1],a=n[3],s=aC({viewportTop:r.top,viewportBottom:r.bottom,elementHeight:a-n[1],targetTopRatio:A0}),l=r.top+o*A0,c=r.bottom-o*A0,u=i>=r.top&&a<=r.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 R0(t){return !t||t.type!=="NATIVE"?t:sC(t)}var vA=class extends Nn{async doInstallApk(e){return await this.installApkFromUri(e.uri),{success:true,message:"Installed APK."}}async installApkFromUri(e){let n=await this.resolveUriToLocalApk(e);try{await this.stateManager.executeRawADBCommand(`install -r ${mn__default.resolve(n.localPath)}`),this.logger.info({uri:e,localPath:n.localPath},"Installed APK on device");}finally{n.cleanup();}}async resolveUriToLocalApk(e){try{let n=new URL(e);if(n.protocol==="file:"){let r=n.href.slice(7),o;if(br.existsSync(r))o=r;else if(br.existsSync(mn__default.join("/",r)))o=mn__default.join("/",r);else throw new M("UserConfigurationError",`APK not found at path: ${r}`);return this.assertFileExists(o),{localPath:o,cleanup:()=>{}}}if(n.protocol==="http:"||n.protocol==="https:"){let r=await this.fetchWithTimeout(n);if(!r.ok)throw new M("UserInfrastructureError",`Failed to download APK from ${e} (status ${r.status})`);let o=await r.arrayBuffer(),i=Buffer.from(o),a=await this.writeBufferToTempFile(i,n.pathname);return {localPath:a,cleanup:()=>{try{br.unlinkSync(a);}catch(s){this.logger.warn({err:s,path:a},"Failed to remove temporary APK file");}}}}throw new M("UserConfigurationError",`Unsupported URI scheme for APK installation: ${n.protocol}`)}catch(n){if(n instanceof TypeError){let r=mn__default.resolve(e);return this.assertFileExists(r),{localPath:r,cleanup:()=>{}}}throw n}}assertFileExists(e){try{br.accessSync(e);}catch{throw new M("UserConfigurationError",`APK not found at path: ${e}`)}}async fetchWithTimeout(e){let n=AbortSignal.timeout(9e4);return await fetch(e,{signal:n})}async writeBufferToTempFile(e,n){let r=mn__default.extname(n)||".apk",o=mn__default.join(tmpdir(),`momentic-apk-${randomUUID()}${r}`);return br.writeFileSync(o,e),o}};async function uee({command:t,logger:e,generator:n,aiSettings:r,getEmulatorDomState:o,getScreenshotBase64:i,abortSignal:a}){let s=me();if(!t.goal.trim())throw new M("ActionFailureError","Cannot perform AI extraction without goal");if(t.schema){let u=wm(t.schema);if(u)throw new M("UserConfigurationError",u)}let l="",c="";return await s.startAsyncSpan("EMULATOR_READ_STATE",async()=>{l=await o(),c=await i();},{name:"Get emulator state"}),await s.startAsyncSpan("AI_EXTRACTION_CALL",async u=>{try{let d=await n.getAndroidTextExtraction({goal:t.goal,emulatorState:l,returnSchema:t.schema,screenshot:`data:image/png;base64,${c}`},{disableCache:!!t.disableCache,abortSignal:a,loggerTags:De(e),agentConfigVersion:r.agentConfig?.["android-text-extraction"]});if(u.result=d,lC({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 M("UserConfigurationError",d.thoughts);return {success:!0,output:d.result,message:d.thoughts}}catch(d){let m=H(d);throw m.includes("MaxGenerationLengthExceededError")?new M("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step instead."):m.includes("AIProviderError")&&m.includes("time")?new M("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}})}var CA=class extends Nn{async dragNative(e,n,r){let{left:o,top:i,width:a,height:s}=this.getBoundsFromNativeCache(e),{left:l,top:c,width:u,height:d}=this.getBoundsFromNativeCache(n),m=o+a/2,p=i+s/2,f=l+u/2,h=c+d/2,b=r?.hoverDuration??500,y=r?.dragDuration??1e3;await this.driver.executeInNativeContext(this.logger,async S=>{await S.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:m,y:p},{type:"pointerDown",button:0},{type:"pause",duration:b},{type:"pointerMove",duration:y,x:f,y:h},{type:"pointerUp",button:0}]}]),await S.releaseActions();},{operationName:"dragAndDrop"});}async dragWebview(e,n,r){let{controller:o}=e;if(e.controller!==n.controller)throw new M("UserConfigurationError","Cannot drag and drop between different webviews");let i=r?.dragDuration??1e3,a=r?.hoverDuration??1e3,s;r?.dragDuration&&(s=Math.max(1,Math.floor(i/200))),await o.browser.dragAndDrop(e.browserTarget,n.browserTarget,{hoverDurationMs:a,steps:s,dragDurationMs:i});}async executeDragAndDrop({command:e}){let n=me();if(e.fromTarget.type!=="description"||e.toTarget.type!=="description")throw new M("UserConfigurationError","Drag and drop only supports description targets for now");let r=e.fromTarget.description,{result:o,thoughts:i}=await this.wrapTargetingAction({command:e,tracer:n,description:r,cacheKey:"cache",targetName:"fromTarget",action:async c=>c}),a=e.toTarget.description,{result:s,thoughts:l}=await this.wrapTargetingAction({command:e,tracer:n,description:a,cacheKey:"cache",targetName:"toTarget",action:async c=>c});if(o.type!==s.type)throw new M("UserConfigurationError",`Drag and drop targets must be in the same context (both native or both webview). Found: From=${o.type}, To=${s.type}`);return await n.startAsyncSpan("EMULATOR_INTERACTION",async c=>{o.type==="NATIVE"&&s.type==="NATIVE"?await this.dragNative(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}):o.type==="WEBVIEW"&&s.type==="WEBVIEW"&&(c.withinWebview=true,await this.dragWebview(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}));},{name:"Drag and drop"}),{success:true,message:`${i}
|
|
5869
5869
|
${l}`}}};var wA=class{async getTextContent(e){return await e.textContent()??""}async getAttribute(e,n){return await e.getAttribute(n,{timeout:3e3})??""}async getTagName(e){return await e.evaluate(n=>n.tagName)}async isEditable(e){return await e.isEditable({timeout:lr*1e3})}async isEnabled(e){return await e.isEnabled({timeout:lr*1e3})}async isFocused(e){return await e.evaluate(n=>n===document.activeElement)}async getStyleProperty(e,n){return await e.evaluate((r,o)=>window.getComputedStyle(r).getPropertyValue(o),n)}},AA=class{async getTextContent(e){return hp(e)}async getAttribute(e,n){return e.getAttribute(n)??""}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,n){throw new Error("Cannot perform computed style checks on native element")}};var VUe=5e3,RA=class extends Nn{async executeElementCheck(e){let n=Date.now(),r=(e.timeout??lr)*1e3,o=r+1e4,i,a=0,s=500,l=cloneDeep(e.cache);if(e.target.type!=="description")throw new M("UserConfigurationError","x/y targets are not supported for the Element check step");for(;a-n<r;){if(Date.now()-n>o){this.logger.warn("Exceeded max system timeout for element check, exiting...");break}if(this.throwIfAborted(),i=await this.executeElementCheckHelper(e),a=Date.now(),!i.success)e.cache=l,l=cloneDeep(l),await fe(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),VUe);else return i}let c=await this.executeElementCheckHelper(e,{cacheIsInvalidAfterResolution:true});if(!c.success&&l&&e.cache){let u=vg({logger:this.logger,originalTarget:im(l)?l.target:void 0,newTarget:e.cache.target});u&&Gs(l.target,u)&&(e.cache={target:u,updatedAt:e.cache.updatedAt});}return c}async executeElementCheckHelper(e,n){let r=me();if(e.target.type!=="description")throw new M("UserConfigurationError","x/y targets are not supported for the Element check step");let o=zm(e.assertion);try{return (await this.wrapTargetingAction({...n??{},command:e,tracer:r,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 o&&(i instanceof M&&i.reason==="NoMatchingElementError"||i instanceof _a)?{success:true}:{success:false,message:`Failed to evaluate element content assertion: ${i instanceof Error?i.message:`${i}`}`}}}async executeNativeElementCheck(e,n){let r=me(),{assertion:o}=e,i=n.resolvedNode;return await r.startAsyncSpan("ELEMENT_ASSERTION",async a=>{a.targetBounds=Uc(n);let s=await this.executeElementAssertion({assertion:o,element:i,elementPropertyAccessors:new AA,span:a});return a.result=s,s},{name:"Native element check"})}async executeWebviewElementCheck(e,n){let r=me(),o=n.browserTarget.locator,i=e.assertion;return await r.startAsyncSpan("ELEMENT_ASSERTION",async a=>{a.targetBounds=Uc(n),await n.controller.browser.highlight(o);let s=await this.executeElementAssertion({assertion:i,element:o,elementPropertyAccessors:new wA,span:a});return a.result=s,s},{name:"Webview element check"})}async executeElementAssertion({assertion:e,element:n,elementPropertyAccessors:r,span:o}){switch(e.type){case "ELEMENT_CONTENT":{let i=await r.getTextContent(n)??"";return o.attributes.elementTextContent=In(i,500,true),So(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})?{success:true}:{success:false,message:`The content ${Er(e)} '${e.value}': ${i}`}}case "ELEMENT_ATTRIBUTE":{"evaluate"in n&&(o.attributes.elementOuterHtml=In(await n.evaluate(a=>a.cloneNode(false).outerHTML),500,true));let i;try{i=await r.getAttribute(n,e.attr);}catch{i=null;}if(!So(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let a=Er(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 r.isEditable(n);break;case "VISIBLE":case "EXISTS":i=true;break;case "ENABLED":{i=await r.isEnabled(n);break}case "FOCUSED":i=await r.isFocused(n);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 ${Er(e)}`}}case "ELEMENT_NAME":{let i=await r.getTagName(n);return So(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:true})?{success:true}:{success:false,message:`The element tag name ${Er(e)} '${e.value}': ${i}`}}case "ELEMENT_STYLE":{let i=await r.getStyleProperty(n,e.property);if(!So(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let a=Er(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 jUe=5e3,xA=class extends Nn{async executeScreenCheck(e){let{timeout:n}=e,r=Date.now(),o=(n??lr)*1e3,i=o+1e4,a=0,s=500;for(;a-r<o;){if(Date.now()-r>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 fe(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),jUe);else return l}return await this.executeScreenCheckHelper(e)}async executeScreenCheckHelper(e){return await me().startAsyncSection("Execute screen check",async(r,o)=>{let[i,a]=await Promise.all([this.executeNativeScreenCheckHelper({span:o,command:e}),this.executeWebviewScreenCheckHelper(e)]);return a?e.assertion.negated?i.success&&a.success?i:i.success?a:i:i.success?i:a:i})}async executeNativeScreenCheckHelper({span:e,command:n}){let{assertion:r}=n;switch(r.type){case "CONTENT":try{let o=(await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0})).graph.document.documentElement?.outerHTML;if(!o)throw new Error("Failed to get screen HTML");let i=o.includes(r.value)===!r.negated;return o.length>1e4&&(o=o.slice(0,1e4)+"...TRUNCATED"),i?{success:!0}:(e.attributes.screenContent=o,{success:!1,message:`The screen ${Um({...r,negated:!r.negated})}.`})}catch(o){return {success:false,message:`Failed to evaluate screen content assertion: ${o instanceof Error?o.message:`${o}`}`}}default:return r.type,{success:false,message:`Unsupported screen check assertion type: ${r.type}`}}}async executeWebviewScreenCheckHelper(e){let n=await this.stateManager.getActiveWebview();if(!n||!n.browserController)return;let r=n.browserController.browser;return await RD({assertion:e.assertion,logger:this.logger,browser:r,autoExpandIframes:!!r.userBrowserSettings.autoExpandIframes})}};var MA=class extends Nn{async doUninstallApk(e){return await this.uninstallApkPackage(e.packageName),{success:true,message:"Uninstalled APK."}}async uninstallApkPackage(e){let n=e.replace(/^package:/,""),r=await this.stateManager.executeRawADBCommand(`shell pm list packages | grep -E "^package:${n}$" || true`);if(!r||r.length===0)throw new M("UserConfigurationError",`Package ${n} not found`);if(r.split(`
|
|
5870
5870
|
`).filter(i=>!!i).length>1)throw new M("UserConfigurationError",`Multiple packages found for ${n}`);try{await this.stateManager.executeRawADBCommand(`uninstall ${n}`);}catch(i){throw new M("UserInfrastructureError",`Failed to uninstall package ${n}: ${i}`)}}};var mee=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()}),pee=z.object({description:z.string(),devtoolsFrontendUrl:z.string(),id:z.string(),title:z.string(),type:z.string(),url:z.string(),webSocketDebuggerUrl:z.string()}),fee=z.object({proc:z.string(),webview:z.string(),webviewName:z.string()}),hee=z.array(fee.extend({info:mee.optional(),pages:z.array(pee).optional()}));z.array(fee.extend({info:mee,pages:z.array(pee)}));var PA=class t{driver;limbarClient;device;logger;webviews=new Map;fixtures;orgId;options;aborter;constructor({driver:e,limbarClient:n,logger:r,device:o,fixtures:i,orgId:a,options:s,aborter:l}){this.driver=e,this.limbarClient=n,this.device=o,this.logger=r,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:n,fixtures:r,limbarClient:o,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(n.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 M("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 M("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:n,device:u,fixtures:r,orgId:i,options:s,aborter:l,limbarClient:o})}async getContexts(){let e=await this.driver.executeInNativeContext(this.logger,r=>r.getContexts({}),{operationName:"getContexts"}),n=Array.from(this.webviews.values());return {contexts:e,webviews:n.map(r=>({contextId:r.contextId,packageName:r.packageName,active:r.active,hasPlaywright:!!r.browserController,lastSeen:r.lastSeen,socketName:r.socketName}))}}async getRawScreenshotBase64({maxAttempts:e=3,signal:n}={}){let r=me(),o=n??this.aborter.controller?.signal,i={maxAttempts:e,signal:o,operationName:"takeScreenshot"};return await r.startAsyncSpan("EMULATOR_READ_STATE",async()=>{if(this.limbarClient){let a=this.limbarClient,s=await cp(this.logger,async()=>a.screenshot(),i);if(s.dataUri.startsWith("data:image/png;base64,"))return s.dataUri.slice(22);throw new M("InternalWebAgentError",`Emulator provider returned unexpected screenshot URI: ${s.dataUri}`)}return this.driver.executeInNativeContext(this.logger,a=>a.takeScreenshot(),i)},{name:"Take screenshot",signal:o,timeoutMs:3e4})}async getCurrentScreenshotPngString(){return `data:image/png;base64,${await this.getRawScreenshotBase64({maxAttempts:1})}`}async waitForScreenshotStability({timeoutMs:e,signal:n,reason:r,tolerancePercent:o=1}){let i=Mm({signal:n,timeoutMs:e});await me().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async a=>{a.attributes.reason=r;let s,l=false;for(;!i.aborted;){let c=Date.now();if(s)try{let d=await this.getRawScreenshotBase64({maxAttempts:1,signal:i});if(fc(s,d)<=o){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 Za(Math.min(1e4,u),i);}l||(a.attributes.timedOut=true,this.logger.warn({purpose:r},"Timed out waiting for screenshot stability"));});}async waitForPageSourceStability({timeoutMs:e,signal:n,reason:r}){await me().startAsyncSpan("WAIT_FOR_PAGE_STABILITY",async o=>{o.attributes.reason=r;let i=Mm({signal:n,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 Za(Math.min(1e4,u),i);}s||(o.attributes.timedOut=true,this.logger.warn({purpose:r},"Timed out waiting for page source stability"));});}async getCurrentPackage(){let e=await this.driver.executeInNativeContext(this.logger,r=>r.execute("mobile: getCurrentPackage"),{operationName:"getCurrentPackage"});return typeof e=="string"?e:void 0}async getActiveWebviewNodes(){let n=(await this.getDomState({skipFetchingFullWebviewContent:true,removeWebviewContent:true})).graph,r=[];for(let[o,i]of n.idToElement.entries())r.some(a=>a.id===o)||Sy(i)&&r.push({id:o,originalElement:i,bounds:pd(i)});return r}async getActiveWebviewContent(){let e=await this.getActiveWebview();if(!e||!e.browserController)return;this.throwIfAborted();let n=e.browserController;return (await me().startAsyncSpan("EMULATOR_READ_STATE",()=>n.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 me().startAsyncSection("Get emulator state XML",async()=>{let r;if(!e?.skipFetchingFullWebviewContent&&!this.options.disableMomenticAccessibilityTree)try{r=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();return {graph:await JQ(a,this.logger,{injectedWebviewContent:r,disableMomenticAccessibilityTree:this.options.disableMomenticAccessibilityTree,removeWebviewContent:e?.removeWebviewContent,viewportBounds:i})}},{timeoutMs:3e4})}async getPageSource(e){let n=e??this.aborter.controller?.signal;return await me().startAsyncSpan("EMULATOR_READ_STATE",()=>this.driver.executeInNativeContext(this.logger,o=>o.getPageSource(),{signal:n,operationName:"getPageSource"}),{name:"Get Android page source",signal:n,timeoutMs:3e4})}async getViewportBounds(){let e=await this.driver.executeInNativeContext(this.logger,n=>n.getWindowRect(),{operationName:"getViewportBounds"});return {left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height}}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(n=>{this.logger.warn({err:n},"Error refreshing webviews, continuing...");}).finally(()=>{this.refreshPromise=void 0;}),await this.refreshPromise;}}async doRefreshWebview(e,{currentAppOnly:n}){if(this.options.disableMomenticAccessibilityTree)return;this.logger.info({reason:e,currentAppOnly:n},"Refreshing webviews"),this.throwIfAborted();let r=await this.getCurrentPackage();if(n&&r==="com.android.permissioncontroller")return;let o=await this.getDetailedContexts();if(!o){this.logger.warn("No context details, not proceeding with refreshing webviews");return}let i=Date.now(),a=new Set;for(let s of o){if(this.throwIfAborted(),s.webview==="NATIVE_APP")continue;let l=s.info["Android-Package"];if(n&&r&&l!==r&&l!=="com.android.chrome"){this.logger.debug({packageName:l,currentPkgName:r},"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())n&&r&&l.packageName!==r||!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"}),n=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},r=await n();if(r.length===0&&(await me().startAsyncSection("Refresh webviews",async()=>{await this.refreshWebviewsManually("no matching webview during getActiveWebview");}),r=await n()),r.length>1)throw new M("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");let o=r[0];if(!o)return;if(this.hasUsableWebviewBrowser(o)||(this.logger.warn({contextId:o.contextId,packageName:o.packageName},"Active webview browser is unhealthy, reconstructing"),await this.reconstructWebviewBrowser(o,"active webview page or target crashed"),this.hasUsableWebviewBrowser(o)))return o;if(await me().startAsyncSection("Refresh webviews after browser reconstruction failed",async()=>{await this.refreshWebviewsManually("active webview browser reconstruction failed");}),r=await n(),r.length>1)throw new M("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");let i=r[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 n=await this.driver.executeInNativeContext(this.logger,i=>i.execute("mobile: getCurrentPackage"),{operationName:"reconstructActiveWebviewCurrentPackage"});if(n!==void 0&&typeof n!="string"){this.logger.warn({currentPkg:n},"Unexpected getCurrentPackage result");return}let r=[];for(let i of this.webviews.values())i.packageName===n&&i.active&&r.push(i);if(r.length>1)throw new M("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");let o=r[0];if(o)return await this.reconstructWebviewBrowser(o,e),this.hasUsableWebviewBrowser(o)?o:void 0}hasUsableWebviewBrowser(e){let n=e.browserController;if(!n||!e.active)return false;let r=n.browser;if(r.closed)return false;let o;try{o=r.getActivePage();}catch(i){return this.logger.warn({err:i,contextId:e.contextId},"Failed to resolve active page for webview browser health check"),false}return !o.isClosed()}async reconstructWebviewBrowser(e,n){this.logger.info({contextId:e.contextId,packageName:e.packageName,reason:n},"Reconstructing webview browser"),await this.disconnectPlaywrightFromWebview(e),e.active=false;let r=await this.connectPlaywrightToAvailableWebview(e);r&&(e.browserController=r,e.active=true);}getDeviceSerial(){let e=this.driver.capabilities,n=r=>{if(!e||typeof e!="object")return;let o=e[r];return typeof o=="string"?o:void 0};return n("deviceUDID")||n("udid")||n("appium:udid")||n("appium:deviceUDID")}async executeRawADBCommandWithArgs(e){let n=this.getDeviceSerial();this.logger.info({serial:n,args:e},"Executing ADB command");let r=await Hn(e,{serial:n,timeoutMs:15e3,throwOnError:true});return this.logger.info({result:r},"ADB command result"),r}async executeRawADBCommand(e){let n=this.getDeviceSerial(),r=e.trim().split(/\s+/).filter(i=>i.length>0);this.logger.info({serial:n,cmdArgs:r},"Executing ADB command");let o=await Hn(r,{serial:n,timeoutMs:15e3,throwOnError:true});return this.logger.info({result:o},"ADB command result"),o}async cleanupWebviews(){this.refreshInterval&&(clearInterval(this.refreshInterval),this.refreshInterval=void 0);for(let[e,n]of this.webviews.entries())this.logger.info(`Disconnecting webview ${e}`),this.disconnectPlaywrightFromWebview(n),n.active=false;}async getDetailedContexts(){return await me().startAsyncSpan("EMULATOR_READ_STATE",async()=>{let n=await this.driver.executeInNativeContext(this.logger,o=>o.execute("mobile: getContexts"),{operationName:"getDetailedContexts"});this.aborter.controller?.signal.throwIfAborted();let r;try{r=hee.parse(n);}catch(o){throw new M("InternalWebAgentError",`Failed to parse contexts. Original error:
|
|
5871
5871
|
${o}
|
|
5872
5872
|
Raw: ${JSON.stringify(n)}`)}return r.filter(o=>o.webviewName?!o.info||!o.pages?false:o.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:o},"Webview has no qualified pages, skipping"),false):true)},{name:"Get available contexts",signal:this.aborter.controller?.signal})}async createBrowserController({context:e,page:n}){return await me().startSection("Run remote Chrome initialization",async(o,i)=>{let a={};i.attributes.timings=a;let s=await ub.fromExistingContext({context:e,page:n,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 LC({browser:s,generator:this.fixtures.browserGenerator,logger:this.logger,orgId:this.orgId,storage:this.fixtures.storage,localCodeEvalTools:this.fixtures.localCodeEvalTools,visualDiffScreenshotStorage:new _E})}catch(l){throw await s.cleanup(),l}})}async connectPlaywrightToWebview(e,n){return me().startAsyncSection("Connect headless browser client to webview",async()=>{for(let o=0;o<2;o++)try{let i=await this.connectPlaywrightToWebviewHelper(e,n);return i?{kind:"connected",browserController:i}:{kind:"failed"}}catch(i){if(i instanceof Jf)return {kind:"not_found"};if(this.errorLooksLikeUnattachableWebview(i))return this.logger.info({err:i,packageName:e,socketName:n},"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 n=H(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(r=>n.includes(r))}async connectPlaywrightToAvailableWebview(e){let n=this.webviewConnectionPromises.get(e.contextId);if(n)return this.logger.debug({contextId:e.contextId},"Waiting for existing webview connection attempt"),n;let r=me().startAsyncSection("Connect Playwright to available webview",async()=>await this.connectPlaywrightToAvailableWebviewHelper(e),{signal:this.aborter.controller?.signal}).catch(o=>{this.logger.warn({err:o,contextId:e.contextId},"Failed to connect Playwright to webview, continuing...");});return this.webviewConnectionPromises.set(e.contextId,r),r.finally(()=>{this.webviewConnectionPromises.get(e.contextId)===r&&this.webviewConnectionPromises.delete(e.contextId);}),r}async connectPlaywrightToAvailableWebviewHelper(e){let{contextId:n,packageName:r}=e,o=await this.connectPlaywrightToWebview(r??"",e.socketName);if(o.kind==="connected")return this.logger.info(`Connected Playwright to webview ${n}`),o.browserController;if(r!=="com.android.chrome"||o.kind!=="not_found")return;this.logger.info({webviewInfo:e},`Connecting Playwright to Android Chrome: ${n}`);let i=await this.connectPlaywrightToChrome(e);return i&&this.logger.info(`Connected Playwright to Android Chrome: ${n}`),i}extractSocketNameFromWebview(e,n){if("_socketName"in e&&typeof e._socketName=="string")return e._socketName;if("_data"in e&&e._data?.socketName)return e._data.socketName;n.warn({pkg:e.pkg()},"Could not extract socket name from webview");}async connectPlaywrightToWebviewHelper(e,n){let r=this.device.webViews(),o=r.find(c=>!(c.pkg()!==e&&e!=="com.android.chrome"||this.extractSocketNameFromWebview(c,this.logger)!==n));if(!o)throw this.logger.warn({webviews:r.map(c=>({pkg:c.pkg,name:this.extractSocketNameFromWebview(c,this.logger)}))},"Could not find matching webview in Playwright device list"),new Jf(e,n);let i=await o.page(),a=i.url();if(a===""||a.startsWith("about:blank")||a.startsWith("chrome-error:")){let c=`Webview ${e} with socket ${n} 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 me().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:n,socketName:r}=e,o,i=e.forwardedPort;try{this.logger.info({contextId:n,socketName:r},"Connecting to Chrome webview");let a;if(e.forwardedPort)a=`http://127.0.0.1:${e.forwardedPort}`,this.logger.info({contextId:n,endpoint:a,socketName:r},"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:n,endpoint:a,socketName:r},`Forwarding DevTools socket for ${e.socketName}`);}this.logger.info({endpoint:a,socketName:r},"Connecting to CDP endpoint"),o=await chromium.connectOverCDP({endpointURL:a,timeout:8e3});let s=o.contexts()[0];if(!s){this.logger.warn("No browser context available after CDP connection"),await o.close(),o=void 0;return}let l=await this.createBrowserController({context:s});return i=void 0,o=void 0,l}catch(a){this.logger.warn({err:a},`Error connecting Playwright to webview ${e.contextId}, continuing...`);return}finally{if(o)try{await o.close();}catch(a){this.logger.warn({err:a,contextId:n},"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:n,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(n){this.logger.error({err:n},`Error disconnecting Playwright from webview ${e.contextId}:`);}finally{e.browserController=void 0;}if(e.forwardedPort)try{await this.removeDevToolsForwarding(e.forwardedPort);}catch(n){this.logger.error({err:n},`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 n=1e4+Math.floor(Math.random()*1e4),r=this.getDeviceSerial();this.logger.info({deviceId:r},`Device ID from capabilities: ${r||"not found"}`);let o=e&&e.trim().length>0?`localabstract:${e}`:"localabstract:chrome_devtools_remote";return await this.executeRawADBCommand(`forward tcp:${n} ${o}`),this.logger.info(`Successfully forwarded DevTools socket to port ${n}`),n}async removeDevToolsForwarding(e){await this.executeRawADBCommand(`forward --remove tcp:${e}`),this.logger.info("Successfully removed port forwarding");}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted();}};var $c=class t extends Nn{appsWithGrantedPermissions=new Set;parseInstalledPackageLines(e){return e?.split(`
|
|
5873
5873
|
`).filter(n=>n.trim().startsWith("package:")).map(n=>n.replace("package:","").trim()).filter(n=>n.length>0&&!n.startsWith("io.appium"))??[]}constructor(e){super(e);}static async init({driver:e,generator:n,logger:r,fixtures:o,orgId:i,options:a,abortController:s,adbPort:l,limbarClient:c,playwrightDevice:u,aiSettings:d}){let m={controller:s},p=await PA.init({driver:e,logger:r,fixtures:o,orgId:i,limbarClient:c,options:a?.emulator??{},aborter:m,adbPort:l,playwrightDevice:u}),f=new t({driver:e,generator:n,stateManager:p,logger:r,fixtures:o,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 ${mn__default.resolve(e)}`);}async isPackageInstalled(e){let n=await this.executeRawADBCommand(`shell pm list packages ${e}`);return this.parseInstalledPackageLines(n).includes(e)}async getInstalledApps(){let[e,n]=await Promise.all([this.executeRawADBCommand("shell pm list packages -3"),this.executeRawADBCommand("shell pm list packages")]),r=this.parseInstalledPackageLines(e).sort((a,s)=>a.localeCompare(s)),i=this.parseInstalledPackageLines(n).filter(a=>!r.includes(a)&&!LO(a)).sort((a,s)=>a.localeCompare(s));return {installedApps:r,prunedApps:i}}async executeCommand(e){let n=["type","a11yData","thoughts","cache","code"],r;try{r=await gp({obj:e.command,context:this.fixtures.testContext,bannedKeys:n,orgId:this.orgId,logger:this.logger,signal:this.abortSignal,localTools:this.fixtures.localCodeEvalTools});}catch(o){throw this.throwIfAborted(),new M("UserConfigurationError",`Failed to substitute template strings in command: ${o.message}`,{errOptions:{cause:o}})}try{return await this.executeCommandHelper(e)}catch(o){throw o.name!=="AbortError"&&this.logger.error({err:o},"Error thrown in action controller"),o}finally{bp(e.command,r);}}async executeCommandHelper({command:e}){let n=me();switch(e.type){case "TAP":return new Xp(this.constructPerformerParams()).executeTap({command:e});case "TYPE":return await new EA(this.constructPerformerParams()).doType(e);case "AI_CHECK":{let r=this.shouldUseMemoryForCommand(e),o=15,i=e.timeoutSecs?e.timeoutSecs*1e3:5e3,a=ov(i),s=Date.now(),l=0,c,u=false,d;for(;l<o&&!u;){this.throwIfAborted(),u||c&&c-s>=i&&(u=true),l!==0&&await fe(a,this.abortSignal),c=Date.now();try{let m="",p="";await n.startAsyncSpan("EMULATOR_READ_STATE",async()=>{m=await this.getEmulatorDomState(),p=await this.getScreenshotBase64();},{name:"Get emulator state"});let f=await n.startAsyncSpan("AI_ASSERTION_CALL",async h=>{let b=await this.generator.evaluateAndroidAssertion({assertion:e.assertion,screenXml:m,screenshot:p,memory:r?e.cache?.memory:void 0},{logger:this.logger,loggerTags:De(this.logger),agentConfigVersion:this.aiSettings.agentConfig?.["android-assertion"],useMemory:r});return h.result={thoughts:b.thoughts,result:b.result},b});if(r&&f.updatedMemory){let h={type:"GCS_TRACES",traces:f.updatedMemory};e.cache={...e.cache??{},memory:h};}if(f.result)return {success:f.result,message:f.thoughts};{let h=`AssertionFailureError: ${f.thoughts}`;d=new Error(h);}}catch(m){this.throwIfAborted(),this.logger.info({err:m},`AI check assert attempt ${l} failed, retrying...`),d=m instanceof Error?m:new Error(`${m}`);}finally{l++;}}return {success:false,message:d?.message}}case "AI_EXTRACT":return uee({command:e,logger:this.logger,generator:this.generator,aiSettings:this.aiSettings,getEmulatorDomState:()=>this.getEmulatorDomState(),getScreenshotBase64:()=>this.getScreenshotBase64(),abortSignal:this.abortSignal});case "SWIPE":return new Jp(this.constructPerformerParams()).executeSwipe(e);case "SCREEN_CHECK":return new xA(this.constructPerformerParams()).executeScreenCheck(e);case "ELEMENT_CHECK":return await new RA(this.constructPerformerParams()).executeElementCheck(e);case "DRAG_AND_DROP":return await new CA(this.constructPerformerParams()).executeDragAndDrop({command:e});case "SCROLL_TO":return new TA(this.constructPerformerParams()).executeScrollTo(e);case "JAVASCRIPT":{let r;try{r=await Fi({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(o){throw new M("ActionFailureError",o instanceof M?o.message:`${o}`,{errOptions:{cause:o}})}try{JSON.stringify(r);}catch(o){throw new M("UserConfigurationError",`Return value is not serializable: ${o instanceof Error?o.message:`${o}`}`)}return {success:true,output:r}}case "REQUEST":{let r;try{r=new URL(e.url).hostname;}catch(c){throw new M("UserConfigurationError",`Invalid URL: ${c instanceof Error?c.message:`${c}`}`)}let o=new CookieJar,i=uIe(fetch,o),a=Date.now(),s=await vp({command:e,baseUrl:void 0,logger:this.logger,fetchImplementation:i}),l=rm(o,r);return {output:Pd.parse({...s,cookies:l}),success:true,message:`Successfully executed request in ${Date.now()-a}ms`}}case "OPEN_NOTIFICATION_DRAWER":return await new zc(this.constructPerformerParams()).doPress({keycode:83}),{success:true};case "OPEN_APP":{let r=e.activityName,o=["-a","android.intent.action.MAIN","-c","android.intent.category.LAUNCHER"];if(!r){let a=["resolve-activity","--brief",...o,e.packageName],s=await te(this.driver.executeInNativeContext(this.logger,l=>l.execute("mobile: shell",{command:"pm",args:a}),{operationName:"resolveMainActivity"}),{signal:this.abortSignal,milliseconds:1e4});if(typeof s!="string")throw new M("UserConfigurationError",`Could not find main activity name for package ${e.packageName}. Unexpected output: ${s}`);if(s.includes("No activity found"))throw await this.isPackageInstalled(e.packageName)?new M("UserConfigurationError",`App ${e.packageName} is installed but has no launchable MAIN/LAUNCHER activity. Set an explicit "activityName" on the Open App step.`):new M("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=s.trim().split(`
|
|
5874
|
-
`).pop()?.replace(/^.*\//,""),!r)throw new M("UserConfigurationError",`Could not parse main activity name for package ${e.packageName}. Raw output: ${s}`)}if(this.options?.emulator?.autoGrantPermissions&&!this.appsWithGrantedPermissions.has(e.packageName)){let a={permissions:"all",appPackage:e.packageName,action:"grant"};await this.driver.executeInNativeContext(this.logger,s=>s.executeScript("mobile: changePermissions",[a]),{operationName:"changePermissions"}),this.appsWithGrantedPermissions.add(e.packageName);}let i=["start",...o,"-f","0x10200000"];if(e.intentExtras)try{let a=JSON.parse(e.intentExtras);for(let[s,l]of Object.entries(a))i.push("-e",s,typeof l=="string"?l:JSON.stringify(l));}catch(a){throw new M("UserConfigurationError",`Invalid intent extras does not parse as valid JSON: ${a instanceof Error?a.message:`${a}`}`)}return i.push("-n",`${e.packageName}/${r}`),await this.driver.executeInNativeContext(this.logger,a=>a.execute("mobile: shell",{command:"am",args:i}),{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 zc(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 zc(this.constructPerformerParams()),o=i=>r.doPress({keycode:i});switch(e.key){case "CLOSE_KEYBOARD":{let i=Date.now();for(;Date.now()-i<2e3&&(await this.driver.executeInNativeContext(this.logger,s=>s.hideKeyboard(),{operationName:"hideKeyboard"}),!!await this.driver.executeInNativeContext(this.logger,s=>s.isKeyboardShown(),{operationName:"isKeyboardShown"})););break}case "ENTER":await o(66);break;case "BACKSPACE":await o(67);break;}return {success:true}}case "WAIT":return await fe(e.timeoutSecs*1e3,this.aborter.controller?.signal),{success:true};case "INSTALL_APP":return new vA(this.constructPerformerParams()).doInstallApk(e);case "UNINSTALL_APP":return new MA(this.constructPerformerParams()).doUninstallApk(e);case "ADD_FILE":{let r=await nC(e.file);return await this.driver.executeInNativeContext(this.logger,async o=>{await o.pushFile(e.storageLocation,r),await o.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 M("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(a){throw new M("UserConfigurationError",`Invalid JSON for ADB command arguments: ${a instanceof Error?a.message:`${a}`}`)}let o=v__default.string().array().safeParse(r);if(!o.success)throw new M("UserConfigurationError",`Invalid ADB command arguments: ${o.error.message}`);let i=await this.executeRawADBCommandWithArgs([e.command,...o.data]);return this.logger.info({output:i},"ADB command executed successfully"),{success:true,output:i,message:"ADB command executed successfully"}}case "APPIUM_EXECUTE":{let r=JSON.parse(e.jsonArgs??"{}"),o=await this.driver.executeInNativeContext(this.logger,async i=>i.execute(e.command,r),{attemptTimeoutMs:6e4,maxAttempts:1,operationName:"userAppiumExecuteOperation"});return this.logger.info({output:o},"Appium command executed successfully"),{success:true,output:o,message:"Appium command executed successfully"}}case "KILL_APP":{let r=await this.stateManager.getCurrentPackage();if(!r)throw new M("UserConfigurationError","No package is currently active");await this.driver.executeInNativeContext(this.logger,async o=>{await o.execute("mobile: shell",{command:"input",args:["keyevent","KEYCODE_HOME"]}),await o.terminateApp(r);},{operationName:"killApp"});try{await AY({packageName:r,driver:this.driver,abortSignal:this.abortSignal,logger:this.logger});}catch(o){this.throwIfAborted(),this.logger.warn({err:o,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(),o=await this.stateManager.getContexts(),i={xml:r.graph.xml,contexts:o};return this.logger.info({result:i},"State debug command output"),{output:i,success:true}}default:{return {success:true}}}}async initializeSettings(){let{latitude:e,longitude:n}=this.options?.emulator?.geolocation??Bd;await this.driver.executeInNativeContext(this.logger,r=>r.execute("mobile: setGeolocation",{latitude:e,longitude:n}),{operationName:"setGeolocation"}),await Promise.all([this.driver.executeInNativeContext(this.logger,r=>r.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_COARSE_LOCATION"]}),{operationName:"grantCoarseLocationPermission"}),this.driver.executeInNativeContext(this.logger,r=>r.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_FINE_LOCATION"]}),{operationName:"grantFineLocationPermission"}),this.driver.executeInNativeContext(this.logger,r=>r.updateSettings({keyInjectionDelay:hd}),{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 xY(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:De(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 eze=new VT(30,60*1e3),M0="https://api.momentic.ai",_A,bee,ef=t=>{M0=t;},vy=()=>M0;var LA=t=>{bee=t;},Ts=()=>bee,Wt=()=>_A;var Ty,x0,yee,See,Eee,OA,Tee,vee=({authInfo:t,apiKey:e,apiClient:n})=>{_A=n,Ty=t.orgId,x0=t.userId,yee=t.email,See=t.name,Eee=t.pylonEmailHash,OA=e,Tee=t.selfServe;},P0=async({apiClient:t,apiKey:e,skipPrompts:n})=>{let r=await Jg({client:t});return vee({authInfo:r,apiKey:e,apiClient:t}),r},Cee=async t=>{if(_A&&Ty&&OA)return Ty;let e=new bn({baseUrl:M0,apiKey:t,logger:P});_A=e;try{let n=await e.getAuthInfo();return vee({authInfo:n,apiKey:t,apiClient:e}),n.orgId}catch(n){throw new Error(`Error checking API key against server: ${n}`,{cause:n})}},nr=()=>{if(!Ty)throw new Error("Your organization ID is invalid.");return Ty},gd=()=>{if(!x0)throw new Error("Your user ID is invalid.");return x0};var kA=()=>yee,wee=()=>See,Aee=()=>Eee,FA=()=>Tee,Ree=()=>{if(!OA)throw new Error("Your API key is invalid.");return OA},DA,NA,Vc=()=>{NA?.abort(),NA=void 0;},BA=(t,e)=>{DA=t,Vc(),NA=new AbortController;let n=NA.signal,r=[t.configFilePath];t.config.environments?.forEach(o=>{if(!o.envFile)return;let i=mn__default.resolve(t.rootDir,o.envFile);try{if(br.lstatSync(i).isSymbolicLink())return;br.existsSync(i)&&r.push(i);}catch(a){P.warn({err:a},`Failed to check if env file ${i} exists`);}});try{tze({filesToWatch:r,revalidator:e,signal:n,project:t});}catch(o){P.error({err:o},"Failed to start config file watchers");}};var yt=()=>{if(!DA)throw new Ye("No Momentic project is currently loaded. Open or select a project before invoking this action.");return DA};function tze({filesToWatch:t,revalidator:e,signal:n,project:r}){P.debug("Starting watch on the following files:"),t.forEach(o=>{P.debug(`- ${o}`);}),t.forEach(o=>{let i=async(s,l)=>{s.mtime.getTime()!==l.mtime.getTime()&&(eze.increment("setLocalProject")&&P.warn(`A file change under the ${r.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),DA=await Promise.resolve(e(r.configFilePath)));};br.watchFile(o,{persistent:false},i);let a=()=>{br.unwatchFile(o,i),n.removeEventListener("abort",a);};n.addEventListener("abort",a);});}function Ve(t){return function(...e){let n=e[e.length-1],r=t(...e);Promise.resolve(r).catch(n);}}var rze="0.111.0",bd=xm({app:"desktop-server",hostname:hostname(),disableConsoleLogs:true}).child({cliVersion:rze});(async()=>{try{let t=await $g(bd);t.gitBranchName&&bd.addBinding("branch",t.gitBranchName);}catch{}})();var xee=Router();xee.get("/",async(t,e)=>{let n=yt(),r=Wt();if(!r){e.status(500).json({message:"API client not initialized"});return}let o=await gn(bd,r,n),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=Ts(),l=!a&&(s||!i);e.status(200).json({saveCaches:l,checkedOutBranch:o?.gitBranchName});});var I0=xee;var aze=5e3,sze=[".js",".mjs",".cjs",".ts"];function _0(t={}){let e=Router();function n(){let d=yt();return mn__default.dirname(d.configFilePath)}function r(d){return mn__default.join(n(),...d)}function o(d){let m=mn__default.relative(n(),d);return m?m.split(mn__default.sep):[]}function i(d,m){let p=br.statSync(d),f=o(d);return nP.parse({name:m,absolutePath:d,relativePath:f.join(mn__default.sep),pathSegments:f,isDirectory:p.isDirectory(),size:p.size,createdAt:p.birthtime,modifiedAt:p.mtime,accessedAt:p.atime})}function a(d){let m=mn__default.relative(n(),d);return m===""||!m.startsWith("..")&&!mn__default.isAbsolute(m)}async function s(d){let m=yt();return Nu(["*"],{cwd:d,ignore:m.config.exclude??[],maxDepth:1,nodir:false,signal:AbortSignal.timeout(aze)})}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=mn__default.relative(d,m).split(mn__default.sep).join("/");return p?f?`${f}/`:"./":f}return e.post("/file-reference-suggestions",Ve(async(d,m,p)=>{let f=w1.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:b}=f.data,y=new Set((f.data.allowedExtensions??sze).map(A=>A.toLowerCase())),S=l(b);if(S.directoryText.startsWith("/")){m.status(200).json({suggestions:[]});return}let T=mn__default.resolve(n(),...c(h)),C=mn__default.resolve(T,...c(S.directoryText));if(!a(T)||!a(C)){m.status(200).json({suggestions:[]});return}if(!br.existsSync(C)||!br.statSync(C).isDirectory()){m.status(200).json({suggestions:[]});return}let w;try{w=await s(C);}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 _=w.map(A=>{let z=mn__default.join(C,A);return {entryName:A,targetPath:z,isDirectory:br.statSync(z).isDirectory()}}),N=S.filePrefix.toLowerCase(),I=_.filter(A=>A.entryName.startsWith(".")||!A.entryName.toLowerCase().startsWith(N)?false:A.isDirectory?true:y.has(mn__default.extname(A.entryName).toLowerCase())).sort((A,z)=>A.isDirectory!==z.isDirectory?A.isDirectory?-1:1:A.entryName.localeCompare(z.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("/",Ve(async(d,m,p)=>{let f;try{f=C1.parse(d.body).pathSegments;}catch(C){m.status(400).json({error:`Failed to parse folder read body: ${C}`});return}let h=r(f);if(!br.existsSync(h)){m.status(404).json({error:`Path not found: ${f.join(mn__default.sep)}`});return}if(!br.statSync(h).isDirectory()){m.status(400).json({error:`Path is not a directory: ${f.join(mn__default.sep)}`});return}let y;try{y=await s(h);}catch(C){if(C instanceof Error&&C.name==="TimeoutError"){m.status(408).json({error:"Folder listing timed out. This directory may contain too many files."});return}throw C}let S=y.map(C=>{let w=mn__default.join(h,C);return i(w,C)});if(t.allowedFileTypes){let C=new Set(t.allowedFileTypes);S=(await Promise.all(S.map(async w=>{if(w.isDirectory||!(w.name.endsWith(".test.yaml")||w.name.endsWith(".module.yaml")))return w;let N=await lze(w.absolutePath);return N!==void 0&&C.has(N)?w:null}))).filter(w=>w!==null);}let T={absolutePath:h,pathSegments:f,contents:S};m.status(200).json(T);})),e.put("/",Ve(async(d,m,p)=>{let f;try{f=A1.parse(d.body).pathSegments;}catch(y){m.status(400).json({error:`Failed to parse folder create body: ${y}`});return}let h=r(f);if(br.existsSync(h)){m.status(200).json({success:true,message:`Folder already exists: ${f.join(mn__default.sep)}`,pathSegments:f});return}br.mkdirSync(h,{recursive:true});let b={success:true,message:`Folder created: ${f.join(mn__default.sep)}`,pathSegments:f};m.status(201).json(b);})),e.patch("/",Ve(async(d,m,p)=>{let f,h;try{let C=R1.parse(d.body);f=C.pathSegments,h=C.newPathSegments;}catch(C){m.status(400).json({error:`Failed to parse folder update body: ${C}`});return}let b=r(f),y=r(h);if(!br.existsSync(b)){m.status(400).json({error:`Folder not found: ${f.join(mn__default.sep)}`});return}if(br.existsSync(y)){m.status(400).json({error:`Destination already exists: ${h.join(mn__default.sep)}`});return}let S=mn__default.dirname(y);br.existsSync(S)||br.mkdirSync(S,{recursive:true}),br.renameSync(b,y);let T={success:true,message:`Folder moved from ${f.join(mn__default.sep)} to ${h.join(mn__default.sep)}`,pathSegments:h};m.status(200).json(T);})),e.delete("/",Ve(async(d,m,p)=>{let f,h=true;try{let T=x1.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 b=r(f);if(!br.existsSync(b)){m.status(200).json({success:true,message:`Folder not found: ${f.join(mn__default.sep)}`,pathSegments:f});return}if(!br.statSync(b).isDirectory()){m.status(400).json({error:`Path is not a directory: ${f.join(mn__default.sep)}`});return}try{if(h)br.rmSync(b,{recursive:!0,force:!0});else {if(br.readdirSync(b).length>0){m.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${f.join("/")}`});return}br.rmdirSync(b);}}catch(T){let{status:C,body:w}=i5(T,`delete folder ${f.join("/")}`);m.status(C).json(w);return}let S={success:true,message:`Folder deleted: ${f.join("/")}`,pathSegments:f};m.status(200).json(S);})),e}async function lze(t){try{let e=await br.promises.open(t,"r");try{let n=Buffer.alloc(4096),{bytesRead:r}=await e.read(n,0,n.length,0);return n.toString("utf-8",0,r).match(/^fileType:\s*(.+)$/m)?.[1]?.trim()}finally{await e.close();}}catch{}}var Mee=Router();Mee.get("/",async(t,e)=>{let n=yt(),r=Wt();if(!r){e.status(500).json({message:"API client not initialized"});return}let o=await gn(bd,r,n);e.status(200).json(o);});var O0=Mee;var UA=class t extends hc{static async init(e){let n=await hc.connectAppium(e);return new t(n)}async executeWebViewScript(e,n,r,...o){let i=await this.executeInContext(e,n,async a=>{let s=new Function("...args",`${ab.safariUtilsLibJs};
|
|
5874
|
+
`).pop()?.replace(/^.*\//,""),!r)throw new M("UserConfigurationError",`Could not parse main activity name for package ${e.packageName}. Raw output: ${s}`)}if(this.options?.emulator?.autoGrantPermissions&&!this.appsWithGrantedPermissions.has(e.packageName)){let a={permissions:"all",appPackage:e.packageName,action:"grant"};await this.driver.executeInNativeContext(this.logger,s=>s.executeScript("mobile: changePermissions",[a]),{operationName:"changePermissions"}),this.appsWithGrantedPermissions.add(e.packageName);}let i=["start",...o,"-f","0x10200000"];if(e.intentExtras)try{let a=JSON.parse(e.intentExtras);for(let[s,l]of Object.entries(a))i.push("-e",s,typeof l=="string"?l:JSON.stringify(l));}catch(a){throw new M("UserConfigurationError",`Invalid intent extras does not parse as valid JSON: ${a instanceof Error?a.message:`${a}`}`)}return i.push("-n",`${e.packageName}/${r}`),await this.driver.executeInNativeContext(this.logger,a=>a.execute("mobile: shell",{command:"am",args:i}),{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 zc(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 zc(this.constructPerformerParams()),o=i=>r.doPress({keycode:i});switch(e.key){case "CLOSE_KEYBOARD":{let i=Date.now();for(;Date.now()-i<2e3&&(await this.driver.executeInNativeContext(this.logger,s=>s.hideKeyboard(),{operationName:"hideKeyboard"}),!!await this.driver.executeInNativeContext(this.logger,s=>s.isKeyboardShown(),{operationName:"isKeyboardShown"})););break}case "ENTER":await o(66);break;case "BACKSPACE":await o(67);break;}return {success:true}}case "WAIT":return await fe(e.timeoutSecs*1e3,this.aborter.controller?.signal),{success:true};case "INSTALL_APP":return new vA(this.constructPerformerParams()).doInstallApk(e);case "UNINSTALL_APP":return new MA(this.constructPerformerParams()).doUninstallApk(e);case "ADD_FILE":{let r=await nC(e.file);return await this.driver.executeInNativeContext(this.logger,async o=>{await o.pushFile(e.storageLocation,r),await o.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 M("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(a){throw new M("UserConfigurationError",`Invalid JSON for ADB command arguments: ${a instanceof Error?a.message:`${a}`}`)}let o=v__default.string().array().safeParse(r);if(!o.success)throw new M("UserConfigurationError",`Invalid ADB command arguments: ${o.error.message}`);let i=await this.executeRawADBCommandWithArgs([e.command,...o.data]);return this.logger.info({output:i},"ADB command executed successfully"),{success:true,output:i,message:"ADB command executed successfully"}}case "APPIUM_EXECUTE":{let r=JSON.parse(e.jsonArgs??"{}"),o=await this.driver.executeInNativeContext(this.logger,async i=>i.execute(e.command,r),{attemptTimeoutMs:6e4,maxAttempts:1,operationName:"userAppiumExecuteOperation"});return this.logger.info({output:o},"Appium command executed successfully"),{success:true,output:o,message:"Appium command executed successfully"}}case "KILL_APP":{let r=await this.stateManager.getCurrentPackage();if(!r)throw new M("UserConfigurationError","No package is currently active");await this.driver.executeInNativeContext(this.logger,async o=>{await o.execute("mobile: shell",{command:"input",args:["keyevent","KEYCODE_HOME"]}),await o.terminateApp(r);},{operationName:"killApp"});try{await AY({packageName:r,driver:this.driver,abortSignal:this.abortSignal,logger:this.logger});}catch(o){this.throwIfAborted(),this.logger.warn({err:o,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(),o=await this.stateManager.getContexts(),i={xml:r.graph.xml,contexts:o};return this.logger.info({result:i},"State debug command output"),{output:i,success:true}}default:{return {success:true}}}}async initializeSettings(){let{latitude:e,longitude:n}=this.options?.emulator?.geolocation??Bd;await this.driver.executeInNativeContext(this.logger,r=>r.execute("mobile: setGeolocation",{latitude:e,longitude:n}),{operationName:"setGeolocation"}),await Promise.all([this.driver.executeInNativeContext(this.logger,r=>r.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_COARSE_LOCATION"]}),{operationName:"grantCoarseLocationPermission"}),this.driver.executeInNativeContext(this.logger,r=>r.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_FINE_LOCATION"]}),{operationName:"grantFineLocationPermission"}),this.driver.executeInNativeContext(this.logger,r=>r.updateSettings({keyInjectionDelay:hd}),{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 xY(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:De(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 eze=new VT(30,60*1e3),M0="https://api.momentic.ai",_A,bee,ef=t=>{M0=t;},vy=()=>M0;var LA=t=>{bee=t;},Ts=()=>bee,Wt=()=>_A;var Ty,x0,yee,See,Eee,OA,Tee,vee=({authInfo:t,apiKey:e,apiClient:n})=>{_A=n,Ty=t.orgId,x0=t.userId,yee=t.email,See=t.name,Eee=t.pylonEmailHash,OA=e,Tee=t.selfServe;},P0=async({apiClient:t,apiKey:e,skipPrompts:n})=>{let r=await Jg({client:t});return vee({authInfo:r,apiKey:e,apiClient:t}),r},Cee=async t=>{if(_A&&Ty&&OA)return Ty;let e=new bn({baseUrl:M0,apiKey:t,logger:P});_A=e;try{let n=await e.getAuthInfo();return vee({authInfo:n,apiKey:t,apiClient:e}),n.orgId}catch(n){throw new Error(`Error checking API key against server: ${n}`,{cause:n})}},nr=()=>{if(!Ty)throw new Error("Your organization ID is invalid.");return Ty},gd=()=>{if(!x0)throw new Error("Your user ID is invalid.");return x0};var kA=()=>yee,wee=()=>See,Aee=()=>Eee,FA=()=>Tee,Ree=()=>{if(!OA)throw new Error("Your API key is invalid.");return OA},DA,NA,Vc=()=>{NA?.abort(),NA=void 0;},BA=(t,e)=>{DA=t,Vc(),NA=new AbortController;let n=NA.signal,r=[t.configFilePath];t.config.environments?.forEach(o=>{if(!o.envFile)return;let i=mn__default.resolve(t.rootDir,o.envFile);try{if(br.lstatSync(i).isSymbolicLink())return;br.existsSync(i)&&r.push(i);}catch(a){P.warn({err:a},`Failed to check if env file ${i} exists`);}});try{tze({filesToWatch:r,revalidator:e,signal:n,project:t});}catch(o){P.error({err:o},"Failed to start config file watchers");}};var yt=()=>{if(!DA)throw new Ye("No Momentic project is currently loaded. Open or select a project before invoking this action.");return DA};function tze({filesToWatch:t,revalidator:e,signal:n,project:r}){P.debug("Starting watch on the following files:"),t.forEach(o=>{P.debug(`- ${o}`);}),t.forEach(o=>{let i=async(s,l)=>{s.mtime.getTime()!==l.mtime.getTime()&&(eze.increment("setLocalProject")&&P.warn(`A file change under the ${r.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),DA=await Promise.resolve(e(r.configFilePath)));};br.watchFile(o,{persistent:false},i);let a=()=>{br.unwatchFile(o,i),n.removeEventListener("abort",a);};n.addEventListener("abort",a);});}function Ve(t){return function(...e){let n=e[e.length-1],r=t(...e);Promise.resolve(r).catch(n);}}var rze="0.111.1",bd=xm({app:"desktop-server",hostname:hostname(),disableConsoleLogs:true}).child({cliVersion:rze});(async()=>{try{let t=await $g(bd);t.gitBranchName&&bd.addBinding("branch",t.gitBranchName);}catch{}})();var xee=Router();xee.get("/",async(t,e)=>{let n=yt(),r=Wt();if(!r){e.status(500).json({message:"API client not initialized"});return}let o=await gn(bd,r,n),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=Ts(),l=!a&&(s||!i);e.status(200).json({saveCaches:l,checkedOutBranch:o?.gitBranchName});});var I0=xee;var aze=5e3,sze=[".js",".mjs",".cjs",".ts"];function _0(t={}){let e=Router();function n(){let d=yt();return mn__default.dirname(d.configFilePath)}function r(d){return mn__default.join(n(),...d)}function o(d){let m=mn__default.relative(n(),d);return m?m.split(mn__default.sep):[]}function i(d,m){let p=br.statSync(d),f=o(d);return nP.parse({name:m,absolutePath:d,relativePath:f.join(mn__default.sep),pathSegments:f,isDirectory:p.isDirectory(),size:p.size,createdAt:p.birthtime,modifiedAt:p.mtime,accessedAt:p.atime})}function a(d){let m=mn__default.relative(n(),d);return m===""||!m.startsWith("..")&&!mn__default.isAbsolute(m)}async function s(d){let m=yt();return Nu(["*"],{cwd:d,ignore:m.config.exclude??[],maxDepth:1,nodir:false,signal:AbortSignal.timeout(aze)})}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=mn__default.relative(d,m).split(mn__default.sep).join("/");return p?f?`${f}/`:"./":f}return e.post("/file-reference-suggestions",Ve(async(d,m,p)=>{let f=w1.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:b}=f.data,y=new Set((f.data.allowedExtensions??sze).map(A=>A.toLowerCase())),S=l(b);if(S.directoryText.startsWith("/")){m.status(200).json({suggestions:[]});return}let T=mn__default.resolve(n(),...c(h)),C=mn__default.resolve(T,...c(S.directoryText));if(!a(T)||!a(C)){m.status(200).json({suggestions:[]});return}if(!br.existsSync(C)||!br.statSync(C).isDirectory()){m.status(200).json({suggestions:[]});return}let w;try{w=await s(C);}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 _=w.map(A=>{let z=mn__default.join(C,A);return {entryName:A,targetPath:z,isDirectory:br.statSync(z).isDirectory()}}),N=S.filePrefix.toLowerCase(),I=_.filter(A=>A.entryName.startsWith(".")||!A.entryName.toLowerCase().startsWith(N)?false:A.isDirectory?true:y.has(mn__default.extname(A.entryName).toLowerCase())).sort((A,z)=>A.isDirectory!==z.isDirectory?A.isDirectory?-1:1:A.entryName.localeCompare(z.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("/",Ve(async(d,m,p)=>{let f;try{f=C1.parse(d.body).pathSegments;}catch(C){m.status(400).json({error:`Failed to parse folder read body: ${C}`});return}let h=r(f);if(!br.existsSync(h)){m.status(404).json({error:`Path not found: ${f.join(mn__default.sep)}`});return}if(!br.statSync(h).isDirectory()){m.status(400).json({error:`Path is not a directory: ${f.join(mn__default.sep)}`});return}let y;try{y=await s(h);}catch(C){if(C instanceof Error&&C.name==="TimeoutError"){m.status(408).json({error:"Folder listing timed out. This directory may contain too many files."});return}throw C}let S=y.map(C=>{let w=mn__default.join(h,C);return i(w,C)});if(t.allowedFileTypes){let C=new Set(t.allowedFileTypes);S=(await Promise.all(S.map(async w=>{if(w.isDirectory||!(w.name.endsWith(".test.yaml")||w.name.endsWith(".module.yaml")))return w;let N=await lze(w.absolutePath);return N!==void 0&&C.has(N)?w:null}))).filter(w=>w!==null);}let T={absolutePath:h,pathSegments:f,contents:S};m.status(200).json(T);})),e.put("/",Ve(async(d,m,p)=>{let f;try{f=A1.parse(d.body).pathSegments;}catch(y){m.status(400).json({error:`Failed to parse folder create body: ${y}`});return}let h=r(f);if(br.existsSync(h)){m.status(200).json({success:true,message:`Folder already exists: ${f.join(mn__default.sep)}`,pathSegments:f});return}br.mkdirSync(h,{recursive:true});let b={success:true,message:`Folder created: ${f.join(mn__default.sep)}`,pathSegments:f};m.status(201).json(b);})),e.patch("/",Ve(async(d,m,p)=>{let f,h;try{let C=R1.parse(d.body);f=C.pathSegments,h=C.newPathSegments;}catch(C){m.status(400).json({error:`Failed to parse folder update body: ${C}`});return}let b=r(f),y=r(h);if(!br.existsSync(b)){m.status(400).json({error:`Folder not found: ${f.join(mn__default.sep)}`});return}if(br.existsSync(y)){m.status(400).json({error:`Destination already exists: ${h.join(mn__default.sep)}`});return}let S=mn__default.dirname(y);br.existsSync(S)||br.mkdirSync(S,{recursive:true}),br.renameSync(b,y);let T={success:true,message:`Folder moved from ${f.join(mn__default.sep)} to ${h.join(mn__default.sep)}`,pathSegments:h};m.status(200).json(T);})),e.delete("/",Ve(async(d,m,p)=>{let f,h=true;try{let T=x1.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 b=r(f);if(!br.existsSync(b)){m.status(200).json({success:true,message:`Folder not found: ${f.join(mn__default.sep)}`,pathSegments:f});return}if(!br.statSync(b).isDirectory()){m.status(400).json({error:`Path is not a directory: ${f.join(mn__default.sep)}`});return}try{if(h)br.rmSync(b,{recursive:!0,force:!0});else {if(br.readdirSync(b).length>0){m.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${f.join("/")}`});return}br.rmdirSync(b);}}catch(T){let{status:C,body:w}=i5(T,`delete folder ${f.join("/")}`);m.status(C).json(w);return}let S={success:true,message:`Folder deleted: ${f.join("/")}`,pathSegments:f};m.status(200).json(S);})),e}async function lze(t){try{let e=await br.promises.open(t,"r");try{let n=Buffer.alloc(4096),{bytesRead:r}=await e.read(n,0,n.length,0);return n.toString("utf-8",0,r).match(/^fileType:\s*(.+)$/m)?.[1]?.trim()}finally{await e.close();}}catch{}}var Mee=Router();Mee.get("/",async(t,e)=>{let n=yt(),r=Wt();if(!r){e.status(500).json({message:"API client not initialized"});return}let o=await gn(bd,r,n);e.status(200).json(o);});var O0=Mee;var UA=class t extends hc{static async init(e){let n=await hc.connectAppium(e);return new t(n)}async executeWebViewScript(e,n,r,...o){let i=await this.executeInContext(e,n,async a=>{let s=new Function("...args",`${ab.safariUtilsLibJs};
|
|
5875
5875
|
const userFn = ${r.toString()};
|
|
5876
5876
|
try {
|
|
5877
5877
|
return userFn(momenticFunctions, ...args);
|
|
5878
5878
|
} catch (e) {
|
|
5879
5879
|
return { _failed: true, _error: e.message }
|
|
5880
|
-
}`);return a.execute(s,...o)},{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 Pee({logger:t,driverLogLevel:e="error",emulator:n,callbacks:r}){let{onStatusUpdate:o}=r,i=t.child({emulatorName:n.name}),a={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},...n.extraCapabilities};o("Starting Appium session");let s={capabilities:a},l=await UA.init({logger:i,logLevel:e,callbacks:{...r,restartWda:n.restartWda?async c=>{await n.restartWda?.(c);}:void 0,onFailure:async({err:c,attempt:u})=>{let d=oC(c),m=u<3&&d;return m&&i.warn({err:c},"Appium driver manifest race detected on first attempt, restarting Appium and retrying"),{shouldRetry:m}}},wdioOpts:s});return i.info({capabilities:a,emulatorName:n.name},"Started Appium driver"),l}async function D0({wdaUrl:t,token:e}){try{let n=new AbortController;return setTimeout(()=>n.abort(),3e3),await fetch(t+"/status",{headers:{Authorization:`Bearer ${e}`},signal:n.signal}),!0}catch{return false}}var zA={"appium:waitForIdleTimeout":2,"appium:commandTimeouts":"30000","appium:skipLogCapture":true,"appium:disableAutomaticScreenshots":true,"appium:simpleIsVisibleCheck":true};var fze=["[com.apple.","loadConfigurationForEnvironment"],hze=["com.apple.Accessibility","com.apple.news","com.apple.locationd","NewsToday","NewsTodayIntents","apsd","APSConfiguration","APSOutgoingQueue","APSCourierConnection","APSNetworkMonitor","loadConfigurationForEnvironment"],gze=new Set(["D","Df","Db"]),bze=new Set(["I"]),yze=/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\s+(\S+)\s+/,Sze="https://storage.googleapis.com/mobile-drivers/WebDriverAgentRunner-Build-Sim-arm64-v10.4.5.zip",_ee=6e4,Eze=5e3,Tze=250;function vze(t){let e=yze.exec(t)?.[1];if(!e)return false;let n=fze.some(o=>t.includes(o)),r=hze.some(o=>t.includes(o));return gze.has(e)?n||r:bze.has(e)?r:false}async function Oee({wdaUrl:t,token:e,limbarClient:n,logger:r,onStatusUpdate:o}){if(await D0({wdaUrl:t,token:e}))return;o("Starting WebDriverAgent"),r.debug("WDA is not running on the iOS emulator"),await n.simctl(["launch","booted","com.facebook.WebDriverAgentRunner.xctrunner"]).wait();let i=Date.now()+Eze;do{if(await D0({wdaUrl:t,token:e})){r.debug("WDA launched");return}await fe(Tze);}while(Date.now()<i);throw new Yf("WebDriverAgent did not become reachable after relaunch")}var Cy=class t{apiClient;name;extraCapabilities;limbarToken;limbarWebRtcUrl;limbarApiUrl;limbarWdaUrl;limbarRegion;limbarTag;limbarClient;onStatusUpdate;logStream=void 0;constructor({apiClient:e,limbarToken:n,limbarWebRtcUrl:r,limbarApiUrl:o,limbarWdaUrl:i,limbarRegion:a,limbarTag:s,emulatorName:l,limbarClient:c,onStatusUpdate:u}){this.apiClient=e,this.name=l,this.limbarToken=n,this.limbarWebRtcUrl=r,this.limbarApiUrl=o,this.limbarWdaUrl=i,this.limbarRegion=a,this.limbarTag=s,this.limbarClient=c,this.extraCapabilities={...zA,"appium:automationName":"@limrun/xcuitest","appium:webDriverAgentUrl":this.limbarWdaUrl,"appium:wdaLocalPort":443,"appium:useNewWDA":false,"appium:usePreinstalledWDA":true,"appium:limInstanceApiUrl":o,"appium:limInstanceToken":n,"appium:wdaRequestHeaders":{Authorization:`Bearer ${n}`}},this.onStatusUpdate=u;}static async init(e){let{apiClient:n,logger:r,creationOpts:o,logLevel:i,orgId:a,sessionId:s,onStatusUpdate:l,onConnectionStateChange:c}=e,u=o.appToInstall?.channel,d=o.appToInstall?.tag;l("Creating iOS emulator");let{token:m,webRtcUrl:p,wdaUrl:f,apiUrl:h,id:b,region:y,appDownloadUrl:S,appMd5:T,resolvedTag:C}=await n.createIosEmulator({...o,hostname:hostname(),sessionId:s,installAppOnClient:true});r.info({emulatorName:b,region:y,sessionId:s},"ios instance creation ok"),l("Connecting to iOS emulator");let w;try{w=await Ge.recordDuration({fn:async()=>await te(createInstanceClient({apiUrl:h,token:m,logLevel:i}),{milliseconds:_ee,message:`Timed out after ${_ee}ms connecting to iOS emulator ${b}`}),name:"test_event_duration",tags:["name:limbar-client-creation","clientOs:ios",`orgId:${a}`]}),c&&w.onConnectionStateChange(c),l("Installing WebDriverAgent");let _=w;return await Ge.recordDuration({fn:async()=>{await Dee({limbarClient:_,url:Sze,md5:void 0,logger:r,emulatorName:b,assetLabel:"WebDriverAgent"});},name:"test_event_duration",tags:["name:limbar-wda-install","clientOs:ios",`orgId:${a}`]}),await Oee({wdaUrl:f,token:m,limbarClient:_,logger:r,onStatusUpdate:l}),S&&(l(`Installing iOS app${u?` with channel ${u}`:""}${d?` and tag ${d}`:""}`),await Ge.recordDuration({fn:async()=>{await Dee({limbarClient:_,url:S,md5:T,logger:r,emulatorName:b,assetLabel:"iOS app"});},name:"test_event_duration",tags:["name:limbar-app-install","clientOs:ios",`orgId:${a}`]})),(async()=>{try{let[N,I]=await Promise.allSettled([km("limserver-1.limrun.net"),km("125.253.92.199")]);r.info({limserver:N.status==="fulfilled"?N.value:N.reason,ip125:I.status==="fulfilled"?I.value:I.reason},"Limbar network diagnostics");}catch(N){r.warn({err:N},"Failed to run network diagnostics");}})(),new t({apiClient:n,limbarToken:m,limbarWebRtcUrl:p,limbarApiUrl:h,limbarWdaUrl:f,limbarRegion:y,limbarTag:C??d,emulatorName:b,limbarClient:_,onStatusUpdate:l})}catch(_){throw r.warn({err:_,emulatorName:b},"iOS emulator init failed after creation; cleaning up remote instance"),await Cze({apiClient:n,limbarClient:w,id:b,logger:r}),_}}tap(e,n){return this.limbarClient.tap(e,n)}nativeA11yTreeJson(){return this.limbarClient.elementTreeRaw()}async screenshotPngBase64(){let e=await this.limbarClient.screenshot(),n=Buffer.from(e.base64,"base64"),r=AD.decode(n),o=new PNG({width:r.width,height:r.height});return o.data=Buffer.from(r.data),PNG.sync.write(o).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 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 n=r=>{vze(r)||e(r);};return this.logStream.on("line",n),()=>{this.logStream?.off("line",n);}}async restartWda(e){await Oee({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 Cze(t){let{apiClient:e,limbarClient:n,id:r,logger:o}=t;if(n)try{n.disconnect();}catch(i){o.warn({err:i,emulatorName:r},"Failed to disconnect limbar client during init cleanup");}try{await e.deleteIosEmulator(r);}catch(i){o.warn({err:i,emulatorName:r},"Failed to delete iOS emulator during init cleanup");}}var N0=12e4,$A=6,wze=1e3;async function Dee(t){let{limbarClient:e,url:n,md5:r,logger:o,emulatorName:i,assetLabel:a}=t,s;for(let l=1;l<=$A;l++)try{await te(e.installApp(n,{md5:r,timeoutMs:N0}),{milliseconds:N0,message:`Timed out after ${N0}ms installing ${a} on emulator ${i}`});return}catch(c){if(s=c,l===$A)break;let u=wze*2**(l-1);o.warn({url:n,err:c,emulatorName:i,assetLabel:a,attempt:l,maxAttempts:$A,backoffMs:u},`Failed to install ${a} on Limbar emulator; retrying after backoff`),await fe(u);}throw o.error({url:n,err:s,emulatorName:i,assetLabel:a,maxAttempts:$A},`Failed to install ${a} on Limbar emulator (no more retries)`),new M("UserConfigurationError",`Failed to install ${a} on emulator ${i}: ${s}`)}var Aze=v__default.array(v__default.object({bundle_id:v__default.string(),name:v__default.string()})),jA=class{constructor(e){this.udid=e;}async exec(e,n=[]){return new Promise((r,o)=>{execFile$1("idb",[...e,"--udid",this.udid,...n],(i,a)=>{i?o(i):r(a.trim());});})}async execBuffer(e,n=[]){return new Promise((r,o)=>{execFile$1("idb",[...e,"--udid",this.udid,...n],{encoding:"buffer",maxBuffer:10*1024*1024},(i,a)=>{i?o(i):r(a);});})}async describeDevice(){return this.exec(["describe"])}async tap({x:e,y:n}){await this.exec(["ui","tap"],[Math.round(e).toString(),Math.round(n).toString()]);}async elementTree(){return this.exec(["ui","describe-all"])}async listApps(){let e=await this.exec(["list-apps","--json"]),n=JSON.parse(e);return Aze.parse(n).map(r=>({bundleId:r.bundle_id,name:r.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"],["-"]),n=Buffer.from([137,80,78,71,13,10,26,10]);if(e.length<n.length||!e.subarray(0,n.length).equals(n))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 wy(t){try{return (await new Simctl().getDeviceTypes()).filter(r=>r.includes("iPhone"))}catch(e){return t.warn({err:e},"Got error listing local iPhone device types, returning empty list"),[]}}var Rze=v__default.object({runtimes:v__default.array(v__default.object({version:v__default.string(),name:v__default.string(),isAvailable:v__default.boolean().optional()}))});async function xze(t){try{let e=new Simctl,{stdout:n}=await e.exec("list",{args:["runtimes","-j"]}),{runtimes:r}=Rze.parse(JSON.parse(n)),o=r.filter(i=>i.isAvailable!==!1&&i.name.toLowerCase().startsWith("ios")).map(i=>i.version);return o.length===0?void 0:o.sort((i,a)=>Mze(a,i))[0]}catch(e){t.warn({err:e},"Failed to detect latest installed iOS runtime version");return}}function Mze(t,e){let n=t.split(".").map(Number),r=e.split(".").map(Number);for(let o=0;o<Math.max(n.length,r.length);o++){let i=(n[o]??0)-(r[o]??0);if(i!==0)return i}return 0}var HA=class t{name;extraCapabilities;simctl;idb;constructor({name:e,simctl:n,idb:r}){this.name=e,this.simctl=n,this.idb=r,this.extraCapabilities={...zA,"appium:automationName":"XCUITest","appium:udid":n.udid??void 0};}static async init(e,n){let r=new Simctl,o=n.emulatorName??`momentic-${Date.now()}`,i=await wy(e);if(!i.includes(n.deviceType))throw new M("UserConfigurationError",`Invalid device type: ${n.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=n.iosVersion??await xze(e);if(!a)throw new M("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 r.createDevice(o,n.deviceType,a);r.udid=l,s=async()=>{try{await r.shutdownDevice();}catch{}await r.deleteDevice();},await r.bootDevice(),await r.startBootMonitor({timeout:12e4}),n.appFilePath&&await r.installApp(n.appFilePath);let c=new jA(l);return new t({name:o,simctl:r,idb:c})}catch(l){throw await s?.(),l}}async tap(e,n){await this.idb.tap({x:e,y:n});}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 Pze=5e3;async function nf({creationOpts:t,apiClient:e,logger:n,driverLogLevel:r,orgId:o,sessionId:i,callbacks:a}){let s=Date.now();n.info("Starting ios driver creation");let{onLimbarConnectionStateChange:l,onStatusUpdate:c}=a,u=[],d=async()=>{let p=u.toReversed();for(let f of p)try{await te(f(),{milliseconds:Pze,fallback:()=>{}});}catch(h){if(Pu(h))continue;n.warn({err:h},"Error running cleanup task");}},m;switch(t.type){case "remote":{m=await Cy.init({apiClient:e,logger:n,creationOpts:t,orgId:o,sessionId:i,onStatusUpdate:c,onConnectionStateChange:l,logLevel:r});break}case "local":{m=await HA.init(n,t);break}}u.push(async()=>{await m.close();});try{let p=await Pee({logger:n,driverLogLevel:r,emulatorStart:s,emulator:m,apiClient:e,creationOpts:t,orgId:o,sessionId:i,callbacks:a});return u.push(()=>p.close()),p.executeInNativeContext(n,f=>f.getPageSource(),{operationName:"Warm up Appium cache"}).catch(()=>{}),{driver:p,emulator:m,limbarParams:m instanceof Cy?{token:m.limbarToken,webRtcUrl:m.limbarWebRtcUrl,region:m.limbarRegion,tag:m.limbarTag,osVersion:t.type==="remote"?t.osVersion:void 0}:void 0,cleanup:d}}catch(p){throw await d(),new Error(`Failed to start Appium driver: ${p}`,{cause:p})}}var Oze=100,Dze=2500,Lee=4e3,Nze="...";async function WA({emulator:t,onLogs:e}){if(!t.addSyslogListener)return;let n=create({fetcher:async o=>{e(o);},resolver:()=>{},scheduler:windowedFiniteBatchScheduler({windowMs:Dze,maxBatchSize:Oze})}),r=o=>{let i=o.toString().trim();i.length!==0&&(i.length>Lee&&(i=i.slice(0,Lee)+Nze),n.fetch(i).catch(()=>{}));};return t.addSyslogListener(r)}var kee="NATIVE_APP";var kze=new Set(["id","processId","bundleId","type","accessible","index","x","y","width","height"]),Fze=new Set([]),Bze=new Set(["name","label","traits"]),Uze=new Set(["live-region","drawing-order"]),zze=new Set(["visible","enabled"]);function Fee(t){let e={},n=t.tagName,r=reduce(t.attributes,(o,i)=>(o[i.name]=i.value,o),{});for(let[o,i]of Object.entries(r))kze.has(o)||o==="class"&&n===i||o==="focusable"&&i==="true"&&r.clickable==="true"||Fze.has(o)&&i==="false"||Bze.has(o)&&i===""||zze.has(o)&&i==="true"||Uze.has(o)&&i==="0"||(e[o]=i);return e.name&&e.label&&e.name===e.label&&delete e.label,e.name&&e.value&&e.name===e.value&&delete e.value,e}function ll(t){let e=t.getAttribute("x"),n=t.getAttribute("y"),r=t.getAttribute("width"),o=t.getAttribute("height");if(e===null||n===null||r===null||o===null)return;let i=parseFloat(e),a=parseFloat(n),s=parseFloat(r),l=parseFloat(o);if(!(isNaN(i)||isNaN(a)||isNaN(s)||isNaN(l)))return {x1:i,y1:a,x2:i+s,y2:a+l}}function k0(t,e){let{x1:n,y1:r,x2:o,y2:i}=e;t.setAttribute("bounds",`[${n},${r},${o},${i}]`);}function $ze(t){let e=t.match(/\[([-\d.]+),([-\d.]+),([-\d.]+),([-\d.]+)\]/);if(!e)return;let n=parseFloat(e[1]),r=parseFloat(e[2]),o=parseFloat(e[3]),i=parseFloat(e[4]);if(!(isNaN(n)||isNaN(r)||isNaN(o)||isNaN(i)||o<n||i<r))return {x1:n,y1:r,x2:o,y2:i}}function GA(t){let e=t.getAttribute("bounds");if(e)return $ze(e)}function Bee(t,e){if(!e)return true;let n=ll(t);return n?F0(n,e):true}function F0(t,e){if(!e)return true;let{x1:n,y1:r,x2:o,y2:i}=t;return !(o<e.left||n>e.right||i<e.top||r>e.bottom)}function qA(t){let e=t.cloneNode(true);for(let n of Array.from(e.children)){let r=n;for(let o of Array.from(r.children))r.removeChild(o);}return e.outerHTML}var Uee=new Set(["XCUIElementTypeWebView"]);function Gze(t){if(Uee.has(t.tagName))return true;let e=t.getAttribute("name");if(e&&(e.startsWith("TabDocument")||e.startsWith("BrowserView"))){let n=e.match(/UUID=([A-F0-9-]+)/),r=e.match(/WebViewProcessID=(\d+)/);if(n&&r)return true}return false}function qze(t){return t.startsWith("XCUIElementType")?t.substring(15):t}function zee({state:t,originalElement:e,prunedElement:n,isInWebview:r,idInWebview:o}){let{idCounter:i,idToPrunedElement:a,idToOriginalElement:s,idToIdInWebview:l}=t,c=i.value++;n.setAttribute("id",String(c)),a.set(c,n),r?l.set(c,o):s.set(c,e);}function $ee(t){if(!Uee.has(t.tagName)&&t.tagName==="XCUIElementTypeOther"&&t.hasAttribute("name")&&t.hasAttribute("label"))return t;for(let e of Array.from(t.children)){let n=$ee(e);if(n)return n}}function Kze({webviewNativeRootBounds:t,webviewDocumentRootBounds:e}){let n=t.x1-e.x,r=t.y1-e.y;if(!Number.isFinite(n)||!Number.isFinite(r))return t;let o=t.x2-t.x1,i=t.y2-t.y1;return {x1:n,y1:r,x2:n+o,y2:r+i}}function Vee(t,e,n,r){let{document:o}=n,{parentFrameBounds:i,pruneElementsOutsideBounds:a}=r;if(e.type==="element"){let s=o.createElement(e.role||e.tag);if(e.name&&s.setAttribute("name",e.name),e.description&&s.setAttribute("description",e.description),e.classes&&e.classes.length>0&&s.setAttribute("classes",e.classes.join(" ")),e.attrs)for(let[u,d]of Object.entries(e.attrs))s.setAttribute(u,d);let 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(!F0(c,a))return;k0(s,c),zee({state:n,prunedElement:s,isInWebview:true,idInWebview:e.momenticWebviewElementId}),t.appendChild(s);for(let u of e.children)Vee(s,u,n,r);}else if(e.type==="text"){let s=o.createElement("text");t.appendChild(s);let l=o.createTextNode(e.text);s.appendChild(l);}}function jee(t,e,n,r){let{pruneElementsOutsideBounds:o}=r,{document:i}=n;zee({state:n,originalElement:t,prunedElement:e,isInWebview:false});let a=Fee(t);for(let[c,u]of Object.entries(a))e.setAttribute(c,u);let s=ll(t);if(s&&k0(e,s),Gze(t)){let{removeWebviewContent:c,injectedWebviewContent:u}=r;if(c)return;if(u&&ll(t)){let m=$ee(t),p=m?ll(m):void 0;if(m&&p){n.webviewRootElement=m,n.webviewRootBounds=p,Vee(e,u.root,n,{parentFrameBounds:Kze({webviewNativeRootBounds:p,webviewDocumentRootBounds:u.rootBoundingBox}),pruneElementsOutsideBounds:o});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(!Bee(d,o))continue;let m=i.createElement(qze(d.tagName));jee(d,m,n,r),e.appendChild(m);}}}async function B0(t,e,n){let r=t.parseFromString("<AppiumAUT/>","text/xml"),o=new Map,i=new Map,a=new Map,s={document:r,idToPrunedElement:o,idToOriginalElement:i,idToIdInWebview:a,idCounter:{value:0},webviewRootElement:void 0,webviewRootBounds:void 0},l=r.documentElement;jee(e,l,s,n);let c=new XMLSerializer().serializeToString(r),u=await gUe.format(c,{parser:"xml",plugins:[hUe],printWidth:120,tabWidth:1,singleAttributePerLine:false});return {prunedDocument:r,idToPrunedElement:o,idToOriginalElement:i,idToIdInWebview:a,webviewRootElement:s.webviewRootElement,webviewRootBounds:s.webviewRootBounds,prunedXml:u}}async function Hee(t,e){let n=new DOMParser,r=n.parseFromString(t,"text/xml"),o=r.documentElement;if(!o)throw new Error("No root element found in XML");if(o.tagName!=="AppiumAUT")throw new Error("No AppiumAUT element found in XML");let{prunedXml:i,idToPrunedElement:a,idToOriginalElement:s,idToIdInWebview:l,webviewRootElement:c,webviewRootBounds:u}=await B0(n,o,e);return {xml:i,idToPrunedElement:a,idToOriginalElement:s,idToIdInWebview:l,webviewRootElement:c,webviewRootBounds:u,originalDocument:r}}var Wee=(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))(Wee||{}),Gee=v__default.lazy(()=>v__default.object({AXFrame:v__default.string(),AXUniqueId:v__default.string().nullable(),AXLabel:v__default.string().nullable(),AXValue:v__default.string().nullable(),frame:v__default.object({x:v__default.number(),y:v__default.number(),width:v__default.number(),height:v__default.number()}),role:v__default.string(),role_description:v__default.string(),subrole:v__default.string().nullable(),type:v__default.nativeEnum(Wee),title:v__default.string().nullable(),help:v__default.string().nullable(),content_required:v__default.boolean(),custom_actions:v__default.array(v__default.string()),enabled:v__default.boolean(),children:v__default.array(Gee).default([])}));function Xze(t){return v__default.array(Gee).parse(JSON.parse(t))}async function KA(t,e){let n=new DOMParser,r=Xze(t),o=Jze(n,r),{prunedXml:i,idToPrunedElement:a,idToOriginalElement:s}=await B0(n,o.documentElement,{removeWebviewContent:false,injectedWebviewContent:void 0,pruneElementsOutsideBounds:e.pruneElementsOutsideBounds});return {xml:i,idToPrunedElement:a,idToOriginalElement:s,originalDocument:o,webviewRootElement:void 0,idToIdInWebview:new Map,webviewRootBounds:void 0}}function Jze(t,e){let n=t.parseFromString("<hierarchy/>","text/xml"),r=n.documentElement;for(let o=0;o<e.length;o++){let i=e[o],a=qee(i,n);r.appendChild(a);}return n}function qee(t,e){let n=t.type,r=e.createElement(n);if(r.setAttribute("type",n),r.setAttribute("x",String(t.frame.x.toFixed(2))),r.setAttribute("y",String(t.frame.y.toFixed(2))),r.setAttribute("width",String(t.frame.width.toFixed(2))),r.setAttribute("height",String(t.frame.height.toFixed(2))),t.AXLabel!==null&&r.setAttribute("label",t.AXLabel),t.AXValue!==null&&r.setAttribute("value",t.AXValue),t.title!==null&&r.setAttribute("title",t.title),t.help!==null&&r.setAttribute("help",t.help),r.setAttribute("enabled",String(t.enabled)),t.children)for(let o=0;o<t.children.length;o++){let i=t.children[o],a=qee(i,e);r.appendChild(a);}return r}function yd(t){let e=[],n=t;for(;n;){let r=n.parentElement;if(!r||r.tagName==="AppiumAUT"){e.unshift(`${n.tagName}[1]`);break}let o=n.tagName,i=Array.from(r.children).filter(s=>s.tagName===o),a=1;for(let s=0;s<i.length;s++)if(i[s]===n){a=s+1;break}e.unshift(`${o}[${a}]`),n=r;}return `/${e.join("/")}`}var YA=class t{driver;emulator;options;aborter;constructor({driver:e,emulator:n,aborter:r,options:o}){this.driver=e,this.emulator=n,this.aborter=r,this.options=o;}static async init({driver:e,emulator:n,aborter:r,options:o}){return new t({driver:e,aborter:r,emulator:n,options:o})}async getContexts(e){let n=await this.driver.executeInNativeContext(e,async o=>await o.getContexts({}),{operationName:"getContexts"}),r=n.filter(o=>o!==kee);return {contexts:n.map(o=>o),webviews:r}}async getRawScreenshotBase64({logger:e,totalAttempts:n=3,signal:r}){let o=me(),i=r??this.aborter.controller?.signal;return await o.startAsyncSpan("EMULATOR_READ_STATE",async()=>await cp(e,()=>this.emulator.screenshotPngBase64(),{maxAttempts:n,signal:i,operationName:"takeScreenshot"}),{name:"Take screenshot",signal:i,timeoutMs:3e4})}async getCurrentScreenshotPngString(e){return `data:image/png;base64,${await this.getRawScreenshotBase64({logger:e,totalAttempts:1})}`}async waitForScreenshotStability({logger:e,timeoutMs:n,signal:r,reason:o,tolerancePercent:i=1}){await me().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async a=>{a.attributes.reason=o;let s=Mm({signal:r,timeoutMs:n}),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(fc(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 Za(Math.min(1e4,d),s);}c||(a.attributes.timedOut=true,e.warn({purpose:o},"Timed out waiting for screenshot stability"));});}async waitForPageSourceStability({logger:e,timeoutMs:n,signal:r,reason:o}){await me().startAsyncSpan("WAIT_FOR_PAGE_STABILITY",async i=>{i.attributes.reason=o;let a=Mm({signal:r,timeoutMs:n}),s,l=false;for(;!a.aborted;){let c,u=Date.now();try{c=await te(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 Za(Math.min(1e4,d),a);}l||(i.attributes.timedOut=true,e.warn({purpose:o},"Timed out waiting for page source stability"));});}async getActiveWebview(e){let r=(await this.getContexts(e)).webviews;if(r.length>1)throw new M("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");return r[0]}async getActiveWebviewContent(e){let n=await this.getActiveWebview(e);if(!n)return;this.throwIfAborted();let r=await this.driver.executeWebViewScript(e,n,o=>o.dumpA11yTree());return {context:n,...r}}async getDomState(e,n){return await me().startAsyncSection("Get emulator state XML",async()=>{let i=n?.filterOffscreenElements??true?await this.getViewportBounds(e):void 0,a;if(!n?.skipFetchingFullWebviewContent)try{a=await this.getActiveWebviewContent(e);}catch(c){e.error({err:c},"Could not get webview info to get the nested DOM state");}if(this.throwIfAborted(),!a&&this.options?.disableMomenticAccessibilityTree){let c=await this.getNativePageSource();this.throwIfAborted();let u=await KA(c,{pruneElementsOutsideBounds:i});return {sourceTree:"native",graph:u,webviewContent:void 0}}let s=await this.getAppiumPageSource(e);return this.throwIfAborted(),{graph:await Hee(s,{injectedWebviewContent:a,removeWebviewContent:n?.removeWebviewContent,pruneElementsOutsideBounds:i}),sourceTree:"appium",webviewContent:a}})}async getNativePageSource(){return await me().startAsyncSpan("EMULATOR_READ_STATE",async()=>this.emulator.nativeA11yTreeJson(),{name:"Get iOS page source",signal:this.aborter.controller?.signal,timeoutMs:3e4})}async getAppiumPageSource(e,n){let r=n??this.aborter.controller?.signal;return await me().startAsyncSpan("EMULATOR_READ_STATE",()=>this.driver.executeInNativeContext(e,i=>i.getPageSource(),{signal:r,operationName:"getPageSource"}),{name:"Get page source",signal:r,timeoutMs:3e4})}async getViewportBounds(e){let n=await this.driver.executeInNativeContext(e,async r=>r.getWindowRect(),{operationName:"getViewportBounds"});return {left:n.x,top:n.y,right:n.x+n.width,bottom:n.y+n.height}}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted();}};async function Yee({command:t,logger:e,generator:n,aiSettings:r,getEmulatorDomState:o,getScreenshotBase64:i,throwIfAborted:a,abortSignal:s}){let l=me(),c=15,u=t.timeoutSecs?t.timeoutSecs*1e3:5e3,d=ov(u),m=Date.now(),p=0,f,h=false,b;for(;p<c&&!h;){a(),h||f&&f-m>=u&&(h=true),p!==0&&await fe(d,s),f=Date.now();try{let y="",S="";await l.startAsyncSpan("EMULATOR_READ_STATE",async()=>{y=await o(),S=await i();},{name:"Get emulator state"});let T=await n.evaluateIosAssertion({assertion:t.assertion,screenXml:y,screenshot:S},{logger:e,loggerTags:De(e),agentConfigVersion:r.agentConfig?.["ios-assertion"]});if(T.result)return {success:T.result,message:T.thoughts};{let C=`AssertionFailureError: ${T.thoughts}`;b=new Error(C);}}catch(y){if(a(),mS(y))throw y;e.info({err:y},`AI check assert attempt ${p} failed, retrying...`),b=y instanceof Error?y:new Error(`${y}`);}finally{p++;}}return {success:false,message:b?.message}}async function Xee({command:t,logger:e,generator:n,aiSettings:r,getEmulatorDomState:o,getScreenshotBase64:i,abortSignal:a}){if(!t.goal.trim())throw new M("ActionFailureError","Cannot perform AI extraction without goal");if(t.schema){let u=wm(t.schema);if(u)throw new M("UserConfigurationError",u)}let s=me(),l="",c="";return await s.startAsyncSpan("EMULATOR_READ_STATE",async()=>{l=await o(),c=await i();},{name:"Get emulator state"}),await s.startAsyncSpan("AI_EXTRACTION_CALL",async u=>{try{let d=await n.getIosTextExtraction({goal:t.goal,emulatorState:l,returnSchema:t.schema,screenshot:`data:image/png;base64,${c}`},{disableCache:!!t.disableCache,abortSignal:a,loggerTags:De(e),agentConfigVersion:r.agentConfig?.["ios-text-extraction"]});if(u.result=d,lC({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 M("UserConfigurationError",d.thoughts);return {success:!0,output:d.result,message:d.thoughts}}catch(d){let m=H(d);throw m.includes("MaxGenerationLengthExceededError")?new M("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step instead."):m.includes("AIProviderError")&&m.includes("time")?new M("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}})}function Sd(t){let{x1:e,y1:n,x2:r,y2:o}=t.bounds;return {left:e,top:n,width:r-e,height:o-n}}var vs="element-6066-11e4-a52e-4f735466cecf";function Cs(t,e){return Math.abs(t-e)<1}function rf(t,e){let n=e.x2-e.x1,r=(e.x1+e.x2)/2,o=(t.x1+t.x2)/2;if(!cs(e.tolerance,r,o,Math.min(1,n)))return false;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(t.y1+t.y2)/2;return cs(e.tolerance,a,s,Math.min(1,i))}function of(t,e){let n=t.x2-t.x1,r=t.y2-t.y1;return cs(e.tolerance,e.width,n,Math.min(1,e.width))?cs(e.tolerance,e.height,r,Math.min(1,e.height)):false}function af(t){return t.type==="WEBVIEW",t.cache}function sf(t){let{command:e,cacheKey:n="cache",targetName:r="target",updatedCache:o}=t;$M(e)&&(e[n]={...e[n],[r]:Kd.parse(o)},t.updatedWithAI&&(e[n].updatedAt=new Date,e[n].updatedAtLoggerTags=De(t.logger)));}var Ay="name";async function Jee(t,e,n){return await e.executeInNativeContext(t,r=>r.isElementDisplayed(n),{operationName:"isElementRendered"})}async function lf(t,e,n,r){return await e.executeInNativeContext(t,o=>o.getElementAttribute(n,r),{operationName:"getAttributeFromIosElement"})}async function U0(t,e,n){return await e.executeInNativeContext(t,async r=>{try{let o=await r.findElement("xpath",n);if(!o)return null;let i=o[vs];if(!i)return null;let a=await r.getElementRect(i);return {elementId:i,rect:a}}catch{return null}},{operationName:"findElementByXPath"})}async function Zee(t,e,n){let r=yd(n),o=await U0(t,e,r);if(o)return {xPath:r,...o}}async function z0({logger:t,emulatorState:e,driver:n,idInWebview:r,requirements:o}){let i=e.graph.webviewRootElement?yd(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 e1e({logger:t,driver:n,webviewRootBounds:e.graph.webviewRootBounds,nodeIdInWebview:r,aiGeneratedRequirements:o,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 e1e({logger:t,driver:e,webviewRootBounds:n,nodeIdInWebview:r,aiGeneratedRequirements:o,webviewContent:i}){let a=await e.executeWebViewScript(t,i.context,(l,c,u,d)=>l.generateCacheFromWebviewElementId(c,u,d),i.generatedAt,r,{attributesToFetch:o?.attributesRequired??[]});if(!a)return;let s={x:n.x1-i.rootBoundingBox.x+a.boundingBox.x,y:n.y1-i.rootBoundingBox.y+a.boundingBox.y,width:a.boundingBox.width,height:a.boundingBox.height};return {id:a.id,generatedSelectors:a.selectors,boundingBox:s,requirements:{text:o?.textRequired?a.textContent:void 0,attributes:a.attributes,boundingBox:o?.boundsRequired?s:void 0,shape:o?.shapeSpecificity?{tolerance:o.shapeSpecificity,width:a.boundingBox.width,height:a.boundingBox.height}:void 0,position:o?.positionSpecificity?{tolerance:o.positionSpecificity,x1:s.x,y1:s.y,x2:s.x+s.width,y2:s.y+s.height}:void 0}}}async function t1e(t,e,n,r){if(!r||!r.length)return;let o={};for(let i of r){let a=await lf(t,e,n,i);a!==null&&(o[i]=a);}return Object.keys(o).length?o:void 0}async function Qee({logger:t,driver:e,node:n,requirements:r}){let o=await Zee(t,e,n);if(!o){t.warn("Failed to generate valid xPath selector for element");return}let{xPath:i,rect:a,elementId:s}=o,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:r?.textRequired?await lf(t,e,s,Ay)??void 0:void 0,requiredAttributes:await t1e(t,e,s,r?.attributesRequired?.filter(c=>!(r.textRequired&&c===Ay))),requiredBounds:r?.boundsRequired,position:r?.positionSpecificity?{x1:l.x1,y1:l.y1,x2:l.x2,y2:l.y2,tolerance:r?.positionSpecificity}:void 0,shape:r?.shapeSpecificity?{width:l.x2-l.x1,height:l.y2-l.y1,tolerance:r?.shapeSpecificity}:void 0}}}async function ete({logger:t,driver:e,aiResponse:n,description:r,emulatorState:o}){let i=o.graph.idToPrunedElement.get(n.id);if(!i)throw new Error(`Could not find node with id: ${n.id}`);let a=GA(i);if(!a)throw new Error(`Could not determine bounds for element with id: ${n.id}, description: ${r}`);let s=[];for(let{id:d,requirements:m}of n.additionalElements??[]){let p=o.graph.idToIdInWebview.get(d);if(p!==void 0){try{let b=await z0({logger:t,driver:e,emulatorState:o,idInWebview:p,requirements:m});s.push(b);}catch(b){t.warn({err:b},`Failed to build webview cache for related element with id: ${d}`);}continue}let f=o.graph.idToOriginalElement.get(d);if(!f){t.warn(`Could not find original element for additional element with id: ${d}`);continue}let h=await Qee({logger:t,driver:e,node:f,requirements:m});h&&s.push(h);}let l=o.graph.idToIdInWebview.get(n.id);if(l!==void 0){let d={type:"WEBVIEW",bounds:a,cache:{type:"WEBVIEW"}};try{let m=await z0({logger:t,driver:e,emulatorState:o,idInWebview:l,requirements:n.requirements});return {...d,cache:{type:"WEBVIEW",resolvedDescription:r,requiredRelatedElements:s,...m}}}catch(m){return t.warn({err:m},"Failed to build webview target cache"),d}}let c=o.graph.idToOriginalElement.get(n.id);if(!c)throw new Error(`Node isn't in a webview but couldn't find original node for id: ${n.id}, description: ${r}`);let u=await Qee({logger:t,driver:e,node:c,requirements:n.requirements});return u?{type:"NATIVE",bounds:a,cache:{type:"NATIVE",...u,resolvedDescription:r,sourceTree:"appium",requiredRelatedElements:s,elementOnlySerializedXml:qA(c)}}:(t.warn("Failed to generate valid cache for element"),{type:"NATIVE",cache:{type:"NATIVE"},bounds:a})}async function $0({logger:t,driver:e,stateManager:n,parentWebviewBounds:r,cache:o}){if(!o||!o.generatedSelectors)throw new Pe("Cache is missing required attributes");let i=await n.getActiveWebview(t);if(!i)throw new Pe("No active webview context found");let a=await e.executeWebViewScript(t,i,(u,d)=>u.resolveWebviewTargetCache(d),{selectors:o.generatedSelectors,attributesToFetch:Object.keys(o.requirements?.attributes??{})});if(!a)throw new Pe("Failed to resolve webview target using cache");let s=r.x1-a.rootBoundingBox.x+a.boundingBox.x,l=r.y1-a.rootBoundingBox.y+a.boundingBox.y,c={x1:s,y1:l,x2:s+a.boundingBox.width,y2:l+a.boundingBox.height};return o.requirements&&n1e(t,c,a,o.requirements),c}function n1e(t,e,n,r){if(!r)return;let{attributes:o,text:i,position:a,shape:s}=r;if(i!==void 0&&i.length>0&&n.textContent!==i)throw new Pe(`Text content mismatch: expected "${i}", got "${n.textContent}"`);if(o)for(let[l,c]of Object.entries(o)){let u=n.attributes[l];if(u!==c)throw new Pe(`Attribute ${l} mismatch: expected "${c}", got "${u}"`)}if(a&&!rf(e,a))throw new Pe(`Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(e)}`);if(s&&!of(e,s))throw new Pe(`Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(e)}`)}async function tte(t,e,n,r,o){if(!r)return;let{requiredAttributes:i,requiredText:a,requiredBounds:s,position:l,shape:c}=r;if(a!==void 0&&a.length>0){let u=await lf(t,e,n,Ay);if(u!==a)throw new Pe(`Resolved element text mismatch: expected ${a}, got ${u}`)}if(i)for(let[u,d]of Object.entries(i)){let m=await lf(t,e,n,u)??void 0;if(m!==d)throw new Pe(`Attribute ${u} mismatch: expected ${d}, got ${m}`)}if(s&&o){let{originalBounds:u,newBounds:d}=o;if(!u)throw new Pe("Cannot validate bounds requirements without original bounds in cache");if(!(Cs(u.x1,d.x1)&&Cs(u.y1,d.y1)&&Cs(u.x2,d.x2)&&Cs(u.y2,d.y2))){let p=f=>`[${f.x1},${f.y1},${f.x2},${f.y2}]`;throw new Pe(`Bounds changed from ${p(u)} to ${p(d)}`)}}if(l&&o&&!rf(o.newBounds,l))throw new Pe(`Position mismatch: expected ${JSON.stringify(l)}, got ${JSON.stringify(o.newBounds)}`);if(c&&o&&!of(o.newBounds,c))throw new Pe(`Shape mismatch: expected ${JSON.stringify(c)}, got ${JSON.stringify(o.newBounds)}`)}async function nte({logger:t,driver:e,xPath:n,elementType:r,skipVisibilityCheck:o=false}){let i=await U0(t,e,n);if(!i)throw new Pe(`Could not resolve ${r} via XPath: ${n}`);let{elementId:a}=i;if(!o&&!await Jee(t,e,a))throw new Pe(`${r} resolved via XPath is not rendered: ${n}`);return i}async function rte({target:t,driver:e,stateManager:n,logger:r}){if(!t.xPath)throw new Pe(`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 nte({logger:r,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 $0({logger:r,driver:e,stateManager:n,parentWebviewBounds:d,cache:l.browserCache});}else await tte(r,e,c,l.requirements);}}let{elementId:o,rect:i}=await nte({logger:r,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 $0({logger:r,driver:e,stateManager:n,parentWebviewBounds:a,cache:t.browserCache});return {type:"WEBVIEW",bounds:s,cache:t}}return await tte(r,e,o,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 ite({aiResponse:t,description:e,emulatorState:n}){let r=n.graph.idToPrunedElement.get(t.id);if(!r)throw new Error(`Could not find node with id: ${t.id}`);let o=GA(r);if(!o)throw new Error(`Could not determine bounds for element with id: ${t.id}, description: ${e}`);let i=n.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=yd(i),s=qA(i),l=ote({requirements:t.requirements,element:i}),c=(t.additionalElements??[]).map(({id:u,requirements:d})=>{let m=n.graph.idToOriginalElement.get(u);return m?{xPath:yd(m),requirements:ote({requirements:d,element:m})}:void 0}).filter(u=>!!u);return {type:"NATIVE",bounds:o,cache:{type:"NATIVE",bounds:[o.x1,o.y1,o.x2,o.y2],resolvedDescription:e,sourceTree:n.sourceTree,xPath:a,elementOnlySerializedXml:s,requirements:l,requiredRelatedElements:c}}}function ote({requirements:t,element:e}){let n;if((t?.positionSpecificity||t?.shapeSpecificity)&&(n=ll(e),!n))throw new M("ActionFailureError","Element to cache has no bounds or unexpected bounds format");return {requiredText:t?.textRequired?e.textContent??void 0:void 0,requiredAttributes:r1e(e,t?.attributesRequired),requiredBounds:t?.boundsRequired,position:t?.positionSpecificity?{x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,tolerance:t?.positionSpecificity}:void 0,shape:t?.shapeSpecificity?{width:n.x2-n.x1,height:n.y2-n.y1,tolerance:t?.shapeSpecificity}:void 0}}function r1e(t,e){if(t&&!(!e||e.length===0))return Object.fromEntries(e.map(n=>[n,t.getAttribute(n)]).filter(([,n])=>n!==null))}async function ste(t,e,n,r){if(!n)return;let{requiredAttributes:o,requiredText:i,requiredBounds:a,position:s,shape:l}=n;if(i!==void 0&&i.length>0){let c=e.textContent;if(c!==i)throw new Pe(`Resolved element text mismatch: expected ${i}, got ${c}`)}if(o)for(let[c,u]of Object.entries(o)){let d=e.getAttribute(c)??void 0;if(d!==u)throw new Pe(`Attribute ${c} mismatch: expected ${u}, got ${d}`)}if(a&&r){let{originalBounds:c,newBounds:u}=r;if(!c)throw new Pe("Cannot validate bounds requirements without original bounds in cache");if(!(Cs(c.x1,u.x1)&&Cs(c.y1,u.y1)&&Cs(c.x2,u.x2)&&Cs(c.y2,u.y2))){let m=p=>`[${p.x1},${p.y1},${p.x2},${p.y2}]`;throw new Pe(`Bounds changed from ${m(c)} to ${m(u)}`)}}if(s&&r&&!rf(r.newBounds,s))throw new Pe(`Position mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(r.newBounds)}`);if(l&&r&&!of(r.newBounds,l))throw new Pe(`Shape mismatch: expected ${JSON.stringify(l)}, got ${JSON.stringify(r.newBounds)}`)}async function lte({target:t,logger:e,emulator:n}){if(!t.xPath)throw new Pe(`Could not resolve cached target via XPath: ${t.xPath}`);let r=await n.nativeA11yTreeJson(),o=await KA(r,{pruneElementsOutsideBounds:void 0});if(t.requiredRelatedElements){let s=t.requiredRelatedElements;for(let l of s){let c=QQ.evaluateXPathToFirstNode(l.xPath,o.originalDocument);if(!c)throw new Pe(`Required related element not found for XPath: ${l.xPath}`);await ste(e,c,l.requirements);}}let i=QQ.evaluateXPathToFirstNode(t.xPath,o.originalDocument);if(!i)throw new Pe(`Could not resolve cached target via XPath: ${t.xPath}`);let a=ll(i);if(!a)throw new Pe(`Could not determine bounds for cached target via XPath: ${t.xPath}`);return await ste(e,i,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]}}}async function cte({logger:t,driver:e,aiResponse:n,description:r,emulatorState:o}){switch(o.sourceTree){case "appium":return await ete({logger:t,driver:e,aiResponse:n,description:r,emulatorState:o});case "native":return await ite({aiResponse:n,description:r,emulatorState:o});default:{let i=o.sourceTree;throw new Error(`Unsupported source tree type for building iOS target cache: ${i}`)}}}async function ute({target:t,driver:e,stateManager:n,logger:r,emulator:o}){if(t.type==="WEBVIEW"||!t.sourceTree||t.sourceTree=="appium")return await rte({target:t,driver:e,stateManager:n,logger:r});switch(t.sourceTree){case "native":return await lte({target:t,logger:r,emulator:o});default:{let i=t.sourceTree;throw new Error(`Unsupported source tree type for resolving iOS target cache: ${i}`)}}}var rr=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:n,description:r,skipFetchingFullWebviewContent:o=false,removeWebviewContent:i=false,filterOffscreenElements:a=true,useMemory:s=false,metadata:l,cacheBustReason:c}){let u=e.child({...l});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:d,screenshot:m}=await n.startAsyncSection("Get emulator state",async()=>{let h=await this.stateManager.getCurrentScreenshotPngString(e);return {emulatorState:await this.stateManager.getDomState(e,{skipFetchingFullWebviewContent:o,removeWebviewContent:i,filterOffscreenElements:a}),screenshot:h}}),p;try{p=await n.startAsyncSpan("AI_LOCATOR_CALL",async h=>{c&&(h.attributes.cacheBustReason=c);let b=await this.generator.getIosElementLocation({description:r,screenXml:d.graph.xml,screenshot:m,source:l?.source==="SCROLL_TO"?"SCROLL_TO":void 0},{logger:u,loggerTags:De(u),abortSignal:this.aborter.controller?.signal,useMemory:s,agentConfigVersion:this.aiSettings.agentConfig?.["ios-locator"]});return h.result=b,b});}catch(h){throw this.throwIfAborted(),u.error({err:h},"Failed to locate element"),new Error(`ActionFailureError: Failed to locate element: ${h instanceof Error?h.message:h}`,{cause:h})}if(p.id===-1)throw new M("NoMatchingElementError",p.thoughts??"No matching element found");let f=await cte({logger:e,driver:this.driver,aiResponse:p,description:r,emulatorState:d});return n.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:(f.type==="NATIVE"?f.cache.elementOnlySerializedXml:void 0)??"Unknown element"},attributes:{},subSpans:[]}),{resolvedTarget:f,thoughts:p.thoughts}}async targetingActionWithAILocator(e){let{tracer:n,action:r,command:o,description:i,cacheKey:a,targetName:s,skipFetchingFullWebviewContent:l,removeWebviewContent:c,metadata:u,logger:d,cacheBustReason:m}=e,p=await this.findElement({logger:d,tracer:n,description:i,skipFetchingFullWebviewContent:l,removeWebviewContent:c,metadata:u,cacheBustReason:m}),f=p.thoughts,h=await r(p.resolvedTarget);return sf({command:o,cacheKey:a,targetName:s,updatedCache:af(p.resolvedTarget),updatedWithAI:true,logger:d}),{result:h,thoughts:f}}async targetingActionWithCache({logger:e,tracer:n,action:r,command:o,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:n,cache:s}),c=await r(l);return sf({command:o,cacheKey:i,targetName:a,updatedCache:af(l),updatedWithAI:false,logger:e}),{result:c,thoughts:"Successfully executed preset action with cache"}}async resolveTargetCacheWithTracing({logger:e,tracer:n,cache:r,retryWithinSmartWaiting:o=true}){let{resolvedTarget:i}=await n.startAsyncSpan("CACHE_RESOLUTION",async a=>{let s=Date.now(),l;for(;!o||Date.now()-s<3e3;)try{let c=await ute({target:r,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 Pe){if(!o)throw c;e.warn({err:c},"Failed to resolve target cache, retrying"),await Za(500,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:n,logger:r,action:o,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 b=a.cache;l==="target"&&"target"in b?h=cloneDeep(b.target):l==="fromTarget"&&"fromTarget"in b?h=cloneDeep(b.fromTarget):l==="toTarget"&&"toTarget"in b&&(h=cloneDeep(b.toTarget));}if(a.disableCache&&(r.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&&!vc(h.resolvedDescription??"",i)&&(r.info({description:i,cacheDescription:h.resolvedDescription},"Cache description mismatch, clearing it automatically"),p=true,f="Description mismatch",h=void 0),h){let b=h.type==="NATIVE"?!!h.requirements:!!h.browserCache?.requirements;try{let y=await this.targetingActionWithCache({logger:r,tracer:n,action:o,command:a,cacheKey:s,targetName:l,cacheCopyForAttempt:h});return Ge.increment("cache_target_resolution_v2",1,["outcome:hit","platform:mobile-native",`hasRequirements:${b}`,`orgId:${this.orgId}`,"cliVersion:0.111.0"]),y}catch(y){if(this.throwIfAborted(),y instanceof M&&y.reason!=="InternalWebAgentError")throw r.error({err:y},"Failed to execute action with target cache (fatal)"),y;Ge.increment("cache_target_resolution_v2",1,["outcome:miss","platform:mobile-native",`hasRequirements:${b}`,`orgId:${this.orgId}`,"cliVersion:0.111.0"]),r.warn({err:y},"Failed to execute action with target cache, retrying with AI");}}return r.info({description:i,cacheBustedBeforeAction:p},"Prompting AI for a new element location"),await this.targetingActionWithAILocator({tracer:n,action:o,command:a,description:i,cacheKey:s,targetName:l,skipFetchingFullWebviewContent:u,removeWebviewContent:d,metadata:m,logger:r,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 JA=class extends rr{async doDrag(e,n,r,o,i){let{x1:a,y1:s,x2:l,y2:c}=r.bounds,u=a+(l-a)/2,d=s+(c-s)/2;n.attributes.startPoint={x:u,y:d};let{x1:m,y1:p,x2:f,y2:h}=o.bounds,b=m+(f-m)/2,y=p+(h-p)/2;n.attributes.endPoint={x:b,y};let S=i?.hoverDuration??500,T=i?.dragDuration??1e3;T===0&&(T=1);let w=Math.sqrt(Math.pow(b-u,2)+Math.pow(y-d,2))/T*1e3;await this.driver.executeInNativeContext(e,async _=>{await _.execute("mobile: dragFromToWithVelocity",{fromX:u,fromY:d,toX:b,toY:y,pressDuration:S/1e3,velocity:w,holdDuration:.5});},{operationName:"dragAndDrop"});}async executeDragAndDrop({logger:e,command:n}){let r=me();if(n.fromTarget.type!=="description"||n.toTarget.type!=="description")throw new M("UserConfigurationError","Drag and drop only supports description targets for now");let o=n.fromTarget.description,{result:i,thoughts:a}=await this.wrapTargetingAction({command:n,tracer:r,description:o,cacheKey:"cache",targetName:"fromTarget",action:async u=>u,logger:e}),s=n.toTarget.description,{result:l,thoughts:c}=await this.wrapTargetingAction({command:n,tracer:r,description:s,cacheKey:"cache",targetName:"toTarget",action:async u=>u,logger:e});return await r.startAsyncSpan("EMULATOR_INTERACTION",async u=>{await this.doDrag(e,u,i,l,{hoverDuration:n.hoverDuration,dragDuration:n.dragDuration});},{name:"Drag and drop"}),{success:true,message:`${a}
|
|
5880
|
+
}`);return a.execute(s,...o)},{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 Pee({logger:t,driverLogLevel:e="error",emulator:n,callbacks:r}){let{onStatusUpdate:o}=r,i=t.child({emulatorName:n.name}),a={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},...n.extraCapabilities};o("Starting Appium session");let s={capabilities:a},l=await UA.init({logger:i,logLevel:e,callbacks:{...r,restartWda:n.restartWda?async c=>{await n.restartWda?.(c);}:void 0,onFailure:async({err:c,attempt:u})=>{let d=oC(c),m=u<3&&d;return m&&i.warn({err:c},"Appium driver manifest race detected on first attempt, restarting Appium and retrying"),{shouldRetry:m}}},wdioOpts:s});return i.info({capabilities:a,emulatorName:n.name},"Started Appium driver"),l}async function D0({wdaUrl:t,token:e}){try{let n=new AbortController;return setTimeout(()=>n.abort(),3e3),await fetch(t+"/status",{headers:{Authorization:`Bearer ${e}`},signal:n.signal}),!0}catch{return false}}var zA={"appium:waitForIdleTimeout":2,"appium:commandTimeouts":"30000","appium:skipLogCapture":true,"appium:disableAutomaticScreenshots":true,"appium:simpleIsVisibleCheck":true};var fze=["[com.apple.","loadConfigurationForEnvironment"],hze=["com.apple.Accessibility","com.apple.news","com.apple.locationd","NewsToday","NewsTodayIntents","apsd","APSConfiguration","APSOutgoingQueue","APSCourierConnection","APSNetworkMonitor","loadConfigurationForEnvironment"],gze=new Set(["D","Df","Db"]),bze=new Set(["I"]),yze=/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\s+(\S+)\s+/,Sze="https://storage.googleapis.com/mobile-drivers/WebDriverAgentRunner-Build-Sim-arm64-v10.4.5.zip",_ee=6e4,Eze=5e3,Tze=250;function vze(t){let e=yze.exec(t)?.[1];if(!e)return false;let n=fze.some(o=>t.includes(o)),r=hze.some(o=>t.includes(o));return gze.has(e)?n||r:bze.has(e)?r:false}async function Oee({wdaUrl:t,token:e,limbarClient:n,logger:r,onStatusUpdate:o}){if(await D0({wdaUrl:t,token:e}))return;o("Starting WebDriverAgent"),r.debug("WDA is not running on the iOS emulator"),await n.simctl(["launch","booted","com.facebook.WebDriverAgentRunner.xctrunner"]).wait();let i=Date.now()+Eze;do{if(await D0({wdaUrl:t,token:e})){r.debug("WDA launched");return}await fe(Tze);}while(Date.now()<i);throw new Yf("WebDriverAgent did not become reachable after relaunch")}var Cy=class t{apiClient;name;extraCapabilities;limbarToken;limbarWebRtcUrl;limbarApiUrl;limbarWdaUrl;limbarRegion;limbarTag;limbarClient;onStatusUpdate;logStream=void 0;constructor({apiClient:e,limbarToken:n,limbarWebRtcUrl:r,limbarApiUrl:o,limbarWdaUrl:i,limbarRegion:a,limbarTag:s,emulatorName:l,limbarClient:c,onStatusUpdate:u}){this.apiClient=e,this.name=l,this.limbarToken=n,this.limbarWebRtcUrl=r,this.limbarApiUrl=o,this.limbarWdaUrl=i,this.limbarRegion=a,this.limbarTag=s,this.limbarClient=c,this.extraCapabilities={...zA,"appium:automationName":"@limrun/xcuitest","appium:webDriverAgentUrl":this.limbarWdaUrl,"appium:wdaLocalPort":443,"appium:useNewWDA":false,"appium:usePreinstalledWDA":true,"appium:limInstanceApiUrl":o,"appium:limInstanceToken":n,"appium:wdaRequestHeaders":{Authorization:`Bearer ${n}`}},this.onStatusUpdate=u;}static async init(e){let{apiClient:n,logger:r,creationOpts:o,logLevel:i,orgId:a,sessionId:s,onStatusUpdate:l,onConnectionStateChange:c}=e,u=o.appToInstall?.channel,d=o.appToInstall?.tag;l("Creating iOS emulator");let{token:m,webRtcUrl:p,wdaUrl:f,apiUrl:h,id:b,region:y,appDownloadUrl:S,appMd5:T,resolvedTag:C}=await n.createIosEmulator({...o,hostname:hostname(),sessionId:s,installAppOnClient:true});r.info({emulatorName:b,region:y,sessionId:s},"ios instance creation ok"),l("Connecting to iOS emulator");let w;try{w=await Ge.recordDuration({fn:async()=>await te(createInstanceClient({apiUrl:h,token:m,logLevel:i}),{milliseconds:_ee,message:`Timed out after ${_ee}ms connecting to iOS emulator ${b}`}),name:"test_event_duration",tags:["name:limbar-client-creation","clientOs:ios",`orgId:${a}`]}),c&&w.onConnectionStateChange(c),l("Installing WebDriverAgent");let _=w;return await Ge.recordDuration({fn:async()=>{await Dee({limbarClient:_,url:Sze,md5:void 0,logger:r,emulatorName:b,assetLabel:"WebDriverAgent"});},name:"test_event_duration",tags:["name:limbar-wda-install","clientOs:ios",`orgId:${a}`]}),await Oee({wdaUrl:f,token:m,limbarClient:_,logger:r,onStatusUpdate:l}),S&&(l(`Installing iOS app${u?` with channel ${u}`:""}${d?` and tag ${d}`:""}`),await Ge.recordDuration({fn:async()=>{await Dee({limbarClient:_,url:S,md5:T,logger:r,emulatorName:b,assetLabel:"iOS app"});},name:"test_event_duration",tags:["name:limbar-app-install","clientOs:ios",`orgId:${a}`]})),(async()=>{try{let[N,I]=await Promise.allSettled([km("limserver-1.limrun.net"),km("125.253.92.199")]);r.info({limserver:N.status==="fulfilled"?N.value:N.reason,ip125:I.status==="fulfilled"?I.value:I.reason},"Limbar network diagnostics");}catch(N){r.warn({err:N},"Failed to run network diagnostics");}})(),new t({apiClient:n,limbarToken:m,limbarWebRtcUrl:p,limbarApiUrl:h,limbarWdaUrl:f,limbarRegion:y,limbarTag:C??d,emulatorName:b,limbarClient:_,onStatusUpdate:l})}catch(_){throw r.warn({err:_,emulatorName:b},"iOS emulator init failed after creation; cleaning up remote instance"),await Cze({apiClient:n,limbarClient:w,id:b,logger:r}),_}}tap(e,n){return this.limbarClient.tap(e,n)}nativeA11yTreeJson(){return this.limbarClient.elementTreeRaw()}async screenshotPngBase64(){let e=await this.limbarClient.screenshot(),n=Buffer.from(e.base64,"base64"),r=AD.decode(n),o=new PNG({width:r.width,height:r.height});return o.data=Buffer.from(r.data),PNG.sync.write(o).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 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 n=r=>{vze(r)||e(r);};return this.logStream.on("line",n),()=>{this.logStream?.off("line",n);}}async restartWda(e){await Oee({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 Cze(t){let{apiClient:e,limbarClient:n,id:r,logger:o}=t;if(n)try{n.disconnect();}catch(i){o.warn({err:i,emulatorName:r},"Failed to disconnect limbar client during init cleanup");}try{await e.deleteIosEmulator(r);}catch(i){o.warn({err:i,emulatorName:r},"Failed to delete iOS emulator during init cleanup");}}var N0=12e4,$A=6,wze=1e3;async function Dee(t){let{limbarClient:e,url:n,md5:r,logger:o,emulatorName:i,assetLabel:a}=t,s;for(let l=1;l<=$A;l++)try{await te(e.installApp(n,{md5:r,timeoutMs:N0}),{milliseconds:N0,message:`Timed out after ${N0}ms installing ${a} on emulator ${i}`});return}catch(c){if(s=c,l===$A)break;let u=wze*2**(l-1);o.warn({url:n,err:c,emulatorName:i,assetLabel:a,attempt:l,maxAttempts:$A,backoffMs:u},`Failed to install ${a} on Limbar emulator; retrying after backoff`),await fe(u);}throw o.error({url:n,err:s,emulatorName:i,assetLabel:a,maxAttempts:$A},`Failed to install ${a} on Limbar emulator (no more retries)`),new M("UserConfigurationError",`Failed to install ${a} on emulator ${i}: ${s}`)}var Aze=v__default.array(v__default.object({bundle_id:v__default.string(),name:v__default.string()})),jA=class{constructor(e){this.udid=e;}async exec(e,n=[]){return new Promise((r,o)=>{execFile$1("idb",[...e,"--udid",this.udid,...n],(i,a)=>{i?o(i):r(a.trim());});})}async execBuffer(e,n=[]){return new Promise((r,o)=>{execFile$1("idb",[...e,"--udid",this.udid,...n],{encoding:"buffer",maxBuffer:10*1024*1024},(i,a)=>{i?o(i):r(a);});})}async describeDevice(){return this.exec(["describe"])}async tap({x:e,y:n}){await this.exec(["ui","tap"],[Math.round(e).toString(),Math.round(n).toString()]);}async elementTree(){return this.exec(["ui","describe-all"])}async listApps(){let e=await this.exec(["list-apps","--json"]),n=JSON.parse(e);return Aze.parse(n).map(r=>({bundleId:r.bundle_id,name:r.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"],["-"]),n=Buffer.from([137,80,78,71,13,10,26,10]);if(e.length<n.length||!e.subarray(0,n.length).equals(n))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 wy(t){try{return (await new Simctl().getDeviceTypes()).filter(r=>r.includes("iPhone"))}catch(e){return t.warn({err:e},"Got error listing local iPhone device types, returning empty list"),[]}}var Rze=v__default.object({runtimes:v__default.array(v__default.object({version:v__default.string(),name:v__default.string(),isAvailable:v__default.boolean().optional()}))});async function xze(t){try{let e=new Simctl,{stdout:n}=await e.exec("list",{args:["runtimes","-j"]}),{runtimes:r}=Rze.parse(JSON.parse(n)),o=r.filter(i=>i.isAvailable!==!1&&i.name.toLowerCase().startsWith("ios")).map(i=>i.version);return o.length===0?void 0:o.sort((i,a)=>Mze(a,i))[0]}catch(e){t.warn({err:e},"Failed to detect latest installed iOS runtime version");return}}function Mze(t,e){let n=t.split(".").map(Number),r=e.split(".").map(Number);for(let o=0;o<Math.max(n.length,r.length);o++){let i=(n[o]??0)-(r[o]??0);if(i!==0)return i}return 0}var HA=class t{name;extraCapabilities;simctl;idb;constructor({name:e,simctl:n,idb:r}){this.name=e,this.simctl=n,this.idb=r,this.extraCapabilities={...zA,"appium:automationName":"XCUITest","appium:udid":n.udid??void 0};}static async init(e,n){let r=new Simctl,o=n.emulatorName??`momentic-${Date.now()}`,i=await wy(e);if(!i.includes(n.deviceType))throw new M("UserConfigurationError",`Invalid device type: ${n.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=n.iosVersion??await xze(e);if(!a)throw new M("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 r.createDevice(o,n.deviceType,a);r.udid=l,s=async()=>{try{await r.shutdownDevice();}catch{}await r.deleteDevice();},await r.bootDevice(),await r.startBootMonitor({timeout:12e4}),n.appFilePath&&await r.installApp(n.appFilePath);let c=new jA(l);return new t({name:o,simctl:r,idb:c})}catch(l){throw await s?.(),l}}async tap(e,n){await this.idb.tap({x:e,y:n});}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 Pze=5e3;async function nf({creationOpts:t,apiClient:e,logger:n,driverLogLevel:r,orgId:o,sessionId:i,callbacks:a}){let s=Date.now();n.info("Starting ios driver creation");let{onLimbarConnectionStateChange:l,onStatusUpdate:c}=a,u=[],d=async()=>{let p=u.toReversed();for(let f of p)try{await te(f(),{milliseconds:Pze,fallback:()=>{}});}catch(h){if(Pu(h))continue;n.warn({err:h},"Error running cleanup task");}},m;switch(t.type){case "remote":{m=await Cy.init({apiClient:e,logger:n,creationOpts:t,orgId:o,sessionId:i,onStatusUpdate:c,onConnectionStateChange:l,logLevel:r});break}case "local":{m=await HA.init(n,t);break}}u.push(async()=>{await m.close();});try{let p=await Pee({logger:n,driverLogLevel:r,emulatorStart:s,emulator:m,apiClient:e,creationOpts:t,orgId:o,sessionId:i,callbacks:a});return u.push(()=>p.close()),p.executeInNativeContext(n,f=>f.getPageSource(),{operationName:"Warm up Appium cache"}).catch(()=>{}),{driver:p,emulator:m,limbarParams:m instanceof Cy?{token:m.limbarToken,webRtcUrl:m.limbarWebRtcUrl,region:m.limbarRegion,tag:m.limbarTag,osVersion:t.type==="remote"?t.osVersion:void 0}:void 0,cleanup:d}}catch(p){throw await d(),new Error(`Failed to start Appium driver: ${p}`,{cause:p})}}var Oze=100,Dze=2500,Lee=4e3,Nze="...";async function WA({emulator:t,onLogs:e}){if(!t.addSyslogListener)return;let n=create({fetcher:async o=>{e(o);},resolver:()=>{},scheduler:windowedFiniteBatchScheduler({windowMs:Dze,maxBatchSize:Oze})}),r=o=>{let i=o.toString().trim();i.length!==0&&(i.length>Lee&&(i=i.slice(0,Lee)+Nze),n.fetch(i).catch(()=>{}));};return t.addSyslogListener(r)}var kee="NATIVE_APP";var kze=new Set(["id","processId","bundleId","type","accessible","index","x","y","width","height"]),Fze=new Set([]),Bze=new Set(["name","label","traits"]),Uze=new Set(["live-region","drawing-order"]),zze=new Set(["visible","enabled"]);function Fee(t){let e={},n=t.tagName,r=reduce(t.attributes,(o,i)=>(o[i.name]=i.value,o),{});for(let[o,i]of Object.entries(r))kze.has(o)||o==="class"&&n===i||o==="focusable"&&i==="true"&&r.clickable==="true"||Fze.has(o)&&i==="false"||Bze.has(o)&&i===""||zze.has(o)&&i==="true"||Uze.has(o)&&i==="0"||(e[o]=i);return e.name&&e.label&&e.name===e.label&&delete e.label,e.name&&e.value&&e.name===e.value&&delete e.value,e}function ll(t){let e=t.getAttribute("x"),n=t.getAttribute("y"),r=t.getAttribute("width"),o=t.getAttribute("height");if(e===null||n===null||r===null||o===null)return;let i=parseFloat(e),a=parseFloat(n),s=parseFloat(r),l=parseFloat(o);if(!(isNaN(i)||isNaN(a)||isNaN(s)||isNaN(l)))return {x1:i,y1:a,x2:i+s,y2:a+l}}function k0(t,e){let{x1:n,y1:r,x2:o,y2:i}=e;t.setAttribute("bounds",`[${n},${r},${o},${i}]`);}function $ze(t){let e=t.match(/\[([-\d.]+),([-\d.]+),([-\d.]+),([-\d.]+)\]/);if(!e)return;let n=parseFloat(e[1]),r=parseFloat(e[2]),o=parseFloat(e[3]),i=parseFloat(e[4]);if(!(isNaN(n)||isNaN(r)||isNaN(o)||isNaN(i)||o<n||i<r))return {x1:n,y1:r,x2:o,y2:i}}function GA(t){let e=t.getAttribute("bounds");if(e)return $ze(e)}function Bee(t,e){if(!e)return true;let n=ll(t);return n?F0(n,e):true}function F0(t,e){if(!e)return true;let{x1:n,y1:r,x2:o,y2:i}=t;return !(o<e.left||n>e.right||i<e.top||r>e.bottom)}function qA(t){let e=t.cloneNode(true);for(let n of Array.from(e.children)){let r=n;for(let o of Array.from(r.children))r.removeChild(o);}return e.outerHTML}var Uee=new Set(["XCUIElementTypeWebView"]);function Gze(t){if(Uee.has(t.tagName))return true;let e=t.getAttribute("name");if(e&&(e.startsWith("TabDocument")||e.startsWith("BrowserView"))){let n=e.match(/UUID=([A-F0-9-]+)/),r=e.match(/WebViewProcessID=(\d+)/);if(n&&r)return true}return false}function qze(t){return t.startsWith("XCUIElementType")?t.substring(15):t}function zee({state:t,originalElement:e,prunedElement:n,isInWebview:r,idInWebview:o}){let{idCounter:i,idToPrunedElement:a,idToOriginalElement:s,idToIdInWebview:l}=t,c=i.value++;n.setAttribute("id",String(c)),a.set(c,n),r?l.set(c,o):s.set(c,e);}function $ee(t){if(!Uee.has(t.tagName)&&t.tagName==="XCUIElementTypeOther"&&t.hasAttribute("name")&&t.hasAttribute("label"))return t;for(let e of Array.from(t.children)){let n=$ee(e);if(n)return n}}function Kze({webviewNativeRootBounds:t,webviewDocumentRootBounds:e}){let n=t.x1-e.x,r=t.y1-e.y;if(!Number.isFinite(n)||!Number.isFinite(r))return t;let o=t.x2-t.x1,i=t.y2-t.y1;return {x1:n,y1:r,x2:n+o,y2:r+i}}function Vee(t,e,n,r){let{document:o}=n,{parentFrameBounds:i,pruneElementsOutsideBounds:a}=r;if(e.type==="element"){let s=o.createElement(e.role||e.tag);if(e.name&&s.setAttribute("name",e.name),e.description&&s.setAttribute("description",e.description),e.classes&&e.classes.length>0&&s.setAttribute("classes",e.classes.join(" ")),e.attrs)for(let[u,d]of Object.entries(e.attrs))s.setAttribute(u,d);let 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(!F0(c,a))return;k0(s,c),zee({state:n,prunedElement:s,isInWebview:true,idInWebview:e.momenticWebviewElementId}),t.appendChild(s);for(let u of e.children)Vee(s,u,n,r);}else if(e.type==="text"){let s=o.createElement("text");t.appendChild(s);let l=o.createTextNode(e.text);s.appendChild(l);}}function jee(t,e,n,r){let{pruneElementsOutsideBounds:o}=r,{document:i}=n;zee({state:n,originalElement:t,prunedElement:e,isInWebview:false});let a=Fee(t);for(let[c,u]of Object.entries(a))e.setAttribute(c,u);let s=ll(t);if(s&&k0(e,s),Gze(t)){let{removeWebviewContent:c,injectedWebviewContent:u}=r;if(c)return;if(u&&ll(t)){let m=$ee(t),p=m?ll(m):void 0;if(m&&p){n.webviewRootElement=m,n.webviewRootBounds=p,Vee(e,u.root,n,{parentFrameBounds:Kze({webviewNativeRootBounds:p,webviewDocumentRootBounds:u.rootBoundingBox}),pruneElementsOutsideBounds:o});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(!Bee(d,o))continue;let m=i.createElement(qze(d.tagName));jee(d,m,n,r),e.appendChild(m);}}}async function B0(t,e,n){let r=t.parseFromString("<AppiumAUT/>","text/xml"),o=new Map,i=new Map,a=new Map,s={document:r,idToPrunedElement:o,idToOriginalElement:i,idToIdInWebview:a,idCounter:{value:0},webviewRootElement:void 0,webviewRootBounds:void 0},l=r.documentElement;jee(e,l,s,n);let c=new XMLSerializer().serializeToString(r),u=await gUe.format(c,{parser:"xml",plugins:[hUe],printWidth:120,tabWidth:1,singleAttributePerLine:false});return {prunedDocument:r,idToPrunedElement:o,idToOriginalElement:i,idToIdInWebview:a,webviewRootElement:s.webviewRootElement,webviewRootBounds:s.webviewRootBounds,prunedXml:u}}async function Hee(t,e){let n=new DOMParser,r=n.parseFromString(t,"text/xml"),o=r.documentElement;if(!o)throw new Error("No root element found in XML");if(o.tagName!=="AppiumAUT")throw new Error("No AppiumAUT element found in XML");let{prunedXml:i,idToPrunedElement:a,idToOriginalElement:s,idToIdInWebview:l,webviewRootElement:c,webviewRootBounds:u}=await B0(n,o,e);return {xml:i,idToPrunedElement:a,idToOriginalElement:s,idToIdInWebview:l,webviewRootElement:c,webviewRootBounds:u,originalDocument:r}}var Wee=(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))(Wee||{}),Gee=v__default.lazy(()=>v__default.object({AXFrame:v__default.string(),AXUniqueId:v__default.string().nullable(),AXLabel:v__default.string().nullable(),AXValue:v__default.string().nullable(),frame:v__default.object({x:v__default.number(),y:v__default.number(),width:v__default.number(),height:v__default.number()}),role:v__default.string(),role_description:v__default.string(),subrole:v__default.string().nullable(),type:v__default.nativeEnum(Wee),title:v__default.string().nullable(),help:v__default.string().nullable(),content_required:v__default.boolean(),custom_actions:v__default.array(v__default.string()),enabled:v__default.boolean(),children:v__default.array(Gee).default([])}));function Xze(t){return v__default.array(Gee).parse(JSON.parse(t))}async function KA(t,e){let n=new DOMParser,r=Xze(t),o=Jze(n,r),{prunedXml:i,idToPrunedElement:a,idToOriginalElement:s}=await B0(n,o.documentElement,{removeWebviewContent:false,injectedWebviewContent:void 0,pruneElementsOutsideBounds:e.pruneElementsOutsideBounds});return {xml:i,idToPrunedElement:a,idToOriginalElement:s,originalDocument:o,webviewRootElement:void 0,idToIdInWebview:new Map,webviewRootBounds:void 0}}function Jze(t,e){let n=t.parseFromString("<hierarchy/>","text/xml"),r=n.documentElement;for(let o=0;o<e.length;o++){let i=e[o],a=qee(i,n);r.appendChild(a);}return n}function qee(t,e){let n=t.type,r=e.createElement(n);if(r.setAttribute("type",n),r.setAttribute("x",String(t.frame.x.toFixed(2))),r.setAttribute("y",String(t.frame.y.toFixed(2))),r.setAttribute("width",String(t.frame.width.toFixed(2))),r.setAttribute("height",String(t.frame.height.toFixed(2))),t.AXLabel!==null&&r.setAttribute("label",t.AXLabel),t.AXValue!==null&&r.setAttribute("value",t.AXValue),t.title!==null&&r.setAttribute("title",t.title),t.help!==null&&r.setAttribute("help",t.help),r.setAttribute("enabled",String(t.enabled)),t.children)for(let o=0;o<t.children.length;o++){let i=t.children[o],a=qee(i,e);r.appendChild(a);}return r}function yd(t){let e=[],n=t;for(;n;){let r=n.parentElement;if(!r||r.tagName==="AppiumAUT"){e.unshift(`${n.tagName}[1]`);break}let o=n.tagName,i=Array.from(r.children).filter(s=>s.tagName===o),a=1;for(let s=0;s<i.length;s++)if(i[s]===n){a=s+1;break}e.unshift(`${o}[${a}]`),n=r;}return `/${e.join("/")}`}var YA=class t{driver;emulator;options;aborter;constructor({driver:e,emulator:n,aborter:r,options:o}){this.driver=e,this.emulator=n,this.aborter=r,this.options=o;}static async init({driver:e,emulator:n,aborter:r,options:o}){return new t({driver:e,aborter:r,emulator:n,options:o})}async getContexts(e){let n=await this.driver.executeInNativeContext(e,async o=>await o.getContexts({}),{operationName:"getContexts"}),r=n.filter(o=>o!==kee);return {contexts:n.map(o=>o),webviews:r}}async getRawScreenshotBase64({logger:e,totalAttempts:n=3,signal:r}){let o=me(),i=r??this.aborter.controller?.signal;return await o.startAsyncSpan("EMULATOR_READ_STATE",async()=>await cp(e,()=>this.emulator.screenshotPngBase64(),{maxAttempts:n,signal:i,operationName:"takeScreenshot"}),{name:"Take screenshot",signal:i,timeoutMs:3e4})}async getCurrentScreenshotPngString(e){return `data:image/png;base64,${await this.getRawScreenshotBase64({logger:e,totalAttempts:1})}`}async waitForScreenshotStability({logger:e,timeoutMs:n,signal:r,reason:o,tolerancePercent:i=1}){await me().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async a=>{a.attributes.reason=o;let s=Mm({signal:r,timeoutMs:n}),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(fc(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 Za(Math.min(1e4,d),s);}c||(a.attributes.timedOut=true,e.warn({purpose:o},"Timed out waiting for screenshot stability"));});}async waitForPageSourceStability({logger:e,timeoutMs:n,signal:r,reason:o}){await me().startAsyncSpan("WAIT_FOR_PAGE_STABILITY",async i=>{i.attributes.reason=o;let a=Mm({signal:r,timeoutMs:n}),s,l=false;for(;!a.aborted;){let c,u=Date.now();try{c=await te(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 Za(Math.min(1e4,d),a);}l||(i.attributes.timedOut=true,e.warn({purpose:o},"Timed out waiting for page source stability"));});}async getActiveWebview(e){let r=(await this.getContexts(e)).webviews;if(r.length>1)throw new M("UserInfrastructureError","Multiple active webviews in a single package is currently not supported");return r[0]}async getActiveWebviewContent(e){let n=await this.getActiveWebview(e);if(!n)return;this.throwIfAborted();let r=await this.driver.executeWebViewScript(e,n,o=>o.dumpA11yTree());return {context:n,...r}}async getDomState(e,n){return await me().startAsyncSection("Get emulator state XML",async()=>{let i=n?.filterOffscreenElements??true?await this.getViewportBounds(e):void 0,a;if(!n?.skipFetchingFullWebviewContent)try{a=await this.getActiveWebviewContent(e);}catch(c){e.error({err:c},"Could not get webview info to get the nested DOM state");}if(this.throwIfAborted(),!a&&this.options?.disableMomenticAccessibilityTree){let c=await this.getNativePageSource();this.throwIfAborted();let u=await KA(c,{pruneElementsOutsideBounds:i});return {sourceTree:"native",graph:u,webviewContent:void 0}}let s=await this.getAppiumPageSource(e);return this.throwIfAborted(),{graph:await Hee(s,{injectedWebviewContent:a,removeWebviewContent:n?.removeWebviewContent,pruneElementsOutsideBounds:i}),sourceTree:"appium",webviewContent:a}})}async getNativePageSource(){return await me().startAsyncSpan("EMULATOR_READ_STATE",async()=>this.emulator.nativeA11yTreeJson(),{name:"Get iOS page source",signal:this.aborter.controller?.signal,timeoutMs:3e4})}async getAppiumPageSource(e,n){let r=n??this.aborter.controller?.signal;return await me().startAsyncSpan("EMULATOR_READ_STATE",()=>this.driver.executeInNativeContext(e,i=>i.getPageSource(),{signal:r,operationName:"getPageSource"}),{name:"Get page source",signal:r,timeoutMs:3e4})}async getViewportBounds(e){let n=await this.driver.executeInNativeContext(e,async r=>r.getWindowRect(),{operationName:"getViewportBounds"});return {left:n.x,top:n.y,right:n.x+n.width,bottom:n.y+n.height}}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted();}};async function Yee({command:t,logger:e,generator:n,aiSettings:r,getEmulatorDomState:o,getScreenshotBase64:i,throwIfAborted:a,abortSignal:s}){let l=me(),c=15,u=t.timeoutSecs?t.timeoutSecs*1e3:5e3,d=ov(u),m=Date.now(),p=0,f,h=false,b;for(;p<c&&!h;){a(),h||f&&f-m>=u&&(h=true),p!==0&&await fe(d,s),f=Date.now();try{let y="",S="";await l.startAsyncSpan("EMULATOR_READ_STATE",async()=>{y=await o(),S=await i();},{name:"Get emulator state"});let T=await n.evaluateIosAssertion({assertion:t.assertion,screenXml:y,screenshot:S},{logger:e,loggerTags:De(e),agentConfigVersion:r.agentConfig?.["ios-assertion"]});if(T.result)return {success:T.result,message:T.thoughts};{let C=`AssertionFailureError: ${T.thoughts}`;b=new Error(C);}}catch(y){if(a(),mS(y))throw y;e.info({err:y},`AI check assert attempt ${p} failed, retrying...`),b=y instanceof Error?y:new Error(`${y}`);}finally{p++;}}return {success:false,message:b?.message}}async function Xee({command:t,logger:e,generator:n,aiSettings:r,getEmulatorDomState:o,getScreenshotBase64:i,abortSignal:a}){if(!t.goal.trim())throw new M("ActionFailureError","Cannot perform AI extraction without goal");if(t.schema){let u=wm(t.schema);if(u)throw new M("UserConfigurationError",u)}let s=me(),l="",c="";return await s.startAsyncSpan("EMULATOR_READ_STATE",async()=>{l=await o(),c=await i();},{name:"Get emulator state"}),await s.startAsyncSpan("AI_EXTRACTION_CALL",async u=>{try{let d=await n.getIosTextExtraction({goal:t.goal,emulatorState:l,returnSchema:t.schema,screenshot:`data:image/png;base64,${c}`},{disableCache:!!t.disableCache,abortSignal:a,loggerTags:De(e),agentConfigVersion:r.agentConfig?.["ios-text-extraction"]});if(u.result=d,lC({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 M("UserConfigurationError",d.thoughts);return {success:!0,output:d.result,message:d.thoughts}}catch(d){let m=H(d);throw m.includes("MaxGenerationLengthExceededError")?new M("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step instead."):m.includes("AIProviderError")&&m.includes("time")?new M("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}})}function Sd(t){let{x1:e,y1:n,x2:r,y2:o}=t.bounds;return {left:e,top:n,width:r-e,height:o-n}}var vs="element-6066-11e4-a52e-4f735466cecf";function Cs(t,e){return Math.abs(t-e)<1}function rf(t,e){let n=e.x2-e.x1,r=(e.x1+e.x2)/2,o=(t.x1+t.x2)/2;if(!cs(e.tolerance,r,o,Math.min(1,n)))return false;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(t.y1+t.y2)/2;return cs(e.tolerance,a,s,Math.min(1,i))}function of(t,e){let n=t.x2-t.x1,r=t.y2-t.y1;return cs(e.tolerance,e.width,n,Math.min(1,e.width))?cs(e.tolerance,e.height,r,Math.min(1,e.height)):false}function af(t){return t.type==="WEBVIEW",t.cache}function sf(t){let{command:e,cacheKey:n="cache",targetName:r="target",updatedCache:o}=t;$M(e)&&(e[n]={...e[n],[r]:Kd.parse(o)},t.updatedWithAI&&(e[n].updatedAt=new Date,e[n].updatedAtLoggerTags=De(t.logger)));}var Ay="name";async function Jee(t,e,n){return await e.executeInNativeContext(t,r=>r.isElementDisplayed(n),{operationName:"isElementRendered"})}async function lf(t,e,n,r){return await e.executeInNativeContext(t,o=>o.getElementAttribute(n,r),{operationName:"getAttributeFromIosElement"})}async function U0(t,e,n){return await e.executeInNativeContext(t,async r=>{try{let o=await r.findElement("xpath",n);if(!o)return null;let i=o[vs];if(!i)return null;let a=await r.getElementRect(i);return {elementId:i,rect:a}}catch{return null}},{operationName:"findElementByXPath"})}async function Zee(t,e,n){let r=yd(n),o=await U0(t,e,r);if(o)return {xPath:r,...o}}async function z0({logger:t,emulatorState:e,driver:n,idInWebview:r,requirements:o}){let i=e.graph.webviewRootElement?yd(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 e1e({logger:t,driver:n,webviewRootBounds:e.graph.webviewRootBounds,nodeIdInWebview:r,aiGeneratedRequirements:o,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 e1e({logger:t,driver:e,webviewRootBounds:n,nodeIdInWebview:r,aiGeneratedRequirements:o,webviewContent:i}){let a=await e.executeWebViewScript(t,i.context,(l,c,u,d)=>l.generateCacheFromWebviewElementId(c,u,d),i.generatedAt,r,{attributesToFetch:o?.attributesRequired??[]});if(!a)return;let s={x:n.x1-i.rootBoundingBox.x+a.boundingBox.x,y:n.y1-i.rootBoundingBox.y+a.boundingBox.y,width:a.boundingBox.width,height:a.boundingBox.height};return {id:a.id,generatedSelectors:a.selectors,boundingBox:s,requirements:{text:o?.textRequired?a.textContent:void 0,attributes:a.attributes,boundingBox:o?.boundsRequired?s:void 0,shape:o?.shapeSpecificity?{tolerance:o.shapeSpecificity,width:a.boundingBox.width,height:a.boundingBox.height}:void 0,position:o?.positionSpecificity?{tolerance:o.positionSpecificity,x1:s.x,y1:s.y,x2:s.x+s.width,y2:s.y+s.height}:void 0}}}async function t1e(t,e,n,r){if(!r||!r.length)return;let o={};for(let i of r){let a=await lf(t,e,n,i);a!==null&&(o[i]=a);}return Object.keys(o).length?o:void 0}async function Qee({logger:t,driver:e,node:n,requirements:r}){let o=await Zee(t,e,n);if(!o){t.warn("Failed to generate valid xPath selector for element");return}let{xPath:i,rect:a,elementId:s}=o,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:r?.textRequired?await lf(t,e,s,Ay)??void 0:void 0,requiredAttributes:await t1e(t,e,s,r?.attributesRequired?.filter(c=>!(r.textRequired&&c===Ay))),requiredBounds:r?.boundsRequired,position:r?.positionSpecificity?{x1:l.x1,y1:l.y1,x2:l.x2,y2:l.y2,tolerance:r?.positionSpecificity}:void 0,shape:r?.shapeSpecificity?{width:l.x2-l.x1,height:l.y2-l.y1,tolerance:r?.shapeSpecificity}:void 0}}}async function ete({logger:t,driver:e,aiResponse:n,description:r,emulatorState:o}){let i=o.graph.idToPrunedElement.get(n.id);if(!i)throw new Error(`Could not find node with id: ${n.id}`);let a=GA(i);if(!a)throw new Error(`Could not determine bounds for element with id: ${n.id}, description: ${r}`);let s=[];for(let{id:d,requirements:m}of n.additionalElements??[]){let p=o.graph.idToIdInWebview.get(d);if(p!==void 0){try{let b=await z0({logger:t,driver:e,emulatorState:o,idInWebview:p,requirements:m});s.push(b);}catch(b){t.warn({err:b},`Failed to build webview cache for related element with id: ${d}`);}continue}let f=o.graph.idToOriginalElement.get(d);if(!f){t.warn(`Could not find original element for additional element with id: ${d}`);continue}let h=await Qee({logger:t,driver:e,node:f,requirements:m});h&&s.push(h);}let l=o.graph.idToIdInWebview.get(n.id);if(l!==void 0){let d={type:"WEBVIEW",bounds:a,cache:{type:"WEBVIEW"}};try{let m=await z0({logger:t,driver:e,emulatorState:o,idInWebview:l,requirements:n.requirements});return {...d,cache:{type:"WEBVIEW",resolvedDescription:r,requiredRelatedElements:s,...m}}}catch(m){return t.warn({err:m},"Failed to build webview target cache"),d}}let c=o.graph.idToOriginalElement.get(n.id);if(!c)throw new Error(`Node isn't in a webview but couldn't find original node for id: ${n.id}, description: ${r}`);let u=await Qee({logger:t,driver:e,node:c,requirements:n.requirements});return u?{type:"NATIVE",bounds:a,cache:{type:"NATIVE",...u,resolvedDescription:r,sourceTree:"appium",requiredRelatedElements:s,elementOnlySerializedXml:qA(c)}}:(t.warn("Failed to generate valid cache for element"),{type:"NATIVE",cache:{type:"NATIVE"},bounds:a})}async function $0({logger:t,driver:e,stateManager:n,parentWebviewBounds:r,cache:o}){if(!o||!o.generatedSelectors)throw new Pe("Cache is missing required attributes");let i=await n.getActiveWebview(t);if(!i)throw new Pe("No active webview context found");let a=await e.executeWebViewScript(t,i,(u,d)=>u.resolveWebviewTargetCache(d),{selectors:o.generatedSelectors,attributesToFetch:Object.keys(o.requirements?.attributes??{})});if(!a)throw new Pe("Failed to resolve webview target using cache");let s=r.x1-a.rootBoundingBox.x+a.boundingBox.x,l=r.y1-a.rootBoundingBox.y+a.boundingBox.y,c={x1:s,y1:l,x2:s+a.boundingBox.width,y2:l+a.boundingBox.height};return o.requirements&&n1e(t,c,a,o.requirements),c}function n1e(t,e,n,r){if(!r)return;let{attributes:o,text:i,position:a,shape:s}=r;if(i!==void 0&&i.length>0&&n.textContent!==i)throw new Pe(`Text content mismatch: expected "${i}", got "${n.textContent}"`);if(o)for(let[l,c]of Object.entries(o)){let u=n.attributes[l];if(u!==c)throw new Pe(`Attribute ${l} mismatch: expected "${c}", got "${u}"`)}if(a&&!rf(e,a))throw new Pe(`Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(e)}`);if(s&&!of(e,s))throw new Pe(`Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(e)}`)}async function tte(t,e,n,r,o){if(!r)return;let{requiredAttributes:i,requiredText:a,requiredBounds:s,position:l,shape:c}=r;if(a!==void 0&&a.length>0){let u=await lf(t,e,n,Ay);if(u!==a)throw new Pe(`Resolved element text mismatch: expected ${a}, got ${u}`)}if(i)for(let[u,d]of Object.entries(i)){let m=await lf(t,e,n,u)??void 0;if(m!==d)throw new Pe(`Attribute ${u} mismatch: expected ${d}, got ${m}`)}if(s&&o){let{originalBounds:u,newBounds:d}=o;if(!u)throw new Pe("Cannot validate bounds requirements without original bounds in cache");if(!(Cs(u.x1,d.x1)&&Cs(u.y1,d.y1)&&Cs(u.x2,d.x2)&&Cs(u.y2,d.y2))){let p=f=>`[${f.x1},${f.y1},${f.x2},${f.y2}]`;throw new Pe(`Bounds changed from ${p(u)} to ${p(d)}`)}}if(l&&o&&!rf(o.newBounds,l))throw new Pe(`Position mismatch: expected ${JSON.stringify(l)}, got ${JSON.stringify(o.newBounds)}`);if(c&&o&&!of(o.newBounds,c))throw new Pe(`Shape mismatch: expected ${JSON.stringify(c)}, got ${JSON.stringify(o.newBounds)}`)}async function nte({logger:t,driver:e,xPath:n,elementType:r,skipVisibilityCheck:o=false}){let i=await U0(t,e,n);if(!i)throw new Pe(`Could not resolve ${r} via XPath: ${n}`);let{elementId:a}=i;if(!o&&!await Jee(t,e,a))throw new Pe(`${r} resolved via XPath is not rendered: ${n}`);return i}async function rte({target:t,driver:e,stateManager:n,logger:r}){if(!t.xPath)throw new Pe(`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 nte({logger:r,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 $0({logger:r,driver:e,stateManager:n,parentWebviewBounds:d,cache:l.browserCache});}else await tte(r,e,c,l.requirements);}}let{elementId:o,rect:i}=await nte({logger:r,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 $0({logger:r,driver:e,stateManager:n,parentWebviewBounds:a,cache:t.browserCache});return {type:"WEBVIEW",bounds:s,cache:t}}return await tte(r,e,o,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 ite({aiResponse:t,description:e,emulatorState:n}){let r=n.graph.idToPrunedElement.get(t.id);if(!r)throw new Error(`Could not find node with id: ${t.id}`);let o=GA(r);if(!o)throw new Error(`Could not determine bounds for element with id: ${t.id}, description: ${e}`);let i=n.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=yd(i),s=qA(i),l=ote({requirements:t.requirements,element:i}),c=(t.additionalElements??[]).map(({id:u,requirements:d})=>{let m=n.graph.idToOriginalElement.get(u);return m?{xPath:yd(m),requirements:ote({requirements:d,element:m})}:void 0}).filter(u=>!!u);return {type:"NATIVE",bounds:o,cache:{type:"NATIVE",bounds:[o.x1,o.y1,o.x2,o.y2],resolvedDescription:e,sourceTree:n.sourceTree,xPath:a,elementOnlySerializedXml:s,requirements:l,requiredRelatedElements:c}}}function ote({requirements:t,element:e}){let n;if((t?.positionSpecificity||t?.shapeSpecificity)&&(n=ll(e),!n))throw new M("ActionFailureError","Element to cache has no bounds or unexpected bounds format");return {requiredText:t?.textRequired?e.textContent??void 0:void 0,requiredAttributes:r1e(e,t?.attributesRequired),requiredBounds:t?.boundsRequired,position:t?.positionSpecificity?{x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,tolerance:t?.positionSpecificity}:void 0,shape:t?.shapeSpecificity?{width:n.x2-n.x1,height:n.y2-n.y1,tolerance:t?.shapeSpecificity}:void 0}}function r1e(t,e){if(t&&!(!e||e.length===0))return Object.fromEntries(e.map(n=>[n,t.getAttribute(n)]).filter(([,n])=>n!==null))}async function ste(t,e,n,r){if(!n)return;let{requiredAttributes:o,requiredText:i,requiredBounds:a,position:s,shape:l}=n;if(i!==void 0&&i.length>0){let c=e.textContent;if(c!==i)throw new Pe(`Resolved element text mismatch: expected ${i}, got ${c}`)}if(o)for(let[c,u]of Object.entries(o)){let d=e.getAttribute(c)??void 0;if(d!==u)throw new Pe(`Attribute ${c} mismatch: expected ${u}, got ${d}`)}if(a&&r){let{originalBounds:c,newBounds:u}=r;if(!c)throw new Pe("Cannot validate bounds requirements without original bounds in cache");if(!(Cs(c.x1,u.x1)&&Cs(c.y1,u.y1)&&Cs(c.x2,u.x2)&&Cs(c.y2,u.y2))){let m=p=>`[${p.x1},${p.y1},${p.x2},${p.y2}]`;throw new Pe(`Bounds changed from ${m(c)} to ${m(u)}`)}}if(s&&r&&!rf(r.newBounds,s))throw new Pe(`Position mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(r.newBounds)}`);if(l&&r&&!of(r.newBounds,l))throw new Pe(`Shape mismatch: expected ${JSON.stringify(l)}, got ${JSON.stringify(r.newBounds)}`)}async function lte({target:t,logger:e,emulator:n}){if(!t.xPath)throw new Pe(`Could not resolve cached target via XPath: ${t.xPath}`);let r=await n.nativeA11yTreeJson(),o=await KA(r,{pruneElementsOutsideBounds:void 0});if(t.requiredRelatedElements){let s=t.requiredRelatedElements;for(let l of s){let c=QQ.evaluateXPathToFirstNode(l.xPath,o.originalDocument);if(!c)throw new Pe(`Required related element not found for XPath: ${l.xPath}`);await ste(e,c,l.requirements);}}let i=QQ.evaluateXPathToFirstNode(t.xPath,o.originalDocument);if(!i)throw new Pe(`Could not resolve cached target via XPath: ${t.xPath}`);let a=ll(i);if(!a)throw new Pe(`Could not determine bounds for cached target via XPath: ${t.xPath}`);return await ste(e,i,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]}}}async function cte({logger:t,driver:e,aiResponse:n,description:r,emulatorState:o}){switch(o.sourceTree){case "appium":return await ete({logger:t,driver:e,aiResponse:n,description:r,emulatorState:o});case "native":return await ite({aiResponse:n,description:r,emulatorState:o});default:{let i=o.sourceTree;throw new Error(`Unsupported source tree type for building iOS target cache: ${i}`)}}}async function ute({target:t,driver:e,stateManager:n,logger:r,emulator:o}){if(t.type==="WEBVIEW"||!t.sourceTree||t.sourceTree=="appium")return await rte({target:t,driver:e,stateManager:n,logger:r});switch(t.sourceTree){case "native":return await lte({target:t,logger:r,emulator:o});default:{let i=t.sourceTree;throw new Error(`Unsupported source tree type for resolving iOS target cache: ${i}`)}}}var rr=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:n,description:r,skipFetchingFullWebviewContent:o=false,removeWebviewContent:i=false,filterOffscreenElements:a=true,useMemory:s=false,metadata:l,cacheBustReason:c}){let u=e.child({...l});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:d,screenshot:m}=await n.startAsyncSection("Get emulator state",async()=>{let h=await this.stateManager.getCurrentScreenshotPngString(e);return {emulatorState:await this.stateManager.getDomState(e,{skipFetchingFullWebviewContent:o,removeWebviewContent:i,filterOffscreenElements:a}),screenshot:h}}),p;try{p=await n.startAsyncSpan("AI_LOCATOR_CALL",async h=>{c&&(h.attributes.cacheBustReason=c);let b=await this.generator.getIosElementLocation({description:r,screenXml:d.graph.xml,screenshot:m,source:l?.source==="SCROLL_TO"?"SCROLL_TO":void 0},{logger:u,loggerTags:De(u),abortSignal:this.aborter.controller?.signal,useMemory:s,agentConfigVersion:this.aiSettings.agentConfig?.["ios-locator"]});return h.result=b,b});}catch(h){throw this.throwIfAborted(),u.error({err:h},"Failed to locate element"),new Error(`ActionFailureError: Failed to locate element: ${h instanceof Error?h.message:h}`,{cause:h})}if(p.id===-1)throw new M("NoMatchingElementError",p.thoughts??"No matching element found");let f=await cte({logger:e,driver:this.driver,aiResponse:p,description:r,emulatorState:d});return n.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:(f.type==="NATIVE"?f.cache.elementOnlySerializedXml:void 0)??"Unknown element"},attributes:{},subSpans:[]}),{resolvedTarget:f,thoughts:p.thoughts}}async targetingActionWithAILocator(e){let{tracer:n,action:r,command:o,description:i,cacheKey:a,targetName:s,skipFetchingFullWebviewContent:l,removeWebviewContent:c,metadata:u,logger:d,cacheBustReason:m}=e,p=await this.findElement({logger:d,tracer:n,description:i,skipFetchingFullWebviewContent:l,removeWebviewContent:c,metadata:u,cacheBustReason:m}),f=p.thoughts,h=await r(p.resolvedTarget);return sf({command:o,cacheKey:a,targetName:s,updatedCache:af(p.resolvedTarget),updatedWithAI:true,logger:d}),{result:h,thoughts:f}}async targetingActionWithCache({logger:e,tracer:n,action:r,command:o,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:n,cache:s}),c=await r(l);return sf({command:o,cacheKey:i,targetName:a,updatedCache:af(l),updatedWithAI:false,logger:e}),{result:c,thoughts:"Successfully executed preset action with cache"}}async resolveTargetCacheWithTracing({logger:e,tracer:n,cache:r,retryWithinSmartWaiting:o=true}){let{resolvedTarget:i}=await n.startAsyncSpan("CACHE_RESOLUTION",async a=>{let s=Date.now(),l;for(;!o||Date.now()-s<3e3;)try{let c=await ute({target:r,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 Pe){if(!o)throw c;e.warn({err:c},"Failed to resolve target cache, retrying"),await Za(500,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:n,logger:r,action:o,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 b=a.cache;l==="target"&&"target"in b?h=cloneDeep(b.target):l==="fromTarget"&&"fromTarget"in b?h=cloneDeep(b.fromTarget):l==="toTarget"&&"toTarget"in b&&(h=cloneDeep(b.toTarget));}if(a.disableCache&&(r.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&&!vc(h.resolvedDescription??"",i)&&(r.info({description:i,cacheDescription:h.resolvedDescription},"Cache description mismatch, clearing it automatically"),p=true,f="Description mismatch",h=void 0),h){let b=h.type==="NATIVE"?!!h.requirements:!!h.browserCache?.requirements;try{let y=await this.targetingActionWithCache({logger:r,tracer:n,action:o,command:a,cacheKey:s,targetName:l,cacheCopyForAttempt:h});return Ge.increment("cache_target_resolution_v2",1,["outcome:hit","platform:mobile-native",`hasRequirements:${b}`,`orgId:${this.orgId}`,"cliVersion:0.111.1"]),y}catch(y){if(this.throwIfAborted(),y instanceof M&&y.reason!=="InternalWebAgentError")throw r.error({err:y},"Failed to execute action with target cache (fatal)"),y;Ge.increment("cache_target_resolution_v2",1,["outcome:miss","platform:mobile-native",`hasRequirements:${b}`,`orgId:${this.orgId}`,"cliVersion:0.111.1"]),r.warn({err:y},"Failed to execute action with target cache, retrying with AI");}}return r.info({description:i,cacheBustedBeforeAction:p},"Prompting AI for a new element location"),await this.targetingActionWithAILocator({tracer:n,action:o,command:a,description:i,cacheKey:s,targetName:l,skipFetchingFullWebviewContent:u,removeWebviewContent:d,metadata:m,logger:r,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 JA=class extends rr{async doDrag(e,n,r,o,i){let{x1:a,y1:s,x2:l,y2:c}=r.bounds,u=a+(l-a)/2,d=s+(c-s)/2;n.attributes.startPoint={x:u,y:d};let{x1:m,y1:p,x2:f,y2:h}=o.bounds,b=m+(f-m)/2,y=p+(h-p)/2;n.attributes.endPoint={x:b,y};let S=i?.hoverDuration??500,T=i?.dragDuration??1e3;T===0&&(T=1);let w=Math.sqrt(Math.pow(b-u,2)+Math.pow(y-d,2))/T*1e3;await this.driver.executeInNativeContext(e,async _=>{await _.execute("mobile: dragFromToWithVelocity",{fromX:u,fromY:d,toX:b,toY:y,pressDuration:S/1e3,velocity:w,holdDuration:.5});},{operationName:"dragAndDrop"});}async executeDragAndDrop({logger:e,command:n}){let r=me();if(n.fromTarget.type!=="description"||n.toTarget.type!=="description")throw new M("UserConfigurationError","Drag and drop only supports description targets for now");let o=n.fromTarget.description,{result:i,thoughts:a}=await this.wrapTargetingAction({command:n,tracer:r,description:o,cacheKey:"cache",targetName:"fromTarget",action:async u=>u,logger:e}),s=n.toTarget.description,{result:l,thoughts:c}=await this.wrapTargetingAction({command:n,tracer:r,description:s,cacheKey:"cache",targetName:"toTarget",action:async u=>u,logger:e});return await r.startAsyncSpan("EMULATOR_INTERACTION",async u=>{await this.doDrag(e,u,i,l,{hoverDuration:n.hoverDuration,dragDuration:n.dragDuration});},{name:"Drag and drop"}),{success:true,message:`${a}
|
|
5881
5881
|
${c}`}}};var ZA=class{driver;logger;constructor(e,n){this.driver=e,this.logger=n;}async getTextContent(e){let n=e.cache.xPath;return n?await this.driver.executeInNativeContext(this.logger,async o=>{try{let a=(await o.findElement("xpath",n))[vs];if(!a)return "";let s=await o.getElementAttribute(a,"label"),l=await o.getElementAttribute(a,"value");return [s,l].filter(u=>!!u&&u.trim().length>0).join(" ").trim()}catch{return ""}},{operationName:"getNativeElementTextContent"})??"":""}async getAttribute(e,n){let r=e.cache.xPath;return r?await this.driver.executeInNativeContext(this.logger,async i=>{try{let s=(await i.findElement("xpath",r))[vs];return s?await i.getElementAttribute(s,n)??"":""}catch{return ""}},{operationName:"getNativeElementAttribute"})??"":""}async getTagName(e){let n=e.cache.xPath;return n?await this.driver.executeInNativeContext(this.logger,async o=>{try{let a=(await o.findElement("xpath",n))[vs];return a?await o.getElementTagName(a)??"":""}catch{return ""}},{operationName:"getNativeElementTagName"})??"":""}async isEditable(e){throw new M("UserConfigurationError","Editable checks are not supported on iOS native elements")}async isEnabled(e){let n=e.cache.xPath;return n?await this.driver.executeInNativeContext(this.logger,async r=>{try{let i=(await r.findElement("xpath",n))[vs];return i?await r.isElementEnabled(i):!1}catch{return false}},{operationName:"isNativeElementEnabled"}):false}async isFocused(e){let n=await this.getAttribute(e,"focused");return n==="true"||n==="1"}async getStyleProperty(e,n){throw new M("UserConfigurationError","Computed style checks are not supported on iOS native elements")}},QA=class{driver;webviewContext;logger;constructor(e,n,r){this.driver=e,this.webviewContext=n,this.logger=r;}getCenter(e){let{x1:n,y1:r,x2:o,y2:i}=e.bounds;return {x:(n+o)/2,y:(r+i)/2}}async getTextContent(e){let{x:n,y:r}=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??"":""},n,r)??""}async getAttribute(e,n){let{x:r,y:o}=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)??"":""},r,o,n)??""}async getTagName(e){let{x:n,y:r}=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:""},n,r)??""}async isEditable(e){let{x:n,y:r}=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},n,r)}async isEnabled(e){let{x:n,y:r}=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},n,r)}async isFocused(e){let{x:n,y:r}=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},n,r)}async getStyleProperty(e,n){let{x:r,y:o}=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):""},r,o,n)??""}};var o1e=5e3,eR=class extends rr{async executeElementCheck({logger:e,command:n}){let r=Date.now(),o=(n.timeout??lr)*1e3,i=o+1e4,a,s=0,l=500,c=cloneDeep(n.cache);if(n.target.type!=="description")throw new M("UserConfigurationError","x/y targets are not supported for the Element check step");for(;s-r<o;){if(Date.now()-r>i){e.warn("Exceeded max system timeout for element check, exiting...");break}if(this.throwIfAborted(),a=await this.executeElementCheckHelper({logger:e,command:n}),s=Date.now(),!a.success)n.cache=c,c=cloneDeep(c),await fe(l,this.abortSignal),l=Math.min(Math.floor(l*1.5),o1e);else return a}let u=await this.executeElementCheckHelper({logger:e,command:n,cacheIsInvalidAfterResolution:true});if(!u.success&&c&&n.cache){let d=Tq({logger:e,originalTarget:UM(c)?c.target:void 0,newTarget:n.cache.target});d&&Gs(c.target,d)&&(n.cache={target:d,updatedAt:n.cache.updatedAt});}return u}async executeElementCheckHelper({logger:e,command:n,cacheIsInvalidAfterResolution:r}){let o=me();if(n.target.type!=="description")throw new M("UserConfigurationError","x/y targets are not supported for the Element check step");let i=zm(n.assertion);try{return (await this.wrapTargetingAction({...r?{cacheIsInvalidAfterResolution:r}:{},command:n,tracer:o,action:async s=>s.type==="NATIVE"?await this.executeNativeElementCheck(e,n,s):await this.executeWebviewElementCheck(e,n,s),description:n.target.description,logger:e})).result}catch(a){return i&&(a instanceof M&&a.reason==="NoMatchingElementError"||a instanceof _a)?{success:true}:{success:false,message:`Failed to evaluate element content assertion: ${a instanceof Error?a.message:`${a}`}`}}}async executeNativeElementCheck(e,n,r){let o=me(),{assertion:i}=n;return await o.startAsyncSpan("ELEMENT_ASSERTION",async a=>{a.targetBounds=Sd(r);let s=await this.executeElementAssertion({assertion:i,element:r,elementPropertyAccessors:new ZA(this.driver,e),span:a});return a.result=s,s},{name:"Native element check"})}async executeWebviewElementCheck(e,n,r){let o=me(),{assertion:i}=n,s=(await this.stateManager.getContexts(e)).webviews[0];if(!s)throw new M("UserConfigurationError","No active webview context found for element check");return await o.startAsyncSpan("ELEMENT_ASSERTION",async l=>{l.targetBounds=Sd(r);let c=await this.executeElementAssertion({assertion:i,element:r,elementPropertyAccessors:new QA(this.driver,s,e),span:l});return l.result=c,c},{name:"Webview element check"})}async executeElementAssertion({assertion:e,element:n,elementPropertyAccessors:r,span:o}){switch(e.type){case "ELEMENT_CONTENT":{let i=await r.getTextContent(n)??"";return o.attributes.elementTextContent=In(i,500,true),So(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})?{success:true}:{success:false,message:`The content ${Er(e)} '${e.value}': ${i}`}}case "ELEMENT_ATTRIBUTE":{let i=null;try{i=await r.getAttribute(n,e.attr);}catch{i=null;}if(!So(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let a=Er(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 r.isEditable(n);break;case "VISIBLE":case "EXISTS":i=true;break;case "ENABLED":{i=await r.isEnabled(n);break}case "FOCUSED":i=await r.isFocused(n);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 ${Er(e)}`}}case "ELEMENT_NAME":{let i=await r.getTagName(n);return So(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:true})?{success:true}:{success:false,message:`The element tag name ${Er(e)} '${e.value}': ${i}`}}case "ELEMENT_STYLE":{let i=await r.getStyleProperty(n,e.property);if(!So(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:false})){let a=Er(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 mte({command:t,orgId:e,logger:n,fixtures:r,abortSignal:o}){let i;try{i=await Fi({orgId:e,code:t.code,fragment:!1,context:r.testContext,timeoutMs:t.timeout?t.timeout*1e3:void 0,logger:n,localTools:r.localCodeEvalTools,signal:o});}catch(a){throw new M("ActionFailureError",a instanceof M?a.message:`${a}`,{errOptions:{cause:a}})}try{JSON.stringify(i);}catch(a){throw new M("UserConfigurationError",`Return value is not serializable: ${a instanceof Error?a.message:`${a}`}`)}return {success:true,output:i}}async function pte({command:t,emulator:e}){switch(t.key){case "ENTER":await e.pressKey("enter");break;case "BACKSPACE":await e.pressKey("backspace");break;default:{t.key;}}return {success:true}}var fte=v__default.object({name:v__default.string(),pid:v__default.number(),bundleId:v__default.string()});var cf=class extends rr{async doPress(e,{name:n,longPress:r}){return this.driver.executeInNativeContext(e,o=>o.executeScript("mobile: pressButton",[{name:n,isLongPress:r}]),{operationName:"pressButton"})}};var i1e="com.apple.springboard",hte=5,nR=class extends rr{async execute(e){let n;for(let r=0;r<hte;r++){this.throwIfAborted();try{let i=await this.driver.executeInNativeContext(e,s=>s.executeScript("mobile: activeAppInfo",[]),{operationName:"getActiveAppInfo"});n=fte.parse(i).bundleId;}catch(i){throw new M("UserConfigurationError",`Failed to get active app info: ${i.message}`)}if(!n)return {success:true,message:"No active app found"};if(await new cf(this.constructPerformerParams()).doPress(e,{name:"home"}),n!==i1e)return await this.emulator.terminateApp(n),{success:true};await fe(500,this.abortSignal);}throw new M("ActionFailureError",`Failed to dismiss notification after ${hte} attempts, cannot kill the underlying app`)}};var a1e="FBSApplicationLibrary) returned nil";function gte(t){return H(t).includes(a1e)}async function bte({driver:t,logger:e,bundleId:n,launchArguments:r}){try{await t.executeInNativeContext(e,o=>o.execute("mobile: launchApp",{bundleId:n,arguments:r}),{operationName:"launchApp"});}catch(o){throw gte(o)?new Tl(`App "${n}" 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:o}):o}}async function yte({command:t,logger:e}){let n;try{n=new URL(t.url).hostname;}catch(l){throw new M("UserConfigurationError",`Invalid URL: ${l instanceof Error?l.message:`${l}`}`)}let r=new CookieJar,o=uIe(fetch,r),i=Date.now(),a=await vp({command:t,baseUrl:void 0,logger:e,fetchImplementation:o}),s=rm(r,n);return {output:Pd.parse({...a,cookies:s}),success:true,message:`Successfully executed request in ${Date.now()-i}ms`}}async function Ste({command:t,emulator:e,driver:n,logger:r,getViewportBounds:o}){return e.setOrientation?await e.setOrientation(t.orientation):await n.executeInNativeContext(r,async i=>{await i.setOrientation(t.orientation==="LANDSCAPE"?"landscape":"portrait");},{operationName:"setOrientation"}),{success:true,output:{newViewportBounds:await o()}}}var c1e=5e3,rR=class extends rr{async executeScreenCheck(e,n){let{timeout:r}=n,o=Date.now(),i=(r??lr)*1e3,a=i+1e4,s=0,l=500;for(;s-o<i;){if(Date.now()-o>a){e.warn("Exceeded max system timeout for screen check, exiting...");break}this.throwIfAborted();let c=await this.executeScreenCheckHelper(e,n);if(s=Date.now(),!c.success)await fe(l,this.abortSignal),l=Math.min(Math.floor(l*1.5),c1e);else return c}return await this.executeScreenCheckHelper(e,n)}async executeScreenCheckHelper(e,n){let r=await this.executeNativeScreenCheckHelper(e,n);if(!n.assertion.negated&&r.success)return r;let o=await this.executeWebviewScreenCheckHelper(e,n);return o?n.assertion.negated?r.success&&o.success?r:r.success?o:r:r.success?r:o:r}async executeNativeScreenCheckHelper(e,n){let{assertion:r}=n;switch(r.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(r.value)===!r.negated;return i.length>1e4&&(i=i.slice(0,1e4)+"...TRUNCATED"),a?{success:!0}:{success:!1,message:`The screen ${Um({...r,negated:!r.negated})}.`}}catch(o){if(mS(o))throw o;return {success:false,message:`Failed to evaluate screen content assertion: ${o instanceof Error?o.message:`${o}`}`}}default:return r.type,{success:false,message:`Unsupported screen check assertion type: ${r.type}`}}}async executeWebviewScreenCheckHelper(e,n){let r;try{if(r=await this.stateManager.getActiveWebview(e),!r)return}catch(i){e.warn({err:i},"Failed to get active webview context during screen check");return}let{assertion:o}=n;switch(o.type){case "CONTENT":try{return await this.driver.executeWebViewScript(e,r,(a,s,l)=>document.body.innerHTML.includes(s)===!l,o.value,!!o.negated)?{success:!0}:{success:!1,message:`The webview ${Um({...o,negated:!o.negated})}.`}}catch(i){e.warn({err:i},"Failed to check webview content during screen check");return}default:return}}};var u1e=.9,cl=.2,d1e=500;function j0(t,e){t.attributes.scrollableElementType=e.type,t.attributes.scrollableElementDisplay=Ls(e),e.type==="CUSTOM"&&(t.attributes.scrollableElementDescription=e.target.description);}var uf=class extends rr{async getHardcodedScrollableElementBounds(e,n){let r;switch(e.type){case "SCREEN":r=this.getContainerBoundsFromViewport(n);break;case "OPEN_APP":r=this.getContainerBoundsFromViewport(n);break;case "OPEN_WEBVIEW":{r=this.getContainerBoundsFromViewport(n);break}default:{throw new Error("If Typescript complains about the line above, you missed a switch case")}}return r}getContainerBoundsFromViewport(e){return {left:e.x,top:e.y,width:e.width,height:e.height}}getContainerBoundsFromBounds(e){let n=e.x1,r=e.y1,o=e.x2,i=e.y2,a=o-n,s=i-r;return {left:n,top:r,width:a,height:s}}async executeSwipe({logger:e,command:n}){let r=me(),o=Ls(n.scrollableElement);if(n.scrollableElement.type==="CUSTOM_COORDINATES"){let{startX:a,startY:s,deltaPixels:l}=n.scrollableElement;return await r.startAsyncSpan("EMULATOR_INTERACTION",async c=>{j0(c,n.scrollableElement),await this.performRawSwipe({logger:e,span:c,startX:a,startY:s,deltaPixels:l,direction:n.direction,durationMs:n.durationMs});},{name:`Swipe ${n.direction} in ${o}`}),{success:true,message:"Successfully executed swipe action"}}if(n.scrollableElement.type!=="CUSTOM"){let a=await this.driver.executeInNativeContext(e,async l=>l.getWindowRect(),{operationName:"getSwipeViewportRect"}),s=await this.getHardcodedScrollableElementBounds(n.scrollableElement,a);return await r.startAsyncSpan("EMULATOR_INTERACTION",async l=>{j0(l,n.scrollableElement),await this.swipeByAbsoluteCoordinates({logger:e,span:l,direction:n.direction,percent:n.viewportPercent,durationMs:n.durationMs,containerBounds:s,relativePosition:n.relativePosition?Zt(n.relativePosition):void 0});},{name:`Swipe ${n.direction} in ${o}`}),{success:true,message:"Successfully executed swipe action"}}let{thoughts:i}=await this.wrapTargetingAction({command:n,description:n.scrollableElement.target.description,action:async a=>me().startAsyncSpan("EMULATOR_INTERACTION",async l=>(j0(l,n.scrollableElement),this.scrollInNativeContainer({logger:e,span:l,cmd:n,target:a})),{name:`Swipe ${n.direction} in ${o}`}),tracer:r,logger:e});return {success:true,message:i}}async scrollInNativeContainer({logger:e,span:n,cmd:r,target:o}){let i=o.bounds,a=this.getContainerBoundsFromBounds(i);await this.swipeByAbsoluteCoordinates({logger:e,span:n,direction:r.direction,percent:r.viewportPercent,durationMs:r.durationMs,containerBounds:a,relativePosition:r.relativePosition?Zt(r.relativePosition):void 0});}async swipeByAbsoluteCoordinates({logger:e,span:n,direction:r,percent:o=u1e,durationMs:i,containerBounds:a,relativePosition:s}){n.attributes.containerBounds=a;let l=r==="up"||r==="down",c=a.width*cl,u=a.height*cl,d=l?(a.height-2*u)*o:(a.width-2*c)*o,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(r),desiredDelta:d});m=h.startX,p=h.startY,f=h.actualDelta;}await this.performRawSwipe({logger:e,span:n,startX:m,startY:p,deltaPixels:f,direction:r,durationMs:i});}calculateSwipeCoordinates({containerBounds:e,direction:n,desiredDelta:r}){let o=e.left+e.width/2,i=e.top+e.height/2;if(n==="up"||n==="down"){let a=e.height*cl,s=e.top+a,l=e.top+e.height-a,c=l-s,u=Math.min(Math.abs(r),c),d=c-u,m=n==="down"?l-d/2:s+d/2;return {startX:o,startY:m,actualDelta:u}}else {let a=e.width*cl,s=e.left+a,l=e.left+e.width-a,c=l-s,u=Math.min(Math.abs(r),c),d=c-u;return {startX:n==="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:n,startX:r,startY:o,deltaPixels:i,direction:a,durationMs:s=300}){let l=Math.abs(i),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=r,f=o,h=r,b=o;a==="up"||a==="down"?(f=a==="up"?o-l:o+l,h=p,b=a==="up"?f+m:f-m):(p=a==="left"?r-l:r+l,h=a==="left"?p+m:p-m,b=f),n.attributes.pixelDelta=l,n.attributes.startPoint={x:r,y:o},n.attributes.endPoint={x:p,y:f},n.attributes.durationMs=c,await this.driver.executeInNativeContext(e,async y=>{let S={type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:r,y:o},{type:"pointerDown",button:0},{type:"pause",duration:300},{type:"pointerMove",duration:d,x:h,y:b},{type:"pointerMove",duration:u,x:p,y:f},{type:"pause",duration:300},{type:"pointerUp",button:0}]};await y.performActions([S]),await y.releaseActions();},{operationName:"performRawSwipe"}),await fe(d1e,this.abortSignal);}};var Ete=20,H0=.9,m1e=2,df=.5,W0=.2;function p1e(t){return t.type==="NATIVE"&&t.scrollDetails!==void 0}var oR=class extends uf{async executeScrollTo({logger:e,command:n}){let r=n.target.description,o=n.scrollStepPercent??H0,i=await this.tryUseNativeScrollCache(e,n,r);return i||this.searchForElement({logger:e,cmd:n,description:r,scrollStepPercent:o})}async resolveContainer({logger:e,scrollableElement:n,containerCache:r}){let o=await this.driver.executeInNativeContext(e,async c=>c.getWindowRect(),{operationName:"getScrollContainerViewportRect"});if(n.type==="CUSTOM_COORDINATES")return {bounds:{left:0,top:0,width:o.width,height:o.height},diffThresholdPercent:df};if(n.type!=="CUSTOM")return {bounds:await this.getHardcodedScrollableElementBounds(n,o),diffThresholdPercent:df};let i=me(),a=n.target.description;if(r){let c=this.getBoundsFromNativeCache(r);return e.info({bounds:c},"Got container bounds from native cache"),{bounds:c,cache:r,diffThresholdPercent:up({containerBounds:c,viewport:o,defaultThresholdPercent:df})}}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:up({containerBounds:l,viewport:o,defaultThresholdPercent:df})}}getBoundsFromNativeCache(e){if(!e.bounds||e.bounds.length<4)throw new M("ActionFailureError","Native target cache has no bounds");let[n,r,o,i]=e.bounds;return {left:n,top:r,width:o-n,height:i-r}}async tryUseNativeScrollCache(e,n,r){let o=n.cache?.target;if(o&&p1e(o)&&o.scrollDetails!==void 0)return this.tryUseNativeScrollCacheHelper(e,n,r,o)}async tryUseNativeScrollCacheHelper(e,n,r,o){let i=o.scrollDetails,a=me(),s=n.scrollStepPercent??H0,l=i.scrollableElement.type==="CUSTOM"&&i.scrollableElement.cache?.type==="NATIVE"?i.scrollableElement.cache:void 0,c=await this.resolveContainer({logger:e,scrollableElement:n.scrollableElement,containerCache:l}),u=c.bounds,d=c.diffThresholdPercent,m=vte(n.scrollableElement),p=m?Math.abs(m.deltaPixels):this.calculateSwipeCoordinates({containerBounds:u,direction:n.direction,desiredDelta:ls({containerBounds:u,containerInsetRatio:cl})*s}).actualDelta,f=await this.tryFindElement({logger:e,cmd:n,description:r,tracer:a,scrollDetails:this.buildScrollDetails(n,0,c.cache),useAIIfCacheFails:false});if(f)return e.info("Element resolved at current position without scrolling"),f;let h=Math.abs(i.pixelDelta),b=0,y=p*m1e,S=0;for(;S<h;){this.throwIfAborted();let w=h-S,_=Math.min(w,y),N=await this.scrollByPixelDelta({logger:e,pixelDelta:_,scrollableElement:n.scrollableElement,containerCache:c.cache,direction:n.direction,scrollStepPercent:s,useVisualDiff:false});if(N===0)break;S+=N,b+=n.direction==="down"?N:-N;let I=await this.tryFindElement({logger:e,cmd:n,description:r,tracer:a,scrollDetails:this.buildScrollDetails(n,b,c.cache),useAIIfCacheFails:false});if(I)return e.info({cumulativePixelDelta:b},"Element resolved during cache replay"),I}let T=Math.max(0,Math.min(n.maxScrollAttempts??Ete,2)),C=true;for(let w=0;w<T&&C;w++){this.throwIfAborted(),C=await this.scrollByPage({logger:e,direction:n.direction,containerBounds:u,scrollStepPercent:s,diffThresholdPercent:d,rawCoordinates:m}),C&&(b+=n.direction==="down"?p:-p);let _=await this.tryFindElement({logger:e,cmd:n,description:r,tracer:a,scrollDetails:this.buildScrollDetails(n,b,c.cache),useAIIfCacheFails:false});if(_)return e.info({attempt:w,cumulativePixelDelta:b},"Element resolved during cache buffer scroll"),_}if(b!==0){let w=n.direction==="down"?"up":"down";e.info({cumulativePixelDelta:b,originalDirection:n.direction,undoDirection:w,scrollableElementType:n.scrollableElement.type},"Cache replay did not resolve target; undoing scroll"),await this.scrollByPixelDelta({logger:e,pixelDelta:Math.abs(b),scrollableElement:n.scrollableElement,containerCache:c.cache,direction:w,scrollStepPercent:s});}}async tryFindElement({logger:e,cmd:n,description:r,tracer:o,scrollDetails:i,useAIIfCacheFails:a=true}){let s,l,c=false,u=i,d=Tte(n.cache?.target);if(d&&d.type==="NATIVE"&&d.resolvedDescription!==void 0&&vc(d.resolvedDescription,r)&&!n.disableCache)try{s=await this.resolveTargetCacheWithTracing({logger:e,tracer:o,cache:d,retryWithinSmartWaiting:!1}),c=!0,l="Successfully resolved scroll to target with cache.",e.info("Successfully resolved scroll to target from cache");}catch(p){e.warn({err:p},"Failed to resolve target from cache");}if(s&&c&&i){let p=await this.correctNativeTargetIntoView({logger:e,tracer:o,cmd:n,resolvedTarget:s,scrollDetails:i});u=p.scrollDetails,p.resolvedTarget?s=p.resolvedTarget:(s=void 0,c=false);}if(!s&&!a)return null;if(!s)try{let p=kC(r),f=await this.findElement({logger:e,description:p,tracer:o,metadata:{commandId:n.id,source:"SCROLL_TO"}});if(f.resolvedTarget.type!=="NATIVE")return null;s=f.resolvedTarget,l=f.thoughts;}catch(p){if(p instanceof M&&p.reason==="NoMatchingElementError")return null;throw e.warn({err:p},"Failed to find scroll-to target with AI"),p}if(s&&!c&&i)try{let p=await this.correctNativeTargetIntoView({logger:e,tracer:o,cmd:n,resolvedTarget:s,scrollDetails:i});u=p.scrollDetails,p.resolvedTarget&&(s=p.resolvedTarget);}catch(p){e.warn({err:p},"Failed to reposition AI-resolved scroll-to target for stable cache generation");}return sf({command:n,updatedCache:Tte({...af(s),...u?{scrollDetails:u}:{}}),updatedWithAI:!c,logger:e}),{success:true,message:l}}async correctNativeTargetIntoView({logger:e,tracer:n,cmd:r,resolvedTarget:o,scrollDetails:i}){let a=await this.getCorrectiveScrollForTarget({logger:e,resolvedTarget:o});if(!a)return {resolvedTarget:o,scrollDetails:i};e.info({bounds:o.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:r.scrollStepPercent??H0,useVisualDiff:true});if(l===0)return e.info({bounds:o.bounds,correction:a},"Skipping corrective scroll update because the viewport did not move"),{resolvedTarget:o,scrollDetails:i};let c;try{c=await this.resolveTargetCacheWithTracing({logger:e,tracer:n,cache:o.cache,retryWithinSmartWaiting:!1});}catch(h){return e.warn({err:h},"Failed to re-resolve scroll-to target after corrective scroll"),{resolvedTarget:o,scrollDetails:i}}let u=o.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:o.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:iC({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:n,description:r,scrollStepPercent:o}){let i=me(),a=await this.resolveContainer({logger:e,scrollableElement:n.scrollableElement});return this.scrollAndSearch({logger:e,cmd:n,description:r,tracer:i,scrollStepPercent:o,resolvedContainer:a})}async scrollAndSearch({logger:e,cmd:n,description:r,tracer:o,scrollStepPercent:i,resolvedContainer:a}){let s=0,l=a.bounds,c=a.diffThresholdPercent,u=vte(n.scrollableElement),d=u?Math.abs(u.deltaPixels):this.calculateSwipeCoordinates({containerBounds:l,direction:n.direction,desiredDelta:ls({containerBounds:l,containerInsetRatio:cl})*i}).actualDelta,m=true,p=n.maxScrollAttempts??Ete;for(let b=0;b<p;b++){this.throwIfAborted();let y=this.buildScrollDetails(n,s,a.cache),S=await this.tryFindElement({logger:e,cmd:n,description:r,tracer:o,scrollDetails:y});if(S)return S;if(!m)throw new Error(`ActionFailureError: Could not find element "${r}" after scrolling to the end`);e.debug({attempt:b,cumulativePixelDelta:s},"Element not found, scrolling further"),m=await this.scrollByPage({logger:e,direction:n.direction,containerBounds:l,scrollStepPercent:i,diffThresholdPercent:c,rawCoordinates:u}),s+=n.direction==="down"?d:-d;}let f=this.buildScrollDetails(n,s,a.cache),h=await this.tryFindElement({logger:e,cmd:n,description:r,tracer:o,scrollDetails:f});if(h)return h;throw new Error(`ActionFailureError: Could not find element "${r}" after ${p} scroll attempts`)}buildScrollDetails(e,n,r){return e.scrollableElement.type==="CUSTOM"?{pixelDelta:n,scrollableElement:{type:"CUSTOM",target:e.scrollableElement.target,cache:r},direction:e.direction}:e.scrollableElement.type==="CUSTOM_COORDINATES"?{pixelDelta:n,scrollableElement:e.scrollableElement,direction:e.direction}:{pixelDelta:n,scrollableElement:e.scrollableElement,direction:e.direction}}async scrollByPage({logger:e,direction:n,containerBounds:r,scrollStepPercent:o,diffThresholdPercent:i,rawCoordinates:a}){return me().startAsyncSpan("EMULATOR_INTERACTION",async l=>(l.attributes.containerBounds=r,l.attributes.direction=n,(await this.executeScrollGesture({logger:e,span:l,direction:n,containerBounds:r,scrollStepPercent:o,diffThresholdPercent:i,rawCoordinates:a})).canScrollMore),{name:`Scroll ${n} by one page`})}async scrollByPixelDelta({logger:e,pixelDelta:n,scrollableElement:r,containerCache:o,direction:i,scrollStepPercent:a,useVisualDiff:s=false}){if(n===0)return 0;let l=me(),c,u=df,d,m,p;if(r.type==="CUSTOM_COORDINATES")d=r.startX,m=r.startY,p=r.deltaPixels;else {c=await this.resolveContainer({logger:e,scrollableElement:r,containerCache:o});let b=c.bounds;u=c.diffThresholdPercent;let y=ls({containerBounds:b,containerInsetRatio:cl})*a,S=this.calculateSwipeCoordinates({containerBounds:b,direction:i,desiredDelta:y});d=S.startX,m=S.startY,p=S.actualDelta;}let f=Math.ceil(Math.abs(n)/p),h=this.invertDirection(i);return e.debug({pixelDelta:n,swipeDirection:h,scrollableElementType:r.type,startX:d,startY:m,maxScrollPerStep:p,numScrolls:f},"scrollByPixelDelta calculated parameters"),l.startAsyncSpan("EMULATOR_INTERACTION",async b=>{b.attributes.pixelDelta=n,b.attributes.numScrolls=f,b.attributes.maxScrollPerStep=p,b.attributes.startX=d,b.attributes.startY=m;let y=0;for(let S=0;S<f;S++){this.throwIfAborted();let T=Math.abs(n)-y,C=Math.min(p,T);if(s){let w=await this.executeScrollGesture({logger:e,span:b,direction:i,containerBounds:c?.bounds,scrollStepPercent:a,diffThresholdPercent:u,rawCoordinates:{type:"CUSTOM_COORDINATES",startX:d,startY:m,deltaPixels:C}});if(w.didScroll&&(y+=C),!w.canScrollMore)break}else await this.performRawSwipe({logger:e,span:b,startX:d,startY:m,deltaPixels:C,direction:h}),y+=C;}return b.attributes.appliedPixels=y,y},{name:`Scroll ${i} by ${Math.abs(n)}px`})}async getCorrectiveScrollForTarget({logger:e,resolvedTarget:n}){let r=n.bounds,o=await this.stateManager.getViewportBounds(e),i=Math.max(1,o.bottom-o.top),a=o.top+i*W0,s=o.bottom-i*W0,l=aC({viewportTop:o.top,viewportBottom:o.bottom,elementHeight:r.y2-r.y1,targetTopRatio:W0}),c=r.y1>=o.top&&r.y2<=o.bottom,u=r.y1<a||r.y2>s,d=await this.isResolvedTargetVisible({logger:e,resolvedTarget:n}),m=l-r.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:n}){if(n.type==="WEBVIEW")return null;let r=n.cache.xPath;if(!r)return Cte(n.cache.elementOnlySerializedXml);let o=await this.getTargetVisibilityFromDriver({logger:e,xPath:r});return o!==null?o:Cte(n.cache.elementOnlySerializedXml)}async getTargetVisibilityFromDriver({logger:e,xPath:n}){try{return await this.driver.executeInNativeContext(e,async r=>{let i=(await r.findElement("xpath",n))?.[vs];if(!i)return null;let a=await r.getElementAttribute(i,"visible");return a?a!=="false":null},{operationName:"getScrollToTargetVisibility"})}catch{return null}}async executeScrollGesture({logger:e,span:n,direction:r,containerBounds:o,scrollStepPercent:i,diffThresholdPercent:a=df,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(!o)throw new Error("Expected container bounds for scroll gesture");let b=ls({containerBounds:o,containerInsetRatio:cl})*i,y=this.calculateSwipeCoordinates({containerBounds:o,direction:r,desiredDelta:b});c=y.startX,u=y.startY,d=y.actualDelta;}await this.performRawSwipe({logger:e,span:n,startX:c,startY:u,deltaPixels:d,direction:this.invertDirection(r)});let m=await this.stateManager.getRawScreenshotBase64({logger:e}),p=fc(l,m),f=p>a,h=p>a;return e.debug({diffPercent:p,didScroll:f,diffThresholdPercent:a,canScrollMore:h,direction:r,actualDelta:d,rawCoordinates:s},"Scroll gesture visual diff result"),{didScroll:f,canScrollMore:h}}};function Tte(t){return !t||t.type!=="NATIVE"?t:sC(t)}function vte(t){if(t.type==="CUSTOM_COORDINATES")return t}function Cte(t){if(!t)return null;let e=t.match(/\bvisible="(true|false)"/);return e?e[1]==="true":null}function f1e(t){return "iterations"in t}function h1e(t){let e={relativePosition:t.relativePosition?Zt(t.relativePosition):void 0},n=t.iterations??(t.doubleTap?2:void 0),r=t.tapDelayMs??t.doubleTapDelayMs;if(n!==void 0&&(!Number.isInteger(n)||n<1))throw new M("UserConfigurationError","iterations must be a positive integer");if(r!==void 0&&(!Number.isInteger(r)||r<0))throw new M("UserConfigurationError","tapDelayMs must be >= 0");if(n&&n>1&&t.longPress)throw new M("UserConfigurationError","Cannot specify both more than one tap iteration and long press at the same time");if(r!==void 0&&(!n||n<2))throw new M("UserConfigurationError","tapDelayMs requires iterations >= 2");if(t.longPress){if(r!==void 0)throw new M("UserConfigurationError","tapDelayMs cannot be used with longPress");return {...e,longPress:true,longPressDurationMs:t.longPressDurationMs}}return n!==void 0?{...e,iterations:n,tapDelayMs:r}:e}var mf=class extends rr{async tapOnAbsoluteCoordinates(e,n){let r=n.x,o=n.y;if(e.info({x:r,y:o},"Tap at coordinates"),"longPress"in n&&n.longPress){let i=(n.longPressDurationMs??2e3)/1e3;await this.driver.executeInNativeContext(e,a=>a.executeScript("mobile: touchAndHold",[{x:r,y:o,duration:i}]),{operationName:"touchAndHold"});return}if(f1e(n)){let i=n.tapDelayMs??100;for(let a=0;a<n.iterations;a++)await this.emulator.tap(r,o),a<n.iterations-1&&await fe(i);return}await this.emulator.tap(r,o);}async tapOnTarget({logger:e,target:n,options:r,targetBounds:o=Sd(n)}){return await me().startAsyncSpan("EMULATOR_INTERACTION",async a=>{a.attributes.options=r;let{x1:s,y1:l,x2:c,y2:u}=n.bounds,d=c-s,m=u-l,p=r?.relativePosition?.x??d/2,f=r?.relativePosition?.y??m/2;p=Math.max(0,Math.min(p,d)),f=Math.max(0,Math.min(f,m));let h=s+p,b=l+f;await this.tapOnAbsoluteCoordinates(e,{x:h,y:b,...r}),a.attributes.point={x:h,y:b},a.targetBounds=o;},{name:"Tap on target"})}async executeTap({logger:e,command:n}){let r=h1e(n),o=me();if(n.target.type==="coordinates"||n.target.type==="absolute_percent"){let s=await this.driver.executeInNativeContext(e,async u=>u.getWindowSize(),{operationName:"getTapWindowSize"}),l,c;return n.target.type==="coordinates"?(l=n.target.xPercent*s.width,c=n.target.yPercent*s.height):(l=n.target.x/100*s.width,c=n.target.y/100*s.height),await o.startAsyncSpan("EMULATOR_INTERACTION",async u=>{await this.tapOnAbsoluteCoordinates(e,{...r,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=n.target.description,{thoughts:a}=await this.wrapTargetingAction({logger:e,tracer:o,command:n,action:s=>this.tapOnTarget({logger:e,target:s,options:r}),description:i});return {success:true,message:a}}};var Ed=25,wte=150,b1e=2,iR=class extends rr{async doType(e,n){let r=me();if(!n.target){if(n.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,n),{success:true,message:"Successfully executed type action"}}if(n.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Type step");let{thoughts:o}=await this.wrapTargetingAction({logger:e,tracer:r,command:n,action:async i=>{await this.doTypeHelper(e,n,i);},description:n.target.description});return {success:true,message:o}}async doTypeHelper(e,n,r){let o=new mf(this.constructPerformerParams()),i=Sd(r);n.clearContent?(await o.tapOnTarget({logger:e,target:r,options:{longPress:true},targetBounds:i}),await this.clearContent(e)):await o.tapOnTarget({logger:e,target:r,options:{},targetBounds:i}),await this.ensureKeyboardOpen(e,r,o,i),await this.injectKeys(e,n);}async ensureKeyboardOpen(e,n,r,o){if(!await this.waitForKeyboard(e)){for(let i=0;i<b1e;i++)if(this.throwIfAborted(),e.info({attempt:i+1},"Keyboard did not open after tapping the target, re-tapping to recover"),await r.tapOnTarget({logger:e,target:n,options:{},targetBounds:o}),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,n){await this.waitForKeyboard(e),await this.injectKeys(e,n);}async waitForKeyboard(e){return await me().startAsyncSection("Waiting for system keyboard to open",async(r,o)=>{let i=Date.now();for(;Date.now()-i<3e3;){if(this.throwIfAborted(),await this.driver.executeInNativeContext(e,a=>a.isKeyboardShown(),{operationName:"isKeyboardShown"}))return true;await new Promise(a=>setTimeout(a,500));}return o.attributes.timedOut=true,false})}async injectKeys(e,n){let r=me(),o=n.keyPressDelayMs??Ed;o<=0&&(o=Ed),await r.startAsyncSpan("EMULATOR_INTERACTION",async()=>{try{o!==Ed&&await this.driver.executeInNativeContext(e,async a=>a.updateSettings({maxTypingFrequency:1e3/o}),{operationName:"updateKeyInjectionDelay"});let i=[];for(let a=0;a<n.text.length;a+=wte)i.push(n.text.slice(a,a+wte));for(let a of i)await this.driver.executeInNativeContext(e,async s=>{await s.performActions(y1e(a)),await s.releaseActions();},{operationName:"typeText",maxAttempts:1,attemptTimeoutMs:cC(o,a)});}finally{o!==Ed&&await this.driver.executeInNativeContext(e,async i=>i.updateSettings({maxTypingFrequency:1e3/Ed}),{operationName:"resetKeyInjectionDelay"});}},{name:`Typing "${n.text}"${o?` with a ${o}ms delay`:""}`});}async clearContent(e){let n=me();try{await n.startAsyncSection("Clearing any content from the focused field",()=>this.clearContentHelper(e));}catch(r){e.warn({err:r},"Failed to find select all button, continuing...");}}async clearContentHelper(e){await this.driver.executeInNativeContext(e,async n=>{let r=n.$('-ios predicate string:label == "Select All"');await r.waitForExist({timeout:750}),await r.click();},{operationName:"selectAllText",maxAttempts:1}),await this.driver.executeInNativeContext(e,async n=>{await n.keys(["\uE003"]);},{operationName:"deleteSelectedText"});}};function y1e(t){let e={type:"key",id:"pressKeys",actions:[]};for(let n of [...t])e.actions.push({type:"keyDown",value:n},{type:"keyUp",value:n});return [e]}async function Ate({command:t,abortSignal:e}){return await fe(t.timeoutSecs*1e3,e),{success:true}}async function S1e(t,e){try{await t.executeInNativeContext(e,n=>n.executeScript("mobile: pressButton",[{name:"home"}]),{operationName:"pressHomeButton"}),e.info("Navigated to home screen");}catch(n){e.warn({err:n},"Failed to press home button");}}var G0=["io.appium."],q0=["com.facebook.WebDriverAgentRunner.xctrunner"];async function E1e(t,e){let n;try{n=await t.listApps();}catch(a){e.warn({err:a},"Failed to list installed apps");return}let r=n.filter(({bundleId:a})=>!q0.includes(a)&&!G0.some(s=>a.startsWith(s)));e.info({count:r.length},"Terminating all apps");let i=(await Promise.allSettled(r.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 T1e(t,e){e.info("Resetting privacy settings for all apps");try{await t.resetSettings();}catch(n){e.warn({err:n},"Failed to reset privacy settings");}}async function Rte(t){let{emulator:e,driver:n,logger:r}=t;await S1e(n,r),await E1e(e,r),await T1e(e,r);}var jc=class t extends rr{emulatorSettings;logger;splitInstalledApps(e){let n=[],r=[];for(let{bundleId:o}of e)if(!(q0.includes(o)||G0.some(i=>o.startsWith(i)))){if(o.startsWith("com.apple.")){r.push(o);continue}n.push(o);}return {installedApps:n,prunedApps:r}}constructor(e){super(e),this.logger=e.logger,this.emulatorSettings=e.emulatorSettings;}static async init({driver:e,logger:n,fixtures:r,orgId:o,options:i,abortController:a,emulator:s,generator:l,aiSettings:c}){let u={controller:a},d=i?.emulator??{},m=await YA.init({driver:e,orgId:o,emulator:s,options:d,aborter:u}),p=new t({generator:l,aiSettings:c,emulator:s,driver:e,stateManager:m,logger:n,fixtures:r,aborter:u,orgId:o,emulatorSettings:d});return await p.initializeSettings(),p}async executeCommand(e){let n=["type","a11yData","thoughts","cache","code"],r;try{r=await gp({obj:e.command,context:this.fixtures.testContext,bannedKeys:n,orgId:this.orgId,logger:this.logger,signal:this.abortSignal,localTools:this.fixtures.localCodeEvalTools});}catch(o){throw this.throwIfAborted(),new Error(`ActionFailureError: Failed to substitute template strings in command: ${o.message}`,{cause:o})}try{return await this.executeCommandHelper(e)}catch(o){throw o.name!=="AbortError"&&this.logger.error({err:o},"Error thrown in action controller"),o}finally{bp(e.command,r);}}async executeCommandHelper({command:e}){switch(e.type){case "TAP":return new mf(this.constructPerformerParams()).executeTap({logger:this.logger,command:e});case "SWIPE":return new uf(this.constructPerformerParams()).executeSwipe({logger:this.logger,command:e});case "DRAG_AND_DROP":return new JA(this.constructPerformerParams()).executeDragAndDrop({logger:this.logger,command:e});case "SCROLL_TO":return new oR(this.constructPerformerParams()).executeScrollTo({logger:this.logger,command:e});case "TYPE":return new iR(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=v__default.string().array().parse(r);}catch(r){throw new Tl(`Invalid launch arguments: expected a JSON array of strings. ${H(r)}`)}return await bte({driver:this.driver,logger:this.logger,bundleId:e.packageName,launchArguments:n}),{success:true}}case "KILL_APP":return new nR(this.constructPerformerParams()).execute(this.logger);case "PRESS":{let n=new cf(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 pte({command:e,emulator:this.emulator});case "AI_CHECK":return Yee({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 Xee({command:e,logger:this.logger,generator:this.generator,aiSettings:this.aiSettings,getEmulatorDomState:()=>this.getEmulatorDomState(),getScreenshotBase64:()=>this.getScreenshotBase64(),abortSignal:this.abortSignal});case "JAVASCRIPT":return mte({command:e,orgId:this.orgId,logger:this.logger,fixtures:this.fixtures,abortSignal:this.abortSignal});case "WAIT":return Ate({command:e,abortSignal:this.aborter.controller?.signal});case "REQUEST":return yte({command:e,logger:this.logger});case "ROTATE_ORIENTATION":return Ste({command:e,emulator:this.emulator,driver:this.driver,logger:this.logger,getViewportBounds:()=>this.getViewportBounds()});case "ADD_FILE":{let n=await nC(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 rR(this.constructPerformerParams()).executeScreenCheck(this.logger,e);case "ELEMENT_CHECK":return new eR(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 o=>o.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:n}=this.emulatorSettings?.geolocation??Bd;await this.driver.executeInNativeContext(this.logger,async r=>{await r.setGeoLocation({latitude:e,longitude:n}),await r.updateSettings({pageSourceExcludedAttributes:"visible,accessible",maxTypingFrequency:1e3/Ed,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 Rte({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 pf({appFolderPath:t,source:e,overrideBaseDir:n}){let r=t?.trim();if(!r)return;if(e==="default")return r;let o=e==="override"&&n&&!mn__default.isAbsolute(r)?mn__default.resolve(n,r):mn__default.resolve(r);if(e==="override"&&(!br.existsSync(o)||!br.statSync(o).isDirectory()))throw new Error(`Local iOS app path "${o}" does not exist. Provide a valid directory path.`);return o}var w1e=3;async function Mte(t){let{results:e,fixtures:n,work:r}=t,{logger:o}=n,i=e[e.length-1],a=R1e(i,r);if(a)return o.info({failedResult:i,isNotEligible:a},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${a}`,shortMessage:a};o.info({failedResult:i},"Attempting failure recovery"),r.state.failureRecoveryAttempts=(r.state.failureRecoveryAttempts??0)+1;try{return await A1e(t)}catch(s){return o.warn({err:s},"Error during failure recovery attempt, continuing..."),null}}async function A1e(t){let{fixtures:e,results:n,failedStep:r,nextSteps:o,stepTracer:i,work:a,containerParentChain:s}=t,{controller:l,logger:c}=e,u=i.parentTracer,{testMetadata:d}=t.inputs;if(!n.length)throw new Error("Attempted failure recovery with no failed results");let m=s.length>0,p=m&&a.topLevelResults?[...a.topLevelResults,...n]:n,f=m&&a.fullTestSteps?Pte(a.fullTestSteps,s):[],h=[...o,...f],b=await l.getScreenshotPngString(),y=await l.getEmulatorDomState(),{results:S}=await rv(c,u,p,{numStepsWithScreenshots:5,addIndices:true,includeBeforeScreenshots:false,screenshotMediaType:"image/png"}),T=h.map($=>Qa($)),C=d.description.trim(),w=d?.settings?.ai?.failureRecoveryInstructions?.trim()||void 0,{scenario:_,thoughts:N,instructions:I,reasonSummary:A}=await l.getMobileFailureRecoveryPlan({currentScreenshot:b,failedResults:S,currentScreenXml:y,nextStepsSerialized:T,testDescription:C,customInstructions:w});if(_!=="RECOVERABLE")return c.info({scenario:_,thoughts:N,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: ${N}`,shortMessage:A?.trim()||void 0};if(!I)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let z={id:randomUUID(),type:"MOBILE_AI_ACTION_STEP",text:I},D,B=a.state.failureRecoveryDisabled;B||(a.state.failureRecoveryDisabled=true),c.info("executing mobile step list");try{D=await t.executeMobileStepList({...t,fixtures:{...t.fixtures},listParams:{steps:[z,r],containerName:"AI-recovered step list",tracer:u}});}finally{B||(a.state.failureRecoveryDisabled=B);}let F=D.results[0];if(F&&F.type==="MOBILE_AI_ACTION_STEP")if(Cg({results:D.results,onPresetAction:$=>{$.aiSuggested=true;},onModule:$=>{$.aiSuggested=true;},onAiAction:$=>{$.aiSuggested=true;}}),D.status==="SUCCESS"){let $=`The following steps were automatically executed by the failure recovery agent. Analysis: ${N}`;return F.message=$,F.failureRecoveryReason=N,Ge.increment("test_event",1,["name:failure_recovery_success","platform:native",`orgId:${t.inputs.orgId}`]),c.info({thoughts:N},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:D,message:$}}else {Ge.increment("test_event",1,["name:failure_recovery_failure","platform:native",`orgId:${t.inputs.orgId}`]);let $=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${N}`;return F.message=$,F.failureRecoveryReason=N,F.status="FAILED",c.info({thoughts:N},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:D,message:$}}return null}function Pte(t,e){if(e.length===0)return [];let n=e[0],r=t.findIndex(a=>a.id===n);if(r===-1)return [];let o=t.slice(r+1);if(e.length===1)return o;let i=t[r];return i.type!=="RESOLVED_MOBILE_MODULE"?o:[...Pte(i.steps,e.slice(1)),...o]}function R1e(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 n=t.message;return n?n.includes("AbortError:")?"The user aborted the test":oB.some(r=>n.includes(r))?"The failed step is an irrecoverable configuration error":(e.state.failureRecoveryAttempts??0)>w1e?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}async function aR({fixtures:t,step:e,inputs:n,stepTracer:r,work:o}){let i=Date.now(),{logger:a,controller:s}=t,l,c="",u,d=s.emulatorSettings?.disableXmlSnapshots??true;if(!n.interactive){if(o.lastScreenshot&&Date.now()-o.lastScreenshot.capturedAtMs<500)l=o.lastScreenshot.screenshot,c=o.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(o.lastScreenXml)u=o.lastScreenXml.screenXml;else try{u=await s.getEmulatorDomState();}catch(h){a.debug({err:h},"Failed to capture before XML snapshot");}}let m=a_(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});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:H(h),startTime:i,endTime:Date.now()});}finally{if(!n.interactive){l&&(f.beforeSnapshot=c,r.attachBeforeScreenshot({snapshotId:c,screenshot:l}),!d&&u&&r.attachBeforeXmlSnapshot({snapshotId:c,xml:u}));let y=randomUUID();try{let S=await s.getScreenshotBase64();f.afterSnapshot=y;let T=Buffer.from(S,"base64");r.attachAfterScreenshot({snapshotId:y,screenshot:T}),o.lastScreenshot={capturedAtMs:Date.now(),snapshotId:y,screenshot:T};}catch(S){a.warn({err:S},"Failed to take after screenshot"),o.lastScreenshot=void 0;}if(!d)try{let S=await s.getEmulatorDomState();r.attachAfterXmlSnapshot({snapshotId:y,xml:S}),o.lastScreenXml={snapshotId:y,screenXml:S};}catch(S){a.debug({err:S},"Failed to capture after XML snapshot"),o.lastScreenXml=void 0;}}let h="cache"in e.command?e.command.cache??{}:{};f.status==="FAILED"&&Eq({logger:a,step:e,originalAndroidCommandCache:m});let b=diff(p,h);b&&Object.keys(b).length>0&&a.info({diffs:Wd(b)},"Updated cache");}return f}async function P1e(t,e,n){let{logger:r,controller:o}=t.fixtures,{stepTracer:i}=t.conditionalParams,a=e.assertion.command;try{let s=await aR({...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}:(r.info(s.message,`${a.type} mobile condition ${n} 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)})`,r.info({returnValue:s.data,conditionPassed:c},`JavaScript mobile condition ${n} 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){r.error({err:s},`Mobile condition ${n} 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{o.throwIfAborted();}}function I1e({step:t,fromStepId:e,conditionalChain:n,fromStepParentChain:r}){let o=r.slice(n.length+1);for(let i=0;i<t.blocks.length;i++){let a=t.blocks[i],{result:s}=Xl(a.steps,e,o);if(s)return i}return -1}async function _te(t){let e=Date.now(),{logger:n}=t.fixtures,{fromStep:r}=t.inputs,{step:o,stepTracer:i,executeMobileStepList:a}=t.conditionalParams,s=i.getParentStepIdChain(),l=!!r&&iq(s,r.parentStepIdChain),c=o.elseSteps,u=true,d=[],m,p=false;if(l&&r){let S=I1e({step:o,fromStepId:r.fromStepId,conditionalChain:s,fromStepParentChain:r.parentStepIdChain});S>=0&&(c=o.blocks[S].steps,u=false,p=true,n.info(`Skipping mobile conditional assertion (execution starts from block ${S}), running ${c.length} steps`));}if(!p)for(let S=0;S<o.blocks.length;S++){n.info(`Evaluating mobile condition ${S} in conditional step`);let T=o.blocks[S],C=await P1e(t,T,S);if(d.push(C.conditionResult),m=C.conditionResult,C.type==="execution_error"){let w=C.conditionResult.status==="CANCELLED"?"CANCELLED":"FAILED",_={...o,assertionResult:C.conditionResult,steps:[],startTime:e,endTime:Date.now(),status:w,message:C.conditionResult.message};return oi({result:_,...ri(d)}),_}if(C.type==="passed"){n.info(`Mobile condition ${S} resolved to true, executing ${C.steps.length} steps`),u=false,c=C.steps;break}}if(!c){n.warn("No mobile conditions resolved to true and no else block was provided, skipping conditional step body");let S={...o,assertionResult:m,steps:[],status:"SUCCESS",startTime:e,endTime:Date.now(),data:d[d.length-1]?.data,message:d[d.length-1]?.message};return oi({result:S,...ri(d)}),S}u&&n.info("No mobile conditions resolved to true, executing the else block steps"),n.info(`Executing ${c.length} steps in selected mobile conditional block`);let f=await i.startSubSteps(),{results:h,status:b}=await a({...t,listParams:{steps:c,containerName:"mobile conditional block",tracer:f}}),y={...o,assertionResult:m,steps:h,status:b,startTime:e,endTime:Date.now()};return oi({result:y,...ri([...d,...h])}),y}async function Ote(t){let e=Date.now(),n=t.fixtures.controller;try{return await _1e(t)}catch(r){let o=n.isAborted();return {...t.moduleParams.step,steps:[],type:"MOBILE_MODULE_STEP",startTime:e,endTime:Date.now(),status:o?"CANCELLED":"FAILED",message:o?"Step cancelled.":H(r)}}}async function _1e({moduleParams:t,...e}){let n=Date.now(),{step:r,stepTracer:o,executeMobileStepList:i}=t,{controller:a,logger:s}=e.fixtures,l=await O1e({step:r,params:e});Object.keys(l).length>0&&(a.context.setInputs(l),s.info(Jl({json:{inputs:l,moduleId:r.moduleId},maxJsonStringSize:1e3}),"Set mobile module inputs"));let c={};Object.entries(l).forEach(([f,h])=>{c[f]=JSON.stringify(h);});let u={...r,type:"MOBILE_MODULE_STEP",inputs:c,startTime:n,steps:[],endTime:Date.now(),status:"SUCCESS"},d=await o.startSubSteps(),{status:m,results:p}=await i({...e,listParams:{steps:r.steps,containerName:`module ('${r.name}')`,tracer:d}});return u.steps=p,u.status=m,u.endTime=Date.now(),oi({result:u,...ri(p)}),u}async function O1e({step:t,params:e}){let n={},{logger:r,controller:o}=e.fixtures;for(let i of t.parameters?.parameterNames??[]){let a=t.inputs?.[i]??t.parameters?.defaultParameters?.[i];if(!a){r.warn({k:i},"No value found for parameter in module");continue}n[i]=await Fi({orgId:e.inputs.orgId,code:a,fragment:true,logger:r,context:o.context,localTools:o.localCodeEvalTools});}return n}var Hc="finish",X0=v__default.object({message:v__default.string(),success:v__default.boolean()}),Ry=3,xy=`You forgot to call ${Hc}. Review the prior conversation and return only the JSON object that should have been passed as the ${Hc} 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).`,My=t=>{let e=tool({description:"Signal that the AI action has reached a terminal state (either success or failure).",inputSchema:X0,toModelOutput:({output:n})=>n,execute:async({message:n,success:r})=>{let{contextManager:o,logger:i}=t;return i.info({finishMessage:n,success:r},"AI action tool called (finish)"),o.finalState={message:n,status:r?"SUCCESS":"FAILED"},{type:"content",value:[{type:"text",text:"Done"}]}}});return {name:Hc,tool:e}};var Dte=["TAP","TYPE","PRESS","PRESS_KEYBOARD","SWIPE","SCROLL_TO","AI_CHECK","ELEMENT_CHECK","SCREEN_CHECK","WAIT","OPEN_APP","KILL_APP","DRAG_AND_DROP"],N1e=[...Dte,"OPEN_NOTIFICATION_DRAWER"],L1e=Dte,sR={ANDROID:N1e,IOS:L1e};function k1e(t,e){return e!==void 0&&sR[t].includes(e)}function lR({platform:t,input:e,logger:n,tempCaches:r}){let o=yy(e);if(!k1e(t,o.stepType))throw new Error(`Unsupported AI Action V3 step type: ${o.stepType}. Supported types: ${sR[t].join(", ")}`);let i=gA(o,t);if(i.type!=="MOBILE_PRESET_STEP")throw new Error(`AI Action V3 only supports preset steps, got: ${i.type}`);if(o.disableCache&&o.cacheId&&n.warn({cacheId:o.cacheId},"--disable-cache was provided with --cache-id; disable cache flag is taking precedent and the cache id will be ignored."),o.cacheId&&!o.disableCache&&Ha(t,i.command)){let a=r[o.cacheId];a?i.command.cache=a.cache:n.warn({cacheId:o.cacheId,commandType:i.command.type},"Temp mobile cache not found for AI action V3 step");}return i}function ff(t){let{id:e,cache:n,...r}=t;return JSON.stringify(r)}function Wc(t){if(t.length===0)return "Generated cached steps: (none)";let e=t.map((n,r)=>` ${r}: ${ff(n.command)}`).join(`
|
|
5882
5882
|
`);return `Generated cached steps (${t.length}):
|
|
5883
5883
|
${e}`}async function cR({storage:t,controller:e,onEvent:n,rootStep:r,stepIndex:o,logger:i}){if(!(!t||!n))try{let a=await e.getScreenshotBase64(),s=randomUUID();await t.createOnDemandScreenshot(s,Buffer.from(a,"base64"),"image/png"),n({type:"SCREENSHOT",stepIndex:o,screenshotId:s,rootStep:r});}catch(a){i.error({err:a,stepId:r.stepId,stepIndex:o},"Failed to capture AI action V3 trajectory screenshot");}}var uR=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,n){this.callbacks.onAiActionEvent?.({type:"PHASE",rootStep:this.rootStep,phase:e,failureMessage:n});}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 Lh({platform:this.platform,step:{cache:void 0,precondition:void 0,postcondition:e}}).postconditionStep}async executeSteps(e,n){n&&this.emitPhase(n);let r=[];for(let o of e){let i=this.subStepIndex++;this.callbacks.onAiActionEvent?.({type:"STEP_UPDATE",rootStep:this.rootStep,stepIndex:i,step:o,status:"running"});let a=await this.callbacks.executeStep(o,i);if(this.callbacks.onAiActionEvent?.({type:"STEP_UPDATE",rootStep:this.rootStep,stepIndex:i,step:o,status:a.status==="SUCCESS"?"success":"failed",message:a.message}),await cR({storage:this.storage,controller:this.controller,onEvent:this.callbacks.onAiActionEvent,rootStep:this.rootStep,stepIndex:i,logger:this.logger}),r.push(a),a.status!=="SUCCESS")break}return this.results.push(...r),r}spliceGeneratedSteps(e,n,...r){return this.generatedSteps.splice(e,n,...r)}saveTempCacheForCommand(e,n){if(!Ha(this.platform,e)||!e.cache)return;let r=n??crypto.randomUUID();return this.tempCaches[r]=iE[this.platform]({type:e.type,cache:cloneDeep(e.cache)}),r}};var Lte="get_emulator_screenshot";function kte(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:v__default.object({includeEmulatorXml:v__default.boolean().optional()}),toModelOutput:({output:n})=>n,execute:async n=>{let{controller:r,contextManager:o,logger:i}=t,a={includeEmulatorXml:n.includeEmulatorXml??false};return i.info(a,"AI action V3 tool called (get_emulator_screenshot)"),o.recordToolCall(Lte),hf({controller:r,...a})}});return {name:Lte,tool:e}}async function hf(t){let{controller:e,includeEmulatorXml:n=false}=t,r=await e.getScreenshotBase64(),o=await e.getViewportBounds(),i=o.right-o.left,a=o.bottom-o.top,s=[{type:"text",text:`<viewportSize width="${i}" height="${a}" />`}];if(n){let l=await e.getEmulatorDomState();s.push({type:"text",text:`<emulatorXml>
|
|
@@ -6227,7 +6227,7 @@ Choose the SCROLL_TO container based on which region will actually move:
|
|
|
6227
6227
|
- 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.
|
|
6228
6228
|
</rule>
|
|
6229
6229
|
</rules>
|
|
6230
|
-
`;function mne(t){return fR(t,cne,dne())}var dl={initializeAIActionConfig:mne,stepSchema:Yn,resultSchema:Po};var z$e=5e3;async function fne({socket:t,logger:e,orgId:n,testMetadata:r,globalOrgSettings:o,androidDriverFactory:i,mobileGeneratorFactory:a,browserGeneratorFactory:s,browserEnricherFactory:l,storageFactory:c,cacheStorageFactory:u,localToolsFactory:d,onRemoteEmulatorCreated:m,onRemoteEmulatorDeleted:p,billingReporterFactory:f,globalStateManager:h,getGitMetadata:b,region:y,localApkPath:S,localAvdId:T}){let C=t.id,w=await b(),_=t.handshake.query?.fileName,N=_?mn__default.basename(_,".test.yaml"):"",I=r.id;e=e.child({sessionId:C,testId:I,orgId:n,branch:w.gitBranchName});let A=await c(n),z=r.settings?.defaultEnv,D={};z&&(D=(await A.fetchEnvironment(z,e))?.variables??{});let B={...o.emulator,...r.settings?.emulator},F={...o.ai,useMemory:o.ai?.useMemory!==false,...r.settings?.ai},$=h.getSession(C);if($){if(e.info("Reconnecting to existing Android session"),$.local)return t.emit("session",$.metadata),$.softDeleted=false,$.metadata;throw new Error("Restoring existing remote emulator sessions is not supported. Please reconnect to a new emulator.")}let le=await u(n,w),j=Nl.optional().parse(y??B.region),L=j==="local",U,k,W;if(L){if(await h.clearSoftDeletedLocalSessions(e),h.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");let{avdId:io,apkFilePath:va,apkFilePathSource:hl}=gm({overrideAvdId:T,overrideApkFilePath:S,emulatorSettings:B,defaultApkFilePath:r.settings?.defaultApkFilePath,envVariables:D}),gl=fp({apkFilePath:va,source:hl});if(!io)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 ${Cl} key on the environment.`);W={avdId:io,apkFilePath:gl};}else U=r.settings?.defaultChannel,k=r.settings?.defaultTag,W={region:j===Jo?void 0:j,apkToInstall:U?{channel:U,tag:k}:void 0,osVersion:B.remoteEmulatorSettings?.androidVersion??lm};e.info({platform:"ANDROID",isLocalRegion:L,resolvedRegion:j,envName:z,emulatorSettings:B,aiSettings:F},"Starting mobile session with resolved configuration");let q=Date.now(),V=await i({socket:t,logger:e,creationOpts:W}),{driver:pe,cleanup:Te,emulatorName:Ne,adbPort:Nt}=V,Yt,or,nt,J,Ae,$t;"limbarClient"in V&&(Yt=V.limbarClient,or=V.limbarToken,nt=V.limbarUrl,J=V.limbarRegion,Ae=V.limbarOsVersion,$t=V.playwrightDevice);let mt=mn__default.join(tmpdir(),`logcat-logs-${n}-${I}-${C}.txt`);L||await m?.({emulatorName:Ne,platform:"ANDROID"}),e.info({adbPort:Nt,apkChannel:U,apkTag:k,duration:Date.now()-q,emulatorName:Ne},"Android emulator session initiated"),e=e.child({emulator:Ne});let Ee=false,ir=false,zr,xr,ro,Rn,oo=async()=>{if(Ee)return;Ee=true,ir=true,clearInterval(ro),ro=void 0;let va=[async()=>{await xr?.cleanup();},async()=>{await zr?.();},async()=>{await Te(),L||await p?.({emulatorName:Ne,platform:"ANDROID"});},async()=>{await Rn?.dispose();}].map(hl=>hl().catch(gl=>{e.warn({err:gl},"Failed to clean up socket server resource");}));await te(Promise.allSettled(va),{milliseconds:z$e,fallback:()=>{}});};h.registerPendingSession(C,{platform:"ANDROID",cleanup:oo,emulatorName:Ne,local:L});let Yi=async()=>{zr=await pe.executeInNativeContext(e,Xt=>fC({driver:Xt,onLogs:Fn=>{t.emit("logcatLogs",Fn);},logFilePath:mt}),{operationName:"startLogcatListener"});let io=await a(n,e),va=await s(n,e),hl=await l(n,e);Rn=d?await d(n):void 0;let gl=new es({logger:e,reporter:await f(n),runType:"mobile-test-run",runId:C,testMetadata:{id:r.id,name:N},isInteractive:true}),Pf=new Ri({variablesFromEnvironment:D,envName:z,testName:N});if(xr=await $c.init({driver:pe,generator:io,logger:e,limbarClient:Yt,playwrightDevice:$t,aiSettings:F,options:{emulator:{...B,browserSettings:o.browser}},fixtures:{storage:A,browserEnricher:hl,browserGenerator:va,localCodeEvalTools:Rn,testContext:Pf},orgId:n,adbPort:Nt,abortController:new AbortController}),!xr)throw new Error("Failed to initialize Android controller");let If=xr;if(ir||!t.connected)throw new Error("Socket not connected anymore, not proceeding with Android session setup");let R=await If.getViewportBounds();if(ir||!t.connected)throw new Error("Socket not connected anymore, not proceeding with Android session setup");ro=$$e({socket:t,testContext:Pf});let ne={sessionId:C,testId:I,orgId:n,emulatorName:Ne,testName:N,limbarUrl:nt,limbarToken:or,limbarRegion:J,limbarOsVersion:Ae,viewportBounds:R,envName:z};return h.registerSession(C,{platform:"ANDROID",controller:If,cacheStorage:le,cleanup:oo,emulatorName:Ne,local:L,metadata:ne,logFilePath:mt,helpers:ul,usageTracker:gl}),t.emit("session",ne),ne};try{return await Yi()}catch(io){throw await h.removeSession(C,e),io}}function $$e({socket:t,testContext:e}){return setInterval(()=>{let n=e.toEditorDisplayCopy();t.emit("emulatorState",{context:n});},3e3)}async function hne({socket:t,logger:e,globalStateManager:n,authorization:r}){let o=t.id,i=n.getSession(o);i&&i.platform==="ANDROID"&&r&&i.logFilePath&&V$e({testId:i.metadata.testId,sessionId:o,logFilePath:i.logFilePath,authorization:r,logger:e}),await n.removeSession(o,e);}async function V$e({testId:t,sessionId:e,logFilePath:n,authorization:r,logger:o}){try{let i;try{i=await hR.stat(n);}catch{o.debug({logFilePath:n},"No logcat file found to upload");return}if(i.size===0){o.debug({logFilePath:n},"Logcat file is empty, skipping upload"),await hR.unlink(n);return}let a=new bn(r),{uploadUrl:s}=await a.generateMobileLogcatUploadUrl({testId:t,sessionId:e}),l=await hR.readFile(n),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()}`);o.info({testId:t,sessionId:e,objectUrl:WT(s)},"Logcat file uploaded successfully");}catch(i){o.warn({err:i,testId:t,sessionId:e},"Failed to upload logcat file");}finally{try{await hR.unlink(n);}catch(i){o.warn({err:i,logFilePath:n},"Failed to delete temp logcat file");}}}var j$e=({socket:t,globalStateManager:e})=>async()=>{let n=e.getSession(t.id);if(!n)throw new Error("No active Mobile session found");n.controller.abort();},gne={event:"cancel",createHandler:j$e};var H$e=({logger:t,globalStateManager:e,socket:n})=>async(r,o)=>{let i=e.getSession(n.id);if(!i){o({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"),o({screenXml:l});}catch(l){t.error({err:l},"Error fetching screen XML from the session controller"),o({err:l.message});}},bne={event:"fetchScreenXml",createHandler:H$e};var ok=class{parentTracer;socket;step;orgId;interactionTracer;platform;constructor({step:e,socket:n,parentTracer:r,orgId:o,platform:i}){this.socket=n,this.parentTracer=r,this.step=e,this.orgId=o,this.platform=i,this.interactionTracer=new Bi,Xr.initializeRootTracerContext(this.interactionTracer);}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeXmlSnapshot(){}attachAfterXmlSnapshot(){}recordStepDuration(e){let{durationMs:n,step:r}=e;if(!NE(r))return;let o=DE(r);Ge.distribution("test_mobile_step_duration",n,[`type:${o}`,`platform:${this.platform.toLowerCase()}`,"executor:editor",`orgId:${this.orgId}`]);}async finish(e){this.interactionTracer.finish();let n=this.interactionTracer.getRootSpan(),r={result:e.result,parentStepIdChain:e.parentStepIdChain,trace:XM.parse(n)};switch(r.result.status){case "SUCCESS":this.socket.emit("success",r);break;case "FAILED":this.socket.emit("failure",r);break;case "CANCELLED":this.socket.emit("cancelled",r);break}return {trace:n}}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}async startSubSteps(){return new yf({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId,platform:this.platform})}},yf=class{parentTracer;parentStep;socket;orgId;platform;constructor({parentStep:e,socket:n,parentTracer:r,orgId:o,platform:i}){this.parentTracer=r,this.parentStep=e,this.socket=n,this.orgId=o,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 ok({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId,platform:this.platform})}async getScreenshot(e){}},gR=class{constructor(e,n,r){this.socket=e;this.orgId=n;this.platform=r;}appendLogs(){}setActiveVideo(){}async finish(){this.socket.emit("finished");}async startBeforeStepList(){return new yf({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId,platform:this.platform})}async startMainStepList(){return new yf({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId,platform:this.platform})}async startAfterStepList(){return new yf({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId,platform:this.platform})}};var W$e=({metadata:t,logger:e,globalStateManager:n,socket:r,useSnapshotIdentityCache:o,storageFactory:i})=>async(a,s)=>{let l=n.getSession(r.id);if(!l)throw new Error("No active Mobile session found");let c=await i(t.orgId),u=e.child({testId:a.testMetadata.id});l.controller.resetAbortController();let d=l.usageTracker,m;try{m=await G$e({session:l,params:a,metadata:t,testLogger:u,usageTracker:d,socket:r,useSnapshotIdentityCache:o,storage:c});}finally{await d.flush(u);}let p={results:l.helpers.resultSchema.array().parse(m.results),status:m.status};s?.(p);};async function G$e({session:t,...e}){switch(t.platform){case "ANDROID":return yne({session:t,...e});case "IOS":return yne({session:t,...e});default:return (r=>{throw new Error(`Unsupported platform: ${r}`)})(t)}}async function yne({session:t,params:e,metadata:n,testLogger:r,usageTracker:o,socket:i,useSnapshotIdentityCache:a,storage:s}){let l=new gR(i,n.orgId,t.platform);try{return await bf({platform:t.platform,work:{fastForwardingToStep:!!e.fromStep,state:{failureRecoveryDisabled:!0,failureRecoveryAttempts:0}},fixtures:{controller:t.controller,logger:r,cacheStorage:t.cacheStorage,usageTracker:o,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:n.orgId,testName:n.testName,testMetadata:e.testMetadata,interactive:!0,useSnapshotIdentityCache:a},envName:n.envName,tracer:l,callbacks:{step:{onAiActionEvent:c=>{i.emit("aiActionEvent",c);}}},helpers:t.helpers})}finally{await l.finish();}}var Sne={event:"execute",createHandler:W$e};var K$e=({socket:t,globalStateManager:e,keepSessionAlive:n})=>{let r=debounce(n,3e4,{maxWait:6e4});return async()=>{let o=e.getSession(t.id);if(!o)throw new Error("No active Mobile session found");o.emulatorName&&(o.local||r(o.platform,o.emulatorName));}},Ene={event:"keepalive",createHandler:K$e};var Y$e=({socket:t,globalStateManager:e,logger:n})=>async(r,o)=>{let i=e.getSession(t.id);if(!i){let s="No active session found";n.error(s),o?.({success:false,err:s});return}let a=i.controller;a.abort(),a.resetAbortController(),n.info({platform:i.platform},"Resetting emulator state");try{await a.softReset(),n.info({platform:i.platform},"Emulator reset completed"),o?.({success:!0,message:"Emulator reset successfully"});}catch(s){let l=H(s);n.error({err:s,platform:i.platform},"Failed to reset emulator"),o?.({success:false,err:`Failed to reset emulator: ${l}`});}},Tne={event:"reset",createHandler:Y$e};var vne=[Sne,gne,Tne,Ene,bne];var J$e=5e3;async function Cne({socket:t,logger:e,orgId:n,testMetadata:r,globalOrgSettings:o,localIosDeviceType:i,localIosVersion:a,iosDriverFactory:s,mobileGeneratorFactory:l,browserGeneratorFactory:c,browserEnricherFactory:u,billingReporterFactory:d,storageFactory:m,cacheStorageFactory:p,localToolsFactory:f,onRemoteEmulatorCreated:h,onRemoteEmulatorDeleted:b,globalStateManager:y,getGitMetadata:S,region:T,localAppPath:C}){let w=t.id,_=await S(),N=t.handshake.query?.fileName,I=N?mn__default.basename(N,".test.yaml"):"",A=r.id,z=r.settings?.defaultChannel,D=r.settings?.defaultTag;e=e.child({sessionId:w,testId:A,orgId:n,branch:_.gitBranchName});let B=await m(n),F=r.settings?.defaultEnv,$={};F&&($=(await B.fetchEnvironment(F,e))?.variables??{});let le={...o.emulator,...r.settings?.emulator},j={...o.ai,useMemory:o.ai?.useMemory!==false,...r.settings?.ai},L=y.getSession(w);if(L){if(e.info("Reconnecting to existing iOS session"),L.local)return t.emit("session",L.metadata),L.softDeleted=false,L.metadata;throw new Error("Restoring existing remote emulator sessions is not supported. Please reconnect to a new emulator.")}let U=await p(n,_),k=Nl.optional().parse(T??le.region),W=k==="local",q;if(W){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:ir,iosVersion:zr,appFilePath:xr,appFilePathSource:ro}=bm({overrideDeviceType:i,overrideIosVersion:a,overrideAppFilePath:C,emulatorSettings:le,defaultAppFilePath:r.settings?.defaultAppFilePath,envVariables:$});if(!ir)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 ${wl} key on the environment.`);let Rn=pf({appFolderPath:xr,source:ro});q={type:"local",deviceType:ir,iosVersion:zr,appFilePath:Rn};}else q={type:"remote",region:k===Jo?void 0:k,appToInstall:z?{channel:z,tag:D}:void 0,osVersion:cm};e.info({platform:"IOS",isLocalRegion:W,resolvedRegion:k,envName:F,emulatorSettings:le,aiSettings:j},"Starting mobile session with resolved configuration");let V=Date.now(),{driver:pe,cleanup:Te,emulator:Ne,limbarParams:Nt}=await s({socket:t,logger:e,creationOpts:q});e=e.child({emulator:Ne.name}),e.info({duration:Date.now()-V},"iOS emulator session initiated"),W||await h?.({emulatorName:Ne.name,platform:"IOS"});let Yt=false,or=false,nt,J,Ae,$t,mt=async()=>{if(Yt)return;Yt=true,or=true,Ae&&(clearInterval(Ae),Ae=void 0);let zr=[async()=>{await J?.cleanup();},async()=>{nt?.();},async()=>{await Te(),W||await b?.({emulatorName:Ne.name,platform:"IOS"});},async()=>{await $t?.dispose();}].map(xr=>xr().catch(ro=>{e.warn({err:ro},"Failed to clean up socket server resource");}));await te(Promise.allSettled(zr),{milliseconds:J$e,fallback:()=>{}});};y.registerPendingSession(w,{platform:"IOS",cleanup:mt,emulatorName:Ne.name,local:W});let Ee=async()=>{nt=await WA({emulator:Ne,onLogs:va=>{t.emit("syslogLogs",va);}});let ir=await l(n,e),zr=await c(n,e),xr=await u(n,e);$t=f?await f(n):void 0;let ro=new es({logger:e,reporter:await d(n),runType:"mobile-test-run",runId:w,testMetadata:{id:r.id,name:I},isInteractive:true}),Rn=new Ri({variablesFromEnvironment:$,envName:F,testName:I});if(J=await jc.init({driver:pe,generator:ir,logger:e,emulator:Ne,aiSettings:j,options:{emulator:{...le,browserSettings:o.browser}},fixtures:{storage:B,browserEnricher:xr,browserGenerator:zr,localCodeEvalTools:$t,testContext:Rn},orgId:n,abortController:new AbortController}),!J)throw new Error("Failed to initialize iOS controller");let oo=J;if(or||!t.connected)throw new Error("Socket not connected anymore, not proceeding with iOS session setup");let Yi=await oo.getViewportBounds();if(or||!t.connected)throw new Error("Socket not connected anymore, not proceeding with iOS session setup");Ae=Z$e({socket:t,testContext:Rn});let io={sessionId:w,testId:A,orgId:n,emulatorName:Ne.name,testName:I,limbarUrl:Nt?.webRtcUrl,limbarToken:Nt?.token,limbarRegion:Nt?.region,limbarOsVersion:Nt?.osVersion,viewportBounds:Yi,envName:F};return y.registerSession(w,{platform:"IOS",controller:oo,cacheStorage:U,cleanup:mt,emulatorName:Ne.name,local:W,metadata:io,helpers:dl,usageTracker:ro}),t.emit("session",io),io};try{return await Ee()}catch(ir){throw await y.removeSession(w,e),ir}}function Z$e({socket:t,testContext:e}){return setInterval(()=>{let n=e.toEditorDisplayCopy();t.emit("emulatorState",{context:n});},3e3)}var bR=class{sessions=new Map;pendingSessions=new Map;registerPendingSession(e,n){this.pendingSessions.set(e,n);}registerSession(e,n){this.pendingSessions.delete(e),this.sessions.set(e,n);}getSession(e){return this.sessions.get(e)}async clearSoftDeletedLocalSessions(e){for(let n of this.sessions.values())n.softDeleted===true&&n.local===true&&await this.removeSession(n.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,n){let r=this.sessions.get(e)??this.pendingSessions.get(e);if(!r)return;let o=n.child({sessionId:e,emulatorName:r.emulatorName,platform:r.platform});try{await this.sessions.get(e)?.usageTracker.flush(o);}catch(i){o.error({err:i},"Error flushing usage tracker before cleanup");}try{await r.cleanup?.(),o.info("Emulator cleaned up by removeSession");}catch(i){o.error({err:i},"Error during emulator cleanup");}finally{this.sessions.delete(e),this.pendingSessions.delete(e);}}async removeAllSessions(e){let n=Array.from(new Set([...this.sessions.keys(),...this.pendingSessions.keys()]));await Promise.all(n.map(r=>this.removeSession(r,e)));}};function wne(t){let{logger:e,baseServer:n,globalStateManager:r,settingsFactory:o,getOrgId:i}=t,a=new Server(n,{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 r.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 hne({socket:c,globalStateManager:r,logger:d,authorization:t.authorization});return}let h=r.getSession(u);h&&(h.softDeleted=true);});let m,p;try{let f=c.handshake.query?.testMetadata,h=kl.parse(JSON.parse(f??"")),b=h.id,y=await i({testId:b});switch(p=await o(y,e),h.platform){case "ANDROID":m=await fne({...t,orgId:y,socket:c,globalStateManager:r,logger:d,globalOrgSettings:p,testMetadata:h});break;case "IOS":m=await Cne({...t,orgId:y,socket:c,globalStateManager:r,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}vne.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 o2e(t,e){switch(t){case "ANDROID":return {uploadPath:e,cleanup:async()=>{}};case "IOS":{let n=await br.promises.mkdtemp(mn__default.join($s.tmpdir(),"momentic-mobile-asset-")),r=mn__default.join(n,"app.zip");return await i2e(e,r),{uploadPath:r,cleanup:()=>br.promises.rm(n,{recursive:true,force:true})}}}}function i2e(t,e){return new Promise((n,r)=>{let o=e2e("zip",{zlib:{level:9}}),i=br.createWriteStream(e);i.on("close",()=>n()),i.on("error",r),o.on("error",r),o.on("warning",a=>{a.code!=="ENOENT"&&r(a);}),o.pipe(i),o.directory(t,false,a=>mn__default.basename(a.name)===".DS_Store"?false:(a.mode=a.stats?.isDirectory()?493:420,a)),o.finalize().catch(r);})}async function a2e(t){let e=t2e.createHash("md5");await new Promise((r,o)=>{br.createReadStream(t).on("data",i=>e.update(i)).on("end",()=>r()).on("error",o);});let n=e.digest();return {md5Base64:n.toString("base64"),md5Hex:n.toString("hex")}}async function yR({tag:t,channel:e,filePath:n,apiClient:r,logger:o,platform:i}){o.info({channel:e,tag:t,platform:i,filePath:n},"starting asset upload");let a=Date.now(),{uploadPath:s,cleanup:l}=await o2e(i,n);try{let{md5Base64:c,md5Hex:u}=await a2e(s),{size:d}=await br.promises.stat(s),m=await r.generateAssetUploadUrl({channel:e,tag:t??"latest",md5:c,platform:i});if(m.md5&&(m.md5===c||m.md5===u))return o.info({channel:e,tag:t,platform:i,filePath:n,size:d,durationMs:Date.now()-a,skipped:!0},"skipped asset upload (md5 match)"),{skipped:!0};if(!m.uploadUrl)throw new M("InternalPlatformError",`No upload URL was given for asset ${n}`);try{let p=await fetch$1(m.uploadUrl,{headers:{"Content-Length":d.toString(),"Content-Type":"application/octet-stream"},method:"PUT",body:br.createReadStream(s),duplex:"half"});if(p.status!==200)throw new M("InternalPlatformError",`Got error response from emulator platform: ${p.status} ${await p.text()}`);return o.info({channel:e,tag:t,platform:i,filePath:n,size:d,durationMs:Date.now()-a},"finished asset upload"),{skipped:!1}}catch(p){try{await r.deleteAsset(e,t??"latest",i);}catch(f){o.warn({err:f,tag:t,channel:e},"Failed to clean up asset after failed upload");}throw p}}finally{await l();}}async function SR({channel:t,tag:e,platform:n,apiClient:r,logger:o}){let i=e??"latest";o.info({channel:t,tag:i,platform:n},`Deleting asset ${t}:${i} (${n})...`),await r.deleteAsset(t,i,n),o.info({channel:t,tag:i,platform:n},`Asset ${t}:${i} (${n}) deleted successfully!`);}var s2e=z.object({emulatorName:z.string(),platform:z.enum(Je)});z.object({runId:z.string(),emulators:z.array(s2e)});var Ane;async function ER(t){await Ane?.registerEmulator(t);}async function TR(t){await Ane?.unregisterEmulator(t);}var vR=new bR;var ak="0.111.0",ft=xm({app:"mobile-desktop-server",hostname:hostname(),disableConsoleLogs:true}).child({cliVersion:ak});(async()=>{try{let t=await $g(ft);t.gitBranchName&&ft.addBinding("branch",t.gitBranchName);}catch{}})();var CR=Router();CR.get("/",Ve(async(t,e)=>{let n=Wt();if(!n){e.status(500).json({message:"API client not initialized"});return}let r=await n.getMobileAssets();e.status(200).json(r);}));CR.post("/upload-url",Ve(async(t,e)=>{let n;try{n=L1.parse(t.body);}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}let r=Wt();if(!r){e.status(500).json({error:"API client not initialized"});return}let o=mn__default.resolve(n.filePath);if(!existsSync(o)){e.status(400).json({error:`File not found: ${o}`});return}let i=/\.apk$/i.test(o),a=o.endsWith(".app")&&statSync(o).isDirectory();if(!i&&!a){e.status(400).json({error:"Unsupported file type. Only .apk files and .app directories are supported."});return}await yR({tag:n.tag,channel:n.channel,filePath:o,apiClient:r,logger:ft,platform:i?"ANDROID":"IOS"}),e.sendStatus(204);}));CR.delete("/:channel/:tag/:platform",Ve(async(t,e)=>{let n=Wt();if(!n){e.status(500).json({error:"API client not initialized"});return}let{channel:r,tag:o,platform:i}=t.params;if(!r||!o||!i){e.status(400).json({error:"Missing channel, tag, or platform."});return}let a=ch.safeParse(i.toUpperCase());if(!a.success){e.status(400).json({error:`Invalid platform "${i}". Expected "android" or "ios".`});return}let s=a.data;await SR({channel:r,tag:o,platform:s,apiClient:n,logger:ft}),e.sendStatus(204);}));var Rne=CR;var Tf=Router();async function wR(t){return (await $3(t,ft)).map(r=>{let o=t.mobileModules[r.moduleId];if(!o){P.warn(`Found a dangling mobile module with ID ${r.moduleId} that could not be found on disk.`);return}return {...o,content:r}}).filter(r=>r!==void 0)}Tf.get("/",Ve(async(t,e)=>{let n=yt(),r=await Et(n),o=await wR(r);e.status(200).json(o);}));Tf.get("/tests-join",Ve(async(t,e)=>{let n=yt(),r=await Et(n),o=await wR(r),i={};for(let s of o)i[s.id]={...s,tests:[]};let a=await Promise.all(Object.values(r.mobileTests).map(async s=>({id:s.id,name:s.name,relativePath:s.relativePath,test:await cn(s.fullFilePath,ft,r)})));for(let{id:s,name:l,relativePath:c,test:u}of a){let d=new Set;Oi({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);}));Tf.get("/:moduleId",Ve(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let n=await Et(yt()),r=n.mobileModules[t.params.moduleId];if(!r){e.status(404).json({error:"Mobile module not found."});return}try{let o=await Vu(r,n,P);e.json(o);}catch(o){e.status(400).json({err:o});}}));Tf.patch("/:moduleId/metadata",Ve(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let n;try{n=F1.parse(t.body);}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let r=yt(),o=await Et(r);z3({moduleId:t.params.moduleId,patch:n,momenticFiles:o,logger:P,project:r}),e.status(201).json({message:"ok"});}));Tf.post("/",Ve(async(t,e)=>{let n;try{n=U1.parse(t.body);}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{Ei(n.name);}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let r=yt(),o=await Et(r),i=o.mobileModules;if(Object.values(i).find(s=>s.name===n.name)){e.status(400).json({error:`A mobile module with the name "${n.name}" already exists. Please choose a different name.`});return}let a=mn__default.join(r.rootDir,n.folderPath??mn__default.dirname(n.testFilePath));if(!br.existsSync(a)||!br.statSync(a).isDirectory()){e.status(400).json({error:`The folder configured for mobile module creation does not exist: ${a}`});return}switch(n.platform){case "ANDROID":{let s=await jg({...n,folder:a,project:r,momenticFiles:o});e.status(201).json(s);return}case "IOS":{let s=await jg({...n,folder:a,project:r,momenticFiles:o});e.status(201).json(s);return}}}));var Pne=Tf;var sk=Router();sk.get("/",Ve(async(t,e)=>{let n=yt(),r=await Et(n),o=await wR(r),i=new Set;r?.mobileTests&&Object.values(r.mobileTests).forEach(c=>{c.labels?.forEach(u=>i.add(u));});let a=Array.from(i).sort(),s=Object.values(r.mobileTests),l={labels:a,modules:o,tests:s};e.status(200).json(l);}));sk.get("/folders",Ve(async(t,e)=>{let n=yt(),r=await A3(n);e.status(200).json(r);}));var Ine=sk;var AR=Router();AR.get("/",Ve((t,e)=>{let n=Mv(yt(),ft);e.status(200).json(n);}));AR.get("/names",Ve((t,e)=>{let r=yt().config.environments?.map(o=>o.name)??[];e.status(200).json(r);}));AR.post("/",Ve((t,e)=>{let n;try{n=k1.parse(t.body);}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{Ei(n.name);}catch(s){e.status(400).json({error:`Invalid environment name: ${s}`});return}let r=yt();if(r.config.environments?.find(s=>s.name===n.name)){e.status(400).json({error:`An environment with the name "${n.name}" already exists. Please choose a different name.`});return}let i={...r.config,environments:[...r.config.environments??[],{name:n.name}]};r.config=i,$u(i,r.configFilePath);let a=Uu(n.name,r,ft);e.status(201).json(a);}));var _ne=AR;var One=Router();One.get("/",Ve((t,e)=>{let n={userId:gd(),orgId:nr(),email:kA(),name:wee(),pylonEmailHash:Aee(),cliVersion:ak};e.status(200).json(n);}));var Dne=One;var Nne=Router();Nne.get("/",Ve(async(t,e)=>{let n=t.query.sessionId;if(!n){e.status(400).json({packages:[]});return}let r=vR.getSession(n);if(!r?.controller){e.status(200).json({packages:[]});return}try{let o=r.controller,{installedApps:i}=await o.getInstalledApps();e.status(200).json({packages:i});}catch(o){ft.error({err:o},"Error fetching installed packages from the session controller"),e.status(200).json({packages:[]});}}));var Lne=Nne;var kne=Router();kne.get("/",Ve(async(t,e)=>{let n=await wy(ft);e.status(200).json(n);}));var Fne=kne;var RR=Router(),Bne=async({platform:t,steps:e,cacheStorage:n,stepId:r,parentStepIdChain:o,testId:i,environment:a})=>{let{result:s,parentChain:l}=Xl(e,r,o);if(!s)return;let c=l.filter(u=>u.type==="RESOLVED_MOBILE_MODULE").map(u=>u.id);return await n.getCacheKeyForStep({platform:t,logger:ft,testId:i,environment:a,parentStepIdChain:c,step:s})};RR.patch("/",Ve(async(t,e)=>{let n=yt(),r=nr(),o=Wt(),i=n.config?.advanced?.isolateCachesByEnvironment;if(!o){e.status(500).json({error:"API client not initialized"});return}let a;try{a=V1.parse(t.body);}catch(u){e.status(400).json({error:`Invalid request body: ${u}`});return}let s=await gn(ft,o,n),l=Qn({logger:ft,orgId:r,client:o,gitMetadata:s,regenerateCache:false,noCache:false,alwaysSaveCache:false,isolateCachesByEnvironment:i}),c=await Bne({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 o.updateMobileStepCaches({platform:a.platform,body:{entries:[{key:c,organizationId:r,value:a.value,testId:a.testId,environment:i?a.environment:void 0}]},headers:bu(s)}),e.status(204).send();}));RR.delete("/entry",Ve(async(t,e)=>{let n=yt(),r=nr(),o=Wt(),i=n.config?.advanced?.isolateCachesByEnvironment;if(!o){e.status(500).json({error:"API client not initialized"});return}let a;try{a=H1.parse(t.body);}catch(u){e.status(400).json({error:`Invalid request body: ${u}`});return}let s=await gn(ft,o,n),l=Qn({logger:ft,orgId:r,client:o,gitMetadata:s,regenerateCache:false,noCache:false,alwaysSaveCache:false,isolateCachesByEnvironment:i}),c=await Bne({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 o.deleteMobileStepCacheEntry({platform:a.platform,body:{testId:a.testId,key:c,environment:i?a.environment:void 0},headers:bu(s)}),e.status(204).send();}));RR.post("/traces",Ve(async(t,e)=>{let n=Wt();if(!n){e.status(500).json({error:"API client not initialized"});return}let r;try{r=W1.parse(t.body);}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o=await n.getMobileStepCacheMemoryTraces(r.platform,r);e.status(200).json(o);}));var Une=RR;HRe("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI","POSTHOG_WEB_WRITE_KEY is not set");var{captureEvent:pi,setAnalyticsIdentity:xR,shutdownAnalytics:MR}=BE({writeKey:"phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",host:"https://p.momentic.ai",platform:"local_mobile_app",identity:"stashed",flushImmediately:true});var Td=Router();Td.patch("/:testPath",Ve(async(t,e)=>{let n=t.params.testPath;if(!n){e.status(400).json({error:"Missing testPath in path"});return}let r;try{r=D1.parse(t.body);}catch(l){e.status(400).json({error:`Invalid request body: ${l}`});return}if(r.steps===void 0&&r.beforeSteps===void 0&&r.afterSteps===void 0&&r.settings===void 0&&r.labels===void 0){e.status(400).json({error:"At least one of steps, beforeSteps, afterSteps, settings, or labels is required"});return}let o=yt(),i=n.endsWith(".test.yaml")?n:`${n}.test.yaml`,a=await Et(o);await Xs({platform:r.platform,filePath:i,steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps,settings:r.settings,labels:r.labels,folder:o.rootDir,project:o,momenticFiles:a,schemaVersion:cr});let s={message:"ok"};e.status(200).json(s);}));Td.post("/",Ve(async(t,e)=>{let n;try{n=_1.parse(t.body);}catch(b){e.status(400).json({error:`Invalid request body: ${b}`});return}let{name:r,description:o,settings:i,pathSegments:a,platform:s}=n;if(!r||typeof r!="string"){e.status(400).json({error:"Missing or invalid 'name' in body"});return}try{Ei(r);}catch(b){e.status(400).json({error:H(b)});return}let l=yt(),c=await Et(l),u=mn__default.join(l.rootDir,...a??[]),{fullPath:d,testId:m}=Iv({name:r,description:o,settings:i,folder:u,platform:s,project:l,momenticFiles:c});pi({type:"test_editor:test_create",test_platform:Ai(s)});let p=mn__default.basename(d),f=mn__default.relative(l.rootDir,d),h={id:m,fileName:p,fullPath:d,relativeFilePath:f};e.status(201).json(h);}));Td.get("/:fileName",Ve(async(t,e)=>{let n=Wt(),r=nr(),o=t.params.fileName;if(!o){e.status(400).json({error:"Missing fileName in path"});return}if(!n){e.status(500).json({error:"API client not initialized"});return}let i=o.endsWith(".test.yaml")?o:`${o}.test.yaml`,a=mn__default.basename(i).replace(".test.yaml",""),s=yt(),l=mn__default.isAbsolute(i)?i:mn__default.join(s.rootDir,i);if(!br.existsSync(l)){e.status(404).json({error:"Test not found."});return}let c=await Et(s),[u,d]=await Promise.all([cn(l,ft,c),gn(ft,n,s,{includeHostingUsername:false})]);await Qn({logger:ft,orgId:r,client:n,gitMetadata:d,regenerateCache:false,noCache:false,alwaysSaveCache:false,isolateCachesByEnvironment:s.config?.advanced?.isolateCachesByEnvironment}).resolveEntries({logger:ft,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 p={...u,name:a};e.status(200).json(p);}));Td.patch("/:testPath/metadata",Ve(async(t,e)=>{let n=t.params.testPath;if(!n){e.status(400).json({error:"Missing testPath in path"});return}let r;try{r=N1.parse(t.body);}catch(l){e.status(400).json({error:`Invalid request body: ${l}`});return}let o=yt(),i=n.endsWith(".test.yaml")?n:`${n}.test.yaml`,s={message:"ok",newRelativeTestPath:V3(i,r,o).newRelativeTestPath};e.status(200).json(s);}));Td.delete("/:testPath",Ve((t,e)=>{let n=t.params.testPath;if(!n){e.status(400).json({error:"Missing testPath in path"});return}let r=yt(),o=n.endsWith(".test.yaml")?n:`${n}.test.yaml`,i=mn__default.join(r.rootDir,o);if(!br.existsSync(i)){e.status(404).json({error:"Test not found."});return}br.unlinkSync(i),e.status(200).json({message:"ok"});}));Td.post("/:testPath/duplicate",Ve(async(t,e)=>{let{testPath:n}=t.params;if(!n){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=z1.parse(t.body);}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{Ei(r.name);}catch(h){e.status(400).json({error:H(h)});return}let o=yt(),i=mn__default.join(o.rootDir,n);if(!br.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await Et(o),s;try{s=await cn(i,ft,a);}catch(h){e.status(400).json({error:H(h)});return}let l=Zm({projectConfig:o.config,momenticFiles:a,entityType:"mobile-test"}),{stepsToSave:c}=await Tr({platform:s.platform,stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:true}),u=pr({fileType:ve.MOBILE_TEST,id:l,schemaVersion:cr,description:s.description,platform:s.platform,settings:s.settings,labels:s.labels,...c});cE.parse(u);let d=mn__default.dirname(i),m=mn__default.join(d,`${r.name}.test.yaml`);if(br.existsSync(m)){e.status(409).send("A test with this name already exists");return}let p=pg.stringify(u);br.writeFileSync(m,p,"utf-8");let f={relativeFilePath:mn__default.relative(o.rootDir,m)};e.status(201).json(f);}));var zne=Td;var $ne=Router();$ne.get("/:id",Ve(async(t,e)=>{let{id:n}=t.params;if(!n){e.status(400).json({error:"Missing ID"});return}let r=Wt();if(!r){e.status(500).json({error:"API client not initialized"});return}try{let{data:o,contentType:i}=await r.fetchOnDemandScreenshot(n);e.setHeader("Content-Type",i),e.status(200).send(o);}catch(o){ft.error({err:o,screenshotId:n},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"});}}));var Vne=$ne;var jne=Router();jne.get("/",Ve((t,e)=>{let n=yt(),r={ai:n.config.ai,displayRoot:n.config.displayRoot};e.status(200).json(r);}));var Hne=jne;var Wne=Router();Wne.post("/traces",Ve(async(t,e)=>{let n=Wt();if(!n){e.status(500).json({error:"API client not initialized"});return}let r;try{r=G1.parse(t.body);}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o=await n.getWebStepCacheMemoryTraces(r);e.status(200).json(o);}));var Gne=Wne;var Cf=class extends rp{constructor(n,r){super(n,r);this.client=n;this.orgId=r;}async fetchEnvironment(n,r){let o=yt();return Uu(n,o,P)}};var M2e=promisify$1(execFile$1);async function qne({managedState:t,project:e,testEntity:n,resolvedTest:r,envName:o}){let{logger:i,sessionId:a}=t,s=Ree(),l=nr(),c=vy(),u=new bn({apiKey:s,baseUrl:c,logger:i}),d=new Cf(u,l),m=o??r.settings?.defaultEnv,p={};m&&(p=(await d.fetchEnvironment(m,i))?.variables??{});let f={...e.config.emulator,...r.settings?.emulator},h=new as({baseUrl:c,apiKey:s,logger:i,mode:"interactive"}),b=new Zs(e.config.ai?.agentConfig,{baseUrl:c,apiKey:s,logger:i,mode:"interactive"}),y=new dc({baseUrl:c,apiKey:s,logger:i,mode:"interactive"},b),S=new mc({httpClient:u,fakerSeed:e.config.advanced?.fakerConstantSeed?ym:void 0}),T=new Ri({variablesFromEnvironment:p,envName:m,testName:n.name}),C=new es({logger:i,reporter:new uc(u),runType:"mobile-test-run",runId:a,testMetadata:n,isInteractive:true});return {logger:i,sessionId:a,orgId:l,apiClient:u,resolvedEnvName:m,variablesFromEnvironment:p,emulatorSettings:f,mobileGenerator:h,fixtures:{storage:d,browserEnricher:y,browserGenerator:b,localCodeEvalTools:S,testContext:T},aiSettings:{useMemory:true,...e.config.ai,...r.settings?.ai},usageTracker:C}}function P2e(t){return {steps:t.steps,beforeSteps:t.beforeSteps,afterSteps:t.afterSteps}}async function PR({platform:t,project:e,logger:n,orgId:r,apiClient:o,resolvedTest:i,envName:a}){let s=P2e(i);if(e.config.fileFormat!=="v2")return s;let l=await gn(n,o,e),{alwaysSaveCache:c,noCache:u}=Ts();return await Qn({logger:n,orgId:r,client:o,gitMetadata:l,regenerateCache:false,alwaysSaveCache:c,noCache:u,isolateCachesByEnvironment:e.config?.advanced?.isolateCachesByEnvironment}).resolveEntries({logger:n,platform:t,testId:i.id,environment:a,stepLists:s,useSnapshotIdentityCache:true}),s}async function Kne({provider:t,platform:e,emulatorName:n,cleanupDriver:r}){let o=t==="remote";return o&&await ER({emulatorName:n,platform:e}),async()=>{await r(),o&&await TR({emulatorName:n,platform:e});}}async function Yne({managedState:t,project:e,testEntity:n,resolvedTest:r,provider:o,envName:i,localAvdId:a,localApkPath:s}){let{logger:l,sessionId:c,orgId:u,apiClient:d,resolvedEnvName:m,variablesFromEnvironment:p,emulatorSettings:f,mobileGenerator:h,fixtures:b,aiSettings:y,usageTracker:S}=await qne({managedState:t,project:e,testEntity:n,resolvedTest:r,envName:i}),T=r.settings?.defaultChannel,C=r.settings?.defaultTag,w=await PR({platform:"ANDROID",project:e,logger:l,orgId:u,apiClient:d,resolvedTest:r,envName:m}),_=await I2e({provider:o,projectRoot:e.rootDir,emulatorSettings:f,resolvedTest:r,localAvdId:a,localApkPath:s,variablesFromEnvironment:p});l.info({platform:"ANDROID",provider:o,envName:m,emulatorSettings:f,aiSettings:y},"Starting mobile session with resolved configuration");let N=o==="local"?"local":"region"in _?_.region:void 0,I=await pp({apiClient:d,logger:l,creationOpts:o==="remote"?{..._,apkToInstall:T?{channel:T,tag:C}:void 0}:_,orgId:u,sessionId:c,callbacks:{onStatusUpdate:D=>{l.info({status:D},"Android session status update");}}}),A=await Kne({provider:o,emulatorName:I.emulatorName,platform:"ANDROID",cleanupDriver:async()=>{await I.cleanup();}}),z;try{let D="limbarClient"in I?{limbarClient:I.limbarClient,limbarToken:I.limbarToken,limbarUrl:I.limbarUrl,limbarRegion:I.limbarRegion,playwrightDevice:I.playwrightDevice}:void 0;z=await $c.init({driver:I.driver,generator:h,logger:l,limbarClient:D?.limbarClient,playwrightDevice:D?.playwrightDevice,aiSettings:y,options:{emulator:{...f,region:N,browserSettings:e.config.browser}},fixtures:b,orgId:u,adbPort:I.adbPort,abortController:new AbortController});let B=await z.getViewportBounds(),F=z;return {...t,platform:"ANDROID",provider:o,controller:F,cleanup:[async()=>{await Promise.allSettled([F.cleanup(),A(),b.localCodeEvalTools.dispose()]);}],testName:n.name,relativeTestPath:n.relativePath,testFileAbsolutePath:mn__default.join(e.rootDir,n.relativePath),envName:m,orgId:u,emulatorName:I.emulatorName,viewportBounds:B,adbPort:I.adbPort,tempCaches:{},limbarUrl:D?.limbarUrl,limbarToken:D?.limbarToken,limbarRegion:D?.limbarRegion,usageTracker:S,mutableStepState:{platform:"ANDROID",testId:r.id,stepLists:w}}}catch(D){let B=z?[z.cleanup(),A()]:[A()];throw await Promise.allSettled(B),D}}async function Xne({managedState:t,project:e,testEntity:n,resolvedTest:r,provider:o,envName:i,localDeviceId:a,localIosVersion:s,localAppPath:l}){let{logger:c,sessionId:u,orgId:d,apiClient:m,resolvedEnvName:p,variablesFromEnvironment:f,emulatorSettings:h,mobileGenerator:b,fixtures:y,aiSettings:S,usageTracker:T}=await qne({managedState:t,project:e,testEntity:n,resolvedTest:r,envName:i}),C=r.settings?.defaultChannel,w=r.settings?.defaultTag,_=await PR({platform:"IOS",project:e,logger:c,orgId:d,apiClient:m,resolvedTest:r,envName:p}),N=_2e({provider:o,projectRoot:e.rootDir,emulatorSettings:h,resolvedTest:r,appChannel:C,appTag:w,localDeviceId:a,localIosVersion:s,localAppPath:l,variablesFromEnvironment:f});c.info({platform:"IOS",provider:o,envName:p,emulatorSettings:h,aiSettings:S},"Starting mobile session with resolved configuration");let I=o==="local"?"local":N.type==="remote"?N.region:void 0,A=await nf({apiClient:m,logger:c,creationOpts:N,orgId:d,sessionId:u,callbacks:{onStatusUpdate:B=>{c.info({status:B},"iOS session status update");}}}),z=await Kne({provider:o,emulatorName:A.emulator.name,platform:"IOS",cleanupDriver:async()=>{await A.cleanup();}}),D;try{D=await jc.init({driver:A.driver,generator:b,logger:c,emulator:A.emulator,aiSettings:S,options:{emulator:{...h,region:I,browserSettings:e.config.browser}},fixtures:y,orgId:d,abortController:new AbortController});let B=await D.getViewportBounds(),F=D;return {...t,platform:"IOS",provider:o,controller:F,cleanup:[async()=>{await Promise.allSettled([F.cleanup(),z(),y.localCodeEvalTools.dispose()]);}],testName:n.name,relativeTestPath:n.relativePath,testFileAbsolutePath:mn__default.join(e.rootDir,n.relativePath),envName:p,orgId:d,emulatorName:A.emulator.name,viewportBounds:B,tempCaches:{},limbarUrl:A.limbarParams?.webRtcUrl,limbarToken:A.limbarParams?.token,limbarRegion:A.limbarParams?.region,usageTracker:T,mutableStepState:{platform:"IOS",testId:r.id,stepLists:_}}}catch(B){let F=D?[D.cleanup(),z()]:[z()];throw await Promise.allSettled(F),B}}async function I2e({provider:t,projectRoot:e,emulatorSettings:n,resolvedTest:r,localAvdId:o,localApkPath:i,variablesFromEnvironment:a}){if(t==="remote")return {region:n?.region==="local"?void 0:n?.region,osVersion:n?.remoteEmulatorSettings?.androidVersion??lm};let s=await ck(),{avdId:l,apkFilePath:c,apkFilePathSource:u}=gm({overrideAvdId:o,overrideApkFilePath:i,emulatorSettings:n,defaultApkFilePath:r.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 ${Cl} 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:fp({apkFilePath:c,source:u,overrideBaseDir:e})}}function _2e({provider:t,projectRoot:e,emulatorSettings:n,resolvedTest:r,appChannel:o,appTag:i,localDeviceId:a,localIosVersion:s,localAppPath:l,variablesFromEnvironment:c}){if(t==="remote")return {type:"remote",region:n?.region==="local"?void 0:n?.region,appToInstall:o?{channel:o,tag:i}:void 0,osVersion:cm};let{deviceType:u,iosVersion:d,appFilePath:m,appFilePathSource:p}=bm({overrideDeviceType:a,overrideIosVersion:s,overrideAppFilePath:l,emulatorSettings:n,defaultAppFilePath:r.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 ${wl} key on the environment.`);return {type:"local",deviceType:u,iosVersion:d,appFilePath:pf({appFolderPath:m,source:p,overrideBaseDir:e})}}async function ck(){try{let{stdout:t}=await M2e(O2e(),["-list-avds"],{encoding:"utf8",timeout:5e3});return {availableAvdIds:t.split(/\r?\n/).map(n=>n.trim()).filter(Boolean)}}catch(t){return {availableAvdIds:[],avdDiscoveryError:H(t)}}}function O2e(){let t=process.platform==="win32"?"emulator.exe":"emulator";return process.env.ANDROID_HOME?mn__default.join(process.env.ANDROID_HOME,"emulator",t):t}var Jne=5,uk=class extends fA{isStartingSession=false;constructor(){super({sessionTypeLabel:"mobile MCP session"});}async kill(e,n){try{let r;for(let i of e.cleanup)try{await i();}catch(a){r??=a;}if(r)throw r;await e.usageTracker.flush(e.logger);let o=RQ(e);return await WQ({apiClient:Wt(),logger:e.logger,orgId:e.orgId,testId:e.testId,sessionId:e.sessionId,reason:n,report:o}),e.logger.info({sessionId:e.sessionId,reason:n,emulatorName:e.emulatorName},"MCP session cleaned up"),{killed:!0,sessionId:e.sessionId,reason:n,report:o}}catch(r){return e.logger.error({err:r,sessionId:e.sessionId,reason:n},"Failed to clean up mobile MCP session"),{killed:false,sessionId:e.sessionId,reason:n}}}touchSession(e){let n=super.touchSession(e);return n?.provider==="remote"&&Wt()?.extendEmulatorTtl(n.platform,n.emulatorName).catch(()=>{}),n}async createSession({logger:e,testId:n,idleTimeoutMs:r,provider:o,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 ss(c,{id:n},"mobileTests"),f=await cn(m.fullFilePath,e,p),y=(f.settings?.emulator?.region??c.config.emulator?.region)==="local"?"local":"remote",S=o??y,T,{platform:C}=f,w=e.child({testId:f.id});switch(C){case "ANDROID":d=this.buildManagedSessionState({logger:w,idleTimeoutMs:r,testId:m.id}),T=await Yne({managedState:d,project:c,testEntity:m,resolvedTest:f,provider:S,envName:i,localAvdId:a,localApkPath:l});break;case "IOS":d=this.buildManagedSessionState({logger:w,idleTimeoutMs:r,testId:m.id}),T=await Xne({managedState:d,project:c,testEntity:m,resolvedTest:f,provider:S,envName:i,localDeviceId:a,localIosVersion:s,localAppPath:l});break;default:return It(C)}return w.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;}}},to=new uk,Gc=({response:t,sessionId:e,toolName:n})=>{let r=to.touchSession(e);if(r)return t.addCleanupCallback(()=>{HQ({session:r,toolCallId:t.toolCallId});}),jQ({session:r,toolCallId:t.toolCallId,toolName:n}),r;t.addError(JSON.stringify({message:`No active session found for id '${e}'.`,availableSessionIds:to.listSessionIds()},null,2));};var N2e=4e4,L2e=1e4,mk,Qne=({staticDir:t})=>{mk=t;},IR=class t{url;server;constructor({url:e,server:n}){this.url=e,this.server=n;}static async init({logger:e,testId:n,testName:r,sessionId:o,platform:i,limbarUrl:a,limbarToken:s,limbarRegion:l,tabLabel:c}){let u=await U2e({logger:e,assets:k2e()}),d=new URL(`http://localhost:${u.port}/`);return d.searchParams.set("testId",n),r&&d.searchParams.set("testName",r),d.searchParams.set("sessionId",o),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 k2e(){if(!mk)throw new Error("Remote control viewer static directory is not configured. Pass remoteControlStaticDir when starting the mobile MCP server.");let t=mn__default.resolve(mk),e=mn__default.join(t,"index.html");if(!br.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:br.readFileSync(e)}}function dk({response:t,statusCode:e,body:n,allow:r}){let o={"Content-Type":"text/plain; charset=utf-8","Cache-Control":"no-store"};r&&(o.Allow=r),t.writeHead(e,o),t.end(n);}function Zne({request:t,response:e,buffer:n,contentType:r}){if(e.writeHead(200,{"Content-Type":r,"Cache-Control":"no-store"}),t.method==="HEAD"){e.end();return}e.end(n);}function F2e({staticDir:t,pathname:e}){let n;try{n=decodeURIComponent(e);}catch{return}let r=n==="/"?"index.html":n.replace(/^\/+/,""),o=mn__default.resolve(t,r),i=mn__default.relative(t,o);if(!(i.startsWith("..")||mn__default.isAbsolute(i)))return o}function B2e({request:t,response:e,assets:n}){if(t.method!=="GET"&&t.method!=="HEAD"){dk({response:e,statusCode:405,body:"Method Not Allowed",allow:"GET, HEAD"});return}let r=new URL(t.url??"/","http://localhost").pathname;if(r==="/"||r==="/index.html"){Zne({request:t,response:e,buffer:n.indexHtmlBuffer,contentType:"text/html; charset=utf-8"});return}let o=F2e({staticDir:n.staticDir,pathname:r});if(!o){dk({response:e,statusCode:403,body:"Forbidden"});return}if(!br.existsSync(o)||!br.statSync(o).isFile()){dk({response:e,statusCode:404,body:"Not Found"});return}let i=mn__default.extname(o).toLowerCase(),a=fu[i]??"application/octet-stream";Zne({request:t,response:e,buffer:br.readFileSync(o),contentType:a});}async function U2e({logger:t,assets:e}){let n=createServer((i,a)=>B2e({request:i,response:a,assets:e})),r=Math.floor(Math.random()*L2e)+N2e,o=await Yl(r,"mobile-mcp-remote-control-viewer");return await new Promise((i,a)=>{let s=l=>{a(l);};n.once("error",s),n.listen(o,()=>{n.off("error",s),i();});}),t.info({port:o,staticDir:e.staticDir},"Started mobile MCP remote control viewer server"),{port:o,server:n}}function pk({logger:t,applicationName:e,cliVersion:n,serverId:r=randomUUID()}){let o={serverId:r,applicationName:e,cliVersion:n},i=nr(),a=t.child({orgId:i,userId:gd(),...o});return {info:o,mcpLogger:a,orgId:i}}function fk({sessionIdleTimeoutMinutes:t}){return (t&&t>=1?t:Jne)*60*1e3}async function _R({project:t,serverUrl:e,alwaysSaveCache:n,noCache:r,remoteControlStaticDir:o}){Qne({staticDir:o}),ef(e),LA({alwaysSaveCache:n,noCache:r}),xR({userId:gd(),orgId:nr(),selfServe:FA()}),BA(t,i=>ai({configFilePath:i}));}function OR({project:t,logger:e,apiKey:n,serverUrl:r,supportsFileOutput:o,headfulDefault:i,sessionIdleTimeoutMinutes:a,applicationName:s,cliVersion:l,serverId:c}){let{info:u,mcpLogger:d,orgId:m}=pk({logger:e,applicationName:s,cliVersion:l,serverId:c}),p=new as({baseUrl:r,apiKey:n,logger:d,mode:"interactive"});return {context:{project:t,orgId:m,logger:d,generator:p,serverId:u.serverId,saveChangesToDisk:true,sessionIdleTimeoutMs:fk({sessionIdleTimeoutMinutes:a}),supportsFileOutput:o,headfulDefault:i},info:u}}async function j2e({moduleId:t,name:e,description:n,enabled:r,platform:o,parameters:i,steps:a,project:s}){let l=await Et(s),{stepsToSave:{steps:c}}=await Tr({platform:o,stepLists:{steps:a}});rs({content:{platform:o,moduleId:t,name:e,description:n,enabled:r,parameters:i,steps:c},schemaVersion:cr,momenticFiles:l,project:s});}function H2e({module:t,inputs:e}){return {...t,id:randomUUID(),type:"RESOLVED_MOBILE_MODULE",inputs:e}}async function ere({project:t,logger:e,testPath:n,saveChangesToDisk:r,mutableStepState:o,params:i,initialMomenticFiles:a,platform:s,availableSteps:l,cacheContext:c}){let{stepsToExtract:u,startIndex:d,endIndex:m}=KQ({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:n,startIndex:i.startIndex,endIndex:i.endIndex,availableSteps:l,containsNestedModuleStep:Cq}),p=mn__default.join(t.rootDir,i.folderPath??"");i.folderPath&&br.mkdirSync(p,{recursive:true});let f=await jg({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 j2e({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}),r&&i.startIndex!==void 0&&n!==void 0){let h=await Et(t);if(!l)throw new Error("Mobile module was created successfully, but the source test steps were not available for replacement.");let b=H2e({module:f,inputs:i.moduleInputs}),y=[...l];if(y.splice(d,m-d,b),await Xs({platform:s,filePath:n,steps:y,folder:t.rootDir,project:t,momenticFiles:h,schemaVersion:cr}),o&&(o.stepLists={...o.stepLists,steps:y}),c){let{cachesToSave:S,snapshotCachesToSave:T}=await Tr({platform:s,stepLists:{steps:y},cacheCreationParams:{orgId:c.orgId,testId:c.testId,environment:c.envName},useSnapshotIdentityCache:c.useSnapshotIdentityCache});try{await c.cacheStorage.saveEntries({platform:s,logger:e,entries:S});}catch(C){e.warn({err:C},"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(C){e.warn({err:C},"Failed to save mobile snapshot identity cache after module create, future runs may regenerate step ids");}}}return f}function tre(t,e,n){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 n&&n.testId===t.id&&n.platform===e?{availableSteps:n.stepLists.steps,mutableStepState:n}:{availableSteps:t.steps,mutableStepState:void 0}}async function rre({project:t,logger:e,testPath:n,saveChangesToDisk:r,mutableStepState:o,params:i}){Ei(i.name);let a=await Et(t),s=n!==void 0?await cn(mn__default.join(t.rootDir,n),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=Wt();if(d){let m=await gn(e,d,t),{alwaysSaveCache:p,noCache:f}=Ts();c={cacheStorage:Qn({logger:e,orgId:nr(),client:d,gitMetadata:m,regenerateCache:false,alwaysSaveCache:p,noCache:f,isolateCachesByEnvironment:t.config?.advanced?.isolateCachesByEnvironment}),testId:s.id,orgId:nr(),envName:s.settings?.defaultEnv,useSnapshotIdentityCache:t.config.fileFormat==="v2"};}}let u={project:t,logger:e,testPath:n,saveChangesToDisk:r,params:i,initialMomenticFiles:a,cacheContext:c};switch(l){case "ANDROID":return {module:await ere({...u,platform:"ANDROID",...tre(s,"ANDROID",o)})};case "IOS":return {module:await ere({...u,platform:"IOS",...tre(s,"IOS",o)})};default:return It(l)}}var ore=Dr({schema:{name:yS,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:bB})},handle:async(t,e,n)=>{let{project:r,logger:o}=t;try{let i=await ss(r,e.selector,"mobileModules"),a=await Vu(i.entity,i.momenticFiles,o);n.addPartFromText(JSON.stringify({module:a},null,2));}catch(i){n.addError(H(i));}}}),ire=Dr({schema:{name:fB,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:rP},handle:async(t,e,n)=>{try{let r=rP.parse(e),{testPath:o,...i}=r,a=i9({projectRoot:t.project.rootDir,filePath:o,pathLabel:"testPath"}),s;if(a!==void 0){let c=mn__default.join(t.project.rootDir,a);for(let u of to.listSessionIds()){let d=to.getSession(u);if(d!==void 0&&d.testFileAbsolutePath===c){s=d.mutableStepState;break}}}let l=await rre({project:t.project,logger:t.logger,testPath:a,saveChangesToDisk:t.saveChangesToDisk,mutableStepState:s,params:i});n.addPartFromText(JSON.stringify(l.module,null,2));}catch(r){n.addError(H(r));}}});function DR({step:t,parentChain:e}){let n=t;n.parentStepIdChain=e.map(r=>r.id),delete n.retries,delete n.skipped;}function Y2e(t){let e=cloneDeep(t);return Oi({steps:e,earlyStop:false,onPreset:(n,r)=>{if(DR({step:n,parentChain:r.parentChain}),n.type==="MOBILE_PRESET_STEP"){let o=n.command;delete o.cache,delete o.id,delete o.thoughts;}return false},onModule:(n,r)=>{DR({step:n,parentChain:r.parentChain});let o=n;return delete o.enabled,delete o.schemaVersion,false},onConditional:(n,r)=>(DR({step:n,parentChain:r.parentChain}),false),onAiAction:(n,r)=>{DR({step:n,parentChain:r.parentChain});let o=n;return delete o.cache,false}}),e.map((n,r)=>{let o=n;return o.index=r,o})}function hk(t,e){if(t.length===0)return `${e}: (no steps)`;let n=["```json",JSON.stringify(Y2e(t),null,2),"```"].join(`
|
|
6230
|
+
`;function mne(t){return fR(t,cne,dne())}var dl={initializeAIActionConfig:mne,stepSchema:Yn,resultSchema:Po};var z$e=5e3;async function fne({socket:t,logger:e,orgId:n,testMetadata:r,globalOrgSettings:o,androidDriverFactory:i,mobileGeneratorFactory:a,browserGeneratorFactory:s,browserEnricherFactory:l,storageFactory:c,cacheStorageFactory:u,localToolsFactory:d,onRemoteEmulatorCreated:m,onRemoteEmulatorDeleted:p,billingReporterFactory:f,globalStateManager:h,getGitMetadata:b,region:y,localApkPath:S,localAvdId:T}){let C=t.id,w=await b(),_=t.handshake.query?.fileName,N=_?mn__default.basename(_,".test.yaml"):"",I=r.id;e=e.child({sessionId:C,testId:I,orgId:n,branch:w.gitBranchName});let A=await c(n),z=r.settings?.defaultEnv,D={};z&&(D=(await A.fetchEnvironment(z,e))?.variables??{});let B={...o.emulator,...r.settings?.emulator},F={...o.ai,useMemory:o.ai?.useMemory!==false,...r.settings?.ai},$=h.getSession(C);if($){if(e.info("Reconnecting to existing Android session"),$.local)return t.emit("session",$.metadata),$.softDeleted=false,$.metadata;throw new Error("Restoring existing remote emulator sessions is not supported. Please reconnect to a new emulator.")}let le=await u(n,w),j=Nl.optional().parse(y??B.region),L=j==="local",U,k,W;if(L){if(await h.clearSoftDeletedLocalSessions(e),h.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");let{avdId:io,apkFilePath:va,apkFilePathSource:hl}=gm({overrideAvdId:T,overrideApkFilePath:S,emulatorSettings:B,defaultApkFilePath:r.settings?.defaultApkFilePath,envVariables:D}),gl=fp({apkFilePath:va,source:hl});if(!io)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 ${Cl} key on the environment.`);W={avdId:io,apkFilePath:gl};}else U=r.settings?.defaultChannel,k=r.settings?.defaultTag,W={region:j===Jo?void 0:j,apkToInstall:U?{channel:U,tag:k}:void 0,osVersion:B.remoteEmulatorSettings?.androidVersion??lm};e.info({platform:"ANDROID",isLocalRegion:L,resolvedRegion:j,envName:z,emulatorSettings:B,aiSettings:F},"Starting mobile session with resolved configuration");let q=Date.now(),V=await i({socket:t,logger:e,creationOpts:W}),{driver:pe,cleanup:Te,emulatorName:Ne,adbPort:Nt}=V,Yt,or,nt,J,Ae,$t;"limbarClient"in V&&(Yt=V.limbarClient,or=V.limbarToken,nt=V.limbarUrl,J=V.limbarRegion,Ae=V.limbarOsVersion,$t=V.playwrightDevice);let mt=mn__default.join(tmpdir(),`logcat-logs-${n}-${I}-${C}.txt`);L||await m?.({emulatorName:Ne,platform:"ANDROID"}),e.info({adbPort:Nt,apkChannel:U,apkTag:k,duration:Date.now()-q,emulatorName:Ne},"Android emulator session initiated"),e=e.child({emulator:Ne});let Ee=false,ir=false,zr,xr,ro,Rn,oo=async()=>{if(Ee)return;Ee=true,ir=true,clearInterval(ro),ro=void 0;let va=[async()=>{await xr?.cleanup();},async()=>{await zr?.();},async()=>{await Te(),L||await p?.({emulatorName:Ne,platform:"ANDROID"});},async()=>{await Rn?.dispose();}].map(hl=>hl().catch(gl=>{e.warn({err:gl},"Failed to clean up socket server resource");}));await te(Promise.allSettled(va),{milliseconds:z$e,fallback:()=>{}});};h.registerPendingSession(C,{platform:"ANDROID",cleanup:oo,emulatorName:Ne,local:L});let Yi=async()=>{zr=await pe.executeInNativeContext(e,Xt=>fC({driver:Xt,onLogs:Fn=>{t.emit("logcatLogs",Fn);},logFilePath:mt}),{operationName:"startLogcatListener"});let io=await a(n,e),va=await s(n,e),hl=await l(n,e);Rn=d?await d(n):void 0;let gl=new es({logger:e,reporter:await f(n),runType:"mobile-test-run",runId:C,testMetadata:{id:r.id,name:N},isInteractive:true}),Pf=new Ri({variablesFromEnvironment:D,envName:z,testName:N});if(xr=await $c.init({driver:pe,generator:io,logger:e,limbarClient:Yt,playwrightDevice:$t,aiSettings:F,options:{emulator:{...B,browserSettings:o.browser}},fixtures:{storage:A,browserEnricher:hl,browserGenerator:va,localCodeEvalTools:Rn,testContext:Pf},orgId:n,adbPort:Nt,abortController:new AbortController}),!xr)throw new Error("Failed to initialize Android controller");let If=xr;if(ir||!t.connected)throw new Error("Socket not connected anymore, not proceeding with Android session setup");let R=await If.getViewportBounds();if(ir||!t.connected)throw new Error("Socket not connected anymore, not proceeding with Android session setup");ro=$$e({socket:t,testContext:Pf});let ne={sessionId:C,testId:I,orgId:n,emulatorName:Ne,testName:N,limbarUrl:nt,limbarToken:or,limbarRegion:J,limbarOsVersion:Ae,viewportBounds:R,envName:z};return h.registerSession(C,{platform:"ANDROID",controller:If,cacheStorage:le,cleanup:oo,emulatorName:Ne,local:L,metadata:ne,logFilePath:mt,helpers:ul,usageTracker:gl}),t.emit("session",ne),ne};try{return await Yi()}catch(io){throw await h.removeSession(C,e),io}}function $$e({socket:t,testContext:e}){return setInterval(()=>{let n=e.toEditorDisplayCopy();t.emit("emulatorState",{context:n});},3e3)}async function hne({socket:t,logger:e,globalStateManager:n,authorization:r}){let o=t.id,i=n.getSession(o);i&&i.platform==="ANDROID"&&r&&i.logFilePath&&V$e({testId:i.metadata.testId,sessionId:o,logFilePath:i.logFilePath,authorization:r,logger:e}),await n.removeSession(o,e);}async function V$e({testId:t,sessionId:e,logFilePath:n,authorization:r,logger:o}){try{let i;try{i=await hR.stat(n);}catch{o.debug({logFilePath:n},"No logcat file found to upload");return}if(i.size===0){o.debug({logFilePath:n},"Logcat file is empty, skipping upload"),await hR.unlink(n);return}let a=new bn(r),{uploadUrl:s}=await a.generateMobileLogcatUploadUrl({testId:t,sessionId:e}),l=await hR.readFile(n),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()}`);o.info({testId:t,sessionId:e,objectUrl:WT(s)},"Logcat file uploaded successfully");}catch(i){o.warn({err:i,testId:t,sessionId:e},"Failed to upload logcat file");}finally{try{await hR.unlink(n);}catch(i){o.warn({err:i,logFilePath:n},"Failed to delete temp logcat file");}}}var j$e=({socket:t,globalStateManager:e})=>async()=>{let n=e.getSession(t.id);if(!n)throw new Error("No active Mobile session found");n.controller.abort();},gne={event:"cancel",createHandler:j$e};var H$e=({logger:t,globalStateManager:e,socket:n})=>async(r,o)=>{let i=e.getSession(n.id);if(!i){o({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"),o({screenXml:l});}catch(l){t.error({err:l},"Error fetching screen XML from the session controller"),o({err:l.message});}},bne={event:"fetchScreenXml",createHandler:H$e};var ok=class{parentTracer;socket;step;orgId;interactionTracer;platform;constructor({step:e,socket:n,parentTracer:r,orgId:o,platform:i}){this.socket=n,this.parentTracer=r,this.step=e,this.orgId=o,this.platform=i,this.interactionTracer=new Bi,Xr.initializeRootTracerContext(this.interactionTracer);}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeXmlSnapshot(){}attachAfterXmlSnapshot(){}recordStepDuration(e){let{durationMs:n,step:r}=e;if(!NE(r))return;let o=DE(r);Ge.distribution("test_mobile_step_duration",n,[`type:${o}`,`platform:${this.platform.toLowerCase()}`,"executor:editor",`orgId:${this.orgId}`]);}async finish(e){this.interactionTracer.finish();let n=this.interactionTracer.getRootSpan(),r={result:e.result,parentStepIdChain:e.parentStepIdChain,trace:XM.parse(n)};switch(r.result.status){case "SUCCESS":this.socket.emit("success",r);break;case "FAILED":this.socket.emit("failure",r);break;case "CANCELLED":this.socket.emit("cancelled",r);break}return {trace:n}}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}async startSubSteps(){return new yf({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId,platform:this.platform})}},yf=class{parentTracer;parentStep;socket;orgId;platform;constructor({parentStep:e,socket:n,parentTracer:r,orgId:o,platform:i}){this.parentTracer=r,this.parentStep=e,this.socket=n,this.orgId=o,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 ok({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId,platform:this.platform})}async getScreenshot(e){}},gR=class{constructor(e,n,r){this.socket=e;this.orgId=n;this.platform=r;}appendLogs(){}setActiveVideo(){}async finish(){this.socket.emit("finished");}async startBeforeStepList(){return new yf({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId,platform:this.platform})}async startMainStepList(){return new yf({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId,platform:this.platform})}async startAfterStepList(){return new yf({parentStep:null,parentTracer:null,socket:this.socket,orgId:this.orgId,platform:this.platform})}};var W$e=({metadata:t,logger:e,globalStateManager:n,socket:r,useSnapshotIdentityCache:o,storageFactory:i})=>async(a,s)=>{let l=n.getSession(r.id);if(!l)throw new Error("No active Mobile session found");let c=await i(t.orgId),u=e.child({testId:a.testMetadata.id});l.controller.resetAbortController();let d=l.usageTracker,m;try{m=await G$e({session:l,params:a,metadata:t,testLogger:u,usageTracker:d,socket:r,useSnapshotIdentityCache:o,storage:c});}finally{await d.flush(u);}let p={results:l.helpers.resultSchema.array().parse(m.results),status:m.status};s?.(p);};async function G$e({session:t,...e}){switch(t.platform){case "ANDROID":return yne({session:t,...e});case "IOS":return yne({session:t,...e});default:return (r=>{throw new Error(`Unsupported platform: ${r}`)})(t)}}async function yne({session:t,params:e,metadata:n,testLogger:r,usageTracker:o,socket:i,useSnapshotIdentityCache:a,storage:s}){let l=new gR(i,n.orgId,t.platform);try{return await bf({platform:t.platform,work:{fastForwardingToStep:!!e.fromStep,state:{failureRecoveryDisabled:!0,failureRecoveryAttempts:0}},fixtures:{controller:t.controller,logger:r,cacheStorage:t.cacheStorage,usageTracker:o,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:n.orgId,testName:n.testName,testMetadata:e.testMetadata,interactive:!0,useSnapshotIdentityCache:a},envName:n.envName,tracer:l,callbacks:{step:{onAiActionEvent:c=>{i.emit("aiActionEvent",c);}}},helpers:t.helpers})}finally{await l.finish();}}var Sne={event:"execute",createHandler:W$e};var K$e=({socket:t,globalStateManager:e,keepSessionAlive:n})=>{let r=debounce(n,3e4,{maxWait:6e4});return async()=>{let o=e.getSession(t.id);if(!o)throw new Error("No active Mobile session found");o.emulatorName&&(o.local||r(o.platform,o.emulatorName));}},Ene={event:"keepalive",createHandler:K$e};var Y$e=({socket:t,globalStateManager:e,logger:n})=>async(r,o)=>{let i=e.getSession(t.id);if(!i){let s="No active session found";n.error(s),o?.({success:false,err:s});return}let a=i.controller;a.abort(),a.resetAbortController(),n.info({platform:i.platform},"Resetting emulator state");try{await a.softReset(),n.info({platform:i.platform},"Emulator reset completed"),o?.({success:!0,message:"Emulator reset successfully"});}catch(s){let l=H(s);n.error({err:s,platform:i.platform},"Failed to reset emulator"),o?.({success:false,err:`Failed to reset emulator: ${l}`});}},Tne={event:"reset",createHandler:Y$e};var vne=[Sne,gne,Tne,Ene,bne];var J$e=5e3;async function Cne({socket:t,logger:e,orgId:n,testMetadata:r,globalOrgSettings:o,localIosDeviceType:i,localIosVersion:a,iosDriverFactory:s,mobileGeneratorFactory:l,browserGeneratorFactory:c,browserEnricherFactory:u,billingReporterFactory:d,storageFactory:m,cacheStorageFactory:p,localToolsFactory:f,onRemoteEmulatorCreated:h,onRemoteEmulatorDeleted:b,globalStateManager:y,getGitMetadata:S,region:T,localAppPath:C}){let w=t.id,_=await S(),N=t.handshake.query?.fileName,I=N?mn__default.basename(N,".test.yaml"):"",A=r.id,z=r.settings?.defaultChannel,D=r.settings?.defaultTag;e=e.child({sessionId:w,testId:A,orgId:n,branch:_.gitBranchName});let B=await m(n),F=r.settings?.defaultEnv,$={};F&&($=(await B.fetchEnvironment(F,e))?.variables??{});let le={...o.emulator,...r.settings?.emulator},j={...o.ai,useMemory:o.ai?.useMemory!==false,...r.settings?.ai},L=y.getSession(w);if(L){if(e.info("Reconnecting to existing iOS session"),L.local)return t.emit("session",L.metadata),L.softDeleted=false,L.metadata;throw new Error("Restoring existing remote emulator sessions is not supported. Please reconnect to a new emulator.")}let U=await p(n,_),k=Nl.optional().parse(T??le.region),W=k==="local",q;if(W){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:ir,iosVersion:zr,appFilePath:xr,appFilePathSource:ro}=bm({overrideDeviceType:i,overrideIosVersion:a,overrideAppFilePath:C,emulatorSettings:le,defaultAppFilePath:r.settings?.defaultAppFilePath,envVariables:$});if(!ir)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 ${wl} key on the environment.`);let Rn=pf({appFolderPath:xr,source:ro});q={type:"local",deviceType:ir,iosVersion:zr,appFilePath:Rn};}else q={type:"remote",region:k===Jo?void 0:k,appToInstall:z?{channel:z,tag:D}:void 0,osVersion:cm};e.info({platform:"IOS",isLocalRegion:W,resolvedRegion:k,envName:F,emulatorSettings:le,aiSettings:j},"Starting mobile session with resolved configuration");let V=Date.now(),{driver:pe,cleanup:Te,emulator:Ne,limbarParams:Nt}=await s({socket:t,logger:e,creationOpts:q});e=e.child({emulator:Ne.name}),e.info({duration:Date.now()-V},"iOS emulator session initiated"),W||await h?.({emulatorName:Ne.name,platform:"IOS"});let Yt=false,or=false,nt,J,Ae,$t,mt=async()=>{if(Yt)return;Yt=true,or=true,Ae&&(clearInterval(Ae),Ae=void 0);let zr=[async()=>{await J?.cleanup();},async()=>{nt?.();},async()=>{await Te(),W||await b?.({emulatorName:Ne.name,platform:"IOS"});},async()=>{await $t?.dispose();}].map(xr=>xr().catch(ro=>{e.warn({err:ro},"Failed to clean up socket server resource");}));await te(Promise.allSettled(zr),{milliseconds:J$e,fallback:()=>{}});};y.registerPendingSession(w,{platform:"IOS",cleanup:mt,emulatorName:Ne.name,local:W});let Ee=async()=>{nt=await WA({emulator:Ne,onLogs:va=>{t.emit("syslogLogs",va);}});let ir=await l(n,e),zr=await c(n,e),xr=await u(n,e);$t=f?await f(n):void 0;let ro=new es({logger:e,reporter:await d(n),runType:"mobile-test-run",runId:w,testMetadata:{id:r.id,name:I},isInteractive:true}),Rn=new Ri({variablesFromEnvironment:$,envName:F,testName:I});if(J=await jc.init({driver:pe,generator:ir,logger:e,emulator:Ne,aiSettings:j,options:{emulator:{...le,browserSettings:o.browser}},fixtures:{storage:B,browserEnricher:xr,browserGenerator:zr,localCodeEvalTools:$t,testContext:Rn},orgId:n,abortController:new AbortController}),!J)throw new Error("Failed to initialize iOS controller");let oo=J;if(or||!t.connected)throw new Error("Socket not connected anymore, not proceeding with iOS session setup");let Yi=await oo.getViewportBounds();if(or||!t.connected)throw new Error("Socket not connected anymore, not proceeding with iOS session setup");Ae=Z$e({socket:t,testContext:Rn});let io={sessionId:w,testId:A,orgId:n,emulatorName:Ne.name,testName:I,limbarUrl:Nt?.webRtcUrl,limbarToken:Nt?.token,limbarRegion:Nt?.region,limbarOsVersion:Nt?.osVersion,viewportBounds:Yi,envName:F};return y.registerSession(w,{platform:"IOS",controller:oo,cacheStorage:U,cleanup:mt,emulatorName:Ne.name,local:W,metadata:io,helpers:dl,usageTracker:ro}),t.emit("session",io),io};try{return await Ee()}catch(ir){throw await y.removeSession(w,e),ir}}function Z$e({socket:t,testContext:e}){return setInterval(()=>{let n=e.toEditorDisplayCopy();t.emit("emulatorState",{context:n});},3e3)}var bR=class{sessions=new Map;pendingSessions=new Map;registerPendingSession(e,n){this.pendingSessions.set(e,n);}registerSession(e,n){this.pendingSessions.delete(e),this.sessions.set(e,n);}getSession(e){return this.sessions.get(e)}async clearSoftDeletedLocalSessions(e){for(let n of this.sessions.values())n.softDeleted===true&&n.local===true&&await this.removeSession(n.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,n){let r=this.sessions.get(e)??this.pendingSessions.get(e);if(!r)return;let o=n.child({sessionId:e,emulatorName:r.emulatorName,platform:r.platform});try{await this.sessions.get(e)?.usageTracker.flush(o);}catch(i){o.error({err:i},"Error flushing usage tracker before cleanup");}try{await r.cleanup?.(),o.info("Emulator cleaned up by removeSession");}catch(i){o.error({err:i},"Error during emulator cleanup");}finally{this.sessions.delete(e),this.pendingSessions.delete(e);}}async removeAllSessions(e){let n=Array.from(new Set([...this.sessions.keys(),...this.pendingSessions.keys()]));await Promise.all(n.map(r=>this.removeSession(r,e)));}};function wne(t){let{logger:e,baseServer:n,globalStateManager:r,settingsFactory:o,getOrgId:i}=t,a=new Server(n,{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 r.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 hne({socket:c,globalStateManager:r,logger:d,authorization:t.authorization});return}let h=r.getSession(u);h&&(h.softDeleted=true);});let m,p;try{let f=c.handshake.query?.testMetadata,h=kl.parse(JSON.parse(f??"")),b=h.id,y=await i({testId:b});switch(p=await o(y,e),h.platform){case "ANDROID":m=await fne({...t,orgId:y,socket:c,globalStateManager:r,logger:d,globalOrgSettings:p,testMetadata:h});break;case "IOS":m=await Cne({...t,orgId:y,socket:c,globalStateManager:r,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}vne.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 o2e(t,e){switch(t){case "ANDROID":return {uploadPath:e,cleanup:async()=>{}};case "IOS":{let n=await br.promises.mkdtemp(mn__default.join($s.tmpdir(),"momentic-mobile-asset-")),r=mn__default.join(n,"app.zip");return await i2e(e,r),{uploadPath:r,cleanup:()=>br.promises.rm(n,{recursive:true,force:true})}}}}function i2e(t,e){return new Promise((n,r)=>{let o=e2e("zip",{zlib:{level:9}}),i=br.createWriteStream(e);i.on("close",()=>n()),i.on("error",r),o.on("error",r),o.on("warning",a=>{a.code!=="ENOENT"&&r(a);}),o.pipe(i),o.directory(t,false,a=>mn__default.basename(a.name)===".DS_Store"?false:(a.mode=a.stats?.isDirectory()?493:420,a)),o.finalize().catch(r);})}async function a2e(t){let e=t2e.createHash("md5");await new Promise((r,o)=>{br.createReadStream(t).on("data",i=>e.update(i)).on("end",()=>r()).on("error",o);});let n=e.digest();return {md5Base64:n.toString("base64"),md5Hex:n.toString("hex")}}async function yR({tag:t,channel:e,filePath:n,apiClient:r,logger:o,platform:i}){o.info({channel:e,tag:t,platform:i,filePath:n},"starting asset upload");let a=Date.now(),{uploadPath:s,cleanup:l}=await o2e(i,n);try{let{md5Base64:c,md5Hex:u}=await a2e(s),{size:d}=await br.promises.stat(s),m=await r.generateAssetUploadUrl({channel:e,tag:t??"latest",md5:c,platform:i});if(m.md5&&(m.md5===c||m.md5===u))return o.info({channel:e,tag:t,platform:i,filePath:n,size:d,durationMs:Date.now()-a,skipped:!0},"skipped asset upload (md5 match)"),{skipped:!0};if(!m.uploadUrl)throw new M("InternalPlatformError",`No upload URL was given for asset ${n}`);try{let p=await fetch$1(m.uploadUrl,{headers:{"Content-Length":d.toString(),"Content-Type":"application/octet-stream"},method:"PUT",body:br.createReadStream(s),duplex:"half"});if(p.status!==200)throw new M("InternalPlatformError",`Got error response from emulator platform: ${p.status} ${await p.text()}`);return o.info({channel:e,tag:t,platform:i,filePath:n,size:d,durationMs:Date.now()-a},"finished asset upload"),{skipped:!1}}catch(p){try{await r.deleteAsset(e,t??"latest",i);}catch(f){o.warn({err:f,tag:t,channel:e},"Failed to clean up asset after failed upload");}throw p}}finally{await l();}}async function SR({channel:t,tag:e,platform:n,apiClient:r,logger:o}){let i=e??"latest";o.info({channel:t,tag:i,platform:n},`Deleting asset ${t}:${i} (${n})...`),await r.deleteAsset(t,i,n),o.info({channel:t,tag:i,platform:n},`Asset ${t}:${i} (${n}) deleted successfully!`);}var s2e=z.object({emulatorName:z.string(),platform:z.enum(Je)});z.object({runId:z.string(),emulators:z.array(s2e)});var Ane;async function ER(t){await Ane?.registerEmulator(t);}async function TR(t){await Ane?.unregisterEmulator(t);}var vR=new bR;var ak="0.111.1",ft=xm({app:"mobile-desktop-server",hostname:hostname(),disableConsoleLogs:true}).child({cliVersion:ak});(async()=>{try{let t=await $g(ft);t.gitBranchName&&ft.addBinding("branch",t.gitBranchName);}catch{}})();var CR=Router();CR.get("/",Ve(async(t,e)=>{let n=Wt();if(!n){e.status(500).json({message:"API client not initialized"});return}let r=await n.getMobileAssets();e.status(200).json(r);}));CR.post("/upload-url",Ve(async(t,e)=>{let n;try{n=L1.parse(t.body);}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}let r=Wt();if(!r){e.status(500).json({error:"API client not initialized"});return}let o=mn__default.resolve(n.filePath);if(!existsSync(o)){e.status(400).json({error:`File not found: ${o}`});return}let i=/\.apk$/i.test(o),a=o.endsWith(".app")&&statSync(o).isDirectory();if(!i&&!a){e.status(400).json({error:"Unsupported file type. Only .apk files and .app directories are supported."});return}await yR({tag:n.tag,channel:n.channel,filePath:o,apiClient:r,logger:ft,platform:i?"ANDROID":"IOS"}),e.sendStatus(204);}));CR.delete("/:channel/:tag/:platform",Ve(async(t,e)=>{let n=Wt();if(!n){e.status(500).json({error:"API client not initialized"});return}let{channel:r,tag:o,platform:i}=t.params;if(!r||!o||!i){e.status(400).json({error:"Missing channel, tag, or platform."});return}let a=ch.safeParse(i.toUpperCase());if(!a.success){e.status(400).json({error:`Invalid platform "${i}". Expected "android" or "ios".`});return}let s=a.data;await SR({channel:r,tag:o,platform:s,apiClient:n,logger:ft}),e.sendStatus(204);}));var Rne=CR;var Tf=Router();async function wR(t){return (await $3(t,ft)).map(r=>{let o=t.mobileModules[r.moduleId];if(!o){P.warn(`Found a dangling mobile module with ID ${r.moduleId} that could not be found on disk.`);return}return {...o,content:r}}).filter(r=>r!==void 0)}Tf.get("/",Ve(async(t,e)=>{let n=yt(),r=await Et(n),o=await wR(r);e.status(200).json(o);}));Tf.get("/tests-join",Ve(async(t,e)=>{let n=yt(),r=await Et(n),o=await wR(r),i={};for(let s of o)i[s.id]={...s,tests:[]};let a=await Promise.all(Object.values(r.mobileTests).map(async s=>({id:s.id,name:s.name,relativePath:s.relativePath,test:await cn(s.fullFilePath,ft,r)})));for(let{id:s,name:l,relativePath:c,test:u}of a){let d=new Set;Oi({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);}));Tf.get("/:moduleId",Ve(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let n=await Et(yt()),r=n.mobileModules[t.params.moduleId];if(!r){e.status(404).json({error:"Mobile module not found."});return}try{let o=await Vu(r,n,P);e.json(o);}catch(o){e.status(400).json({err:o});}}));Tf.patch("/:moduleId/metadata",Ve(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let n;try{n=F1.parse(t.body);}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let r=yt(),o=await Et(r);z3({moduleId:t.params.moduleId,patch:n,momenticFiles:o,logger:P,project:r}),e.status(201).json({message:"ok"});}));Tf.post("/",Ve(async(t,e)=>{let n;try{n=U1.parse(t.body);}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{Ei(n.name);}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let r=yt(),o=await Et(r),i=o.mobileModules;if(Object.values(i).find(s=>s.name===n.name)){e.status(400).json({error:`A mobile module with the name "${n.name}" already exists. Please choose a different name.`});return}let a=mn__default.join(r.rootDir,n.folderPath??mn__default.dirname(n.testFilePath));if(!br.existsSync(a)||!br.statSync(a).isDirectory()){e.status(400).json({error:`The folder configured for mobile module creation does not exist: ${a}`});return}switch(n.platform){case "ANDROID":{let s=await jg({...n,folder:a,project:r,momenticFiles:o});e.status(201).json(s);return}case "IOS":{let s=await jg({...n,folder:a,project:r,momenticFiles:o});e.status(201).json(s);return}}}));var Pne=Tf;var sk=Router();sk.get("/",Ve(async(t,e)=>{let n=yt(),r=await Et(n),o=await wR(r),i=new Set;r?.mobileTests&&Object.values(r.mobileTests).forEach(c=>{c.labels?.forEach(u=>i.add(u));});let a=Array.from(i).sort(),s=Object.values(r.mobileTests),l={labels:a,modules:o,tests:s};e.status(200).json(l);}));sk.get("/folders",Ve(async(t,e)=>{let n=yt(),r=await A3(n);e.status(200).json(r);}));var Ine=sk;var AR=Router();AR.get("/",Ve((t,e)=>{let n=Mv(yt(),ft);e.status(200).json(n);}));AR.get("/names",Ve((t,e)=>{let r=yt().config.environments?.map(o=>o.name)??[];e.status(200).json(r);}));AR.post("/",Ve((t,e)=>{let n;try{n=k1.parse(t.body);}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{Ei(n.name);}catch(s){e.status(400).json({error:`Invalid environment name: ${s}`});return}let r=yt();if(r.config.environments?.find(s=>s.name===n.name)){e.status(400).json({error:`An environment with the name "${n.name}" already exists. Please choose a different name.`});return}let i={...r.config,environments:[...r.config.environments??[],{name:n.name}]};r.config=i,$u(i,r.configFilePath);let a=Uu(n.name,r,ft);e.status(201).json(a);}));var _ne=AR;var One=Router();One.get("/",Ve((t,e)=>{let n={userId:gd(),orgId:nr(),email:kA(),name:wee(),pylonEmailHash:Aee(),cliVersion:ak};e.status(200).json(n);}));var Dne=One;var Nne=Router();Nne.get("/",Ve(async(t,e)=>{let n=t.query.sessionId;if(!n){e.status(400).json({packages:[]});return}let r=vR.getSession(n);if(!r?.controller){e.status(200).json({packages:[]});return}try{let o=r.controller,{installedApps:i}=await o.getInstalledApps();e.status(200).json({packages:i});}catch(o){ft.error({err:o},"Error fetching installed packages from the session controller"),e.status(200).json({packages:[]});}}));var Lne=Nne;var kne=Router();kne.get("/",Ve(async(t,e)=>{let n=await wy(ft);e.status(200).json(n);}));var Fne=kne;var RR=Router(),Bne=async({platform:t,steps:e,cacheStorage:n,stepId:r,parentStepIdChain:o,testId:i,environment:a})=>{let{result:s,parentChain:l}=Xl(e,r,o);if(!s)return;let c=l.filter(u=>u.type==="RESOLVED_MOBILE_MODULE").map(u=>u.id);return await n.getCacheKeyForStep({platform:t,logger:ft,testId:i,environment:a,parentStepIdChain:c,step:s})};RR.patch("/",Ve(async(t,e)=>{let n=yt(),r=nr(),o=Wt(),i=n.config?.advanced?.isolateCachesByEnvironment;if(!o){e.status(500).json({error:"API client not initialized"});return}let a;try{a=V1.parse(t.body);}catch(u){e.status(400).json({error:`Invalid request body: ${u}`});return}let s=await gn(ft,o,n),l=Qn({logger:ft,orgId:r,client:o,gitMetadata:s,regenerateCache:false,noCache:false,alwaysSaveCache:false,isolateCachesByEnvironment:i}),c=await Bne({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 o.updateMobileStepCaches({platform:a.platform,body:{entries:[{key:c,organizationId:r,value:a.value,testId:a.testId,environment:i?a.environment:void 0}]},headers:bu(s)}),e.status(204).send();}));RR.delete("/entry",Ve(async(t,e)=>{let n=yt(),r=nr(),o=Wt(),i=n.config?.advanced?.isolateCachesByEnvironment;if(!o){e.status(500).json({error:"API client not initialized"});return}let a;try{a=H1.parse(t.body);}catch(u){e.status(400).json({error:`Invalid request body: ${u}`});return}let s=await gn(ft,o,n),l=Qn({logger:ft,orgId:r,client:o,gitMetadata:s,regenerateCache:false,noCache:false,alwaysSaveCache:false,isolateCachesByEnvironment:i}),c=await Bne({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 o.deleteMobileStepCacheEntry({platform:a.platform,body:{testId:a.testId,key:c,environment:i?a.environment:void 0},headers:bu(s)}),e.status(204).send();}));RR.post("/traces",Ve(async(t,e)=>{let n=Wt();if(!n){e.status(500).json({error:"API client not initialized"});return}let r;try{r=W1.parse(t.body);}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o=await n.getMobileStepCacheMemoryTraces(r.platform,r);e.status(200).json(o);}));var Une=RR;HRe("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI","POSTHOG_WEB_WRITE_KEY is not set");var{captureEvent:pi,setAnalyticsIdentity:xR,shutdownAnalytics:MR}=BE({writeKey:"phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",host:"https://p.momentic.ai",platform:"local_mobile_app",identity:"stashed",flushImmediately:true});var Td=Router();Td.patch("/:testPath",Ve(async(t,e)=>{let n=t.params.testPath;if(!n){e.status(400).json({error:"Missing testPath in path"});return}let r;try{r=D1.parse(t.body);}catch(l){e.status(400).json({error:`Invalid request body: ${l}`});return}if(r.steps===void 0&&r.beforeSteps===void 0&&r.afterSteps===void 0&&r.settings===void 0&&r.labels===void 0){e.status(400).json({error:"At least one of steps, beforeSteps, afterSteps, settings, or labels is required"});return}let o=yt(),i=n.endsWith(".test.yaml")?n:`${n}.test.yaml`,a=await Et(o);await Xs({platform:r.platform,filePath:i,steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps,settings:r.settings,labels:r.labels,folder:o.rootDir,project:o,momenticFiles:a,schemaVersion:cr});let s={message:"ok"};e.status(200).json(s);}));Td.post("/",Ve(async(t,e)=>{let n;try{n=_1.parse(t.body);}catch(b){e.status(400).json({error:`Invalid request body: ${b}`});return}let{name:r,description:o,settings:i,pathSegments:a,platform:s}=n;if(!r||typeof r!="string"){e.status(400).json({error:"Missing or invalid 'name' in body"});return}try{Ei(r);}catch(b){e.status(400).json({error:H(b)});return}let l=yt(),c=await Et(l),u=mn__default.join(l.rootDir,...a??[]),{fullPath:d,testId:m}=Iv({name:r,description:o,settings:i,folder:u,platform:s,project:l,momenticFiles:c});pi({type:"test_editor:test_create",test_platform:Ai(s)});let p=mn__default.basename(d),f=mn__default.relative(l.rootDir,d),h={id:m,fileName:p,fullPath:d,relativeFilePath:f};e.status(201).json(h);}));Td.get("/:fileName",Ve(async(t,e)=>{let n=Wt(),r=nr(),o=t.params.fileName;if(!o){e.status(400).json({error:"Missing fileName in path"});return}if(!n){e.status(500).json({error:"API client not initialized"});return}let i=o.endsWith(".test.yaml")?o:`${o}.test.yaml`,a=mn__default.basename(i).replace(".test.yaml",""),s=yt(),l=mn__default.isAbsolute(i)?i:mn__default.join(s.rootDir,i);if(!br.existsSync(l)){e.status(404).json({error:"Test not found."});return}let c=await Et(s),[u,d]=await Promise.all([cn(l,ft,c),gn(ft,n,s,{includeHostingUsername:false})]);await Qn({logger:ft,orgId:r,client:n,gitMetadata:d,regenerateCache:false,noCache:false,alwaysSaveCache:false,isolateCachesByEnvironment:s.config?.advanced?.isolateCachesByEnvironment}).resolveEntries({logger:ft,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 p={...u,name:a};e.status(200).json(p);}));Td.patch("/:testPath/metadata",Ve(async(t,e)=>{let n=t.params.testPath;if(!n){e.status(400).json({error:"Missing testPath in path"});return}let r;try{r=N1.parse(t.body);}catch(l){e.status(400).json({error:`Invalid request body: ${l}`});return}let o=yt(),i=n.endsWith(".test.yaml")?n:`${n}.test.yaml`,s={message:"ok",newRelativeTestPath:V3(i,r,o).newRelativeTestPath};e.status(200).json(s);}));Td.delete("/:testPath",Ve((t,e)=>{let n=t.params.testPath;if(!n){e.status(400).json({error:"Missing testPath in path"});return}let r=yt(),o=n.endsWith(".test.yaml")?n:`${n}.test.yaml`,i=mn__default.join(r.rootDir,o);if(!br.existsSync(i)){e.status(404).json({error:"Test not found."});return}br.unlinkSync(i),e.status(200).json({message:"ok"});}));Td.post("/:testPath/duplicate",Ve(async(t,e)=>{let{testPath:n}=t.params;if(!n){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=z1.parse(t.body);}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{Ei(r.name);}catch(h){e.status(400).json({error:H(h)});return}let o=yt(),i=mn__default.join(o.rootDir,n);if(!br.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await Et(o),s;try{s=await cn(i,ft,a);}catch(h){e.status(400).json({error:H(h)});return}let l=Zm({projectConfig:o.config,momenticFiles:a,entityType:"mobile-test"}),{stepsToSave:c}=await Tr({platform:s.platform,stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:true}),u=pr({fileType:ve.MOBILE_TEST,id:l,schemaVersion:cr,description:s.description,platform:s.platform,settings:s.settings,labels:s.labels,...c});cE.parse(u);let d=mn__default.dirname(i),m=mn__default.join(d,`${r.name}.test.yaml`);if(br.existsSync(m)){e.status(409).send("A test with this name already exists");return}let p=pg.stringify(u);br.writeFileSync(m,p,"utf-8");let f={relativeFilePath:mn__default.relative(o.rootDir,m)};e.status(201).json(f);}));var zne=Td;var $ne=Router();$ne.get("/:id",Ve(async(t,e)=>{let{id:n}=t.params;if(!n){e.status(400).json({error:"Missing ID"});return}let r=Wt();if(!r){e.status(500).json({error:"API client not initialized"});return}try{let{data:o,contentType:i}=await r.fetchOnDemandScreenshot(n);e.setHeader("Content-Type",i),e.status(200).send(o);}catch(o){ft.error({err:o,screenshotId:n},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"});}}));var Vne=$ne;var jne=Router();jne.get("/",Ve((t,e)=>{let n=yt(),r={ai:n.config.ai,displayRoot:n.config.displayRoot};e.status(200).json(r);}));var Hne=jne;var Wne=Router();Wne.post("/traces",Ve(async(t,e)=>{let n=Wt();if(!n){e.status(500).json({error:"API client not initialized"});return}let r;try{r=G1.parse(t.body);}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o=await n.getWebStepCacheMemoryTraces(r);e.status(200).json(o);}));var Gne=Wne;var Cf=class extends rp{constructor(n,r){super(n,r);this.client=n;this.orgId=r;}async fetchEnvironment(n,r){let o=yt();return Uu(n,o,P)}};var M2e=promisify$1(execFile$1);async function qne({managedState:t,project:e,testEntity:n,resolvedTest:r,envName:o}){let{logger:i,sessionId:a}=t,s=Ree(),l=nr(),c=vy(),u=new bn({apiKey:s,baseUrl:c,logger:i}),d=new Cf(u,l),m=o??r.settings?.defaultEnv,p={};m&&(p=(await d.fetchEnvironment(m,i))?.variables??{});let f={...e.config.emulator,...r.settings?.emulator},h=new as({baseUrl:c,apiKey:s,logger:i,mode:"interactive"}),b=new Zs(e.config.ai?.agentConfig,{baseUrl:c,apiKey:s,logger:i,mode:"interactive"}),y=new dc({baseUrl:c,apiKey:s,logger:i,mode:"interactive"},b),S=new mc({httpClient:u,fakerSeed:e.config.advanced?.fakerConstantSeed?ym:void 0}),T=new Ri({variablesFromEnvironment:p,envName:m,testName:n.name}),C=new es({logger:i,reporter:new uc(u),runType:"mobile-test-run",runId:a,testMetadata:n,isInteractive:true});return {logger:i,sessionId:a,orgId:l,apiClient:u,resolvedEnvName:m,variablesFromEnvironment:p,emulatorSettings:f,mobileGenerator:h,fixtures:{storage:d,browserEnricher:y,browserGenerator:b,localCodeEvalTools:S,testContext:T},aiSettings:{useMemory:true,...e.config.ai,...r.settings?.ai},usageTracker:C}}function P2e(t){return {steps:t.steps,beforeSteps:t.beforeSteps,afterSteps:t.afterSteps}}async function PR({platform:t,project:e,logger:n,orgId:r,apiClient:o,resolvedTest:i,envName:a}){let s=P2e(i);if(e.config.fileFormat!=="v2")return s;let l=await gn(n,o,e),{alwaysSaveCache:c,noCache:u}=Ts();return await Qn({logger:n,orgId:r,client:o,gitMetadata:l,regenerateCache:false,alwaysSaveCache:c,noCache:u,isolateCachesByEnvironment:e.config?.advanced?.isolateCachesByEnvironment}).resolveEntries({logger:n,platform:t,testId:i.id,environment:a,stepLists:s,useSnapshotIdentityCache:true}),s}async function Kne({provider:t,platform:e,emulatorName:n,cleanupDriver:r}){let o=t==="remote";return o&&await ER({emulatorName:n,platform:e}),async()=>{await r(),o&&await TR({emulatorName:n,platform:e});}}async function Yne({managedState:t,project:e,testEntity:n,resolvedTest:r,provider:o,envName:i,localAvdId:a,localApkPath:s}){let{logger:l,sessionId:c,orgId:u,apiClient:d,resolvedEnvName:m,variablesFromEnvironment:p,emulatorSettings:f,mobileGenerator:h,fixtures:b,aiSettings:y,usageTracker:S}=await qne({managedState:t,project:e,testEntity:n,resolvedTest:r,envName:i}),T=r.settings?.defaultChannel,C=r.settings?.defaultTag,w=await PR({platform:"ANDROID",project:e,logger:l,orgId:u,apiClient:d,resolvedTest:r,envName:m}),_=await I2e({provider:o,projectRoot:e.rootDir,emulatorSettings:f,resolvedTest:r,localAvdId:a,localApkPath:s,variablesFromEnvironment:p});l.info({platform:"ANDROID",provider:o,envName:m,emulatorSettings:f,aiSettings:y},"Starting mobile session with resolved configuration");let N=o==="local"?"local":"region"in _?_.region:void 0,I=await pp({apiClient:d,logger:l,creationOpts:o==="remote"?{..._,apkToInstall:T?{channel:T,tag:C}:void 0}:_,orgId:u,sessionId:c,callbacks:{onStatusUpdate:D=>{l.info({status:D},"Android session status update");}}}),A=await Kne({provider:o,emulatorName:I.emulatorName,platform:"ANDROID",cleanupDriver:async()=>{await I.cleanup();}}),z;try{let D="limbarClient"in I?{limbarClient:I.limbarClient,limbarToken:I.limbarToken,limbarUrl:I.limbarUrl,limbarRegion:I.limbarRegion,playwrightDevice:I.playwrightDevice}:void 0;z=await $c.init({driver:I.driver,generator:h,logger:l,limbarClient:D?.limbarClient,playwrightDevice:D?.playwrightDevice,aiSettings:y,options:{emulator:{...f,region:N,browserSettings:e.config.browser}},fixtures:b,orgId:u,adbPort:I.adbPort,abortController:new AbortController});let B=await z.getViewportBounds(),F=z;return {...t,platform:"ANDROID",provider:o,controller:F,cleanup:[async()=>{await Promise.allSettled([F.cleanup(),A(),b.localCodeEvalTools.dispose()]);}],testName:n.name,relativeTestPath:n.relativePath,testFileAbsolutePath:mn__default.join(e.rootDir,n.relativePath),envName:m,orgId:u,emulatorName:I.emulatorName,viewportBounds:B,adbPort:I.adbPort,tempCaches:{},limbarUrl:D?.limbarUrl,limbarToken:D?.limbarToken,limbarRegion:D?.limbarRegion,usageTracker:S,mutableStepState:{platform:"ANDROID",testId:r.id,stepLists:w}}}catch(D){let B=z?[z.cleanup(),A()]:[A()];throw await Promise.allSettled(B),D}}async function Xne({managedState:t,project:e,testEntity:n,resolvedTest:r,provider:o,envName:i,localDeviceId:a,localIosVersion:s,localAppPath:l}){let{logger:c,sessionId:u,orgId:d,apiClient:m,resolvedEnvName:p,variablesFromEnvironment:f,emulatorSettings:h,mobileGenerator:b,fixtures:y,aiSettings:S,usageTracker:T}=await qne({managedState:t,project:e,testEntity:n,resolvedTest:r,envName:i}),C=r.settings?.defaultChannel,w=r.settings?.defaultTag,_=await PR({platform:"IOS",project:e,logger:c,orgId:d,apiClient:m,resolvedTest:r,envName:p}),N=_2e({provider:o,projectRoot:e.rootDir,emulatorSettings:h,resolvedTest:r,appChannel:C,appTag:w,localDeviceId:a,localIosVersion:s,localAppPath:l,variablesFromEnvironment:f});c.info({platform:"IOS",provider:o,envName:p,emulatorSettings:h,aiSettings:S},"Starting mobile session with resolved configuration");let I=o==="local"?"local":N.type==="remote"?N.region:void 0,A=await nf({apiClient:m,logger:c,creationOpts:N,orgId:d,sessionId:u,callbacks:{onStatusUpdate:B=>{c.info({status:B},"iOS session status update");}}}),z=await Kne({provider:o,emulatorName:A.emulator.name,platform:"IOS",cleanupDriver:async()=>{await A.cleanup();}}),D;try{D=await jc.init({driver:A.driver,generator:b,logger:c,emulator:A.emulator,aiSettings:S,options:{emulator:{...h,region:I,browserSettings:e.config.browser}},fixtures:y,orgId:d,abortController:new AbortController});let B=await D.getViewportBounds(),F=D;return {...t,platform:"IOS",provider:o,controller:F,cleanup:[async()=>{await Promise.allSettled([F.cleanup(),z(),y.localCodeEvalTools.dispose()]);}],testName:n.name,relativeTestPath:n.relativePath,testFileAbsolutePath:mn__default.join(e.rootDir,n.relativePath),envName:p,orgId:d,emulatorName:A.emulator.name,viewportBounds:B,tempCaches:{},limbarUrl:A.limbarParams?.webRtcUrl,limbarToken:A.limbarParams?.token,limbarRegion:A.limbarParams?.region,usageTracker:T,mutableStepState:{platform:"IOS",testId:r.id,stepLists:_}}}catch(B){let F=D?[D.cleanup(),z()]:[z()];throw await Promise.allSettled(F),B}}async function I2e({provider:t,projectRoot:e,emulatorSettings:n,resolvedTest:r,localAvdId:o,localApkPath:i,variablesFromEnvironment:a}){if(t==="remote")return {region:n?.region==="local"?void 0:n?.region,osVersion:n?.remoteEmulatorSettings?.androidVersion??lm};let s=await ck(),{avdId:l,apkFilePath:c,apkFilePathSource:u}=gm({overrideAvdId:o,overrideApkFilePath:i,emulatorSettings:n,defaultApkFilePath:r.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 ${Cl} 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:fp({apkFilePath:c,source:u,overrideBaseDir:e})}}function _2e({provider:t,projectRoot:e,emulatorSettings:n,resolvedTest:r,appChannel:o,appTag:i,localDeviceId:a,localIosVersion:s,localAppPath:l,variablesFromEnvironment:c}){if(t==="remote")return {type:"remote",region:n?.region==="local"?void 0:n?.region,appToInstall:o?{channel:o,tag:i}:void 0,osVersion:cm};let{deviceType:u,iosVersion:d,appFilePath:m,appFilePathSource:p}=bm({overrideDeviceType:a,overrideIosVersion:s,overrideAppFilePath:l,emulatorSettings:n,defaultAppFilePath:r.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 ${wl} key on the environment.`);return {type:"local",deviceType:u,iosVersion:d,appFilePath:pf({appFolderPath:m,source:p,overrideBaseDir:e})}}async function ck(){try{let{stdout:t}=await M2e(O2e(),["-list-avds"],{encoding:"utf8",timeout:5e3});return {availableAvdIds:t.split(/\r?\n/).map(n=>n.trim()).filter(Boolean)}}catch(t){return {availableAvdIds:[],avdDiscoveryError:H(t)}}}function O2e(){let t=process.platform==="win32"?"emulator.exe":"emulator";return process.env.ANDROID_HOME?mn__default.join(process.env.ANDROID_HOME,"emulator",t):t}var Jne=5,uk=class extends fA{isStartingSession=false;constructor(){super({sessionTypeLabel:"mobile MCP session"});}async kill(e,n){try{let r;for(let i of e.cleanup)try{await i();}catch(a){r??=a;}if(r)throw r;await e.usageTracker.flush(e.logger);let o=RQ(e);return await WQ({apiClient:Wt(),logger:e.logger,orgId:e.orgId,testId:e.testId,sessionId:e.sessionId,reason:n,report:o}),e.logger.info({sessionId:e.sessionId,reason:n,emulatorName:e.emulatorName},"MCP session cleaned up"),{killed:!0,sessionId:e.sessionId,reason:n,report:o}}catch(r){return e.logger.error({err:r,sessionId:e.sessionId,reason:n},"Failed to clean up mobile MCP session"),{killed:false,sessionId:e.sessionId,reason:n}}}touchSession(e){let n=super.touchSession(e);return n?.provider==="remote"&&Wt()?.extendEmulatorTtl(n.platform,n.emulatorName).catch(()=>{}),n}async createSession({logger:e,testId:n,idleTimeoutMs:r,provider:o,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 ss(c,{id:n},"mobileTests"),f=await cn(m.fullFilePath,e,p),y=(f.settings?.emulator?.region??c.config.emulator?.region)==="local"?"local":"remote",S=o??y,T,{platform:C}=f,w=e.child({testId:f.id});switch(C){case "ANDROID":d=this.buildManagedSessionState({logger:w,idleTimeoutMs:r,testId:m.id}),T=await Yne({managedState:d,project:c,testEntity:m,resolvedTest:f,provider:S,envName:i,localAvdId:a,localApkPath:l});break;case "IOS":d=this.buildManagedSessionState({logger:w,idleTimeoutMs:r,testId:m.id}),T=await Xne({managedState:d,project:c,testEntity:m,resolvedTest:f,provider:S,envName:i,localDeviceId:a,localIosVersion:s,localAppPath:l});break;default:return It(C)}return w.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;}}},to=new uk,Gc=({response:t,sessionId:e,toolName:n})=>{let r=to.touchSession(e);if(r)return t.addCleanupCallback(()=>{HQ({session:r,toolCallId:t.toolCallId});}),jQ({session:r,toolCallId:t.toolCallId,toolName:n}),r;t.addError(JSON.stringify({message:`No active session found for id '${e}'.`,availableSessionIds:to.listSessionIds()},null,2));};var N2e=4e4,L2e=1e4,mk,Qne=({staticDir:t})=>{mk=t;},IR=class t{url;server;constructor({url:e,server:n}){this.url=e,this.server=n;}static async init({logger:e,testId:n,testName:r,sessionId:o,platform:i,limbarUrl:a,limbarToken:s,limbarRegion:l,tabLabel:c}){let u=await U2e({logger:e,assets:k2e()}),d=new URL(`http://localhost:${u.port}/`);return d.searchParams.set("testId",n),r&&d.searchParams.set("testName",r),d.searchParams.set("sessionId",o),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 k2e(){if(!mk)throw new Error("Remote control viewer static directory is not configured. Pass remoteControlStaticDir when starting the mobile MCP server.");let t=mn__default.resolve(mk),e=mn__default.join(t,"index.html");if(!br.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:br.readFileSync(e)}}function dk({response:t,statusCode:e,body:n,allow:r}){let o={"Content-Type":"text/plain; charset=utf-8","Cache-Control":"no-store"};r&&(o.Allow=r),t.writeHead(e,o),t.end(n);}function Zne({request:t,response:e,buffer:n,contentType:r}){if(e.writeHead(200,{"Content-Type":r,"Cache-Control":"no-store"}),t.method==="HEAD"){e.end();return}e.end(n);}function F2e({staticDir:t,pathname:e}){let n;try{n=decodeURIComponent(e);}catch{return}let r=n==="/"?"index.html":n.replace(/^\/+/,""),o=mn__default.resolve(t,r),i=mn__default.relative(t,o);if(!(i.startsWith("..")||mn__default.isAbsolute(i)))return o}function B2e({request:t,response:e,assets:n}){if(t.method!=="GET"&&t.method!=="HEAD"){dk({response:e,statusCode:405,body:"Method Not Allowed",allow:"GET, HEAD"});return}let r=new URL(t.url??"/","http://localhost").pathname;if(r==="/"||r==="/index.html"){Zne({request:t,response:e,buffer:n.indexHtmlBuffer,contentType:"text/html; charset=utf-8"});return}let o=F2e({staticDir:n.staticDir,pathname:r});if(!o){dk({response:e,statusCode:403,body:"Forbidden"});return}if(!br.existsSync(o)||!br.statSync(o).isFile()){dk({response:e,statusCode:404,body:"Not Found"});return}let i=mn__default.extname(o).toLowerCase(),a=fu[i]??"application/octet-stream";Zne({request:t,response:e,buffer:br.readFileSync(o),contentType:a});}async function U2e({logger:t,assets:e}){let n=createServer((i,a)=>B2e({request:i,response:a,assets:e})),r=Math.floor(Math.random()*L2e)+N2e,o=await Yl(r,"mobile-mcp-remote-control-viewer");return await new Promise((i,a)=>{let s=l=>{a(l);};n.once("error",s),n.listen(o,()=>{n.off("error",s),i();});}),t.info({port:o,staticDir:e.staticDir},"Started mobile MCP remote control viewer server"),{port:o,server:n}}function pk({logger:t,applicationName:e,cliVersion:n,serverId:r=randomUUID()}){let o={serverId:r,applicationName:e,cliVersion:n},i=nr(),a=t.child({orgId:i,userId:gd(),...o});return {info:o,mcpLogger:a,orgId:i}}function fk({sessionIdleTimeoutMinutes:t}){return (t&&t>=1?t:Jne)*60*1e3}async function _R({project:t,serverUrl:e,alwaysSaveCache:n,noCache:r,remoteControlStaticDir:o}){Qne({staticDir:o}),ef(e),LA({alwaysSaveCache:n,noCache:r}),xR({userId:gd(),orgId:nr(),selfServe:FA()}),BA(t,i=>ai({configFilePath:i}));}function OR({project:t,logger:e,apiKey:n,serverUrl:r,supportsFileOutput:o,headfulDefault:i,sessionIdleTimeoutMinutes:a,applicationName:s,cliVersion:l,serverId:c}){let{info:u,mcpLogger:d,orgId:m}=pk({logger:e,applicationName:s,cliVersion:l,serverId:c}),p=new as({baseUrl:r,apiKey:n,logger:d,mode:"interactive"});return {context:{project:t,orgId:m,logger:d,generator:p,serverId:u.serverId,saveChangesToDisk:true,sessionIdleTimeoutMs:fk({sessionIdleTimeoutMinutes:a}),supportsFileOutput:o,headfulDefault:i},info:u}}async function j2e({moduleId:t,name:e,description:n,enabled:r,platform:o,parameters:i,steps:a,project:s}){let l=await Et(s),{stepsToSave:{steps:c}}=await Tr({platform:o,stepLists:{steps:a}});rs({content:{platform:o,moduleId:t,name:e,description:n,enabled:r,parameters:i,steps:c},schemaVersion:cr,momenticFiles:l,project:s});}function H2e({module:t,inputs:e}){return {...t,id:randomUUID(),type:"RESOLVED_MOBILE_MODULE",inputs:e}}async function ere({project:t,logger:e,testPath:n,saveChangesToDisk:r,mutableStepState:o,params:i,initialMomenticFiles:a,platform:s,availableSteps:l,cacheContext:c}){let{stepsToExtract:u,startIndex:d,endIndex:m}=KQ({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:n,startIndex:i.startIndex,endIndex:i.endIndex,availableSteps:l,containsNestedModuleStep:Cq}),p=mn__default.join(t.rootDir,i.folderPath??"");i.folderPath&&br.mkdirSync(p,{recursive:true});let f=await jg({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 j2e({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}),r&&i.startIndex!==void 0&&n!==void 0){let h=await Et(t);if(!l)throw new Error("Mobile module was created successfully, but the source test steps were not available for replacement.");let b=H2e({module:f,inputs:i.moduleInputs}),y=[...l];if(y.splice(d,m-d,b),await Xs({platform:s,filePath:n,steps:y,folder:t.rootDir,project:t,momenticFiles:h,schemaVersion:cr}),o&&(o.stepLists={...o.stepLists,steps:y}),c){let{cachesToSave:S,snapshotCachesToSave:T}=await Tr({platform:s,stepLists:{steps:y},cacheCreationParams:{orgId:c.orgId,testId:c.testId,environment:c.envName},useSnapshotIdentityCache:c.useSnapshotIdentityCache});try{await c.cacheStorage.saveEntries({platform:s,logger:e,entries:S});}catch(C){e.warn({err:C},"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(C){e.warn({err:C},"Failed to save mobile snapshot identity cache after module create, future runs may regenerate step ids");}}}return f}function tre(t,e,n){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 n&&n.testId===t.id&&n.platform===e?{availableSteps:n.stepLists.steps,mutableStepState:n}:{availableSteps:t.steps,mutableStepState:void 0}}async function rre({project:t,logger:e,testPath:n,saveChangesToDisk:r,mutableStepState:o,params:i}){Ei(i.name);let a=await Et(t),s=n!==void 0?await cn(mn__default.join(t.rootDir,n),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=Wt();if(d){let m=await gn(e,d,t),{alwaysSaveCache:p,noCache:f}=Ts();c={cacheStorage:Qn({logger:e,orgId:nr(),client:d,gitMetadata:m,regenerateCache:false,alwaysSaveCache:p,noCache:f,isolateCachesByEnvironment:t.config?.advanced?.isolateCachesByEnvironment}),testId:s.id,orgId:nr(),envName:s.settings?.defaultEnv,useSnapshotIdentityCache:t.config.fileFormat==="v2"};}}let u={project:t,logger:e,testPath:n,saveChangesToDisk:r,params:i,initialMomenticFiles:a,cacheContext:c};switch(l){case "ANDROID":return {module:await ere({...u,platform:"ANDROID",...tre(s,"ANDROID",o)})};case "IOS":return {module:await ere({...u,platform:"IOS",...tre(s,"IOS",o)})};default:return It(l)}}var ore=Dr({schema:{name:yS,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:bB})},handle:async(t,e,n)=>{let{project:r,logger:o}=t;try{let i=await ss(r,e.selector,"mobileModules"),a=await Vu(i.entity,i.momenticFiles,o);n.addPartFromText(JSON.stringify({module:a},null,2));}catch(i){n.addError(H(i));}}}),ire=Dr({schema:{name:fB,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:rP},handle:async(t,e,n)=>{try{let r=rP.parse(e),{testPath:o,...i}=r,a=i9({projectRoot:t.project.rootDir,filePath:o,pathLabel:"testPath"}),s;if(a!==void 0){let c=mn__default.join(t.project.rootDir,a);for(let u of to.listSessionIds()){let d=to.getSession(u);if(d!==void 0&&d.testFileAbsolutePath===c){s=d.mutableStepState;break}}}let l=await rre({project:t.project,logger:t.logger,testPath:a,saveChangesToDisk:t.saveChangesToDisk,mutableStepState:s,params:i});n.addPartFromText(JSON.stringify(l.module,null,2));}catch(r){n.addError(H(r));}}});function DR({step:t,parentChain:e}){let n=t;n.parentStepIdChain=e.map(r=>r.id),delete n.retries,delete n.skipped;}function Y2e(t){let e=cloneDeep(t);return Oi({steps:e,earlyStop:false,onPreset:(n,r)=>{if(DR({step:n,parentChain:r.parentChain}),n.type==="MOBILE_PRESET_STEP"){let o=n.command;delete o.cache,delete o.id,delete o.thoughts;}return false},onModule:(n,r)=>{DR({step:n,parentChain:r.parentChain});let o=n;return delete o.enabled,delete o.schemaVersion,false},onConditional:(n,r)=>(DR({step:n,parentChain:r.parentChain}),false),onAiAction:(n,r)=>{DR({step:n,parentChain:r.parentChain});let o=n;return delete o.cache,false}}),e.map((n,r)=>{let o=n;return o.index=r,o})}function hk(t,e){if(t.length===0)return `${e}: (no steps)`;let n=["```json",JSON.stringify(Y2e(t),null,2),"```"].join(`
|
|
6231
6231
|
`);return `${e}:
|
|
6232
6232
|
${n}`}var X2e=`## Note
|
|
6233
6233
|
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 J2e({project:t,testFileAbsolutePath:e,supportsFileOutput:n,platform:r,description:o,activeStepLists:i}){let a=[];a.push(`Name: ${mn__default.basename(e,".test.yaml")}`),a.push(`Platform: ${r}`),o&&a.push(`Description: ${o}`),a.push("");let s=i.beforeSteps??[],l=i.afterSteps??[];s.length>0&&(a.push(hk(s,"Setup Steps")),a.push("")),a.push(hk(i.steps,"Main Steps")),l.length>0&&(a.push(""),a.push(hk(l,"Teardown Steps")));let c=a.join(`
|
|
@@ -6245,7 +6245,7 @@ The "Installed apps" list may still include default or system packages; it is a
|
|
|
6245
6245
|
for /f "tokens=5" %a in ('netstat -ano ^| findstr :${t}') do taskkill /PID %a /F
|
|
6246
6246
|
`);}HRe("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI","POSTHOG_WEB_WRITE_KEY is not set");var{captureEvent:Uy,setAnalyticsIdentity:Ure,shutdownAnalytics:zre}=BE({writeKey:"phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",host:"https://p.momentic.ai",platform:"mobile_cli",identity:"stashed",flushImmediately:true,onIdentify:aY});async function $re({project:t,logger:e}){let n=await Et(t),r=Object.values(n.mobileTests),o=0,i=new Set,a=[];for(let s of r)try{await cn(s.fullFilePath,e,n);}catch(l){e.error(`Failed to parse mobile test ${s.name} (${s.relativePath})`),zT(l,s.relativePath,a),o++,i.add(s.relativePath);}return {parsingErrors:o,parsingErrorDetails:a,failedTestFilePaths:i}}async function Vre({project:t,filePath:e}){let n={totalErrors:0,parsingErrors:0,parsingErrorDetails:[],failedTestFilePaths:new Set,failedModuleFilePaths:new Set},r=await Et(t);if(e!==void 0)return await CVe({project:t,momenticFiles:r,filePath:e,state:n}),n;for(let o of Object.values(r.mobileModules))await Hre({momenticFiles:r,module:o,state:n});for(let o of Object.values(r.mobileTests))await jre({momenticFiles:r,test:o,state:n});for(let o of r.metadataParseFailures)qre({failure:o,state:n});return wVe({momenticFiles:r,state:n}),AVe({momenticFiles:r,state:n}),n}function vk(t,e,n){t.totalErrors++,e==="test"?t.failedTestFilePaths.add(n):t.failedModuleFilePaths.add(n);}async function CVe({project:t,momenticFiles:e,filePath:n,state:r}){let o=mn__default.isAbsolute(n)?n:mn__default.resolve(t.rootDir,n),i=mn__default.relative(t.rootDir,o);if(i.startsWith("..")||mn__default.isAbsolute(i)){P.error(`File '${n}' is outside the resolved project at '${t.rootDir}'. Lint a file inside the project, or run without an argument to lint the whole project.`),r.totalErrors++;return}let a=Object.values(e.mobileTests).find(c=>c.fullFilePath===o);if(a){await jre({momenticFiles:e,test:a,state:r});return}let s=Object.values(e.mobileModules).find(c=>c.fullFilePath===o);if(s){await Hre({momenticFiles:e,module:s,state:r});return}let l=e.metadataParseFailures.find(c=>c.fullPath===o);if(l){qre({failure:l,state:r});return}P.error(`File '${n}' is not a recognized Momentic mobile test or module. Check the 'include' globs in your momentic.config.yaml.`),r.totalErrors++;}async function jre({momenticFiles:t,test:e,state:n}){if(e.type!==ve.MOBILE_TEST_V2)return;Wre({kind:"test",name:e.name,relativePath:e.relativePath,id:e.id,state:n});let{parsed:r}=Ni(e.fullFilePath);try{let o=zl.parse(r),i=Cm(o.platform);await Cv({testV2:o,platform:i,fileResolver:Bu({sourceFilePath:e.fullFilePath,momenticFiles:{mobileModules:t.mobileModules}})});}catch(o){Gre({err:o,kind:"test",relativePath:e.relativePath,state:n});}}async function Hre({momenticFiles:t,module:e,state:n}){if(e.type!==ve.MOBILE_MODULE_V2)return;Wre({kind:"module",name:e.name,relativePath:e.relativePath,id:e.id,state:n});let{parsed:r}=Ni(e.fullFilePath);try{wv({moduleV2:r,moduleName:e.name,fileResolver:Bu({sourceFilePath:e.fullFilePath,momenticFiles:{mobileModules:t.mobileModules}})});}catch(o){Gre({err:o,kind:"module",relativePath:e.relativePath,state:n});}}function Wre({kind:t,name:e,relativePath:n,id:r,state:o}){if(Un.safeParse(r).success)return;let i=t==="test"?"Mobile test":"Mobile module";P.error(`${i} '${e}' (${n}) has an invalid ID: '${r}'. IDs must be kebab-case or a UUID, up to 36 characters.`),vk(o,t,n);}function Gre({err:t,kind:e,relativePath:n,state:r}){if(vk(r,e,n),r.parsingErrors++,!zT(t,n,r.parsingErrorDetails)){if(t instanceof z.ZodError){UT(t.issues,n,r.parsingErrorDetails);return}r.parsingErrorDetails.push({file:n,field:"",issue:H(t)});}}function qre({failure:t,state:e}){vk(e,t.kind,t.relativePath),e.parsingErrors++,UT(t.issues,t.relativePath,e.parsingErrorDetails);}function wVe({momenticFiles:t,state:e}){let n=new Set(Object.values(t.mobileModules).map(o=>o.fullFilePath)),r=new Set(Object.values(t.mobileTests).map(o=>o.fullFilePath));for(let[o,i]of Object.entries(t.duplicateEntities)){let a=i.filter(s=>n.has(s)||r.has(s));if(!(a.length<2)){P.error(`Duplicate ID '${o}' found in the following mobile files:
|
|
6247
6247
|
${a.map(s=>` - ${s}`).join(`
|
|
6248
|
-
`)}`),e.totalErrors++;for(let s of a){let l=mn__default.relative(t.project.rootDir,s);n.has(s)?e.failedModuleFilePaths.add(l):e.failedTestFilePaths.add(l);}}}}function AVe({momenticFiles:t,state:e}){for(let[n,r]of Object.entries(t.mobileTests)){let o=t.mobileModules[n];o&&(P.error(`ID '${n}' is shared between mobile test '${r.relativePath}' and mobile module '${o.relativePath}'. Test and module IDs must be unique across the entire project.`),e.totalErrors++,e.failedTestFilePaths.add(r.relativePath),e.failedModuleFilePaths.add(o.relativePath));}}async function Kre({project:t,filePath:e}){let{totalErrors:n,parsingErrors:r,parsingErrorDetails:o,failedTestFilePaths:i,failedModuleFilePaths:a}=await Vre({project:t,filePath:e});if(n===0){P.success("Mobile lint passed. No issues found.");return}o.length>0&&$T({parsingErrors:r,parsingErrorDetails:o,failedTestFilePaths:i,failedModuleFilePaths:a,rootDir:t.rootDir}),P.error(`Found ${n} mobile lint error${n===1?"":"s"} in project.`),process.exit(1);}async function Ck({project:t}){if(t.config.fileFormat==="v2"){let{totalErrors:o,parsingErrors:i,parsingErrorDetails:a,failedTestFilePaths:s,failedModuleFilePaths:l}=await Vre({project:t});i>0&&($T({parsingErrors:i,parsingErrorDetails:a,failedTestFilePaths:s,failedModuleFilePaths:l,rootDir:t.rootDir}),process.exit(1)),o>0&&(P.error(`Found ${o} lint errors`),P.warn("Run 'npx momentic-mobile lint' for details"),process.exit(1));return}let{parsingErrors:e,parsingErrorDetails:n,failedTestFilePaths:r}=await $re({project:t,logger:P});e>0&&($T({parsingErrors:e,parsingErrorDetails:n,failedTestFilePaths:r,rootDir:t.rootDir}),process.exit(1));}async function Ak({tests:t,momenticFiles:e,project:n,yes:r,include:o,exclude:i,labels:a,logger:s,quarantinedTestsMetadata:l}){let c=new Set;if(t&&t.length>0){let d=t.some(p=>br.existsSync(p)),m=cwd();d?(m!==n.rootDir&&s.warn(`Test paths resolve against the current directory ('${m}'), not the project root ('${n.rootDir}'). Run from the project root or use substring filters to avoid surprises.`),t.forEach(p=>{if(!br.existsSync(p))throw new Error(`Path '${p}' does not exist.`);let f,h;try{f=br.statSync(p),h=f.isDirectory();}catch(y){s.warn({err:y},`Skipping path ${p} because it cannot be read`);return}let b=mn__default.resolve(p);Object.values(e.mobileTests).filter(y=>h?y.fullFilePath.startsWith(b):y.fullFilePath===b).forEach(y=>{c.add(y.fullFilePath);});})):Object.values(e.mobileTests).forEach(p=>{t.some(f=>p.relativePath.includes(f))&&c.add(p.fullFilePath);});}else !r&&!await $l("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=mn__default.relative(n.rootDir,d);o&&!o.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=mn__default.relative(n.rootDir,d),p=await cn(d,s,e),f=mn__default.basename(d,".test.yaml");if(p.disabled)return null;if(a&&a.length>0){let b=p.labels||[];if(!a.some(S=>b.includes(S)))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 (y=>{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 Yre({testDefinitions:t,quarantinedTestsMetadata:e,onlyQuarantined:n=false,skipQuarantined:r=false}){let[o,i]=partition(t,a=>a.id in e);return {quarantinedTestsToSkip:r?o:[],testsToRun:n?[]:i,quarantinedTestsToRun:r?[]:o}}var Xre=()=>process.exit(130),Jre=()=>process.exit(143);process.on("SIGINT",Xre);process.on("SIGTERM",Jre);function Zre(){process.off("SIGINT",Xre),process.off("SIGTERM",Jre);}async function Rk({project:t,apiClient:e,gitMetadata:n,orgId:r,dryRun:o=false}){let i=await Et(t),a=Object.values(i.mobileTests).filter(b=>b.type===ve.MOBILE_TEST),s=Object.values(i.mobileModules).filter(b=>b.type===ve.MOBILE_MODULE),l=Object.values(i.mobileTests).filter(b=>b.type===ve.MOBILE_TEST_V2).length,c=Object.values(i.mobileModules).filter(b=>b.type===ve.MOBILE_MODULE_V2).length,u={...CO(),alreadyV2TestCount:l,alreadyV2ModuleCount:c},d=t.config.fileFormat!=="v2",{v2ProjectConfig:m,migratedFilePaths:p}=F5(t);!o&&a.length>0&&await PVe({legacyMobileTests:a,momenticFiles:i,project:t,apiClient:e,gitMetadata:n,orgId:r}),await IVe({legacyMobileModules:s,momenticFiles:i,project:t,v2ProjectConfig:m,migratedFilePaths:p,summary:u,dryRun:o}),await DVe({legacyMobileTests:a,momenticFiles:i,project:t,v2ProjectConfig:m,migratedFilePaths:p,summary:u,dryRun:o});let f=u.migratedTestPaths.length>0||u.migratedModulePaths.length>0;return !o&&(d||f)&&TO({project:t,newProjectConfig:m,fileFormatLabel:"v2",migratedFilePaths:p}),u}async function Qre({project:t,apiClient:e,gitMetadata:n}){let{legacyProjectConfig:r,migratedFilePaths:o}=B5(t),i=await Et(t),a=Object.values(i.mobileTests).filter(c=>c.type===ve.MOBILE_TEST_V2),s=Object.values(i.mobileModules).filter(c=>c.type===ve.MOBILE_MODULE_V2);P.info(`Migrating ${a.length} simplified format mobile tests and ${s.length} simplified format mobile modules to legacy YAML`);let l=new Set;await _Ve({v2MobileTests:a,momenticFiles:i,project:t,legacyProjectConfig:r,migratedFilePaths:o,apiClient:e,gitMetadata:n,modulesCoveredByTests:l}),await OVe({v2MobileModules:s,momenticFiles:i,project:t,legacyProjectConfig:r,migratedFilePaths:o,modulesCoveredByTests:l}),TO({project:t,newProjectConfig:r,fileFormatLabel:"legacy",migratedFilePaths:o});}async function PVe({legacyMobileTests:t,momenticFiles:e,project:n,apiClient:r,gitMetadata:o,orgId:i}){if(t.length===0)return;let a={logger:P,orgId:i,client:r,regenerateCache:false,alwaysSaveCache:true,noCache:false,isolateCachesByEnvironment:n.config.advanced?.isolateCachesByEnvironment??false,bustOldestCachePercentage:void 0},s=[Qn({...a,gitMetadata:o})];o.gitMainBranch&&o.gitBranchName!==o.gitMainBranch&&s.push(Qn({...a,gitMetadata:{...o,gitBranchName:o.gitMainBranch,gitCommitTimestamp:o.lastCommitOnMainTimestamp??o.gitCommitTimestamp}})),P.info(`Pushing mobile test snapshots for ${t.length} legacy mobile tests so existing step caches survive the simplified format conversion`),await lp(t,sp,async l=>{let c=await cn(l.fullFilePath,P,e),{snapshotCachesToSave:u}=await Tr({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:P,platform:c.platform,entries:u});P.dimmed(`Pushed mobile test snapshot for: ${l.relativePath}`);});}async function IVe({legacyMobileModules:t,momenticFiles:e,project:n,v2ProjectConfig:r,migratedFilePaths:o,summary:i,dryRun:a}){await lp(t,sp,async s=>{let l=rc(s.fullFilePath,P);if(Lg(l))throw new Error(`Expected a legacy mobile module while migrating '${s.relativePath}', but found the simplified format`);let c=oc({module:l,moduleFilePath:s.fullFilePath,momenticFiles:e}),u=Va.parse(c),d={...u,name:c.name??s.name,steps:ra(u.platform).array().parse(c.steps)};a||rs({content:d,schemaVersion:cr,momenticFiles:e,project:{...n,config:r},forceSaveOnNoDiffs:true}),o.push(s.fullFilePath),i.migratedModulePaths.push(s.fullFilePath),P.dimmed(` + ${s.relativePath}`);});}async function _Ve({v2MobileTests:t,momenticFiles:e,project:n,legacyProjectConfig:r,migratedFilePaths:o,apiClient:i,gitMetadata:a,modulesCoveredByTests:s}){await lp(t,sp,async l=>{let c=await cn(l.fullFilePath,P,e),u=await LVe({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 Tr({platform:c.platform,stepLists:u});for(let m of d)s.add(m.moduleId);await Xs({platform:c.platform,filePath:l.fullFilePath,steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps,settings:c.settings,labels:c.labels,folder:n.rootDir,project:{...n,config:r},momenticFiles:e,schemaVersion:cr,forceFileFormat:"v1"}),o.push(l.fullFilePath),P.dimmed(`Migrated simplified format mobile test to legacy: ${l.relativePath}`);});}async function OVe({v2MobileModules:t,momenticFiles:e,project:n,legacyProjectConfig:r,migratedFilePaths:o,modulesCoveredByTests:i}){await lp(t,sp,async a=>{if(i.has(a.id)){o.push(a.fullFilePath);return}let s=rc(a.fullFilePath,P),l=oc({module:s,moduleFilePath:a.fullFilePath,momenticFiles:e}),c=Va.parse(l),u={...c,name:l.name??a.name,steps:ra(c.platform).array().parse(l.steps)};rs({content:u,schemaVersion:cr,momenticFiles:e,project:{...n,config:r},forceSaveOnNoDiffs:true,forceFileFormat:"v1"}),o.push(a.fullFilePath),P.dimmed(`Migrated unreferenced simplified format mobile module to legacy: ${a.relativePath}`);});}async function DVe({legacyMobileTests:t,momenticFiles:e,project:n,v2ProjectConfig:r,migratedFilePaths:o,summary:i,dryRun:a}){await lp(t,sp,async s=>{let l=await cn(s.fullFilePath,P,e);a||await Xs({platform:l.platform,filePath:s.fullFilePath,steps:l.steps,beforeSteps:l.beforeSteps,afterSteps:l.afterSteps,settings:l.settings,labels:l.labels,folder:n.rootDir,project:{...n,config:r},momenticFiles:e,schemaVersion:cr}),o.push(s.fullFilePath),i.migratedTestPaths.push(s.fullFilePath),P.dimmed(` + ${s.relativePath}`);});}async function NVe({apiClient:t,gitMetadata:e,testId:n,platform:r,environment:o}){let i=await t.getSnapshotCacheForTest({testId:n,environment:o,platform:r==="ANDROID"?"android":"ios"},bu(e));return fv({entries:i,logger:P})}async function LVe({platform:t,stepLists:e,apiClient:n,gitMetadata:r,testId:o,environment:i,missingSnapshotMessage:a}){let s=await NVe({apiClient:n,gitMetadata:r,testId:o,platform:t,environment:i});s.testStepLists||P.warn(`${a} Minting fresh legacy ids.`);let l=hv({currentStepLists:e,previousSnapshots:s,generateUuid:randomUUID});return l.stats.mintedSteps>0&&P.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 eoe=58890;function Cd(t){let e=parseInt(t,10);if(isNaN(e))throw new InvalidArgumentError("Not a number.");return e}function BVe(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 toe=new Option("--port <port>",`Port to run the local app on. Defaults to ${eoe}.`).env("PORT").default(eoe).argParser(Cd),fi=new Option("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").default(Kv(),"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(),pl=new Option("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),zR=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."),Ho=new Option("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default(Yv()??"https://api.momentic.ai").argParser(t=>{try{return z.url().parse(t),t}catch{throw new InvalidArgumentError("Not a valid URL.")}}),$y=new Option("-y, --yes","Skip all confirmation prompts.").env("CI"),xk=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."),$R=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"),VR=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 jR(t){return e=>{let n=e.trim();if(n==="")throw new InvalidArgumentError(`${t} must be a non-empty string (whitespace is not allowed).`);return n}}var Mk=new Option("--tag <tag>","Tag identifier for the asset.").argParser(jR("--tag")),Pk=new Option("--channel <channel>","Channel name for the asset.").argParser(jR("--channel")),HR=new Option("--channel <channel>","Channel name for the asset.").argParser(jR("--channel")).makeOptionMandatory(),Ik=new Option("--tag <tag>","Tag identifier for the asset.").argParser(jR("--tag")).makeOptionMandatory(),_k=new Option("--platform <platform>","Mobile platform for the asset."),noe=new Option("--platform <platform>","Mobile platform for the asset.").makeOptionMandatory(),roe=new Option("--tag-filter <tagFilter>","Case-insensitive substring filter applied to tags when listing a channel."),ooe=new Option("--json","Emit machine-readable JSON output instead of a human-readable table.");function WR(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 ioe=new Option("--env <env>","Environment to run all tests in (overrides test-level configuration)."),aoe=new Option("--android-home <androidHome>","Path to the Android SDK root. Sets ANDROID_HOME for this command."),soe=new Option("--java-home <javaHome>","Path to the Java home directory. Sets JAVA_HOME for this command."),Ok=new Option("--region <region>",`Region to run all tests in (overrides all other configuration). Valid values: ${Object.values(zh).join(", ")}, ${Object.values(Uh).join(", ")}, ${Jo}, ${Object.values(Wa).join(", ")}.`),Dk=new Option("--local-avd-id <localAvdId>","Force tests to use a specific local Android Virtual Device (AVD) instead of remote emulators."),Nk=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."),Lk=new Option("--local-ios-device-type <localIosDeviceType>","Force tests to use a specific local iOS device type instead of remote emulators."),kk=new Option("--local-ios-version <localIosVersion>","Target a specific local iOS runtime version (e.g. 26.4). Defaults to the latest installed runtime."),Fk=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."),loe=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(BVe),coe=new Option("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(t=>{let e=Cd(t);if(e<1)throw new InvalidArgumentError("Shard index must be greater than 0.");return e}),uoe=new Option("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(Cd),Bk=new Option("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),Uk=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."),zk=new Option("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),doe=new Option("--upload-results","Upload test results to the Momentic dashboard.").default(false),moe=new Option("--share-diagnostics","Share local run diagnostics (OpenTelemetry traces) with Momentic to help diagnose performance issues.").env("MOMENTIC_SHARE_DIAGNOSTICS"),UVe=["true","false","on-fail"],poe=new Option("--video [value]","Record video of mobile test runs. By default, video is recorded. Use the bare flag or pass true, false, or on-fail.").choices(UVe),$k=new Option("--log-level <logLevel>","Log level for Momentic and dependent services.").choices(["error","warn","info","debug"]),foe=new Option("--skip-quarantined","Skip quarantined tests entirely.").implies({onlyQuarantined:false,ignoreQuarantine:false}),hoe=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}),goe=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}),boe=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(Cd),yoe=new Option("--reporter <reporter>","Output reporter. Live: list (default). File: "+Qv.join(", ")+". File reporters write to --reporter-dir. Pass --reporter multiple times to combine reporters.").default([]).argParser(M5),Soe=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"),Eoe=new Option("--name <name>","A name to associate with this run for easier identification in the Momentic dashboard."),Toe=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(Cd),voe=new Option("--headful [headful]","Launch mobile MCP remote control browsers headfully by default.").argParser(JM),Coe=new Option("--supports-file-output [supportsFileOutput]","Allow MCP tool responses to include file output references.").argParser(JM),woe=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."),Aoe=new Argument("[results]",`Path to the results archive. Defaults to "${Ug}".`).default(Ug);var Rf="screen-recording.mp4";var Roe={...ul,prepareRunParams:async({runTracer:t,metadata:{orgId:e},fixtures:{logger:n,apiClient:r,mobileGenerator:o,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:b},settings:{emulatorSettings:y,aiSettings:S},options:{logLevel:T,localAvdId:C,localApkPath:w,region:_},registerCleanup:N})=>{let I=false,A=[()=>u.dispose()],z=async()=>{I=true;for(let k of A.toReversed())try{await k();}catch(W){le.warn({err:W},"Failed to run cleanup function");}await s.flush(n);};N?.(async()=>z());let D=Nl.optional().parse(_??y.region),B=D==="local",F;if(B){let{avdId:k,apkFilePath:W,apkFilePathSource:q}=gm({overrideAvdId:C,overrideApkFilePath:w,emulatorSettings:y,defaultApkFilePath:f.settings?.defaultApkFilePath,envVariables:b}),V=fp({apkFilePath:W,source:q});if(!k)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 ${Cl} key on the environment.`);F={avdId:k,apkFilePath:V};}else F={region:D===Jo?void 0:D,apkToInstall:d?{channel:d,tag:m}:void 0,osVersion:y.remoteEmulatorSettings?.androidVersion??lm};let $=randomUUID(),le=n.child({runAttemptId:$}),j=await Xe({name:"mobile-cli.driver_setup",attributes:{"momentic.platform":"ANDROID","momentic.test_id":f.id},fn:async()=>pp({apiClient:r,logger:n,driverLogLevel:T,creationOpts:F,callbacks:{onStatusUpdate:k=>{n.debug({status:k},"Emulator status update");},onHeartbeatFailure:()=>{let k="Appium heartbeat connection lost. Possible ADB tunnel/emulator failure.";I||P.warn(k);},onHeartbeatRestored:()=>{P.info("Appium heartbeat connection restored.");},onLimbarConnectionStateChange:k=>{k==="disconnected"?I||P.warn("Emulator websocket connection lost. Emulator may be unavailable."):(k==="reconnecting"||k==="connecting")&&P.info("Emulator websocket is reconnecting.");}},orgId:e,sessionId:$})});A.push(()=>j.cleanup());let L="limbarRegion"in j?j.limbarRegion:void 0,U="limbarTag"in j?j.limbarTag:void 0;try{let k=await t.startAttempt({emulatorName:j.emulatorName,runAttemptId:$,assetDetails:{avdId:pu in F?F.avdId:void 0,tag:U??("apkToInstall"in F?F.apkToInstall?.tag:void 0),channel:"apkToInstall"in F?F.apkToInstall?.channel:void 0,region:L??D??Jo}});le=le.child(k.loggerBindings||{});let W=await j.driver.executeInNativeContext(le,async Ne=>fC({driver:Ne,onLogs:Nt=>{k.appendLogs(Nt);}}),{operationName:"startLogcatListener"});A.push(()=>W());let q=new Ri({variablesFromEnvironment:b,envName:h,testName:f.name}),V="limbarClient"in j?j.limbarClient:void 0,pe="playwrightDevice"in j?j.playwrightDevice:void 0,Te=await $c.init({driver:j.driver,generator:o,logger:le,limbarClient:V,playwrightDevice:pe,orgId:e,adbPort:j.adbPort,options:{emulator:{...y,browserSettings:p.config.browser}},aiSettings:S,fixtures:{storage:i,browserEnricher:l,browserGenerator:c,localCodeEvalTools:u,testContext:q}});if(A.push(()=>Te.cleanup()),k.videoOutputPath&&V)try{await V.startRecording({quality:RecordingQuality$1.Q5}),k.setActiveVideo(Rf,new Date),le.info("Started Android video recording"),A.push(async()=>{if(!k.videoOutputPath)return;let Ne=mn__default.join(k.videoOutputPath,Rf);await V.stopRecording({localPath:Ne}),le.info({videoPath:Ne},"Saved Android video recording");});}catch(Ne){le.warn({err:Ne},"Failed to start Android video recording");}return {platform:"ANDROID",envName:h,tracer:k,fixtures:{controller:Te,logger:le,cacheStorage:a,usageTracker:s},work:{state:{failureRecoveryDisabled:S.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:z}}catch(k){throw await z(),k}}};var xoe={...dl,prepareRunParams:async({runTracer:t,metadata:{orgId:e},fixtures:{logger:n,apiClient:r,mobileGenerator:o,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:b},settings:{emulatorSettings:y,aiSettings:S},options:{logLevel:T,region:C,localIosDeviceType:w,localIosVersion:_,localAppPath:N},registerCleanup:I})=>{let A=false,z=[()=>u.dispose()],D=async()=>{A=true;for(let W of z.toReversed())try{await W();}catch(q){j.warn({err:q},"Failed to run cleanup function");}await s.flush(n);};I?.(async()=>D());let B=Nl.optional().parse(C??y.region),F;if(B==="local"){let{deviceType:W,iosVersion:q,appFilePath:V,appFilePathSource:pe}=bm({overrideDeviceType:w,overrideIosVersion:_,overrideAppFilePath:N,emulatorSettings:y,defaultAppFilePath:f.settings?.defaultAppFilePath,envVariables:b});if(!W)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 ${wl} key on the environment.`);let Te=pf({appFolderPath:V,source:pe});F={type:"local",deviceType:W,iosVersion:q,appFilePath:Te};}else F={type:"remote",region:B===Jo?void 0:B,appToInstall:d?{channel:d,tag:m}:void 0,osVersion:cm};let le=randomUUID(),j=n.child({runAttemptId:le}),L=await Xe({name:"mobile-cli.driver_setup",attributes:{"momentic.platform":"IOS","momentic.test_id":f.id},fn:async()=>nf({apiClient:r,logger:n,driverLogLevel:T,creationOpts:F,callbacks:{onStatusUpdate:W=>{n.debug({status:W},"Emulator status update");},onHeartbeatFailure:()=>{A||P.warn("Appium heartbeat connection lost. Possible emulator failure.");},onHeartbeatRestored:()=>{P.info("Appium heartbeat connection restored.");},onLimbarConnectionStateChange:W=>{W==="disconnected"?A||P.warn("Emulator websocket connection lost. Emulator may be unavailable."):(W==="reconnecting"||W==="connecting")&&P.info("Emulator websocket is reconnecting.");}},orgId:e,sessionId:le})});z.push(()=>L.cleanup());let U=L.limbarParams?.region,k=L.limbarParams?.tag;try{let W=await t.startAttempt({emulatorName:L.emulator.name,runAttemptId:le,assetDetails:{region:U??B??Jo,tag:k??(F.type==="remote"?F.appToInstall?.tag:void 0),channel:F.type==="remote"?F.appToInstall?.channel:void 0}});j=j.child(W.loggerBindings||{});let q=await WA({emulator:L.emulator,onLogs:Ne=>{W.appendLogs(Ne);}});q&&z.push(async()=>q());let V=new Ri({variablesFromEnvironment:b,envName:h,testName:f.name}),pe=await jc.init({driver:L.driver,generator:o,logger:j,emulator:L.emulator,orgId:e,options:{emulator:{...y,browserSettings:p.config.browser}},aiSettings:S,fixtures:{storage:i,browserEnricher:l,browserGenerator:c,localCodeEvalTools:u,testContext:V}});z.push(()=>pe?.cleanup());let Te=L.emulator;if(W.videoOutputPath&&Te.startScreenRecording&&Te.stopScreenRecording)try{await Te.startScreenRecording(),W.setActiveVideo(Rf,new Date),j.info("Started iOS video recording"),z.push(async()=>{if(!W.videoOutputPath||!Te.stopScreenRecording)return;let Ne=mn__default.join(W.videoOutputPath,Rf);await Te.stopScreenRecording(Ne),j.info({videoPath:Ne},"Saved iOS video recording");});}catch(Ne){j.warn({err:Ne},"Failed to start iOS video recording");}return {platform:"IOS",envName:h,tracer:W,fixtures:{controller:pe,logger:j,cacheStorage:a,usageTracker:s},work:{state:{failureRecoveryDisabled:S.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:D}}catch(W){throw await D(),W}}};var no="0.111.0",{checkCLIVersion:Vk}=k5({packageName:"momentic-mobile",currentVersion:no,changelogUrl:"https://github.com/momentic-ai/mobile-cli/blob/main/CHANGELOG.md",updateCommand:"npx momentic-mobile@latest upgrade"});var Hk=class{constructor(e,n,r,o,i,a,s){this.keepalive=e;this.testId=n;this.testName=r;this.platform=o;this.diskStorage=i;this.parentTracer=a;this.orgId=s;this.interactionTracer=new Bi(void 0,l=>this.storeTraceAsset(l)),Xr.initializeRootTracerContext(this.interactionTracer);}children=[];finished=false;interactionTracer;getParentStepIdChain(){return []}recordStepDuration(e){let{durationMs:n,step:r}=e;if(!NE(r))return;let o=DE(r);Ge.distribution("test_mobile_step_duration",n,[`type:${o}`,`platform:${this.platform.toLowerCase()}`,"executor:cli",`orgId:${this.orgId}`]);}attachBeforeScreenshot(e){let{snapshotId:n,screenshot:r}=e;this.diskStorage.storeFile({name:`${Pi}/${n}.png`,contents:r});}attachAfterScreenshot(e){let{snapshotId:n,screenshot:r}=e;this.diskStorage.storeFile({name:`${Pi}/${n}.png`,contents:r});}storeTraceAsset(e){let{snapshotId:n,data:r,extension:o}=e;this.diskStorage.storeFile({name:`${Pi}/${n}.${o??"png"}`,contents:r});}attachBeforeXmlSnapshot(e){let{snapshotId:n,xml:r}=e;this.diskStorage.storeFile({name:`${Pi}/${n}.xml`,contents:r});}attachAfterXmlSnapshot(e){let{snapshotId:n,xml:r}=e;this.diskStorage.storeFile({name:`${Pi}/${n}.xml`,contents:r});}async finishInternal(e){this.finished||(this.finished=true,this.interactionTracer.finish(),await Promise.all(this.children.map(n=>n.finish({status:mh(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 xf(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this.orgId);return this.children.push(e),e}},xf=class{constructor(e,n,r,o,i,a){this.keepalive=e;this.testId=n;this.testName=r;this.platform=o;this.diskStorage=i;this.orgId=a;}children=[];finished=false;async getScreenshot(e){return this.diskStorage.readFile(`${Pi}/${e}.png`)??this.diskStorage.readFile(`${Pi}/${e}.jpeg`)}getParentStepIdChain(){return []}async startStep(e){this.keepalive();let n=new Hk(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this,this.orgId);return this.children.push(n),n}async finish(e){this.finished||(this.finished=true,await Promise.all(this.children.map(n=>n.finishInternal({status:bU(e.status),finishedAt:e.finishedAt}))));}},Wk=class{constructor(e,n,r,o,i,a,s,l,c,u,d){this.keepalive=e;this.testId=n;this.testName=r;this.platform=o;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=o==="IOS"?"assets/logs.syslog":"assets/logs.logcat";this.logStream=this.diskStorage.createFileStream(m),this.resourceUsageStream=this.diskStorage.createFileStream(`${Pi}/resource-usage.ndjson`),this.resourceUsageSampler=wj({keepSamples:false,onSample:p=>{this.resourceUsageStream.write(`${JSON.stringify(p)}
|
|
6248
|
+
`)}`),e.totalErrors++;for(let s of a){let l=mn__default.relative(t.project.rootDir,s);n.has(s)?e.failedModuleFilePaths.add(l):e.failedTestFilePaths.add(l);}}}}function AVe({momenticFiles:t,state:e}){for(let[n,r]of Object.entries(t.mobileTests)){let o=t.mobileModules[n];o&&(P.error(`ID '${n}' is shared between mobile test '${r.relativePath}' and mobile module '${o.relativePath}'. Test and module IDs must be unique across the entire project.`),e.totalErrors++,e.failedTestFilePaths.add(r.relativePath),e.failedModuleFilePaths.add(o.relativePath));}}async function Kre({project:t,filePath:e}){let{totalErrors:n,parsingErrors:r,parsingErrorDetails:o,failedTestFilePaths:i,failedModuleFilePaths:a}=await Vre({project:t,filePath:e});if(n===0){P.success("Mobile lint passed. No issues found.");return}o.length>0&&$T({parsingErrors:r,parsingErrorDetails:o,failedTestFilePaths:i,failedModuleFilePaths:a,rootDir:t.rootDir}),P.error(`Found ${n} mobile lint error${n===1?"":"s"} in project.`),process.exit(1);}async function Ck({project:t}){if(t.config.fileFormat==="v2"){let{totalErrors:o,parsingErrors:i,parsingErrorDetails:a,failedTestFilePaths:s,failedModuleFilePaths:l}=await Vre({project:t});i>0&&($T({parsingErrors:i,parsingErrorDetails:a,failedTestFilePaths:s,failedModuleFilePaths:l,rootDir:t.rootDir}),process.exit(1)),o>0&&(P.error(`Found ${o} lint errors`),P.warn("Run 'npx momentic-mobile lint' for details"),process.exit(1));return}let{parsingErrors:e,parsingErrorDetails:n,failedTestFilePaths:r}=await $re({project:t,logger:P});e>0&&($T({parsingErrors:e,parsingErrorDetails:n,failedTestFilePaths:r,rootDir:t.rootDir}),process.exit(1));}async function Ak({tests:t,momenticFiles:e,project:n,yes:r,include:o,exclude:i,labels:a,logger:s,quarantinedTestsMetadata:l}){let c=new Set;if(t&&t.length>0){let d=t.some(p=>br.existsSync(p)),m=cwd();d?(m!==n.rootDir&&s.warn(`Test paths resolve against the current directory ('${m}'), not the project root ('${n.rootDir}'). Run from the project root or use substring filters to avoid surprises.`),t.forEach(p=>{if(!br.existsSync(p))throw new Error(`Path '${p}' does not exist.`);let f,h;try{f=br.statSync(p),h=f.isDirectory();}catch(y){s.warn({err:y},`Skipping path ${p} because it cannot be read`);return}let b=mn__default.resolve(p);Object.values(e.mobileTests).filter(y=>h?y.fullFilePath.startsWith(b):y.fullFilePath===b).forEach(y=>{c.add(y.fullFilePath);});})):Object.values(e.mobileTests).forEach(p=>{t.some(f=>p.relativePath.includes(f))&&c.add(p.fullFilePath);});}else !r&&!await $l("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=mn__default.relative(n.rootDir,d);o&&!o.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=mn__default.relative(n.rootDir,d),p=await cn(d,s,e),f=mn__default.basename(d,".test.yaml");if(p.disabled)return null;if(a&&a.length>0){let b=p.labels||[];if(!a.some(S=>b.includes(S)))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 (y=>{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 Yre({testDefinitions:t,quarantinedTestsMetadata:e,onlyQuarantined:n=false,skipQuarantined:r=false}){let[o,i]=partition(t,a=>a.id in e);return {quarantinedTestsToSkip:r?o:[],testsToRun:n?[]:i,quarantinedTestsToRun:r?[]:o}}var Xre=()=>process.exit(130),Jre=()=>process.exit(143);process.on("SIGINT",Xre);process.on("SIGTERM",Jre);function Zre(){process.off("SIGINT",Xre),process.off("SIGTERM",Jre);}async function Rk({project:t,apiClient:e,gitMetadata:n,orgId:r,dryRun:o=false}){let i=await Et(t),a=Object.values(i.mobileTests).filter(b=>b.type===ve.MOBILE_TEST),s=Object.values(i.mobileModules).filter(b=>b.type===ve.MOBILE_MODULE),l=Object.values(i.mobileTests).filter(b=>b.type===ve.MOBILE_TEST_V2).length,c=Object.values(i.mobileModules).filter(b=>b.type===ve.MOBILE_MODULE_V2).length,u={...CO(),alreadyV2TestCount:l,alreadyV2ModuleCount:c},d=t.config.fileFormat!=="v2",{v2ProjectConfig:m,migratedFilePaths:p}=F5(t);!o&&a.length>0&&await PVe({legacyMobileTests:a,momenticFiles:i,project:t,apiClient:e,gitMetadata:n,orgId:r}),await IVe({legacyMobileModules:s,momenticFiles:i,project:t,v2ProjectConfig:m,migratedFilePaths:p,summary:u,dryRun:o}),await DVe({legacyMobileTests:a,momenticFiles:i,project:t,v2ProjectConfig:m,migratedFilePaths:p,summary:u,dryRun:o});let f=u.migratedTestPaths.length>0||u.migratedModulePaths.length>0;return !o&&(d||f)&&TO({project:t,newProjectConfig:m,fileFormatLabel:"v2",migratedFilePaths:p}),u}async function Qre({project:t,apiClient:e,gitMetadata:n}){let{legacyProjectConfig:r,migratedFilePaths:o}=B5(t),i=await Et(t),a=Object.values(i.mobileTests).filter(c=>c.type===ve.MOBILE_TEST_V2),s=Object.values(i.mobileModules).filter(c=>c.type===ve.MOBILE_MODULE_V2);P.info(`Migrating ${a.length} simplified format mobile tests and ${s.length} simplified format mobile modules to legacy YAML`);let l=new Set;await _Ve({v2MobileTests:a,momenticFiles:i,project:t,legacyProjectConfig:r,migratedFilePaths:o,apiClient:e,gitMetadata:n,modulesCoveredByTests:l}),await OVe({v2MobileModules:s,momenticFiles:i,project:t,legacyProjectConfig:r,migratedFilePaths:o,modulesCoveredByTests:l}),TO({project:t,newProjectConfig:r,fileFormatLabel:"legacy",migratedFilePaths:o});}async function PVe({legacyMobileTests:t,momenticFiles:e,project:n,apiClient:r,gitMetadata:o,orgId:i}){if(t.length===0)return;let a={logger:P,orgId:i,client:r,regenerateCache:false,alwaysSaveCache:true,noCache:false,isolateCachesByEnvironment:n.config.advanced?.isolateCachesByEnvironment??false,bustOldestCachePercentage:void 0},s=[Qn({...a,gitMetadata:o})];o.gitMainBranch&&o.gitBranchName!==o.gitMainBranch&&s.push(Qn({...a,gitMetadata:{...o,gitBranchName:o.gitMainBranch,gitCommitTimestamp:o.lastCommitOnMainTimestamp??o.gitCommitTimestamp}})),P.info(`Pushing mobile test snapshots for ${t.length} legacy mobile tests so existing step caches survive the simplified format conversion`),await lp(t,sp,async l=>{let c=await cn(l.fullFilePath,P,e),{snapshotCachesToSave:u}=await Tr({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:P,platform:c.platform,entries:u});P.dimmed(`Pushed mobile test snapshot for: ${l.relativePath}`);});}async function IVe({legacyMobileModules:t,momenticFiles:e,project:n,v2ProjectConfig:r,migratedFilePaths:o,summary:i,dryRun:a}){await lp(t,sp,async s=>{let l=rc(s.fullFilePath,P);if(Lg(l))throw new Error(`Expected a legacy mobile module while migrating '${s.relativePath}', but found the simplified format`);let c=oc({module:l,moduleFilePath:s.fullFilePath,momenticFiles:e}),u=Va.parse(c),d={...u,name:c.name??s.name,steps:ra(u.platform).array().parse(c.steps)};a||rs({content:d,schemaVersion:cr,momenticFiles:e,project:{...n,config:r},forceSaveOnNoDiffs:true}),o.push(s.fullFilePath),i.migratedModulePaths.push(s.fullFilePath),P.dimmed(` + ${s.relativePath}`);});}async function _Ve({v2MobileTests:t,momenticFiles:e,project:n,legacyProjectConfig:r,migratedFilePaths:o,apiClient:i,gitMetadata:a,modulesCoveredByTests:s}){await lp(t,sp,async l=>{let c=await cn(l.fullFilePath,P,e),u=await LVe({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 Tr({platform:c.platform,stepLists:u});for(let m of d)s.add(m.moduleId);await Xs({platform:c.platform,filePath:l.fullFilePath,steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps,settings:c.settings,labels:c.labels,folder:n.rootDir,project:{...n,config:r},momenticFiles:e,schemaVersion:cr,forceFileFormat:"v1"}),o.push(l.fullFilePath),P.dimmed(`Migrated simplified format mobile test to legacy: ${l.relativePath}`);});}async function OVe({v2MobileModules:t,momenticFiles:e,project:n,legacyProjectConfig:r,migratedFilePaths:o,modulesCoveredByTests:i}){await lp(t,sp,async a=>{if(i.has(a.id)){o.push(a.fullFilePath);return}let s=rc(a.fullFilePath,P),l=oc({module:s,moduleFilePath:a.fullFilePath,momenticFiles:e}),c=Va.parse(l),u={...c,name:l.name??a.name,steps:ra(c.platform).array().parse(l.steps)};rs({content:u,schemaVersion:cr,momenticFiles:e,project:{...n,config:r},forceSaveOnNoDiffs:true,forceFileFormat:"v1"}),o.push(a.fullFilePath),P.dimmed(`Migrated unreferenced simplified format mobile module to legacy: ${a.relativePath}`);});}async function DVe({legacyMobileTests:t,momenticFiles:e,project:n,v2ProjectConfig:r,migratedFilePaths:o,summary:i,dryRun:a}){await lp(t,sp,async s=>{let l=await cn(s.fullFilePath,P,e);a||await Xs({platform:l.platform,filePath:s.fullFilePath,steps:l.steps,beforeSteps:l.beforeSteps,afterSteps:l.afterSteps,settings:l.settings,labels:l.labels,folder:n.rootDir,project:{...n,config:r},momenticFiles:e,schemaVersion:cr}),o.push(s.fullFilePath),i.migratedTestPaths.push(s.fullFilePath),P.dimmed(` + ${s.relativePath}`);});}async function NVe({apiClient:t,gitMetadata:e,testId:n,platform:r,environment:o}){let i=await t.getSnapshotCacheForTest({testId:n,environment:o,platform:r==="ANDROID"?"android":"ios"},bu(e));return fv({entries:i,logger:P})}async function LVe({platform:t,stepLists:e,apiClient:n,gitMetadata:r,testId:o,environment:i,missingSnapshotMessage:a}){let s=await NVe({apiClient:n,gitMetadata:r,testId:o,platform:t,environment:i});s.testStepLists||P.warn(`${a} Minting fresh legacy ids.`);let l=hv({currentStepLists:e,previousSnapshots:s,generateUuid:randomUUID});return l.stats.mintedSteps>0&&P.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 eoe=58890;function Cd(t){let e=parseInt(t,10);if(isNaN(e))throw new InvalidArgumentError("Not a number.");return e}function BVe(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 toe=new Option("--port <port>",`Port to run the local app on. Defaults to ${eoe}.`).env("PORT").default(eoe).argParser(Cd),fi=new Option("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").default(Kv(),"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(),pl=new Option("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),zR=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."),Ho=new Option("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default(Yv()??"https://api.momentic.ai").argParser(t=>{try{return z.url().parse(t),t}catch{throw new InvalidArgumentError("Not a valid URL.")}}),$y=new Option("-y, --yes","Skip all confirmation prompts.").env("CI"),xk=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."),$R=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"),VR=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 jR(t){return e=>{let n=e.trim();if(n==="")throw new InvalidArgumentError(`${t} must be a non-empty string (whitespace is not allowed).`);return n}}var Mk=new Option("--tag <tag>","Tag identifier for the asset.").argParser(jR("--tag")),Pk=new Option("--channel <channel>","Channel name for the asset.").argParser(jR("--channel")),HR=new Option("--channel <channel>","Channel name for the asset.").argParser(jR("--channel")).makeOptionMandatory(),Ik=new Option("--tag <tag>","Tag identifier for the asset.").argParser(jR("--tag")).makeOptionMandatory(),_k=new Option("--platform <platform>","Mobile platform for the asset."),noe=new Option("--platform <platform>","Mobile platform for the asset.").makeOptionMandatory(),roe=new Option("--tag-filter <tagFilter>","Case-insensitive substring filter applied to tags when listing a channel."),ooe=new Option("--json","Emit machine-readable JSON output instead of a human-readable table.");function WR(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 ioe=new Option("--env <env>","Environment to run all tests in (overrides test-level configuration)."),aoe=new Option("--android-home <androidHome>","Path to the Android SDK root. Sets ANDROID_HOME for this command."),soe=new Option("--java-home <javaHome>","Path to the Java home directory. Sets JAVA_HOME for this command."),Ok=new Option("--region <region>",`Region to run all tests in (overrides all other configuration). Valid values: ${Object.values(zh).join(", ")}, ${Object.values(Uh).join(", ")}, ${Jo}, ${Object.values(Wa).join(", ")}.`),Dk=new Option("--local-avd-id <localAvdId>","Force tests to use a specific local Android Virtual Device (AVD) instead of remote emulators."),Nk=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."),Lk=new Option("--local-ios-device-type <localIosDeviceType>","Force tests to use a specific local iOS device type instead of remote emulators."),kk=new Option("--local-ios-version <localIosVersion>","Target a specific local iOS runtime version (e.g. 26.4). Defaults to the latest installed runtime."),Fk=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."),loe=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(BVe),coe=new Option("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(t=>{let e=Cd(t);if(e<1)throw new InvalidArgumentError("Shard index must be greater than 0.");return e}),uoe=new Option("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(Cd),Bk=new Option("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),Uk=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."),zk=new Option("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),doe=new Option("--upload-results","Upload test results to the Momentic dashboard.").default(false),moe=new Option("--share-diagnostics","Share local run diagnostics (OpenTelemetry traces) with Momentic to help diagnose performance issues.").env("MOMENTIC_SHARE_DIAGNOSTICS"),UVe=["true","false","on-fail"],poe=new Option("--video [value]","Record video of mobile test runs. By default, video is recorded. Use the bare flag or pass true, false, or on-fail.").choices(UVe),$k=new Option("--log-level <logLevel>","Log level for Momentic and dependent services.").choices(["error","warn","info","debug"]),foe=new Option("--skip-quarantined","Skip quarantined tests entirely.").implies({onlyQuarantined:false,ignoreQuarantine:false}),hoe=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}),goe=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}),boe=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(Cd),yoe=new Option("--reporter <reporter>","Output reporter. Live: list (default). File: "+Qv.join(", ")+". File reporters write to --reporter-dir. Pass --reporter multiple times to combine reporters.").default([]).argParser(M5),Soe=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"),Eoe=new Option("--name <name>","A name to associate with this run for easier identification in the Momentic dashboard."),Toe=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(Cd),voe=new Option("--headful [headful]","Launch mobile MCP remote control browsers headfully by default.").argParser(JM),Coe=new Option("--supports-file-output [supportsFileOutput]","Allow MCP tool responses to include file output references.").argParser(JM),woe=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."),Aoe=new Argument("[results]",`Path to the results archive. Defaults to "${Ug}".`).default(Ug);var Rf="screen-recording.mp4";var Roe={...ul,prepareRunParams:async({runTracer:t,metadata:{orgId:e},fixtures:{logger:n,apiClient:r,mobileGenerator:o,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:b},settings:{emulatorSettings:y,aiSettings:S},options:{logLevel:T,localAvdId:C,localApkPath:w,region:_},registerCleanup:N})=>{let I=false,A=[()=>u.dispose()],z=async()=>{I=true;for(let k of A.toReversed())try{await k();}catch(W){le.warn({err:W},"Failed to run cleanup function");}await s.flush(n);};N?.(async()=>z());let D=Nl.optional().parse(_??y.region),B=D==="local",F;if(B){let{avdId:k,apkFilePath:W,apkFilePathSource:q}=gm({overrideAvdId:C,overrideApkFilePath:w,emulatorSettings:y,defaultApkFilePath:f.settings?.defaultApkFilePath,envVariables:b}),V=fp({apkFilePath:W,source:q});if(!k)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 ${Cl} key on the environment.`);F={avdId:k,apkFilePath:V};}else F={region:D===Jo?void 0:D,apkToInstall:d?{channel:d,tag:m}:void 0,osVersion:y.remoteEmulatorSettings?.androidVersion??lm};let $=randomUUID(),le=n.child({runAttemptId:$}),j=await Xe({name:"mobile-cli.driver_setup",attributes:{"momentic.platform":"ANDROID","momentic.test_id":f.id},fn:async()=>pp({apiClient:r,logger:n,driverLogLevel:T,creationOpts:F,callbacks:{onStatusUpdate:k=>{n.debug({status:k},"Emulator status update");},onHeartbeatFailure:()=>{let k="Appium heartbeat connection lost. Possible ADB tunnel/emulator failure.";I||P.warn(k);},onHeartbeatRestored:()=>{P.info("Appium heartbeat connection restored.");},onLimbarConnectionStateChange:k=>{k==="disconnected"?I||P.warn("Emulator websocket connection lost. Emulator may be unavailable."):(k==="reconnecting"||k==="connecting")&&P.info("Emulator websocket is reconnecting.");}},orgId:e,sessionId:$})});A.push(()=>j.cleanup());let L="limbarRegion"in j?j.limbarRegion:void 0,U="limbarTag"in j?j.limbarTag:void 0;try{let k=await t.startAttempt({emulatorName:j.emulatorName,runAttemptId:$,assetDetails:{avdId:pu in F?F.avdId:void 0,tag:U??("apkToInstall"in F?F.apkToInstall?.tag:void 0),channel:"apkToInstall"in F?F.apkToInstall?.channel:void 0,region:L??D??Jo}});le=le.child(k.loggerBindings||{});let W=await j.driver.executeInNativeContext(le,async Ne=>fC({driver:Ne,onLogs:Nt=>{k.appendLogs(Nt);}}),{operationName:"startLogcatListener"});A.push(()=>W());let q=new Ri({variablesFromEnvironment:b,envName:h,testName:f.name}),V="limbarClient"in j?j.limbarClient:void 0,pe="playwrightDevice"in j?j.playwrightDevice:void 0,Te=await $c.init({driver:j.driver,generator:o,logger:le,limbarClient:V,playwrightDevice:pe,orgId:e,adbPort:j.adbPort,options:{emulator:{...y,browserSettings:p.config.browser}},aiSettings:S,fixtures:{storage:i,browserEnricher:l,browserGenerator:c,localCodeEvalTools:u,testContext:q}});if(A.push(()=>Te.cleanup()),k.videoOutputPath&&V)try{await V.startRecording({quality:RecordingQuality$1.Q5}),k.setActiveVideo(Rf,new Date),le.info("Started Android video recording"),A.push(async()=>{if(!k.videoOutputPath)return;let Ne=mn__default.join(k.videoOutputPath,Rf);await V.stopRecording({localPath:Ne}),le.info({videoPath:Ne},"Saved Android video recording");});}catch(Ne){le.warn({err:Ne},"Failed to start Android video recording");}return {platform:"ANDROID",envName:h,tracer:k,fixtures:{controller:Te,logger:le,cacheStorage:a,usageTracker:s},work:{state:{failureRecoveryDisabled:S.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:z}}catch(k){throw await z(),k}}};var xoe={...dl,prepareRunParams:async({runTracer:t,metadata:{orgId:e},fixtures:{logger:n,apiClient:r,mobileGenerator:o,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:b},settings:{emulatorSettings:y,aiSettings:S},options:{logLevel:T,region:C,localIosDeviceType:w,localIosVersion:_,localAppPath:N},registerCleanup:I})=>{let A=false,z=[()=>u.dispose()],D=async()=>{A=true;for(let W of z.toReversed())try{await W();}catch(q){j.warn({err:q},"Failed to run cleanup function");}await s.flush(n);};I?.(async()=>D());let B=Nl.optional().parse(C??y.region),F;if(B==="local"){let{deviceType:W,iosVersion:q,appFilePath:V,appFilePathSource:pe}=bm({overrideDeviceType:w,overrideIosVersion:_,overrideAppFilePath:N,emulatorSettings:y,defaultAppFilePath:f.settings?.defaultAppFilePath,envVariables:b});if(!W)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 ${wl} key on the environment.`);let Te=pf({appFolderPath:V,source:pe});F={type:"local",deviceType:W,iosVersion:q,appFilePath:Te};}else F={type:"remote",region:B===Jo?void 0:B,appToInstall:d?{channel:d,tag:m}:void 0,osVersion:cm};let le=randomUUID(),j=n.child({runAttemptId:le}),L=await Xe({name:"mobile-cli.driver_setup",attributes:{"momentic.platform":"IOS","momentic.test_id":f.id},fn:async()=>nf({apiClient:r,logger:n,driverLogLevel:T,creationOpts:F,callbacks:{onStatusUpdate:W=>{n.debug({status:W},"Emulator status update");},onHeartbeatFailure:()=>{A||P.warn("Appium heartbeat connection lost. Possible emulator failure.");},onHeartbeatRestored:()=>{P.info("Appium heartbeat connection restored.");},onLimbarConnectionStateChange:W=>{W==="disconnected"?A||P.warn("Emulator websocket connection lost. Emulator may be unavailable."):(W==="reconnecting"||W==="connecting")&&P.info("Emulator websocket is reconnecting.");}},orgId:e,sessionId:le})});z.push(()=>L.cleanup());let U=L.limbarParams?.region,k=L.limbarParams?.tag;try{let W=await t.startAttempt({emulatorName:L.emulator.name,runAttemptId:le,assetDetails:{region:U??B??Jo,tag:k??(F.type==="remote"?F.appToInstall?.tag:void 0),channel:F.type==="remote"?F.appToInstall?.channel:void 0}});j=j.child(W.loggerBindings||{});let q=await WA({emulator:L.emulator,onLogs:Ne=>{W.appendLogs(Ne);}});q&&z.push(async()=>q());let V=new Ri({variablesFromEnvironment:b,envName:h,testName:f.name}),pe=await jc.init({driver:L.driver,generator:o,logger:j,emulator:L.emulator,orgId:e,options:{emulator:{...y,browserSettings:p.config.browser}},aiSettings:S,fixtures:{storage:i,browserEnricher:l,browserGenerator:c,localCodeEvalTools:u,testContext:V}});z.push(()=>pe?.cleanup());let Te=L.emulator;if(W.videoOutputPath&&Te.startScreenRecording&&Te.stopScreenRecording)try{await Te.startScreenRecording(),W.setActiveVideo(Rf,new Date),j.info("Started iOS video recording"),z.push(async()=>{if(!W.videoOutputPath||!Te.stopScreenRecording)return;let Ne=mn__default.join(W.videoOutputPath,Rf);await Te.stopScreenRecording(Ne),j.info({videoPath:Ne},"Saved iOS video recording");});}catch(Ne){j.warn({err:Ne},"Failed to start iOS video recording");}return {platform:"IOS",envName:h,tracer:W,fixtures:{controller:pe,logger:j,cacheStorage:a,usageTracker:s},work:{state:{failureRecoveryDisabled:S.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:D}}catch(W){throw await D(),W}}};var no="0.111.1",{checkCLIVersion:Vk}=k5({packageName:"momentic-mobile",currentVersion:no,changelogUrl:"https://github.com/momentic-ai/mobile-cli/blob/main/CHANGELOG.md",updateCommand:"npx momentic-mobile@latest upgrade"});var Hk=class{constructor(e,n,r,o,i,a,s){this.keepalive=e;this.testId=n;this.testName=r;this.platform=o;this.diskStorage=i;this.parentTracer=a;this.orgId=s;this.interactionTracer=new Bi(void 0,l=>this.storeTraceAsset(l)),Xr.initializeRootTracerContext(this.interactionTracer);}children=[];finished=false;interactionTracer;getParentStepIdChain(){return []}recordStepDuration(e){let{durationMs:n,step:r}=e;if(!NE(r))return;let o=DE(r);Ge.distribution("test_mobile_step_duration",n,[`type:${o}`,`platform:${this.platform.toLowerCase()}`,"executor:cli",`orgId:${this.orgId}`]);}attachBeforeScreenshot(e){let{snapshotId:n,screenshot:r}=e;this.diskStorage.storeFile({name:`${Pi}/${n}.png`,contents:r});}attachAfterScreenshot(e){let{snapshotId:n,screenshot:r}=e;this.diskStorage.storeFile({name:`${Pi}/${n}.png`,contents:r});}storeTraceAsset(e){let{snapshotId:n,data:r,extension:o}=e;this.diskStorage.storeFile({name:`${Pi}/${n}.${o??"png"}`,contents:r});}attachBeforeXmlSnapshot(e){let{snapshotId:n,xml:r}=e;this.diskStorage.storeFile({name:`${Pi}/${n}.xml`,contents:r});}attachAfterXmlSnapshot(e){let{snapshotId:n,xml:r}=e;this.diskStorage.storeFile({name:`${Pi}/${n}.xml`,contents:r});}async finishInternal(e){this.finished||(this.finished=true,this.interactionTracer.finish(),await Promise.all(this.children.map(n=>n.finish({status:mh(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 xf(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this.orgId);return this.children.push(e),e}},xf=class{constructor(e,n,r,o,i,a){this.keepalive=e;this.testId=n;this.testName=r;this.platform=o;this.diskStorage=i;this.orgId=a;}children=[];finished=false;async getScreenshot(e){return this.diskStorage.readFile(`${Pi}/${e}.png`)??this.diskStorage.readFile(`${Pi}/${e}.jpeg`)}getParentStepIdChain(){return []}async startStep(e){this.keepalive();let n=new Hk(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this,this.orgId);return this.children.push(n),n}async finish(e){this.finished||(this.finished=true,await Promise.all(this.children.map(n=>n.finishInternal({status:bU(e.status),finishedAt:e.finishedAt}))));}},Wk=class{constructor(e,n,r,o,i,a,s,l,c,u,d){this.keepalive=e;this.testId=n;this.testName=r;this.platform=o;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=o==="IOS"?"assets/logs.syslog":"assets/logs.logcat";this.logStream=this.diskStorage.createFileStream(m),this.resourceUsageStream=this.diskStorage.createFileStream(`${Pi}/resource-usage.ndjson`),this.resourceUsageSampler=wj({keepSamples:false,onSample:p=>{this.resourceUsageStream.write(`${JSON.stringify(p)}
|
|
6249
6249
|
`);}});}finished=false;children=[];logStream;resourceUsageStream;resourceUsageSampler;get loggerBindings(){return {runAttemptId:this.runAttemptId}}get videoOutputPath(){if(this.recordVideo)return mn.resolve(this.diskStorage.cwd(),Pi)}appendLogs(e){let n=e.join(`
|
|
6250
6250
|
`);this.logStream.write(n+`
|
|
6251
6251
|
`);}setActiveVideo(e,n){this.recordVideo&&(this.metadata.activeVideos=this.metadata.activeVideos||[],this.metadata.activeVideos.push({videoName:e,timestamp:n}));}async finish(e){if(this.finished)return;this.finished=true;let{logger:n,status:r,results:o,beforeResults:i,afterResults:a}=e,s={...this.metadata,status:r,assetDetails:this.assetDetails,finishedAt:new Date,results:rC(o,this.resultSchema,n),beforeResults:i?rC(i,this.resultSchema,n):void 0,afterResults:a?rC(a,this.resultSchema,n):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"&&r==="PASSED"&&(UG(n,this.videoOutputPath),s.activeVideos=void 0),this.diskStorage.storeFile({name:mr,contents:JSON.stringify(s,null,2)});}async startBeforeStepList(){let e=new xf(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this.orgId);return this.children.push(e),e}async startMainStepList(){let e=new xf(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this.orgId);return this.children.push(e),e}async startAfterStepList(){let e=new xf(this.keepalive,this.testId,this.testName,this.platform,this.diskStorage,this.orgId);return this.children.push(e),e}async getScreenshot(e,n){return this.diskStorage.readFile(`${Pi}/${n}.png`)??this.diskStorage.readFile(`${Pi}/${n}.jpeg`)}},Gk=class{constructor(e,n,r,o,i,a,s,l,c,u){this.client=e;this.testId=n;this.testName=r;this.platform=o;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 n={...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(r=>r.finish({logger:e.logger,status:n.status,results:[],beforeResults:[],afterResults:[]}))),this.diskStorage.storeFile({name:mr,contents:JSON.stringify(n,null,2)}),this.diskStorage.close();}async startAttempt(e){let{runAttemptId:n}=e;this.metadata.attempts=this.metadata.attempts+1,this.metadata.status="RUNNING",this.diskStorage.storeFile({name:mr,contents:JSON.stringify(this.metadata,null,2)});let r=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),o={id:n,schemaVersion:gS,runAttemptSchemaVersion:aj,startedAt:new Date,status:"RUNNING"};r.storeFile({name:mr,contents:JSON.stringify(o,null,2)});let i=debounce(async()=>{await this.client.extendEmulatorTtl(this.platform,e.emulatorName);},3e4,{maxWait:6e4}),a=new Wk(()=>void i(),this.testId,this.testName,this.platform,n,o,r,this.orgId,this.resultSchema,this.recordVideo,e.assetDetails);return this.children.push(a),a}},GR=class t{constructor(e,n,r,o,i,a){this.orgId=e;this.runGroupId=n;this.metadata=r;this.client=o;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:n,outputDir:r,client:o,gitMetadata:i,labels:a,suiteName:s,recordVideo:l}){let c={...i,suiteName:s&&Zi(s),id:n,trigger:qo.CLI,startedAt:new Date,status:"RUNNING",cliVersion:no,labels:a??[]},u=new Zg(r);return u.storeFile({name:mr,contents:JSON.stringify(c,null,2)}),new t(e,n,c,o,u,l??false)}async finish(e){if(this.finished)return;this.finished=true;let{status:n}=e,r={...this.metadata,status:n,updatedAt:new Date,finishedAt:new Date};await Promise.all(this.children.map(o=>o.finish({logger:e.logger,status:r.status,finishedAt:r.finishedAt}))),this.diskStorage.storeFile({name:mr,contents:JSON.stringify(r,null,2)});}async startRun(e){let n=this.diskStorage.createRunArchive(e.runId,e.logger),r={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?Zi(e.testName):e.testName,testDescription:e.testDescription,directory:e.directory,labels:e.testLabels,trigger:"CLI",status:"RUNNING",healStatus:"NOT_ATTEMPTED",environmentName:e.environmentName,cliVersion:no,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0,quarantined:e.quarantined,quarantinedReason:e.quarantinedReason,executionType:e.platform,aiSettings:e.aiSettings};n.storeFile({name:mr,contents:JSON.stringify(r,null,2)});let o=new Gk(this.client,e.testId,e.testName,e.platform,e.runId,r,n,this.orgId,e.resultSchema,this.recordVideo);return this.children.push(o),o}};function Poe(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 qR=2;async function qk(t){let{inputs:e,fixtures:n,metadata:r,helpers:o}=t,{tracer:i,logger:a}=n,{runId:s}=r,{platform:l,testDefinition:c,project:u}=e,d=new Date,m=await i.startRun({...Poe(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:o.resultSchema}),p=a.child(m.loggerBindings||{}),f=1+(c.settings?.retries??u.config.retries??NS);for(let h=0;h<f;h++){let b=new Date,y=await KVe({...t,runTracer:m,fixtures:{...n,logger:p},constants:{attemptNumber:h+1,totalAttempts:f}}),S=new Date;if(y.status!=="FAILED")return await m.finish({logger:p,status:y.status,failureRecoveryDetails:y.failureRecoveryDetails,finishedAt:S}),{...y,testMetadata:c,platformType:l,steps:c.steps,startedAt:d,lastAttemptStartedAt:b,finishedAt:S,runId:s,attempts:h+1,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedMetadata:c.quarantinedMetadata,status:y.status};if(h!==f-1){p.warn("Retrying failed mobile run");continue}p.error("Mobile test failed after all exhausting attempts");let T={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,...T,failureRecoveryDetails:y.failureRecoveryDetails,finishedAt:S}),{...y,testMetadata:c,platformType:l,steps:c.steps,startedAt:d,lastAttemptStartedAt:b,finishedAt:S,runId:s,...T,attempts:h+1,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedMetadata:c.quarantinedMetadata,status:y.status}}throw new Error("This code should not be reachable")}async function KVe(t){let{metadata:e,constants:n,fixtures:r,inputs:o,options:i}=t,{attemptNumber:a,totalAttempts:s}=n,{orgId:l,gitMetadata:c}=e,{apiClient:u,logger:d}=r,{testDefinition:m,logUpdate:p,project:f,envOverride:h}=o,{regenerateCache:b,alwaysSaveCache:y,noCache:S}=i;a!==1&&p("RETRY",`attempt ${a}/${s}`);let T={...o.project.config.emulator,...m.settings?.emulator},C={...f.config.ai,useMemory:f.config.ai?.useMemory!==false,...m.settings?.ai},w=h||m.settings?.defaultEnv,N=(w?Uu(w,f,d):void 0)?.variables??{},I=Qn({logger:d,orgId:l,client:u,gitMetadata:c,regenerateCache:b,alwaysSaveCache:y,noCache:S,isolateCachesByEnvironment:f.config?.advanced?.isolateCachesByEnvironment}),A=new rp(u,l),z={type:"API_KEY",baseUrl:u.baseUrl,apiKey:u.apiKey,logger:d,mode:"runner"},D=new as(z),B=new Zs(C.agentConfig,z),F=new dc(z,B),$=new mc({httpClient:u,fakerSeed:f.config.advanced?.fakerConstantSeed?ym:void 0});return await YVe({...t,fixtures:{...t.fixtures,mobileGenerator:D,storage:A,cacheStorage:I,browserEnricher:F,browserGenerator:B,localCodeEvalTools:$},env:{envName:w,envVariables:N},settings:{aiSettings:C,emulatorSettings:T}})}async function YVe(t){let{inputs:{testDefinition:e,logUpdate:n},env:{envName:r},fixtures:{logger:o},helpers:i}=t,a=t.inputs.platform,s,l;for(let m=1;m<=qR;m++)try{s=await Xe({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===qR)break;n("RETRY",`emulator setup failed, retrying on a fresh emulator (${m+1}/${qR})`),o.warn({err:p,attempt:m,maxAttempts:qR},"Mobile emulator bootstrap failed; retrying bootstrap");}if(!s)return {status:"FAILED",results:[],error:new M("UserConfigurationError",`Fatal error creating mobile driver: ${H(l)}`)};let c=t.inputs.project.config.fileFormat==="v2",u;try{u=await Xe({name:"mobile-cli.execute_test",attributes:{"momentic.platform":a,"momentic.test_id":e.id},fn:async()=>bf({...s,containerName:`mobile test ${e.name}`,envName:r,helpers:i,inputs:{...s.inputs,useSnapshotIdentityCache:c}})});}finally{await Xe({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?M.fromMessage(m):new M("UnknownError","Unknown failure");}return {...u,error:d}}function KR(t){if(t.status!=="FAILED")return "none";switch(t.failureReason){case "SetupFailureError":return "setup";case "TeardownFailureError":return "teardown";default:return "main"}}function JVe(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 It(t)}}function Doe(t){let e=mn__default.relative(".",t);return e===""?t:e}function Ioe(t,e){return Math.max(0,(t.getTime()-e.getTime())/1e3)}function ZVe(t,e,n){let r=Ioe(e,t),o=Ioe(n,t);return {start_at:r,end_at:o,duration:Math.max(0,o-r)}}function Noe(t){let e=t.reduce((n,[r,o])=>(!o||Object.keys(n).length>=10||(n[r]=o),n),{});return Object.keys(e).length>0?e:void 0}function QVe(t){if(t.status!=="FAILED"||!t.failureReason)return;let e=El({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 eje(t){if(t.status!=="FAILED")return;let e=[t.failureDetails?.classification?.summary,t.failureDetails?.classification?.rootCause,t.failureDetails?.errorMessage].filter(r=>!!r),n=t.failureDetails?.errorStack?.split(`
|
|
@@ -6258,4 +6258,4 @@ ${a.map(s=>` - ${s}`).join(`
|
|
|
6258
6258
|
Upgrade your plan to keep running tests: ${ql(le,m)}`),await kn(),process.exit(1);}let D=await gn(Lt,T,p);A.debug({gitMetadata:D,config:p.config,nodeVersion:process.versions.node},"Got local git metadata");let B=await Voe(A,T,e.ignoreQuarantine),F=await Et(p),$=await Ak({tests:t,yes:e.yes,project:p,momenticFiles:F,include:e.include,exclude:e.exclude,labels:e.labels,logger:P,quarantinedTestsMetadata:B});await jE({serviceName:"mobile-cli",enabled:e.shareDiagnostics===true});try{let le=await Xe({name:"mobile-cli.run",root:!0,attributes:{"momentic.org_id":C,"momentic.run_group_id":I,"momentic.parallel":b,"momentic.tests_requested":$.length},fn:async()=>zoe({options:{...e,parallel:b,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:n,recordVideo:S},fixtures:{logger:A,project:p,apiClient:T},inputs:{envOverride:e.env,tag:i,channel:a,testDefinitions:$,quarantinedTestsMetadata:B},metadata:{gitMetadata:D,runGroupId:I,orgId:C}})});await kn(),process.exit(iG(le,{onlyQuarantined:e.onlyQuarantined})?1:0);}catch(le){Lt.error({err:le},"Failed to run tests locally"),P.error({err:le},"Failed to run tests locally. Rerun with --verbose for more detail."),await kn(),process.exit(1);}});Ur.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=>{P.info("Momentic Mobile project setup"),P.dimmed(" Bootstrap a new Momentic mobile project."),br.existsSync(nc)&&(P.error(`${nc} already exists in this directory. Rename or remove it to initialize a new project.`),process.exit(1));let e=t.name??await pj("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),n=await l5({cwd:process.cwd(),projectName:e});P.success(`Initialized Momentic project file at ${n.configPath}.`),c5({platform:"mobile"}),await kn(),process.exit(0);});Ur.command("upgrade").description("Upgrade your configuration to the latest recommended settings").addOption(pl).addOption(zR).addOption(Ho).addOption(fi).option("--dry-run","Preview the upgrade without writing any files or pushing snapshots.").action(async t=>{let e=await ai({configFilePath:t.config,nameFilter:t.filter}),n=t.dryRun??false;n||await $oe();let r=new bn({baseUrl:t.server,apiKey:t.apiKey,logger:Lt}),{orgId:o}=await r.getAuthInfo(),i=await gn(Lt,r,e),a=await U5({project:e,dryRun:n,migrate:()=>Rk({project:e,apiClient:r,gitMetadata:i,orgId:o,dryRun:n})});wO({summary:a.migration,fileFormatChanged:a.fileFormatChanged,aiSettings:a.aiSettings,dryRun:n,testNoun:"mobile test",moduleNoun:"mobile module"}),a.fileFormatChanged||vO(a.aiSettings)?n?P.success("Dry run complete. Rerun without --dry-run to apply."):(P.success("Upgraded project to latest recommended settings."),P.dimmed(" Optional: rerun tests with --regenerate-cache to rebuild caches from scratch (slower).")):P.success("Project is already up to date."),await kn(),process.exit(0);});Ur.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: ${NT.join(", ")}.`).action(async(t,e)=>{!e.all&&t.length===0&&(P.error("No browsers specified."),process.exit(1)),await LT({rawBrowsers:t,force:e.force,all:e.all}),await kn(),process.exit(0);});Ur.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(u5).makeOptionMandatory()).action(async t=>{P.warn("`momentic-mobile install-skills` is deprecated. Run `npx skills@latest add momentic-ai/skills` instead.");let e=t.editor,n=fileURLToPath(import.meta.url),r=mn__default.dirname(n),o=mn__default.resolve(r,"..","skills");d5({editor:e,skillsDir:o}),await kn(),process.exit(0);});Ur.command("login").description("Sign in with your Momentic account via WorkOS and save an API key.").addOption(Ho).addOption(new Option("--no-browser","Do not try to open a browser automatically")).action(async t=>{await T5({serverUrl:t.server,openBrowser:t.browser,ui:v5(qr())}),P.success(`Credentials saved to ${el}.`),await kn(),process.exit(0);});Ur.command("logout").description("Sign out and remove the saved API key.").action(async()=>{g5()?P.info(`Removed ${el}.`):P.dimmed("No signed-in session found."),await kn(),process.exit(0);});async function Mje(){try{await Ur.parseAsync(process.argv),await kn();}catch(t){Lt.error({err:t},"Uncaught error in CLI"),P.error({err:t},"Momentic Mobile CLI exited unexpectedly"),await kn(),process.exit(1);}}Mje();
|
|
6259
6259
|
//# sourceMappingURL=out.js.map
|
|
6260
6260
|
//# sourceMappingURL=cli.js.map
|
|
6261
|
-
//# debugId=
|
|
6261
|
+
//# debugId=20dcb4e9-9689-5aa4-8fdc-ce43e1504d1d
|