agent-device 0.20.1 → 0.20.3

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 (108) hide show
  1. package/README.md +0 -2
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.1.apk → agent-device-android-ime-helper-0.20.3.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.3.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.1.manifest.json → agent-device-android-ime-helper-0.20.3.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.1.apk → agent-device-android-snapshot-helper-0.20.3.apk} +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.3.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.1.manifest.json → agent-device-android-snapshot-helper-0.20.3.manifest.json} +6 -6
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +2 -0
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1 -35
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +0 -208
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +184 -0
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Orientation.swift +92 -0
  13. package/dist/src/agent-device-client.js +2 -2
  14. package/dist/src/android-adb.d.ts +3 -26
  15. package/dist/src/android-adb.js +1 -1
  16. package/dist/src/android.js +1 -1
  17. package/dist/src/app-helpers.js +1 -0
  18. package/dist/src/app-lifecycle.js +5 -5
  19. package/dist/src/app-log-request-scope.js +1 -1
  20. package/dist/src/app-resolution.js +1 -1
  21. package/dist/src/apps.js +5 -5
  22. package/dist/src/cli-config.js +1 -1
  23. package/dist/src/cli-help.js +6 -6
  24. package/dist/src/cli-runner.js +1 -1
  25. package/dist/src/cli.js +14 -14
  26. package/dist/src/click-button.d.ts +5 -0
  27. package/dist/src/client-metro.js +1 -0
  28. package/dist/src/command-schema.js +3 -3
  29. package/dist/src/context.js +1 -1
  30. package/dist/src/contracts.d.ts +1 -1
  31. package/dist/src/device-input-state.d.ts +26 -0
  32. package/dist/src/device-input-state.js +1 -1
  33. package/dist/src/device.js +9 -0
  34. package/dist/src/devices2.js +1 -1
  35. package/dist/src/find.js +1 -1
  36. package/dist/src/generic.js +1 -1
  37. package/dist/src/gesture-plan-types.js +1 -0
  38. package/dist/src/gesture-plan.js +1 -0
  39. package/dist/src/index.d.ts +1174 -1413
  40. package/dist/src/input-actions.js +4 -4
  41. package/dist/src/install-artifact.js +5 -1
  42. package/dist/src/install-artifact2.js +1 -0
  43. package/dist/src/interaction-snapshot.js +1 -1
  44. package/dist/src/interaction.d.ts +3 -6
  45. package/dist/src/interaction.js +1 -1
  46. package/dist/src/interactor.js +2 -2
  47. package/dist/src/interactor2.js +1 -1
  48. package/dist/src/internal/bin.js +1 -1
  49. package/dist/src/internal/daemon.js +14 -22
  50. package/dist/src/lease-context.js +1 -1
  51. package/dist/src/lease.js +1 -1
  52. package/dist/src/limrun.d.ts +437 -0
  53. package/dist/src/limrun.js +1 -0
  54. package/dist/src/linux.js +1 -1
  55. package/dist/src/logcat.js +1 -5
  56. package/dist/src/metro.d.ts +71 -2
  57. package/dist/src/metro.js +1 -1
  58. package/dist/src/metro2.js +1 -1
  59. package/dist/src/notifications.js +1 -1
  60. package/dist/src/physical-device-control.js +1 -0
  61. package/dist/src/plist.js +1 -0
  62. package/dist/src/react-native.js +1 -1
  63. package/dist/src/recording-export-quality.js +12 -13
  64. package/dist/src/register-builtins.js +1 -1
  65. package/dist/src/registry.js +18 -18
  66. package/dist/src/remote-config.d.ts +5 -2
  67. package/dist/src/remote-config.js +1 -1
  68. package/dist/src/remote-config2.js +1 -0
  69. package/dist/src/reporting.js +8 -8
  70. package/dist/src/runner-client.js +1 -1
  71. package/dist/src/runner-disposal.js +1 -2
  72. package/dist/src/runner-lease.js +1 -1
  73. package/dist/src/runtime-transport.js +1 -1
  74. package/dist/src/runtime.js +3 -3
  75. package/dist/src/runtime2.js +1 -1
  76. package/dist/src/sdk-android-adb.d.ts +4 -2
  77. package/dist/src/sdk-batch-runner.d.ts +13 -3
  78. package/dist/src/sdk-batch-runner.js +1 -1
  79. package/dist/src/sdk-contracts.d.ts +28 -2
  80. package/dist/src/sdk-contracts.js +2 -2
  81. package/dist/src/sdk-finders.d.ts +1 -1
  82. package/dist/src/sdk-remote-config.d.ts +119 -4
  83. package/dist/src/selector-runtime.js +1 -1
  84. package/dist/src/selector-vocabulary.js +1 -1
  85. package/dist/src/selectors.d.ts +1 -1
  86. package/dist/src/server.js +2 -2
  87. package/dist/src/session-target-evidence.js +1 -1
  88. package/dist/src/session.js +8 -8
  89. package/dist/src/simulator.js +1 -1
  90. package/dist/src/snapshot-diagnostics.js +4 -4
  91. package/dist/src/snapshot2.js +1 -1
  92. package/dist/src/tool-provider.js +3 -3
  93. package/dist/src/tool-provider2.js +1 -1
  94. package/dist/src/tool-provider3.js +1 -1
  95. package/dist/src/tv-remote.d.ts +213 -0
  96. package/dist/src/xml.js +2 -0
  97. package/package.json +49 -30
  98. package/server.json +2 -2
  99. package/smithery.yaml +1 -1
  100. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.1.apk.sha256 +0 -1
  101. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.1.apk.sha256 +0 -1
  102. package/dist/src/android-system-chrome.js +0 -1
  103. package/dist/src/client-metro-companion.js +0 -1
  104. package/dist/src/metro-types.d.ts +0 -52
  105. package/dist/src/project-runtime.js +0 -1
  106. package/dist/src/scoped-provider.js +0 -1
  107. package/dist/src/simctl.js +0 -1
  108. package/dist/src/snapshot-quality.js +0 -1
@@ -0,0 +1 @@
1
+ import{_ as e}from"./sdk-contracts.js";import{C as t,j as n,p as r}from"./sdk-android-adb.js";import{n as i,t as a}from"./version.js";import{c as o,g as s,o as c,s as ee}from"./sdk-device.js";import{c as te,o as ne,s as re}from"./boot-diagnostics.js";import{a as l,s as ie}from"./tool-provider.js";import u from"node:crypto";import d,{promises as f}from"node:fs";import p from"node:os";import m from"node:path";function h(e,t={}){let n=ne(t.simulatorSetPath);return n?[`simctl`,`--set`,n,...e]:[`simctl`,...e]}function g(e,t){return!ee(e)||e.kind!==`simulator`?[`simctl`,...t]:h(t,{simulatorSetPath:e.simulatorSetPath})}function ae(e,t,n){return l(g(e,t),n)}const _={iOS:{sdkName:{simulator:`iphonesimulator`,device:`iphoneos`},derivedBaseName:{simulator:`ios-simulator`,device:`ios-device`},xctestrunHints:{simulator:{preferred:[`iphonesimulator`],disallowed:[`iphoneos`,`appletvos`,`appletvsimulator`,`macos`]},device:{preferred:[`iphoneos`],disallowed:[`iphonesimulator`,`appletvos`,`appletvsimulator`,`macos`]}}},tvOS:{sdkName:{simulator:`appletvsimulator`,device:`appletvos`},derivedBaseName:{simulator:`tvos-simulator`,device:`tvos-device`},xctestrunHints:{simulator:{preferred:[`appletvsimulator`],disallowed:[`appletvos`,`iphoneos`,`iphonesimulator`,`macos`]},device:{preferred:[`appletvos`],disallowed:[`appletvsimulator`,`iphoneos`,`iphonesimulator`,`macos`]}}},macOS:{sdkName:{simulator:`macosx`,device:`macosx`},derivedBaseName:{simulator:`macos`,device:`macos`},xctestrunHints:{simulator:{preferred:[`macos`],disallowed:[`iphoneos`,`iphonesimulator`,`appletvos`,`appletvsimulator`]},device:{preferred:[`macos`],disallowed:[`iphoneos`,`iphonesimulator`,`appletvos`,`appletvsimulator`]}}},visionOS:{sdkName:{simulator:`xrsimulator`,device:`xros`},derivedBaseName:{simulator:`visionos-simulator`,device:`visionos-device`},xctestrunHints:{simulator:{preferred:[`xrsimulator`],disallowed:[`xros`,`iphoneos`,`iphonesimulator`,`appletvos`,`appletvsimulator`,`macos`]},device:{preferred:[`xros`],disallowed:[`xrsimulator`,`iphoneos`,`iphonesimulator`,`appletvos`,`appletvsimulator`,`macos`]}}}};function v(t){if(!c(t.platform))throw new e(`UNSUPPORTED_PLATFORM`,`Unsupported platform for Apple runner: ${t.platform}`);return o(t)?`macOS`:s(t.target,t.appleOs)}function oe(e,t){return _[e].sdkName[y(t)]}function se(e){return _[v(e)].derivedBaseName[y(e.kind)]}function ce(e){return _[v(e)].xctestrunHints[y(e.kind)]}function le(e){let t=v(e);return t===`macOS`?`platform=macOS,arch=${b()}`:e.kind===`simulator`?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`}function ue(e){let t=v(e);return t===`macOS`?`platform=macOS,arch=${b()}`:e.kind===`simulator`?`platform=${t} Simulator,id=${e.id}`:`generic/platform=${t}`}function de(e){let t=v(e);return t===`macOS`?`platform=macOS,arch=${b()}`:e.kind===`simulator`?`generic/platform=${t} Simulator`:`generic/platform=${t}`}function y(e){return e===`simulator`?`simulator`:`device`}function b(){return process.arch===`arm64`?`arm64`:`x86_64`}const fe=new Set;function x(e={}){let t=new Map,n=e.now??(()=>Date.now()),r=e=>{e?.timer&&clearTimeout(e.timer)},i={get(e){let r=t.get(e);if(r){if(r.expiresAt!==void 0&&r.expiresAt<=n()){i.delete(e);return}return r.value}},set(i,a){r(t.get(i));let o=pe(e.ttlMs,n),s={value:a,expiresAt:o};e.scheduleExpiry&&o!==void 0&&(s.timer=setTimeout(()=>{t.delete(i)},Math.max(0,o-n())),s.timer.unref?.()),t.set(i,s)},delete(e){let n=t.get(e);return n?(r(n),t.delete(e)):!1},clear(){for(let e of t.values())r(e);t.clear()}};return fe.add(i.clear),i}function pe(e,t){if(!(e===void 0||!Number.isFinite(e)))return t()+Math.max(0,e)}const me=m.join(`apple`,`runner`,`AgentDeviceRunner`),he=m.join(`dist`,`apple`,`runner`,`AgentDeviceRunner`);function S(e){let t=m.join(e,me);return d.existsSync(t)?t:m.join(e,he)}function ge(e){return m.join(S(e),`AgentDeviceRunner.xcodeproj`)}const _e=m.join(p.homedir(),`.agent-device`,`apple-runner`),ve=`.agent-device-runner-cache.json`,ye=[`-IDEPackageSupportDisableManifestSandbox=1`,`-IDEPackageSupportDisablePluginExecutionSandbox=1`,`ENABLE_USER_SCRIPT_SANDBOXING=NO`],C=x();function w(e){return e?.trim()??``}function T(e=process.env){return w(e.AGENT_DEVICE_IOS_BUNDLE_ID)||w(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||`com.callstack.agentdevice.runner`}function E(e=process.env){return w(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID)||`${T(e)}.uitests`}function be(e=process.env){let t=T(e),n=E(e);return Array.from(new Set([w(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${n}.xctrunner`,t].filter(e=>e.length>0)))}const D=be(process.env);function xe(e,t=a()){let n=v(e);return{schemaVersion:2,packageVersion:i(t),runnerSourceFingerprint:Oe(t),...Se(n,e.kind),platformName:n,deviceKind:e.kind,target:e.target??`mobile`,buildDestinationFamily:de(e),runnerBundleBuildSettings:N(process.env),runnerSigningBuildSettings:M(process.env,e.kind===`device`,e),runnerPerformanceBuildSettings:P(),runnerSandboxBuildArgs:F()}}function Se(e,t){let n=Ce(O(`xcodebuild`,[`-version`])),r=oe(e,t);return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:r,sdkVersion:O(`xcrun`,[`--sdk`,r,`--show-sdk-version`]),sdkBuildVersion:O(`xcrun`,[`--sdk`,r,`--show-sdk-build-version`])}}function O(e,n){let r=JSON.stringify([e,n]),i=C.get(r);if(i!==void 0)return i;try{let i=t(e,n,{allowFailure:!0,timeoutMs:5e3,maxBuffer:128*1024}),a=i.exitCode===0&&i.stdout.trim()||`unknown`;return C.set(r,a),a}catch{return C.set(r,`unknown`),`unknown`}}function Ce(e){return{version:e.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||`unknown`,buildVersion:e.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||`unknown`}}function we(e,t){let n=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(n)return m.resolve(n);let r=Ee(t),i=Te(e);return m.join(i,r)}function Te(e){return m.join(_e,`derived`,se(e))}function Ee(e){return`cache-${u.createHash(`sha256`).update(De(k(e))).digest(`hex`).slice(0,16)}`}function k(e){let{artifacts:t,packageVersion:n,...r}=e;return r}function De(e){return JSON.stringify(A(e))}function A(e){return Array.isArray(e)?e.map(e=>A(e)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,A(t)]))}const j=new Map;function Oe(e){let t=S(e),n=Ae(t),r=ke(t,n),i=j.get(t);if(i?.fileStatsFingerprint===r)return i.sourceFingerprint;let a=u.createHash(`sha256`);for(let e of n){let n=m.relative(t,e);a.update(n),a.update(`\0`),a.update(d.readFileSync(e)),a.update(`\0`)}let o=a.digest(`hex`);return j.set(t,{fileStatsFingerprint:r,sourceFingerprint:o}),o}function ke(e,t){let n=u.createHash(`sha256`);for(let r of t){let t=m.relative(e,r),i=d.statSync(r);n.update(t),n.update(`\0`),n.update(String(i.size)),n.update(`\0`),n.update(String(Math.trunc(i.mtimeMs))),n.update(`\0`)}return n.digest(`hex`)}function Ae(e){if(!d.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop();for(let r of d.readdirSync(e,{withFileTypes:!0})){let i=m.join(e,r.name);if(r.isDirectory()){if(r.name===`xcuserdata`)continue;n.push(i);continue}r.isFile()&&je(r.name,i)&&t.push(i)}}return t.sort((e,t)=>e.localeCompare(t))}function je(e,t){return e===`project.pbxproj`?t.includes(`${m.sep}.xcodeproj${m.sep}`):[`.jpg`,`.json`,`.png`,`.swift`,`.m`,`.h`,`.plist`,`.entitlements`,`.xctestplan`,`.xcconfig`,`.storyboard`,`.xib`].includes(m.extname(e))}function Me(e){return o(e)||e.kind===`device`?`-maximum-concurrent-test-device-destinations`:`-maximum-concurrent-test-simulator-destinations`}function M(e=process.env,t=!1,n={platform:`apple`}){if(o(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()||``,i=e.AGENT_DEVICE_IOS_SIGNING_IDENTITY?.trim()||``,a=e.AGENT_DEVICE_IOS_PROVISIONING_PROFILE?.trim()||``,s=[`CODE_SIGN_STYLE=Automatic`];return r&&s.push(`DEVELOPMENT_TEAM=${r}`),i&&s.push(`CODE_SIGN_IDENTITY=${i}`),a&&s.push(`PROVISIONING_PROFILE_SPECIFIER=${a}`),s}function N(e=process.env){let t=T(e),n=E(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${n}`]}function P(){return[`COMPILER_INDEX_STORE_ENABLE=NO`,`ENABLE_CODE_COVERAGE=NO`,`ONLY_ACTIVE_ARCH=YES`,`ENABLE_PREVIEWS=NO`,`ENABLE_DEBUG_DYLIB=NO`]}function F(){return[...ye,`OTHER_SWIFT_FLAGS=${Ne(process.env)}`]}function Ne(e){return te(e.AGENT_DEVICE_XCUITEST_INCLUDE_UNIT_TESTS)?`$(inherited) -disable-sandbox -D AGENT_DEVICE_RUNNER_UNIT_TESTS`:`$(inherited) -disable-sandbox`}const Pe=18e4,Fe=6e4,Ie=6e4,Le=1e4,Re=15e3,ze=2e4,Be=15e3,I=2e4,Ve=1e3,He=5e3;async function L(t,n,i={}){let a=[`devicectl`,...t],o=await l(a,{allowFailure:!0,timeoutMs:i.timeoutMs??2e4});if(o.exitCode===0)return;let{stdout:s,stderr:c}=o;if(!i.tolerateOutput?.(s,c))throw new e(`COMMAND_FAILED`,`Failed to ${n.action}`,r(o,{cmd:`xcrun`,args:a,stdout:s,stderr:c,deviceId:n.deviceId,hint:G(s,c)??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}async function R(e,t){return Ye(qe(await B(e,{jsonPrefix:`agent-device-ios-apps`,args:[`devicectl`,`device`,`info`,`apps`,`--device`,e.id,`--include-all-apps`],failureMessage:`Failed to list iOS apps`,parseFailureMessage:`Failed to parse iOS apps list`})),t)}async function Ue(t){let n=await B(t,{jsonPrefix:`agent-device-ios-processes`,args:[`devicectl`,`device`,`info`,`processes`,`--device`,t.id],failureMessage:`Failed to list iOS processes`,parseFailureMessage:`Failed to parse iOS process list`,fallbackHint:W});if(!Ge(n))throw new e(`COMMAND_FAILED`,`Unsupported iOS process list response`,{deviceId:t.id,hint:W});return Je(n)}async function We(e,t){let{appBundleUrl:n,processes:r}=await z(e,t),i=r.sort((e,t)=>H(e,n)-H(t,n))[0];i&&await B(e,{jsonPrefix:`agent-device-ios-process-terminate`,args:[`devicectl`,`device`,`process`,`terminate`,`--device`,e.id,`--pid`,String(i.pid),`--kill`],failureMessage:`Failed to terminate iOS app`,parseFailureMessage:`Failed to parse iOS process termination response`,tolerateFailurePayload:Ke})}async function z(t,n){let r=(await R(t,`all`)).find(e=>e.bundleId===n);if(!r)throw new e(`APP_NOT_INSTALLED`,`No iOS device app found for ${n}`,{appBundleId:n,deviceId:t.id});if(!r.url)throw new e(`COMMAND_FAILED`,`Missing app bundle URL for ${n}`,{appBundleId:n,deviceId:t.id,hint:`Installed-app metadata from devicectl did not include the bundle URL required to match running processes. Use an Xcode/CoreDevice toolchain that reports app URLs.`});let i=r.url.replace(/\/+$/,``);return{appBundleUrl:i,processes:(await Ue(t)).filter(e=>e.executable.startsWith(`${i}/`))}}async function B(t,n){let i=m.join(p.tmpdir(),`${n.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),a=[...n.args,`--json-output`,i],o=await l(a,{allowFailure:!0,timeoutMs:2e4});try{if(o.exitCode!==0){let{stdout:s,stderr:c}=o;if(n.tolerateFailurePayload){let e=await V(i).catch(()=>void 0);if(e!==void 0&&n.tolerateFailurePayload(e))return e}throw new e(`COMMAND_FAILED`,n.failureMessage,r(o,{cmd:`xcrun`,args:a,stdout:s,stderr:c,deviceId:t.id,hint:G(s,c)??n.fallbackHint??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}return await V(i)}catch(r){throw r instanceof e?r:new e(`COMMAND_FAILED`,n.parseFailureMessage,{deviceId:t.id,cause:String(r)})}finally{await f.unlink(i).catch(()=>{})}}async function V(e){return JSON.parse(await f.readFile(e,`utf8`))}function H(e,t){return e.executable.slice(t.length+1).split(`/`).length}function Ge(e){return Array.isArray(e?.result?.runningProcesses)}function Ke(e){let t=e?.error?.userInfo?.NSUnderlyingError?.error;return t?.domain===`NSPOSIXErrorDomain`&&t.code===3}function qe(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.bundleIdentifier==`string`?e.bundleIdentifier.trim():``;if(!t)continue;let r=typeof e.name==`string`&&e.name.trim().length>0?e.name.trim():t,i=typeof e.url==`string`&&e.url.trim().length>0?e.url.trim():void 0;n.push({bundleId:t,name:r,url:i})}return n}function Je(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.executable==`string`?e.executable.trim():``,r=typeof e.processIdentifier==`number`&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;!t||!Number.isFinite(r)||n.push({executable:t,pid:r})}return n}function Ye(e,t){return ie(e,t)}const U=`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`,W=`This Xcode/CoreDevice toolchain must support 'devicectl device info processes' with JSON runningProcesses so agent-device can resolve app process IDs. Inspect diagnostics for the exact devicectl API failure.`;function G(e,t){let n=`${e}\n${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 K(e,t){return g(e,t)}function Xe(e,t,n){return l(K(e,t),n)}function q(e){return e.includes(`not installed`)||e.includes(`not found`)||e.includes(`no such file`)}async function Ze(e,t){return await R(e,t)}async function Qe(e,t){await L([`device`,`install`,`app`,`--device`,e.id,t],{action:`install iOS app`,deviceId:e.id},{timeoutMs:12e4})}async function $e(e,t){await L([`device`,`uninstall`,`app`,`--device`,e.id,t],{action:`uninstall iOS app ${t}`,deviceId:e.id},{tolerateOutput:(e,t)=>q(`${e}\n${t}`.toLowerCase())})}async function et(e,t){await We(e,t)}async function tt(e,t){return await z(e,t)}const J=1e4;async function nt(e,t,n={}){let r=[`device`,`process`,`launch`,`--device`,e.id,t];n.payloadUrl&&r.push(`--payload-url`,n.payloadUrl),n.launchArgs&&n.launchArgs.length>0&&r.push(`--`,...n.launchArgs),await L(r,{action:`launch iOS app`,deviceId:e.id})}async function rt(t){try{let{result:n,parsed:i}=await Y(t.id,15e3,3e3);if(n.exitCode===0){if(!i.parsed)throw new e(`COMMAND_FAILED`,`iOS device readiness probe failed`,{kind:`probe_inconclusive`,deviceId:t.id,stdout:n.stdout,stderr:n.stderr,hint:`CoreDevice returned success but readiness JSON output was missing or invalid. Retry; if it persists restart Xcode and the iOS device.`});let r=i.tunnelState?.toLowerCase();if(r===`connecting`)throw new e(`COMMAND_FAILED`,`iOS device is not ready for automation`,{kind:`not_ready`,deviceId:t.id,tunnelState:r,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 e(`COMMAND_FAILED`,`iOS device is not ready for automation`,r(n,{kind:`not_ready`,deviceId:t.id,tunnelState:i.tunnelState,hint:Z(n.stdout,n.stderr)}))}catch(e){throw it(t.id,e)}}function it(t,n){return!(n instanceof e)||n.code!==`COMMAND_FAILED`?ot(t,n):(typeof n.details?.kind==`string`?n.details.kind:``)===`not_ready`?n:at(t,n)}function at(t,n){let r=n.details??{},i=String(r.stdout??``),a=String(r.stderr??``),o=Number(r.timeoutMs??15e3),s=`CoreDevice did not respond within ${o}ms. Keep the device unlocked and trusted, then retry; if it persists restart Xcode and the iOS device.`;return new e(`COMMAND_FAILED`,`iOS device readiness probe failed`,{deviceId:t,cause:n.message,timeoutMs:o,stdout:i,stderr:a,hint:i||a?Z(i,a):s},n)}function ot(t,n){return new e(`COMMAND_FAILED`,`iOS device readiness probe failed`,{deviceId:t,hint:`Reconnect the device, keep it unlocked, and retry.`},n instanceof Error?n:void 0)}async function st(e,t){if(typeof t==`number`&&t<=0)return null;let n=typeof t==`number`?Math.max(1,Math.min(J,t)):J;try{let t=await Y(e.id,n);return t.result.exitCode!==0||!t.parsed.parsed||t.parsed.outcome&&t.parsed.outcome!==`success`?null:t.parsed.tunnelIp??null}catch{return null}}async function Y(e,t,n=0){let r=m.join(p.tmpdir(),`agent-device-coredevice-info-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),i=Math.max(1,Math.ceil(t/1e3));try{return{result:await l([`devicectl`,`device`,`info`,`details`,`--device`,e,`--json-output`,r,`--timeout`,String(i)],{allowFailure:!0,timeoutMs:t+n}),parsed:await ct(r)}}finally{await f.rm(r,{force:!0}).catch(()=>{})}}async function ct(e){try{return{parsed:!0,...lt(JSON.parse(await f.readFile(e,`utf8`)))}}catch{return{parsed:!1}}}function lt(e){let t=e?.result;if(!t||typeof t!=`object`)return{};let n=t.connectionProperties,r=t.device?.connectionProperties,i=X(n?.tunnelState)??X(r?.tunnelState),a=X(n?.tunnelIPAddress)??X(r?.tunnelIPAddress),o=X(e?.info?.outcome);return{...o?{outcome:o}:{},...i?{tunnelState:i}:{},...a?{tunnelIp:a}:{}}}function X(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function Z(e,t){return G(e,t)||(`${e}\n${t}`.toLowerCase().includes(`timed out waiting for all destinations`)?`Xcode destination did not become available in time. Keep device unlocked and retry.`:U)}async function Q(t,n,r,i=I){let a=re.fromTimeoutMs(i),o={exitCode:1,stdout:``,stderr:``};for(let e of D)if(o=await l([`devicectl`,`device`,`copy`,`from`,`--device`,t.id,`--source`,n,`--destination`,r,`--domain-type`,`appDataContainer`,`--domain-identifier`,e],{allowFailure:!0,timeoutMs:ut(a,i)}),o.exitCode===0)return;throw new e(`COMMAND_FAILED`,`Failed to copy runner file from iOS device: ${o.stderr.trim()||o.stdout.trim()||`devicectl exited with code ${o.exitCode}`}`)}function ut(t,n){let r=t.remainingMs();if(r>0)return r;throw new e(`COMMAND_FAILED`,`iOS runner file copy timed out after ${n}ms`,{timeoutMs:n,step:`runner file copy`})}function $(t){if(!(t instanceof e))return{reason:t instanceof Error?t.message:String(t)};let n=t.details??{},r=Array.isArray(n.args)?n.args.filter(e=>typeof e==`string`).join(` `):void 0;return{errorCode:t.code,reason:t.message,timeoutMs:typeof n.timeoutMs==`number`?n.timeoutMs:void 0,exitCode:typeof n.exitCode==`number`?n.exitCode:void 0,stderr:typeof n.stderr==`string`&&n.stderr.trim()?n.stderr:void 0,stdout:typeof n.stdout==`string`&&n.stdout.trim()?n.stdout:void 0,commandArgs:r}}function dt(e){let t=e.details??{},n=typeof t.stdout==`string`?t.stdout:``,r=typeof t.stderr==`string`?t.stderr:``,i=Array.isArray(t.args)?t.args.filter(e=>typeof e==`string`).join(` `):``;return`${e.message}\n${n}\n${r}\n${i}`.toLowerCase()}async function ft(e,t,n){if(!n.preferRunner)try{await L([`device`,`screenshot`,`--device`,e.id,t],{action:`capture iOS screenshot`,deviceId:e.id});return}catch(t){if(!vt(t))throw t;_t(e,t)}let r=await mt(e,n,!1);await ht(r,t)||await Q(e,gt(r),t)}async function pt(t,n,r){if(!await ht(await mt(t,r,!0),n))throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: XCTest runner returned no inline image`,{deviceId:t.id,backend:`xctest`})}async function mt(e,t,n){return await t.runRunnerCommand(e,{command:`screenshot`,appBundleId:t.appBundleId,fullscreen:t.fullscreen,inlineScreenshot:n},t.runnerOptions??{})}async function ht(e,t){let n=e.imageBase64;return typeof n!=`string`||n.length===0?!1:(await f.writeFile(t,Buffer.from(n,`base64`)),!0)}function gt(t){let n=t.message;if(typeof n==`string`&&n.length>0)return n;throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: runner returned no file path`)}function _t(e,t){n({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:`devicectl_screenshot`,to:`runner`,...$(t)}})}function vt(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=dt(t);return n.includes(`unknown option '--device'`)||n.includes(`unknown subcommand`)&&n.includes(`screenshot`)||n.includes(`unrecognized subcommand`)&&n.includes(`screenshot`)}const yt={coredevice:{backend:`coredevice`,assertAppInstallationSupported:()=>{},ensureReady:rt,listApps:Ze,installApp:Qe,uninstallApp:$e,launchApp:nt,terminateApp:async(e,t)=>await et(e,t),resolveAppProcesses:tt,captureScreenshot:ft,copyRunnerFile:Q,resolveRunnerTransport:async(e,t)=>({kind:`network`,tunnelIp:await st(e,t)})},xctest:{backend:`xctest`,assertAppInstallationSupported:xt,ensureReady:Et,listApps:Ct,installApp:St,uninstallApp:St,launchApp:Dt,terminateApp:Ot,resolveAppProcesses:wt,captureScreenshot:pt,copyRunnerFile:Tt,resolveRunnerTransport:async()=>({kind:`usbmux`})}};function bt(e){return yt[e.iosPhysicalDeviceBackend===`xctest`?`xctest`:`coredevice`]}function xt(t){throw new e(`UNSUPPORTED_OPERATION`,`Installing apps is unavailable on this XCTest-backed physical iOS device.`,{deviceId:t.id,backend:`xctest`,hint:`Install the app with Xcode, then open it in agent-device by bundle ID.`})}async function St(e){return xt(e)}async function Ct(t){throw new e(`UNSUPPORTED_OPERATION`,`App inventory is unavailable on this XCTest-backed physical iOS device.`,{deviceId:t.id,backend:`xctest`,hint:`Use an installed app bundle ID when opening the device.`})}async function wt(t){throw new e(`UNSUPPORTED_OPERATION`,`Process lookup is unavailable on this XCTest-backed physical iOS device.`,{deviceId:t.id,backend:`xctest`,hint:`Use a CoreDevice-backed iOS device for performance sampling.`})}async function Tt(t){throw new e(`UNSUPPORTED_OPERATION`,`Runner file copy is unavailable on this XCTest-backed physical iOS device.`,{deviceId:t.id,backend:`xctest`})}async function Et(t){let n=[`xcdevice`,`wait`,`--both`,`--timeout=15`,t.id],i=await l(n,{allowFailure:!0,timeoutMs:18e3});if(i.exitCode!==0)throw new e(`COMMAND_FAILED`,`iOS device is not ready for XCTest automation`,r(i,{cmd:`xcrun`,args:n,deviceId:t.id,backend:`xctest`,hint:"Keep the device unlocked, trusted, connected, and visible in `xcrun xcdevice list`, then retry."}))}async function Dt(t,n,r){if(r.payloadUrl||r.launchArgs&&r.launchArgs.length>0)throw new e(`UNSUPPORTED_OPERATION`,`XCTest-backed physical iOS devices do not support deep links or launch arguments during open.`,{deviceId:t.id,backend:`xctest`,hint:`Open the installed app by bundle ID without a URL or --launch-args.`});await r.runRunnerCommand(t,{command:`activate`,appBundleId:n},r.runnerOptions??{})}async function Ot(e,t,n){await n.runRunnerCommand(e,{command:`terminate`,appBundleId:t},n.runnerOptions??{})}export{De as A,T as C,P as D,Me as E,ce as F,h as I,g as L,x as M,ue as N,F as O,le as P,ae as R,xe as S,we as T,ze as _,Xe as a,ve as b,G as c,I as d,Fe as f,Be as g,He as h,q as i,ge as j,M as k,Ie as l,Ve as m,dt as n,K as o,Le as p,$ as r,U as s,bt as t,Pe as u,Re as v,N as w,k as x,D as y};
@@ -0,0 +1 @@
1
+ import{n as e,t}from"./xml.js";import{i as n,n as r}from"./tool-provider.js";import{promises as i}from"node:fs";async function a(e,t){try{let n=(await r(e))?.[t];if(typeof n==`string`&&n.length>0)return n}catch{}try{let r=await n(`plutil`,[`-extract`,t,`raw`,`-o`,`-`,e],{allowFailure:!0});if(r.exitCode===0){let e=r.stdout.trim();if(e.length>0)return e}}catch{}try{return o(await i.readFile(e,`utf8`),t)}catch{return}}function o(n,r){let i;return e(t(n),(e,t)=>{i!==void 0||e!==r||t.name!==`string`||(i=t.text??void 0)}),i}export{a as t};
@@ -1 +1 @@
1
- import{S as e}from"./sdk-contracts.js";import{T as t}from"./sdk-batch-runner.js";import{Qn as n,cr as r}from"./recording-export-quality.js";import{t as i}from"./snapshot-quality.js";import{f as a}from"./runtime.js";import{c as o,l as s,n as c,s as l}from"./context.js";import{rn as u}from"./internal/daemon.js";import{i as d,n as f,t as p}from"./interaction-snapshot.js";async function m(t){let{req:n,sessionName:c,sessionStore:l}=t;if(n.command!==r.reactNative)return null;let u=h(n.positionals??[]);if(!u.ok)return u.response;let d=l.get(c);if(!d)return o();let f=s(r.reactNative,d.device,{message:`react-native dismiss-overlay is not supported on this device`});if(f)return f;try{let e=await p(d,n.flags,l,t.contextFromFlags,{interactiveOnly:!0});if(i(e.snapshotQuality))return _(e.snapshotQuality);let r=a(e.nodes),o=r.primaryAction;return o?await v(t,d,e,o):g(r.detected)}catch(t){return{ok:!1,error:e(t)}}}function h(e){return e.length===1&&e[0]===`dismiss-overlay`?{ok:!0}:{ok:!1,response:l(`INVALID_ARGS`,`react-native supports only: dismiss-overlay`)}}function g(e){return e?l(`COMMAND_FAILED`,`React Native overlay detected, but no safe dismiss target was found`,{hint:`Use screenshot --overlay-refs for visual evidence and report the overlay instead of pressing the warning body.`}):{ok:!0,data:{action:`dismiss-overlay`,detected:!1,dismissed:!1,...n(`No React Native overlay detected`)}}}function _(e){return l(`COMMAND_FAILED`,`React Native overlay state could not be determined because the accessibility tree is unreadable`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth; if an overlay is visible, report it or navigate with coordinates, then retry snapshot or dismiss-overlay on a readable screen.`})}async function v(e,r,i,a){let{req:o,sessionStore:s}=e,l=Date.now();u(r);let p=await c(r.device,`press`,[String(a.point.x),String(a.point.y)],o.flags?.out,e.contextFromFlags(o.flags,r.appBundleId,r.trace?.outPath))??{},m=Date.now(),h=await y(e,r),g=t({...f(i.nodes),...p,action:`dismiss-overlay`,overlayAction:a.action,x:a.point.x,y:a.point.y,ref:a.ref,label:a.label,warning:a.warning,dismissed:!0,verified:h.verified,verificationRequired:!h.verified,verificationWarning:h.verificationWarning,nextCommand:h.nextCommand,...n(b(h))});return d({session:r,sessionStore:s,command:o.command,positionals:o.positionals??[],flags:o.flags,result:g,responseData:g,actionStartedAt:l,actionFinishedAt:m})}async function y(e,t){let{req:n,sessionStore:r}=e,o=await p(t,n.flags,r,e.contextFromFlags,{interactiveOnly:!0});return i(o.snapshotQuality)?{verified:!1,verificationWarning:`React Native overlay dismissal could not be verified because the post-dismiss accessibility tree is unreadable. Use screenshot as visual truth.`,nextCommand:`agent-device screenshot`}:a(o.nodes).detected?{verified:!1,verificationWarning:`React Native overlay is still detected after dismissal. Use screenshot --overlay-refs for visual evidence and report the overlay instead of pressing the warning body.`,nextCommand:`agent-device screenshot --overlay-refs`}:{verified:!0}}function b(e){return e.verified?`React Native overlay dismiss action sent and verified gone`:`React Native overlay dismiss action sent, but verification still detects an overlay`}export{m as handleReactNativeCommands};
1
+ import{S as e}from"./sdk-contracts.js";import{T as t}from"./sdk-batch-runner.js";import{On as n,vn as r}from"./recording-export-quality.js";import{_ as i}from"./gesture-plan-types.js";import{f as a}from"./runtime.js";import{c as o,l as s,n as c,s as l}from"./context.js";import{Ft as u}from"./internal/daemon.js";import{i as d,n as f,t as p}from"./interaction-snapshot.js";async function m(t){let{req:r,sessionName:c,sessionStore:l}=t;if(r.command!==n.reactNative)return null;let u=h(r.positionals??[]);if(!u.ok)return u.response;let d=l.get(c);if(!d)return o();let f=s(n.reactNative,d.device,{message:`react-native dismiss-overlay is not supported on this device`});if(f)return f;try{let e=await p(d,r.flags,l,t.contextFromFlags,{interactiveOnly:!0});if(i(e.snapshotQuality))return _(e.snapshotQuality);let n=a(e.nodes),o=n.primaryAction;return o?await v(t,d,e,o):g(n.detected)}catch(t){return{ok:!1,error:e(t)}}}function h(e){return e.length===1&&e[0]===`dismiss-overlay`?{ok:!0}:{ok:!1,response:l(`INVALID_ARGS`,`react-native supports only: dismiss-overlay`)}}function g(e){return e?l(`COMMAND_FAILED`,`React Native overlay detected, but no safe dismiss target was found`,{hint:`Use screenshot --overlay-refs for visual evidence and report the overlay instead of pressing the warning body.`}):{ok:!0,data:{action:`dismiss-overlay`,detected:!1,dismissed:!1,...r(`No React Native overlay detected`)}}}function _(e){return l(`COMMAND_FAILED`,`React Native overlay state could not be determined because the accessibility tree is unreadable`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth; if an overlay is visible, report it or navigate with coordinates, then retry snapshot or dismiss-overlay on a readable screen.`})}async function v(e,n,i,a){let{req:o,sessionStore:s}=e,l=Date.now();u(n);let p=await c(n.device,`press`,[String(a.point.x),String(a.point.y)],o.flags?.out,e.contextFromFlags(o.flags,n.appBundleId,n.trace?.outPath))??{},m=Date.now(),h=await y(e,n),g=t({...f(i.nodes),...p,action:`dismiss-overlay`,overlayAction:a.action,x:a.point.x,y:a.point.y,ref:a.ref,label:a.label,warning:a.warning,dismissed:!0,verified:h.verified,verificationRequired:!h.verified,verificationWarning:h.verificationWarning,nextCommand:h.nextCommand,...r(b(h))});return d({session:n,sessionStore:s,command:o.command,positionals:o.positionals??[],flags:o.flags,result:g,responseData:g,actionStartedAt:l,actionFinishedAt:m})}async function y(e,t){let{req:n,sessionStore:r}=e,o=await p(t,n.flags,r,e.contextFromFlags,{interactiveOnly:!0});return i(o.snapshotQuality)?{verified:!1,verificationWarning:`React Native overlay dismissal could not be verified because the post-dismiss accessibility tree is unreadable. Use screenshot as visual truth.`,nextCommand:`agent-device screenshot`}:a(o.nodes).detected?{verified:!1,verificationWarning:`React Native overlay is still detected after dismissal. Use screenshot --overlay-refs for visual evidence and report the overlay instead of pressing the warning body.`,nextCommand:`agent-device screenshot --overlay-refs`}:{verified:!0}}function b(e){return e.verified?`React Native overlay dismiss action sent and verified gone`:`React Native overlay dismiss action sent, but verification still detects an overlay`}export{m as handleReactNativeCommands};
@@ -1,15 +1,14 @@
1
- import{S as e,T as t,_ as n,d as r,f as i,g as a,p as o,u as s}from"./sdk-contracts.js";import{$ as c,A as l,J as u,Q as d,T as f,X as p,Y as m,Z as h}from"./sdk-batch-runner.js";import{d as g}from"./sdk-device.js";import{$ as ee,F as te,G as ne,J as re,K as ie,P as ae,Q as oe,U as se,W as ce,Y as le,Z as ue,a as de,at as fe,c as pe,d as me,et as he,g as ge,h as _e,lt as ve,n as ye,nt as be,o as xe,p as Se,q as Ce,r as we,rt as _,s as v,st as Te,t as Ee,tt as De,u as Oe,z as ke}from"./sdk-selectors.js";import{r as Ae,t as je}from"./snapshot-quality.js";import{a as Me,c as y,r as b,s as Ne,t as Pe,u as x}from"./android-input-method-overlays.js";import{n as Fe,r as Ie}from"./android-system-chrome.js";import{createHash as Le}from"node:crypto";import Re from"node:path";import{styleText as ze}from"node:util";const Be=Ke(`public`),Ve=Ke(`internal`),He=Ke(`local-cli`),Ue={help:`help`};function We(){return[...Object.values(Be),...Object.values(He)].sort()}function Ge(e){return Object.values(Ue).includes(e)||Object.values(Ve).includes(e)?!0:We().includes(e)}function Ke(e){let t={};for(let[n,r]of l(e))t[n]=r;return t}const qe=[`out`,`overlayRefs`,`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotMaxSize`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],Je=[`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotMaxSize`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],Ye=[{key:`screenshotPixelDensity`,names:[`--pixel-density`],type:`int`,min:1,usageLabel:`--pixel-density <n>`,usageDescription:`Screenshot: output PNG pixel density in pixels per logical point (currently supported on iOS simulators)`},{key:`screenshotFullscreen`,names:[`--fullscreen`,`--full`,`-f`],type:`boolean`,usageLabel:`--fullscreen, --full, -f`,usageDescription:`Screenshot: on web capture the full page; on macOS app sessions capture the full desktop instead of the app window`},{key:`screenshotMaxSize`,names:[`--max-size`],type:`int`,min:1,usageLabel:`--max-size <px>`,usageDescription:`Screenshot/record: downscale so the longest edge is at most <px>`},{key:`screenshotNoStabilize`,names:[`--no-stabilize`],type:`boolean`,usageLabel:`--no-stabilize`,usageDescription:`Screenshot: skip Android demo-mode/status-bar stabilization and settle delay for low-latency capture loops`},{key:`screenshotNormalizeStatusBar`,names:[`--normalize-status-bar`],type:`boolean`,usageLabel:`--normalize-status-bar`,usageDescription:`Screenshot: on iOS simulators temporarily normalize status-bar chrome for deterministic screenshot diffs`}],Xe=[{tokens:[`--fullscreen`,`--full`,`-f`],key:`screenshotFullscreen`},{tokens:[`--no-stabilize`],key:`screenshotNoStabilize`},{tokens:[`--normalize-status-bar`],key:`screenshotNormalizeStatusBar`}],Ze=[{token:`--pixel-density`,key:`screenshotPixelDensity`,label:`screenshot --pixel-density`},{token:`--max-size`,key:`screenshotMaxSize`,label:`screenshot --max-size`}];function Qe(e){return nt({overlayRefs:e?.overlayRefs,pixelDensity:e?.screenshotPixelDensity,fullscreen:e?.screenshotFullscreen,maxSize:e?.screenshotMaxSize,stabilize:e?.screenshotNoStabilize?!1:void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function $e(e={}){return nt({overlayRefs:e.overlayRefs,screenshotPixelDensity:e.screenshotPixelDensity??e.pixelDensity,screenshotFullscreen:e.screenshotFullscreen??e.fullscreen,screenshotMaxSize:e.screenshotMaxSize??e.maxSize,screenshotNoStabilize:e.screenshotNoStabilize??(e.stabilize===!1?!0:void 0),screenshotNormalizeStatusBar:e.screenshotNormalizeStatusBar??e.normalizeStatusBar})}function et(e,t){typeof t?.screenshotPixelDensity==`number`&&e.push(`--pixel-density`,String(t.screenshotPixelDensity)),t?.screenshotFullscreen&&e.push(`--fullscreen`),typeof t?.screenshotMaxSize==`number`&&e.push(`--max-size`,String(t.screenshotMaxSize)),t?.screenshotNoStabilize&&e.push(`--no-stabilize`),t?.screenshotNormalizeStatusBar&&e.push(`--normalize-status-bar`)}function tt(e){let{args:t,flags:n,index:r}=e,i=t[r];return rt(i,n,r)??it({args:t,index:r,flags:n,token:i})??{handled:!1}}function nt(e){return Object.fromEntries(Object.entries(e).filter(e=>e[1]!==void 0))}function rt(e,t,n){let r=Xe.find(t=>t.tokens.some(t=>t===e));if(r)return t[r.key]=!0,{handled:!0,nextIndex:n}}function it(e){let t=Ze.find(t=>t.token===e.token);if(!t)return;let r=e.args[e.index+1],i=r===void 0?NaN:Number(r);if(!Number.isInteger(i)||i<1)throw new n(`INVALID_ARGS`,`${t.label} requires a positive integer`);return e.flags[t.key]=i,{handled:!0,nextIndex:e.index+1}}function S(e){return e?{message:e}:{}}function at(e,t){return t?{...e,message:t}:e}function ot(e){return typeof e?.message==`string`&&e.message.length>0?e.message:null}const st=[`in-app`,`system`],ct=[`app`,`device`,`system`];function lt(e){return e===`device`||e===`system`}function ut(e,t){return e.includes(t)}function dt(e,t,r={}){let i=t===void 0?void 0:r.normalize?.(t)??t;if(i!==void 0&&ut(e,i))return i;throw new n(`INVALID_ARGS`,(typeof r.message==`function`?r.message(t):r.message)??`Invalid value: ${t}. Use ${e.join(`|`)}.`)}function C(e,t={}){return{values:e,is:t=>ut(e,t),parse:n=>dt(e,n,t)}}const ft=[`app`,`frontmost-app`,`desktop`,`menubar`],pt=C(ft,{normalize:e=>e.trim().toLowerCase(),message:e=>`Invalid surface: ${e}. Use ${ft.join(`|`)}.`});function mt(e){return pt.parse(e)}const ht=[`up`,`down`,`left`,`right`],gt=[`left`,`right`,`left-edge`,`right-edge`],_t=[`one-way`,`ping-pong`],vt=1e4,yt=6e4,bt=C(ht,{message:e=>`Unknown direction: ${e}`});function xt(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=jt(e.amount),i=e.pixels===void 0?Math.round(n*r):Mt(e.pixels),a=Math.max(1,Math.round(n*.05)),o=Math.max(1,n-a*2),s=Math.max(1,Math.min(i,o)),c=Math.round(s/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),d=(n,r,i,a)=>({direction:t,x1:n,y1:r,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:s});switch(t){case`up`:return d(l,u-c,l,u+c);case`down`:return d(l,u+c,l,u-c);case`left`:return d(l-c,u,l+c,u);case`right`:return d(l+c,u,l-c,u)}}function St(e){jt(e.amount),e.pixels!==void 0&&Mt(e.pixels)}function Ct(e,t){if(e===`left`||e===`right`){let n=Tt(e,t);return{preset:e,x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,referenceWidth:n.referenceWidth,referenceHeight:n.referenceHeight}}let[n,r]=e===`left-edge`?[99,15]:[1,85],i=T(w(t,n,50),t,8),a=T(w(t,r,50),t,8);return{preset:e,x1:i.x,y1:i.y,x2:a.x,y2:a.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function wt(e,t){switch(e){case`up`:return{x:0,y:-t};case`down`:return{x:0,y:t};case`left`:return{x:-t,y:0};case`right`:return{x:t,y:0}}}function Tt(e,t){let n=e===`left`||e===`up`,r=n?85:15,i=n?15:85,a=e===`up`||e===`down`,o=T(w(t,a?50:r,a?r:50),t,8),s=T(w(t,a?50:i,a?i:50),t,8);return{direction:e,x1:o.x,y1:o.y,x2:s.x,y2:s.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function Et(e){let t=Ot(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function w(e,t,n){let r=Math.trunc(e.referenceWidth*t/100),i=Math.trunc(e.referenceHeight*n/100);return{x:Number.isFinite(r)?r:0,y:Number.isFinite(i)?i:0}}function T(e,t,n){return{x:Nt(e.x,n,t.referenceWidth),y:Nt(e.y,n,t.referenceHeight)}}function Dt(e){return bt.parse(e)}function Ot(e){let t=e.filter(e=>kt(e.type)&&At(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(t)return t;let n=e.map(e=>e.rect).filter(At);if(n.length===0)return;let r=Math.max(...n.map(e=>e.x+e.width)),i=Math.max(...n.map(e=>e.y+e.height));if(!(r<=0||i<=0))return{x:0,y:0,width:r,height:i}}function kt(e){if(!e)return!1;let t=e.toLowerCase();return t.includes(`application`)||t.includes(`window`)}function At(e){return!!e&&e.width>0&&e.height>0}function jt(e){if(e===void 0)return .6;if(!Number.isFinite(e)||e<=0)throw new n(`INVALID_ARGS`,`scroll amount must be a positive number`);return e}function Mt(e){if(!Number.isFinite(e)||e<=0)throw new n(`INVALID_ARGS`,`scroll pixels must be a positive integer`);return Math.max(1,Math.round(e))}function Nt(e,t,n){let r=Math.round(t);if(!Number.isFinite(r))return 0;let i=Math.max(r,Math.round(n-t));return!Number.isFinite(i)||!Number.isFinite(e)?r:Math.min(i,Math.max(r,Math.round(e)))}const Pt=[`primary`,`secondary`,`middle`];function Ft(e){return e?.clickButton??`primary`}function It(e){return e.button===`primary`?null:e.commandLabel===`click`?e.platform!==`macos`&&e.platform!==`linux`?new n(`UNSUPPORTED_OPERATION`,`click --button ${e.button} is supported only on macOS and Linux`):e.platform===`macos`&&e.button===`middle`?new n(`UNSUPPORTED_OPERATION`,`click --button middle is not supported by the macOS runner yet`):typeof e.count==`number`||typeof e.intervalMs==`number`||typeof e.holdMs==`number`||typeof e.jitterPx==`number`||e.doubleTap===!0?new n(`INVALID_ARGS`,`click --button ${e.button} does not support repeat or gesture modifier flags`):null:new n(`INVALID_ARGS`,`--button is supported only for click`)}function Lt(e){return e===`primary`?{}:{button:e}}const Rt=[`portrait`,`portrait-upside-down`,`landscape-left`,`landscape-right`];function zt(e){if(e===void 0)throw new n(`INVALID_ARGS`,`orientation 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 n(`INVALID_ARGS`,`Invalid rotation: ${e}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}const Bt={android:`longpress`,apple:`exact`,vega:`exact`},E={up:{aliases:[],androidKeyevent:`KEYCODE_DPAD_UP`,appleRemoteButton:`up`,vegaKey:`KEY_UP`},down:{aliases:[],androidKeyevent:`KEYCODE_DPAD_DOWN`,appleRemoteButton:`down`,vegaKey:`KEY_DOWN`},left:{aliases:[],androidKeyevent:`KEYCODE_DPAD_LEFT`,appleRemoteButton:`left`,vegaKey:`KEY_LEFT`},right:{aliases:[],androidKeyevent:`KEYCODE_DPAD_RIGHT`,appleRemoteButton:`right`,vegaKey:`KEY_RIGHT`},select:{aliases:[`ok`,`center`,`enter`],androidKeyevent:`KEYCODE_DPAD_CENTER`,appleRemoteButton:`select`,vegaKey:`KEY_ENTER`},menu:{aliases:[],androidKeyevent:`KEYCODE_MENU`,appleRemoteButton:`menu`,vegaKey:`KEY_MENU`},home:{aliases:[],androidKeyevent:`KEYCODE_HOME`,appleRemoteButton:`home`,vegaKey:`KEY_HOMEPAGE`},back:{aliases:[],androidKeyevent:`KEYCODE_BACK`,appleRemoteButton:`menu`,vegaKey:`KEY_BACK`}},D=Object.keys(E),Vt=`<${D.join(`|`)}>`;function Ht(e){let t=e?.toLowerCase();if(Ut(t))return t;let r=t?Jt.get(t):void 0;if(r)return r;throw new n(`INVALID_ARGS`,`tv-remote button must be one of: ${D.join(`, `)}.`)}function Ut(e){return typeof e==`string`&&D.includes(e)}function Wt(e){return E[e].appleRemoteButton}function Gt(e){return E[e].androidKeyevent}function Kt(e){return E[e].vegaKey}function qt(e){return Bt[e]}const Jt=new Map(D.flatMap(e=>E[e].aliases.map(t=>[t,e])));function O(e){return e.width>0&&e.height>0}function Yt(e,t){return!e||!t?!1:e.x>=t.x-2&&e.y>=t.y-2&&e.x+e.width<=t.x+t.width+2&&e.y+e.height<=t.y+t.height+2}function Xt(e,t){if(!e||!t)return!0;let n=e.y+e.height/2,r=t.y+t.height/2;return Math.abs(n-r)<=Math.max(e.height,t.height,1)}function Zt(e){return typeof e.parentIndex!=`number`}function Qt(e){let t=(e.type??``).toLowerCase(),n=(e.identifier??``).trim().toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)||n===`composer`}function $t(e){let t=(e.type??``).toLowerCase();return t.includes(`scroll`)||t.includes(`list`)||t.includes(`recyclerview`)}function k(e){let t=ve(e);if(!t||t!==e.identifier?.trim()||!en(t))return t;let n=(e.type??``).toLowerCase();return n.includes(`view`)||n.includes(`layout`)||n.includes(`image`)||n.includes(`list`)||n.includes(`recyclerview`)||n.includes(`collection`)?``:t}function A(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}function en(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function tn(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){let e=t.get(r.parentIndex);if(!e)return null;if(n(e))return e;r=e}return null}function nn(e,t){let n=[],r=[t];for(;r.length>0;){let t=r.pop();for(let i of e)i.parentIndex===t&&(n.push(i),r.push(i.index))}return n}function j(e,t,n){let r=[t];for(;r.length>0;){let t=r.pop();if(!n.has(t)){n.add(t);for(let i of e)i.parentIndex!==t||n.has(i.index)||r.push(i.index)}}}const rn=[`button`,`switch`,`checkbox`,`radio`],an=[`button`,`image`,`textview`,`view`];function on(e,t,n){for(let r of e){if(t.has(r.index)||!ln(r))continue;let i=un(nn(e,r.index),r,t);if(i.label){n.set(r.index,{...r,...n.get(r.index),label:i.label});for(let n of i.removableIndexes)j(e,n,t)}}}function sn(e,t,n){let r=new Map;for(let i of e){if(t.has(i.index)||!_n(i))continue;let a=A(k(i));if(!a)continue;let o=r.get(a);if(o&&mn(o,i,t)){let s=hn(e,o,i,t,n);r.set(a,s);continue}r.set(a,i)}}function cn(e,t){for(let n of e){if(t.has(n.index)||!fn(n))continue;let r=A(k(n));if(!r)continue;let i=nn(e,n.index).filter(e=>!t.has(e.index)&&pn(n,e,r));for(let n of i.filter(dn))j(e,n.index,t);let a=i.filter(e=>!dn(e)),o=new Set(a.map(e=>A(k(e))).filter(e=>!!e));if(!(a.length<2||o.size<2))for(let n of a)j(e,n.index,t)}}function ln(e){return e.hittable===!0&&!Qt(e)&&!!(e.rect&&O(e.rect))&&k(e).trim().length===0}function un(e,t,n){let r=[],i=[],a=new Set;for(let o of e){if(n.has(o.index)||!dn(o)||!Yt(o.rect,t.rect))continue;let e=k(o).trim().replace(/\s+/g,` `),s=A(e);i.push(o.index),!(!e||!s||a.has(s))&&(a.add(s),r.push(e))}return{label:r.join(`, `),removableIndexes:i}}function dn(e){if(e.hittable===!0||Qt(e))return!1;let t=(e.type??``).toLowerCase();return t.includes(`text`)||t.includes(`image`)||t.includes(`icon`)}function fn(e){return e.hittable===!0&&!Qt(e)&&!!(e.rect&&O(e.rect))&&!!A(k(e))}function pn(e,t,n){if(!_n(t)||!Yt(t.rect,e.rect))return!1;let r=A(k(t));return!!(r&&n!==r&&n.includes(r))}function mn(e,t,n){return!n.has(e.index)&&Xt(e.rect,t.rect)&&(Sn(e,t)||xn(e,t))}function hn(e,t,n,r,i){let a=vn(t,n),o=a.index===t.index?n:t,s=(o.type??``).toLowerCase().includes(`image`)?`has image`:null,c=i.get(a.index)??a,l=i.get(o.index)?.presentationHints??o.presentationHints;return i.set(a.index,{...c,presentationHints:gn(c.presentationHints,l,s)}),j(e,o.index,r),i.get(a.index)??a}function gn(e,t,n){return[...new Set([...Array.isArray(e)?e:[],...Array.isArray(t)?t:[],...n?[n]:[]])]}function _n(e){if(!e.rect||!O(e.rect)||Zt(e)||Qt(e))return!1;let t=(e.type??``).toLowerCase();return t===`text`||bn(t,an)}function vn(e,t){let n=yn(e);return yn(t)>n?t:e}function yn(e){let t=(e.type??``).toLowerCase(),n=0;return bn(t,rn)?n+=100:t.includes(`image`)?n+=30:t.includes(`textview`)||t===`text`?n+=20:t.includes(`view`)&&(n+=10),e.hittable===!0&&(n+=20),e.enabled!==!1&&(n+=5),n}function bn(e,t){return t.some(t=>e.includes(t))}function xn(e,t){let n=e.parentIndex===t.index?t:t.parentIndex===e.index?e:null,r=n?.index===e.index?t:n?.index===t.index?e:null;return!n||!r?!1:vn(n,r).index===n.index}function Sn(e,t){return e.parentIndex===t.parentIndex?Math.abs(e.index-t.index)<=3:e.parentIndex===t.index||t.parentIndex===e.index?!1:Math.abs((e.depth??0)-(t.depth??0))<=1&&Math.abs(e.index-t.index)<=2}function Cn(e,t,n){if(n.raw||!wn(e))return{nodes:t,filteredCount:0};let r=Tn(t);return{nodes:r,filteredCount:t.length-r.length}}function wn(e){let t=e.androidSnapshot;return!t||typeof t!=`object`?!1:t.backend===`android-helper`}function Tn(e){if(e.length===0)return e;let t=new Set,n=new Map,r=new Map(e.map(e=>[e.index,e]));return En(e,t),Dn(e,r,t,n),on(e,t,n),cn(e,t),sn(e,t,n),e.filter(e=>!t.has(e.index)).map(e=>n.get(e.index)??e)}function En(e,t){for(let n of e)!n.rect||O(n.rect)||Zt(n)||j(e,n.index,t)}function Dn(e,t,n,r){for(let i of e){if(n.has(i.index)||i.rect||Zt(i))continue;let a=tn(i,t,$t);a&&kn(r,a,On(i,e)),j(e,i.index,n)}}function On(e,t){let n=t.filter(t=>t.parentIndex===e.parentIndex&&t.rect&&O(t.rect)).map(e=>e.index);return n.length===0?null:e.index<Math.min(...n)?`above`:e.index>Math.max(...n)?`below`:null}function kn(e,t,n){if(!n)return;let r=e.get(t.index)??t;e.set(t.index,{...r,hiddenContentAbove:r.hiddenContentAbove===!0||n===`above`?!0:void 0,hiddenContentBelow:r.hiddenContentBelow===!0||n===`below`?!0:void 0})}function An(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||jn(t)?null:t}function jn(e){return/\S+@\S+\.\S+/.test(e)}function Mn(e){if(e.length<20)return!1;let t=new Map;for(let n of e){let e=(n.type??``).toLowerCase(),r=An(ve(n));if(!r)continue;let i=`${e}|${r}`,a=t.get(i)??[];a.push(n),t.set(i,a)}let n=0;for(let e of t.values())e.length<=1||!Nn(e)||(n+=e.length);return n>=8}function Nn(e){for(let t=0;t<e.length;t+=1)for(let n=t+1;n<e.length;n+=1)if(Pn(e[t]?.rect,e[n]?.rect))return!0;return!1}function Pn(e,t){if(!e||!t)return!0;let n=.5;return!(e.x+e.width<=t.x+n||t.x+t.width<=e.x+n||e.y+e.height<=t.y+n||t.y+t.height<=e.y+n)}const Fn={digest:8*1024,default:24*1024,full:64*1024};function In(e){return e===`digest`||e===`full`?e:`default`}function Ln(e,t=256){let n=Buffer.from(e,`utf8`);if(n.length<=t)return e;let r=`…<truncated>`,i=Buffer.byteLength(r,`utf8`),a=Math.max(0,t-i);for(;a>0&&(n[a]&192)==128;)--a;return`${n.subarray(0,a).toString(`utf8`)}${r}`}function M(e,n=256){return Ln(t(e),n)}function Rn(e,t){let n=e;for(let e of t)e.value&&(n=n.split(e.value).join(`<var:${e.name}>`));return n}function zn(e){return(t,n)=>M(Rn(t,e),n)}function Bn(e,t){return e.state!==`available`||e.refs.length<=t?e:{...e,refs:e.refs.slice(0,t),truncated:!0}}function Vn(e,t){let n=In(t),r=n===`digest`?8:20,i=Bn(e.screen,r),a=n===`digest`?[]:e.suggestions.slice(0,5);return{...e,screen:i,suggestions:a}}function Hn(e){return Buffer.byteLength(JSON.stringify(e),`utf8`)}function Un(e){let{divergence:t,level:n,writeOverflowArtifact:r}=e,i=In(n),a=Fn[i],o=Vn(t,n),s=Hn(o);if(s<=a)return o;let c=s-a,l=r(Vn(t,`full`)),u=Wn(o);return`artifactPath`in l?{...u,overflow:{omittedBytes:c,artifactPath:l.artifactPath}}:{...u,artifactUnavailable:!0}}function Wn(e){return{version:e.version,kind:e.kind,step:{index:e.step.index,source:{path:M(e.step.source.path),line:e.step.source.line}},action:M(e.action),cause:{code:e.cause.code,message:M(e.cause.message),...e.cause.hint?{hint:M(e.cause.hint)}:{}},screen:{state:`unavailable`,reason:`omitted-for-size`,hint:`The screen digest and suggestions were omitted to stay within the response byte budget. See overflow.artifactPath (or retry at --level full) for the complete report.`},suggestions:[],suggestionCount:e.suggestionCount,resume:e.resume,repairHint:e.repairHint,...e.targetBinding?{targetBinding:e.targetBinding}:{}}}function Gn(e){let t=e?.divergence;if(!t||typeof t!=`object`)return null;let n=t,r=[...ir(n.step),...er(n.kind,n.targetBinding),...Kn(n.repairHint,n.resume),...ar(n.screen),...lr(n.suggestions,n.suggestionCount),...dr(n.overflow,n.artifactUnavailable)];return r.length>0?r.join(`
2
- `):null}function Kn(e,t){if(typeof e!=`string`)return[];let n=Xn(e,t);return[`Repair hint: ${e}${n?` — ${n}`:``}`]}function qn(e){let t=e;if(!t||typeof t.allowed!=`boolean`)return;if(!t.allowed)return{allowed:!1,reason:typeof t.reason==`string`?t.reason:void 0};let{from:n,planDigest:r,alternateFrom:i}=t;if(!(typeof n!=`number`||typeof r!=`string`||r.length===0))return{allowed:!0,from:n,planDigest:r,alternateFrom:typeof i==`number`?i:void 0}}function Jn(e,t){return`replay --from ${e} --plan-digest ${t}`}function Yn(e){return e?.repairSessionHeld===!0}function Xn(e,t){let n=Zn(e,qn(t));if(n!==void 0)return Yn(t)?`${n} Read-only inspection while armed (snapshot -i, get attrs, find, is) is excluded from the healed script by default — no --no-record needed. If the step you are repairing is itself a read, add --record to that command so it lands in the heal.`:n}function Zn(e,t){switch(e){case`record-and-heal`:return t?.allowed?`press the correct control via a blessed @ref from screen.refs (recorded), then ${Jn(t.from,t.planDigest)}.`:`press the correct control via a blessed @ref from screen.refs (recorded). ${$n(t)}`;case`state-repair`:return t?.allowed?`fix app state with --no-record actions, then ${Jn(t.from,t.planDigest)} to re-run it.`:`fix app state with --no-record actions. ${$n(t)}`;case`caution`:return Qn({lead:`something already matches the recorded selector; a blind re-press may repeat the mistake.`,guidance:t});case`manual`:return Qn({lead:`no safe automated repair could be proven; inspect the screen and repair by hand.`,guidance:t});default:return}}function Qn(e){let{lead:t,guidance:n}=e;if(!n?.allowed)return`${t} ${$n(n)}`;let r=`if you fixed app state with --no-record actions: ${Jn(n.from,n.planDigest)}`;return n.alternateFrom===void 0?`${t} ${r}.`:`${t} ${r}; ${`if you performed the step's intent as a recorded action: ${Jn(n.alternateFrom,n.planDigest)}`}.`}function $n(e){return e&&!e.allowed&&e.reason?`This step cannot currently be resumed automatically (${e.reason}) — run a fresh full replay instead.`:`This step cannot currently be resumed automatically — run a fresh full replay instead.`}function er(e,t){if(typeof e!=`string`||e===`action-failure`)return[];let n=t;return n?[tr(e,n.matchCount),...nr(n.mismatches),...rr(n.candidates)]:[]}function tr(e,t){return`Target binding: ${e}${typeof t==`number`?` (matchCount ${t})`:``} — recorded target evidence did not verify.`}function nr(e){return!Array.isArray(e)||e.length===0?[]:[` mismatches: ${e.slice(0,5).join(`; `)}`]}function rr(e){return!Array.isArray(e)||e.length===0?[]:[` ${e.length} candidate(s) shared the recorded identity:`,...e.slice(0,5).map(e=>` ${cr(e)}`)]}function ir(e){let t=e;if(typeof t?.index!=`number`)return[];let n=t.source,r=typeof n?.path==`string`&&typeof n.line==`number`?` (${n.path}:${n.line})`:``;return[`Divergence at step ${t.index}${r}`]}function ar(e){let t=e;return t?.state===`available`&&Array.isArray(t.refs)?or(t.refs,t.refsGeneration):t?.state===`unavailable`?[sr(t)]:[]}function or(e,t){let n=e.slice(0,8).map(cr),r=e.length-n.length;return[`Screen: ${e.length} actionable ref(s) captured (refsGeneration ${t}).`,...n,...r>0?[` ... ${r} more`]:[]]}function sr(e){let t=typeof e.hint==`string`&&e.hint.length>0?` ${e.hint}`:``;return`Screen: unavailable (${String(e.reason??`unknown`)}).${t}`}function cr(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` @${String(t.ref)} [${String(t.role)}]${n}`}function lr(e,t){return Array.isArray(e)&&e.length>0?[`Suggestions:`,...e.slice(0,5).map(ur)]:typeof t==`number`&&t>0?[`Suggestions: ${t} available (omitted at this response level; rerun with --json for the full report).`]:[]}function ur(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` - [${String(t.basis)}]${n} ${String(t.selector)}`}function dr(e,t){return e&&typeof e==`object`?[`Full report written to ${String(e.artifactPath)}.`]:t===!0?[`Full report exceeded the response budget and the overflow artifact could not be written.`]:[]}const fr={application:`application`,navigationbar:`navigation-bar`,tabbar:`tab-bar`,button:`button`,imagebutton:`button`,link:`link`,cell:`cell`,statictext:`text`,checkedtextview:`text`,textbox:`text-field`,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`,heading:`heading`,activityindicator:`activity-indicator`,progressindicator:`progress-indicator`,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 pr(e,t={}){let n=[],r=[];for(let i of e){let e=i.depth??0,a=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||``,o=P(i.type??`Element`),s=i.inheritsLabel===!0||i.inheritsIdentifier===!0;if(o===`group`&&!a&&!s)continue;for(;n.length>0&&e<=n[n.length-1];)n.pop();let c=n.length;n.push(e),r.push({node:i,depth:c,type:o,text:mr(i,c,!1,o,t)})}return r}function mr(e,t,n,r,i={}){let a=r??P(e.type??`Element`),o=De(e,a),s=yr(e,a,i,o),c=` `.repeat(t),l=e.ref?`@${e.ref}`:``,u=br(e,a,i,o);!s&&(e.inheritsLabel===!0||e.inheritsIdentifier===!0)&&u.push(`same label as parent`);let d=u.map(e=>` [${e}]`).join(``),f=s?` "${s}"`:``;return n?`${c}${l} [${a}]${d}`.trimEnd():`${c}${l} [${a}]${f}${d}`.trimEnd()}function N(e,t){let n=e.label?.trim();if(n&&_r(t,n))return``;let r=e.value?.trim();if(gr(t)){if(r)return r;if(n)return n}else if(n)return n;if(r)return r;let i=e.identifier?.trim();return!i||vr(i)&&(t===`group`||t===`image`||t===`list`||t===`collection`)?``:i}function P(e){let t=e,n=e.replace(/XCUIElementType/gi,``).toLowerCase(),r=t.includes(`.`)&&(t.startsWith(`android.`)||t.startsWith(`androidx.`)||t.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))),n===`textview`?r?`text`:`text-view`:hr(n)||n||`element`}function hr(e){return Object.prototype.hasOwnProperty.call(fr,e)?fr[e]:void 0}function gr(e){return e===`text-field`||e===`text-view`||e===`search`}function _r(e,t){return e!==`scroll-area`&&e!==`list`&&e!==`collection`&&e!==`table`?!1:Te(t)}function vr(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function yr(e,t,n,r){return!n.summarizeTextSurfaces||!r.shouldSummarize?N(e,t):xr(e,t,r.text)||N(e,t)}function br(e,t,n,r){let i=[];return e.enabled===!1&&i.push(`disabled`),i.push(...e.presentationHints??[]),!n.summarizeTextSurfaces||(e.selected===!0&&i.push(`selected`),e.focused===!0&&i.push(`focused`),gr(t)&&i.push(`editable`),Sr(e,t)&&i.push(`scrollable`),!r.shouldSummarize)?wr(i):(i.push(`preview:"${Cr(he(r.text))}"`),i.push(`truncated`),wr(i))}function xr(e,t,n){let r=fe(e.label);if(r&&r!==n)return r;let i=fe(e.identifier);if(i&&!vr(i)&&i!==n)return i;switch(t){case`text`:case`text-view`:return`Text view`;case`text-field`:return`Text field`;case`search`:return`Search field`;default:return``}}function Sr(e,t){if(t===`scroll-area`)return!0;let n=(e.type??``).toLowerCase(),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`scroll`)||r.includes(`scroll`)}function Cr(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function wr(e){return[...new Set(e)]}function Tr(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function Er(t,r={}){let i=t instanceof n?e(t):t;process.stderr.write(`Error (${i.code}): ${i.message}\n`),i.hint&&process.stderr.write(`Hint: ${i.hint}\n`),i.diagnosticId&&process.stderr.write(`Diagnostic ID: ${i.diagnosticId}\n`),i.logPath&&process.stderr.write(`Diagnostics Log: ${i.logPath}\n`);let a=Gn(i.details);a&&process.stderr.write(`${a}\n`),r.showDetails&&i.details&&process.stderr.write(`${JSON.stringify(i.details,null,2)}\n`)}function Dr(e,t={}){let n=e.nodes,r=Array.isArray(n)?n:[],o=a(i(e.backend)?e.backend:void 0),s=Cn(e,r,t),c=jr(e),l=ii(e,r,t,s),u=l.length>0?`${l.join(`
3
- `)}\n`:``,d=t.raw?null:Or(e);if(d)return`${c}${u}${kr(d)}\n`;let f=t.raw||!o?null:se(s.nodes),p=!!e.truncated,m=f?.nodes??r,h=t.raw||!o?null:Lr(e,f,m.length,r.length,s.filteredCount),g=Mr(r.length,h,p);return r.length===0?`${c}${g}\n${u}`:t.raw?`${c}${g}\n${u}${Nr(r)}\n`:t.flatten?`${c}${g}\n${u}${Pr(m)}${Ir(f)}\n`:`${c}${g}\n${u}${Fr(m)}${Ir(f)}\n`}function Or(e){let t=e.unchanged;if(!t||typeof t!=`object`)return null;let n=t;return typeof n.ageMs!=`number`||typeof n.nodeCount!=`number`?null:{ageMs:n.ageMs,nodeCount:n.nodeCount,interactiveOnly:n.interactiveOnly===!0?!0:void 0,scope:typeof n.scope==`string`?n.scope:void 0}}function kr(e){let t=Ar(e.ageMs);return e.scope?[`Scoped snapshot unchanged for scope "${e.scope}" since previous read ${t} ago.`,`Previous refs in this scope remain valid. Use find/get/is for a targeted query, or --force-full to re-emit.`].join(`
1
+ import{S as e,T as t,_ as n,d as r,f as i,g as a,p as o,u as s}from"./sdk-contracts.js";import{$ as c,A as l,J as u,Q as d,T as f,X as p,Y as m,Z as h}from"./sdk-batch-runner.js";import{d as g}from"./sdk-device.js";import{$ as ee,F as te,G as ne,J as re,K as ie,P as ae,Q as oe,U as se,W as ce,Y as le,Z as ue,a as de,at as fe,c as pe,d as me,et as he,g as ge,h as _e,lt as ve,n as ye,nt as be,o as xe,p as Se,q as Ce,r as we,rt as _,s as v,st as Te,t as Ee,tt as De,u as Oe,z as ke}from"./sdk-selectors.js";import{A as Ae,P as je,U as y,_ as Me,i as Ne,l as Pe,m as Fe,r as Ie,t as Le}from"./gesture-plan-types.js";import{a as Re,c as b,r as x,s as ze,t as Be,u as S}from"./android-input-method-overlays.js";import{createHash as Ve}from"node:crypto";import He from"node:path";import{styleText as Ue}from"node:util";const We=Xe(`public`),Ge=Xe(`internal`),Ke=Xe(`local-cli`),qe={help:`help`};function Je(){return[...Object.values(We),...Object.values(Ke)].sort()}function Ye(e){return Object.values(qe).includes(e)||Object.values(Ge).includes(e)?!0:Je().includes(e)}function Xe(e){let t={};for(let[n,r]of l(e))t[n]=r;return t}const Ze=[`out`,`overlayRefs`,`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotMaxSize`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],Qe=[`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotMaxSize`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],$e=[{key:`screenshotPixelDensity`,names:[`--pixel-density`],type:`int`,min:1,usageLabel:`--pixel-density <n>`,usageDescription:`Screenshot: output PNG pixel density in pixels per logical point (currently supported on iOS simulators)`},{key:`screenshotFullscreen`,names:[`--fullscreen`,`--full`,`-f`],type:`boolean`,usageLabel:`--fullscreen, --full, -f`,usageDescription:`Screenshot: on web capture the full page; on macOS app sessions capture the full desktop instead of the app window`},{key:`screenshotMaxSize`,names:[`--max-size`],type:`int`,min:1,usageLabel:`--max-size <px>`,usageDescription:`Screenshot/record: downscale so the longest edge is at most <px>`},{key:`screenshotNoStabilize`,names:[`--no-stabilize`],type:`boolean`,usageLabel:`--no-stabilize`,usageDescription:`Screenshot: skip Android demo-mode/status-bar stabilization and settle delay for low-latency capture loops`},{key:`screenshotNormalizeStatusBar`,names:[`--normalize-status-bar`],type:`boolean`,usageLabel:`--normalize-status-bar`,usageDescription:`Screenshot: on iOS simulators temporarily normalize status-bar chrome for deterministic screenshot diffs`}],et=[{tokens:[`--fullscreen`,`--full`,`-f`],key:`screenshotFullscreen`},{tokens:[`--no-stabilize`],key:`screenshotNoStabilize`},{tokens:[`--normalize-status-bar`],key:`screenshotNormalizeStatusBar`}],tt=[{token:`--pixel-density`,key:`screenshotPixelDensity`,label:`screenshot --pixel-density`},{token:`--max-size`,key:`screenshotMaxSize`,label:`screenshot --max-size`}];function nt(e){return ot({overlayRefs:e?.overlayRefs,pixelDensity:e?.screenshotPixelDensity,fullscreen:e?.screenshotFullscreen,maxSize:e?.screenshotMaxSize,stabilize:e?.screenshotNoStabilize?!1:void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function rt(e={}){return ot({overlayRefs:e.overlayRefs,screenshotPixelDensity:e.screenshotPixelDensity??e.pixelDensity,screenshotFullscreen:e.screenshotFullscreen??e.fullscreen,screenshotMaxSize:e.screenshotMaxSize??e.maxSize,screenshotNoStabilize:e.screenshotNoStabilize??(e.stabilize===!1?!0:void 0),screenshotNormalizeStatusBar:e.screenshotNormalizeStatusBar??e.normalizeStatusBar})}function it(e,t){typeof t?.screenshotPixelDensity==`number`&&e.push(`--pixel-density`,String(t.screenshotPixelDensity)),t?.screenshotFullscreen&&e.push(`--fullscreen`),typeof t?.screenshotMaxSize==`number`&&e.push(`--max-size`,String(t.screenshotMaxSize)),t?.screenshotNoStabilize&&e.push(`--no-stabilize`),t?.screenshotNormalizeStatusBar&&e.push(`--normalize-status-bar`)}function at(e){let{args:t,flags:n,index:r}=e,i=t[r];return st(i,n,r)??ct({args:t,index:r,flags:n,token:i})??{handled:!1}}function ot(e){return Object.fromEntries(Object.entries(e).filter(e=>e[1]!==void 0))}function st(e,t,n){let r=et.find(t=>t.tokens.some(t=>t===e));if(r)return t[r.key]=!0,{handled:!0,nextIndex:n}}function ct(e){let t=tt.find(t=>t.token===e.token);if(!t)return;let r=e.args[e.index+1],i=r===void 0?NaN:Number(r);if(!Number.isInteger(i)||i<1)throw new n(`INVALID_ARGS`,`${t.label} requires a positive integer`);return e.flags[t.key]=i,{handled:!0,nextIndex:e.index+1}}function C(e){return e?{message:e}:{}}function w(e,t){return t?{...e,message:t}:e}function lt(e){return typeof e?.message==`string`&&e.message.length>0?e.message:null}const ut=[`in-app`,`system`],dt=[`app`,`device`,`system`];function ft(e){return e===`device`||e===`system`}const pt=[`app`,`frontmost-app`,`desktop`,`menubar`],mt=y(pt,{normalize:e=>e.trim().toLowerCase(),message:e=>`Invalid surface: ${e}. Use ${pt.join(`|`)}.`});function ht(e){return mt.parse(e)}const gt=[`primary`,`secondary`,`middle`];function _t(e){return e?.clickButton??`primary`}function vt(e){return e.button===`primary`?null:e.commandLabel===`click`?e.platform!==`macos`&&e.platform!==`linux`?new n(`UNSUPPORTED_OPERATION`,`click --button ${e.button} is supported only on macOS and Linux`):e.platform===`macos`&&e.button===`middle`?new n(`UNSUPPORTED_OPERATION`,`click --button middle is not supported by the macOS runner yet`):typeof e.count==`number`||typeof e.intervalMs==`number`||typeof e.holdMs==`number`||typeof e.jitterPx==`number`||e.doubleTap===!0?new n(`INVALID_ARGS`,`click --button ${e.button} does not support repeat or gesture modifier flags`):null:new n(`INVALID_ARGS`,`--button is supported only for click`)}function yt(e){return e===`primary`?{}:{button:e}}const bt=[`portrait`,`portrait-upside-down`,`landscape-left`,`landscape-right`];function xt(e){if(e===void 0)throw new n(`INVALID_ARGS`,`orientation 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 n(`INVALID_ARGS`,`Invalid rotation: ${e}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}function T(e){return e.width>0&&e.height>0}function St(e,t){return!e||!t?!1:e.x>=t.x-2&&e.y>=t.y-2&&e.x+e.width<=t.x+t.width+2&&e.y+e.height<=t.y+t.height+2}function Ct(e,t){if(!e||!t)return!0;let n=e.y+e.height/2,r=t.y+t.height/2;return Math.abs(n-r)<=Math.max(e.height,t.height,1)}function wt(e){return typeof e.parentIndex!=`number`}function Tt(e){let t=(e.type??``).toLowerCase(),n=(e.identifier??``).trim().toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)||n===`composer`}function Et(e){let t=(e.type??``).toLowerCase();return t.includes(`scroll`)||t.includes(`list`)||t.includes(`recyclerview`)}function E(e){let t=ve(e);if(!t||t!==e.identifier?.trim()||!Dt(t))return t;let n=(e.type??``).toLowerCase();return n.includes(`view`)||n.includes(`layout`)||n.includes(`image`)||n.includes(`list`)||n.includes(`recyclerview`)||n.includes(`collection`)?``:t}function D(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}function Dt(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function Ot(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){let e=t.get(r.parentIndex);if(!e)return null;if(n(e))return e;r=e}return null}function kt(e,t){let n=[],r=[t];for(;r.length>0;){let t=r.pop();for(let i of e)i.parentIndex===t&&(n.push(i),r.push(i.index))}return n}function O(e,t,n){let r=[t];for(;r.length>0;){let t=r.pop();if(!n.has(t)){n.add(t);for(let i of e)i.parentIndex!==t||n.has(i.index)||r.push(i.index)}}}const At=[`button`,`switch`,`checkbox`,`radio`],jt=[`button`,`image`,`textview`,`view`];function Mt(e,t,n){for(let r of e){if(t.has(r.index)||!Ft(r))continue;let i=It(kt(e,r.index),r,t);if(i.label){n.set(r.index,{...r,...n.get(r.index),label:i.label});for(let n of i.removableIndexes)O(e,n,t)}}}function Nt(e,t,n){let r=new Map;for(let i of e){if(t.has(i.index)||!Ut(i))continue;let a=D(E(i));if(!a)continue;let o=r.get(a);if(o&&Bt(o,i,t)){let s=Vt(e,o,i,t,n);r.set(a,s);continue}r.set(a,i)}}function Pt(e,t){for(let n of e){if(t.has(n.index)||!Rt(n))continue;let r=D(E(n));if(!r)continue;let i=kt(e,n.index).filter(e=>!t.has(e.index)&&zt(n,e,r));for(let n of i.filter(Lt))O(e,n.index,t);let a=i.filter(e=>!Lt(e)),o=new Set(a.map(e=>D(E(e))).filter(e=>!!e));if(!(a.length<2||o.size<2))for(let n of a)O(e,n.index,t)}}function Ft(e){return e.hittable===!0&&!Tt(e)&&!!(e.rect&&T(e.rect))&&E(e).trim().length===0}function It(e,t,n){let r=[],i=[],a=new Set;for(let o of e){if(n.has(o.index)||!Lt(o)||!St(o.rect,t.rect))continue;let e=E(o).trim().replace(/\s+/g,` `),s=D(e);i.push(o.index),!(!e||!s||a.has(s))&&(a.add(s),r.push(e))}return{label:r.join(`, `),removableIndexes:i}}function Lt(e){if(e.hittable===!0||Tt(e))return!1;let t=(e.type??``).toLowerCase();return t.includes(`text`)||t.includes(`image`)||t.includes(`icon`)}function Rt(e){return e.hittable===!0&&!Tt(e)&&!!(e.rect&&T(e.rect))&&!!D(E(e))}function zt(e,t,n){if(!Ut(t)||!St(t.rect,e.rect))return!1;let r=D(E(t));return!!(r&&n!==r&&n.includes(r))}function Bt(e,t,n){return!n.has(e.index)&&Ct(e.rect,t.rect)&&(Jt(e,t)||qt(e,t))}function Vt(e,t,n,r,i){let a=Wt(t,n),o=a.index===t.index?n:t,s=(o.type??``).toLowerCase().includes(`image`)?`has image`:null,c=i.get(a.index)??a,l=i.get(o.index)?.presentationHints??o.presentationHints;return i.set(a.index,{...c,presentationHints:Ht(c.presentationHints,l,s)}),O(e,o.index,r),i.get(a.index)??a}function Ht(e,t,n){return[...new Set([...Array.isArray(e)?e:[],...Array.isArray(t)?t:[],...n?[n]:[]])]}function Ut(e){if(!e.rect||!T(e.rect)||wt(e)||Tt(e))return!1;let t=(e.type??``).toLowerCase();return t===`text`||Kt(t,jt)}function Wt(e,t){let n=Gt(e);return Gt(t)>n?t:e}function Gt(e){let t=(e.type??``).toLowerCase(),n=0;return Kt(t,At)?n+=100:t.includes(`image`)?n+=30:t.includes(`textview`)||t===`text`?n+=20:t.includes(`view`)&&(n+=10),e.hittable===!0&&(n+=20),e.enabled!==!1&&(n+=5),n}function Kt(e,t){return t.some(t=>e.includes(t))}function qt(e,t){let n=e.parentIndex===t.index?t:t.parentIndex===e.index?e:null,r=n?.index===e.index?t:n?.index===t.index?e:null;return!n||!r?!1:Wt(n,r).index===n.index}function Jt(e,t){return e.parentIndex===t.parentIndex?Math.abs(e.index-t.index)<=3:e.parentIndex===t.index||t.parentIndex===e.index?!1:Math.abs((e.depth??0)-(t.depth??0))<=1&&Math.abs(e.index-t.index)<=2}function Yt(e,t,n){if(n.raw||!Xt(e))return{nodes:t,filteredCount:0};let r=Zt(t);return{nodes:r,filteredCount:t.length-r.length}}function Xt(e){let t=e.androidSnapshot;return!t||typeof t!=`object`?!1:t.backend===`android-helper`}function Zt(e){if(e.length===0)return e;let t=new Set,n=new Map,r=new Map(e.map(e=>[e.index,e]));return Qt(e,t),$t(e,r,t,n),Mt(e,t,n),Pt(e,t),Nt(e,t,n),e.filter(e=>!t.has(e.index)).map(e=>n.get(e.index)??e)}function Qt(e,t){for(let n of e)!n.rect||T(n.rect)||wt(n)||O(e,n.index,t)}function $t(e,t,n,r){for(let i of e){if(n.has(i.index)||i.rect||wt(i))continue;let a=Ot(i,t,Et);a&&tn(r,a,en(i,e)),O(e,i.index,n)}}function en(e,t){let n=t.filter(t=>t.parentIndex===e.parentIndex&&t.rect&&T(t.rect)).map(e=>e.index);return n.length===0?null:e.index<Math.min(...n)?`above`:e.index>Math.max(...n)?`below`:null}function tn(e,t,n){if(!n)return;let r=e.get(t.index)??t;e.set(t.index,{...r,hiddenContentAbove:r.hiddenContentAbove===!0||n===`above`?!0:void 0,hiddenContentBelow:r.hiddenContentBelow===!0||n===`below`?!0:void 0})}function nn(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||rn(t)?null:t}function rn(e){return/\S+@\S+\.\S+/.test(e)}function an(e){if(e.length<20)return!1;let t=new Map;for(let n of e){let e=(n.type??``).toLowerCase(),r=nn(ve(n));if(!r)continue;let i=`${e}|${r}`,a=t.get(i)??[];a.push(n),t.set(i,a)}let n=0;for(let e of t.values())e.length<=1||!on(e)||(n+=e.length);return n>=8}function on(e){for(let t=0;t<e.length;t+=1)for(let n=t+1;n<e.length;n+=1)if(sn(e[t]?.rect,e[n]?.rect))return!0;return!1}function sn(e,t){if(!e||!t)return!0;let n=.5;return!(e.x+e.width<=t.x+n||t.x+t.width<=e.x+n||e.y+e.height<=t.y+n||t.y+t.height<=e.y+n)}const cn={digest:8*1024,default:24*1024,full:64*1024};function ln(e){return e===`digest`||e===`full`?e:`default`}function un(e,t=256){let n=Buffer.from(e,`utf8`);if(n.length<=t)return e;let r=`…<truncated>`,i=Buffer.byteLength(r,`utf8`),a=Math.max(0,t-i);for(;a>0&&(n[a]&192)==128;)--a;return`${n.subarray(0,a).toString(`utf8`)}${r}`}function k(e,n=256){return un(t(e),n)}function dn(e,t){let n=e;for(let e of t)e.value&&(n=n.split(e.value).join(`<var:${e.name}>`));return n}function fn(e){return(t,n)=>k(dn(t,e),n)}function pn(e,t){return e.state!==`available`||e.refs.length<=t?e:{...e,refs:e.refs.slice(0,t),truncated:!0}}function mn(e,t){let n=ln(t),r=n===`digest`?8:20,i=pn(e.screen,r),a=n===`digest`?[]:e.suggestions.slice(0,5);return{...e,screen:i,suggestions:a}}function hn(e){return Buffer.byteLength(JSON.stringify(e),`utf8`)}function gn(e){let{divergence:t,level:n,writeOverflowArtifact:r}=e,i=ln(n),a=cn[i],o=mn(t,n),s=hn(o);if(s<=a)return o;let c=s-a,l=r(mn(t,`full`)),u=_n(o);return`artifactPath`in l?{...u,overflow:{omittedBytes:c,artifactPath:l.artifactPath}}:{...u,artifactUnavailable:!0}}function _n(e){return{version:e.version,kind:e.kind,step:{index:e.step.index,source:{path:k(e.step.source.path),line:e.step.source.line}},action:k(e.action),cause:{code:e.cause.code,message:k(e.cause.message),...e.cause.hint?{hint:k(e.cause.hint)}:{}},screen:{state:`unavailable`,reason:`omitted-for-size`,hint:`The screen digest and suggestions were omitted to stay within the response byte budget. See overflow.artifactPath (or retry at --level full) for the complete report.`},suggestions:[],suggestionCount:e.suggestionCount,resume:e.resume,repairHint:e.repairHint,...e.targetBinding?{targetBinding:e.targetBinding}:{}}}function vn(e){let t=e?.divergence;if(!t||typeof t!=`object`)return null;let n=t,r=[...An(n.step),...En(n.kind,n.targetBinding),...yn(n.repairHint,n.resume),...jn(n.screen),...Fn(n.suggestions,n.suggestionCount),...Ln(n.overflow,n.artifactUnavailable)];return r.length>0?r.join(`
2
+ `):null}function yn(e,t){if(typeof e!=`string`)return[];let n=Sn(e,t);return[`Repair hint: ${e}${n?` — ${n}`:``}`]}function bn(e){let t=e;if(!t||typeof t.allowed!=`boolean`)return;if(!t.allowed)return{allowed:!1,reason:typeof t.reason==`string`?t.reason:void 0};let{from:n,planDigest:r,alternateFrom:i}=t;if(!(typeof n!=`number`||typeof r!=`string`||r.length===0))return{allowed:!0,from:n,planDigest:r,alternateFrom:typeof i==`number`?i:void 0}}function A(e,t){return`replay --from ${e} --plan-digest ${t}`}function xn(e){return e?.repairSessionHeld===!0}function Sn(e,t){let n=Cn(e,bn(t));if(n!==void 0)return xn(t)?`${n} Read-only inspection while armed (snapshot -i, get attrs, find, is) is excluded from the healed script by default — no --no-record needed. If the step you are repairing is itself a read, add --record to that command so it lands in the heal.`:n}function Cn(e,t){switch(e){case`record-and-heal`:return t?.allowed?`press the correct control via a blessed @ref from screen.refs (recorded), then ${A(t.from,t.planDigest)}.`:`press the correct control via a blessed @ref from screen.refs (recorded). ${Tn(t)}`;case`state-repair`:return t?.allowed?`fix app state with --no-record actions, then ${A(t.from,t.planDigest)} to re-run it.`:`fix app state with --no-record actions. ${Tn(t)}`;case`caution`:return wn({lead:`something already matches the recorded selector; a blind re-press may repeat the mistake.`,guidance:t});case`manual`:return wn({lead:`no safe automated repair could be proven; inspect the screen and repair by hand.`,guidance:t});default:return}}function wn(e){let{lead:t,guidance:n}=e;if(!n?.allowed)return`${t} ${Tn(n)}`;let r=`if you fixed app state with --no-record actions: ${A(n.from,n.planDigest)}`;return n.alternateFrom===void 0?`${t} ${r}.`:`${t} ${r}; ${`if you performed the step's intent as a recorded action: ${A(n.alternateFrom,n.planDigest)}`}.`}function Tn(e){return e&&!e.allowed&&e.reason?`This step cannot currently be resumed automatically (${e.reason}) — run a fresh full replay instead.`:`This step cannot currently be resumed automatically — run a fresh full replay instead.`}function En(e,t){if(typeof e!=`string`||e===`action-failure`)return[];let n=t;return n?[Dn(e,n.matchCount),...On(n.mismatches),...kn(n.candidates)]:[]}function Dn(e,t){return`Target binding: ${e}${typeof t==`number`?` (matchCount ${t})`:``} — recorded target evidence did not verify.`}function On(e){return!Array.isArray(e)||e.length===0?[]:[` mismatches: ${e.slice(0,5).join(`; `)}`]}function kn(e){return!Array.isArray(e)||e.length===0?[]:[` ${e.length} candidate(s) shared the recorded identity:`,...e.slice(0,5).map(e=>` ${Pn(e)}`)]}function An(e){let t=e;if(typeof t?.index!=`number`)return[];let n=t.source,r=typeof n?.path==`string`&&typeof n.line==`number`?` (${n.path}:${n.line})`:``;return[`Divergence at step ${t.index}${r}`]}function jn(e){let t=e;return t?.state===`available`&&Array.isArray(t.refs)?Mn(t.refs,t.refsGeneration):t?.state===`unavailable`?[Nn(t)]:[]}function Mn(e,t){let n=e.slice(0,8).map(Pn),r=e.length-n.length;return[`Screen: ${e.length} actionable ref(s) captured (refsGeneration ${t}).`,...n,...r>0?[` ... ${r} more`]:[]]}function Nn(e){let t=typeof e.hint==`string`&&e.hint.length>0?` ${e.hint}`:``;return`Screen: unavailable (${String(e.reason??`unknown`)}).${t}`}function Pn(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` @${String(t.ref)} [${String(t.role)}]${n}`}function Fn(e,t){return Array.isArray(e)&&e.length>0?[`Suggestions:`,...e.slice(0,5).map(In)]:typeof t==`number`&&t>0?[`Suggestions: ${t} available (omitted at this response level; rerun with --json for the full report).`]:[]}function In(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` - [${String(t.basis)}]${n} ${String(t.selector)}`}function Ln(e,t){return e&&typeof e==`object`?[`Full report written to ${String(e.artifactPath)}.`]:t===!0?[`Full report exceeded the response budget and the overflow artifact could not be written.`]:[]}const Rn={application:`application`,navigationbar:`navigation-bar`,tabbar:`tab-bar`,button:`button`,imagebutton:`button`,link:`link`,cell:`cell`,statictext:`text`,checkedtextview:`text`,textbox:`text-field`,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`,heading:`heading`,activityindicator:`activity-indicator`,progressindicator:`progress-indicator`,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 zn(e,t={}){let n=[],r=[];for(let i of e){let e=i.depth??0,a=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||``,o=M(i.type??`Element`),s=i.inheritsLabel===!0||i.inheritsIdentifier===!0;if(o===`group`&&!a&&!s)continue;for(;n.length>0&&e<=n[n.length-1];)n.pop();let c=n.length;n.push(e),r.push({node:i,depth:c,type:o,text:Bn(i,c,!1,o,t)})}return r}function Bn(e,t,n,r,i={}){let a=r??M(e.type??`Element`),o=De(e,a),s=Gn(e,a,i,o),c=` `.repeat(t),l=e.ref?`@${e.ref}`:``,u=Kn(e,a,i,o);!s&&(e.inheritsLabel===!0||e.inheritsIdentifier===!0)&&u.push(`same label as parent`);let d=u.map(e=>` [${e}]`).join(``),f=s?` "${s}"`:``;return n?`${c}${l} [${a}]${d}`.trimEnd():`${c}${l} [${a}]${f}${d}`.trimEnd()}function j(e,t){let n=e.label?.trim();if(n&&Un(t,n))return``;let r=e.value?.trim();if(Hn(t)){if(r)return r;if(n)return n}else if(n)return n;if(r)return r;let i=e.identifier?.trim();return!i||Wn(i)&&(t===`group`||t===`image`||t===`list`||t===`collection`)?``:i}function M(e){let t=e,n=e.replace(/XCUIElementType/gi,``).toLowerCase(),r=t.includes(`.`)&&(t.startsWith(`android.`)||t.startsWith(`androidx.`)||t.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))),n===`textview`?r?`text`:`text-view`:Vn(n)||n||`element`}function Vn(e){return Object.prototype.hasOwnProperty.call(Rn,e)?Rn[e]:void 0}function Hn(e){return e===`text-field`||e===`text-view`||e===`search`}function Un(e,t){return e!==`scroll-area`&&e!==`list`&&e!==`collection`&&e!==`table`?!1:Te(t)}function Wn(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function Gn(e,t,n,r){return!n.summarizeTextSurfaces||!r.shouldSummarize?j(e,t):qn(e,t,r.text)||j(e,t)}function Kn(e,t,n,r){let i=[];return e.enabled===!1&&i.push(`disabled`),i.push(...e.presentationHints??[]),!n.summarizeTextSurfaces||(e.selected===!0&&i.push(`selected`),e.focused===!0&&i.push(`focused`),Hn(t)&&i.push(`editable`),Jn(e,t)&&i.push(`scrollable`),!r.shouldSummarize)?Xn(i):(i.push(`preview:"${Yn(he(r.text))}"`),i.push(`truncated`),Xn(i))}function qn(e,t,n){let r=fe(e.label);if(r&&r!==n)return r;let i=fe(e.identifier);if(i&&!Wn(i)&&i!==n)return i;switch(t){case`text`:case`text-view`:return`Text view`;case`text-field`:return`Text field`;case`search`:return`Search field`;default:return``}}function Jn(e,t){if(t===`scroll-area`)return!0;let n=(e.type??``).toLowerCase(),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`scroll`)||r.includes(`scroll`)}function Yn(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function Xn(e){return[...new Set(e)]}function Zn(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function Qn(t,r={}){let i=t instanceof n?e(t):t;process.stderr.write(`Error (${i.code}): ${i.message}\n`),i.hint&&process.stderr.write(`Hint: ${i.hint}\n`),i.diagnosticId&&process.stderr.write(`Diagnostic ID: ${i.diagnosticId}\n`),i.logPath&&process.stderr.write(`Diagnostics Log: ${i.logPath}\n`);let a=vn(i.details);a&&process.stderr.write(`${a}\n`),r.showDetails&&i.details&&process.stderr.write(`${JSON.stringify(i.details,null,2)}\n`)}function $n(e,t={}){let n=e.nodes,r=Array.isArray(n)?n:[],o=a(i(e.backend)?e.backend:void 0),s=Yt(e,r,t),c=rr(e),l=Ar(e,r,t,s),u=l.length>0?`${l.join(`
3
+ `)}\n`:``,d=t.raw?null:er(e);if(d)return`${c}${u}${tr(d)}\n`;let f=t.raw||!o?null:se(s.nodes),p=!!e.truncated,m=f?.nodes??r,h=t.raw||!o?null:lr(e,f,m.length,r.length,s.filteredCount),g=ir(r.length,h,p);return r.length===0?`${c}${g}\n${u}`:t.raw?`${c}${g}\n${u}${ar(r)}\n`:t.flatten?`${c}${g}\n${u}${or(m)}${cr(f)}\n`:`${c}${g}\n${u}${sr(m)}${cr(f)}\n`}function er(e){let t=e.unchanged;if(!t||typeof t!=`object`)return null;let n=t;return typeof n.ageMs!=`number`||typeof n.nodeCount!=`number`?null:{ageMs:n.ageMs,nodeCount:n.nodeCount,interactiveOnly:n.interactiveOnly===!0?!0:void 0,scope:typeof n.scope==`string`?n.scope:void 0}}function tr(e){let t=nr(e.ageMs);return e.scope?[`Scoped snapshot unchanged for scope "${e.scope}" since previous read ${t} ago.`,`Previous refs in this scope remain valid. Use find/get/is for a targeted query, or --force-full to re-emit.`].join(`
4
4
  `):e.interactiveOnly?[`Interactive snapshot unchanged since previous read ${t} ago.`,`${e.nodeCount} visible nodes are unchanged. Previous @e refs are still valid. Use find/get/is for a targeted query, or --force-full to re-emit.`].join(`
5
5
  `):[`Snapshot unchanged since previous read ${t} ago.`,`Refs from the previous snapshot are still valid. Use --force-full to re-emit the tree, or use find/get/is for a targeted query.`].join(`
6
- `)}function Ar(e){if(e<1e3)return`${Math.round(e)}ms`;if(e<6e4)return`${(Math.round(e/100)/10).toFixed(1)}s`;let t=e/6e4;if(t<60)return`${(Math.round(t*10)/10).toFixed(1)}m`;let n=t/60;return`${(Math.round(n*10)/10).toFixed(1)}h`}function jr(e){let t=typeof e.appName==`string`?e.appName:void 0,n=typeof e.appBundleId==`string`?e.appBundleId:void 0,r=[];return t&&r.push(`Page: ${t}`),n&&r.push(`App: ${n}`),r.length>0?`${r.join(`
7
- `)}\n`:``}function Mr(e,t,n){let r=n?` (truncated)`:``;return t?.partial?t.totalNodeCount>t.visibleNodeCount?`Snapshot: ${t.visibleNodeCount} visible nodes (${t.totalNodeCount} total)${r}`:`Snapshot: ${t.visibleNodeCount} visible nodes${r}`:`Snapshot: ${e} nodes${r}`}function Nr(e){return e.map(e=>JSON.stringify(e)).join(`
8
- `)}function Pr(e){return fi(e).join(`
9
- `)}function Fr(e){return li(pr(e,{summarizeTextSurfaces:!0})).join(`
10
- `)}function Ir(e){return e&&e.summaryLines.length>0?`\n${e.summaryLines.join(`
11
- `)}`:``}function Lr(e,t,n,r,i=0){let a=Rr(e);if(i===0&&a)return a;let o=(t?.hiddenCount??0)+i,s=t?t.nodes.some(e=>e.hiddenContentAbove||e.hiddenContentBelow):!1;return o>0?{partial:!0,visibleNodeCount:n,totalNodeCount:Math.max(r,a?.totalNodeCount??r),reasons:zr([...a?.reasons??[],`offscreen-nodes`])}:a||(s?{partial:!0,visibleNodeCount:n,totalNodeCount:n,reasons:[]}:null)}function Rr(e){let t=e.visibility;if(!t||typeof t!=`object`)return null;let n=t;return typeof n.partial!=`boolean`||typeof n.visibleNodeCount!=`number`||typeof n.totalNodeCount!=`number`||!Array.isArray(n.reasons)?null:{partial:n.partial,visibleNodeCount:n.visibleNodeCount,totalNodeCount:n.totalNodeCount,reasons:n.reasons.filter(e=>typeof e==`string`)}}function zr(e){return[...new Set(e)]}function Br(e){let t=e.baselineInitialized===!0,n=e.summary??{},r=I(n.additions),i=I(n.removals),a=I(n.unchanged),o=L(),s=ci(e),c=s.length>0?`${s.join(`
12
- `)}\n`:``;if(t)return`${c}Baseline initialized (${a} lines).\n`;let l=ri(Array.isArray(e.lines)?e.lines:[],1).map(e=>{let t=typeof e.text==`string`?e.text:``;if(e.kind===`added`){let e=t.startsWith(` `)?`+${t}`:`+ ${t}`;return o?R(e,`green`):e}if(e.kind===`removed`){let e=t.startsWith(` `)?`-${t}`:`- ${t}`;return o?R(e,`red`):e}return o?R(t,`dim`):t}),u=l.length>0?`${l.join(`
13
- `)}\n`:``;return o?`${c}${u}${[`${R(String(r),`green`)} additions`,`${R(String(i),`red`)} removals`,`${R(String(a),`dim`)} unchanged`].join(`, `)}\n`:`${c}${u}${r} additions, ${i} removals, ${a} unchanged\n`}function Vr(e){let t=L(),n=e.match===!0,r=e.dimensionMismatch,i=[];return i.push(...Hr(e,t)),i.push(...Ur(e,n,t)),!n&&!r&&(i.push(...Wr(e,t)),i.push(...Gr(e,t)),i.push(...Kr(e,t)),i.push(...Jr(e,t)),i.push(...Yr(e,t))),`${i.join(`
14
- `)}\n`}function Hr(e,t){if(e.match===!0)return[`${t?R(`✓`,`green`):`✓`} Screenshots match.`];let n=e.dimensionMismatch,r=t?R(`✗`,`red`):`✗`;if(n){let e=n.expected,t=n.actual;return[`${r} Screenshots have different dimensions: expected ${e?.width}x${e?.height}, got ${t?.width}x${t?.height}`]}let i=I(e.differentPixels),a=I(e.mismatchPercentage),o=`${a===0&&i>0?`<0.01`:String(a)}% pixels differ`;return[`${r} ${t?R(o,`red`):o}`]}function Ur(e,t,n){if(t)return[];let r=[];if(e.diffPath){let t=ni(e.diffPath),i=n?R(`Diff image:`,`dim`):`Diff image:`,a=n?R(t,`green`):t;r.push(` ${i} ${a}`)}if(e.currentOverlayPath){let t=ni(e.currentOverlayPath),i=n?R(`Current overlay:`,`dim`):`Current overlay:`,a=n?R(t,`green`):t,o=I(e.currentOverlayRefCount),s=o>0?` (${o} refs)`:``;r.push(` ${i} ${a}${s}`)}return r}function Wr(e,t){let n=I(e.differentPixels),r=I(e.totalPixels);return[` ${t?R(String(n),`red`):String(n)} different / ${r} total pixels`]}function Gr(e,t){let n=Zr(e);return n.length===0?[]:[` ${z(`Hints:`,t)}`,...n.map(e=>` - ${e}`)]}function Kr(e,t){let n=Array.isArray(e.regions)?e.regions:[];if(n.length===0)return[];let r=[` ${z(`Changed regions:`,t)}`];for(let e of n.slice(0,5))r.push(...qr(e));return r}function qr(e){let t=e.shareOfDiffPercentage===0&&e.differentPixels>0?`<0.01`:String(e.shareOfDiffPercentage),n=e.rect,r=[` ${e.index}. ${e.location} x=${n.x} y=${n.y} ${n.width}x${n.height}, ${t}% of diff, change=${e.dominantChange}`],i=ti(e);i&&r.push(` ${i}`);let a=e.currentOverlayMatches?.[0];if(a){let e=a.label?` "${a.label}"`:``;r.push(` overlaps @${a.ref}${e}, ${a.regionCoveragePercentage}% of region`)}return r}function Jr(e,t){let n=e.ocr?.matches??[];if(n.length===0)return[];let r=n.slice(0,8),i=[` ${z(`OCR text deltas (${e.ocr?.provider}; baselineBlocks=${e.ocr?.baselineBlocks} currentBlocks=${e.ocr?.currentBlocks}; showing ${r.length}/${n.length}; px):`,t)}`,` ${z(`item | text | movePx | sizeDeltaPx | bboxBaseline | bboxCurrent | confidence | issueHint`,t)}`];for(let[e,t]of r.entries()){let n=t.delta;i.push(` ${e+1} | ${JSON.stringify(t.text)} | ${F(n.x)},${F(n.y)} | ${F(n.width)},${F(n.height)} | ${Xr(t.baselineRect)} | ${Xr(t.currentRect)} | ${t.confidence} | ${t.possibleTextMetricMismatch?`ocr-bbox-size-change`:`-`}`)}return i}function Yr(e,t){let n=e.nonTextDeltas??[];if(n.length===0)return[];let r=n.slice(0,8),i=[` ${z(`Non-text visual deltas (showing ${r.length}/${n.length}; px):`,t)}`,` ${z(`item | region | slot | kind | bboxCurrent | nearestText`,t)}`];for(let e of r)i.push(` ${e.index} | ${e.regionIndex?`r${e.regionIndex}`:`-`} | ${e.slot} | ${e.likelyKind} | ${Xr(e.rect)} | ${e.nearestText?JSON.stringify(e.nearestText):`-`}`);return i}function Xr(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function F(e){return e>0?`+${e}`:String(e)}function Zr(e){let t=[],n=e.ocr?.movementClusters??[];for(let e of n.slice(0,2))t.push(`text movement cluster: ${ei(e.texts)} dx=${$r(e.xRange)}px dy=${$r(e.yRange)}px`);let r=(e.nonTextDeltas??[]).filter(e=>[`icon`,`toggle`,`chevron`].includes(e.likelyKind)).slice(0,3);r.length>0&&t.push(`non-text controls: ${r.map(Qr).join(`; `)}`);let i=(e.nonTextDeltas??[]).filter(e=>e.likelyKind===`separator`).slice(0,2);return i.length>0&&t.push(`non-text boundaries: ${i.map(Qr).join(`; `)}`),t.slice(0,6)}function Qr(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:``,n=e.regionIndex?` r${e.regionIndex}`:``;return`${e.likelyKind}${t}${n}`}function $r(e){return e.min===e.max?F(e.min):`${F(e.min)}..${F(e.max)}`}function ei(e){let t=e.slice(0,4).map(e=>JSON.stringify(e)),n=e.length>t.length?` +${e.length-t.length} more`:``;return`${t.join(`, `)}${n}`}function ti(e){let t=[e.size?`size=${e.size}`:null,e.shape?`shape=${e.shape}`:null,typeof e.densityPercentage==`number`?`density=${e.densityPercentage}%`:null,e.averageBaselineColorHex&&e.averageCurrentColorHex?`avgColor=${e.averageBaselineColorHex}->${e.averageCurrentColorHex}`:null,typeof e.baselineLuminance==`number`&&typeof e.currentLuminance==`number`?`luminance=${e.baselineLuminance}->${e.currentLuminance}`:null].filter(e=>e!==null);return t.length>0?t.join(` `):null}function ni(e){let t=process.cwd(),n=Re.relative(t,e);return n===``||!n.startsWith(`..`)&&!Re.isAbsolute(n)?n===``?`.`:`.${Re.sep}${n}`:e}function I(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function ri(e,t){if(e.length===0)return e;let n=e.map((e,t)=>({index:t,kind:e.kind})).filter(e=>e.kind===`added`||e.kind===`removed`).map(e=>e.index);if(n.length===0)return e;let r=Array(e.length).fill(!1);for(let i of n){let n=Math.max(0,i-t),a=Math.min(e.length-1,i+t);for(let e=n;e<=a;e+=1)r[e]=!0}return e.filter((e,t)=>r[t])}function L(e=process.stdout){let t=process.env.FORCE_COLOR;return typeof t==`string`?t!==`0`:typeof process.env.NO_COLOR==`string`?!1:!!e.isTTY}function R(e,t,n){return ze(t,e,n)}function z(e,t){return t?R(e,`dim`):e}function ii(e,t,n,r={nodes:t,filteredCount:0}){let i=ci(e);if(ai(e)){let e=si(t,n);e&&i.push(e)}!n.raw&&r.filteredCount>0&&i.push(`Collapsed ${r.filteredCount} Android helper node${r.filteredCount===1?``:`s`} from the agent-facing text snapshot; use --raw or --json for the full hierarchy.`);let a=r.filteredCount>0?r.nodes:t;return!n.raw&&Mn(a)&&i.push(`Warning: possible repeated nav subtree detected.`),i}function ai(e){return!e.snapshotQuality&&!oi(e)}function oi(e){let t=e.snapshotDiagnostics;if(!t||typeof t!=`object`)return!1;let n=t.stats;return!!(n&&typeof n==`object`&&n.platform===`web`)}function si(e,t){if(t.scoped===!0||t.depthLimited===!0||e.length>3)return null;let n=e.length===1?`node`:`nodes`;return`Hint: sparse accessibility snapshot returned ${e.length} ${n}; snapshot state is invalid or unavailable for this screen. Use plain screenshot, not screenshot --overlay-refs, as visual truth. If screenshot shows the Home Screen or another app, run open for this app again first. Then navigate away with coordinates if needed and retry snapshot -i on the next screen.`}function ci(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.length>0):[]}function li(e){let t=[],n=[],r=new Map(e.map(e=>[e.node.index,e.node])),i=e=>{for(;n.length>0&&(!e||ui(e,n[n.length-1],r));)t.push(...pi(n.pop(),`below`))};for(let r of e)i(r),t.push(r.text),t.push(...pi(r,`above`)),r.node.hiddenContentBelow&&n.push(r);return i(),t}function ui(e,t,n){return di(e.node,t.node,n)?!1:e.depth<=t.depth}function di(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){if(r.parentIndex===t.index)return!0;let e=n.get(r.parentIndex);if(!e)return!1;r=e}return!1}function fi(e){return pr(e,{summarizeTextSurfaces:!0}).flatMap(e=>[mr(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...pi({...e,depth:0})])}function pi(e,t){let n=mi(e.type);if(!n)return[];let r=[];if(e.node.hiddenContentAbove&&t!==`below`&&r.push(`[content above ${n} hidden]`),e.node.hiddenContentBelow&&t!==`above`&&r.push(`[content below ${n} hidden]`),r.length===0)return[];let i=` `.repeat(e.depth+1);return r.map(e=>`${i}${e}`)}function mi(e){return e===`scroll-area`||e===`list`||e===`collection`||e===`table`?e:null}function hi(e,t={}){let n=L(process.stderr);if(e===`pass`){let e=t.passFormat??`green`;return n?B(`✓`,e):`✓`}return e===`fail`?n?B(`⨯`,`red`):`⨯`:e===`warn`?n?B(`!`,`yellow`):`!`:n?B(`-`,`dim`):`-`}function B(e,t){return R(e,t,{validateStream:!1})}function gi(e){return`${hi(vi(e.status))} ${yi(e)}`}function _i(e){return e.status!==`fail`&&e.status!==`warn`?[]:typeof e.command==`string`?[` run: ${e.command}`]:typeof e.hint==`string`?[` hint: ${e.hint}`]:[]}function vi(e){return e===`pass`?`pass`:e===`fail`?`fail`:e===`warn`?`warn`:`skip`}function yi(e){let t=typeof e.id==`string`&&e.id.length>0?e.id:`check`,n=typeof e.summary==`string`&&e.summary.length>0?e.summary:t;return n===t?t:`${t}: ${n}`}const bi=3e5,xi=[`leaseId`,`tenantId`,`runId`,`clientId`,`deviceKey`];function Si(e){return f({tenantId:e.meta?.tenantId??V(e.flags,`tenant`),runId:e.meta?.runId??V(e.flags,`runId`),leaseId:e.meta?.leaseId??V(e.flags,`leaseId`),leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend,leaseProvider:e.meta?.leaseProvider??V(e.flags,`leaseProvider`)??V(e.flags,`provider`),deviceKey:e.meta?.deviceKey??V(e.flags,`deviceKey`),clientId:e.meta?.clientId??V(e.flags,`clientId`)})}function Ci(e){return f({tenantId:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs??e.ttlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider??e.provider,deviceKey:e.deviceKey,clientId:e.clientId})}function wi(e){return f({tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function Ti(e){return f({tenant:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function Ei(e){return f({tenantId:e.tenantId??``,runId:e.runId??``,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function Di(e){return Ni(e)}function Oi(e){let{ttlMs:t,...n}=Ni(e);return n}function ki(e,t,n){let r=f({...n.includeTokenParam?{token:n.token}:{},session:n.session,tenantId:e.tenantId,runId:e.runId,leaseProvider:e.leaseProvider,clientId:e.clientId,deviceKey:e.deviceKey});switch(t){case`lease_allocate`:return{...r,...f({ttlMs:e.leaseTtlMs,backend:e.leaseBackend})};case`lease_heartbeat`:return{...r,...f({leaseId:e.leaseId,ttlMs:e.leaseTtlMs})};case`lease_release`:return{...r,...f({leaseId:e.leaseId})}}}function Ai(e){let t=f({leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId});return Object.keys(t).length>0?t:void 0}function ji(e){return e.leaseProvider===`proxy`}function Mi(e){return ji(e)?xi.filter(t=>!e[t]):[]}function Ni(e){return f({leaseId:e.leaseId??``,tenantId:e.tenantId,runId:e.runId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function V(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function H(e,t,r={}){let i=e[t];if(i===void 0)return;if(!Number.isInteger(i))throw new n(`INVALID_ARGS`,`Expected ${t} to be an integer.`);let a=i;if(r.min!==void 0&&a<r.min)throw new n(`INVALID_ARGS`,`Expected ${t} to be at least ${r.min}.`);if(r.max!==void 0&&a>r.max)throw new n(`INVALID_ARGS`,`Expected ${t} to be at most ${r.max}.`);return a}const Pi=[`metrics`,`frames`,`memory`,`cpu`,`trace`],Fi=[`sample`,`snapshot`,`start`,`stop`,`report`],Ii=[`profile`],Li=[`xctrace`,`simpleperf`,`perfetto`,`android-hprof`,`memgraph`],Ri=[`android-hprof`,`memgraph`],zi=C(Pi),Bi=C(Fi),Vi=C(Ii),Hi=C(Li),Ui=C(Ri),Wi=`perf area must be metrics, frames, memory, cpu, or trace`,Gi=`perf action must be sample, snapshot, start, stop, or report`,Ki=`perf cpu requires profile`,qi=`perf --kind must be xctrace, simpleperf, perfetto, android-hprof, or memgraph`,Ji=`perf memory snapshot --kind must be android-hprof or memgraph`,Yi=zi.is,Xi=Bi.is,Zi=Vi.is,Qi=Hi.is,$i=Ui.is,ea=1e4,ta=2e3,na=[`get`,`accept`,`dismiss`,`wait`],ra=`<wifi|airplane|location> <on|off>`,ia=`location set <lat> <lon>`,aa=`animations <on|off>`,oa=`appearance <light|dark|toggle>`,sa=`faceid <match|nonmatch|enroll|unenroll>`,ca=`touchid <match|nonmatch|enroll|unenroll>`,la=`fingerprint <match|nonmatch>`,ua=`clear-app-state [app-id]`,da=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,fa=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,pa=`macOS supports only settings ${oa} and settings ${fa}. wifi|airplane|location|animations remain unsupported on macOS.`,ma=[`settings ${ra}`,`settings ${ia}`,`settings ${aa}`,`settings ${oa}`,`settings ${sa}`,`settings ${ca}`,`settings ${la}`,`settings ${ua}`,`settings ${da}`,`settings ${fa}`].join(` | `),ha=`settings requires ${ra}, ${ia}, ${aa}, ${oa}, ${sa}, ${ca}, ${la}, ${ua}, ${da}, or ${fa}`;function ga(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function _a(e){return`Unsupported macOS setting: ${e}. ${pa}`}function va(e,t){if(e===void 0||e.trim()===``)throw new n(`INVALID_ARGS`,`settings location set requires ${t}`);return ba(Number(e),t)}function ya(e){return{latitude:ba(e?.latitude,`latitude`),longitude:ba(e?.longitude,`longitude`)}}function ba(e,t){let r=t===`latitude`?-90:-180,i=t===`latitude`?90:180;if(typeof e!=`number`||!Number.isFinite(e)||e<r||e>i)throw new n(`INVALID_ARGS`,`${t} must be a number from ${r} to ${i}`);return e}function xa(e){let t=Ae(e.quality);return{...e.analysis?{analysis:e.analysis}:{},...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.freshness?{freshness:e.freshness}:{},...t?{quality:t}:{},...e.warnings?{warnings:e.warnings}:{}}}function Sa(e){return{...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.quality?{snapshotQuality:e.quality}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function Ca(e){let t=wa(e.androidSnapshot),n=Array.isArray(e.warnings)?e.warnings.filter(e=>typeof e==`string`):void 0,r=Ae(e.snapshotQuality);return Sa({...t?{androidSnapshot:t}:{},...r?{quality:r}:{},...n?{warnings:n}:{}})}function wa(e){return typeof e==`object`&&e?e:void 0}function Ta(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function Ea(e,t,n){return{deviceId:t,deviceName:n,...g(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function Da(e,t={}){let n=t.includeSerial??!0,r=Oa(e);return{platform:e.platform,target:e.target,device:e.name,id:e.id,...e.platform===`ios`?{device_udid:e.ios?.udid??e.id,ios_simulator_device_set:e.ios?.simulatorSetPath??null}:{},...n&&r?{serial:r}:{}}}function Oa(e){return g(e.platform)?e.identifiers.serial??e.id:void 0}function ka(e){return{name:e.name,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...Da(e.device,{includeSerial:!1}),createdAt:e.createdAt}}function Aa(e){return{platform:e.platform,...e.appleOs?{appleOs:e.appleOs}:{},id:e.id,name:e.name,kind:e.kind,target:e.target,...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function ja(e){return e.bundleId??e.package??e.app}function Ma(e){return at({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${ja(e)}`)}function Na(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function Pa(e){return at({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${Na(e)}`)}function Fa(e){let t=e.appName??e.appBundleId??e.session;return at({session:e.session,...e.warnings?.length?{warnings:e.warnings}:{},...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...e.requestLogPath?{requestLogPath:e.requestLogPath}:{},...e.eventLogPath?{eventLogPath:e.eventLogPath}:{},...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?Da(e.device):{}},t?`Opened: ${t}`:`Opened`)}function Ia(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...`provider`in e&&e.provider?{provider:e.provider}:{},...S(e.session?`Closed: ${e.session}`:`Closed`)}}function La(e){return{nodes:e.nodes,truncated:e.truncated,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...Sa(Ra(e)),...e.unchanged?{unchanged:e.unchanged}:{},...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{},...e.refsGeneration===void 0?{}:{refsGeneration:e.refsGeneration}}}function Ra(e){return{...e,...e.snapshotQuality?{quality:e.snapshotQuality}:{}}}const za=1e4;function Ba(e,t=`scroll accepts either a relative amount or --pixels, not both`){if(e.amount!==void 0&&e.pixels!==void 0)throw new n(`INVALID_ARGS`,t)}function Va(e,t={}){if(e===void 0)return;let r=t.field??`scroll durationMs`,i=t.max??1e4,a=t.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(e)||!Number.isInteger(e)||e<0)throw new n(`INVALID_ARGS`,a);if(e>i)throw new n(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return e}function Ha(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}function Ua(e,t,r,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>i)throw new n(`INVALID_ARGS`,`${t} must be an integer between ${r} and ${i}`);return e}function Wa(e,t,n={}){let r=Ya(e??[]);if(r.length===0)return{canScroll:!1,emptySnapshot:!0,signature:``};let i=ne(r),a=Xa(r,i,t,n),o=io(a?Qa(r,a.index):r);return a?{canScroll:eo(a,i.get(a.index),t),emptySnapshot:!1,signature:o,scope:to(a,r)}:{canScroll:!1,emptySnapshot:!1,signature:o}}async function Ga(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=Wa(await i(r),t,n);return r&&e.emptySnapshot?await Ga({edge:t,target:n,captureNodes:i}):e}catch(e){throw Ja(t,r,e)}}async function Ka(e){let{edge:t,captureState:r,scroll:i}=e,a=await r();a.scope&&(a=await r(a.scope));let o=0,s;for(;a.canScroll;){if(o>=40)throw new n(`COMMAND_FAILED`,`scroll ${t} reached the safety limit before the snapshot showed the edge`,{hint:`The scoped scroll container still reports hidden content. Use a smaller manual scroll + snapshot loop to inspect the current state.`});s=await i(),o+=1,a=await r(a.scope)}return{passes:o,result:s}}function qa(e,t,n,r,i){return t&&n===0?`Already at ${t}; no hidden content ${t===`bottom`?`below`:`above`} detected`:t?`Scrolled to ${t} with ${n} ${e} passes`:i===void 0?r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`:`Scrolled ${e} by ${i}px`}function Ja(e,t,r){return t?new n(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:t,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},r):new n(`COMMAND_FAILED`,`Failed to verify scroll ${e} state`,{hint:`scroll ${e} needs a snapshot showing hidden content ${e===`bottom`?`below`:`above`} before it will move.`},r)}function Ya(e){return e.map((e,t)=>({...e,ref:`ref`in e&&e.ref?e.ref:`e${t+1}`}))}function Xa(e,t,n,r){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>le(e)&&co(e.rect));if(a.length===0)return null;let o=Za(r.nodeIndex,i);if(o)return o;let s=r.point;if(s){let e=a.filter(e=>e.rect&&so(e.rect,s)).sort(ao);if(e.length>0)return e.find(e=>eo(e,t.get(e.index),n))??e[0]??null}let c=a.filter(e=>eo(e,t.get(e.index),n)).sort(oo);return c.length>0?c[0]??null:a.filter(t=>ie(t,e)).sort(oo)[0]??a.sort(oo)[0]??null}function Za(e,t){if(e===void 0)return null;let n=t.get(e);for(;n;){if(le(n)&&co(n.rect))return n;n=n.parentIndex===void 0?void 0:t.get(n.parentIndex)}return null}function Qa(e,t){let n=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index===t||$a(e,t,n))}function $a(e,t,n){let r=e.parentIndex===void 0?void 0:n.get(e.parentIndex);for(;r;){if(r.index===t)return!0;r=r.parentIndex===void 0?void 0:n.get(r.parentIndex)}return!1}function eo(e,t,n){return n===`bottom`?e.hiddenContentBelow===!0||t?.hiddenContentBelow===!0:e.hiddenContentAbove===!0||t?.hiddenContentAbove===!0}function to(e,t){return[e.identifier,e.label].map(e=>typeof e==`string`?e.trim():``).find(n=>ro(n)&&no(n,e,t))}function no(e,t,n){let r=e.toLowerCase(),i=n.filter(e=>[e.identifier,e.label,e.value].some(e=>typeof e==`string`&&e.trim().toLowerCase().includes(r)));return i.length===1&&i[0]?.index===t.index}function ro(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function io(e){return e.map(e=>{let t=e.rect?[`x`,`y`,`width`,`height`].map(t=>lo(e.rect?.[t])).join(`,`):``;return[String(e.index??``),String(e.parentIndex??``),String(e.type??``),String(e.label??``),String(e.value??``),t].join(`|`)}).join(`
15
- `)}function ao(e,t){return U(e.rect)-U(t.rect)}function oo(e,t){return U(t.rect)-U(e.rect)}function U(e){return e?e.width*e.height:0}function so(e,t){return t.x>=e.x&&t.x<=e.x+e.width&&t.y>=e.y&&t.y<=e.y+e.height}function co(e){return!!(e&&e.width>0&&e.height>0)}function lo(e){return typeof e==`number`&&Number.isFinite(e)?e.toFixed(1):``}function W(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function G(e){return e.clock?.now()??Date.now()}async function uo(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function fo(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function po(e){return e&&typeof e==`object`?e:void 0}function mo(e){return e}function ho(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)t=Math.min(t,a.x),n=Math.min(n,a.y),r=Math.max(r,a.x+a.width),i=Math.max(i,a.y+a.height);return{x:t,y:n,width:r-t,height:i-n}}function go(e,t){return{x:e.x-t,y:e.y-t,width:e.width+t*2,height:e.height+t*2}}function _o(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}function vo(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function yo(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}function bo(e,t,n){return Math.min(Math.max(e,t),n)}const xo=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function So(e,t){return Co(e,t).node}function Co(e,t){if(b(t))return{node:t,reason:`covered`};let n=wo(e,t);if(n?.rect&&x(n.rect))return{node:n,reason:`same-rect-descendant`};if(To(t)&&t.rect&&x(t.rect))return{node:t,reason:`semantic-target`};let r=ae(e,t);return r?.rect&&!b(r)&&x(r.rect)?Do(t,r,e)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}:{node:t,reason:`original`}}function wo(e,t){let n=y(t.rect);if(!n)return null;let r=t,i=new Set;for(;!i.has(r.ref);){i.add(r.ref);let t=e.filter(e=>{if(e.parentIndex!==r.index||!e.hittable||b(e))return!1;let t=y(e.rect);return t?Ne(t,n):!1});if(t.length!==1)break;r=t[0]}return r===t?null:r}function To(e){return[e.type,e.role,e.subrole].map(e=>_(e??``)).some(Eo)}function Eo(e){return e===`tab`||xo.some(t=>e.includes(t))}function Do(e,t,n){let r=y(e.rect),i=y(t.rect);if(!r||!i)return!1;let a=Oo(n,r);return!a||!ko(i,a)?!1:!Ne(r,i)}function Oo(e,t){let n=s(t),r=e.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)}).map(e=>y(e.rect)).filter(e=>e!==null);if(r.length===0)return null;let i=r.filter(e=>ue(e,n.x,n.y));return oe(i.length>0?i:r)}function ko(e,t){let n=_o(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}function Ao(e){return e.hittable===!0||To(e)}function jo(e,t){let n=de(v(e),t);return n.id!==void 0||n.label!==void 0?!1:ye(e.value)===null}function Mo(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function No(e,t){let n=Me(t);return t.filter(t=>t.index!==e.index&&Mo(t,e,n)).sort((e,t)=>e.index-t.index)}function Po(e,t){let n=x(e.rect);return!n||!t.rect?!1:ue(t.rect,n.x,n.y)}function Fo(e,t){if(!jo(e,t))return e;let n=No(e,t);if(n.some(Ao))return e;let r=n.find(e=>v(e).label!==void 0);return!r||!Po(r,e)?e:r}function Io(e){return e===`text`||e===`label`||e===`any`}async function Lo(e,t){let r=t??`default`,i=await e.sessions.get(r);if(!i)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new n(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function Ro(e,t,r={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=t.session??`default`,o=await e.sessions.get(a),s=await i(W(e,t),{interactiveOnly:r.interactiveOnly??!1,depth:t.depth,scope:r.scope??t.scope,raw:t.raw,includeRects:r.includeRects,...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),c=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,...s.quality?{snapshotQuality:s.quality}:{},createdAt:G(e)};return r.updateSession&&o&&!je(c.snapshotQuality)&&await e.sessions.set({...o,snapshot:c}),{sessionName:a,session:o,snapshot:c}}async function zo(e,t,n){if(e.backend.readText){let r=await e.backend.readText(W(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return be(n)}function Bo(e,t,i){let a=o(t);if(!a)throw new n(`INVALID_ARGS`,i.invalidRefMessage);let s=r(e,a)??(i.fallbackLabel.length>0?te(e,i.fallbackLabel):null);if(!s)throw new n(`COMMAND_FAILED`,i.notFoundMessage);return{ref:a,node:s}}function Vo(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}function Ho(e,t,r,i){if(!r)return;let a=v(e),o=pe(e,t);if(!(xe(a,r.identity)&&Oe(o,r.structural)))throw new n(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:we,observed:a,observedStructural:o,expected:r.identity,expectedStructural:r.structural})}async function Uo(e,t,n){return await cs(e,t,n.action),t.target.kind===`point`?await Go(e,t,t.target,n):t.target.kind===`ref`?await qo(e,t,t.target,n):await Jo(e,t,t.target,n)}async function Wo(e,t,n){let r=t.session??`default`,i=await e.sessions.get(r);if(!i?.snapshot)return;let a={x:n.x,y:n.y,width:0,height:0},o=ee(i.snapshot.nodes,a);if(!o)return;let s={x:n.x,y:n.y};if(!ue(o,s.x,s.y))return`Coordinates (${s.x}, ${s.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`}async function Go(e,t,n,r){let i=await Wo(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await Ko(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preActionNodes:a}:{},...i?{warning:i}:{}}}async function Ko(e,t){try{return(await K(e,t,!0)).snapshot.nodes}catch{return}}async function qo(e,t,n,r){let i=await us(e,t,n),a=i.resolved;Ho(a.node,i.snapshot.nodes,r.expectedResolvedTarget,r.action);let o=r.promoteToHittableAncestor?is(i.snapshot.nodes,a.node,{action:r.action,label:`Ref ${n.ref}`}):a.node;return as(o,`Ref ${n.ref}`,r.action),gs(o,i.snapshot.nodes,n.ref,r.action),{kind:`ref`,point:ps(o,`Ref ${n.ref} not found or has invalid bounds`),target:{kind:`ref`,ref:`@${a.ref}`},...es(e,o,i.snapshot.nodes,r.action,a.resolution)}}async function Jo(e,t,r,i){let a=d(r.selector),o=await K(e,t,i.requireInteractive),s=_e(rs(o.snapshot.nodes),a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if((!s||!s.node.rect)&&i.requireInteractive&&(o=await K(e,t,!1),s=_e(rs(o.snapshot.nodes),a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0})),!s||!s.node.rect){let t=_e(o.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!0,requireUnique:!1});throw t?.node&&b(t.node)?os({label:`Selector ${t.selector.raw}`,node:t.node,action:i.action,selector:t.selector.raw}):new n(`COMMAND_FAILED`,Se(a,s?.diagnostics??[],{unique:!0}),{hint:ge(s?.diagnostics??[])})}Ho(s.node,o.snapshot.nodes,i.expectedResolvedTarget,i.action);let c=i.promoteToHittableAncestor?is(o.snapshot.nodes,s.node,{action:i.action,label:`Selector ${s.selector.raw}`}):s.node;return as(c,`Selector ${s.selector.raw}`,i.action),hs(c,o.snapshot.nodes,s.selector.raw,i.action),{kind:`selector`,point:ps(c,`Selector ${s.selector.raw} resolved to invalid bounds`),target:{kind:`selector`,selector:s.selector.raw},...es(e,c,o.snapshot.nodes,i.action,Qo(s,o.snapshot.nodes))}}const Yo={source:`ref`,phase:`pre-action`,kind:`exact`},Xo={source:`ref`,phase:`pre-action`,kind:`label-fallback`},Zo={source:`runtime`,phase:`pre-action`,kind:`unique`};function Qo(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:$o(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>$o(e,t))}:Zo}function $o(e,t){let n=_(e.type??``),r=ke(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:Vo(n,256)}:{},...r===void 0?{}:{label:Vo(r,256)}}}function es(e,t,n,r,i){return{node:t,selectorChain:Ee(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:n}),refLabel:ke(t,n),...ns(t,r),preActionNodes:n,resolution:i,...ts(e,t,n,r)}}function ts(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Fo(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:Ee(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:ke(i,n)}}}function ns(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}function rs(e){return e.filter(e=>!b(e))}function is(e,t,n){let r=Co(e,t);if(r.reason===`covered`)throw os({label:n.label,node:t,action:n.action});return r.node}function as(e,t,n){if(b(e))throw os({label:t,node:e,action:n})}function os(e){return new n(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${ss(e.action)} safely`,{hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}function ss(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;default:return`be tapped`}}async function K(e,t,r){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,a=await e.sessions.get(i);if(!a)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(W(e,t),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:G(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}async function cs(e,t,r){if(e.backend.platform!==`macos`)return;let i=await ls(e,t);if(!(i!==`desktop`&&i!==`menubar`)&&!(i===`menubar`&&(r===`click`||r===`press`)))throw new n(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function ls(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function us(e,t,r){let{session:i,snapshot:a}=await Lo(e,t.session),o=r.fallbackLabel??``,s=fs(a.nodes,r.ref,{fallbackLabel:o});if(!s)throw new n(`COMMAND_FAILED`,`Ref ${r.ref} not found or has no bounds`,{hint:me});return ds({session:i,frameTree:a,target:r,fallbackLabel:o,authorized:s})}function ds(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=fs(o.nodes,r.ref,{fallbackLabel:i});return s&&xe(v(a.node),v(s.node))?{snapshot:o,resolved:s}:{snapshot:n,resolved:a}}function fs(e,t,i){let a=o(t);if(!a)throw new n(`INVALID_ARGS`,`Invalid ref: ${t}`);let s=r(e,a);if(ms(s))return{ref:a,node:s,resolution:Yo};let c=i.fallbackLabel.length>0?te(e,i.fallbackLabel):null;return ms(c)?{ref:a,node:c,resolution:Xo}:null}function ps(e,t){let r=x(e.rect);if(!r)throw new n(`COMMAND_FAILED`,t);return r}function ms(e){return e?x(e.rect)!==null:!1}function hs(e,t,n,r){ys(e,t,{message:`Selector ${n} resolved to an off-screen element and is not safe to ${r}`,details:{reason:`offscreen_selector`,selector:n},hint:e=>`${_s(e)} in small steps, retrying ${r} with the same selector after each (it re-resolves against a fresh snapshot). A single large scroll can overshoot the target; a short bounded gesture pan lands it more reliably. If it is inside a closed drawer or another tab, open that container first.`})}function gs(e,t,n,r){ys(e,t,{message:`Ref ${n} is off-screen and not safe to ${r}`,details:{reason:`offscreen_ref`,ref:o(n)},hint:e=>`${_s(e)} in small steps (a single large scroll can overshoot; a short bounded gesture pan lands it more reliably), then retry ${r} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function _s(e){return e?`Scroll ${e} toward it`:`Scroll toward it`}async function vs(e,t,n,r){let i=(await e.sessions.get(t.session??`default`))?.snapshot?.nodes;if(!i||o(n.ref)===null)return{};let a=fs(i,n.ref,{fallbackLabel:n.fallbackLabel??``});return a?(as(a.node,`Ref ${n.ref}`,r),gs(a.node,i,n.ref,r),{...ns(a.node,r),node:a.node,preActionNodes:i}):{}}function ys(e,t,r){let i=e.rect?re(e,t):null;if(!e.rect||!i||Ce(e,t))return;let a=ce(e,t);throw new n(`COMMAND_FAILED`,r.message,{...r.details,rect:e.rect,viewport:i,...a?{scrollDirection:a}:{},hint:r.hint(a)})}function bs(e){let t=Buffer.alloc(16);for(let n of e)Ss(t,xs(n));return{digest:`ax1:${Le(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function xs(e){return Le(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function Ss(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function Cs(e){let{digest:t,nodeCount:n}=bs(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=ws(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function ws(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function Ts(e,t){let n=P(e.type??`Element`),r=N(e,n),i=e.enabled===!1?`disabled`:`enabled`,a=e.selected===!0?`selected`:`unselected`,o=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,o].join(`|`)}function Es(e,t,n={}){let r=ks(Os(e,n),Os(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function Ds(e,t={}){return Os(e,t).length}function Os(e,t){return t.flatten?e.map(e=>({text:mr(e,0,!1),comparable:Ts(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):pr(e).map(e=>({text:e.text,comparable:Ts(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function ks(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=js(a,i,s)?q(a,i+1):q(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return As(o,e,t,n,r)}}return[]}function As(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=js(i,c,r)?c+1:c-1,u=q(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function js(e,t,n){return t===-n||t!==n&&q(e,t-1)<q(e,t+1)}function q(e,t){return e.get(t)??0}const Ms=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),Ns={strippedIndexes:new Set,refs:new Set};function Ps(e){let t=new Set(e.filter(e=>_(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return Ns;let n=new Map(e.map(e=>[e.index,e])),r=zs(e,n,t),i=new Set(r),a=Ks(e,n,r);for(let t of zs(e,n,a))i.add(t);for(let o of Fs(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function Fs(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=Ls(t,n,r);if(o.size===0)return a;let s=Rs(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&Is(n,t,o)&&a.add(n.index);return a}function Is(e,t,n){if(!e.rect)return!1;let r=qs(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function Ls(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=qs(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function Rs(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function zs(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)Js(i,t,n)&&r.add(i.index);return r}function Bs(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Fe(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Ie(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function Vs(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(e=>Pe(e)).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:Hs(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?Ns:{strippedIndexes:o,refs:s}}function Hs(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&Bs(e,t)).map(e=>e.index))}function Us(e,t){let n=Ps(e),r=Vs(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function Ws(e,t){let{strippedIndexes:n}=Us(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function Gs(e,t){return Us(e,t).refs}function Ks(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||_(n.type??``)!==`keyboard`)continue;let i=qs(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>Ms.has(_(e.type??``))&&!n.has(e.index)&&Js(e,t,a))&&r.delete(i)}return r}function qs(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(_(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function Js(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}const Ys=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function Xs(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=G(e),o=a+i,s=!1,c=Math.min(300,Math.max(25,r)),l=0,u,d=0,f,p=a;for(;G(e)<o;){let m=await $s(e,t,o-G(e));if(!m)return{settled:!1,stalled:!0,waitedMs:G(e)-a,captures:l,nodeCount:d,lastCapture:f};l+=1,f=m;let h=ec(m.snapshot.nodes),g=G(e);if(n.resetBudgetOnPrivateAxRecovery===!0&&!s&&Zs(m.snapshot.snapshotQuality)){s=!0,o=Math.max(o,g+i),p=g,u=h,d=m.snapshot.nodes.length;let t=Qs({nowMs:g,quietSinceMs:p,quietMs:r,pollMs:c,deadlineMs:o});if(t<=0)break;await uo(e,t);continue}if(h!==u)u=h,d=m.snapshot.nodes.length,p=g;else if(l>=2&&g-p>=r)return{settled:!0,stalled:!1,waitedMs:g-a,captures:l,nodeCount:d,lastCapture:f};let ee=Qs({nowMs:g,quietSinceMs:p,quietMs:r,pollMs:c,deadlineMs:o});if(ee<=0)break;await uo(e,ee)}return{settled:!1,stalled:!1,waitedMs:G(e)-a,captures:l,nodeCount:d,lastCapture:f}}function Zs(e){return e?.state===`recovered`&&e.backend===`private-ax`}function Qs(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function $s(e,t,n){let r=Ro(e,t,{updateSession:!1,interactiveOnly:!0}),i;try{let e=await Promise.race([r,new Promise(e=>{i=setTimeout(()=>e(void 0),n)})]);return e===void 0&&r.catch(()=>{}),e}finally{i!==void 0&&clearTimeout(i)}}function ec(e){return e.map(tc).join(`|`)}function tc(e){let t=e.rect?`${Math.round(e.rect.x)},${Math.round(e.rect.y)},${Math.round(e.rect.width)},${Math.round(e.rect.height)}`:``;return`${e.type??``}#${e.label??``}#${e.identifier??``}#${t}`}const nc=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,rc=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function ic(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{let o=await Xs(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0}),s={...a,settled:o.settled,waitedMs:o.waitedMs,captures:o.captures};if(!o.lastCapture)return{observation:{...s,hint:o.stalled?rc:nc}};let{stored:c,session:l}=await hc(e,t,o.lastCapture),u=o.lastCapture.snapshot.nodes;return{observation:{...s,...o.settled&&c?cc(oc(n.resolved),u,n.resolved.point,l?.appBundleId):{},...mc(o,c,u.length)},settledNodes:u}}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}function ac(e,t){if(!e)return;let n=Cs(e),r=t!==void 0&&n.digest!==Cs(t).digest;return{...n,changedFromBefore:r}}function oc(e){return`preActionNodes`in e&&e.preActionNodes?e.preActionNodes:[]}function sc(e,t,n){let r=Es(Ws(e,n),Ws(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=pc(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function cc(e,t,n,r){let i=sc(e,t,r);return{diff:i,...lc(i,t,n,r)}}function lc(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=Gs(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!uc(o.get(e),n))?{}:fc(t,i,r)}function uc(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const dc=new Set([`application`,`window`]);function fc(e,t,n){let r=Gs(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!dc.has(P(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=P(e.type??`Element`),n=N(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function pc(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function mc(e,t,n){return e.stalled?{hint:rc}:e.settled?t?n<5?{hint:Ys}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted. Use screenshot as visual truth before interacting further.`}:{hint:nc}}async function hc(e,t,n){if(je(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function gc(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function _c(e,t,n,r,i){let a=await vc(e,t,n,i);return bc({...r,...a})}async function vc(e,t,n,r){if(r.settle!==void 0){let i=await ic(e,t,{...r.settle,resolved:n}),a=r.verify?ac(i.settledNodes,`preActionNodes`in n?n.preActionNodes:void 0):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await yc(e,t,n);return i?{evidence:i}:{}}async function yc(e,t,n){let r=`preActionNodes`in n?n.preActionNodes:void 0;try{let n=Cs((await K(e,t,!0)).snapshot.nodes),i=r!==void 0&&n.digest!==Cs(r).digest;return{...n,changedFromBefore:i}}catch{return}}function bc(e){let t=e;if(t.targetHittable!==!1||!xc(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function xc(e){if(e.evidence?.changedFromBefore===!0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}const Sc=[`up`,`down`,`left`,`right`,`top`,`bottom`],Cc=async(e,t)=>{let r=await Uo(e,t,{action:`focus`,requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new n(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=kc(r),a=po(await e.backend.focus(W(e,t),i));return{...r,...a?{backendResult:a}:{},...S(`Focused (${i.x}, ${i.y})`)}},wc=async(e,t)=>{let r=gc(t),i=await Uo(e,t,{action:`longPress`,requireInteractive:!0,promoteToHittableAncestor:!0,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.longPress)throw new n(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=t.durationMs===void 0?void 0:Ua(t.durationMs,`durationMs`,0,12e4),o=kc(i),s=po(await e.backend.longPress(W(e,t),o,{durationMs:a}));return await _c(e,t,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...S(`Long pressed (${o.x}, ${o.y})`)},r)},Tc=async(e,t)=>{if(!e.backend.scroll)throw new n(`UNSUPPORTED_OPERATION`,`scroll is not supported by this backend`);let r=Dc(t.direction),i=Mc(t.amount,`scroll amount`),a=Pc(t.pixels,`scroll pixels`),o=Va(t.durationMs);Ba({amount:i,pixels:a},`scroll accepts either amount or pixels, not both`);let s=await Ec(e,t),c=s.kind===`viewport`?{kind:`viewport`}:{kind:`point`,point:kc(s)},l=e.backend.scroll,u=async()=>await l(W(e,t),c,{direction:r.direction,...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},...o===void 0?{}:{durationMs:o}}),d,f=0;if(r.edge){let n=r.edge,i=Oc(s),a=await Ka({edge:n,captureState:async r=>await Ac(e,t,n,i,r),scroll:u});d=a.result,f=a.passes}else d=await u(),f=1;let p=po(d),m=Ha(p);return{...s,direction:r.direction,...r.edge?{edge:r.edge,passes:f}:{},...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},...m===void 0?{}:{durationMs:m},...p?{backendResult:p}:{},...S(qa(r.direction,r.edge,f,i,a))}};async function Ec(e,t){let n=t.target??{kind:`viewport`};return n.kind===`viewport`?(await cs(e,t,`scroll`),{kind:`viewport`}):await Uo(e,{...t,target:n},{action:`scroll`,requireInteractive:!1,promoteToHittableAncestor:!1})}function Dc(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:jc(e,`scroll direction`)}}function Oc(e){return e.kind===`viewport`?{}:{point:e.point,nodeIndex:`node`in e?e.node?.index:void 0}}function kc(e){if(!e.point)throw new n(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Ac(e,t,r,i,a){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:o}=e.backend;return await Ga({edge:r,target:i,scope:a,captureNodes:async n=>{let r=await o(W(e,t),{scope:n});return r.snapshot?.nodes??r.nodes??[]}})}function jc(e,t){switch(e){case`up`:case`down`:case`left`:case`right`:return e;default:throw new n(`INVALID_ARGS`,`${t} must be up, down, left, or right`)}}function Mc(e,t){return e===void 0?void 0:Nc(e,t)}function Nc(e,t){if(!Number.isFinite(e)||e<=0)throw new n(`INVALID_ARGS`,`${t} must be a positive number`);return e}function Pc(e,t){if(e!==void 0){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new n(`INVALID_ARGS`,`${t} must be a positive integer`);return e}}const Fc=1e4,Ic=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`];function J(e){let t=Rc(e),r=Bc(t,`kind`,Ic);if(r===`pan`)return{kind:r,origin:Y(t,`origin`),delta:Y(t,`delta`),pointerCount:H(t,`pointerCount`,{min:1,max:2}),durationMs:Lc(t)};if(t.pointerCount!==void 0)throw new n(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(r===`fling`){if(t.durationMs!==void 0)throw new n(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:r,direction:Bc(t,`direction`,ht),origin:Y(t,`origin`),distance:H(t,`distance`,{min:0})}}if(r===`swipe`){if(t.durationMs!==void 0)throw new n(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:r,preset:Bc(t,`preset`,gt)}}if(r===`pinch`)return{kind:r,scale:X(t,`scale`),origin:zc(t,`origin`)};if(r===`rotate`){if(t.velocity!==void 0)throw new n(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:r,degrees:X(t,`degrees`),origin:zc(t,`origin`)}}return{kind:r,origin:Y(t,`origin`),delta:Y(t,`delta`),scale:X(t,`scale`),degrees:X(t,`degrees`),durationMs:Lc(t)}}function Lc(e){let t=H(e,`durationMs`);if(t!==void 0){if(t<16||t>1e4)throw new n(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${Fc}.`);return t}}function Rc(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`gesture requires structured object input`);return e}function Y(e,t){let n=Rc(e[t]);return{x:X(n,`x`),y:X(n,`y`)}}function zc(e,t){return e[t]===void 0?void 0:Y(e,t)}function X(e,t){let r=e[t];if(typeof r!=`number`||!Number.isFinite(r))throw new n(`INVALID_ARGS`,`Expected ${t} to be a finite number.`);return r}function Bc(e,t,r){let i=e[t];if(typeof i!=`string`||!r.includes(i))throw new n(`INVALID_ARGS`,`Expected ${t} to be one of: ${r.join(`, `)}.`);return i}const Vc={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:Hc}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`}};function Hc(e,t){let[n,r,i,a,o]=e,s=Uc(n,i),c=Uc(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function Uc(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function Wc(e,t){let n=Vc[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!Gc(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function Gc(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function Kc(e){if(!(!e||typeof e!=`object`||Array.isArray(e))&&e.durationMs!==void 0)throw new n(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function qc(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function Z(e,t){let r=Wc(e,t);if(r)throw new n(`INVALID_ARGS`,qc(r))}function Jc(e,t,n){let r=Yc(e,t);return r?qc(r,n):void 0}function Yc(e,t){if(e===`swipe`)return Wc(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(Vc,n))return Wc(n,t.slice(1))}function Xc(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function Zc(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{Z(`gesture pan`,r);let{origin:e,delta:i}=Xc(r);return J({kind:n,origin:e,delta:i,pointerCount:t,durationMs:nl(r[4])})}case`fling`:return Z(`gesture fling`,r),J({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:nl(r[3])});case`swipe`:return Z(`gesture swipe`,r),J({kind:n,preset:r[0]});case`pinch`:return Z(`gesture pinch`,r),J({kind:n,scale:Number(r[0]),origin:rl(r[1],r[2])});case`rotate`:return Z(`gesture rotate`,r),J({kind:n,degrees:Number(r[0]),origin:rl(r[1],r[2])});case`transform`:{Z(`gesture transform`,r);let{origin:e,delta:t}=Xc(r);return J({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:nl(r[6])})}default:return J({kind:n})}}function Qc(e){switch(e.kind){case`pan`:return Q([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return Q([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return Q([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?Q([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return Q([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs])}}function $c(e,t={}){return Z(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function el(e){switch(e.kind){case`pan`:return{gesture:{intent:`pan`,origin:e.origin,delta:e.delta,pointerCount:e.pointerCount,durationMs:e.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:e.direction,origin:e.origin,distance:e.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:e.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:e.origin,scale:e.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:e.origin,degrees:e.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:e.origin,delta:e.delta,scale:e.scale,degrees:e.degrees,durationMs:e.durationMs}}}}function tl(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function nl(e){return e===void 0?void 0:Number(e)}function rl(e,t){if(e===void 0!=(t===void 0))throw new n(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return e===void 0?void 0:{x:Number(e),y:Number(t)}}function Q(e){return e.filter(e=>e!==void 0).map(String)}const il=/^e\d+$/;function al(e){if(e[0]?.startsWith(`@`)){let t=pl(e.slice(1));return{ref:e[0],...t===void 0?{}:{label:t}}}if(il.test(e[0]??``))throw new n(`INVALID_ARGS`,`Did you mean "@${e[0]}"? Snapshot refs need the @ prefix.`);let t=c(e);if(t){if(t.rest.length>0)throw new n(`INVALID_ARGS`,dl(e,t));return{selector:t.selectorExpression}}return sl(e)}function ol(e){let t=e[0];if(t?.startsWith(`@`)){let n=e.length>=3?e.slice(2).join(` `):e.slice(1).join(` `);return{kind:`ref`,target:{ref:t,label:e.length>=3?pl(e.slice(1,2)):void 0},text:n}}if(il.test(t??``))throw new n(`INVALID_ARGS`,`Did you mean "@${t}"? Snapshot refs need the @ prefix.`);let r=c(e,{preferTrailingValue:!0});return r?{kind:`selector`,target:{selector:r.selectorExpression},text:r.rest.join(` `)}:{kind:`point`,target:sl(e.slice(0,2)),text:e.slice(2).join(` `)}}function sl(e){let t=e[0]??``,r=m(t);if(r){let i=cl(t)?r.value:[r.value,...e.slice(1)].join(` `).trim();throw new n(`INVALID_ARGS`,ll({key:r.key,value:i}))}let i=Number(e[0]),a=Number(e[1]);if(Number.isFinite(i)&&Number.isFinite(a))return{x:i,y:a};throw new n(`INVALID_ARGS`,ul(e))}function cl(e){let t=e.slice(e.indexOf(`=`)+1).trim();if(t.length<2)return!1;let n=t[0];return(n===`"`||n===`'`)&&t.endsWith(n)}function ll(e){let{key:t,value:n}=e;return`Unknown selector key "${t}". Supported: ${u.join(`, `)}. ${p(t)?`Did you mean role=${t} label=${$(n)}?`:`Did you mean label=${$(n)}?`}`}function ul(e){let t=e.filter(e=>e!==void 0).join(` `);if(!t.trim())return`Missing target. Pass an @ref from snapshot, a selector like text="Sign in", or "x y" coordinates.`;let n=`Target "${t}" is not a @ref, selector, or "x y" point.`;return e.some(e=>h(e??``))?`${n} Selector values with spaces need quotes, e.g. text="Sign in".`:`${n} To match by visible text, use text=${$(t)} (or label=/id=/role=), or pass an @ref from snapshot.`}function dl(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${fl(e,t)??`text="Sign in"`}.`}function fl(e,t){let n=e.length-t.rest.length,r=e[n-1];if(r===void 0)return;let i=r.indexOf(`=`);if(i<=0)return;let a=[r.slice(i+1),...t.rest].join(` `),o=`${r.slice(0,i+1)}${$(a)}`;return[...e.slice(0,n-1),o].join(` `)}function $(e){return`"${e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}"`}function pl(e){return e.join(` `).trim()||void 0}function ml(e,t){let r=e===void 0?NaN:Number(e);if(!Number.isInteger(r)||r<1)throw new n(`INVALID_ARGS`,`viewport ${t} must be a positive integer`);return r}const hl=[`path`,`start`,`stop`,`doctor`,`mark`,`clear`],gl=[`medium`,`high`],_l=`medium`;function vl(e){return gl.includes(e)}function yl(e){let t=typeof e==`number`?e:bl(e);return t!==void 0&&Number.isInteger(t)&&t>=5&&t<=10?t:void 0}function bl(e){return typeof e==`string`&&/^\d+$/.test(e)?Number(e):void 0}function xl(e){if(vl(e))return e;let t=yl(e);if(t!==void 0)return t<=7?`medium`:`high`}export{W as $,at as $n,Ai as $t,Ho as A,Lt as An,ea as At,So as B,xt as Bn,Xi as Bt,gc as C,Gt as Cn,ya as Ct,Es as D,Rt as Dn,ga as Dt,Gs as E,qt as En,_a as Et,Ro as F,vt as Fn,qi as Ft,mo as G,ft as Gn,H as Gt,bo as H,wt as Hn,Qi as Ht,zo as I,gt as In,Li as It,ho as J,ct as Jn,ji as Jt,vo as K,mt as Kn,bi as Kt,Lo as L,yt as Ln,Ji as Lt,K as M,Ft as Mn,Fi as Mt,vs as N,ht as Nn,Wi as Nt,Ds as O,zt as On,na as Ot,Uo as P,_t as Pn,Pi as Pt,uo as Q,S as Qn,Ti as Qt,Bo as R,St as Rn,Ki as Rt,_c as S,Ht as Sn,va as St,Xs as T,Kt as Tn,ma as Tt,go as U,Et as Un,$i as Ut,Co as V,Ct as Vn,Yi as Vt,_o as W,Dt as Wn,Zi as Wt,po as X,st as Xn,Si as Xt,fo as Y,lt as Yn,Ci as Yt,G as Z,ot as Zn,Ei as Zt,Fc as _,zn as _n,ka as _t,ml as a,gi as an,$e as ar,Ba as at,wc as b,D as bn,Ca as bt,Kc as c,Vr as cn,Be as cr,Ta as ct,Qc as d,Er as dn,Na as dt,Di as en,Je as er,Ga as et,el as f,Tr as fn,Ia as ft,J as g,Un as gn,Fa as gt,Ic as h,P as hn,Pa as ht,hl as i,_i as in,tt as ir,za as it,cs as j,It as jn,Gi as jt,Yo as k,Pt as kn,ta as kt,Jc as l,Br as ln,Ge as lr,Ea as lt,$c as m,N as mn,Aa as mt,gl as n,Oi as nn,Ye as nr,Ka as nt,ol as o,hi as on,Qe as or,Ha as ot,tl as p,L as pn,Ma as pt,yo as q,dt as qn,Mi as qt,xl as r,wi as rn,et as rr,Ua as rt,al as s,R as sn,Ve as sr,Va as st,_l as t,ki as tn,qe as tr,qa as tt,Zc as u,Dr as un,We as ur,ja as ut,Sc as v,Gn as vn,La as vt,Ys as w,Wt as wn,ha as wt,Tc as x,Vt as xn,xa as xt,Cc as y,Rn as yn,Sa as yt,Io as z,Tt as zn,Ii as zt};
6
+ `)}function nr(e){if(e<1e3)return`${Math.round(e)}ms`;if(e<6e4)return`${(Math.round(e/100)/10).toFixed(1)}s`;let t=e/6e4;if(t<60)return`${(Math.round(t*10)/10).toFixed(1)}m`;let n=t/60;return`${(Math.round(n*10)/10).toFixed(1)}h`}function rr(e){let t=typeof e.appName==`string`?e.appName:void 0,n=typeof e.appBundleId==`string`?e.appBundleId:void 0,r=[];return t&&r.push(`Page: ${t}`),n&&r.push(`App: ${n}`),r.length>0?`${r.join(`
7
+ `)}\n`:``}function ir(e,t,n){let r=n?` (truncated)`:``;return t?.partial?t.totalNodeCount>t.visibleNodeCount?`Snapshot: ${t.visibleNodeCount} visible nodes (${t.totalNodeCount} total)${r}`:`Snapshot: ${t.visibleNodeCount} visible nodes${r}`:`Snapshot: ${e} nodes${r}`}function ar(e){return e.map(e=>JSON.stringify(e)).join(`
8
+ `)}function or(e){return Rr(e).join(`
9
+ `)}function sr(e){return Fr(zn(e,{summarizeTextSurfaces:!0})).join(`
10
+ `)}function cr(e){return e&&e.summaryLines.length>0?`\n${e.summaryLines.join(`
11
+ `)}`:``}function lr(e,t,n,r,i=0){let a=ur(e);if(i===0&&a)return a;let o=(t?.hiddenCount??0)+i,s=t?t.nodes.some(e=>e.hiddenContentAbove||e.hiddenContentBelow):!1;return o>0?{partial:!0,visibleNodeCount:n,totalNodeCount:Math.max(r,a?.totalNodeCount??r),reasons:dr([...a?.reasons??[],`offscreen-nodes`])}:a||(s?{partial:!0,visibleNodeCount:n,totalNodeCount:n,reasons:[]}:null)}function ur(e){let t=e.visibility;if(!t||typeof t!=`object`)return null;let n=t;return typeof n.partial!=`boolean`||typeof n.visibleNodeCount!=`number`||typeof n.totalNodeCount!=`number`||!Array.isArray(n.reasons)?null:{partial:n.partial,visibleNodeCount:n.visibleNodeCount,totalNodeCount:n.totalNodeCount,reasons:n.reasons.filter(e=>typeof e==`string`)}}function dr(e){return[...new Set(e)]}function fr(e){let t=e.baselineInitialized===!0,n=e.summary??{},r=P(n.additions),i=P(n.removals),a=P(n.unchanged),o=F(),s=Pr(e),c=s.length>0?`${s.join(`
12
+ `)}\n`:``;if(t)return`${c}Baseline initialized (${a} lines).\n`;let l=kr(Array.isArray(e.lines)?e.lines:[],1).map(e=>{let t=typeof e.text==`string`?e.text:``;if(e.kind===`added`){let e=t.startsWith(` `)?`+${t}`:`+ ${t}`;return o?I(e,`green`):e}if(e.kind===`removed`){let e=t.startsWith(` `)?`-${t}`:`- ${t}`;return o?I(e,`red`):e}return o?I(t,`dim`):t}),u=l.length>0?`${l.join(`
13
+ `)}\n`:``;return o?`${c}${u}${[`${I(String(r),`green`)} additions`,`${I(String(i),`red`)} removals`,`${I(String(a),`dim`)} unchanged`].join(`, `)}\n`:`${c}${u}${r} additions, ${i} removals, ${a} unchanged\n`}function pr(e){let t=F(),n=e.match===!0,r=e.dimensionMismatch,i=[];return i.push(...mr(e,t)),i.push(...hr(e,n,t)),!n&&!r&&(i.push(...gr(e,t)),i.push(..._r(e,t)),i.push(...vr(e,t)),i.push(...br(e,t)),i.push(...xr(e,t))),`${i.join(`
14
+ `)}\n`}function mr(e,t){if(e.match===!0)return[`${t?I(`✓`,`green`):`✓`} Screenshots match.`];let n=e.dimensionMismatch,r=t?I(`✗`,`red`):`✗`;if(n){let e=n.expected,t=n.actual;return[`${r} Screenshots have different dimensions: expected ${e?.width}x${e?.height}, got ${t?.width}x${t?.height}`]}let i=P(e.differentPixels),a=P(e.mismatchPercentage),o=`${a===0&&i>0?`<0.01`:String(a)}% pixels differ`;return[`${r} ${t?I(o,`red`):o}`]}function hr(e,t,n){if(t)return[];let r=[];if(e.diffPath){let t=Or(e.diffPath),i=n?I(`Diff image:`,`dim`):`Diff image:`,a=n?I(t,`green`):t;r.push(` ${i} ${a}`)}if(e.currentOverlayPath){let t=Or(e.currentOverlayPath),i=n?I(`Current overlay:`,`dim`):`Current overlay:`,a=n?I(t,`green`):t,o=P(e.currentOverlayRefCount),s=o>0?` (${o} refs)`:``;r.push(` ${i} ${a}${s}`)}return r}function gr(e,t){let n=P(e.differentPixels),r=P(e.totalPixels);return[` ${t?I(String(n),`red`):String(n)} different / ${r} total pixels`]}function _r(e,t){let n=Cr(e);return n.length===0?[]:[` ${L(`Hints:`,t)}`,...n.map(e=>` - ${e}`)]}function vr(e,t){let n=Array.isArray(e.regions)?e.regions:[];if(n.length===0)return[];let r=[` ${L(`Changed regions:`,t)}`];for(let e of n.slice(0,5))r.push(...yr(e));return r}function yr(e){let t=e.shareOfDiffPercentage===0&&e.differentPixels>0?`<0.01`:String(e.shareOfDiffPercentage),n=e.rect,r=[` ${e.index}. ${e.location} x=${n.x} y=${n.y} ${n.width}x${n.height}, ${t}% of diff, change=${e.dominantChange}`],i=Dr(e);i&&r.push(` ${i}`);let a=e.currentOverlayMatches?.[0];if(a){let e=a.label?` "${a.label}"`:``;r.push(` overlaps @${a.ref}${e}, ${a.regionCoveragePercentage}% of region`)}return r}function br(e,t){let n=e.ocr?.matches??[];if(n.length===0)return[];let r=n.slice(0,8),i=[` ${L(`OCR text deltas (${e.ocr?.provider}; baselineBlocks=${e.ocr?.baselineBlocks} currentBlocks=${e.ocr?.currentBlocks}; showing ${r.length}/${n.length}; px):`,t)}`,` ${L(`item | text | movePx | sizeDeltaPx | bboxBaseline | bboxCurrent | confidence | issueHint`,t)}`];for(let[e,t]of r.entries()){let n=t.delta;i.push(` ${e+1} | ${JSON.stringify(t.text)} | ${N(n.x)},${N(n.y)} | ${N(n.width)},${N(n.height)} | ${Sr(t.baselineRect)} | ${Sr(t.currentRect)} | ${t.confidence} | ${t.possibleTextMetricMismatch?`ocr-bbox-size-change`:`-`}`)}return i}function xr(e,t){let n=e.nonTextDeltas??[];if(n.length===0)return[];let r=n.slice(0,8),i=[` ${L(`Non-text visual deltas (showing ${r.length}/${n.length}; px):`,t)}`,` ${L(`item | region | slot | kind | bboxCurrent | nearestText`,t)}`];for(let e of r)i.push(` ${e.index} | ${e.regionIndex?`r${e.regionIndex}`:`-`} | ${e.slot} | ${e.likelyKind} | ${Sr(e.rect)} | ${e.nearestText?JSON.stringify(e.nearestText):`-`}`);return i}function Sr(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function N(e){return e>0?`+${e}`:String(e)}function Cr(e){let t=[],n=e.ocr?.movementClusters??[];for(let e of n.slice(0,2))t.push(`text movement cluster: ${Er(e.texts)} dx=${Tr(e.xRange)}px dy=${Tr(e.yRange)}px`);let r=(e.nonTextDeltas??[]).filter(e=>[`icon`,`toggle`,`chevron`].includes(e.likelyKind)).slice(0,3);r.length>0&&t.push(`non-text controls: ${r.map(wr).join(`; `)}`);let i=(e.nonTextDeltas??[]).filter(e=>e.likelyKind===`separator`).slice(0,2);return i.length>0&&t.push(`non-text boundaries: ${i.map(wr).join(`; `)}`),t.slice(0,6)}function wr(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:``,n=e.regionIndex?` r${e.regionIndex}`:``;return`${e.likelyKind}${t}${n}`}function Tr(e){return e.min===e.max?N(e.min):`${N(e.min)}..${N(e.max)}`}function Er(e){let t=e.slice(0,4).map(e=>JSON.stringify(e)),n=e.length>t.length?` +${e.length-t.length} more`:``;return`${t.join(`, `)}${n}`}function Dr(e){let t=[e.size?`size=${e.size}`:null,e.shape?`shape=${e.shape}`:null,typeof e.densityPercentage==`number`?`density=${e.densityPercentage}%`:null,e.averageBaselineColorHex&&e.averageCurrentColorHex?`avgColor=${e.averageBaselineColorHex}->${e.averageCurrentColorHex}`:null,typeof e.baselineLuminance==`number`&&typeof e.currentLuminance==`number`?`luminance=${e.baselineLuminance}->${e.currentLuminance}`:null].filter(e=>e!==null);return t.length>0?t.join(` `):null}function Or(e){let t=process.cwd(),n=He.relative(t,e);return n===``||!n.startsWith(`..`)&&!He.isAbsolute(n)?n===``?`.`:`.${He.sep}${n}`:e}function P(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function kr(e,t){if(e.length===0)return e;let n=e.map((e,t)=>({index:t,kind:e.kind})).filter(e=>e.kind===`added`||e.kind===`removed`).map(e=>e.index);if(n.length===0)return e;let r=Array(e.length).fill(!1);for(let i of n){let n=Math.max(0,i-t),a=Math.min(e.length-1,i+t);for(let e=n;e<=a;e+=1)r[e]=!0}return e.filter((e,t)=>r[t])}function F(e=process.stdout){let t=process.env.FORCE_COLOR;return typeof t==`string`?t!==`0`:typeof process.env.NO_COLOR==`string`?!1:!!e.isTTY}function I(e,t,n){return Ue(t,e,n)}function L(e,t){return t?I(e,`dim`):e}function Ar(e,t,n,r={nodes:t,filteredCount:0}){let i=Pr(e);if(jr(e)){let e=Nr(t,n);e&&i.push(e)}!n.raw&&r.filteredCount>0&&i.push(`Collapsed ${r.filteredCount} Android helper node${r.filteredCount===1?``:`s`} from the agent-facing text snapshot; use --raw or --json for the full hierarchy.`);let a=r.filteredCount>0?r.nodes:t;return!n.raw&&an(a)&&i.push(`Warning: possible repeated nav subtree detected.`),i}function jr(e){return!e.snapshotQuality&&!Mr(e)}function Mr(e){let t=e.snapshotDiagnostics;if(!t||typeof t!=`object`)return!1;let n=t.stats;return!!(n&&typeof n==`object`&&n.platform===`web`)}function Nr(e,t){if(t.scoped===!0||t.depthLimited===!0||e.length>3)return null;let n=e.length===1?`node`:`nodes`;return`Hint: sparse accessibility snapshot returned ${e.length} ${n}; snapshot state is invalid or unavailable for this screen. Use plain screenshot, not screenshot --overlay-refs, as visual truth. If screenshot shows the Home Screen or another app, run open for this app again first. Then navigate away with coordinates if needed and retry snapshot -i on the next screen.`}function Pr(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.length>0):[]}function Fr(e){let t=[],n=[],r=new Map(e.map(e=>[e.node.index,e.node])),i=e=>{for(;n.length>0&&(!e||Ir(e,n[n.length-1],r));)t.push(...zr(n.pop(),`below`))};for(let r of e)i(r),t.push(r.text),t.push(...zr(r,`above`)),r.node.hiddenContentBelow&&n.push(r);return i(),t}function Ir(e,t,n){return Lr(e.node,t.node,n)?!1:e.depth<=t.depth}function Lr(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){if(r.parentIndex===t.index)return!0;let e=n.get(r.parentIndex);if(!e)return!1;r=e}return!1}function Rr(e){return zn(e,{summarizeTextSurfaces:!0}).flatMap(e=>[Bn(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...zr({...e,depth:0})])}function zr(e,t){let n=Br(e.type);if(!n)return[];let r=[];if(e.node.hiddenContentAbove&&t!==`below`&&r.push(`[content above ${n} hidden]`),e.node.hiddenContentBelow&&t!==`above`&&r.push(`[content below ${n} hidden]`),r.length===0)return[];let i=` `.repeat(e.depth+1);return r.map(e=>`${i}${e}`)}function Br(e){return e===`scroll-area`||e===`list`||e===`collection`||e===`table`?e:null}function Vr(e,t={}){let n=F(process.stderr);if(e===`pass`){let e=t.passFormat??`green`;return n?R(`✓`,e):`✓`}return e===`fail`?n?R(`⨯`,`red`):`⨯`:e===`warn`?n?R(`!`,`yellow`):`!`:n?R(`-`,`dim`):`-`}function R(e,t){return I(e,t,{validateStream:!1})}function Hr(e){return`${Vr(Wr(e.status))} ${Gr(e)}`}function Ur(e){return e.status!==`fail`&&e.status!==`warn`?[]:typeof e.command==`string`?[` run: ${e.command}`]:typeof e.hint==`string`?[` hint: ${e.hint}`]:[]}function Wr(e){return e===`pass`?`pass`:e===`fail`?`fail`:e===`warn`?`warn`:`skip`}function Gr(e){let t=typeof e.id==`string`&&e.id.length>0?e.id:`check`,n=typeof e.summary==`string`&&e.summary.length>0?e.summary:t;return n===t?t:`${t}: ${n}`}const Kr=3e5,qr=[`leaseId`,`tenantId`,`runId`,`clientId`,`deviceKey`];function Jr(e){return f({tenantId:e.meta?.tenantId??z(e.flags,`tenant`),runId:e.meta?.runId??z(e.flags,`runId`),leaseId:e.meta?.leaseId??z(e.flags,`leaseId`),leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend,leaseProvider:e.meta?.leaseProvider??z(e.flags,`leaseProvider`)??z(e.flags,`provider`),deviceKey:e.meta?.deviceKey??z(e.flags,`deviceKey`),clientId:e.meta?.clientId??z(e.flags,`clientId`)})}function Yr(e){return f({tenantId:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs??e.ttlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider??e.provider,deviceKey:e.deviceKey,clientId:e.clientId})}function Xr(e){return f({tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function Zr(e){return f({tenant:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function Qr(e){return f({tenantId:e.tenantId??``,runId:e.runId??``,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function $r(e){return ai(e)}function ei(e){let{ttlMs:t,...n}=ai(e);return n}function ti(e,t,n){let r=f({...n.includeTokenParam?{token:n.token}:{},session:n.session,tenantId:e.tenantId,runId:e.runId,leaseProvider:e.leaseProvider,clientId:e.clientId,deviceKey:e.deviceKey});switch(t){case`lease_allocate`:return{...r,...f({ttlMs:e.leaseTtlMs,backend:e.leaseBackend})};case`lease_heartbeat`:return{...r,...f({leaseId:e.leaseId,ttlMs:e.leaseTtlMs})};case`lease_release`:return{...r,...f({leaseId:e.leaseId})}}}function ni(e){let t=f({leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId});return Object.keys(t).length>0?t:void 0}function ri(e){return e.leaseProvider===`proxy`}function ii(e){return ri(e)?qr.filter(t=>!e[t]):[]}function ai(e){return f({leaseId:e.leaseId??``,tenantId:e.tenantId,runId:e.runId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function z(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function B(e,t,r={}){let i=e[t];if(i===void 0)return;if(!Number.isInteger(i))throw new n(`INVALID_ARGS`,`Expected ${t} to be an integer.`);let a=i;if(r.min!==void 0&&a<r.min)throw new n(`INVALID_ARGS`,`Expected ${t} to be at least ${r.min}.`);if(r.max!==void 0&&a>r.max)throw new n(`INVALID_ARGS`,`Expected ${t} to be at most ${r.max}.`);return a}const oi=[`metrics`,`frames`,`memory`,`cpu`,`trace`],si=[`sample`,`snapshot`,`start`,`stop`,`report`],ci=[`profile`],li=[`xctrace`,`simpleperf`,`perfetto`,`android-hprof`,`memgraph`],ui=[`android-hprof`,`memgraph`],di=y(oi),fi=y(si),pi=y(ci),mi=y(li),hi=y(ui),gi=`perf area must be metrics, frames, memory, cpu, or trace`,_i=`perf action must be sample, snapshot, start, stop, or report`,vi=`perf cpu requires profile`,yi=`perf --kind must be xctrace, simpleperf, perfetto, android-hprof, or memgraph`,bi=`perf memory snapshot --kind must be android-hprof or memgraph`,xi=di.is,Si=fi.is,Ci=pi.is,wi=mi.is,Ti=hi.is,Ei=1e4,Di=2e3,Oi=[`get`,`accept`,`dismiss`,`wait`],ki=`<wifi|airplane|location> <on|off>`,Ai=`location set <lat> <lon>`,ji=`animations <on|off>`,Mi=`appearance <light|dark|toggle>`,Ni=`faceid <match|nonmatch|enroll|unenroll>`,Pi=`touchid <match|nonmatch|enroll|unenroll>`,Fi=`fingerprint <match|nonmatch>`,Ii=`clear-app-state [app-id]`,Li=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,Ri=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,zi=`macOS supports only settings ${Mi} and settings ${Ri}. wifi|airplane|location|animations remain unsupported on macOS.`,Bi=[`settings ${ki}`,`settings ${Ai}`,`settings ${ji}`,`settings ${Mi}`,`settings ${Ni}`,`settings ${Pi}`,`settings ${Fi}`,`settings ${Ii}`,`settings ${Li}`,`settings ${Ri}`].join(` | `),Vi=`settings requires ${ki}, ${Ai}, ${ji}, ${Mi}, ${Ni}, ${Pi}, ${Fi}, ${Ii}, ${Li}, or ${Ri}`;function Hi(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function Ui(e){return`Unsupported macOS setting: ${e}. ${zi}`}function Wi(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function Gi(e,t,n){return{deviceId:t,deviceName:n,...g(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function Ki(e,t={}){let n=t.includeSerial??!0,r=qi(e);return{platform:e.platform,target:e.target,device:e.name,id:e.id,...e.platform===`ios`?{device_udid:e.ios?.udid??e.id,ios_simulator_device_set:e.ios?.simulatorSetPath??null}:{},...n&&r?{serial:r}:{}}}function qi(e){return g(e.platform)?e.identifiers.serial??e.id:void 0}function Ji(e){return{name:e.name,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...Ki(e.device,{includeSerial:!1}),createdAt:e.createdAt}}function Yi(e){return{platform:e.platform,...e.appleOs?{appleOs:e.appleOs}:{},id:e.id,name:e.name,kind:e.kind,target:e.target,...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function Xi(e){return e.bundleId??e.package??e.app}function Zi(e){return w({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${Xi(e)}`)}function Qi(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function $i(e){return w({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${Qi(e)}`)}function ea(e){let t=e.appName??e.appBundleId??e.session;return w({session:e.session,...e.warnings?.length?{warnings:e.warnings}:{},...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...e.requestLogPath?{requestLogPath:e.requestLogPath}:{},...e.eventLogPath?{eventLogPath:e.eventLogPath}:{},...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?Ki(e.device):{}},t?`Opened: ${t}`:`Opened`)}function ta(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...`provider`in e&&e.provider?{provider:e.provider}:{},...C(e.session?`Closed: ${e.session}`:`Closed`)}}function na(e){return{nodes:e.nodes,truncated:e.truncated,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...Fe(ra(e)),...e.unchanged?{unchanged:e.unchanged}:{},...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{},...e.refsGeneration===void 0?{}:{refsGeneration:e.refsGeneration}}}function ra(e){return{...e,...e.snapshotQuality?{quality:e.snapshotQuality}:{}}}const ia=1e4;function aa(e,t=`scroll accepts either a relative amount or --pixels, not both`){if(e.amount!==void 0&&e.pixels!==void 0)throw new n(`INVALID_ARGS`,t)}function oa(e,t={}){if(e===void 0)return;let r=t.field??`scroll durationMs`,i=t.max??1e4,a=t.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(e)||!Number.isInteger(e)||e<0)throw new n(`INVALID_ARGS`,a);if(e>i)throw new n(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return e}function sa(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}function ca(e,t,r,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>i)throw new n(`INVALID_ARGS`,`${t} must be an integer between ${r} and ${i}`);return e}function la(e,t,n={}){let r=ma(e);if(r.length===0)return{canScroll:!1,emptySnapshot:!0};let i=ne(r),a=ha(r,i,t,n);return a?{canScroll:_a(a,i.get(a.index),t),emptySnapshot:!1,scope:va(a,r)}:{canScroll:!1,emptySnapshot:!1}}async function ua(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=la(await i(r),t,n);return r&&e.emptySnapshot?await ua({edge:t,target:n,captureNodes:i}):e}catch(e){throw pa(t,r,e)}}async function da(e){let{edge:t,captureState:r,scroll:i}=e,a=await r();a.scope&&(a=await r(a.scope));let o=0,s;for(;a.canScroll;){if(o>=40)throw new n(`COMMAND_FAILED`,`scroll ${t} reached the safety limit before the snapshot showed the edge`,{hint:`The scoped scroll container still reports hidden content. Use a smaller manual scroll + snapshot loop to inspect the current state.`});s=await i(),o+=1,a=await r(a.scope)}return{passes:o,result:s}}function fa(e,t,n,r,i){return t&&n===0?`Already at ${t}; no hidden content ${t===`bottom`?`below`:`above`} detected`:t?`Scrolled to ${t} with ${n} ${e} passes`:i===void 0?r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`:`Scrolled ${e} by ${i}px`}function pa(e,t,r){return t?new n(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:t,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},r):new n(`COMMAND_FAILED`,`Failed to verify scroll ${e} state`,{hint:`scroll ${e} needs a snapshot showing hidden content ${e===`bottom`?`below`:`above`} before it will move.`},r)}function ma(e){return e.map((e,t)=>({...e,ref:`ref`in e&&e.ref?e.ref:`e${t+1}`}))}function ha(e,t,n,r){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>le(e)&&wa(e.rect));if(a.length===0)return null;let o=ga(r.nodeIndex,i);if(o)return o;let s=r.point;if(s){let e=a.filter(e=>e.rect&&Ca(e.rect,s)).sort(xa);if(e.length>0)return e.find(e=>_a(e,t.get(e.index),n))??e[0]??null}let c=a.filter(e=>_a(e,t.get(e.index),n)).sort(Sa);return c.length>0?c[0]??null:a.filter(t=>ie(t,e)).sort(Sa)[0]??a.sort(Sa)[0]??null}function ga(e,t){if(e===void 0)return null;let n=t.get(e);for(;n;){if(le(n)&&wa(n.rect))return n;n=n.parentIndex===void 0?void 0:t.get(n.parentIndex)}return null}function _a(e,t,n){return n===`bottom`?e.hiddenContentBelow===!0||t?.hiddenContentBelow===!0:e.hiddenContentAbove===!0||t?.hiddenContentAbove===!0}function va(e,t){return[e.identifier,e.label].filter(e=>typeof e==`string`).map(e=>e.trim()).find(n=>ba(n)&&ya(n,e,t))}function ya(e,t,n){let r=e.toLowerCase(),i=n.filter(e=>[e.identifier,e.label,e.value].some(e=>typeof e==`string`&&e.trim().toLowerCase().includes(r)));return i.length===1&&i[0]?.index===t.index}function ba(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function xa(e,t){return V(e.rect)-V(t.rect)}function Sa(e,t){return V(t.rect)-V(e.rect)}function V(e){return e?e.width*e.height:0}function Ca(e,t){return t.x>=e.x&&t.x<=e.x+e.width&&t.y>=e.y&&t.y<=e.y+e.height}function wa(e){return!!(e&&e.width>0&&e.height>0)}function H(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function U(e){return e.clock?.now()??Date.now()}async function Ta(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function Ea(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function W(e){return e&&typeof e==`object`?e:void 0}const Da=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function Oa(e,t){return ka(e,t).node}function ka(e,t){if(x(t))return{node:t,reason:`covered`};let n=Aa(e,t);if(n?.rect&&S(n.rect))return{node:n,reason:`same-rect-descendant`};if(ja(t)&&t.rect&&S(t.rect))return{node:t,reason:`semantic-target`};let r=ae(e,t);return r?.rect&&!x(r)&&S(r.rect)?Na(t,r,e)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}:{node:t,reason:`original`}}function Aa(e,t){let n=b(t.rect);if(!n)return null;let r=t,i=new Set;for(;!i.has(r.ref);){i.add(r.ref);let t=e.filter(e=>{if(e.parentIndex!==r.index||!e.hittable||x(e))return!1;let t=b(e.rect);return t?ze(t,n):!1});if(t.length!==1)break;r=t[0]}return r===t?null:r}function ja(e){return[e.type,e.role,e.subrole].map(e=>_(e??``)).some(Ma)}function Ma(e){return e===`tab`||Da.some(t=>e.includes(t))}function Na(e,t,n){let r=b(e.rect),i=b(t.rect);if(!r||!i)return!1;let a=Pa(n,r);return!a||!Fa(i,a)?!1:!ze(r,i)}function Pa(e,t){let n=s(t),r=e.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)}).map(e=>b(e.rect)).filter(e=>e!==null);if(r.length===0)return null;let i=r.filter(e=>ue(e,n.x,n.y));return oe(i.length>0?i:r)}function Fa(e,t){let n=Pe(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}function Ia(e){return e.hittable===!0||ja(e)}function La(e,t){let n=de(v(e),t);return n.id!==void 0||n.label!==void 0?!1:ye(e.value)===null}function Ra(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function za(e,t){let n=Re(t);return t.filter(t=>t.index!==e.index&&Ra(t,e,n)).sort((e,t)=>e.index-t.index)}function Ba(e,t){let n=S(e.rect);return!n||!t.rect?!1:ue(t.rect,n.x,n.y)}function Va(e,t){if(!La(e,t))return e;let n=za(e,t);if(n.some(Ia))return e;let r=n.find(e=>v(e).label!==void 0);return!r||!Ba(r,e)?e:r}function Ha(e){return e===`text`||e===`label`||e===`any`}async function Ua(e,t){let r=t??`default`,i=await e.sessions.get(r);if(!i)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new n(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function Wa(e,t,r={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=t.session??`default`,o=await e.sessions.get(a),s=await i(H(e,t),{interactiveOnly:r.interactiveOnly??!1,depth:t.depth,scope:r.scope??t.scope,raw:t.raw,includeRects:r.includeRects,...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),c=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,...s.quality?{snapshotQuality:s.quality}:{},createdAt:U(e)};return r.updateSession&&o&&!Me(c.snapshotQuality)&&await e.sessions.set({...o,snapshot:c}),{sessionName:a,session:o,snapshot:c}}async function Ga(e,t,n){if(e.backend.readText){let r=await e.backend.readText(H(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return be(n)}function Ka(e,t,i){let a=o(t);if(!a)throw new n(`INVALID_ARGS`,i.invalidRefMessage);let s=r(e,a)??(i.fallbackLabel.length>0?te(e,i.fallbackLabel):null);if(!s)throw new n(`COMMAND_FAILED`,i.notFoundMessage);return{ref:a,node:s}}function qa(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}function Ja(e,t,r,i){if(!r)return;let a=v(e),o=pe(e,t);if(!(xe(a,r.identity)&&Oe(o,r.structural)))throw new n(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:we,observed:a,observedStructural:o,expected:r.identity,expectedStructural:r.structural})}async function G(e,t,n){return await mo(e,t,n.action),t.target.kind===`point`?await Xa(e,t,t.target,n):t.target.kind===`ref`?await Qa(e,t,t.target,n):await $a(e,t,t.target,n)}async function Ya(e,t,n){let r=t.session??`default`,i=await e.sessions.get(r);if(!i?.snapshot)return;let a={x:n.x,y:n.y,width:0,height:0},o=ee(i.snapshot.nodes,a);if(!o)return;let s={x:n.x,y:n.y};if(!ue(o,s.x,s.y))return`Coordinates (${s.x}, ${s.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`}async function Xa(e,t,n,r){let i=await Ya(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await Za(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preActionNodes:a}:{},...i?{warning:i}:{}}}async function Za(e,t){try{return(await K(e,t,!0)).snapshot.nodes}catch{return}}async function Qa(e,t,n,r){let i=await go(e,t,n),a=i.resolved;Ja(a.node,i.snapshot.nodes,r.expectedResolvedTarget,r.action);let o=r.promoteToHittableAncestor?lo(i.snapshot.nodes,a.node,{action:r.action,label:`Ref ${n.ref}`}):a.node;return uo(o,`Ref ${n.ref}`,r.action),So(o,i.snapshot.nodes,n.ref,r.action),{kind:`ref`,point:yo(o,`Ref ${n.ref} not found or has invalid bounds`),target:{kind:`ref`,ref:`@${a.ref}`},...ao(e,o,i.snapshot.nodes,r.action,a.resolution)}}async function $a(e,t,r,i){let a=d(r.selector),o=await K(e,t,i.requireInteractive),s=_e(co(o.snapshot.nodes),a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if((!s||!s.node.rect)&&i.requireInteractive&&(o=await K(e,t,!1),s=_e(co(o.snapshot.nodes),a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0})),!s||!s.node.rect){let t=_e(o.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!0,requireUnique:!1});throw t?.node&&x(t.node)?fo({label:`Selector ${t.selector.raw}`,node:t.node,action:i.action,selector:t.selector.raw}):new n(`COMMAND_FAILED`,Se(a,s?.diagnostics??[],{unique:!0}),{hint:ge(s?.diagnostics??[])})}Ja(s.node,o.snapshot.nodes,i.expectedResolvedTarget,i.action);let c=i.promoteToHittableAncestor?lo(o.snapshot.nodes,s.node,{action:i.action,label:`Selector ${s.selector.raw}`}):s.node;return uo(c,`Selector ${s.selector.raw}`,i.action),xo(c,o.snapshot.nodes,s.selector.raw,i.action),{kind:`selector`,point:yo(c,`Selector ${s.selector.raw} resolved to invalid bounds`),target:{kind:`selector`,selector:s.selector.raw},...ao(e,c,o.snapshot.nodes,i.action,ro(s,o.snapshot.nodes))}}const eo={source:`ref`,phase:`pre-action`,kind:`exact`},to={source:`ref`,phase:`pre-action`,kind:`label-fallback`},no={source:`runtime`,phase:`pre-action`,kind:`unique`};function ro(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:io(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>io(e,t))}:no}function io(e,t){let n=_(e.type??``),r=ke(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:qa(n,256)}:{},...r===void 0?{}:{label:qa(r,256)}}}function ao(e,t,n,r,i){return{node:t,selectorChain:Ee(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:n}),refLabel:ke(t,n),...so(t,r),preActionNodes:n,resolution:i,...oo(e,t,n,r)}}function oo(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Va(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:Ee(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:ke(i,n)}}}function so(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}function co(e){return e.filter(e=>!x(e))}function lo(e,t,n){let r=ka(e,t);if(r.reason===`covered`)throw fo({label:n.label,node:t,action:n.action});return r.node}function uo(e,t,n){if(x(e))throw fo({label:t,node:e,action:n})}function fo(e){return new n(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${po(e.action)} safely`,{hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}function po(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;default:return`be tapped`}}async function K(e,t,r){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,a=await e.sessions.get(i);if(!a)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(H(e,t),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:U(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}async function mo(e,t,r){if(e.backend.platform!==`macos`)return;let i=await ho(e,t);if(!(i!==`desktop`&&i!==`menubar`)&&!(i===`menubar`&&(r===`click`||r===`press`)))throw new n(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function ho(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function go(e,t,r){let{session:i,snapshot:a}=await Ua(e,t.session),o=r.fallbackLabel??``,s=vo(a.nodes,r.ref,{fallbackLabel:o});if(!s)throw new n(`COMMAND_FAILED`,`Ref ${r.ref} not found or has no bounds`,{hint:me});return _o({session:i,frameTree:a,target:r,fallbackLabel:o,authorized:s})}function _o(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=vo(o.nodes,r.ref,{fallbackLabel:i});return s&&xe(v(a.node),v(s.node))?{snapshot:o,resolved:s}:{snapshot:n,resolved:a}}function vo(e,t,i){let a=o(t);if(!a)throw new n(`INVALID_ARGS`,`Invalid ref: ${t}`);let s=r(e,a);if(bo(s))return{ref:a,node:s,resolution:eo};let c=i.fallbackLabel.length>0?te(e,i.fallbackLabel):null;return bo(c)?{ref:a,node:c,resolution:to}:null}function yo(e,t){let r=S(e.rect);if(!r)throw new n(`COMMAND_FAILED`,t);return r}function bo(e){return e?S(e.rect)!==null:!1}function xo(e,t,n,r){To(e,t,{message:`Selector ${n} resolved to an off-screen element and is not safe to ${r}`,details:{reason:`offscreen_selector`,selector:n},hint:e=>`${Co(e)} in small steps, retrying ${r} with the same selector after each (it re-resolves against a fresh snapshot). A single large scroll can overshoot the target; a short bounded gesture pan lands it more reliably. If it is inside a closed drawer or another tab, open that container first.`})}function So(e,t,n,r){To(e,t,{message:`Ref ${n} is off-screen and not safe to ${r}`,details:{reason:`offscreen_ref`,ref:o(n)},hint:e=>`${Co(e)} in small steps (a single large scroll can overshoot; a short bounded gesture pan lands it more reliably), then retry ${r} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function Co(e){return e?`Scroll ${e} toward it`:`Scroll toward it`}async function wo(e,t,n,r){let i=(await e.sessions.get(t.session??`default`))?.snapshot?.nodes;if(!i||o(n.ref)===null)return{};let a=vo(i,n.ref,{fallbackLabel:n.fallbackLabel??``});return a?(uo(a.node,`Ref ${n.ref}`,r),So(a.node,i,n.ref,r),{...so(a.node,r),node:a.node,preActionNodes:i}):{}}function To(e,t,r){let i=e.rect?re(e,t):null;if(!e.rect||!i||Ce(e,t))return;let a=ce(e,t);throw new n(`COMMAND_FAILED`,r.message,{...r.details,rect:e.rect,viewport:i,...a?{scrollDirection:a}:{},hint:r.hint(a)})}function Eo(e){let t=Buffer.alloc(16);for(let n of e)Oo(t,Do(n));return{digest:`ax1:${Ve(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function Do(e){return Ve(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function Oo(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function q(e){let{digest:t,nodeCount:n}=Eo(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=ko(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function ko(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function Ao(e,t){let n=M(e.type??`Element`),r=j(e,n),i=e.enabled===!1?`disabled`:`enabled`,a=e.selected===!0?`selected`:`unselected`,o=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,o].join(`|`)}function jo(e,t,n={}){let r=Po(No(e,n),No(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function Mo(e,t={}){return No(e,t).length}function No(e,t){return t.flatten?e.map(e=>({text:Bn(e,0,!1),comparable:Ao(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):zn(e).map(e=>({text:e.text,comparable:Ao(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function Po(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=Io(a,i,s)?J(a,i+1):J(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return Fo(o,e,t,n,r)}}return[]}function Fo(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=Io(i,c,r)?c+1:c-1,u=J(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function Io(e,t,n){return t===-n||t!==n&&J(e,t-1)<J(e,t+1)}function J(e,t){return e.get(t)??0}const Lo=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),Ro={strippedIndexes:new Set,refs:new Set};function zo(e){let t=new Set(e.filter(e=>_(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return Ro;let n=new Map(e.map(e=>[e.index,e])),r=Wo(e,n,t),i=new Set(r),a=Zo(e,n,r);for(let t of Wo(e,n,a))i.add(t);for(let o of Bo(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function Bo(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=Ho(t,n,r);if(o.size===0)return a;let s=Uo(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&Vo(n,t,o)&&a.add(n.index);return a}function Vo(e,t,n){if(!e.rect)return!1;let r=Qo(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function Ho(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=Qo(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function Uo(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function Wo(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)$o(i,t,n)&&r.add(i.index);return r}function Go(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Ie(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Ne(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function Ko(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(e=>Be(e)).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:qo(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?Ro:{strippedIndexes:o,refs:s}}function qo(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&Go(e,t)).map(e=>e.index))}function Jo(e,t){let n=zo(e),r=Ko(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function Yo(e,t){let{strippedIndexes:n}=Jo(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function Xo(e,t){return Jo(e,t).refs}function Zo(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||_(n.type??``)!==`keyboard`)continue;let i=Qo(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>Lo.has(_(e.type??``))&&!n.has(e.index)&&$o(e,t,a))&&r.delete(i)}return r}function Qo(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(_(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function $o(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}const es=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function ts(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=U(e),o=a+i,s=!1,c=Math.min(300,Math.max(25,r)),l=0,u,d=0,f,p=a;for(;U(e)<o;){let m=await is(e,t,o-U(e));if(!m)return{settled:!1,stalled:!0,waitedMs:U(e)-a,captures:l,nodeCount:d,lastCapture:f};l+=1,f=m;let h=as(m.snapshot.nodes),g=U(e);if(n.resetBudgetOnPrivateAxRecovery===!0&&!s&&ns(m.snapshot.snapshotQuality)){s=!0,o=Math.max(o,g+i),p=g,u=h,d=m.snapshot.nodes.length;let t=rs({nowMs:g,quietSinceMs:p,quietMs:r,pollMs:c,deadlineMs:o});if(t<=0)break;await Ta(e,t);continue}if(h!==u)u=h,d=m.snapshot.nodes.length,p=g;else if(l>=2&&g-p>=r)return{settled:!0,stalled:!1,waitedMs:g-a,captures:l,nodeCount:d,lastCapture:f};let ee=rs({nowMs:g,quietSinceMs:p,quietMs:r,pollMs:c,deadlineMs:o});if(ee<=0)break;await Ta(e,ee)}return{settled:!1,stalled:!1,waitedMs:U(e)-a,captures:l,nodeCount:d,lastCapture:f}}function ns(e){return e?.state===`recovered`&&e.backend===`private-ax`}function rs(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function is(e,t,n){let r=Wa(e,t,{updateSession:!1,interactiveOnly:!0}),i;try{let e=await Promise.race([r,new Promise(e=>{i=setTimeout(()=>e(void 0),n)})]);return e===void 0&&r.catch(()=>{}),e}finally{i!==void 0&&clearTimeout(i)}}function as(e){return e.map(os).join(`|`)}function os(e){let t=e.rect?`${Math.round(e.rect.x)},${Math.round(e.rect.y)},${Math.round(e.rect.width)},${Math.round(e.rect.height)}`:``;return`${e.type??``}#${e.label??``}#${e.identifier??``}#${t}`}const ss=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,cs=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function ls(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{let o=await ts(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0}),s={...a,settled:o.settled,waitedMs:o.waitedMs,captures:o.captures};if(!o.lastCapture)return{observation:{...s,hint:o.stalled?cs:ss}};let{stored:c,session:l}=await bs(e,t,o.lastCapture),u=o.lastCapture.snapshot.nodes;return{observation:{...s,...o.settled&&c?ps(ds(n.resolved),u,n.resolved.point,l?.appBundleId):{},...ys(o,c,u.length)},settledNodes:u}}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}function us(e,t){if(!e)return;let n=q(e),r=t!==void 0&&n.digest!==q(t).digest;return{...n,changedFromBefore:r}}function ds(e){return`preActionNodes`in e&&e.preActionNodes?e.preActionNodes:[]}function fs(e,t,n){let r=jo(Yo(e,n),Yo(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=vs(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function ps(e,t,n,r){let i=fs(e,t,r);return{diff:i,...ms(i,t,n,r)}}function ms(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=Xo(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!hs(o.get(e),n))?{}:_s(t,i,r)}function hs(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const gs=new Set([`application`,`window`]);function _s(e,t,n){let r=Xo(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!gs.has(M(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=M(e.type??`Element`),n=j(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function vs(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function ys(e,t,n){return e.stalled?{hint:cs}:e.settled?t?n<5?{hint:es}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted. Use screenshot as visual truth before interacting further.`}:{hint:ss}}async function bs(e,t,n){if(Me(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function xs(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function Ss(e,t,n,r,i){let a=await Cs(e,t,n,i);return Ts({...r,...a})}async function Cs(e,t,n,r){if(r.settle!==void 0){let i=await ls(e,t,{...r.settle,resolved:n}),a=r.verify?us(i.settledNodes,`preActionNodes`in n?n.preActionNodes:void 0):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await ws(e,t,n);return i?{evidence:i}:{}}async function ws(e,t,n){let r=`preActionNodes`in n?n.preActionNodes:void 0;try{let n=q((await K(e,t,!0)).snapshot.nodes),i=r!==void 0&&n.digest!==q(r).digest;return{...n,changedFromBefore:i}}catch{return}}function Ts(e){let t=e;if(t.targetHittable!==!1||!Es(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function Es(e){if(e.evidence?.changedFromBefore===!0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}const Ds=async(e,t)=>{let r=await G(e,t,{action:`focus`,requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new n(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=Ns(r),a=W(await e.backend.focus(H(e,t),i));return{...r,...a?{backendResult:a}:{},...C(`Focused (${i.x}, ${i.y})`)}},Os=async(e,t)=>{let r=xs(t),i=await G(e,t,{action:`longPress`,requireInteractive:!0,promoteToHittableAncestor:!0,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.longPress)throw new n(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=t.durationMs===void 0?void 0:ca(t.durationMs,`durationMs`,0,12e4),o=Ns(i),s=W(await e.backend.longPress(H(e,t),o,{durationMs:a}));return await Ss(e,t,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...C(`Long pressed (${o.x}, ${o.y})`)},r)},ks=async(e,t)=>{if(!e.backend.scroll)throw new n(`UNSUPPORTED_OPERATION`,`scroll is not supported by this backend`);let r=js(t.direction),i=Is(t.amount,`scroll amount`),a=Rs(t.pixels,`scroll pixels`),o=oa(t.durationMs);aa({amount:i,pixels:a},`scroll accepts either amount or pixels, not both`);let s=await As(e,t),c=s.kind===`viewport`?{kind:`viewport`}:{kind:`point`,point:Ns(s)},l=e.backend.scroll,u=async()=>await l(H(e,t),c,{direction:r.direction,...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},...o===void 0?{}:{durationMs:o}}),d,f=0;if(r.edge){let n=r.edge,i=Ms(s),a=await da({edge:n,captureState:async r=>await Ps(e,t,n,i,r),scroll:u});d=a.result,f=a.passes}else d=await u(),f=1;let p=W(d),m=sa(p);return{...s,direction:r.direction,...r.edge?{edge:r.edge,passes:f}:{},...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},...m===void 0?{}:{durationMs:m},...p?{backendResult:p}:{},...C(fa(r.direction,r.edge,f,i,a))}};async function As(e,t){let n=t.target??{kind:`viewport`};return n.kind===`viewport`?(await mo(e,t,`scroll`),{kind:`viewport`}):await G(e,{...t,target:n},{action:`scroll`,requireInteractive:!1,promoteToHittableAncestor:!1})}function js(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:Fs(e,`scroll direction`)}}function Ms(e){return e.kind===`viewport`?{}:{point:e.point,nodeIndex:`node`in e?e.node?.index:void 0}}function Ns(e){if(!e.point)throw new n(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Ps(e,t,r,i,a){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:o}=e.backend;return await ua({edge:r,target:i,scope:a,captureNodes:async n=>{let r=await o(H(e,t),{scope:n});return r.snapshot?.nodes??r.nodes??[]}})}function Fs(e,t){switch(e){case`up`:case`down`:case`left`:case`right`:return e;default:throw new n(`INVALID_ARGS`,`${t} must be up, down, left, or right`)}}function Is(e,t){return e===void 0?void 0:Ls(e,t)}function Ls(e,t){if(!Number.isFinite(e)||e<=0)throw new n(`INVALID_ARGS`,`${t} must be a positive number`);return e}function Rs(e,t){if(e!==void 0){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new n(`INVALID_ARGS`,`${t} must be a positive integer`);return e}}const zs=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`];function Y(e){let t=Vs(e),r=Us(t,`kind`,zs);if(r===`pan`)return{kind:r,origin:X(t,`origin`),delta:X(t,`delta`),pointerCount:B(t,`pointerCount`,{min:1,max:2}),durationMs:Bs(t)};if(t.pointerCount!==void 0)throw new n(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(r===`fling`){if(t.durationMs!==void 0)throw new n(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:r,direction:Us(t,`direction`,Ae),origin:X(t,`origin`),distance:B(t,`distance`,{min:0})}}if(r===`swipe`){if(t.durationMs!==void 0)throw new n(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:r,preset:Us(t,`preset`,je)}}if(r===`pinch`)return{kind:r,scale:Z(t,`scale`),origin:Hs(t,`origin`)};if(r===`rotate`){if(t.velocity!==void 0)throw new n(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:r,degrees:Z(t,`degrees`),origin:Hs(t,`origin`)}}return{kind:r,origin:X(t,`origin`),delta:X(t,`delta`),scale:Z(t,`scale`),degrees:Z(t,`degrees`),durationMs:Bs(t)}}function Bs(e){let t=B(e,`durationMs`);if(t!==void 0){if(t<16||t>1e4)throw new n(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${Le}.`);return t}}function Vs(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`gesture requires structured object input`);return e}function X(e,t){let n=Vs(e[t]);return{x:Z(n,`x`),y:Z(n,`y`)}}function Hs(e,t){return e[t]===void 0?void 0:X(e,t)}function Z(e,t){let r=e[t];if(typeof r!=`number`||!Number.isFinite(r))throw new n(`INVALID_ARGS`,`Expected ${t} to be a finite number.`);return r}function Us(e,t,r){let i=e[t];if(typeof i!=`string`||!r.includes(i))throw new n(`INVALID_ARGS`,`Expected ${t} to be one of: ${r.join(`, `)}.`);return i}const Ws={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:Gs}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`}};function Gs(e,t){let[n,r,i,a,o]=e,s=Ks(n,i),c=Ks(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function Ks(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function qs(e,t){let n=Ws[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!Js(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function Js(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function Ys(e){if(!(!e||typeof e!=`object`||Array.isArray(e))&&e.durationMs!==void 0)throw new n(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function Xs(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function Q(e,t){let r=qs(e,t);if(r)throw new n(`INVALID_ARGS`,Xs(r))}function Zs(e,t,n){let r=Qs(e,t);return r?Xs(r,n):void 0}function Qs(e,t){if(e===`swipe`)return qs(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(Ws,n))return qs(n,t.slice(1))}function $s(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function ec(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{Q(`gesture pan`,r);let{origin:e,delta:i}=$s(r);return Y({kind:n,origin:e,delta:i,pointerCount:t,durationMs:ac(r[4])})}case`fling`:return Q(`gesture fling`,r),Y({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:ac(r[3])});case`swipe`:return Q(`gesture swipe`,r),Y({kind:n,preset:r[0]});case`pinch`:return Q(`gesture pinch`,r),Y({kind:n,scale:Number(r[0]),origin:oc(r[1],r[2])});case`rotate`:return Q(`gesture rotate`,r),Y({kind:n,degrees:Number(r[0]),origin:oc(r[1],r[2])});case`transform`:{Q(`gesture transform`,r);let{origin:e,delta:t}=$s(r);return Y({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:ac(r[6])})}default:return Y({kind:n})}}function tc(e){switch(e.kind){case`pan`:return $([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return $([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return $([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?$([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return $([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs])}}function nc(e,t={}){return Q(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function rc(e){switch(e.kind){case`pan`:return{gesture:{intent:`pan`,origin:e.origin,delta:e.delta,pointerCount:e.pointerCount,durationMs:e.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:e.direction,origin:e.origin,distance:e.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:e.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:e.origin,scale:e.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:e.origin,degrees:e.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:e.origin,delta:e.delta,scale:e.scale,degrees:e.degrees,durationMs:e.durationMs}}}}function ic(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function ac(e){return e===void 0?void 0:Number(e)}function oc(e,t){if(e===void 0!=(t===void 0))throw new n(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return e===void 0?void 0:{x:Number(e),y:Number(t)}}function $(e){return e.filter(e=>e!==void 0).map(String)}const sc=/^e\d+$/;function cc(e){if(e[0]?.startsWith(`@`)){let t=_c(e.slice(1));return{ref:e[0],...t===void 0?{}:{label:t}}}if(sc.test(e[0]??``))throw new n(`INVALID_ARGS`,`Did you mean "@${e[0]}"? Snapshot refs need the @ prefix.`);let t=c(e);if(t){if(t.rest.length>0)throw new n(`INVALID_ARGS`,mc(e,t));return{selector:t.selectorExpression}}return uc(e)}function lc(e){let t=e[0];if(t?.startsWith(`@`)){let n=e.length>=3?e.slice(2).join(` `):e.slice(1).join(` `);return{kind:`ref`,target:{ref:t,label:e.length>=3?_c(e.slice(1,2)):void 0},text:n}}if(sc.test(t??``))throw new n(`INVALID_ARGS`,`Did you mean "@${t}"? Snapshot refs need the @ prefix.`);let r=c(e,{preferTrailingValue:!0});return r?{kind:`selector`,target:{selector:r.selectorExpression},text:r.rest.join(` `)}:{kind:`point`,target:uc(e.slice(0,2)),text:e.slice(2).join(` `)}}function uc(e){let t=e[0]??``,r=m(t);if(r){let i=dc(t)?r.value:[r.value,...e.slice(1)].join(` `).trim();throw new n(`INVALID_ARGS`,fc({key:r.key,value:i}))}let i=Number(e[0]),a=Number(e[1]);if(Number.isFinite(i)&&Number.isFinite(a))return{x:i,y:a};throw new n(`INVALID_ARGS`,pc(e))}function dc(e){let t=e.slice(e.indexOf(`=`)+1).trim();if(t.length<2)return!1;let n=t[0];return(n===`"`||n===`'`)&&t.endsWith(n)}function fc(e){let{key:t,value:n}=e;return`Unknown selector key "${t}". Supported: ${u.join(`, `)}. ${p(t)?`Did you mean role=${t} label=${gc(n)}?`:`Did you mean label=${gc(n)}?`}`}function pc(e){let t=e.filter(e=>e!==void 0).join(` `);if(!t.trim())return`Missing target. Pass an @ref from snapshot, a selector like text="Sign in", or "x y" coordinates.`;let n=`Target "${t}" is not a @ref, selector, or "x y" point.`;return e.some(e=>h(e??``))?`${n} Selector values with spaces need quotes, e.g. text="Sign in".`:`${n} To match by visible text, use text=${gc(t)} (or label=/id=/role=), or pass an @ref from snapshot.`}function mc(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${hc(e,t)??`text="Sign in"`}.`}function hc(e,t){let n=e.length-t.rest.length,r=e[n-1];if(r===void 0)return;let i=r.indexOf(`=`);if(i<=0)return;let a=[r.slice(i+1),...t.rest].join(` `),o=`${r.slice(0,i+1)}${gc(a)}`;return[...e.slice(0,n-1),o].join(` `)}function gc(e){return`"${e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}"`}function _c(e){return e.join(` `).trim()||void 0}function vc(e,t){let r=e===void 0?NaN:Number(e);if(!Number.isInteger(r)||r<1)throw new n(`INVALID_ARGS`,`viewport ${t} must be a positive integer`);return r}const yc=[`path`,`start`,`stop`,`doctor`,`mark`,`clear`],bc=[`medium`,`high`],xc=`medium`;function Sc(e){return bc.includes(e)}function Cc(e){let t=typeof e==`number`?e:wc(e);return t!==void 0&&Number.isInteger(t)&&t>=5&&t<=10?t:void 0}function wc(e){return typeof e==`string`&&/^\d+$/.test(e)?Number(e):void 0}function Tc(e){if(Sc(e))return e;let t=Cc(e);if(t!==void 0)return t<=7?`medium`:`high`}export{Wi as $,F as $t,K as A,Je as An,Ci as At,Ea as B,$r as Bt,ts as C,it as Cn,bi as Ct,eo as D,Ge as Dn,xi as Dt,Mo as E,nt as En,Si as Et,Ua as F,Yr as Ft,ua as G,Hr as Gt,U as H,ei as Ht,Ka as I,Jr as It,ca as J,pr as Jt,fa as K,Vr as Kt,Ha as L,Qr as Lt,G as M,Kr as Mt,Wa as N,ii as Nt,Ja as O,We as On,wi as Ot,Ga as P,ri as Pt,oa as Q,Zn as Qt,Oa as R,Zr as Rt,es as S,$e as Sn,li as St,jo as T,rt as Tn,ci as Tt,Ta as U,Xr as Ut,W as V,ti as Vt,H as W,Ur as Wt,aa as X,$n as Xt,ia as Y,fr as Yt,sa as Z,Qn as Zt,Ds as _,lt as _n,_i as _t,vc as a,dn as an,Yi as at,Ss as b,Qe as bn,oi as bt,Ys as c,gt as cn,Ji as ct,tc as d,_t as dn,Bi as dt,j as en,Gi as et,rc as f,pt as fn,Ui as ft,Y as g,ut as gn,Ei as gt,zs as h,ft as hn,Di as ht,yc as i,vn as in,Zi as it,wo as j,B as jt,mo as k,Ye as kn,Ti as kt,Zs as l,yt as ln,na as lt,nc as m,dt as mn,Oi as mt,bc as n,gn as nn,Qi as nt,lc as o,bt as on,$i as ot,ic as p,ht as pn,Hi as pt,da as q,I as qt,Tc as r,fn as rn,ta as rt,cc as s,xt as sn,ea as st,xc as t,M as tn,Xi as tt,ec as u,vt as un,Vi as ut,Os as v,C as vn,si as vt,Xo as w,at as wn,vi as wt,xs as x,Ze as xn,yi as xt,ks as y,w as yn,gi as yt,ka as z,ni as zt};
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{cr as t}from"./recording-export-quality.js";import{c as n,f as r,o as i,s as a,y as o}from"./sdk-device.js";const s=[`android`,`apple`,`vega`,`linux`],c={platform:`web`,id:`agent-browser-chrome`,name:`Agent Browser Chrome`,kind:`device`,target:`desktop`,booted:!0};function l(e){let t=d();for(let n of e){let e=f(n);t[e].available+=1,n.booted===!0&&(t[e].booted+=1)}return t}function u(e){return e.platform===`macos`||e.platform===`apple`&&e.target===`desktop`}function d(){return{android:{available:0,booted:0},apple:{available:0,booted:0},vega:{available:0,booted:0},linux:{available:0,booted:0},web:{available:0,booted:0}}}function f(e){return a(e)||n(e)?`apple`:e.platform}async function p(e){if(e.platform===`web`)return[c];if(u(e)){let{listMacosDevices:e}=await import(`./devices.js`);return await e()}if(e.platform===`linux`){let{listLinuxDevices:e}=await import(`./devices3.js`);return await e()}if(e.platform===`android`){let{listAndroidDevices:t}=await import(`./logcat.js`).then(e=>e.c);return await t({serialAllowlist:m(e)})}if(e.platform===`vega`){let{listVegaDevices:e}=await import(`./devices4.js`);return await e()}if(e.platform){let{listAppleDevices:t}=await import(`./devices2.js`);return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}let t=[];for(let n of s)try{t.push(...await p({...e,platform:n}))}catch{}return t}function m(e){let t=e.androidSerialAllowlist,n=e.serial?.trim();return n?t?new Set(t.includes(n)?[n]:[]):new Set([n]):t?new Set(t):void 0}const h=new Map;function g(e){for(let t of e.platforms){if(h.has(t))throw Error(`PlatformPlugin already registered for platform "${t}"`);h.set(t,e)}}function _(t){let n=h.get(t);if(!n)throw new e(`UNSUPPORTED_PLATFORM`,`Unsupported platform: ${t}`);return n}function v(e){return h.get(e)}const y={appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1},b={ios:y,ipados:y,visionos:{appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1},tvos:{appAndDeviceLifecycle:!0,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1},macos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!0},watchos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1}};function x(e){return i(e.platform)?b[o(e)]:void 0}function S(e){return process.platform===`darwin`&&(n(e)||a(e)&&e.kind===`simulator`||e.platform===`android`&&e.kind===`emulator`)}function C(e){return e.platform===`web`||S(e)}const w=e=>{let t=x(e);return t?t.appAndDeviceLifecycle:!0},T=e=>e.platform!==`apple`||e.kind!==`device`||e.iosPhysicalDeviceBackend!==`xctest`,E=e=>w(e)&&T(e),D=e=>{let t=x(e);return t?t.keyboard:e.platform===`android`},O=e=>{let t=x(e);return t?t.orientation:e.platform===`android`},k=e=>{let t=x(e);return t&&t.physicalDeviceSurfaces||e.kind===`simulator`},A=e=>e.platform===`android`||e.platform===`apple`&&o(e)===`ios`||k(e),j=e=>e.platform===`android`?e.target===`tv`:r(e),M={[t.boot]:w,[t.apps]:T,[t.install]:E,[t.reinstall]:E,[t.installFromSource]:E,[t.logs]:T,[t.perf]:T,[t.record]:T,[t.push]:w,[t.home]:w,[t.appSwitcher]:w,[t.clipboard]:e=>e.platform===`android`||e.platform===`linux`||k(e),[t.keyboard]:D,[t.orientation]:O,[t.tvRemote]:j,[t.alert]:A,[t.settings]:e=>e.platform===`android`||k(e),[t.audio]:C},N={[t.apps]:P,[t.install]:P,[t.reinstall]:P,[t.installFromSource]:P,[t.logs]:P,[t.perf]:P,[t.record]:P,[t.tvRemote]:e=>e.platform===`android`?e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`:x(e)?r(e)?void 0:`tv-remote is supported only on tvOS devices.`:void 0};function P(e){if(!T(e))return`This command requires a CoreDevice-backed physical iOS device. The selected XCTest backend supports open, close, interactions, snapshots, and screenshots.`}const F={id:`apple`,platforms:[`apple`],familySelector:`apple`,capability:{bucket:`apple`,supportsByDefault:M,unsupportedHintByDefault:N},appLog:{resolveBackend:e=>n(e)?`macos`:e.kind===`device`?`ios-device`:`ios-simulator`},perf:{supportsMetrics:()=>!0,metricsSamplerTag:()=>`apple`},recording:{resolveBackendTag:e=>n(e)?`macos`:e.kind===`device`?`ios-device`:`ios-simulator`},providers:{platformGatedResolvers:[`appleRunnerProvider`,`appleToolProvider`]},createInteractor:async(e,t)=>{let{createAppleInteractor:n}=await import(`./interactor.js`);return n(e,t)},discoverDevices:async e=>{if(u(e)){let{listMacosDevices:e}=await import(`./devices.js`);return await e()}let{listAppleDevices:t}=await import(`./devices2.js`);return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}},I=[t.open,t.close,t.back,t.home,t.tvRemote],L=e=>e.target===`tv`,R=e=>e.kind===`emulator`&&L(e),z={id:`vega`,platforms:[`vega`],capability:{bucket:`vega`,supportsByDefault:Object.fromEntries(I.map(e=>[e,L])),unsupportedHintByDefault:Object.fromEntries(I.map(e=>[e,t=>R(t)?void 0:`${e} currently supports only Vega Virtual Devices.`]))},providers:{platformGatedResolvers:[`vegaToolProvider`]},createInteractor:async(e,t)=>{let{createVegaInteractor:n}=await import(`./interactor2.js`);return n(e,t)},discoverDevices:async e=>{let{listVegaDevices:t}=await import(`./devices4.js`);return await t()}},B=[F,{id:`android`,platforms:[`android`],capability:{bucket:`android`,supportsByDefault:{[t.audio]:C,[t.tvRemote]:e=>e.target===`tv`},unsupportedHintByDefault:{[t.tvRemote]:e=>e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`}},appLog:{resolveBackend:()=>`android`},perf:{supportsMetrics:()=>!0,metricsSamplerTag:()=>`android`},recording:{resolveBackendTag:()=>`android`},providers:{platformGatedResolvers:[`androidAdbProvider`]},createInteractor:async e=>{let{createAndroidInteractor:t}=await import(`./android.js`).then(e=>e.t);return t(e)},discoverDevices:async e=>{let{listAndroidDevices:t}=await import(`./logcat.js`).then(e=>e.c);return await t({serialAllowlist:m(e)})}},z,{id:`linux`,platforms:[`linux`],capability:{bucket:`linux`},providers:{platformGatedResolvers:[`linuxToolProvider`]},createInteractor:async()=>{let{createLinuxInteractor:e}=await import(`./linux.js`);return e()},discoverDevices:async()=>{let{listLinuxDevices:e}=await import(`./devices3.js`);return await e()}},{id:`web`,platforms:[`web`],capability:{bucket:`web`},recording:{resolveBackendTag:()=>`web`},providers:{platformGatedResolvers:[`webProvider`]},createInteractor:async()=>{let{createWebInteractor:e}=await import(`./web.js`);return e()},discoverDevices:async()=>[c]}];let V=!1;function H(){if(!V){for(let e of B)g(e);V=!0}}export{p as a,v as i,S as n,s as o,_ as r,l as s,H as t};
1
+ import{_ as e}from"./sdk-contracts.js";import{On as t}from"./recording-export-quality.js";import{c as n,f as r,o as i,s as a,y as o}from"./sdk-device.js";const s=[`android`,`apple`,`vega`,`linux`],c={platform:`web`,id:`agent-browser-chrome`,name:`Agent Browser Chrome`,kind:`device`,target:`desktop`,booted:!0};function l(e){let t=d();for(let n of e){let e=f(n);t[e].available+=1,n.booted===!0&&(t[e].booted+=1)}return t}function u(e){return e.platform===`macos`||e.platform===`apple`&&e.target===`desktop`}function d(){return{android:{available:0,booted:0},apple:{available:0,booted:0},vega:{available:0,booted:0},linux:{available:0,booted:0},web:{available:0,booted:0}}}function f(e){return a(e)||n(e)?`apple`:e.platform}async function p(e){if(e.platform===`web`)return[c];if(u(e)){let{listMacosDevices:e}=await import(`./devices.js`);return await e()}if(e.platform===`linux`){let{listLinuxDevices:e}=await import(`./devices3.js`);return await e()}if(e.platform===`android`){let{listAndroidDevices:t}=await import(`./install-artifact.js`).then(e=>e.o);return await t({serialAllowlist:m(e)})}if(e.platform===`vega`){let{listVegaDevices:e}=await import(`./devices4.js`);return await e()}if(e.platform){let{listAppleDevices:t}=await import(`./devices2.js`);return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}let t=[];for(let n of s)try{t.push(...await p({...e,platform:n}))}catch{}return t}function m(e){let t=e.androidSerialAllowlist,n=e.serial?.trim();return n?t?new Set(t.includes(n)?[n]:[]):new Set([n]):t?new Set(t):void 0}const h=new Map;function g(e){for(let t of e.platforms){if(h.has(t))throw Error(`PlatformPlugin already registered for platform "${t}"`);h.set(t,e)}}function _(t){let n=h.get(t);if(!n)throw new e(`UNSUPPORTED_PLATFORM`,`Unsupported platform: ${t}`);return n}function v(e){return h.get(e)}const y={appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1},b={ios:y,ipados:y,visionos:{appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1},tvos:{appAndDeviceLifecycle:!0,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1},macos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!0},watchos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1}};function x(e){return i(e.platform)?b[o(e)]:void 0}function S(e){return process.platform===`darwin`&&(n(e)||a(e)&&e.kind===`simulator`||e.platform===`android`&&e.kind===`emulator`)}function C(e){return e.platform===`web`||S(e)}const w=e=>{let t=x(e);return t?t.appAndDeviceLifecycle:!0},T=e=>e.platform!==`apple`||e.kind!==`device`||e.iosPhysicalDeviceBackend!==`xctest`,E=e=>w(e)&&T(e),D=e=>{let t=x(e);return t?t.keyboard:e.platform===`android`},O=e=>{let t=x(e);return t?t.orientation:e.platform===`android`},k=e=>{let t=x(e);return t&&t.physicalDeviceSurfaces||e.kind===`simulator`},A=e=>e.platform===`android`||e.platform===`apple`&&o(e)===`ios`||k(e),j=e=>e.platform===`android`?e.target===`tv`:r(e),M={[t.boot]:w,[t.apps]:T,[t.install]:E,[t.reinstall]:E,[t.installFromSource]:E,[t.logs]:T,[t.perf]:T,[t.record]:T,[t.push]:w,[t.home]:w,[t.appSwitcher]:w,[t.clipboard]:e=>e.platform===`android`||e.platform===`linux`||k(e),[t.keyboard]:D,[t.orientation]:O,[t.tvRemote]:j,[t.alert]:A,[t.settings]:e=>e.platform===`android`||k(e),[t.audio]:C},N={[t.apps]:P,[t.install]:P,[t.reinstall]:P,[t.installFromSource]:P,[t.logs]:P,[t.perf]:P,[t.record]:P,[t.tvRemote]:e=>e.platform===`android`?e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`:x(e)?r(e)?void 0:`tv-remote is supported only on tvOS devices.`:void 0};function P(e){if(!T(e))return`This command requires a CoreDevice-backed physical iOS device. The selected XCTest backend supports open, close, interactions, snapshots, and screenshots.`}const F={id:`apple`,platforms:[`apple`],familySelector:`apple`,capability:{bucket:`apple`,supportsByDefault:M,unsupportedHintByDefault:N},appLog:{resolveBackend:e=>n(e)?`macos`:e.kind===`device`?`ios-device`:`ios-simulator`},perf:{supportsMetrics:()=>!0,metricsSamplerTag:()=>`apple`},recording:{resolveBackendTag:e=>n(e)?`macos`:e.kind===`device`?`ios-device`:`ios-simulator`},providers:{platformGatedResolvers:[`appleRunnerProvider`,`appleToolProvider`]},createInteractor:async(e,t)=>{let{createAppleInteractor:n}=await import(`./interactor.js`);return n(e,t)},discoverDevices:async e=>{if(u(e)){let{listMacosDevices:e}=await import(`./devices.js`);return await e()}let{listAppleDevices:t}=await import(`./devices2.js`);return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}},I=[t.open,t.close,t.back,t.home,t.tvRemote],L=e=>e.target===`tv`,R=e=>e.kind===`emulator`&&L(e),z={id:`vega`,platforms:[`vega`],capability:{bucket:`vega`,supportsByDefault:Object.fromEntries(I.map(e=>[e,L])),unsupportedHintByDefault:Object.fromEntries(I.map(e=>[e,t=>R(t)?void 0:`${e} currently supports only Vega Virtual Devices.`]))},providers:{platformGatedResolvers:[`vegaToolProvider`]},createInteractor:async(e,t)=>{let{createVegaInteractor:n}=await import(`./interactor2.js`);return n(e,t)},discoverDevices:async e=>{let{listVegaDevices:t}=await import(`./devices4.js`);return await t()}},B=[F,{id:`android`,platforms:[`android`],capability:{bucket:`android`,supportsByDefault:{[t.audio]:C,[t.tvRemote]:e=>e.target===`tv`},unsupportedHintByDefault:{[t.tvRemote]:e=>e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`}},appLog:{resolveBackend:()=>`android`},perf:{supportsMetrics:()=>!0,metricsSamplerTag:()=>`android`},recording:{resolveBackendTag:()=>`android`},providers:{platformGatedResolvers:[`androidAdbProvider`]},createInteractor:async e=>{let{createAndroidInteractor:t}=await import(`./android.js`).then(e=>e.t);return t(e)},discoverDevices:async e=>{let{listAndroidDevices:t}=await import(`./install-artifact.js`).then(e=>e.o);return await t({serialAllowlist:m(e)})}},z,{id:`linux`,platforms:[`linux`],capability:{bucket:`linux`},providers:{platformGatedResolvers:[`linuxToolProvider`]},createInteractor:async()=>{let{createLinuxInteractor:e}=await import(`./linux.js`);return e()},discoverDevices:async()=>{let{listLinuxDevices:e}=await import(`./devices3.js`);return await e()}},{id:`web`,platforms:[`web`],capability:{bucket:`web`},recording:{resolveBackendTag:()=>`web`},providers:{platformGatedResolvers:[`webProvider`]},createInteractor:async()=>{let{createWebInteractor:e}=await import(`./web.js`);return e()},discoverDevices:async()=>[c]}];let V=!1;function H(){if(!V){for(let e of B)g(e);V=!0}}export{p as a,v as i,S as n,s as o,_ as r,l as s,H as t};