agent-device 0.18.2 → 0.19.0

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 (216) hide show
  1. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.2.apk → agent-device-android-multitouch-helper-0.19.0.apk} +0 -0
  2. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.0.apk.sha256 +1 -0
  3. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.2.manifest.json → agent-device-android-multitouch-helper-0.19.0.manifest.json} +4 -4
  4. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.2.apk → agent-device-android-snapshot-helper-0.19.0.apk} +0 -0
  5. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.0.apk.sha256 +1 -0
  6. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.2.manifest.json → agent-device-android-snapshot-helper-0.19.0.manifest.json} +6 -6
  7. package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +28 -0
  8. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +9 -120
  9. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +132 -66
  10. package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +155 -0
  11. package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +67 -0
  12. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +20 -74
  13. package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +64 -0
  14. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +0 -177
  15. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +81 -48
  16. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +102 -129
  17. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +208 -46
  18. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +82 -11
  19. package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +72 -0
  20. package/dist/src/agent-browser-tool.js +1 -0
  21. package/dist/src/android-adb.d.ts +64 -234
  22. package/dist/src/android-adb.js +1 -1
  23. package/dist/src/android.js +1 -5
  24. package/dist/src/app-lifecycle.js +7 -0
  25. package/dist/src/apple-runner-options.js +1 -0
  26. package/dist/src/apps.js +5 -11
  27. package/dist/src/artifacts.d.ts +4 -3
  28. package/dist/src/artifacts.js +1 -1
  29. package/dist/src/audio-probe.js +1 -1
  30. package/dist/src/batch.d.ts +2 -177
  31. package/dist/src/batch.js +1 -1
  32. package/dist/src/cli-help.js +64 -38
  33. package/dist/src/cli-output.js +1 -1
  34. package/dist/src/cli-runner.js +2 -0
  35. package/dist/src/cli.js +12 -41
  36. package/dist/src/client-metro-companion.js +1 -0
  37. package/dist/src/client.js +3 -0
  38. package/dist/src/command-metadata.js +1 -0
  39. package/dist/src/command-schema.js +22 -0
  40. package/dist/src/command-surface.js +1 -1
  41. package/dist/src/contracts.d.ts +2 -213
  42. package/dist/src/contracts.js +1 -1
  43. package/dist/src/debug-symbols.js +5 -3
  44. package/dist/src/device-input-state.js +2 -0
  45. package/dist/src/device-rotation.js +14 -0
  46. package/dist/src/devices.js +1 -1
  47. package/dist/src/devices2.js +1 -0
  48. package/dist/src/devices3.js +1 -0
  49. package/dist/src/find.js +1 -1
  50. package/dist/src/finders.d.ts +2 -81
  51. package/dist/src/finders.js +1 -1
  52. package/dist/src/generic.js +1 -1
  53. package/dist/src/handler-utils.js +1 -1
  54. package/dist/src/helper.js +2 -0
  55. package/dist/src/host-process.js +2 -0
  56. package/dist/src/index.d.ts +1265 -1768
  57. package/dist/src/index.js +1 -1
  58. package/dist/src/input-actions.js +3 -1
  59. package/dist/src/input-actions2.js +1 -0
  60. package/dist/src/install-source.d.ts +13 -14
  61. package/dist/src/install-source.js +1 -1
  62. package/dist/src/install-source2.js +1 -0
  63. package/dist/src/interaction-snapshot.js +1 -0
  64. package/dist/src/interaction.js +1 -1
  65. package/dist/src/interactor.js +2 -1
  66. package/dist/src/internal/bin.d.ts +1 -1
  67. package/dist/src/internal/bin.js +2 -5
  68. package/dist/src/internal/companion-tunnel.d.ts +1 -1
  69. package/dist/src/internal/companion-tunnel.js +1 -1
  70. package/dist/src/internal/daemon.d.ts +1 -1
  71. package/dist/src/internal/daemon.js +16 -1
  72. package/dist/src/internal/png-worker.d.ts +29 -26
  73. package/dist/src/internal/png-worker.js +1 -1
  74. package/dist/src/internal/update-check-entry.d.ts +1 -1
  75. package/dist/src/internal/update-check-entry.js +1 -1
  76. package/dist/src/io.d.ts +2 -85
  77. package/dist/src/io.js +1 -1
  78. package/dist/src/lease.js +1 -1
  79. package/dist/src/linux.js +1 -1
  80. package/dist/src/logcat.js +6 -0
  81. package/dist/src/manifest.js +1 -0
  82. package/dist/src/metro.d.ts +70 -113
  83. package/dist/src/metro.js +1 -1
  84. package/dist/src/metro2.js +1 -0
  85. package/dist/src/notifications.js +1 -1
  86. package/dist/src/output-path.js +1 -0
  87. package/dist/src/path-resolution.js +1 -0
  88. package/dist/src/png-worker-contract.js +1 -0
  89. package/dist/src/points.js +4 -0
  90. package/dist/src/project-runtime.js +1 -0
  91. package/dist/src/provider.js +1 -1
  92. package/dist/src/providers.js +1 -0
  93. package/dist/src/react-native.js +1 -1
  94. package/dist/src/record-trace-recording.js +2 -5
  95. package/dist/src/record-trace.js +1 -1
  96. package/dist/src/recording-provider.js +1 -1
  97. package/dist/src/registry.js +37 -0
  98. package/dist/src/remote-config.d.ts +2 -83
  99. package/dist/src/reporting.js +9 -0
  100. package/dist/src/rolldown-runtime.js +1 -0
  101. package/dist/src/runner-client.js +1 -0
  102. package/dist/src/runner-provider.js +1 -0
  103. package/dist/src/runner-sequence.js +1 -1
  104. package/dist/src/runtime-transport.js +1 -0
  105. package/dist/src/runtime.js +3 -0
  106. package/dist/src/scoped-provider.js +1 -0
  107. package/dist/src/sdk-android-adb.d.ts +144 -0
  108. package/dist/src/sdk-android-adb.js +4 -0
  109. package/dist/src/sdk-app-inventory.d.ts +4 -0
  110. package/dist/src/sdk-app-inventory.js +1 -0
  111. package/dist/src/sdk-batch-runner.d.ts +40 -0
  112. package/dist/src/sdk-batch-runner.js +2 -0
  113. package/dist/src/sdk-batch.js +2 -0
  114. package/dist/src/sdk-contracts.d.ts +386 -0
  115. package/dist/src/sdk-contracts.js +2 -0
  116. package/dist/src/sdk-finders.d.ts +61 -0
  117. package/dist/src/sdk-finders.js +1 -0
  118. package/dist/src/sdk-io.d.ts +79 -0
  119. package/dist/src/sdk-io.js +1 -0
  120. package/dist/src/sdk-remote-config.d.ts +140 -0
  121. package/dist/src/sdk-remote-config.js +1 -0
  122. package/dist/src/sdk-selectors.js +1 -0
  123. package/dist/src/selector-runtime.js +1 -1
  124. package/dist/src/selectors.d.ts +39 -137
  125. package/dist/src/selectors.js +1 -1
  126. package/dist/src/selectors2.js +1 -0
  127. package/dist/src/server.js +3 -2
  128. package/dist/src/session.js +10 -11
  129. package/dist/src/setting-state.js +1 -0
  130. package/dist/src/simctl.js +1 -0
  131. package/dist/src/simulator.js +1 -2
  132. package/dist/src/snapshot-diagnostics.js +3 -0
  133. package/dist/src/snapshot-helper.js +5 -0
  134. package/dist/src/snapshot-quality.js +1 -0
  135. package/dist/src/snapshot.js +1 -2
  136. package/dist/src/snapshot2.js +2 -0
  137. package/dist/src/{5560.js → timeouts.js} +1 -1
  138. package/dist/src/tool-provider.js +3 -0
  139. package/dist/src/tool-provider2.js +1 -0
  140. package/dist/src/ttl-memo.js +1 -0
  141. package/dist/src/update-check.js +1 -0
  142. package/dist/src/url.js +1 -0
  143. package/dist/src/version.js +1 -0
  144. package/dist/src/web.js +1 -1
  145. package/dist/src/xml.js +2 -0
  146. package/package.json +12 -19
  147. package/server.json +2 -2
  148. package/skills/agent-device/SKILL.md +2 -0
  149. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.2.apk.sha256 +0 -1
  150. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.2.apk.sha256 +0 -1
  151. package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +0 -443
  152. package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -169
  153. package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +0 -220
  154. package/dist/src/1404.js +0 -1
  155. package/dist/src/1986.js +0 -1
  156. package/dist/src/2748.js +0 -1
  157. package/dist/src/2948.js +0 -30
  158. package/dist/src/3006.js +0 -1
  159. package/dist/src/314.js +0 -1
  160. package/dist/src/3340.js +0 -8
  161. package/dist/src/4418.js +0 -1
  162. package/dist/src/4428.js +0 -3
  163. package/dist/src/485.js +0 -1
  164. package/dist/src/4917.js +0 -1
  165. package/dist/src/495.js +0 -5
  166. package/dist/src/5448.js +0 -3
  167. package/dist/src/5484.js +0 -1
  168. package/dist/src/5643.js +0 -1
  169. package/dist/src/587.js +0 -1
  170. package/dist/src/5913.js +0 -4
  171. package/dist/src/6849.js +0 -1
  172. package/dist/src/6918.js +0 -1
  173. package/dist/src/6967.js +0 -1
  174. package/dist/src/760.js +0 -1
  175. package/dist/src/7871.js +0 -1
  176. package/dist/src/8184.js +0 -1
  177. package/dist/src/8225.js +0 -1
  178. package/dist/src/8391.js +0 -1
  179. package/dist/src/8404.js +0 -2
  180. package/dist/src/8414.js +0 -2
  181. package/dist/src/8875.js +0 -4
  182. package/dist/src/893.js +0 -1
  183. package/dist/src/8936.js +0 -1
  184. package/dist/src/9414.js +0 -1
  185. package/dist/src/9581.js +0 -22
  186. package/dist/src/9612.js +0 -1
  187. package/dist/src/9624.js +0 -1
  188. package/dist/src/9722.js +0 -38
  189. package/dist/src/devices~1.js +0 -1
  190. package/dist/src/devices~2.js +0 -1
  191. package/dist/src/input-actions~1.js +0 -1
  192. package/dist/src/rslib-runtime.js +0 -1
  193. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +0 -0
  194. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -0
  195. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  196. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
  197. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
  198. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
  199. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +0 -0
  200. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +0 -0
  201. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
  202. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
  203. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +0 -0
  204. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +0 -0
  205. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +0 -0
  206. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
  207. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
  208. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +0 -0
  209. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +0 -0
  210. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
  211. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +0 -0
  212. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
  213. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
  214. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
  215. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
  216. /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
@@ -0,0 +1,14 @@
1
+ import{A as e,B as t,F as n,O as r,P as i,j as a,k as o}from"./sdk-contracts.js";import{_ as s,g as c,v as l}from"./sdk-batch.js";import{A as u,C as d,D as f,F as p,L as m,M as ee,N as h,O as te,S as ne,T as re,b as ie,j as ae,k as oe,m as se,p as ce,w as le,x as ue,y as de,z as fe}from"./sdk-selectors.js";import{b as g}from"./sdk-batch-runner.js";import{n as pe,t as me}from"./snapshot-quality.js";import{a as _,i as he,n as ge,o as _e,t as ve}from"./selectors2.js";import{createHash as ye}from"node:crypto";import v from"node:path";import{styleText as be}from"node:util";function y(e){return e.width>0&&e.height>0}function xe(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 Se(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 Ce(e){return typeof e.parentIndex!=`number`}function b(e){let t=(e.type??``).toLowerCase(),n=(e.identifier??``).trim().toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)||n===`composer`}function we(e){let t=(e.type??``).toLowerCase();return t.includes(`scroll`)||t.includes(`list`)||t.includes(`recyclerview`)}function x(e){let t=fe(e);if(!t||t!==e.identifier?.trim()||!Te(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 S(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}function Te(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function Ee(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 De(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 C(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 Oe=[`button`,`switch`,`checkbox`,`radio`],ke=[`button`,`image`,`textview`,`view`];function Ae(e,t,n){for(let r of e){if(t.has(r.index)||!Ne(r))continue;let i=Pe(De(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)C(e,n,t)}}}function je(e,t,n){let r=new Map;for(let i of e){if(t.has(i.index)||!Ve(i))continue;let a=S(x(i));if(!a)continue;let o=r.get(a);if(o&&Re(o,i,t)){let s=ze(e,o,i,t,n);r.set(a,s);continue}r.set(a,i)}}function Me(e,t){for(let n of e){if(t.has(n.index)||!Ie(n))continue;let r=S(x(n));if(!r)continue;let i=De(e,n.index).filter(e=>!t.has(e.index)&&Le(n,e,r));for(let n of i.filter(Fe))C(e,n.index,t);let a=i.filter(e=>!Fe(e)),o=new Set(a.map(e=>S(x(e))).filter(e=>!!e));if(!(a.length<2||o.size<2))for(let n of a)C(e,n.index,t)}}function Ne(e){return e.hittable===!0&&!b(e)&&!!(e.rect&&y(e.rect))&&x(e).trim().length===0}function Pe(e,t,n){let r=[],i=[],a=new Set;for(let o of e){if(n.has(o.index)||!Fe(o)||!xe(o.rect,t.rect))continue;let e=x(o).trim().replace(/\s+/g,` `),s=S(e);i.push(o.index),!(!e||!s||a.has(s))&&(a.add(s),r.push(e))}return{label:r.join(`, `),removableIndexes:i}}function Fe(e){if(e.hittable===!0||b(e))return!1;let t=(e.type??``).toLowerCase();return t.includes(`text`)||t.includes(`image`)||t.includes(`icon`)}function Ie(e){return e.hittable===!0&&!b(e)&&!!(e.rect&&y(e.rect))&&!!S(x(e))}function Le(e,t,n){if(!Ve(t)||!xe(t.rect,e.rect))return!1;let r=S(x(t));return!!(r&&n!==r&&n.includes(r))}function Re(e,t,n){return!n.has(e.index)&&Se(e.rect,t.rect)&&(Ke(e,t)||Ge(e,t))}function ze(e,t,n,r,i){let a=He(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:Be(c.presentationHints,l,s)}),C(e,o.index,r),i.get(a.index)??a}function Be(e,t,n){return[...new Set([...Array.isArray(e)?e:[],...Array.isArray(t)?t:[],...n?[n]:[]])]}function Ve(e){if(!e.rect||!y(e.rect)||Ce(e)||b(e))return!1;let t=(e.type??``).toLowerCase();return t===`text`||We(t,ke)}function He(e,t){let n=Ue(e);return Ue(t)>n?t:e}function Ue(e){let t=(e.type??``).toLowerCase(),n=0;return We(t,Oe)?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 We(e,t){return t.some(t=>e.includes(t))}function Ge(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:He(n,r).index===n.index}function Ke(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 qe(e,t,n){if(n.raw||!Je(e))return{nodes:t,filteredCount:0};let r=Ye(t);return{nodes:r,filteredCount:t.length-r.length}}function Je(e){let t=e.androidSnapshot;return!t||typeof t!=`object`?!1:t.backend===`android-helper`}function Ye(e){if(e.length===0)return e;let t=new Set,n=new Map,r=new Map(e.map(e=>[e.index,e]));return Xe(e,t),Ze(e,r,t,n),Ae(e,t,n),Me(e,t),je(e,t,n),e.filter(e=>!t.has(e.index)).map(e=>n.get(e.index)??e)}function Xe(e,t){for(let n of e)!n.rect||y(n.rect)||Ce(n)||C(e,n.index,t)}function Ze(e,t,n,r){for(let i of e){if(n.has(i.index)||i.rect||Ce(i))continue;let a=Ee(i,t,we);a&&$e(r,a,Qe(i,e)),C(e,i.index,n)}}function Qe(e,t){let n=t.filter(t=>t.parentIndex===e.parentIndex&&t.rect&&y(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 $e(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 et(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||tt(t)?null:t}function tt(e){return/\S+@\S+\.\S+/.test(e)}function nt(e){if(e.length<20)return!1;let t=new Map;for(let n of e){let e=(n.type??``).toLowerCase(),r=et(fe(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||!rt(e)||(n+=e.length);return n>=8}function rt(e){for(let t=0;t<e.length;t+=1)for(let n=t+1;n<e.length;n+=1)if(it(e[t]?.rect,e[n]?.rect))return!0;return!1}function it(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 at={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`,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 w(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=ct(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:ot(i,c,!1,o,t)})}return r}function ot(e,t,n,r,i={}){let a=r??ct(e.type??`Element`),o=ae(e,a),s=pt(e,a,i,o),c=` `.repeat(t),l=e.ref?`@${e.ref}`:``,u=mt(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 st(e,t){let n=e.label?.trim();if(n&&dt(t,n))return``;let r=e.value?.trim();if(ut(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||ft(i)&&(t===`group`||t===`image`||t===`list`||t===`collection`)?``:i}function ct(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`:lt(n)||n||`element`}function lt(e){return Object.prototype.hasOwnProperty.call(at,e)?at[e]:void 0}function ut(e){return e===`text-field`||e===`text-view`||e===`search`}function dt(e,t){return e!==`scroll-area`&&e!==`list`&&e!==`collection`&&e!==`table`?!1:m(t)}function ft(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function pt(e,t,n,r){return!n.summarizeTextSurfaces||!r.shouldSummarize?st(e,t):ht(e,t,r.text)||st(e,t)}function mt(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`),ut(t)&&i.push(`editable`),gt(e,t)&&i.push(`scrollable`),!r.shouldSummarize)?vt(i):(i.push(`preview:"${_t(u(r.text))}"`),i.push(`truncated`),vt(i))}function ht(e,t,n){let r=p(e.label);if(r&&r!==n)return r;let i=p(e.identifier);if(i&&!ft(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 gt(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 _t(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function vt(e){return[...new Set(e)]}function yt(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function bt(e,r={}){let i=e instanceof n?t(e):e;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`),r.showDetails&&i.details&&process.stderr.write(`${JSON.stringify(i.details,null,2)}\n`)}function xt(t,n={}){let r=t.nodes,a=Array.isArray(r)?r:[],o=i(e(t.backend)?t.backend:void 0),s=qe(t,a,n),c=Tt(t),l=Qt(t,a,n,s),u=l.length>0?`${l.join(`
2
+ `)}\n`:``,d=n.raw?null:St(t);if(d)return`${c}${u}${Ct(d)}\n`;let f=n.raw||!o?null:ie(s.nodes),p=!!t.truncated,m=f?.nodes??a,ee=n.raw||!o?null:jt(t,f,m.length,a.length,s.filteredCount),h=Et(a.length,ee,p);return a.length===0?`${c}${h}\n${u}`:n.raw?`${c}${h}\n${u}${Dt(a)}\n`:n.flatten?`${c}${h}\n${u}${Ot(m)}${At(f)}\n`:`${c}${h}\n${u}${kt(m)}${At(f)}\n`}function St(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 Ct(e){let t=wt(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(`
3
+ `):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(`
4
+ `):[`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(`
5
+ `)}function wt(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 Tt(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(`
6
+ `)}\n`:``}function Et(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 Dt(e){return e.map(e=>JSON.stringify(e)).join(`
7
+ `)}function Ot(e){return sn(e).join(`
8
+ `)}function kt(e){return rn(w(e,{summarizeTextSurfaces:!0})).join(`
9
+ `)}function At(e){return e&&e.summaryLines.length>0?`\n${e.summaryLines.join(`
10
+ `)}`:``}function jt(e,t,n,r,i=0){let a=Mt(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:Nt([...a?.reasons??[],`offscreen-nodes`])}:a||(s?{partial:!0,visibleNodeCount:n,totalNodeCount:n,reasons:[]}:null)}function Mt(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 Nt(e){return[...new Set(e)]}function Pt(e){let t=e.baselineInitialized===!0,n=e.summary??{},r=E(n.additions),i=E(n.removals),a=E(n.unchanged),o=D(),s=nn(e),c=s.length>0?`${s.join(`
11
+ `)}\n`:``;if(t)return`${c}Baseline initialized (${a} lines).\n`;let l=Zt(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?O(e,`green`):e}if(e.kind===`removed`){let e=t.startsWith(` `)?`-${t}`:`- ${t}`;return o?O(e,`red`):e}return o?O(t,`dim`):t}),u=l.length>0?`${l.join(`
12
+ `)}\n`:``;return o?`${c}${u}${[`${O(String(r),`green`)} additions`,`${O(String(i),`red`)} removals`,`${O(String(a),`dim`)} unchanged`].join(`, `)}\n`:`${c}${u}${r} additions, ${i} removals, ${a} unchanged\n`}function Ft(e){let t=D(),n=e.match===!0,r=e.dimensionMismatch,i=[];return i.push(...It(e,t)),i.push(...Lt(e,n,t)),!n&&!r&&(i.push(...Rt(e,t)),i.push(...zt(e,t)),i.push(...Bt(e,t)),i.push(...Ht(e,t)),i.push(...Ut(e,t))),`${i.join(`
13
+ `)}\n`}function It(e,t){if(e.match===!0)return[`${t?O(`✓`,`green`):`✓`} Screenshots match.`];let n=e.dimensionMismatch,r=t?O(`✗`,`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=E(e.differentPixels),a=E(e.mismatchPercentage),o=`${a===0&&i>0?`<0.01`:String(a)}% pixels differ`;return[`${r} ${t?O(o,`red`):o}`]}function Lt(e,t,n){if(t)return[];let r=[];if(e.diffPath){let t=Xt(e.diffPath),i=n?O(`Diff image:`,`dim`):`Diff image:`,a=n?O(t,`green`):t;r.push(` ${i} ${a}`)}if(e.currentOverlayPath){let t=Xt(e.currentOverlayPath),i=n?O(`Current overlay:`,`dim`):`Current overlay:`,a=n?O(t,`green`):t,o=E(e.currentOverlayRefCount),s=o>0?` (${o} refs)`:``;r.push(` ${i} ${a}${s}`)}return r}function Rt(e,t){let n=E(e.differentPixels),r=E(e.totalPixels);return[` ${t?O(String(n),`red`):String(n)} different / ${r} total pixels`]}function zt(e,t){let n=Gt(e);return n.length===0?[]:[` ${k(`Hints:`,t)}`,...n.map(e=>` - ${e}`)]}function Bt(e,t){let n=Array.isArray(e.regions)?e.regions:[];if(n.length===0)return[];let r=[` ${k(`Changed regions:`,t)}`];for(let e of n.slice(0,5))r.push(...Vt(e));return r}function Vt(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=Yt(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 Ht(e,t){let n=e.ocr?.matches??[];if(n.length===0)return[];let r=n.slice(0,8),i=[` ${k(`OCR text deltas (${e.ocr?.provider}; baselineBlocks=${e.ocr?.baselineBlocks} currentBlocks=${e.ocr?.currentBlocks}; showing ${r.length}/${n.length}; px):`,t)}`,` ${k(`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)} | ${T(n.x)},${T(n.y)} | ${T(n.width)},${T(n.height)} | ${Wt(t.baselineRect)} | ${Wt(t.currentRect)} | ${t.confidence} | ${t.possibleTextMetricMismatch?`ocr-bbox-size-change`:`-`}`)}return i}function Ut(e,t){let n=e.nonTextDeltas??[];if(n.length===0)return[];let r=n.slice(0,8),i=[` ${k(`Non-text visual deltas (showing ${r.length}/${n.length}; px):`,t)}`,` ${k(`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} | ${Wt(e.rect)} | ${e.nearestText?JSON.stringify(e.nearestText):`-`}`);return i}function Wt(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function T(e){return e>0?`+${e}`:String(e)}function Gt(e){let t=[],n=e.ocr?.movementClusters??[];for(let e of n.slice(0,2))t.push(`text movement cluster: ${Jt(e.texts)} dx=${qt(e.xRange)}px dy=${qt(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(Kt).join(`; `)}`);let i=(e.nonTextDeltas??[]).filter(e=>e.likelyKind===`separator`).slice(0,2);return i.length>0&&t.push(`non-text boundaries: ${i.map(Kt).join(`; `)}`),t.slice(0,6)}function Kt(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:``,n=e.regionIndex?` r${e.regionIndex}`:``;return`${e.likelyKind}${t}${n}`}function qt(e){return e.min===e.max?T(e.min):`${T(e.min)}..${T(e.max)}`}function Jt(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 Yt(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 Xt(e){let t=process.cwd(),n=v.relative(t,e);return n===``||!n.startsWith(`..`)&&!v.isAbsolute(n)?n===``?`.`:`.${v.sep}${n}`:e}function E(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function Zt(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 D(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 O(e,t,n){return be(t,e,n)}function k(e,t){return t?O(e,`dim`):e}function Qt(e,t,n,r={nodes:t,filteredCount:0}){let i=nn(e);if($t(e)){let e=tn(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&&nt(a)&&i.push(`Warning: possible repeated nav subtree detected.`),i}function $t(e){return!e.snapshotQuality&&!en(e)}function en(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 tn(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 nn(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.length>0):[]}function rn(e){let t=[],n=[],r=new Map(e.map(e=>[e.node.index,e.node])),i=e=>{for(;n.length>0&&(!e||an(e,n[n.length-1],r));)t.push(...A(n.pop(),`below`))};for(let r of e)i(r),t.push(r.text),t.push(...A(r,`above`)),r.node.hiddenContentBelow&&n.push(r);return i(),t}function an(e,t,n){return on(e.node,t.node,n)?!1:e.depth<=t.depth}function on(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 sn(e){return w(e,{summarizeTextSurfaces:!0}).flatMap(e=>[ot(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...A({...e,depth:0})])}function A(e,t){let n=cn(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 cn(e){return e===`scroll-area`||e===`list`||e===`collection`||e===`table`?e:null}function ln(e,t={}){let n=D(process.stderr);if(e===`pass`){let e=t.passFormat??`green`;return n?j(`✓`,e):`✓`}return e===`fail`?n?j(`⨯`,`red`):`⨯`:e===`warn`?n?j(`!`,`yellow`):`!`:n?j(`-`,`dim`):`-`}function j(e,t){return O(e,t,{validateStream:!1})}function un(e){return`${ln(fn(e.status))} ${pn(e)}`}function dn(e){return e.status!==`fail`&&e.status!==`warn`?[]:typeof e.command==`string`?[` run: ${e.command}`]:typeof e.hint==`string`?[` hint: ${e.hint}`]:[]}function fn(e){return e===`pass`?`pass`:e===`fail`?`fail`:e===`warn`?`warn`:`skip`}function pn(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 mn=3e5,hn=[`leaseId`,`tenantId`,`runId`,`clientId`,`deviceKey`];function gn(e){return g({tenantId:e.meta?.tenantId??M(e.flags,`tenant`),runId:e.meta?.runId??M(e.flags,`runId`),leaseId:e.meta?.leaseId??M(e.flags,`leaseId`),leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend,leaseProvider:e.meta?.leaseProvider??M(e.flags,`leaseProvider`)??M(e.flags,`provider`),deviceKey:e.meta?.deviceKey??M(e.flags,`deviceKey`),clientId:e.meta?.clientId??M(e.flags,`clientId`)})}function _n(e){return g({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 vn(e){return g({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 yn(e){return g({tenant:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function bn(e){return g({tenantId:e.tenantId??``,runId:e.runId??``,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function xn(e){return Dn(e)}function Sn(e){let{ttlMs:t,...n}=Dn(e);return n}function Cn(e,t,n){let r=g({...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,...g({ttlMs:e.leaseTtlMs,backend:e.leaseBackend})};case`lease_heartbeat`:return{...r,...g({leaseId:e.leaseId,ttlMs:e.leaseTtlMs})};case`lease_release`:return{...r,...g({leaseId:e.leaseId})}}}function wn(e){let t=g({leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId});return Object.keys(t).length>0?t:void 0}function Tn(e){return e.leaseProvider===`proxy`}function En(e){return Tn(e)?hn.filter(t=>!e[t]):[]}function Dn(e){return g({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 M(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function N(e){return e?{message:e}:{}}function P(e,t){return t?{...e,message:t}:e}function On(e){return typeof e?.message==`string`&&e.message.length>0?e.message:null}const kn=[`out`,`overlayRefs`,`screenshotFullscreen`,`screenshotMaxSize`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],An=[`screenshotFullscreen`,`screenshotMaxSize`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],jn=[{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`}];function Mn(e){return In({overlayRefs:e?.overlayRefs,fullscreen:e?.screenshotFullscreen,maxSize:e?.screenshotMaxSize,stabilize:e?.screenshotNoStabilize?!1:void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function Nn(e={}){return In({overlayRefs:e.overlayRefs,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 Pn(e,t){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 Fn(e){let{args:t,flags:r,index:i}=e,a=t[i];if(a===`--fullscreen`||a===`--full`||a===`-f`)return r.screenshotFullscreen=!0,{handled:!0,nextIndex:i};if(a===`--no-stabilize`)return r.screenshotNoStabilize=!0,{handled:!0,nextIndex:i};if(a===`--normalize-status-bar`)return r.screenshotNormalizeStatusBar=!0,{handled:!0,nextIndex:i};if(a===`--max-size`){let e=t[i+1],a=e===void 0?NaN:Number(e);if(!Number.isInteger(a)||a<1)throw new n(`INVALID_ARGS`,`screenshot --max-size requires a positive integer`);return r.screenshotMaxSize=a,{handled:!0,nextIndex:i+1}}return{handled:!1}}function In(e){return Object.fromEntries(Object.entries(e).filter(e=>e[1]!==void 0))}function Ln(e){let t=pe(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 Rn(e){return{...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.quality?{snapshotQuality:e.quality}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function zn(e){let t=Bn(e.androidSnapshot),n=Array.isArray(e.warnings)?e.warnings.filter(e=>typeof e==`string`):void 0,r=pe(e.snapshotQuality);return Rn({...t?{androidSnapshot:t}:{},...r?{quality:r}:{},...n?{warnings:n}:{}})}function Bn(e){return typeof e==`object`&&e?e:void 0}function Vn(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function Hn(e,t,n){return{deviceId:t,deviceName:n,...e===`android`?{serial:t}:e===`ios`?{udid:t}:{}}}function Un(e,t={}){let n=t.includeAndroidSerial??!0;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}:{},...e.platform===`android`&&n?{serial:e.android?.serial??e.id}:{}}}function Wn(e){return{name:e.name,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...Un(e.device,{includeAndroidSerial:!1}),createdAt:e.createdAt}}function Gn(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 Kn(e){return e.bundleId??e.package??e.app}function qn(e){return P({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: ${Kn(e)}`)}function Jn(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function Yn(e){return P({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: ${Jn(e)}`)}function Xn(e){let t=e.appName??e.appBundleId??e.session;return P({session:e.session,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...e.requestLogPath?{requestLogPath:e.requestLogPath}:{},...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?Un(e.device):{}},t?`Opened: ${t}`:`Opened`)}function Zn(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...`provider`in e&&e.provider?{provider:e.provider}:{},...N(e.session?`Closed: ${e.session}`:`Closed`)}}function Qn(e){return{nodes:e.nodes,truncated:e.truncated,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...Rn($n(e)),...e.unchanged?{unchanged:e.unchanged}:{},...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{}}}function $n(e){return{...e,...e.snapshotQuality?{quality:e.snapshotQuality}:{}}}function er(e,t){return e.includes(t)}function tr(e,t,r={}){let i=t===void 0?void 0:r.normalize?.(t)??t;if(i!==void 0&&er(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 F(e,t={}){return{values:e,is:t=>er(e,t),parse:n=>tr(e,n,t)}}const nr=[`app`,`frontmost-app`,`desktop`,`menubar`],rr=F(nr,{normalize:e=>e.trim().toLowerCase(),message:e=>`Invalid surface: ${e}. Use ${nr.join(`|`)}.`});function ir(e){return rr.parse(e)}const ar=[`metrics`,`frames`,`memory`,`cpu`,`trace`],or=[`sample`,`snapshot`,`start`,`stop`,`report`],sr=[`profile`],cr=[`xctrace`,`simpleperf`,`perfetto`,`android-hprof`,`memgraph`],lr=[`android-hprof`,`memgraph`],ur=F(ar),dr=F(or),fr=F(sr),pr=F(cr),mr=F(lr),hr=`perf area must be metrics, frames, memory, cpu, or trace`,gr=`perf action must be sample, snapshot, start, stop, or report`,_r=`perf cpu requires profile`,vr=`perf --kind must be xctrace, simpleperf, perfetto, android-hprof, or memgraph`,yr=`perf memory snapshot --kind must be android-hprof or memgraph`,br=ur.is,xr=dr.is,Sr=fr.is,Cr=pr.is,wr=mr.is,Tr=[`app launch with Apple-platform launch arguments and Android/iOS simulator clearState`,`runFlow file/inline with when.platform, when.visible, when.notVisible, and limited when.true boolean/platform expressions`,`onFlowStart and onFlowComplete hooks`,`deterministic repeat.times`,`tapOn including optional, index, childOf, label, and absolute/percentage point taps`,`doubleTapOn and longPressOn`,`inputText, focused-field eraseText, and pasteText`,`openLink`,`visibility assertions and extendedWaitUntil`,`scroll and scrollUntilVisible`,`absolute/percentage swipe and swipe.label`,`screenshots`,`keyboard dismiss`,`basic pressKey, back, animation waits, and stopApp`,`ordered trusted runScript file/env scripts with http.post, json, and output variables`],Er=`https://github.com/callstack/agent-device/issues/558`,Dr=`https://github.com/callstack/agent-device/issues/new`;function Or(){return`Supported subset: ${kr(Tr)}.`}function kr(e){return e.length>1?`${e.slice(0,-1).join(`, `)}, and ${e.at(-1)}`:e[0]??``}const Ar=1e4,jr=2e3,Mr=[`get`,`accept`,`dismiss`,`wait`],Nr=`<wifi|airplane|location> <on|off>`,Pr=`location set <lat> <lon>`,Fr=`animations <on|off>`,Ir=`appearance <light|dark|toggle>`,Lr=`faceid <match|nonmatch|enroll|unenroll>`,Rr=`touchid <match|nonmatch|enroll|unenroll>`,zr=`fingerprint <match|nonmatch>`,Br=`clear-app-state [app-id]`,Vr=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,Hr=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,Ur=`macOS supports only settings ${Ir} and settings ${Hr}. wifi|airplane|location|animations remain unsupported on macOS.`,Wr=[`settings ${Nr}`,`settings ${Pr}`,`settings ${Fr}`,`settings ${Ir}`,`settings ${Lr}`,`settings ${Rr}`,`settings ${zr}`,`settings ${Br}`,`settings ${Vr}`,`settings ${Hr}`].join(` | `),Gr=`settings requires ${Nr}, ${Pr}, ${Fr}, ${Ir}, ${Lr}, ${Rr}, ${zr}, ${Br}, ${Vr}, or ${Hr}`;function Kr(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function qr(e){return`Unsupported macOS setting: ${e}. ${Ur}`}function Jr(e,t){if(e===void 0||e.trim()===``)throw new n(`INVALID_ARGS`,`settings location set requires ${t}`);return Xr(Number(e),t)}function Yr(e){return{latitude:Xr(e?.latitude,`latitude`),longitude:Xr(e?.longitude,`longitude`)}}function Xr(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}const Zr=[`primary`,`secondary`,`middle`];function Qr(e){return e?.clickButton??`primary`}function $r(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 ei(e){return e===`primary`?{}:{button:e}}const ti=1e4;function ni(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 ri(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 ii(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}const ai=[`up`,`down`,`left`,`right`],oi=[`left`,`right`,`left-edge`,`right-edge`],si=[`one-way`,`ping-pong`],ci=F(oi,{message:`gesture swipe requires left, right, left-edge, or right-edge`}),li=F(ai,{message:e=>`Unknown direction: ${e}`});function ui(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=Ci(e.amount),i=e.pixels===void 0?Math.round(n*r):wi(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 di(e){Ci(e.amount),e.pixels!==void 0&&wi(e.pixels)}function fi(e){return{...ui({...e,direction:yi(e.direction)}),direction:e.direction}}function pi(e,t,n={}){let r=n.marginPx??8,[i,a,o]=e===`left`?[85,15,50]:e===`right`?[15,85,50]:e===`left-edge`?[99,15,50]:[1,85,50],s=gi(t,i,o,{marginPx:r}),c=gi(t,a,o,{marginPx:r});return{preset:e,x1:s.x,y1:s.y,x2:c.x,y2:c.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function mi(e){return ci.parse(e)}function hi(e){let t=bi(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function gi(e,t,n,r={}){let i={x:Math.round(e.referenceWidth*t/100),y:Math.round(e.referenceHeight*n/100)};return r.marginPx===void 0?i:_i(i,e,r.marginPx)}function _i(e,t,n){return{x:Ti(e.x,n,t.referenceWidth),y:Ti(e.y,n,t.referenceHeight)}}function vi(e){return li.parse(e)}function yi(e){switch(e){case`up`:return`down`;case`down`:return`up`;case`left`:return`right`;case`right`:return`left`}}function bi(e){let t=e.filter(e=>xi(e.type)&&Si(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(Si);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 xi(e){if(!e)return!1;let t=e.toLowerCase();return t.includes(`application`)||t.includes(`window`)}function Si(e){return!!e&&e.width>0&&e.height>0}function Ci(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 wi(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 Ti(e,t,n){let r=t;return Ei(e,r,Math.max(r,n-t))}function Ei(e,t,n){return Math.min(Math.round(n),Math.max(Math.round(t),Math.round(e)))}function I(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 Di(e,t,n={}){let r=Mi(e??[]);if(r.length===0)return{canScroll:!1,emptySnapshot:!0,signature:``};let i=ue(r),a=Ni(r,i,t,n),o=Bi(a?Fi(r,a.index):r);return a?{canScroll:Li(a,i.get(a.index),t),emptySnapshot:!1,signature:o,scope:Ri(a)}:{canScroll:!1,emptySnapshot:!1,signature:o}}async function Oi(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=Di(await i(r),t,n);return r&&e.emptySnapshot?await Oi({edge:t,target:n,captureNodes:i}):e}catch(e){throw ji(t,r,e)}}async function ki(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 Ai(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 ji(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 Mi(e){return e.map((e,t)=>({...e,ref:`ref`in e&&e.ref?e.ref:`e${t+1}`}))}function Ni(e,t,n,r){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>re(e)&&Wi(e.rect));if(a.length===0)return null;let o=Pi(r.nodeIndex,i);if(o)return o;let s=r.point;if(s){let e=a.filter(e=>e.rect&&Ui(e.rect,s)).sort(Vi);if(e.length>0)return e.find(e=>Li(e,t.get(e.index),n))??e[0]??null}let c=a.filter(e=>Li(e,t.get(e.index),n)).sort(Hi);return c.length>0?c[0]??null:a.filter(t=>ne(t,e)).sort(Hi)[0]??a.sort(Hi)[0]??null}function Pi(e,t){if(e===void 0)return null;let n=t.get(e);for(;n;){if(re(n)&&Wi(n.rect))return n;n=n.parentIndex===void 0?void 0:t.get(n.parentIndex)}return null}function Fi(e,t){let n=new Map(e.map(e=>[e.index,e]));return e.filter(e=>e.index===t||Ii(e,t,n))}function Ii(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 Li(e,t,n){return n===`bottom`?e.hiddenContentBelow===!0||t?.hiddenContentBelow===!0:e.hiddenContentAbove===!0||t?.hiddenContentAbove===!0}function Ri(e){return[e.identifier,e.label,e.value].map(e=>typeof e==`string`?e.trim():``).find(zi)}function zi(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function Bi(e){return e.map(e=>{let t=e.rect?[`x`,`y`,`width`,`height`].map(t=>Gi(e.rect?.[t])).join(`,`):``;return[String(e.index??``),String(e.parentIndex??``),String(e.type??``),String(e.label??``),String(e.value??``),t].join(`|`)}).join(`
14
+ `)}function Vi(e,t){return L(e.rect)-L(t.rect)}function Hi(e,t){return L(t.rect)-L(e.rect)}function L(e){return e?e.width*e.height:0}function Ui(e,t){return t.x>=e.x&&t.x<=e.x+e.width&&t.y>=e.y&&t.y<=e.y+e.height}function Wi(e){return!!(e&&e.width>0&&e.height>0)}function Gi(e){return typeof e==`number`&&Number.isFinite(e)?e.toFixed(1):``}function R(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function z(e){return e.clock?.now()??Date.now()}async function Ki(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function B(e){return e&&typeof e==`object`?e:void 0}const qi=[`x`,`y`,`width`,`height`];function V(e){let t=H(e);if(!t)return null;let n=r(t);return!Number.isFinite(n.x)||!Number.isFinite(n.y)?null:n}function H(e){if(!e)return null;let t=Number(e.x),n=Number(e.y),r=Number(e.width),i=Number(e.height);return!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(r)||!Number.isFinite(i)||r<0||i<0?null:{x:t,y:n,width:r,height:i}}function U(e,t){return!e||!t?!1:qi.every(n=>Math.abs(e[n]-t[n])<=.5)}function Ji(e){return{x:Yi(e.x,e.width),y:Yi(e.y,e.height)}}function Yi(e,t){if(t<=1)return Math.floor(e);let n=Math.ceil(e),r=Math.floor(e+t-1);return Math.round(Math.min(r,Math.max(n,e+t/2)))}const Xi=[`tabbar`,`toolbar`,`navigationbar`,`bottomnavigation`,`bottomnavigationview`,`sheet`,`dialog`,`alert`,`popover`,`menu`],Zi=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`edittext`,`checkbox`,`radio`,`switch`,`cell`];function Qi(e){if(e.length<2)return e;let t=[...e],n={nodes:t,byIndex:new Map(t.map(e=>[e.index,e]))},r=!1;for(let[e,i]of t.entries()){if(!na(i)||!$i(n,e,i))continue;r=!0;let a={...i,hittable:!1,interactionBlocked:`covered`,presentationHints:ua(i.presentationHints)};t[e]=a,n.byIndex.set(a.index,a)}return r?t:e}function W(e){return e.interactionBlocked!==void 0}function $i(e,t,n){let i=G(n.rect);if(!i)return null;let a=r(i);for(let r=t+1;r<e.nodes.length;r+=1){let t=e.nodes[r];if(t&&ea(e,r,n,i,a))return t}return null}function ea(e,t,n,r,i){if(!e.nodes[t])return!1;let a=ta(e,t,n,r);return!!(a&&f(a,i.x,i.y))}function ta(e,t,n,r){let i=e.nodes[t];if(!i||!ra(i)||ca(n,i,e.byIndex))return null;let a=G(i.rect);return!a||U(r,a)||$i(e,t,i)?null:a}function na(e){return G(e.rect)?e.hittable===!0||ia(e)?!0:!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()):!1}function ra(e){return!G(e.rect)||sa(e)?!1:aa(e,Xi)}function ia(e){return aa(e,Zi)}function aa(e,t){let n=oa(e);return t.some(e=>n.includes(e))}function oa(e){return[e.type,e.role,e.subrole].map(e=>h(e??``)).join(` `)}function sa(e){let t=oa(e);return t.includes(`application`)||t.includes(`window`)}function ca(e,t,n){return la(e,t,n)||la(t,e,n)}function la(e,t,n){let r=typeof t.parentIndex==`number`?n.get(t.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(r.index===e.index)return!0;i.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}return!1}function G(e){let t=H(e);return t&&t.width>0&&t.height>0?t:null}function ua(e){return Array.from(new Set([...e??[],`covered`]))}function da(e){return e}function fa(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 pa(e,t){return{x:e.x-t,y:e.y-t,width:e.width+t*2,height:e.height+t*2}}function ma(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 ha(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function ga(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}function _a(e,t,n){return Math.min(Math.max(e,t),n)}const va=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function ya(e,t){return ba(e,t).node}function ba(e,t){if(W(t))return{node:t,reason:`covered`};let n=xa(e,t);if(n?.rect&&V(n.rect))return{node:n,reason:`same-rect-descendant`};if(Sa(t)&&t.rect&&V(t.rect))return{node:t,reason:`semantic-target`};let r=ce(e,t);return r?.rect&&!W(r)&&V(r.rect)?wa(t,r,e)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}:{node:t,reason:`original`}}function xa(e,t){let n=H(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||W(e))return!1;let t=H(e.rect);return t?U(t,n):!1});if(t.length!==1)break;r=t[0]}return r===t?null:r}function Sa(e){return[e.type,e.role,e.subrole].map(e=>h(e??``)).some(Ca)}function Ca(e){return e===`tab`||va.some(t=>e.includes(t))}function wa(e,t,n){let r=H(e.rect),i=H(t.rect);if(!r||!i)return!1;let a=Ta(n,r);return!a||!Ea(i,a)?!1:!U(r,i)}function Ta(e,t){let n=r(t),i=e.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)}).map(e=>H(e.rect)).filter(e=>e!==null);if(i.length===0)return null;let a=i.filter(e=>f(e,n.x,n.y));return te(a.length>0?a:i)}function Ea(e,t){let n=ma(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}async function K(e,t,n){return await J(e,t,n.action),t.target.kind===`point`?await Oa(e,t,t.target,n):t.target.kind===`ref`?await Aa(e,t,t.target,n):await ja(e,t,t.target,n)}async function Da(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=oe(i.snapshot.nodes,a);if(!o)return;let s={x:n.x,y:n.y};if(!f(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 Oa(e,t,n,r){let i=await Da(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await ka(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preActionNodes:a}:{},...i?{warning:i}:{}}}async function ka(e,t){try{return(await q(e,t,!0)).snapshot.nodes}catch{return}}async function Aa(e,t,n,r){let i=await Ba(e,t,n),a=i.resolved,o=r.promoteToHittableAncestor?Fa(i.snapshot.nodes,a.node,{action:r.action,label:`Ref ${n.ref}`}):a.node;return Ia(o,`Ref ${n.ref}`,r.action),Ga(o,i.snapshot.nodes,n.ref,r.action),{kind:`ref`,point:Ha(o,`Ref ${n.ref} not found or has invalid bounds`),target:{kind:`ref`,ref:`@${a.ref}`},...Ma(e,o,i.snapshot.nodes,r.action)}}async function ja(e,t,r,i){let a=s(r.selector),o=await q(e,t,i.requireInteractive),c=_(Pa(o.snapshot.nodes),a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if((!c||!c.node.rect)&&i.requireInteractive&&(o=await q(e,t,!1),c=_(Pa(o.snapshot.nodes),a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0})),!c||!c.node.rect){let t=_(o.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!0,requireUnique:!1});throw t?.node&&W(t.node)?La({label:`Selector ${t.selector.raw}`,node:t.node,action:i.action,selector:t.selector.raw}):new n(`COMMAND_FAILED`,he(a,c?.diagnostics??[],{unique:!0}),{hint:_e(c?.diagnostics??[])})}let l=i.promoteToHittableAncestor?Fa(o.snapshot.nodes,c.node,{action:i.action,label:`Selector ${c.selector.raw}`}):c.node;return Ia(l,`Selector ${c.selector.raw}`,i.action),Wa(l,o.snapshot.nodes,c.selector.raw,i.action),{kind:`selector`,point:Ha(l,`Selector ${c.selector.raw} resolved to invalid bounds`),target:{kind:`selector`,selector:c.selector.raw},...Ma(e,l,o.snapshot.nodes,i.action)}}function Ma(e,t,n,r){return{node:t,selectorChain:ve(t,e.backend.platform,{action:r===`fill`?`fill`:`click`}),refLabel:de(t,n),...Na(t,r),preActionNodes:n}}function Na(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 Pa(e){return e.filter(e=>!W(e))}function Fa(e,t,n){let r=ba(e,t);if(r.reason===`covered`)throw La({label:n.label,node:t,action:n.action});return r.node}function Ia(e,t,n){if(W(e))throw La({label:t,node:e,action:n})}function La(e){return new n(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${Ra(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 Ra(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 q(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(R(e,t),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:z(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}async function J(e,t,r){if(e.backend.platform!==`macos`)return;let i=await za(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 za(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function Ba(e,t,r){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.`);if(!a.snapshot)throw new n(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);let o=r.fallbackLabel??``,s=Va(a.snapshot.nodes,r.ref,{fallbackLabel:o});if(s)return{snapshot:a.snapshot,resolved:s};let c=await q(e,t,!0),l=Va(c.snapshot.nodes,r.ref,{fallbackLabel:o});if(!l)throw new n(`COMMAND_FAILED`,`Ref ${r.ref} not found or has no bounds`,{hint:ge});return{...c,resolved:l}}function Va(e,t,r){let i=a(t);if(!i)throw new n(`INVALID_ARGS`,`Invalid ref: ${t}`);let s=o(e,i);if(Ua(s))return{ref:i,node:s};let c=r.fallbackLabel.length>0?se(e,r.fallbackLabel):null;return Ua(c)?{ref:i,node:c}:null}function Ha(e,t){let r=V(e.rect);if(!r)throw new n(`COMMAND_FAILED`,t);return r}function Ua(e){return e?V(e.rect)!==null:!1}function Wa(e,t,n,r){qa(e,t,{message:`Selector ${n} resolved to an off-screen element and is not safe to ${r}`,details:{reason:`offscreen_selector`,selector:n},hint:`The element is outside the visible viewport — likely inside a closed drawer, another tab, or scrolled content. Scroll toward it or open its container, take a fresh snapshot, then retry ${r}.`})}function Ga(e,t,n,r){qa(e,t,{message:`Ref ${n} is off-screen and not safe to ${r}`,details:{reason:`offscreen_ref`,ref:a(n)},hint:`Use scroll with the direction from the off-screen summary, take a fresh snapshot, then retry ${r} with the new ref or a selector.`})}async function Ka(e,t,n,r){let i=(await e.sessions.get(t.session??`default`))?.snapshot?.nodes;if(!i||a(n.ref)===null)return{};let o=Va(i,n.ref,{fallbackLabel:n.fallbackLabel??``});return o?(Ia(o.node,`Ref ${n.ref}`,r),Ga(o.node,i,n.ref,r),Na(o.node,r)):{}}function qa(e,t,r){let i=e.rect?le(e,t):null;if(!(!e.rect||!i||d(e,t)))throw new n(`COMMAND_FAILED`,r.message,{...r.details,rect:e.rect,viewport:i,hint:r.hint})}function Ja(e){let t=Buffer.alloc(16);for(let n of e)Xa(t,Ya(n));return{digest:`ax1:${ye(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function Ya(e){return ye(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function Xa(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function Y(e){let{digest:t,nodeCount:n}=Ja(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=Za(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function Za(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}function Qa(e,t){let n=ct(e.type??`Element`),r=st(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 $a(e,t,n={}){let r=to(X(e,n),X(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 eo(e,t={}){return X(e,t).length}function X(e,t){return t.flatten?e.map(e=>({text:ot(e,0,!1),comparable:Qa(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):w(e).map(e=>({text:e.text,comparable:Qa(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function to(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=ro(a,i,s)?Z(a,i+1):Z(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 no(o,e,t,n,r)}}return[]}function no(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=ro(i,c,r)?c+1:c-1,u=Z(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 ro(e,t,n){return t===-n||t!==n&&Z(e,t-1)<Z(e,t+1)}function Z(e,t){return e.get(t)??0}function io(e){return e===`text`||e===`label`||e===`any`}async function ao(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.`);if(!i.snapshot)throw new n(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:i.snapshot}}async function oo(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(R(e,t),{interactiveOnly:r.interactiveOnly??!1,depth:t.depth,scope:r.scope??t.scope,raw:t.raw,includeRects:r.includeRects}),c=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,...s.quality?{snapshotQuality:s.quality}:{},createdAt:z(e)};return r.updateSession&&o&&!me(c.snapshotQuality)&&await e.sessions.set({...o,snapshot:c}),{sessionName:a,session:o,snapshot:c}}async function so(e,t,n){if(e.backend.readText){let r=await e.backend.readText(R(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return ee(n)}function co(e,t,r){let i=a(t);if(!i)throw new n(`INVALID_ARGS`,r.invalidRefMessage);let s=o(e,i)??(r.fallbackLabel.length>0?se(e,r.fallbackLabel):null);if(!s)throw new n(`COMMAND_FAILED`,r.notFoundMessage);return{ref:i,node:s}}const lo=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function uo(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=z(e),o=Math.min(300,Math.max(25,r)),s=0,c,l=0,u,d=a;for(;z(e)-a<i;){let n=await fo(e,t,i-(z(e)-a));if(!n)return{settled:!1,stalled:!0,waitedMs:z(e)-a,captures:s,nodeCount:l,lastCapture:u};s+=1,u=n;let f=po(n.snapshot.nodes),p=z(e);if(f!==c)c=f,l=n.snapshot.nodes.length,d=p;else if(s>=2&&p-d>=r)return{settled:!0,stalled:!1,waitedMs:p-a,captures:s,nodeCount:l,lastCapture:u};await Ki(e,o)}return{settled:!1,stalled:!1,waitedMs:z(e)-a,captures:s,nodeCount:l,lastCapture:u}}async function fo(e,t,n){let r=oo(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 po(e){return e.map(mo).join(`|`)}function mo(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 ho=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?). The diff reflects the last capture and may already be outdated. Raise --timeout, or verify the target content with wait text.`,go=`A snapshot capture stalled past the settle budget, so no settle verdict is available. The action itself succeeded; retry the observation with snapshot or wait stable.`;async function _o(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 uo(e,t,{quietMs:r,timeoutMs:i}),s={...a,settled:o.settled,waitedMs:o.waitedMs,captures:o.captures};if(!o.lastCapture)return{observation:{...s,hint:o.stalled?go:ho}};let c=await wo(e,t,o.lastCapture),l=o.lastCapture.snapshot.nodes;return{observation:{...s,...c?{diff:bo(yo(n.resolved),l)}:{},...Co(o,c,l.length)},settledNodes:l}}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 vo(e,t){if(!e)return;let n=Y(e),r=t!==void 0&&n.digest!==Y(t).digest;return{...n,changedFromBefore:r}}function yo(e){return`preActionNodes`in e&&e.preActionNodes?e.preActionNodes:[]}function bo(e,t){let n=$a(xo(e),xo(t),{flatten:!0,withRefs:!0}),r=n.lines.filter(e=>e.kind!==`unchanged`),i=So(r).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:n.summary,lines:i,...r.length>i.length?{truncated:!0}:{}}}function xo(e){return e.filter(e=>e.type!==`Key`)}function So(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 Co(e,t,n){return e.stalled?{hint:go}:e.settled?t?n<5?{hint:lo}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted. Use screenshot as visual truth before interacting further.`}:{hint:ho}}async function wo(e,t,n){if(me(n.snapshot.snapshotQuality))return!1;let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),!0):!1}function To(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function Eo(e,t,n,r,i){let a=await Do(e,t,n,i);return ko({...r,...a})}async function Do(e,t,n,r){if(r.settle!==void 0){let i=await _o(e,t,{...r.settle,resolved:n}),a=r.verify?vo(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 Oo(e,t,n);return i?{evidence:i}:{}}async function Oo(e,t,n){let r=`preActionNodes`in n?n.preActionNodes:void 0;try{let n=Y((await q(e,t,!0)).snapshot.nodes),i=r!==void 0&&n.digest!==Y(r).digest;return{...n,changedFromBefore:i}}catch{return}}function ko(e){let t=e;if(t.targetHittable!==!1||!Ao(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function Ao(e){if(e.evidence?.changedFromBefore===!0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}const jo=[`up`,`down`,`left`,`right`,`top`,`bottom`],Mo=async(e,t)=>{let r=await K(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=Q(r),a=B(await e.backend.focus(R(e,t),i));return{...r,...a?{backendResult:a}:{},...N(`Focused (${i.x}, ${i.y})`)}},No=async(e,t)=>{let r=To(t),i=await K(e,t,{action:`longPress`,requireInteractive:!0,promoteToHittableAncestor:!0,captureEvidenceBaseline:r.needsPreActionBaseline});if(!e.backend.longPress)throw new n(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=t.durationMs===void 0?void 0:I(t.durationMs,`durationMs`,0,12e4),o=Q(i),s=B(await e.backend.longPress(R(e,t),o,{durationMs:a}));return await Eo(e,t,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...N(`Long pressed (${o.x}, ${o.y})`)},r)},Po=async(e,t)=>{if(!e.backend.scroll)throw new n(`UNSUPPORTED_OPERATION`,`scroll is not supported by this backend`);let r=Vo(t.direction),i=qo(t.amount,`scroll amount`),a=Jo(t.pixels,`scroll pixels`),o=ri(t.durationMs);ni({amount:i,pixels:a},`scroll accepts either amount or pixels, not both`);let s=await Ro(e,t),c=s.kind===`viewport`?{kind:`viewport`}:{kind:`point`,point:Q(s)},l=e.backend.scroll,u=async()=>await l(R(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=Ho(s),a=await ki({edge:n,captureState:async r=>await Uo(e,t,n,i,r),scroll:u});d=a.result,f=a.passes}else d=await u(),f=1;let p=B(d),m=ii(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}:{},...N(Ai(r.direction,r.edge,f,i,a))}},Fo=async(e,t)=>{if(!e.backend.swipe)throw new n(`UNSUPPORTED_OPERATION`,`swipe is not supported by this backend`);if(t.preset)return await Io(e,t,e.backend.swipe);let r=await zo(e,t),i=Bo(r.point,t),a=t.durationMs===void 0?void 0:I(t.durationMs,`durationMs`,16,1e4),o=B(await e.backend.swipe(R(e,t),r.point,i.point,{durationMs:a}));return{kind:`swipe`,from:r.point,to:i.point,...i.direction?{direction:i.direction}:{},...i.distance===void 0?{}:{distance:i.distance},...a===void 0?{}:{durationMs:a},...r.target?{fromTarget:r.target}:{},...o?{backendResult:o}:{},...N(`Swiped`)}};async function Io(e,t,r){if(t.from||t.to||t.direction||t.distance!==void 0)throw new n(`INVALID_ARGS`,`gesture swipe preset cannot be combined with from, to, direction, or distance`);let i=mi(t.preset);await J(e,t,`swipe`);let a=pi(i,Xo((await q(e,t,!1)).snapshot.nodes),{platform:e.backend.platform}),o=t.durationMs===void 0?void 0:I(t.durationMs,`durationMs`,16,1e4),s={x:a.x1,y:a.y1},c={x:a.x2,y:a.y2},l=B(await r(R(e,t),s,c,{durationMs:o}));return{kind:`swipe`,from:s,to:c,preset:i,...o===void 0?{}:{durationMs:o},fromTarget:{kind:`viewport`},...l?{backendResult:l}:{},...N(`Swiped ${i}`)}}const Lo=async(e,t)=>{if(!e.backend.pinch)throw new n(`UNSUPPORTED_OPERATION`,`pinch is not supported by this backend`);await J(e,t,`pinch`);let r=$(t.scale,`pinch scale`),i=t.center?await K(e,{...t,target:t.center},{action:`pinch`,requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,a=B(await e.backend.pinch(R(e,t),{scale:r,...i?{center:i.point}:{}}));return{kind:`pinch`,scale:r,...i?{center:i.point,centerTarget:i}:{},...a?{backendResult:a}:{},...N(`Pinched to scale ${r}`)}};async function Ro(e,t){let n=t.target??{kind:`viewport`};return n.kind===`viewport`?(await J(e,t,`scroll`),{kind:`viewport`}):await K(e,{...t,target:n},{action:`scroll`,requireInteractive:!1,promoteToHittableAncestor:!1})}async function zo(e,t){if(t.from){if(Ko(t.from))return await J(e,t,`swipe`),{point:Go(t.from,`from`)};let n=await K(e,{...t,target:t.from},{action:`swipe`,requireInteractive:!1,promoteToHittableAncestor:!1});return{point:Q(n),target:n}}if(!t.direction)throw new n(`INVALID_ARGS`,`swipe requires from+to or a direction`);return await J(e,t,`swipe`),{point:r(Yo((await q(e,t,!1)).snapshot.nodes)),target:{kind:`viewport`}}}function Bo(e,t){if(t.to)return{point:Go(t.to,`to`)};let n=Wo(t.direction,`swipe direction`),r=$(t.distance??200,`swipe distance`);switch(n){case`up`:return{point:{x:e.x,y:e.y-r},direction:n,distance:r};case`down`:return{point:{x:e.x,y:e.y+r},direction:n,distance:r};case`left`:return{point:{x:e.x-r,y:e.y},direction:n,distance:r};case`right`:return{point:{x:e.x+r,y:e.y},direction:n,distance:r}}}function Vo(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:Wo(e,`scroll direction`)}}function Ho(e){return e.kind===`viewport`?{}:{point:e.point,nodeIndex:`node`in e?e.node?.index:void 0}}function Q(e){if(!e.point)throw new n(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Uo(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 Oi({edge:r,target:i,scope:a,captureNodes:async n=>{let r=await o(R(e,t),{scope:n});return r.snapshot?.nodes??r.nodes??[]}})}function Wo(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 Go(e,t){let r=Number(e.x),i=Number(e.y);if(!Number.isFinite(r)||!Number.isFinite(i))throw new n(`INVALID_ARGS`,`${t} point requires finite x and y`);return{x:r,y:i}}function Ko(e){return`x`in e&&`y`in e}function qo(e,t){return e===void 0?void 0:$(e,t)}function $(e,t){if(!Number.isFinite(e)||e<=0)throw new n(`INVALID_ARGS`,`${t} must be a positive number`);return e}function Jo(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}}function Yo(e){let t=e.filter(t=>ne(t,e)).map(e=>e.rect).filter(Zo),r=t.length>0?t:e.map(e=>e.rect).filter(Zo);if(r.length===0)throw new n(`COMMAND_FAILED`,`Cannot infer viewport for directional swipe`);let i=Math.min(...r.map(e=>e.x)),a=Math.min(...r.map(e=>e.y)),o=Math.max(...r.map(e=>e.x+e.width)),s=Math.max(...r.map(e=>e.y+e.height));return{x:i,y:a,width:o-i,height:s-a}}function Xo(e){let t=Yo(e);return{referenceWidth:t.width,referenceHeight:t.height}}function Zo(e){return!!(e&&e.width>0&&e.height>0)}const Qo=/^e\d+$/;function $o(e){if(e[0]?.startsWith(`@`)){let t=os(e.slice(1));return{ref:e[0],...t===void 0?{}:{label:t}}}if(Qo.test(e[0]??``))throw new n(`INVALID_ARGS`,`Did you mean "@${e[0]}"? Snapshot refs need the @ prefix.`);let t=l(e);if(t){if(t.rest.length>0)throw new n(`INVALID_ARGS`,rs(e,t));return{selector:t.selectorExpression}}return ts(e)}function es(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?os(e.slice(1,2)):void 0},text:n}}if(Qo.test(t??``))throw new n(`INVALID_ARGS`,`Did you mean "@${t}"? Snapshot refs need the @ prefix.`);let r=l(e,{preferTrailingValue:!0});return r?{kind:`selector`,target:{selector:r.selectorExpression},text:r.rest.join(` `)}:{kind:`point`,target:ts(e.slice(0,2)),text:e.slice(2).join(` `)}}function ts(e){let t=Number(e[0]),r=Number(e[1]);if(Number.isFinite(t)&&Number.isFinite(r))return{x:t,y:r};throw new n(`INVALID_ARGS`,ns(e))}function ns(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=>c(e??``))?`${n} Selector values with spaces need quotes, e.g. text="Sign in".`:`${n} To match by visible text, use text=${as(t)} (or label=/id=/role=), or pass an @ref from snapshot.`}function rs(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${is(e,t)??`text="Sign in"`}.`}function is(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)}${as(a)}`;return[...e.slice(0,n-1),o].join(` `)}function as(e){return`"${e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}"`}function os(e){return e.join(` `).trim()||void 0}function ss(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 cs=[`path`,`start`,`stop`,`doctor`,`mark`,`clear`],ls=[`medium`,`high`],us=`medium`;function ds(e){return ls.includes(e)}function fs(e){let t=typeof e==`number`?e:ps(e);return t!==void 0&&Number.isInteger(t)&&t>=5&&t<=10?t:void 0}function ps(e){return typeof e==`string`&&/^\d+$/.test(e)?Number(e):void 0}function ms(e){if(ds(e))return e;let t=fs(e);if(t!==void 0)return t<=7?`medium`:`high`}const hs=[`portrait`,`portrait-upside-down`,`landscape-left`,`landscape-right`];function gs(e){if(e===void 0)throw new n(`INVALID_ARGS`,`rotate requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.`);switch(e?.trim().toLowerCase()){case`portrait`:return`portrait`;case`portrait-upside-down`:case`upside-down`:return`portrait-upside-down`;case`landscape-left`:case`left`:return`landscape-left`;case`landscape-right`:case`right`:return`landscape-right`;default:throw new n(`INVALID_ARGS`,`Invalid rotation: ${e}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}export{oi as $,qn as $t,ba as A,dn as An,gr as At,U as B,w as Bn,br as Bt,co as C,bn as Cn,Kr as Ct,Ka as D,Cn as Dn,Er as Dt,eo as E,xn as En,Ar as Et,ha as F,Pt as Fn,cr as Ft,Ki as G,ir as Gt,V as H,wr as Ht,ga as I,xt as In,yr as It,Ai as J,Vn as Jt,R as K,er as Kt,fa as L,bt as Ln,_r as Lt,pa as M,ln as Mn,hr as Mt,ma as N,O as Nn,ar as Nt,K as O,Sn as On,Dr as Ot,da as P,Ft as Pn,vr as Pt,si as Q,Zn as Qt,Qi as R,yt as Rn,sr as Rt,ao as S,gn as Sn,qr as St,$a as T,wn as Tn,jr as Tt,B as U,Sr as Ut,Ji as V,Cr as Vt,z as W,nr as Wt,I as X,Kn as Xt,ki as Y,Hn as Yt,ai as Z,Jn as Zt,To as _,P as _n,Qr as _t,ms as a,Rn as an,Ei as at,oo as b,Tn as bn,Gr as bt,es as c,An as cn,mi as ct,Mo as d,Pn as dn,ni as dt,Gn as en,di as et,No as f,Fn as fn,ii as ft,Eo as g,N as gn,$r as gt,Fo as h,On as hn,ei as ht,ls as i,Qn as in,_i as it,_a as j,un as jn,or as jt,ya as k,vn as kn,Or as kt,$o as l,kn as ln,gi as lt,Po as m,Mn as mn,Zr as mt,gs as n,Xn as nn,fi as nt,cs as o,zn as on,hi as ot,Lo as p,Nn as pn,ri as pt,Oi as q,tr as qt,us as r,Wn as rn,pi as rt,ss as s,Ln as sn,vi as st,hs as t,Yn as tn,ui as tt,jo as u,jn as un,ti as ut,lo as v,mn as vn,Jr as vt,io as w,yn as wn,Mr as wt,so as x,_n as xn,Wr as xt,uo as y,En as yn,Yr as yt,W as z,D as zn,xr as zt};
@@ -1 +1 @@
1
- import{promises as e}from"node:fs";import t from"node:os";import i from"node:path";import{AppError as r}from"./485.js";import{isIosFamily as o,sortAppleDevicesForSelection as n}from"./6849.js";import{buildHostMacDevice as s}from"./devices~1.js";import{runXcrun as l,resolveAppleToolProvider as a,buildSimctlArgs as u}from"./9722.js";import{markSimulatorBooted as c}from"./simulator.js";import{resolveIosSimulatorDeviceSetPath as d}from"./3340.js";let p=/^(iphone|ipad|ipod|appletv|realitydevice)/i,f=/ipad/i,m=/\b(apple vision|vision pro|xros|visionos|realitydevice)\b/i,v=/\b(iphone|ipad|ipod)\b/i,_=/^appletv/i,h=["apple tv","appletv","tvos"],S=/^==\s*(.+?)\s*==$/,w=/^(?<name>.+?)\s+\[(?<id>[^[\]]+)\]\s*$/;function P(e){return(e??"").trim().toLowerCase()}function y(e){return P(e.hardwareProperties?.platform)}function C(e){return e.includes("tvos")}function b(e){let t=P(e);return h.some(e=>t.includes(e))}function O(e,t){return"tv"===e?"tvos":t.some(e=>m.test(e))?"visionos":t.some(e=>f.test(e))?"ipados":"ios"}function A(e){return[e.name??"",e.deviceProperties?.name??"",e.deviceProperties?.deviceType??""]}function N(e){return e.hardwareProperties?.productType??e.deviceProperties?.productType??""}async function K(e={}){let t,i,r=d(e.simulatorSetPath),o=e.target;try{t=await l(u(["list","devices","-j"],{simulatorSetPath:r}))}catch{return null}try{i=JSON.parse(t.stdout)}catch{return null}return n(M(i,r)).find(e=>!o||e.target===o)??null}function M(e,t){let i=[];for(let[r,o]of Object.entries(e.devices))if(function(e){let t=P(e);return t.includes("ios")||t.includes("tvos")||t.includes("xros")||t.includes("visionos")}(r))for(let e of o){if(!e.isAvailable)continue;let o=C(P(r))?"tv":"mobile",n={platform:"apple",id:e.udid,name:e.name,kind:"simulator",target:o,appleOs:O(o,[e.deviceTypeIdentifier??"",e.name]),booted:"Booted"===e.state,...t?{simulatorSetPath:t}:{}};n.booted&&c(n),i.push(n)}return i}function x(e,t){let i=new Set(e.map(e=>e.id)),r=[...e];for(let e of t)i.has(e.id)||(i.add(e.id),r.push(e));return r}async function E(){let r=null;try{r=i.join(t.tmpdir(),`agent-device-devicectl-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`);let o=await l(["devicectl","list","devices","--json-output",r],{allowFailure:!0,timeoutMs:8e3});if(0!==o.exitCode)return[];let n=await e.readFile(r,"utf8");return function(e){let t=[];for(let i of e.result?.devices??[]){if(!function(e){var t,i;let r=y(e);return!!(r.includes("ios")||r.includes("tvos")||(t=r).includes("xros")||t.includes("visionos"))||(i=N(e),!!p.test(i.trim())||A(e).some(b))}(i))continue;let e=i.hardwareProperties?.udid??i.identifier??"",r=i.name??i.deviceProperties?.name??e;if(!e)continue;let o=function(e){var t;return C(y(e))?"tv":(t=N(e),_.test(t.trim())||A(e).some(b))?"tv":"mobile"}(i);t.push({platform:"apple",id:e,name:r,kind:"device",target:o,appleOs:O(o,[N(i),...A(i)]),booted:!0})}return t}(JSON.parse(n))}catch{return[]}finally{r&&await e.rm(r,{force:!0}).catch(()=>{})}}async function R(){try{let e=await l(["xctrace","list","devices"],{allowFailure:!0});if(0!==e.exitCode)return[];return function(e){let t=[],i=null;for(let r of e.split(/\r?\n/)){let e=r.trim();if(!e)continue;let o=S.exec(e);if(o){i=o[1]?.trim()??null;continue}if("Devices"!==i)continue;let n=w.exec(e),s=n?.groups?.id?.trim()??"",l=n?.groups?.name?.trim()??"";if(!s||!l)continue;let a=function(e){return b(e)?"tv":v.test(e.trim())||m.test(e)?"mobile":null}(l);a&&t.push({platform:"apple",id:s,name:l,kind:"device",target:a,appleOs:O(a,[l]),booted:!0})}return t}(e.stdout)}catch{return[]}}async function T(e={}){if("darwin"!==process.platform)throw new r("UNSUPPORTED_PLATFORM","Apple tools are only available on macOS");if(!await a().whichCommand("xcrun"))throw new r("TOOL_MISSING","xcrun not found in PATH");let t=d(e.simulatorSetPath),i=await l(u(["list","devices","-j"],{simulatorSetPath:t})),c=[];try{let e=JSON.parse(i.stdout);c=M(e,t)}catch(e){throw new r("COMMAND_FAILED","Failed to parse simctl devices JSON",void 0,e)}if(c.push(s()),e.udid&&c.some(t=>o(t)&&t.id===e.udid))return c;if(t)return n(c);let[p,f]=await Promise.all([E(),R()]);return c=x(c,p),n(x(c,f))}export{K as findBootableIosSimulator,T as listAppleDevices};
1
+ import e from"node:os";function t(){return{platform:`apple`,id:`host-macos-local`,name:e.hostname(),kind:`device`,target:`desktop`,appleOs:`macos`,booted:!0}}async function n(){return[t()]}export{t as buildHostMacDevice,n as listMacosDevices};
@@ -0,0 +1 @@
1
+ import{F as e,p as t,w as n}from"./sdk-contracts.js";import{h as r}from"./logcat.js";import{i,o as a}from"./tool-provider.js";import{t as o}from"./simctl.js";import{r as s}from"./simulator.js";import{buildHostMacDevice as c}from"./devices.js";import{promises as l}from"node:fs";import u from"node:os";import d from"node:path";const f=/^(iphone|ipad|ipod|appletv|realitydevice)/i,p=/ipad/i,m=/\b(apple vision|vision pro|xros|visionos|realitydevice)\b/i,h=/\b(iphone|ipad|ipod)\b/i,g=/^appletv/i,_=[`apple tv`,`appletv`,`tvos`],v=/^==\s*(.+?)\s*==$/,y=/^(?<name>.+?)\s+\[(?<id>[^[\]]+)\]\s*$/;function b(e){return(e??``).trim().toLowerCase()}function x(e){return b(e)}function S(e){return b(e.hardwareProperties?.platform)}function C(e){return e.includes(`tvos`)}function w(e){return e.includes(`xros`)||e.includes(`visionos`)}function T(e){return C(x(e))?`tv`:`mobile`}function E(e){let t=x(e);return t.includes(`ios`)||t.includes(`tvos`)||t.includes(`xros`)||t.includes(`visionos`)}function D(e){let t=b(e);return _.some(e=>t.includes(e))}function O(e){return h.test(e.trim())}function k(e){return D(e)?`tv`:O(e)||m.test(e)?`mobile`:null}function A(e,t){return e===`tv`?`tvos`:t.some(e=>m.test(e))?`visionos`:t.some(e=>p.test(e))?`ipados`:`ios`}function j(e){return f.test(e.trim())}function M(e){return g.test(e.trim())}function N(e){return[e.name??``,e.deviceProperties?.name??``,e.deviceProperties?.deviceType??``]}function P(e){return e.hardwareProperties?.productType??e.deviceProperties?.productType??``}function F(e){return C(S(e))||M(P(e))||N(e).some(D)?`tv`:`mobile`}function I(e){let t=S(e);return t.includes(`ios`)||t.includes(`tvos`)||w(t)||j(P(e))?!0:N(e).some(D)}async function L(e={}){let t=r(e.simulatorSetPath),i=e.target,s;try{s=await a(o([`list`,`devices`,`-j`],{simulatorSetPath:t}))}catch{return null}let c;try{c=JSON.parse(s.stdout)}catch{return null}return n(R(c,t)).find(e=>!i||e.target===i)??null}function R(e,t){let n=[];for(let[r,i]of Object.entries(e.devices))if(E(r))for(let e of i){if(!e.isAvailable)continue;let i=T(r),a={platform:`apple`,id:e.udid,name:e.name,kind:`simulator`,target:i,appleOs:A(i,[e.deviceTypeIdentifier??``,e.name]),booted:e.state===`Booted`,...t?{simulatorSetPath:t}:{}};a.booted&&s(a),n.push(a)}return n}function z(e){let t=[];for(let n of e.result?.devices??[]){if(!I(n))continue;let e=n.hardwareProperties?.udid??n.identifier??``,r=n.name??n.deviceProperties?.name??e;if(!e)continue;let i=F(n);t.push({platform:`apple`,id:e,name:r,kind:`device`,target:i,appleOs:A(i,[P(n),...N(n)]),booted:!0})}return t}function B(e){let t=[],n=null;for(let r of e.split(/\r?\n/)){let e=r.trim();if(!e)continue;let i=v.exec(e);if(i){n=i[1]?.trim()??null;continue}if(n!==`Devices`)continue;let a=y.exec(e),o=a?.groups?.id?.trim()??``,s=a?.groups?.name?.trim()??``;if(!o||!s)continue;let c=k(s);c&&t.push({platform:`apple`,id:o,name:s,kind:`device`,target:c,appleOs:A(c,[s]),booted:!0})}return t}function V(e,t){let n=new Set(e.map(e=>e.id)),r=[...e];for(let e of t)n.has(e.id)||(n.add(e.id),r.push(e));return r}async function H(){let e=null;try{if(e=d.join(u.tmpdir(),`agent-device-devicectl-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),(await a([`devicectl`,`list`,`devices`,`--json-output`,e],{allowFailure:!0,timeoutMs:8e3})).exitCode!==0)return[];let t=await l.readFile(e,`utf8`);return z(JSON.parse(t))}catch{return[]}finally{e&&await l.rm(e,{force:!0}).catch(()=>{})}}async function U(){try{let e=await a([`xctrace`,`list`,`devices`],{allowFailure:!0});return e.exitCode===0?B(e.stdout):[]}catch{return[]}}async function W(s={}){if(process.platform!==`darwin`)throw new e(`UNSUPPORTED_PLATFORM`,`Apple tools are only available on macOS`);if(!await i().whichCommand(`xcrun`))throw new e(`TOOL_MISSING`,`xcrun not found in PATH`);let l=r(s.simulatorSetPath),u=await a(o([`list`,`devices`,`-j`],{simulatorSetPath:l})),d=[];try{d=R(JSON.parse(u.stdout),l)}catch(t){throw new e(`COMMAND_FAILED`,`Failed to parse simctl devices JSON`,void 0,t)}if(d.push(c()),s.udid&&d.some(e=>t(e)&&e.id===s.udid))return d;if(l)return n(d);let[f,p]=await Promise.all([H(),U()]);return d=V(d,f),n(V(d,p))}export{L as findBootableIosSimulator,W as listAppleDevices};
@@ -0,0 +1 @@
1
+ import{hostname as e}from"node:os";async function t(){return process.platform===`linux`?[{platform:`linux`,id:`local`,name:e(),kind:`device`,target:`desktop`,booted:!0}]:[]}export{t as listLinuxDevices};
package/dist/src/find.js CHANGED
@@ -1 +1 @@
1
- import{errorResponse as e,stripInternalInteractionFlags as t,dispatchCommand as r,noActiveSessionError as n,resolveTargetDevice as a,context_contextFromFlags as o}from"./9722.js";import{parseFindSelectorExpression as i,findBestMatchesByLocator as s,parseFindArgs as l}from"./587.js";import{ensureDeviceReady as c}from"./8414.js";import{dispatchFindReadOnlyViaRuntime as f,readTextForNode as d,createSelectorCaptureRuntime as u}from"./selector-runtime.js";import{resolveActionableTouchResolution as _,isSparseSnapshotQualityVerdict as h,isSnapshotNodeInteractionBlocked as p,resolveActionableTouchNode as m}from"./2948.js";import{resolveSelectorChain as g,extractNodeText as y}from"./893.js";import{centerOfRect as A}from"./6849.js";import{sleep as w}from"./5560.js";import{recordSessionAction as S}from"./handler-utils.js";async function k(r){var o,d,p,w;let S,{req:k,sessionName:U,logPath:b,sessionStore:P,invoke:H}=r,q=k.command;if("find"!==q)return null;let O=k.positionals??[];if(0===O.length)return e("INVALID_ARGS","find requires a locator or text");let{locator:$,query:B,action:G,value:V,timeoutMs:Q}=l(O);if(!B)return e("INVALID_ARGS","find requires a value");if(k.flags?.findFirst&&k.flags?.findLast)return e("INVALID_ARGS","find accepts only one of --first or --last");let T=await f({req:k,sessionName:U,logPath:b,sessionStore:P});if(T)return T;let j=P.get(U),z="exists"===(o=G)||"wait"===o||"get_text"===o||"get_attrs"===o;if(!j&&!z)return n();let J=j?.device??await a(k.flags??{});j||await c(J);let W="click"===(d=G)||"focus"===d||"fill"===d||"type"===d,X=i($,B),Y="web"!==J.platform&&!X&&L($)&&!W?B:void 0,Z=function(e){let{device:t,session:r,req:n,logPath:a,locator:o,query:i,scope:s,interactiveOnly:l}=e,{sessionStore:c,sessionName:f}=e,d=u({device:t,session:r,sessionStore:c,sessionName:f,req:n,logPath:a});return async()=>{let{snapshot:e}=await d.capture({flags:{...n.flags,snapshotInteractiveOnly:l},snapshotScope:s,recovery:l?{legacyIosSparse:{query:i,scope:s,shouldScope:L(o)},sparseVerdictQueryScope:{query:i,shouldScope:L(o)}}:void 0});return{nodes:e.nodes,truncated:e.truncated,backend:e.backend,snapshotQuality:e.snapshotQuality}}}({device:J,session:j,req:k,logPath:b,locator:$,query:B,scope:Y,interactiveOnly:W,sessionStore:P,sessionName:U}),ee={req:k,sessionName:U,logPath:b,sessionStore:P,invoke:H,session:j,device:J,command:q,locator:$,query:B,publicFlags:{...t(k.flags)??{}}};if("wait"===G)return N(ee,Z,$,B,Q);let et=await Z();if(h(et.snapshotQuality))return C(et.snapshotQuality);let{nodes:er}=et,en=function(t){let{nodes:r,locator:n,query:a,selectorChain:o,requiresRect:i,flags:l,platform:c}=t,f=i?r.filter(e=>!v(e,r[0])):r;if(o){let t=g(f,o,{platform:c,requireRect:i,requireUnique:!1});return t?{ok:!0,node:t.node}:{ok:!1,response:e("COMMAND_FAILED","find did not match any element")}}let d=s(f,n,a,{requireRect:i});if(i&&(d.matches=function(e,t){var r,n;let a=t[0]?.rect;if(!a)return e;let o=e.filter(e=>{if(!e.rect)return!1;let t=A(e.rect);return t.x>=a.x&&t.x<=a.x+a.width&&t.y>=a.y&&t.y<=a.y+a.height});return r=o.length>0?o:e,n=t,r.length<2?r:r.map((e,t)=>({node:e,index:t,score:function(e,t){var r,n;let a=_(t,e);if("covered"===a.reason)return 0;let o=(r=a,n=t[0],r.node.rect?"semantic-target"===r.reason||"same-rect-descendant"===r.reason?4:2*!("hittable-ancestor"!==r.reason||v(r.node,n)):0);return o>0?o:e.hittable&&e.rect&&!v(e,t[0])?3:+!!e.rect}(e,n)})).sort((e,t)=>t.score!==e.score?t.score-e.score:M(e.node)-M(t.node)||e.index-t.index).map(e=>e.node)}(d.matches,r)),i&&d.matches.length>1){var u,h,p,m,w;let t=(u=d.matches,h=l,h?.findFirst?[u[0]]:h?.findLast?[u[u.length-1]]:null);if(!t){let t;return{ok:!1,response:(p=d.matches,m=n,w=a,t=p.slice(0,8).map(e=>{let t=y(e)||e.label||e.identifier||e.type||"";return`@${e.ref}${t?`(${t})`:""}`}),e("AMBIGUOUS_MATCH",`find matched ${p.length} elements for ${m} "${w}". Use a more specific locator or selector.`,{locator:m,query:w,matches:p.length,candidates:t}))}}d.matches=t}let S=d.matches[0]??null;return S?{ok:!0,node:S}:{ok:!1,response:e("COMMAND_FAILED","find did not match any element")}}({nodes:er,locator:$,query:B,selectorChain:X,requiresRect:W,flags:k.flags,platform:J.platform});if(!en.ok)return en.response;let ea=en.node,eo=W?v(S=m(p=er,w=ea),p[0])&&w.rect?w:S:ea,ei=`@${eo.ref}`,es={node:ea,resolvedNode:eo,ref:ei,nodes:er,actionFlags:{...k.flags??{},noRecord:!0}},el={exists:()=>I(ee),get_text:()=>x(ee,es),get_attrs:()=>D(ee,es),click:()=>K(ee,es),fill:()=>R(ee,es,V),focus:()=>E(ee,es),type:()=>F(ee,es,V)}[G];return el?el():null}function C(t){return e("COMMAND_FAILED","find could not read the current accessibility tree",{reason:t.reason,hint:"The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen."})}function M(e){return e.rect?e.rect.width*e.rect.height:1/0}function v(e,t){var r,n;if(!t?.rect||!e.rect)return!1;let a=e.type?.toLowerCase()??"";return(!!a.includes("application")||!!a.includes("window"))&&(r=e.rect,n=t.rect,r.x===n.x&&r.y===n.y&&r.width===n.width&&r.height===n.height)}async function N(t,r,n,a,o){let i,{req:l,sessionStore:c,session:f,command:d,publicFlags:u}=t,_=o??1e4,p=Date.now();for(;Date.now()-p<_;){let{nodes:e,snapshotQuality:t}=await r();if(h(t)){i=t,await w(300);continue}if(s(e,n,a,{requireRect:!1}).matches[0])return S(c,f,l,d,{found:!0,waitedMs:Date.now()-p},{flags:u}),{ok:!0,data:{found:!0,waitedMs:Date.now()-p}};await w(300)}return i?C(i):e("COMMAND_FAILED","find wait timed out")}async function I(e){let{req:t,sessionStore:r,session:n,command:a,publicFlags:o}=e;return S(r,n,t,a,{found:!0},{flags:o}),{ok:!0,data:{found:!0}}}async function x(e,t){let{req:r,sessionStore:n,session:a,command:i,device:s,logPath:l,publicFlags:c}=e,f=await d({device:s,node:t.node,flags:r.flags,appBundleId:a?.appBundleId,traceOutPath:a?.trace?.outPath,surface:a?.surface,contextFromFlags:(e,t,r)=>o(l,e,t,r)});return S(n,a,r,i,{ref:t.ref,action:"get text",text:f},{flags:c}),{ok:!0,data:{ref:t.ref,text:f,node:t.node}}}async function D(e,t){let{req:r,sessionStore:n,session:a,command:o,publicFlags:i}=e;return S(n,a,r,o,{ref:t.ref,action:"get attrs"},{flags:i}),{ok:!0,data:{ref:t.ref,node:t.node}}}async function K(e,t){let{req:r,sessionName:n,sessionStore:a,session:o,invoke:i,command:s,locator:l,query:c,publicFlags:f}=e,d=await i({token:r.token,session:n,command:"click",positionals:[t.ref],flags:t.actionFlags});if(!d.ok)return d;let u=t.resolvedNode.rect?A(t.resolvedNode.rect):t.node.rect?A(t.node.rect):null,_={ref:t.ref,locator:l,query:c};return u&&(_.x=u.x,_.y=u.y),S(a,o,r,s,{ref:t.ref,action:"click",locator:l,query:c},{flags:f}),{ok:!0,data:_}}async function R(t,r,n){let{req:a,sessionName:o,sessionStore:i,session:s,invoke:l,command:c,publicFlags:f}=t;if(!n)return e("INVALID_ARGS","find fill requires text");let d=await l({token:a.token,session:o,command:"fill",positionals:[r.ref,n],flags:r.actionFlags});return d.ok&&S(i,s,a,c,{ref:r.ref,action:"fill"},{flags:f}),d}async function E(e,t){let r=await U(e,t);return r.ok&&b(e,t,"focus"),r}async function F(t,n,a){let{req:i,device:s,logPath:l,session:c}=t;if(!a)return e("INVALID_ARGS","find type requires text");let f=await U(t,n);if(!f.ok)return f;let d=await r(s,"type",[a],i.flags?.out,{...o(l,i.flags,c?.appBundleId,c?.trace?.outPath)});return b(t,n,"type"),{ok:!0,data:d??{ref:n.ref}}}async function U(t,n){var a;let i,{req:s,device:l,logPath:c,session:f}=t,d=(i=[(a=n).resolvedNode,a.node].find(p))?e("COMMAND_FAILED",`Matched element ${a.ref} is covered by another visible element and cannot be focused safely`,{ref:`@${i.ref}`,interactionBlocked:i.interactionBlocked,hint:"Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying."}):null;if(d)return d;let u=n.resolvedNode.rect?A(n.resolvedNode.rect):null;return u?{ok:!0,data:await r(l,"focus",[String(u.x),String(u.y)],s.flags?.out,{...o(c,s.flags,f?.appBundleId,f?.trace?.outPath)})??{ref:n.ref}}:e("COMMAND_FAILED","matched element has no bounds")}function b(e,t,r){let{req:n,sessionStore:a,session:o,command:i,publicFlags:s}=e;S(a,o,n,i,{ref:t.ref,action:r},{flags:s})}function L(e){return"role"!==e}export{parseFindArgs}from"./587.js";export{k as handleFindCommands};
1
+ import{O as e}from"./sdk-contracts.js";import{t}from"./timeouts.js";import{A as n,gn as r,hn as i,k as a,z as o}from"./device-rotation.js";import{d as s}from"./sdk-selectors.js";import{t as c}from"./snapshot-quality.js";import{a as l,o as u,r as d}from"./sdk-finders.js";import{a as f}from"./selectors2.js";import{Et as p,Ft as m,Ht as h,It as g,Xt as _,Zt as v,on as y}from"./internal/daemon.js";import{a as b}from"./apple-runner-options.js";import{a as x,t as S,w as C}from"./selector-runtime.js";import{t as w}from"./handler-utils.js";async function T(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,invoke:a}=e,o=t.command;if(o!==`find`)return null;let s=t.positionals??[];if(s.length===0)return _(`INVALID_ARGS`,`find requires a locator or text`);let{locator:d,query:f,action:m,value:h,timeoutMs:g}=l(s);if(!f)return _(`INVALID_ARGS`,`find requires a value`);if(t.flags?.findFirst&&t.flags?.findLast)return _(`INVALID_ARGS`,`find accepts only one of --first or --last`);let x=await S({req:t,sessionName:n,logPath:r,sessionStore:i});if(x)return x;let C=i.get(n),w=D(m);if(!C&&!w)return v();let T=C?.device??await y(t.flags??{});C||await b(T);let j=O(m),M=u(d,f),N=ee({device:T,session:C,req:t,logPath:r,locator:d,query:f,scope:T.platform!==`web`&&!M&&$(d)&&!j?f:void 0,interactiveOnly:j,sessionStore:i,sessionName:n}),P={req:t,sessionName:n,logPath:r,sessionStore:i,invoke:a,session:C,device:T,command:o,locator:d,query:f,publicFlags:Z(t.flags)};if(m===`wait`)return B(P,N,d,f,g);let F=await N();if(c(F.snapshotQuality))return k(F.snapshotQuality);let{nodes:I}=F,R=A({nodes:I,locator:d,query:f,selectorChain:M,requiresRect:j,flags:t.flags,platform:T.platform});if(!R.ok)return R.response;let z=R.node,J=j?L(I,z):z,Y={node:z,resolvedNode:J,ref:`@${J.ref}`,nodes:I,actionFlags:{...t.flags??{},noRecord:!0}};C&&(p(C),i.set(n,C));let X={exists:()=>V(P),get_text:()=>H(P,Y),get_attrs:()=>U(P,Y),click:()=>W(P,Y),fill:()=>G(P,Y,h),focus:()=>K(P,Y),type:()=>q(P,Y,h)}[m];return X?E(await X(),()=>i.get(n)):null}function E(e,t){if(!e?.ok||!e.data||typeof e.data.ref!=`string`)return e;let n=t()?.snapshotGeneration;return n===void 0?e:{...e,data:{...e.data,refsGeneration:n}}}function D(e){return e===`exists`||e===`wait`||e===`get_text`||e===`get_attrs`}function O(e){return e===`click`||e===`focus`||e===`fill`||e===`type`}function ee(e){let{device:t,session:n,req:r,logPath:i,locator:a,query:o,scope:s,interactiveOnly:c}=e,{sessionStore:l,sessionName:u}=e,d=x({device:t,session:n,sessionStore:l,sessionName:u,req:r,logPath:i});return async()=>{let{snapshot:e}=await d.capture({flags:{...r.flags,snapshotInteractiveOnly:c},snapshotScope:s,recovery:c?{legacyIosSparse:{query:o,scope:s,shouldScope:$(a)},sparseVerdictQueryScope:{query:o,shouldScope:$(a)}}:void 0});return{nodes:e.nodes,truncated:e.truncated,backend:e.backend,snapshotQuality:e.snapshotQuality}}}function k(e){return _(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}function A(e){let{nodes:t,locator:n,query:r,selectorChain:i,requiresRect:a,flags:o,platform:s}=e,c=a?t.filter(e=>!R(e,t[0])):t;if(i){let e=f(c,i,{platform:s,requireRect:a,requireUnique:!1});return e?{ok:!0,node:e.node}:{ok:!1,response:_(`COMMAND_FAILED`,`find did not match any element`)}}let l=d(c,n,r,{requireRect:a});if(a&&(l.matches=M(l.matches,t)),a&&l.matches.length>1){let e=j(l.matches,o);if(!e)return{ok:!1,response:Q(l.matches,n,r)};l.matches=e}let u=l.matches[0]??null;return u?{ok:!0,node:u}:{ok:!1,response:_(`COMMAND_FAILED`,`find did not match any element`)}}function j(e,t){return t?.findFirst?[e[0]]:t?.findLast?[e[e.length-1]]:null}function M(t,n){let r=n[0]?.rect;if(!r)return t;let i=t.filter(t=>{if(!t.rect)return!1;let n=e(t.rect);return n.x>=r.x&&n.x<=r.x+r.width&&n.y>=r.y&&n.y<=r.y+r.height});return N(i.length>0?i:t,n)}function N(e,t){return e.length<2?e:e.map((e,n)=>({node:e,index:n,score:P(e,t)})).sort((e,t)=>t.score===e.score?I(e.node)-I(t.node)||e.index-t.index:t.score-e.score).map(e=>e.node)}function P(e,t){let r=n(t,e);if(r.reason===`covered`)return 0;let i=F(r,t[0]);return i>0?i:e.hittable&&e.rect&&!R(e,t[0])?3:+!!e.rect}function F(e,t){return e.node.rect?e.reason===`semantic-target`||e.reason===`same-rect-descendant`?4:e.reason===`hittable-ancestor`&&!R(e.node,t)?2:0:0}function I(e){return e.rect?e.rect.width*e.rect.height:1/0}function L(e,t){let n=a(e,t);return R(n,e[0])&&t.rect?t:n}function R(e,t){if(!t?.rect||!e.rect)return!1;let n=e.type?.toLowerCase()??``;return!n.includes(`application`)&&!n.includes(`window`)?!1:z(e.rect,t.rect)}function z(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}async function B(e,n,r,i,a){let{req:o,sessionStore:s,session:l,command:u,publicFlags:f}=e,p=a??1e4,m=Date.now(),h;for(;Date.now()-m<p;){let{nodes:e,snapshotQuality:a}=await n();if(c(a)){h=a,await t(300);continue}if(d(e,r,i,{requireRect:!1}).matches[0])return w(s,l,o,u,{found:!0,waitedMs:Date.now()-m},{flags:f}),{ok:!0,data:{found:!0,waitedMs:Date.now()-m}};await t(300)}return h?k(h):_(`COMMAND_FAILED`,`find wait timed out`)}async function V(e){let{req:t,sessionStore:n,session:r,command:i,publicFlags:a}=e;return w(n,r,t,i,{found:!0},{flags:a}),{ok:!0,data:{found:!0}}}async function H(e,t){let{req:n,sessionStore:r,session:i,command:a,device:o,logPath:s,publicFlags:c}=e,l=await C({device:o,node:t.node,flags:n.flags,appBundleId:i?.appBundleId,traceOutPath:i?.trace?.outPath,surface:i?.surface,contextFromFlags:(e,t,n)=>g(s,e,t,n)});return w(r,i,n,a,{ref:t.ref,action:`get text`,text:l},{flags:c}),{ok:!0,data:{ref:t.ref,text:l,node:t.node}}}async function U(e,t){let{req:n,sessionStore:r,session:i,command:a,publicFlags:o}=e;return w(r,i,n,a,{ref:t.ref,action:`get attrs`},{flags:o}),{ok:!0,data:{ref:t.ref,node:t.node}}}async function W(t,n){let{req:a,sessionName:o,sessionStore:s,session:c,invoke:l,command:u,locator:d,query:f,publicFlags:p}=t,m=await l({token:a.token,session:o,command:`click`,positionals:[n.ref],flags:n.actionFlags});if(!m.ok)return m;let h=n.resolvedNode.rect?e(n.resolvedNode.rect):n.node.rect?e(n.node.rect):null,g={ref:n.ref,locator:d,query:f};h&&(g.x=h.x,g.y=h.y);let _=i(m.data)??`Tapped ${n.ref}${h?` (${h.x}, ${h.y})`:``}`;return Object.assign(g,r(_)),w(s,c,a,u,{ref:n.ref,action:`click`,locator:d,query:f},{flags:p}),{ok:!0,data:g}}async function G(e,t,n){let{req:r,sessionName:i,sessionStore:a,session:o,invoke:s,command:c,publicFlags:l}=e;if(!n)return _(`INVALID_ARGS`,`find fill requires text`);let u=await s({token:r.token,session:i,command:`fill`,positionals:[t.ref,n],flags:t.actionFlags});return u.ok&&w(a,o,r,c,{ref:t.ref,action:`fill`},{flags:l}),u}async function K(e,t){let n=await J(e,t);return n.ok&&X(e,t,`focus`),n}async function q(e,t,n){let{req:r,device:i,logPath:a,session:o}=e;if(!n)return _(`INVALID_ARGS`,`find type requires text`);let s=await J(e,t);if(!s.ok)return s;let c=await h(i,`type`,[n],r.flags?.out,{...g(a,r.flags,o?.appBundleId,o?.trace?.outPath)});return X(e,t,`type`),{ok:!0,data:c??{ref:t.ref}}}async function J(t,n){let{req:r,device:i,logPath:a,session:o}=t,s=Y(n,`be focused`);if(s)return s;let c=n.resolvedNode.rect?e(n.resolvedNode.rect):null;return c?{ok:!0,data:await h(i,`focus`,[String(c.x),String(c.y)],r.flags?.out,{...g(a,r.flags,o?.appBundleId,o?.trace?.outPath)})??{ref:n.ref}}:_(`COMMAND_FAILED`,`matched element has no bounds`)}function Y(e,t){let n=[e.resolvedNode,e.node].find(o);return n?_(`COMMAND_FAILED`,`Matched element ${e.ref} is covered by another visible element and cannot ${t} safely`,{ref:`@${n.ref}`,interactionBlocked:n.interactionBlocked,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`}):null}function X(e,t,n){let{req:r,sessionStore:i,session:a,command:o,publicFlags:s}=e;w(i,a,r,o,{ref:t.ref,action:n},{flags:s})}function Z(e){return{...m(e)??{}}}function Q(e,t,n){let r=e.slice(0,8).map(e=>{let t=s(e)||e.label||e.identifier||e.type||``;return`@${e.ref}${t?`(${t})`:``}`});return _(`AMBIGUOUS_MATCH`,`find matched ${e.length} elements for ${t} "${n}". Use a more specific locator or selector.`,{locator:t,query:n,matches:e.length,candidates:r})}function $(e){return e!==`role`}export{T as handleFindCommands,l as parseFindArgs};
@@ -1,81 +1,2 @@
1
- declare const FIND_LOCATORS: readonly ['any', 'text', 'label', 'value', 'role', 'id'];
2
-
3
- declare type FindAction = {
4
- kind: 'click';
5
- } | {
6
- kind: 'focus';
7
- } | {
8
- kind: 'fill';
9
- value: string;
10
- } | {
11
- kind: 'type';
12
- value: string;
13
- } | {
14
- kind: 'get_text';
15
- } | {
16
- kind: 'get_attrs';
17
- } | {
18
- kind: 'exists';
19
- } | {
20
- kind: 'wait';
21
- timeoutMs?: number;
22
- };
23
-
24
- export declare function findBestMatchesByLocator(nodes: SnapshotNode[], locator: FindLocator, query: string, options?: boolean | FindMatchOptions): {
25
- matches: SnapshotNode[];
26
- score: number;
27
- };
28
-
29
- declare type FindLocator = (typeof FIND_LOCATORS)[number];
30
-
31
- export declare type FindMatchOptions = {
32
- requireRect?: boolean;
33
- };
34
-
35
- export declare function parseFindArgs(args: string[]): {
36
- locator: FindLocator;
37
- query: string;
38
- action: FindAction['kind'];
39
- value?: string;
40
- timeoutMs?: number;
41
- };
42
-
43
- declare type RawSnapshotNode = {
44
- index: number;
45
- type?: string;
46
- role?: string;
47
- subrole?: string;
48
- label?: string;
49
- value?: string;
50
- identifier?: string;
51
- rect?: Rect;
52
- enabled?: boolean;
53
- selected?: boolean;
54
- focused?: boolean;
55
- visibleToUser?: boolean;
56
- hittable?: boolean;
57
- depth?: number;
58
- parentIndex?: number;
59
- pid?: number;
60
- bundleId?: string;
61
- appName?: string;
62
- windowTitle?: string;
63
- surface?: string;
64
- hiddenContentAbove?: boolean;
65
- hiddenContentBelow?: boolean;
66
- interactionBlocked?: 'covered';
67
- presentationHints?: string[];
68
- };
69
-
70
- declare type Rect = {
71
- x: number;
72
- y: number;
73
- width: number;
74
- height: number;
75
- };
76
-
77
- declare type SnapshotNode = RawSnapshotNode & {
78
- ref: string;
79
- };
80
-
81
- export { }
1
+ import { i as parseFindArgs, n as findBestMatchesByLocator, t as FindMatchOptions } from "./sdk-finders.js";
2
+ export { FindMatchOptions, findBestMatchesByLocator, parseFindArgs };
@@ -1 +1 @@
1
- import{findBestMatchesByLocator as e}from"./587.js";function o(o,r,t,_){return e(o,r,t,"boolean"==typeof _?{requireRect:_}:_)}export{parseFindArgs}from"./587.js";export{o as findBestMatchesByLocator};
1
+ import{a as e,t}from"./sdk-finders.js";export{t as findBestMatchesByLocator,e as parseFindArgs};
@@ -1 +1 @@
1
- import{runCliCommandWithOutput as e,renderReplayTestResponse as r,writeCommandOutput as t}from"./cli.js";import{isNonDefaultResponseLevel as o}from"./6849.js";import{readCommandMessage as n}from"./2948.js";async function s({command:i,positionals:a,flags:_,client:p,debug:u,replayTestReporterRuntime:m}){let{result:d,cliOutput:c}=await e({client:p,command:i,positionals:a,flags:_});if(o(_.responseLevel))return t(_,d,()=>JSON.stringify(d,null,2)),!0;if(c){var f,l;f=_,l=c,!f.json&&l.stderr&&process.stderr.write(l.stderr),t(f,f.json?l.jsonData??l.data:l.data,()=>l.text)}else{let e=await function(e,o,s,i={}){return"test"===e?r({suite:s,debug:i.debug,verbose:o.verbose,json:o.json,reporter:o.reporter,reportJunit:o.reportJunit,reporterRuntime:i.replayTestReporterRuntime}):(t(o,s,()=>n(s)),0)}(i,_,d,{debug:u,replayTestReporterRuntime:m});0!==e&&process.exit(e)}return!0}export{s as runGenericClientBackedCommand};
1
+ import{a as e}from"./sdk-contracts.js";import{hn as t}from"./device-rotation.js";import{i as n,n as r}from"./cli-runner.js";async function i({command:t,positionals:i,flags:s,client:c,debug:l,replayTestReporterRuntime:u}){let{result:d,cliOutput:f}=await r({client:c,command:t,positionals:i,flags:s});if(e(s.responseLevel))return n(s,d,()=>JSON.stringify(d,null,2)),!0;if(f)o(s,f);else{let e=await a(t,s,d,{debug:l,replayTestReporterRuntime:u});e!==0&&process.exit(e)}return!0}function a(e,r,i,a={}){return e===`test`?import(`./reporting.js`).then(({renderReplayTestResponse:e})=>e({suite:i,debug:a.debug,verbose:r.verbose,json:r.json,reporter:r.reporter,reportJunit:r.reportJunit,reporterRuntime:a.replayTestReporterRuntime})):(n(r,i,()=>t(i)),0)}function o(e,t){!e.json&&t.stderr&&process.stderr.write(t.stderr),n(e,e.json?t.jsonData??t.data:t.data,()=>t.text)}export{i as runGenericClientBackedCommand};
@@ -1 +1 @@
1
- function o(o,s,i,n,t,l){s&&o.recordAction(s,{command:n,positionals:l?.positionals??i.positionals??[],flags:l?.flags??i.flags??{},result:t??{}})}export{o as recordSessionAction};
1
+ import"./internal/daemon.js";function e(e,t,n,r,i,a){t&&e.recordAction(t,{command:r,positionals:a?.positionals??n.positionals??[],flags:a?.flags??n.flags??{},result:i??{}})}export{e as t};
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./rolldown-runtime.js";import{F as t}from"./sdk-contracts.js";import{g as n,y as r}from"./sdk-android-adb.js";import{a as i,i as a,n as o}from"./tool-provider.js";import{createHash as s}from"node:crypto";import{existsSync as c,promises as l}from"node:fs";import u from"node:os";import d from"node:path";import{fileURLToPath as f}from"node:url";var p=e({quitMacOsApp:()=>N,resolveFrontmostMacOsApp:()=>M,resolveMacOsHelperPackageRootFrom:()=>x,runMacOsAlertAction:()=>F,runMacOsPermissionAction:()=>P,runMacOsPressAction:()=>R,runMacOsReadTextAction:()=>L,runMacOsScreenshotAction:()=>z,runMacOsSnapshotAction:()=>I,startMacOsAudioProbeProcess:()=>A});const m=`agent-device-macos-helper`,h=`AGENT_DEVICE_MACOS_HELPER_BIN`,g=d.join(u.homedir(),`.agent-device`,`macos-helper`,`current`),_=d.join(g,`manifest.json`),v=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function y(e){let n=e.trim();if(!v.test(n))throw new t(`INVALID_ARGS`,`macOS bundle id must use reverse-DNS form like com.example.App`,{bundleId:e});return n}function b(e,t){t.bundleId&&e.push(`--bundle-id`,y(t.bundleId)),t.surface&&e.push(`--surface`,t.surface)}function x(e){let n=d.dirname(e);for(;;){let e=d.join(n,`macos-helper`);if(c(d.join(e,`Package.swift`)))return e;let t=d.dirname(n);if(t===n)break;n=t}throw new t(`COMMAND_FAILED`,`Unable to locate macOS helper package root`,{modulePath:e})}function S(){return x(f(import.meta.url))}function C(){return d.join(S(),`.build`,`release`,m)}function w(){return d.join(g,m)}async function T(e){let t=await l.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=d.join(e,t.name);return t.isDirectory()?t.name===`.build`?[]:await T(n):!t.isFile()||!t.name.endsWith(`.swift`)&&t.name!==`Package.swift`?[]:[n]}))).flat().sort()}async function E(e){let t=await T(e),n=s(`sha256`);for(let r of t)n.update(d.relative(e,r)),n.update(`\0`),n.update(await l.readFile(r)),n.update(`\0`);let r=await i(`swift`,[`--version`],{allowFailure:!0,cwd:e,timeoutMs:1e4});return n.update(`swift-version`),n.update(`\0`),n.update(r.stdout||r.stderr||`exit:${r.exitCode}`),n.update(`\0`),n.digest(`hex`)}async function D(){try{let e=JSON.parse(await l.readFile(_,`utf8`));return typeof e.fingerprint==`string`?e.fingerprint:null}catch{return null}}async function O(){let e=await n(process.env[h],h);if(e)return e;let t=S(),r=await E(t),a=w();try{if(await D()===r)return await l.access(a),a}catch{}let o=C();process.stderr.write(`agent-device: building macOS helper (first run or helper update)
2
+ `),await i(`swift`,[`build`,`-c`,`release`,`--package-path`,t],{cwd:t,timeoutMs:12e4}),await l.mkdir(g,{recursive:!0});let s=`${a}.tmp`;return await l.copyFile(o,s),await l.rename(s,a),await l.chmod(a,493),await l.writeFile(_,`${JSON.stringify({fingerprint:r},null,2)}\n`,`utf8`),a}async function k(){let e=process.env[h]?.trim();if(e){let t=await n(e,h);if(t)return t}if(o())return m;if(process.platform!==`darwin`)throw new t(`UNSUPPORTED_PLATFORM`,`macOS helper is only available on macOS`);return await O()}async function A(e){return r(await k(),[`audio-probe`,`--duration-ms`,String(e.durationMs),`--bucket-ms`,String(e.bucketMs),`--out`,e.statusPath],{allowFailure:!0,captureOutput:!0})}async function j(e){let n={allowFailure:!0,timeoutMs:3e4},r=a().macosHelper,o=r?m:await k(),s=r?await r.run(e,n):await i(o,e,n),c=s.stdout.trim(),l=null;if(c)try{l=JSON.parse(c)}catch{l=null}if(s.exitCode===0&&l?.ok)return l.data;throw new t(`COMMAND_FAILED`,l&&!l.ok?l.error?.message??`macOS helper exited with code ${s.exitCode}`:c||s.stderr.trim()||`macOS helper exited with code ${s.exitCode}`,{helperPath:o,args:e,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,...l&&!l.ok?l.error?.details:{}})}async function M(){return await j([`app`,`frontmost`])}async function N(e){return await j([`app`,`quit`,`--bundle-id`,y(e)])}async function P(e,t){return await j([`permission`,e,t])}async function F(e,t={}){let n=[`alert`,e];return b(n,t),await j(n)}async function I(e,t={}){let n=[`snapshot`,`--surface`,e];return b(n,t),await j(n)}async function L(e,t,n={}){let r=[`read`,`--x`,String(e),`--y`,String(t)];return b(r,n),await j(r)}async function R(e,t,n={}){let r=[`press`,`--x`,String(e),`--y`,String(t)];return b(r,n),await j(r)}async function z(e,t={}){let n=[`screenshot`,`--out`,e];return b(n,t),t.fullscreen&&n.push(`--fullscreen`),await j(n)}export{P as a,A as c,F as i,N as n,z as o,M as r,I as s,p as t};
@@ -0,0 +1,2 @@
1
+ import{C as e,v as t}from"./sdk-android-adb.js";import{t as n}from"./timeouts.js";function r(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function i(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(-e,0),!0}catch(e){return e.code===`EPERM`}}function a(e){return s(e,`lstart=`)}function o(e){return s(e,`command=`)}function s(t,n){if(!Number.isInteger(t)||t<=0)return null;try{let r=e(`ps`,[`-p`,String(t),`-o`,n],{allowFailure:!0,timeoutMs:1e3});if(r.exitCode!==0)return null;let i=r.stdout.trim();return i.length>0?i:null}catch{return null}}function c(e){let t=[];for(let n of e.split(`
2
+ `)){let e=/^\s*(\d+)\s+(\d+)\s+(.+?)\s*$/.exec(n);if(!e)continue;let r=Number.parseInt(e[1],10),i=Number.parseInt(e[2],10),a=e[3];!Number.isInteger(r)||r<=0||t.push({pid:r,ppid:Number.isInteger(i)&&i>0?i:void 0,command:a})}return t}async function l(e){let n=await(e.runCommand??t)(`ps`,[`-ax`,`-o`,`pid=,ppid=,command=`],{allowFailure:!0,timeoutMs:e.timeoutMs});return n.exitCode===0?c(n.stdout):[]}function u(e,t){let n=new Set(d(e)),r=!0;for(;r;){r=!1;for(let e of t)e.ppid===void 0||!n.has(e.ppid)||n.has(e.pid)||(n.add(e.pid),r=!0)}return t.filter(e=>n.has(e.pid))}function d(e,t={}){return[...new Set(e)].filter(e=>Number.isInteger(e)&&e>0&&e!==t.excludePid)}function f(e,t){let n=d(e,{excludePid:process.pid}),r=0;for(let e of n)try{process.kill(e,t),r+=1}catch{}return r}async function p(e,t){if(!r(e))return!0;let i=Date.now();for(;Date.now()-i<t;)if(await n(50),!r(e))return!0;return!r(e)}async function m(e){let t=d(e.pids,{excludePid:process.pid});t.length!==0&&(f(t,`SIGTERM`),await Promise.all(t.map(async t=>await p(t,e.termTimeoutMs))),f(t.filter(e=>r(e)),`SIGKILL`),await Promise.all(t.map(async t=>await p(t,e.killTimeoutMs))))}export{o as a,m as c,l as i,d as l,r as n,a as o,i as r,f as s,u as t,p as u};