agent-device 0.14.9 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +7 -4
  2. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.14.9.apk → agent-device-android-snapshot-helper-0.15.1.apk} +0 -0
  3. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.15.1.apk.sha256 +1 -0
  4. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.14.9.manifest.json → agent-device-android-snapshot-helper-0.15.1.manifest.json} +6 -6
  5. package/dist/src/1393.js +1 -0
  6. package/dist/src/1769.js +7 -0
  7. package/dist/src/1974.js +2 -2
  8. package/dist/src/208.js +1 -1
  9. package/dist/src/2151.js +434 -0
  10. package/dist/src/221.js +4 -4
  11. package/dist/src/2842.js +1 -0
  12. package/dist/src/3572.js +1 -0
  13. package/dist/src/4057.js +1 -1
  14. package/dist/src/4829.js +1 -1
  15. package/dist/src/9542.js +2 -2
  16. package/dist/src/9639.js +2 -2
  17. package/dist/src/989.js +1 -1
  18. package/dist/src/android-adb.d.ts +38 -9
  19. package/dist/src/android-adb.js +1 -1
  20. package/dist/src/android-snapshot-helper.d.ts +23 -0
  21. package/dist/src/cli.js +60 -57
  22. package/dist/src/contracts.d.ts +1 -0
  23. package/dist/src/finders.d.ts +1 -0
  24. package/dist/src/index.d.ts +56 -27
  25. package/dist/src/internal/companion-tunnel.js +1 -1
  26. package/dist/src/internal/daemon.js +51 -23
  27. package/dist/src/remote-config.d.ts +17 -14
  28. package/dist/src/selectors.d.ts +2 -0
  29. package/dist/src/server.js +2 -20
  30. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +7 -1
  31. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +155 -0
  32. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +131 -72
  33. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +734 -10
  34. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +89 -16
  35. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +5 -0
  36. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +9 -0
  37. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +4 -3
  38. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +1 -2
  39. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +26 -0
  40. package/ios-runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +7 -1
  41. package/package.json +30 -11
  42. package/server.json +3 -3
  43. package/skills/agent-device/SKILL.md +2 -7
  44. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.14.9.apk.sha256 +0 -1
  45. package/dist/src/180.js +0 -1
  46. package/dist/src/6108.js +0 -26
  47. package/dist/src/6642.js +0 -1
  48. package/dist/src/7462.js +0 -1
  49. package/dist/src/8809.js +0 -8
  50. package/dist/src/command-schema.js +0 -382
package/dist/src/6108.js DELETED
@@ -1,26 +0,0 @@
1
- let e;import{__webpack_require__ as t}from"./rslib-runtime.js";import n,{existsSync as r,promises as a}from"node:fs";import i,{hostname as o}from"node:os";import s from"node:path";import l from"node:net";import{AsyncLocalStorage as d}from"node:async_hooks";import{fileURLToPath as u}from"node:url";import{XMLParser as c}from"fast-xml-parser";import p from"node:fs/promises";import{createHash as f}from"node:crypto";import{PNG as h}from"pngjs";import{toAppErrorCode as m,asAppError as w,normalizeError as g,AppError as y}from"./9152.js";import{runAndroidAdb as b,resolveIosSimulatorDeviceSetPath as v,dismissAndroidKeyboard as I,resolveIosDeviceDeepLinkBundleId as A,withRetry as x,Deadline as S,classifyBootFailure as N,openAndroidApp as _,isEnvTruthy as k,ensureAdb as M,closeAndroidApp as E,TIMEOUT_PROFILES as D,bootFailureHint as O,openAndroidDevice as C,writeAndroidClipboardText as R,getAndroidKeyboardState as P,listAndroidDevices as T,getAndroidAppState as L,retryWithPolicy as $,resolveAndroidSerialAllowlist as F,createAppResolutionCache as U,isDeepLinkTarget as G,isClipboardShellUnsupported as V,readAndroidClipboardText as B}from"./8809.js";import{runCmdBackground as j,runCmdStreaming as q,runCmdSync as X,runCmd as H,resolveExecutableOverridePath as K,whichCmd as z}from"./9818.js";import{sleep as Y,resolveTimeoutMs as W,resolveTimeoutSeconds as J}from"./4829.js";import{isProcessGroupAlive as Z,isProcessAlive as Q,readProcessStartTime as ee}from"./8656.js";import{withDiagnosticTimer as et,getDiagnosticsMeta as en,emitDiagnostic as er}from"./7599.js";import{findNodeByRef as ea,normalizeRef as ei,centerOfRect as eo,attachRefs as es}from"./4057.js";import{parseUiHierarchy as el,ensureAndroidSnapshotHelper as ed,parseUiHierarchyTree as eu,captureAndroidSnapshotWithHelper as ec,isScrollableNodeLike as ep,androidUiNodes as ef,parseAndroidSnapshotHelperManifest as eh,forgetAndroidSnapshotHelperInstall as em,isScrollableType as ew,buildUiHierarchySnapshot as eg}from"./221.js";import{readVersion as ey,findProjectRoot as eb}from"./9671.js";import{resolveAndroidAdbProvider as ev,resolveAndroidAdbExecutor as eI}from"./9639.js";import{materializeInstallablePath as eA,isTrustedInstallSourceUrl as ex}from"./989.js";import{SETTINGS_INVALID_ARGS_MESSAGE as eS,getUnsupportedMacOsSettingMessage as eN,isMacOsSettingSupported as e_}from"./7462.js";import{withSuccessText as ek,successText as eM}from"./180.js";import{splitSelectorFromArgs as eE,trimText as eD,extractNodeText as eO,tryParseSelectorChain as eC,parseSelectorChain as eR,isNodeVisible as eP,isNodeEditable as eT,pruneGroupNodes as eL,buildTextPreview as e$,findNearestHittableAncestor as eF,buildSelectorChainForNode as eU,extractNodeReadText as eG,splitIsSelectorArgs as eV,findNodeByLabel as eB,resolveRefLabel as ej,describeTextSurface as eq,extractReadableText as eX,findSelectorChainMatch as eH,resolveSelectorChain as eK,normalizeType as ez,formatSelectorFailure as eY,isFillableType as eW}from"./940.js";import{findBestMatchesByLocator as eJ,parseFindArgs as eZ}from"./7556.js";import"./7847.js";var eQ={};t.r(eQ),t.d(eQ,{TM:()=>a7,ensureBootedSimulator:()=>rJ,installIosApp:()=>it,installIosInstallablePath:()=>ia,listIosApps:()=>id,L5:()=>a6,IJ:()=>a9,TJ:()=>is,J7:()=>ii,reinstallIosApp:()=>ir,resolveIosApp:()=>a8,kc:()=>aj,Cm:()=>il,ap:()=>io});let e0=new Set,e1=new Map,e2="request_canceled",e3="request canceled";function e4(e,t){if("string"==typeof e&&e.length>0)return e;let n=("string"==typeof t?t:"number"==typeof t&&Number.isFinite(t)?String(t):"generated").trim().replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,32)||"generated",r=Math.random().toString(36).slice(2,10);return`req:${n}:${process.pid}:${Date.now()}:${r}`}function e5(e){if(!e)return;!function(e){if(e.size<=5e4)return;let t=0;for(let n of e.keys()){if(t>=1e4)break;e.delete(n),t++}}(e1);let t=new AbortController;e1.set(e,t),e0.has(e)&&t.abort()}function e8(e){e&&(!function(e){if(e.size<=5e4)return;let t=0;for(let n of e){if(t>=1e4)break;e.delete(n),t++}}(e0),e0.add(e),e1.get(e)?.abort())}function e6(e){e&&(e0.delete(e),e1.delete(e))}function e9(e){return!!e&&e0.has(e)}function e7(e){if(e)return e1.get(e)?.signal}function te(){return new y("COMMAND_FAILED",e3,{reason:e2})}function tt(e){return e instanceof y&&"COMMAND_FAILED"===e.code&&(e.details?.reason===e2||e.message===e3)}function tn(e,t={}){let n=v(t.simulatorSetPath);return n?["simctl","--set",n,...e]:["simctl",...e]}function tr(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:tn(t,{simulatorSetPath:e.simulatorSetPath})}function ta(e){return!(e instanceof y)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function ti(e){let{port:t,endpoints:n,logPath:r,lastError:a}=e,i="Runner did not accept connection";return new y("COMMAND_FAILED",i,{port:t,endpoints:n,logPath:r,lastError:a?String(a):void 0,reason:N({error:a,message:i,context:{platform:"ios",phase:"connect"}}),hint:O("IOS_RUNNER_CONNECT_TIMEOUT")})}async function to(e){var t,n;let r,{session:a,port:i,logPath:o}=e,s=await a.testPromise,l="Runner did not accept connection (xcodebuild exited early)",d=N({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new y("COMMAND_FAILED",l,{port:i,logPath:o,xcodebuild:{exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr},reason:d,hint:(t=s.stdout,n=s.stderr,(r=`${l}
2
- ${t}
3
- ${n}`.toLowerCase()).includes("device is busy")&&r.includes("connecting")?"Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.":O("IOS_RUNNER_CONNECT_TIMEOUT"))})}function ts(e){if(e9(e))throw te()}let tl=W(process.env.AGENT_DEVICE_RUNNER_STARTUP_TIMEOUT_MS,45e3,5e3),td=W(process.env.AGENT_DEVICE_RUNNER_COMMAND_TIMEOUT_MS,45e3,1e3),tu=W(process.env.AGENT_DEVICE_RUNNER_CONNECT_ATTEMPT_INTERVAL_MS,250,50),tc=W(process.env.AGENT_DEVICE_RUNNER_CONNECT_RETRY_BASE_DELAY_MS,300,10),tp=W(process.env.AGENT_DEVICE_RUNNER_CONNECT_RETRY_MAX_DELAY_MS,2e3,10),tf=W(process.env.AGENT_DEVICE_RUNNER_CONNECT_REQUEST_TIMEOUT_MS,2e4,250),th=W(process.env.AGENT_DEVICE_IOS_DEVICE_INFO_TIMEOUT_MS,1e4,500),tm=J(process.env.AGENT_DEVICE_RUNNER_DESTINATION_TIMEOUT_SECONDS,20,5),tw=new Map;async function tg(e,t,n,r,a=tl,i,o){let s,l=S.fromTimeoutMs(a),d=async(n,r=!1)=>{var a,i,o;let l,d=await tb({device:e,timeoutBudgetMs:n,forceRefresh:r,requestTunnelIp:s,setRequestTunnelIp:e=>{s=e}});return{endpoints:(a=e,i=t,o=d.ip,l=[`http://127.0.0.1:${i}/command`],"device"!==a.kind||o&&l.unshift(`http://[${o}]:${i}/command`),l),cached:d.sharedCacheHit}},{endpoints:u}=await d(l.remainingMs()),c=null,p=Math.max(1,Math.ceil(a/tu));try{return await $(async({deadline:s})=>{if(s?.isExpired())throw new y("COMMAND_FAILED","Runner connection deadline exceeded",{port:t,timeoutMs:a});if(i&&null!==i.child.exitCode&&void 0!==i.child.exitCode)throw await to({session:i,port:t,logPath:r});let l=!1;if("device"===e.kind){let e=await d(s?.remainingMs());u=e.endpoints,l=e.cached}let p=l?u[0]:null,f=await ty(u,{command:n,port:t,timeoutMs:a,signal:o,attemptDeadline:s,onError:(t,n)=>{var r;c=n,"device"===e.kind&&t===p&&(r=e.id,tw.delete(r))}});if(f)return f;if("device"===e.kind&&l){var h;h=e.id,tw.delete(h),u=(await d(s?.remainingMs(),!0)).endpoints;let r=await ty(u,{command:n,port:t,timeoutMs:a,signal:o,attemptDeadline:s,onError:(e,t)=>{c=t}});if(r)return r}if(o?.aborted)throw te();throw new y("COMMAND_FAILED","Runner endpoint probe failed",{port:t,endpoints:u,lastError:c?String(c):void 0})},{maxAttempts:p,baseDelayMs:tc,maxDelayMs:tp,jitter:.2,shouldRetry:ta},{deadline:l,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||tt(e))throw te();c||(c=e)}if(o?.aborted)throw te();if("simulator"===e.kind){let a=l.remainingMs();if(a<=0)throw ti({port:t,endpoints:u,logPath:r,lastError:c});let i=await tA(e,t,n,a,o);return new Response(i.body,{status:i.status})}throw ti({port:t,endpoints:u,logPath:r,lastError:c})}async function ty(e,t){let{command:n,port:r,timeoutMs:a,signal:i,attemptDeadline:o,onError:s}=t;for(let t of e)try{let e=o?.remainingMs()??a;if(e<=0)throw new y("COMMAND_FAILED","Runner connection deadline exceeded",{port:r,timeoutMs:a});return await tv(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)},Math.min(tf,e),i)}catch(e){if(i?.aborted||tt(e))throw te();s(t,e)}return null}async function tb(e){var t,n,r;let{device:a,timeoutBudgetMs:i,forceRefresh:o,requestTunnelIp:s,setRequestTunnelIp:l}=e;if("device"!==a.kind)return{ip:null,sharedCacheHit:!1};if(!o){let e,n=(t=a.id,(e=tw.get(t))?e.expiresAt<=Date.now()?(tw.delete(t),null):e.ip:null);if(n)return{ip:n,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let d=await tI(a.id,i);return l(d),d&&(n=a.id,r=d,tw.set(n,{ip:r,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function tv(e,t,n,r){let a=AbortSignal.timeout(n),i=r?AbortSignal.any([r,a]):a;return await fetch(e,{...t,signal:i})}async function tI(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(th,t)):th,a=s.join(i.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await H("xcrun",["devicectl","device","info","details","--device",e,"--json-output",a,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==i.exitCode||!n.existsSync(a))return null;let o=JSON.parse(n.readFileSync(a,"utf8"));if(o.info?.outcome&&"success"!==o.info.outcome)return null;let s=(o.result?.connectionProperties?.tunnelIPAddress??o.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{tk(a)}}async function tA(e,t,n,r,a){let i=JSON.stringify(n),o=tr(e,["spawn",e.id,"/usr/bin/curl","-s","-X","POST","-H","Content-Type: application/json","--data",i,`http://127.0.0.1:${t}/command`]),s=await H("xcrun",o,{allowFailure:!0,timeoutMs:r,signal:a}),l=s.stdout;if(0!==s.exitCode){let e=N({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new y("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:O(e)})}return{status:200,body:l}}async function tx(){return await new Promise((e,t)=>{let n=l.createServer();n.listen(0,"127.0.0.1",()=>{let r=n.address();if("object"==typeof r&&r?.port){let t=r.port;n.close(()=>e(t))}else n.close(()=>t(new y("COMMAND_FAILED","Failed to allocate port")))}),n.on("error",t)})}function tS(e,t,n,r){t&&t_(t,e),n&&t_(n,e),r&&process.stderr.write(e)}let tN=new Map;function t_(e,t){let r=(tN.get(e)??Promise.resolve()).catch(()=>{}).then(()=>n.promises.appendFile(e,t)).catch(()=>{}).finally(()=>{tN.get(e)===r&&tN.delete(e)});tN.set(e,r)}function tk(e){try{n.existsSync(e)&&n.unlinkSync(e)}catch{}}let tM=new d;async function tE(e,t,n){let r=tM.getStore()??[];if(r.some(n=>n.locks===e&&n.key===t))return await n();let a=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>tM.run([...r,{locks:e,key:t}],n));return e.set(t,a),a.finally(()=>{e.get(t)===a&&e.delete(t)})}function tD(e){return e}function tO(e){return"apple"===e||"ios"===e||"macos"===e}function tC(e,t){return!t||("apple"===t?tO(e):e===t)}function tR(e){let{simulatorSetPath:t,platform:n,target:r}=e;if(t&&"macos"!==n&&"desktop"!==r)return t}async function tP(e,t,n={}){let r=e,a=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(t.platform&&(r=r.filter(e=>tC(e.platform,t.platform))),t.target&&(r=r.filter(e=>(e.target??"mobile")===t.target)),t.udid){let e=r.find(e=>e.id===t.udid&&tO(e.platform));if(!e)throw new y("DEVICE_NOT_FOUND",`No Apple device with UDID ${t.udid}`);return e}if(t.serial){let e=r.find(e=>e.id===t.serial&&"android"===e.platform);if(!e)throw new y("DEVICE_NOT_FOUND",`No Android device with serial ${t.serial}`);return e}if(t.deviceName){let e=a(t.deviceName),n=r.find(t=>a(t.name)===e);if(!n)throw new y("DEVICE_NOT_FOUND",`No device named ${t.deviceName}`);return n}if(1===r.length)return r[0];if(0===r.length){var i;let e=n.simulatorSetPath;if(e&&(!(i=t.platform)||"apple"===i||"ios"===i))throw new y("DEVICE_NOT_FOUND","No devices found in the scoped simulator set",{simulatorSetPath:e,hint:`The simulator set at "${e}" appears to be empty. Create a simulator first:
4
- xcrun simctl --set "${e}" create "iPhone 16" com.apple.CoreSimulator.SimDeviceType.iPhone-16 com.apple.CoreSimulator.SimRuntime.iOS-18-0`,selector:t});throw new y("DEVICE_NOT_FOUND","No devices found",{selector:t})}let o=r.filter(e=>"device"!==e.kind);o.length>0&&(r=o);let s=r.filter(e=>e.booted);return 1===s.length?s[0]:s[0]??r[0]}let tT=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function tL(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new y("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:r});let a=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of a)if(!n.existsSync(e))throw new y("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of a)if(0!==X("codesign",["--verify","--deep","--strict",e],{allowFailure:!0}).exitCode){await H("codesign",["--remove-signature",e],{allowFailure:!0});try{await H("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof y?n:new y("COMMAND_FAILED",String(n));throw new y("COMMAND_FAILED","Failed to repair macOS runner product signature",{reason:"RUNNER_PRODUCT_REPAIR_FAILED",productPath:e,xctestrunPath:r,error:t.message,details:t.details})}}}let t$=null;function tF(e){return function e(t){if(!Array.isArray(t))return[];let n=[];for(let r of t)if(!(!r||"object"!=typeof r||Array.isArray(r)))for(let[t,a]of Object.entries(r))":@"!==t&&"#text"!==t&&n.push({name:t,attributes:function(e){if(!e||"object"!=typeof e||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e))"string"==typeof r&&(t[n]=r);return t}(r[":@"]),text:tG(a)??tG(r["#text"]),children:e(a)});return n}((t$??=new c({ignoreAttributes:!1,attributeNamePrefix:"",preserveOrder:!0,trimValues:!0,parseTagValue:!1})).parse(e))}function tU(e,t){for(let n of e){if("dict"===n.name)for(let e=0;e<n.children.length-1;e+=1){let r=n.children[e],a=n.children[e+1];r?.name==="key"&&r.text&&a&&t(r.text,a)}tU(n.children,t)}}function tG(e){if("string"==typeof e){let t=e.trim();return t.length>0?t:null}if(!Array.isArray(e))return null;let t=e.map(e=>{if(!e||"object"!=typeof e||Array.isArray(e))return null;let t=e["#text"];return"string"==typeof t?t.trim():null}).filter(e=>null!==e&&e.length>0).join("").trim();return t.length>0?t:null}let tV="XCTestDevices",tB=".agent-device-backup",tj=".agent-device-xctestdevices-backup-",tq=s.join(i.homedir(),".agent-device","ios-runner"),tX=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]),tH=new Map,tK=new Set;function tz(e){return e?.trim()??""}function tY(e=process.env){return tz(e.AGENT_DEVICE_IOS_BUNDLE_ID)||tz(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function tW(e=process.env){let t=tz(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${tY(e)}.uitests`}let tJ=function(e=process.env){let t=tY(e),n=tW(e);return Array.from(new Set([tz(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${n}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function tZ(e=i.homedir()){return s.join(e,"Library","Developer","XCTestDevices")}async function tQ(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=v(e.simulatorSetPath);if(!r)return null;let a=s.resolve(r),o=s.resolve(t.xctestDeviceSetPath??tZ()),l=s.resolve(t.backupPath??function(e=tZ()){return`${e}${tB}`}(o)),d=s.resolve(t.lockDirPath??function(e=i.homedir()){return s.join(e,".agent-device","xctest-device-set.lock")}()),u=t.ownerStartTime??ee(process.pid),c=await t2({lockDirPath:d,owner:{pid:t.ownerPid??process.pid,startTime:u,acquiredAtMs:t.nowMs??Date.now()}});try{if(t0({xctestDeviceSetPath:o,backupPath:l}),function(e,t){if(s.resolve(e)===s.resolve(t))return!0;try{return n.realpathSync.native(e)===n.realpathSync.native(t)}catch{return!1}}(a,o))return await c(),null;n.mkdirSync(a,{recursive:!0}),n.existsSync(o)&&n.renameSync(o,l),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,a=s.dirname(r),i=s.join(a,`${tV}.agent-device-link-${process.pid}-${Date.now()}`);n.mkdirSync(a,{recursive:!0});try{n.symlinkSync(t,i,"dir"),n.renameSync(i,r)}catch(e){throw n.existsSync(i)&&t1(i),e}}({requestedSetPath:a,xctestDeviceSetPath:o})}catch(e){throw t0({xctestDeviceSetPath:o,backupPath:l}),await c(),new y("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:a,xctestDeviceSetPath:o,backupPath:l,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{t0({xctestDeviceSetPath:o,backupPath:l})}finally{await c()}}}}}function t0(e){let{xctestDeviceSetPath:t,backupPath:r}=e,a=[r,...function(e){let t=s.dirname(e),r=s.basename(e).replace(tB,""),a=r===tV?tj:`${r}${tj}`;try{return n.readdirSync(t).filter(e=>e.startsWith(a)).sort().map(e=>s.join(t,e))}catch{return[]}}(r)],i=a.find(e=>n.existsSync(e)),o=n.existsSync(t)&&n.lstatSync(t).isSymbolicLink();if(i){if(o&&t1(t),n.existsSync(t))if(!o)return void er({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:i}});else i!==r?n.rmSync(i,{recursive:!0,force:!0}):n.rmSync(r,{recursive:!0,force:!0});else n.mkdirSync(s.dirname(t),{recursive:!0}),n.renameSync(i,t);for(let e of a)e!==i&&n.existsSync(e)&&n.rmSync(e,{recursive:!0,force:!0});return}o&&(er({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),t1(t))}function t1(e){!n.existsSync(e)||n.lstatSync(e).isSymbolicLink()&&n.unlinkSync(e)}async function t2(e){let{lockDirPath:t,owner:r}=e,a=s.join(t,"owner.json"),i=Date.now()+3e4;for(n.mkdirSync(s.dirname(t),{recursive:!0});Date.now()<i;)try{n.mkdirSync(t),function(e,t){let r=`${e}.${process.pid}.${Date.now()}.tmp`;n.writeFileSync(r,JSON.stringify(t),"utf8"),n.renameSync(r,e)}(a,r);let e=!1;return async()=>{e||(e=!0,n.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t){let r=null;try{r=n.statSync(e)}catch{return!0}let a=function(e){try{return JSON.parse(n.readFileSync(e,"utf8"))}catch{return null}}(t);if(a){var i;return!(Number.isInteger((i=a).pid)&&!(i.pid<=0)&&Q(i.pid)&&(!i.startTime||ee(i.pid)===i.startTime))&&(n.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-r.mtimeMs<5e3)&&(n.rmSync(e,{recursive:!0,force:!0}),!0)}(t,a))continue;await Y(100)}throw new y("COMMAND_FAILED","Timed out waiting for XCTest device set lock",{lockDirPath:t})}async function t3(e,t){var r;let a,i=(r=e,(a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim())?s.resolve(a):"macos"===r.platform?s.join(tq,"derived","macos"):"simulator"===r.kind?s.join(tq,"derived"):s.join(tq,"derived",r.kind)),o=function(){let e=s.dirname(u(import.meta.url)),t=e;for(let e=0;e<6;e+=1){let e=s.join(t,"package.json");if(n.existsSync(e))return t;t=s.dirname(t)}return e}();return await tE(tH,i,async()=>{k(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)&&(ni("clean","forced_clean",{derived:i}),na(i),t4(i));let r=function(e){let t=e.findXctestrun(e.derived);if(!t)return{reason:"missing_xctestrun",xctestrunPath:null};let n=e.resolveExistingXctestrunProductPaths(t);return n?e.xctestrunReferencesProjectRoot(t,e.projectRoot)?{reason:"reuse_ready",xctestrunPath:t,productPaths:n}:{reason:"project_root_mismatch",xctestrunPath:t,productPaths:n}:{reason:"missing_products",xctestrunPath:t,productPaths:[]}}({derived:i,projectRoot:o,findXctestrun:t=>t8(t,e),xctestrunReferencesProjectRoot:t9,resolveExistingXctestrunProductPaths:no});if("reuse_ready"!==r.reason&&ni("rebuild",r.reason,{derived:i,xctestrunPath:r.xctestrunPath}),"reuse_ready"===r.reason)try{return await tL(e,r.productPaths,r.xctestrunPath),ni("reuse","reuse_ready",{derived:i,xctestrunPath:r.xctestrunPath}),r.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof y))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&tT.has(t)}(e))throw e;ni("rebuild","repair_failed",{derived:i,xctestrunPath:r.xctestrunPath})}r.xctestrunPath&&(na(i),t4(i));let a=s.join(o,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!n.existsSync(a))throw new y("COMMAND_FAILED","iOS runner project not found",{projectPath:a});await ne(e,a,i,t);let l=t8(i,e);if(!l)throw new y("COMMAND_FAILED","Failed to locate .xctestrun after build");let d=no(l);if(!d)throw new y("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:l});return await tL(e,d,l),ni("build","built_new",{derived:i,xctestrunPath:l}),l})}function t4(e){try{if(!n.existsSync(e))return;if("derived"!==s.basename(e))return void n.rmSync(e,{recursive:!0,force:!0});for(let r of n.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,t5.has(t)&&n.rmSync(s.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let t5=new Set(["Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function t8(e,t){if(!n.existsSync(e))return null;let r=[],a=[e];for(;a.length>0;){let e=a.pop();for(let t of n.readdirSync(e,{withFileTypes:!0})){let i=s.join(e,t.name);if(t.isDirectory()){a.push(i);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=n.statSync(i);r.push({path:i,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,n)=>{if(t){let r=t6(n.path,t)-t6(e.path,t);if(0!==r)return r}return n.mtimeMs-e.mtimeMs||e.path.localeCompare(n.path)}),r[0]?.path??null)}function t6(e,t){var n;let r=0,a=e.toLowerCase();s.basename(a).startsWith("agentdevicerunner.env.")&&(r-=1e3),a.includes(`${s.sep}macos${s.sep}`)&&(r-=5e3);let i="macos"===(n=t).platform?{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]}:"tv"===n.target?"simulator"===n.kind?{preferred:["appletvsimulator"],disallowed:["appletvos","iphoneos","iphonesimulator","macos"]}:{preferred:["appletvos"],disallowed:["appletvsimulator","iphoneos","iphonesimulator","macos"]}:"simulator"===n.kind?{preferred:["iphonesimulator"],disallowed:["iphoneos","appletvos","appletvsimulator","macos"]}:{preferred:["iphoneos"],disallowed:["iphonesimulator","appletvos","appletvsimulator","macos"]};return i.preferred.length>0&&(i.preferred.some(e=>a.includes(e))?r+=2e3:r-=500),i.disallowed.some(e=>a.includes(e))&&(r-=2500),r}function t9(e,t){try{let r=n.readFileSync(e,"utf8"),a=new Set([t]);try{a.add(n.realpathSync(t))}catch{}for(let e of a)if(r.includes(e))return!0;return!1}catch{return!1}}async function t7(e,t,r){let a,i=s.dirname(e),o=r.replace(/[^a-zA-Z0-9._-]/g,"_"),l=s.join(i,`AgentDeviceRunner.env.${o}.json`),d=s.join(i,`AgentDeviceRunner.env.${o}.xctestrun`),u=await H("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==u.exitCode||!u.stdout.trim())throw new y("COMMAND_FAILED","Failed to read xctestrun plist",{xctestrunPath:e,stderr:u.stderr});try{let e=JSON.parse(u.stdout);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Root must be an object");a=e}catch(t){throw new y("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}let c=e=>{e.EnvironmentVariables={...e.EnvironmentVariables??{},...t},e.UITestEnvironmentVariables={...e.UITestEnvironmentVariables??{},...t},e.UITargetAppEnvironmentVariables={...e.UITargetAppEnvironmentVariables??{},...t},e.TestingEnvironmentVariables={...e.TestingEnvironmentVariables??{},...t}},p=a.TestConfigurations;if(Array.isArray(p))for(let e of p){if(!e||"object"!=typeof e)continue;let t=e.TestTargets;if(Array.isArray(t))for(let e of t)e&&"object"==typeof e&&c(e)}for(let[e,t]of Object.entries(a))t&&"object"==typeof t&&!Array.isArray(t)&&t.TestBundlePath&&(c(t),a[e]=t);n.writeFileSync(l,JSON.stringify(a,null,2));let f=await H("plutil",["-convert","xml1","-o",d,l],{allowFailure:!0});if(0!==f.exitCode)throw new y("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:d,stderr:f.stderr});return{xctestrunPath:d,jsonPath:l}}async function ne(e,t,n,r){let a=function(e=process.env){let t=tY(e),n=tW(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${n}`]}(process.env),i=function(e=process.env,t=!1,n="ios"){if("macos"===n)return["CODE_SIGNING_ALLOWED=NO","CODE_SIGNING_REQUIRED=NO","CODE_SIGN_IDENTITY=","DEVELOPMENT_TEAM="];if(!t)return[];let r=e.AGENT_DEVICE_IOS_TEAM_ID?.trim()||"",a=e.AGENT_DEVICE_IOS_SIGNING_IDENTITY?.trim()||"",i=e.AGENT_DEVICE_IOS_PROVISIONING_PROFILE?.trim()||"",o=["CODE_SIGN_STYLE=Automatic"];return r&&o.push(`DEVELOPMENT_TEAM=${r}`),a&&o.push(`CODE_SIGN_IDENTITY=${a}`),i&&o.push(`PROVISIONING_PROFILE_SPECIFIER=${i}`),o}(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=await tQ(e);try{var l;let s;await q("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",nr(e),"1","-destination",(l=e,s=nt(l),"macOS"===s?`platform=macOS,arch=${nn()}`:"simulator"===l.kind?`platform=${s} Simulator,id=${l.id}`:`generic/platform=${s}`),"-derivedDataPath",n,"COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO",...a,...o,...i],{detached:!0,onSpawn:e=>{tK.add(e),e.on("close",()=>{tK.delete(e)})},onStdoutChunk:e=>{tS(e,r.logPath,r.traceLogPath,r.verbose)},onStderrChunk:e=>{tS(e,r.logPath,r.traceLogPath,r.verbose)}})}catch(i){let e,t,n=i instanceof y?i:new y("COMMAND_FAILED",String(i)),a=(e=n.details?JSON.stringify(n.details):"",(t=`${n.message}
5
- ${e}`.toLowerCase()).includes("failed registering bundle identifier")||t.includes("app identifier")&&t.includes("not available")?"Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.":t.includes("requires a development team")?"Configure signing in Xcode or set AGENT_DEVICE_IOS_TEAM_ID for physical-device runs.":t.includes("no profiles for")||t.includes("provisioning profile")?"Install/select a valid iOS provisioning profile, or set AGENT_DEVICE_IOS_PROVISIONING_PROFILE.":t.includes("code signing")?"Enable Automatic Signing in Xcode or provide AGENT_DEVICE_IOS_TEAM_ID and optional AGENT_DEVICE_IOS_SIGNING_IDENTITY.":void 0);throw new y("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:n.message,details:n.details,logPath:r.logPath,hint:a})}finally{await s?.release()}}function nt(e){var t;if("ios"!==e.platform&&"macos"!==e.platform)throw new y("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);return"macos"===e.platform?"macOS":"macos"===(t=e.target)||"desktop"===t?"macOS":"tv"===t?"tvOS":"iOS"}function nn(){return"arm64"===process.arch?"arm64":"x86_64"}function nr(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function na(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()&&!function(e=process.env){return k(e.AGENT_DEVICE_IOS_ALLOW_OVERRIDE_DERIVED_CLEAN)}(t))throw new y("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:"Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or set AGENT_DEVICE_IOS_ALLOW_OVERRIDE_DERIVED_CLEAN=1 if you trust this path."})}function ni(e,t,n){er({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...n}})}function no(e){let t=function(e){let t=function(e){try{let t=X("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())return null;return JSON.parse(t.stdout)}catch{return null}}(e);if(t){var r,a,i=t;let e=new Set,n=t=>{if(t&&"object"==typeof t)for(let n of function(e){let t=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]),n=new Set;for(let[r,a]of Object.entries(e))if(t.has(r)){if("string"==typeof a){n.add(a);continue}if(Array.isArray(a))for(let e of a)"string"==typeof e&&n.add(e)}return Array.from(n)}(t))e.add(n)};n(i);let o=i.TestConfigurations;if(Array.isArray(o))for(let e of o){if(!e||"object"!=typeof e)continue;let t=e.TestTargets;if(Array.isArray(t))for(let e of t)n(e)}for(let e of Object.values(i))e&&"object"==typeof e&&"TestBundlePath"in e&&n(e);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return r=n.readFileSync(e,"utf8"),a=tF(r),t=new Set,tU(a,(e,n)=>{if(tX.has(e)){if("string"===n.name&&n.text)return void t.add(n.text);if("array"===n.name)for(let e of n.children)"string"===e.name&&e.text&&t.add(e.text)}}),Array.from(t)}catch{return null}}(e);if(!t||0===t.length)return null;let r=s.dirname(e),a=new Set,i=new Set,o=[];for(let e of t){if(e.startsWith("__TESTROOT__/")){let t=e.slice(13),o=s.join(r,t);if(!n.existsSync(o))return null;a.add(o);let l=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(t);l&&i.add(s.join(r,l));continue}e.startsWith("__TESTHOST__/")&&o.push(e.slice(13))}for(let e of o){let t=Array.from(i).find(t=>n.existsSync(s.join(t,e)));if(!t)return null;a.add(s.join(t,e))}return Array.from(a)}let ns=new Map,nl=new Map;async function nd(e,t){return await tE(nl,e.id,async()=>{var n;let r,a,i=ns.get(e.id);if(i){if(ng(i.child.pid))return i;await nf(e.id,i)}await ("simulator"!==(n=e).kind?Promise.resolve():nb(n)),await nu(e);let o=await t3(e,t),s=await tx(),{xctestrunPath:l,jsonPath:d}=await t7(o,{AGENT_DEVICE_RUNNER_PORT:String(s)},`session-${e.id}-${s}`),u=await tQ(e);try{let t;({child:r,wait:a}=j("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",nr(e),"1","-destination-timeout",String(tm),"-xctestrun",l,"-destination",(t=nt(e),"macOS"===t?`platform=macOS,arch=${nn()}`:"simulator"===e.kind?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(s)},detached:!0}))}catch(e){throw await u?.release(),e}r.stdout?.on("data",e=>{tS(e,t.logPath,t.traceLogPath,t.verbose)}),r.stderr?.on("data",e=>{tS(e,t.logPath,t.traceLogPath,t.verbose)});let c={sessionId:`${e.id}:${s}:${Date.now()}`,device:e,deviceId:e.id,port:s,xctestrunPath:l,jsonPath:d,testPromise:a,child:r,ready:!1,simulatorSetRedirect:u??void 0};return ns.set(e.id,c),c})}async function nu(e){if("simulator"===e.kind)for(let t of tJ){let n=await H("xcrun",tr(e,["uninstall",e.id,t]),{allowFailure:!0});if(0!==n.exitCode){let e=`${n.stdout}
6
- ${n.stderr}`.toLowerCase();if(!e.includes("not installed")&&!e.includes("found nothing")&&!e.includes("no such file")&&!e.includes("invalid device")&&!e.includes("could not find"))continue}}}function nc(e){let t=ns.get(e);return t?{sessionId:t.sessionId,alive:ng(t.child.pid)}:null}async function np(e){await tE(nl,e.deviceId,async()=>{await nf(e.deviceId,e)})}async function nf(e,t){let n=t??ns.get(e);if(n){var r;try{await tg(n.device,n.port,{command:"shutdown"},void 0,15e3)}catch{await ny(n.child.pid,"SIGTERM")}try{await Promise.race([n.testPromise,new Promise(e=>setTimeout(e,1e4))])}catch{}(r=n.child.pid)&&(ng(r)||Z(r))&&await ny(n.child.pid,"SIGKILL"),tk(n.xctestrunPath),tk(n.jsonPath),await n.simulatorSetRedirect?.release(),ns.get(e)===n&&ns.delete(e)}}async function nh(e){await tE(nl,e,async()=>{await nf(e)})}async function nm(){let e=Array.from(ns.values()),t=Array.from(tK);await Promise.allSettled(e.map(async e=>{await ny(e.child.pid,"SIGINT")})),await Promise.allSettled(t.map(async e=>{await ny(e.pid,"SIGINT")})),await Promise.allSettled(e.map(async e=>{await ny(e.child.pid,"SIGTERM")})),await Promise.allSettled(t.map(async e=>{await ny(e.pid,"SIGTERM")})),await Promise.allSettled(e.map(async e=>{await ny(e.child.pid,"SIGKILL")})),await Promise.allSettled(t.map(async e=>{await ny(e.pid,"SIGKILL"),tK.delete(e)})),await Promise.allSettled(e.map(async e=>{await e.simulatorSetRedirect?.release()}))}async function nw(){await nm();let e=Array.from(ns.keys());await Promise.allSettled(e.map(async e=>{await nh(e)}));let t=Array.from(tK);await Promise.allSettled(t.map(async e=>{try{await ny(e.pid,"SIGTERM"),await ny(e.pid,"SIGKILL")}finally{tK.delete(e)}}))}function ng(e){return!!e&&Q(e)}async function ny(e,t){if(!e||e<=0)return;try{process.kill(-e,t)}catch{}try{process.kill(e,t)}catch{}let n="SIGINT"===t?"INT":"SIGTERM"===t?"TERM":"KILL";try{await H("pkill",[`-${n}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function nb(e){await H("xcrun",tr(e,["bootstatus",e.id,"-b"]),{timeoutMs:tl})}async function nv(e,t,n,r,a,i){let o=await tg(e,t.port,n,r,a,t,i);return await nI(o,t,r)}async function nI(e,t,n){let r,a=await e.text();try{let e=JSON.parse(a);r=e&&"object"==typeof e?e:{}}catch{throw new y("COMMAND_FAILED","Invalid runner response",{text:a})}if(!r.ok){let e=r.error?.code;throw new y("string"==typeof e&&e.trim().length>0?m(e):"COMMAND_FAILED",("string"==typeof r.error?.message?r.error.message:void 0)??"Runner error",{runner:r,xcodebuild:{exitCode:1,stdout:"",stderr:""},logPath:n})}return(t.ready=!0,r.data&&"object"==typeof r.data&&!Array.isArray(r.data))?r.data:{}}async function nA(e,t,n={}){var r;if("ios"!==e.platform&&"macos"!==e.platform)throw new y("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new y("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`);return(ts(n.requestId),"interactionFrame"===(r=t.command)||"snapshot"===r||"screenshot"===r||"findText"===r||"readText"===r||"alert"===r||"uptime"===r)?x(()=>(ts(n.requestId),nx(e,t,n)),{shouldRetry:e=>{ts(n.requestId);if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=`${e.message??""}`.toLowerCase();return!(t.includes("xcodebuild exited early")||t.includes("device is busy")&&t.includes("connecting"))&&!!(t.includes("runner did not accept connection")||t.includes("fetch failed")||t.includes("econnrefused")||t.includes("socket hang up"))}}):nx(e,t,n)}async function nx(e,t,n={}){let r;ts(n.requestId);let a=e7(n.requestId);try{let i=(r=await nd(e,n)).ready?td:tl;return await nv(e,r,t,n.logPath,i,a)}catch(o){let i=o instanceof y?o:new y("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===i.code&&"string"==typeof i.message&&i.message.includes("Runner did not accept connection")&&ta(i)&&r?.ready){ts(n.requestId),r?await np(r):await nh(e.id),r=await nd(e,n);let i=await tg(r.device,r.port,t,n.logPath,tl,void 0,a);return await nI(i,r,n.logPath)}throw o}}function nS(e){let t=e.direction,n="up"===t||"down"===t?e.referenceHeight:e.referenceWidth,r=function(e){if(void 0===e)return .6;if(!Number.isFinite(e)||e<=0)throw new y("INVALID_ARGS","scroll amount must be a positive number");return e}(e.amount),a=void 0!==e.pixels?function(e){if(!Number.isFinite(e)||e<=0)throw new y("INVALID_ARGS","scroll pixels must be a positive integer");return Math.max(1,Math.round(e))}(e.pixels):Math.round(n*r),i=Math.max(1,Math.round(.05*n)),o=Math.max(1,Math.min(a,Math.max(1,n-2*i))),s=Math.round(o/2),l=Math.round(e.referenceWidth/2),d=Math.round(e.referenceHeight/2),u=(n,r,a,i)=>({direction:t,x1:n,y1:r,x2:a,y2:i,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:o});switch(t){case"up":return u(l,d-s,l,d+s);case"down":return u(l,d+s,l,d-s);case"left":return u(l-s,d,l+s,d);case"right":return u(l+s,d,l-s,d)}}function nN(e){var t;return!!e&&(!!e.password||!!(t=e.text)&&Array.from(t).every(nk))}function n_(e){if(!e)return null;let t=nN(e);return{...e,text:t?null:e.text,...t?{textRedacted:!0}:{}}}function nk(e){return"•"===e||"*"===e||"●"===e}function nM(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function nE(e){let t=null,n=-1;for(let r of e){let e=r.width*r.height;e>n&&(t=r,n=e)}return t}function nD(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function nO(e){return new Map(e.map(e=>[e.index,e]))}function nC(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||""}function nR(e){if(0===e.length)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:a}=nP(e),i=0===n.size?e:e.filter(e=>n.has(e.index));return{nodes:i.map(e=>(function(e,t){let n=t.get(e.index);if(!n||0===n.size)return e;let r=!!(!0===e.hiddenContentAbove||n.has("above"))||void 0,a=!!(!0===e.hiddenContentBelow||n.has("below"))||void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:a}})(e,a.directionsByContainer)),hiddenCount:0===n.size?0:e.length-i.length,summaryLines:function(e,t,n){let r=new Map;for(let a of e){let e=function(e,t,n){if(!e.rect)return null;let r=nL(e,t,n);return r?n$(e.rect,r):null}(a,t,n);if(!e)continue;let i=r.get(e)??[];i.push(a),r.set(e,i)}return["above","below"].flatMap(e=>{let t=r.get(e);if(!t||0===t.length)return[];let n=(function(e){let t=new Set,n=[];for(let r of e){let e=nC(r);!e||t.has(e)||(t.add(e),n.push(e))}return n})(t).slice(0,3).map(e=>`"${e}"`),a=1===t.length?"interactive item":"interactive items",i=n.length>0?`: ${n.join(", ")}`:"";return[`[off-screen ${e}] ${t.length} ${a}${i}`]})}(r.filter(e=>!a.coveredNodeIndexes.has(e.index)&&function(e){if(!0===e.hittable)return!0;let t=(e.type??"").toLowerCase();return t.includes("button")||t.includes("link")||t.includes("textfield")||t.includes("edittext")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")||t.includes("menuitem")||!!nC(e)}(e)),e,t)}}function nP(e){let t=nO(e),n=new Set,r=[];for(let a of e){if(nT(a,e,t)){!function(e,t,n){let r=e,a=new Set;for(;r&&!a.has(r.index);)a.add(r.index),t.add(r.index),r="number"==typeof r.parentIndex?n.get(r.parentIndex):void 0}(a,n,t);continue}r.push(a)}let a=function(e,t,n,r){let a=new Map,i=new Set;for(let e of t){if(!e.rect)continue;let t=nF(e,n,r);if(!t?.rect)continue;let o=n$(e.rect,t.rect);if(!o)continue;let s=a.get(t.index)??new Set;s.add(o),a.set(t.index,s),i.add(e.index)}return function(e,t,n,r){for(let a of e){let e=function(e){let t=function(e,t){if(!(e?.trim().toLowerCase()??"").includes("vertical scroll bar"))return null;let n=function(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}(t);return null===n?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add("above"),t.below&&n.add("below"),n.size>0?n:null}(a);if(!e||0===e.size)continue;let i=nF(a,t,n);if(!i)continue;let o=r.get(i.index)??new Set;for(let t of e)o.add(t);r.set(i.index,o)}}(e,n,r,a),{directionsByContainer:a,coveredNodeIndexes:i}}(e,r,n,t);return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:a}}function nT(e,t,n=nO(t)){var r;if(!e.rect)return!0;let a=nL(e,t,n);return!a||(r=e.rect,nD(r.x,r.x+r.width,a.x,a.x+a.width)&&nD(r.y,r.y+r.height,a.y,a.y+a.height))}function nL(e,t,n=nO(t)){let r=function(e,t){let n="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,r=new Set;for(;n&&!r.has(n.index);){if(r.add(n.index),n.rect&&ep(n))return n.rect;n="number"==typeof n.parentIndex?t.get(n.parentIndex):void 0}return null}(e,n);return r||function(e,t){let n=eo(t),r=e.filter(e=>{var t;return!!(t=e.rect)&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.width)&&Number.isFinite(t.height)}),a=r.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}),i=nE(a.map(e=>e.rect).filter(e=>nM(e,n.x,n.y)));if(i)return i;let o=nE(a.map(e=>e.rect));if(o)return o;let s=nE(r.map(e=>e.rect).filter(e=>nM(e,n.x,n.y)));return s||null}(t,e.rect??{x:0,y:0,width:0,height:0})}function n$(e,t){return e.y+e.height<=t.y?"above":e.y>=t.y+t.height?"below":null}function nF(e,t,n){let r="number"==typeof e.parentIndex?n.get(e.parentIndex):void 0,a=new Set;for(;r&&!a.has(r.index);){if(a.add(r.index),t.has(r.index)&&ep(r))return r;r="number"==typeof r.parentIndex?n.get(r.parentIndex):void 0}return null}function nU(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function nG(e,t){let n=Math.max(24,Math.round(.2*Math.min(e.size,t.size))),r=Math.max(48,Math.round(.15*Math.min(e.crossSize,t.crossSize)));return Math.abs(e.size-t.size)<=n&&Math.abs(e.crossSize-t.crossSize)<=r}function nV(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}async function nB(e,t={}){let n=eI(e,t.helperAdb),r=await nj(e,t,n),a=r.xml;if(!t.interactiveOnly){let i=el(a,800,t);return function(e,t){for(let[n,r]of e){let e=t[n];e&&(r.hiddenContentAbove&&(e.hiddenContentAbove=!0),r.hiddenContentBelow&&(e.hiddenContentBelow=!0))}}(await nH(e,i.nodes,n),i.nodes),{...i,androidSnapshot:r.metadata}}let i=eu(a),o=eg(i,800,{...t,interactiveOnly:!1}),s=eg(i,800,t),l=await nH(e,o.nodes,n);nZ(l,o,s),0===l.size&&nZ(function(e){if(0===e.length)return new Map;let{hintedContainers:t}=nP(e);var n=t.directionsByContainer;let r=new Map;for(let[e,t]of n){let n={};t.has("above")&&(n.hiddenContentAbove=!0),t.has("below")&&(n.hiddenContentBelow=!0),(n.hiddenContentAbove||n.hiddenContentBelow)&&r.set(e,n)}return r}(es(o.nodes)),o,s);let{sourceNodes:d,...u}=s;return{...u,androidSnapshot:r.metadata}}async function nj(e,t,n){let r=await nq(t.helperArtifact);if(r.artifact){var a;let i=(a=e,`${a.platform}:${a.id}`);try{let a=ev(e,t.helperAdb),o=await ed({adb:n,adbProvider:a,artifact:r.artifact,deviceKey:i,installPolicy:t.helperInstallPolicy,timeoutMs:3e4}),s=await ec({adb:n,packageName:r.artifact.manifest.packageName,instrumentationRunner:r.artifact.manifest.instrumentationRunner,waitForIdleTimeoutMs:500,timeoutMs:8e3,commandTimeoutMs:13e3});return{xml:s.xml,metadata:{backend:"android-helper",helperVersion:r.artifact.manifest.version,helperApiVersion:s.metadata.helperApiVersion,installReason:o.reason,waitForIdleTimeoutMs:s.metadata.waitForIdleTimeoutMs,timeoutMs:s.metadata.timeoutMs,maxDepth:s.metadata.maxDepth,maxNodes:s.metadata.maxNodes,rootPresent:s.metadata.rootPresent,captureMode:s.metadata.captureMode,windowCount:s.metadata.windowCount,nodeCount:s.metadata.nodeCount,helperTruncated:s.metadata.truncated,elapsedMs:s.metadata.elapsedMs}}}catch(t){return em({deviceKey:i,packageName:r.artifact.manifest.packageName,versionCode:r.artifact.manifest.versionCode}),await nX(e,g(t).message,n)}}return await nX(e,r.fallbackReason,n)}async function nq(e){if(e)return{artifact:e};let t=ey(),n=s.join(eb(),"android-snapshot-helper","dist"),r=s.join(n,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await p.access(r)}catch{return{}}try{let e=eh(JSON.parse(await p.readFile(r,"utf8"))),t=s.join(n,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await p.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:g(e).message}}}async function nX(e,t,n){return{xml:await nK(e,n),metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function nH(e,t,n){if(!t.some(e=>ew(e.type)))return new Map;let r=await nJ(e,n);return r?function(e,t){let n=function(e){let t={className:"root",rect:{x:0,y:0,width:0,height:0},children:[]},n=[{indent:-1,node:t}],r=/^(\s*)([\w.$]+)\{[^}]* (-?\d+),(-?\d+)-(-?\d+),(-?\d+) #/;for(let t of e.split("\n")){let e=r.exec(t);if(!e)continue;let a=e[1].length,i=Number(e[3]),o=Number(e[4]),s=Number(e[5]),l=Number(e[6]),d={className:e[2],rect:{x:i,y:o,width:Math.max(0,s-i),height:Math.max(0,l-o)},children:[]};for(;n.length>1&&a<=n[n.length-1].indent;)n.pop();n[n.length-1].node.children.push(d),n.push({indent:a,node:d})}return t.children.length>0?t:null}(t);if(!n)return new Map;let r=function(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();if(ew(e.className)){let n=function(e){let t=e.children[0];if(!t)return null;let n=Math.max(t.rect.height,...t.children.map(e=>e.rect.y+e.rect.height)),r=t.children.filter(e=>e.rect.height>0).map(t=>nV(t.rect,e.rect)).sort((e,t)=>e.start-t.start);return 0===r.length?null:{rect:e.rect,contentExtent:n,contentBlocks:r}}(e);n&&t.push(n)}n.push(...e.children)}return t}(n);if(0===r.length)return new Map;let a=new Map;for(let t of e){if(!t.rect||!ew(t.type))continue;let n=function(e,t){let n=null,r=1/0;for(let a of t){let t=Math.abs(a.rect.width-e.width)+Math.abs(a.rect.height-e.height);if(t>32)continue;let i=4*t+(Math.abs(a.rect.x-e.x)+Math.abs(a.rect.y-e.y));i<r&&(n=a,r=i)}return n}(t.rect,r);if(!n)continue;let i=function(e,t){let n=function(e,t){let n=t,r=new Set;for(;!r.has(n.index);){var a,i;r.add(n.index);let o=e.filter(e=>e.parentIndex===n.index&&e.rect);if(1!==o.length)return n;let s=o[0];if(a=s.rect,i=t.rect,a.x!==i.x||a.y!==i.y||a.width!==i.width||a.height!==i.height)return n;n=s}return t}(e,t);return e.filter(e=>e.parentIndex===n.index&&e.rect).map(e=>e.rect).filter(e=>e.height>0).sort((e,t)=>e.y-t.y).map(e=>nV(e,t.rect))}(e,t),o=function(e){let{viewportRect:t,visibleBlocks:n,nativeScrollView:r}=e;if(0===n.length||0===r.contentBlocks.length)return null;let a=function(e){if(0===e.contentBlocks.length)return null;let t=e.contentBlocks[0],n=e.contentBlocks[e.contentBlocks.length-1];if(!t||!n)return null;let r=nU(e.contentBlocks.map(e=>e.size))??e.rect.height,a=Math.max(48,Math.round(.5*r)),i=Math.max(24,Math.round(.25*r)),o=t.start>=a,s=e.contentExtent-(n.start+n.size)>=i;return o||s?{above:o,below:s}:null}(r),i=function(e,t){let n=new Map;for(let r of e)for(let e of t){if(!nG(r,e))continue;let t=r.start-e.start,a=8*Math.round(t/8),i=n.get(a)??[];i.push(t),n.set(a,i)}let r=null;for(let e of n.values())(!r||e.length>r.length)&&(r=e);if(!r||r.length<2)return null;let a=[...r].sort((e,t)=>e-t);return a[Math.floor(a.length/2)]??null}(r.contentBlocks,n)??function(e){let{nativeBlocks:t,visibleBlocks:n,viewportExtent:r,contentExtent:a}=e,i=[],o=[];for(let e of t)for(let t of n){if(!nG(e,t))continue;let n=e.start-t.start;16>=Math.abs(n)&&i.push(n),16>=Math.abs(n+r-a)&&o.push(n)}return o.length>0?nU(o):i.length>0?nU(i):null}({nativeBlocks:r.contentBlocks,visibleBlocks:n,viewportExtent:t.height,contentExtent:r.contentExtent});if(null===i)return a;let o=t.height;return{above:(a?.above??!1)||i>16,below:(a?.below??!1)||i+o<r.contentExtent-16}}({viewportRect:t.rect,visibleBlocks:i,nativeScrollView:n});if(!o)continue;let s={};o.above&&(s.hiddenContentAbove=!0),o.below&&(s.hiddenContentBelow=!0),(s.hiddenContentAbove||s.hiddenContentBelow)&&a.set(t.index,s)}return a}(t,r):new Map}async function nK(e,t=eI(e)){try{return await x(()=>nz(t),{shouldRetry:nW})}catch(e){if(function(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code||"number"!=typeof e.details?.timeoutMs)return!1;let t=e.details?.cmd,n=e.details?.args,r=Array.isArray(n)?n.map(String):"string"==typeof n?n.split(/\s+/):[];return"adb"===t&&r.includes("uiautomator")&&r.includes("dump")}(e)){let t="If the app has looping animations, use screenshot as visual truth, try settings animations off, then retry snapshot. Stock Android UIAutomator may still time out on app-owned infinite animations.";throw new y("COMMAND_FAILED",`Android UI hierarchy dump timed out while waiting for the UI to become idle. ${t}`,{...e.details??{},hint:t},e)}throw e}}async function nz(e){var t,n,r;let a,i,o=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),s=nY(o.stdout,o.stderr);if(s)return s;let l="/sdcard/window_dump.xml",d=await e(["shell","uiautomator","dump",l],{allowFailure:!0,timeoutMs:8e3}),u=(t=l,n=d.stdout,r=d.stderr,a=`${n}
7
- ${r}`,i=/dumped to:\s*(\S+)/i.exec(a),i?.[1]??t),c=await e(["shell","cat",u]),p=nY(c.stdout,c.stderr);if(!p)throw new y("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:c.stdout,stderr:c.stderr});return p}function nY(e,t){let n=`${e}
8
- ${t}`,r=n.indexOf("<?xml"),a=r>=0?r:n.indexOf("<hierarchy");if(a<0)return null;let i=n.lastIndexOf("</hierarchy>");if(i<0||i<a)return null;let o=n.slice(a,i+12).trim();return o.length>0?o:null}function nW(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,n=("string"==typeof t?t:"").toLowerCase();return!!(n.includes("device offline")||n.includes("device not found")||n.includes("transport error")||n.includes("connection reset")||n.includes("broken pipe")||n.includes("timed out")||n.includes("no such file or directory"))}async function nJ(e,t=eI(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),n=`${e.stdout}
9
- ${e.stderr}`.trim();return n.length>0?n:null}catch{return null}}function nZ(e,t,n){if(0===e.size)return;let r=new Map;for(let[e,t]of n.sourceNodes.entries()){let a=n.nodes[e];a&&r.set(t,a)}for(let[n,a]of e){let e=t.sourceNodes[n];if(!e)continue;let i=r.get(e);i&&(a.hiddenContentAbove&&(i.hiddenContentAbove=!0),a.hiddenContentBelow&&(i.hiddenContentBelow=!0))}}async function nQ(e,t,n,r){let a=null;for(let i of[0,150,350]){i>0&&await Y(i);let o=await n1(e,t,n,r);if(a=o,o.ok)return o}return a??{ok:!1,actual:null,reason:"text_mismatch",targetInput:null,actualInput:null}}async function n0(e,t,n){var r,a,i;return r=await nK(e),a=t,i=n,n2(r,a,i).actualInput?.text??null}async function n1(e,t,n,r){var a,i,o;let s,l;return a=await nK(e),!function(e){let{targetInput:t,actualInput:n}=e;return!!t&&!!n&&n!==t&&n.inputMethodOwned&&!t.inputMethodOwned}(s=n2(a,t,n))?function(e,t){let n=e.actualInput;if(!n||!nN(n))return null;let r=n.text??null,a=Array.from(r??"").length,i=Array.from(t).length,o=null!==r&&a>0&&i>0&&a===i;return{ok:o,actual:r,reason:o?void 0:"masked_unverified",masked:!0,targetInput:e.targetInput,actualInput:n}}(s,r)??(i=s,o=r,{ok:function(e,t){if(e===t)return!0;let n=n3(e),r=n3(t);return!!n&&!!r&&(!!(n===r||n.includes(r))||r.includes(n)&&n.length>=Math.max(4,Math.floor(.8*r.length)))}(l=i.actualInput?.text??null,o),actual:l,reason:"text_mismatch",targetInput:i.targetInput,actualInput:i.actualInput}):{ok:!1,actual:s.actualInput?.text??null,reason:"ime_capture",targetInput:s.targetInput,actualInput:s.actualInput}}function n2(e,t,n){var r;let a,i={focusedEdit:null,editAtPoint:null,anyAtPoint:null};for(let r of ef(e)){let e=function(e){if(!e.rect)return null;let t=e.text??"",n=Math.max(1,e.rect.width*e.rect.height);return{text:t||null,className:e.className,resourceId:e.resourceId,packageName:e.packageName,rect:e.rect,focused:e.focused??!1,password:!0===e.password,inputMethodOwned:function(e,t){let n=(e??"").toLowerCase(),r=(t??"").toLowerCase();return!!n.includes("inputmethod")||"com.google.android.inputmethod.latin"===n||r.startsWith("com.google.android.inputmethod.latin:id/")}(e.packageName,e.resourceId),area:n,editText:function(e){let t=e.toLowerCase();return t.includes("edittext")||t.includes("textfield")}(e.className??"")}}(r);e&&function(e,t,n,r){var a,i,o;let s=(a=t.rect,i=n,o=r,i>=a.x&&i<=a.x+a.width&&o>=a.y&&o<=a.y+a.height);if(s&&t.editText&&(e.editAtPoint=n4(e.editAtPoint,t)),t.focused&&t.editText){e.focusedEdit=n4(e.focusedEdit,t);return}s&&t.text&&(e.anyAtPoint=n4(e.anyAtPoint,t))}(i,e,t,n)}return{targetInput:a=(r=i).editAtPoint??r.anyAtPoint,actualInput:(r.focusedEdit?.text?r.focusedEdit:null)??a}}function n3(e){return(e??"").replace(/\s+/g," ").trim()}function n4(e,t){return e&&e.area<t.area?e:t}async function n5(e,t,n){await b(e,["shell","input","tap",String(t),String(n)])}async function n8(e,t,n,r,a,i=250){await b(e,["shell","input","swipe",String(t),String(n),String(r),String(a),String(i)])}async function n6(e){await b(e,["shell","input","keyevent","4"])}async function n9(e){await b(e,["shell","input","keyevent","3"])}async function n7(e,t){let n=function(e){switch(e){case"portrait":return"0";case"landscape-left":return"1";case"portrait-upside-down":return"2";case"landscape-right":return"3";default:throw new y("INVALID_ARGS",`Unsupported Android rotation: ${e}`)}}(t);await b(e,["shell","settings","put","system","accelerometer_rotation","0"]),await b(e,["shell","settings","put","system","user_rotation",n])}async function re(e){await b(e,["shell","input","keyevent","187"])}async function rt(e,t,n,r=800){await b(e,["shell","input","swipe",String(t),String(n),String(t),String(n),String(r)])}async function rn(e,t,n=0){n>0&&Array.from(t).length>1?await rd(e,t,1,n):await rr(e,t)}async function rr(e,t){let n=ru(t);if(!n||"ok"!==await rc(e,t))try{let n=t.replace(/ /g,"%s");await b(e,["shell","input","text",n])}catch(e){if(n&&function(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,n=("string"==typeof t?t:"").toLowerCase();return!!(n.includes("exception occurred while executing 'text'")||n.includes("nullpointerexception")&&n.includes("inputshellcommand.sendtext"))}(e))throw new y("COMMAND_FAILED","Non-ASCII text input is not supported on this Android shell. Install an ADB keyboard IME or use ASCII input.",{textPreview:t.slice(0,32)},e instanceof Error?e:void 0);throw e}}async function ra(e,t,n){await n5(e,t,n)}async function ri(e,t,n,r,a=0){let i=Array.from(r).length,o=ru(r),s=[{strategy:"input_text",clearPadding:12,minClear:8,maxClear:48}];!o&&a<=0&&s.push({strategy:"clipboard_paste",clearPadding:12,minClear:8,maxClear:48}),(!o||a>0)&&s.push({strategy:"chunked_input",clearPadding:24,minClear:16,maxClear:96});let l=null;for(let o of s){var d,u;await ra(e,t,n);let s=(d=i+o.clearPadding,u=o.minClear,Math.max(u,Math.min(o.maxClear,d)));if(await rp(e,s),"input_text"===o.strategy)await rn(e,r,a);else if("clipboard_paste"===o.strategy){if("ok"!==await rc(e,r))continue}else await rd(e,r,1,a>0?a:15);let c=await nQ(e,t,n,r);if(l=c,c.ok)return;"ime_capture"===c.reason&&ro(r,c)}ro(r,l)}function ro(e,t){let n;throw new y("COMMAND_FAILED",t?.reason==="ime_capture"?"Android fill input was captured by the active keyboard instead of the app field":t?.reason==="masked_unverified"?"Android fill verification could not confirm masked text value":"Android fill verification failed",(n=function(e,t){var n;if(!t)return{expected:e,actual:null,failureReason:"text_mismatch",targetInput:null,actualInput:null};let r=!0===(n=t).masked||nN(n.targetInput)||nN(n.actualInput),a={failureReason:t.reason??"text_mismatch",targetInput:n_(t.targetInput),actualInput:n_(t.actualInput)};return r?{...a,expectedLength:Array.from(e).length,actual:null,masked:!0,actualLength:Array.from(t.actual??"").length}:{...a,expected:e,actual:t.actual}}(e,t),t?.reason==="ime_capture"&&(n.hint="The focused input belongs to the Android keyboard/IME, not the app field. Disable handwriting/stylus input or switch to a standard IME, then retry fill."),n))}async function rs(e,t,n){let r=await rl(e),a=nS({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:r.width,referenceHeight:r.height});return await b(e,["shell","input","swipe",String(a.x1),String(a.y1),String(a.x2),String(a.y2),"300"]),a}async function rl(e){let t=(await b(e,["shell","wm","size"])).stdout.match(/Physical size:\s*(\d+)x(\d+)/);if(!t)throw new y("COMMAND_FAILED","Unable to read screen size");return{width:Number(t[1]),height:Number(t[2])}}async function rd(e,t,n,r){let a=Math.max(1,Math.floor(n)),i=Array.from(t);for(let t=0;t<i.length;t+=a){let n=i.slice(t,t+a).join("");await rr(e,n),r>0&&t+a<i.length&&await Y(r)}}function ru(e){for(let t of e){let e=t.codePointAt(0);if(void 0!==e&&(e<32||e>126))return!0}return!1}async function rc(e,t){let n=await b(e,["shell","cmd","clipboard","set","text",t],{allowFailure:!0});return 0!==n.exitCode?"failed":V(n.stdout,n.stderr)?"unsupported":0===(await b(e,["shell","input","keyevent","KEYCODE_PASTE"],{allowFailure:!0})).exitCode||0===(await b(e,["shell","input","keyevent","279"],{allowFailure:!0})).exitCode?"ok":"failed"}async function rp(e,t){let n=Math.max(0,t);await b(e,["shell","input","keyevent","KEYCODE_MOVE_END"],{allowFailure:!0});for(let t=0;t<n;t+=24){let r=Math.min(24,n-t);await b(e,["shell","input","keyevent",...Array(r).fill("KEYCODE_DEL")],{allowFailure:!0})}}function rf(e,t){if(void 0===e||""===e.trim())throw new y("INVALID_ARGS",`settings location set requires ${t}`);return rm(Number(e),t)}function rh(e){return{latitude:rm(e?.latitude,"latitude"),longitude:rm(e?.longitude,"longitude")}}function rm(e,t){let n="latitude"===t?-90:-180,r="latitude"===t?90:180;if("number"!=typeof e||!Number.isFinite(e)||e<n||e>r)throw new y("INVALID_ARGS",`${t} must be a number from ${n} to ${r}`);return e}let rw=["camera","microphone","photos","contacts","contacts-limited","notifications","calendar","location","location-always","media-library","motion","reminders","siri"];function rg(e){let t=e.trim().toLowerCase();if("grant"===t)return"grant";if("deny"===t)return"deny";if("reset"===t)return"reset";throw new y("INVALID_ARGS",`Invalid permission action: ${e}. Use grant|deny|reset.`)}function ry(e){let t=e?.trim().toLowerCase();if("camera"===t||"microphone"===t||"photos"===t||"contacts"===t||"contacts-limited"===t||"notifications"===t||"calendar"===t||"location"===t||"location-always"===t||"media-library"===t||"motion"===t||"reminders"===t||"siri"===t)return t;throw new y("INVALID_ARGS",`permission setting requires a target: ${rw.join("|")}`)}function rb(e){let t=e.trim().toLowerCase();if("light"===t)return"light";if("dark"===t)return"dark";if("toggle"===t)return"toggle";throw new y("INVALID_ARGS",`Invalid appearance state: ${e}. Use light|dark|toggle.`)}function rv(e){let t=e.toLowerCase();if("on"===t||"true"===t||"1"===t)return!0;if("off"===t||"false"===t||"0"===t)return!1;throw new y("INVALID_ARGS",`Invalid setting state: ${e}`)}let rI=["window_animation_scale","transition_animation_scale","animator_duration_scale"];async function rA(e,t,n,r,a){switch(t.toLowerCase()){case"wifi":{let t=rv(n);await b(e,["shell","svc","wifi",t?"enable":"disable"]);return}case"airplane":{let t=rv(n);await b(e,["shell","settings","put","global","airplane_mode_on",t?"1":"0"]),await b(e,["shell","am","broadcast","-a","android.intent.action.AIRPLANE_MODE","--ez","state",t?"true":"false"]);return}case"location":{if("set"===n.toLowerCase()){if("emulator"!==e.kind)throw new y("UNSUPPORTED_OPERATION","Android precise location coordinates are supported only on emulators.",{deviceId:e.id,hint:"Use an Android emulator for adb emu geo fix, or configure location through device/provider tooling."});let{latitude:t,longitude:n}=rh(a);return await b(e,["emu","geo","fix",String(n),String(t)]),{latitude:t,longitude:n}}let t=rv(n);await b(e,["shell","settings","put","secure","location_mode",t?"3":"0"]);return}case"animations":{let t=rv(n)?"1":"0";for(let n of rI)await b(e,["shell","settings","put","global",n,t]);return{scale:t,keys:[...rI]}}case"appearance":{let t=await rS(e,n);await b(e,["shell","cmd","uimode","night","dark"===t?"yes":"no"]);return}case"fingerprint":{let t=function(e){let t=e.trim().toLowerCase();if("match"===t)return"match";if("nonmatch"===t)return"nonmatch";throw new y("INVALID_ARGS",`Invalid fingerprint state: ${e}. Use match|nonmatch.`)}(n);await rx(e,t);return}case"permission":{if(!r)throw new y("INVALID_ARGS","permission setting requires an active app in session");let t=rg(n),i=function(e,t){let n=ry(e);if(t?.trim())throw new y("INVALID_ARGS",`Permission mode is only supported for photos. Received: ${t}.`);if("camera"===n)return{kind:"pm",value:"android.permission.CAMERA",type:"camera"};if("microphone"===n)return{kind:"pm",value:"android.permission.RECORD_AUDIO",type:"microphone"};if("photos"===n)return{kind:"pm",value:"android.permission.READ_MEDIA_IMAGES",type:"photos"};if("contacts"===n)return{kind:"pm",value:"android.permission.READ_CONTACTS",type:"contacts"};if("notifications"===n)return{kind:"notifications",appOps:"POST_NOTIFICATION",permission:"android.permission.POST_NOTIFICATIONS"};throw new y("INVALID_ARGS",`Unsupported permission target on Android: ${e}. Use camera|microphone|photos|contacts|notifications.`)}(a?.permissionTarget,a?.permissionMode);if("notifications"===i.kind)return void await r_(e,r,t,i);let o="grant"===t?"grant":"revoke";if("photos"===i.type)return void await rN(e,r,o);await b(e,["shell","pm",o,r,i.value]);return}default:throw new y("INVALID_ARGS",`Unsupported setting: ${t}`)}}async function rx(e,t){var n;let r,a,i=(n=e,a=[["shell","cmd","fingerprint","touch",r="match"===t?"1":"9999"],["shell","cmd","fingerprint","finger",r]],"emulator"===n.kind&&a.push(["emu","finger","touch",r]),a),o=[];for(let t of i){let n=await b(e,t,{allowFailure:!0});if(0===n.exitCode)return;o.push({args:t,stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})}let s=o.map(e=>({args:e.args.join(" "),exitCode:e.exitCode,stderr:e.stderr.slice(0,400)}));if(o.length>0&&o.every(e=>{var t,n;let r;return t=e.stdout,n=e.stderr,(r=`${t}
10
- ${n}`.toLowerCase()).includes("unknown command")||r.includes("can't find service: fingerprint")||r.includes("service fingerprint was not found")||r.includes("fingerprint cmd unavailable")||r.includes("emu command is not supported")||r.includes("emulator console is not running")||r.includes("fingerprint")&&r.includes("not found")}))throw new y("UNSUPPORTED_OPERATION","Android fingerprint simulation is not supported on this target/runtime.",{deviceId:e.id,action:t,hint:"Use an Android emulator with biometric support, or a device/runtime that exposes cmd fingerprint.",attempts:s});throw new y("COMMAND_FAILED","Failed to simulate Android fingerprint.",{deviceId:e.id,action:t,attempts:s})}async function rS(e,t){let n=rb(t);if("toggle"!==n)return n;let r=await b(e,["shell","cmd","uimode","night"],{allowFailure:!0});if(0!==r.exitCode)throw new y("COMMAND_FAILED","Failed to read current Android appearance",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let a=function(e,t){let n=/night mode:\s*(yes|no|auto)\b/i.exec(`${e}
11
- ${t}`);if(!n)return null;let r=n[1].toLowerCase();return"yes"===r?"dark":"no"===r?"light":"auto"===r?"auto":null}(r.stdout,r.stderr);if(!a)throw new y("COMMAND_FAILED","Unable to determine current Android appearance for toggle",{stdout:r.stdout,stderr:r.stderr});return"auto"===a?"dark":"dark"===a?"light":"dark"}async function rN(e,t,n){let r=await rk(e),a=[];for(let i of null!==r&&r>=33?["android.permission.READ_MEDIA_IMAGES","android.permission.READ_EXTERNAL_STORAGE"]:["android.permission.READ_EXTERNAL_STORAGE","android.permission.READ_MEDIA_IMAGES"]){let r=await b(e,["shell","pm",n,t,i],{allowFailure:!0});if(0===r.exitCode)return;a.push({permission:i,stderr:r.stderr,exitCode:r.exitCode})}throw new y("COMMAND_FAILED",`Failed to ${n} Android photos permission`,{appPackage:t,sdkInt:r,attempts:a})}async function r_(e,t,n,r){"grant"===n?await b(e,["shell","pm","grant",t,r.permission],{allowFailure:!0}):(await b(e,["shell","pm","revoke",t,r.permission],{allowFailure:!0}),"reset"===n&&(await b(e,["shell","pm","clear-permission-flags",t,r.permission,"user-set"],{allowFailure:!0}),await b(e,["shell","pm","clear-permission-flags",t,r.permission,"user-fixed"],{allowFailure:!0}))),await b(e,["shell","appops","set",t,r.appOps,"grant"===n?"allow":"deny"===n?"deny":"default"])}async function rk(e){let t=await b(e,["shell","getprop","ro.build.version.sdk"],{allowFailure:!0});if(0!==t.exitCode)return null;let n=Number.parseInt(t.stdout.trim(),10);return!Number.isFinite(n)||n<=0?null:n}async function rM(e,t,n){let r="string"==typeof n.action&&n.action.trim()?n.action.trim():`${t}.TEST_PUSH`,a=["shell","am","broadcast","-a",r,"-p",t],i="string"==typeof n.receiver?n.receiver.trim():"";i&&a.push("-n",i);let o=n.extras;if(void 0!==o&&("object"!=typeof o||null===o||Array.isArray(o)))throw new y("INVALID_ARGS","Android push payload extras must be an object");let s=0;for(let[e,t]of Object.entries(o??{}))e&&(function(e,t,n){if("string"==typeof n)return e.push("--es",t,n);if("boolean"==typeof n)return e.push("--ez",t,n?"true":"false");if("number"==typeof n&&Number.isFinite(n))return Number.isInteger(n)?e.push("--ei",t,String(n)):e.push("--ef",t,String(n));throw new y("INVALID_ARGS",`Unsupported Android broadcast extra type for "${t}". Use string, boolean, or number.`)}(a,e,t),s+=1);return await b(e,a),{action:r,extrasCount:s}}let rE=Buffer.from([137,80,78,71,13,10,26,10]);async function rD(e,t){await rO(e);try{await Y(1e3),await rR(e,t)}finally{await rC(e).catch(()=>{})}}async function rO(e){let t=t=>b(e,["shell",t],{allowFailure:!0});await t("settings put global sysui_demo_allowed 1");let n=e=>t(`am broadcast -a com.android.systemui.demo -e command ${e}`);await n("clock -e hhmm 0941"),await n("notifications -e visible false")}async function rC(e){await b(e,["shell","am broadcast -a com.android.systemui.demo -e command exit"],{allowFailure:!0})}async function rR(e,t){let n=await b(e,["exec-out","screencap","-p"],{binaryStdout:!0});if(!n.stdoutBuffer)throw new y("COMMAND_FAILED","Failed to capture screenshot");let r=n.stdoutBuffer.indexOf(rE);if(r<0)throw new y("COMMAND_FAILED","Screenshot data does not contain a valid PNG header");let i=function(e,t){let n=t+rE.length;for(;n+8<=e.length;){let t=e.readUInt32BE(n),r=n+4,a=e.toString("ascii",r,r+4),i=n+12+t;if(i>e.length)break;if("IEND"===a)return i;n=i}return null}(n.stdoutBuffer,r);if(!i)throw new y("COMMAND_FAILED","Screenshot data does not contain a complete PNG payload");await a.writeFile(t,n.stdoutBuffer.subarray(r,i))}let rP=W(process.env.AGENT_DEVICE_IOS_BOOT_TIMEOUT_MS,D.ios_boot.totalMs,5e3),rT=W(process.env.AGENT_DEVICE_IOS_SIMCTL_LIST_TIMEOUT_MS,D.ios_boot.operationMs,1e3),rL=W(process.env.AGENT_DEVICE_IOS_APP_LAUNCH_TIMEOUT_MS,3e4,5e3),r$=W(process.env.AGENT_DEVICE_IOS_DEVICECTL_TIMEOUT_MS,2e4,1e3),rF=W(process.env.AGENT_DEVICE_IOS_SIMULATOR_FOCUS_TIMEOUT_MS,1e4,1e3),rU=W(process.env.AGENT_DEVICE_IOS_SIMULATOR_SCREENSHOT_TIMEOUT_MS,2e4,1e3),rG=W(process.env.AGENT_DEVICE_IOS_RUNNER_SCREENSHOT_COPY_TIMEOUT_MS,2e4,1e3),rV=k(process.env.AGENT_DEVICE_IOS_SIMULATOR_SCREENSHOT_RUNNER_FALLBACK);async function rB(e,t){let n=["devicectl",...e],r=await H("xcrun",n,{allowFailure:!0,timeoutMs:r$});if(0===r.exitCode)return;let a=String(r.stdout??""),i=String(r.stderr??"");throw new y("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:n,exitCode:r.exitCode,stdout:a,stderr:i,deviceId:t.deviceId,hint:rH(a,i)??rX})}async function rj(e,t){let n=s.join(i.tmpdir(),`agent-device-ios-apps-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),r=["devicectl","device","info","apps","--device",e.id,"--include-all-apps","--json-output",n],o=await H("xcrun",r,{allowFailure:!0,timeoutMs:r$});try{var l,d;if(0!==o.exitCode){let t=String(o.stdout??""),n=String(o.stderr??"");throw new y("COMMAND_FAILED","Failed to list iOS apps",{cmd:"xcrun",args:r,exitCode:o.exitCode,stdout:t,stderr:n,deviceId:e.id,hint:rH(t,n)??rX})}let i=await a.readFile(n,"utf8");return l=function(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.bundleIdentifier?e.bundleIdentifier.trim():"";if(!t)continue;let r="string"==typeof e.name&&e.name.trim().length>0?e.name.trim():t,a="string"==typeof e.url&&e.url.trim().length>0?e.url.trim():void 0;n.push({bundleId:t,name:r,url:a})}return n}(JSON.parse(i)),d=t,"user-installed"===d?l.filter(e=>!e.bundleId.startsWith("com.apple.")):l}catch(t){if(t instanceof y)throw t;throw new y("COMMAND_FAILED","Failed to parse iOS apps list",{deviceId:e.id,cause:String(t)})}finally{await a.unlink(n).catch(()=>{})}}async function rq(e){let t=s.join(i.tmpdir(),`agent-device-ios-processes-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=["devicectl","device","info","processes","--device",e.id,"--json-output",t],r=await H("xcrun",n,{allowFailure:!0,timeoutMs:r$});try{if(0!==r.exitCode){let t=String(r.stdout??""),a=String(r.stderr??"");throw new y("COMMAND_FAILED","Failed to list iOS processes",{cmd:"xcrun",args:n,exitCode:r.exitCode,stdout:t,stderr:a,deviceId:e.id,hint:rH(t,a)??rX})}let i=await a.readFile(t,"utf8");return function(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.executable?e.executable.trim():"",r="number"==typeof e.processIdentifier&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;t&&Number.isFinite(r)&&n.push({executable:t,pid:r})}return n}(JSON.parse(i))}catch(t){if(t instanceof y)throw t;throw new y("COMMAND_FAILED","Failed to parse iOS process list",{deviceId:e.id,cause:String(t)})}finally{await a.unlink(t).catch(()=>{})}}let rX="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function rH(e,t){let n=`${e}
12
- ${t}`.toLowerCase();return n.includes("device is busy")&&n.includes("connecting")?"iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.":n.includes("coredeviceservice")&&n.includes("timed out")?"CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.":null}function rK(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details??{};if(4!==t.exitCode)return!1;let n=String(t.stderr??"").toLowerCase();return n.includes("fbsopenapplicationserviceerrordomain")&&n.includes("the request to open")}async function rz(e,t){let n=await H("xcrun",tr(e,["get_app_container",e.id,t]),{allowFailure:!0});if(0!==n.exitCode)return{installed:!1};let r=n.stdout.trim();if(!r)return{installed:!1};let a=await H("plutil",["-extract","CFBundleExecutable","raw","-o","-",`${r}/Info.plist`],{allowFailure:!0});if(0!==a.exitCode||!a.stdout.trim())return{installed:!0};let i=a.stdout.trim(),o=`${r}/${i}`,s=await H("otool",["-l",o],{allowFailure:!0});if(0!==s.exitCode)return{installed:!0};let l=s.stdout.toLowerCase();return{installed:!0,simulatorCompatible:l.includes("iossimulator")||l.includes("platform 7")}}function rY(e,t){if("simulator"!==e.kind)throw new y("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function rW(){await H("open",["-a","Simulator"],{allowFailure:!0,timeoutMs:rF})}async function rJ(e){let t,n;if("simulator"!==e.kind||"Booted"===await rQ(e))return;let r=S.fromTimeoutMs(rP);try{await $(async({deadline:r})=>{if(r?.isExpired())throw new y("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:rP});let a=Math.max(1e3,r?.remainingMs()??rP),i=await H("xcrun",tr(e,["boot",e.id]),{allowFailure:!0,timeoutMs:a});t={stdout:String(i.stdout??""),stderr:String(i.stderr??""),exitCode:i.exitCode};let o=`${t.stdout}
13
- ${t.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==t.exitCode&&!s)throw new y("COMMAND_FAILED","simctl boot failed",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let l=await H("xcrun",tr(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:a});if(n={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==n.exitCode)throw new y("COMMAND_FAILED","simctl bootstatus failed",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode});let d=await rQ(e);if("Booted"!==d)throw new y("COMMAND_FAILED","Simulator is still booting",{state:d})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let r=N({error:e,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==r&&"CI_RESOURCE_STARVATION_SUSPECTED"!==r}},{deadline:r,phase:"boot",classifyReason:e=>N({error:e,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(i){let a=N({error:i,stdout:n?.stdout??t?.stdout,stderr:n?.stderr??t?.stderr,context:{platform:"ios",phase:"boot"}});throw new y("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:rP,elapsedMs:r.elapsedMs(),reason:a,hint:O(a),boot:t,bootstatus:n})}await rW()}async function rZ(e){let t=tr(e,["shutdown",e.id]),n=await H("xcrun",t,{allowFailure:!0,timeoutMs:15e3});return{success:0===n.exitCode,exitCode:n.exitCode,stdout:String(n.stdout??""),stderr:String(n.stderr??"")}}async function rQ(e){let t="string"==typeof e?e:e.id,n="string"==typeof e?tn(["list","devices","-j"]):tr(e,["list","devices","-j"]),r=await H("xcrun",n,{allowFailure:!0,timeoutMs:rT});if(0!==r.exitCode)return null;try{let e=JSON.parse(String(r.stdout??""));for(let n of Object.values(e.devices??{})){let e=n.find(e=>e.udid===t);if(e)return e.state}return null}catch{return null}}async function r0(e,t){try{let n=await H("plutil",["-extract",t,"raw","-o","-",e],{allowFailure:!0});if(0===n.exitCode){let e=String(n.stdout??"").trim();if(e.length>0)return e}}catch{}try{var n,r;let i;return n=await a.readFile(e,"utf8"),r=t,tU(tF(n),(e,t)=>{void 0===i&&e===r&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}async function r1(e,t){if("url"===e.kind&&!ex(e.url))throw new y("INVALID_ARGS","iOS install_from_source URL sources are only supported for trusted artifact services such as GitHub Actions and EAS. Use a path source for other hosts.");let n=await eA({source:e,isInstallablePath:(e,t)=>t.isDirectory()&&e.toLowerCase().endsWith(".app")||t.isFile()&&e.toLowerCase().endsWith(".ipa"),installableLabel:"iOS installable (.app or .ipa)",allowArchiveExtraction:"url"!==e.kind||ex(e.url),signal:t?.signal}),r=await r3(n.installablePath,t),a=await r2(r.installPath);return{archivePath:n.archivePath??(n.installablePath.toLowerCase().endsWith(".ipa")?n.installablePath:void 0),installablePath:r.installPath,bundleId:a.bundleId,appName:a.appName,cleanup:async()=>{await r.cleanup(),await n.cleanup()}}}async function r2(e){let t=s.join(e,"Info.plist"),[n,r,a]=await Promise.all([r0(t,"CFBundleIdentifier"),r0(t,"CFBundleDisplayName"),r0(t,"CFBundleName")]);return{bundleId:n,appName:r??a}}async function r3(e,t){if(!e.toLowerCase().endsWith(".ipa"))return{installPath:e,cleanup:async()=>{}};let n=await a.mkdtemp(s.join(i.tmpdir(),"agent-device-ios-ipa-")),r=async()=>{await a.rm(n,{recursive:!0,force:!0})};try{await H("unzip",["-q",e,"-d",n]);let i=s.join(n,"Payload"),o=(await a.readdir(i,{withFileTypes:!0}).catch(()=>{throw new y("INVALID_ARGS","Invalid IPA: missing Payload directory")})).filter(e=>e.isDirectory()&&e.name.toLowerCase().endsWith(".app")).map(e=>({installPath:s.join(i,e.name),bundleName:e.name.replace(/\.app$/i,"")}));if(1===o.length)return{installPath:o[0].installPath,cleanup:r};if(0===o.length)throw new y("INVALID_ARGS","Invalid IPA: expected at least one .app under Payload, found 0");await r4(o);let l=t?.appIdentifierHint?.trim();if(l){let e=function(e,t){let n=t.toLowerCase(),r=e.filter(e=>e.bundleName.toLowerCase()===n);if(1===r.length)return r[0];if(r.length>1)throw new y("INVALID_ARGS",`Invalid IPA: multiple app bundles matched "${t}" by name. Use a bundle id hint instead.`);if(t.includes(".")){let t=e.filter(e=>e.bundleId?.toLowerCase()===n);if(1===t.length)return t[0]}}(o,l);if(e)return{installPath:e.installPath,cleanup:r};throw new y("INVALID_ARGS",`Invalid IPA: found ${o.length} .app bundles under Payload and none matched "${l}". Available bundles: ${o.map(r5).join(", ")}`)}throw new y("INVALID_ARGS",`Invalid IPA: found ${o.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${o.map(r5).join(", ")}`)}catch(e){throw await r(),e}}async function r4(e){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let t=await r2(e.installPath);e.bundleId=e.bundleId??t.bundleId,e.appName=e.appName??t.appName}))}function r5(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}function r8(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}let r6="agent-device-macos-helper",r9="AGENT_DEVICE_MACOS_HELPER_BIN",r7=s.join(i.homedir(),".agent-device","macos-helper","current"),ae=s.join(r7,"manifest.json"),at=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function an(e){let t=e.trim();if(!at.test(t))throw new y("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function ar(){return function(e){let t=s.dirname(e);for(;;){let e=s.join(t,"macos-helper");if(r(s.join(e,"Package.swift")))return e;let n=s.dirname(t);if(n===t)break;t=n}throw new y("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(u(import.meta.url))}async function aa(e){let t=await a.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=s.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await aa(n):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[n]:[]}))).flat().sort()}async function ai(e){let t=await aa(e),n=f("sha256");for(let r of t)n.update(s.relative(e,r)),n.update("\0"),n.update(await a.readFile(r)),n.update("\0");let r=await H("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return n.update("swift-version"),n.update("\0"),n.update(r.stdout||r.stderr||`exit:${r.exitCode}`),n.update("\0"),n.digest("hex")}async function ao(){try{let e=JSON.parse(await a.readFile(ae,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function as(){let e=await K(process.env[r9],r9);if(e)return e;let t=ar(),n=await ai(t),r=s.join(r7,r6);try{if(await ao()===n)return await a.access(r),r}catch{}let i=s.join(ar(),".build","release",r6);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await H("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await a.mkdir(r7,{recursive:!0});let o=`${r}.tmp`;return await a.copyFile(i,o),await a.rename(o,r),await a.chmod(r,493),await a.writeFile(ae,`${JSON.stringify({fingerprint:n},null,2)}
14
- `,"utf8"),r}async function al(e){let t=process.env[r9]?.trim();if("darwin"!==process.platform&&!t)throw new y("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");let n=await as(),r=await H(n,e,{allowFailure:!0,timeoutMs:3e4}),a=r.stdout.trim(),i=null;if(a)try{i=JSON.parse(a)}catch{i=null}if(0===r.exitCode&&i?.ok)return i.data;throw new y("COMMAND_FAILED",i&&!i.ok?i.error?.message??`macOS helper exited with code ${r.exitCode}`:a||r.stderr.trim()||`macOS helper exited with code ${r.exitCode}`,{helperPath:n,args:e,stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode,...i&&!i.ok?i.error?.details:{}})}async function ad(){return await al(["app","frontmost"])}async function au(e){return await al(["app","quit","--bundle-id",an(e)])}async function ac(e,t){return await al(["permission",e,t])}async function ap(e,t={}){let n=["alert",e];return t.bundleId&&n.push("--bundle-id",an(t.bundleId)),t.surface&&n.push("--surface",t.surface),await al(n)}async function af(e,t={}){let n=["snapshot","--surface",e];return t.bundleId&&n.push("--bundle-id",an(t.bundleId)),await al(n)}async function ah(e,t,n={}){let r=["read","--x",String(e),"--y",String(t)];return n.bundleId&&r.push("--bundle-id",an(n.bundleId)),n.surface&&r.push("--surface",n.surface),await al(r)}async function am(e,t,n={}){let r=["press","--x",String(e),"--y",String(t)];return n.bundleId&&r.push("--bundle-id",an(n.bundleId)),n.surface&&r.push("--surface",n.surface),await al(r)}async function aw(e,t={}){let n=["screenshot","--out",e];return t.surface&&n.push("--surface",t.surface),t.fullscreen&&n.push("--fullscreen"),await al(n)}let ag={settings:"com.apple.systempreferences"},ay=/^[a-z0-9-]+(?:\.[a-z0-9-]+)+$/,ab={platform:"macos",deviceId:"host",variant:"all"},av=U();function aI(e,t){let n=["-b",e];return t&&n.push(t),n}async function aA(e){for(let t of[s.join(e,"Contents","Info.plist"),s.join(e,"Info.plist")]){let[e,n,r]=await Promise.all([r0(t,"CFBundleIdentifier"),r0(t,"CFBundleDisplayName"),r0(t,"CFBundleName")]);if(e||n||r)return{bundleId:e,appName:n??r}}return{}}async function ax(e){let t=e.trim(),n=ag[t.toLowerCase()];if(n)return n;if(ay.test(t))return t;let r=av.get(ab,t);if(r)return r;let a=(await aD("all")).filter(e=>e.name.toLowerCase()===t.toLowerCase());if(1===a.length)return av.set(ab,t,a[0].bundleId);if(a.length>1)throw new y("INVALID_ARGS",`Multiple apps matched "${e}"`,{matches:a});throw new y("APP_NOT_INSTALLED",`No app found matching "${e}"`)}async function aS(e,t,n){let r=n?.url?.trim();if(r){if(!G(r))throw new y("INVALID_ARGS","open <app> <url> requires a valid URL target");let e=n?.appBundleId??await ax(t);await H("open",aI(e,r));return}let a=t.trim();if(G(a))return void await H("open",[a]);let i=n?.appBundleId??await ax(a);await H("open",aI(i))}async function aN(e,t){let n=await ax(t),r=await au(n);if(r.running&&!r.terminated&&!r.forceTerminated)throw new y("COMMAND_FAILED",`Failed to close macOS app ${t}`,{bundleId:n,running:r.running,terminated:r.terminated,forceTerminated:r.forceTerminated})}async function a_(){let e=await H("pbpaste",[],{allowFailure:!0});if(0!==e.exitCode)throw new y("COMMAND_FAILED","Failed to read macOS clipboard",{stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode});return e.stdout.replace(/\r\n/g,"\n").replace(/\n$/,"")}async function ak(e){let t=await H("pbcopy",[],{allowFailure:!0,stdin:e});if(0!==t.exitCode)throw new y("COMMAND_FAILED","Failed to write macOS clipboard",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode})}async function aM(){let e=await H("osascript",["-e",'tell application "System Events" to tell appearance preferences to get dark mode'],{allowFailure:!0});if(0!==e.exitCode)throw new y("COMMAND_FAILED","Failed to read macOS appearance",{stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode});let t=e.stdout.trim().toLowerCase();if("true"===t)return!0;if("false"===t)return!1;throw new y("COMMAND_FAILED",`Unable to determine current macOS appearance from osascript output: ${e.stdout.trim()}`)}async function aE(e){let t=rb(e),n="toggle"===t?!await aM():"dark"===t,r=`tell application "System Events" to tell appearance preferences to set dark mode to ${n?"true":"false"}`,a=await H("osascript",["-e",r],{allowFailure:!0});if(0!==a.exitCode)throw new y("COMMAND_FAILED","Failed to set macOS appearance",{stdout:a.stdout,stderr:a.stderr,exitCode:a.exitCode})}async function aD(e="all"){let t=["/Applications","/System/Applications",s.join(i.homedir(),"Applications")],n=new Set;for(let e of t){let t=await a.stat(e).catch(()=>null);if(!t?.isDirectory())continue;let r=await H("find",[e,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===r.exitCode)for(let e of r.stdout.split("\n")){let t=e.trim();t&&n.add(t)}}return r8((await Promise.all(Array.from(n).map(async e=>{let t=await aA(e).catch(()=>({})),n=t.bundleId;return n?{bundleId:n,name:t.appName??s.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),e)}let aO=["--time","9:41","--dataNetwork","wifi","--wifiMode","active","--wifiBars","3","--batteryState","charged","--batteryLevel","100"],aC={0:"hide",1:"wifi",6:"3g",7:"4g",8:"lte",9:"lte-a",10:"lte+",11:"5g",12:"5g+",13:"5g-uwb",14:"5g-uc"},aR={1:"searching",2:"failed",3:"active"},aP={0:"notSupported",1:"searching",2:"failed",3:"active"};function aT(e,t,n){return H("xcrun",tr(e,t),n)}async function aL(e,t){var n,r;let a;await aF(e),t&&await aU(e,(a=[],(n=t).dataNetwork&&a.push("--dataNetwork",n.dataNetwork),n.wifiMode&&a.push("--wifiMode",n.wifiMode),void 0!==n.wifiBars&&("wifi"===n.dataNetwork||n.wifiMode)&&a.push("--wifiBars",n.wifiBars),n.cellularMode&&a.push("--cellularMode",n.cellularMode),void 0!==n.cellularBars&&(n.cellularMode||(r=n.dataNetwork)&&"hide"!==r&&"wifi"!==r||void 0!==n.operatorName)&&a.push("--cellularBars",n.cellularBars),void 0!==n.operatorName&&a.push("--operatorName",n.operatorName),a))}async function a$(e){let t=await aT(e,["status_bar",e.id,"list"],{allowFailure:!0});if(0!==t.exitCode)throw new y("COMMAND_FAILED","Failed to read simulator status bar overrides",{exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr});return function(e){let t={};for(let n of e.split("\n").map(e=>e.trim()).filter(e=>e.length>0&&"Current Status Bar Overrides:"!==e&&!/^=+$/.test(e))){let e=/^DataNetworkType:\s+(\d+)$/.exec(n);if(e){let n=Number(e[1]),r=aC[n];if(!r)throw new y("COMMAND_FAILED",`Unsupported simulator data network type: ${n}`);t.dataNetwork=r;continue}let r=/^WiFi Mode:\s+(\d+),\s+WiFi Bars:\s+(\d+)$/.exec(n);if(r){let e=aR[Number(r[1])];e&&(t.wifiMode=e),t.wifiBars=r[2];continue}let a=/^Cell Mode:\s+(\d+),\s+Cell Bars:\s+(\d+)$/.exec(n);if(a){let e=Number(a[1]),n=aP[e];if(!n)throw new y("COMMAND_FAILED",`Unsupported simulator cellular mode: ${e}`);t.cellularMode=n,t.cellularBars=a[2];continue}let i=/^Operator Name:\s*(.*)$/.exec(n);if(i){t.operatorName=i[1]??"";continue}}return 0===Object.keys(t).length?null:t}(t.stdout)}async function aF(e){await aT(e,["status_bar",e.id,"clear"])}async function aU(e,t){0!==t.length&&await aT(e,["status_bar",e.id,"override",...t])}function aG(e,t,n){er({level:"warn",phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...function(e){if(!(e instanceof y))return{reason:e instanceof Error?e.message:String(e)};let t=e.details??{},n=Array.isArray(t.args)?t.args.filter(e=>"string"==typeof e).join(" "):void 0;return{errorCode:e.code,reason:e.message,timeoutMs:"number"==typeof t.timeoutMs?t.timeoutMs:void 0,exitCode:"number"==typeof t.exitCode?t.exitCode:void 0,stderr:"string"==typeof t.stderr&&t.stderr.trim()?t.stderr:void 0,stdout:"string"==typeof t.stdout&&t.stdout.trim()?t.stdout:void 0,commandArgs:n}}(n)}})}function aV(e,t,n){return H("xcrun",tr(e,t),n)}let aB={ensureBooted:rJ,prepareStatusBarForScreenshot:async function e(e){let t=null,n=!1;try{t=await a$(e),n=!0}catch(t){aG(e,"snapshot_failed",t)}try{await aF(e),await aU(e,aO)}catch(t){aG(e,"prepare_failed",t)}return async()=>{await aL(e,n?t:null)}},captureWithRetry:aX,runnerFallbackEnabled:rV,captureWithRunner:aH,shouldFallbackToRunner:aQ};async function aj(e,t,n,r){if("macos"===e.platform)return void await aH(e,t,n,r);if("simulator"===e.kind)return void await aq(e,t,n,r);try{await rB(["device","screenshot","--device",e.id,t],{action:"capture iOS screenshot",deviceId:e.id});return}catch(t){if(!function(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details??{},n="string"==typeof t.stdout?t.stdout:"",r="string"==typeof t.stderr?t.stderr:"",a=`${e.message}
15
- ${n}
16
- ${r}`.toLowerCase();return a.includes("unknown option '--device'")||a.includes("unknown subcommand")&&a.includes("screenshot")||a.includes("unrecognized subcommand")&&a.includes("screenshot")}(t))throw t;aW(e,"devicectl_screenshot",t)}await aH(e,t,n,r)}async function aq(e,t,n,r,a=aB){if("simulator"!==e.kind)throw new y("UNSUPPORTED_OPERATION","Simulator screenshot fallback flow supports only iOS simulators");let i="object"==typeof r&&null!==r?r:a;await i.ensureBooted(e);let o=async()=>{};try{o=await i.prepareStatusBarForScreenshot(e)}catch(t){aJ(e,"prepare_failed",t)}try{try{await i.captureWithRetry(e,t);return}catch(t){if(!i.shouldFallbackToRunner(t))throw t;if(!i.runnerFallbackEnabled){var s,l,d;let n,r;throw s=e,l=t,n=aZ(l),er({level:"warn",phase:"ios_screenshot_fallback_skipped",data:{platform:s.platform,deviceKind:s.kind,deviceId:s.id,from:"simctl_screenshot",to:"runner",reason:"Simulator runner fallback is disabled to avoid XCTest automation instability during screenshot capture.",...n}}),r=(d=t)instanceof y?d:new y("COMMAND_FAILED","Failed to capture iOS screenshot: simulator screenshot retries exhausted",void 0,d),new y(r.code,r.message,{...r.details??{},hint:"Restart the simulator and retry. If simctl screenshots keep timing out and you accept the stability tradeoff, set AGENT_DEVICE_IOS_SIMULATOR_SCREENSHOT_RUNNER_FALLBACK=1 to allow XCTest runner fallback."},r)}aW(e,"simctl_screenshot",t)}await i.captureWithRunner(e,t,n,"boolean"==typeof r?r:void 0)}finally{await o().catch(t=>aJ(e,"restore_failed",t))}}async function aX(e,t){let n=S.fromTimeoutMs(rU);await $(async({deadline:n})=>{await aV(e,["io",e.id,"screenshot",t],{timeoutMs:Math.max(1e3,n?.remainingMs()??rU)})},{maxAttempts:5,baseDelayMs:1e3,maxDelayMs:5e3,jitter:.2,shouldRetry:e=>aQ(e)},{deadline:n,phase:"ios_simulator_screenshot"})}async function aH(e,t,n,r){let i=(await nA(e,{command:"screenshot",appBundleId:n,fullscreen:r})).message;if(!i)throw new y("COMMAND_FAILED","Failed to capture iOS screenshot: runner returned no file path");"macos"===e.platform?await a.copyFile(i,t):"simulator"===e.kind?await az(e,i,t):await aK(e,i,t)}async function aK(e,t,n){let r=S.fromTimeoutMs(rG),a={exitCode:1,stdout:"",stderr:""};for(let i of tJ)if(0===(a=await H("xcrun",["devicectl","device","copy","from","--device",e.id,"--source",t,"--destination",n,"--domain-type","appDataContainer","--domain-identifier",i],{allowFailure:!0,timeoutMs:aY(r,rG,"runner screenshot copy")})).exitCode)return;let i=a.stderr.trim()||a.stdout.trim()||`devicectl exited with code ${a.exitCode}`;throw new y("COMMAND_FAILED",`Failed to capture iOS screenshot: ${i}`)}async function az(e,t,n){let r=S.fromTimeoutMs(rG),i="Unable to locate runner container for simulator screenshot";for(let o of tJ){let l=await aV(e,["get_app_container",e.id,o,"data"],{allowFailure:!0,timeoutMs:aY(r,rG,"runner screenshot container lookup")});if(0!==l.exitCode){let e=l.stderr.trim();e&&(i=e);continue}let d=l.stdout.trim();if(!d){i="simctl get_app_container returned empty output";continue}for(let e of function(e,t){let n=s.resolve(e),r=t.trim();if(!r)return[];let a=[],i=new Set,o=e=>{let t=s.normalize(e);i.has(t)||(i.add(t),a.push(t))},l=r.replace(/^\/+/,""),d=l.replace(/\\/g,"/");if(l&&o(s.join(n,l)),s.isAbsolute(r)&&o(s.normalize(r)),d.startsWith("tmp/"))o(s.join(n,d));else{let e=d.lastIndexOf("/tmp/");if(e>=0){let t=d.slice(e+1);o(s.join(n,t))}}let u=s.basename(r);return u&&o(s.join(n,"tmp",u)),a}(d,t))try{await a.copyFile(e,n);return}catch(e){i=e instanceof Error?e.message:String(e)}}throw new y("COMMAND_FAILED",`Failed to capture iOS screenshot: ${i}`)}function aY(e,t,n){let r=e.remainingMs();if(r>0)return r;throw new y("COMMAND_FAILED",`iOS ${n} timed out after ${t}ms`,{timeoutMs:t,step:n})}function aW(e,t,n){let r=aZ(n);er({level:"warn",phase:"ios_screenshot_fallback",data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:t,to:"runner",...r}})}function aJ(e,t,n){er({level:"warn",phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...aZ(n)}})}function aZ(e){if(!(e instanceof y))return{reason:e instanceof Error?e.message:String(e)};let t=e.details??{},n=Array.isArray(t.args)?t.args.filter(e=>"string"==typeof e).join(" "):void 0;return{errorCode:e.code,reason:e.message,timeoutMs:"number"==typeof t.timeoutMs?t.timeoutMs:void 0,exitCode:"number"==typeof t.exitCode?t.exitCode:void 0,stderr:"string"==typeof t.stderr&&t.stderr.trim()?t.stderr:void 0,stdout:"string"==typeof t.stdout&&t.stdout.trim()?t.stdout:void 0,commandArgs:n}}function aQ(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details??{},n="string"==typeof t.stdout?t.stdout:"",r="string"==typeof t.stderr?t.stderr:"",a=Array.isArray(t.args)?t.args.filter(e=>"string"==typeof e).join(" "):"",i=`${e.message}
17
- ${n}
18
- ${r}
19
- ${a}`.toLowerCase();return i.includes("timeout waiting for screen surfaces")||i.includes("nsposixerrordomain")&&i.includes("code=60")&&i.includes("screenshot")||i.includes("timed out")&&i.includes("screenshot")}let a0={settings:"com.apple.Preferences"},a1=U(),a2=null;function a3(e){return{platform:"ios",deviceId:e.id,variant:e.kind}}function a4(e,t,n){return H("xcrun",tr(e,t),n)}function a5(e){return e.includes("not installed")||e.includes("not found")||e.includes("no such file")}async function a8(e,t){if("macos"===e.platform)return await ax(t);let n=t.trim();if(n.includes("."))return n;let r=a0[n.toLowerCase()];if(r)return r;let a=a3(e),i=a1.get(a,n);if(i)return i;let o=("simulator"===e.kind?await iu(e):await rj(e,"all")).filter(e=>e.name.toLowerCase()===n.toLowerCase());if(1===o.length)return a1.set(a,n,o[0].bundleId);if(o.length>1)throw new y("INVALID_ARGS",`Multiple apps matched "${t}"`,{matches:o});throw new y("APP_NOT_INSTALLED",`No app found matching "${t}"`)}async function a6(e,t,n){if("macos"===e.platform)return void await aS(e,t,n);let r=n?.url?.trim();if(r){if(!G(r))throw new y("INVALID_ARGS","open <app> <url> requires a valid URL target");if("simulator"===e.kind){await rJ(e),await a4(e,["openurl",e.id,r]);return}let a=A(n?.appBundleId??await a8(e,t),r);if(!a)throw new y("INVALID_ARGS","Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.");await ib(e,a,{payloadUrl:r});return}let a=t.trim();if(G(a)){if("simulator"===e.kind){await rJ(e),await a4(e,["openurl",e.id,a]);return}let t=A(n?.appBundleId,a);if(!t)throw new y("INVALID_ARGS","Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.");await ib(e,t,{payloadUrl:a});return}let i=n?.appBundleId??await a8(e,t);"simulator"===e.kind?await iy(e,i):await ib(e,i)}async function a9(e){"macos"===e.platform||"simulator"!==e.kind||"Booted"!==await rQ(e)&&await rJ(e)}async function a7(e,t){if("macos"===e.platform)return void await aN(e,t);let n=await a8(e,t);if("simulator"===e.kind){await rJ(e);let t=tr(e,["terminate",e.id,n]),r=await H("xcrun",t,{allowFailure:!0});if(0!==r.exitCode){if(r.stderr.toLowerCase().includes("found nothing to terminate"))return;throw new y("COMMAND_FAILED",`xcrun exited with code ${r.exitCode}`,{cmd:"xcrun",args:t,stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode})}return}await rB(["device","process","terminate","--device",e.id,n],{action:"terminate iOS app",deviceId:e.id})}async function ie(e,t){return await a1.invalidateWhile(a3(e),async()=>{let n=await a8(e,t);if("simulator"!==e.kind){let t=["devicectl","device","uninstall","app","--device",e.id,n],r=await H("xcrun",t,{allowFailure:!0,timeoutMs:r$});if(0!==r.exitCode){let a=String(r.stdout??""),i=String(r.stderr??"");if(!a5(`${a}
20
- ${i}`.toLowerCase()))throw new y("COMMAND_FAILED",`Failed to uninstall iOS app ${n}`,{cmd:"xcrun",args:t,exitCode:r.exitCode,stdout:a,stderr:i,deviceId:e.id,hint:rH(a,i)??rX})}return{bundleId:n}}await rJ(e);let r=await a4(e,["uninstall",e.id,n],{allowFailure:!0});if(0!==r.exitCode&&!a5(`${r.stdout}
21
- ${r.stderr}`.toLowerCase()))throw new y("COMMAND_FAILED",`simctl uninstall failed for ${n}`,{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});return{bundleId:n}})}async function it(e,t,n){let r=await r1({kind:"path",path:t},n);try{return await ia(e,r.installablePath),{archivePath:r.archivePath,installablePath:r.installablePath,bundleId:r.bundleId,appName:r.appName,launchTarget:r.bundleId}}finally{await r.cleanup()}}async function ir(e,t,n){return await a1.invalidateWhile(a3(e),async()=>{let{bundleId:r}=await ie(e,t);return await it(e,n,{appIdentifierHint:t}),{bundleId:r}})}async function ia(e,t){await a1.invalidateWhile(a3(e),async()=>{"simulator"!==e.kind?await rB(["device","install","app","--device",e.id,t],{action:"install iOS app",deviceId:e.id}):(await rJ(e),await a4(e,["install",e.id,t]))})}async function ii(e){if("macos"===e.platform)return await a_();rY(e,"clipboard"),await rJ(e);let t=await a4(e,["pbpaste",e.id],{allowFailure:!0});if(0!==t.exitCode)throw new y("COMMAND_FAILED","Failed to read iOS simulator clipboard",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});return t.stdout.replace(/\r\n/g,"\n").replace(/\n$/,"")}async function io(e,t){if("macos"===e.platform)return void await ak(t);rY(e,"clipboard"),await rJ(e);let n=await a4(e,["pbcopy",e.id],{allowFailure:!0,stdin:t});if(0!==n.exitCode)throw new y("COMMAND_FAILED","Failed to write iOS simulator clipboard",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})}async function is(e,t,n){rY(e,"push"),await rJ(e);let r=await a.mkdtemp(s.join(i.tmpdir(),"agent-device-ios-push-")),o=s.join(r,"payload.apns");try{await a.writeFile(o,`${JSON.stringify(n)}
22
- `,"utf8"),await a4(e,["push",e.id,t,o])}finally{await a.rm(r,{recursive:!0,force:!0})}}async function il(e,t,n,r,a){if("macos"===e.platform){let e=t.toLowerCase();if("appearance"===e)return void await aE(n);if("permission"===e){let e=rg(n);if("deny"===e)throw new y("INVALID_ARGS",eN("permission"));let t=function(e){let t=e?.trim().toLowerCase();if("accessibility"===t||"screen-recording"===t||"input-monitoring"===t)return t;throw new y("INVALID_ARGS","Unsupported macOS permission target. Use accessibility|screen-recording|input-monitoring.")}(a?.permissionTarget);return await ac(e,t)}throw new y("INVALID_ARGS",eN(t))}rY(e,"settings"),await rJ(e);let i=t.toLowerCase();switch(i){case"wifi":{let t=rv(n);await a4(e,["status_bar",e.id,"override","--wifiMode",t?"active":"failed"]);return}case"airplane":return void(rv(n)?await a4(e,["status_bar",e.id,"override","--dataNetwork","hide","--wifiMode","failed","--wifiBars","0","--cellularMode","failed","--cellularBars","0","--operatorName",""]):await a4(e,["status_bar",e.id,"clear"]));case"location":{if("set"===n.toLowerCase()){let{latitude:t,longitude:n}=rh(a);return await a4(e,["location",e.id,"set",`${t},${n}`]),{latitude:t,longitude:n}}let t=rv(n);if(!r)throw new y("INVALID_ARGS","location setting requires an active app in session");await a4(e,["privacy",e.id,t?"grant":"revoke","location",r]);return}case"faceid":case"touchid":{let t=ip[i],r=function(e,t){let n=e.trim().toLowerCase();if("match"===n)return"match";if("nonmatch"===n)return"nonmatch";if("enroll"===n)return"enroll";if("unenroll"===n)return"unenroll";throw new y("INVALID_ARGS",`Invalid ${t} state: ${e}. Use match|nonmatch|enroll|unenroll.`)}(n,i);await ig(e,r,{settingName:i,label:t.label,modalityAliases:t.modalityAliases});return}case"appearance":{let t=await ic(e,n);await a4(e,["ui",e.id,"appearance",t]);return}case"permission":{var o;if(!r)throw new y("INVALID_ARGS","permission setting requires an active app in session");let t="deny"===(o=rg(n))?"revoke":o,i=function(e,t){let n=ry(e);if("photos"!==n&&t?.trim())throw new y("INVALID_ARGS",`Permission mode is only supported for photos. Received: ${t}.`);if("camera"===n)return"camera";if("microphone"===n)return"microphone";if("contacts"===n)return"contacts";if("contacts-limited"===n)return"contacts-limited";if("notifications"===n)return"notifications";if("calendar"===n)return"calendar";if("location"===n)return"location";if("location-always"===n)return"location-always";if("media-library"===n)return"media-library";if("motion"===n)return"motion";if("reminders"===n)return"reminders";if("siri"===n)return"siri";if("photos"===n){let e=t?.trim().toLowerCase();if(!e||"full"===e)return"photos";if("limited"===e)return"photos-add";throw new y("INVALID_ARGS",`Invalid photos mode: ${t}. Use full|limited.`)}throw new y("INVALID_ARGS",`Unsupported permission target: ${e}. Use camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri.`)}(a?.permissionTarget,a?.permissionMode);await ih(e,t,i,r);return}default:throw new y("INVALID_ARGS",`Unsupported setting: ${t}`)}}async function id(e,t="all"){return"macos"===e.platform?await aD(t):"simulator"===e.kind?r8(await iu(e),t):await rj(e,t)}async function iu(e){let t=(await a4(e,["listapps",e.id],{allowFailure:!0})).stdout.trim();if(!t)return[];let n=null;if(t.startsWith("{"))try{n=JSON.parse(t)}catch{n=null}if(!n&&t.startsWith("{"))try{let e=await H("plutil",["-convert","json","-o","-","-"],{allowFailure:!0,stdin:t});0===e.exitCode&&e.stdout.trim().startsWith("{")&&(n=JSON.parse(e.stdout))}catch{n=null}return n?Object.entries(n).map(([e,t])=>({bundleId:e,name:t.CFBundleDisplayName??t.CFBundleName??e})):[]}async function ic(e,t){let n=rb(t);if("toggle"!==n)return n;let r=await a4(e,["ui",e.id,"appearance"],{allowFailure:!0});if(0!==r.exitCode)throw new y("COMMAND_FAILED","Failed to read current iOS appearance",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let a=function(e,t){let n=/\b(light|dark|unsupported|unknown)\b/i.exec(`${e}
23
- ${t}`);if(!n)return null;let r=n[1].toLowerCase();return"dark"===r?"dark":"light"===r?"light":null}(r.stdout,r.stderr);if(!a)throw new y("COMMAND_FAILED","Unable to determine current iOS appearance for toggle",{stdout:r.stdout,stderr:r.stderr});return"dark"===a?"light":"dark"}let ip={faceid:{label:"Face ID",modalityAliases:["face"]},touchid:{label:"Touch ID",modalityAliases:["finger","touch"]}};async function ih(e,t,n,r){let a=await iw(e);if(!a.has(n))throw new y("UNSUPPORTED_OPERATION",`iOS simctl privacy does not support service "${n}" on this runtime.`,{deviceId:e.id,appBundleId:r,hint:`Supported services: ${Array.from(a).sort().join(", ")}`});let i=["privacy",e.id,t,n,r],o="notifications"===n;if(!("reset"===t&&o))try{await a4(e,i);return}catch(t){if(!(o&&im(t)))throw t;throw new y("UNSUPPORTED_OPERATION","iOS simulator does not support setting notifications permission via simctl privacy on this runtime.",{deviceId:e.id,appBundleId:r,hint:"Use reset notifications for reprompt behavior, or toggle notifications manually in Settings."})}try{await a4(e,i);return}catch(e){if(!im(e))throw e}try{await a4(e,["privacy",e.id,"reset","all",r])}catch(t){throw new y("COMMAND_FAILED","iOS simulator blocked direct notifications reset. Fallback reset-all also failed.",{deviceId:e.id,appBundleId:r,hint:"Use reinstall to force a fresh notifications prompt, or reset simulator content and settings."},t instanceof Error?t:void 0)}}function im(e){if(!(e instanceof y)||"COMMAND_FAILED"!==e.code)return!1;let t=String(e.details?.stderr??"").toLowerCase();return(t.includes("failed to grant access")||t.includes("failed to revoke access")||t.includes("failed to reset access"))&&t.includes("operation not permitted")}async function iw(t){let n=v(t.simulatorSetPath),r=`${process.env.PATH??""}::${n??""}`;if(a2&&e===r)return a2;let a=await a4(t,["privacy","help"],{allowFailure:!0}),i=function(e){let t=new Set,n=!1;for(let r of e.split("\n")){let e=r.trim();if(!e)continue;if("service"===e){n=!0;continue}if(!n)continue;if(e.startsWith("bundle identifier"))break;let a=/^([a-z-]+)\s+-\s+/.exec(e);a&&t.add(a[1])}return t}(`${a.stdout}
24
- ${a.stderr}`);if(0===i.size)throw new y("COMMAND_FAILED","Unable to determine supported simctl privacy services",{stdout:a.stdout,stderr:a.stderr,exitCode:a.exitCode,hint:"Run `xcrun simctl privacy help` manually to verify available services for this runtime."});return a2=i,e=r,i}async function ig(e,t,n){let r=function(e,t,n){let r=n.length>0?n:["face"];switch(t){case"match":return r.flatMap(t=>[["biometric",e,"match",t],["biometric","match",e,t]]);case"nonmatch":return r.flatMap(t=>[["biometric",e,"nonmatch",t],["biometric",e,"nomatch",t],["biometric","nonmatch",e,t],["biometric","nomatch",e,t]]);case"enroll":return[["biometric",e,"enroll","yes"],["biometric",e,"enroll","1"],["biometric","enroll",e,"yes"],["biometric","enroll",e,"1"]];case"unenroll":return[["biometric",e,"enroll","no"],["biometric",e,"enroll","0"],["biometric","enroll",e,"no"],["biometric","enroll",e,"0"]]}}(e.id,t,n.modalityAliases),a=[];for(let t of r){let n=tr(e,t),r=await H("xcrun",n,{allowFailure:!0});if(0===r.exitCode)return;a.push({args:n,stderr:r.stderr,stdout:r.stdout,exitCode:r.exitCode})}let i=a.map(e=>({args:e.args.join(" "),exitCode:e.exitCode,stderr:e.stderr.slice(0,400)}));if(a.length>0&&a.every(e=>{var t,n;let r;return t=e.stdout,n=e.stderr,(r=`${t}
25
- ${n}`.toLowerCase()).includes("unrecognized subcommand")||r.includes("unknown subcommand")||r.includes("not supported")||r.includes("unavailable")||r.includes("biometric")&&r.includes("invalid")}))throw new y("UNSUPPORTED_OPERATION",`${n.label} simulation is not supported on this simulator runtime.`,{deviceId:e.id,action:t,setting:n.settingName,attempts:i});throw new y("COMMAND_FAILED",`Failed to simulate ${n.settingName}.`,{deviceId:e.id,action:t,setting:n.settingName,attempts:i})}async function iy(e,t){await rJ(e);let n=0,r=S.fromTimeoutMs(rL);try{await $(async({deadline:n})=>{var r;if(n?.isExpired())throw new y("COMMAND_FAILED","App launch deadline exceeded",{timeoutMs:rL});let a=(r=["launch",e.id,t],tr(e,r)),i=await H("xcrun",a,{allowFailure:!0});if(0!==i.exitCode)throw new y("COMMAND_FAILED",`xcrun exited with code ${i.exitCode}`,{cmd:"xcrun",args:a,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode})},{maxAttempts:10,baseDelayMs:1e3,maxDelayMs:5e3,jitter:.2,shouldRetry:e=>!!rK(e)&&(n+=1)<3},{deadline:r})}catch(n){if(rK(n)){var a;let r=(a=await rz(e,t)).installed?!1===a.simulatorCompatible?"ARCH_MISMATCH":"PERSISTENT_LAUNCH_FAIL":"APP_NOT_INSTALLED";n.details={...n.details,hint:function(e){switch(e){case"ARCH_MISMATCH":return"The app binary was not built for the simulator platform. Rebuild with a simulator destination or use a physical device.";case"APP_NOT_INSTALLED":return"The app bundle is not installed on this simulator. Run install before open.";case"PERSISTENT_LAUNCH_FAIL":return"The simulator repeatedly refused to launch the app. Inspect crash logs in Console.app or ~/Library/Logs/DiagnosticReports/ and consider reinstalling the app.";default:return"The simulator failed to launch the app. Retry with --debug and inspect diagnostics log for details."}}(r)}}throw n}}async function ib(e,t,n){let r=["device","process","launch","--device",e.id,t];n?.payloadUrl&&r.push("--payload-url",n.payloadUrl),await rB(r,{action:"launch iOS app",deviceId:e.id})}function iv(e,t,n){return{command:"remotePress",remoteButton:e,...void 0!==n?{durationMs:n}:{},...void 0!==t?{appBundleId:t}:{}}}async function iI(e,t,n,r,a,i,o){if("tv"===t.target)return iS(await e(t,iv(a,n.appBundleId),r),i);let s=o??await iA(e,t,n,r),l=nS({direction:a,amount:i?.amount,pixels:i?.pixels,referenceWidth:s.referenceWidth,referenceHeight:s.referenceHeight});return iS(await e(t,{command:"drag",x:s.originX+l.x1,y:s.originY+l.y1,x2:s.originX+l.x2,y2:s.originY+l.y2,appBundleId:n.appBundleId},r),{amount:l.amount,pixels:l.pixels,preferProvidedPixels:!0})}async function iA(e,t,n,r){let a=await e(t,{command:"interactionFrame",appBundleId:n.appBundleId},r),i=ix(a.x),o=ix(a.y),s=ix(a.referenceWidth),l=ix(a.referenceHeight);if(void 0===i||void 0===o||void 0===s||void 0===l)throw new y("COMMAND_FAILED","interactionFrame did not return a usable frame");return{originX:i,originY:o,referenceWidth:s,referenceHeight:l}}function ix(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function iS(e,t){var n;let{x1:r,y1:a,x2:i,y2:o}={x1:ix((n=e).x),y1:ix(n.y),x2:ix(n.x2),y2:ix(n.y2)},s=ix(e.referenceWidth),l=ix(e.referenceHeight),d=void 0!==r&&void 0!==i?Math.round(Math.abs(i-r)):void 0,u=void 0!==a&&void 0!==o?Math.round(Math.abs(o-a)):void 0,c=t?.preferProvidedPixels&&void 0!==t.pixels?t.pixels:d&&d>0?d:u&&u>0?u:void 0;return{...void 0!==r?{x1:r}:{},...void 0!==a?{y1:a}:{},...void 0!==i?{x2:i}:{},...void 0!==o?{y2:o}:{},...void 0!==s?{referenceWidth:s}:{},...void 0!==l?{referenceHeight:l}:{},...t?.amount!==void 0?{amount:t.amount}:{},...void 0!==c?{pixels:c}:{}}}function iN(){return process.env.WAYLAND_DISPLAY||"wayland"===process.env.XDG_SESSION_TYPE?"wayland":"x11"}let i_=null;async function ik(){if(i_)return i_;let e=iN();if("wayland"===e){if(await z("ydotool"))return i_={tool:"ydotool",display:e};throw new y("TOOL_MISSING","ydotool is required for input synthesis on Wayland (xdotool does not work on Wayland). Install it via your package manager.")}if(await z("xdotool"))return i_={tool:"xdotool",display:e};throw new y("TOOL_MISSING","xdotool is required for input synthesis on X11. Install it via your package manager.")}async function iM(...e){await H("xdotool",e,{allowFailure:!1,timeoutMs:1e4})}async function iE(...e){await H("ydotool",e,{allowFailure:!1,timeoutMs:1e4})}async function iD(e,t){let{tool:n}=await ik();"xdotool"===n?await iM("mousemove","--sync",String(e),String(t)):await iE("mousemove","--absolute","-x",String(e),"-y",String(t))}async function iO(e,t){let{tool:n}=await ik();"xdotool"===n?await iM("key","--clearmodifiers",e):await iE("key",...t)}async function iC(e,t,n,r){await iD(e,t);let{tool:a}=await ik();"xdotool"===a?await iM("click",n):await iE("click",r)}async function iR(e,t){await iC(e,t,"1","0xC0")}async function iP(e,t){await iC(e,t,"3","0xC1")}async function iT(e,t){await iC(e,t,"2","0xC2")}async function iL(e,t){let{tool:n}=await ik();await iD(e,t),"xdotool"===n?await iM("click","--repeat","2","1"):(await iE("click","0xC0"),await iE("click","0xC0"))}async function i$(e,t,n=800){let{tool:r}=await ik();await iD(e,t),"xdotool"===r?(await iM("mousedown","1"),await Y(n),await iM("mouseup","1")):(await iE("click","--down","0xC0"),await Y(n),await iE("click","--up","0xC0"))}async function iF(e,t){await iR(e,t)}async function iU(e,t,n,r,a=300){let{tool:i}=await ik();await iD(e,t),"xdotool"===i?(await iM("mousedown","1"),await iM("mousemove","--sync",String(n),String(r)),await Y(a),await iM("mouseup","1")):(await iE("click","--down","0xC0"),await iE("mousemove","--absolute","-x",String(n),"-y",String(r)),await Y(a),await iE("click","--up","0xC0"))}async function iG(e,t){let{tool:n}=await ik(),r=5;if(t?.pixels!=null?r="xdotool"===n?Math.max(1,Math.round(t.pixels/15)):Math.max(1,Math.round(t.pixels/40)):t?.amount!=null&&(r=Math.max(1,Math.round(5*(t.amount/.6)))),"xdotool"===n)await iM("click","--repeat",String(r),"up"===e?"4":"down"===e?"5":"left"===e?"6":"7");else if("up"===e||"down"===e){let t="up"===e?String(-r):String(r);await iE("mousemove","--wheel","-y",t)}else{let t="left"===e?String(-r):String(r);await iE("mousemove","--wheel","-x",t)}}async function iV(e,t=0){let{tool:n}=await ik();if("xdotool"===n){let n=["type"];t>0&&n.push("--delay",String(t)),n.push("--clearmodifiers","--",e),await iM(...n)}else await iE("type","--",e)}async function iB(e,t,n,r=0){await iR(e,t),await Y(100),await iO("ctrl+a",["29:1","30:1","30:0","29:0"]),await Y(50),await iV(n,r)}function ij(e){let t=null;return{resolve:async function(){if(t)return t;let n="wayland"===iN()?"wayland":"x11";for(let r of"wayland"===n?e.wayland:e.x11)if(await z(r.command))return t={tool:r.tool,display:n};throw new y("TOOL_MISSING","wayland"===n?e.waylandError:e.x11Error)},resetCache:()=>{t=null}}}let iq=ij({wayland:[{tool:"grim",command:"grim"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],x11:[{tool:"scrot",command:"scrot"},{tool:"import",command:"import"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],waylandError:"grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.",x11Error:"scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager."});async function iX(e){let{tool:t}=await iq.resolve();switch(t){case"grim":await H("grim",[e]);break;case"scrot":await H("scrot",[e]);break;case"import":await H("import",["-window","root",e]);break;case"gnome-screenshot":await H("gnome-screenshot",["-f",e])}}async function iH(e){if(e.includes("://")||e.startsWith("/"))return void await H("xdg-open",[e]);if(await z(e)){H(e,[],{allowFailure:!0}).catch(t=>{er({level:"warn",phase:"linux_app_launch",data:{app:e,error:String(t)}})}),await Y(500);return}await H("xdg-open",[e],{allowFailure:!0})}async function iK(e){await z("wmctrl")?await H("wmctrl",["-c",e],{allowFailure:!0}):await H("pkill",["-x",e],{allowFailure:!0})}async function iz(){await iO("alt+Left",["56:1","105:1","105:0","56:0"])}async function iY(){await iO("super+d",["125:1","32:1","32:0","125:0"])}let iW=ij({wayland:[{tool:"wl-clipboard",command:"wl-paste"}],x11:[{tool:"xclip",command:"xclip"},{tool:"xsel",command:"xsel"}],waylandError:"wl-paste (wl-clipboard) is required for clipboard access on Wayland. Install via your package manager.",x11Error:"xclip or xsel is required for clipboard access on X11. Install via your package manager."});async function iJ(){let{tool:e}=await iW.resolve();switch(e){case"wl-clipboard":return(await H("wl-paste",["--no-newline"],{allowFailure:!0,timeoutMs:5e3})).stdout;case"xclip":return(await H("xclip",["-selection","clipboard","-o"],{allowFailure:!0,timeoutMs:5e3})).stdout;case"xsel":return(await H("xsel",["--clipboard","--output"],{allowFailure:!0,timeoutMs:5e3})).stdout}}async function iZ(e){let{tool:t}=await iW.resolve();switch(t){case"wl-clipboard":await H("wl-copy",["--",e],{allowFailure:!1,timeoutMs:5e3});break;case"xclip":await H("xclip",["-selection","clipboard"],{allowFailure:!1,timeoutMs:5e3,stdin:e});break;case"xsel":await H("xsel",["--clipboard","--input"],{allowFailure:!1,timeoutMs:5e3,stdin:e})}}iW.resetCache;let iQ={"push button":"Button","toggle button":"Button","push button menu":"Button",label:"StaticText",static:"StaticText",caption:"StaticText",text:"TextField",entry:"TextField","password text":"TextField","spin button":"TextField",terminal:"TextArea","document text":"TextArea",paragraph:"TextArea",frame:"Window",window:"Window",dialog:"Dialog",alert:"Alert","file chooser":"Dialog","color chooser":"Dialog","font chooser":"Dialog",panel:"Group",filler:"Group",section:"Group",form:"Group",grouping:"Group","layered pane":"Group","glass pane":"Group","root pane":"Group","option pane":"Group","internal frame":"Group","desktop frame":"Group","block quote":"Group",article:"Group",comment:"Group",landmark:"Group",log:"Group",marquee:"Group",math:"Group",notification:"Group","content deletion":"Group","content insertion":"Group",mark:"Group",suggestion:"Group","scroll pane":"ScrollArea","scroll bar":"ScrollBar","menu bar":"MenuBar",menu:"Menu","popup menu":"Menu","menu item":"MenuItem","check menu item":"MenuItem","radio menu item":"MenuItem","tearoff menu item":"MenuItem","check box":"CheckBox","radio button":"RadioButton",switch:"Switch","combo box":"ComboBox","page tab":"Tab","page tab list":"TabList",table:"Table","tree table":"Table","table cell":"Cell","table row":"Row","table column header":"Cell","table row header":"Cell","column header":"Cell","row header":"Cell",list:"List","list item":"ListItem","list box":"List",tree:"Tree","tree item":"TreeItem","description list":"List","description term":"ListItem","description value":"ListItem","tool bar":"Toolbar","status bar":"StatusBar","info bar":"StatusBar",slider:"Slider","progress bar":"ProgressBar","level bar":"ProgressBar",image:"Image",icon:"Image",animation:"Image",canvas:"Image","drawing area":"Image",video:"Video",audio:"Audio",link:"Link",hyperlink:"Link",separator:"Separator",application:"Application","tool tip":"Tooltip",timer:"Timer",heading:"Heading",footnote:"Footnote","title bar":"TitleBar","date editor":"DateEditor",rating:"Slider"},i0="atspi-dump.py",i1=null;async function i2(e,t={}){let r;if("linux"!==process.platform)throw new y("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await z("python3"))throw new y("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let a=t.maxNodes??1500,i=t.maxDepth??12,o=t.maxApps??24,l=[function(){if(i1)return i1;let e=s.dirname(u(import.meta.url));for(let t=0;t<5;t++){let r=s.join(e,"src","platforms","linux",i0);if(n.existsSync(r))return i1=r,r;if(0===t){let t=s.join(e,i0);if(n.existsSync(t))return i1=t,t}e=s.dirname(e)}throw new y("TOOL_MISSING",`Cannot find ${i0}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(a),"--max-depth",String(i),"--max-apps",String(o)],d=await H("python3",l,{allowFailure:!0,timeoutMs:3e4});if(0!==d.exitCode){let e=d.stderr.trim();if(e.includes("No module named")||e.includes("gi.require_version"))throw new y("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new y("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${d.exitCode}): ${e||d.stdout}`)}try{r=JSON.parse(d.stdout)}catch{throw new y("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${d.stdout.slice(0,200)}`)}if(r.error)throw new y("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,n;return{index:e.index,type:(n=iQ[t=e.role.toLowerCase().trim()])||t.split(/[\s_-]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(""),role:e.role,label:e.label??void 0,value:e.value??void 0,rect:e.rect??void 0,enabled:e.enabled??void 0,selected:e.selected??void 0,hittable:e.hittable??void 0,depth:e.depth,parentIndex:e.parentIndex??void 0,pid:e.pid??void 0,appName:e.appName??void 0,windowTitle:e.windowTitle??void 0}}),truncated:r.truncated,surface:e}}async function i3(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&er({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),n=await i2(t);return{nodes:n.nodes,truncated:n.truncated}}function i4(e){return e?.clickButton??"primary"}function i5(e){return"primary"===e.button?null:"click"!==e.commandLabel?new y("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new y("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new y("UNSUPPORTED_OPERATION","click --button middle is not supported by the macOS runner yet"):"number"==typeof e.count||"number"==typeof e.intervalMs||"number"==typeof e.holdMs||"number"==typeof e.jitterPx||!0===e.doubleTap?new y("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function i8(e){return"primary"===e?{}:{button:e}}let i6=/^[A-Za-z0-9_.:-]{1,64}$/;function i9(e,t,n,r){if(!Number.isFinite(e)||!Number.isInteger(e)||e<n||e>r)throw new y("INVALID_ARGS",`${t} must be an integer between ${n} and ${r}`);return e}let i7=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];async function oe(e,t,n){for(let r=0;r<e;r+=1)await n(r),r<e-1&&t>0&&await Y(t)}function ot(e,t){let r,a=t?.subject??"Payload",i=e.trim();if(!i)throw new y("INVALID_ARGS",`${a} cannot be empty`);let o=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!n.statSync(o).isFile())throw new y("INVALID_ARGS",`${a} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof y)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new y("INVALID_ARGS",`${a} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new y("COMMAND_FAILED",`Unable to read ${a} file: ${o}`,{cause:String(t)})}if((r=i.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:i};throw new y("INVALID_ARGS",`${a} file not found: ${o}`)}async function on(e){let t=ot(e,{subject:"Push payload"}),n="inline"===t.kind?t.text:await or(t.path);try{let e=JSON.parse(n);if(!e||"object"!=typeof e||Array.isArray(e))throw new y("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof y)throw t;throw new y("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function or(e){try{return await a.readFile(e,"utf8")}catch(n){let t=n.code;if("ENOENT"===t)throw new y("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new y("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new y("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new y("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(n)})}}function oa(e){if(void 0===e)throw new y("INVALID_ARGS","rotate requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.");switch(e?.trim().toLowerCase()){case"portrait":return"portrait";case"portrait-upside-down":case"upside-down":return"portrait-upside-down";case"landscape-left":case"left":return"landscape-left";case"landscape-right":case"right":return"landscape-right";default:throw new y("INVALID_ARGS",`Invalid rotation: ${e}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}let oi=W(process.env.AGENT_DEVICE_IOS_DEVICECTL_LIST_TIMEOUT_MS,8e3,500),oo=/^(iphone|ipad|ipod|appletv)/i,os=/\b(iphone|ipad|ipod)\b/i,ol=/^appletv/i,od=["apple tv","appletv","tvos"],ou=/^==\s*(.+?)\s*==$/,oc=/^(?<name>.+?)\s+\[(?<id>[^[\]]+)\]\s*$/;function op(e){return(e??"").trim().toLowerCase()}function of(e){return op(e.hardwareProperties?.platform)}function oh(e){return e.includes("tvos")}function om(e){let t=op(e);return od.some(e=>t.includes(e))}function ow(e){return[e.name??"",e.deviceProperties?.name??"",e.deviceProperties?.deviceType??""]}function og(e){return e.hardwareProperties?.productType??e.deviceProperties?.productType??""}async function oy(e={}){let t,n,r=v(e.simulatorSetPath),a=e.target;try{t=await H("xcrun",tn(["list","devices","-j"],{simulatorSetPath:r}))}catch{return null}try{n=JSON.parse(t.stdout)}catch{return null}let i=ob(n,r),o=null,s=null,l=null;for(let e of i)a&&e.target!==a||(e.booted&&(o=o??e),"mobile"===e.target&&(s=s??e),l=l??e);return o??s??l}function ob(e,t){let n=[];for(let[r,a]of Object.entries(e.devices))if(function(e){let t=op(e);return t.includes("ios")||t.includes("tvos")}(r))for(let e of a)e.isAvailable&&n.push({platform:"ios",id:e.udid,name:e.name,kind:"simulator",target:oh(op(r))?"tv":"mobile",booted:"Booted"===e.state,...t?{simulatorSetPath:t}:{}});return n}function ov(e,t){let n=new Set(e.map(e=>e.id)),r=[...e];for(let e of t)n.has(e.id)||(n.add(e.id),r.push(e));return r}async function oI(){let e=null;try{e=s.join(i.tmpdir(),`agent-device-devicectl-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`);let t=await H("xcrun",["devicectl","list","devices","--json-output",e],{allowFailure:!0,timeoutMs:oi});if(0!==t.exitCode)return[];let n=await a.readFile(e,"utf8");return function(e){let t=[];for(let n of e.result?.devices??[]){if(!function(e){var t;let n=of(e);return!!(n.includes("ios")||n.includes("tvos"))||(t=og(e),!!oo.test(t.trim())||ow(e).some(om))}(n))continue;let e=n.hardwareProperties?.udid??n.identifier??"",r=n.name??n.deviceProperties?.name??e;e&&t.push({platform:"ios",id:e,name:r,kind:"device",target:function(e){var t;return oh(of(e))?"tv":(t=og(e),ol.test(t.trim())||ow(e).some(om))?"tv":"mobile"}(n),booted:!0})}return t}(JSON.parse(n))}catch{return[]}finally{e&&await a.rm(e,{force:!0}).catch(()=>{})}}async function oA(){try{let e=await H("xcrun",["xctrace","list","devices"],{allowFailure:!0});if(0!==e.exitCode)return[];return function(e){let t=[],n=null;for(let r of e.split(/\r?\n/)){let e=r.trim();if(!e)continue;let a=ou.exec(e);if(a){n=a[1]?.trim()??null;continue}if("Devices"!==n)continue;let i=oc.exec(e),o=i?.groups?.id?.trim()??"",s=i?.groups?.name?.trim()??"";if(!o||!s)continue;let l=function(e){return om(e)?"tv":os.test(e.trim())?"mobile":null}(s);l&&t.push({platform:"ios",id:o,name:s,kind:"device",target:l,booted:!0})}return t}(e.stdout)}catch{return[]}}async function ox(e={}){if("darwin"!==process.platform)throw new y("UNSUPPORTED_PLATFORM","Apple tools are only available on macOS");if(!await z("xcrun"))throw new y("TOOL_MISSING","xcrun not found in PATH");let t=v(e.simulatorSetPath),n=await H("xcrun",tn(["list","devices","-j"],{simulatorSetPath:t})),r=[];try{let e=JSON.parse(n.stdout);r=ob(e,t)}catch(e){throw new y("COMMAND_FAILED","Failed to parse simctl devices JSON",void 0,e)}if(r.push({platform:"macos",id:"host-macos-local",name:i.hostname(),kind:"device",target:"desktop",booted:!0}),t)return r;let[a,o]=await Promise.all([oI(),oA()]);return r=ov(r,a),ov(r,o)}async function oS(){return"linux"!==process.platform?[]:[{platform:"linux",id:"local",name:o(),kind:"device",target:"desktop",booted:!0}]}let oN=new d,o_=new d;async function ok(e,t,n){let r,a=!!(t.udid||t.serial||t.deviceName);try{r=await tP(e,t,n)}catch(e){if(a||!(e instanceof y)||"DEVICE_NOT_FOUND"!==e.code)throw e}if(!a&&(!t.platform||"apple"===t.platform||"ios"===t.platform)&&"desktop"!==t.target&&(!r||"device"===r.kind)){let e=await oy({simulatorSetPath:n.simulatorSetPath,target:t.target});if(e)return e}if(r)return r;throw new y("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function oM(e){let t=tD(e.platform),n=tR({simulatorSetPath:v(e.iosSimulatorDeviceSet),platform:t,target:e.target}),r=F(e.androidDeviceAllowlist),a=function(e){let{flags:t,normalizedPlatform:n,iosSimulatorSetPath:r,androidSerialAllowlist:a}=e;return JSON.stringify({platform:n,target:t.target,device:t.device,udid:t.udid,serial:t.serial,iosSimulatorSetPath:r,androidSerialAllowlist:a?Array.from(a).sort():void 0})}({flags:e,normalizedPlatform:t,iosSimulatorSetPath:n,androidSerialAllowlist:r}),i={platform:t,target:e.target,cacheHit:!1};return await et("resolve_target_device",async()=>{let o=function(e){let t=oN.getStore(),n=t?.get(e);if(n)return{...n}}(a);if(o)return i.cacheHit=!0,o;let s={platform:t,target:e.target,deviceName:e.device,udid:e.udid,serial:e.serial};if(s.target&&!s.platform)throw new y("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await oC({...s,iosSimulatorSetPath:n,androidSerialAllowlist:r?Array.from(r).sort():void 0});if(l)return oR(a,await tP(l,s,{simulatorSetPath:n}));if("linux"===s.platform){let e=await oS();return oR(a,await tP(e,s))}if("android"===s.platform){await M();let e=await T({serialAllowlist:r});return oR(a,await tP(e,s))}if(s.platform){let e=await ox({simulatorSetPath:n});return oR(a,await ok(e,s,{simulatorSetPath:n}))}let d=[];try{d.push(...await T({serialAllowlist:r}))}catch{}try{d.push(...await ox({simulatorSetPath:n}))}catch{}try{d.push(...await oS())}catch{}return oR(a,await tP(d,s,{simulatorSetPath:n}))},i)}async function oE(e){return oN.getStore()?await e():await oN.run(new Map,e)}async function oD(e,t){return e?await o_.run(e,t):await t()}async function oO(e,t){return await oD(e,async()=>await oE(t))}async function oC(e){let t=o_.getStore();if(!t)return null;let n=await t(e);return null==n?null:n.map(e=>({...e}))}function oR(e,t){return oN.getStore()?.set(e,{...t}),t}async function oP(e,t,n,r,i){let o={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},l=function(e,t){switch(e.platform){case"android":return{open:(t,n)=>_(e,t,n?.activity),openDevice:()=>C(e),close:t=>E(e,t),tap:(t,n)=>n5(e,t,n),doubleTap:async(t,n)=>{await n5(e,t,n),await n5(e,t,n)},swipe:(t,n,r,a,i)=>n8(e,t,n,r,a,i),longPress:(t,n,r)=>rt(e,t,n,r),focus:(t,n)=>ra(e,t,n),type:(t,n)=>rn(e,t,n),fill:(t,n,r,a)=>ri(e,t,n,r,a),scroll:(t,n)=>rs(e,t,n),screenshot:t=>rD(e,t),back:t=>n6(e),home:()=>n9(e),rotate:t=>n7(e,t),appSwitcher:()=>re(e),readClipboard:()=>B(e),writeClipboard:t=>R(e,t),setSetting:(t,n,r,a)=>rA(e,t,n,r,a)};case"linux":return{open:e=>iH(e),openDevice:()=>Promise.resolve(),close:e=>iK(e),tap:(e,t)=>iR(e,t),doubleTap:(e,t)=>iL(e,t),swipe:(e,t,n,r,a)=>iU(e,t,n,r,a),longPress:(e,t,n)=>i$(e,t,n),focus:(e,t)=>iF(e,t),type:(e,t)=>iV(e,t),fill:(e,t,n,r)=>iB(e,t,n,r),scroll:(e,t)=>iG(e,t),screenshot:e=>iX(e),back:()=>iz(),home:()=>iY(),rotate:()=>{throw new y("UNSUPPORTED_OPERATION","rotate not supported on Linux")},appSwitcher:()=>{throw new y("UNSUPPORTED_OPERATION","appSwitcher not yet supported on Linux")},readClipboard:()=>iJ(),writeClipboard:e=>iZ(e),setSetting:()=>{throw new y("UNSUPPORTED_OPERATION","setSetting not supported on Linux")}};case"ios":case"macos":{let n,{overrides:r,runnerOpts:a}={runnerOpts:n={verbose:t.verbose,logPath:t.logPath,traceLogPath:t.traceLogPath,requestId:t.requestId},overrides:{tap:async(r,a)=>await nA(e,{command:"tap",x:r,y:a,appBundleId:t.appBundleId},n),doubleTap:async(r,a)=>await nA(e,{command:"tapSeries",x:r,y:a,count:1,intervalMs:0,doubleTap:!0,appBundleId:t.appBundleId},n),swipe:async(r,a,i,o,s)=>await nA(e,{command:"drag",x:r,y:a,x2:i,y2:o,durationMs:s,appBundleId:t.appBundleId},n),longPress:async(r,a,i)=>await nA(e,{command:"longPress",x:r,y:a,durationMs:i,appBundleId:t.appBundleId},n),focus:async(r,a)=>await nA(e,{command:"tap",x:r,y:a,appBundleId:t.appBundleId},n),type:async(r,a)=>{await nA(e,{command:"type",text:r,delayMs:a,appBundleId:t.appBundleId},n)},fill:async(r,a,i,o)=>{let s=await nA(e,{command:"tap",x:r,y:a,appBundleId:t.appBundleId},n);return await nA(e,{command:"type",text:i,clearFirst:!0,delayMs:o,appBundleId:t.appBundleId},n),s},scroll:async(r,a)=>await iI(nA,e,t,n,r,a)}};return{open:(t,n)=>a6(e,t,{appBundleId:n?.appBundleId,url:n?.url}),openDevice:()=>a9(e),close:t=>a7(e,t),screenshot:async(t,n)=>{"macos"===e.platform&&n?.surface&&"app"!==n.surface?await aw(t,{surface:n.surface,fullscreen:n.fullscreen}):await aj(e,t,n?.appBundleId,n?.fullscreen)},back:async n=>{"tv"===e.target?await nA(e,iv("menu",t.appBundleId),a):await nA(e,{command:"system"===n?"backSystem":"backInApp",appBundleId:t.appBundleId},a)},home:async()=>{"tv"===e.target?await nA(e,iv("home",t.appBundleId),a):await nA(e,{command:"home",appBundleId:t.appBundleId},a)},rotate:async n=>{await nA(e,{command:"rotate",orientation:n,appBundleId:t.appBundleId},a)},appSwitcher:async()=>{await nA(e,{command:"appSwitcher",appBundleId:t.appBundleId},a)},readClipboard:()=>ii(e),writeClipboard:t=>io(e,t),setSetting:(t,n,r,a)=>il(e,t,n,r,a),...r}}default:throw new y("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}(e,o);return er({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await et("platform_command",async()=>{switch(t){case"open":return oT(e,l,n,i);case"close":{let e=n[0];if(!e)return{closed:"session",...eM("Closed session")};return await l.close(e),{app:e,...eM(`Closed: ${e}`)}}case"press":return oL(e,l,n,i,o);case"swipe":return o$(e,l,n,i,o);case"longpress":{let e=Number(n[0]),t=Number(n[1]),r=n[2]?Number(n[2]):void 0;if(Number.isNaN(e)||Number.isNaN(t))throw new y("INVALID_ARGS","longpress requires x y [durationMs]");return await l.longPress(e,t,r),{x:e,y:t,durationMs:r,...eM(`Long pressed (${e}, ${t})`)}}case"focus":{let[e,t]=n.map(Number);if(Number.isNaN(e)||Number.isNaN(t))throw new y("INVALID_ARGS","focus requires x y");return await l.focus(e,t),{x:e,y:t,...eM(`Focused (${e}, ${t})`)}}case"type":{let e=function(e){let t=e[0]?.trim();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}(n);if(e)throw new y("INVALID_ARGS",`type does not accept a target ref like "${e}"`,{hint:`Use fill ${e} "text" to target that field, or press ${e} then type "text" to append.`});let t=n.join(" ");if(!t)throw new y("INVALID_ARGS","type requires text");let r=i9(i?.delayMs??0,"delay-ms",0,1e4);return await l.type(t,r),{text:t,delayMs:r,...eM(oz("Typed",t))}}case"fill":{let e=Number(n[0]),t=Number(n[1]),r=n.slice(2).join(" ");if(Number.isNaN(e)||Number.isNaN(t)||!r)throw new y("INVALID_ARGS","fill requires x y text");let a=i9(i?.delayMs??0,"delay-ms",0,1e4);return await l.fill(e,t,r,a),{x:e,y:t,text:r,delayMs:a,...eM(oz("Filled",r))}}case"scroll":return oF(l,n,i);case"pinch":return oU(e,n,i,o);case"trigger-app-event":{let{eventName:t,payload:r}=function(e){let t=e[0]?.trim(),n=e[1]?.trim();if(!t)throw new y("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!i6.test(t))throw new y("INVALID_ARGS",`Invalid trigger-app-event event name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});if(e.length>2)throw new y("INVALID_ARGS","trigger-app-event accepts at most two arguments: <event> [payloadJson]");let r=function(e,t){if(e)try{let n=JSON.parse(e);if(!n||"object"!=typeof n||Array.isArray(n))throw new y("INVALID_ARGS",`trigger-app-event payload for "${t}" must be a JSON object`);let r=JSON.stringify(n);if(Buffer.byteLength(r,"utf8")>8192)throw new y("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return n}catch(t){if(t instanceof y)throw t;throw new y("INVALID_ARGS",`Invalid trigger-app-event payload JSON: ${e}`)}}(n,t);return{eventName:t,payload:r}}(n),a=function(e,t,n){var r;let a,i=(a=("ios"===(r=e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:"macos"===r?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE,a?.trim()||void 0);if(!i)throw new y("UNSUPPORTED_OPERATION",`No app event URL template configured for ${e}.`,{hint:`Set AGENT_DEVICE_${e.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=n?JSON.stringify(n):"",s=i.replaceAll("{event}",encodeURIComponent(t)).replaceAll("{payload}",encodeURIComponent(o)).replaceAll("{platform}",encodeURIComponent(e));if(s.length>4096)throw new y("INVALID_ARGS","trigger-app-event URL exceeds maximum supported length",{hint:"Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.",length:s.length,maxLength:4096});return s}(e.platform,t,r);return await l.open(a,{appBundleId:i?.appBundleId}),{event:t,eventUrl:a,transport:"deep-link",...eM(`Triggered app event: ${t}`)}}case"screenshot":{let e=n[0]??r??`./screenshot-${Date.now()}.png`;return await a.mkdir(s.dirname(e),{recursive:!0}),await l.screenshot(e,{appBundleId:i?.appBundleId,fullscreen:i?.screenshotFullscreen,surface:i?.surface}),{path:e,...eM(`Saved screenshot: ${e}`)}}case"back":return await l.back(i?.backMode),{action:"back",mode:i?.backMode??"in-app",...eM("Back")};case"home":return await l.home(),{action:"home",...eM("Home")};case"rotate":{let e=oa(n[0]);return await l.rotate(e),{action:"rotate",orientation:e,...eM(`Rotated to ${e}`)}}case"app-switcher":return await l.appSwitcher(),{action:"app-switcher",...eM("Opened app switcher")};case"clipboard":return oG(l,n);case"keyboard":return oV(e,l,n,i,o);case"settings":return oB(e,l,n,i);case"push":return oj(e,n,i);case"snapshot":return oq(e,n,i,o);case"read":return oX(e,n,i,o);default:throw new y("INVALID_ARGS",`Unknown command: ${t}`)}},{command:t,platform:e.platform})}async function oT(e,t,n,r){let a=n[0],i=n[1];if(n.length>2)throw new y("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!a)return await t.openDevice(),{app:null,...eM("Opened device")};if(void 0!==i){if("android"===e.platform)throw new y("INVALID_ARGS","open <app> <url> is supported only on Apple platforms");if(G(a))throw new y("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!G(i))throw new y("INVALID_ARGS","open <app> <url> requires a valid URL target");return await t.open(a,{activity:r?.activity,appBundleId:r?.appBundleId,url:i}),{app:a,url:i,...eM(`Opened: ${a}`)}}return await t.open(a,{activity:r?.activity,appBundleId:r?.appBundleId}),{app:a,...eM(`Opened: ${a}`)}}async function oL(e,t,n,r,a){let i,[o,s]=n.map(Number);if(Number.isNaN(o)||Number.isNaN(s))throw new y("INVALID_ARGS","press requires x y");if("macos"===e.platform&&r?.surface&&"app"!==r.surface){let e=i4(r);if("primary"!==e)throw new y("UNSUPPORTED_OPERATION",`${e} click is not supported on macOS ${r.surface} sessions.`);return await am(o,s,{bundleId:r.appBundleId,surface:r.surface}),{x:o,y:s,...eM(oH({x:o,y:s}))}}let l=i4(r);if("primary"!==l){let t=i5({commandLabel:"click",platform:e.platform,button:l,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(t)throw t;return"linux"===e.platform?"secondary"===l?await iP(o,s):await iT(o,s):await nA(e,{command:"mouseClick",x:o,y:s,button:l,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId}),{x:o,y:s,button:l,...eM(oH({x:o,y:s,button:l}))}}let d=i9(r?.count??1,"count",1,200),u=i9(r?.intervalMs??0,"interval-ms",0,1e4),c=i9(r?.holdMs??0,"hold-ms",0,1e4),p=i9(r?.jitterPx??0,"jitter-px",0,100),f=r?.doubleTap===!0;if(f&&c>0)throw new y("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(f&&p>0)throw new y("INVALID_ARGS","double-tap cannot be combined with jitter-px");if(tO(e.platform)&&d>1&&0===c&&0===p){let t=await nA(e,{command:"tapSeries",x:o,y:s,count:d,intervalMs:u,doubleTap:f,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId});return{x:o,y:s,count:d,intervalMs:u,holdMs:c,jitterPx:p,doubleTap:f,timingMode:"runner-series",...t,...eM(oH({x:o,y:s}))}}return await oe(d,u,async e=>{let[n,r]=function(e,t){if(t<=0)return[0,0];let[n,r]=i7[e%i7.length];return[n*t,r*t]}(e,p),a=o+n,l=s+r;if(f){i??=await t.doubleTap(a,l)??void 0;return}c>0?i??=await t.longPress(a,l,c)??void 0:i??=await t.tap(a,l)??void 0}),ek({x:o,y:s,count:d,intervalMs:u,holdMs:c,jitterPx:p,doubleTap:f,...i},oH({x:o,y:s}))}async function o$(e,t,n,r,a){let i=Number(n[0]),o=Number(n[1]),s=Number(n[2]),l=Number(n[3]);if([i,o,s,l].some(Number.isNaN))throw new y("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let d=i9(n[4]?Number(n[4]):250,"durationMs",16,1e4),u="ios"===e.platform?Math.min(60,Math.max(16,Math.round(d))):d,c=i9(r?.count??1,"count",1,200),p=i9(r?.pauseMs??0,"pause-ms",0,1e4),f=r?.pattern??"one-way";if("one-way"!==f&&"ping-pong"!==f)throw new y("INVALID_ARGS",`Invalid pattern: ${f}`);if(tO(e.platform)&&c>1){let t=await nA(e,{command:"dragSeries",x:i,y:o,x2:s,y2:l,durationMs:u,count:c,pauseMs:p,pattern:f,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId});return{x1:i,y1:o,x2:s,y2:l,durationMs:d,effectiveDurationMs:u,timingMode:"runner-series",count:c,pauseMs:p,pattern:f,...t,...eM(oK(c,f))}}return await oe(c,p,async e=>{"ping-pong"===f&&e%2==1?await t.swipe(s,l,i,o,u):await t.swipe(i,o,s,l,u)}),ek({x1:i,y1:o,x2:s,y2:l,durationMs:d,effectiveDurationMs:u,timingMode:"ios"===e.platform?"safe-normalized":"direct",count:c,pauseMs:p,pattern:f},oK(c,f))}async function oF(e,t,n){let r=t[0],a=t[1]?Number(t[1]):void 0,i=n?.pixels;if(!r)throw new y("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new y("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==i)throw new y("INVALID_ARGS","scroll accepts either a relative amount or --pixels, not both");let o=function(e){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new y("INVALID_ARGS",`Unknown direction: ${e}`)}}(r),s=await e.scroll(o,{amount:a,pixels:i});return ek({direction:o,...void 0!==a?{amount:a}:{},...void 0!==i?{pixels:i}:{},...s},void 0!==i?`Scrolled ${o} by ${i}px`:void 0!==a?`Scrolled ${o} by ${a}`:`Scrolled ${o}`)}async function oU(e,t,n,r){if("android"===e.platform)throw new y("UNSUPPORTED_OPERATION","Android pinch is not supported in current adb backend; requires instrumentation-based backend.");if("tv"===e.target)throw new y("UNSUPPORTED_OPERATION","pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new y("UNSUPPORTED_OPERATION","pinch is only supported in macOS app sessions. Re-open the target app without --surface desktop|menubar|frontmost-app first.");let a=Number(t[0]),i=t[1]?Number(t[1]):void 0,o=t[2]?Number(t[2]):void 0;if(Number.isNaN(a)||a<=0)throw new y("INVALID_ARGS","pinch requires scale > 0");return await nA(e,{command:"pinch",scale:a,x:i,y:o,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId}),{scale:a,x:i,y:o,...eM(`Pinched to scale ${a}`)}}async function oG(e,t){let n=(t[0]??"").toLowerCase();if("read"!==n&&"write"!==n)throw new y("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===n){if(1!==t.length)throw new y("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:n,text:await e.readClipboard()}}if(t.length<2)throw new y("INVALID_ARGS",'clipboard write requires text (use "" to clear clipboard)');let r=t.slice(1).join(" ");return await e.writeClipboard(r),{action:n,textLength:Array.from(r).length,...eM("Clipboard updated")}}async function oV(e,t,n,r,a){let i=(n[0]??"status").toLowerCase();if("status"!==i&&"get"!==i&&"dismiss"!==i)throw new y("INVALID_ARGS","keyboard requires a subcommand: status, get, or dismiss");if(n.length>1)throw new y("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform){if("dismiss"===i){let t=await I(e);return{platform:"android",action:"dismiss",attempts:t.attempts,wasVisible:t.wasVisible,dismissed:t.dismissed,visible:t.visible,inputType:t.inputType,type:t.type}}let t=await P(e);return{platform:"android",action:"status",visible:t.visible,inputType:t.inputType,type:t.type}}if("ios"===e.platform){if("dismiss"!==i)throw new y("UNSUPPORTED_OPERATION","keyboard status/get is currently supported only on Android; use keyboard dismiss on iOS");let t=await nA(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},a);return{platform:"ios",action:"dismiss",wasVisible:t.wasVisible,dismissed:t.dismissed,visible:t.visible,...eM(t.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}throw new y("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function oB(e,t,n,r){var a;let[i,o,s,l]=n,d="location"===i&&"set"===o,u=("permission"===i||d?n[4]:n[2])??r?.appBundleId,c="permission"===i?{permissionTarget:s,permissionMode:l}:d?{latitude:rf(s,"latitude"),longitude:rf(l,"longitude")}:void 0;er({level:"debug",phase:"settings_apply",data:d?{setting:i,state:o,latitude:s,longitude:l,platform:e.platform}:"permission"===i?{setting:i,state:o,permissionTarget:s,permissionMode:l,platform:e.platform}:{setting:i,state:o,appBundleId:u,platform:e.platform}});let p=await t.setSetting(i,o,u,c);return p&&"object"==typeof p?ek({setting:i,state:o,...p},("string"==typeof(a=p).message&&a.message.length>0?a.message:void 0)??`Updated setting: ${i}`):{setting:i,state:o,...eM(`Updated setting: ${i}`)}}async function oj(e,t,n){let r=t[0]?.trim(),a=t[1]?.trim();if(!r||!a)throw new y("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let i=await on(a);if("ios"===e.platform)return await is(e,r,i),{platform:"ios",bundleId:r,...eM(`Pushed notification to ${r}`)};let o=await rM(e,r,i);return{platform:"android",package:r,action:o.action,extrasCount:o.extrasCount,...eM(`Pushed notification to ${r}`)}}async function oq(e,t,n,r){if("linux"===e.platform){let e=await et("snapshot_capture",async()=>await i3(n?.surface),{backend:"linux-atspi"});return{nodes:e.nodes??[],truncated:e.truncated??!1,backend:"linux-atspi"}}if("android"!==e.platform){let t=await et("snapshot_capture",async()=>await nA(e,{command:"snapshot",appBundleId:n?.appBundleId,interactiveOnly:n?.snapshotInteractiveOnly,compact:n?.snapshotCompact,depth:n?.snapshotDepth,scope:n?.snapshotScope,raw:n?.snapshotRaw},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId}),{backend:"xctest"}),r=t.nodes??[];if(0===r.length&&"simulator"===e.kind)throw new y("COMMAND_FAILED","XCTest snapshot returned 0 nodes on iOS simulator.");return{nodes:r,truncated:t.truncated??!1,backend:"xctest"}}let a=await et("snapshot_capture",async()=>await nB(e,{interactiveOnly:n?.snapshotInteractiveOnly,compact:n?.snapshotCompact,depth:n?.snapshotDepth,scope:n?.snapshotScope,raw:n?.snapshotRaw}),{backend:"android"});return{nodes:a.nodes??[],truncated:a.truncated??!1,backend:"android",analysis:a.analysis,androidSnapshot:a.androidSnapshot}}async function oX(e,t,n,r){let[a,i]=t.map(Number);if(Number.isNaN(a)||Number.isNaN(i))throw new y("INVALID_ARGS","read requires x y");if("android"===e.platform)return{action:"read",text:await n0(e,a,i)??""};if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return{action:"read",text:(await ah(a,i,{bundleId:n.appBundleId,surface:n.surface})).text};let o=await nA(e,{command:"readText",x:a,y:i,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function oH(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function oK(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function oz(e,t){return`${e} ${Array.from(t).length} chars`}let oY=e=>"macos"!==e.platform,oW={device:!0},oJ={},oZ={alert:{apple:{simulator:!0,device:!0},android:{},linux:oJ,supports:e=>"macos"===e.platform||"simulator"===e.kind},pinch:{apple:{simulator:!0,device:!0},android:{},linux:oJ,supports:e=>"macos"===e.platform||"simulator"===e.kind&&"tv"!==e.target},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ,supports:oY},apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ,supports:oY},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW,supports:e=>"android"===e.platform||"linux"===e.platform||"macos"===e.platform||"simulator"===e.kind},keyboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},close:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},fill:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},diff:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},find:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},get:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},is:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW,supports:oY},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},open:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ},install:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ,supports:oY},"install-from-source":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ,supports:oY},reinstall:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ,supports:oY},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ,supports:oY},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},screenshot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},scroll:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},snapshot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oJ},type:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW},wait:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:oW}};function oQ(e,t){let n=oZ[e];if(!n)return!0;let r=tO(t.platform)?n.apple:"linux"===t.platform?n.linux:n.android;return!!r&&(!n.supports||!!n.supports(t))&&!0===r[t.kind??"unknown"]}function o0(e,t,n,r,a){return{requestId:a??en().requestId,appBundleId:n,activity:t?.activity,verbose:t?.verbose,logPath:e,traceLogPath:r,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotCompact:t?.snapshotCompact,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,screenshotFullscreen:t?.screenshotFullscreen,screenshotMaxSize:t?.screenshotMaxSize,count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:i4(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}let o1=W(process.env.AGENT_DEVICE_IOS_DEVICE_READY_TIMEOUT_MS,15e3,1e3),o2=new Map;async function o3(e){var t;let n,r=(n="simulator"===(t=e).kind?t.simulatorSetPath??"":"",JSON.stringify([t.platform,t.kind,t.id,t.target??"",n])),a=o2.get(r);if(void 0!==a){if(a>Date.now())return;o2.delete(r)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:t}=await Promise.resolve(eQ);await t(e),o4(r);return}if("device"===e.kind){await o5(e.id),o4(r);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./8809.js");await t(e.id),o4(r)}}function o4(e){o2.set(e,Date.now()+5e3)}async function o5(e){let t=s.join(i.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=Math.max(1,Math.ceil(o1/1e3));try{let r=await H("xcrun",["devicectl","device","info","details","--device",e,"--json-output",t,"--timeout",String(n)],{allowFailure:!0,timeoutMs:o1+3e3}),a=String(r.stdout??""),i=String(r.stderr??""),o=await o8(t);if(0===r.exitCode){if(!o.parsed)throw new y("COMMAND_FAILED","iOS device readiness probe failed",{kind:"probe_inconclusive",deviceId:e,stdout:a,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 t=o?.tunnelState?.toLowerCase();if("connecting"===t)throw new y("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,tunnelState:t,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 y("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,stdout:a,stderr:i,exitCode:r.exitCode,tunnelState:o?.tunnelState,hint:o6(a,i)})}catch(t){if(t instanceof y&&"COMMAND_FAILED"===t.code){if("not_ready"===("string"==typeof t.details?.kind?t.details.kind:""))throw t;let n=t.details??{},r=String(n.stdout??""),a=String(n.stderr??""),i=Number(n.timeoutMs??o1),o=`CoreDevice did not respond within ${i}ms. Keep the device unlocked and trusted, then retry; if it persists restart Xcode and the iOS device.`;throw new y("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:i,stdout:r,stderr:a,hint:r||a?o6(r,a):o},t)}throw new y("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,hint:"Reconnect the device, keep it unlocked, and retry."},t instanceof Error?t:void 0)}finally{await a.rm(t,{force:!0}).catch(()=>{})}}async function o8(e){try{let t=await a.readFile(e,"utf8"),n=JSON.parse(t),r=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let n=t.connectionProperties?.tunnelState,r=t.device?.connectionProperties?.tunnelState,a="string"==typeof n?n:"string"==typeof r?r:void 0;return a?{tunnelState:a}:{}}(n);return{parsed:!0,tunnelState:r.tunnelState}}catch{return{parsed:!1}}}function o6(e,t){let n=rH(e,t);return n||(`${e}
26
- ${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":rX)}function o9(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}let o7=[250,400,600];function se(e,t,n=e.snapshot){if("android"!==e.device.platform)return;let r=n?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:n?.nodes.length??0,baselineSignatures:r?sa(n?.nodes??[]):void 0,routeComparable:r}}function st(e){if(!e||"android"!==e.device.platform)return;let t=e.androidSnapshotFreshness;if(t)return Date.now()-t.markedAt>2500?void delete e.androidSnapshotFreshness:t}function sn(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function sr(e){return"press"===e||"click"===e||"back"===e||"open"===e}function sa(e){return e.map(e=>[e.depth??0,e.type??"",e.role??"",e.label??"",e.value??"",e.identifier??"",!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].join("|"))}function si(e,t){e.snapshot=t,e.snapshotScopeSource=void 0}function so(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function ss(e){if(0===e.length)return null;let t=so(e[0]);if(null!==t)return{kind:"sleep",durationMs:t};if("text"===e[0]){let t=so(e[e.length-1]);return{kind:"text",text:(null!==t?e.slice(1,-1).join(" "):e.slice(1).join(" ")).trim(),timeoutMs:t}}if(e[0].startsWith("@")){let t=so(e[e.length-1]);return{kind:"ref",rawRef:e[0],timeoutMs:t}}let n=so(e[e.length-1]),r=eE(null!==n?e.slice(0,-1):e.slice());if(r&&0===r.rest.length){let e=eC(r.selectorExpression);if(e)return{kind:"selector",selector:e,selectorExpression:r.selectorExpression,timeoutMs:n}}return{kind:"text",text:(null!==n?e.slice(0,-1).join(" "):e.join(" ")).trim(),timeoutMs:n}}async function sl(e,t,n){let r=e.get(t),a=r?.device??await oM(n??{});return r||await o3(a),{session:r,device:a}}async function sd(e,t,n){let r=!e&&"ios"===t.platform;try{return await n()}finally{r&&await nh(t.id)}}function su(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}async function sc(e){let{req:t,logPath:n,sessionStore:r,session:a,device:i}=e,o=(t.positionals?.[0]??"get").toLowerCase(),s=a?"frontmost-app"===a.surface?{surface:"frontmost-app"}:{bundleId:a.appBundleId,surface:a.surface}:{};if(!oQ("alert",i))return o9("UNSUPPORTED_OPERATION","alert is not supported on this device");if("macos"===i.platform){let e=async()=>await ap("wait"===o?"get":o,s);if("wait"===o){let n=so(t.positionals?.[1])??1e4,i=Date.now();for(;Date.now()-i<n;){try{let n=await e();return su(r,a,t,n),{ok:!0,data:n}}catch{}await Y(300)}return o9("COMMAND_FAILED","alert wait timed out")}let n="accept"===o||"dismiss"===o?o:"get";if("accept"===n||"dismiss"===n){let e,i=Date.now();for(;Date.now()-i<2e3;){try{let e=await ap(n,s);return su(r,a,t,e),{ok:!0,data:e}}catch(n){e=n;let t=String(n?.message??"").toLowerCase();if(!t.includes("alert not found")&&!t.includes("no alert"))break}await Y(300)}throw sp(e)}let i=await ap("get",s);return su(r,a,t,i),{ok:!0,data:i}}if("wait"===o){let e=so(t.positionals?.[1])??1e4,o=Date.now();for(;Date.now()-o<e;){try{let e=await nA(i,{command:"alert",action:"get",appBundleId:a?.appBundleId},{verbose:t.flags?.verbose,logPath:n,traceLogPath:a?.trace?.outPath,requestId:t.meta?.requestId});return su(r,a,t,e),{ok:!0,data:e}}catch{}await Y(300)}return o9("COMMAND_FAILED","alert wait timed out")}let l="accept"===o||"dismiss"===o?o:"get",d={verbose:t.flags?.verbose,logPath:n,traceLogPath:a?.trace?.outPath,requestId:t.meta?.requestId};if("accept"===l||"dismiss"===l){let e,n=Date.now();for(;Date.now()-n<2e3;){try{let e=await nA(i,{command:"alert",action:l,appBundleId:a?.appBundleId},d);return su(r,a,t,e),{ok:!0,data:e}}catch(n){e=n;let t=String(n?.message??"").toLowerCase();if(!t.includes("alert not found")&&!t.includes("no alert"))break}await Y(300)}throw sp(e)}let u=await nA(i,{command:"alert",action:l,appBundleId:a?.appBundleId},d);return su(r,a,t,u),{ok:!0,data:u}}function sp(e){if(!(e instanceof y))return e;let t=String(e.message??"").toLowerCase();return t.includes("alert not found")||t.includes("no alert")?new y(e.code,e.message,{...e.details??{},hint:"If the permission sheet is visible in snapshot or screenshot but alert reports no alert, take a scoped snapshot around the visible button label and use press @ref."}):e}async function sf(e){let{req:t,logPath:n,sessionStore:r,session:a,device:i,parsed:o}=e,{setting:s,state:l,permissionTarget:d,latitude:u,longitude:c}=o;if(!oQ("settings",i))return o9("UNSUPPORTED_OPERATION","settings is not supported on this device");if("macos"===i.platform&&!e_(s))return o9("INVALID_ARGS",eN(s));let p=a?.appBundleId,f="permission"===s?[s,l,d??"",t.positionals?.[3]??"",p??""]:"location"===s&&"set"===l?[s,l,u??"",c??"",p??""]:[s,l,p??""],h=await oP(i,"settings",f,t.flags?.out,{...o0(n,t.flags,p,a?.trace?.outPath)});return su(r,a,t,h??{setting:s,state:l}),{ok:!0,data:h??{setting:s,state:l}}}function sh(e,t){try{return h.sync.read(e)}catch(e){throw new y("COMMAND_FAILED",`Failed to decode ${t} as PNG`,{label:t,reason:e instanceof Error?e.message:String(e)})}}async function sm(e,t){if(!Number.isInteger(t)||t<1)throw new y("INVALID_ARGS","Screenshot max size must be a positive integer");let n=sh(await a.readFile(e),"screenshot"),r=Math.max(n.width,n.height);if(r<=t)return;let i=t/r,o=Math.max(1,Math.round(n.width*i)),s=Math.max(1,Math.round(n.height*i)),l=function(e,t,n){let r=new h({width:t,height:n});for(let a=0;a<n;a+=1){let i=a*e.height/n,o=(a+1)*e.height/n;for(let n=0;n<t;n+=1){let s=n*e.width/t,l=(n+1)*e.width/t,d=0,u=0,c=0,p=0,f=0;for(let t=Math.floor(i);t<Math.ceil(o);t+=1){let n=Math.min(t+1,o)-Math.max(t,i);for(let r=Math.floor(s);r<Math.ceil(l);r+=1){let a=n*(Math.min(r+1,l)-Math.max(r,s)),i=(t*e.width+r)*4;d+=(e.data[i]??0)*a,u+=(e.data[i+1]??0)*a,c+=(e.data[i+2]??0)*a,p+=(e.data[i+3]??0)*a,f+=a}}let h=(a*r.width+n)*4;r.data[h]=Math.round(d/f),r.data[h+1]=Math.round(u/f),r.data[h+2]=Math.round(c/f),r.data[h+3]=Math.round(p/f)}}return r}(n,o,s);await a.writeFile(e,h.sync.write(l))}async function sw(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 w(e)}}async function sg(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 w(e)}}async function sy(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw w(e)}}let sb=async(e,t)=>{let n;if(!e.backend.captureScreenshot)throw new y("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let r=await sg(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},r.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,surface:t.surface}),void 0!==t.maxSize&&await sm(r.path,t.maxSize),n=await r.publish()}catch(e){throw await r.cleanup?.(),e}return{path:r.path,...n?{artifacts:[n]}:{},...eM(`Saved screenshot: ${r.path}`)}},sv=[0,187,255,255];function sI(e,t,n,r){if(t<0||t>=e.width||n<0||n>=e.height)return;let a=(n*e.width+t)*4;e.data[a]=r[0],e.data[a+1]=r[1],e.data[a+2]=r[2],e.data[a+3]=r[3]}function sA(e,t,n){return Math.min(Math.max(e,t),n)}let sx={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},sS={leading:20,trailing:20,separator:10,unknown:0,background:-30};function sN(e){return"background"!==e.likelyKind}function s_(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function sk(e,t){let n,r=0;for(let a of t){let t=sC(e,a.rect);t<=r||(r=t,n=a)}return n}function sM(e){let t=[];for(let n of[...e].sort((e,t)=>e.rect.y-t.rect.y)){let e=t.find(e=>{var t,r;return t=e.rect,sC(t,r=n.rect)>0||Math.abs(sR(t).y-sR(r).y)<=.5*Math.max(t.height,r.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=function(e){let t=1/0,n=1/0,r=-1/0,a=-1/0;for(let i of e)t=Math.min(t,i.x),n=Math.min(n,i.y),r=Math.max(r,i.x+i.width),a=Math.max(a,i.y+i.height);return{x:t,y:n,width:r-t,height:a-n}}([e.rect,n.rect])}return t}function sE(e,t){let n,r=sR(e);for(let e of t){var a,i;let t=Math.sqrt((a=r,i=sR(e.rect),(a.x-i.x)**2+(a.y-i.y)**2));n&&t>=n.distance||(n={block:e,distance:t})}return n}function sD(e){let t=sO(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function sO(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function sC(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}function sR(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function sP(e,t,n){return Math.min(Math.max(e,t),n)}async function sT(e){if(await z("tesseract"))try{let[t,n]=await Promise.all([s$(e.baselinePath),s$(e.currentPath)]);if(0!==t.exitCode||0!==n.exitCode)return;let r=sL(t.stdout,e.width,e.height),a=sL(n.stdout,e.width,e.height),i=function(e,t){let n=new Set,r=[];for(let i of e){var a;let e=sq(i.text),o=function(e,t,n,r){let a=null,i=1/0;for(let l=0;l<n.length;l+=1){var o,s;if(r.has(l))continue;let d=n[l];if(sq(d.text)!==t)continue;let u=(o=sV(e.normalizedRect),s=sV(d.normalizedRect),(o.x-s.x)**2+(o.y-s.y)**2);u>=i||(a=l,i=u)}return a}(i,e,t,n);if(null===o)continue;n.add(o);let s=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},r=sK(t.rect.width/e.rect.width),a=sK(t.rect.height/e.rect.height),i=Math.abs(r-1)>=.08||Math.abs(a-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[o]);a=s,(Math.abs(a.delta.x)>=2||Math.abs(a.delta.y)>=2||Math.abs(a.delta.width)>=2||Math.abs(a.delta.height)>=2||a.possibleTextMetricMismatch)&&r.push(s)}return r.sort((e,t)=>sF(t)-sF(e)).slice(0,12)}(r,a),o=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-sX(e.map(e=>e.delta.x))));e?e.push(n):t.push([n])}return t.filter(e=>e.length>=2).map(sU).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>sG(t)-sG(e)).slice(0,4)}(i);if(0===r.length&&0===a.length)return;return{provider:"tesseract",baselineBlocks:r.length,currentBlocks:a.length,baselineBlocksRaw:r,currentBlocksRaw:a,matches:i,...o.length>0?{movementClusters:o}:{}}}catch{return}}function sL(e,t,n){let[r,...a]=e.split(/\r?\n/);if(!r)return[];let i=new Map(r.split(" ").map((e,t)=>[e,t])),o=[];for(let e of a){var s;if(!e.trim())continue;let t=e.split(" "),n=sj(t,i,"level"),r=sB(t,i,"text").trim(),a=sj(t,i,"conf");if(5!==n||(s=r,!/[\p{L}\p{N}]/u.test(s))||a<0)continue;let l=sj(t,i,"left"),d=sj(t,i,"top"),u=sj(t,i,"width"),c=sj(t,i,"height");u<=0||c<=0||o.push({key:[sB(t,i,"page_num"),sB(t,i,"block_num"),sB(t,i,"par_num"),sB(t,i,"line_num")].join(":"),text:r,confidence:a,rect:{x:l,y:d,width:u,height:c}})}let l=new Map;for(let e of o){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=[],r=[];for(let e of t){let t=r.at(-1);if(!t){r.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(r),r=[e];continue}r.push(e)}return r.length>0&&n.push(r),n})(e)).map(e=>(function(e,t,n){if(0===e.length)return null;let r=[...e].sort((e,t)=>e.rect.x-t.rect.x),a=function(e){let t=1/0,n=1/0,r=-1/0,a=-1/0;for(let i of e)t=Math.min(t,i.x),n=Math.min(n,i.y),r=Math.max(r,i.x+i.width),a=Math.max(a,i.y+i.height);return{x:t,y:n,width:r-t,height:a-n}}(r.map(e=>e.rect)),i=Math.round(100*sX(r.map(e=>e.confidence)))/100;return{text:r.map(e=>e.text).join(" "),confidence:i,rect:a,normalizedRect:{x:sH(a.x/t),y:sH(a.y/n),width:sH(a.width/t),height:sH(a.height/n)}}})(e,t,n)).filter(e=>null!==e)}function s$(e){return H("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function sF(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 sU(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 sG(e){return 2*Math.abs((e.xRange.min+e.xRange.max)/2)+Math.abs((e.yRange.min+e.yRange.max)/2)}function sV(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function sB(e,t,n){let r=t.get(n);return void 0===r?"":e[r]??""}function sj(e,t,n){let r=Number(sB(e,t,n));return Number.isFinite(r)?r:0}function sq(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function sX(e){return e.reduce((e,t)=>e+t,0)/e.length}function sH(e){return Math.round(100*e*100)/100}function sK(e){return Math.round(1e3*e)/1e3}function sz(e,t,n,r){return{r:Math.round(e/r),g:Math.round(t/r),b:Math.round(n/r)}}function sY(e){return .2126*e.r+.7152*e.g+.0722*e.b}function sW(e){return`#${sJ(e.r)}${sJ(e.g)}${sJ(e.b)}`}function sJ(e){return e.toString(16).padStart(2,"0")}function sZ(e){return Math.round(100*e*100)/100}let sQ=255*Math.sqrt(3);async function s0(e,t,n={}){let r,i,o,l;await s1(e,"Baseline image not found"),await s1(t,"Current screenshot not found");let d=n.outputPath,[u,c]=await Promise.all([a.readFile(e),a.readFile(t)]),p=sh(u,"baseline screenshot"),f=sh(c,"current screenshot");s2(p.width,p.height,"baseline screenshot",n.maxPixels),s2(f.width,f.height,"current screenshot",n.maxPixels);let m=n.threshold??.1;if(p.width!==f.width||p.height!==f.height){let e=p.width*p.height;return await s3(n.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:p.width,height:p.height},actual:{width:f.width,height:f.height}}}}let w=p.width*p.height,g=m*sQ,y=new h({width:p.width,height:p.height}),b=new Uint8Array(w),v=0;for(let e=0,t=0;e<p.data.length;e+=4,t+=1){if(Math.sqrt((p.data[e]-f.data[e])**2+(p.data[e+1]-f.data[e+1])**2+(p.data[e+2]-f.data[e+2])**2)>g){v+=1,b[t]=1;let n=s4(f,e);y.data[e]=s5(n,220,.78),y.data[e+1]=s5(n,0,.78),y.data[e+2]=s5(n,0,.78),y.data[e+3]=255;continue}let n=s4(f,e);y.data[e]=n,y.data[e+1]=n,y.data[e+2]=n,y.data[e+3]=255}let I=v>0?(x=(r=function(e){let{diffMask:t,baseline:n,current:r}=e,{width:a,height:i}=n,o=new Uint8Array(t.length),s=new Int32Array(t.length),l=[];for(let e=0;e<t.length;e+=1){if(1!==t[e]||1===o[e])continue;let d=0,u=0;s[0]=e,u+=1,o[e]=1;let c=e%a,p=Math.floor(e/a),f={minX:c,minY:p,maxX:c,maxY:p,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0};for(;d<u;){let e=s[d];d+=1,function(e,t,n,r,a){let i=t%n,o=Math.floor(t/n),s=4*t;e.minX=Math.min(e.minX,i),e.minY=Math.min(e.minY,o),e.maxX=Math.max(e.maxX,i),e.maxY=Math.max(e.maxY,o),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=a.data[s],e.currentGreen+=a.data[s+1],e.currentBlue+=a.data[s+2]}(f,e,a,n,r);let l=e%a,c=Math.floor(e/a);for(let e=-1;e<=1;e+=1){let n=c+e;if(!(n<0)&&!(n>=i))for(let r=-1;r<=1;r+=1){if(0===r&&0===e)continue;let i=l+r;if(i<0||i>=a)continue;let d=n*a+i;1===t[d]&&1!==o[d]&&(o[d]=1,s[u]=d,u+=1)}}}l.push(f)}return l}(A={diffMask:b,baseline:p,current:f,totalPixels:w,differentPixels:v,maxRegions:n.maxRegions})).length<=2e3?function(e){let t=[];for(let a of e.sort((e,t)=>{let n=e.minY-t.minY;return 0!==n?n:e.minX-t.minX})){var n,r;let e=t.find(e=>{var t,n,r;return t=e,n=a,r=12,t.minX-r<=n.maxX&&n.minX-r<=t.maxX&&t.minY-r<=n.maxY&&n.minY-r<=t.maxY});if(!e){t.push({...a});continue}n=e,r=a,n.minX=Math.min(n.minX,r.minX),n.minY=Math.min(n.minY,r.minY),n.maxX=Math.max(n.maxX,r.maxX),n.maxY=Math.max(n.maxY,r.maxY),n.differentPixels+=r.differentPixels,n.baselineRed+=r.baselineRed,n.baselineGreen+=r.baselineGreen,n.baselineBlue+=r.baselineBlue,n.currentRed+=r.currentRed,n.currentGreen+=r.currentGreen,n.currentBlue+=r.currentBlue}return t}(r):r,x.flatMap(e=>{var t,n,r;let a;return(t=e,n=A.baseline.width,r=A.baseline.height,a=t.maxX-t.minX+1,t.maxY-t.minY+1>=Math.max(48,Math.round(.07*r))&&a>=.35*n)?function(e,t,n){var r;let a=function(e,t){let n=[],r=null;for(let a=0;a<e.length;a+=1){if(e[a]<=t){r??=a;continue}null!==r&&(a-r>=6&&n.push([r,a-1]),r=null)}return null!==r&&e.length-r>=6&&n.push([r,e.length-1]),n}((r=function(e,t,n){let r=[];for(let a=e.minY;a<=e.maxY;a+=1){let i=0;for(let r=e.minX;r<=e.maxX;r+=1)1===t[a*n+r]&&(i+=1);r.push(i)}return r}(e,t.diffMask,t.baseline.width)).map((e,t)=>{let n=0,a=0,i=Math.max(0,t-3),o=Math.min(r.length-1,t+3);for(let e=i;e<=o;e+=1)n+=r[e],a+=1;return Math.round(n/a)}),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),i=function(e,t,n){let r=[],a=e.minY;for(let[i,o]of t){let t=e.minY+Math.round((i+o)/2);t-a+1<n||e.maxY-t<n||(r.push([a,t]),a=t+1)}return r.push([a,e.maxY]),r}(e,a,n);if(i.length<=1)return[e];let o=i.map(([n,r])=>(function(e,t,n,r){let a=null;for(let s=t;s<=n;s+=1)for(let t=e.minX;t<=e.maxX;t+=1){var i,o;let e=s*r.baseline.width+t;1===r.diffMask[e]&&function(e,t,n,r,a,i){let o=4*t;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,r),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,r),e.differentPixels+=1,e.baselineRed+=a.data[o],e.baselineGreen+=a.data[o+1],e.baselineBlue+=a.data[o+2],e.currentRed+=i.data[o],e.currentGreen+=i.data[o+1],e.currentBlue+=i.data[o+2]}(a??={minX:i=t,minY:o=s,maxX:i,maxY:o,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0},e,t,s,r.baseline,r.current)}return a})(e,n,r,t)).filter(e=>null!==e);return o.length>1?o:[e]}(e,A,Math.max(24,Math.round(.03*A.baseline.height))):[e]})).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(0!==n)return n;let r=e.minY-t.minY;return 0!==r?r:e.minX-t.minX}).slice(0,Math.max(0,A.maxRegions??8)).map((e,t)=>{var n,r,a,i,o,s,l,d,u,c,p;let f,h,m,w,g,y,b,v,I,x,S,N,_,k,M,E,D;return n=e,r=t+1,a={width:A.baseline.width,height:A.baseline.height,totalPixels:A.totalPixels,differentPixels:A.differentPixels},y={x:n.minX,y:n.minY,width:n.maxX-n.minX+1,height:n.maxY-n.minY+1},b={x:Math.round(n.minX+y.width/2),y:Math.round(n.minY+y.height/2)},v=sz(n.baselineRed,n.baselineGreen,n.baselineBlue,n.differentPixels),I=sz(n.currentRed,n.currentGreen,n.currentBlue,n.differentPixels),x=y.width*y.height,S=sZ(n.differentPixels/x),N=Math.round(sY(v)),_=Math.round(sY(I)),k=(i=y,o=a.width,s=a.height,i.width>=.55*o&&i.height>=.12*s?"large-area":i.width>=2.5*i.height?"horizontal-band":i.height>=2.5*i.width?"vertical-band":"compact"),M=(f=x/a.totalPixels)>=.04?"large":f>=.01?"medium":"small",E=(l=v,d=I,h=sY(l),Math.abs(m=sY(d)-h)>=12?m>0?"brighter":"darker":Math.max(Math.abs(d.r-l.r),Math.abs(d.g-l.g),Math.abs(d.b-l.b))>=12?"color-shift":"mixed"),D=(u=b,c=a.width,p=a.height,w=u.x<c/3?"left":u.x>2*c/3?"right":"center",g=u.y<p/3?"top":u.y>2*p/3?"bottom":"middle","center"===w&&"middle"===g?"center":`${g}-${w}`),{index:r,rect:y,normalizedRect:{x:sZ(y.x/a.width),y:sZ(y.y/a.height),width:sZ(y.width/a.width),height:sZ(y.height/a.height)},differentPixels:n.differentPixels,shareOfDiffPercentage:sZ(n.differentPixels/a.differentPixels),densityPercentage:S,shape:k,size:M,location:D,averageBaselineColorHex:sW(v),averageCurrentColorHex:sW(I),baselineLuminance:N,currentLuminance:_,dominantChange:E}}):[];if(v>0&&d){var A,x,S;for(let e of I)e.rect.width<4||e.rect.height<4||function(e,t){let n=sA(t.x,0,e.width-1),r=sA(t.y,0,e.height-1),a=sA(t.x+t.width-1,0,e.width-1),i=sA(t.y+t.height-1,0,e.height-1);for(let t=0;t<2;t+=1){for(let o=n;o<=a;o+=1)sI(e,o,r+t,sv),sI(e,o,i-t,sv);for(let o=r;o<=i;o+=1)sI(e,n+t,o,sv),sI(e,a-t,o,sv)}}(y,e.rect);await a.mkdir(s.dirname(d),{recursive:!0}),await a.writeFile(d,h.sync.write(y))}else await s3(n.outputPath);let N=v>0?await sT({baselinePath:e,currentPath:t,width:p.width,height:p.height}):void 0,_=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,k=v>0&&N?(i=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,r,a;return t=e,r=n,a=10,t.minX-a<=r.maxX&&r.minX-a<=t.maxX&&t.minY-a<=r.maxY&&r.minY-a<=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}(function(e,t,n){let r=new Uint8Array(e.length),a=new Int32Array(e.length),i=[];for(let o=0;o<e.length;o+=1){if(1!==e[o]||1===r[o])continue;let s=0,l=0;a[0]=o,l+=1,r[o]=1;let d=o%t,u=Math.floor(o/t),c={minX:d,minY:u,maxX:d,maxY:u,differentPixels:0};for(;s<l;){let i=a[s];s+=1;let o=i%t,d=Math.floor(i/t);c.minX=Math.min(c.minX,o),c.minY=Math.min(c.minY,d),c.maxX=Math.max(c.maxX,o),c.maxY=Math.max(c.maxY,d),c.differentPixels+=1;for(let i=-1;i<=1;i+=1){let s=d+i;if(!(s<0)&&!(s>=n))for(let n=-1;n<=1;n+=1){if(0===n&&0===i)continue;let d=o+n;if(d<0||d>=t)continue;let u=s*t+d;1===e[u]&&1!==r[u]&&(r[u]=1,a[l]=u,l+=1)}}}i.push(c)}return i}(function(e,t,n,r){let a=new Uint8Array(e);if(!r)return a;for(let e of[...r.baselineBlocksRaw,...r.currentBlocksRaw]){var i;!function(e,t,n,r){let a=sP(Math.floor(r.x),0,t-1),i=sP(Math.floor(r.y),0,n-1),o=sP(Math.ceil(r.x+r.width),0,t),s=sP(Math.ceil(r.y+r.height),0,n);for(let n=i;n<s;n+=1)for(let r=a;r<o;r+=1)e[n*t+r]=0}(a,t,n,{x:(i=e.rect).x-8,y:i.y-8,width:i.width+16,height:i.height+16})}return a}((S={diffMask:b,width:p.width,height:p.height,regions:I,ocr:N}).diffMask,S.width,S.height,S.ocr),S.width,S.height)),o=sM(S.ocr?.currentBlocksRaw??[]),l=sM(S.ocr?.baselineBlocksRaw??[]),i.filter(sD).map(e=>{var t,n,r,a,i,s,d,u,c,p,f;let h,m,w,g,y,b,v,I,A,x;return t=e,n=S,r=o,a=l,g=function(e,t){let n,r=0;for(let a of t){let t=function(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),a=Math.min(e.x+e.width,t.x+t.width),i=Math.min(e.y+e.height,t.y+t.height);return a<=n||i<=r?0:(a-n)*(i-r)}(e,a.rect);t<=r||(r=t,n=a)}return n?.index}(w=sO(t),n.regions),y=function(e,t,n){let r=sk(e,t);if(r)return sE(e,r.blocks);let a=sk(e,n);return a?sE(e,a.blocks):void 0}(w,r,a),b=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 r=e.x+e.width/2,a=t.x+t.width/2;return r<a-t.width/2?"leading":r>a+t.width/2?"trailing":e.width>=.35*n?"background":"unknown"}(w,y?.block.rect,n.width),v=(i=w,s=b,d=t.differentPixels,u=n,h=i.width/i.height,m=d/(i.width*i.height),"separator"===s?"separator":"background"===s?"background":"trailing"===s&&h>=1.5&&h<=3.8&&m>=.35?"toggle":"trailing"===s&&i.width<=.06*u.width&&i.height<=.04*u.height?"chevron":"leading"===s&&h>=.55&&h<=1.8?"icon":s_(i,u)?"background":"visual"),I={...g?{regionIndex:g}:{},slot:b,likelyKind:v,rect:w},{...g?{regionIndex:g}:{},slot:b,likelyKind:v,rect:w,...y?{nearestText:y.block.text.trim().replace(/^[^\p{L}\p{N}]+/u,"").replace(/^\p{L}\s+/u,"")}:{},score:(c=I,p=t.differentPixels,f=n,A=s_(c.rect,f)?-35:0,x=20*!!c.regionIndex,sx[c.likelyKind]+sS[c.slot]+x+A+Math.min(20,p/200))}}).filter(e=>e.rect.y>=.08*S.height).filter(sN).sort((e,t)=>t.score-e.score).slice(0,Math.max(0,S.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}:{}}})):[],M=w>0?Math.round(v/w*1e4)/100:0;return{...v>0&&d?{diffPath:d}:{},...I.length>0?{regions:I}:{},..._?{ocr:_}:{},...k.length>0?{nonTextDeltas:k}:{},totalPixels:w,differentPixels:v,mismatchPercentage:M,match:0===v}}async function s1(e,t){try{await a.access(e)}catch{throw new y("INVALID_ARGS",`${t}: ${e}`)}}function s2(e,t,n,r){if(null==r||r<=0)return;let a=e*t;if(!(a<=r))throw new y("INVALID_ARGS",`${n} is ${a} pixels, which exceeds the configured maxImagePixels limit of ${r}`)}async function s3(e){if(e)try{await a.unlink(e)}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function s4(e,t){return s5(Math.round(.299*e.data[t]+.587*e.data[t+1]+.114*e.data[t+2]),255,.72)}function s5(e,t,n){return Math.round(e*(1-n)+t*n)}function s8(e){return e.width*e.height}function s6(e){return Math.round(100*e*100)/100}let s9=async(e,t)=>{let n,r,a;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),o=t.current??{kind:"live"};if(t.overlayRefs&&!li(o))throw new y("INVALID_ARGS","diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs");let s=await sw(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),l=[];try{let d;d=li(o)?(r=await s7(e,t)).path:(n=await sw(e,o,{usage:"diff screenshot current",field:"current"})).path,a=t.out?await sg(e,t.out,{field:"diffPath",ext:".png"}):void 0;let u=await s0(s.path,d,{threshold:i,outputPath:a?.path,maxPixels:e.policy.maxImagePixels});li(o)&&(u=await le(e,t,a?.path,u,l));let c=u.diffPath?await a?.publish():void 0;return c&&l.push(c),u.diffPath||await a?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await a?.cleanup?.(),e}finally{await s.cleanup?.(),await n?.cleanup?.(),await r?.cleanup?.()}};async function s7(e,t){let n=await sy(e,{prefix:"agent-device-diff-current",ext:".png"});try{await lt(e,t,n.path,ln(t))}catch(e){throw await n.cleanup(),e}return n}async function le(e,t,n,r,a){var i,o,s,l;if(!t.overlayRefs)return r;if(r.match||r.dimensionMismatch)return n&&await la(n),r;let d=(i=t,o=n,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:lr(o??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:lr(i.out.clientPath)}:{},...i.out.fileName?{fileName:lr(i.out.fileName)}:{}}:void 0),u=await sg(e,d,{field:"currentOverlayPath",ext:".png"});try{let n=await lt(e,t,u.path,{overlayRefs:!0,...ln(t)}),i=await u.publish();return i&&a.push(i),{...r,currentOverlayPath:n.path??u.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...r.regions&&n.overlayRefs?{regions:(s=r.regions,l=n.overlayRefs,s.map(e=>{var t,n;let r,a=(t=e,n=l,r=s8(t.rect),n.map(e=>{var n,a;let i,o,s,l,d=e.overlayRect,u=(n=t.rect,a=d,i=Math.max(n.x,a.x),o=Math.max(n.y,a.y),s=Math.min(n.x+n.width,a.x+a.width),l=Math.min(n.y+n.height,a.y+a.height),s<=i||l<=o?0:(s-i)*(l-o));return u<=0?null:{ref:e.ref,...e.label?{label:e.label}:{},rect:d,overlayCoveragePercentage:s6(u/s8(d)),regionCoveragePercentage:s6(u/r)}}).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 a.length>0?{...e,currentOverlayMatches:a}:e}))}:{}}}catch(e){throw await u.cleanup?.(),e}}async function lt(e,t,n,r={}){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,r)??{}}function ln(e){return e.surface?{surface:e.surface}:{}}function lr(e){let t=s.extname(e),n=t?e.slice(0,-t.length):e;return`${n}.current-overlay${t||".png"}`}async function la(e){try{await a.unlink(lr(e))}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function li(e){return"live"===e.kind}let lo={application:"application",navigationbar:"navigation-bar",tabbar:"tab-bar",button:"button",imagebutton:"button",link:"link",cell:"cell",statictext:"text",checkedtextview:"text",textfield:"text-field",edittext:"text-field",textarea:"text-view",switch:"switch",slider:"slider",image:"image",imageview:"image",webview:"webview",framelayout:"group",linearlayout:"group",relativelayout:"group",constraintlayout:"group",viewgroup:"group",view:"group",listview:"list",recyclerview:"list",collectionview:"collection",searchfield:"search",segmentedcontrol:"segmented-control",group:"group",window:"window",checkbox:"checkbox",radio:"radio",menuitem:"menu-item",toolbar:"toolbar",scrollarea:"scroll-area",scrollview:"scroll-area",nestedscrollview:"scroll-area",table:"table"};function ls(e,t={}){let n=[],r=[];for(let a of e){let e=a.depth??0,i=a.label?.trim()||a.value?.trim()||a.identifier?.trim()||"",o=lu(a.type??"Element");if("group"===o&&!i)continue;for(;n.length>0&&e<=n[n.length-1];)n.pop();let s=n.length;n.push(e),r.push({node:a,depth:s,type:o,text:ll(a,s,!1,o,t)})}return r}function ll(e,t,n,r,a={}){var i,o,s,l,d,u,c,p;let f,h=r??lu(e.type??"Element"),m=eq(e,h),w=(i=e,o=h,s=a,l=m,s.summarizeTextSurfaces&&l.shouldSummarize&&function(e,t,n){let r=eD(e.label);if(r&&r!==n)return r;let a=eD(e.identifier);if(a&&!lp(a)&&a!==n)return a;switch(t){case"text":case"text-view":return"Text view";case"text-field":return"Text field";case"search":return"Search field";default:return""}}(i,o,l.text)||ld(i,o)),g=" ".repeat(t),y=e.ref?`@${e.ref}`:"",b=(d=e,u=h,c=a,p=m,f=[],(!1===d.enabled&&f.push("disabled"),c.summarizeTextSurfaces&&(!0===d.selected&&f.push("selected"),!0===d.focused&&f.push("focused"),lc(u)&&f.push("editable"),function(e,t){if("scroll-area"===t)return!0;let n=(e.type??"").toLowerCase(),r=`${e.role??""} ${e.subrole??""}`.toLowerCase();return n.includes("scroll")||r.includes("scroll")}(d,u)&&f.push("scrollable"),p.shouldSummarize))?(f.push(`preview:"${e$(p.text).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`),f.push("truncated"),[...new Set(f)]):f).map(e=>` [${e}]`).join(""),v=w?` "${w}"`:"";return n?`${g}${y} [${h}]${b}`.trimEnd():`${g}${y} [${h}]${v}${b}`.trimEnd()}function ld(e,t){var n,r;let a,i=e.label?.trim();if(i&&(n=t,r=i,("scroll-area"===n||"list"===n||"collection"===n||"table"===n)&&(a=r.trim().toLowerCase())&&/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(a)))return"";let o=e.value?.trim();if(lc(t)){if(o)return o;if(i)return i}else if(i)return i;if(o)return o;let s=e.identifier?.trim();return!s||lp(s)&&("group"===t||"image"===t||"list"===t||"collection"===t)?"":s}function lu(e){var t;let n=e.replace(/XCUIElementType/gi,"").toLowerCase(),r=e.includes(".")&&(e.startsWith("android.")||e.startsWith("androidx.")||e.startsWith("com."));return(n.includes(".")&&(n=n.replace(/^android\.widget\./,"").replace(/^android\.view\./,"").replace(/^android\.webkit\./,"").replace(/^androidx\./,"").replace(/^com\.google\.android\./,"").replace(/^com\.android\./,""),r&&n.includes(".")&&(n=n.slice(n.lastIndexOf(".")+1))),"textview"===n)?r?"text":"text-view":(t=n,(Object.prototype.hasOwnProperty.call(lo,t)?lo[t]:void 0)||n||"element")}function lc(e){return"text-field"===e||"text-view"===e||"search"===e}function lp(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function lf(e,t){let n=lu(e.type??"Element"),r=ld(e,n),a=!1===e.enabled?"disabled":"enabled",i=!0===e.selected?"selected":"unselected",o=!0===e.hittable?"hittable":"not-hittable";return[String(t??e.depth??0),n,r,a,i,o].join("|")}function lh(e,t){return t.flatten?e.map(e=>({text:ll(e,0,!1),comparable:lf(e,0)})):ls(e).map(e=>({text:e.text,comparable:lf(e.node,e.depth)}))}function lm(e,t){return e.get(t)??0}function lw(e){return"text"===e||"label"===e||"any"===e}function lg(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function ly(e){return e.clock?.now()??Date.now()}async function lb(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}let lv=async(e,t)=>{var n;let r,a,i=await lA(e,t);return await e.sessions.set(lx(t.session,i)),{nodes:i.snapshot.nodes,truncated:i.snapshot.truncated??!1,visibility:function(e){var t;let{nodes:n,backend:r,snapshotRaw:a}=e;if(a||"macos-helper"===(t=r)||"linux-atspi"===t)return{partial:!1,visibleNodeCount:n.length,totalNodeCount:n.length,reasons:[]};let i=nR(n),o=new Set;return i.hiddenCount>0&&o.add("offscreen-nodes"),i.nodes.some(e=>e.hiddenContentAbove)&&o.add("scroll-hidden-above"),i.nodes.some(e=>e.hiddenContentBelow)&&o.add("scroll-hidden-below"),{partial:o.size>0,visibleNodeCount:i.nodes.length,totalNodeCount:n.length,reasons:[...o]}}({nodes:i.snapshot.nodes,backend:i.snapshot.backend,snapshotRaw:t.raw}),...i.result.androidSnapshot?{androidSnapshot:i.result.androidSnapshot}:{},...i.warnings.length>0?{warnings:i.warnings}:{},...(r=(n=i).result.appName??n.session?.appName,a=n.result.appBundleId??n.session?.appBundleId,{...r||a?{appName:r??a}:{},...a?{appBundleId:a}:{}})}},lI=async(e,t)=>{let n=await lA(e,t),r=!0===t.interactiveOnly,a=n.session?.snapshot,i=lx(t.session,n);if(!a){let t=function(e,t={}){return lh(e,t).length}(n.snapshot.nodes,{flatten:r});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 o=function(e,t,n={}){let r=function(e,t){let n=e.length,r=t.length,a=n+r,i=new Map,o=[];i.set(1,0);for(let s=0;s<=a;s+=1){o.push(new Map(i));for(let a=-s;a<=s;a+=2){let l=a===-s||a!==s&&lm(i,a-1)<lm(i,a+1)?lm(i,a+1):lm(i,a-1)+1,d=l-a;for(;l<n&&d<r&&e[l].comparable===t[d].comparable;)l+=1,d+=1;if(i.set(a,l),l>=n&&d>=r)return function(e,t,n,r,a){let i=[],o=r,s=a;for(let r=e.length-1;r>=0;r-=1){let a=e[r],l=o-s,d=l===-r||l!==r&&lm(a,l-1)<lm(a,l+1)?l+1:l-1,u=lm(a,d),c=u-d;for(;o>u&&s>c;)i.push({kind:"unchanged",text:n[s-1].text}),o-=1,s-=1;if(0===r)break;o===u?(i.push({kind:"added",text:n[c].text}),s=c):(i.push({kind:"removed",text:t[u].text}),o=u)}return i.reverse(),i}(o,e,t,n,r)}}return[]}(lh(e,n),lh(t,n)),a={additions:0,removals:0,unchanged:0};for(let e of r)"added"===e.kind&&(a.additions+=1),"removed"===e.kind&&(a.removals+=1),"unchanged"===e.kind&&(a.unchanged+=1);return{summary:a,lines:r}}(a.nodes,n.snapshot.nodes,{flatten:r});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!1,summary:o.summary,lines:o.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function lA(e,t){var n,r,a,i,o;let s,l,d,u,c,p;if(!e.backend.captureSnapshot)throw new y("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let f=t.session??"default",h=await e.sessions.get(f),m=await e.backend.captureSnapshot({session:f,requestId:t.requestId,appId:h?.appId,appBundleId:h?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,compact:t.compact,depth:t.depth,scope:t.scope,raw:t.raw}),w=(n=m,r=e,n.snapshot?n.snapshot:{nodes:n.nodes??[],truncated:n.truncated,backend:n.backend,createdAt:ly(r)}),g=ly(e);return{snapshot:w,result:m,session:h,warnings:(s=[...(a={result:m,snapshot:w,options:t,session:h,capturedAt:w.createdAt??g,runtimeNow:g}).result.warnings??[]],l=!0===a.options.interactiveOnly,d=a.result.analysis,"android"===a.snapshot.backend&&l&&0===a.snapshot.nodes.length&&d&&(d.rawNodeCount??0)>=12&&(s.push(`Interactive snapshot is empty after filtering ${d.rawNodeCount} raw Android nodes. Likely causes: depth too low, transient route change, or collector filtering.`),"number"==typeof a.options.depth&&"number"==typeof d.maxDepth&&d.maxDepth>=a.options.depth+2&&s.push(`Interactive output is empty at depth ${a.options.depth}; retry without -d.`)),c=!!(u=a.session?.snapshot)&&[a.capturedAt,a.runtimeNow].some(e=>{let t=e-u.createdAt;return t>=0&&t<=2e3}),!a.result.freshness&&u&&c&&(i=u.nodes.length,o=a.snapshot.nodes.length,!(i<12)&&o<=Math.floor(.2*i))&&s.push("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."),p=a.result.freshness,p?.staleAfterRetries&&"android"===a.snapshot.backend&&("stuck-route"===p.reason?s.push(`Recent ${p.action} was followed by a nearly identical snapshot after ${p.retryCount} automatic retr${1===p.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"===p.reason&&s.push("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.")),Array.from(new Set(s)))}}function lx(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}}function lS(e){return["visible","hidden","exists","editable","selected","text"].includes(e)}function lN(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 l_(e,t){let n=t??"default",r=await e.sessions.get(n);if(!r)throw new y("SESSION_NOT_FOUND","No active session. Run open first.");if(!r.snapshot)throw new y("INVALID_ARGS","No snapshot in session. Run snapshot first.");return{sessionName:n,session:r,snapshot:r.snapshot}}async function lk(e,t,n={updateSession:!0}){if(!e.backend.captureSnapshot)throw new y("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let r=t.session??"default",a=await e.sessions.get(r),i=await e.backend.captureSnapshot(lg(e,t),{interactiveOnly:!1,compact:!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw}),o=i.snapshot??{nodes:i.nodes??[],truncated:i.truncated,backend:i.backend,createdAt:ly(e)};return n.updateSession&&a&&await e.sessions.set({...a,snapshot:o}),{sessionName:r,session:a,snapshot:o}}async function lM(e,t,n){if(e.backend.readText){let r=await e.backend.readText(lg(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return eX(n)}let lE=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 lF(e,t,n);let r=await lk(e,t,{updateSession:!0,scope:lw(n)?t.query:void 0}),a=eJ(r.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0];if(!a)throw new y("COMMAND_FAILED","find did not match any element");if("exists"===t.action)return{kind:"found",found:!0};let i=`@${a.ref}`;return"get_attrs"===t.action?{kind:"attrs",ref:i,node:a}:{kind:"text",ref:i,text:await lM(e,r,a),node:a}},lD=async(e,t)=>{if("ref"===t.target.kind){let n=await l_(e,t.session),r=function(e,t,n){let r=ei(t);if(!r)throw new y("INVALID_ARGS",n.invalidRefMessage);let a=ea(e,r)??(n.fallbackLabel.length>0?eB(e,n.fallbackLabel):null);if(!a)throw new y("COMMAND_FAILED",n.notFoundMessage);return{ref:r,node:a}}(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`}),a=eU(r.node,e.backend.platform,{action:"get"}),i={kind:"ref",ref:`@${r.ref}`};return"attrs"===t.property?{kind:"attrs",target:i,node:r.node,selectorChain:a}:{kind:"text",target:i,text:await lM(e,n,r.node),node:r.node,selectorChain:a}}let n=await lB(e,t,t.session??"default",{selector:t.target.selector,disambiguateAmbiguous:"text"===t.property}),r=eU(n.node,e.backend.platform,{action:"get"});if("attrs"===t.property)return{kind:"attrs",target:{kind:"selector",selector:n.selector},node:n.node,selectorChain:r};let a=await lM(e,n.capture,n.node);return{kind:"text",target:{kind:"selector",selector:n.selector},text:a,node:n.node,selectorChain:r}},lO=async(e,t)=>{let n=await lD(e,{...t,property:"text",target:t.target});if("text"!==n.kind)throw new y("COMMAND_FAILED","getText returned non-text result");return n},lC=async(e,t)=>{let n=await lD(e,{...t,property:"attrs",target:t.target});if("attrs"!==n.kind)throw new y("COMMAND_FAILED","getAttrs returned non-attrs result");return n},lR=async(e,t)=>{if(!lS(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 n=await lk(e,t,{updateSession:!0}),r=eR(t.selector);if("exists"===t.predicate){let a=eH(n.snapshot.nodes,r,{platform:e.backend.platform});if(!a)throw new y("COMMAND_FAILED",eY(r,[],{unique:!1}));return{predicate:t.predicate,pass:!0,selector:a.selector.raw,matches:a.matches,selectorChain:r.selectors.map(e=>e.raw)}}let a=eK(n.snapshot.nodes,r,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!a)throw new y("COMMAND_FAILED",eY(r,[],{unique:!0}));let i=function(e){let{predicate:t,node:n,nodes:r,expectedText:a,platform:i}=e,o=eO(n),s=eT(n,i),l=!0===n.selected,d="text"===t?eP(n):function(e,t){if(!0===e.hittable)return!0;if(lN(e.rect))return nT(e,t);if(e.rect)return!1;let n=function(e,t){let n=new Map(t.map(e=>[e.index,e])),r=e,a=new Set;for(;"number"==typeof r.parentIndex&&!a.has(r.index);){a.add(r.index);let e=n.get(r.parentIndex);if(!e)break;if(function(e){let t=ez(e.type??"");return!(t.includes("application")||t.includes("window")||t.includes("scrollview")||t.includes("tableview")||t.includes("collectionview"))&&"table"!==t&&"list"!==t&&"listview"!==t&&(!0===e.hittable||lN(e.rect))}(e))return e;r=e}return null}(e,t);return!!n&&(!0===n.hittable||!!lN(n.rect)&&nT(n,t))}(n,r),u=!1;switch(t){case"visible":u=d;break;case"hidden":u=!d;break;case"editable":u=s;break;case"selected":u=l;break;case"text":u=o===(a??"")}let c="text"===t?`expected="${a??""}" actual="${o}"`:`actual=${JSON.stringify({visible:d,editable:s,selected:l})}`;return{pass:u,actualText:o,details:c}}({predicate:t.predicate,node:a.node,nodes:n.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!i.pass)throw new y("COMMAND_FAILED",`is ${t.predicate} failed for selector ${a.selector.raw}: ${i.details}`);return{predicate:t.predicate,pass:!0,selector:a.selector.raw,..."text"===t.predicate?{text:i.actualText}:{},selectorChain:r.selectors.map(e=>e.raw)}},lP=async(e,t)=>await lR(e,{...t,predicate:"visible",selector:t.target.selector}),lT=async(e,t)=>await lR(e,{...t,predicate:"hidden",selector:t.target.selector}),lL=async(e,t)=>{if("sleep"===t.target.kind)return await lb(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let n=await l_(e,t.session),r=ei(t.target.ref);if(!r)throw new y("INVALID_ARGS",`Invalid ref: ${t.target.ref}`);let a=ea(n.snapshot.nodes,r),i=a?ej(a,n.snapshot.nodes):void 0;if(!i)throw new y("COMMAND_FAILED",`Ref ${t.target.ref} not found or has no label`);return await lG(e,t,i,t.target.timeoutMs)}if("selector"===t.target.kind)return await lU(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new y("INVALID_ARGS","wait requires text");return await lG(e,t,t.target.text,t.target.timeoutMs)},l$=async(e,t)=>{let n=await lL(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 lF(e,t,n){let r=t.timeoutMs??1e4,a=ly(e);for(;ly(e)-a<r;){if(eJ((await lk(e,t,{updateSession:!0,scope:lw(n)?t.query:void 0})).snapshot.nodes,n,t.query,{requireRect:!1}).matches[0])return{kind:"found",found:!0,waitedMs:ly(e)-a};await lb(e,300)}throw new y("COMMAND_FAILED","find wait timed out")}async function lU(e,t,n,r){let a=r??1e4,i=ly(e),o=eR(n);for(;ly(e)-i<a;){let n=eH((await lk(e,t,{updateSession:!0})).snapshot.nodes,o,{platform:e.backend.platform});if(n)return{kind:"selector",selector:n.selector.raw,waitedMs:ly(e)-i};await lb(e,300)}throw new y("COMMAND_FAILED",`wait timed out for selector: ${n}`)}async function lG(e,t,n,r){let a=r??1e4,i=ly(e);for(;ly(e)-i<a;){if(e.backend.findText?(await e.backend.findText(lg(e,t),n)).found:await lV(e,t,n))return{kind:"text",text:n,waitedMs:ly(e)-i};await lb(e,300)}throw new y("COMMAND_FAILED",`wait timed out for text: ${n}`)}async function lV(e,t,n){return!!eB((await lk(e,t,{updateSession:!0})).snapshot.nodes,n)}async function lB(e,t,n,r){let a=await lk(e,{...t,session:n},{updateSession:!0}),i=eR(r.selector),o=eK(a.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:r.disambiguateAmbiguous});if(!o)throw new y("COMMAND_FAILED",eY(i,[],{unique:!0}));return{capture:a,node:o.node,selector:o.selector.raw,ref:`@${o.node.ref}`}}function lj(e){let t=lq(e);if(!t)return null;let n=eo(t);return Number.isFinite(n.x)&&Number.isFinite(n.y)?n:null}function lq(e){if(!e)return null;let t=Number(e.x),n=Number(e.y),r=Number(e.width),a=Number(e.height);return Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r)&&Number.isFinite(a)&&!(r<0)&&!(a<0)?{x:t,y:n,width:r,height:a}:null}let lX=["button","link","menuitem","tabitem","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"];function lH(e,t){var n;let r=function(e,t){let n=lq(t.rect);if(!n)return null;let r=t,a=new Set;for(;!a.has(r.ref);){a.add(r.ref);let t=e.filter(e=>{if(e.parentIndex!==r.index||!e.hittable)return!1;let t=lq(e.rect);return!!t&&lz(t,n)});if(1!==t.length)break;r=t[0]}return r===t?null:r}(e,t);if(r?.rect&&lj(r.rect))return{node:r,reason:"same-rect-descendant"};if([(n=t).type,n.role,n.subrole].map(e=>ez(e??"")).some(lK)&&t.rect&&lj(t.rect))return{node:t,reason:"semantic-target"};let a=eF(e,t);return a?.rect&&lj(a.rect)?!function(e,t,n){var r,a,i,o;let s,l,d,u=lq(e.rect),c=lq(t.rect);if(!u||!c)return!1;let p=function(e,t){let n=eo(t),r=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>lq(e.rect)).filter(e=>null!==e);if(0===r.length)return null;let a=r.filter(e=>nM(e,n.x,n.y));return nE(a.length>0?a:r)}(n,u);return!!p&&(r=c,a=p,s=(i=r,o=a,Math.max(0,Math.min(i.x+i.width,o.x+o.width)-Math.max(i.x,o.x))*Math.max(0,Math.min(i.y+i.height,o.y+o.height)-Math.max(i.y,o.y))),l=r.width*r.height,d=a.width*a.height,!(s<=0)&&!(l<=0)&&!(d<=0)&&!!(s/d>=.9)&&!!(s/l>=.8))&&!lz(u,c)}(t,a,e)?{node:a,reason:"hittable-ancestor"}:{node:t,reason:"overly-broad-ancestor"}:{node:t,reason:"original"}}function lK(e){return"tab"===e||lX.some(t=>e.includes(t))}function lz(e,t){return .5>=Math.abs(e.x-t.x)&&.5>=Math.abs(e.y-t.y)&&.5>=Math.abs(e.width-t.width)&&.5>=Math.abs(e.height-t.height)}async function lY(e,t,n){if(await lJ(e,t,n.action),"point"===t.target.kind)return{kind:"point",point:{x:t.target.x,y:t.target.y}};if("ref"===t.target.kind){let r=await lQ(e,t,t.target),a=r.resolved,i=n.promoteToHittableAncestor?lH(r.snapshot.nodes,a.node).node:a.node;return function(e,t,n,r){let a=e.rect?nL(e,t):null;if(!(!e.rect||!a||nT(e,t)))throw new y("COMMAND_FAILED",`Ref ${n} is off-screen and not safe to ${r}`,{reason:"offscreen_ref",ref:ei(n),rect:e.rect,viewport:a,hint:`Use scroll with the direction from the off-screen summary, take a fresh snapshot, then retry ${r} with the new ref or a selector.`})}(i,r.snapshot.nodes,t.target.ref,n.action),{kind:"ref",point:l1(i,`Ref ${t.target.ref} not found or has invalid bounds`),target:{kind:"ref",ref:`@${a.ref}`},node:i,selectorChain:eU(i,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:ej(i,r.snapshot.nodes)}}let r=await lW(e,t,n.requireInteractive),a=eR(t.target.selector),i=eK(r.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(!i||!i.node.rect)throw new y("COMMAND_FAILED",eY(a,i?.diagnostics??[],{unique:!0}));let o=n.promoteToHittableAncestor?lH(r.snapshot.nodes,i.node).node:i.node;return{kind:"selector",point:l1(o,`Selector ${i.selector.raw} resolved to invalid bounds`),target:{kind:"selector",selector:i.selector.raw},node:o,selectorChain:eU(o,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:ej(o,r.snapshot.nodes)}}async function lW(e,t,n){if(!e.backend.captureSnapshot)throw new y("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let r=t.session??"default",a=await e.sessions.get(r);if(!a)throw new y("SESSION_NOT_FOUND","No active session. Run open first.");let i=await e.backend.captureSnapshot(lg(e,t),{interactiveOnly:n,compact:n}),o=i.snapshot??{nodes:i.nodes??[],truncated:i.truncated,backend:i.backend,createdAt:ly(e)};return await e.sessions.set({...a,snapshot:o}),{snapshot:o}}async function lJ(e,t,n){if("macos"!==e.backend.platform)return;let r=await lZ(e,t);if(("desktop"===r||"menubar"===r)&&("menubar"!==r||"click"!==n&&"press"!==n))throw new y("UNSUPPORTED_OPERATION",`${n} is not supported on macOS ${r} sessions yet. Open an app session to act, or use the ${r} surface to inspect.`)}async function lZ(e,t){let n=await e.sessions.get(t.session??"default");return n?.metadata?.surface}async function lQ(e,t,n){let r=t.session??"default",a=await e.sessions.get(r);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.");let i=n.fallbackLabel??"",o=l0(a.snapshot.nodes,n.ref,{fallbackLabel:i,requireRect:!0});if(o)return{snapshot:a.snapshot,resolved:o};let s=await lW(e,t,!0),l=l0(s.snapshot.nodes,n.ref,{fallbackLabel:i,requireRect:!0});if(!l)throw new y("COMMAND_FAILED",`Ref ${n.ref} not found or has no bounds`);return{...s,resolved:l}}function l0(e,t,n){let r=ei(t);if(!r)throw new y("INVALID_ARGS",`Invalid ref: ${t}`);let a=ea(e,r);if(l2(a,n.requireRect))return{ref:r,node:a};let i=n.fallbackLabel.length>0?eB(e,n.fallbackLabel):null;return l2(i,n.requireRect)?{ref:r,node:i}:null}function l1(e,t){if(!e.rect)throw new y("COMMAND_FAILED",t);let n=eo(e.rect);if(!Number.isFinite(n.x)||!Number.isFinite(n.y))throw new y("COMMAND_FAILED",t);return n}function l2(e,t){if(!e)return!1;if(!t)return!0;if(!e.rect)return!1;let{x:n,y:r,width:a,height:i}=e.rect;if(!Number.isFinite(Number(n))||!Number.isFinite(Number(r))||!Number.isFinite(Number(a))||!Number.isFinite(Number(i))||0>Number(a)||0>Number(i))return!1;let o=eo(e.rect);return Number.isFinite(o.x)&&Number.isFinite(o.y)}async function l3(e,t){let n=t.target??{kind:"viewport"};return"viewport"===n.kind?(await lJ(e,t,"scroll"),{kind:"viewport"}):await lY(e,{...t,target:n},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function l4(e,t){if(t.from){var n;if("x"in(n=t.from)&&"y"in n)return await lJ(e,t,"swipe"),{point:l8(t.from,"from")};let r=await lY(e,{...t,target:t.from},{action:"swipe",requireInteractive:!1,promoteToHittableAncestor:!1});return{point:r.point,target:r}}if(!t.direction)throw new y("INVALID_ARGS","swipe requires from+to or a direction");return await lJ(e,t,"swipe"),{point:eo(function(e){let t=e.filter(t=>nT(t,e)).map(e=>e.rect).filter(l9),n=t.length>0?t:e.map(e=>e.rect).filter(l9);if(0===n.length)throw new y("COMMAND_FAILED","Cannot infer viewport for directional swipe");let r=Math.min(...n.map(e=>e.x)),a=Math.min(...n.map(e=>e.y));return{x:r,y:a,width:Math.max(...n.map(e=>e.x+e.width))-r,height:Math.max(...n.map(e=>e.y+e.height))-a}}((await lW(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}function l5(e,t){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new y("INVALID_ARGS",`${t} must be up, down, left, or right`)}}function l8(e,t){let n=Number(e.x),r=Number(e.y);if(!Number.isFinite(n)||!Number.isFinite(r))throw new y("INVALID_ARGS",`${t} point requires finite x and y`);return{x:n,y:r}}function l6(e,t){if(!Number.isFinite(e)||e<=0)throw new y("INVALID_ARGS",`${t} must be a positive number`);return e}function l9(e){return!!(e&&e.width>0&&e.height>0)}function l7(e){return e&&"object"==typeof e?e:void 0}async function de(e,t,n){let r=await lY(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 a=dt(await e.backend.tap(lg(e,t),r.point,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap}));return{...r,...a?{backendResult:a}:{}}}function dt(e){return e&&"object"==typeof e?e:void 0}function dn(e){return!!(e&&"object"==typeof e)}function dr(e){return e&&"object"==typeof e?e:void 0}let da=/^[A-Za-z0-9_.:-]{1,64}$/;function di(e,t){if(void 0!==e)return ds(e,t)}function ds(e,t){let n=e?.trim();if(!n)throw new y("INVALID_ARGS",`${t} must be a non-empty string`);return n}async function dl(e,t){if(!t||"object"!=typeof t)throw new y("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return dd(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let n=await sw(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:n.path},inputKind:"file",...n.cleanup?{cleanup:n.cleanup}:{}}}function dd(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 du(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function dc(e){return e&&"object"==typeof e?e:void 0}async function dp(e,t,n){let r="reinstall"===n?"reinstallApp":"installApp",a=e.backend[r];if(!a)throw new y("UNSUPPORTED_OPERATION",`admin.${n} is not supported by this backend`);let i="app"in t&&void 0!==t.app?dg(t.app,"app"):void 0;if("installFromSource"!==n&&!i)throw new y("INVALID_ARGS",`admin.${n} requires app`);let o=lg(e,t),s=await df(e,o,t.source);try{var l,d,u,c,p;let t,r,f,h,m,w,g,y,b=await a.call(e.backend,o,{...i?{app:i}:{},source:s.source});return l=n,d=i,u=s.source,c=b,t=db(c),r=dy(c,"appName"),f=dy(c,"appId"),h=dy(c,"bundleId"),m=dy(c,"packageName"),w=dy(c,"launchTarget"),g=dy(c,"installablePath"),y=dy(c,"archivePath"),{kind:"reinstall"===l?"appReinstalled":"installFromSource"===l?"appInstalledFromSource":"appInstalled",...d?{app:d}:{},source:u,...f?{appId:f}:{},...r?{appName:r}:{},...h?{bundleId:h}:{},...m?{packageName:m}:{},...w?{launchTarget:w}:{},...g?{installablePath:g}:{},...y?{archivePath:y}:{},...t?{backendResult:t}:{},...eM(`${"reinstall"===l?"Reinstalled":"Installed"}: ${r??w??d??(p=u,"path"===p.kind?p.path:"uploadedArtifact"===p.kind?p.id:p.url)}`)}}finally{await s.cleanup?.()}}async function df(e,t,n){let r=dm(n),a=await dh(e,r);try{let n=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,a.source):a.source;return{source:dm(n),...a.cleanup?{cleanup:a.cleanup}:{}}}catch(e){if(a.cleanup)try{await a.cleanup()}catch{}throw e}}async function dh(e,t){if("url"===t.kind)return{source:t};let n=await sw(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function dm(e){if(!e||"object"!=typeof e)throw new y("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:dg(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:dg(e.id,"source.id")};if("url"===e.kind){let t=dg(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 dw(e,t){if(void 0!==e)return dg(e,t)}function dg(e,t){let n=e?.trim();if(!n)throw new y("INVALID_ARGS",`${t} must be a non-empty string`);return n}function dy(e,t){let n=e[t];return"string"==typeof n&&n.length>0?n:void 0}function db(e){return e&&"object"==typeof e?e:void 0}function dv(e,t){if("start"===e||"stop"===e)return e;throw new y("INVALID_ARGS",`${t} action must be start or stop`)}function dI(e,t,n,r){return{kind:"start"===e?r.startKind:r.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...eM("start"===e?r.startMessage:r.stopMessage)}}let dA=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,dx=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function dS(e){var t,n;let r=!1,a=e;return{value:(t=a=(a=(a=(a=(a=a.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,t)=>(r=!0,`${String(t)}=[REDACTED]`))).replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,t,n,a)=>(r=!0,`${String(t)}[REDACTED]${String(a)}`))).replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,t)=>(r=!0,`${String(t)}[REDACTED]`))).replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,t)=>(r=!0,`${String(t)}[REDACTED]`))).replaceAll(dx,()=>(r=!0,"[REDACTED]")),n=()=>{r=!0},a=/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(t)?t.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let t=dN(e);return t?(t.redacted&&n(),t.value):e}):t),redacted:r}}function dN(e){try{let t=new URL(e),n=function(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))dA.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 d_=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function dk(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[r,a]of Object.entries(e))if(d_.test(r))n[r]="[REDACTED]",t=!0;else{let e=dO(a,2048);n[r]=e.value??"",t||=e.redacted}return{value:n,redacted:t}}function dM(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),n=dD(t,dS);return dC(JSON.stringify(n.value),2048,n.redacted)}catch{return}}(e)??dO(e,2048)}function dE(e){return dD(e,e=>dO(e,2048))}function dD(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 r=dD(e,t);return n||=r.redacted,r.value}),redacted:n}}let n=!1,r={};for(let[a,i]of Object.entries(e)){if(d_.test(a)){r[a]="[REDACTED]",n=!0;continue}let e=dD(i,t);r[a]=e.value,n||=e.redacted}return{value:r,redacted:n}}function dO(e,t){if(void 0===e)return{redacted:!1};let n=dS(e);return dC(n.value,t,n.redacted)}function dC(e,t,n){if(void 0===e)return{redacted:n};let r=e;return r.length>t&&(r=`${r.slice(0,t)}...[truncated]`,n=!0),{value:r,redacted:n}}async function dR(e,t){let n=lg(e,t),r=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??r?.appId?{appId:t.appId??r?.appId}:{},...t.appBundleId??r?.appBundleId?{appBundleId:t.appBundleId??r?.appBundleId}:{}}}function dP(e,t,n,r){return{...dT(e),...void 0!==e.cursor?{cursor:d$(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:i9(e.limit,r,1,n)}}function dT(e){return{...void 0!==e.since?{since:d$(e.since,"since")}:{},...void 0!==e.until?{until:d$(e.until,"until")}:{}}}function dL(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)=>d$(e,`${t}[${n}]`))}function d$(e,t){let n=e.trim();if(!n)throw new y("INVALID_ARGS",`${t} must be a non-empty string`);return n}let dF=sb,dU=s9,dG=lv,dV=lI,dB=lE,dj=lD,dq=lO,dX=lC,dH=lR,dK=lP,dz=lT,dY=lL,dW=l$,dJ=async(e,t)=>await de(e,t,"click"),dZ=async(e,t)=>await de(e,t,"press"),dQ=async(e,t)=>{var n;if(!t.text)throw new y("INVALID_ARGS","fill requires text");let r=await lY(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 a=dt(await e.backend.fill(lg(e,t),r.point,t.text,{delayMs:t.delayMs})),i="node"in r?r.node.type??"":"",o=i&&!eW(i,e.backend.platform)?`fill target ${n=r,n.target?.kind==="ref"?n.target.ref:n.target?.kind==="selector"?n.target.selector:"point"} resolved to "${i}", attempting fill anyway.`:void 0;return{...r,text:t.text,...o?{warning:o}:{},...a?{backendResult:a}:{}}},d0=async(e,t)=>{let n=t.text;if(!n)throw new y("INVALID_ARGS","type requires text");let r=function(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}(n);if(r)throw new y("INVALID_ARGS",`type does not accept a target ref like "${r}"`,{hint:`Use fill ${r} "text" to target that field, or press ${r} then type "text" to append.`});if(!e.backend.typeText)throw new y("UNSUPPORTED_OPERATION","type is not supported by this backend");let a=i9(t.delayMs??0,"delay-ms",0,1e4),i=dt(await e.backend.typeText(lg(e,t),n,{delayMs:a}));return{kind:"text",text:n,delayMs:a,...i?{backendResult:i}:{},...eM(`Typed ${Array.from(n).length} chars`)}},d1=async(e,t)=>{let n=await lY(e,t,{action:"focus",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new y("UNSUPPORTED_OPERATION","focus is not supported by this backend");let r=l7(await e.backend.focus(lg(e,t),n.point));return{...n,...r?{backendResult:r}:{},...eM(`Focused (${n.point.x}, ${n.point.y})`)}},d2=async(e,t)=>{let n=await lY(e,t,{action:"longPress",requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.longPress)throw new y("UNSUPPORTED_OPERATION","longPress is not supported by this backend");let r=void 0===t.durationMs?void 0:i9(t.durationMs,"durationMs",0,12e4),a=l7(await e.backend.longPress(lg(e,t),n.point,{durationMs:r}));return{...n,...void 0!==r?{durationMs:r}:{},...a?{backendResult:a}:{},...eM(`Long pressed (${n.point.x}, ${n.point.y})`)}},d3=async(e,t)=>{if(!e.backend.swipe)throw new y("UNSUPPORTED_OPERATION","swipe is not supported by this backend");let n=await l4(e,t),r=function(e,t){if(t.to)return{point:l8(t.to,"to")};let n=l5(t.direction,"swipe direction"),r=l6(t.distance??200,"swipe distance");switch(n){case"up":return{point:{x:e.x,y:e.y-r},direction:n,distance:r};case"down":return{point:{x:e.x,y:e.y+r},direction:n,distance:r};case"left":return{point:{x:e.x-r,y:e.y},direction:n,distance:r};case"right":return{point:{x:e.x+r,y:e.y},direction:n,distance:r}}}(n.point,t),a=void 0===t.durationMs?void 0:i9(t.durationMs,"durationMs",16,1e4),i=l7(await e.backend.swipe(lg(e,t),n.point,r.point,{durationMs:a}));return{kind:"swipe",from:n.point,to:r.point,...r.direction?{direction:r.direction}:{},...void 0!==r.distance?{distance:r.distance}:{},...void 0!==a?{durationMs:a}:{},...n.target?{fromTarget:n.target}:{},...i?{backendResult:i}:{},...eM("Swiped")}},d4=async(e,t)=>{var n,r;if(!e.backend.scroll)throw new y("UNSUPPORTED_OPERATION","scroll is not supported by this backend");let a=l5(t.direction,"scroll direction"),i=(n=t.amount,r="scroll amount",void 0===n?void 0:l6(n,r)),o=function(e,t){if(void 0!==e){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new y("INVALID_ARGS",`${t} must be a positive integer`);return e}}(t.pixels,"scroll pixels");if(void 0!==i&&void 0!==o)throw new y("INVALID_ARGS","scroll accepts either amount or pixels, not both");let s=await l3(e,t),l="viewport"===s.kind?{kind:"viewport"}:{kind:"point",point:s.point},d=l7(await e.backend.scroll(lg(e,t),l,{direction:a,...void 0!==i?{amount:i}:{},...void 0!==o?{pixels:o}:{}}));return{...s,direction:a,...void 0!==i?{amount:i}:{},...void 0!==o?{pixels:o}:{},...d?{backendResult:d}:{},...eM(void 0!==o?`Scrolled ${a} by ${o}px`:void 0!==i?`Scrolled ${a} by ${i}`:`Scrolled ${a}`)}},d5=async(e,t)=>{if(!e.backend.pinch)throw new y("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await lJ(e,t,"pinch");let n=l6(t.scale,"pinch scale"),r=t.center?await lY(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,a=l7(await e.backend.pinch(lg(e,t),{scale:n,...r?{center:r.point}:{}}));return{kind:"pinch",scale:n,...r?{center:r.point,centerTarget:r}:{},...a?{backendResult:a}:{},...eM(`Pinched to scale ${n}`)}},d8=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 r=dr(await e.backend.pressBack(lg(e,t),{mode:n}));return{kind:"systemBack",mode:n,...r?{backendResult:r}:{},...eM("Back")}},d6=async(e,t={})=>{if(!e.backend.pressHome)throw new y("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let n=dr(await e.backend.pressHome(lg(e,t)));return{kind:"systemHome",...n?{backendResult:n}:{},...eM("Home")}},d9=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),r=dr(await e.backend.rotate(lg(e,t),n));return{kind:"systemRotated",orientation:n,...r?{backendResult:r}:{},...eM(`Rotated to ${n}`)}},d7=async(e,t={})=>{if(!e.backend.setKeyboard)throw new y("UNSUPPORTED_OPERATION","system.keyboard is not supported by this backend");let n=t.action??"status";if("status"!==n&&"get"!==n&&"dismiss"!==n)throw new y("INVALID_ARGS","system.keyboard action must be status, get, or dismiss");let r=await e.backend.setKeyboard(lg(e,t),{action:n}),a=dr(r);if("dismiss"===n){let e=dn(r)?r.dismissed:void 0;return{kind:"keyboardDismissed",action:n,state:dn(r)?r:{},...a?{backendResult:a}:{},...eM(!1===e?"Keyboard already hidden":"Keyboard dismissed")}}return{kind:"keyboardState",action:n,state:dn(r)?r:{},...a?{backendResult:a}:{}}},ue=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(lg(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=dr(await e.backend.setClipboard(lg(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...eM("Clipboard updated")}},ut=async(e,t={})=>{if(!e.backend.openSettings)throw new y("UNSUPPORTED_OPERATION","system.settings is not supported by this backend");let n=function(e,t){if(void 0===e)return;let n=e.trim();if(!n)throw new y("INVALID_ARGS",`${t} must be a non-empty string`);return n}(t.target,"target"),r=dr(await e.backend.openSettings(lg(e,t),n));return{kind:"settingsOpened",...n?{target:n}:{},...r?{backendResult:r}:{},...eM(n?`Opened settings: ${n}`:"Opened settings")}},un=async(e,t={})=>{if(!e.backend.handleAlert)throw new y("UNSUPPORTED_OPERATION","system.alert is not supported by this backend");let n=t.action??"get";if("get"!==n&&"accept"!==n&&"dismiss"!==n&&"wait"!==n)throw new y("INVALID_ARGS","system.alert action must be get, accept, dismiss, or wait");let r=void 0===t.timeoutMs?void 0:i9(t.timeoutMs,"timeoutMs",0,12e4),a=await e.backend.handleAlert(lg(e,t),n,{timeoutMs:r});var i=n,o=a;if("get"===i){if("alertStatus"!==o.kind)throw new y("COMMAND_FAILED","system.alert get returned an invalid backend result");return{kind:"alertStatus",action:i,alert:o.alert}}if("wait"===i){if("alertWait"!==o.kind)throw new y("COMMAND_FAILED","system.alert wait returned an invalid backend result");return{kind:"alertWait",action:i,alert:o.alert,...void 0!==o.waitedMs?{waitedMs:o.waitedMs}:{},...void 0!==o.timedOut?{timedOut:o.timedOut}:{},...eM(o.alert?"Alert visible":"Alert wait timed out")}}if("alertHandled"!==o.kind)throw new y("COMMAND_FAILED",`system.alert ${i} returned an invalid backend result`);return{kind:"alertHandled",action:i,handled:o.handled,...o.alert?{alert:o.alert}:{},...o.button?{button:o.button}:{},...eM(o.handled?`Alert ${i}ed`:"No alert handled")}},ur=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new y("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let n=dr(await e.backend.openAppSwitcher(lg(e,t)));return{kind:"appSwitcherOpened",...n?{backendResult:n}:{},...eM("Opened app switcher")}},ua=async(e,t)=>{var n;if(!e.backend.openApp)throw new y("UNSUPPORTED_OPERATION","apps.open is not supported by this backend");let r=function(e){var t;let n=di(e.app,"app"),r=di(e.appId,"appId"),a=di(e.bundleId,"bundleId"),i=di(e.packageName,"packageName"),o=di(e.url,"url"),s=di(e.activity,"activity"),l={...n?{app:n}:{},...r?{appId:r}:{},...a?{bundleId:a}:{},...i?{packageName:i}:{},...o?{url:o}:{},...s?{activity:s}:{}};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),a=dc(await e.backend.openApp(du(e,t),r,{relaunch:t.relaunch}));return{kind:"appOpened",target:r,relaunch:!0===t.relaunch,...a?{backendResult:a}:{},...eM(`Opened: ${(n=r).app??n.appId??n.bundleId??n.packageName??n.url??n.activity??"app"}`)}},ui=async(e,t={})=>{if(!e.backend.closeApp)throw new y("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let n=di(t.app,"app"),r=dc(await e.backend.closeApp(du(e,t),n));return{kind:"appClosed",...n?{app:n}:{},...r?{backendResult:r}:{},...eM(n?`Closed: ${n}`:"Closed app")}},uo=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(du(e,t),t.filter??"all")}},us=async(e,t)=>{if(!e.backend.getAppState)throw new y("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let n=ds(t.app,"app"),r=await e.backend.getAppState(du(e,t),n);return{kind:"appState",app:n,state:r}},ul=async(e,t)=>{if(!e.backend.pushFile)throw new y("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let n=ds(t.app,"app"),r=await dl(e,t.input);try{let a=await e.backend.pushFile(du(e,t),r.backendInput,n),i=dc(a);return{kind:"appPushed",app:n,inputKind:r.inputKind,...i?{backendResult:i}:{},...eM(`Pushed to ${n}`)}}finally{await r.cleanup?.()}},ud=async(e,t)=>{var n,r;if(!e.backend.triggerAppEvent)throw new y("UNSUPPORTED_OPERATION","apps.triggerEvent is not supported by this backend");let a=function(e){let t=ds(e,"name");if(!da.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,r=`apps.triggerEvent payload for "${a}"`,void 0!==n&&dd(n,r,8192);let i=dc(await e.backend.triggerAppEvent(du(e,t),{name:a,...t.payload?{payload:t.payload}:{}}));return{kind:"appEventTriggered",name:a,...t.payload?{payload:t.payload}:{},...i?{backendResult:i}:{},...eM(`Triggered app event: ${a}`)}},uu=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(lg(e,t),t.filter)}},uc=async(e,t={})=>{if(!e.backend.bootDevice)throw new y("UNSUPPORTED_OPERATION","admin.boot is not supported by this backend");let n=function(e){if(!e)return;let t=dw(e.id,"target.id"),n=dw(e.name,"target.name"),r={...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(r).length>0?r:void 0}(t.target),r=db(await e.backend.bootDevice(lg(e,t),n));return{kind:"deviceBooted",...n?{target:n}:{},...r?{backendResult:r}:{},...eM("Booted device")}},up=async(e,t)=>{if(!e.backend.ensureSimulator)throw new y("UNSUPPORTED_OPERATION","admin.ensureSimulator is not supported by this backend");let n=dg(t.device,"device");return{kind:"simulatorEnsured",...await e.backend.ensureSimulator(lg(e,t),{device:n,...t.runtime?{runtime:dg(t.runtime,"runtime")}:{},...void 0!==t.boot?{boot:t.boot}:{},...void 0!==t.reuseExisting?{reuseExisting:t.reuseExisting}:{}})}},uf=async(e,t)=>await dp(e,t,"install"),uh=async(e,t)=>await dp(e,t,"reinstall"),um=async(e,t)=>await dp(e,t,"installFromSource"),uw=async(e,t)=>{let n=dv(t.action,"record"),r="start"===n?e.backend.startRecording:e.backend.stopRecording;if(!r)throw new y("UNSUPPORTED_OPERATION",`record ${n} is not supported by this backend`);let a=t.out?await sg(e,t.out,{field:"path",ext:".mp4"}):void 0;try{var i,o,s,l,d;let u,c,p=(i=t,o=a?.path,u=void 0===i.fps?void 0:i9(i.fps,"fps",1,60),c=void 0===i.quality?void 0:i9(i.quality,"quality",5,10),{...o?{outPath:o}:{},...void 0!==u?{fps:u}:{},...void 0!==c?{quality:c}:{},...void 0!==i.hideTouches?{showTouches:!0!==i.hideTouches}:{}}),f=await r.call(e.backend,lg(e,t),p),h=await a?.publish();return s=n,l=f,d=h,{..."string"==typeof l.path?{path:l.path}:{},..."string"==typeof l.telemetryPath?{telemetryPath:l.telemetryPath}:{},..."string"==typeof l.warning?{warning:l.warning}:{},...dI(s,l,d,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await a?.cleanup?.(),e}},ug=async(e,t)=>{let n=dv(t.action,"trace"),r="start"===n?e.backend.startTrace:e.backend.stopTrace;if(!r)throw new y("UNSUPPORTED_OPERATION",`trace ${n} is not supported by this backend`);let a=t.out?await sg(e,t.out,{field:"outPath",ext:".trace"}):void 0;try{var i,o,s;let l={...a?.path?{outPath:a.path}:{}},d=await r.call(e.backend,lg(e,t),l),u=await a?.publish();return i=n,o=d,s=u,{..."string"==typeof o.outPath?{outPath:o.outPath}:{},...dI(i,o,s,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await a?.cleanup?.(),e}},uy=async(e,t={})=>{var n,r;let a;if(!e.backend.readLogs)throw new y("UNSUPPORTED_OPERATION","diagnostics.logs is not supported by this backend");return a=!0===(n=await e.backend.readLogs(await dR(e,t),{...dP(r=t,100,500,"logs limit"),...void 0!==r.levels?{levels:dL(r.levels,"levels")}:{},...void 0!==r.search?{search:d$(r.search,"search")}:{},...void 0!==r.source?{source:d$(r.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:n.entries.map(e=>{let t=dO(e.message,4096),n=dE(e.metadata);return a||=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:a,...n.notes?{notes:n.notes}:{}}},ub=async(e,t={})=>{var n,r,a;let i;if(!e.backend.dumpNetwork)throw new y("UNSUPPORTED_OPERATION","diagnostics.network is not supported by this backend");let o={...dP(a=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")}(a.include)};return n=await e.backend.dumpNetwork(await dR(e,t),o),r=o.include??"summary",i=!0===n.redacted,{kind:"diagnosticsNetwork",entries:n.entries.map(e=>{var t;let n=e.url?dN(t=e.url)??dO(t,2048):void 0,a="headers"===r||"all"===r?dk(e.requestHeaders):void 0,o="headers"===r||"all"===r?dk(e.responseHeaders):void 0,s="body"===r||"all"===r?dM(e.requestBody):void 0,l="body"===r||"all"===r?dM(e.responseBody):void 0,d=dE(e.metadata);return i||=(n?.redacted??!1)||(a?.redacted??!1)||(o?.redacted??!1)||(s?.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}:{},...a?.value?{requestHeaders:a.value}:{},...o?.value?{responseHeaders:o.value}:{},...s?.value!==void 0?{requestBody:s.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}:{}}},uv=async(e,t={})=>{var n,r;let a;if(!e.backend.measurePerf)throw new y("UNSUPPORTED_OPERATION","diagnostics.perf is not supported by this backend");return a=!0===(n=await e.backend.measurePerf(await dR(e,t),{...dT(r=t),...void 0!==r.sampleMs?{sampleMs:i9(r.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==r.metrics?{metrics:dL(r.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:n.metrics.map(e=>{let t=dO(e.message,4096),n=dE(e.metadata);return a||=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:a,...n.notes?{notes:n.notes}:{}}};function uI(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??function(e=[]){let t=new Map(e.map(e=>[e.name,uA(e)]));return{get:e=>uA(t.get(e)),set:e=>{t.set(e.name,uA(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>uA(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=>dF(t,e),diffScreenshot:e=>dU(t,e),snapshot:e=>dG(t,e),diffSnapshot:e=>dV(t,e)},selectors:{find:e=>dB(t,e),get:e=>dj(t,e),getText:(e,n={})=>dq(t,{...n,target:e}),getAttrs:(e,n={})=>dX(t,{...n,target:e}),is:e=>dH(t,e),isVisible:(e,n={})=>dK(t,{...n,target:e}),isHidden:(e,n={})=>dz(t,{...n,target:e}),wait:e=>dY(t,e),waitForText:(e,n={})=>dW(t,{...n,text:e})},interactions:{click:(e,n={})=>dJ(t,{...n,target:e}),press:(e,n={})=>dZ(t,{...n,target:e}),fill:(e,n,r={})=>dQ(t,{...r,target:e,text:n}),typeText:(e,n={})=>d0(t,{...n,text:e}),focus:(e,n={})=>d1(t,{...n,target:e}),longPress:(e,n={})=>d2(t,{...n,target:e}),swipe:e=>d3(t,e),scroll:e=>d4(t,e),pinch:e=>d5(t,e)},system:{back:e=>d8(t,e),home:e=>d6(t,e),rotate:e=>d9(t,e),keyboard:e=>d7(t,e),clipboard:e=>ue(t,e),settings:e=>ut(t,e),alert:e=>un(t,e),appSwitcher:e=>ur(t,e)},apps:{open:e=>ua(t,e),close:e=>ui(t,e),list:e=>uo(t,e),state:e=>us(t,e),push:e=>ul(t,e),triggerEvent:e=>ud(t,e)},admin:{devices:e=>uu(t,e),boot:e=>uc(t,e),ensureSimulator:e=>up(t,e),install:e=>uf(t,e),reinstall:e=>uh(t,e),installFromSource:e=>um(t,e)},recording:{record:e=>uw(t,e),trace:e=>ug(t,e)},observability:{logs:e=>uy(t,e),network:e=>ub(t,e),perf:e=>uv(t,e)}}}function uA(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 ux(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}function uS(e,t={}){let n=!0===t.plural?"do":"does";return{resolveInput:async()=>{throw new y("UNSUPPORTED_OPERATION",`${e} ${n} not resolve input artifacts`)},reserveOutput:async()=>{throw new y("UNSUPPORTED_OPERATION",`${e} ${n} not reserve output artifacts`)},createTempFile:async()=>{throw new y("UNSUPPORTED_OPERATION",`${e} ${n} not create temporary files`)}}}async function uN(e){let t=st(e.session);if(t&&"android"===e.device.platform)return await uk(e,t);let n=await u_(e);return sn(e.session),{snapshot:uO(n,uE(e)),analysis:n.analysis,androidSnapshot:n.androidSnapshot}}async function u_(e){let{device:t,session:n,flags:r,outPath:a,logPath:i,snapshotScope:o}=e;if("linux"===t.platform){let e=await i3(n?.surface);return uC({nodes:e.nodes,truncated:e.truncated,backend:"linux-atspi"},{snapshotDepth:r?.snapshotDepth,snapshotInteractiveOnly:r?.snapshotInteractiveOnly,snapshotScope:o})}return"macos"===t.platform&&n?.surface&&"app"!==n.surface?uC(await af(n.surface,{bundleId:"menubar"===n.surface?n.appBundleId:void 0}),{snapshotDepth:r?.snapshotDepth,snapshotInteractiveOnly:r?.snapshotInteractiveOnly,snapshotScope:o}):await oP(t,"snapshot",[],a,{...o0(i,{...r,snapshotScope:o},n?.appBundleId,n?.trace?.outPath)})}async function uk(e,t){let n=await uM(e),r=uD(n,t,e),a=0,i=t.markedAt+1500;for(let o of o7){if(!r)break;let s=i-Date.now();if(s<=0)break;await Y(Math.min(o,s)),n=await uM(e),a+=1,r=uD(n,t,e)}return r||sn(e.session),{snapshot:n.snapshot,analysis:n.data.analysis,androidSnapshot:n.data.androidSnapshot,freshness:a>0||r?{action:t.action,retryCount:a,staleAfterRetries:!!r,reason:r??void 0}:void 0}}async function uM(e){let t=await u_(e);return{data:t,snapshot:uO(t,uE(e))}}function uE(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function uD(e,t,n){var r,a;let i=n.flags?.snapshotInteractiveOnly===!0,o=e.data.analysis;if(i&&0===e.snapshot.nodes.length&&o&&o.rawNodeCount>=12)return"empty-interactive";if("ref-refresh"===n.androidFreshnessMode)return null;return(r=t.baselineCount,a=e.snapshot.nodes.length,!(r<12)&&a<=Math.floor(.2*r))?e.snapshot.nodes.some(e=>!0===e.hittable||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())?null:"sharp-drop":t.routeComparable&&sr(t.action)&&function(e,t){if(!e||0===e.length)return!1;let n=Math.max(e.length,t.length);if(n<12)return!1;let r=sa(t),a=Math.min(e.length,r.length),i=0;for(let t=0;t<a;t+=1)e[t]===r[t]&&(i+=1);let o=Math.max(0,r.length-e.length),s=Math.max(0,e.length-r.length),l=Math.max(3,Math.floor(.15*n));return i>=Math.floor(.9*n)&&o<=l&&s<=l}(t.baselineSignatures,e.snapshot.nodes)?"stuck-route":null}function uO(e,t){let n=e?.nodes??[],r=function(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[a,i]of e.entries()){let e=Math.max(0,i.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o="number"==typeof i.parentIndex?t.get(i.parentIndex):void 0,s="number"==typeof o&&o<a?o:r[r.length-1]?.index;n.push({...i,index:a,depth:e,parentIndex:s}),r.push({depth:e,index:a})}return n}(t?.snapshotRaw?n:eL(n));return{nodes:es(t?.snapshotScope&&e?.backend!=="macos-helper"?uR(r,t.snapshotScope):r),truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,comparisonSafe:e?.backend==="android"&&t?.snapshotInteractiveOnly!==!0&&t?.snapshotCompact!==!0&&"number"!=typeof t?.snapshotDepth&&!t?.snapshotScope}}function uC(e,t){var n,r;let a=e.nodes??[];return t.snapshotScope&&(a=uR(a,t.snapshotScope)),t.snapshotInteractiveOnly&&(a=function(e){if(0===e.length)return e;let t=new Map;for(let n of e)t.set(n.index,n);let n=new Set;for(let r of e){if(!function(e){if(e.focused||e.hittable||e.rect)return!0;let t=`${e.type??""} ${e.role??""} ${e.subrole??""}`.toLowerCase();return t.includes("button")||t.includes("menu")||t.includes("textfield")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")}(r))continue;let e=r;for(;e&&!n.has(e.index);)n.add(e.index),e="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0}return 0===n.size?e:uP(e.filter(e=>n.has(e.index)))}(a)),"number"==typeof t.snapshotDepth&&(n=a,r=t.snapshotDepth,a=uP(n.filter(e=>(e.depth??0)<=r))),{...e,nodes:a}}function uR(e,t){let n=eB(es(e),t);if(!n)return[];let r=e.findIndex(e=>e.index===n.index);if(-1===r)return[];let a=e[r]?.depth??0,i=[];for(let t=r;t<e.length;t+=1){let n=e[t];if(!n)continue;let o=n.depth??0;if(t>r&&o<=a)break;i.push(n)}return uP(i,a)}function uP(e,t=0){let n=new Map;for(let[t,r]of e.entries())n.set(r.index,t);return e.map((e,r)=>({...e,index:r,depth:Math.max(0,(e.depth??0)-t),parentIndex:"number"==typeof e.parentIndex?n.get(e.parentIndex):void 0}))}function uT(e,t){let n;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return o9("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let r=ei(e.trim());if(!r)return o9("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=ea(e.nodes,r);if(n=t?ej(t,e.nodes):void 0)break}return n?{ok:!0,scope:n}:o9("COMMAND_FAILED",`Ref ${e} not found or has no label`)}async function uL(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,{session:i,device:o}=await sl(a,n,t.flags);if(!oQ("snapshot",o))return o9("UNSUPPORTED_OPERATION","snapshot is not supported on this device");let s=uT(t.flags?.snapshotScope,i);return s.ok?await sd(i,o,async()=>{let e=uF({req:t,sessionName:n,logPath:r,sessionStore:a,session:i,device:o,snapshotScope:s.scope}),l=await e.capture.snapshot({session:n,interactiveOnly:t.flags?.snapshotInteractiveOnly,compact:t.flags?.snapshotCompact,depth:t.flags?.snapshotDepth,scope:s.scope,raw:t.flags?.snapshotRaw});return uU({req:t,sessionName:n,sessionStore:a,result:{nodes:l.nodes.length,truncated:l.truncated}}),{ok:!0,data:l}}):s}async function u$(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,{session:i,device:o}=await sl(a,n,t.flags);if(!oQ("diff",o))return o9("UNSUPPORTED_OPERATION","diff is not supported on this device");let s=uT(t.flags?.snapshotScope,i);return s.ok?await sd(i,o,async()=>{let e=uF({req:t,sessionName:n,logPath:r,sessionStore:a,session:i,device:o,snapshotScope:s.scope}),l=await e.capture.diffSnapshot({session:n,interactiveOnly:t.flags?.snapshotInteractiveOnly,compact:t.flags?.snapshotCompact,depth:t.flags?.snapshotDepth,scope:s.scope,raw:t.flags?.snapshotRaw});return uU({req:t,sessionName:n,sessionStore:a,result:{mode:"snapshot",baselineInitialized:l.baselineInitialized,summary:l.summary}}),{ok:!0,data:l}}):s}function uF(e){let{req:t,sessionName:n,logPath:r,sessionStore:a,session:i,device:o,snapshotScope:s}=e;return uI({backend:function(e){let{req:t,logPath:n,session:r,device:a,snapshotScope:i}=e;return{platform:a.platform,captureSnapshot:async(e,o)=>{let s=await uN({device:a,session:r,flags:t.flags,outPath:o?.outPath??t.flags?.out,logPath:n,snapshotScope:i});return{snapshot:s.snapshot,analysis:s.analysis,androidSnapshot:s.androidSnapshot,freshness:s.freshness,appName:r?.appBundleId?r.appName??r.appBundleId:void 0,appBundleId:r?.appBundleId}}}}({req:t,logPath:r,session:i,device:o,snapshotScope:s}),artifacts:uS("snapshot"),sessions:{get:e=>e===n?function(e){if(e)return{name:e.name,appBundleId:e.appBundleId,appName:e.appName,snapshot:e.snapshot,metadata:{surface:e.surface}}}(a.get(n)):void 0,set:e=>{var r;if(!e.snapshot)throw new y("UNKNOWN","snapshot runtime did not produce session state");let i=a.get(n);a.set(n,function(e){var t,n;let{current:r,sessionName:a,device:i,record:o,refScopedSnapshot:s}=e;if(!o.snapshot)throw new y("UNKNOWN","snapshot runtime did not produce session state");let l=(t=r,n=o,s&&n.snapshot?.nodes.length===0&&t?.snapshot!==void 0),d=l?r.snapshot:o.snapshot,u=function(e){let{session:t,sessionName:n,device:r,snapshot:a,appBundleId:i}=e;return t?{...t,snapshot:a}:{name:n,device:r,createdAt:Date.now(),appBundleId:i,snapshot:a,actions:[]}}({session:r,sessionName:a,device:i,snapshot:d,appBundleId:o.appBundleId});return u.snapshotScopeSource=function(e){let{current:t,keepCurrentSnapshot:n,refScopedSnapshot:r}=e;if(r)return n?t?.snapshotScopeSource:t?.snapshotScopeSource??t?.snapshot}({current:r,keepCurrentSnapshot:l,refScopedSnapshot:s}),o.appName&&(u.appName=o.appName),u}({current:i,sessionName:n,device:o,record:e,refScopedSnapshot:(r=t,r.flags?.snapshotScope?.trim().startsWith("@")===!0)}))}},policy:ux()})}function uU(e){let t=e.sessionStore.get(e.sessionName);t&&e.sessionStore.recordAction(t,{command:e.req.command,positionals:e.req.positionals??[],flags:e.req.flags??{},result:e.result})}async function uG(e){let{device:t,node:n,flags:r,appBundleId:a,traceOutPath:i,surface:o,contextFromFlags:s}=e,l=eG(n),d=lj(n.rect);if(!d)return l;try{let e=await oP(t,"read",[String(d.x),String(d.y)],void 0,{...s(r,a,i),surface:o}),u=e&&"object"==typeof e?e:void 0,c="string"==typeof u?.text?u.text:"";if(c.trim())return c;return er({level:"warn",phase:"interaction_read_fallback",data:{reason:"empty_backend_text",nodeRef:n.ref,surface:o,platform:t.platform}}),l}catch(e){return er({level:"warn",phase:"interaction_read_fallback",data:{reason:"backend_read_failed",nodeRef:n.ref,surface:o,platform:t.platform,error:e instanceof Error?e.message:String(e)}}),l}}let uV=[["snapshotDepth","--depth"],["snapshotScope","--scope"],["snapshotRaw","--raw"]];function uB(e,t){let n=function(e){if(!e)return[];let t=[];for(let[n,r]of uV)void 0!==e[n]&&t.push(r);return t}(t);return 0===n.length?null:o9("INVALID_ARGS",`${e} @ref does not support ${n.join(", ")}.`)}async function uj(e,t){let n=await uq(e);if(n)throw new y("COMMAND_FAILED",`press ${t} left ${e.appBundleId} and foregrounded ${n.foregroundPackage}. The tap likely escaped the app.`,n)}async function uq(e){var t;if("android"!==e.device.platform||!e.appBundleId)return null;let n=await L(e.device),r=n.package?.trim();return r&&r!==e.appBundleId&&("com.android.settings"===(t=r)||"com.android.systemui"===t||"com.google.android.permissioncontroller"===t||t.includes("launcher"))?{expectedPackage:e.appBundleId,foregroundPackage:r,activity:n.activity,hint:"com.google.android.permissioncontroller"===r?"Dismiss or allow the permission prompt, then retry the smoke assertion.":"Use screenshot as visual truth, then take a fresh snapshot -i before retrying."}:null}function uX(e){return"COMMAND_FAILED"===e.code&&"string"==typeof e.details?.expectedPackage&&"string"==typeof e.details?.foregroundPackage}function uH(e,t,n,r){let a=e.get(t);a&&e.recordAction(a,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function uK(e){let t=e.target;return t&&"object"==typeof t?"ref"===t.kind&&"string"==typeof t.ref?{kind:"ref",ref:t.ref}:"selector"===t.kind&&"string"==typeof t.selector?{kind:"selector",selector:t.selector}:void 0:void 0}function uz(e){return e.startsWith("@")?e.slice(1):e}async function uY(e){var t;let{req:n}=e;if("find"!==n.command)return null;let r=n.positionals??[];if(0===r.length)return o9("INVALID_ARGS","find requires a locator or text");let a=eZ(r);if(!a.query)return o9("INVALID_ARGS","find requires a value");if(n.flags?.findFirst&&n.flags?.findLast)return o9("INVALID_ARGS","find accepts only one of --first or --last");let i=a.action;if("exists"!==(t=i)&&"wait"!==t&&"get_text"!==t&&"get_attrs"!==t)return null;let o=await u0(e,{requireSession:!1,capability:"find"});return o.ok?await u3(async()=>{let t=await o.runtime.selectors.find({session:e.sessionName,requestId:n.meta?.requestId,locator:a.locator,query:a.query,action:i,timeoutMs:a.timeoutMs});return uH(e.sessionStore,e.sessionName,n,function(e,t){if("exists"===t)return{found:!0};if("wait"===t)return{found:!0,waitedMs:e.waitedMs};let n="string"==typeof e.ref?e.ref:void 0;return"get_attrs"===t?{ref:n,action:"get attrs"}:{ref:n,action:"get text",text:"string"==typeof e.text?e.text:""}}(t,i)),"found"===t.kind?{found:!0,..."number"==typeof t.waitedMs?{waitedMs:t.waitedMs}:{}}:{..."string"==typeof t.ref?{ref:t.ref}:{},..."string"==typeof t.text?{text:t.text}:{},...t.node&&"object"==typeof t.node?{node:t.node}:{}}}):o.response}async function uW(e){let{req:t}=e;if("get"!==t.command)return null;let n=t.positionals?.[0];if("text"!==n&&"attrs"!==n)return o9("INVALID_ARGS","get only supports text or attrs");let r=await u0(e,{requireSession:!0,capability:"get"});if(!r.ok)return r.response;let a=function(e){let t=e.positionals?.[1]??"";if(t.startsWith("@"))return{ok:!0,target:{kind:"ref",ref:t,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(" ").trim():""}};let n=e.positionals?.slice(1).join(" ").trim()??"";return n?{ok:!0,target:{kind:"selector",selector:n}}:{ok:!1,response:o9("INVALID_ARGS","get requires @ref or selector expression")}}(t);if(!a.ok)return a.response;if("ref"===a.target.kind){let e=uB("get",t.flags);if(e)return e}return await u3(async()=>{let i,o=await r.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:n,target:a.target});return uH(e.sessionStore,e.sessionName,t,function(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=uK(e),a=r?.kind==="ref"?uz(r.ref):void 0,i=r?.kind==="selector"?r.selector:void 0,o={...a?{ref:a}:{},...i?{selector:i}:{},...n?{selectorChain:n}:{}};if("attrs"===t)return o;let s="string"==typeof e.text?e.text:"";return{...o,text:s,refLabel:function(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}(s)}}(o,n)),i=uK(o),{...i?.kind==="ref"?{ref:uz(i.ref)}:{},...i?.kind==="selector"?{selector:i.selector}:{},..."string"==typeof o.text?{text:o.text}:{},...o.node&&"object"==typeof o.node?{node:o.node}:{}}})}async function uJ(e){let{req:t}=e;if("is"!==t.command)return null;let n=(t.positionals?.[0]??"").toLowerCase();if(!lS(n))return o9("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text");let{split:r}=eV(t.positionals??[]);if(!r)return o9("INVALID_ARGS","is requires a selector expression");let a=r.rest.join(" ").trim();if("text"===n&&!a)return o9("INVALID_ARGS","is text requires expected text value");if("text"!==n&&r.rest.length>0)return o9("INVALID_ARGS",`is ${n} does not accept trailing values`);let i=await u0(e,{requireSession:!0,capability:"is"});if(!i.ok)return i.response;let o=await u3(async()=>{let o=await i.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:n,selector:r.selectorExpression,expectedText:a});return uH(e.sessionStore,e.sessionName,t,o),function(e){let{selectorChain:t,...n}=e;return n}(o)});return await u4(e,o,`is ${n}`)}async function uZ(e){let{req:t,sessionName:n,sessionStore:r}=e,a=ss(t.positionals??[]);if(!a)return o9("INVALID_ARGS","wait requires a duration or text");let{session:i,device:o}=await sl(r,n,t.flags);if("sleep"!==a.kind&&!oQ("wait",o))return o9("UNSUPPORTED_OPERATION","wait is not supported on this device");let s=async()=>{let s=uQ({...e,session:i,device:o}),l=await u3(async()=>{let e=await s.selectors.wait({session:n,requestId:t.meta?.requestId,target:function(e,t){if("sleep"===e.kind)return{kind:"sleep",durationMs:e.durationMs};if("selector"===e.kind)return{kind:"selector",selector:e.selectorExpression,timeoutMs:e.timeoutMs};if("ref"===e.kind){if(!t?.snapshot)throw new y("INVALID_ARGS","Ref wait requires an existing snapshot in session.");return{kind:"ref",ref:e.rawRef,timeoutMs:e.timeoutMs}}if(!e.text)throw new y("INVALID_ARGS","wait requires text");return{kind:"text",text:e.text,timeoutMs:e.timeoutMs}}(a,i)});return uH(r,n,t,e),{waitedMs:e.waitedMs,..."string"==typeof e.text?{text:e.text}:{},..."string"==typeof e.selector?{selector:e.selector}:{}}});return await u4(e,l,"wait")};return"sleep"===a.kind?await s():await sd(i,o,s)}function uQ(e){return uI({backend:function(e){let t,{req:n,session:r,device:a,logPath:i,sessionName:o,sessionStore:s}=e,l=0;return{platform:a.platform,captureSnapshot:async(e,d)=>{var u;let c,p={...n.flags,...(u=d,c={},u?.interactiveOnly!==void 0&&(c.snapshotInteractiveOnly=u.interactiveOnly),u?.compact!==void 0&&(c.snapshotCompact=u.compact),u?.scope!==void 0&&(c.snapshotScope=u.scope),u?.depth!==void 0&&(c.snapshotDepth=u.depth),u?.raw!==void 0&&(c.snapshotRaw=u.raw),c)},f=d?.scope??n.flags?.snapshotScope,h=Date.now();if(t&&h-l<750&&!st(r))return t;let m=await uN({device:a,session:r,flags:p,outPath:n.flags?.out,logPath:i??"",snapshotScope:f});return r&&(si(r,m.snapshot),s.set(o,r)),l=h,t={snapshot:m.snapshot}},readText:async(t,o)=>({text:await uG({device:a,node:o,flags:n.flags,appBundleId:r?.appBundleId,traceOutPath:r?.trace?.outPath,surface:r?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>o0(i??"",e,t,n))})}),findText:async(t,n)=>({found:await u1(e,n)})}}(e),artifacts:uS("selector commands",{plural:!0}),sessions:{get:t=>t===e.sessionName?function(e){if(e)return{name:e.name,appName:e.appName,appBundleId:e.appBundleId,snapshot:e.snapshot,metadata:{surface:e.surface}}}(e.session):void 0,set:t=>{e.session&&t.snapshot&&(si(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}},policy:ux()})}async function u0(e,t){let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:o9("SESSION_NOT_FOUND","No active session. Run open first.")};let r=n?.device??await oM(e.req.flags??{});return(n||await o3(r),oQ(t.capability,r))?{ok:!0,runtime:uQ({...e,session:n,device:r})}:{ok:!1,response:o9("UNSUPPORTED_OPERATION",`${t.capability} is not supported on this device`)}}async function u1(e,t){let{device:n,session:r,req:a,logPath:i}=e;if("macos"===n.platform&&r?.surface&&"app"!==r.surface)return!!eB((await u2(e)).nodes,t);if(tO(n.platform)){let e=await nA(n,{command:"findText",text:t,appBundleId:r?.appBundleId},{verbose:a.flags?.verbose,logPath:i,traceLogPath:r?.trace?.outPath,requestId:a.meta?.requestId});return e?.found===!0}return!!eB((await u2(e)).nodes,t)}async function u2(e){let t=await uN({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotCompact:!1},outPath:e.req.flags?.out,logPath:e.logPath??""});return e.session&&(si(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session)),t.snapshot}async function u3(e){try{return{ok:!0,data:await e()}}catch(t){let e=w(t);return o9(e.code,e.message,e.details)}}async function u4(e,t,n){var r;let a;if(t.ok)return t;let i=e.sessionStore.get(e.sessionName);if(!i)return t;try{a=await uq(i)}catch{return t}return a?o9(t.error.code,`${n} failed because ${"com.google.android.permissioncontroller"===(r=a).foregroundPackage?`Android permission dialog is blocking ${r.expectedPackage}`:`${r.foregroundPackage} is foreground instead of ${r.expectedPackage}`}.`,{...t.error.details??{},...a,blockedBy:"android_foreground_surface",originalMessage:t.error.message}):t}let u5=new Set(["snapshot","diff","wait","alert","settings"]);async function u8(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,i=t.command;if(!u5.has(i))return null;if("snapshot"===i)return await uL({req:t,sessionName:n,logPath:r,sessionStore:a});if("diff"===i)return t.positionals?.[0]!=="snapshot"?o9("INVALID_ARGS","diff currently supports only: diff snapshot"):await u$({req:t,sessionName:n,logPath:r,sessionStore:a});if("wait"===i)return await uZ({req:t,sessionName:n,logPath:r,sessionStore:a});if("alert"===i){let{session:e,device:i}=await sl(a,n,t.flags);return await sd(e,i,async()=>await sc({req:t,logPath:r,sessionStore:a,session:e,device:i}))}if("settings"===i){let e,i,o,s=(e=t.positionals?.[0]?.toLowerCase(),i=t.positionals?.[1]?.toLowerCase(),o=t.positionals?.[2]?.toLowerCase(),e&&i&&("permission"!==e||o)&&("location"!==e||"set"!==i||t.positionals?.[2]&&t.positionals?.[3])?{ok:!0,parsed:{setting:e,state:i,permissionTarget:o,latitude:t.positionals?.[2],longitude:t.positionals?.[3]}}:o9("INVALID_ARGS",eS));if(!s.ok)return s;let{session:l,device:d}=await sl(a,n,t.flags);return await sd(l,d,async()=>await sf({req:t,logPath:r,sessionStore:a,session:l,device:d,parsed:s.parsed}))}return null}export{closeAndroidApp,dismissAndroidKeyboard,ensureAdb,getAndroidAppState,getAndroidKeyboardState,inferAndroidAppName,installAndroidApp,installAndroidInstallablePathAndResolvePackageName,listAndroidApps,openAndroidApp,openAndroidDevice,readAndroidClipboardText,reinstallAndroidApp,resolveAndroidApp,writeAndroidClipboardText}from"./8809.js";export{rX as IOS_DEVICECTL_DEFAULT_HINT,tJ as IOS_RUNNER_CONTAINER_BUNDLE_IDS,rT as IOS_SIMCTL_LIST_TIMEOUT_MS,nm as abortAllIosRunnerSessions,re as appSwitcherAndroid,uj as assertAndroidPressStayedInApp,n6 as backAndroid,nR as buildMobileSnapshotPresentation,nS as buildScrollGesturePlan,tn as buildSimctlArgs,tr as buildSimctlArgsForDevice,ls as buildSnapshotDisplayLines,uO as buildSnapshotState,i8 as buttonTag,uN as captureSnapshot,u_ as captureSnapshotData,e6 as clearRequestCanceled,a7 as closeIosApp,o0 as context_contextFromFlags,uI as createAgentDevice,te as createRequestCanceledError,uS as createUnsupportedArtifactAdapter,sh as decodePng,oP as dispatchCommand,uY as dispatchFindReadOnlyViaRuntime,uW as dispatchGetViaRuntime,uJ as dispatchIsViaRuntime,nC as displayNodeLabel,o3 as ensureDeviceReady,o9 as errorResponse,ri as fillAndroid,oy as findBootableIosSimulator,ra as focusAndroid,ll as formatSnapshotLine,st as getActiveAndroidSnapshotFreshness,rl as getAndroidScreenSize,i5 as getClickButtonValidationError,e7 as getRequestSignal,nc as getRunnerSessionSnapshot,u8 as handleSnapshotCommands,n9 as homeAndroid,it as installIosApp,ia as installIosInstallablePath,uX as isAndroidEscapeError,tO as isApplePlatform,oQ as isCommandSupportedOnDevice,sr as isNavigationSensitiveAction,e9 as isRequestCanceled,ox as listAppleDevices,id as listIosApps,rj as listIosDeviceApps,rq as listIosDeviceProcesses,ux as localCommandPolicy,rt as longPressAndroid,se as markAndroidSnapshotFreshness,e8 as markRequestCanceled,tC as matchesPlatformSelector,tD as normalizePlatformSelector,a6 as openIosApp,a9 as openIosDevice,oa as parseDeviceRotation,ss as parseWaitArgs,tF as parseXmlDocumentSync,r1 as prepareIosInstallArtifact,n5 as pressAndroid,rM as pushAndroidNotification,is as pushIosNotification,n0 as readAndroidTextAtPoint,r0 as readInfoPlistString,ii as readIosClipboardText,rf as readLocationCoordinate,uG as readTextForNode,uB as refSnapshotFlagGuardResponse,e5 as registerRequestAbort,ir as reinstallIosApp,tR as resolveAppleSimulatorSetPathForSelector,i4 as resolveClickButton,ad as resolveFrontmostMacOsApp,a8 as resolveIosApp,rH as resolveIosDevicectlHint,ot as resolvePayloadInput,e4 as resolveRequestTrackingId,oM as resolveTargetDevice,n7 as rotateAndroid,nA as runIosRunnerCommand,ap as runMacOsAlertAction,rD as screenshotAndroid,aj as screenshotIos,rs as scrollAndroid,rA as setAndroidSetting,il as setIosSetting,si as setSessionSnapshot,rZ as shutdownSimulator,rJ as ensureBootedSimulator,nB as snapshotAndroid,nw as stopAllIosRunnerSessions,nh as stopIosRunnerSession,n8 as swipeAndroid,rn as typeAndroid,tE as withKeyedLock,oO as withTargetDeviceResolutionScope,io as writeIosClipboardText};