agent-device 0.18.1 → 0.18.2
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/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.1.apk → agent-device-android-multitouch-helper-0.18.2.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.2.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.1.manifest.json → agent-device-android-multitouch-helper-0.18.2.manifest.json} +4 -4
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.1.apk → agent-device-android-snapshot-helper-0.18.2.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.2.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.1.manifest.json → agent-device-android-snapshot-helper-0.18.2.manifest.json} +6 -6
- package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +2 -1
- package/dist/src/1986.js +1 -1
- package/dist/src/2948.js +16 -16
- package/dist/src/3340.js +8 -8
- package/dist/src/4428.js +3 -3
- package/dist/src/495.js +5 -5
- package/dist/src/6849.js +1 -1
- package/dist/src/7871.js +1 -1
- package/dist/src/8184.js +1 -1
- package/dist/src/8414.js +2 -2
- package/dist/src/8875.js +4 -1
- package/dist/src/9624.js +1 -1
- package/dist/src/9722.js +36 -36
- package/dist/src/android.js +1 -1
- package/dist/src/apps.js +9 -9
- package/dist/src/audio-probe.js +1 -1
- package/dist/src/batch.d.ts +1 -1
- package/dist/src/cli-help.js +9 -7
- package/dist/src/cli.js +23 -23
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/devices.js +1 -1
- package/dist/src/devices~1.js +1 -1
- package/dist/src/index.d.ts +42 -15
- package/dist/src/input-actions.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/record-trace-recording.js +3 -3
- package/dist/src/remote-config.d.ts +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.d.ts +8 -4
- package/dist/src/session.js +11 -11
- package/dist/src/simulator.js +2 -2
- package/dist/src/snapshot.js +2 -2
- package/dist/src/web.js +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.1.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.1.apk.sha256 +0 -1
- package/dist/src/432.js +0 -4
package/dist/src/6849.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AppError as e}from"./485.js";function t(e){return"xctest"===e||"android"===e||"macos-helper"===e||"linux-atspi"===e||"web"===e}function r(e){return void 0===e||"xctest"===e||"android"===e}function n(e){return e.map((e,t)=>({...e,ref:`e${t+1}`}))}function
|
|
1
|
+
import{AppError as e}from"./485.js";function t(e){return"xctest"===e||"android"===e||"macos-helper"===e||"linux-atspi"===e||"web"===e}function r(e){return void 0===e||"xctest"===e||"android"===e}function n(e){return e.map((e,t)=>({...e,ref:`e${t+1}`}))}function o(e){let t=e.trim();return t.startsWith("@")?t.slice(1)||null:t.startsWith("e")?t:null}function i(e,t){return e.find(e=>e.ref===t)??null}function a(e){return JSON.stringify({interactiveOnly:e?.interactiveOnly===!0,depth:"number"==typeof e?.depth?e.depth:null,scope:e?.scope?.trim()||null,raw:e?.raw===!0})}function l(e){if(e)return{depth:e.snapshotDepth,interactiveOnly:e.snapshotInteractiveOnly,raw:e.snapshotRaw,scope:e.snapshotScope}}function s(e){return{x:Math.round(e.x+e.width/2),y:Math.round(e.y+e.height/2)}}let c=["ios","ipados","tvos","watchos","visionos","macos"],u=["apple","android","linux","web"],d=["ios","macos","android","linux","web"],m=[...u,"ios","macos"],p=["mobile","tv","desktop"];function f(e){return"apple"===e||"ios"===e||"macos"===e}function v(e){return"macos"===e.appleOs||"macos"===e.platform}function h(e){return f(e.platform)&&!v(e)}function S(e){return"android"===e.platform||f(e.platform)&&!v(e)}function O(e){return f(e.platform)?v(e)?"macos":"ios":e.platform}function b(e){return"macos"===e?{platform:"apple",appleOs:"macos"}:"ios"===e?{platform:"apple"}:{platform:e}}function E(e){return f(e.platform)&&"tv"===e.target}function N(e){return d.includes(e)}function g(e){return c.includes(e)}function w(e,t){return!t||("apple"===t?f(e.platform):"ios"===t?f(e.platform)&&!v(e):"macos"===t?f(e.platform)&&v(e):e.platform===t)}function y(e,t){return t?function(e){switch(e){case"tvos":return"tvOS";case"macos":return"macOS";case"visionos":return"visionOS";default:return"iOS"}}(t):"macos"===e||"desktop"===e?"macOS":"tv"===e?"tvOS":"iOS"}function $(e){let{simulatorSetPath:t,platform:r,target:n}=e;if(t&&"macos"!==r&&"desktop"!==n)return t}function P(e){return e.map((e,t)=>({device:e,index:t})).sort((e,t)=>{var r,n;return r=e,n=t,R(r.device)-R(n.device)||Number(!0===n.device.booted)-Number(!0===r.device.booted)||r.device.name.localeCompare(n.device.name)||r.index-n.index}).map(({device:e})=>e)}async function _(t,r,n={}){let o=t.filter(e=>D(e,r));if(r.udid){let t=o.find(e=>e.id===r.udid&&f(e.platform));if(!t)throw new e("DEVICE_NOT_FOUND",`No Apple device with UDID ${r.udid}`);return t}if(r.serial){let t=o.find(e=>e.id===r.serial&&"android"===e.platform);if(!t)throw new e("DEVICE_NOT_FOUND",`No Android device with serial ${r.serial}`);return t}if(!0!==n.allowStoppedAndroidAvdPlaceholders&&(o=o.filter(e=>{var t;return!("android"===(t=e).platform&&"emulator"===t.kind&&!1===t.booted&&!/^emulator-\d+$/.test(t.id))})),r.deviceName){let t=A(r.deviceName),n=o.find(e=>A(e.name)===t);if(!n)throw new e("DEVICE_NOT_FOUND",`No device named ${r.deviceName}`);return n}C(o)&&(o=P(o));let i=o[0];if(void 0!==i&&1===o.length)return i;0===o.length&&x(r,n);let a=o.filter(e=>"device"!==e.kind),l=a.length>0?a:o,s=l.filter(e=>e.booted),c=s[0];if(c&&1===s.length&&!C(l))return c;let u=C(l)?l[0]:s[0]??l[0];return u||x(r,n),u}function D(e,t,r={}){var n,o;return w(e,t.platform)&&(!t.target||(e.target??"mobile")===t.target)&&(!r.includeExplicitSelectors||(n=e,(!(o=t).udid||!!(n.id===o.udid&&f(n.platform)))&&(!o.serial||n.id===o.serial&&"android"===n.platform)&&(!o.deviceName||A(n.name)===A(o.deviceName))))}function x(t,r){var n;let o=r.simulatorSetPath;if(o&&(!(n=t.platform)||"apple"===n||"ios"===n))throw new e("DEVICE_NOT_FOUND","No devices found in the scoped simulator set",{simulatorSetPath:o,hint:`The simulator set at "${o}" appears to be empty. Create a compatible simulator first with xcrun simctl --set "${o}" create, or remove the scoped simulator set.`,selector:t});throw new e("DEVICE_NOT_FOUND","No devices found",{selector:t})}function A(e){return e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim()}function R(e){return"simulator"===e.kind?F(e,0,1,2,3):"device"===e.kind&&f(e.platform)&&!v(e)?F(e,10,11,12,13):14}function F(e,t,r,n,o){var i;return({mobile:(i=e.name,/\bipad\b/i.test(i))?r:t,tv:n,desktop:o})[e.target??"mobile"]}function C(e){return e.length>0&&e.every(e=>f(e.platform))}let T=["summary","headers","body","all"],U=["digest","default","full"];function k(e){return void 0!==e&&"default"!==e}function I(e){return{parse:t=>e(t,"$")}}function M(e,t){throw Error(`${e}: ${t}`)}function L(e,t){return(!e||"object"!=typeof e||Array.isArray(e))&&M(t,"Expected an object"),e}function V(e,t){return"string"!=typeof e&&M(t,"Expected a string"),e}function j(e,t,r){let n=e[t];return void 0===n?void 0:V(n,`${r}.${t}`)}function K(e,t,r){let n=e[t];return void 0===n?void 0:L(n,`${r}.${t}`)}let H=I((e,t)=>{var r,n;let o,i=L(e,t);return{platform:function(e,t,r,n){let o=e[t];if(void 0!==o)return"string"==typeof o&&r.includes(o)||M(`${n}.${t}`,`Expected one of: ${r.join(", ")}`),o}(i,"platform",["ios","android"],t),metroHost:j(i,"metroHost",t),metroPort:void 0===(o=i[r="metroPort"])?void 0:(n=`${t}.${r}`,Number.isInteger(o)||M(n,"Expected an integer"),o),bundleUrl:j(i,"bundleUrl",t),launchUrl:j(i,"launchUrl",t)}}),W=I((e,t)=>{let r,n=L(e,t);return{jsonrpc:j(n,"jsonrpc",t),id:(null==(r=n.id)||"string"!=typeof r&&"number"!=typeof r&&M(`${t}.id`,"Expected a string, number, or null"),r),method:j(n,"method",t),params:n.params}}),B=I((e,t)=>{let r=L(e,t);return{token:j(r,"token",t),session:j(r,"session",t),command:j(r,"command",t),positionals:function(e,t,r){var n;let o=e[t];if(void 0!==o)return(n=`${r}.${t}`,!Array.isArray(o)&&M(n,"Expected an array"),o).map((e,n)=>V(e,`${r}.${t}[${String(n)}]`))}(r,"positionals",t),flags:K(r,"flags",t),runtime:K(r,"runtime",t),meta:K(r,"meta",t)}});export{p as DEVICE_TARGETS,T as NETWORK_INCLUDE_MODES,u as PLATFORMS,U as RESPONSE_LEVELS,n as attachRefs,a as buildSnapshotPresentationKey,s as centerOfRect,B as commandRpcParamsSchema,H as daemonRuntimeSchema,b as deviceFieldsFromPublicPlatform,m as device_PLATFORM_SELECTORS,i as findNodeByRef,g as isAppleOs,f as isApplePlatform,h as isIosFamily,v as isMacOs,S as isMobilePlatform,k as isNonDefaultResponseLevel,N as isPublicPlatform,t as isSnapshotBackend,E as isTvOsDevice,W as jsonRpcRequestSchema,D as matchesDeviceSelector,w as matchesPlatformSelector,o as normalizeRef,O as publicPlatformString,y as resolveApplePlatformName,$ as resolveAppleSimulatorSetPathForSelector,_ as resolveDevice,l as snapshotPresentationOptionsFromFlags,P as sortAppleDevicesForSelection,r as usesMobileSnapshotPresentation};
|
package/dist/src/7871.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"node:crypto";import t,{promises as n}from"node:fs";import a from"node:path";import{Worker as r}from"node:worker_threads";import{fileURLToPath as i}from"node:url";import{intersectArea as s,isSparseSnapshotQualityVerdict as o,clamp as l,isNodeVisibleInEffectiveViewport as d,publicSnapshotCaptureAnnotations as u,now as c,sleep as p,scrollCommand as h,longPressCommand as f,appendScreenshotScriptFlags as m,focusCommand as w,recordingQualityInputToExportQuality as g,displayLabel as b,squaredDistance as y,buildMobileSnapshotPresentation as k,renderSnapshotQualityWarnings as v,buildSnapshotDisplayLines as x,rectCenter as A,formatRole as M,toBackendResult as I,successText as R,normalizedRect as P,swipeCommand as N,expandRect as S,resolveInteractionTarget as O,unionRects as _,toBackendContext as D,snapshotCaptureAnnotationsFrom as E,requireIntInRange as T,formatReactNativeOverlayWarning as C,pinchCommand as U,formatSnapshotLine as L}from"./2948.js";import{emitDiagnostic as $}from"./432.js";import{asAppError as B,toAppErrorCode as q,AppError as G}from"./485.js";import{computeScreenshotDiffPixels as X,PNG as Y,toBuffer as F,decodePng as K}from"./4418.js";import{whichCmd as V,runCmd as z}from"./8875.js";import{normalizeRef as j,findNodeByRef as H,buildSnapshotPresentationKey as W,usesMobileSnapshotPresentation as J}from"./6849.js";import{findSelectorChainMatch as Z,extractNodeText as Q,findSnapshotAncestor as ee,buildSelectorChainForNode as et,resolveSelectorChain as en,findNodeByLabel as ea,resolveRefLabel as er,isNodeVisible as ei,extractReadableText as es,buildSnapshotNodeByIndex as eo,formatSelectorFailure as el,normalizeType as ed,isNodeEditable as eu,isFillableType as ec}from"./893.js";import{parseFindSelectorExpression as ep,findBestMatchesByLocator as eh,parseSelectorChain as ef}from"./587.js";import{resolveAppsFilter as em,assertResolvedAppsFilter as ew}from"./2748.js";let eg=/^-?\d+(\.\d+)?$/,eb=/^[^\s"\\]+$/,ey=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),ek=new Map([["--count","count"],["--pause-ms","pauseMs"]]),ev=new Map([["--delay-ms","delayMs"]]);function ex(e){return"click"===e||"press"===e}function eA(e){return ex(e)||"longpress"===e}function eM(e){return"type"===e||"fill"===e}function eI(e){return eP(e,eN)}function eR(e){return JSON.stringify(e)}function eP(e,t){return t(e)?e:eR(e)}function eN(e){return eS(e)&&e.startsWith("@")||eg.test(e)}function eS(e){return eb.test(e)}function eO(e){let t=(e.positionals??[]).map(e=>eI(e));return[e.command,...t].join(" ")}function e_(e,t){let n=t.flags??{};if(ex(t.command)){"number"==typeof n.count&&e.push("--count",String(n.count)),"number"==typeof n.intervalMs&&e.push("--interval-ms",String(n.intervalMs)),"number"==typeof n.holdMs&&e.push("--hold-ms",String(n.holdMs)),"number"==typeof n.jitterPx&&e.push("--jitter-px",String(n.jitterPx)),!0===n.doubleTap&&e.push("--double-tap");let t=n.clickButton;t&&"primary"!==t&&e.push("--button",t);return}if("swipe"===t.command){"number"==typeof n.count&&e.push("--count",String(n.count)),"number"==typeof n.pauseMs&&e.push("--pause-ms",String(n.pauseMs)),("one-way"===n.pattern||"ping-pong"===n.pattern)&&e.push("--pattern",n.pattern);return}eM(t.command)&&"number"==typeof n.delayMs&&e.push("--delay-ms",String(n.delayMs))}function eD(e,t){t&&(("ios"===t.platform||"android"===t.platform)&&e.push("--platform",t.platform),"string"==typeof t.metroHost&&t.metroHost.length>0&&e.push("--metro-host",eP(t.metroHost,eS)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",eP(t.bundleUrl,eS)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",eP(t.launchUrl,eS)))}function eE(e,t){let n=[],a={},r=ex(e)?ey:"swipe"===e?ek:eM(e)?ev:void 0;for(let i=0;i<t.length;i+=1){let s=t[i];if(ex(e)&&"--double-tap"===s){a.doubleTap=!0;continue}let o=t[i+1];if(ex(e)&&"--button"===s&&void 0!==o){("primary"===o||"secondary"===o||"middle"===o)&&(a.clickButton=o),i+=1;continue}let l=r?.get(s);if(l&&void 0!==o){let e=eC(o);if(null!==e){a[l]=e,i+=1;continue}}if("swipe"===e&&"--pattern"===s&&void 0!==o){("one-way"===o||"ping-pong"===o)&&(a.pattern=o),i+=1;continue}n.push(s)}return{positionals:n,flags:a}}function eT(e){let t=[],n={};for(let a=0;a<e.length;a+=1){let r=e[a],i=e[a+1];if("--platform"===r&&void 0!==i){("ios"===i||"android"===i)&&(n.platform=i),a+=1;continue}if("--metro-host"===r&&void 0!==i){n.metroHost=i,a+=1;continue}if("--metro-port"===r&&void 0!==i){let e=eC(i);null!==e&&(n.metroPort=e),a+=1;continue}if("--bundle-url"===r&&void 0!==i){n.bundleUrl=i,a+=1;continue}if("--launch-url"===r&&void 0!==i){n.launchUrl=i,a+=1;continue}t.push(r)}return{positionals:t,flags:n}}function eC(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function eU(e){var t;let n=[],a={};for(let t of e){if("--relaunch"===t){a.relaunch=!0;continue}n.push(t)}let r=eT(n);return{positionals:r.positionals,flags:a,runtime:(t=r.flags).platform||t.metroHost||void 0!==t.metroPort||t.bundleUrl||t.launchUrl?r.flags:void 0}}function eL(e,t={}){let n=[e.command];if("snapshot"===e.command)e.flags?.snapshotInteractiveOnly&&n.push("-i"),"number"==typeof e.flags?.snapshotDepth&&n.push("-d",String(e.flags.snapshotDepth)),e.flags?.snapshotScope&&n.push("-s",eI(e.flags.snapshotScope)),e.flags?.snapshotRaw&&n.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])n.push(eI(t));e.flags?.relaunch&&n.push("--relaunch"),eD(n,e.runtime)}else if("runtime"===e.command)!function(e,t,n={}){let a=t.positionals??[];for(let t of n.includeAllPositionals?a:a.slice(0,1))e.push(eP(t,eS));eD(e,t.flags)}(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals});else if("record"===e.command)!function(e,t){let[n,...a]=t.positionals??[];for(let t of(n&&e.push(eP(n,eS)),a))e.push(eI(t));"number"==typeof t.flags?.fps&&e.push("--fps",String(t.flags.fps)),"number"==typeof t.flags?.screenshotMaxSize&&e.push("--max-size",String(t.flags.screenshotMaxSize)),("number"==typeof t.flags?.quality||"string"==typeof t.flags?.quality)&&e.push("--quality",String(t.flags.quality)),t.flags?.hideTouches&&e.push("--hide-touches")}(n,e);else if("screenshot"===e.command){for(let t of e.positionals??[])n.push(eI(t));m(n,e.flags)}else{for(let t of e.positionals??[])n.push(eI(t));e_(n,e)}return n.join(" ")}function e$(t,n){let a=e.createHash("sha256").update(t).digest(),r=e.createHash("sha256").update(n).digest();return e.timingSafeEqual(a,r)}let eB={browserStack:"browserstack",awsDeviceFarm:"aws-device-farm"},eq=new Set(Object.values(eB));function eG(e){return void 0!==e&&eq.has(e)}let eX=["status","get","dismiss","enter","return"];function eY(e){return eX.includes(e)}function eF(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith("@")||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}class eK extends Error{}let eV=null,ez=!1,ej=!1,eH=0,eW=new Map;function eJ(e){ez=!0,ej||(ej=!0,$({level:"warn",phase:"png_worker_unavailable",data:{reason:e}}),process.emitWarning(`PNG worker unavailable, falling back to in-process PNG processing: ${e}`))}function eZ(e){let t=eW.get(e.id);t&&(eW.delete(e.id),e1(),e.ok?t.resolve(e.result):t.reject(new G(q(e.error.code),e.error.message,e.error.details)))}function eQ(e,t){eV===e&&(eJ(t.message),eV=null,e.terminate().catch(()=>{}),e0(new eK(`PNG worker failed: ${t.message}`)))}function e0(e){let t=[...eW.values()];for(let n of(eW.clear(),t))n.reject(e)}function e1(){eV&&(eW.size>0?eV.ref():eV.unref())}function e2(){if(ez)return null;if(eV)return eV;let e=function(e,n){try{let r=i(e),s=a.extname(r)||".js";return[a.join(a.dirname(r),`${n}${s}`),a.join(a.dirname(r),"internal",`${n}${s}`)].find(e=>t.existsSync(e))??null}catch{return null}}(import.meta.url,"png-worker");if(!e)return eJ("worker entry module not found next to the current module"),null;try{let t=new r(e,{execArgv:e.endsWith(".ts")?["--experimental-strip-types"]:[]});return t.on("message",eZ),t.on("error",e=>{eQ(t,e)}),t.on("exit",e=>{eQ(t,Error(`PNG worker exited with code ${e}`))}),t.unref(),eV=t,t}catch(e){return eJ(`failed to spawn worker: ${e instanceof Error?e.message:String(e)}`),null}}async function e4(e,t){try{return await function(e){let t=e2();if(!t)return Promise.reject(new eK("PNG worker is unavailable"));let n=eH+=1;return new Promise((a,r)=>{eW.set(n,{resolve:a,reject:r}),e1();try{t.postMessage({...e,id:n})}catch(e){eW.delete(n),e1(),r(new eK(`failed to post job to PNG worker: ${e instanceof Error?e.message:String(e)}`))}})}(e)}catch(e){if(e instanceof eK)return t();throw e}}function e3(){e2()}async function e5(){let e=eV;eV=null,e0(new eK("PNG worker terminated")),e&&await e.terminate()}async function e8(e,t){let n=await e4({kind:"decode",png:e,label:t},()=>{let n=K(e,t);return{kind:"decode",width:n.width,height:n.height,data:n.data}});return new Y({width:n.width,height:n.height,data:F(n.data)})}async function e6(e){return F((await e4({kind:"encode",width:e.width,height:e.height,data:e.data},()=>({kind:"encode",png:Y.sync.write(e)}))).png)}async function e9(e){let{kind:t,...n}=await e4({kind:"diff-pixels",...e},()=>({kind:"diff-pixels",...X(e)}));return{...n,diffData:F(n.diffData)}}let e7=[0,187,255,255];function te(e,t,n,a){if(t<0||t>=e.width||n<0||n>=e.height)return;let r=(n*e.width+t)*4;e.data[r]=a[0],e.data[r+1]=a[1],e.data[r+2]=a[2],e.data[r+3]=a[3]}function tt(e,t,n){return Math.min(Math.max(e,t),n)}let tn=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function ta(e){let{mask:t,width:n,height:a,hooks:r}=e,i=new Uint8Array(t.length),s=new Int32Array(t.length),o=[];for(let e=0;e<t.length;e+=1){var l,d;if(!tr(t,i,e))continue;let u=0,c=(l=s,i[d=e]=1,l[0]=d,1),p=r.create(e);for(;u<c;){let e=s[u];u+=1,r.visit(p,e),c=function(e){let{mask:t,visited:n,queue:a,width:r,height:i,pixelIndex:s}=e,o=s%r,l=Math.floor(s/r),d=e.queueEnd;for(let e of tn){var u,c,p,h;let s=o+e.x,f=l+e.y;if(u=s,c=f,p=r,h=i,!(u>=0)||!(u<p)||!(c>=0)||!(c<h))continue;let m=f*r+s;tr(t,n,m)&&(d=function(e,t,n,a){return t[a]=1,e[n]=a,n+1}(a,n,d,m))}return d}({mask:t,visited:i,queue:s,queueEnd:c,width:n,height:a,pixelIndex:e})}o.push(p)}return o}function tr(e,t,n){return 1===e[n]&&1!==t[n]}let ti={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},ts={leading:20,trailing:20,separator:10,unknown:0,background:-30};function to(e){return"background"!==e.likelyKind}function tl(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function td(e,t){let n,a=0;for(let r of t){let t=tf(e,r.rect);t<=a||(a=t,n=r)}return n}function tu(e){let t=[];for(let n of[...e].sort((e,t)=>e.rect.y-t.rect.y)){let e=t.find(e=>{var t,a;return t=e.rect,tf(t,a=n.rect)>0||Math.abs(A(t).y-A(a).y)<=.5*Math.max(t.height,a.height)});if(!e){t.push({rect:n.rect,blocks:[n]});continue}e.blocks.push(n),e.blocks.sort((e,t)=>e.rect.x-t.rect.x),e.rect=_([e.rect,n.rect])}return t}function tc(e,t){let n,a=A(e);for(let e of t){let t=Math.sqrt(y(a,A(e.rect)));n&&t>=n.distance||(n={block:e,distance:t})}return n}function tp(e){let t=th(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function th(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function tf(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}async function tm(e){if(await V("tesseract"))try{let[t,n]=await Promise.all([tg(e.baselinePath),tg(e.currentPath)]);if(0!==t.exitCode||0!==n.exitCode)return;let a=tw(t.stdout,e.width,e.height),r=tw(n.stdout,e.width,e.height),i=function(e,t){let n=new Set,a=[];for(let i of e){var r;let e=tA(i.text),s=function(e,t,n,a){let r=null,i=1/0;for(let s=0;s<n.length;s+=1){if(a.has(s))continue;let o=n[s];if(tA(o.text)!==t)continue;let l=A(e.normalizedRect),d=y(l,A(o.normalizedRect));d>=i||(r=s,i=d)}return r}(i,e,t,n);if(null===s)continue;n.add(s);let o=function(e,t){let n={x:t.rect.x-e.rect.x,y:t.rect.y-e.rect.y,width:t.rect.width-e.rect.width,height:t.rect.height-e.rect.height},a=tR(t.rect.width/e.rect.width),r=tR(t.rect.height/e.rect.height),i=Math.abs(a-1)>=.08||Math.abs(r-1)>=.12;return{text:e.text,baselineRect:e.rect,currentRect:t.rect,delta:n,confidence:Math.round(100*Math.min(e.confidence,t.confidence))/100,possibleTextMetricMismatch:i}}(i,t[s]);r=o,(Math.abs(r.delta.x)>=2||Math.abs(r.delta.y)>=2||Math.abs(r.delta.width)>=2||Math.abs(r.delta.height)>=2||r.possibleTextMetricMismatch)&&a.push(o)}return a.sort((e,t)=>tb(t)-tb(e)).slice(0,12)}(a,r),s=function(e){let t=[];for(let n of[...e].sort((e,t)=>e.currentRect.y-t.currentRect.y)){let e=t.find(e=>32>=Math.abs(n.delta.x-tM(e.map(e=>e.delta.x))));e?e.push(n):t.push([n])}return t.filter(e=>e.length>=2).map(ty).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>tk(t)-tk(e)).slice(0,4)}(i);if(0===a.length&&0===r.length)return;return{provider:"tesseract",baselineBlocks:a.length,currentBlocks:r.length,baselineBlocksRaw:a,currentBlocksRaw:r,matches:i,...s.length>0?{movementClusters:s}:{}}}catch{return}}function tw(e,t,n){let[a,...r]=e.split(/\r?\n/);if(!a)return[];let i=new Map(a.split(" ").map((e,t)=>[e,t])),s=[];for(let e of r){var o;if(!e.trim())continue;let t=e.split(" "),n=tx(t,i,"level"),a=tv(t,i,"text").trim(),r=tx(t,i,"conf");if(5!==n||(o=a,!/[\p{L}\p{N}]/u.test(o))||r<0)continue;let l=tx(t,i,"left"),d=tx(t,i,"top"),u=tx(t,i,"width"),c=tx(t,i,"height");u<=0||c<=0||s.push({key:[tv(t,i,"page_num"),tv(t,i,"block_num"),tv(t,i,"par_num"),tv(t,i,"line_num")].join(":"),text:a,confidence:r,rect:{x:l,y:d,width:u,height:c}})}let l=new Map;for(let e of s){let t=l.get(e.key);t?t.push(e):l.set(e.key,[e])}return Array.from(l.values()).flatMap(e=>(function(e){let t=[...e].sort((e,t)=>e.rect.x-t.rect.x),n=[],a=[];for(let e of t){let t=a.at(-1);if(!t){a.push(e);continue}if(e.rect.x-(t.rect.x+t.rect.width)>Math.max(48,2.5*Math.max(t.rect.height,e.rect.height))){n.push(a),a=[e];continue}a.push(e)}return a.length>0&&n.push(a),n})(e)).map(e=>(function(e,t,n){if(0===e.length)return null;let a=[...e].sort((e,t)=>e.rect.x-t.rect.x),r=_(a.map(e=>e.rect)),i=Math.round(100*tM(a.map(e=>e.confidence)))/100;return{text:a.map(e=>e.text).join(" "),confidence:i,rect:r,normalizedRect:P({x:tI(r.x/t),y:tI(r.y/n),width:tI(r.width/t),height:tI(r.height/n)})}})(e,t,n)).filter(e=>null!==e)}function tg(e){return z("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function tb(e){return Math.abs(e.delta.x)+Math.abs(e.delta.y)+Math.abs(e.delta.width)+Math.abs(e.delta.height)+25*!!e.possibleTextMetricMismatch}function ty(e){let t=e.map(e=>e.delta.x),n=e.map(e=>e.delta.y);return{texts:e.map(e=>e.text),xRange:{min:Math.min(...t),max:Math.max(...t)},yRange:{min:Math.min(...n),max:Math.max(...n)}}}function tk(e){return 2*Math.abs((e.xRange.min+e.xRange.max)/2)+Math.abs((e.yRange.min+e.yRange.max)/2)}function tv(e,t,n){let a=t.get(n);return void 0===a?"":e[a]??""}function tx(e,t,n){let a=Number(tv(e,t,n));return Number.isFinite(a)?a:0}function tA(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function tM(e){return e.reduce((e,t)=>e+t,0)/e.length}function tI(e){return Math.round(100*e*100)/100}function tR(e){return Math.round(1e3*e)/1e3}function tP(e,t,n,a){return{r:Math.round(e/a),g:Math.round(t/a),b:Math.round(n/a)}}function tN(e){return .2126*e.r+.7152*e.g+.0722*e.b}function tS(e){return`#${tO(e.r)}${tO(e.g)}${tO(e.b)}`}function tO(e){return e.toString(16).padStart(2,"0")}function t_(e){return Math.round(100*e*100)/100}let tD=255*Math.sqrt(3);async function tE(e,t,r={}){var i,o,d,u,c;let p,h,f,m;await tT(e,"Baseline image not found"),await tT(t,"Current screenshot not found");let w=r.outputPath,[g,b]=await Promise.all([n.readFile(e),n.readFile(t)]),[y,k]=await Promise.all([e8(g,"baseline screenshot"),e8(b,"current screenshot")]);tC(y.width,y.height,"baseline screenshot",r.maxPixels),tC(k.width,k.height,"current screenshot",r.maxPixels);let v=r.threshold??.1;if(y.width!==k.width||y.height!==k.height){let e=y.width*y.height;return await tU(r.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:y.width,height:y.height},actual:{width:k.width,height:k.height}}}}let x=y.width*y.height,{diffData:A,diffMask:M,differentPixels:I}=await e9({width:y.width,height:y.height,baselineData:y.data,currentData:k.data,maxColorDistance:v*tD}),R=I>0?(o=(p=function(e){let{diffMask:t,baseline:n,current:a}=e,{width:r,height:i}=n;return ta({mask:t,width:r,height:i,hooks:{create:e=>{var t,n;let a,i;return a=(t=e)%(n=r),{minX:a,minY:i=Math.floor(t/n),maxX:a,maxY:i,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}},visit:(e,t)=>{var i,s,o,l,d;let u,c,p;return i=e,s=t,o=r,l=n,d=a,u=s%o,c=Math.floor(s/o),p=4*s,void(i.minX=Math.min(i.minX,u),i.minY=Math.min(i.minY,c),i.maxX=Math.max(i.maxX,u),i.maxY=Math.max(i.maxY,c),i.differentPixels+=1,i.baselineRed+=l.data[p],i.baselineGreen+=l.data[p+1],i.baselineBlue+=l.data[p+2],i.currentRed+=d.data[p],i.currentGreen+=d.data[p+1],i.currentBlue+=d.data[p+2])}}})}(i={diffMask:M,baseline:y,current:k,totalPixels:x,differentPixels:I,maxRegions:r.maxRegions})).length<=2e3?function(e){let t=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return 0!==n?n:e.minX-t.minX})){var n,a;let e=t.find(e=>{var t,n,a;return t=e,n=r,a=12,t.minX-a<=n.maxX&&n.minX-a<=t.maxX&&t.minY-a<=n.maxY&&n.minY-a<=t.maxY});if(!e){t.push({...r});continue}n=e,a=r,n.minX=Math.min(n.minX,a.minX),n.minY=Math.min(n.minY,a.minY),n.maxX=Math.max(n.maxX,a.maxX),n.maxY=Math.max(n.maxY,a.maxY),n.differentPixels+=a.differentPixels,n.baselineRed+=a.baselineRed,n.baselineGreen+=a.baselineGreen,n.baselineBlue+=a.baselineBlue,n.currentRed+=a.currentRed,n.currentGreen+=a.currentGreen,n.currentBlue+=a.currentBlue}return t}(p):p,o.flatMap(e=>{var t,n,a;let r;return(t=e,n=i.baseline.width,a=i.baseline.height,r=t.maxX-t.minX+1,t.maxY-t.minY+1>=Math.max(48,Math.round(.07*a))&&r>=.35*n)?function(e,t,n){var a;let r=function(e,t){let n=[],a=null;for(let r=0;r<e.length;r+=1){if(e[r]<=t){a??=r;continue}null!==a&&(r-a>=6&&n.push([a,r-1]),a=null)}return null!==a&&e.length-a>=6&&n.push([a,e.length-1]),n}((a=function(e,t,n){let a=[];for(let r=e.minY;r<=e.maxY;r+=1){let i=0;for(let a=e.minX;a<=e.maxX;a+=1)1===t[r*n+a]&&(i+=1);a.push(i)}return a}(e,t.diffMask,t.baseline.width)).map((e,t)=>{let n=0,r=0,i=Math.max(0,t-3),s=Math.min(a.length-1,t+3);for(let e=i;e<=s;e+=1)n+=a[e],r+=1;return Math.round(n/r)}),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),i=function(e,t,n){let a=[],r=e.minY;for(let[i,s]of t){let t=e.minY+Math.round((i+s)/2);t-r+1<n||e.maxY-t<n||(a.push([r,t]),r=t+1)}return a.push([r,e.maxY]),a}(e,r,n);if(i.length<=1)return[e];let s=i.map(([n,a])=>(function(e,t,n,a){let r=null;for(let o=t;o<=n;o+=1)for(let t=e.minX;t<=e.maxX;t+=1){var i,s;let e=o*a.baseline.width+t;1===a.diffMask[e]&&function(e,t,n,a,r,i){let s=4*t;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,a),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,a),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}(r??={minX:i=t,minY:s=o,maxX:i,maxY:s,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0},e,t,o,a.baseline,a.current)}return r})(e,n,a,t)).filter(e=>null!==e);return s.length>1?s:[e]}(e,i,Math.max(24,Math.round(.03*i.baseline.height))):[e]})).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(0!==n)return n;let a=e.minY-t.minY;return 0!==a?a:e.minX-t.minX}).slice(0,Math.max(0,i.maxRegions??8)).map((e,t)=>{var n,a,r,s,o,l,d,u,c,p,h;let f,m,w,g,b,y,k,v,x,A,M,I,R,N,S,O,_;return n=e,a=t+1,r={width:i.baseline.width,height:i.baseline.height,totalPixels:i.totalPixels,differentPixels:i.differentPixels},y={x:n.minX,y:n.minY,width:n.maxX-n.minX+1,height:n.maxY-n.minY+1},k={x:Math.round(n.minX+y.width/2),y:Math.round(n.minY+y.height/2)},v=tP(n.baselineRed,n.baselineGreen,n.baselineBlue,n.differentPixels),x=tP(n.currentRed,n.currentGreen,n.currentBlue,n.differentPixels),A=y.width*y.height,M=t_(n.differentPixels/A),I=Math.round(tN(v)),R=Math.round(tN(x)),N=(s=y,o=r.width,l=r.height,s.width>=.55*o&&s.height>=.12*l?"large-area":s.width>=2.5*s.height?"horizontal-band":s.height>=2.5*s.width?"vertical-band":"compact"),S=(f=A/r.totalPixels)>=.04?"large":f>=.01?"medium":"small",O=(d=v,u=x,m=tN(d),Math.abs(w=tN(u)-m)>=12?w>0?"brighter":"darker":Math.max(Math.abs(u.r-d.r),Math.abs(u.g-d.g),Math.abs(u.b-d.b))>=12?"color-shift":"mixed"),_=(c=k,p=r.width,h=r.height,g=c.x<p/3?"left":c.x>2*p/3?"right":"center",b=c.y<h/3?"top":c.y>2*h/3?"bottom":"middle","center"===g&&"middle"===b?"center":`${b}-${g}`),{index:a,rect:y,normalizedRect:P({x:t_(y.x/r.width),y:t_(y.y/r.height),width:t_(y.width/r.width),height:t_(y.height/r.height)}),differentPixels:n.differentPixels,shareOfDiffPercentage:t_(n.differentPixels/r.differentPixels),densityPercentage:M,shape:N,size:S,location:_,averageBaselineColorHex:tS(v),averageCurrentColorHex:tS(x),baselineLuminance:I,currentLuminance:R,dominantChange:O}}):[];if(I>0&&w){let e=new Y({width:y.width,height:y.height,data:A});for(let t of R)t.rect.width<4||t.rect.height<4||function(e,t){let n=tt(t.x,0,e.width-1),a=tt(t.y,0,e.height-1),r=tt(t.x+t.width-1,0,e.width-1),i=tt(t.y+t.height-1,0,e.height-1);for(let t=0;t<2;t+=1){for(let s=n;s<=r;s+=1)te(e,s,a+t,e7),te(e,s,i-t,e7);for(let s=a;s<=i;s+=1)te(e,n+t,s,e7),te(e,r-t,s,e7)}}(e,t.rect);await n.mkdir(a.dirname(w),{recursive:!0}),await n.writeFile(w,await e6(e))}else await tU(r.outputPath);let N=I>0?await tm({baselinePath:e,currentPath:t,width:y.width,height:y.height}):void 0,O=N&&(N.matches.length>0||(N.movementClusters?.length??0)>0)?{provider:N.provider,baselineBlocks:N.baselineBlocks,currentBlocks:N.currentBlocks,matches:N.matches,...N.movementClusters?{movementClusters:N.movementClusters}:{}}:void 0,_=I>0&&N?(h=function(e){let t=[];for(let n of e.sort((e,t)=>e.minY-t.minY||e.minX-t.minX)){let e=t.find(e=>{var t,a,r;return t=e,a=n,r=10,t.minX-r<=a.maxX&&a.minX-r<=t.maxX&&t.minY-r<=a.maxY&&a.minY-r<=t.maxY});if(!e){t.push({...n});continue}e.minX=Math.min(e.minX,n.minX),e.minY=Math.min(e.minY,n.minY),e.maxX=Math.max(e.maxX,n.maxX),e.maxY=Math.max(e.maxY,n.maxY),e.differentPixels+=n.differentPixels}return t}((u=function(e,t,n,a){let r=new Uint8Array(e);if(!a)return r;for(let e of[...a.baselineBlocksRaw,...a.currentBlocksRaw])!function(e,t,n,a){let r=l(Math.floor(a.x),0,t-1),i=l(Math.floor(a.y),0,n-1),s=l(Math.ceil(a.x+a.width),0,t),o=l(Math.ceil(a.y+a.height),0,n);for(let n=i;n<o;n+=1)for(let a=r;a<s;a+=1)e[n*t+a]=0}(r,t,n,S(e.rect,8));return r}((d={diffMask:M,width:y.width,height:y.height,regions:R,ocr:N}).diffMask,d.width,d.height,d.ocr),c=d.width,ta({mask:u,width:c,height:d.height,hooks:{create:e=>{var t,n;let a,r;return a=(t=e)%(n=c),{minX:a,minY:r=Math.floor(t/n),maxX:a,maxY:r,differentPixels:0}},visit:(e,t)=>{var n,a,r;let i,s;return n=e,i=(a=t)%(r=c),s=Math.floor(a/r),void(n.minX=Math.min(n.minX,i),n.minY=Math.min(n.minY,s),n.maxX=Math.max(n.maxX,i),n.maxY=Math.max(n.maxY,s),n.differentPixels+=1)}}}))),f=tu(d.ocr?.currentBlocksRaw??[]),m=tu(d.ocr?.baselineBlocksRaw??[]),h.filter(tp).map(e=>{var t,n,a,r,i,o,l,u,c,p,h;let w,g,b,y,k,v,x,A,M,I;return t=e,n=d,a=f,r=m,y=function(e,t){let n,a=0;for(let r of t){let t=s(e,r.rect);t<=a||(a=t,n=r)}return n?.index}(b=th(t),n.regions),k=function(e,t,n){let a=td(e,t);if(a)return tc(e,a.blocks);let r=td(e,n);return r?tc(e,r.blocks):void 0}(b,a,r),v=function(e,t,n){if(e.height<=3&&e.width>=.12*n)return"separator";if(!t)return e.width>=.4*n?"background":"unknown";if(e.width>=.4*n)return"background";let a=e.x+e.width/2,r=t.x+t.width/2;return a<r-t.width/2?"leading":a>r+t.width/2?"trailing":e.width>=.35*n?"background":"unknown"}(b,k?.block.rect,n.width),x=(i=b,o=v,l=t.differentPixels,u=n,w=i.width/i.height,g=l/(i.width*i.height),"separator"===o?"separator":"background"===o?"background":"trailing"===o&&w>=1.5&&w<=3.8&&g>=.35?"toggle":"trailing"===o&&i.width<=.06*u.width&&i.height<=.04*u.height?"chevron":"leading"===o&&w>=.55&&w<=1.8?"icon":tl(i,u)?"background":"visual"),A={...y?{regionIndex:y}:{},slot:v,likelyKind:x,rect:b},{...y?{regionIndex:y}:{},slot:v,likelyKind:x,rect:b,...k?{nearestText:k.block.text.trim().replace(/^[^\p{L}\p{N}]+/u,"").replace(/^\p{L}\s+/u,"")}:{},score:(c=A,p=t.differentPixels,h=n,M=tl(c.rect,h)?-35:0,I=20*!!c.regionIndex,ti[c.likelyKind]+ts[c.slot]+I+M+Math.min(20,p/200))}}).filter(e=>e.rect.y>=.08*d.height).filter(to).sort((e,t)=>t.score-e.score).slice(0,Math.max(0,d.maxDeltas??12)).map((e,t)=>{var n;return n=e,{index:t+1,...n.regionIndex?{regionIndex:n.regionIndex}:{},slot:n.slot,likelyKind:n.likelyKind,rect:n.rect,...n.nearestText?{nearestText:n.nearestText}:{}}})):[],D=x>0?Math.round(I/x*1e4)/100:0;return{...I>0&&w?{diffPath:w}:{},...R.length>0?{regions:R}:{},...O?{ocr:O}:{},..._.length>0?{nonTextDeltas:_}:{},totalPixels:x,differentPixels:I,mismatchPercentage:D,match:0===I}}async function tT(e,t){try{await n.access(e)}catch{throw new G("INVALID_ARGS",`${t}: ${e}`)}}function tC(e,t,n,a){if(null==a||a<=0)return;let r=e*t;if(!(r<=a))throw new G("INVALID_ARGS",`${n} is ${r} pixels, which exceeds the configured maxImagePixels limit of ${a}`)}async function tU(e){if(e)try{await n.unlink(e)}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function tL(e){return e.width*e.height}function t$(e){return Math.round(100*e*100)/100}async function tB(e,t,n){if("path"===t.kind&&!e.policy.allowLocalInputPaths)throw new G("INVALID_ARGS",`Local ${n.field??"input"} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,n)}catch(e){throw B(e)}}async function tq(e,t,n){if(t?.kind==="path"&&!e.policy.allowLocalOutputPaths)throw new G("INVALID_ARGS","Local output paths are not allowed by command policy");try{return await e.artifacts.reserveOutput(t,{...n,visibility:n.visibility??"client-visible",requestedClientPath:t?.kind==="downloadableArtifact"?t.clientPath??n.requestedClientPath:n.requestedClientPath})}catch(e){throw B(e)}}async function tG(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw B(e)}}let tX=async(e,t)=>{let n,a,r;if(!t.baseline)throw new G("INVALID_ARGS","diff screenshot requires a baseline image");let i=function(e){if(null==e||""===e)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new G("INVALID_ARGS","--threshold must be a number between 0 and 1");return t}(t.threshold),s=t.current??{kind:"live"};if(t.overlayRefs&&!tH(s))throw new G("INVALID_ARGS","diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs");let o=await tB(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),l=[];try{let d;d=tH(s)?(a=await tY(e,t)).path:(n=await tB(e,s,{usage:"diff screenshot current",field:"current"})).path,r=t.out?await tq(e,t.out,{field:"diffPath",ext:".png"}):void 0;let u=await tE(o.path,d,{threshold:i,outputPath:r?.path,maxPixels:e.policy.maxImagePixels});tH(s)&&(u=await tF(e,t,r?.path,u,l));let c=u.diffPath?await r?.publish():void 0;return c&&l.push(c),u.diffPath||await r?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await r?.cleanup?.(),e}finally{await o.cleanup?.(),await n?.cleanup?.(),await a?.cleanup?.()}};async function tY(e,t){let n=await tG(e,{prefix:"agent-device-diff-current",ext:".png"});try{await tK(e,t,n.path,tV(t))}catch(e){throw await n.cleanup(),e}return n}async function tF(e,t,n,a,r){var i,o,l,d;if(!t.overlayRefs)return a;if(a.match||a.dimensionMismatch)return n&&await tj(n),a;let u=(i=t,o=n,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:tz(o??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:tz(i.out.clientPath)}:{},...i.out.fileName?{fileName:tz(i.out.fileName)}:{}}:void 0),c=await tq(e,u,{field:"currentOverlayPath",ext:".png"});try{let n=await tK(e,t,c.path,{overlayRefs:!0,...tV(t)}),i=await c.publish();return i&&r.push(i),{...a,currentOverlayPath:n.path??c.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...a.regions&&n.overlayRefs?{regions:(l=a.regions,d=n.overlayRefs,l.map(e=>{var t,n;let a,r=(t=e,n=d,a=tL(t.rect),n.map(e=>{let n=e.overlayRect,r=s(t.rect,n);return r<=0?null:{ref:e.ref,...e.label?{label:e.label}:{},rect:n,overlayCoveragePercentage:t$(r/tL(n)),regionCoveragePercentage:t$(r/a)}}).filter(e=>null!==e).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return 0!==n?n:t.overlayCoveragePercentage-e.overlayCoveragePercentage}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage})));return r.length>0?{...e,currentOverlayMatches:r}:e}))}:{}}}catch(e){throw await c.cleanup?.(),e}}async function tK(e,t,n,a={}){if(!e.backend.captureScreenshot)throw new G("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,a)??{}}function tV(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function tz(e){let t=a.extname(e),n=t?e.slice(0,-t.length):e;return`${n}.current-overlay${t||".png"}`}async function tj(e){try{await n.unlink(tz(e))}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function tH(e){return"live"===e.kind}async function tW(e,t){if(!Number.isInteger(t)||t<1)throw new G("INVALID_ARGS","Screenshot max size must be a positive integer");let a=await e8(await n.readFile(e),"screenshot"),r=Math.max(a.width,a.height);if(r<=t)return;let i=t/r,s=Math.max(1,Math.round(a.width*i)),o=Math.max(1,Math.round(a.height*i)),l=function(e,t,n){let a=new Y({width:t,height:n});for(let r=0;r<n;r+=1){let i=r*e.height/n,s=(r+1)*e.height/n;for(let n=0;n<t;n+=1){let o=n*e.width/t,l=(n+1)*e.width/t,d=0,u=0,c=0,p=0,h=0;for(let t=Math.floor(i);t<Math.ceil(s);t+=1){let n=Math.min(t+1,s)-Math.max(t,i);for(let a=Math.floor(o);a<Math.ceil(l);a+=1){let r=n*(Math.min(a+1,l)-Math.max(a,o)),i=(t*e.width+a)*4;d+=(e.data[i]??0)*r,u+=(e.data[i+1]??0)*r,c+=(e.data[i+2]??0)*r,p+=(e.data[i+3]??0)*r,h+=r}}let f=(r*a.width+n)*4;a.data[f]=Math.round(d/h),a.data[f+1]=Math.round(u/h),a.data[f+2]=Math.round(c/h),a.data[f+3]=Math.round(p/h)}}return a}(a,s,o);await n.writeFile(e,await e6(l))}let tJ=async(e,t)=>{let n;if(!e.backend.captureScreenshot)throw new G("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let a=await tq(e,t.out,{field:"path",ext:".png"});try{await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},a.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}),void 0!==t.maxSize&&await tW(a.path,t.maxSize),n=await a.publish()}catch(e){throw await a.cleanup?.(),e}return{path:a.path,...n?{artifacts:[n]}:{},...R(`Saved screenshot: ${a.path}`)}};function tZ(e,t){let n=M(e.type??"Element"),a=b(e,n),r=!1===e.enabled?"disabled":"enabled",i=!0===e.selected?"selected":"unselected",s=!0===e.hittable?"hittable":"not-hittable";return[String(t??e.depth??0),n,a,r,i,s].join("|")}function tQ(e,t){return t.flatten?e.map(e=>({text:L(e,0,!1),comparable:tZ(e,0)})):x(e).map(e=>({text:e.text,comparable:tZ(e.node,e.depth)}))}function t0(e,t){return e.get(t)??0}function t1(e){return e.map(e=>({index:e.index,depth:e.depth,parentIndex:e.parentIndex,type:e.type,role:e.role,subrole:e.subrole,label:e.label,value:e.value,identifier:e.identifier,enabled:e.enabled,selected:e.selected,focused:e.focused,hittable:e.hittable,rect:e.rect,bundleId:e.bundleId,appName:e.appName,windowTitle:e.windowTitle,surface:e.surface,hiddenContentAbove:e.hiddenContentAbove,hiddenContentBelow:e.hiddenContentBelow,interactionBlocked:e.interactionBlocked,presentationHints:e.presentationHints}))}let t2=async(e,t)=>{var n;let a,r,i=await t3(e,t),s=function(e){var t,n,a,r,i;let{previous:s,current:o,options:l,identity:d}=e;if(!0===l.forceFull||!0===l.raw||!s||!1===s.comparisonSafe||!1===o.comparisonSafe||(t=s,n=o,a=d,t.backend&&n.backend&&t.backend!==n.backend||a?.previousAppBundleId&&a.currentAppBundleId&&a.previousAppBundleId!==a.currentAppBundleId)||!s.presentationKey||s.presentationKey!==o.presentationKey||(r=s,i=o,r.truncated!==i.truncated||JSON.stringify(t1(r.nodes))!==JSON.stringify(t1(i.nodes))))return;let u=l.scope?.trim();return{ageMs:Math.max(0,o.createdAt-s.createdAt),nodeCount:o.nodes.length,...!0===l.interactiveOnly?{interactiveOnly:!0}:{},...u?{scope:u}:{}}}({previous:i.session?.snapshot,current:i.snapshot,options:t,identity:{previousAppBundleId:i.session?.appBundleId,currentAppBundleId:i.result.appBundleId??i.session?.appBundleId}});return await e.sessions.set(t5(t.session,i)),{nodes:i.snapshot.nodes,truncated:i.snapshot.truncated??!1,visibility:function(e){let{nodes:t,backend:n,snapshotRaw:a}=e;if(a||!J(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let r=k(t),i=new Set;return r.hiddenCount>0&&i.add("offscreen-nodes"),r.nodes.some(e=>e.hiddenContentAbove)&&i.add("scroll-hidden-above"),r.nodes.some(e=>e.hiddenContentBelow)&&i.add("scroll-hidden-below"),{partial:i.size>0,visibleNodeCount:r.nodes.length,totalNodeCount:t.length,reasons:[...i]}}({nodes:i.snapshot.nodes,backend:i.snapshot.backend,snapshotRaw:t.raw}),...u({...i.annotations,warnings:i.warnings}),...s?{unchanged:s}:{},...i.result.snapshotDiagnostics?{snapshotDiagnostics:i.result.snapshotDiagnostics}:{},...(a=(n=i).result.appName??n.session?.appName,r=n.result.appBundleId??n.session?.appBundleId,{...a||r?{appName:a??r}:{},...r?{appBundleId:r}:{}})}},t4=async(e,t)=>{let n=await t3(e,t),a=!0===t.interactiveOnly,r=n.session?.snapshot,i=t5(t.session,n);if(!r){let t=function(e,t={}){return tQ(e,t).length}(n.snapshot.nodes,{flatten:a});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let s=function(e,t,n={}){let a=function(e,t){let n=e.length,a=t.length,r=n+a,i=new Map,s=[];i.set(1,0);for(let o=0;o<=r;o+=1){s.push(new Map(i));for(let r=-o;r<=o;r+=2){let l=r===-o||r!==o&&t0(i,r-1)<t0(i,r+1)?t0(i,r+1):t0(i,r-1)+1,d=l-r;for(;l<n&&d<a&&e[l].comparable===t[d].comparable;)l+=1,d+=1;if(i.set(r,l),l>=n&&d>=a)return function(e,t,n,a,r){let i=[],s=a,o=r;for(let a=e.length-1;a>=0;a-=1){let r=e[a],l=s-o,d=l===-a||l!==a&&t0(r,l-1)<t0(r,l+1)?l+1:l-1,u=t0(r,d),c=u-d;for(;s>u&&o>c;)i.push({kind:"unchanged",text:n[o-1].text}),s-=1,o-=1;if(0===a)break;s===u?(i.push({kind:"added",text:n[c].text}),o=c):(i.push({kind:"removed",text:t[u].text}),s=u)}return i.reverse(),i}(s,e,t,n,a)}}return[]}(tQ(e,n),tQ(t,n)),r={additions:0,removals:0,unchanged:0};for(let e of a)"added"===e.kind&&(r.additions+=1),"removed"===e.kind&&(r.removals+=1),"unchanged"===e.kind&&(r.unchanged+=1);return{summary:r,lines:a}}(r.nodes,n.snapshot.nodes,{flatten:a});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!1,summary:s.summary,lines:s.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function t3(e,t){var n,a,r,i,s,o,l;let d,u,p,h,f;if(!e.backend.captureSnapshot)throw new G("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let m=t.session??"default",w=await e.sessions.get(m),g=await e.backend.captureSnapshot({session:m,requestId:t.requestId,appId:w?.appId,appBundleId:w?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw}),b=(a=g,r=e,n=a.snapshot?a.snapshot:{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:c(r)},n.presentationKey?n:{...n,presentationKey:W(t)}),y=E(g),k=c(e);return{snapshot:b,result:g,session:w,annotations:y,warnings:(d=[...(i={result:g,annotations:y,snapshot:b,options:t,session:w,capturedAt:b.createdAt??k,runtimeNow:k}).annotations.warnings??[]],i.annotations.quality&&d.push(...v(i.annotations.quality,i.snapshot.nodes)),d.push(...function(e){let t=e.annotations.analysis;if("android"!==e.snapshot.backend||!0!==e.options.interactiveOnly||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return"number"==typeof e.options.depth&&"number"==typeof t.maxDepth&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}(i)),i.annotations.quality||(d.push(...function(e){if("xctest"!==e.snapshot.backend||!0!==e.options.interactiveOnly||1!==e.snapshot.nodes.length)return[];let t=e.snapshot.nodes[0];return t?.type!=="Application"?[]:["iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known."]}(i)),d.push(...(u=new Set((s=i.snapshot.nodes).map(e=>e.parentIndex).filter(e=>void 0!==e)),s.filter(e=>!(u.has(e.index)||(e.type?.toLowerCase()??"").includes("text"))&&(e.label??"").split(", ").length>10).map(e=>{let t=(e.label??"").split(", ").length,n=e.identifier?` (${e.identifier})`:"";return`@${e.ref} [${e.type??"element"}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})))),(p=function(e){if(e?.backend!=="uiautomator-dump")return;let t=e.fallbackReason?` Reason: ${e.fallbackReason}`:"";return`Android snapshot helper unavailable; using stock UIAutomator dump, which can time out on busy React Native UIs.${t}`}(i.annotations.androidSnapshot))&&d.push(p),(h=C(i.snapshot.nodes))&&d.push(h),(f=function(e){var t,n,a,r,i,s;let o=e.session?.snapshot;if(!e.annotations.freshness&&o&&(t=o,n=e.snapshot,void 0===t.presentationKey||void 0===n.presentationKey||t.presentationKey===n.presentationKey)&&(a=o,r=e.capturedAt,[r,e.runtimeNow].some(e=>{let t=e-a.createdAt;return t>=0&&t<=2e3}))&&(i=o.nodes.length,s=e.snapshot.nodes.length,!(i<12)&&s<=Math.floor(.2*i)))return t8}(i))&&d.push(f),d.push(...(o=i.annotations.freshness,l=i.snapshot.backend,o?.staleAfterRetries&&"android"===l?"stuck-route"===o.reason?[`Recent ${o.action} was followed by a nearly identical snapshot after ${o.retryCount} automatic retr${1===o.retryCount?"y":"ies"}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`]:"sharp-drop"===o.reason?[t8]:[]:[])),Array.from(new Set(d)))}}function t5(e,t){let n=t.session?.name??e??"default";return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}let t8="Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.",t6=async(e,t)=>await nt(e,t,"press"),t9=async(e,t)=>await nt(e,t,"click"),t7=async(e,t)=>{var n;if(!t.text)throw new G("INVALID_ARGS","fill requires text");let a=await nr(e,t);if(a)return a;let r=await O(e,t,{action:"fill",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.fill)throw new G("UNSUPPORTED_OPERATION","fill is not supported by this backend");let i=nn(r),s=I(await e.backend.fill(D(e,t),i,t.text,{delayMs:t.delayMs})),o="node"in r?r.node?.type??"":"",l=o&&!ec(o,e.backend.platform)?`fill target ${n=r,n.target?.kind==="ref"?n.target.ref:n.target?.kind==="selector"?n.target.selector:"point"} resolved to "${o}", attempting fill anyway.`:void 0;return{...r,text:t.text,...l?{warning:l}:{},...s?{backendResult:s}:{}}},ne=async(e,t)=>{let n=t.text;if(!n)throw new G("INVALID_ARGS","type requires text");let a=eF(n);if(a)throw new G("INVALID_ARGS",`type does not accept a target ref like "${a}"`,{hint:`Use fill ${a} "text" to target that field, or press ${a} then type "text" to append.`});if(!e.backend.typeText)throw new G("UNSUPPORTED_OPERATION","type is not supported by this backend");let r=T(t.delayMs??0,"delay-ms",0,1e4),i=I(await e.backend.typeText(D(e,t),n,{delayMs:r}));return{kind:"text",text:n,delayMs:r,...i?{backendResult:i}:{},...R(`Typed ${Array.from(n).length} chars`)}};async function nt(e,t,n){let a=await na(e,t,n);if(a)return a;let r=await O(e,t,{action:n,requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.tap)throw new G("UNSUPPORTED_OPERATION","tap is not supported by this backend");let i=nn(r),s=I(await e.backend.tap(D(e,t),i,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap}));return{...r,...s?{backendResult:s}:{}}}function nn(e){if(!e.point)throw new G("COMMAND_FAILED","Interaction target resolved without coordinates");return e.point}async function na(e,t,n){var a;if("click"!==n||"ref"!==t.target.kind||!e.backend.tapTarget||void 0!==(a=t).count||void 0!==a.intervalMs||void 0!==a.holdMs||void 0!==a.jitterPx||void 0!==a.doubleTap||void 0!==a.button&&"primary"!==a.button)return null;let r=I(await e.backend.tapTarget(D(e,t),{kind:"ref",ref:t.target.ref,...t.target.fallbackLabel?{fallbackLabel:t.target.fallbackLabel}:{}}));return{kind:"ref",target:{kind:"ref",ref:t.target.ref},...r?{backendResult:r}:{}}}async function nr(e,t){if("ref"!==t.target.kind||!e.backend.fillTarget)return null;let n=I(await e.backend.fillTarget(D(e,t),{kind:"ref",ref:t.target.ref,...t.target.fallbackLabel?{fallbackLabel:t.target.fallbackLabel}:{}},t.text,{delayMs:t.delayMs}));return{kind:"ref",target:{kind:"ref",ref:t.target.ref},text:t.text,...n?{backendResult:n}:{}}}function ni(e){return["visible","hidden","exists","editable","selected","text"].includes(e)}function ns(e){let{predicate:t,node:n,nodes:a,expectedText:r,platform:i}=e,s=Q(n),o=eu(n,i),l=!0===n.selected,u="text"===t?ei(n):function(e,t,n){var a,r,i;let s;if("android"===n&&!1===e.visibleToUser)return!1;if(no(e.rect))return function(e,t){return d(e,t)}(e,t);if(e.rect)return!1;if("android"!==n&&!0===e.hittable)return!0;let o=(a=e,r=t,i=n,s=eo(r),ee(r,a,s,e=>!function(e,t){if("android"===t&&!1===e.visibleToUser)return!1;let n=ed(e.type??"");return!(n.includes("application")||n.includes("window")||n.includes("scrollview")||n.includes("tableview")||n.includes("collectionview"))&&"table"!==n&&"list"!==n&&"listview"!==n&&("android"===t?!0===e.hittable&&no(e.rect):!0===e.hittable||no(e.rect))}(e,i)?null:e));return!!o&&(no(o.rect)?function(e,t){return d(e,t)}(o,t):"android"!==n&&!0===o.hittable)}(n,a,i),c=!1;switch(t){case"visible":c=u;break;case"hidden":c=!u;break;case"editable":c=o;break;case"selected":c=l;break;case"text":c=s===(r??"")}let p="text"===t?`expected="${r??""}" actual="${s}"`:`actual=${JSON.stringify({visible:u,editable:o,selected:l})}`;return{pass:c,actualText:s,details:p}}function no(e){return!!(e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0)}async function nl(e,t){let n=t??"default",a=await e.sessions.get(n);if(!a)throw new G("SESSION_NOT_FOUND","No active session. Run open first.");if(!a.snapshot)throw new G("INVALID_ARGS","No snapshot in session. Run snapshot first.");return{sessionName:n,session:a,snapshot:a.snapshot}}async function nd(e,t,n={updateSession:!0}){let a=e.backend.captureSnapshot;if(!a)throw new G("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let r=t.session??"default",i=await e.sessions.get(r),s=await a(D(e,t),{interactiveOnly:!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw,includeRects:n.includeRects}),l=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,...s.quality?{snapshotQuality:s.quality}:{},createdAt:c(e)};return n.updateSession&&i&&!o(l.snapshotQuality)&&await e.sessions.set({...i,snapshot:l}),{sessionName:r,session:i,snapshot:l}}async function nu(e,t,n){if(e.backend.readText){let a=await e.backend.readText(D(e,{session:t.sessionName}),n);if(a.text.trim())return a.text}return es(n)}let nc=async(e,t)=>{let n=t.locator??"any";if(!t.query)throw new G("INVALID_ARGS","find requires a value");if("wait"===t.action)return await nk(e,t,n);let{capture:a,match:r}=await nv(e,t,n);if(!r)throw new G("COMMAND_FAILED","find did not match any element");if("exists"===t.action)return{kind:"found",found:!0};let i=`@${r.ref}`;return"get_attrs"===t.action?{kind:"attrs",ref:i,node:r}:{kind:"text",ref:i,text:await nu(e,a,r),node:r}},np=async(e,t)=>{if("ref"===t.target.kind){let n=await nl(e,t.session),a=function(e,t,n){let a=j(t);if(!a)throw new G("INVALID_ARGS",n.invalidRefMessage);let r=H(e,a)??(n.fallbackLabel.length>0?ea(e,n.fallbackLabel):null);if(!r)throw new G("COMMAND_FAILED",n.notFoundMessage);return{ref:a,node:r}}(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??"",invalidRefMessage:"get text requires a ref like @e2",notFoundMessage:`Ref ${t.target.ref} not found`}),r=et(a.node,e.backend.platform,{action:"get"}),i={kind:"ref",ref:`@${a.ref}`};return"attrs"===t.property?{kind:"attrs",target:i,node:a.node,selectorChain:r}:{kind:"text",target:i,text:await nu(e,n,a.node),node:a.node,selectorChain:r}}let n=await nI(e,t,t.session??"default",{selector:t.target.selector,disambiguateAmbiguous:"text"===t.property}),a=et(n.node,e.backend.platform,{action:"get"});if("attrs"===t.property)return{kind:"attrs",target:{kind:"selector",selector:n.selector},node:n.node,selectorChain:a};let r=await nu(e,n.capture,n.node);return{kind:"text",target:{kind:"selector",selector:n.selector},text:r,node:n.node,selectorChain:a}},nh=async(e,t)=>{let n=await np(e,{...t,property:"text",target:t.target});if("text"!==n.kind)throw new G("COMMAND_FAILED","getText returned non-text result");return n},nf=async(e,t)=>{let n=await np(e,{...t,property:"attrs",target:t.target});if("attrs"!==n.kind)throw new G("COMMAND_FAILED","getAttrs returned non-attrs result");return n},nm=async(e,t)=>{var n;if(!ni(t.predicate))throw new G("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text");if("text"===t.predicate&&!t.expectedText)throw new G("INVALID_ARGS","is text requires expected text value");let a="visible"===(n=t.predicate)||"hidden"===n,r=await nd(e,t,{updateSession:!0,includeRects:a}),i=ef(t.selector);if("exists"===t.predicate){let n=Z(r.snapshot.nodes,i,{platform:e.backend.platform});if(!n)throw new G("COMMAND_FAILED",el(i,[],{unique:!1}));return{predicate:t.predicate,pass:!0,selector:n.selector.raw,matches:n.matches,selectorChain:i.selectors.map(e=>e.raw)}}let s=en(r.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!s)throw new G("COMMAND_FAILED",el(i,[],{unique:!0}),{command:"is",reason:"selector_not_found",predicate:t.predicate,selector:i.raw});let o=ns({predicate:t.predicate,node:s.node,nodes:r.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!o.pass)throw new G("COMMAND_FAILED",`is ${t.predicate} failed for selector ${s.selector.raw}: ${o.details}`,{command:"is",reason:"predicate_failed",predicate:t.predicate,selector:s.selector.raw,predicateDetails:o.details});return{predicate:t.predicate,pass:!0,selector:s.selector.raw,..."text"===t.predicate?{text:o.actualText}:{},selectorChain:i.selectors.map(e=>e.raw)}},nw=async(e,t)=>await nm(e,{...t,predicate:"visible",selector:t.target.selector}),ng=async(e,t)=>await nm(e,{...t,predicate:"hidden",selector:t.target.selector}),nb=async(e,t)=>{if("sleep"===t.target.kind)return await p(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let n=await nl(e,t.session),a=j(t.target.ref);if(!a)throw new G("INVALID_ARGS",`Invalid ref: ${t.target.ref}`);let r=H(n.snapshot.nodes,a),i=r?er(r,n.snapshot.nodes):void 0;if(!i)throw new G("COMMAND_FAILED",`Ref ${t.target.ref} not found or has no label`);return await nA(e,t,i,t.target.timeoutMs)}if("selector"===t.target.kind)return await nx(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new G("INVALID_ARGS","wait requires text");return await nA(e,t,t.target.text,t.target.timeoutMs)},ny=async(e,t)=>{let n=await nb(e,{...t,target:{kind:"text",text:t.text,timeoutMs:t.timeoutMs}});if("text"!==n.kind)throw new G("COMMAND_FAILED","waitForText returned non-text result");return n};async function nk(e,t,n){let a=t.timeoutMs??1e4,r=c(e);for(;c(e)-r<a;){let{match:a}=await nv(e,t,n);if(a)return{kind:"found",found:!0,waitedMs:c(e)-r};await p(e,300)}throw new G("COMMAND_FAILED","find wait timed out")}async function nv(e,t,n){let a=ep(n,t.query),r=await nd(e,t,{updateSession:!0,scope:function(e,t,n,a){if(!a&&"web"!==e.backend.platform)return"text"===t||"label"===t||"any"===t?n:void 0}(e,n,t.query,a)});if(o(r.snapshot.snapshotQuality))throw new G("COMMAND_FAILED","find could not read the current accessibility tree",{reason:r.snapshot.snapshotQuality.reason,hint:"The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen."});if(a){let t=en(r.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!1,requireUnique:!1});return{capture:r,match:t?.node}}let i=eh(r.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0];return{capture:r,match:i}}async function nx(e,t,n,a){let r=a??1e4,i=c(e),s=ef(n);for(;c(e)-i<r;){let n=Z((await nd(e,t,{updateSession:!0})).snapshot.nodes,s,{platform:e.backend.platform});if(n)return{kind:"selector",selector:n.selector.raw,waitedMs:c(e)-i};await p(e,300)}throw new G("COMMAND_FAILED",`wait timed out for selector: ${n}`)}async function nA(e,t,n,a){let r=a??1e4,i=c(e);for(;c(e)-i<r;){if(e.backend.findText?(await e.backend.findText(D(e,t),n)).found:await nM(e,t,n))return{kind:"text",text:n,waitedMs:c(e)-i};await p(e,300)}throw new G("COMMAND_FAILED",`wait timed out for text: ${n}`)}async function nM(e,t,n){return!!ea((await nd(e,t,{updateSession:!0})).snapshot.nodes,n)}async function nI(e,t,n,a){let r=await nd(e,{...t,session:n},{updateSession:!0}),i=ef(a.selector),s=en(r.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:a.disambiguateAmbiguous});if(!s)throw new G("COMMAND_FAILED",el(i,[],{unique:!0}));return{capture:r,node:s.node,selector:s.selector.raw,ref:`@${s.node.ref}`}}function nR(e,t){if(void 0!==e)return nP(e,t)}function nP(e,t){let n=e?.trim();if(!n)throw new G("INVALID_ARGS",`${t} must be a non-empty string`);return n}let nN=async(e,t={})=>{if(!e.backend.listDevices)throw new G("UNSUPPORTED_OPERATION","admin.devices is not supported by this backend");return{kind:"adminDevices",devices:await e.backend.listDevices(D(e,t),t.filter)}},nS=async(e,t={})=>{if(!e.backend.bootDevice)throw new G("UNSUPPORTED_OPERATION","admin.boot is not supported by this backend");let n=n$(t.target),a=I(await e.backend.bootDevice(D(e,t),n));return{kind:"deviceBooted",...n?{target:n}:{},...a?{backendResult:a}:{},...R("Booted device")}},nO=async(e,t={})=>{if(!e.backend.shutdownDevice)throw new G("UNSUPPORTED_OPERATION","admin.shutdown is not supported by this backend");let n=n$(t.target),a=I(await e.backend.shutdownDevice(D(e,t),n));return{kind:"deviceShutdown",...n?{target:n}:{},...a?{backendResult:a}:{},...R("Shutdown device")}},n_=async(e,t)=>await nT(e,t,"install"),nD=async(e,t)=>await nT(e,t,"reinstall"),nE=async(e,t)=>await nT(e,t,"installFromSource");async function nT(e,t,n){let a="reinstall"===n?"reinstallApp":"installApp",r=e.backend[a];if(!r)throw new G("UNSUPPORTED_OPERATION",`admin.${n} is not supported by this backend`);let i="app"in t&&void 0!==t.app?nP(t.app,"app"):void 0;if("installFromSource"!==n&&!i)throw new G("INVALID_ARGS",`admin.${n} requires app`);let s=D(e,t),o=await nC(e,s,t.source);try{var l,d,u,c,p;let t,a,h,f,m,w,g,b,y=await r.call(e.backend,s,{...i?{app:i}:{},source:o.source});return l=n,d=i,u=o.source,c=y,t=I(c),a=nB(c,"appName"),h=nB(c,"appId"),f=nB(c,"bundleId"),m=nB(c,"packageName"),w=nB(c,"launchTarget"),g=nB(c,"installablePath"),b=nB(c,"archivePath"),{kind:"reinstall"===l?"appReinstalled":"installFromSource"===l?"appInstalledFromSource":"appInstalled",...d?{app:d}:{},source:u,...h?{appId:h}:{},...a?{appName:a}:{},...f?{bundleId:f}:{},...m?{packageName:m}:{},...w?{launchTarget:w}:{},...g?{installablePath:g}:{},...b?{archivePath:b}:{},...t?{backendResult:t}:{},...R(`${"reinstall"===l?"Reinstalled":"Installed"}: ${a??w??d??(p=u,"path"===p.kind?p.path:"uploadedArtifact"===p.kind?p.id:p.url)}`)}}finally{await o.cleanup?.()}}async function nC(e,t,n){let a=nL(n),r=await nU(e,a);try{let n=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source;return{source:nL(n),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function nU(e,t){if("url"===t.kind)return{source:t};let n=await tB(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function nL(e){if(!e||"object"!=typeof e)throw new G("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:nP(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:nP(e.id,"source.id")};if("url"===e.kind){let t=nP(e.url,"source.url");return function(e){let t;try{t=new URL(e)}catch{throw new G("INVALID_ARGS",`Invalid install source URL: ${e}`)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new G("INVALID_ARGS","Install source URL must use http or https")}(t),{kind:"url",url:t}}throw new G("INVALID_ARGS","install source kind must be path, uploadedArtifact, or url")}function n$(e){if(!e)return;let t=nR(e.id,"target.id"),n=nR(e.name,"target.name"),a={...t?{id:t}:{},...n?{name:n}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...void 0!==e.headless?{headless:e.headless}:{}};return Object.keys(a).length>0?a:void 0}function nB(e,t){let n=e[t];return"string"==typeof n&&n.length>0?n:void 0}let nq=/^[A-Za-z0-9_.:-]{1,64}$/,nG=async(e,t)=>{var n;if(!e.backend.openApp)throw new G("UNSUPPORTED_OPERATION","apps.open is not supported by this backend");let a=function(e){var t;let n=nR(e.app,"app"),a=nR(e.appId,"appId"),r=nR(e.bundleId,"bundleId"),i=nR(e.packageName,"packageName"),s=nR(e.url,"url"),o=nR(e.activity,"activity"),l={...n?{app:n}:{},...a?{appId:a}:{},...r?{bundleId:r}:{},...i?{packageName:i}:{},...s?{url:s}:{},...o?{activity:o}:{}};if(!((t=l).app??t.appId??t.bundleId??t.packageName??t.url??t.activity))throw new G("INVALID_ARGS","apps.open requires app, appId, bundleId, packageName, url, or activity");return l}(t),r=I(await e.backend.openApp(nH(e,t),a,{launchArgs:t.launchArgs,relaunch:t.relaunch}));return{kind:"appOpened",target:a,relaunch:!0===t.relaunch,...r?{backendResult:r}:{},...R(`Opened: ${(n=a).app??n.appId??n.bundleId??n.packageName??n.url??n.activity??"app"}`)}},nX=async(e,t={})=>{if(!e.backend.closeApp)throw new G("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let n=nR(t.app,"app"),a=I(await e.backend.closeApp(nH(e,t),n));return{kind:"appClosed",...n?{app:n}:{},...a?{backendResult:a}:{},...R(n?`Closed: ${n}`:"Closed app")}},nY=async(e,t={})=>{if(!e.backend.listApps)throw new G("UNSUPPORTED_OPERATION","apps.list is not supported by this backend");return{kind:"appsList",apps:await e.backend.listApps(nH(e,t),ew(t.filter))}},nF=async(e,t)=>{if(!e.backend.getAppState)throw new G("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let n=nP(t.app,"app"),a=await e.backend.getAppState(nH(e,t),n);return{kind:"appState",app:n,state:a}},nK=async(e,t)=>{if(!e.backend.pushFile)throw new G("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let n=nP(t.app,"app"),a=await nz(e,t.input);try{let r=await e.backend.pushFile(nH(e,t),a.backendInput,n),i=I(r);return{kind:"appPushed",app:n,inputKind:a.inputKind,...i?{backendResult:i}:{},...R(`Pushed to ${n}`)}}finally{await a.cleanup?.()}},nV=async(e,t)=>{var n,a;if(!e.backend.triggerAppEvent)throw new G("UNSUPPORTED_OPERATION","apps.triggerEvent is not supported by this backend");let r=function(e){let t=nP(e,"name");if(!nq.test(t))throw new G("INVALID_ARGS",`Invalid apps.triggerEvent name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});return t}(t.name);n=t.payload,a=`apps.triggerEvent payload for "${r}"`,void 0!==n&&nj(n,a,8192);let i=I(await e.backend.triggerAppEvent(nH(e,t),{name:r,...t.payload?{payload:t.payload}:{}}));return{kind:"appEventTriggered",name:r,...t.payload?{payload:t.payload}:{},...i?{backendResult:i}:{},...R(`Triggered app event: ${r}`)}};async function nz(e,t){if(!t||"object"!=typeof t)throw new G("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return nj(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let n=await tB(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:n.path},inputKind:"file",...n.cleanup?{cleanup:n.cleanup}:{}}}function nj(e,t,n){if(function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new G("INVALID_ARGS",`${t} must be a JSON object`)}(e,t),Buffer.byteLength(function(e,t){try{let n=JSON.stringify(e);if("string"!=typeof n)throw new G("INVALID_ARGS",`${t} must be JSON-serializable`);return n}catch{throw new G("INVALID_ARGS",`${t} must be JSON-serializable`)}}(e,t),"utf8")>n)throw new G("INVALID_ARGS",`${t} exceeds ${n} bytes`)}function nH(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}let nW=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,nJ=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function nZ(e){var t,n;let a=!1,r=e;return{value:(t=r=(r=(r=(r=(r=r.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,t)=>(a=!0,`${String(t)}=[REDACTED]`))).replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,t,n,r)=>(a=!0,`${String(t)}[REDACTED]${String(r)}`))).replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,t)=>(a=!0,`${String(t)}[REDACTED]`))).replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,t)=>(a=!0,`${String(t)}[REDACTED]`))).replaceAll(nJ,()=>(a=!0,"[REDACTED]")),n=()=>{a=!0},r=/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(t)?t.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let t=nQ(e);return t?(t.redacted&&n(),t.value):e}):t),redacted:a}}function nQ(e){try{let t=new URL(e),n=function(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))nW.test(n)&&(e.searchParams.set(n,"[REDACTED]"),t=!0);return t}(t);return(t.username||t.password)&&(t.username="REDACTED",t.password="REDACTED",n=!0),{value:t.toString(),redacted:n}}catch{return}}let n0=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function n1(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[a,r]of Object.entries(e))if(n0.test(a))n[a]="[REDACTED]",t=!0;else{let e=n5(r,2048);n[a]=e.value??"",t||=e.redacted}return{value:n,redacted:t}}function n2(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),n=n3(t,nZ);return n8(JSON.stringify(n.value),2048,n.redacted)}catch{return}}(e)??n5(e,2048)}function n4(e){return n3(e,e=>n5(e,2048))}function n3(e,t){if(void 0===e)return{redacted:!1};if("string"==typeof e)return t(e);if(!e||"object"!=typeof e)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let a=n3(e,t);return n||=a.redacted,a.value}),redacted:n}}let n=!1,a={};for(let[r,i]of Object.entries(e)){if(n0.test(r)){a[r]="[REDACTED]",n=!0;continue}let e=n3(i,t);a[r]=e.value,n||=e.redacted}return{value:a,redacted:n}}function n5(e,t){if(void 0===e)return{redacted:!1};let n=nZ(e);return n8(n.value,t,n.redacted)}function n8(e,t,n){if(void 0===e)return{redacted:n};let a=e;return a.length>t&&(a=`${a.slice(0,t)}...[truncated]`,n=!0),{value:a,redacted:n}}let n6=async(e,t={})=>{var n,a;let r;if(!e.backend.readLogs)throw new G("UNSUPPORTED_OPERATION","diagnostics.logs is not supported by this backend");return r=!0===(n=await e.backend.readLogs(await ae(e,t),{...at(a=t,100,500,"logs limit"),...void 0!==a.levels?{levels:aa(a.levels,"levels")}:{},...void 0!==a.search?{search:nP(a.search,"search")}:{},...void 0!==a.source?{source:nP(a.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:n.entries.map(e=>{let t=n5(e.message,4096),n=n4(e.metadata);return r||=t.redacted||n.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:t.value??"",...e.source?{source:e.source}:{},...n.value?{metadata:n.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:r,...n.notes?{notes:n.notes}:{}}},n9=async(e,t={})=>{var n,a,r;let i;if(!e.backend.dumpNetwork)throw new G("UNSUPPORTED_OPERATION","diagnostics.network is not supported by this backend");let s={...at(r=t,25,200,"network limit"),include:function(e){if(void 0===e)return"summary";if("summary"===e||"headers"===e||"body"===e||"all"===e)return e;throw new G("INVALID_ARGS","network include must be summary, headers, body, or all")}(r.include)};return n=await e.backend.dumpNetwork(await ae(e,t),s),a=s.include??"summary",i=!0===n.redacted,{kind:"diagnosticsNetwork",entries:n.entries.map(e=>{var t;let n=e.url?nQ(t=e.url)??n5(t,2048):void 0,r="headers"===a||"all"===a?n1(e.requestHeaders):void 0,s="headers"===a||"all"===a?n1(e.responseHeaders):void 0,o="body"===a||"all"===a?n2(e.requestBody):void 0,l="body"===a||"all"===a?n2(e.responseBody):void 0,d=n4(e.metadata);return i||=(n?.redacted??!1)||(r?.redacted??!1)||(s?.redacted??!1)||(o?.redacted??!1)||(l?.redacted??!1)||d.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...n?{url:n.value}:{},...void 0!==e.status?{status:e.status}:{},...void 0!==e.durationMs?{durationMs:e.durationMs}:{},...r?.value?{requestHeaders:r.value}:{},...s?.value?{responseHeaders:s.value}:{},...o?.value!==void 0?{requestBody:o.value}:{},...l?.value!==void 0?{responseBody:l.value}:{},...d.value?{metadata:d.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:i,...n.notes?{notes:n.notes}:{}}},n7=async(e,t={})=>{var n,a;let r;if(!e.backend.measurePerf)throw new G("UNSUPPORTED_OPERATION","diagnostics.perf is not supported by this backend");return r=!0===(n=await e.backend.measurePerf(await ae(e,t),{...an(a=t),...void 0!==a.sampleMs?{sampleMs:T(a.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==a.metrics?{metrics:aa(a.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:n.metrics.map(e=>{let t=n5(e.message,4096),n=n4(e.metadata);return r||=t.redacted||n.redacted,{name:e.name,...void 0!==e.value?{value:e.value}:{},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...void 0!==t.value?{message:t.value}:{},...n.value?{metadata:n.value}:{}}}),...n.startedAt?{startedAt:n.startedAt}:{},...n.endedAt?{endedAt:n.endedAt}:{},...n.backend?{backend:n.backend}:{},redacted:r,...n.notes?{notes:n.notes}:{}}};async function ae(e,t){let n=D(e,t),a=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??a?.appId?{appId:t.appId??a?.appId}:{},...t.appBundleId??a?.appBundleId?{appBundleId:t.appBundleId??a?.appBundleId}:{}}}function at(e,t,n,a){return{...an(e),...void 0!==e.cursor?{cursor:nP(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:T(e.limit,a,1,n)}}function an(e){return{...void 0!==e.since?{since:nP(e.since,"since")}:{},...void 0!==e.until?{until:nP(e.until,"until")}:{}}}function aa(e,t,n=50){if(!Array.isArray(e))throw new G("INVALID_ARGS",`${t} must be an array of strings`);if(e.length>n)throw new G("INVALID_ARGS",`${t} must contain at most ${n} entries`);return e.map((e,n)=>nP(e,`${t}[${n}]`))}let ar=async(e,t)=>{let n=as(t.action,"record"),a="start"===n?e.backend.startRecording:e.backend.stopRecording;if(!a)throw new G("UNSUPPORTED_OPERATION",`record ${n} is not supported by this backend`);let r=t.out?await tq(e,t.out,{field:"path",ext:".mp4"}):void 0;try{var i,s,o,l,d,u,c;let p,h,f,m,w=(i=t,s=r?.path,p={},s&&(p.outPath=s),h=(o=i.fps,void 0===o?void 0:T(o,"fps",1,60)),void 0!==h&&(p.fps=h),f=(l=i.maxSize,void 0===l?void 0:T(l,"maxSize",1,Number.MAX_SAFE_INTEGER)),void 0!==f&&(p.maxSize=f),m=function(e){if(void 0===e)return;let t=g(e);if(void 0===t)throw new G("INVALID_ARGS","quality must be one of: medium, high (legacy numeric values 5-10 are accepted)");return t}(i.quality),void 0!==m&&(p.quality=m),void 0!==i.hideTouches&&(p.showTouches=!0!==i.hideTouches),p),b=await a.call(e.backend,D(e,t),w),y=await r?.publish();return d=n,u=b,c=y,{..."string"==typeof u.path?{path:u.path}:{},..."string"==typeof u.telemetryPath?{telemetryPath:u.telemetryPath}:{},..."string"==typeof u.warning?{warning:u.warning}:{},...ao(d,u,c,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await r?.cleanup?.(),e}},ai=async(e,t)=>{let n=as(t.action,"trace"),a="start"===n?e.backend.startTrace:e.backend.stopTrace;if(!a)throw new G("UNSUPPORTED_OPERATION",`trace ${n} is not supported by this backend`);let r=t.out?await tq(e,t.out,{field:"outPath",ext:".trace"}):void 0;try{var i,s,o;let l={...r?.path?{outPath:r.path}:{}},d=await a.call(e.backend,D(e,t),l),u=await r?.publish();return i=n,s=d,o=u,{..."string"==typeof s.outPath?{outPath:s.outPath}:{},...ao(i,s,o,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await r?.cleanup?.(),e}};function as(e,t){if("start"===e||"stop"===e)return e;throw new G("INVALID_ARGS",`${t} action must be start or stop`)}function ao(e,t,n,a){return{kind:"start"===e?a.startKind:a.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...R("start"===e?a.startMessage:a.stopMessage)}}let al=async(e,t={})=>{if(!e.backend.pressBack)throw new G("UNSUPPORTED_OPERATION","system.back is not supported by this backend");let n=t.mode??"in-app";if("in-app"!==n&&"system"!==n)throw new G("INVALID_ARGS","system.back mode must be in-app or system");let a=I(await e.backend.pressBack(D(e,t),{mode:n}));return{kind:"systemBack",mode:n,...a?{backendResult:a}:{},...R("Back")}},ad=async(e,t={})=>{if(!e.backend.pressHome)throw new G("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let n=I(await e.backend.pressHome(D(e,t)));return{kind:"systemHome",...n?{backendResult:n}:{},...R("Home")}},au=async(e,t)=>{if(!e.backend.rotate)throw new G("UNSUPPORTED_OPERATION","system.rotate is not supported by this backend");let n=function(e){switch(e){case"portrait":case"portrait-upside-down":case"landscape-left":case"landscape-right":return e;default:throw new G("INVALID_ARGS","system.rotate orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right")}}(t.orientation),a=I(await e.backend.rotate(D(e,t),n));return{kind:"systemRotated",orientation:n,...a?{backendResult:a}:{},...R(`Rotated to ${n}`)}},ac=async(e,t={})=>{var n,a,r,i,s,o,l;if(!e.backend.setKeyboard)throw new G("UNSUPPORTED_OPERATION","system.keyboard is not supported by this backend");let d=t.action??"status";if(!eY(d))throw new G("INVALID_ARGS","system.keyboard action must be status, get, dismiss, enter, or return");let u=await e.backend.setKeyboard(D(e,t),{action:d}),c=I(u),p=(n=u)&&"object"==typeof n?u:{};return"enter"===d||"return"===d?{kind:"keyboardEnterPressed",action:"enter",state:p,...(a=c)?{backendResult:a}:{},...R("Keyboard enter pressed")}:"dismiss"===d?(r=d,{kind:"keyboardDismissed",action:r,state:i=p,...(s=c)?{backendResult:s}:{},...R(!1===i.dismissed?"Keyboard already hidden":"Keyboard dismissed")}):(o=d,{kind:"keyboardState",action:o,state:p,...(l=c)?{backendResult:l}:{}})},ap=async(e,t)=>{if("read"===t.action){if(!e.backend.getClipboard)throw new G("UNSUPPORTED_OPERATION","system.clipboard read is not supported by this backend");let n=await e.backend.getClipboard(D(e,t));return{kind:"clipboardText",action:"read",text:"string"==typeof n?n:n.text}}if("write"!==t.action)throw new G("INVALID_ARGS","system.clipboard action must be read or write");if(!e.backend.setClipboard)throw new G("UNSUPPORTED_OPERATION","system.clipboard write is not supported by this backend");if("string"!=typeof t.text)throw new G("INVALID_ARGS","system.clipboard write requires text");let n=I(await e.backend.setClipboard(D(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...R("Clipboard updated")}},ah=async(e,t={})=>{if(!e.backend.openSettings)throw new G("UNSUPPORTED_OPERATION","system.settings is not supported by this backend");let n=nR(t.target,"target"),a=I(await e.backend.openSettings(D(e,t),n));return{kind:"settingsOpened",...n?{target:n}:{},...a?{backendResult:a}:{},...R(n?`Opened settings: ${n}`:"Opened settings")}},af=async(e,t={})=>{var n,a;if(!e.backend.handleAlert)throw new G("UNSUPPORTED_OPERATION","system.alert is not supported by this backend");let r=t.action??"get";if("get"!==r&&"accept"!==r&&"dismiss"!==r&&"wait"!==r)throw new G("INVALID_ARGS","system.alert action must be get, accept, dismiss, or wait");let i=void 0===t.timeoutMs?void 0:T(t.timeoutMs,"timeoutMs",0,12e4),s=await e.backend.handleAlert(D(e,t),r,{timeoutMs:i});return n=r,a=s,"get"===n?function(e){if("alertStatus"!==e.kind)throw new G("COMMAND_FAILED","system.alert get returned an invalid backend result");return{kind:"alertStatus",action:"get",alert:e.alert}}(a):"wait"===n?function(e){if("alertWait"!==e.kind)throw new G("COMMAND_FAILED","system.alert wait returned an invalid backend result");return{kind:"alertWait",action:"wait",alert:e.alert,...void 0!==e.waitedMs?{waitedMs:e.waitedMs}:{},...void 0!==e.timedOut?{timedOut:e.timedOut}:{},...R(e.alert?"Alert visible":"Alert wait timed out")}}(a):function(e,t){if("alertHandled"!==t.kind)throw new G("COMMAND_FAILED",`system.alert ${e} returned an invalid backend result`);return{kind:"alertHandled",action:e,handled:t.handled,...t.alert?{alert:t.alert}:{},...t.button?{button:t.button}:{},...R(t.handled?`Alert ${e}ed`:"No alert handled")}}(n,a)},am=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new G("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let n=I(await e.backend.openAppSwitcher(D(e,t)));return{kind:"appSwitcherOpened",...n?{backendResult:n}:{},...R("Opened app switcher")}};function aw(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??function(e=[]){let t=new Map(e.map(e=>[e.name,ag(e)]));return{get:e=>ag(t.get(e)),set:e=>{t.set(e.name,ag(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>ag(e))}}(),policy:e.policy??function(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,capture:{screenshot:e=>tJ(t,e),diffScreenshot:e=>tX(t,e),snapshot:e=>t2(t,e),diffSnapshot:e=>t4(t,e)},selectors:{find:e=>nc(t,e),get:e=>np(t,e),getText:(e,n={})=>nh(t,{...n,target:e}),getAttrs:(e,n={})=>nf(t,{...n,target:e}),is:e=>nm(t,e),isVisible:(e,n={})=>nw(t,{...n,target:e}),isHidden:(e,n={})=>ng(t,{...n,target:e}),wait:e=>nb(t,e),waitForText:(e,n={})=>ny(t,{...n,text:e})},interactions:{click:(e,n={})=>t9(t,{...n,target:e}),press:(e,n={})=>t6(t,{...n,target:e}),fill:(e,n,a={})=>t7(t,{...a,target:e,text:n}),typeText:(e,n={})=>ne(t,{...n,text:e}),focus:(e,n={})=>w(t,{...n,target:e}),longPress:(e,n={})=>f(t,{...n,target:e}),swipe:e=>N(t,e),scroll:e=>h(t,e),pinch:e=>U(t,e)},system:{back:e=>al(t,e),home:e=>ad(t,e),rotate:e=>au(t,e),keyboard:e=>ac(t,e),clipboard:e=>ap(t,e),settings:e=>ah(t,e),alert:e=>af(t,e),appSwitcher:e=>am(t,e)},apps:{open:e=>nG(t,e),close:e=>nX(t,e),list:(e={})=>nY(t,{...e,filter:em(e.filter)}),state:e=>nF(t,e),push:e=>nK(t,e),triggerEvent:e=>nV(t,e)},admin:{devices:e=>nN(t,e),boot:e=>nS(t,e),shutdown:e=>nO(t,e),install:e=>n_(t,e),reinstall:e=>nD(t,e),installFromSource:e=>nE(t,e)},recording:{record:e=>ar(t,e),trace:e=>ai(t,e)},observability:{logs:e=>n6(t,e),network:e=>n9(t,e),perf:e=>n7(t,e)}}}function ag(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:function(e){try{return structuredClone(e)}catch{return{...e}}}(e.metadata)}:{}}}function ab(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}export{eB as CLOUD_WEBDRIVER_PROVIDERS,e_ as appendScriptSeriesFlags,aw as createAgentDevice,e8 as decodePngAsync,e6 as encodePngAsync,ns as evaluateIsPredicate,eF as findMistargetedTypeRefToken,eL as formatPortableActionLine,eO as formatScriptActionSummary,eI as formatScriptArg,eR as formatScriptStringLiteral,ex as isClickLikeCommand,eG as isCloudWebDriverProviderName,eY as isKeyboardAction,ni as isSupportedPredicate,eA as isTouchTargetCommand,ab as localCommandPolicy,eU as parseReplayOpenFlags,eT as parseReplayRuntimeFlags,eE as parseReplaySeriesFlags,e3 as prewarmPngWorker,e5 as terminatePngWorker,e$ as timingSafeStringEqual};
|
|
1
|
+
import e from"node:crypto";import t,{promises as n}from"node:fs";import a from"node:path";import{Worker as r}from"node:worker_threads";import{fileURLToPath as i}from"node:url";import{intersectArea as s,isSparseSnapshotQualityVerdict as o,clamp as l,isNodeVisibleInEffectiveViewport as d,publicSnapshotCaptureAnnotations as u,now as c,sleep as p,scrollCommand as h,longPressCommand as f,appendScreenshotScriptFlags as m,focusCommand as w,recordingQualityInputToExportQuality as g,displayLabel as b,squaredDistance as y,buildMobileSnapshotPresentation as k,renderSnapshotQualityWarnings as v,buildSnapshotDisplayLines as x,rectCenter as A,formatRole as M,toBackendResult as I,successText as R,normalizedRect as P,swipeCommand as N,expandRect as S,resolveInteractionTarget as O,unionRects as D,toBackendContext as _,snapshotCaptureAnnotationsFrom as E,requireIntInRange as T,formatReactNativeOverlayWarning as C,pinchCommand as U,formatSnapshotLine as L}from"./2948.js";import{runCmd as $,whichCmd as B,emitDiagnostic as q}from"./8875.js";import{asAppError as G,toAppErrorCode as X,AppError as Y}from"./485.js";import{computeScreenshotDiffPixels as F,PNG as K,toBuffer as V,decodePng as z}from"./4418.js";import{normalizeRef as j,findNodeByRef as H,buildSnapshotPresentationKey as W,usesMobileSnapshotPresentation as J}from"./6849.js";import{findSelectorChainMatch as Z,extractNodeText as Q,findSnapshotAncestor as ee,buildSelectorChainForNode as et,resolveSelectorChain as en,findNodeByLabel as ea,resolveRefLabel as er,isNodeVisible as ei,extractReadableText as es,buildSnapshotNodeByIndex as eo,formatSelectorFailure as el,normalizeType as ed,isNodeEditable as eu,isFillableType as ec}from"./893.js";import{parseFindSelectorExpression as ep,findBestMatchesByLocator as eh,parseSelectorChain as ef}from"./587.js";import{resolveAppsFilter as em,assertResolvedAppsFilter as ew}from"./2748.js";let eg=/^-?\d+(\.\d+)?$/,eb=/^[^\s"\\]+$/,ey=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),ek=new Map([["--count","count"],["--pause-ms","pauseMs"]]),ev=new Map([["--delay-ms","delayMs"]]);function ex(e){return"click"===e||"press"===e}function eA(e){return ex(e)||"longpress"===e}function eM(e){return"type"===e||"fill"===e}function eI(e){return eP(e,eN)}function eR(e){return JSON.stringify(e)}function eP(e,t){return t(e)?e:eR(e)}function eN(e){return eS(e)&&e.startsWith("@")||eg.test(e)}function eS(e){return eb.test(e)}function eO(e){let t=(e.positionals??[]).map(e=>eI(e));return[e.command,...t].join(" ")}function eD(e,t){let n=t.flags??{};if(ex(t.command)){"number"==typeof n.count&&e.push("--count",String(n.count)),"number"==typeof n.intervalMs&&e.push("--interval-ms",String(n.intervalMs)),"number"==typeof n.holdMs&&e.push("--hold-ms",String(n.holdMs)),"number"==typeof n.jitterPx&&e.push("--jitter-px",String(n.jitterPx)),!0===n.doubleTap&&e.push("--double-tap");let t=n.clickButton;t&&"primary"!==t&&e.push("--button",t);return}if("swipe"===t.command){"number"==typeof n.count&&e.push("--count",String(n.count)),"number"==typeof n.pauseMs&&e.push("--pause-ms",String(n.pauseMs)),("one-way"===n.pattern||"ping-pong"===n.pattern)&&e.push("--pattern",n.pattern);return}eM(t.command)&&"number"==typeof n.delayMs&&e.push("--delay-ms",String(n.delayMs))}function e_(e,t){t&&(("ios"===t.platform||"android"===t.platform)&&e.push("--platform",t.platform),"string"==typeof t.metroHost&&t.metroHost.length>0&&e.push("--metro-host",eP(t.metroHost,eS)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",eP(t.bundleUrl,eS)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",eP(t.launchUrl,eS)))}function eE(e,t){let n=[],a={},r=ex(e)?ey:"swipe"===e?ek:eM(e)?ev:void 0;for(let i=0;i<t.length;i+=1){let s=t[i];if(ex(e)&&"--double-tap"===s){a.doubleTap=!0;continue}let o=t[i+1];if(ex(e)&&"--button"===s&&void 0!==o){("primary"===o||"secondary"===o||"middle"===o)&&(a.clickButton=o),i+=1;continue}let l=r?.get(s);if(l&&void 0!==o){let e=eC(o);if(null!==e){a[l]=e,i+=1;continue}}if("swipe"===e&&"--pattern"===s&&void 0!==o){("one-way"===o||"ping-pong"===o)&&(a.pattern=o),i+=1;continue}n.push(s)}return{positionals:n,flags:a}}function eT(e){let t=[],n={};for(let a=0;a<e.length;a+=1){let r=e[a],i=e[a+1];if("--platform"===r&&void 0!==i){("ios"===i||"android"===i)&&(n.platform=i),a+=1;continue}if("--metro-host"===r&&void 0!==i){n.metroHost=i,a+=1;continue}if("--metro-port"===r&&void 0!==i){let e=eC(i);null!==e&&(n.metroPort=e),a+=1;continue}if("--bundle-url"===r&&void 0!==i){n.bundleUrl=i,a+=1;continue}if("--launch-url"===r&&void 0!==i){n.launchUrl=i,a+=1;continue}t.push(r)}return{positionals:t,flags:n}}function eC(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function eU(e){var t;let n=[],a={};for(let t of e){if("--relaunch"===t){a.relaunch=!0;continue}n.push(t)}let r=eT(n);return{positionals:r.positionals,flags:a,runtime:(t=r.flags).platform||t.metroHost||void 0!==t.metroPort||t.bundleUrl||t.launchUrl?r.flags:void 0}}function eL(e,t={}){let n=[e.command];if("snapshot"===e.command)e.flags?.snapshotInteractiveOnly&&n.push("-i"),"number"==typeof e.flags?.snapshotDepth&&n.push("-d",String(e.flags.snapshotDepth)),e.flags?.snapshotScope&&n.push("-s",eI(e.flags.snapshotScope)),e.flags?.snapshotRaw&&n.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])n.push(eI(t));e.flags?.relaunch&&n.push("--relaunch"),e_(n,e.runtime)}else if("runtime"===e.command)!function(e,t,n={}){let a=t.positionals??[];for(let t of n.includeAllPositionals?a:a.slice(0,1))e.push(eP(t,eS));e_(e,t.flags)}(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals});else if("record"===e.command)!function(e,t){let[n,...a]=t.positionals??[];for(let t of(n&&e.push(eP(n,eS)),a))e.push(eI(t));"number"==typeof t.flags?.fps&&e.push("--fps",String(t.flags.fps)),"number"==typeof t.flags?.screenshotMaxSize&&e.push("--max-size",String(t.flags.screenshotMaxSize)),("number"==typeof t.flags?.quality||"string"==typeof t.flags?.quality)&&e.push("--quality",String(t.flags.quality)),t.flags?.hideTouches&&e.push("--hide-touches")}(n,e);else if("screenshot"===e.command){for(let t of e.positionals??[])n.push(eI(t));m(n,e.flags)}else{for(let t of e.positionals??[])n.push(eI(t));eD(n,e)}return n.join(" ")}function e$(t,n){let a=e.createHash("sha256").update(t).digest(),r=e.createHash("sha256").update(n).digest();return e.timingSafeEqual(a,r)}let eB={browserStack:"browserstack",awsDeviceFarm:"aws-device-farm"},eq=new Set(Object.values(eB));function eG(e){return void 0!==e&&eq.has(e)}let eX=["status","get","dismiss","enter","return"];function eY(e){return eX.includes(e)}function eF(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith("@")||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}class eK extends Error{}let eV=null,ez=!1,ej=!1,eH=0,eW=new Map;function eJ(e){ez=!0,ej||(ej=!0,q({level:"warn",phase:"png_worker_unavailable",data:{reason:e}}),process.emitWarning(`PNG worker unavailable, falling back to in-process PNG processing: ${e}`))}function eZ(e){let t=eW.get(e.id);t&&(eW.delete(e.id),e1(),e.ok?t.resolve(e.result):t.reject(new Y(X(e.error.code),e.error.message,e.error.details)))}function eQ(e,t){eV===e&&(eJ(t.message),eV=null,e.terminate().catch(()=>{}),e0(new eK(`PNG worker failed: ${t.message}`)))}function e0(e){let t=[...eW.values()];for(let n of(eW.clear(),t))n.reject(e)}function e1(){eV&&(eW.size>0?eV.ref():eV.unref())}function e2(){if(ez)return null;if(eV)return eV;let e=function(e,n){try{let r=i(e),s=a.extname(r)||".js";return[a.join(a.dirname(r),`${n}${s}`),a.join(a.dirname(r),"internal",`${n}${s}`)].find(e=>t.existsSync(e))??null}catch{return null}}(import.meta.url,"png-worker");if(!e)return eJ("worker entry module not found next to the current module"),null;try{let t=new r(e,{execArgv:e.endsWith(".ts")?["--experimental-strip-types"]:[]});return t.on("message",eZ),t.on("error",e=>{eQ(t,e)}),t.on("exit",e=>{eQ(t,Error(`PNG worker exited with code ${e}`))}),t.unref(),eV=t,t}catch(e){return eJ(`failed to spawn worker: ${e instanceof Error?e.message:String(e)}`),null}}async function e4(e,t){try{return await function(e){let t=e2();if(!t)return Promise.reject(new eK("PNG worker is unavailable"));let n=eH+=1;return new Promise((a,r)=>{eW.set(n,{resolve:a,reject:r}),e1();try{t.postMessage({...e,id:n})}catch(e){eW.delete(n),e1(),r(new eK(`failed to post job to PNG worker: ${e instanceof Error?e.message:String(e)}`))}})}(e)}catch(e){if(e instanceof eK)return t();throw e}}function e5(){e2()}async function e3(){let e=eV;eV=null,e0(new eK("PNG worker terminated")),e&&await e.terminate()}async function e8(e,t){let n=await e4({kind:"decode",png:e,label:t},()=>{let n=z(e,t);return{kind:"decode",width:n.width,height:n.height,data:n.data}});return new K({width:n.width,height:n.height,data:V(n.data)})}async function e6(e){return V((await e4({kind:"encode",width:e.width,height:e.height,data:e.data},()=>({kind:"encode",png:K.sync.write(e)}))).png)}async function e9(e){let{kind:t,...n}=await e4({kind:"diff-pixels",...e},()=>({kind:"diff-pixels",...F(e)}));return{...n,diffData:V(n.diffData)}}let e7=[0,187,255,255];function te(e,t,n,a){if(t<0||t>=e.width||n<0||n>=e.height)return;let r=(n*e.width+t)*4;e.data[r]=a[0],e.data[r+1]=a[1],e.data[r+2]=a[2],e.data[r+3]=a[3]}function tt(e,t,n){return Math.min(Math.max(e,t),n)}let tn=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function ta(e){let{mask:t,width:n,height:a,hooks:r}=e,i=new Uint8Array(t.length),s=new Int32Array(t.length),o=[];for(let e=0;e<t.length;e+=1){var l,d;if(!tr(t,i,e))continue;let u=0,c=(l=s,i[d=e]=1,l[0]=d,1),p=r.create(e);for(;u<c;){let e=s[u];u+=1,r.visit(p,e),c=function(e){let{mask:t,visited:n,queue:a,width:r,height:i,pixelIndex:s}=e,o=s%r,l=Math.floor(s/r),d=e.queueEnd;for(let e of tn){var u,c,p,h;let s=o+e.x,f=l+e.y;if(u=s,c=f,p=r,h=i,!(u>=0)||!(u<p)||!(c>=0)||!(c<h))continue;let m=f*r+s;tr(t,n,m)&&(d=function(e,t,n,a){return t[a]=1,e[n]=a,n+1}(a,n,d,m))}return d}({mask:t,visited:i,queue:s,queueEnd:c,width:n,height:a,pixelIndex:e})}o.push(p)}return o}function tr(e,t,n){return 1===e[n]&&1!==t[n]}let ti={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},ts={leading:20,trailing:20,separator:10,unknown:0,background:-30};function to(e){return"background"!==e.likelyKind}function tl(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function td(e,t){let n,a=0;for(let r of t){let t=tf(e,r.rect);t<=a||(a=t,n=r)}return n}function tu(e){let t=[];for(let n of[...e].sort((e,t)=>e.rect.y-t.rect.y)){let e=t.find(e=>{var t,a;return t=e.rect,tf(t,a=n.rect)>0||Math.abs(A(t).y-A(a).y)<=.5*Math.max(t.height,a.height)});if(!e){t.push({rect:n.rect,blocks:[n]});continue}e.blocks.push(n),e.blocks.sort((e,t)=>e.rect.x-t.rect.x),e.rect=D([e.rect,n.rect])}return t}function tc(e,t){let n,a=A(e);for(let e of t){let t=Math.sqrt(y(a,A(e.rect)));n&&t>=n.distance||(n={block:e,distance:t})}return n}function tp(e){let t=th(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function th(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function tf(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}async function tm(e){if(await B("tesseract"))try{let[t,n]=await Promise.all([tg(e.baselinePath),tg(e.currentPath)]);if(0!==t.exitCode||0!==n.exitCode)return;let a=tw(t.stdout,e.width,e.height),r=tw(n.stdout,e.width,e.height),i=function(e,t){let n=new Set,a=[];for(let i of e){var r;let e=tA(i.text),s=function(e,t,n,a){let r=null,i=1/0;for(let s=0;s<n.length;s+=1){if(a.has(s))continue;let o=n[s];if(tA(o.text)!==t)continue;let l=A(e.normalizedRect),d=y(l,A(o.normalizedRect));d>=i||(r=s,i=d)}return r}(i,e,t,n);if(null===s)continue;n.add(s);let o=function(e,t){let n={x:t.rect.x-e.rect.x,y:t.rect.y-e.rect.y,width:t.rect.width-e.rect.width,height:t.rect.height-e.rect.height},a=tR(t.rect.width/e.rect.width),r=tR(t.rect.height/e.rect.height),i=Math.abs(a-1)>=.08||Math.abs(r-1)>=.12;return{text:e.text,baselineRect:e.rect,currentRect:t.rect,delta:n,confidence:Math.round(100*Math.min(e.confidence,t.confidence))/100,possibleTextMetricMismatch:i}}(i,t[s]);r=o,(Math.abs(r.delta.x)>=2||Math.abs(r.delta.y)>=2||Math.abs(r.delta.width)>=2||Math.abs(r.delta.height)>=2||r.possibleTextMetricMismatch)&&a.push(o)}return a.sort((e,t)=>tb(t)-tb(e)).slice(0,12)}(a,r),s=function(e){let t=[];for(let n of[...e].sort((e,t)=>e.currentRect.y-t.currentRect.y)){let e=t.find(e=>32>=Math.abs(n.delta.x-tM(e.map(e=>e.delta.x))));e?e.push(n):t.push([n])}return t.filter(e=>e.length>=2).map(ty).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>tk(t)-tk(e)).slice(0,4)}(i);if(0===a.length&&0===r.length)return;return{provider:"tesseract",baselineBlocks:a.length,currentBlocks:r.length,baselineBlocksRaw:a,currentBlocksRaw:r,matches:i,...s.length>0?{movementClusters:s}:{}}}catch{return}}function tw(e,t,n){let[a,...r]=e.split(/\r?\n/);if(!a)return[];let i=new Map(a.split(" ").map((e,t)=>[e,t])),s=[];for(let e of r){var o;if(!e.trim())continue;let t=e.split(" "),n=tx(t,i,"level"),a=tv(t,i,"text").trim(),r=tx(t,i,"conf");if(5!==n||(o=a,!/[\p{L}\p{N}]/u.test(o))||r<0)continue;let l=tx(t,i,"left"),d=tx(t,i,"top"),u=tx(t,i,"width"),c=tx(t,i,"height");u<=0||c<=0||s.push({key:[tv(t,i,"page_num"),tv(t,i,"block_num"),tv(t,i,"par_num"),tv(t,i,"line_num")].join(":"),text:a,confidence:r,rect:{x:l,y:d,width:u,height:c}})}let l=new Map;for(let e of s){let t=l.get(e.key);t?t.push(e):l.set(e.key,[e])}return Array.from(l.values()).flatMap(e=>(function(e){let t=[...e].sort((e,t)=>e.rect.x-t.rect.x),n=[],a=[];for(let e of t){let t=a.at(-1);if(!t){a.push(e);continue}if(e.rect.x-(t.rect.x+t.rect.width)>Math.max(48,2.5*Math.max(t.rect.height,e.rect.height))){n.push(a),a=[e];continue}a.push(e)}return a.length>0&&n.push(a),n})(e)).map(e=>(function(e,t,n){if(0===e.length)return null;let a=[...e].sort((e,t)=>e.rect.x-t.rect.x),r=D(a.map(e=>e.rect)),i=Math.round(100*tM(a.map(e=>e.confidence)))/100;return{text:a.map(e=>e.text).join(" "),confidence:i,rect:r,normalizedRect:P({x:tI(r.x/t),y:tI(r.y/n),width:tI(r.width/t),height:tI(r.height/n)})}})(e,t,n)).filter(e=>null!==e)}function tg(e){return $("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function tb(e){return Math.abs(e.delta.x)+Math.abs(e.delta.y)+Math.abs(e.delta.width)+Math.abs(e.delta.height)+25*!!e.possibleTextMetricMismatch}function ty(e){let t=e.map(e=>e.delta.x),n=e.map(e=>e.delta.y);return{texts:e.map(e=>e.text),xRange:{min:Math.min(...t),max:Math.max(...t)},yRange:{min:Math.min(...n),max:Math.max(...n)}}}function tk(e){return 2*Math.abs((e.xRange.min+e.xRange.max)/2)+Math.abs((e.yRange.min+e.yRange.max)/2)}function tv(e,t,n){let a=t.get(n);return void 0===a?"":e[a]??""}function tx(e,t,n){let a=Number(tv(e,t,n));return Number.isFinite(a)?a:0}function tA(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function tM(e){return e.reduce((e,t)=>e+t,0)/e.length}function tI(e){return Math.round(100*e*100)/100}function tR(e){return Math.round(1e3*e)/1e3}function tP(e,t,n,a){return{r:Math.round(e/a),g:Math.round(t/a),b:Math.round(n/a)}}function tN(e){return .2126*e.r+.7152*e.g+.0722*e.b}function tS(e){return`#${tO(e.r)}${tO(e.g)}${tO(e.b)}`}function tO(e){return e.toString(16).padStart(2,"0")}function tD(e){return Math.round(100*e*100)/100}let t_=255*Math.sqrt(3);async function tE(e,t,r={}){var i,o,d,u,c;let p,h,f,m;await tT(e,"Baseline image not found"),await tT(t,"Current screenshot not found");let w=r.outputPath,[g,b]=await Promise.all([n.readFile(e),n.readFile(t)]),[y,k]=await Promise.all([e8(g,"baseline screenshot"),e8(b,"current screenshot")]);tC(y.width,y.height,"baseline screenshot",r.maxPixels),tC(k.width,k.height,"current screenshot",r.maxPixels);let v=r.threshold??.1;if(y.width!==k.width||y.height!==k.height){let e=y.width*y.height;return await tU(r.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:y.width,height:y.height},actual:{width:k.width,height:k.height}}}}let x=y.width*y.height,{diffData:A,diffMask:M,differentPixels:I}=await e9({width:y.width,height:y.height,baselineData:y.data,currentData:k.data,maxColorDistance:v*t_}),R=I>0?(o=(p=function(e){let{diffMask:t,baseline:n,current:a}=e,{width:r,height:i}=n;return ta({mask:t,width:r,height:i,hooks:{create:e=>{var t,n;let a,i;return a=(t=e)%(n=r),{minX:a,minY:i=Math.floor(t/n),maxX:a,maxY:i,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}},visit:(e,t)=>{var i,s,o,l,d;let u,c,p;return i=e,s=t,o=r,l=n,d=a,u=s%o,c=Math.floor(s/o),p=4*s,void(i.minX=Math.min(i.minX,u),i.minY=Math.min(i.minY,c),i.maxX=Math.max(i.maxX,u),i.maxY=Math.max(i.maxY,c),i.differentPixels+=1,i.baselineRed+=l.data[p],i.baselineGreen+=l.data[p+1],i.baselineBlue+=l.data[p+2],i.currentRed+=d.data[p],i.currentGreen+=d.data[p+1],i.currentBlue+=d.data[p+2])}}})}(i={diffMask:M,baseline:y,current:k,totalPixels:x,differentPixels:I,maxRegions:r.maxRegions})).length<=2e3?function(e){let t=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return 0!==n?n:e.minX-t.minX})){var n,a;let e=t.find(e=>{var t,n,a;return t=e,n=r,a=12,t.minX-a<=n.maxX&&n.minX-a<=t.maxX&&t.minY-a<=n.maxY&&n.minY-a<=t.maxY});if(!e){t.push({...r});continue}n=e,a=r,n.minX=Math.min(n.minX,a.minX),n.minY=Math.min(n.minY,a.minY),n.maxX=Math.max(n.maxX,a.maxX),n.maxY=Math.max(n.maxY,a.maxY),n.differentPixels+=a.differentPixels,n.baselineRed+=a.baselineRed,n.baselineGreen+=a.baselineGreen,n.baselineBlue+=a.baselineBlue,n.currentRed+=a.currentRed,n.currentGreen+=a.currentGreen,n.currentBlue+=a.currentBlue}return t}(p):p,o.flatMap(e=>{var t,n,a;let r;return(t=e,n=i.baseline.width,a=i.baseline.height,r=t.maxX-t.minX+1,t.maxY-t.minY+1>=Math.max(48,Math.round(.07*a))&&r>=.35*n)?function(e,t,n){var a;let r=function(e,t){let n=[],a=null;for(let r=0;r<e.length;r+=1){if(e[r]<=t){a??=r;continue}null!==a&&(r-a>=6&&n.push([a,r-1]),a=null)}return null!==a&&e.length-a>=6&&n.push([a,e.length-1]),n}((a=function(e,t,n){let a=[];for(let r=e.minY;r<=e.maxY;r+=1){let i=0;for(let a=e.minX;a<=e.maxX;a+=1)1===t[r*n+a]&&(i+=1);a.push(i)}return a}(e,t.diffMask,t.baseline.width)).map((e,t)=>{let n=0,r=0,i=Math.max(0,t-3),s=Math.min(a.length-1,t+3);for(let e=i;e<=s;e+=1)n+=a[e],r+=1;return Math.round(n/r)}),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),i=function(e,t,n){let a=[],r=e.minY;for(let[i,s]of t){let t=e.minY+Math.round((i+s)/2);t-r+1<n||e.maxY-t<n||(a.push([r,t]),r=t+1)}return a.push([r,e.maxY]),a}(e,r,n);if(i.length<=1)return[e];let s=i.map(([n,a])=>(function(e,t,n,a){let r=null;for(let o=t;o<=n;o+=1)for(let t=e.minX;t<=e.maxX;t+=1){var i,s;let e=o*a.baseline.width+t;1===a.diffMask[e]&&function(e,t,n,a,r,i){let s=4*t;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,a),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,a),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}(r??={minX:i=t,minY:s=o,maxX:i,maxY:s,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0},e,t,o,a.baseline,a.current)}return r})(e,n,a,t)).filter(e=>null!==e);return s.length>1?s:[e]}(e,i,Math.max(24,Math.round(.03*i.baseline.height))):[e]})).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(0!==n)return n;let a=e.minY-t.minY;return 0!==a?a:e.minX-t.minX}).slice(0,Math.max(0,i.maxRegions??8)).map((e,t)=>{var n,a,r,s,o,l,d,u,c,p,h;let f,m,w,g,b,y,k,v,x,A,M,I,R,N,S,O,D;return n=e,a=t+1,r={width:i.baseline.width,height:i.baseline.height,totalPixels:i.totalPixels,differentPixels:i.differentPixels},y={x:n.minX,y:n.minY,width:n.maxX-n.minX+1,height:n.maxY-n.minY+1},k={x:Math.round(n.minX+y.width/2),y:Math.round(n.minY+y.height/2)},v=tP(n.baselineRed,n.baselineGreen,n.baselineBlue,n.differentPixels),x=tP(n.currentRed,n.currentGreen,n.currentBlue,n.differentPixels),A=y.width*y.height,M=tD(n.differentPixels/A),I=Math.round(tN(v)),R=Math.round(tN(x)),N=(s=y,o=r.width,l=r.height,s.width>=.55*o&&s.height>=.12*l?"large-area":s.width>=2.5*s.height?"horizontal-band":s.height>=2.5*s.width?"vertical-band":"compact"),S=(f=A/r.totalPixels)>=.04?"large":f>=.01?"medium":"small",O=(d=v,u=x,m=tN(d),Math.abs(w=tN(u)-m)>=12?w>0?"brighter":"darker":Math.max(Math.abs(u.r-d.r),Math.abs(u.g-d.g),Math.abs(u.b-d.b))>=12?"color-shift":"mixed"),D=(c=k,p=r.width,h=r.height,g=c.x<p/3?"left":c.x>2*p/3?"right":"center",b=c.y<h/3?"top":c.y>2*h/3?"bottom":"middle","center"===g&&"middle"===b?"center":`${b}-${g}`),{index:a,rect:y,normalizedRect:P({x:tD(y.x/r.width),y:tD(y.y/r.height),width:tD(y.width/r.width),height:tD(y.height/r.height)}),differentPixels:n.differentPixels,shareOfDiffPercentage:tD(n.differentPixels/r.differentPixels),densityPercentage:M,shape:N,size:S,location:D,averageBaselineColorHex:tS(v),averageCurrentColorHex:tS(x),baselineLuminance:I,currentLuminance:R,dominantChange:O}}):[];if(I>0&&w){let e=new K({width:y.width,height:y.height,data:A});for(let t of R)t.rect.width<4||t.rect.height<4||function(e,t){let n=tt(t.x,0,e.width-1),a=tt(t.y,0,e.height-1),r=tt(t.x+t.width-1,0,e.width-1),i=tt(t.y+t.height-1,0,e.height-1);for(let t=0;t<2;t+=1){for(let s=n;s<=r;s+=1)te(e,s,a+t,e7),te(e,s,i-t,e7);for(let s=a;s<=i;s+=1)te(e,n+t,s,e7),te(e,r-t,s,e7)}}(e,t.rect);await n.mkdir(a.dirname(w),{recursive:!0}),await n.writeFile(w,await e6(e))}else await tU(r.outputPath);let N=I>0?await tm({baselinePath:e,currentPath:t,width:y.width,height:y.height}):void 0,O=N&&(N.matches.length>0||(N.movementClusters?.length??0)>0)?{provider:N.provider,baselineBlocks:N.baselineBlocks,currentBlocks:N.currentBlocks,matches:N.matches,...N.movementClusters?{movementClusters:N.movementClusters}:{}}:void 0,D=I>0&&N?(h=function(e){let t=[];for(let n of e.sort((e,t)=>e.minY-t.minY||e.minX-t.minX)){let e=t.find(e=>{var t,a,r;return t=e,a=n,r=10,t.minX-r<=a.maxX&&a.minX-r<=t.maxX&&t.minY-r<=a.maxY&&a.minY-r<=t.maxY});if(!e){t.push({...n});continue}e.minX=Math.min(e.minX,n.minX),e.minY=Math.min(e.minY,n.minY),e.maxX=Math.max(e.maxX,n.maxX),e.maxY=Math.max(e.maxY,n.maxY),e.differentPixels+=n.differentPixels}return t}((u=function(e,t,n,a){let r=new Uint8Array(e);if(!a)return r;for(let e of[...a.baselineBlocksRaw,...a.currentBlocksRaw])!function(e,t,n,a){let r=l(Math.floor(a.x),0,t-1),i=l(Math.floor(a.y),0,n-1),s=l(Math.ceil(a.x+a.width),0,t),o=l(Math.ceil(a.y+a.height),0,n);for(let n=i;n<o;n+=1)for(let a=r;a<s;a+=1)e[n*t+a]=0}(r,t,n,S(e.rect,8));return r}((d={diffMask:M,width:y.width,height:y.height,regions:R,ocr:N}).diffMask,d.width,d.height,d.ocr),c=d.width,ta({mask:u,width:c,height:d.height,hooks:{create:e=>{var t,n;let a,r;return a=(t=e)%(n=c),{minX:a,minY:r=Math.floor(t/n),maxX:a,maxY:r,differentPixels:0}},visit:(e,t)=>{var n,a,r;let i,s;return n=e,i=(a=t)%(r=c),s=Math.floor(a/r),void(n.minX=Math.min(n.minX,i),n.minY=Math.min(n.minY,s),n.maxX=Math.max(n.maxX,i),n.maxY=Math.max(n.maxY,s),n.differentPixels+=1)}}}))),f=tu(d.ocr?.currentBlocksRaw??[]),m=tu(d.ocr?.baselineBlocksRaw??[]),h.filter(tp).map(e=>{var t,n,a,r,i,o,l,u,c,p,h;let w,g,b,y,k,v,x,A,M,I;return t=e,n=d,a=f,r=m,y=function(e,t){let n,a=0;for(let r of t){let t=s(e,r.rect);t<=a||(a=t,n=r)}return n?.index}(b=th(t),n.regions),k=function(e,t,n){let a=td(e,t);if(a)return tc(e,a.blocks);let r=td(e,n);return r?tc(e,r.blocks):void 0}(b,a,r),v=function(e,t,n){if(e.height<=3&&e.width>=.12*n)return"separator";if(!t)return e.width>=.4*n?"background":"unknown";if(e.width>=.4*n)return"background";let a=e.x+e.width/2,r=t.x+t.width/2;return a<r-t.width/2?"leading":a>r+t.width/2?"trailing":e.width>=.35*n?"background":"unknown"}(b,k?.block.rect,n.width),x=(i=b,o=v,l=t.differentPixels,u=n,w=i.width/i.height,g=l/(i.width*i.height),"separator"===o?"separator":"background"===o?"background":"trailing"===o&&w>=1.5&&w<=3.8&&g>=.35?"toggle":"trailing"===o&&i.width<=.06*u.width&&i.height<=.04*u.height?"chevron":"leading"===o&&w>=.55&&w<=1.8?"icon":tl(i,u)?"background":"visual"),A={...y?{regionIndex:y}:{},slot:v,likelyKind:x,rect:b},{...y?{regionIndex:y}:{},slot:v,likelyKind:x,rect:b,...k?{nearestText:k.block.text.trim().replace(/^[^\p{L}\p{N}]+/u,"").replace(/^\p{L}\s+/u,"")}:{},score:(c=A,p=t.differentPixels,h=n,M=tl(c.rect,h)?-35:0,I=20*!!c.regionIndex,ti[c.likelyKind]+ts[c.slot]+I+M+Math.min(20,p/200))}}).filter(e=>e.rect.y>=.08*d.height).filter(to).sort((e,t)=>t.score-e.score).slice(0,Math.max(0,d.maxDeltas??12)).map((e,t)=>{var n;return n=e,{index:t+1,...n.regionIndex?{regionIndex:n.regionIndex}:{},slot:n.slot,likelyKind:n.likelyKind,rect:n.rect,...n.nearestText?{nearestText:n.nearestText}:{}}})):[],_=x>0?Math.round(I/x*1e4)/100:0;return{...I>0&&w?{diffPath:w}:{},...R.length>0?{regions:R}:{},...O?{ocr:O}:{},...D.length>0?{nonTextDeltas:D}:{},totalPixels:x,differentPixels:I,mismatchPercentage:_,match:0===I}}async function tT(e,t){try{await n.access(e)}catch{throw new Y("INVALID_ARGS",`${t}: ${e}`)}}function tC(e,t,n,a){if(null==a||a<=0)return;let r=e*t;if(!(r<=a))throw new Y("INVALID_ARGS",`${n} is ${r} pixels, which exceeds the configured maxImagePixels limit of ${a}`)}async function tU(e){if(e)try{await n.unlink(e)}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function tL(e){return e.width*e.height}function t$(e){return Math.round(100*e*100)/100}async function tB(e,t,n){if("path"===t.kind&&!e.policy.allowLocalInputPaths)throw new Y("INVALID_ARGS",`Local ${n.field??"input"} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,n)}catch(e){throw G(e)}}async function tq(e,t,n){if(t?.kind==="path"&&!e.policy.allowLocalOutputPaths)throw new Y("INVALID_ARGS","Local output paths are not allowed by command policy");try{return await e.artifacts.reserveOutput(t,{...n,visibility:n.visibility??"client-visible",requestedClientPath:t?.kind==="downloadableArtifact"?t.clientPath??n.requestedClientPath:n.requestedClientPath})}catch(e){throw G(e)}}async function tG(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw G(e)}}let tX=async(e,t)=>{let n,a,r;if(!t.baseline)throw new Y("INVALID_ARGS","diff screenshot requires a baseline image");let i=function(e){if(null==e||""===e)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new Y("INVALID_ARGS","--threshold must be a number between 0 and 1");return t}(t.threshold),s=t.current??{kind:"live"};if(t.overlayRefs&&!tH(s))throw new Y("INVALID_ARGS","diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs");let o=await tB(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),l=[];try{let d;d=tH(s)?(a=await tY(e,t)).path:(n=await tB(e,s,{usage:"diff screenshot current",field:"current"})).path,r=t.out?await tq(e,t.out,{field:"diffPath",ext:".png"}):void 0;let u=await tE(o.path,d,{threshold:i,outputPath:r?.path,maxPixels:e.policy.maxImagePixels});tH(s)&&(u=await tF(e,t,r?.path,u,l));let c=u.diffPath?await r?.publish():void 0;return c&&l.push(c),u.diffPath||await r?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await r?.cleanup?.(),e}finally{await o.cleanup?.(),await n?.cleanup?.(),await a?.cleanup?.()}};async function tY(e,t){let n=await tG(e,{prefix:"agent-device-diff-current",ext:".png"});try{await tK(e,t,n.path,tV(t))}catch(e){throw await n.cleanup(),e}return n}async function tF(e,t,n,a,r){var i,o,l,d;if(!t.overlayRefs)return a;if(a.match||a.dimensionMismatch)return n&&await tj(n),a;let u=(i=t,o=n,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:tz(o??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:tz(i.out.clientPath)}:{},...i.out.fileName?{fileName:tz(i.out.fileName)}:{}}:void 0),c=await tq(e,u,{field:"currentOverlayPath",ext:".png"});try{let n=await tK(e,t,c.path,{overlayRefs:!0,...tV(t)}),i=await c.publish();return i&&r.push(i),{...a,currentOverlayPath:n.path??c.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...a.regions&&n.overlayRefs?{regions:(l=a.regions,d=n.overlayRefs,l.map(e=>{var t,n;let a,r=(t=e,n=d,a=tL(t.rect),n.map(e=>{let n=e.overlayRect,r=s(t.rect,n);return r<=0?null:{ref:e.ref,...e.label?{label:e.label}:{},rect:n,overlayCoveragePercentage:t$(r/tL(n)),regionCoveragePercentage:t$(r/a)}}).filter(e=>null!==e).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return 0!==n?n:t.overlayCoveragePercentage-e.overlayCoveragePercentage}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage})));return r.length>0?{...e,currentOverlayMatches:r}:e}))}:{}}}catch(e){throw await c.cleanup?.(),e}}async function tK(e,t,n,a={}){if(!e.backend.captureScreenshot)throw new Y("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,a)??{}}function tV(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function tz(e){let t=a.extname(e),n=t?e.slice(0,-t.length):e;return`${n}.current-overlay${t||".png"}`}async function tj(e){try{await n.unlink(tz(e))}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function tH(e){return"live"===e.kind}async function tW(e,t){if(!Number.isInteger(t)||t<1)throw new Y("INVALID_ARGS","Screenshot max size must be a positive integer");let a=await e8(await n.readFile(e),"screenshot"),r=Math.max(a.width,a.height);if(r<=t)return;let i=t/r,s=Math.max(1,Math.round(a.width*i)),o=Math.max(1,Math.round(a.height*i)),l=function(e,t,n){let a=new K({width:t,height:n});for(let r=0;r<n;r+=1){let i=r*e.height/n,s=(r+1)*e.height/n;for(let n=0;n<t;n+=1){let o=n*e.width/t,l=(n+1)*e.width/t,d=0,u=0,c=0,p=0,h=0;for(let t=Math.floor(i);t<Math.ceil(s);t+=1){let n=Math.min(t+1,s)-Math.max(t,i);for(let a=Math.floor(o);a<Math.ceil(l);a+=1){let r=n*(Math.min(a+1,l)-Math.max(a,o)),i=(t*e.width+a)*4;d+=(e.data[i]??0)*r,u+=(e.data[i+1]??0)*r,c+=(e.data[i+2]??0)*r,p+=(e.data[i+3]??0)*r,h+=r}}let f=(r*a.width+n)*4;a.data[f]=Math.round(d/h),a.data[f+1]=Math.round(u/h),a.data[f+2]=Math.round(c/h),a.data[f+3]=Math.round(p/h)}}return a}(a,s,o);await n.writeFile(e,await e6(l))}let tJ=async(e,t)=>{let n;if(!e.backend.captureScreenshot)throw new Y("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let a=await tq(e,t.out,{field:"path",ext:".png"});try{await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},a.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}),void 0!==t.maxSize&&await tW(a.path,t.maxSize),n=await a.publish()}catch(e){throw await a.cleanup?.(),e}return{path:a.path,...n?{artifacts:[n]}:{},...R(`Saved screenshot: ${a.path}`)}};function tZ(e,t){let n=M(e.type??"Element"),a=b(e,n),r=!1===e.enabled?"disabled":"enabled",i=!0===e.selected?"selected":"unselected",s=!0===e.hittable?"hittable":"not-hittable";return[String(t??e.depth??0),n,a,r,i,s].join("|")}function tQ(e,t){return t.flatten?e.map(e=>({text:L(e,0,!1),comparable:tZ(e,0)})):x(e).map(e=>({text:e.text,comparable:tZ(e.node,e.depth)}))}function t0(e,t){return e.get(t)??0}function t1(e){return e.map(e=>({index:e.index,depth:e.depth,parentIndex:e.parentIndex,type:e.type,role:e.role,subrole:e.subrole,label:e.label,value:e.value,identifier:e.identifier,enabled:e.enabled,selected:e.selected,focused:e.focused,hittable:e.hittable,rect:e.rect,bundleId:e.bundleId,appName:e.appName,windowTitle:e.windowTitle,surface:e.surface,hiddenContentAbove:e.hiddenContentAbove,hiddenContentBelow:e.hiddenContentBelow,interactionBlocked:e.interactionBlocked,presentationHints:e.presentationHints}))}let t2=async(e,t)=>{var n;let a,r,i=await t5(e,t),s=function(e){var t,n,a,r,i;let{previous:s,current:o,options:l,identity:d}=e;if(!0===l.forceFull||!0===l.raw||!s||!1===s.comparisonSafe||!1===o.comparisonSafe||(t=s,n=o,a=d,t.backend&&n.backend&&t.backend!==n.backend||a?.previousAppBundleId&&a.currentAppBundleId&&a.previousAppBundleId!==a.currentAppBundleId)||!s.presentationKey||s.presentationKey!==o.presentationKey||(r=s,i=o,r.truncated!==i.truncated||JSON.stringify(t1(r.nodes))!==JSON.stringify(t1(i.nodes))))return;let u=l.scope?.trim();return{ageMs:Math.max(0,o.createdAt-s.createdAt),nodeCount:o.nodes.length,...!0===l.interactiveOnly?{interactiveOnly:!0}:{},...u?{scope:u}:{}}}({previous:i.session?.snapshot,current:i.snapshot,options:t,identity:{previousAppBundleId:i.session?.appBundleId,currentAppBundleId:i.result.appBundleId??i.session?.appBundleId}});return await e.sessions.set(t3(t.session,i)),{nodes:i.snapshot.nodes,truncated:i.snapshot.truncated??!1,visibility:function(e){let{nodes:t,backend:n,snapshotRaw:a}=e;if(a||!J(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let r=k(t),i=new Set;return r.hiddenCount>0&&i.add("offscreen-nodes"),r.nodes.some(e=>e.hiddenContentAbove)&&i.add("scroll-hidden-above"),r.nodes.some(e=>e.hiddenContentBelow)&&i.add("scroll-hidden-below"),{partial:i.size>0,visibleNodeCount:r.nodes.length,totalNodeCount:t.length,reasons:[...i]}}({nodes:i.snapshot.nodes,backend:i.snapshot.backend,snapshotRaw:t.raw}),...u({...i.annotations,warnings:i.warnings}),...s?{unchanged:s}:{},...i.result.snapshotDiagnostics?{snapshotDiagnostics:i.result.snapshotDiagnostics}:{},...(a=(n=i).result.appName??n.session?.appName,r=n.result.appBundleId??n.session?.appBundleId,{...a||r?{appName:a??r}:{},...r?{appBundleId:r}:{}})}},t4=async(e,t)=>{let n=await t5(e,t),a=!0===t.interactiveOnly,r=n.session?.snapshot,i=t3(t.session,n);if(!r){let t=function(e,t={}){return tQ(e,t).length}(n.snapshot.nodes,{flatten:a});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let s=function(e,t,n={}){let a=function(e,t){let n=e.length,a=t.length,r=n+a,i=new Map,s=[];i.set(1,0);for(let o=0;o<=r;o+=1){s.push(new Map(i));for(let r=-o;r<=o;r+=2){let l=r===-o||r!==o&&t0(i,r-1)<t0(i,r+1)?t0(i,r+1):t0(i,r-1)+1,d=l-r;for(;l<n&&d<a&&e[l].comparable===t[d].comparable;)l+=1,d+=1;if(i.set(r,l),l>=n&&d>=a)return function(e,t,n,a,r){let i=[],s=a,o=r;for(let a=e.length-1;a>=0;a-=1){let r=e[a],l=s-o,d=l===-a||l!==a&&t0(r,l-1)<t0(r,l+1)?l+1:l-1,u=t0(r,d),c=u-d;for(;s>u&&o>c;)i.push({kind:"unchanged",text:n[o-1].text}),s-=1,o-=1;if(0===a)break;s===u?(i.push({kind:"added",text:n[c].text}),o=c):(i.push({kind:"removed",text:t[u].text}),s=u)}return i.reverse(),i}(s,e,t,n,a)}}return[]}(tQ(e,n),tQ(t,n)),r={additions:0,removals:0,unchanged:0};for(let e of a)"added"===e.kind&&(r.additions+=1),"removed"===e.kind&&(r.removals+=1),"unchanged"===e.kind&&(r.unchanged+=1);return{summary:r,lines:a}}(r.nodes,n.snapshot.nodes,{flatten:a});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!1,summary:s.summary,lines:s.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function t5(e,t){var n,a,r,i,s,o,l;let d,u,p,h,f;if(!e.backend.captureSnapshot)throw new Y("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let m=t.session??"default",w=await e.sessions.get(m),g=await e.backend.captureSnapshot({session:m,requestId:t.requestId,appId:w?.appId,appBundleId:w?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw}),b=(a=g,r=e,n=a.snapshot?a.snapshot:{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:c(r)},n.presentationKey?n:{...n,presentationKey:W(t)}),y=E(g),k=c(e);return{snapshot:b,result:g,session:w,annotations:y,warnings:(d=[...(i={result:g,annotations:y,snapshot:b,options:t,session:w,capturedAt:b.createdAt??k,runtimeNow:k}).annotations.warnings??[]],i.annotations.quality&&d.push(...v(i.annotations.quality,i.snapshot.nodes)),d.push(...function(e){let t=e.annotations.analysis;if("android"!==e.snapshot.backend||!0!==e.options.interactiveOnly||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return"number"==typeof e.options.depth&&"number"==typeof t.maxDepth&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}(i)),i.annotations.quality||(d.push(...function(e){if("xctest"!==e.snapshot.backend||!0!==e.options.interactiveOnly||1!==e.snapshot.nodes.length)return[];let t=e.snapshot.nodes[0];return t?.type!=="Application"?[]:["iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known."]}(i)),d.push(...(u=new Set((s=i.snapshot.nodes).map(e=>e.parentIndex).filter(e=>void 0!==e)),s.filter(e=>!(u.has(e.index)||(e.type?.toLowerCase()??"").includes("text"))&&(e.label??"").split(", ").length>10).map(e=>{let t=(e.label??"").split(", ").length,n=e.identifier?` (${e.identifier})`:"";return`@${e.ref} [${e.type??"element"}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})))),(p=function(e){if(e?.backend!=="uiautomator-dump")return;let t=e.fallbackReason?` Reason: ${e.fallbackReason}`:"";return`Android snapshot helper unavailable; using stock UIAutomator dump, which can time out on busy React Native UIs.${t}`}(i.annotations.androidSnapshot))&&d.push(p),(h=C(i.snapshot.nodes))&&d.push(h),(f=function(e){var t,n,a,r,i,s;let o=e.session?.snapshot;if(!e.annotations.freshness&&o&&(t=o,n=e.snapshot,void 0===t.presentationKey||void 0===n.presentationKey||t.presentationKey===n.presentationKey)&&(a=o,r=e.capturedAt,[r,e.runtimeNow].some(e=>{let t=e-a.createdAt;return t>=0&&t<=2e3}))&&(i=o.nodes.length,s=e.snapshot.nodes.length,!(i<12)&&s<=Math.floor(.2*i)))return t8}(i))&&d.push(f),d.push(...(o=i.annotations.freshness,l=i.snapshot.backend,o?.staleAfterRetries&&"android"===l?"stuck-route"===o.reason?[`Recent ${o.action} was followed by a nearly identical snapshot after ${o.retryCount} automatic retr${1===o.retryCount?"y":"ies"}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`]:"sharp-drop"===o.reason?[t8]:[]:[])),Array.from(new Set(d)))}}function t3(e,t){let n=t.session?.name??e??"default";return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}let t8="Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.",t6=async(e,t)=>await nt(e,t,"press"),t9=async(e,t)=>await nt(e,t,"click"),t7=async(e,t)=>{var n;if(!t.text)throw new Y("INVALID_ARGS","fill requires text");let a=await nr(e,t);if(a)return a;let r=await O(e,t,{action:"fill",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.fill)throw new Y("UNSUPPORTED_OPERATION","fill is not supported by this backend");let i=nn(r),s=I(await e.backend.fill(_(e,t),i,t.text,{delayMs:t.delayMs})),o="node"in r?r.node?.type??"":"",l=o&&!ec(o,e.backend.platform)?`fill target ${n=r,n.target?.kind==="ref"?n.target.ref:n.target?.kind==="selector"?n.target.selector:"point"} resolved to "${o}", attempting fill anyway.`:void 0;return{...r,text:t.text,...l?{warning:l}:{},...s?{backendResult:s}:{}}},ne=async(e,t)=>{let n=t.text;if(!n)throw new Y("INVALID_ARGS","type requires text");let a=eF(n);if(a)throw new Y("INVALID_ARGS",`type does not accept a target ref like "${a}"`,{hint:`Use fill ${a} "text" to target that field, or press ${a} then type "text" to append.`});if(!e.backend.typeText)throw new Y("UNSUPPORTED_OPERATION","type is not supported by this backend");let r=T(t.delayMs??0,"delay-ms",0,1e4),i=I(await e.backend.typeText(_(e,t),n,{delayMs:r}));return{kind:"text",text:n,delayMs:r,...i?{backendResult:i}:{},...R(`Typed ${Array.from(n).length} chars`)}};async function nt(e,t,n){let a=await na(e,t,n);if(a)return a;let r=await O(e,t,{action:n,requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.tap)throw new Y("UNSUPPORTED_OPERATION","tap is not supported by this backend");let i=nn(r),s=I(await e.backend.tap(_(e,t),i,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap}));return{...r,...s?{backendResult:s}:{}}}function nn(e){if(!e.point)throw new Y("COMMAND_FAILED","Interaction target resolved without coordinates");return e.point}async function na(e,t,n){var a;if("click"!==n||"ref"!==t.target.kind||!e.backend.tapTarget||void 0!==(a=t).count||void 0!==a.intervalMs||void 0!==a.holdMs||void 0!==a.jitterPx||void 0!==a.doubleTap||void 0!==a.button&&"primary"!==a.button)return null;let r=I(await e.backend.tapTarget(_(e,t),{kind:"ref",ref:t.target.ref,...t.target.fallbackLabel?{fallbackLabel:t.target.fallbackLabel}:{}}));return{kind:"ref",target:{kind:"ref",ref:t.target.ref},...r?{backendResult:r}:{}}}async function nr(e,t){if("ref"!==t.target.kind||!e.backend.fillTarget)return null;let n=I(await e.backend.fillTarget(_(e,t),{kind:"ref",ref:t.target.ref,...t.target.fallbackLabel?{fallbackLabel:t.target.fallbackLabel}:{}},t.text,{delayMs:t.delayMs}));return{kind:"ref",target:{kind:"ref",ref:t.target.ref},text:t.text,...n?{backendResult:n}:{}}}function ni(e){return["visible","hidden","exists","editable","selected","text"].includes(e)}function ns(e){let{predicate:t,node:n,nodes:a,expectedText:r,platform:i}=e,s=Q(n),o=eu(n,i),l=!0===n.selected,u="text"===t?ei(n):function(e,t,n){var a,r,i;let s;if("android"===n&&!1===e.visibleToUser)return!1;if(no(e.rect))return function(e,t){return d(e,t)}(e,t);if(e.rect)return!1;if("android"!==n&&!0===e.hittable)return!0;let o=(a=e,r=t,i=n,s=eo(r),ee(r,a,s,e=>!function(e,t){if("android"===t&&!1===e.visibleToUser)return!1;let n=ed(e.type??"");return!(n.includes("application")||n.includes("window")||n.includes("scrollview")||n.includes("tableview")||n.includes("collectionview"))&&"table"!==n&&"list"!==n&&"listview"!==n&&("android"===t?!0===e.hittable&&no(e.rect):!0===e.hittable||no(e.rect))}(e,i)?null:e));return!!o&&(no(o.rect)?function(e,t){return d(e,t)}(o,t):"android"!==n&&!0===o.hittable)}(n,a,i),c=!1;switch(t){case"visible":c=u;break;case"hidden":c=!u;break;case"editable":c=o;break;case"selected":c=l;break;case"text":c=s===(r??"")}let p="text"===t?`expected="${r??""}" actual="${s}"`:`actual=${JSON.stringify({visible:u,editable:o,selected:l})}`;return{pass:c,actualText:s,details:p}}function no(e){return!!(e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0)}async function nl(e,t){let n=t??"default",a=await e.sessions.get(n);if(!a)throw new Y("SESSION_NOT_FOUND","No active session. Run open first.");if(!a.snapshot)throw new Y("INVALID_ARGS","No snapshot in session. Run snapshot first.");return{sessionName:n,session:a,snapshot:a.snapshot}}async function nd(e,t,n={updateSession:!0}){let a=e.backend.captureSnapshot;if(!a)throw new Y("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let r=t.session??"default",i=await e.sessions.get(r),s=await a(_(e,t),{interactiveOnly:!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw,includeRects:n.includeRects}),l=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,...s.quality?{snapshotQuality:s.quality}:{},createdAt:c(e)};return n.updateSession&&i&&!o(l.snapshotQuality)&&await e.sessions.set({...i,snapshot:l}),{sessionName:r,session:i,snapshot:l}}async function nu(e,t,n){if(e.backend.readText){let a=await e.backend.readText(_(e,{session:t.sessionName}),n);if(a.text.trim())return a.text}return es(n)}let nc=async(e,t)=>{let n=t.locator??"any";if(!t.query)throw new Y("INVALID_ARGS","find requires a value");if("wait"===t.action)return await nk(e,t,n);let{capture:a,match:r}=await nv(e,t,n);if(!r)throw new Y("COMMAND_FAILED","find did not match any element");if("exists"===t.action)return{kind:"found",found:!0};let i=`@${r.ref}`;return"get_attrs"===t.action?{kind:"attrs",ref:i,node:r}:{kind:"text",ref:i,text:await nu(e,a,r),node:r}},np=async(e,t)=>{if("ref"===t.target.kind){let n=await nl(e,t.session),a=function(e,t,n){let a=j(t);if(!a)throw new Y("INVALID_ARGS",n.invalidRefMessage);let r=H(e,a)??(n.fallbackLabel.length>0?ea(e,n.fallbackLabel):null);if(!r)throw new Y("COMMAND_FAILED",n.notFoundMessage);return{ref:a,node:r}}(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??"",invalidRefMessage:"get text requires a ref like @e2",notFoundMessage:`Ref ${t.target.ref} not found`}),r=et(a.node,e.backend.platform,{action:"get"}),i={kind:"ref",ref:`@${a.ref}`};return"attrs"===t.property?{kind:"attrs",target:i,node:a.node,selectorChain:r}:{kind:"text",target:i,text:await nu(e,n,a.node),node:a.node,selectorChain:r}}let n=await nI(e,t,t.session??"default",{selector:t.target.selector,disambiguateAmbiguous:"text"===t.property}),a=et(n.node,e.backend.platform,{action:"get"});if("attrs"===t.property)return{kind:"attrs",target:{kind:"selector",selector:n.selector},node:n.node,selectorChain:a};let r=await nu(e,n.capture,n.node);return{kind:"text",target:{kind:"selector",selector:n.selector},text:r,node:n.node,selectorChain:a}},nh=async(e,t)=>{let n=await np(e,{...t,property:"text",target:t.target});if("text"!==n.kind)throw new Y("COMMAND_FAILED","getText returned non-text result");return n},nf=async(e,t)=>{let n=await np(e,{...t,property:"attrs",target:t.target});if("attrs"!==n.kind)throw new Y("COMMAND_FAILED","getAttrs returned non-attrs result");return n},nm=async(e,t)=>{var n;if(!ni(t.predicate))throw new Y("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text");if("text"===t.predicate&&!t.expectedText)throw new Y("INVALID_ARGS","is text requires expected text value");let a="visible"===(n=t.predicate)||"hidden"===n,r=await nd(e,t,{updateSession:!0,includeRects:a}),i=ef(t.selector);if("exists"===t.predicate){let n=Z(r.snapshot.nodes,i,{platform:e.backend.platform});if(!n)throw new Y("COMMAND_FAILED",el(i,[],{unique:!1}));return{predicate:t.predicate,pass:!0,selector:n.selector.raw,matches:n.matches,selectorChain:i.selectors.map(e=>e.raw)}}let s=en(r.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!s)throw new Y("COMMAND_FAILED",el(i,[],{unique:!0}),{command:"is",reason:"selector_not_found",predicate:t.predicate,selector:i.raw});let o=ns({predicate:t.predicate,node:s.node,nodes:r.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!o.pass)throw new Y("COMMAND_FAILED",`is ${t.predicate} failed for selector ${s.selector.raw}: ${o.details}`,{command:"is",reason:"predicate_failed",predicate:t.predicate,selector:s.selector.raw,predicateDetails:o.details});return{predicate:t.predicate,pass:!0,selector:s.selector.raw,..."text"===t.predicate?{text:o.actualText}:{},selectorChain:i.selectors.map(e=>e.raw)}},nw=async(e,t)=>await nm(e,{...t,predicate:"visible",selector:t.target.selector}),ng=async(e,t)=>await nm(e,{...t,predicate:"hidden",selector:t.target.selector}),nb=async(e,t)=>{if("sleep"===t.target.kind)return await p(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let n=await nl(e,t.session),a=j(t.target.ref);if(!a)throw new Y("INVALID_ARGS",`Invalid ref: ${t.target.ref}`);let r=H(n.snapshot.nodes,a),i=r?er(r,n.snapshot.nodes):void 0;if(!i)throw new Y("COMMAND_FAILED",`Ref ${t.target.ref} not found or has no label`);return await nA(e,t,i,t.target.timeoutMs)}if("selector"===t.target.kind)return await nx(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new Y("INVALID_ARGS","wait requires text");return await nA(e,t,t.target.text,t.target.timeoutMs)},ny=async(e,t)=>{let n=await nb(e,{...t,target:{kind:"text",text:t.text,timeoutMs:t.timeoutMs}});if("text"!==n.kind)throw new Y("COMMAND_FAILED","waitForText returned non-text result");return n};async function nk(e,t,n){let a=t.timeoutMs??1e4,r=c(e);for(;c(e)-r<a;){let{match:a}=await nv(e,t,n);if(a)return{kind:"found",found:!0,waitedMs:c(e)-r};await p(e,300)}throw new Y("COMMAND_FAILED","find wait timed out")}async function nv(e,t,n){let a=ep(n,t.query),r=await nd(e,t,{updateSession:!0,scope:function(e,t,n,a){if(!a&&"web"!==e.backend.platform)return"text"===t||"label"===t||"any"===t?n:void 0}(e,n,t.query,a)});if(o(r.snapshot.snapshotQuality))throw new Y("COMMAND_FAILED","find could not read the current accessibility tree",{reason:r.snapshot.snapshotQuality.reason,hint:"The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen."});if(a){let t=en(r.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!1,requireUnique:!1});return{capture:r,match:t?.node}}let i=eh(r.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0];return{capture:r,match:i}}async function nx(e,t,n,a){let r=a??1e4,i=c(e),s=ef(n);for(;c(e)-i<r;){let n=Z((await nd(e,t,{updateSession:!0})).snapshot.nodes,s,{platform:e.backend.platform});if(n)return{kind:"selector",selector:n.selector.raw,waitedMs:c(e)-i};await p(e,300)}throw new Y("COMMAND_FAILED",`wait timed out for selector: ${n}`)}async function nA(e,t,n,a){let r=a??1e4,i=c(e);for(;c(e)-i<r;){if(e.backend.findText?(await e.backend.findText(_(e,t),n)).found:await nM(e,t,n))return{kind:"text",text:n,waitedMs:c(e)-i};await p(e,300)}throw new Y("COMMAND_FAILED",`wait timed out for text: ${n}`)}async function nM(e,t,n){return!!ea((await nd(e,t,{updateSession:!0})).snapshot.nodes,n)}async function nI(e,t,n,a){let r=await nd(e,{...t,session:n},{updateSession:!0}),i=ef(a.selector),s=en(r.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:a.disambiguateAmbiguous});if(!s)throw new Y("COMMAND_FAILED",el(i,[],{unique:!0}));return{capture:r,node:s.node,selector:s.selector.raw,ref:`@${s.node.ref}`}}function nR(e,t){if(void 0!==e)return nP(e,t)}function nP(e,t){let n=e?.trim();if(!n)throw new Y("INVALID_ARGS",`${t} must be a non-empty string`);return n}let nN=async(e,t={})=>{if(!e.backend.listDevices)throw new Y("UNSUPPORTED_OPERATION","admin.devices is not supported by this backend");return{kind:"adminDevices",devices:await e.backend.listDevices(_(e,t),t.filter)}},nS=async(e,t={})=>{if(!e.backend.bootDevice)throw new Y("UNSUPPORTED_OPERATION","admin.boot is not supported by this backend");let n=n$(t.target),a=I(await e.backend.bootDevice(_(e,t),n));return{kind:"deviceBooted",...n?{target:n}:{},...a?{backendResult:a}:{},...R("Booted device")}},nO=async(e,t={})=>{if(!e.backend.shutdownDevice)throw new Y("UNSUPPORTED_OPERATION","admin.shutdown is not supported by this backend");let n=n$(t.target),a=I(await e.backend.shutdownDevice(_(e,t),n));return{kind:"deviceShutdown",...n?{target:n}:{},...a?{backendResult:a}:{},...R("Shutdown device")}},nD=async(e,t)=>await nT(e,t,"install"),n_=async(e,t)=>await nT(e,t,"reinstall"),nE=async(e,t)=>await nT(e,t,"installFromSource");async function nT(e,t,n){let a="reinstall"===n?"reinstallApp":"installApp",r=e.backend[a];if(!r)throw new Y("UNSUPPORTED_OPERATION",`admin.${n} is not supported by this backend`);let i="app"in t&&void 0!==t.app?nP(t.app,"app"):void 0;if("installFromSource"!==n&&!i)throw new Y("INVALID_ARGS",`admin.${n} requires app`);let s=_(e,t),o=await nC(e,s,t.source);try{var l,d,u,c,p;let t,a,h,f,m,w,g,b,y=await r.call(e.backend,s,{...i?{app:i}:{},source:o.source});return l=n,d=i,u=o.source,c=y,t=I(c),a=nB(c,"appName"),h=nB(c,"appId"),f=nB(c,"bundleId"),m=nB(c,"packageName"),w=nB(c,"launchTarget"),g=nB(c,"installablePath"),b=nB(c,"archivePath"),{kind:"reinstall"===l?"appReinstalled":"installFromSource"===l?"appInstalledFromSource":"appInstalled",...d?{app:d}:{},source:u,...h?{appId:h}:{},...a?{appName:a}:{},...f?{bundleId:f}:{},...m?{packageName:m}:{},...w?{launchTarget:w}:{},...g?{installablePath:g}:{},...b?{archivePath:b}:{},...t?{backendResult:t}:{},...R(`${"reinstall"===l?"Reinstalled":"Installed"}: ${a??w??d??(p=u,"path"===p.kind?p.path:"uploadedArtifact"===p.kind?p.id:p.url)}`)}}finally{await o.cleanup?.()}}async function nC(e,t,n){let a=nL(n),r=await nU(e,a);try{let n=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source;return{source:nL(n),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function nU(e,t){if("url"===t.kind)return{source:t};let n=await tB(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function nL(e){if(!e||"object"!=typeof e)throw new Y("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:nP(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:nP(e.id,"source.id")};if("url"===e.kind){let t=nP(e.url,"source.url");return function(e){let t;try{t=new URL(e)}catch{throw new Y("INVALID_ARGS",`Invalid install source URL: ${e}`)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new Y("INVALID_ARGS","Install source URL must use http or https")}(t),{kind:"url",url:t}}throw new Y("INVALID_ARGS","install source kind must be path, uploadedArtifact, or url")}function n$(e){if(!e)return;let t=nR(e.id,"target.id"),n=nR(e.name,"target.name"),a={...t?{id:t}:{},...n?{name:n}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...void 0!==e.headless?{headless:e.headless}:{}};return Object.keys(a).length>0?a:void 0}function nB(e,t){let n=e[t];return"string"==typeof n&&n.length>0?n:void 0}let nq=/^[A-Za-z0-9_.:-]{1,64}$/,nG=async(e,t)=>{var n;if(!e.backend.openApp)throw new Y("UNSUPPORTED_OPERATION","apps.open is not supported by this backend");let a=function(e){var t;let n=nR(e.app,"app"),a=nR(e.appId,"appId"),r=nR(e.bundleId,"bundleId"),i=nR(e.packageName,"packageName"),s=nR(e.url,"url"),o=nR(e.activity,"activity"),l={...n?{app:n}:{},...a?{appId:a}:{},...r?{bundleId:r}:{},...i?{packageName:i}:{},...s?{url:s}:{},...o?{activity:o}:{}};if(!((t=l).app??t.appId??t.bundleId??t.packageName??t.url??t.activity))throw new Y("INVALID_ARGS","apps.open requires app, appId, bundleId, packageName, url, or activity");return l}(t),r=I(await e.backend.openApp(nH(e,t),a,{launchArgs:t.launchArgs,relaunch:t.relaunch}));return{kind:"appOpened",target:a,relaunch:!0===t.relaunch,...r?{backendResult:r}:{},...R(`Opened: ${(n=a).app??n.appId??n.bundleId??n.packageName??n.url??n.activity??"app"}`)}},nX=async(e,t={})=>{if(!e.backend.closeApp)throw new Y("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let n=nR(t.app,"app"),a=I(await e.backend.closeApp(nH(e,t),n));return{kind:"appClosed",...n?{app:n}:{},...a?{backendResult:a}:{},...R(n?`Closed: ${n}`:"Closed app")}},nY=async(e,t={})=>{if(!e.backend.listApps)throw new Y("UNSUPPORTED_OPERATION","apps.list is not supported by this backend");return{kind:"appsList",apps:await e.backend.listApps(nH(e,t),ew(t.filter))}},nF=async(e,t)=>{if(!e.backend.getAppState)throw new Y("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let n=nP(t.app,"app"),a=await e.backend.getAppState(nH(e,t),n);return{kind:"appState",app:n,state:a}},nK=async(e,t)=>{if(!e.backend.pushFile)throw new Y("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let n=nP(t.app,"app"),a=await nz(e,t.input);try{let r=await e.backend.pushFile(nH(e,t),a.backendInput,n),i=I(r);return{kind:"appPushed",app:n,inputKind:a.inputKind,...i?{backendResult:i}:{},...R(`Pushed to ${n}`)}}finally{await a.cleanup?.()}},nV=async(e,t)=>{var n,a;if(!e.backend.triggerAppEvent)throw new Y("UNSUPPORTED_OPERATION","apps.triggerEvent is not supported by this backend");let r=function(e){let t=nP(e,"name");if(!nq.test(t))throw new Y("INVALID_ARGS",`Invalid apps.triggerEvent name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});return t}(t.name);n=t.payload,a=`apps.triggerEvent payload for "${r}"`,void 0!==n&&nj(n,a,8192);let i=I(await e.backend.triggerAppEvent(nH(e,t),{name:r,...t.payload?{payload:t.payload}:{}}));return{kind:"appEventTriggered",name:r,...t.payload?{payload:t.payload}:{},...i?{backendResult:i}:{},...R(`Triggered app event: ${r}`)}};async function nz(e,t){if(!t||"object"!=typeof t)throw new Y("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return nj(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let n=await tB(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:n.path},inputKind:"file",...n.cleanup?{cleanup:n.cleanup}:{}}}function nj(e,t,n){if(function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new Y("INVALID_ARGS",`${t} must be a JSON object`)}(e,t),Buffer.byteLength(function(e,t){try{let n=JSON.stringify(e);if("string"!=typeof n)throw new Y("INVALID_ARGS",`${t} must be JSON-serializable`);return n}catch{throw new Y("INVALID_ARGS",`${t} must be JSON-serializable`)}}(e,t),"utf8")>n)throw new Y("INVALID_ARGS",`${t} exceeds ${n} bytes`)}function nH(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}let nW=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,nJ=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function nZ(e){var t,n;let a=!1,r=e;return{value:(t=r=(r=(r=(r=(r=r.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,t)=>(a=!0,`${String(t)}=[REDACTED]`))).replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,t,n,r)=>(a=!0,`${String(t)}[REDACTED]${String(r)}`))).replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,t)=>(a=!0,`${String(t)}[REDACTED]`))).replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,t)=>(a=!0,`${String(t)}[REDACTED]`))).replaceAll(nJ,()=>(a=!0,"[REDACTED]")),n=()=>{a=!0},r=/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(t)?t.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let t=nQ(e);return t?(t.redacted&&n(),t.value):e}):t),redacted:a}}function nQ(e){try{let t=new URL(e),n=function(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))nW.test(n)&&(e.searchParams.set(n,"[REDACTED]"),t=!0);return t}(t);return(t.username||t.password)&&(t.username="REDACTED",t.password="REDACTED",n=!0),{value:t.toString(),redacted:n}}catch{return}}let n0=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function n1(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[a,r]of Object.entries(e))if(n0.test(a))n[a]="[REDACTED]",t=!0;else{let e=n3(r,2048);n[a]=e.value??"",t||=e.redacted}return{value:n,redacted:t}}function n2(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),n=n5(t,nZ);return n8(JSON.stringify(n.value),2048,n.redacted)}catch{return}}(e)??n3(e,2048)}function n4(e){return n5(e,e=>n3(e,2048))}function n5(e,t){if(void 0===e)return{redacted:!1};if("string"==typeof e)return t(e);if(!e||"object"!=typeof e)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let a=n5(e,t);return n||=a.redacted,a.value}),redacted:n}}let n=!1,a={};for(let[r,i]of Object.entries(e)){if(n0.test(r)){a[r]="[REDACTED]",n=!0;continue}let e=n5(i,t);a[r]=e.value,n||=e.redacted}return{value:a,redacted:n}}function n3(e,t){if(void 0===e)return{redacted:!1};let n=nZ(e);return n8(n.value,t,n.redacted)}function n8(e,t,n){if(void 0===e)return{redacted:n};let a=e;return a.length>t&&(a=`${a.slice(0,t)}...[truncated]`,n=!0),{value:a,redacted:n}}let n6=async(e,t={})=>{var n,a;let r;if(!e.backend.readLogs)throw new Y("UNSUPPORTED_OPERATION","diagnostics.logs is not supported by this backend");return r=!0===(n=await e.backend.readLogs(await ae(e,t),{...at(a=t,100,500,"logs limit"),...void 0!==a.levels?{levels:aa(a.levels,"levels")}:{},...void 0!==a.search?{search:nP(a.search,"search")}:{},...void 0!==a.source?{source:nP(a.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:n.entries.map(e=>{let t=n3(e.message,4096),n=n4(e.metadata);return r||=t.redacted||n.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:t.value??"",...e.source?{source:e.source}:{},...n.value?{metadata:n.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:r,...n.notes?{notes:n.notes}:{}}},n9=async(e,t={})=>{var n,a,r;let i;if(!e.backend.dumpNetwork)throw new Y("UNSUPPORTED_OPERATION","diagnostics.network is not supported by this backend");let s={...at(r=t,25,200,"network limit"),include:function(e){if(void 0===e)return"summary";if("summary"===e||"headers"===e||"body"===e||"all"===e)return e;throw new Y("INVALID_ARGS","network include must be summary, headers, body, or all")}(r.include)};return n=await e.backend.dumpNetwork(await ae(e,t),s),a=s.include??"summary",i=!0===n.redacted,{kind:"diagnosticsNetwork",entries:n.entries.map(e=>{var t;let n=e.url?nQ(t=e.url)??n3(t,2048):void 0,r="headers"===a||"all"===a?n1(e.requestHeaders):void 0,s="headers"===a||"all"===a?n1(e.responseHeaders):void 0,o="body"===a||"all"===a?n2(e.requestBody):void 0,l="body"===a||"all"===a?n2(e.responseBody):void 0,d=n4(e.metadata);return i||=(n?.redacted??!1)||(r?.redacted??!1)||(s?.redacted??!1)||(o?.redacted??!1)||(l?.redacted??!1)||d.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...n?{url:n.value}:{},...void 0!==e.status?{status:e.status}:{},...void 0!==e.durationMs?{durationMs:e.durationMs}:{},...r?.value?{requestHeaders:r.value}:{},...s?.value?{responseHeaders:s.value}:{},...o?.value!==void 0?{requestBody:o.value}:{},...l?.value!==void 0?{responseBody:l.value}:{},...d.value?{metadata:d.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:i,...n.notes?{notes:n.notes}:{}}},n7=async(e,t={})=>{var n,a;let r;if(!e.backend.measurePerf)throw new Y("UNSUPPORTED_OPERATION","diagnostics.perf is not supported by this backend");return r=!0===(n=await e.backend.measurePerf(await ae(e,t),{...an(a=t),...void 0!==a.sampleMs?{sampleMs:T(a.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==a.metrics?{metrics:aa(a.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:n.metrics.map(e=>{let t=n3(e.message,4096),n=n4(e.metadata);return r||=t.redacted||n.redacted,{name:e.name,...void 0!==e.value?{value:e.value}:{},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...void 0!==t.value?{message:t.value}:{},...n.value?{metadata:n.value}:{}}}),...n.startedAt?{startedAt:n.startedAt}:{},...n.endedAt?{endedAt:n.endedAt}:{},...n.backend?{backend:n.backend}:{},redacted:r,...n.notes?{notes:n.notes}:{}}};async function ae(e,t){let n=_(e,t),a=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??a?.appId?{appId:t.appId??a?.appId}:{},...t.appBundleId??a?.appBundleId?{appBundleId:t.appBundleId??a?.appBundleId}:{}}}function at(e,t,n,a){return{...an(e),...void 0!==e.cursor?{cursor:nP(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:T(e.limit,a,1,n)}}function an(e){return{...void 0!==e.since?{since:nP(e.since,"since")}:{},...void 0!==e.until?{until:nP(e.until,"until")}:{}}}function aa(e,t,n=50){if(!Array.isArray(e))throw new Y("INVALID_ARGS",`${t} must be an array of strings`);if(e.length>n)throw new Y("INVALID_ARGS",`${t} must contain at most ${n} entries`);return e.map((e,n)=>nP(e,`${t}[${n}]`))}let ar=async(e,t)=>{let n=as(t.action,"record"),a="start"===n?e.backend.startRecording:e.backend.stopRecording;if(!a)throw new Y("UNSUPPORTED_OPERATION",`record ${n} is not supported by this backend`);let r=t.out?await tq(e,t.out,{field:"path",ext:".mp4"}):void 0;try{var i,s,o,l,d,u,c;let p,h,f,m,w=(i=t,s=r?.path,p={},s&&(p.outPath=s),h=(o=i.fps,void 0===o?void 0:T(o,"fps",1,60)),void 0!==h&&(p.fps=h),f=(l=i.maxSize,void 0===l?void 0:T(l,"maxSize",1,Number.MAX_SAFE_INTEGER)),void 0!==f&&(p.maxSize=f),m=function(e){if(void 0===e)return;let t=g(e);if(void 0===t)throw new Y("INVALID_ARGS","quality must be one of: medium, high (legacy numeric values 5-10 are accepted)");return t}(i.quality),void 0!==m&&(p.quality=m),void 0!==i.hideTouches&&(p.showTouches=!0!==i.hideTouches),p),b=await a.call(e.backend,_(e,t),w),y=await r?.publish();return d=n,u=b,c=y,{..."string"==typeof u.path?{path:u.path}:{},..."string"==typeof u.telemetryPath?{telemetryPath:u.telemetryPath}:{},..."string"==typeof u.warning?{warning:u.warning}:{},...ao(d,u,c,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await r?.cleanup?.(),e}},ai=async(e,t)=>{let n=as(t.action,"trace"),a="start"===n?e.backend.startTrace:e.backend.stopTrace;if(!a)throw new Y("UNSUPPORTED_OPERATION",`trace ${n} is not supported by this backend`);let r=t.out?await tq(e,t.out,{field:"outPath",ext:".trace"}):void 0;try{var i,s,o;let l={...r?.path?{outPath:r.path}:{}},d=await a.call(e.backend,_(e,t),l),u=await r?.publish();return i=n,s=d,o=u,{..."string"==typeof s.outPath?{outPath:s.outPath}:{},...ao(i,s,o,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await r?.cleanup?.(),e}};function as(e,t){if("start"===e||"stop"===e)return e;throw new Y("INVALID_ARGS",`${t} action must be start or stop`)}function ao(e,t,n,a){return{kind:"start"===e?a.startKind:a.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...R("start"===e?a.startMessage:a.stopMessage)}}let al=async(e,t={})=>{if(!e.backend.pressBack)throw new Y("UNSUPPORTED_OPERATION","system.back is not supported by this backend");let n=t.mode??"in-app";if("in-app"!==n&&"system"!==n)throw new Y("INVALID_ARGS","system.back mode must be in-app or system");let a=I(await e.backend.pressBack(_(e,t),{mode:n}));return{kind:"systemBack",mode:n,...a?{backendResult:a}:{},...R("Back")}},ad=async(e,t={})=>{if(!e.backend.pressHome)throw new Y("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let n=I(await e.backend.pressHome(_(e,t)));return{kind:"systemHome",...n?{backendResult:n}:{},...R("Home")}},au=async(e,t)=>{if(!e.backend.rotate)throw new Y("UNSUPPORTED_OPERATION","system.rotate is not supported by this backend");let n=function(e){switch(e){case"portrait":case"portrait-upside-down":case"landscape-left":case"landscape-right":return e;default:throw new Y("INVALID_ARGS","system.rotate orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right")}}(t.orientation),a=I(await e.backend.rotate(_(e,t),n));return{kind:"systemRotated",orientation:n,...a?{backendResult:a}:{},...R(`Rotated to ${n}`)}},ac=async(e,t={})=>{var n,a,r,i,s,o,l;if(!e.backend.setKeyboard)throw new Y("UNSUPPORTED_OPERATION","system.keyboard is not supported by this backend");let d=t.action??"status";if(!eY(d))throw new Y("INVALID_ARGS","system.keyboard action must be status, get, dismiss, enter, or return");let u=await e.backend.setKeyboard(_(e,t),{action:d}),c=I(u),p=(n=u)&&"object"==typeof n?u:{};return"enter"===d||"return"===d?{kind:"keyboardEnterPressed",action:"enter",state:p,...(a=c)?{backendResult:a}:{},...R("Keyboard enter pressed")}:"dismiss"===d?(r=d,{kind:"keyboardDismissed",action:r,state:i=p,...(s=c)?{backendResult:s}:{},...R(!1===i.dismissed?"Keyboard already hidden":"Keyboard dismissed")}):(o=d,{kind:"keyboardState",action:o,state:p,...(l=c)?{backendResult:l}:{}})},ap=async(e,t)=>{if("read"===t.action){if(!e.backend.getClipboard)throw new Y("UNSUPPORTED_OPERATION","system.clipboard read is not supported by this backend");let n=await e.backend.getClipboard(_(e,t));return{kind:"clipboardText",action:"read",text:"string"==typeof n?n:n.text}}if("write"!==t.action)throw new Y("INVALID_ARGS","system.clipboard action must be read or write");if(!e.backend.setClipboard)throw new Y("UNSUPPORTED_OPERATION","system.clipboard write is not supported by this backend");if("string"!=typeof t.text)throw new Y("INVALID_ARGS","system.clipboard write requires text");let n=I(await e.backend.setClipboard(_(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...R("Clipboard updated")}},ah=async(e,t={})=>{if(!e.backend.openSettings)throw new Y("UNSUPPORTED_OPERATION","system.settings is not supported by this backend");let n=nR(t.target,"target"),a=I(await e.backend.openSettings(_(e,t),n));return{kind:"settingsOpened",...n?{target:n}:{},...a?{backendResult:a}:{},...R(n?`Opened settings: ${n}`:"Opened settings")}},af=async(e,t={})=>{var n,a;if(!e.backend.handleAlert)throw new Y("UNSUPPORTED_OPERATION","system.alert is not supported by this backend");let r=t.action??"get";if("get"!==r&&"accept"!==r&&"dismiss"!==r&&"wait"!==r)throw new Y("INVALID_ARGS","system.alert action must be get, accept, dismiss, or wait");let i=void 0===t.timeoutMs?void 0:T(t.timeoutMs,"timeoutMs",0,12e4),s=await e.backend.handleAlert(_(e,t),r,{timeoutMs:i});return n=r,a=s,"get"===n?function(e){if("alertStatus"!==e.kind)throw new Y("COMMAND_FAILED","system.alert get returned an invalid backend result");return{kind:"alertStatus",action:"get",alert:e.alert}}(a):"wait"===n?function(e){if("alertWait"!==e.kind)throw new Y("COMMAND_FAILED","system.alert wait returned an invalid backend result");return{kind:"alertWait",action:"wait",alert:e.alert,...void 0!==e.waitedMs?{waitedMs:e.waitedMs}:{},...void 0!==e.timedOut?{timedOut:e.timedOut}:{},...R(e.alert?"Alert visible":"Alert wait timed out")}}(a):function(e,t){if("alertHandled"!==t.kind)throw new Y("COMMAND_FAILED",`system.alert ${e} returned an invalid backend result`);return{kind:"alertHandled",action:e,handled:t.handled,...t.alert?{alert:t.alert}:{},...t.button?{button:t.button}:{},...R(t.handled?`Alert ${e}ed`:"No alert handled")}}(n,a)},am=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new Y("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let n=I(await e.backend.openAppSwitcher(_(e,t)));return{kind:"appSwitcherOpened",...n?{backendResult:n}:{},...R("Opened app switcher")}};function aw(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??function(e=[]){let t=new Map(e.map(e=>[e.name,ag(e)]));return{get:e=>ag(t.get(e)),set:e=>{t.set(e.name,ag(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>ag(e))}}(),policy:e.policy??function(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,capture:{screenshot:e=>tJ(t,e),diffScreenshot:e=>tX(t,e),snapshot:e=>t2(t,e),diffSnapshot:e=>t4(t,e)},selectors:{find:e=>nc(t,e),get:e=>np(t,e),getText:(e,n={})=>nh(t,{...n,target:e}),getAttrs:(e,n={})=>nf(t,{...n,target:e}),is:e=>nm(t,e),isVisible:(e,n={})=>nw(t,{...n,target:e}),isHidden:(e,n={})=>ng(t,{...n,target:e}),wait:e=>nb(t,e),waitForText:(e,n={})=>ny(t,{...n,text:e})},interactions:{click:(e,n={})=>t9(t,{...n,target:e}),press:(e,n={})=>t6(t,{...n,target:e}),fill:(e,n,a={})=>t7(t,{...a,target:e,text:n}),typeText:(e,n={})=>ne(t,{...n,text:e}),focus:(e,n={})=>w(t,{...n,target:e}),longPress:(e,n={})=>f(t,{...n,target:e}),swipe:e=>N(t,e),scroll:e=>h(t,e),pinch:e=>U(t,e)},system:{back:e=>al(t,e),home:e=>ad(t,e),rotate:e=>au(t,e),keyboard:e=>ac(t,e),clipboard:e=>ap(t,e),settings:e=>ah(t,e),alert:e=>af(t,e),appSwitcher:e=>am(t,e)},apps:{open:e=>nG(t,e),close:e=>nX(t,e),list:(e={})=>nY(t,{...e,filter:em(e.filter)}),state:e=>nF(t,e),push:e=>nK(t,e),triggerEvent:e=>nV(t,e)},admin:{devices:e=>nN(t,e),boot:e=>nS(t,e),shutdown:e=>nO(t,e),install:e=>nD(t,e),reinstall:e=>n_(t,e),installFromSource:e=>nE(t,e)},recording:{record:e=>ar(t,e),trace:e=>ai(t,e)},observability:{logs:e=>n6(t,e),network:e=>n9(t,e),perf:e=>n7(t,e)}}}function ag(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:function(e){try{return structuredClone(e)}catch{return{...e}}}(e.metadata)}:{}}}function ab(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}export{eB as CLOUD_WEBDRIVER_PROVIDERS,eD as appendScriptSeriesFlags,aw as createAgentDevice,e8 as decodePngAsync,e6 as encodePngAsync,ns as evaluateIsPredicate,eF as findMistargetedTypeRefToken,eL as formatPortableActionLine,eO as formatScriptActionSummary,eI as formatScriptArg,eR as formatScriptStringLiteral,ex as isClickLikeCommand,eG as isCloudWebDriverProviderName,eY as isKeyboardAction,ni as isSupportedPredicate,eA as isTouchTargetCommand,ab as localCommandPolicy,eU as parseReplayOpenFlags,eT as parseReplayRuntimeFlags,eE as parseReplaySeriesFlags,e5 as prewarmPngWorker,e3 as terminatePngWorker,e$ as timingSafeStringEqual};
|
package/dist/src/8184.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{setSessionSnapshot as e,captureSnapshot as r,isNavigationSensitiveAction as t,markPendingInteractionOutcome as n,markPostGestureStabilization as o,getSnapshotReferenceFrame as i,recordTouchVisualizationEvent as a,markAndroidSnapshotFreshness as c,stripInternalInteractionFlags as s}from"./9722.js";import{isSparseSnapshotQualityVerdict as d,successText as f}from"./2948.js";import{getAndroidScreenSize as u}from"./input-actions.js";import{emitDiagnostic as l}from"./
|
|
1
|
+
import{setSessionSnapshot as e,captureSnapshot as r,isNavigationSensitiveAction as t,markPendingInteractionOutcome as n,markPostGestureStabilization as o,getSnapshotReferenceFrame as i,recordTouchVisualizationEvent as a,markAndroidSnapshotFreshness as c,stripInternalInteractionFlags as s}from"./9722.js";import{isSparseSnapshotQualityVerdict as d,successText as f}from"./2948.js";import{getAndroidScreenSize as u}from"./input-actions.js";import{emitDiagnostic as l}from"./8875.js";async function h(t,n,o,i,a){let c={...n??{},snapshotInteractiveOnly:a.interactiveOnly},s=i(c,t.appBundleId,t.trace?.outPath),{snapshot:f}=await r({device:t.device,session:t,flags:c,outPath:c.out,logPath:s.logPath??"",includeRects:a.includeRects,androidFreshnessMode:a.androidFreshnessMode});return d(f.snapshotQuality)||(e(t,f),o.set(t.name,t)),f}function p(e){var r,t,n;let o,i,a,c,{data:s,fallbackX:d,fallbackY:u,referenceFrame:l,extra:h}=e,p=(r=h,t=d,n=u,o="string"==typeof r?.ref?r.ref:void 0,i="string"==typeof r?.button?r.button:void 0,a="string"==typeof r?.gesture?r.gesture:void 0,c=void 0===t||void 0===n?"":` (${t}, ${n})`,("string"==typeof r?.text?`Filled ${Array.from(r.text).length} chars`:o?"longpress"===a?`Long pressed @${o}${c}`:i&&"primary"!==i?`Clicked ${i} @${o}${c}`:`Tapped @${o}${c}`:void 0)??("string"==typeof s?.message?s.message:void 0));return{...void 0===d||void 0===u?{}:{x:d,y:u},...l??{},...h??{},...s??{},...f(p)}}function g(e){let{session:r,sessionStore:i,command:d,positionals:f,retryPositionals:u,flags:l,result:h,responseData:p,actionStartedAt:g,actionFinishedAt:_,androidFreshnessBaseline:m}=e,v=s(l);return i.recordAction(r,{command:d,positionals:f,flags:v??{},result:h}),n({session:r,command:d,positionals:u??f,flags:l,preSnapshot:r.snapshot}),t(d)&&c(r,d,m??r.snapshot),o(r,d,u??f,l),a(r,d,f,h,v??{},g,_),{ok:!0,data:p}}async function _(e){let{session:r,flags:t,sessionStore:n,contextFromFlags:o,captureSnapshotForSession:a}=e;if(!r.recording)return;if(r.recording.touchReferenceFrame)return r.recording.touchReferenceFrame;if("android"===r.device.platform){let e=await u(r.device),t={referenceWidth:e.width,referenceHeight:e.height};return r.recording&&(r.recording.touchReferenceFrame=t),t}let c=i(r.snapshot);if(c)return r.recording&&(r.recording.touchReferenceFrame=c),c;if(!r.recording)return;let s=i(await a(r,t,n,o,{interactiveOnly:!0}));return s&&r.recording&&(r.recording.touchReferenceFrame=s),s}async function m(e){try{return await _(e)}catch(r){l({level:"warn",phase:"touch_reference_frame_resolve_failed",data:{platform:e.session.device.platform,error:r instanceof Error?r.message:String(r)}});return}}function v(e){return i({nodes:e,createdAt:0})}export{p as buildTouchVisualizationResult,g as finalizeTouchInteraction,h as interaction_snapshot_captureSnapshotForSession,v as readSnapshotNodesReferenceFrame,m as resolveDirectTouchReferenceFrameSafely};
|
package/dist/src/8414.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"node:os";import t from"node:path";import{promises as i}from"node:fs";import{runXcrun as n,IOS_DEVICECTL_DEFAULT_HINT as r,prewarmAppleRunnerCache as o,resolveIosDevicectlHint as a,isActiveProviderDevice as s,context_contextFromFlags as d}from"./9722.js";import{
|
|
2
|
-
${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":r)}export{
|
|
1
|
+
import e from"node:os";import t from"node:path";import{promises as i}from"node:fs";import{runXcrun as n,IOS_DEVICECTL_DEFAULT_HINT as r,prewarmAppleRunnerCache as o,resolveIosDevicectlHint as a,isActiveProviderDevice as s,context_contextFromFlags as d}from"./9722.js";import{isIosFamily as c}from"./6849.js";import{isDeepLinkTarget as l}from"./3340.js";import{AppError as u}from"./485.js";function f(e){let{req:t,logPath:i,traceLogPath:n}=e;return{verbose:t.flags?.verbose,logPath:i,traceLogPath:n,requestId:t.meta?.requestId,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir}}function p(e){let{req:t,logPath:i,appBundleId:n,traceLogPath:r}=e;return{...f({req:t,logPath:i,traceLogPath:r}),runnerLeaseContext:d(i,t.flags,n,r,t.meta?.requestId,t.meta).runnerLeaseContext}}function m(e){let{req:t,logPath:i,device:n,traceLogPath:r,enabled:a}=e;if(a&&c(n)&&"simulator"===n.kind)return e=>o(e,f({req:t,logPath:i,traceLogPath:r}))}function S(e){let{req:t,logPath:i,device:n,surface:r,openTarget:o,traceLogPath:a}=e;return m({req:t,logPath:i,device:n,traceLogPath:a,enabled:"app"===r&&!!o&&!l(o??"")})}let _=new Map;async function v(e,t={}){var i;let n;if(s(e))return;let r=(n="simulator"===(i=e).kind?i.simulatorSetPath??"":"",JSON.stringify([i.platform,i.kind,i.id,i.target??"",n])),o=_.get(r);if(void 0!==o){if(o>Date.now()&&!t.focusExisting)return;_.delete(r)}if(c(e)){if("simulator"===e.kind){let{ensureBootedSimulator:i}=await import("./simulator.js");await i(e,{deviceHub:t.deviceHub,focusExisting:t.focusExisting,onColdBootStart:t.onIosSimulatorColdBootStart}),C(r);return}if("device"===e.kind){await w(e.id),C(r);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./3340.js");await t(e.id),C(r)}}function C(e){_.set(e,Date.now()+5e3)}async function w(r){let o=t.join(e.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),a=Math.max(1,Math.ceil(15));try{let e=await n(["devicectl","device","info","details","--device",r,"--json-output",o,"--timeout",String(a)],{allowFailure:!0,timeoutMs:18e3}),t=String(e.stdout??""),i=String(e.stderr??""),s=await h(o);if(0===e.exitCode){if(!s.parsed)throw new u("COMMAND_FAILED","iOS device readiness probe failed",{kind:"probe_inconclusive",deviceId:r,stdout:t,stderr:i,hint:"CoreDevice returned success but readiness JSON output was missing or invalid. Retry; if it persists restart Xcode and the iOS device."});let e=s?.tunnelState?.toLowerCase();if("connecting"===e)throw new u("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:r,tunnelState:e,hint:"Device tunnel is still connecting. Keep the device unlocked and connected by cable until it is fully available in Xcode Devices, then retry."});return}throw new u("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:r,stdout:t,stderr:i,exitCode:e.exitCode,tunnelState:s?.tunnelState,hint:g(t,i)})}catch(e){if(e instanceof u&&"COMMAND_FAILED"===e.code){if("not_ready"===("string"==typeof e.details?.kind?e.details.kind:""))throw e;let t=e.details??{},i=String(t.stdout??""),n=String(t.stderr??""),o=Number(t.timeoutMs??15e3),a=`CoreDevice did not respond within ${o}ms. Keep the device unlocked and trusted, then retry; if it persists restart Xcode and the iOS device.`;throw new u("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:r,cause:e.message,timeoutMs:o,stdout:i,stderr:n,hint:i||n?g(i,n):a},e)}throw new u("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:r,hint:"Reconnect the device, keep it unlocked, and retry."},e instanceof Error?e:void 0)}finally{await i.rm(o,{force:!0}).catch(()=>{})}}async function h(e){try{let t=await i.readFile(e,"utf8"),n=JSON.parse(t),r=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let i=t.connectionProperties?.tunnelState,n=t.device?.connectionProperties?.tunnelState,r="string"==typeof i?i:"string"==typeof n?n:void 0;return r?{tunnelState:r}:{}}(n);return{parsed:!0,tunnelState:r.tunnelState}}catch{return{parsed:!1}}}function g(e,t){let i=a(e,t);return i||(`${e}
|
|
2
|
+
${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":r)}export{f as buildAppleRunnerRequestOptions,p as buildAppleRunnerSessionOptions,S as createAppleRunnerCacheColdBootPrewarmForOpen,m as createAppleRunnerCachePrewarmOnColdBoot,v as ensureDeviceReady};
|
package/dist/src/8875.js
CHANGED
|
@@ -1 +1,4 @@
|
|
|
1
|
-
import{AsyncLocalStorage as
|
|
1
|
+
import{AsyncLocalStorage as e}from"node:async_hooks";import t from"node:crypto";import n,{constants as r}from"node:fs";import o from"node:os";import i from"node:path";import{access as a,stat as s}from"node:fs/promises";import{spawn as u,spawnSync as d}from"node:child_process";import{Readable as l}from"node:stream";import{pipeline as c}from"node:stream/promises";import{redactDiagnosticData as f,AppError as m}from"./485.js";let p=new e;function g(){return t.randomBytes(8).toString("hex")}async function w(e,n){let r={...e,diagnosticId:`${Date.now().toString(36)}-${t.randomBytes(4).toString("hex")}`,events:[],liveWrittenEventCount:0,phaseCounts:new Map};return await p.run(r,n)}function h(e){let t=p.getStore();t&&Object.assign(t,e)}function v(){let e=p.getStore();return e?{diagnosticId:e.diagnosticId,requestId:e.requestId,session:e.session,command:e.command,debug:e.debug,flushOnSuccess:e.flushOnSuccess}:{}}function S(e){let t=p.getStore();if(!t)return 0;let n=0;for(let r of e)n+=t.phaseCounts.get(r)??0;return n}function y(e){let t=p.getStore();if(!t)return;let n={ts:new Date().toISOString(),level:e.level??"info",phase:e.phase,session:t.session,requestId:t.requestId,command:t.command,durationMs:e.durationMs,data:e.data?f(e.data):void 0};if(t.events.push(n),t.phaseCounts.set(e.phase,(t.phaseCounts.get(e.phase)??0)+1),!t.debug)return;let r=`${JSON.stringify(n)}
|
|
2
|
+
`;try{t.logPath&&(b(t.logPath,r),t.liveWrittenEventCount=t.events.length),t.traceLogPath&&b(t.traceLogPath,r),t.logPath||t.traceLogPath||process.stderr.write(`[agent-device][diag] ${r}`)}catch{}}async function I(e,t,n){let r=Date.now();try{let o=await t();return y({level:"info",phase:e,durationMs:Date.now()-r,data:n}),o}catch(t){throw y({level:"error",phase:e,durationMs:Date.now()-r,data:{...n??{},error:t instanceof Error?t.message:String(t)}}),t}}function A(e={}){let t=p.getStore();if(!t||!e.force&&!t.debug&&!t.flushOnSuccess||0===t.events.length)return null;try{if(t.logPath){let e=t.events.slice(t.liveWrittenEventCount);if(e.length>0){let n=e.map(e=>JSON.stringify(f(e)));b(t.logPath,`${n.join("\n")}
|
|
3
|
+
`)}let n=t.logPath;return t.events=[],t.liveWrittenEventCount=0,n}let e=(t.session??"default").replace(/[^a-zA-Z0-9._-]/g,"_"),r=new Date().toISOString().slice(0,10),a=i.join(o.homedir(),".agent-device","logs",e,r);n.mkdirSync(a,{recursive:!0});let s=new Date().toISOString().replace(/[:.]/g,"-"),u=i.join(a,`${s}-${t.diagnosticId}.ndjson`),d=t.events.map(e=>JSON.stringify(f(e)));return n.writeFileSync(u,`${d.join("\n")}
|
|
4
|
+
`),t.events=[],u}catch{return null}}function b(e,t){n.mkdirSync(i.dirname(e),{recursive:!0}),n.appendFileSync(e,t,"utf8")}let E=new Set(["1","true","yes","on"]),$=new Set(["0","false","no","off"]);function C(e){return`AGENT_DEVICE_${e.replace(/([A-Z])/g,"_$1").replace(/[^A-Za-z0-9_]/g,"_").toUpperCase()}`}function D(e,t,n,r){if(e.multiple)return(Array.isArray(t)?t:[t]).map(t=>D({...e,multiple:!1},t,n,r));if("boolean"===e.type){var o=t,i=n,a=r;if("boolean"==typeof o)return o;if("string"==typeof o){let e=_(o);if(void 0!==e)return e}throw new m("INVALID_ARGS",`Invalid value for "${a}" in ${i}. Expected boolean.`)}if("booleanOrString"===e.type){if("boolean"==typeof t)return t;if("string"==typeof t&&void 0!==_(t))return _(t);if("string"==typeof t&&t.trim().length>0)return t;throw new m("INVALID_ARGS",`Invalid value for "${r}" in ${n}. Expected boolean or non-empty string.`)}if("string"===e.type){if("string"==typeof t&&t.trim().length>0)return t;throw new m("INVALID_ARGS",`Invalid value for "${r}" in ${n}. Expected non-empty string.`)}if("enum"===e.type){if(void 0!==e.setValue){var s=e,u=t,d=n,l=r;let o=s.setValue;if(u===o)return o;if("string"==typeof u){let e=u.trim();if(""===e||"true"===e||"1"===e)return o;if("false"===e||"0"===e)return}if(!0===u)return o;if(!1!==u)throw new m("INVALID_ARGS",`Invalid value for "${l}" in ${d}. Expected boolean-like value for enum flag.`);return}if("string"!=typeof t||!e.enumValues?.includes(t))throw new m("INVALID_ARGS",`Invalid value for "${r}" in ${n}. Expected one of: ${e.enumValues?.join(", ")}.`);return t}let c="number"==typeof t?t:"string"==typeof t?Number(t):NaN;if(!Number.isFinite(c)||!Number.isInteger(c))throw new m("INVALID_ARGS",`Invalid value for "${r}" in ${n}. Expected integer.`);if("number"==typeof e.min&&c<e.min)throw new m("INVALID_ARGS",`Invalid value for "${r}" in ${n}. Must be >= ${e.min}.`);if("number"==typeof e.max&&c>e.max)throw new m("INVALID_ARGS",`Invalid value for "${r}" in ${n}. Must be <= ${e.max}.`);return c}function _(e){let t=e.trim().toLowerCase();return!!E.has(t)||!$.has(t)&&void 0}let N=/^[A-Za-z0-9][A-Za-z0-9._+-]*$/,O=[".com",".exe",".bat",".cmd"],M=new e;async function L(e,t){return e?await M.run(e,t):await t()}async function x(e){return await M.run(void 0,e)}async function P(e,t,n={}){let r=M.getStore()?.(e,t,n);return r?await r:await F(e,t,n)}async function B(e,t,n={}){let r=M.getStore()?.(e,t,n);return r?await r:await F(e,t,n)}function F(e,t,n={}){let r=J(e),o=q();return new Promise((i,a)=>{let s=u(r,t,{cwd:n.cwd,env:n.env,stdio:["pipe","pipe","pipe"],detached:n.detached,windowsHide:!0,shell:!1});n.onSpawn?.(s);let d="",l=n.binaryStdout?[]:void 0,c="",f=!1,p=er(n.timeoutMs),g=p?setTimeout(()=>{f=!0,ei(s,n.detached)},p):null,w=eo(s,n);n.binaryStdout||s.stdout.setEncoding("utf8"),s.stderr.setEncoding("utf8"),ea(s,n.stdin).catch(o=>{var i,u,d,l;w.didAbort||f||(i=o)instanceof Error&&"code"in i&&"EPIPE"===i.code||(a((u=r,d=e,new m("COMMAND_FAILED",`Failed to write stdin for ${u}`,{cmd:d,args:t},(l=o)instanceof Error?l:void 0))),ei(s,n.detached))}),s.stdout.on("data",e=>{if(n.binaryStdout)return void l?.push(Buffer.isBuffer(e)?e:Buffer.from(e));let t=String(e);d+=t,n.onStdoutChunk?.(t)}),s.stderr.on("data",e=>{let t=String(e);c+=t,n.onStderrChunk?.(t)}),s.on("error",n=>{g&&clearTimeout(g),w.dispose(),o.emitForegroundCompletion(e,t),a(X(w,r,e,t,n))}),s.on("close",s=>{g&&clearTimeout(g),w.dispose(),o.emitForegroundCompletion(e,t);let u=s??1;if(!w.didAbort&&f&&p){var h,v,S,y,I,A;return void a((h=r,v=e,S=t,y=p,I=u,A=d,new m("COMMAND_FAILED",`${h} timed out after ${y}ms`,{cmd:v,args:S,stdout:A,stderr:c,exitCode:I,timeoutMs:y})))}let b=Q(w,r,e,t,u,n.allowFailure,d,c);b?a(b):i({stdout:d,stderr:c,exitCode:u,stdoutBuffer:l?Buffer.concat(l):void 0})})})}async function T(e){let t=ee(e);if(!t)return!1;if(i.isAbsolute(t))return et(t);let n=process.env.PATH;if(!n)return!1;let r=function(){if("win32"!==process.platform)return[""];let e=process.env.PATHEXT;if(!e)return O;let t=e.split(";").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0);return t.length>0?t:O}();for(let e of n.split(i.delimiter)){let n=e.trim();if(n){for(let e of function(e,t){if("win32"!==process.platform)return[e];let n=e.toLowerCase();return t.some(e=>n.endsWith(e))?[e]:t.map(t=>`${e}${t}`)}(t,r))if(await et(i.join(n,e)))return!0}}return!1}async function V(e,t){let n=Y(e,t,"executable");if(n){if(!await et(n))throw new m("TOOL_MISSING",`${t} points to a missing or non-executable file: ${n}`,{envName:t,path:n});return n}}async function G(e,t){let n=Y(e,t,"file");if(n){if(!await en(n))throw new m("TOOL_MISSING",`${t} points to a missing or non-file path: ${n}`,{envName:t,path:n});return n}}function k(e,t,n={}){let r=J(e),o=d(r,t,{cwd:n.cwd,env:n.env,stdio:["pipe","pipe","pipe"],encoding:n.binaryStdout?void 0:"utf8",input:n.stdin,timeout:er(n.timeoutMs),windowsHide:!0,shell:!1,...void 0!==n.maxBuffer?{maxBuffer:n.maxBuffer}:{}});if(o.error){let i=o.error.code;if("ETIMEDOUT"===i)throw new m("COMMAND_FAILED",`${r} timed out after ${er(n.timeoutMs)}ms`,{cmd:e,args:t,timeoutMs:er(n.timeoutMs)},o.error);if("ENOENT"===i)throw W(r,e,o.error);throw Z(r,e,t,o.error)}let i=n.binaryStdout?Buffer.isBuffer(o.stdout)?o.stdout:Buffer.from(o.stdout??""):void 0,a=n.binaryStdout?"":"string"==typeof o.stdout?o.stdout:(o.stdout??"").toString(),s="string"==typeof o.stderr?o.stderr:(o.stderr??"").toString(),u=o.status??1;if(0!==u&&!n.allowFailure)throw U(r,e,t,u,a,s);return{stdout:a,stderr:s,exitCode:u,stdoutBuffer:i}}function R(e,t,n={}){return H(e,t,n).pid}function H(e,t,n={}){let r=u(J(e),t,{cwd:n.cwd,env:n.env,stdio:n.stdio??"ignore",detached:!0,windowsHide:!0,shell:!1}),o=r.pid??0,i=new Promise(e=>{r.once("error",t=>{e({pid:o,error:t.message})}),r.once("exit",(t,n)=>{e({pid:o,..."number"==typeof t?{exitCode:t}:{},...n?{signal:n}:{}})})});return r.unref(),{pid:o,exited:i}}function j(e,t,n={}){let r=J(e),o=q(),i=u(r,t,{cwd:n.cwd,env:n.env,stdio:n.stdio??["ignore","pipe","pipe"],detached:n.detached,windowsHide:!0,shell:!1});o.emitBackgroundSpawn(e,t);let a="",s="",d=n.captureOutput??!0,l=eo(i,n);d&&(i.stdout?.setEncoding("utf8"),i.stderr?.setEncoding("utf8"),i.stdout?.on("data",e=>{a+=e}),i.stderr?.on("data",e=>{s+=e}));let c=new Promise((u,d)=>{i.on("error",n=>{l.dispose(),o.emitBackgroundCompletion(e,t,"error"),d(X(l,r,e,t,n))}),i.on("close",i=>{l.dispose(),o.emitBackgroundCompletion(e,t,"exit");let c=i??1,f=Q(l,r,e,t,c,n.allowFailure,a,s);f?d(f):u({stdout:a,stderr:s,exitCode:c})})});return{child:i,wait:c}}function q(){let e=v(),t=!0===e.debug,n=!0===_(process.env.AGENT_DEVICE_EXEC_TRACE??"");if(!t&&!n)return{emitForegroundCompletion:()=>{},emitBackgroundSpawn:()=>{},emitBackgroundCompletion:()=>{}};n&&!0!==e.flushOnSuccess&&h({flushOnSuccess:!0});let r=Date.now(),o=!1;return{emitForegroundCompletion:(e,t)=>{o||(o=!0,K({cmd:e,args:t,startedAtMs:r}))},emitBackgroundSpawn:(e,t)=>{K({cmd:e,args:t,data:{event:"spawn"}})},emitBackgroundCompletion:(e,t,n)=>{o||(o=!0,K({cmd:e,args:t,startedAtMs:r,data:{event:n}}))}}}function K(e){let t=e.args.slice(0,6);y({level:"debug",phase:"exec_command",durationMs:void 0===e.startedAtMs?void 0:Math.max(0,Date.now()-e.startedAtMs),data:{command:e.cmd,argsPrefix:t,...e.args.length>t.length?{omittedArgCount:e.args.length-t.length}:{},...e.data??{}}})}function J(e){let t=ee(e);if(!t)throw new m("INVALID_ARGS",`Invalid executable command: ${JSON.stringify(e)}`,{cmd:e,hint:"Use a bare command name from PATH or an absolute executable path."});return t}function W(e,t,n){return new m("TOOL_MISSING",`${e} not found in PATH`,{cmd:t},n)}function Z(e,t,n,r){return new m("COMMAND_FAILED",`Failed to run ${e}`,{cmd:t,args:n},r)}function z(e,t,n){return new m("COMMAND_FAILED","request canceled",{cmd:t,args:n,executable:e,reason:"request_canceled"})}function U(e,t,n,r,o,i){return new m("COMMAND_FAILED",`${e} exited with code ${r}`,{cmd:t,args:n,stdout:o,stderr:i,exitCode:r,processExitError:!0})}function X(e,t,n,r,o){return e.didAbort?z(t,n,r):"ENOENT"===o.code?W(t,n,o):Z(t,n,r,o)}function Q(e,t,n,r,o,i,a,s){return e.didAbort?z(t,n,r):0===o||i?null:U(t,n,r,o,a,s)}function Y(e,t,n){let r=e?.trim();if(r){if(!i.isAbsolute(r)||r.includes("\0"))throw new m("INVALID_ARGS",`${t} must be an absolute ${n} path, not ${JSON.stringify(e)}`,{envName:t,path:e});return r}}function ee(e){let t=e.trim();return!t||t.includes("\0")?null:i.isAbsolute(t)?t:t.includes("/")||t.includes("\\")?null:N.test(t)?t:null}async function et(e){try{if(!await en(e))return!1;return await a(e,"win32"===process.platform?r.F_OK:r.X_OK),!0}catch{return!1}}async function en(e){try{return(await s(e)).isFile()}catch{return!1}}function er(e){if(!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t}function eo(e,t){let n=!1,r=()=>{n=!0,ei(e,t.detached)};return t.signal?.aborted?r():t.signal?.addEventListener("abort",r,{once:!0}),{get didAbort(){return n},dispose:()=>{t.signal?.removeEventListener("abort",r)}}}function ei(e,t){if(t&&e.pid&&"win32"!==process.platform)try{process.kill(-e.pid,"SIGKILL");return}catch{}e.kill("SIGKILL")}async function ea(e,t){if(e.stdin){if(void 0===t)return void e.stdin?.end();await c(l.from([t]),e.stdin)}}export{C as buildPrimaryEnvVarName,S as countDiagnosticEventsByPhase,g as createRequestId,y as emitDiagnostic,A as flushDiagnosticsToSessionFile,v as getDiagnosticsMeta,et as isExecutablePath,_ as parseBooleanLiteral,D as parseSourceValue,V as resolveExecutableOverridePath,G as resolveFileOverridePath,P as runCmd,j as runCmdBackground,R as runCmdDetached,H as runCmdDetachedMonitored,B as runCmdStreaming,k as runCmdSync,h as updateDiagnosticsScope,T as whichCmd,L as withCommandExecutorOverride,I as withDiagnosticTimer,w as withDiagnosticsScope,x as withoutCommandExecutorOverride};
|
package/dist/src/9624.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{emitDiagnostic as e}from"./
|
|
1
|
+
import{emitDiagnostic as e}from"./8875.js";import{AppError as t}from"./485.js";import{isClipboardShellUnsupported as i,resolveAndroidAdbExecutor as n}from"./3340.js";import{sleep as r}from"./5560.js";let o=new Set(["com.google.android.inputmethod.latin","com.samsung.android.honeyboard","com.touchtype.swiftkey","com.microsoft.swiftkey"]);function a(e){let t=u(e.packageName),i=(e.resourceId??"").toLowerCase(),n=u(e.activeInputMethodPackage);if(t&&n&&t===n)return{inputMethodOwned:!0,source:"active-input-method"};if(n&&i.startsWith(`${n}:id/`))return{inputMethodOwned:!0,source:"active-input-method-resource"};if(t&&o.has(t))return{inputMethodOwned:!0,source:"known-ime-package"};for(let e of o)if(i.startsWith(`${e}:id/`))return{inputMethodOwned:!0,source:"known-ime-resource"};return{inputMethodOwned:!1,source:"app"}}function d(e){return a(e).inputMethodOwned}function u(e){return(e??"").trim().toLowerCase()||void 0}let s=["mInputShown","mIsInputViewShown","isInputViewShown","mDecorViewVisible","mWindowVisible","mInShowWindow"],c=new Map([[2,"number"],[3,"phone"],[4,"datetime"]]),l=new Set([32,208]),p=new Set([128,224,144]);async function w(e){return await f(n(e))}async function f(i){var n,r,d;let w,f,h,m,I,y,g,_,C=await i(["shell","dumpsys","input_method"],{allowFailure:!0});if(0!==C.exitCode)throw new t("COMMAND_FAILED","Failed to query Android keyboard state",{stdout:C.stdout,stderr:C.stderr,exitCode:C.exitCode});return f=function(e){var t=function(e,t){let i=new Map,n=RegExp(`\\b(${t.join("|")})=([a-zA-Z]+)\\b`,"g");for(let t of e.matchAll(n)){let e=t[1],n=t[2]?.toLowerCase();e&&("true"===n||"false"===n)&&i.set(e,"true"===n)}return i}(e,s);if(0===t.size)return null;let i=A(t,["mWindowVisible","mDecorViewVisible","mInShowWindow"]);if(void 0!==i)return i;let n=t.get("mInputShown");return void 0!==n?n:A(t,["mIsInputViewShown","isInputViewShown"])??null}(n=C.stdout)??function(e){let t=e.match(/\bmImeWindowVis=0x([0-9a-fA-F]+)\b/),i=t?.[1];if(!i)return null;let n=Number.parseInt(i,16);return Number.isNaN(n)?null:(1&n)!=0}(n),h=(w=b(n,/\binputType=0x([0-9a-fA-F]+)\b/gi))?`0x${w.toLowerCase()}`:void 0,m=b(n,/\bpackageName=([A-Za-z0-9_.]+)\b/g),I=b(n,/\b(?:resourceId|resource-id)=([^\s,}]+)/g),g=function(e,t,i){return e||t?a({packageName:e,resourceId:t,activeInputMethodPackage:i}).inputMethodOwned?"ime":"app":"unknown"}(m,I,y=function(e){for(let t of[/\bmCurMethodId=([^\s]+)/i,/\bmCurId=([^\s]+)/i,/\bmCurrentInputMethodId=([^\s]+)/i,/\bcurMethodId=([^\s]+)/i]){let i=e.match(t),n=function(e){let t=(e??"").trim();if(!t)return;let i=(t.split("/")[0]??"").match(/[a-zA-Z0-9_.]+/);return u(i?.[0])}(i?.[1]);if(n)return n}}(n)),r=m,d=I,!y&&((_=u(r))&&o.has(_)||function(e){let t=(e??"").toLowerCase();for(let e of o)if(t.startsWith(`${e}:id/`))return!0;return!1}(d))&&e({level:"warn",phase:"android_input_ownership_fallback",data:{focusedPackage:r,focusedResourceId:d}}),{visible:f??!1,inputType:h,type:h?function(e){let t=Number.parseInt(e.replace(/^0x/i,""),16);if(Number.isNaN(t))return"unknown";let i=15&t,n=c.get(i);if(n)return n;if(1!==i)return"unknown";let r=4080&t;return l.has(r)?"email":p.has(r)?"password":"text"}(h):void 0,inputMethodPackage:y,focusedPackage:m,focusedResourceId:I,inputOwner:g}}async function h(e){return await m(n(e))}async function m(e){let i=await f(e),n=i,o=0;for(;n.visible&&o<2;)await e(["shell","input","keyevent","111"]),o+=1,await r(120),n=await f(e);if(i.visible&&n.visible)throw new t("UNSUPPORTED_OPERATION","Android keyboard dismiss is unavailable for the current IME without back navigation.",{attempts:o,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner});return{attempts:o,wasVisible:i.visible,dismissed:i.visible&&!n.visible,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}function b(e,t){let i;for(let n of e.matchAll(t))i=n[1];return i}function A(e,t){for(let i of t){let t=e.get(i);if(void 0!==t)return t}}async function I(e){return await y(n(e))}async function y(e){let t,i;return(i=(t=(await C(e,["shell","cmd","clipboard","get","text"],"read")).replace(/\r\n/g,"\n").replace(/\n$/,"")).match(/^clipboard text:\s*(.*)$/i))?i[1]??"":"null"===t.trim().toLowerCase()?"":t}async function g(e,t){await _(n(e),t)}async function _(e,t){await C(e,["shell","cmd","clipboard","set","text",t],"write")}async function C(e,n,r){let o=await e(n,{allowFailure:!0});if(i(o.stdout,o.stderr))throw new t("UNSUPPORTED_OPERATION",`Android shell clipboard ${r} is not supported on this device.`);if(0!==o.exitCode)throw new t("COMMAND_FAILED",`Failed to ${r} Android clipboard text`,{stdout:o.stdout,stderr:o.stderr,exitCode:o.exitCode});return o.stdout}export{h as dismissAndroidKeyboard,m as dismissAndroidKeyboardWithAdb,w as getAndroidKeyboardState,f as getAndroidKeyboardStatusWithAdb,d as isAndroidInputMethodOwnedNode,I as readAndroidClipboardText,y as readAndroidClipboardWithAdb,g as writeAndroidClipboardText,_ as writeAndroidClipboardWithAdb};
|