agent-device 0.20.8 → 0.20.10

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 (220) hide show
  1. package/README.md +94 -31
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.8.apk → agent-device-android-ime-helper-0.20.10.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.10.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.8.manifest.json → agent-device-android-ime-helper-0.20.10.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.8.apk → agent-device-android-snapshot-helper-0.20.10.apk} +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.8.manifest.json → agent-device-android-snapshot-helper-0.20.10.manifest.json} +6 -6
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +3 -0
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +13 -7
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +10 -117
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +4 -4
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +103 -2
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +22 -23
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +3 -23
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +10 -11
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +108 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +8 -5
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +179 -73
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +13 -12
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentation.swift +183 -0
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationTests.swift +0 -0
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +20 -18
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +19 -0
  24. package/dist/src/agent-browser-tool.js +1 -1
  25. package/dist/src/agent-device-client.js +2 -2
  26. package/dist/src/ai-sdk.d.ts +61 -0
  27. package/dist/src/ai-sdk.js +1 -0
  28. package/dist/src/android-adb.d.ts +6 -6
  29. package/dist/src/android-adb.js +1 -1
  30. package/dist/src/android.js +1 -1
  31. package/dist/src/app-helpers.js +1 -1
  32. package/dist/src/app-lifecycle.js +6 -7
  33. package/dist/src/app-lifecycle2.js +2 -2
  34. package/dist/src/app-log-reconnect.js +1 -1
  35. package/dist/src/app-log-runtime.js +3 -3
  36. package/dist/src/app-resolution.js +2 -2
  37. package/dist/src/app-state.js +2 -0
  38. package/dist/src/appearance.js +1 -0
  39. package/dist/src/apps.js +5 -5
  40. package/dist/src/artifacts.d.ts +1 -1
  41. package/dist/src/audio-probe.js +1 -1
  42. package/dist/src/auth-session.js +1 -1
  43. package/dist/src/backend-snapshot-options.js +1 -0
  44. package/dist/src/boot-diagnostics.js +2 -2
  45. package/dist/src/bounds.js +1 -0
  46. package/dist/src/byte-limit-stream.js +1 -0
  47. package/dist/src/cli-config.js +1 -1
  48. package/dist/src/cli-help.js +42 -30
  49. package/dist/src/cli-runner.js +1 -1
  50. package/dist/src/cli.js +7 -7
  51. package/dist/src/client-metro.js +1 -1
  52. package/dist/src/client-types.d.ts +1582 -0
  53. package/dist/src/command-catalog.js +1 -0
  54. package/dist/src/command-metadata.js +1 -1
  55. package/dist/src/command-schema.js +1 -1
  56. package/dist/src/command-surface.js +1 -1
  57. package/dist/src/command-tools.js +2 -0
  58. package/dist/src/config.js +1 -0
  59. package/dist/src/connection-runtime.js +1 -1
  60. package/dist/src/connection.js +3 -3
  61. package/dist/src/contracts.d.ts +1 -1
  62. package/dist/src/contracts.js +1 -1
  63. package/dist/src/daemon-shutdown-report.js +1 -1
  64. package/dist/src/daemon.js +1 -1
  65. package/dist/src/debug-symbols.js +3 -3
  66. package/dist/src/device-claim-inspection.js +1 -1
  67. package/dist/src/device-input-state.js +1 -1
  68. package/dist/src/device-ready.js +1 -1
  69. package/dist/src/device2.js +2 -2
  70. package/dist/src/dispatch.js +1 -1
  71. package/dist/src/entities.js +1 -1
  72. package/dist/src/find.js +1 -1
  73. package/dist/src/finders.js +1 -1
  74. package/dist/src/generic-settle.js +1 -1
  75. package/dist/src/generic.js +1 -1
  76. package/dist/src/harmonyos.js +1 -1
  77. package/dist/src/hdc.js +1 -1
  78. package/dist/src/helper-package-install.js +1 -0
  79. package/dist/src/helper.js +2 -2
  80. package/dist/src/host-process.js +1 -1
  81. package/dist/src/ime-lifecycle.js +2 -9
  82. package/dist/src/ime-recovery-marker.js +1 -0
  83. package/dist/src/index.d.ts +2 -1569
  84. package/dist/src/index.js +1 -1
  85. package/dist/src/input-actions.js +4 -4
  86. package/dist/src/input-actions2.js +1 -1
  87. package/dist/src/install-artifact.js +1 -1
  88. package/dist/src/install-artifact2.js +1 -1
  89. package/dist/src/install-source2.js +1 -1
  90. package/dist/src/interaction-common.js +1 -0
  91. package/dist/src/interaction-runtime.js +1 -1
  92. package/dist/src/interaction-snapshot.js +1 -1
  93. package/dist/src/interaction.js +1 -1
  94. package/dist/src/interaction2.js +1 -0
  95. package/dist/src/interactor.js +2 -2
  96. package/dist/src/interactor2.js +1 -1
  97. package/dist/src/interactors.js +1 -0
  98. package/dist/src/internal/bin.js +2 -2
  99. package/dist/src/internal/daemon.js +4 -7
  100. package/dist/src/internal/png-worker.js +1 -1
  101. package/dist/src/inventory.js +1 -1
  102. package/dist/src/keyed-lock.js +1 -0
  103. package/dist/src/lease-context.js +1 -1
  104. package/dist/src/lease.js +1 -1
  105. package/dist/src/limrun-runtime-dependencies.js +1 -1
  106. package/dist/src/limrun.d.ts +13 -3
  107. package/dist/src/limrun.js +1 -1
  108. package/dist/src/linux.js +1 -1
  109. package/dist/src/location-coordinates.js +1 -0
  110. package/dist/src/logcat.js +1 -1
  111. package/dist/src/manifest.js +1 -1
  112. package/dist/src/mobile-snapshot-semantics.js +1 -0
  113. package/dist/src/observability.js +1 -0
  114. package/dist/src/owner-identity.js +1 -1
  115. package/dist/src/perf.js +4 -0
  116. package/dist/src/physical-device-control.js +1 -1
  117. package/dist/src/platform-runtime-app-log-process.js +1 -1
  118. package/dist/src/platform-runtime-host.js +1 -1
  119. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  120. package/dist/src/platform-runtime-open-target.js +1 -0
  121. package/dist/src/platform-runtime-operation-host.js +4 -4
  122. package/dist/src/platform-runtime-runtime-hints.js +2 -0
  123. package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
  124. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  125. package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
  126. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  127. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  128. package/dist/src/platform-runtime.js +1 -1
  129. package/dist/src/platform-runtime2.js +1 -0
  130. package/dist/src/plist.js +1 -1
  131. package/dist/src/png-resize.js +1 -0
  132. package/dist/src/png-worker-contract.js +1 -1
  133. package/dist/src/process-lock.js +1 -1
  134. package/dist/src/project-runtime.js +1 -0
  135. package/dist/src/provider-webdriver.js +1 -1
  136. package/dist/src/provider.js +1 -0
  137. package/dist/src/proxy.js +1 -1
  138. package/dist/src/react-native.js +1 -1
  139. package/dist/src/record-runtime.js +1 -1
  140. package/dist/src/record-trace.js +1 -1
  141. package/dist/src/recording-export-quality.js +1 -0
  142. package/dist/src/registry.js +29 -26
  143. package/dist/src/remote-config2.js +1 -1
  144. package/dist/src/replay.js +2 -2
  145. package/dist/src/reporting.js +5 -5
  146. package/dist/src/rolldown-runtime.js +1 -0
  147. package/dist/src/runner-client.js +1 -0
  148. package/dist/src/runner-disposal.js +1 -1
  149. package/dist/src/runner-lease.js +1 -1
  150. package/dist/src/runner-sequence.js +1 -1
  151. package/dist/src/runtime-transport.js +1 -1
  152. package/dist/src/runtime.js +3 -3
  153. package/dist/src/runtime2.js +4 -3
  154. package/dist/src/runtime3.js +1 -3
  155. package/dist/src/runtime4.js +3 -1
  156. package/dist/src/runtime5.js +1 -1
  157. package/dist/src/runtime6.js +1 -1
  158. package/dist/src/runtime7.js +1 -1
  159. package/dist/src/runtime8.js +1 -0
  160. package/dist/src/runtime9.js +1 -0
  161. package/dist/src/scoped-provider.js +1 -0
  162. package/dist/src/screenshot-density.js +1 -0
  163. package/dist/src/screenshot-result.js +4 -4
  164. package/dist/src/screenshot.js +1 -1
  165. package/dist/src/script-source-bundle.js +16 -0
  166. package/dist/src/sdk-android-adb.d.ts +44 -26
  167. package/dist/src/sdk-android-adb.js +4 -4
  168. package/dist/src/sdk-batch-runner.js +3 -3
  169. package/dist/src/sdk-contracts.d.ts +125 -88
  170. package/dist/src/sdk-contracts.js +2 -2
  171. package/dist/src/sdk-device.js +1 -1
  172. package/dist/src/sdk-finders.d.ts +1 -1
  173. package/dist/src/sdk-finders.js +1 -1
  174. package/dist/src/sdk-io.js +1 -1
  175. package/dist/src/sdk-remote-config.js +1 -1
  176. package/dist/src/sdk-selectors.d.ts +107 -95
  177. package/dist/src/sdk-selectors.js +1 -1
  178. package/dist/src/sdk.js +1 -0
  179. package/dist/src/selector-runtime.js +1 -1
  180. package/dist/src/selectors.d.ts +1 -1
  181. package/dist/src/selectors.js +1 -1
  182. package/dist/src/server.js +10 -3
  183. package/dist/src/session-target-evidence.js +1 -1
  184. package/dist/src/session.js +1 -30
  185. package/dist/src/session2.js +27 -0
  186. package/dist/src/setting-state.js +1 -1
  187. package/dist/src/shared.js +1 -1
  188. package/dist/src/simctl.js +1 -0
  189. package/dist/src/simulator-state.js +1 -0
  190. package/dist/src/simulator.js +1 -1
  191. package/dist/src/snapshot-runtime.js +1 -1
  192. package/dist/src/snapshot-scope.js +1 -0
  193. package/dist/src/snapshot-session.js +1 -1
  194. package/dist/src/snapshot.js +8 -1
  195. package/dist/src/snapshot2.js +1 -1
  196. package/dist/src/snapshot3.js +1 -0
  197. package/dist/src/src.js +1 -1
  198. package/dist/src/src2.js +1 -2
  199. package/dist/src/src3.js +2 -1
  200. package/dist/src/src4.js +1 -0
  201. package/dist/src/string-enum.js +1 -0
  202. package/dist/src/tool-provider.js +3 -3
  203. package/dist/src/tool-provider2.js +1 -1
  204. package/dist/src/tool-provider3.js +1 -1
  205. package/dist/src/update-check.js +1 -1
  206. package/dist/src/verdict.js +1 -0
  207. package/dist/src/verified-file.js +1 -0
  208. package/dist/src/version.js +1 -1
  209. package/dist/src/video.js +1 -1
  210. package/dist/src/web.js +1 -1
  211. package/package.json +27 -10
  212. package/server.json +3 -3
  213. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.8.apk.sha256 +0 -1
  214. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.8.apk.sha256 +0 -1
  215. package/dist/src/interaction-touch-reference-frame.js +0 -1
  216. package/dist/src/notifications.js +0 -1
  217. package/dist/src/platform-runtime-toolchain-host.js +0 -1
  218. package/dist/src/prepare-kind.js +0 -15
  219. package/dist/src/selector-vocabulary.js +0 -1
  220. package/dist/src/text-surface.js +0 -1
package/dist/src/index.js CHANGED
@@ -1 +1 @@
1
- import{_ as e,b as t,u as n,x as r}from"./sdk-contracts.js";import{n as i}from"./agent-device-client.js";import{t as a}from"./sdk-io.js";export{e as AppError,n as centerOfRect,i as createAgentDeviceClient,a as createLocalArtifactAdapter,t as isAgentDeviceError,r as normalizeAgentDeviceError};
1
+ import{C as e,T as t,_ as n,u as r}from"./sdk-contracts.js";import{n as i}from"./agent-device-client.js";import{t as a}from"./sdk-io.js";export{n as AppError,r as centerOfRect,i as createAgentDeviceClient,a as createLocalArtifactAdapter,e as isAgentDeviceError,t as normalizeAgentDeviceError};
@@ -1,4 +1,4 @@
1
- import{o as e}from"./png-worker-contract.js";import{_ as t}from"./sdk-contracts.js";import{L as n,R as r,T as i,at as a,z as o}from"./version.js";import{rt as s}from"./sdk-batch-runner.js";import{n as c}from"./device.js";import{I as l,c as u,f as d,j as f,l as p,o as m,s as ee}from"./sdk-android-adb.js";import{n as te}from"./shell-quote.js";import{t as h}from"./timeouts.js";import{i as g}from"./install-artifact.js";import{r as _}from"./device-input-state.js";import{C as ne,D as v,E as re,O as ie,S as ae,T as oe,_ as se,b as ce,c as le,d as y,g as ue,l as b,r as de,u as x,w as fe,y as S}from"./ime-lifecycle.js";function pe(e,t){if(!t)return{expected:e,actual:null,failureReason:`text_mismatch`,targetInput:null,actualInput:null};let n=ge(t),r={failureReason:t.reason??`text_mismatch`,targetInput:w(t.targetInput),actualInput:w(t.actualInput)};return n?{...r,expectedLength:Array.from(e).length,actual:null,masked:!0,actualLength:Array.from(t.actual??``).length}:{...r,expected:e,actual:t.actual}}function C(e){return e?e.password?!0:me(e.text):!1}function me(e){return e?Array.from(e).every(he):!1}function w(e){if(!e)return null;let t=C(e);return{...e,text:t?null:e.text,...t?{textRedacted:!0}:{}}}function he(e){return e===`•`||e===`*`||e===`●`}function ge(e){return e.masked===!0||C(e.targetInput)||C(e.actualInput)}async function T(e,t,n,r){let i=[0,150,350],a=null,o=null,s=await A(e);for(let c of i){c>0&&await h(c);let i=await we(e,t,n,r,s);if(a=i,i.reason===`ime_capture`)return i;o=i.ok?i:null}return o??a??{ok:!1,actual:null,reason:`text_mismatch`,targetInput:null,actualInput:null}}async function _e(e,t,n){return xe(await y(e),t,n)}async function ve(e,t,n){let r=await A(e);return O(await y(e),t,n,r).targetInput}async function ye(e,t,n){try{return await ve(e,t,n)}catch(e){return f({level:`warn`,phase:`android_fill_pre_action_target_capture_failed`,data:{error:e instanceof Error?e.message:String(e)}}),null}}function E(e,n,r){if(r?.ok)return;let i=r?D(e,n,r):null;if(i)return i;throw new t(`COMMAND_FAILED`,Se(r),Ce(e,r))}function D(e,t,n){let r=n.targetInput,i=n.actualInput;if(n.reason===`ime_capture`||!t||!r||!i||C(t)||C(r)||C(i)||!M(t,r)||!M(t,i)||t.text===n.actual)return null;let a=Ie(t);return f({level:`warn`,phase:`android_fill_verification_unconfirmed`,data:{target:a}}),{verification:`unconfirmed`,requested:e,before:t.text,after:n.actual,target:a}}function be(e,t,n,r,i={}){let a=O(e,t,n,i);return Te(a)?{ok:!1,actual:a.actualInput?.text??null,reason:`ime_capture`,targetInput:a.targetInput,actualInput:a.actualInput}:Ee(a,r)??De(a,r)}function xe(e,t,n){return O(e,t,n).targetInput?.text??null}function Se(e){return e?.reason===`ime_capture`?`Android fill input was captured by the active keyboard instead of the app field`:e?.reason===`masked_unverified`?`Android fill verification could not confirm masked text value`:`Android fill verification failed`}function Ce(e,t){let n=pe(e,t);return t?.reason===`ime_capture`&&(n.hint=`The focused input belongs to the Android keyboard/IME, not the app field. Disable handwriting/stylus input or switch to a standard IME, then retry fill.`),n}async function we(e,t,n,r,i){return be(await y(e),t,n,r,i)}function O(e,t,n,r={}){let i={focusedEdit:null,editAtPoint:null,anyAtPoint:null};for(let a of ie(e)){let e=Ae(a,r);e&&je(i,e,t,n)}return Ne(i)}function Te(e){let{targetInput:t,actualInput:n}=e;return!t||!n||n===t?!1:n.inputMethodOwned&&!t.inputMethodOwned}function Ee(e,t){let n=e.actualInput;if(!n||!Fe(n))return null;let r=n.text??null,i=Array.from(r??``).length,a=Array.from(t).length,o=r!==null&&i>0&&a>0&&i===a;return{ok:o,actual:r,reason:o?void 0:`masked_unverified`,masked:!0,targetInput:e.targetInput,actualInput:n}}function De(e,t){let n=e.actualInput?.text??null;return{ok:Oe(n,t),actual:n,reason:`text_mismatch`,targetInput:e.targetInput,actualInput:e.actualInput}}function Oe(e,t){if(e===t)return!0;let n=k(e),r=k(t);return!n||!r?!1:!!(n===r||ke(n,r))}function k(e){return(e??``).replace(/\s+/g,` `).trim()}function ke(e,t){if(e.length!==t.length||e.length===0||e.slice(1)!==t.slice(1))return!1;let n=e[0],r=t[0];return!n||!r?!1:r.toLowerCase()===r&&n===r.toUpperCase()}function Ae(e,t){if(!e.rect)return null;let n=e.text??``,r=Math.max(1,e.rect.width*e.rect.height);return{text:n||null,className:e.className,resourceId:e.resourceId,packageName:e.packageName,rect:e.rect,focused:e.focused??!1,password:e.password===!0,inputMethodOwned:s({packageName:e.packageName,resourceId:e.resourceId,activeInputMethodPackage:t.activeInputMethodPackage}),area:r,editText:Pe(e.className??``)}}async function A(e){try{return{activeInputMethodPackage:(await _(e)).inputMethodPackage}}catch(e){return f({level:`warn`,phase:`android_fill_verification_input_method_probe_failed`,data:{error:e instanceof Error?e.message:String(e)}}),{}}}function je(e,t,n,r){let i=Me(t.rect,n,r);if(i&&t.editText&&(e.editAtPoint=j(e.editAtPoint,t)),t.focused&&t.editText){e.focusedEdit=j(e.focusedEdit,t);return}i&&t.text&&(e.anyAtPoint=j(e.anyAtPoint,t))}function Me(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function j(e,t){return e&&e.area<t.area?e:t}function Ne(e){let t=e.editAtPoint??e.anyAtPoint;return{targetInput:t,actualInput:(e.focusedEdit?.text?e.focusedEdit:null)??t}}function Pe(e){let t=e.toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)}function Fe(e){return C(e)}function M(e,t){return e.resourceId||t.resourceId?e.resourceId===t.resourceId&&e.packageName===t.packageName:e.className===t.className&&e.packageName===t.packageName&&e.rect.x===t.rect.x&&e.rect.y===t.rect.y&&e.rect.width===t.rect.width&&e.rect.height===t.rect.height}function Ie(e){return{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:e.rect}}function N(e){if(!Number.isFinite(e.x)||!Number.isFinite(e.y)||!Number.isFinite(e.width)||!Number.isFinite(e.height)||e.width<=0||e.height<=0)throw new t(`COMMAND_FAILED`,`Android helper returned an invalid gesture viewport`);return e}const P=45e3,F=`ANDROID_TOUCH_HELPER_NO_FINAL_RESULT`,I=`ANDROID_TOUCH_HELPER_REPORTED_FAILURE`;async function Le(e,t){let n=await R(e),r=Be(t),i=Math.max(45e3,r.durationMs+15e3),a=Buffer.from(JSON.stringify({protocol:`android-touch-plan-v1`,...r})).toString(`base64`),o=await l(`android_touch_helper_gesture`,async()=>{let e=await S({deviceKey:n.deviceKey,action:`gesture`,helper:L(n.artifact),payloadBase64:a,timeoutMs:i});return e?{...B(e),helperTransport:`persistent-session`}:{...await z({adb:n.adb,runner:n.artifact.manifest.instrumentationRunner,extraArgs:[`-e`,`mode`,`gesture`,`-e`,`payloadBase64`,a],timeoutMs:i,readResult:B}),helperTransport:`instrumentation`}},{packageName:n.artifact.manifest.packageName,version:n.artifact.manifest.version});return{backend:`android-helper`,helperVersion:n.artifact.manifest.version,installReason:n.install.reason,...o}}async function Re(e){let t=await R(e);try{let e=await S({deviceKey:t.deviceKey,action:`viewport`,helper:L(t.artifact),timeoutMs:P});if(e)return V(e)}catch(e){await ce(t.deviceKey),f({level:`warn`,phase:`android_touch_helper_viewport_session_fallback`,data:{reason:e instanceof Error?e.message:String(e)}})}return await z({adb:t.adb,runner:t.artifact.manifest.instrumentationRunner,extraArgs:[`-e`,`mode`,`viewport`],timeoutMs:P,readResult:V})}function L(e){return{packageName:e.manifest.packageName,runner:e.manifest.instrumentationRunner,helperVersion:e.manifest.version,helperVersionCode:e.manifest.versionCode,sha256:e.manifest.sha256}}async function R(e){let t=ee(e),n=t.snapshotHelperArtifact??await ze(),r=ae(e);await ne({deviceKey:r,adb:t.exec});let i=await l(`android_touch_helper_install`,async()=>await ue({adb:t.exec,adbProvider:t,artifact:n,deviceKey:r,timeoutMs:3e4}),{packageName:n.manifest.packageName,versionCode:n.manifest.versionCode});return f({phase:`android_touch_helper_install_decision`,data:i}),i.installed&&await ce(r),{adb:t.exec,artifact:n,install:i,deviceKey:r}}async function ze(){return await se({helperDirName:`snapshot-helper`,manifestFileName:e=>`agent-device-android-snapshot-helper-${e}.manifest.json`,parseManifest:e=>{let t=fe(e);return{...t,assetName:t.assetName??`agent-device-android-snapshot-helper-${t.version}.apk`}},unavailableMessage:`Android touch gestures require the bundled Android automation helper artifact, but it was not found or could not be read`})}function Be(e){return{kind:e.topology===`single`?`swipe`:`transform`,durationMs:e.durationMs,pointers:e.pointers.map(Ve)}}function Ve(e){return{pointerId:e.pointerId,samples:e.samples.map(({offsetMs:e,point:t})=>({offsetMs:e,x:t.x,y:t.y}))}}async function z(e){let n=await e.adb([`shell`,`am`,`instrument`,`-w`,...e.extraArgs,e.runner],{allowFailure:!0,timeoutMs:e.timeoutMs}),r;try{r=He(`${n.stdout}\n${n.stderr}`)}catch(e){if(e instanceof t){if(e.code===I)throw new t(`COMMAND_FAILED`,e.message,e.details,e);if(e.code!==F)throw e}throw new t(`COMMAND_FAILED`,n.exitCode===0?`Android automation helper output could not be parsed`:`Android automation helper failed before returning parseable output`,d(n),e)}if(n.exitCode!==0)throw new t(`COMMAND_FAILED`,`Android automation helper failed`,d(n,{helper:r}));return e.readResult(r)}function He(e){let n=re(e).results.find(e=>e.agentDeviceProtocol===oe);if(!n)throw new t(F,`Android automation helper did not return a final result`);if(n.ok!==`true`)throw new t(I,n.message&&n.message!==`null`?n.message:n.errorType||`Android automation helper returned an error`,{errorType:n.errorType,helper:n});return n}function B(e){return{helperKind:e.kind,helperApiVersion:e.helperApiVersion,injectedEvents:v(e.injectedEvents),elapsedMs:v(e.elapsedMs)}}function V(e){let n=v(e.x),r=v(e.y),i=v(e.width),a=v(e.height);if(n===void 0||r===void 0||i===void 0||a===void 0)throw new t(`COMMAND_FAILED`,`Android helper returned an invalid gesture viewport`);return N({x:n,y:r,width:i,height:a})}function Ue(e){if(e.topology===`two`||e.intent===`longPress`)return e;let[{pointerId:t,samples:n}]=e.pointers,i=[...new Set([...o(e.durationMs,`android`),...n.map(({offsetMs:e})=>e)])].sort((e,t)=>e-t),a=0,s=i.map(e=>{for(;a<n.length-2&&e>n[a+1].offsetMs;)a+=1;let t=n[a],i=n[a+1],o=i.offsetMs-t.offsetMs;return{offsetMs:e,point:e===i.offsetMs||o===0?i.point:r(t.point,i.point,(e-t.offsetMs)/o)}}),c=[s[0],s[1],s[2],...s.slice(3)];return{...e,pointers:[{pointerId:t,samples:c}]}}async function H(e,t){let n=Ue(t),r=p(e);if(r){let e=n.intent===`longPress`?{...n,viewport:N(await r.gestureViewport())}:n;return{backend:`provider-native-touch`,...await r.touch(e)??{}}}return await Le(e,n)}async function U(e){let t=p(e);return t?N(await t.gestureViewport()):await Re(e)}var We=e({appSwitcherAndroid:()=>Y,backAndroid:()=>K,fillAndroid:()=>Je,focusAndroid:()=>X,getAndroidScreenSize:()=>Z,homeAndroid:()=>q,longPressAndroid:()=>Ke,pressAndroid:()=>W,pressAndroidEnter:()=>Ge,pressAndroidTvRemote:()=>G,readAndroidTextAtPoint:()=>_e,scrollAndroid:()=>Ze,setAndroidOrientation:()=>J,typeAndroid:()=>qe});async function W(e,t,n){await g(e,[`shell`,`input`,`tap`,String(t),String(n)])}async function G(e,t,n){let r=i(t);await g(e,[`shell`,`input`,...n&&n>0?[`keyevent`,`--longpress`]:[`keyevent`],r])}async function K(e){await g(e,[`shell`,`input`,`keyevent`,`4`])}async function q(e){await g(e,[`shell`,`input`,`keyevent`,`3`])}async function Ge(e){await g(e,[`shell`,`input`,`keyevent`,`ENTER`])}async function J(e,t){let n=Qe(t);await g(e,[`shell`,`settings`,`put`,`system`,`accelerometer_rotation`,`0`]),await g(e,[`shell`,`settings`,`put`,`system`,`user_rotation`,n])}async function Y(e){await g(e,[`shell`,`input`,`keyevent`,`187`])}async function Ke(e,t,n,r=800){let i={x:t,y:n};return await H(e,{topology:`single`,intent:`longPress`,durationMs:r,pointers:[{pointerId:0,samples:[{offsetMs:0,point:i},{offsetMs:r,point:i}]}]})}async function qe(e,t,n=0){let r=u(e);if(r){await r({action:`type`,text:t,delayMs:n}),$(`type`,`provider-native`,t);return}if(de(e)){await Ye(e,t,n);return}if(nt(t),await $e(e,`type`),n>0&&Array.from(t).length>1){await Q(e,{action:`type`,text:t,chunkSize:1,delayMs:n});return}await Q(e,{action:`type`,text:t,chunkSize:et,delayMs:0})}async function X(e,t,n){await W(e,t,n)}async function Je(e,t,n,r,i=0){let a=await ye(e,t,n),o=u(e);if(o)return await o({action:`fill`,target:{x:t,y:n},text:r,delayMs:i}),$(`fill`,`provider-native`,r),E(r,a,await T(e,t,n,r));if(de(e))return E(r,a,await Xe(e,t,n,r,a));nt(r);let s=Array.from(r).length,c=[{clearPadding:12,minClear:8,maxClear:48,chunkSize:i>0?1:et,inputDelayMs:i},{clearPadding:24,minClear:16,maxClear:96,chunkSize:i>0?1:4,inputDelayMs:i>0?i:15}],l=null;for(let i of c){await X(e,t,n),await $e(e,`fill`),await ct(e,lt(s+i.clearPadding,i.minClear,i.maxClear)),await Q(e,{action:`fill`,text:r,chunkSize:i.chunkSize,delayMs:i.inputDelayMs});let o=await T(e,t,n,r);if(l=o,o.ok)return;if(o.reason===`ime_capture`)return E(r,a,o);let c=D(r,a,o);if(c)return c}return E(r,a,l)}async function Ye(e,t,n){let r=m(e),i=(await b()).manifest.packageName,a=t.split(`
2
- `);for(let[t,o]of a.entries()){let s=n>0?st(o,1):[o];for(let[e,o]of s.entries())o&&await x(r,i,o),n>0&&(e+1<s.length||t+1<a.length)&&await h(n);t+1<a.length&&await g(e,[`shell`,`input`,`keyevent`,`ENTER`])}$(`type`,`test-ime`,t)}async function Xe(e,t,n,r,i){let a=m(e),o=(await b()).manifest.packageName,s=null;for(let c=0;c<2;c+=1){await X(e,t,n),await le(a,o),r&&await x(a,o,r);let c=await T(e,t,n,r);if(s=c,c.ok||D(r,i,c))break}return $(`fill`,`test-ime`,r),s}async function Ze(e,t,r){let i=await U(e),o=a({direction:t,amount:r?.amount,pixels:r?.pixels,referenceWidth:i.width,referenceHeight:i.height}),s={...o,referenceWidth:i.x+i.width,referenceHeight:i.y+i.height,x1:i.x+o.x1,y1:i.y+o.y1,x2:i.x+o.x2,y2:i.y+o.y2},c=Math.max(r?.durationMs??300,16),l=await H(e,n({intent:`pan`,origin:{x:s.x1,y:s.y1},delta:{x:s.x2-s.x1,y:s.y2-s.y1},durationMs:c},i,`android`));return{...s,...r?.durationMs===void 0?{}:{durationMs:c},...l}}function Qe(e){let n=c[e];if(n===void 0)throw new t(`INVALID_ARGS`,`Unsupported Android rotation: ${e}`);return String(n)}async function $e(e,n){let r;try{r=await _(e)}catch(e){f({level:`warn`,phase:`android_input_ownership_probe_failed`,data:{action:n,error:e instanceof Error?e.message:String(e)}});return}if(r.inputOwner===`ime`)throw new t(`COMMAND_FAILED`,`KEYBOARD_OVERLAY_BLOCKING: Android text input is blocked because the focused input belongs to the active keyboard/IME.`,{failureReason:`ime_capture`,action:n,inputOwner:r.inputOwner,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,nextAction:`Focused input appears to be owned by the keyboard/IME; dismiss or change the IME before retrying text entry.`})}async function Z(e){let n=(await g(e,[`shell`,`wm`,`size`])).stdout.match(/Physical size:\s*(\d+)x(\d+)/);if(!n)throw new t(`COMMAND_FAILED`,`Unable to read screen size`);return{width:Number(n[1]),height:Number(n[2])}}const et=8;async function Q(e,t){let n=t.text.split(`
3
- `);for(let[r,i]of n.entries()){let a=st(i,t.chunkSize);for(let[i,o]of a.entries())await tt(e,o),t.delayMs>0&&(i+1<a.length||r+1<n.length)&&await h(t.delayMs);r+1<n.length&&await g(e,[`shell`,`input`,`keyevent`,`ENTER`])}$(t.action,`adb-shell`,t.text)}async function tt(e,t){if(t)try{await g(e,[`shell`,`input`,`text`,te(it(t))])}catch(e){throw at(e)?ot(t,e):e}}function nt(e){if(!rt(e))throw ot(e)}function rt(e){for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&t!==`
4
- `&&(e<32||e>126))return!1}return!0}function it(e){return e.replace(/ /g,`%s`)}function at(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=e.details?.stderr,r=(typeof n==`string`?n:``).toLowerCase();return!!(r.includes(`exception occurred while executing 'text'`)||r.includes(`nullpointerexception`)&&r.includes(`inputshellcommand.sendtext`))}function ot(e,n){return new t(`COMMAND_FAILED`,"Android text input requires provider-native text injection or the bundled test IME helper for non-ASCII/control characters; the adb-shell fallback supports ASCII text only. On emulators the test IME activates automatically; on real devices pass `open --test-ime` to enable it (see `agent-device doctor` for the current IME state).",{backend:`adb-shell`,textLength:Array.from(e).length,textPreview:e.slice(0,32)},n instanceof Error?n:void 0)}function st(e,t){let n=Math.max(1,Math.floor(t)),r=[],i=Array.from(e);for(let e=0;e<i.length;e+=n)r.push(i.slice(e,e+n).join(``));return r.length>0?r:[``]}function $(e,t,n){f({phase:`android_text_injection`,data:{action:e,backend:t,textLength:Array.from(n).length}})}async function ct(e,t){let n=Math.max(0,t);await g(e,[`shell`,`input`,`keyevent`,`KEYCODE_MOVE_END`],{allowFailure:!0});for(let t=0;t<n;t+=24){let r=Math.min(24,n-t);await g(e,[`shell`,`input`,`keyevent`,...Array(r).fill(`KEYCODE_DEL`)],{allowFailure:!0})}}function lt(e,t,n){return Math.max(t,Math.min(n,e))}export{Z as a,Ke as c,Ze as d,J as f,U as h,X as i,W as l,H as m,K as n,q as o,qe as p,Je as r,We as s,Y as t,G as u};
1
+ import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{Wt as n}from"./sdk-batch-runner.js";import{_ as r,a as i,v as a,y as o,z as s}from"./interaction.js";import{n as c}from"./device.js";import{A as l,F as u,c as d,f,l as ee,o as p,s as m}from"./sdk-android-adb.js";import{n as te}from"./shell-quote.js";import{t as h}from"./timeouts.js";import{g}from"./app-lifecycle.js";import{r as _}from"./device-input-state.js";import{c as v,d as ne,f as re,h as ie,l as ae,m as oe,o as se,p as ce,t as y}from"./snapshot.js";import{a as le,d as b,r as ue}from"./helper-package-install.js";import{a as de,c as x,r as S,s as C}from"./ime-lifecycle.js";function fe(e,t){if(!t)return{expected:e,actual:null,failureReason:`text_mismatch`,targetInput:null,actualInput:null};let n=he(t),r={failureReason:t.reason??`text_mismatch`,targetInput:T(t.targetInput),actualInput:T(t.actualInput)};return n?{...r,expectedLength:Array.from(e).length,actual:null,masked:!0,actualLength:Array.from(t.actual??``).length}:{...r,expected:e,actual:t.actual}}function w(e){return e?e.password?!0:pe(e.text):!1}function pe(e){return e?Array.from(e).every(me):!1}function T(e){if(!e)return null;let t=w(e);return{...e,text:t?null:e.text,...t?{textRedacted:!0}:{}}}function me(e){return e===`•`||e===`*`||e===`●`}function he(e){return e.masked===!0||w(e.targetInput)||w(e.actualInput)}async function E(e,t,n,r){let i=[0,150,350],a=null,o=null,s=await j(e);for(let c of i){c>0&&await h(c);let i=await Ce(e,t,n,r,s);if(a=i,i.reason===`ime_capture`)return i;o=i.ok?i:null}return o??a??{ok:!1,actual:null,reason:`text_mismatch`,targetInput:null,actualInput:null}}async function ge(e,t,n){return be(await y(e),t,n)}async function _e(e,t,n){let r=await j(e);return k(await y(e),t,n,r).targetInput}async function ve(e,t,n){try{return await _e(e,t,n)}catch(e){return l({level:`warn`,phase:`android_fill_pre_action_target_capture_failed`,data:{error:e instanceof Error?e.message:String(e)}}),null}}function D(e,n,r){if(r?.ok)return;let i=r?O(e,n,r):null;if(i)return i;throw new t(`COMMAND_FAILED`,xe(r),Se(e,r))}function O(e,t,n){let r=n.targetInput,i=n.actualInput;if(n.reason===`ime_capture`||!t||!r||!i||w(t)||w(r)||w(i)||!N(t,r)||!N(t,i)||t.text===n.actual)return null;let a=Fe(t);return l({level:`warn`,phase:`android_fill_verification_unconfirmed`,data:{target:a}}),{verification:`unconfirmed`,requested:e,before:t.text,after:n.actual,target:a}}function ye(e,t,n,r,i={}){let a=k(e,t,n,i);return we(a)?{ok:!1,actual:a.actualInput?.text??null,reason:`ime_capture`,targetInput:a.targetInput,actualInput:a.actualInput}:Te(a,r)??Ee(a,r)}function be(e,t,n){return k(e,t,n).targetInput?.text??null}function xe(e){return e?.reason===`ime_capture`?`Android fill input was captured by the active keyboard instead of the app field`:e?.reason===`masked_unverified`?`Android fill verification could not confirm masked text value`:`Android fill verification failed`}function Se(e,t){let n=fe(e,t);return t?.reason===`ime_capture`&&(n.hint=`The focused input belongs to the Android keyboard/IME, not the app field. Disable handwriting/stylus input or switch to a standard IME, then retry fill.`),n}async function Ce(e,t,n,r,i){return ye(await y(e),t,n,r,i)}function k(e,t,n,r={}){let i={focusedEdit:null,editAtPoint:null,anyAtPoint:null};for(let a of ie(e)){let e=ke(a,r);e&&Ae(i,e,t,n)}return Me(i)}function we(e){let{targetInput:t,actualInput:n}=e;return!t||!n||n===t?!1:n.inputMethodOwned&&!t.inputMethodOwned}function Te(e,t){let n=e.actualInput;if(!n||!Pe(n))return null;let r=n.text??null,i=Array.from(r??``).length,a=Array.from(t).length,o=r!==null&&i>0&&a>0&&i===a;return{ok:o,actual:r,reason:o?void 0:`masked_unverified`,masked:!0,targetInput:e.targetInput,actualInput:n}}function Ee(e,t){let n=e.actualInput?.text??null;return{ok:De(n,t),actual:n,reason:`text_mismatch`,targetInput:e.targetInput,actualInput:e.actualInput}}function De(e,t){if(e===t)return!0;let n=A(e),r=A(t);return!n||!r?!1:!!(n===r||Oe(n,r))}function A(e){return(e??``).replace(/\s+/g,` `).trim()}function Oe(e,t){if(e.length!==t.length||e.length===0||e.slice(1)!==t.slice(1))return!1;let n=e[0],r=t[0];return!n||!r?!1:r.toLowerCase()===r&&n===r.toUpperCase()}function ke(e,t){if(!e.rect)return null;let r=e.text??``,i=Math.max(1,e.rect.width*e.rect.height);return{text:r||null,className:e.className,resourceId:e.resourceId,packageName:e.packageName,rect:e.rect,focused:e.focused??!1,password:e.password===!0,inputMethodOwned:n({packageName:e.packageName,resourceId:e.resourceId,activeInputMethodPackage:t.activeInputMethodPackage}),area:i,editText:Ne(e.className??``)}}async function j(e){try{return{activeInputMethodPackage:(await _(e)).inputMethodPackage}}catch(e){return l({level:`warn`,phase:`android_fill_verification_input_method_probe_failed`,data:{error:e instanceof Error?e.message:String(e)}}),{}}}function Ae(e,t,n,r){let i=je(t.rect,n,r);if(i&&t.editText&&(e.editAtPoint=M(e.editAtPoint,t)),t.focused&&t.editText){e.focusedEdit=M(e.focusedEdit,t);return}i&&t.text&&(e.anyAtPoint=M(e.anyAtPoint,t))}function je(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function M(e,t){return e&&e.area<t.area?e:t}function Me(e){let t=e.editAtPoint??e.anyAtPoint;return{targetInput:t,actualInput:(e.focusedEdit?.text?e.focusedEdit:null)??t}}function Ne(e){let t=e.toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)}function Pe(e){return w(e)}function N(e,t){return e.resourceId||t.resourceId?e.resourceId===t.resourceId&&e.packageName===t.packageName:e.className===t.className&&e.packageName===t.packageName&&e.rect.x===t.rect.x&&e.rect.y===t.rect.y&&e.rect.width===t.rect.width&&e.rect.height===t.rect.height}function Fe(e){return{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:e.rect}}function P(e){if(!Number.isFinite(e.x)||!Number.isFinite(e.y)||!Number.isFinite(e.width)||!Number.isFinite(e.height)||e.width<=0||e.height<=0)throw new t(`COMMAND_FAILED`,`Android helper returned an invalid gesture viewport`);return e}const F=45e3,I=`ANDROID_TOUCH_HELPER_NO_FINAL_RESULT`,L=`ANDROID_TOUCH_HELPER_REPORTED_FAILURE`;async function Ie(e,t){let n=await z(e),r=ze(t),i=Math.max(45e3,r.durationMs+15e3),a=Buffer.from(JSON.stringify({protocol:`android-touch-plan-v1`,...r})).toString(`base64`),o=await u(`android_touch_helper_gesture`,async()=>{let e=await v({deviceKey:n.deviceKey,action:`gesture`,helper:R(n.artifact),payloadBase64:a,timeoutMs:i});return e?{...V(e),helperTransport:`persistent-session`}:{...await B({adb:n.adb,runner:n.artifact.manifest.instrumentationRunner,extraArgs:[`-e`,`mode`,`gesture`,`-e`,`payloadBase64`,a],timeoutMs:i,readResult:V}),helperTransport:`instrumentation`}},{packageName:n.artifact.manifest.packageName,version:n.artifact.manifest.version});return{backend:`android-helper`,helperVersion:n.artifact.manifest.version,installReason:n.install.reason,...o}}async function Le(e){let t=await z(e);try{let e=await v({deviceKey:t.deviceKey,action:`viewport`,helper:R(t.artifact),timeoutMs:F});if(e)return H(e)}catch(e){await ae(t.deviceKey),l({level:`warn`,phase:`android_touch_helper_viewport_session_fallback`,data:{reason:e instanceof Error?e.message:String(e)}})}return await B({adb:t.adb,runner:t.artifact.manifest.instrumentationRunner,extraArgs:[`-e`,`mode`,`viewport`],timeoutMs:F,readResult:H})}function R(e){return{packageName:e.manifest.packageName,runner:e.manifest.instrumentationRunner,helperVersion:e.manifest.version,helperVersionCode:e.manifest.versionCode,sha256:e.manifest.sha256}}async function z(e){let t=m(e),n=t.snapshotHelperArtifact??await Re(),r=ne(e);await re({deviceKey:r,adb:t.exec});let i=await u(`android_touch_helper_install`,async()=>await se({adb:t.exec,adbProvider:t,artifact:n,deviceKey:r,timeoutMs:3e4}),{packageName:n.manifest.packageName,versionCode:n.manifest.versionCode});return l({phase:`android_touch_helper_install_decision`,data:i}),i.installed&&await ae(r),{adb:t.exec,artifact:n,install:i,deviceKey:r}}async function Re(){return await ue({helperDirName:`snapshot-helper`,manifestFileName:e=>`agent-device-android-snapshot-helper-${e}.manifest.json`,parseManifest:e=>{let t=ce(e);return{...t,assetName:t.assetName??`agent-device-android-snapshot-helper-${t.version}.apk`}},unavailableMessage:`Android touch gestures require the bundled Android automation helper artifact, but it was not found or could not be read`})}function ze(e){return{kind:e.topology===`single`?`swipe`:`transform`,durationMs:e.durationMs,pointers:e.pointers.map(Be)}}function Be(e){return{pointerId:e.pointerId,samples:e.samples.map(({offsetMs:e,point:t})=>({offsetMs:e,x:t.x,y:t.y}))}}async function B(e){let n=await e.adb([`shell`,`am`,`instrument`,`-w`,...e.extraArgs,e.runner],{allowFailure:!0,timeoutMs:e.timeoutMs}),r;try{r=Ve(`${n.stdout}\n${n.stderr}`)}catch(e){if(e instanceof t){if(e.code===L)throw new t(`COMMAND_FAILED`,e.message,e.details,e);if(e.code!==I)throw e}throw new t(`COMMAND_FAILED`,n.exitCode===0?`Android automation helper output could not be parsed`:`Android automation helper failed before returning parseable output`,f(n),e)}if(n.exitCode!==0)throw new t(`COMMAND_FAILED`,`Android automation helper failed`,f(n,{helper:r}));return e.readResult(r)}function Ve(e){let n=le(e).results.find(e=>e.agentDeviceProtocol===oe);if(!n)throw new t(I,`Android automation helper did not return a final result`);if(n.ok!==`true`)throw new t(L,n.message&&n.message!==`null`?n.message:n.errorType||`Android automation helper returned an error`,{errorType:n.errorType,helper:n});return n}function V(e){return{helperKind:e.kind,helperApiVersion:e.helperApiVersion,injectedEvents:b(e.injectedEvents),elapsedMs:b(e.elapsedMs)}}function H(e){let n=b(e.x),r=b(e.y),i=b(e.width),a=b(e.height);if(n===void 0||r===void 0||i===void 0||a===void 0)throw new t(`COMMAND_FAILED`,`Android helper returned an invalid gesture viewport`);return P({x:n,y:r,width:i,height:a})}function He(e){if(e.topology===`two`||e.intent===`longPress`)return e;let[{pointerId:t,samples:n}]=e.pointers,r=[...new Set([...o(e.durationMs,`android`),...n.map(({offsetMs:e})=>e)])].sort((e,t)=>e-t),i=0,s=r.map(e=>{for(;i<n.length-2&&e>n[i+1].offsetMs;)i+=1;let t=n[i],r=n[i+1],o=r.offsetMs-t.offsetMs;return{offsetMs:e,point:e===r.offsetMs||o===0?r.point:a(t.point,r.point,(e-t.offsetMs)/o)}}),c=[s[0],s[1],s[2],...s.slice(3)];return{...e,pointers:[{pointerId:t,samples:c}]}}async function U(e,t){let n=He(t),r=ee(e);if(r){let e=n.intent===`longPress`?{...n,viewport:P(await r.gestureViewport())}:n;return{backend:`provider-native-touch`,...await r.touch(e)??{}}}return await Ie(e,n)}async function W(e){let t=ee(e);return t?P(await t.gestureViewport()):await Le(e)}var Ue=e({appSwitcherAndroid:()=>Ke,backAndroid:()=>q,fillAndroid:()=>Ye,focusAndroid:()=>Y,getAndroidScreenSize:()=>X,homeAndroid:()=>J,longPressAndroid:()=>qe,pressAndroid:()=>G,pressAndroidEnter:()=>We,pressAndroidTvRemote:()=>K,readAndroidTextAtPoint:()=>ge,scrollAndroid:()=>Qe,setAndroidOrientation:()=>Ge,typeAndroid:()=>Je});async function G(e,t,n){await g(e,[`shell`,`input`,`tap`,String(t),String(n)])}async function K(e,t,n){let r=i(t);await g(e,[`shell`,`input`,...n&&n>0?[`keyevent`,`--longpress`]:[`keyevent`],r])}async function q(e){await g(e,[`shell`,`input`,`keyevent`,`4`])}async function J(e){await g(e,[`shell`,`input`,`keyevent`,`3`])}async function We(e){await g(e,[`shell`,`input`,`keyevent`,`ENTER`])}async function Ge(e,t){let n=$e(t);await g(e,[`shell`,`settings`,`put`,`system`,`accelerometer_rotation`,`0`]),await g(e,[`shell`,`settings`,`put`,`system`,`user_rotation`,n])}async function Ke(e){await g(e,[`shell`,`input`,`keyevent`,`187`])}async function qe(e,t,n,r=800){let i={x:t,y:n};return await U(e,{topology:`single`,intent:`longPress`,durationMs:r,pointers:[{pointerId:0,samples:[{offsetMs:0,point:i},{offsetMs:r,point:i}]}]})}async function Je(e,t,n=0){let r=d(e);if(r){await r({action:`type`,text:t,delayMs:n}),$(`type`,`provider-native`,t);return}if(S(e)){await Xe(e,t,n);return}if(rt(t),await et(e,`type`),n>0&&Array.from(t).length>1){await Z(e,{action:`type`,text:t,chunkSize:1,delayMs:n});return}await Z(e,{action:`type`,text:t,chunkSize:tt,delayMs:0})}async function Y(e,t,n){await G(e,t,n)}async function Ye(e,t,n,r,i=0){let a=await ve(e,t,n),o=d(e);if(o)return await o({action:`fill`,target:{x:t,y:n},text:r,delayMs:i}),$(`fill`,`provider-native`,r),D(r,a,await E(e,t,n,r));if(S(e))return D(r,a,await Ze(e,t,n,r,a));rt(r);let s=Array.from(r).length,c=[{clearPadding:12,minClear:8,maxClear:48,chunkSize:i>0?1:tt,inputDelayMs:i},{clearPadding:24,minClear:16,maxClear:96,chunkSize:i>0?1:4,inputDelayMs:i>0?i:15}],l=null;for(let i of c){await Y(e,t,n),await et(e,`fill`),await ct(e,lt(s+i.clearPadding,i.minClear,i.maxClear)),await Z(e,{action:`fill`,text:r,chunkSize:i.chunkSize,delayMs:i.inputDelayMs});let o=await E(e,t,n,r);if(l=o,o.ok)return;if(o.reason===`ime_capture`)return D(r,a,o);let c=O(r,a,o);if(c)return c}return D(r,a,l)}async function Xe(e,t,n){let r=p(e),i=(await C(m(e))).manifest.packageName,a=t.split(`
2
+ `);for(let[t,o]of a.entries()){let s=n>0?Q(o,1):[o];for(let[e,o]of s.entries())o&&await x(r,i,o),n>0&&(e+1<s.length||t+1<a.length)&&await h(n);t+1<a.length&&await g(e,[`shell`,`input`,`keyevent`,`ENTER`])}$(`type`,`test-ime`,t)}async function Ze(e,t,n,r,i){let a=p(e),o=(await C(m(e))).manifest.packageName,s=null;for(let c=0;c<2;c+=1){await Y(e,t,n),await de(a,o),r&&await x(a,o,r);let c=await E(e,t,n,r);if(s=c,c.ok||O(r,i,c))break}return $(`fill`,`test-ime`,r),s}async function Qe(e,t,n){let i=await W(e),a=s({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i.width,referenceHeight:i.height}),o={...a,referenceWidth:i.x+i.width,referenceHeight:i.y+i.height,x1:i.x+a.x1,y1:i.y+a.y1,x2:i.x+a.x2,y2:i.y+a.y2},c=Math.max(n?.durationMs??300,16),l=await U(e,r({intent:`pan`,origin:{x:o.x1,y:o.y1},delta:{x:o.x2-o.x1,y:o.y2-o.y1},durationMs:c},i,`android`));return{...o,...n?.durationMs===void 0?{}:{durationMs:c},...l}}function $e(e){let n=c[e];if(n===void 0)throw new t(`INVALID_ARGS`,`Unsupported Android rotation: ${e}`);return String(n)}async function et(e,n){let r;try{r=await _(e)}catch(e){l({level:`warn`,phase:`android_input_ownership_probe_failed`,data:{action:n,error:e instanceof Error?e.message:String(e)}});return}if(r.inputOwner===`ime`)throw new t(`COMMAND_FAILED`,`KEYBOARD_OVERLAY_BLOCKING: Android text input is blocked because the focused input belongs to the active keyboard/IME.`,{failureReason:`ime_capture`,action:n,inputOwner:r.inputOwner,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,nextAction:`Focused input appears to be owned by the keyboard/IME; dismiss or change the IME before retrying text entry.`})}async function X(e){let n=(await g(e,[`shell`,`wm`,`size`])).stdout.match(/Physical size:\s*(\d+)x(\d+)/);if(!n)throw new t(`COMMAND_FAILED`,`Unable to read screen size`);return{width:Number(n[1]),height:Number(n[2])}}const tt=8;async function Z(e,t){let n=t.text.split(`
3
+ `);for(let[r,i]of n.entries()){let a=Q(i,t.chunkSize);for(let[i,o]of a.entries())await nt(e,o),t.delayMs>0&&(i+1<a.length||r+1<n.length)&&await h(t.delayMs);r+1<n.length&&await g(e,[`shell`,`input`,`keyevent`,`ENTER`])}$(t.action,`adb-shell`,t.text)}async function nt(e,t){if(t)try{await g(e,[`shell`,`input`,`text`,te(at(t))])}catch(e){throw ot(e)?st(t,e):e}}function rt(e){if(!it(e))throw st(e)}function it(e){for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&t!==`
4
+ `&&(e<32||e>126))return!1}return!0}function at(e){return e.replace(/ /g,`%s`)}function ot(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=e.details?.stderr,r=(typeof n==`string`?n:``).toLowerCase();return!!(r.includes(`exception occurred while executing 'text'`)||r.includes(`nullpointerexception`)&&r.includes(`inputshellcommand.sendtext`))}function st(e,n){return new t(`COMMAND_FAILED`,"Android text input requires provider-native text injection or the bundled test IME helper for non-ASCII/control characters; the adb-shell fallback supports ASCII text only. On emulators the test IME activates automatically; on real devices pass `open --test-ime` to enable it (see `agent-device doctor` for the current IME state).",{backend:`adb-shell`,textLength:Array.from(e).length,textPreview:e.slice(0,32)},n instanceof Error?n:void 0)}function Q(e,t){let n=Math.max(1,Math.floor(t)),r=[],i=Array.from(e);for(let e=0;e<i.length;e+=n)r.push(i.slice(e,e+n).join(``));return r.length>0?r:[``]}function $(e,t,n){l({phase:`android_text_injection`,data:{action:e,backend:t,textLength:Array.from(n).length}})}async function ct(e,t){let n=Math.max(0,t);await g(e,[`shell`,`input`,`keyevent`,`KEYCODE_MOVE_END`],{allowFailure:!0});for(let t=0;t<n;t+=24){let r=Math.min(24,n-t);await g(e,[`shell`,`input`,`keyevent`,...Array(r).fill(`KEYCODE_DEL`)],{allowFailure:!0})}}function lt(e,t,n){return Math.max(t,Math.min(n,e))}export{X as a,qe as c,Qe as d,Ge as f,W as h,Y as i,G as l,U as m,q as n,J as o,Je as p,Ye as r,Ue as s,Ke as t,K as u};
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{at as t}from"./version.js";import{t as n}from"./timeouts.js";import{n as r}from"./hdc.js";import i from"node:path";import{randomUUID as a}from"node:crypto";import{promises as o}from"node:fs";import s from"node:os";async function c(e,t={}){let n=`/data/local/tmp/agent-device-layout-${a()}.json`,c=await o.mkdtemp(i.join(s.tmpdir(),`agent-device-harmony-layout-`)),l=i.join(c,`layout.json`);try{return await r(e,[`shell`,`uitest`,`dumpLayout`,`-p`,n],{timeoutMs:3e4}),await r(e,[`file`,`recv`,n,l],{timeoutMs:15e3}),d(u(await o.readFile(l,`utf8`)),t)}finally{await r(e,[`shell`,`rm`,`-f`,n],{allowFailure:!0}).catch(()=>{}),await o.rm(c,{recursive:!0,force:!0})}}async function l(t){let n=(await c(t)).nodes.find(e=>e.type===`Application`&&e.rect)?.rect;if(!n||n.width<=0||n.height<=0)throw new e(`COMMAND_FAILED`,`HarmonyOS snapshot did not expose an application viewport`);return n}function u(t){try{let e=JSON.parse(t);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`layout root is not an object`);return e}catch(t){throw new e(`COMMAND_FAILED`,`HarmonyOS uitest returned an invalid layout JSON document`,{cause:t instanceof Error?t.message:String(t)})}}function d(e,t){let n=[],r=0,i=0,a=!1,o=(e,s,c)=>{if(r+=1,i=Math.max(i,s),n.length>=5e3){a=!0;return}let l=f(e.attributes??{},n.length,s,c),u=!t.interactiveOnly||l.hittable===!0?n.push(l)-1:c;if(s<(t.depth??1/0))for(let t of e.children??[])o(t,s+1,u)};return o(e,0),{nodes:n,...a?{truncated:!0}:{},analysis:{rawNodeCount:r,maxDepth:i}}}function f(e,t,n,r){let i=p(e,`text`)??p(e,`originalText`),a=p(e,`description`),o=p(e,`id`)??p(e,`key`),s=m(p(e,`bounds`));return{index:t,type:p(e,`type`)===`root`?`Application`:p(e,`type`),...a?{label:a}:{},...i?{value:i}:{},...o?{identifier:o}:{},...s?{rect:s}:{},enabled:p(e,`enabled`)!==`false`,focused:p(e,`focused`)===`true`,visibleToUser:p(e,`visible`)!==`false`,hittable:p(e,`clickable`)===`true`,depth:n,...r===void 0?{}:{parentIndex:r}}}function p(e,t){let n=e[t];return typeof n==`string`?n:void 0}function m(e){if(!e)return;let t=/^\[(-?\d+),(-?\d+)\]\[(-?\d+),(-?\d+)\]$/.exec(e);if(!t)return;let[,n,r,i,a]=t,o=Number(n),s=Number(r),c=Number(i)-o,l=Number(a)-s;return c>=0&&l>=0?{x:o,y:s,width:c,height:l}:void 0}async function h(e,t,n){await r(e,[`shell`,`uitest`,`uiInput`,`click`,String(t),String(n)])}async function g(e,t,n){await r(e,[`shell`,`uitest`,`uiInput`,`doubleClick`,String(t),String(n)])}async function _(e,t,n,i=800){await r(e,[`shell`,`uitest`,`uiInput`,`longClick`,String(t),String(n)])}async function v(e,t,i=0){await r(e,[`shell`,`uitest`,`uiInput`,`text`,t]),i>0&&await n(i)}async function y(e,t,i,a,o=0){await r(e,[`shell`,`uitest`,`uiInput`,`inputText`,String(t),String(i),a]),o>0&&await n(o)}async function b(e,n,i){let a=await l(e),o=t({direction:n,amount:i?.amount,pixels:i?.pixels,referenceWidth:a.width,referenceHeight:a.height});return await r(e,[`shell`,`uitest`,`uiInput`,`swipe`,String(o.x1),String(o.y1),String(o.x2),String(o.y2),String(i?.durationMs??300)]),o}async function x(t,n){if(n.topology!==`single`)throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS HDC does not support multi-touch gestures`);let i=n.pointers[0].samples,a=i[0],o=i.at(-1);if(!a||!o)throw new e(`COMMAND_FAILED`,`HarmonyOS gesture plan has no pointer endpoints`);let s=Math.hypot(o.point.x-a.point.x,o.point.y-a.point.y),c=Math.max(200,Math.min(4e4,Math.round(s/n.durationMs*1e3))),l=n.intent===`fling`?`fling`:`swipe`;return await r(t,[`shell`,`uitest`,`uiInput`,l,String(Math.round(a.point.x)),String(Math.round(a.point.y)),String(Math.round(o.point.x)),String(Math.round(o.point.y)),String(c)]),{backend:`harmonyos-hdc-uiinput`,command:l,velocity:c,viewport:n.viewport}}async function S(e){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,`Back`])}async function C(e){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,`Home`])}async function w(e){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,`Recent`])}async function T(e,t){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,t])}async function E(t,n){throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS orientation control is not available through the public HDC API.`)}export{w as appSwitcherHarmony,S as backHarmony,g as doubleClickHarmony,y as fillHarmony,C as homeHarmony,_ as longPressHarmony,c as n,x as performHarmonyGesture,h as pressHarmony,T as pressHarmonyKeyboardKey,b as scrollHarmony,E as setHarmonyOrientation,l as t,v as typeHarmony};
1
+ import{_ as e}from"./sdk-contracts.js";import{z as t}from"./interaction.js";import{t as n}from"./timeouts.js";import{n as r}from"./hdc.js";import i from"node:path";import{randomUUID as a}from"node:crypto";import{promises as o}from"node:fs";import s from"node:os";async function c(e,t={}){let n=`/data/local/tmp/agent-device-layout-${a()}.json`,c=await o.mkdtemp(i.join(s.tmpdir(),`agent-device-harmony-layout-`)),l=i.join(c,`layout.json`);try{return await r(e,[`shell`,`uitest`,`dumpLayout`,`-p`,n],{timeoutMs:3e4}),await r(e,[`file`,`recv`,n,l],{timeoutMs:15e3}),d(u(await o.readFile(l,`utf8`)),t)}finally{await r(e,[`shell`,`rm`,`-f`,n],{allowFailure:!0}).catch(()=>{}),await o.rm(c,{recursive:!0,force:!0})}}async function l(t){let n=(await c(t)).nodes.find(e=>e.type===`Application`&&e.rect)?.rect;if(!n||n.width<=0||n.height<=0)throw new e(`COMMAND_FAILED`,`HarmonyOS snapshot did not expose an application viewport`);return n}function u(t){try{let e=JSON.parse(t);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`layout root is not an object`);return e}catch(t){throw new e(`COMMAND_FAILED`,`HarmonyOS uitest returned an invalid layout JSON document`,{cause:t instanceof Error?t.message:String(t)})}}function d(e,t){let n=[],r=0,i=0,a=!1,o=(e,s,c)=>{if(r+=1,i=Math.max(i,s),n.length>=5e3){a=!0;return}let l=f(e.attributes??{},n.length,s,c),u=!t.interactiveOnly||l.hittable===!0?n.push(l)-1:c;if(s<(t.depth??1/0))for(let t of e.children??[])o(t,s+1,u)};return o(e,0),{nodes:n,...a?{truncated:!0}:{},analysis:{rawNodeCount:r,maxDepth:i}}}function f(e,t,n,r){let i=p(e,`text`)??p(e,`originalText`),a=p(e,`description`),o=p(e,`id`)??p(e,`key`),s=m(p(e,`bounds`));return{index:t,type:p(e,`type`)===`root`?`Application`:p(e,`type`),...a?{label:a}:{},...i?{value:i}:{},...o?{identifier:o}:{},...s?{rect:s}:{},enabled:p(e,`enabled`)!==`false`,focused:p(e,`focused`)===`true`,visibleToUser:p(e,`visible`)!==`false`,hittable:p(e,`clickable`)===`true`,depth:n,...r===void 0?{}:{parentIndex:r}}}function p(e,t){let n=e[t];return typeof n==`string`?n:void 0}function m(e){if(!e)return;let t=/^\[(-?\d+),(-?\d+)\]\[(-?\d+),(-?\d+)\]$/.exec(e);if(!t)return;let[,n,r,i,a]=t,o=Number(n),s=Number(r),c=Number(i)-o,l=Number(a)-s;return c>=0&&l>=0?{x:o,y:s,width:c,height:l}:void 0}async function h(e,t,n){await r(e,[`shell`,`uitest`,`uiInput`,`click`,String(t),String(n)])}async function g(e,t,n){await r(e,[`shell`,`uitest`,`uiInput`,`doubleClick`,String(t),String(n)])}async function _(e,t,n,i=800){await r(e,[`shell`,`uitest`,`uiInput`,`longClick`,String(t),String(n)])}async function v(e,t,i=0){await r(e,[`shell`,`uitest`,`uiInput`,`text`,t]),i>0&&await n(i)}async function y(e,t,i,a,o=0){await r(e,[`shell`,`uitest`,`uiInput`,`inputText`,String(t),String(i),a]),o>0&&await n(o)}async function b(e,n,i){let a=await l(e),o=t({direction:n,amount:i?.amount,pixels:i?.pixels,referenceWidth:a.width,referenceHeight:a.height});return await r(e,[`shell`,`uitest`,`uiInput`,`swipe`,String(o.x1),String(o.y1),String(o.x2),String(o.y2),String(i?.durationMs??300)]),o}async function x(t,n){if(n.topology!==`single`)throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS HDC does not support multi-touch gestures`);let i=n.pointers[0].samples,a=i[0],o=i.at(-1);if(!a||!o)throw new e(`COMMAND_FAILED`,`HarmonyOS gesture plan has no pointer endpoints`);let s=Math.hypot(o.point.x-a.point.x,o.point.y-a.point.y),c=Math.max(200,Math.min(4e4,Math.round(s/n.durationMs*1e3))),l=n.intent===`fling`?`fling`:`swipe`;return await r(t,[`shell`,`uitest`,`uiInput`,l,String(Math.round(a.point.x)),String(Math.round(a.point.y)),String(Math.round(o.point.x)),String(Math.round(o.point.y)),String(c)]),{backend:`harmonyos-hdc-uiinput`,command:l,velocity:c,viewport:n.viewport}}async function S(e){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,`Back`])}async function C(e){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,`Home`])}async function w(e){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,`Recent`])}async function T(e,t){await r(e,[`shell`,`uitest`,`uiInput`,`keyEvent`,t])}async function E(t,n){throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS orientation control is not available through the public HDC API.`)}export{w as appSwitcherHarmony,S as backHarmony,g as doubleClickHarmony,y as fillHarmony,C as homeHarmony,_ as longPressHarmony,c as n,x as performHarmonyGesture,h as pressHarmony,T as pressHarmonyKeyboardKey,b as scrollHarmony,E as setHarmonyOrientation,l as t,v as typeHarmony};
@@ -1 +1 @@
1
- import{o as e}from"./png-worker-contract.js";import{_ as t,v as n}from"./sdk-contracts.js";import{b as r,o as i,v as a,w as o}from"./sdk-android-adb.js";import{t as s}from"./timeouts.js";import{n as c,t as l}from"./manifest.js";import{n as u,r as d}from"./install-source2.js";import{i as f,n as p,o as m,t as h}from"./boot-diagnostics.js";import g from"node:path";function _(e={}){let t=e.ttlMs??3e4,n=e.nowMs??Date.now,r=new Map,i=e=>{let t=y(e);for(let e of r.keys())e.startsWith(t)&&r.delete(e)};return{get(e,t){let i=v(e,t),a=r.get(i);if(a){if(a.expiresAtMs<=n()){r.delete(i);return}return a.value}},set(e,i,a){return r.set(v(e,i),{value:a,expiresAtMs:n()+t}),a},clear(e){i(e)},async invalidateWhile(e,t){i(e);try{return await t()}finally{i(e)}}}}function v(e,t){return[e.platform,e.deviceId,e.variant??``,t.trim().toLowerCase()].join(`\0`)}function y(e){return[e.platform,e.deviceId,``].join(`\0`)}var b=e({ensureAndroidEmulatorBooted:()=>S,waitForAndroidBoot:()=>A});const x=1e4;async function S(e,n){await c();let i=e.avdName.trim();if(!i)throw new t(`INVALID_ARGS`,`Android emulator boot requires a non-empty AVD name.`);let a=e.timeoutMs??12e4;if(!await o(`adb`))throw new t(`TOOL_MISSING`,`adb not found in PATH`);if(!await o(`emulator`))throw new t(`TOOL_MISSING`,`emulator not found in PATH`);let s=await C(n,e.serial),l=w(s,i,e.serial);if(!l)throw new t(`DEVICE_NOT_FOUND`,`No Android emulator AVD named ${e.avdName}`,{requestedAvdName:i,availableAvds:s.map(e=>e.name),hint:"Run `emulator -list-avds` and pass an existing AVD name to --device."});let u=l.name,d=Date.now(),f=T(l)?l:void 0;if(!f){let t=[`-avd`,u];e.headless&&t.push(`-no-window`,`-no-audio`),r(`emulator`,t)}let p=f??await O({dependencies:n,avdName:u,serial:e.serial,timeoutMs:a}),m=Date.now()-d;return await A(p.id,Math.max(1e3,a-m)),{...(await C(n,e.serial)).find(e=>e.id===p.id)??p,name:u,booted:!0}}async function C(e,t){return await e.discoverLocal({platform:`android`,kind:`emulator`,...t?{serial:t}:{},...e.androidSerialAllowlist?{androidSerialAllowlist:[...e.androidSerialAllowlist]}:{}})}function w(e,t,n){let r=D(t);return e.find(e=>e.platform===`android`&&e.kind===`emulator`&&D(e.name)===r&&(!n||!T(e)||e.id===n))}function T(e){return E(e.id)}function E(e){return e.startsWith(`emulator-`)}function D(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}async function O(e){let n=Date.now(),r=Math.min(1e3,Math.max(50,Math.floor(e.timeoutMs/20)));for(;Date.now()-n<e.timeoutMs;){try{let t=w(await C(e.dependencies,e.serial),e.avdName,e.serial);if(t&&T(t))return t}catch{}await s(r)}throw new t(`COMMAND_FAILED`,`Android emulator did not appear in time`,{avdName:e.avdName,serial:e.serial,timeoutMs:e.timeoutMs,hint:`Check emulator logs and verify the AVD can start from command line.`})}async function k(e,t=x){return await a(`adb`,[`-s`,e,`shell`,`getprop`,`sys.boot_completed`],{allowFailure:!0,timeoutMs:t})}async function A(e,n=6e4){let r=f.fromTimeoutMs(n),i=Math.min(1e3,Math.max(50,Math.floor(n/20))),a=Math.max(1,Math.ceil(n/i)),o,s=!1;try{await m(async({deadline:i})=>{if(i?.isExpired())throw s=!0,new t(`COMMAND_FAILED`,`Android boot deadline exceeded`,{serial:e,timeoutMs:n,elapsedMs:r.elapsedMs(),message:`timeout`});let a=Math.max(1e3,i?.remainingMs()??n),c=await k(e,Math.min(a,x));if(o=c,c.stdout.trim()!==`1`)throw new t(`COMMAND_FAILED`,`Android device is still booting`,{serial:e,stdout:c.stdout,stderr:c.stderr,exitCode:c.exitCode})},{maxAttempts:a,baseDelayMs:i,maxDelayMs:i,jitter:0,shouldRetry:e=>{let t=p({error:e,stdout:o?.stdout,stderr:o?.stderr,context:{platform:`android`,phase:`boot`}});return t!==`ADB_TRANSPORT_UNAVAILABLE`&&t!==`ANDROID_BOOT_TIMEOUT`}},{deadline:r,phase:`boot`,classifyReason:e=>p({error:e,stdout:o?.stdout,stderr:o?.stderr,context:{platform:`android`,phase:`boot`}})})}catch(t){j({error:t,serial:e,timeoutMs:n,deadline:r,lastBootResult:o,timedOut:s})}}function j(e){let t=n(e.error),r=M(e,t);throw P(t,r,e.timedOut,N(e,r))}function M(e,t){let n=p({error:e.error,stdout:e.lastBootResult?.stdout,stderr:e.lastBootResult?.stderr,context:{platform:`android`,phase:`boot`}});return n===`BOOT_COMMAND_FAILED`&&t.message===`Android device is still booting`?`ANDROID_BOOT_TIMEOUT`:n}function N(e,t){return{serial:e.serial,timeoutMs:e.timeoutMs,elapsedMs:e.deadline.elapsedMs(),reason:t,hint:h(t),stdout:e.lastBootResult?.stdout,stderr:e.lastBootResult?.stderr,exitCode:e.lastBootResult?.exitCode,...n(e.error).details??{}}}function P(e,n,r,i){return r||n===`ANDROID_BOOT_TIMEOUT`?new t(`COMMAND_FAILED`,`Android device did not finish booting in time`,i):e.code===`TOOL_MISSING`?new t(`TOOL_MISSING`,e.message,i):n===`ADB_TRANSPORT_UNAVAILABLE`?new t(`COMMAND_FAILED`,e.message,i):new t(e.code,e.message,i,e.cause)}async function F(e,t,n){return await i(e)(t,n)}function I(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`no shell command implementation`)||n.includes(`unknown command`)}var L=e({prepareAndroidInstallArtifact:()=>R});async function R(e,t){let n=e.kind===`url`&&u(e.url),r=await d({source:e,isInstallablePath:(e,t)=>t.isFile()&&z(e),installableLabel:`Android installable (.apk or .aab)`,allowArchiveExtraction:e.kind!==`url`||n,signal:t?.signal});try{let e=t?.resolveIdentity===!1?{}:await B(r.installablePath);return{archivePath:r.archivePath,installablePath:r.installablePath,packageName:e.packageName,cleanup:r.cleanup}}catch(e){throw await r.cleanup(),e}}function z(e){let t=g.extname(e).toLowerCase();return t===`.apk`||t===`.aab`}async function B(e){let t=g.extname(e).toLowerCase();return t!==`.apk`&&t!==`.aab`?{}:{packageName:await l(e)}}export{b as a,F as i,R as n,A as o,I as r,_ as s,L as t};
1
+ import{t as e}from"./manifest.js";import{n as t,r as n}from"./install-source2.js";import r from"node:path";async function i(e,r){let i=e.kind===`url`&&t(e.url),s=await n({source:e,isInstallablePath:(e,t)=>t.isFile()&&a(e),installableLabel:`Android installable (.apk or .aab)`,allowArchiveExtraction:e.kind!==`url`||i,signal:r?.signal});try{let e=r?.resolveIdentity===!1?{}:await o(s.installablePath,r?.signal);return{archivePath:s.archivePath,installablePath:s.installablePath,packageName:e.packageName,cleanup:s.cleanup}}catch(e){throw await s.cleanup(),e}}function a(e){let t=r.extname(e).toLowerCase();return t===`.apk`||t===`.aab`}async function o(t,n){let i=r.extname(t).toLowerCase();return i!==`.apk`&&i!==`.aab`?{}:{packageName:await e(t,n)}}export{i as prepareAndroidInstallArtifact};
@@ -1 +1 @@
1
- import{o as e}from"./png-worker-contract.js";import{_ as t}from"./sdk-contracts.js";import{c as n,l as r,n as i,o as a,r as o,s,u as c}from"./install-source2.js";import{t as l}from"./plist.js";import u from"node:path";import{promises as d}from"node:fs";import f from"node:os";var p=e({prepareIosInstallArtifact:()=>m,readIosBundleInfo:()=>g});async function m(e,t){return await r(async()=>await h(e,t))}async function h(e,n){if(e.kind===`url`&&!i(e.url))throw new t(`INVALID_ARGS`,`iOS install_from_source URL sources are only supported for trusted artifact services such as GitHub Actions and EAS. Use a path source for other hosts.`);let r=await o({source:e,isInstallablePath:(e,t)=>t.isDirectory()&&e.toLowerCase().endsWith(`.app`)||t.isFile()&&e.toLowerCase().endsWith(`.ipa`),installableLabel:`iOS installable (.app or .ipa)`,allowArchiveExtraction:e.kind!==`url`||i(e.url),signal:n?.signal}),a;try{a=await _(r.installablePath,n);let e=a,t=await g(e.installPath);return{archivePath:r.archivePath??(r.installablePath.toLowerCase().endsWith(`.ipa`)?r.installablePath:void 0),installablePath:e.installPath,bundleId:t.bundleId,appName:t.appName,cleanup:async()=>{await e.cleanup(),await r.cleanup()}}}catch(e){try{await a?.cleanup()}finally{await r.cleanup()}throw e}}async function g(e){let t=u.join(e,`Info.plist`),[n,r,i]=await Promise.all([l(t,`CFBundleIdentifier`),l(t,`CFBundleDisplayName`),l(t,`CFBundleName`)]);return{bundleId:n,appName:r??i}}async function _(e,r){if(!e.toLowerCase().endsWith(`.ipa`))return{installPath:e,cleanup:async()=>{}};let i=await d.mkdtemp(u.join(f.tmpdir(),`agent-device-ios-ipa-`)),o=async()=>{await d.rm(i,{recursive:!0,force:!0})};try{let l=u.join(i,`extracted`),f=s()+1;await c({archivePath:e,outputRoot:l,type:`zip`,budget:a(),depth:f}),n(f);let p=u.join(l,`Payload`),m=(await d.readdir(p,{withFileTypes:!0}).catch(()=>{throw new t(`INVALID_ARGS`,`Invalid IPA: missing Payload directory`)})).filter(e=>e.isDirectory()&&e.name.toLowerCase().endsWith(`.app`)).map(e=>({installPath:u.join(p,e.name),bundleName:e.name.replace(/\.app$/i,``)})),h=m[0];if(h!==void 0&&m.length===1)return{installPath:h.installPath,cleanup:o};if(m.length===0)throw new t(`INVALID_ARGS`,`Invalid IPA: expected at least one .app under Payload, found 0`);await v(m);let g=r?.appIdentifierHint?.trim();if(g){let e=y(m,g);if(e)return{installPath:e.installPath,cleanup:o};throw new t(`INVALID_ARGS`,`Invalid IPA: found ${m.length} .app bundles under Payload and none matched "${g}". Available bundles: ${m.map(b).join(`, `)}`)}throw new t(`INVALID_ARGS`,`Invalid IPA: found ${m.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${m.map(b).join(`, `)}`)}catch(e){throw await o(),e}}async function v(e){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let t=await g(e.installPath);e.bundleId=e.bundleId??t.bundleId,e.appName=e.appName??t.appName}))}function y(e,n){let r=n.toLowerCase(),i=e.filter(e=>e.bundleName.toLowerCase()===r);if(i.length===1)return i[0];if(i.length>1)throw new t(`INVALID_ARGS`,`Invalid IPA: multiple app bundles matched "${n}" by name. Use a bundle id hint instead.`);if(n.includes(`.`)){let t=e.filter(e=>e.bundleId?.toLowerCase()===r);if(t.length===1)return t[0]}}function b(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}export{m as n,p as t};
1
+ import{_ as e}from"./sdk-contracts.js";import{r as t}from"./byte-limit-stream.js";import{a as n,c as r,n as i,o as a,r as o,s}from"./install-source2.js";import{t as c}from"./plist.js";import l from"node:path";import{promises as u}from"node:fs";import d from"node:os";async function f(e,t){return await r(async()=>await p(e,t))}async function p(t,n){if(t.kind===`url`&&!i(t.url))throw new e(`INVALID_ARGS`,`iOS install_from_source URL sources are only supported for trusted artifact services such as GitHub Actions and EAS. Use a path source for other hosts.`);let r=await o({source:t,isInstallablePath:(e,t)=>t.isDirectory()&&e.toLowerCase().endsWith(`.app`)||t.isFile()&&e.toLowerCase().endsWith(`.ipa`),installableLabel:`iOS installable (.app or .ipa)`,allowArchiveExtraction:t.kind!==`url`||i(t.url),signal:n?.signal}),a;try{a=await h(r.installablePath,n);let e=a,t=await m(e.installPath,n?.signal);return{archivePath:r.archivePath??(r.installablePath.toLowerCase().endsWith(`.ipa`)?r.installablePath:void 0),installablePath:e.installPath,bundleId:t.bundleId,appName:t.appName,cleanup:async()=>{await e.cleanup(),await r.cleanup()}}}catch(e){try{await a?.cleanup()}finally{await r.cleanup()}throw e}}async function m(e,t){let n=l.join(e,`Info.plist`),[r,i,a]=await Promise.all([c(n,`CFBundleIdentifier`,t),c(n,`CFBundleDisplayName`,t),c(n,`CFBundleName`,t)]);return{bundleId:r,appName:i??a}}async function h(e,t){return e.toLowerCase().endsWith(`.ipa`)?await g(e,t):{installPath:e,cleanup:async()=>{}}}async function g(r,i){let o=await u.mkdtemp(l.join(d.tmpdir(),`agent-device-ios-ipa-`)),c=async()=>{await u.rm(o,{recursive:!0,force:!0})};try{let d=l.join(o,`extracted`),f=a()+1;await t({archivePath:r,outputRoot:d,type:`zip`,budget:n(),depth:f,signal:i?.signal}),s(f);let p=l.join(d,`Payload`),m=(await u.readdir(p,{withFileTypes:!0}).catch(()=>{throw new e(`INVALID_ARGS`,`Invalid IPA: missing Payload directory`)})).filter(e=>e.isDirectory()&&e.name.toLowerCase().endsWith(`.app`)).map(e=>({installPath:l.join(p,e.name),bundleName:e.name.replace(/\.app$/i,``)})),h=m[0];if(h!==void 0&&m.length===1)return{installPath:h.installPath,cleanup:c};if(m.length===0)throw new e(`INVALID_ARGS`,`Invalid IPA: expected at least one .app under Payload, found 0`);await _(m,i?.signal);let g=i?.appIdentifierHint?.trim();if(g){let t=v(m,g);if(t)return{installPath:t.installPath,cleanup:c};throw new e(`INVALID_ARGS`,`Invalid IPA: found ${m.length} .app bundles under Payload and none matched "${g}". Available bundles: ${m.map(y).join(`, `)}`)}throw new e(`INVALID_ARGS`,`Invalid IPA: found ${m.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${m.map(y).join(`, `)}`)}catch(e){throw await c(),e}}async function _(e,t){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let n=await m(e.installPath,t);e.bundleId=e.bundleId??n.bundleId,e.appName=e.appName??n.appName}))}function v(t,n){let r=n.toLowerCase(),i=t.filter(e=>e.bundleName.toLowerCase()===r);if(i.length===1)return i[0];if(i.length>1)throw new e(`INVALID_ARGS`,`Invalid IPA: multiple app bundles matched "${n}" by name. Use a bundle id hint instead.`);if(n.includes(`.`)){let e=t.filter(e=>e.bundleId?.toLowerCase()===r);if(e.length===1)return e[0]}}function y(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}export{f as prepareIosInstallArtifact,m as readIosBundleInfo};
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{t}from"./path-resolution.js";import n from"node:path";import{AsyncLocalStorage as r}from"node:async_hooks";import{createReadStream as i,createWriteStream as a,promises as o}from"node:fs";import s from"node:os";import{pipeline as c}from"node:stream/promises";import{Transform as l}from"node:stream";import u from"node:net";import{createGunzip as d}from"node:zlib";import*as f from"tar-stream";import*as ee from"yauzl";import p from"node:dns/promises";import te from"ipaddr.js";import{Agent as ne,ProxyAgent as re,request as ie}from"undici";const m=2*1024*1024*1024;var h=class{maxBytes;maxEntries;maxDepth;#e=0;#t=0;constructor(e={}){this.maxBytes=S(e.maxBytes??4294967296,`maxBytes`),this.maxEntries=S(e.maxEntries??1e5,`maxEntries`),this.maxDepth=S(e.maxDepth??3,`maxDepth`)}get bytes(){return this.#e}get entries(){return this.#t}preflightArchive(e){let t=S(e.depth,`depth`),n=S(e.entryCount,`entryCount`),r=S(e.declaredBytes,`declaredBytes`);if(t<1||t>this.maxDepth)throw x(`ARCHIVE_NESTING_LIMIT`,`Archive nesting depth exceeds the limit`);if(n>this.maxEntries-this.#t)throw x(`ARCHIVE_ENTRY_LIMIT`,`Archive contains too many entries`);if(r>this.maxBytes-this.#e)throw x(`ARCHIVE_EXPANDED_BYTES_LIMIT`,`Archive expands beyond the byte limit`);return new g(e=>this.#n(e),()=>this.#r(),e.entryCount,e.declaredBytes)}#n(e){let t=S(e,`bytes`);if(t>this.maxBytes-this.#e)throw x(`ARCHIVE_EXPANDED_BYTES_LIMIT`,`Archive expands beyond the byte limit`);this.#e+=t}#r(){if(this.#t>=this.maxEntries)throw x(`ARCHIVE_ENTRY_LIMIT`,`Archive contains too many entries`);this.#t+=1}},g=class{#e;#t;#n;#r;#i=0;#a=0;constructor(e,t,n,r){this.#e=e,this.#t=t,this.#n=n,this.#r=r}chargeBytes(e){let t=S(e,`bytes`);if(t>this.#r-this.#a)throw x(`ARCHIVE_MANIFEST_MISMATCH`,`Archive contents changed after inspection`);this.#e(t),this.#a+=t}commitEntry(){if(this.#i>=this.#n)throw x(`ARCHIVE_MANIFEST_MISMATCH`,`Archive contents changed after inspection`);this.#t(),this.#i+=1}finish(){if(this.#i!==this.#n||this.#a!==this.#r)throw x(`ARCHIVE_MANIFEST_MISMATCH`,`Archive contents changed after inspection`)}};function _(e,t,n){return e.preflightArchive({depth:t,entryCount:n.length,declaredBytes:n.reduce((e,t)=>e+t.size,0)})}function v(e,t){return e.name===t.name&&e.kind===t.kind&&e.size===t.size&&e.mode===t.mode}function y(e){if(!e||e.includes(`\0`)||e.includes(`\\`)||n.posix.isAbsolute(e)||/^[a-zA-Z]:/.test(e)||e.startsWith(`//`))throw x(`ARCHIVE_UNSAFE_PATH`,`Archive contains an unsafe entry path`);let t=n.posix.normalize(e).replace(/^(\.\/)+/,``).replace(/\/$/,``);if(!t||t===`.`||t===`..`||t.startsWith(`../`))throw x(`ARCHIVE_UNSAFE_PATH`,`Archive contains an unsafe entry path`);return t}function b(e,t){let r=y(t),i=n.resolve(e),a=n.resolve(i,...r.split(`/`));if(!a.startsWith(`${i}${n.sep}`))throw x(`ARCHIVE_UNSAFE_PATH`,`Archive entry escapes the extraction root`);return a}function x(t,n,r){return new e(`INVALID_ARGS`,n,{reason:t},r)}function S(e,t){if(!Number.isSafeInteger(e)||e<0)throw RangeError(`${t} must be a non-negative safe integer`);return e}async function ae(e){let t=e.budget??new h,n=e.depth??1,r=await oe(e,t,n);await e.validateManifest?.(r);let i=_(t,n,r),a=f.extract(),o=C(e.archivePath,e.gzip,a);try{for await(let t of a){let n=w(t.header);if(!n){await T(t);continue}let a=r.shift();if(!a||!v(a,n))throw x(`ARCHIVE_MANIFEST_MISMATCH`,`Archive contents changed after inspection`);await le(t,a,e.outputRoot,i),i.commitEntry()}await o}catch(e){throw a.destroy(),await o.catch(()=>{}),e}if(r.length!==0)throw x(`ARCHIVE_MANIFEST_MISMATCH`,`Archive contents changed after inspection`);i.finish()}async function oe(e,t,n){let r=[],i=0,a=f.extract(),o=C(e.archivePath,e.gzip,a);try{for await(let e of a){let a=w(e.header);if(!a){await T(e);continue}i+=a.size,t.preflightArchive({depth:n,entryCount:r.length+1,declaredBytes:i}),r.push(a),await T(e)}await o}catch(e){throw a.destroy(),await o.catch(()=>{}),e}return r}function C(e,t,n){return t?c(i(e),d(),n):c(i(e),n)}function se(e){if(e===`directory`)return`directory`;if(e===`file`||e===`contiguous-file`||e==null)return`file`;throw e===`link`||e===`symlink`?x(`ARCHIVE_UNSAFE_ENTRY`,`Uploaded app bundle archive cannot contain symlinks or hard links`):x(`ARCHIVE_UNSAFE_ENTRY`,`Archive contains a link or special entry`)}function ce(e,t){return(e??(t===`directory`?493:420))&511}function w(e){if(E(e.name,e.type))return;let t=y(e.name),n=se(e.type),r=n===`directory`?0:e.size??0;if(!Number.isSafeInteger(r)||r<0)throw x(`ARCHIVE_INVALID_ENTRY`,`Archive entry has an invalid size`);return{name:t,kind:n,size:r,mode:ce(e.mode,n)}}async function le(e,t,r,i){let s=b(r,t.name);if(t.kind===`directory`){await o.mkdir(s,{recursive:!0,mode:t.mode}),await T(e);return}await o.mkdir(n.dirname(s),{recursive:!0}),await c(e,async function*(e){for await(let t of e)i.chargeBytes(Buffer.byteLength(t)),yield t},a(s,{flags:`wx`,mode:t.mode}))}async function T(e){for await(let t of e);}function E(e,t){return t===`directory`&&(e===`.`||e===`./`||e===``)}async function ue(e){let t=e.budget??new h,r=e.depth??1,i=[],s=0;await D(e.archivePath,e=>{t.preflightArchive({depth:r,entryCount:i.length+1,declaredBytes:s});let n=k(e);s+=n.size,t.preflightArchive({depth:r,entryCount:i.length+1,declaredBytes:s}),i.push(n)}),await e.validateManifest?.(i);let l=_(t,r,i),u=await D(e.archivePath,(e,t)=>{t>=i.length&&A()});u.length!==i.length&&A();let d=await O(e.archivePath);try{for(let t=0;t<u.length;t+=1){let r=u[t],s=i[t];(!r||!s||!v(k(r),s))&&A();let f=b(e.outputRoot,s.name);s.kind===`directory`?await o.mkdir(f,{recursive:!0,mode:s.mode}):(await o.mkdir(n.dirname(f),{recursive:!0}),await c(await de(d,r),async function*(e){for await(let t of e)l.chargeBytes(Buffer.byteLength(t)),yield t},a(f,{flags:`wx`,mode:s.mode}))),l.commitEntry()}l.finish()}finally{d.close()}}async function D(e,t){let n=await O(e);return await new Promise((e,r)=>{let i=[],a=()=>{n.off(`entry`,o),n.off(`end`,s),n.off(`error`,c)},o=e=>{try{t?.(e,i.length),i.push(e),n.readEntry()}catch(e){a(),r(e)}},s=()=>{a(),e(i)},c=e=>{a(),r(e)};n.on(`entry`,o),n.once(`end`,s),n.once(`error`,c),n.readEntry()}).finally(()=>n.close())}function O(e){return new Promise((t,n)=>{ee.open(e,{lazyEntries:!0,autoClose:!1,validateEntrySizes:!0,strictFileNames:!0},(e,r)=>e?n(e):t(r))})}function de(e,t){return new Promise((n,r)=>{e.openReadStream(t,(e,t)=>e?r(e):n(t))})}function k(e){fe(e);let t=y(e.fileName),n=e.externalFileAttributes>>>16&65535,r=pe(e.fileName,n),i=r?493:420;return{name:t,kind:r?`directory`:`file`,size:r?0:e.uncompressedSize,mode:n&511||i}}function fe(e){if(e.isEncrypted())throw x(`ARCHIVE_UNSAFE_ENTRY`,`Encrypted archive entries are not supported`);let t=e.externalFileAttributes>>>16&61440;if(t!==0&&t!==16384&&t!==32768)throw x(`ARCHIVE_UNSAFE_ENTRY`,`Archive contains a link or special entry`)}function pe(e,t){return e.endsWith(`/`)||(t&61440)==16384}function A(){throw x(`ARCHIVE_MANIFEST_MISMATCH`,`Archive contents changed after inspection`)}async function j(e){let t=n.resolve(e.archivePath),r=n.resolve(e.outputRoot);if(t===r||t.startsWith(`${r}${n.sep}`))throw RangeError(`archivePath must be outside outputRoot`);await o.mkdir(r,{recursive:!1});try{e.type===`zip`?await ue({...e,archivePath:t,outputRoot:r}):await ae({...e,archivePath:t,outputRoot:r,gzip:e.type===`tgz`})}catch(e){throw await o.rm(r,{recursive:!0,force:!0}),e}}function M(e){let t=e.toLowerCase();if(t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`))return`tgz`;if(t.endsWith(`.tar`))return`tar`;if(t.endsWith(`.zip`)||t.endsWith(`.ipa`))return`zip`}async function N(t,n){let r=await o.stat(t).catch(()=>null);if(!r)throw new e(`INVALID_ARGS`,`App source not found: ${t}`);if(n.isInstallablePath(t,r))return{archivePath:n.archivePath,installablePath:t};if(r.isFile()&&L(t))return I(t,n,!1),await P(t,n);if(r.isDirectory()){let r=await F(t,n.isInstallablePath);if(r.length===1)return{archivePath:n.archivePath,installablePath:r[0]};if(r.length>1)throw new e(`INVALID_ARGS`,`Found multiple ${n.installableLabel} candidates under ${t}: ${r.join(`, `)}`,{matches:r});let i=await F(t,(e,t)=>!!(t.isFile()&&L(e)));if(i.length===1)return I(i[0],n,!0),await P(i[0],n);if(i.length>1)throw new e(`INVALID_ARGS`,`Found multiple nested archives under ${t}; expected one ${n.installableLabel} source`,{matches:i})}throw new e(`INVALID_ARGS`,`Expected ${n.installableLabel} source, but got ${t}`)}async function P(e,t){let n=await me(e,t.budget,t.archiveDepth+1);return t.onArchiveAccepted?.(t.archiveDepth+1),t.registerCleanup(n.cleanup),await N(n.outputPath,{...t,archivePath:t.archivePath??e,archiveDepth:t.archiveDepth+1})}async function me(t,r,i){let a=M(t);if(!a)throw new e(`INVALID_ARGS`,`Unsupported archive: ${t}`);let c=await o.mkdtemp(n.join(s.tmpdir(),`agent-device-archive-`)),l=n.join(c,`extracted`);try{return await j({archivePath:t,outputRoot:l,type:a,budget:r,depth:i}),{outputPath:l,cleanup:async()=>await o.rm(c,{recursive:!0,force:!0})}}catch(e){throw await o.rm(c,{recursive:!0,force:!0}),e}}async function F(e,t){let r=[],i=[{path:e,depth:0}];for(;i.length>0;){let e=i.shift();if(!e)continue;let a=await o.readdir(e.path,{withFileTypes:!0});a.sort((e,t)=>e.name.localeCompare(t.name));for(let o of a){if(o.name===`__MACOSX`||o.name.startsWith(`._`))continue;let a=n.join(e.path,o.name);t(a,o)?r.push(a):o.isDirectory()&&e.depth<5&&i.push({path:a,depth:e.depth+1})}}return[...new Set(r)]}function I(t,n,r){if(!n.allowArchiveExtraction)throw new e(`INVALID_ARGS`,r?`URL sources must point directly to a ${n.installableLabel}; nested archives are not allowed`:`URL sources must point directly to a ${n.installableLabel}; archive extraction is not allowed`,{path:t})}function L(e){return M(e)!==void 0}const R=new r;async function z(e){return await R.run({budget:new h,depth:0},e)}function B(){return R.getStore()?.budget}function he(){return R.getStore()?.depth??0}function V(e){let t=R.getStore();t&&(t.depth=Math.max(t.depth,e))}async function H(t,n){if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new e(`INVALID_ARGS`,`Unsupported source URL protocol: ${t.protocol}`);if(t.username||t.password)throw new e(`INVALID_ARGS`,`Source URL credentials are not allowed`);_e(n);let r=G(t.hostname);ve(r)&&q(t.hostname);let i=u.isIP(r);if(i)return{address:r,family:i};let a;try{a=await ge(r,n)}catch(t){throw t instanceof e&&t.details?.reason===`request_canceled`?t:new e(`INVALID_ARGS`,`Source URL host could not be resolved: ${r}`,{hint:`Use a public artifact URL.`},t)}if(a.length===0)throw new e(`INVALID_ARGS`,`Source URL host could not be resolved: ${r}`,{hint:`Use a public artifact URL.`});a.some(e=>W(e.address))&&q(r);let o=a[0];return{address:o.address,family:o.family}}async function ge(e,t){let n=p.lookup(e,{all:!0,verbatim:!0});return t?await new Promise((e,r)=>{let i=()=>r(U(t.reason));t.addEventListener(`abort`,i,{once:!0}),n.then(e,r).finally(()=>t.removeEventListener(`abort`,i))}):await n}function _e(e){if(e?.aborted)throw U(e.reason)}function U(t){return new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`},t)}function ve(e){let t;try{t=G(e)}catch{return!0}return!t||t===`localhost`||t.endsWith(`.localhost`)?!0:u.isIP(t)!==0&&W(t)}function W(e){try{return te.process(K(e)).range()!==`unicast`}catch{return!0}}function G(t){let n=K(t).toLowerCase().replace(/\.$/,``);if(!n||n.includes(`%`))throw new e(`INVALID_ARGS`,`Source URL host is not allowed`,{hint:`Use a public artifact URL.`});return n}function K(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}function q(t){throw new e(`INVALID_ARGS`,`Source URL host is not allowed because it resolves to a non-public address: ${t}`,{hint:`Use a public artifact URL.`})}function J(e){if(!Number.isSafeInteger(e.maxBytes)||e.maxBytes<0)throw RangeError(`maxBytes must be a non-negative safe integer`);let t=0,n=new l({transform(n,r,i){let a=t+n.byteLength;if(!Number.isSafeInteger(a)||a>e.maxBytes){i(e.createLimitError());return}t=a,i(null,n)}});return Object.defineProperty(n,"bytesSeen",{enumerable:!0,get:()=>t}),n}async function ye(e){let t=be(e.url),n=t?Ce(t,e.url):Se(e.approvedAddress,e.family),r=t?we(e.url,e.approvedAddress,e.family):e.url;try{let i=await ie(r,{dispatcher:n,headers:t?{...e.headers,host:e.url.host}:e.headers,maxRedirections:0,method:`GET`,signal:e.signal});return{statusCode:i.statusCode,headers:i.headers,body:i.body,close:async()=>await X(n)}}catch(e){throw await X(n),e}}function be(e,t=process.env){if(xe(e,t.no_proxy??t.NO_PROXY))return;let n=t.http_proxy??t.HTTP_PROXY;return e.protocol===`http:`?n||void 0:(t.https_proxy??t.HTTPS_PROXY)||n||void 0}function xe(e,t){if(!t)return!1;let n=Y(e.hostname).toLowerCase(),r=e.port||(e.protocol===`https:`?`443`:`80`);return t.split(/[\s,]+/).filter(Boolean).some(e=>{if(e===`*`)return!0;let t=Te(e);if(t.port&&t.port!==r)return!1;let i=t.hostname.replace(/^\*?\./,``).toLowerCase();return n===i||n.endsWith(`.${i}`)})}function Se(e,t){return new ne({connect:{lookup:(n,r,i)=>i(null,e,t)}})}function Ce(e,t){let n=u.isIP(Y(t.hostname))!==0;return new re({uri:e,proxyTunnel:!0,requestTls:t.protocol===`https:`&&!n?{servername:Y(t.hostname)}:void 0})}function we(e,t,n){let r=new URL(e);return r.hostname=n===6?`[${Y(t)}]`:t,r}function Te(e){if(e.startsWith(`[`)){let t=e.indexOf(`]`);return t<0?{hostname:e}:{hostname:e.slice(1,t),port:e[t+1]===`:`?e.slice(t+2):void 0}}let t=e.lastIndexOf(`:`);return t>-1&&e.indexOf(`:`)===t?{hostname:e.slice(0,t),port:e.slice(t+1)}:{hostname:e}}function Y(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}async function X(e){await e.close()}const Ee=new Set([301,302,303,307,308]),De=new Set([`accept-encoding`,`connection`,`content-length`,`host`,`keep-alive`,`proxy-connection`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`]);async function Oe(e){let t=Le(e.url),n=Pe(e.headers);for(let r=0;;r+=1){let i=await ke(t,n,e.signal);try{let a=Ae(i,t,r);if(a){a.origin!==t.origin&&(n=Fe(n)),t=a;continue}return je(i),await Me(e.tempDir,t,i)}finally{await i.close()}}}async function ke(t,n,r){let i=await H(t,r);try{return await ye({url:t,approvedAddress:i.address,family:i.family,headers:{...n,"accept-encoding":`identity`},signal:r})}catch(t){throw t instanceof e?t:new e(`COMMAND_FAILED`,`App source network request failed`,void 0,t)}}function Ae(t,n,r){if(!Ee.has(t.statusCode))return;t.body.resume?.();let i=Z(t.headers,`location`);if(!i||r>=5)throw new e(`COMMAND_FAILED`,`App source redirect limit was exceeded`,{status:t.statusCode});let a=new URL(i,n);if(n.protocol===`https:`&&a.protocol!==`https:`)throw new e(`COMMAND_FAILED`,`App source redirect downgraded HTTPS`);return a}function je(t){if(!(t.statusCode>=200&&t.statusCode<300))throw new e(`COMMAND_FAILED`,`Failed to download app source: ${t.statusCode}`,{status:t.statusCode})}async function Me(t,r,i){let s=Z(i.headers,`content-encoding`);if(s&&s.toLowerCase()!==`identity`)throw new e(`COMMAND_FAILED`,`App source response used unsupported content encoding`);Ne(Z(i.headers,`content-length`));let l=n.join(t,Ie(i,r)),u=J({maxBytes:m,createLimitError:()=>new e(`COMMAND_FAILED`,`App source exceeds maximum size of ${m} bytes`,{reason:`ARTIFACT_BYTE_LIMIT`})});try{return await c(i.body,u,a(l,{flags:`wx`})),l}catch(e){throw await o.rm(l,{force:!0}).catch(()=>{}),e}}function Ne(t){if(t===null)return;if(!/^\d+$/.test(t))throw new e(`COMMAND_FAILED`,`App source response had invalid content-length`);let n=Number(t);if(!Number.isSafeInteger(n)||n>2147483648)throw new e(`COMMAND_FAILED`,`App source response exceeded the byte limit`,{reason:`ARTIFACT_BYTE_LIMIT`})}function Pe(e){let t=new Set(Object.entries(e??{}).filter(([e])=>e.toLowerCase()===`connection`).flatMap(([,e])=>e.split(`,`).map(e=>e.trim().toLowerCase())));return Object.fromEntries(Object.entries(e??{}).filter(([e])=>{let n=e.toLowerCase();return!De.has(n)&&!t.has(n)}))}function Fe(e){return Object.fromEntries(Object.entries(e).filter(([e])=>[`accept`,`user-agent`].includes(e.toLowerCase())))}function Ie(e,t){let r=(Z(e.headers,`content-disposition`)?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i))?.[1]?.trim()||n.basename(t.pathname)||`downloaded-artifact.bin`;return n.basename(r)}function Z(e,t){let n=e[t];return Array.isArray(n)?n[0]??null:n??null}function Le(t){try{let n=new URL(t);if(n.username||n.password)throw new e(`INVALID_ARGS`,`Source URL credentials are not allowed`);return n}catch{throw new e(`INVALID_ARGS`,`Invalid source URL`)}}const Re=Object.freeze([`.zip`,`.tar`,`.tar.gz`,`.tgz`]);async function Q(e){let t=[];try{let n=await Be(e.source,{signal:e.signal,downloadTimeoutMs:e.downloadTimeoutMs});t.push(n.cleanup);let r=await N(n.localPath,{archivePath:void 0,isInstallablePath:e.isInstallablePath,installableLabel:e.installableLabel,allowArchiveExtraction:e.allowArchiveExtraction!==!1,registerCleanup:e=>{t.push(e)},budget:B()??new h,archiveDepth:0,onArchiveAccepted:V});return{archivePath:r.archivePath,installablePath:r.installablePath,cleanup:async()=>{await $(t)}}}catch(e){throw await $(t),e}}function ze(e){return t(e)}async function Be(e,t){if(e.kind===`path`)return{localPath:ze(e.path),cleanup:async()=>{}};let r=await o.mkdtemp(n.join(s.tmpdir(),`agent-device-source-`));try{return{localPath:await Ve(r,e.url,e.headers,t),cleanup:async()=>{await o.rm(r,{recursive:!0,force:!0})}}}catch(e){throw await o.rm(r,{recursive:!0,force:!0}),e}}async function Ve(t,n,r,i){let a=i?.signal;if(a?.aborted)throw new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`});let o=i?.downloadTimeoutMs??12e4,s=AbortSignal.timeout(o),c=a?AbortSignal.any([a,s]):s;try{return await Oe({tempDir:t,url:n,headers:r,signal:c})}catch(e){throw He(e,a,s,o)}}function He(t,n,r,i){return n?.aborted?new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`},t):r.aborted?new e(`COMMAND_FAILED`,`App source download timed out after ${i}ms`,{timeoutMs:i},t):t}async function Ue(e){await H(e)}function We(e){let t=e instanceof URL?e:new URL(e),n=t.hostname.toLowerCase();if(!n)return!1;let r=t.pathname;return Ge(n,r)||Ke(n,r)}function Ge(e,t){return e===`api.github.com`?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(t):e===`github.com`?/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(t):!1}function Ke(e,t){return e!==`expo.dev`&&!e.endsWith(`.expo.dev`)?!1:/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(t)}async function $(e){for(let t of[...e].reverse())await t()}export{J as a,V as c,m as d,Ue as i,z as l,We as n,B as o,Q as r,he as s,Re as t,j as u};
1
+ import{_ as e,w as t,y as n}from"./sdk-contracts.js";import{t as r}from"./path-resolution.js";import{a as i,i as a,n as o,r as s,t as c}from"./byte-limit-stream.js";import l from"node:path";import{createWriteStream as u,promises as d}from"node:fs";import f from"node:os";import{AsyncLocalStorage as p}from"node:async_hooks";import{pipeline as m}from"node:stream/promises";import h from"node:net";import g from"node:dns/promises";import _ from"ipaddr.js";import{Agent as v,ProxyAgent as ee,request as te}from"undici";async function y(t,n){let r=await d.stat(t).catch(()=>null);if(!r)throw new e(`INVALID_ARGS`,`App source not found: ${t}`);if(n.isInstallablePath(t,r))return{archivePath:n.archivePath,installablePath:t};if(r.isFile()&&w(t))return C(t,n,!1),await b(t,n);if(r.isDirectory()){let r=await S(t,n.isInstallablePath);if(r.length===1)return{archivePath:n.archivePath,installablePath:r[0]};if(r.length>1)throw new e(`INVALID_ARGS`,`Found multiple ${n.installableLabel} candidates under ${t}: ${r.join(`, `)}`,{matches:r});let i=await S(t,(e,t)=>!!(t.isFile()&&w(e)));if(i.length===1)return C(i[0],n,!0),await b(i[0],n);if(i.length>1)throw new e(`INVALID_ARGS`,`Found multiple nested archives under ${t}; expected one ${n.installableLabel} source`,{matches:i})}throw new e(`INVALID_ARGS`,`Expected ${n.installableLabel} source, but got ${t}`)}async function b(e,t){let n=await x(e,t.budget,t.archiveDepth+1);return t.onArchiveAccepted?.(t.archiveDepth+1),t.registerCleanup(n.cleanup),await y(n.outputPath,{...t,archivePath:t.archivePath??e,archiveDepth:t.archiveDepth+1})}async function x(t,n,r){let i=o(t);if(!i)throw new e(`INVALID_ARGS`,`Unsupported archive: ${t}`);let a=await d.mkdtemp(l.join(f.tmpdir(),`agent-device-archive-`)),c=l.join(a,`extracted`);try{return await s({archivePath:t,outputRoot:c,type:i,budget:n,depth:r}),{outputPath:c,cleanup:async()=>await d.rm(a,{recursive:!0,force:!0})}}catch(e){throw await d.rm(a,{recursive:!0,force:!0}),e}}async function S(e,t){let n=[],r=[{path:e,depth:0}];for(;r.length>0;){let e=r.shift();if(!e)continue;let i=await d.readdir(e.path,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i){if(a.name===`__MACOSX`||a.name.startsWith(`._`))continue;let i=l.join(e.path,a.name);t(i,a)?n.push(i):a.isDirectory()&&e.depth<5&&r.push({path:i,depth:e.depth+1})}}return[...new Set(n)]}function C(t,n,r){if(!n.allowArchiveExtraction)throw new e(`INVALID_ARGS`,r?`URL sources must point directly to a ${n.installableLabel}; nested archives are not allowed`:`URL sources must point directly to a ${n.installableLabel}; archive extraction is not allowed`,{path:t})}function w(e){return o(e)!==void 0}const T=new p;async function E(e){return await T.run({budget:new a,depth:0},e)}function D(){return T.getStore()?.budget}function ne(){return T.getStore()?.depth??0}function O(e){let t=T.getStore();t&&(t.depth=Math.max(t.depth,e))}async function k(n,r){if(n.protocol!==`http:`&&n.protocol!==`https:`)throw new e(`INVALID_ARGS`,`Unsupported source URL protocol: ${n.protocol}`);if(n.username||n.password)throw new e(`INVALID_ARGS`,`Source URL credentials are not allowed`);j(r);let i=F(n.hostname);N(i)&&L(n.hostname);let a=h.isIP(i);if(a)return{address:i,family:a};let o;try{o=await A(i,r)}catch(n){throw t(n)?n:new e(`INVALID_ARGS`,`Source URL host could not be resolved: ${i}`,{hint:`Use a public artifact URL.`},n)}if(o.length===0)throw new e(`INVALID_ARGS`,`Source URL host could not be resolved: ${i}`,{hint:`Use a public artifact URL.`});o.some(e=>P(e.address))&&L(i);let s=o[0];return{address:s.address,family:s.family}}async function A(e,t){let n=g.lookup(e,{all:!0,verbatim:!0});return t?await new Promise((e,r)=>{let i=()=>r(M(t.reason));t.addEventListener(`abort`,i,{once:!0}),n.then(e,r).finally(()=>t.removeEventListener(`abort`,i))}):await n}function j(e){if(e?.aborted)throw M(e.reason)}function M(e){return n(void 0,e)}function N(e){let t;try{t=F(e)}catch{return!0}return!t||t===`localhost`||t.endsWith(`.localhost`)?!0:h.isIP(t)!==0&&P(t)}function P(e){try{return _.process(I(e)).range()!==`unicast`}catch{return!0}}function F(t){let n=I(t).toLowerCase().replace(/\.$/,``);if(!n||n.includes(`%`))throw new e(`INVALID_ARGS`,`Source URL host is not allowed`,{hint:`Use a public artifact URL.`});return n}function I(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}function L(t){throw new e(`INVALID_ARGS`,`Source URL host is not allowed because it resolves to a non-public address: ${t}`,{hint:`Use a public artifact URL.`})}async function R(e){let t=z(e.url),n=t?H(t,e.url):V(e.approvedAddress,e.family),r=t?U(e.url,e.approvedAddress,e.family):e.url;try{let i=await te(r,{dispatcher:n,headers:t?{...e.headers,host:e.url.host}:e.headers,maxRedirections:0,method:`GET`,signal:e.signal});return{statusCode:i.statusCode,headers:i.headers,body:i.body,close:async()=>await K(n)}}catch(e){throw await K(n),e}}function z(e,t=process.env){if(B(e,t.no_proxy??t.NO_PROXY))return;let n=t.http_proxy??t.HTTP_PROXY;return e.protocol===`http:`?n||void 0:(t.https_proxy??t.HTTPS_PROXY)||n||void 0}function B(e,t){if(!t)return!1;let n=G(e.hostname).toLowerCase(),r=e.port||(e.protocol===`https:`?`443`:`80`);return t.split(/[\s,]+/).filter(Boolean).some(e=>{if(e===`*`)return!0;let t=W(e);if(t.port&&t.port!==r)return!1;let i=t.hostname.replace(/^\*?\./,``).toLowerCase();return n===i||n.endsWith(`.${i}`)})}function V(e,t){return new v({connect:{lookup:(n,r,i)=>i(null,e,t)}})}function H(e,t){let n=h.isIP(G(t.hostname))!==0;return new ee({uri:e,proxyTunnel:!0,requestTls:t.protocol===`https:`&&!n?{servername:G(t.hostname)}:void 0})}function U(e,t,n){let r=new URL(e);return r.hostname=n===6?`[${G(t)}]`:t,r}function W(e){if(e.startsWith(`[`)){let t=e.indexOf(`]`);return t<0?{hostname:e}:{hostname:e.slice(1,t),port:e[t+1]===`:`?e.slice(t+2):void 0}}let t=e.lastIndexOf(`:`);return t>-1&&e.indexOf(`:`)===t?{hostname:e.slice(0,t),port:e.slice(t+1)}:{hostname:e}}function G(e){return e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e}async function K(e){await e.close()}const q=new Set([301,302,303,307,308]),J=new Set([`accept-encoding`,`connection`,`content-length`,`host`,`keep-alive`,`proxy-connection`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`]);async function re(e){let t=ue(e.url),n=se(e.headers);for(let r=0;;r+=1){let i=await Y(t,n,e.signal);try{let a=X(i,t,r);if(a){a.origin!==t.origin&&(n=ce(n)),t=a;continue}return ie(i),await ae(e.tempDir,t,i)}finally{await i.close()}}}async function Y(t,n,r){let i=await k(t,r);try{return await R({url:t,approvedAddress:i.address,family:i.family,headers:{...n,"accept-encoding":`identity`},signal:r})}catch(t){throw t instanceof e?t:new e(`COMMAND_FAILED`,`App source network request failed`,void 0,t)}}function X(t,n,r){if(!q.has(t.statusCode))return;t.body.resume?.();let i=Z(t.headers,`location`);if(!i||r>=5)throw new e(`COMMAND_FAILED`,`App source redirect limit was exceeded`,{status:t.statusCode});let a=new URL(i,n);if(n.protocol===`https:`&&a.protocol!==`https:`)throw new e(`COMMAND_FAILED`,`App source redirect downgraded HTTPS`);return a}function ie(t){if(!(t.statusCode>=200&&t.statusCode<300))throw new e(`COMMAND_FAILED`,`Failed to download app source: ${t.statusCode}`,{status:t.statusCode})}async function ae(t,n,r){let a=Z(r.headers,`content-encoding`);if(a&&a.toLowerCase()!==`identity`)throw new e(`COMMAND_FAILED`,`App source response used unsupported content encoding`);oe(Z(r.headers,`content-length`));let o=l.join(t,le(r,n)),s=c({maxBytes:i,createLimitError:()=>new e(`COMMAND_FAILED`,`App source exceeds maximum size of ${i} bytes`,{reason:`ARTIFACT_BYTE_LIMIT`})});try{return await m(r.body,s,u(o,{flags:`wx`})),o}catch(e){throw await d.rm(o,{force:!0}).catch(()=>{}),e}}function oe(t){if(t===null)return;if(!/^\d+$/.test(t))throw new e(`COMMAND_FAILED`,`App source response had invalid content-length`);let n=Number(t);if(!Number.isSafeInteger(n)||n>2147483648)throw new e(`COMMAND_FAILED`,`App source response exceeded the byte limit`,{reason:`ARTIFACT_BYTE_LIMIT`})}function se(e){let t=new Set(Object.entries(e??{}).filter(([e])=>e.toLowerCase()===`connection`).flatMap(([,e])=>e.split(`,`).map(e=>e.trim().toLowerCase())));return Object.fromEntries(Object.entries(e??{}).filter(([e])=>{let n=e.toLowerCase();return!J.has(n)&&!t.has(n)}))}function ce(e){return Object.fromEntries(Object.entries(e).filter(([e])=>[`accept`,`user-agent`].includes(e.toLowerCase())))}function le(e,t){let n=(Z(e.headers,`content-disposition`)?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i))?.[1]?.trim()||l.basename(t.pathname)||`downloaded-artifact.bin`;return l.basename(n)}function Z(e,t){let n=e[t];return Array.isArray(n)?n[0]??null:n??null}function ue(t){let n;try{n=new URL(t)}catch{throw new e(`INVALID_ARGS`,`Invalid source URL`)}if(n.username||n.password)throw new e(`INVALID_ARGS`,`Source URL credentials are not allowed`);return n}const de=Object.freeze([`.zip`,`.tar`,`.tar.gz`,`.tgz`]);async function fe(e){let t=[];try{let n=await me(e.source,{signal:e.signal,downloadTimeoutMs:e.downloadTimeoutMs});t.push(n.cleanup);let r=await y(n.localPath,{archivePath:void 0,isInstallablePath:e.isInstallablePath,installableLabel:e.installableLabel,allowArchiveExtraction:e.allowArchiveExtraction!==!1,registerCleanup:e=>{t.push(e)},budget:D()??new a,archiveDepth:0,onArchiveAccepted:O});return{archivePath:r.archivePath,installablePath:r.installablePath,cleanup:async()=>{await $(t)}}}catch(e){throw await $(t),e}}function pe(e){return r(e)}async function me(e,t){if(e.kind===`path`)return{localPath:pe(e.path),cleanup:async()=>{}};let n=await d.mkdtemp(l.join(f.tmpdir(),`agent-device-source-`));try{return{localPath:await Q(n,e.url,e.headers,t),cleanup:async()=>{await d.rm(n,{recursive:!0,force:!0})}}}catch(e){throw await d.rm(n,{recursive:!0,force:!0}),e}}async function Q(e,t,r,i){let a=i?.signal;if(a?.aborted)throw n();let o=i?.downloadTimeoutMs??12e4,s=AbortSignal.timeout(o),c=a?AbortSignal.any([a,s]):s;try{return await re({tempDir:e,url:t,headers:r,signal:c})}catch(e){throw he(e,a,s,o)}}function he(t,r,i,a){return r?.aborted?n(void 0,t):i.aborted?new e(`COMMAND_FAILED`,`App source download timed out after ${a}ms`,{timeoutMs:a},t):t}async function ge(e){await k(e)}function _e(e){let t=e instanceof URL?e:new URL(e),n=t.hostname.toLowerCase();if(!n)return!1;let r=t.pathname;return ve(n,r)||ye(n,r)}function ve(e,t){return e===`api.github.com`?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(t):e===`github.com`?/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(t):!1}function ye(e,t){return e!==`expo.dev`&&!e.endsWith(`.expo.dev`)?!1:/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(t)}async function $(e){for(let t of[...e].reverse())await t()}export{D as a,E as c,ge as i,_e as n,ne as o,fe as r,O as s,de as t};
@@ -0,0 +1 @@
1
+ import{I as e,P as t,Q as n,R as r}from"./screenshot-result.js";import{i}from"./session-target-evidence.js";import{A as a}from"./sdk-android-adb.js";import{a as o}from"./input-actions.js";import{At as s,kt as c,ot as l,st as u}from"./internal/daemon.js";async function d(e){let{session:t,flags:n,sessionStore:r,contextFromFlags:i,captureSnapshotForSession:a}=e,s=t.screenRecording?.handle;if(!s)return;let c=s.inspect().touchReferenceFrame;if(c)return c;if(t.device.platform===`android`){let e=await o(t.device),n={referenceWidth:e.width,referenceHeight:e.height};return s.setTouchReferenceFrame(n),n}let l=u(t.snapshot);if(l)return s.setTouchReferenceFrame(l),l;let d=u(await a(t,n,r,i,{interactiveOnly:!0}));return d&&s.setTouchReferenceFrame(d),d}async function f(e){try{return await d(e)}catch(t){a({level:`warn`,phase:`touch_reference_frame_resolve_failed`,data:{platform:e.session.device.platform,error:t instanceof Error?t.message:String(t)}});return}}function p(e){return u({nodes:e,createdAt:0})}function m(e){let{session:t,sessionStore:r,command:a,positionals:o,actionCommand:u=a,retryPositionals:d,flags:f,result:p,responseData:m,recordedTarget:_,recordedTargets:v,scheduleInteractionOutcomeRetry:y=!0,actionStartedAt:b,actionFinishedAt:x,androidFreshnessBaseline:S}=e,C=s(f),[w,T]=g({command:a,positionals:o,flags:C,result:p,responseData:m}),E=n(t)&&_?i(_):void 0,D=n(t)&&v?h(v):void 0;return r.recordAction(t,{command:a,positionals:o,flags:C??{},result:w,...E?{targetEvidence:E}:{},...D?{targetEvidences:D}:{}}),c({session:t,command:a,action:u,positionals:d??o,flags:f,scheduleOutcomeRetry:y,androidFreshnessBaseline:S}),l(t,u,o,w,C??{},b,x),{ok:!0,data:T}}function h(e){let t=i(e.source),n=i(e.destination);return t&&n?{source:t,destination:n}:void 0}function g(n){if(n.command!==`fill`||typeof n.flags?.recordAs!=`string`)return[n.result,n.responseData];let i=r({ts:0,command:`fill`,positionals:n.positionals,flags:n.flags,result:n.result}),a=e(n.flags.recordAs);return[t(n.result,i,a),t(n.responseData,i,a)]}export{p as n,f as r,m as t};
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{c as t}from"./version.js";import{_ as n}from"./sdk-device.js";import{t as r}from"./runtime.js";import{N as i}from"./runner-disposal.js";import{a,n as o,r as s,t as c}from"./dispatch.js";import{Zt as l,gn as u,qt as d,tn as f}from"./internal/daemon.js";import{a as p,f as m,u as h,y as g}from"./selector-runtime.js";import{a as _,l as v}from"./snapshot-session.js";async function y(e){let{session:n,node:r,rootViewport:i,requestOptions:a}=e,o=h(r);if(!o)return null;let s;try{s=await p(n,o,a)}catch{return null}if(!s.found||!s.node?.rect)return null;let c={rect:s.node.rect,hittable:s.node.hittable===!0};return t(c,i)?c.rect:null}function b(t){let n=t.sessionStore.get(t.sessionName);if(!n)throw new e(`SESSION_NOT_FOUND`,a);return r({backend:x({...t,session:n}),...v(`interaction commands`,{plural:!0}),sessions:d({sessionName:t.sessionName,getSession:()=>n,recordOptions:{includeSnapshot:!0,omitRefFrameSnapshot:t.req.internal?.findResolvedTarget!==void 0},setRecord:e=>{e.snapshot&&(l(n,e.snapshot),t.sessionStore.set(t.sessionName,n))}}),signal:i(t.req.meta?.requestId)})}function x(e){let{req:t,session:r}=e,i=S(r);return{platform:n(r.device),captureSnapshot:async(n,i)=>({snapshot:await e.captureSnapshotForSession(r,t.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:i?.interactiveOnly===!0,includeRects:i?.includeRects===!0,signal:n.signal})}),resolveGestureViewport:async()=>e.pairedGestureViewport??await s(r.device,e.contextFromFlags(t.flags,r.appBundleId,r.trace?.outPath)),confirmOffscreenTargetVisible:m(r,{skipPendingPostGestureStabilization:!1})?async(n,i,a)=>await y({session:r,node:i,rootViewport:a,requestOptions:_({req:t,logPath:e.logPath,traceLogPath:r.trace?.outPath})}):void 0,tap:async(n,i)=>(f(r),C(await c(r.device,`press`,[String(i.x),String(i.y)],t.flags?.out,e.contextFromFlags(t.flags,r.appBundleId,r.trace?.outPath)))),tapTarget:i?.clickRef?async(e,t)=>(f(r),await i.clickRef?.(t.ref),{ref:g(t.ref)}):void 0,fill:async(n,i,a,o)=>(f(r),C(await c(r.device,`fill`,[String(i.x),String(i.y),a],t.flags?.out,{...e.contextFromFlags(t.flags,r.appBundleId,r.trace?.outPath),allowNonHittableCoordinateFallback:o?.allowNonHittableCoordinateFallback}))),fillTarget:i?.fillRef?async(e,t,n,a)=>(f(r),await i.fillRef?.(t.ref,n,a),{ref:g(t.ref),text:n,delayMs:a?.delayMs??0}):void 0,longPress:async(n,i,a)=>(f(r),C(await c(r.device,`longpress`,[String(i.x),String(i.y),...a?.durationMs===void 0?[]:[String(a.durationMs)]],t.flags?.out,e.contextFromFlags(t.flags,r.appBundleId,r.trace?.outPath)))),performGesture:async(n,i)=>(f(r),C(await o(r.device,i,e.contextFromFlags(t.flags,r.appBundleId,r.trace?.outPath)))),typeText:async(n,i)=>(f(r),C(await c(r.device,`type`,[i],t.flags?.out,e.contextFromFlags(t.flags,r.appBundleId,r.trace?.outPath))))}}function S(e){if(e.device.platform!==`web`)return;let t=u();return t.clickRef||t.fillRef?t:void 0}function C(e){return e&&typeof e==`object`?e:void 0}export{b as t};
1
+ import{_ as e}from"./sdk-contracts.js";import{_ as t}from"./sdk-device.js";import{i as n}from"./mobile-snapshot-semantics.js";import{t as r}from"./runtime.js";import{j as i}from"./runner-disposal.js";import{i as a,n as o,r as s,t as c}from"./dispatch.js";import{n as l}from"./provider.js";import{bt as u,ft as d,gt as f}from"./internal/daemon.js";import{a as p,b as m,f as h,m as g,u as _}from"./selector-runtime.js";import{a as v}from"./snapshot-session.js";async function y(e){let{session:t,node:r,rootViewport:i,requestOptions:a}=e,o=_(r);if(!o)return null;let s;try{s=await p(t,o,a)}catch{return null}if(!s.found||!s.node?.rect)return null;let c={rect:s.node.rect,hittable:s.node.hittable===!0};return n(c,i)?c.rect:null}function b(t){let n=t.sessionStore.get(t.sessionName);if(!n)throw new e(`SESSION_NOT_FOUND`,a);return r({backend:x({...t,session:n}),...v(`interaction commands`,{plural:!0}),sessions:d({sessionName:t.sessionName,getSession:()=>n,recordOptions:{includeSnapshot:!0,omitRefFrameSnapshot:t.req.internal?.findResolvedTarget!==void 0},setRecord:e=>{e.snapshot&&(f(n,e.snapshot),t.sessionStore.set(t.sessionName,n))}}),signal:i(t.req.meta?.requestId)})}function x(e){let{req:n,session:r}=e,i=S(r);return{platform:t(r.device),captureSnapshot:async(t,i)=>({snapshot:await e.captureSnapshotForSession(r,n.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:i?.interactiveOnly===!0,preferredBackend:i?.preferredBackend,includeRects:i?.includeRects===!0,signal:t.signal})}),resolveGestureViewport:async()=>e.pairedGestureViewport??await s(r.device,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)),confirmOffscreenTargetVisible:h(r,{skipPendingPostGestureStabilization:!1})?async(t,i,a)=>await y({session:r,node:i,rootViewport:a,requestOptions:g({req:n,logPath:e.logPath,traceLogPath:r.trace?.outPath})}):void 0,tap:async(t,i)=>(u(r),C(await c(r.device,`press`,[String(i.x),String(i.y)],n.flags?.out,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)))),tapTarget:i?.clickRef?async(e,t)=>(u(r),await i.clickRef?.(t.ref),{ref:m(t.ref)}):void 0,fill:async(t,i,a,o)=>(u(r),C(await c(r.device,`fill`,[String(i.x),String(i.y),a],n.flags?.out,{...e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath),allowNonHittableCoordinateFallback:o?.allowNonHittableCoordinateFallback}))),fillTarget:i?.fillRef?async(e,t,n,a)=>(u(r),await i.fillRef?.(t.ref,n,a),{ref:m(t.ref),text:n,delayMs:a?.delayMs??0}):void 0,longPress:async(t,i,a)=>(u(r),C(await c(r.device,`longpress`,[String(i.x),String(i.y),...a?.durationMs===void 0?[]:[String(a.durationMs)]],n.flags?.out,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)))),hoverTarget:i?.hoverRef?async(e,t)=>(u(r),await i.hoverRef?.(t.ref),{ref:m(t.ref)}):void 0,hover:async(t,i)=>(u(r),C(await c(r.device,`hover`,[String(i.x),String(i.y)],n.flags?.out,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)))),performGesture:async(t,i)=>(u(r),C(await o(r.device,i,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath)))),typeText:async(t,i)=>(u(r),C(await c(r.device,`type`,[i],n.flags?.out,e.contextFromFlags(n.flags,r.appBundleId,r.trace?.outPath))))}}function S(e){if(e.device.platform!==`web`)return;let t=l();return t.clickRef||t.fillRef||t.hoverRef?t:void 0}function C(e){return e&&typeof e==`object`?e:void 0}export{b as t};
@@ -1 +1 @@
1
- import{z as e}from"./prepare-kind.js";import{Zt as t,an as n}from"./internal/daemon.js";async function r(r,i,a,o,s){let c={...i??{},snapshotInteractiveOnly:s.interactiveOnly,...s.preferredBackend?{snapshotPreferredBackend:s.preferredBackend}:{}},l=o(c,r.appBundleId,r.trace?.outPath),{snapshot:u}=await n({device:r.device,session:r,flags:c,outPath:c.out,logPath:l.logPath??``,includeRects:s.includeRects,androidFreshnessMode:s.androidFreshnessMode,signal:s.signal});return e(u.snapshotQuality)||(t(r,u),a.set(r.name,r)),u}export{r as t};
1
+ import{t as e}from"./verdict.js";import{gt as t,wt as n}from"./internal/daemon.js";import{t as r}from"./backend-snapshot-options.js";async function i(i,a,o,s,c){let l={...a??{},...r(c)},u=s(l,i.appBundleId,i.trace?.outPath),{snapshot:d}=await n({device:i.device,session:i,flags:l,outPath:l.out,logPath:u.logPath??``,includeRects:c.includeRects,androidFreshnessMode:c.androidFreshnessMode,signal:c.signal});return e(d.snapshotQuality)||(t(i,d),o.set(i.name,i)),d}export{i as t};
@@ -1 +1 @@
1
- import{S as e,_ as t,h as n,s as r,v as i}from"./sdk-contracts.js";import{G as a,K as o,V as s,X as c,dt as l,et as u,ft as d,nt as f,q as p,ut as ee}from"./version.js";import{C as m,Ht as h,_ as g,g as _,v}from"./sdk-batch-runner.js";import{_ as te,l as y,s as b}from"./sdk-device.js";import{Xt as x,at as S,gn as C,kt as ne,z as re}from"./prepare-kind.js";import{F as ie,X as w}from"./screenshot-result.js";import{i as ae}from"./runtime.js";import{j as T}from"./sdk-android-adb.js";import{t as oe}from"./timeouts.js";import{N as se}from"./runner-disposal.js";import{E as ce,c as E,d as D,o as O,s as k,t as le}from"./dispatch.js";import{Gt as A,Jt as j,Kt as ue,Xt as M,Yt as de,en as fe,in as pe,pn as me,rn as he,tn as ge}from"./internal/daemon.js";import{S as N,_ as _e,b as P,c as ve,d as ye,f as be,g as xe,h as Se,l as Ce,m as we,n as Te,p as Ee,r as De,v as Oe,x as ke}from"./selector-runtime.js";import{t as F}from"./interaction-runtime.js";import{t as I}from"./interaction-snapshot.js";import{n as Ae,r as L,t as R}from"./interaction-touch-reference-frame.js";const je=new Set(v());function Me(e){return Pe({fields:Ne(e.command),input:e.input??{},data:e.data,controlledFields:je})}function Ne(e){let t=m(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function Pe(e){let t=Object.fromEntries(Object.entries(e.data??{}).filter(([t])=>!e.controlledFields.has(t)));for(let[n,r]of Object.entries(e.fields)){let i=e.input[n]===void 0?r.defaultValue:e.input[n];if(i===void 0||r.omitDefault===!0&&i===r.defaultValue){delete t[n];continue}t[n]=i}return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}const Fe=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function Ie(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!Fe.has(e)))}function Le(e){let n=e.flags?.recordAs;if(n!==void 0){if(ie(n),e.flags?.noRecord)throw new t(`INVALID_ARGS`,`fill --record-as cannot be combined with --no-record because no script step would be published.`);if(!w(e.session)&&!e.replayPlanStep)throw new t(`INVALID_ARGS`,`fill --record-as requires an armed script recording. Start a fresh session with open --save-script, then retry the fill.`)}}function z(e){try{return B(e),null}catch(e){if(e instanceof t)return O(e.code,e.message,e.details);throw e}}function B(e){let n=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,r=fe({session:e.session,refBody:n,mintedGeneration:e.mintedGeneration});if(r.admitted)return;let i=pe(e.session);throw new t(`COMMAND_FAILED`,ze(r.reason,e.ref),{reason:r.reason,ref:e.ref,currentGeneration:he(e.session),scope:i===`all`?`all`:Array.from(i),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},hint:e.staleRefsWarning??Re})}const Re=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function ze(e,t){switch(e){case`ref_frame_expired`:return`Ref ${t} belongs to an expired ref frame — a device action since the snapshot invalidated it`;case`ref_generation_mismatch`:return`Ref ${t} was minted from a superseded snapshot generation`;case`plain_ref_requires_complete_frame`:return`Ref ${t} needs a complete snapshot — the current frame only authorizes its emitted refs`;case`ref_not_issued`:return`Ref ${t} was not issued by the current ref frame`}}function V(e,t){return!y(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:O(`UNSUPPORTED_OPERATION`,`${t} is not supported on macOS ${e.surface} sessions yet. Open an app session to act, or use the ${e.surface} surface to inspect.`)}const Be={source:`direct-ios`,kind:`not-observed`};function H(e,t){if(!Ve(e))return t;let{resolution:n,...r}=t;return r}function Ve(e){return e.maestroCoordinateFallbackDispatched===!0}function U(e){return W({source:{kind:`corroborated-tap`,targetKind:e.targetKind,data:{warning:e.warning},publicData:{warning:e.warning},point:e.point,resolution:e.resolution},referenceFrame:e.referenceFrame,extra:e.extra})}function W(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`||t.kind===`corroborated-tap`){let e={targetKind:t.targetKind,...H(t,{resolution:t.kind===`runner-payload`?Be:t.resolution}),...r??{}};return{result:K({data:t.data,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e}),responseData:K({data:t.publicData,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e})}}let{result:i}=t,a={targetKind:i.kind,...H(t,Se(i)),...We(i.settle,e.settleRefsGeneration),...r??{}},o=K({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...a,...Ue(i)}}),s=K({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:a}),c=Ge(`warning`in i?i.warning:void 0,e.staleRefsWarning);return c&&(o.warning=c,s.warning=c),{result:o,responseData:s,...He(i)}}function He(e){let t=G(e)?.node??(`node`in e?e.node:void 0),n=`preActionNodes`in e?e.preActionNodes:void 0;return t&&n?{recordedTarget:{node:t,preActionNodes:n}}:{}}function Ue(e){let t=G(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function G(e){return`recordingTarget`in e?e.recordingTarget:void 0}function We(e,t){return!e?.diff||t===void 0?{}:{settle:{...e,refsGeneration:t}}}function Ge(e,t){return t?e?`${e} ${t}`:t:e}function K(e){let{data:t,fallbackX:n,fallbackY:r,referenceFrame:i,extra:a}=e,o=qe(a,n,r)??(typeof t?.message==`string`?t.message:void 0);return Ke({...t??{},...n===void 0||r===void 0?{}:{x:n,y:r},...i??{},...a??{},...C(o)})}function Ke(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function qe(e,t,n){let r=q(e,`text`);if(r!==void 0)return`Filled ${Array.from(r).length} chars`;let i=Je(t,n),a=Ye(e);if(a)return Ze(a,e??{},i);if(i)return Xe(e,i)}function q(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Je(e,t){return e===void 0||t===void 0?``:` (${e}, ${t})`}function Ye(e){let t=q(e,`ref`);return t===void 0?q(e,`selector`):`@${t}`}function Xe(e,t){return e?.gesture===`longpress`?`Long pressed${t}`:`Tapped${t}`}function Ze(e,t,n){let r=typeof t.button==`string`?t.button:void 0;return t.gesture===`longpress`?`Long pressed ${e}${n}`:r&&r!==`primary`?`Clicked ${r} ${e}${n}`:`Tapped ${e}${n}`}async function J(e){if(!Qe(e))return;let t=et(e.session.snapshot);if(!t)return;let n=await tt(e,t.snapshot.snapshotQuality?.backend,t.presentation);if(!(!n||!nt(t.snapshot,n,e.command)))return rt(t.snapshot,n,e.command)}function Qe(e){return $e(e.command)&&i(e.error).code===`XCTEST_RECORDED_FAILURE`&&be(e.session,{skipPendingPostGestureStabilization:!1})}function $e(e){return e===`click`||e===`press`}function et(e){if(!Y(e))return;let t=Date.now()-e.createdAt;if(t<0||t>15e3){T({level:`debug`,phase:`ios_tap_failure_corroboration_stale_baseline`,data:{ageMs:t}});return}let n=it(e.presentationKey);if(n){if(n.raw){T({level:`debug`,phase:`ios_tap_failure_corroboration_raw_baseline`,data:{presentationKey:e.presentationKey}});return}return{snapshot:e,presentation:n}}}async function tt(e,t,n){try{return await e.captureSnapshotForSession(e.session,lt(e.flags,n),e.sessionStore,e.contextFromFlags,{interactiveOnly:n?.interactiveOnly??!0,...t===`private-ax`?{preferredBackend:`private-ax`}:{},signal:se(e.requestId)})}catch(t){T({level:`debug`,phase:`ios_tap_failure_corroboration_capture_failed`,data:{command:e.command,error:t instanceof Error?t.message:String(t)}});return}}function nt(e,t,n){let r=e.snapshotQuality?.backend,i=t.snapshotQuality?.backend;return!r||r!==i?(T({level:`debug`,phase:`ios_tap_failure_corroboration_backend_mismatch`,data:{command:n,baselineBackend:r,afterBackend:i}}),!1):e.presentationKey===t.presentationKey?!0:(T({level:`debug`,phase:`ios_tap_failure_corroboration_scope_mismatch`,data:{command:n,baselinePresentationKey:e.presentationKey,afterPresentationKey:t.presentationKey}}),!1)}function rt(e,t,n){if(!Y(t))return;let r=S(e.nodes),i=S(t.nodes);if(r.digest!==i.digest)return T({level:`warn`,phase:`ios_tap_failure_corroborated`,data:{command:n,beforeNodeCount:r.nodeCount,afterNodeCount:i.nodeCount}}),{warning:`XCTest reported the tap as failed, but a same-scope post-action accessibility capture changed; treating the tap as landed. Observe the current screen before issuing another tap.`}}function Y(e){return!!(e&&e.nodes.length>0&&!re(e.snapshotQuality))}function it(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}return at(t)}function at(e){let t=ot(e);if(!(!t||typeof t.interactiveOnly!=`boolean`||typeof t.raw!=`boolean`)&&!(!st(t.depth)||!ct(t.scope)))return{interactiveOnly:t.interactiveOnly,...typeof t.depth==`number`?{depth:t.depth}:{},...typeof t.scope==`string`?{scope:t.scope}:{},raw:t.raw}}function ot(e){return typeof e==`object`&&e?e:void 0}function st(e){return e==null||typeof e==`number`}function ct(e){return e==null||typeof e==`string`}function lt(e,t){if(!(!e&&!t))return{...e??{},out:void 0,...t?{snapshotDepth:t.depth,snapshotScope:t.scope,snapshotRaw:t.raw}:{}}}function ut(e){return e.kind===`selector`?{selector:e.selector}:e.kind===`ref`?{ref:e.ref.startsWith(`@`)?e.ref.slice(1):e.ref}:{}}function dt(e,n){if(n.code!==`AMBIGUOUS_MATCH`)return n;let r=ne(n.details);return r.length===0||e.snapshotGeneration===void 0?n:(de(e,r),new t(n.code,n.message,{...n.details,refsGeneration:e.snapshotGeneration},n.cause))}async function ft(e){switch(e.req.command){case`press`:return await X(e,`press`);case`click`:return await X(e,`click`);case`longpress`:return await X(e,`longpress`);case`fill`:return await Et(e);default:return null}}async function X(e,t){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r);if(!a)return k();let o=t===`click`?`click`:t,s=t===`longpress`?`longpress`:`press`,c=V(a,o);if(c)return c;let u=E(s,a.device);if(u)return u;let f=N(t,n.flags);if(f)return f;let p=d(n.flags),m=ee(p);if(t!==`longpress`&&p!==`primary`){let e=l({commandLabel:o,platform:te(a.device),button:p,count:n.flags?.count,intervalMs:n.flags?.intervalMs,holdMs:n.flags?.holdMs,jitterPx:n.flags?.jitterPx,doubleTap:n.flags?.doubleTap});if(e)return O(e.code,e.message,e.details)}let h=t===`longpress`?_e(n.positionals??[]):Oe(n.positionals??[],o);if(!h.ok)return h.response;let g=h.target.kind===`ref`&&n.internal?.findResolvedTarget===void 0?M({session:a,ref:h.target.ref,mintedGeneration:h.refGeneration}):void 0,_;if(h.target.kind===`ref`){let r=e.refSnapshotFlagGuardResponse(t===`longpress`?`longpress`:`press`,n.flags);if(r)return r;let i=n.internal?.findResolvedTarget?null:z({session:a,ref:h.target.ref,mintedGeneration:h.refGeneration,staleRefsWarning:g});if(i)return i;_=await Q(e,a)}let v=n.internal?.replayTargetGuard,y=v?null:gt({session:a,commandLabel:o,target:h.target,flags:n.flags});if(y){let t=await yt(e,a,y);if(t)return t}let b=t===`longpress`?h.durationMs:void 0;return await kt(e,{androidFreshnessBaseline:_,refContext:h.target.kind===`ref`&&n.internal?.findResolvedTarget===void 0?{ref:h.target.ref,mintedGeneration:h.refGeneration,staleRefsWarning:g}:void 0,iosTapCorroboration:{target:h.target,extra:t===`longpress`?{...b===void 0?{}:{durationMs:b},gesture:`longpress`}:m},run:async e=>await pt({runtime:e,command:t,target:h.target,sessionName:r,requestId:n.meta?.requestId,clickButton:p,flags:n.flags,durationMs:b,expectedResolvedTarget:v,preresolvedTarget:n.internal?.findResolvedTarget}),afterRun:async e=>{if(!a.lease?.leaseProvider)return await ve(a,we(h.target,e))},buildPayloads:async r=>{let i=ht(r);return await mt({params:e,session:a,result:r,staleRefsWarning:g,publicData:Z({session:a,command:t===`longpress`?void 0:t,flags:n.flags,data:r.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:m})}})}async function pt(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c=P(o);if(n===`longpress`)return await t.interactions.longPress(r,{session:i,requestId:a,durationMs:e.durationMs,settle:c,expectedResolvedTarget:s});let l={session:i,requestId:a,button:e.clickButton,count:o?.count,intervalMs:o?.intervalMs,holdMs:o?.holdMs,jitterPx:o?.jitterPx,doubleTap:o?.doubleTap,verify:o?.verify,settle:c,expectedResolvedTarget:s,preresolvedTarget:e.preresolvedTarget};return n===`click`?await t.interactions.click(r,l):await t.interactions.press(r,l)}async function mt(e){let{params:t,session:n,result:r,publicData:i,extra:a}=e,o=r.kind===`point`?await Ae({session:n,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession}):R(n.snapshot?.nodes??[]);return W({source:{kind:`runtime`,result:r,publicData:i},referenceFrame:o,extra:a,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:j(n,r.settle)})}function ht(e){return`durationMs`in e?e.durationMs:void 0}function gt(e){let{session:t,commandLabel:n,target:r,flags:i}=e;return n!==`click`||r.kind!==`selector`||w(t)||vt(i)||g(n)&&i?.verify===!0||_(n)&&i?.settle===!0?null:_t(t,r.selector,i)}function _t(e,t,n){let r=Ee({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}function vt(e){return e?.count!==void 0||e?.intervalMs!==void 0||e?.holdMs!==void 0||e?.jitterPx!==void 0||e?.doubleTap!==void 0||e?.clickButton!==void 0&&e.clickButton!==`primary`}async function yt(e,t,n){return await bt({params:e,session:t,selector:n,command:`press`,positionals:[],extra:{selector:n.raw},fallbackPhase:`ios_direct_selector_tap_fallback`})}async function bt(t){let{params:n,session:r,selector:i,command:a,positionals:o,extra:s,fallbackPhase:c}=t,l=Date.now();ge(r);try{let e=await le(r.device,a,o,n.req.flags?.out,{...n.contextFromFlags(n.req.flags,r.appBundleId,r.trace?.outPath),directElementSelector:i,surface:r.surface})??{},t=Date.now(),c=wt(e),u=Z({session:r,command:St(n.req.command,a),flags:n.req.flags,data:e}),d=Ct(i.allowNonHittableCoordinateFallback===!0,e),{result:f,responseData:p}=W({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:u,point:c,maestroCoordinateFallbackDispatched:d.used},referenceFrame:Tt(e),extra:{...s,...d.extra}});return L({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??[],retryPositionals:It(c),flags:n.req.flags,result:f,responseData:p,actionStartedAt:l,actionFinishedAt:t})}catch(t){return await xt({error:t,handlerParams:n,session:r,extra:s,positionals:o,actionStartedAt:l})||(ye(t,{delegateSemanticFailures:i.allowNonHittableCoordinateFallback!==!0})?(T({level:`debug`,phase:c,data:{selector:i.raw,error:t instanceof Error?t.message:String(t)}}),null):{ok:!1,error:e(t)})}}async function xt(e){let{error:t,handlerParams:n,session:r,extra:i,positionals:a,actionStartedAt:o}=e,s=await J({error:t,command:n.req.command,requestId:n.req.meta?.requestId,flags:n.req.flags,session:r,sessionStore:n.sessionStore,contextFromFlags:n.contextFromFlags,captureSnapshotForSession:n.captureSnapshotForSession});if(!s)return;let{result:c,responseData:l}=U({targetKind:`selector`,warning:s.warning,resolution:{source:`direct-ios`,kind:`not-observed`},extra:i});return L({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??a,flags:n.req.flags,result:c,responseData:l,scheduleInteractionOutcomeRetry:!1,actionStartedAt:o,actionFinishedAt:Date.now()})}function Z(e){let t=b(e.session.device.platform)?Ie(e.data):e.data;return e.command?Me({command:e.command,input:e.flags,data:t}):t}function St(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function Ct(e,t){if(!e)return{used:!1,extra:{}};let n=t?.maestroNonHittableCoordinateFallbackUsed===!0;return{used:n,extra:{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}}function wt(e){let t=typeof e.x==`number`?e.x:void 0,n=typeof e.y==`number`?e.y:void 0;return t!==void 0&&n!==void 0?{x:t,y:n}:{x:0,y:0}}function Tt(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}async function Et(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i){let e=V(i,`fill`);if(e)return e;let t=E(`fill`,i.device);if(t)return t}if(!i)return k();Le({session:i,flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0});let a=N(`fill`,t.flags);if(a)return a;let o=xe(t.positionals??[]);if(!o.ok)return o.response;let s=await Dt(e,i,o.target,o.refGeneration);if(s.response)return s.response;let{staleRefsWarning:c}=s,l=t.internal?.replayTargetGuard;return await kt(e,{refContext:o.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0?{ref:o.target.ref,mintedGeneration:o.refGeneration,staleRefsWarning:c}:void 0,run:async e=>await e.interactions.fill(o.target,o.text,{session:n,requestId:t.meta?.requestId,delayMs:t.flags?.delayMs,allowNonHittableCoordinateFallback:t.flags?.maestro?.allowNonHittableCoordinateFallback,verify:t.flags?.verify,settle:P(t.flags),expectedResolvedTarget:l,preresolvedTarget:t.internal?.findResolvedTarget}),buildPayloads:e=>Ot({session:i,result:e,text:o.text,flags:t.flags,staleRefsWarning:c})})}async function Dt(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===void 0?M({session:t,ref:n.ref,mintedGeneration:r}):void 0,a=e.refSnapshotFlagGuardResponse(`fill`,e.req.flags);if(a)return{response:a,staleRefsWarning:i};let o=e.req.internal?.findResolvedTarget?null:z({session:t,ref:n.ref,mintedGeneration:r,staleRefsWarning:i});return o?{response:o,staleRefsWarning:i}:(await Q(e,t),{staleRefsWarning:i})}function Ot(e){let{session:t,result:n}=e,r=Ct(e.flags?.maestro?.allowNonHittableCoordinateFallback===!0,n.backendResult),i=n.kind===`point`?void 0:R(t.snapshot?.nodes??[]);return W({source:{kind:`runtime`,result:n,publicData:Z({session:t,command:`fill`,flags:e.flags,data:n.backendResult}),maestroCoordinateFallbackDispatched:r.used},referenceFrame:i,extra:{text:e.text,...r.extra},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:j(t,n.settle)})}async function kt(e,t){let n=e.sessionStore.get(e.sessionName);if(!n)return k();let r=F(e),a=Date.now();try{let i,o=await Nt(n,e.req.command,{refContext:t.refContext},async()=>{let e=await t.run(r);return i=await t.afterRun?.(e),e});if(o.aborted)return o.response;let{readiness:s,runtimeResult:c}=o,l=Date.now(),{result:u,responseData:d,recordedTarget:f}=await t.buildPayloads(c),p=[...s.status===`recovered`?[s.warning]:[],...i?[i]:[]];if(p.length>0){let e=[...typeof d.warning==`string`?[d.warning]:[],...p].join(` `);u.warning=e,d.warning=e}return L({session:n,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:Ft(e.req.command,c),flags:e.req.flags,result:u,responseData:d,recordedTarget:f,actionStartedAt:a,actionFinishedAt:l,androidFreshnessBaseline:t.androidFreshnessBaseline})}catch(r){let o=dt(n,i(r));if(Ce(o))throw o;return o.code===`AMBIGUOUS_MATCH`?Pt(o):await At({error:o,handlerParams:e,session:n,target:t.iosTapCorroboration?.target,extra:t.iosTapCorroboration?.extra,actionStartedAt:a,androidFreshnessBaseline:t.androidFreshnessBaseline})||Pt(o)}}async function At(e){if(!e.target)return;let t=ae(e.error);if(!t&&w(e.session))return;let n=await J({error:e.error,command:e.handlerParams.req.command,requestId:e.handlerParams.req.meta?.requestId,flags:e.handlerParams.req.flags,session:e.session,sessionStore:e.handlerParams.sessionStore,contextFromFlags:e.handlerParams.contextFromFlags,captureSnapshotForSession:e.handlerParams.captureSnapshotForSession});if(!n)return;let r=jt({target:e.target,resolvedTarget:t,warning:n.warning,referenceFrame:R(e.session.snapshot?.nodes??[]),extra:e.extra});return L({session:e.session,sessionStore:e.handlerParams.sessionStore,command:e.handlerParams.req.command,positionals:e.handlerParams.req.positionals??[],flags:e.handlerParams.req.flags,result:r.result,responseData:r.responseData,recordedTarget:r.recordedTarget,scheduleInteractionOutcomeRetry:!1,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),androidFreshnessBaseline:e.androidFreshnessBaseline})}function jt(e){return e.resolvedTarget?W({source:{kind:`runtime`,result:{...e.resolvedTarget,warning:e.warning}},referenceFrame:e.referenceFrame,extra:e.extra}):U({targetKind:e.target.kind,point:Mt(e.target),warning:e.warning,referenceFrame:e.referenceFrame,extra:{...ut(e.target),...e.extra??{}}})}function Mt(e){return e.kind===`point`?{x:e.x,y:e.y}:void 0}async function Nt(e,t,n,r){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let i=await A({session:e,command:t,phase:`before-command`});if(n.refContext&&i.status===`recovered`){let t=z({session:e,ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration,staleRefsWarning:n.refContext.staleRefsWarning});if(t)return{aborted:!0,response:t}}let a=await r();return await A({session:e,command:t,phase:`after-command`}),{aborted:!1,readiness:i,runtimeResult:a}}async function Q(e,t){if(!me(t))return;let n=t.snapshot?.comparisonSafe===!0?t.snapshot:void 0;try{await e.captureSnapshotForSession(t,e.req.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:!0,androidFreshnessMode:`ref-refresh`})}catch(t){T({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function Pt(t){return{ok:!1,error:e(t)}}function Ft(e,t){if(!(t.kind===`ref`&&!t.node)&&(e===`click`||e===`press`))return t.point?It(t.point):void 0}function It(e){return[String(e.x),String(e.y)]}function Lt(e,t={}){let n=typeof t.executionProfile==`string`?t.executionProfile:void 0;return{kind:e.kind,durationMs:e.durationMs,pointerCount:e.pointerCount,from:e.from,to:e.to,...e.kind===`drag`?{targets:e.targets}:{},...e.backendResult??{},...t,...n?{timing:{executionProfile:n,gestureDurationMs:e.durationMs}}:{},message:e.message}}async function Rt(e){return await Wt(e,`gesture`,async t=>zt(e,t))}async function zt(e,t){let n=c(e.req.input),r=Kt(n,t);return r.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(r.executionProfile=e.req.internal.gestureExecutionProfile),D(r,t.device),Vt(n,r,await Bt(Ut(e),{session:e.sessionName,requestId:e.req.meta?.requestId},r,e.req.internal),e.req.flags)}async function Bt(e,t,n,r){if(n.intent!==`drag`)return await e.interactions.gesture({...t,gesture:n});let i=r?.replayTargetGuards??(r?.replayTargetGuard?{source:r.replayTargetGuard}:void 0);return await e.interactions.gesture({...t,gesture:n,...i?{expectedResolvedTargets:i}:{}})}function Vt(e,t,n,r){let i=n.kind===`drag`?n.recording:void 0,a=i?.sourceTarget,o=i?.destinationTarget;return{positionals:Jt(e,i),flags:en(e,r),responseData:Lt(n,{executionProfile:Gt(t)}),...e.kind===`pinch`?{recordingResultExtra:{scale:e.scale}}:a?{recordingResultExtra:{selectorChain:a.selectorChain}}:{},...a&&o?{recordedTargets:{source:{node:a.node,preActionNodes:a.preActionNodes},destination:{node:o.node,preActionNodes:o.preActionNodes}}}:{}}}async function Ht(e){return await Wt(e,`swipe`,async t=>{let n=Yt(e.req.input);D(p(n).gesture,t.device);let r=n.count??1,i=n.pauseMs??0,a=n.pattern??`one-way`,o=await Qt(Ut(e),e,n,r,i,a);return{positionals:Zt(n),flags:e.req.flags,responseData:Lt(o,{from:n.from,to:n.to,x1:n.from.x,y1:n.from.y,x2:n.to.x,y2:n.to.y,effectiveDurationMs:o.durationMs,timingMode:`direct`,executionProfile:`endpoint-hold`,count:r,pauseMs:i,pattern:a})}})}function Ut(e){return F({...e,pairedGestureViewport:e.req.internal?.gestureViewport})}async function Wt(t,n,r){let i=t.sessionStore.get(t.sessionName);if(!i)return k();let a=Date.now();try{let e=ce(i.device),o=e?{status:`clear`}:await A({session:i,command:n,phase:`before-command`}),s=await r(i);e||await A({session:i,command:n,phase:`after-command`});let c={...s.responseData};return o.status===`recovered`&&(c.warning=`${typeof c.warning==`string`?`${c.warning} `:``}${o.warning}`),L({session:i,sessionStore:t.sessionStore,command:n,actionCommand:n,positionals:s.positionals,flags:s.flags,result:{...c,...s.recordingResultExtra??{}},responseData:c,recordedTargets:s.recordedTargets,actionStartedAt:a,actionFinishedAt:Date.now()})}catch(t){return{ok:!1,error:e(t)}}}function Gt(e){if(e.intent===`fling`)return`endpoint-hold`;if(e.intent===`pan`)return e.executionProfile??`timed-pan`;if(e.intent===`drag`)return`timed-pan`}function Kt(e,t){let n=o(e);return n.intent===`drag`?{...n,source:qt(n.source,t),destination:qt(n.destination,t)}:n}function qt(e,i){if(!e.startsWith(`@`))return e;let a=n(e);if(!a)throw new t(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:r});return B({session:i,ref:a.base,mintedGeneration:a.generation}),a.base}function Jt(e,t){return e.kind!==`drag`||!t?a(e):a({...e,source:t.sourceSelector??e.source,destination:t.destinationSelector??e.destination})}function Yt(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`swipe requires structured object input`);s(e);let n=e,r=n.pattern;if(r!==void 0&&r!==`one-way`&&r!==`ping-pong`)throw new t(`INVALID_ARGS`,`swipe pattern must be one-way or ping-pong`);let i={from:$(n.from,`swipe from`),to:$(n.to,`swipe to`),count:h(n,`count`,{min:1,max:200}),pauseMs:h(n,`pauseMs`,{min:0,max:u}),pattern:r};return Xt(i),i}function Xt(e){let n=e.count??1,r=e.pauseMs??0,i=n*100+Math.max(0,n-1)*r;if(!(i<=6e4))throw new t(`INVALID_ARGS`,`Swipe series must fit within ${f}ms.`,{count:n,pauseMs:r,gestureDurationMs:100,scheduledDurationMs:i,hint:`Reduce --count or --pause-ms.`})}function $(e,n){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`${n} must be a point`);let r=e;if(typeof r.x!=`number`||!Number.isFinite(r.x))throw new t(`INVALID_ARGS`,`${n} x must be finite`);if(typeof r.y!=`number`||!Number.isFinite(r.y))throw new t(`INVALID_ARGS`,`${n} y must be finite`);return{x:r.x,y:r.y}}function Zt(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function Qt(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=p($t(n,a,s));o=await e.interactions.gesture({session:t.sessionName,requestId:t.req.meta?.requestId,gesture:c.gesture}),i>0&&s+1<r&&await oe(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function $t(e,t,n){return t===`ping-pong`&&n%2==1?{...e,from:e.to,to:e.from}:e}function en(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function tn(e){let t=await ft({...e,captureSnapshotForSession:I,refSnapshotFlagGuardResponse:ke});if(t)return t;switch(e.req.command){case x.gesture:return await Rt({...e,captureSnapshotForSession:I});case x.swipe:return await Ht({...e,captureSnapshotForSession:I});case x.type:return await nn({...e,captureSnapshotForSession:I});case`get`:return await Te(e);case`is`:return await De(e);default:return null}}async function nn(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);return r?E(x.type,r.device)||await rn(r)||await an(e,r):k()}async function rn(e){return e.device.platform===`android`&&e.screenRecording&&(await ue({session:e})).status===`failed`?O(`COMMAND_FAILED`,`Android system dialog blocked the recording session`):null}async function an(t,n){let{req:r,sessionName:i,sessionStore:a}=t,o=(r.positionals??[]).join(` `),s=F(t),c=Date.now();try{let e=await A({session:n,command:r.command,phase:`before-command`}),t=await s.interactions.typeText(o,{session:i,requestId:r.meta?.requestId,delayMs:r.flags?.delayMs});await A({session:n,command:r.command,phase:`after-command`});let l=Date.now(),u={...t.backendResult??{},text:t.text,delayMs:t.delayMs,...C(t.message??`Typed ${Array.from(t.text).length} chars`)};return e.status===`recovered`&&(u.warning=e.warning),L({session:n,sessionStore:a,command:r.command,positionals:r.positionals??[],flags:r.flags,result:u,responseData:u,actionStartedAt:c,actionFinishedAt:l})}catch(t){return{ok:!1,error:e(t)}}}export{tn as handleInteractionCommands};
1
+ import{_ as e}from"./sdk-contracts.js";import{Kn as t,_r as n}from"./sdk-batch-runner.js";import{t as r}from"./string-enum.js";const i=1e4,a=2e3,o=[`get`,`accept`,`dismiss`,`wait`],s=[`in-app`,`system`],c=[`primary`,`secondary`,`middle`];function l(e){return e?.clickButton??`primary`}function u(t){return t.button===`primary`?null:t.commandLabel===`click`?t.platform!==`macos`&&t.platform!==`linux`?new e(`UNSUPPORTED_OPERATION`,`click --button ${t.button} is supported only on macOS and Linux`):t.platform===`macos`&&t.button===`middle`?new e(`UNSUPPORTED_OPERATION`,`click --button middle is not supported by the macOS runner yet`):typeof t.count==`number`||typeof t.intervalMs==`number`||typeof t.holdMs==`number`||typeof t.jitterPx==`number`||t.doubleTap===!0?new e(`INVALID_ARGS`,`click --button ${t.button} does not support repeat or gesture modifier flags`):null:new e(`INVALID_ARGS`,`--button is supported only for click`)}function d(e){return e===`primary`?{}:{button:e}}const ee=[`up`,`down`,`left`,`right`,`top`,`bottom`],f=[`up`,`down`,`left`,`right`],p=[`left`,`right`,`left-edge`,`right-edge`],te=[`one-way`,`ping-pong`],ne=1e4,re=6e4,ie=r(f,{message:e=>`Unknown direction: ${e}`});function ae(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=v(e.amount),i=e.pixels===void 0?Math.round(n*r):fe(e.pixels),a=Math.max(1,Math.round(n*.1)),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 oe(e){v(e.amount),e.pixels!==void 0&&fe(e.pixels)}function se(e,t){if(e===`left`||e===`right`){let n=m(e,t);return{preset:e,x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,referenceWidth:n.referenceWidth,referenceHeight:n.referenceHeight}}let[n,r]=e===`left-edge`?[99,15]:[1,85],i=g(h(t,n,50),t,8),a=g(h(t,r,50),t,8);return{preset:e,x1:i.x,y1:i.y,x2:a.x,y2:a.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function ce(e,t){switch(e){case`up`:return{x:0,y:-t};case`down`:return{x:0,y:t};case`left`:return{x:-t,y:0};case`right`:return{x:t,y:0}}}function m(e,t){let n=e===`left`||e===`up`,r=n?85:15,i=n?15:85,a=e===`up`||e===`down`,o=g(h(t,a?50:r,a?r:50),t,8),s=g(h(t,a?50:i,a?i:50),t,8);return{direction:e,x1:o.x,y1:o.y,x2:s.x,y2:s.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function le(e){let t=de(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function h(e,t,n){let r=Math.trunc(e.referenceWidth*t/100),i=Math.trunc(e.referenceHeight*n/100);return{x:Number.isFinite(r)?r:0,y:Number.isFinite(i)?i:0}}function g(e,t,n){return{x:y(e.x,n,t.referenceWidth),y:y(e.y,n,t.referenceHeight)}}function ue(e){return ie.parse(e)}function de(e){let t=e.filter(e=>n(e)&&_(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 r=e.map(e=>e.rect).filter(_);if(r.length===0)return;let i=Math.max(...r.map(e=>e.x+e.width)),a=Math.max(...r.map(e=>e.y+e.height));if(!(i<=0||a<=0))return{x:0,y:0,width:i,height:a}}function _(e){return!!e&&e.width>0&&e.height>0}function v(t){if(t===void 0)return .6;if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll amount must be a positive number`);return t}function fe(t){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll pixels must be a positive integer`);return Math.max(1,Math.round(t))}function y(e,t,n){let r=Math.round(t);if(!Number.isFinite(r))return 0;let i=Math.max(r,Math.round(n-t));return!Number.isFinite(i)||!Number.isFinite(e)?r:Math.min(i,Math.max(r,Math.round(e)))}const b=1e4,x=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`,`drag`];function S(n){let r=C(n),i=O(r,`kind`,x);if(i===`pan`)return{kind:i,origin:w(r,`origin`),delta:w(r,`delta`),pointerCount:t(r,`pointerCount`,{min:1,max:2}),durationMs:me(r)};if(i===`drag`)return pe(r);if(r.pointerCount!==void 0)throw new e(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(i===`fling`){if(r.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:i,direction:O(r,`direction`,f),origin:w(r,`origin`),distance:t(r,`distance`,{min:0})}}if(i===`swipe`){if(r.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:i,preset:O(r,`preset`,p)}}if(i===`pinch`)return{kind:i,scale:E(r,`scale`),origin:T(r,`origin`)};if(i===`rotate`){if(r.velocity!==void 0)throw new e(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:i,degrees:E(r,`degrees`),origin:T(r,`origin`)}}return{kind:i,origin:w(r,`origin`),delta:w(r,`delta`),scale:E(r,`scale`),degrees:E(r,`degrees`),durationMs:me(r)}}function pe(n){let r=t(n,`sourceHoldMs`,{min:1,max:1e4}),i=t(n,`moveMs`,{min:16,max:1e4}),a=t(n,`destinationHoldMs`,{min:0,max:1e4});if((r??800)+(i??500)+(a??0)>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${b}`);return{kind:`drag`,source:D(n,`source`),destination:D(n,`destination`),sourceHoldMs:r,moveMs:i,destinationHoldMs:a}}function me(n){let r=t(n,`durationMs`);if(r!==void 0){if(r<16||r>1e4)throw new e(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${b}.`);return r}}function C(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`gesture requires structured object input`);return t}function w(e,t){let n=C(e[t]);return{x:E(n,`x`),y:E(n,`y`)}}function T(e,t){return e[t]===void 0?void 0:w(e,t)}function E(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function D(t,n){let r=t[n];if(typeof r!=`string`||r.trim().length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r.trim()}function O(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}const k={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:he}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`},"gesture drag":{max:5,usage:`gesture drag accepts at most 5 arguments: source destination [sourceHoldMs] [moveMs] [destinationHoldMs]`}};function he(e,t){let[n,r,i,a,o]=e,s=A(n,i),c=A(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function A(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function j(e,t){let n=k[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!ge(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function ge(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function _e(t){if(!(!t||typeof t!=`object`||Array.isArray(t))&&t.durationMs!==void 0)throw new e(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function ve(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function M(t,n){let r=j(t,n);if(r)throw new e(`INVALID_ARGS`,ve(r))}function ye(e,t,n){let r=be(e,t);return r?ve(r,n):void 0}function be(e,t){if(e===`swipe`)return j(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(k,n))return j(n,t.slice(1))}function N(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function P(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{M(`gesture pan`,r);let{origin:e,delta:i}=N(r);return S({kind:n,origin:e,delta:i,pointerCount:t,durationMs:F(r[4])})}case`fling`:return M(`gesture fling`,r),S({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:F(r[3])});case`swipe`:return M(`gesture swipe`,r),S({kind:n,preset:r[0]});case`pinch`:return M(`gesture pinch`,r),S({kind:n,scale:Number(r[0]),origin:I(r[1],r[2])});case`rotate`:return M(`gesture rotate`,r),S({kind:n,degrees:Number(r[0]),origin:I(r[1],r[2])});case`transform`:{M(`gesture transform`,r);let{origin:e,delta:t}=N(r);return S({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:F(r[6])})}case`drag`:return M(`gesture drag`,r),S({kind:n,source:r[0],destination:r[1],sourceHoldMs:F(r[2]),moveMs:F(r[3]),destinationHoldMs:F(r[4])});default:return S({kind:n})}}function xe(e){if(e[0]!==`drag`)return;let t=P(e);return t.kind===`drag`?t:void 0}function Se(e){switch(e.kind){case`pan`:return L([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return L([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return L([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?L([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return L([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs]);case`drag`:return[e.kind,e.source,e.destination,String(e.sourceHoldMs??800),String(e.moveMs??500),String(e.destinationHoldMs??0)]}}function Ce(e,t={}){return M(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function we(t){switch(t.kind){case`pan`:return{gesture:{intent:`pan`,origin:t.origin,delta:t.delta,pointerCount:t.pointerCount,durationMs:t.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:t.direction,origin:t.origin,distance:t.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:t.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:t.origin,scale:t.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:t.origin,degrees:t.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:t.origin,delta:t.delta,scale:t.scale,degrees:t.degrees,durationMs:t.durationMs}};case`drag`:throw new e(`INVALID_ARGS`,`gesture drag targets must be resolved before coordinate normalization`)}}function Te(e){return e.kind===`drag`?{intent:`drag`,source:e.source,destination:e.destination,sourceHoldMs:e.sourceHoldMs,moveMs:e.moveMs,destinationHoldMs:e.destinationHoldMs}:we(e).gesture}function Ee(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function F(e){return e===void 0?void 0:Number(e)}function I(t,n){if(t===void 0!=(n===void 0))throw new e(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return t===void 0?void 0:{x:Number(t),y:Number(n)}}function L(e){return e.filter(e=>e!==void 0).map(String)}const R={pinchAxisDegrees:-90,samplingProfile:`default`},De={ios:R,macos:R,android:{pinchAxisDegrees:0,samplingProfile:`android`},harmonyos:R,vega:R,linux:R,web:R};function Oe(e,t,n){let r=W(t),i=He(n);switch(e.intent){case`fling`:return Me(e,r);case`pan`:return Ne(e,r,i);case`pinch`:return B({intent:`pinch`,origin:e.origin??X(r),delta:{x:0,y:0},scale:Y(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=J(e.degrees,`gesture rotate degrees`);return B({intent:`rotate`,origin:e.origin??X(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:K(t)},r,i)}case`transform`:{let t=J(e.degrees,`gesture transform degrees`);return B({intent:`transform`,origin:e.origin,delta:e.delta,scale:Y(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:G(e.durationMs,K(t),`gesture transform durationMs`)},r,i)}}}function ke(e){let[{samples:t}]=e.pointers,n=t[0],r=t.at(-1);return{start:n.point,end:r.point}}function Ae(t,n){let r=W(n),i=Le(t.sourceHoldMs,800,`gesture drag sourceHoldMs`),a=G(t.moveMs,500,`gesture drag moveMs`),o=Re(t.destinationHoldMs,0,`gesture drag destinationHoldMs`);if(i+a+o>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${b}`);return je(z(`pan`,t.from,t.to,a,r,`timed-pan`),i,o)}function je(e,t,n){let r=e.pointers[0],[i,a]=r.samples,o=t+e.durationMs+n,s=[{offsetMs:0,point:i.point},{...i,offsetMs:i.offsetMs+t},{...a,offsetMs:a.offsetMs+t},...n>0?[{offsetMs:o,point:a.point}]:[]];return{...e,durationMs:o,pointers:[{...r,samples:s}]}}function Me(e,t){if(`preset`in e){let{from:n,to:r}=Ve(e.preset,t);return z(`fling`,n,r,100,t,`endpoint-hold`)}if(`from`in e)return z(`fling`,e.from,e.to,100,t,`endpoint-hold`);let n=q(e.origin,`gesture fling origin`),r=ze(e.distance??180,`gesture fling distance`);return z(`fling`,n,Z(n,ce(e.direction,r)),100,t,`endpoint-hold`)}function Ne(t,n,r){let i=G(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=q(t.origin,`gesture pan origin`);return z(`pan`,e,Z(e,q(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return B({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function z(e,t,n,r,i,a){let o=q(t,`gesture ${e} start`),s=q(n,`gesture ${e} end`),c=[{offsetMs:0,point:o},{offsetMs:r,point:s}];return H(c,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:c}]}}function B(e,t,n){let r=q(e.origin,`gesture ${e.intent} origin`),i=Z(r,q(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*Ie(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw U({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=V(e.durationMs,n.samplingProfile),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:Pe({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return H(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function Pe(e){let t=e.offsetMs/e.durationMs,n=Be(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=Ue(Fe(e.intent,e.profile)+e.rotationDegrees*t);return{x:n.x+Math.cos(i)*r*e.side,y:n.y+Math.sin(i)*r*e.side}}function Fe(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function Ie(e){return e===`pinch`?.4:.25}function V(t,n){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`gesture sample duration must be a positive finite number`);let r=t/16,i=Math.max(3,n===`android`?Math.round(r):Math.floor(r));return Array.from({length:i+1},(e,n)=>Math.round(t*n/i))}function H(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw U({...r,viewport:n,sample:o})}}function U(t){return new e(`INVALID_ARGS`,`Gesture trajectory does not fit inside the viewport`,{...t,reason:`GESTURE_TRAJECTORY_OUT_OF_BOUNDS`,hint:`Move the gesture away from the edge or reduce its translation, scale, or rotation.`})}function W(t){let n={x:J(t.x,`gesture viewport x`),y:J(t.y,`gesture viewport y`),width:J(t.width,`gesture viewport width`),height:J(t.height,`gesture viewport height`)};if(n.width<=0||n.height<=0)throw new e(`INVALID_ARGS`,`gesture viewport width and height must be positive`);return n}function G(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<16||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 16 and ${b}`);return i}function Le(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<1||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 1 and ${b}`);return i}function Re(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<0||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 0 and ${b}`);return i}function K(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function q(e,t){return{x:J(e.x,`${t} x`),y:J(e.y,`${t} y`)}}function J(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function Y(t,n){let r=J(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function ze(t,n){let r=J(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function X(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function Z(e,t){return{x:e.x+t.x,y:e.y+t.y}}function Be(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function Ve(e,t){let n=se(e,{referenceWidth:t.width,referenceHeight:t.height});return{from:{x:t.x+n.x1,y:t.y+n.y1},to:{x:t.x+n.x2,y:t.y+n.y2}}}function He(e){return e===void 0?R:De[e]}function Ue(e){return e*Math.PI/180}const We={occlusion:{kind:`runtime`,via:`src/core/selector-pipeline.ts#runNodePipelineStages`},parentOwnedTouchPoint:{kind:`runtime`,via:`src/core/interaction-touch-point.ts#resolveInteractionTouchPoint`},offscreen:{kind:`runtime`,via:`src/commands/interaction/runtime/resolution.ts#throwIfOffscreenInteractionTarget`},nonHittable:{kind:`runtime`,via:`src/core/selector-pipeline.ts#runNodePipelineStages`},responseConstruction:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-response.ts#buildInteractionResponseData`},responseIdentity:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-targets.ts#interactionResultExtra`},verifyEvidence:{kind:`runtime`,via:`src/commands/interaction/runtime/interactions.ts#pressCommand`,appliesTo:[`press`,`click`,`fill`]},settleObservation:{kind:`runtime`,via:`src/commands/interaction/runtime/settle.ts#settleAfterInteraction`}};({...We}),{...We};const Ge=`tapped via non-hittable coordinate fallback`,Ke=[`xctest-element`,`synthesized-first-responder`,`synthesized-first-responder-replacement`,`xctest-application-fallback`],qe=[`focused-element`,`keyboard-shown`],Je=1e4;function Ye(t,n=`scroll accepts either a relative amount or --pixels, not both`){if(t.amount!==void 0&&t.pixels!==void 0)throw new e(`INVALID_ARGS`,n)}function Xe(t,n={}){if(t===void 0)return;let r=n.field??`scroll durationMs`,i=n.max??1e4,a=n.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(t)||!Number.isInteger(t)||t<0)throw new e(`INVALID_ARGS`,a);if(t>i)throw new e(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return t}function Ze(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}const Qe={android:`longpress`,apple:`exact`,vega:`exact`},Q={up:{aliases:[],androidKeyevent:`KEYCODE_DPAD_UP`,appleRemoteButton:`up`,vegaKey:`KEY_UP`},down:{aliases:[],androidKeyevent:`KEYCODE_DPAD_DOWN`,appleRemoteButton:`down`,vegaKey:`KEY_DOWN`},left:{aliases:[],androidKeyevent:`KEYCODE_DPAD_LEFT`,appleRemoteButton:`left`,vegaKey:`KEY_LEFT`},right:{aliases:[],androidKeyevent:`KEYCODE_DPAD_RIGHT`,appleRemoteButton:`right`,vegaKey:`KEY_RIGHT`},select:{aliases:[`ok`,`center`,`enter`],androidKeyevent:`KEYCODE_DPAD_CENTER`,appleRemoteButton:`select`,vegaKey:`KEY_ENTER`},menu:{aliases:[],androidKeyevent:`KEYCODE_MENU`,appleRemoteButton:`menu`,vegaKey:`KEY_MENU`},home:{aliases:[],androidKeyevent:`KEYCODE_HOME`,appleRemoteButton:`home`,vegaKey:`KEY_HOMEPAGE`},back:{aliases:[],androidKeyevent:`KEYCODE_BACK`,appleRemoteButton:`menu`,vegaKey:`KEY_BACK`}},$=Object.keys(Q),$e=`<${$.join(`|`)}>`;function et(t){let n=t?.toLowerCase();if(tt(n))return n;let r=n?ot.get(n):void 0;if(r)return r;throw new e(`INVALID_ARGS`,`tv-remote button must be one of: ${$.join(`, `)}.`)}function tt(e){return typeof e==`string`&&$.includes(e)}function nt(e){return Q[e].appleRemoteButton}function rt(e){return Q[e].androidKeyevent}function it(e){return Q[e].vegaKey}function at(e){return Qe[e]}const ot=new Map($.flatMap(e=>Q[e].aliases.map(t=>[t,e]))),st={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,targetAbsent:`wait_target_absent`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`};export{S as A,le as B,xe as C,Ee as D,Te as E,p as F,l as G,c as H,re as I,a as J,s as K,oe as L,ee as M,te as N,Ce as O,ne as P,m as R,ye as S,Se as T,d as U,ue as V,u as W,i as Y,Oe as _,rt as a,ke as b,at as c,Ze as d,Xe as f,Ae as g,Ke as h,et as i,f as j,x as k,Je as l,Ge as m,$ as n,nt as o,qe as p,o as q,$e as r,it as s,st as t,Ye as u,Be as v,P as w,_e as x,V as y,ae as z};
@@ -0,0 +1 @@
1
+ import{E as e,_ as t,h as n,s as r,v as i}from"./sdk-contracts.js";import{Kn as a,S as o,h as s,m as c,p as l}from"./sdk-batch-runner.js";import{_ as u,l as d,s as f}from"./sdk-device.js";import{Pt as p,st as m,yn as h}from"./script-source-bundle.js";import{A as ee,D as g,E as te,G as ne,I as re,P as ie,T as _,U as ae,W as oe,x as se}from"./interaction.js";import{L as ce,Q as v}from"./screenshot-result.js";import{n as y}from"./command-catalog.js";import{n as le,t as ue}from"./verdict.js";import{i as de}from"./runtime.js";import{A as b}from"./sdk-android-adb.js";import{t as fe}from"./timeouts.js";import{j as pe}from"./runner-disposal.js";import{o as me}from"./interactors.js";import{a as x,o as S,s as C,t as he,u as w}from"./dispatch.js";import{Ct as ge,Mt as _e,St as ve,bt as ye,ht as T,lt as E,mt as be,pt as D,ut as xe,yt as Se}from"./internal/daemon.js";import{C as O,S as Ce,_ as we,c as Te,d as Ee,f as De,g as Oe,h as ke,l as Ae,n as je,p as Me,r as Ne,v as Pe,x as k,y as Fe}from"./selector-runtime.js";import{t as A}from"./interaction-runtime.js";import{t as j}from"./interaction-snapshot.js";import{n as M,r as Ie,t as N}from"./interaction-common.js";function Le(e){let n=e.flags?.recordAs;if(n!==void 0){if(ce(n),e.flags?.noRecord)throw new t(`INVALID_ARGS`,`fill --record-as cannot be combined with --no-record because no script step would be published.`);if(!v(e.session)&&!e.replayPlanStep)throw new t(`INVALID_ARGS`,`fill --record-as requires an armed script recording. Start a fresh session with open --save-script, then retry the fill.`)}}function P(e){try{return F(e),null}catch(e){if(e instanceof t)return x(e.code,e.message,e.details);throw e}}function F(e){let n=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,r=Se({session:e.session,refBody:n,mintedGeneration:e.mintedGeneration});if(r.admitted)return;let i=ge(e.session);throw new t(`COMMAND_FAILED`,ze(r.reason,e.ref),{reason:r.reason,ref:e.ref,currentGeneration:ve(e.session),scope:i===`all`?`all`:Array.from(i),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},hint:e.staleRefsWarning??Re})}const Re=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function ze(e,t){switch(e){case`ref_frame_expired`:return`Ref ${t} belongs to an expired ref frame — a device action since the snapshot invalidated it`;case`ref_generation_mismatch`:return`Ref ${t} was minted from a superseded snapshot generation`;case`plain_ref_requires_complete_frame`:return`Ref ${t} needs a complete snapshot — the current frame only authorizes its emitted refs`;case`ref_not_issued`:return`Ref ${t} was not issued by the current ref frame`}}async function I(e,t){if(!_e(t))return;let n=t.snapshot?.comparisonSafe===!0?t.snapshot:void 0;try{await e.captureSnapshotForSession(t,e.req.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:!0,androidFreshnessMode:`ref-refresh`})}catch(t){b({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function L(e,t){return!d(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:x(`UNSUPPORTED_OPERATION`,`${t} is not supported on macOS ${e.surface} sessions yet. Open an app session to act, or use the ${e.surface} surface to inspect.`)}const Be=new Set(s());function Ve(e){return Ue({fields:He(e.command),input:e.input??{},data:e.data,controlledFields:Be})}function He(e){let t=o(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function Ue(e){let t=Object.fromEntries(Object.entries(e.data??{}).filter(([t])=>!e.controlledFields.has(t)));for(let[n,r]of Object.entries(e.fields)){let i=e.input[n]===void 0?r.defaultValue:e.input[n];if(i===void 0||r.omitDefault===!0&&i===r.defaultValue){delete t[n];continue}t[n]=i}return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}const We=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function Ge(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!We.has(e)))}function R(e){let{data:t,fallbackX:n,fallbackY:r,referenceFrame:i,extra:a}=e,o=qe(a,n,r)??(typeof t?.message==`string`?t.message:void 0);return Ke({...t??{},...n===void 0||r===void 0?{}:{x:n,y:r},...i??{},...a??{},...h(o)})}function Ke(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function qe(e,t,n){let r=z(e,`text`);if(r!==void 0)return`Filled ${Array.from(r).length} chars`;let i=Je(t,n),a=Ye(e);if(a)return Ze(a,e??{},i);if(i)return Xe(e,i)}function z(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Je(e,t){return e===void 0||t===void 0?``:` (${e}, ${t})`}function Ye(e){let t=z(e,`ref`);return t===void 0?z(e,`selector`):`@${t}`}function Xe(e,t){return e?.gesture===`longpress`?`Long pressed${t}`:e?.gesture===`hover`?`Hovered${t}`:`Tapped${t}`}function Ze(e,t,n){let r=typeof t.button==`string`?t.button:void 0;return t.gesture===`longpress`?`Long pressed ${e}${n}`:t.gesture===`hover`?`Hovered ${e}${n}`:r&&r!==`primary`?`Clicked ${r} ${e}${n}`:`Tapped ${e}${n}`}const Qe={source:`direct-ios`,kind:`not-observed`};function B(e,t){if(!$e(e))return t;let{resolution:n,...r}=t;return r}function $e(e){return e.maestroCoordinateFallbackDispatched===!0}function V(e){return H({source:{kind:`corroborated-tap`,targetKind:e.targetKind,data:{warning:e.warning},publicData:{warning:e.warning},point:e.point,resolution:e.resolution},referenceFrame:e.referenceFrame,extra:e.extra})}function H(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`||t.kind===`corroborated-tap`){let e={targetKind:t.targetKind,...B(t,{resolution:t.kind===`runner-payload`?Qe:t.resolution}),...r??{}};return{result:R({data:t.data,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e}),responseData:R({data:t.publicData,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e})}}let{result:i}=t,a={targetKind:i.kind,...B(t,Oe(i)),...nt(i.settle,e.settleRefsGeneration),...r??{}},o=R({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...a,...tt(i)}}),s=R({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:a}),c=rt(`warning`in i?i.warning:void 0,e.staleRefsWarning);return c&&(o.warning=c,s.warning=c),{result:o,responseData:s,...et(i)}}function et(e){let t=U(e)?.node??(`node`in e?e.node:void 0),n=`preActionNodes`in e?e.preActionNodes:void 0;return t&&n?{recordedTarget:{node:t,preActionNodes:n}}:{}}function tt(e){let t=U(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function U(e){return`recordingTarget`in e?e.recordingTarget:void 0}function nt(e,t){return!e?.diff||t===void 0?{}:{settle:{...e,refsGeneration:t}}}function rt(e,t){return t?e?`${e} ${t}`:t:e}async function it(e){let{params:t,session:n,result:r,publicData:i,extra:a}=e,o=r.kind===`point`?await Ie({session:n,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession}):M(n.snapshot?.nodes??[]);return H({source:{kind:`runtime`,result:r,publicData:i},referenceFrame:o,extra:a,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:D(n,r.settle)})}function W(e){let t=f(e.session.device.platform)?Ge(e.data):e.data;return e.command?Ve({command:e.command,input:e.flags,data:t}):t}function at(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function G(e,t){if(!e)return{used:!1,extra:{}};let n=t?.maestroNonHittableCoordinateFallbackUsed===!0;return{used:n,extra:{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}}function K(e){return[String(e.x),String(e.y)]}function ot(e,n){if(n.code!==`AMBIGUOUS_MATCH`)return n;let r=p(n.details);return r.length===0||e.snapshotGeneration===void 0?n:(be(e,r),new t(n.code,n.message,{...n.details,refsGeneration:e.snapshotGeneration},n.cause))}async function q(e){if(!st(e))return;let t=lt(e.session.snapshot);if(!t)return;let n=await ut(e,t.snapshot.snapshotQuality,t.presentation);if(!(!n||!dt(t.snapshot,n,e.command)))return ft(t.snapshot,n,e.command)}function st(e){return ct(e.command)&&i(e.error).code===`XCTEST_RECORDED_FAILURE`&&De(e.session,{skipPendingPostGestureStabilization:!1})}function ct(e){return e===`click`||e===`press`}function lt(e){if(!J(e))return;let t=Date.now()-e.createdAt;if(t<0||t>15e3){b({level:`debug`,phase:`ios_tap_failure_corroboration_stale_baseline`,data:{ageMs:t}});return}let n=pt(e.presentationKey);if(n){if(n.raw){b({level:`debug`,phase:`ios_tap_failure_corroboration_raw_baseline`,data:{presentationKey:e.presentationKey}});return}return{snapshot:e,presentation:n}}}async function ut(e,t,n){try{let r=le(t);return await e.captureSnapshotForSession(e.session,vt(e.flags,n),e.sessionStore,e.contextFromFlags,{interactiveOnly:n?.interactiveOnly??!0,...r?{preferredBackend:r}:{},signal:pe(e.requestId)})}catch(t){b({level:`debug`,phase:`ios_tap_failure_corroboration_capture_failed`,data:{command:e.command,error:t instanceof Error?t.message:String(t)}});return}}function dt(e,t,n){let r=e.snapshotQuality?.backend,i=t.snapshotQuality?.backend;return!r||r!==i?(b({level:`debug`,phase:`ios_tap_failure_corroboration_backend_mismatch`,data:{command:n,baselineBackend:r,afterBackend:i}}),!1):e.presentationKey===t.presentationKey?!0:(b({level:`debug`,phase:`ios_tap_failure_corroboration_scope_mismatch`,data:{command:n,baselinePresentationKey:e.presentationKey,afterPresentationKey:t.presentationKey}}),!1)}function ft(e,t,n){if(!J(t))return;let r=m(e.nodes),i=m(t.nodes);if(r.digest!==i.digest)return b({level:`warn`,phase:`ios_tap_failure_corroborated`,data:{command:n,beforeNodeCount:r.nodeCount,afterNodeCount:i.nodeCount}}),{warning:`XCTest reported the tap as failed, but a same-scope post-action accessibility capture changed; treating the tap as landed. Observe the current screen before issuing another tap.`}}function J(e){return!!(e&&e.nodes.length>0&&!ue(e.snapshotQuality))}function pt(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}return mt(t)}function mt(e){let t=ht(e);if(!(!t||typeof t.interactiveOnly!=`boolean`||typeof t.raw!=`boolean`)&&!(!gt(t.depth)||!_t(t.scope)))return{interactiveOnly:t.interactiveOnly,...typeof t.depth==`number`?{depth:t.depth}:{},...typeof t.scope==`string`?{scope:t.scope}:{},raw:t.raw}}function ht(e){return typeof e==`object`&&e?e:void 0}function gt(e){return e==null||typeof e==`number`}function _t(e){return e==null||typeof e==`string`}function vt(e,t){if(!(!e&&!t))return{...e??{},out:void 0,...t?{snapshotDepth:t.depth,snapshotScope:t.scope,snapshotRaw:t.raw}:{}}}function yt(e){return e.kind===`selector`?{selector:e.selector}:e.kind===`ref`?{ref:e.ref.startsWith(`@`)?e.ref.slice(1):e.ref}:{}}async function bt(e,t,n,r){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let i=await E({session:e,command:t,phase:`before-command`});if(n.refContext&&i.status===`recovered`){let t=P({session:e,ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration,staleRefsWarning:n.refContext.staleRefsWarning});if(t)return{aborted:!0,response:t}}let a=await r();return await E({session:e,command:t,phase:`after-command`}),{aborted:!1,readiness:i,runtimeResult:a}}async function Y(e,t){let n=e.sessionStore.get(e.sessionName);if(!n)return S();let r=A(e),a=Date.now();try{let i,o=await bt(n,e.req.command,{refContext:t.refContext},async()=>{let e=await t.run(r);return i=await t.afterRun?.(e),e});if(o.aborted)return o.response;let{readiness:s,runtimeResult:c}=o,l=Date.now(),{result:u,responseData:d,recordedTarget:f}=await t.buildPayloads(c),p=[...s.status===`recovered`?[s.warning]:[],...i?[i]:[]];if(p.length>0){let e=[...typeof d.warning==`string`?[d.warning]:[],...p].join(` `);u.warning=e,d.warning=e}return N({session:n,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:wt(e.req.command,c),flags:e.req.flags,result:u,responseData:d,recordedTarget:f,actionStartedAt:a,actionFinishedAt:l,androidFreshnessBaseline:t.androidFreshnessBaseline})}catch(r){let o=ot(n,i(r));if(Ae(o))throw o;return o.code===`AMBIGUOUS_MATCH`?X(o):await xt({error:o,handlerParams:e,session:n,target:t.iosTapCorroboration?.target,extra:t.iosTapCorroboration?.extra,actionStartedAt:a,androidFreshnessBaseline:t.androidFreshnessBaseline})||X(o)}}async function xt(e){if(!e.target)return;let t=de(e.error);if(!t&&v(e.session))return;let n=await q({error:e.error,command:e.handlerParams.req.command,requestId:e.handlerParams.req.meta?.requestId,flags:e.handlerParams.req.flags,session:e.session,sessionStore:e.handlerParams.sessionStore,contextFromFlags:e.handlerParams.contextFromFlags,captureSnapshotForSession:e.handlerParams.captureSnapshotForSession});if(!n)return;let r=St({target:e.target,resolvedTarget:t,warning:n.warning,referenceFrame:M(e.session.snapshot?.nodes??[]),extra:e.extra});return N({session:e.session,sessionStore:e.handlerParams.sessionStore,command:e.handlerParams.req.command,positionals:e.handlerParams.req.positionals??[],flags:e.handlerParams.req.flags,result:r.result,responseData:r.responseData,recordedTarget:r.recordedTarget,scheduleInteractionOutcomeRetry:!1,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),androidFreshnessBaseline:e.androidFreshnessBaseline})}function St(e){return e.resolvedTarget?H({source:{kind:`runtime`,result:{...e.resolvedTarget,warning:e.warning}},referenceFrame:e.referenceFrame,extra:e.extra}):V({targetKind:e.target.kind,point:Ct(e.target),warning:e.warning,referenceFrame:e.referenceFrame,extra:{...yt(e.target),...e.extra??{}}})}function Ct(e){return e.kind===`point`?{x:e.x,y:e.y}:void 0}function X(t){return{ok:!1,error:e(t)}}function wt(e,t){if(!(t.kind===`ref`&&!t.node)&&(e===`click`||e===`press`))return t.point?K(t.point):void 0}async function Tt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i){let e=L(i,`fill`);if(e)return e;let t=C(`fill`,i.device);if(t)return t}if(!i)return S();Le({session:i,flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0});let a=O(`fill`,t.flags);if(a)return a;let o=we(t.positionals??[]);if(!o.ok)return o.response;let s=await Et(e,i,o.target,o.refGeneration);if(s.response)return s.response;let{staleRefsWarning:c}=s,l=t.internal?.replayTargetGuard;return await Y(e,{refContext:o.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0?{ref:o.target.ref,mintedGeneration:o.refGeneration,staleRefsWarning:c}:void 0,run:async e=>await e.interactions.fill(o.target,o.text,{session:n,requestId:t.meta?.requestId,delayMs:t.flags?.delayMs,allowNonHittableCoordinateFallback:t.flags?.maestro?.allowNonHittableCoordinateFallback,verify:t.flags?.verify,settle:k(t.flags),expectedResolvedTarget:l,preresolvedTarget:t.internal?.findResolvedTarget}),buildPayloads:e=>Dt({session:i,result:e,text:o.text,flags:t.flags,staleRefsWarning:c})})}async function Et(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===void 0?T({session:t,ref:n.ref,mintedGeneration:r}):void 0,a=e.refSnapshotFlagGuardResponse(`fill`,e.req.flags);if(a)return{response:a,staleRefsWarning:i};let o=e.req.internal?.findResolvedTarget?null:P({session:t,ref:n.ref,mintedGeneration:r,staleRefsWarning:i});return o?{response:o,staleRefsWarning:i}:(await I(e,t),{staleRefsWarning:i})}function Dt(e){let{session:t,result:n}=e,r=G(e.flags?.maestro?.allowNonHittableCoordinateFallback===!0,n.backendResult),i=n.kind===`point`?void 0:M(t.snapshot?.nodes??[]);return H({source:{kind:`runtime`,result:n,publicData:W({session:t,command:`fill`,flags:e.flags,data:n.backendResult}),maestroCoordinateFallbackDispatched:r.used},referenceFrame:i,extra:{text:e.text,...r.extra},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:D(t,n.settle)})}async function Ot(e,t,n){return await kt({params:e,session:t,selector:n,command:`press`,positionals:[],extra:{selector:n.raw},fallbackPhase:`ios_direct_selector_tap_fallback`})}async function kt(t){let{params:n,session:r,selector:i,command:a,positionals:o,extra:s,fallbackPhase:c}=t,l=Date.now();ye(r);try{let e=await he(r.device,a,o,n.req.flags?.out,{...n.contextFromFlags(n.req.flags,r.appBundleId,r.trace?.outPath),directElementSelector:i,surface:r.surface})??{},t=Date.now(),c=jt(e),u=W({session:r,command:at(n.req.command,a),flags:n.req.flags,data:e}),d=G(i.allowNonHittableCoordinateFallback===!0,e),{result:f,responseData:p}=H({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:u,point:c,maestroCoordinateFallbackDispatched:d.used},referenceFrame:Mt(e),extra:{...s,...d.extra}});return N({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??[],retryPositionals:K(c),flags:n.req.flags,result:f,responseData:p,actionStartedAt:l,actionFinishedAt:t})}catch(t){return await At({error:t,handlerParams:n,session:r,extra:s,positionals:o,actionStartedAt:l})||(Ee(t,{delegateSemanticFailures:i.allowNonHittableCoordinateFallback!==!0})?(b({level:`debug`,phase:c,data:{selector:i.raw,error:t instanceof Error?t.message:String(t)}}),null):{ok:!1,error:e(t)})}}async function At(e){let{error:t,handlerParams:n,session:r,extra:i,positionals:a,actionStartedAt:o}=e,s=await q({error:t,command:n.req.command,requestId:n.req.meta?.requestId,flags:n.req.flags,session:r,sessionStore:n.sessionStore,contextFromFlags:n.contextFromFlags,captureSnapshotForSession:n.captureSnapshotForSession});if(!s)return;let{result:c,responseData:l}=V({targetKind:`selector`,warning:s.warning,resolution:{source:`direct-ios`,kind:`not-observed`},extra:i});return N({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??a,flags:n.req.flags,result:c,responseData:l,scheduleInteractionOutcomeRetry:!1,actionStartedAt:o,actionFinishedAt:Date.now()})}function jt(e){let t=typeof e.x==`number`?e.x:void 0,n=typeof e.y==`number`?e.y:void 0;return t!==void 0&&n!==void 0?{x:t,y:n}:{x:0,y:0}}function Mt(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}function Nt(e){let{session:t,commandLabel:n,target:r,flags:i}=e;return n!==`click`||r.kind!==`selector`||v(t)||It(i)||c(n)&&i?.verify===!0||l(n)&&i?.settle===!0?null:Pt(t,r.selector,i)}function Pt(e,t,n){let r=Me({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}const Ft=[`count`,`intervalMs`,`holdMs`,`jitterPx`,`doubleTap`];function It(e){return Ft.some(t=>e?.[t]!==void 0)?!0:e?.clickButton!==void 0&&e.clickButton!==`primary`}const Lt=new Set([`press`,`click`]);async function Rt(e,t){let{req:n,sessionStore:r,sessionName:i}=e,a=r.get(i);if(!a)return{response:S()};let o=t===`click`?`click`:t,s=zt(a,t,o,n.flags);if(s)return{response:s};let c=n.positionals??[],l=t===`longpress`?Pe(c):Fe(c,o);if(!l.ok)return{response:l.response};let u=Vt(a,n,l),d=await Ut(e,a,t,l,u);if(d.response)return{response:d.response};let f=ne(n.flags);return{admitted:{session:a,commandLabel:o,clickButton:f,resultButtonTag:ae(f),target:l.target,durationMs:t===`longpress`?l.durationMs:void 0,staleRefsWarning:u,androidFreshnessBaseline:d.androidFreshnessBaseline,refContext:Ht(n,l,u)}}}function zt(e,t,n,r){let i=t===`click`?`press`:t;return L(e,n)||C(i,e.device,t===`hover`?{message:`hover is not supported on this device: hover is a pointer state that only web targets have (--platform web). Touch platforms have no hover; use longpress for hold gestures.`}:void 0)||O(t,r)||Bt(e,t,n,r)}function Bt(e,t,n,r){let i=ne(r);if(!Lt.has(t)||i===`primary`)return;let a=oe({commandLabel:n,platform:u(e.device),button:i,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(a)return x(a.code,a.message,a.details)}function Vt(e,t,n){if(n.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0)return T({session:e,ref:n.target.ref,mintedGeneration:n.refGeneration})}function Ht(e,t,n){if(t.target.kind===`ref`&&e.internal?.findResolvedTarget===void 0)return{ref:t.target.ref,mintedGeneration:t.refGeneration,staleRefsWarning:n}}async function Ut(e,t,n,r,i){let{req:a}=e;if(r.target.kind!==`ref`)return{};let o=e.refSnapshotFlagGuardResponse(n===`click`?`press`:n,a.flags);if(o)return{response:o};let s=a.internal?.findResolvedTarget?null:P({session:t,ref:r.target.ref,mintedGeneration:r.refGeneration,staleRefsWarning:i});return s?{response:s}:{androidFreshnessBaseline:await I(e,t)}}async function Z(e,t){let n=await Rt(e,t);if(`response`in n)return n.response;let{admitted:r}=n,i=e.req.internal?.replayTargetGuard?null:Nt({session:r.session,commandLabel:r.commandLabel,target:r.target,flags:e.req.flags});if(i){let t=await Ot(e,r.session,i);if(t)return t}return await Y(e,Wt(e,t,r))}function Wt(e,t,n){let{req:r,sessionName:i}=e,{session:a,target:o,durationMs:s,staleRefsWarning:c,resultButtonTag:l}=n,u=t===`longpress`?{...s===void 0?{}:{durationMs:s},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l;return{androidFreshnessBaseline:n.androidFreshnessBaseline,refContext:n.refContext,iosTapCorroboration:{target:o,extra:u},run:async e=>await Gt({runtime:e,command:t,target:o,sessionName:i,requestId:r.meta?.requestId,clickButton:n.clickButton,flags:r.flags,durationMs:s,expectedResolvedTarget:r.internal?.replayTargetGuard,preresolvedTarget:r.internal?.findResolvedTarget}),afterRun:async e=>{if(!a.lease?.leaseProvider)return await Te(a,ke(o,e))},buildPayloads:async n=>{let i=Kt(n);return await it({params:e,session:a,result:n,staleRefsWarning:c,publicData:W({session:a,command:t===`longpress`||t===`hover`?void 0:t,flags:r.flags,data:n.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l})}}}async function Gt(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c={session:i,requestId:a,settle:k(o),expectedResolvedTarget:s};switch(n){case`longpress`:return await t.interactions.longPress(r,{...c,durationMs:e.durationMs});case`hover`:return await t.interactions.hover(r,c);case`click`:return await t.interactions.click(r,Q(e,c));case`press`:return await t.interactions.press(r,Q(e,c))}}function Q(e,t){let{flags:n}=e;return{...t,button:e.clickButton,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap,verify:n?.verify,preresolvedTarget:e.preresolvedTarget}}function Kt(e){return`durationMs`in e?e.durationMs:void 0}async function qt(e){switch(e.req.command){case`press`:return await Z(e,`press`);case`click`:return await Z(e,`click`);case`longpress`:return await Z(e,`longpress`);case`hover`:return await Z(e,`hover`);case`fill`:return await Tt(e);default:return null}}function $(e,t={}){let n=typeof t.executionProfile==`string`?t.executionProfile:void 0;return{kind:e.kind,durationMs:e.durationMs,pointerCount:e.pointerCount,from:e.from,to:e.to,...e.kind===`drag`?{targets:e.targets}:{},...e.backendResult??{},...t,...n?{timing:{executionProfile:n,gestureDurationMs:e.durationMs}}:{},message:e.message}}async function Jt(e){return await en(e,`gesture`,async t=>Yt(e,t))}async function Yt(e,t){let n=ee(e.req.input),r=nn(n,t);return r.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(r.executionProfile=e.req.internal.gestureExecutionProfile),w(r,t.device),Zt(n,r,await Xt($t(e),{session:e.sessionName,requestId:e.req.meta?.requestId},r,e.req.internal),e.req.flags)}async function Xt(e,t,n,r){if(n.intent!==`drag`)return await e.interactions.gesture({...t,gesture:n});let i=r?.replayTargetGuards??(r?.replayTargetGuard?{source:r.replayTargetGuard}:void 0);return await e.interactions.gesture({...t,gesture:n,...i?{expectedResolvedTargets:i}:{}})}function Zt(e,t,n,r){let i=n.kind===`drag`?n.recording:void 0,a=i?.sourceTarget,o=i?.destinationTarget;return{positionals:an(e,i),flags:fn(e,r),responseData:$(n,{executionProfile:tn(t)}),...e.kind===`pinch`?{recordingResultExtra:{scale:e.scale}}:a?{recordingResultExtra:{selectorChain:a.selectorChain}}:{},...a&&o?{recordedTargets:{source:{node:a.node,preActionNodes:a.preActionNodes},destination:{node:o.node,preActionNodes:o.preActionNodes}}}:{}}}async function Qt(e){return await en(e,`swipe`,async t=>{let n=on(e.req.input);w(g(n).gesture,t.device);let r=n.count??1,i=n.pauseMs??0,a=n.pattern??`one-way`,o=await un($t(e),e,n,r,i,a);return{positionals:ln(n),flags:e.req.flags,responseData:$(o,{from:n.from,to:n.to,x1:n.from.x,y1:n.from.y,x2:n.to.x,y2:n.to.y,effectiveDurationMs:o.durationMs,timingMode:`direct`,executionProfile:`endpoint-hold`,count:r,pauseMs:i,pattern:a})}})}function $t(e){return A({...e,pairedGestureViewport:e.req.internal?.gestureViewport})}async function en(t,n,r){let i=t.sessionStore.get(t.sessionName);if(!i)return S();let a=Date.now();try{let e=me(i.device),o=e?{status:`clear`}:await E({session:i,command:n,phase:`before-command`}),s=await r(i);e||await E({session:i,command:n,phase:`after-command`});let c={...s.responseData};return o.status===`recovered`&&(c.warning=`${typeof c.warning==`string`?`${c.warning} `:``}${o.warning}`),N({session:i,sessionStore:t.sessionStore,command:n,actionCommand:n,positionals:s.positionals,flags:s.flags,result:{...c,...s.recordingResultExtra??{}},responseData:c,recordedTargets:s.recordedTargets,actionStartedAt:a,actionFinishedAt:Date.now()})}catch(t){return{ok:!1,error:e(t)}}}function tn(e){if(e.intent===`fling`)return`endpoint-hold`;if(e.intent===`pan`)return e.executionProfile??`timed-pan`;if(e.intent===`drag`)return`timed-pan`}function nn(e,t){let n=te(e);return n.intent===`drag`?{...n,source:rn(n.source,t),destination:rn(n.destination,t)}:n}function rn(e,i){if(!e.startsWith(`@`))return e;let a=n(e);if(!a)throw new t(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:r});return F({session:i,ref:a.base,mintedGeneration:a.generation}),a.base}function an(e,t){return e.kind!==`drag`||!t?_(e):_({...e,source:t.sourceSelector??e.source,destination:t.destinationSelector??e.destination})}function on(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`swipe requires structured object input`);se(e);let n=e,r=n.pattern;if(r!==void 0&&r!==`one-way`&&r!==`ping-pong`)throw new t(`INVALID_ARGS`,`swipe pattern must be one-way or ping-pong`);let i={from:cn(n.from,`swipe from`),to:cn(n.to,`swipe to`),count:a(n,`count`,{min:1,max:200}),pauseMs:a(n,`pauseMs`,{min:0,max:ie}),pattern:r};return sn(i),i}function sn(e){let n=e.count??1,r=e.pauseMs??0,i=n*100+Math.max(0,n-1)*r;if(!(i<=6e4))throw new t(`INVALID_ARGS`,`Swipe series must fit within ${re}ms.`,{count:n,pauseMs:r,gestureDurationMs:100,scheduledDurationMs:i,hint:`Reduce --count or --pause-ms.`})}function cn(e,n){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`${n} must be a point`);let r=e;if(typeof r.x!=`number`||!Number.isFinite(r.x))throw new t(`INVALID_ARGS`,`${n} x must be finite`);if(typeof r.y!=`number`||!Number.isFinite(r.y))throw new t(`INVALID_ARGS`,`${n} y must be finite`);return{x:r.x,y:r.y}}function ln(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function un(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=g(dn(n,a,s));o=await e.interactions.gesture({session:t.sessionName,requestId:t.req.meta?.requestId,gesture:c.gesture}),i>0&&s+1<r&&await fe(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function dn(e,t,n){return t===`ping-pong`&&n%2==1?{...e,from:e.to,to:e.from}:e}function fn(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function pn(e){let t=await qt({...e,captureSnapshotForSession:j,refSnapshotFlagGuardResponse:Ce});if(t)return t;switch(e.req.command){case y.gesture:return await Jt({...e,captureSnapshotForSession:j});case y.swipe:return await Qt({...e,captureSnapshotForSession:j});case y.type:return await mn({...e,captureSnapshotForSession:j});case`get`:return await je(e);case`is`:return await Ne(e);default:return null}}async function mn(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);return r?C(y.type,r.device)||await hn(r)||await gn(e,r):S()}async function hn(e){return e.device.platform===`android`&&e.screenRecording&&(await xe({session:e})).status===`failed`?x(`COMMAND_FAILED`,`Android system dialog blocked the recording session`):null}async function gn(t,n){let{req:r,sessionName:i,sessionStore:a}=t,o=(r.positionals??[]).join(` `),s=A(t),c=Date.now();try{let e=await E({session:n,command:r.command,phase:`before-command`}),t=await s.interactions.typeText(o,{session:i,requestId:r.meta?.requestId,delayMs:r.flags?.delayMs});await E({session:n,command:r.command,phase:`after-command`});let l=Date.now(),u={...t.backendResult??{},text:t.text,delayMs:t.delayMs,...h(t.message??`Typed ${Array.from(t.text).length} chars`)};return e.status===`recovered`&&(u.warning=e.warning),N({session:n,sessionStore:a,command:r.command,positionals:r.positionals??[],flags:r.flags,result:u,responseData:u,actionStartedAt:c,actionFinishedAt:l})}catch(t){return{ok:!1,error:e(t)}}}export{pn as handleInteractionCommands};
@@ -1,2 +1,2 @@
1
- import{_ as e}from"./sdk-contracts.js";import{B as t,E as n,F as r,M as i,at as a,k as o,rt as s}from"./version.js";import{Y as c}from"./sdk-batch-runner.js";import{c as l,l as u,m as d}from"./sdk-device.js";import{V as f}from"./prepare-kind.js";import{t as p}from"./device.js";import{I as m}from"./sdk-android-adb.js";import{t as h}from"./method-scope.js";import{o as g}from"./helper.js";import{ct as _,ut as v}from"./internal/daemon.js";import{a as y,c as b,i as x,l as S,n as C,o as w,r as T,s as E}from"./apps.js";import{n as D,t as O}from"./runner-sequence.js";function k(e,t,n,r={includeDuration:!0}){let i=j(e.referenceWidth),o=j(e.referenceHeight);if(i===void 0||o===void 0)return M(e,{amount:n?.amount});let s=a({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:o});return M(e,{amount:n?.amount,pixels:s.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function A(e,t={includeDuration:!0}){return{...e?.amount===void 0?{}:{amount:e.amount},...e?.pixels===void 0?{}:{pixels:e.pixels},...t?.includeDuration&&e?.durationMs!==void 0?{durationMs:e.durationMs}:{}}}function j(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function M(e,t){let{x1:n,y1:r,x2:i,y2:a}=P(e),o=j(e.referenceWidth),s=j(e.referenceHeight),c=N(t,n!==void 0&&i!==void 0?Math.round(Math.abs(i-n)):void 0,r!==void 0&&a!==void 0?Math.round(Math.abs(a-r)):void 0);return{...n===void 0?{}:{x1:n},...r===void 0?{}:{y1:r},...i===void 0?{}:{x2:i},...a===void 0?{}:{y2:a},...o===void 0?{}:{referenceWidth:o},...s===void 0?{}:{referenceHeight:s},...t?.amount===void 0?{}:{amount:t.amount},...c===void 0?{}:{pixels:c},...t?.durationMs===void 0?{}:{durationMs:t.durationMs}}}function N(e,t,n){if(e?.preferProvidedPixels&&e.pixels!==void 0)return e.pixels;if(t!==void 0&&t>0)return t;if(n!==void 0&&n>0)return n}function P(e){let t=j(e.x),n=j(e.y),r=j(e.x2),i=j(e.y2);return{...t===void 0?{}:{x1:t},...n===void 0?{}:{y1:n},...r===void 0?{}:{x2:r},...i===void 0?{}:{y2:i}}}async function F(e,t,n,r,i,a){return k(await e(t,{command:`desktopScroll`,direction:i,...A(a,{includeDuration:!0}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function I(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function L(e){return e===`system`?`backSystem`:`backInApp`}function ee(e,t){let n={signal:t.signal,verbose:t.verbose,logPath:t.logPath,traceLogPath:t.traceLogPath,requestId:t.requestId,iosXctestrunFile:t.iosXctestrunFile,iosXctestDerivedDataPath:t.iosXctestDerivedDataPath,iosXctestEnvDir:t.iosXctestEnvDir,runnerLeaseContext:t.runnerLeaseContext};return{runnerOpts:n,overrides:{tap:async(r,i)=>await _(e,W(e,t,r,i),n),tapElementSelector:async r=>await _(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,...r.expectedPoint?{x:r.expectedPoint.x,y:r.expectedPoint.y}:{},...G(e)?{synthesized:!0}:{},appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await _(e,O([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return D(a),a},longPress:async(r,i,a)=>await _(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await _(e,W(e,t,r,i),n),type:async(r,i)=>R(await _(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
2
- `?void 0:`append`,appBundleId:t.appBundleId},n)),fillElementSelector:async(r,i,a)=>await _(e,{command:`type`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,text:i,delayMs:a,textEntryMode:`replace`,appBundleId:t.appBundleId},n),fill:async(r,i,a,o,s)=>await _(e,{command:`type`,x:r,y:i,text:a,delayMs:o,textEntryMode:`replace`,...s?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},appBundleId:t.appBundleId},n),scroll:async(r,i)=>await K(_,e,t,n,r,i),performGesture:async r=>await H(e,t,n,r),gestureViewport:async()=>B(await _(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}function R(e){let t=e.textEntryRoute;return z(t)?{textEntryRoute:t}:{}}function z(e){return typeof e==`string`&&r.includes(e)}function B(t){let n=V(t.x),r=V(t.y),i=V(t.x2),a=V(t.y2);if(n===void 0||r===void 0||i===void 0||a===void 0||i<=0||a<=0)throw new e(`COMMAND_FAILED`,`Apple runner returned an invalid gesture viewport`);return{x:n,y:r,width:i,height:a}}function V(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function H(e,n,r,i){if(i.topology===`two`&&c(e,i.intent),i.topology===`single`&&u(e)){let{start:a,end:o}=t(i);return await _(e,{command:`drag`,x:a.x,y:a.y,x2:o.x,y2:o.y,durationMs:i.durationMs,appBundleId:n.appBundleId},r)}if(i.topology===`single`&&d(e)){let{start:a,end:o}=t(i);return await _(e,{command:`swipe`,direction:U(a,o),appBundleId:n.appBundleId},r)}return await _(e,{command:`gesture`,gesturePlan:i,appBundleId:n.appBundleId},r)}function U(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.abs(n)>=Math.abs(r)?n>=0?`right`:`left`:r>=0?`down`:`up`}function W(e,t,n,r){return{command:`tap`,x:n,y:r,...G(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}function G(e){return l(e)&&!d(e)}async function K(e,t,n,r,a,c){return i(c?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${o}`}),d(t)?M(await e(t,I(a,n.appBundleId,c?.durationMs),r),{amount:c?.amount,durationMs:c?.durationMs}):(s(c??{}),u(t)?await F(e,t,n,r,a,c):k(await e(t,{command:`scroll`,direction:a,...A(c),appBundleId:n.appBundleId},r),a,c))}function q(t,r,i){if(t.appleOs===`watchos`)throw new e(`UNSUPPORTED_PLATFORM`,`watchOS is not supported: XCUITest cannot drive watchOS UI, so this device has no runner backend.`);let{overrides:a,runnerOpts:o}=ee(t,r),s={open:(e,n)=>w(t,e,{appBundleId:n?.appBundleId,launchConsole:n?.launchConsole,launchArgs:n?.launchArgs,terminateRunningApp:n?.terminateRunningApp,url:n?.url,runnerOptions:o}),openDevice:()=>E(t),close:e=>y(t,e,o),screenshot:(e,n)=>Q(t,e,n,o),snapshot:async n=>{let r=te(await m(`snapshot_capture`,async()=>await _(t,{command:`snapshot`,appBundleId:n?.appBundleId,interactiveOnly:n?.interactiveOnly,preferredBackend:n?.preferredBackend,customActions:n?.customActions,depth:n?.depth,scope:n?.scope,raw:n?.raw},J(o,n?.signal)),{backend:`xctest`})),i=r.nodes??[];if(i.length===0&&t.kind===`simulator`)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`);return{nodes:i,truncated:r.truncated??!1,backend:`xctest`,...r.quality?{quality:r.quality}:{},...!r.quality&&r.message?{warnings:[r.message]}:{}}},back:async e=>{if(d(t)){await _(t,I(`menu`,r.appBundleId),o);return}await _(t,{command:L(e),appBundleId:r.appBundleId},o)},home:async()=>{if(d(t)){await _(t,I(`home`,r.appBundleId),o);return}await _(t,{command:`home`,appBundleId:r.appBundleId},o)},setOrientation:async n=>{let i=Y(await _(t,{command:`rotate`,orientation:n,appBundleId:r.appBundleId},o));if(i!==n)throw new e(`COMMAND_FAILED`,`iOS runner observed ${i} after requesting ${n}`,{requestedOrientation:n,observedOrientation:i});return{orientation:i}},appSwitcher:async()=>{await _(t,{command:`appSwitcher`,appBundleId:r.appBundleId},o)},tvRemote:async(e,i)=>{await _(t,I(n(e),r.appBundleId,i),o)},readClipboard:()=>T(t),writeClipboard:e=>x(t,e),setSetting:(e,n,r,i)=>C(t,e,n,r,i),...a};return i?X(t,r,s,i):s}function J(e,t){return t?{...e,signal:e.signal?AbortSignal.any([e.signal,t]):t}:e}function Y(t){let n=t.orientation;if(typeof n==`string`&&p.includes(n))return n;throw new e(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function X(e,t,n,r){return h({...n,open:async()=>Z(`open`),openDevice:async()=>Z(`openDevice`),close:async()=>Z(`close`),screenshot:async()=>Z(`screenshot`),readClipboard:async()=>Z(`readClipboard`),writeClipboard:async()=>Z(`writeClipboard`),setSetting:async()=>Z(`setSetting`)},n=>v(r,{deviceId:e.id,requestId:t.requestId},n))}function Z(t){throw new e(`UNSUPPORTED_OPERATION`,`${t} uses local Apple tooling (simctl/devicectl), which an injected runner transport cannot reach; the provider session must supply its own ${t} implementation.`)}async function Q(e,t,n={},r){if($(e,n.surface)){await g(t,{surface:n.surface,fullscreen:n.fullscreen});return}if(n.captureBackend===`runner`){await b(e,t,n.appBundleId,n.fullscreen,r);return}await S(e,t,{appBundleId:n.appBundleId,pixelDensity:n.pixelDensity,fullscreen:n.fullscreen,runnerOptions:r,normalizeStatusBar:n.normalizeStatusBar,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck})}function $(e,t){return u(e)&&t!==void 0&&t!==`app`}function te(e){return{nodes:Array.isArray(e.nodes)?e.nodes:void 0,truncated:typeof e.truncated==`boolean`?e.truncated:void 0,quality:f(e.snapshotQuality),message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}export{q as createAppleInteractor};
1
+ import{_ as e}from"./sdk-contracts.js";import{Ft as t}from"./sdk-batch-runner.js";import{c as n,l as r,m as i}from"./sdk-device.js";import{L as a,b as o,f as s,h as c,l,o as u,z as d}from"./interaction.js";import{r as f}from"./verdict.js";import{t as p}from"./device.js";import{F as m}from"./sdk-android-adb.js";import{t as ee}from"./method-scope.js";import{a as h}from"./verified-file.js";import{a as g,n as _}from"./runner-client.js";import{a as v,c as te,i as y,l as b,n as x,o as S,r as C,s as w}from"./apps.js";import{a as T}from"./helper.js";import{n as E,t as D}from"./runner-sequence.js";function O(e,t,n,r={includeDuration:!0}){let i=A(e.referenceWidth),a=A(e.referenceHeight);if(i===void 0||a===void 0)return j(e,{amount:n?.amount});let o=d({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:a});return j(e,{amount:n?.amount,pixels:o.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function k(e,t={includeDuration:!0}){return{...e?.amount===void 0?{}:{amount:e.amount},...e?.pixels===void 0?{}:{pixels:e.pixels},...t?.includeDuration&&e?.durationMs!==void 0?{durationMs:e.durationMs}:{}}}function A(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function j(e,t){let{x1:n,y1:r,x2:i,y2:a}=N(e),o=A(e.referenceWidth),s=A(e.referenceHeight),c=M(t,n!==void 0&&i!==void 0?Math.round(Math.abs(i-n)):void 0,r!==void 0&&a!==void 0?Math.round(Math.abs(a-r)):void 0);return{...n===void 0?{}:{x1:n},...r===void 0?{}:{y1:r},...i===void 0?{}:{x2:i},...a===void 0?{}:{y2:a},...o===void 0?{}:{referenceWidth:o},...s===void 0?{}:{referenceHeight:s},...t?.amount===void 0?{}:{amount:t.amount},...c===void 0?{}:{pixels:c},...t?.durationMs===void 0?{}:{durationMs:t.durationMs}}}function M(e,t,n){if(e?.preferProvidedPixels&&e.pixels!==void 0)return e.pixels;if(t!==void 0&&t>0)return t;if(n!==void 0&&n>0)return n}function N(e){let t=A(e.x),n=A(e.y),r=A(e.x2),i=A(e.y2);return{...t===void 0?{}:{x1:t},...n===void 0?{}:{y1:n},...r===void 0?{}:{x2:r},...i===void 0?{}:{y2:i}}}async function P(e,t,n,r,i,a){return O(await e(t,{command:`desktopScroll`,direction:i,...k(a,{includeDuration:!0}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function F(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function I(e){return e===`system`?`backSystem`:`backInApp`}function L(e,t){let n={signal:t.signal,verbose:t.verbose,logPath:t.logPath,traceLogPath:t.traceLogPath,requestId:t.requestId,iosXctestrunFile:t.iosXctestrunFile,iosXctestDerivedDataPath:t.iosXctestDerivedDataPath,iosXctestEnvDir:t.iosXctestEnvDir,runnerLeaseContext:t.runnerLeaseContext};return{runnerOpts:n,overrides:{tap:async(r,i)=>await _(e,W(e,t,r,i),n),tapElementSelector:async r=>await _(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,...r.expectedPoint?{x:r.expectedPoint.x,y:r.expectedPoint.y}:{},...G(e)?{synthesized:!0}:{},appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await _(e,D([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return E(a),a},longPress:async(r,i,a)=>await _(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await _(e,W(e,t,r,i),n),type:async(r,i)=>R(await _(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
2
+ `?void 0:`append`,appBundleId:t.appBundleId},n)),fillElementSelector:async(r,i,a)=>await _(e,{command:`type`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,text:i,delayMs:a,textEntryMode:`replace`,appBundleId:t.appBundleId},n),fill:async(r,i,a,o,s)=>await _(e,{command:`type`,x:r,y:i,text:a,delayMs:o,textEntryMode:`replace`,...s?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},appBundleId:t.appBundleId},n),scroll:async(r,i)=>await K(_,e,t,n,r,i),performGesture:async r=>await H(e,t,n,r),gestureViewport:async()=>B(await _(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}function R(e){let t=e.textEntryRoute;return z(t)?{textEntryRoute:t}:{}}function z(e){return typeof e==`string`&&c.includes(e)}function B(t){let n=V(t.x),r=V(t.y),i=V(t.x2),a=V(t.y2);if(n===void 0||r===void 0||i===void 0||a===void 0||i<=0||a<=0)throw new e(`COMMAND_FAILED`,`Apple runner returned an invalid gesture viewport`);return{x:n,y:r,width:i,height:a}}function V(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function H(e,n,a,s){if(s.topology===`two`&&t(e,s.intent),s.topology===`single`&&r(e)){let{start:t,end:r}=o(s);return await _(e,{command:`drag`,x:t.x,y:t.y,x2:r.x,y2:r.y,durationMs:s.durationMs,appBundleId:n.appBundleId},a)}if(s.topology===`single`&&i(e)){let{start:t,end:r}=o(s);return await _(e,{command:`swipe`,direction:U(t,r),appBundleId:n.appBundleId},a)}return await _(e,{command:`gesture`,gesturePlan:s,appBundleId:n.appBundleId},a)}function U(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.abs(n)>=Math.abs(r)?n>=0?`right`:`left`:r>=0?`down`:`up`}function W(e,t,n,r){return{command:`tap`,x:n,y:r,...G(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}function G(e){return n(e)&&!i(e)}async function K(e,t,n,o,c,u){return s(u?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${l}`}),i(t)?j(await e(t,F(c,n.appBundleId,u?.durationMs),o),{amount:u?.amount,durationMs:u?.durationMs}):(a(u??{}),r(t)?await P(e,t,n,o,c,u):O(await e(t,{command:`scroll`,direction:c,...k(u),appBundleId:n.appBundleId},o),c,u))}function q(t,n,r){if(t.appleOs===`watchos`)throw new e(`UNSUPPORTED_PLATFORM`,`watchOS is not supported: XCUITest cannot drive watchOS UI, so this device has no runner backend.`);let{overrides:a,runnerOpts:o}=L(t,n),s={open:(e,n)=>S(t,e,{appBundleId:n?.appBundleId,launchConsole:n?.launchConsole,launchArgs:n?.launchArgs,terminateRunningApp:n?.terminateRunningApp,url:n?.url,runnerOptions:o}),openDevice:()=>w(t),close:e=>v(t,e,o),screenshot:(e,n)=>ne(t,e,n,o),snapshot:async e=>await J(t,e,o),back:async e=>{if(i(t)){await _(t,F(`menu`,n.appBundleId),o);return}await _(t,{command:I(e),appBundleId:n.appBundleId},o)},home:async()=>{if(i(t)){await _(t,F(`home`,n.appBundleId),o);return}await _(t,{command:`home`,appBundleId:n.appBundleId},o)},setOrientation:async r=>{let i=Z(await _(t,{command:`rotate`,orientation:r,appBundleId:n.appBundleId},o));if(i!==r)throw new e(`COMMAND_FAILED`,`iOS runner observed ${i} after requesting ${r}`,{requestedOrientation:r,observedOrientation:i});return{orientation:i}},appSwitcher:async()=>{await _(t,{command:`appSwitcher`,appBundleId:n.appBundleId},o)},tvRemote:async(e,r)=>{await _(t,F(u(e),n.appBundleId,r),o)},readClipboard:()=>C(t),writeClipboard:e=>y(t,e),setSetting:(e,n,r,i)=>x(t,e,n,r,i),...a};return r?Q(t,n,s,r):s}async function J(e,t,n){return r(e)&&t?.surface&&t.surface!==`app`?await h(t,t.signal):await Y(e,t,n)}async function Y(t,n,r){let i=ie(await m(`snapshot_capture`,async()=>await _(t,{command:`snapshot`,appBundleId:n?.appBundleId,interactiveOnly:n?.interactiveOnly,preferredBackend:n?.preferredBackend,customActions:n?.customActions,depth:n?.depth,scope:n?.scope,raw:n?.raw},X(r,n?.signal)),{backend:`xctest`})),a=i.nodes??[];if(a.length===0&&t.kind===`simulator`)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`);return{nodes:a,truncated:i.truncated??!1,backend:`xctest`,...i.quality?{quality:i.quality}:{},...!i.quality&&i.message?{warnings:[i.message]}:{}}}function X(e,t){return t?{...e,signal:e.signal?AbortSignal.any([e.signal,t]):t}:e}function Z(t){let n=t.orientation;if(typeof n==`string`&&p.includes(n))return n;throw new e(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function Q(e,t,n,r){return ee({...n,open:async()=>$(`open`),openDevice:async()=>$(`openDevice`),close:async()=>$(`close`),screenshot:async()=>$(`screenshot`),readClipboard:async()=>$(`readClipboard`),writeClipboard:async()=>$(`writeClipboard`),setSetting:async()=>$(`setSetting`)},n=>g(r,{deviceId:e.id,requestId:t.requestId},n))}function $(t){throw new e(`UNSUPPORTED_OPERATION`,`${t} uses local Apple tooling (simctl/devicectl), which an injected runner transport cannot reach; the provider session must supply its own ${t} implementation.`)}async function ne(e,t,n={},r){if(re(e,n.surface)){await T(t,{surface:n.surface,fullscreen:n.fullscreen});return}if(n.captureBackend===`runner`){await te(e,t,n.appBundleId,n.fullscreen,r);return}await b(e,t,{appBundleId:n.appBundleId,pixelDensity:n.pixelDensity,fullscreen:n.fullscreen,runnerOptions:r,normalizeStatusBar:n.normalizeStatusBar,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck})}function re(e,t){return r(e)&&t!==void 0&&t!==`app`}function ie(e){return{nodes:Array.isArray(e.nodes)?e.nodes:void 0,truncated:typeof e.truncated==`boolean`?e.truncated:void 0,quality:f(e.snapshotQuality),message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}export{q as createAppleInteractor};
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{D as t}from"./version.js";import{s as n}from"./sdk-batch-runner.js";import{h as r}from"./sdk-android-adb.js";import{t as i}from"./unsupported-interactor.js";import{t as a}from"./tool-provider3.js";const o={allowFailure:!0,timeoutMs:3e4};async function s(e,t){r(await a().launchApp(e.id,t,o),`Failed to launch Vega app ${t}`,{appName:t,deviceId:e.id})}async function c(e){r(await a().checkConnected(e.id,o),`Vega device is not connected`,{deviceId:e.id})}async function l(e,t){r(await a().terminateApp(e.id,t,o),`Failed to terminate Vega app ${t}`,{appName:t,deviceId:e.id})}async function u(e,n,i){let o=t(n);r(await a().pressRemote(e.id,o,i,{allowFailure:!0,timeoutMs:1e4+(i??0)}),`Failed to press Vega TV remote ${n}`,{button:n,deviceId:e.id})}const d=[{matches:(e,t)=>n(e)||!!t?.url,message:`Vega open does not support URLs or deep links.`,hint:`Use open <component-id> with an installed Vega app component ID.`},{matches:(e,t)=>!!t?.activity,message:`Vega open does not support Android activity selection.`,hint:`Remove --activity and use the Vega component ID as the open target.`},{matches:(e,t)=>!!t?.launchConsole,message:`Vega open does not support launch-console output.`,hint:`Remove --launch-console and open the Vega component ID directly.`},{matches:(e,t)=>!!t?.terminateRunningApp,message:`Vega open does not support terminating the running app before launch.`,hint:`Close the Vega component explicitly before opening it again.`},{matches:(e,t)=>!!t?.launchArgs?.length,message:`Vega open does not support launch arguments.`,hint:`Remove --launch-arg values and open the Vega component ID directly.`}];function f(e,t){return{...i(`Vega OS`),open:async(t,n)=>{p(t,n),await s(e,t)},openDevice:()=>c(e),close:t=>l(e,t),back:()=>u(e,`back`),home:()=>u(e,`home`),tvRemote:(t,n)=>u(e,t,n)}}function p(t,n){let r=d.find(({matches:e})=>e(t,n));if(r)throw new e(`UNSUPPORTED_OPERATION`,r.message,{hint:r.hint})}export{f as createVegaInteractor};
1
+ import{_ as e}from"./sdk-contracts.js";import{J as t}from"./sdk-batch-runner.js";import{s as n}from"./interaction.js";import{h as r}from"./sdk-android-adb.js";import{t as i}from"./unsupported-interactor.js";import{t as a}from"./tool-provider3.js";const o={allowFailure:!0,timeoutMs:3e4};async function s(e,t){r(await a().launchApp(e.id,t,o),`Failed to launch Vega app ${t}`,{appName:t,deviceId:e.id})}async function c(e){r(await a().checkConnected(e.id,o),`Vega device is not connected`,{deviceId:e.id})}async function l(e,t){r(await a().terminateApp(e.id,t,o),`Failed to terminate Vega app ${t}`,{appName:t,deviceId:e.id})}async function u(e,t,i){let o=n(t);r(await a().pressRemote(e.id,o,i,{allowFailure:!0,timeoutMs:1e4+(i??0)}),`Failed to press Vega TV remote ${t}`,{button:t,deviceId:e.id})}const d=[{matches:(e,n)=>t(e)||!!n?.url,message:`Vega open does not support URLs or deep links.`,hint:`Use open <component-id> with an installed Vega app component ID.`},{matches:(e,t)=>!!t?.activity,message:`Vega open does not support Android activity selection.`,hint:`Remove --activity and use the Vega component ID as the open target.`},{matches:(e,t)=>!!t?.launchConsole,message:`Vega open does not support launch-console output.`,hint:`Remove --launch-console and open the Vega component ID directly.`},{matches:(e,t)=>!!t?.terminateRunningApp,message:`Vega open does not support terminating the running app before launch.`,hint:`Close the Vega component explicitly before opening it again.`},{matches:(e,t)=>!!t?.launchArgs?.length,message:`Vega open does not support launch arguments.`,hint:`Remove --launch-arg values and open the Vega component ID directly.`}];function f(e,t){return{...i(`Vega OS`),open:async(t,n)=>{p(t,n),await s(e,t)},openDevice:()=>c(e),close:t=>l(e,t),back:()=>u(e,`back`),home:()=>u(e,`home`),tvRemote:(t,n)=>u(e,t,n)}}function p(t,n){let r=d.find(({matches:e})=>e(t,n));if(r)throw new e(`UNSUPPORTED_OPERATION`,r.message,{hint:r.hint})}export{f as createVegaInteractor};
@@ -0,0 +1 @@
1
+ import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{jt as n}from"./sdk-batch-runner.js";import{_ as r,m as i,s as a,x as o}from"./sdk-device.js";import{n as s}from"./command-catalog.js";import{AsyncLocalStorage as c}from"node:async_hooks";let l=[];const u=new c;async function d(e,t){return await u.run([...e],t)}function f(e,t){for(let n of m()){if(!n.ownsDevice(e))continue;let r=n.getInteractor(e,t);if(r)return r}}function p(e){return m().some(t=>t.ownsDevice(e))}function m(){return u.getStore()??l}function ee(e,t={}){C(e);let n=e.map(e=>e.provider);return{providerRuntimes:Object.freeze([...e]),providerRuntimeIds:n,providerRuntimeRequiredIds:y([...n,...t.providerRuntimeRequiredIds??[]]),leaseLifecycleProvider:b(e),recoverableProviderIds:e.filter(e=>e.recoverExpiredLease!==void 0).map(e=>e.provider),recoverExpiredLease:v(e),cloudArtifactProvider:x(e),deviceInventorySource:S(e),appleRunnerProvider:h(e),appleRunnerScreenRecordingTransport:te(e),providerDeviceRuntimeScope:async t=>await d(e,t)}}function te(e){if(e.some(_))return t=>{for(let n of e){if(!_(n)||!n.ownsDevice(t.device))continue;let e=n.getAppleRunnerScreenRecordingTransport(t.device);if(e)return e}}}function h(e){if(e.some(g))return t=>{for(let n of e){if(!g(n)||!n.ownsDevice(t.device))continue;let e=n.getAppleRunnerProvider(t.device);if(e)return e}}}function g(e){return`getAppleRunnerProvider`in e&&typeof e.getAppleRunnerProvider==`function`}function _(e){return`getAppleRunnerScreenRecordingTransport`in e&&typeof e.getAppleRunnerScreenRecordingTransport==`function`}function v(e){if(e.some(e=>e.recoverExpiredLease!==void 0))return async n=>{let r=e.find(e=>E(e,n.leaseProvider));if(!r?.recoverExpiredLease)throw new t(`UNSUPPORTED_OPERATION`,`Provider ${n.leaseProvider??`unknown`} cannot recover an expired lease.`,{provider:n.leaseProvider,leaseId:n.leaseId});await r.recoverExpiredLease(n)}}function y(e){return[...new Set(e)]}function b(e){if(e.length!==0)return{allocate:async(t,n)=>await T(e,`allocate`,t,n),heartbeat:async(t,n)=>await T(e,`heartbeat`,t,n),release:async(t,n)=>await T(e,`release`,t,n)}}function x(e){if(e.length!==0)return{listCloudArtifacts:async t=>await w(e,t)}}function S(e){if(e.length!==0)return{discover:async(t,n)=>{n.throwIfAborted();for(let r of e){if(!E(r,t.leaseProvider))continue;let e=await r.deviceInventoryProvider(t,n);if(n.throwIfAborted(),e!=null)return{kind:`inventory`,devices:e}}return{kind:`declined`}}}}function C(e){let t=new Set;for(let n of e){if(t.has(n.provider))throw TypeError(`Duplicate provider device runtime: ${n.provider}`);t.add(n.provider)}}async function w(e,t){for(let n of e){if(!E(n,t.provider))continue;let e=await n.cloudArtifacts?.listCloudArtifacts?.(t);if(e)return e}}async function T(e,t,n,r){for(let i of e){if(!E(i,n.leaseProvider))continue;let e=i.leaseLifecycle[t],a=e?await e(n,r):void 0;if(a)return a}}function E(e,t){return e.provider===t}const D=new Map;function O(e){for(let t of e.platforms){if(D.has(t))throw Error(`PlatformPlugin already registered for platform "${t}"`);D.set(t,e)}}function k(e){let n=D.get(e);if(!n)throw new t(`UNSUPPORTED_PLATFORM`,`Unsupported platform: ${e}`);return n}function A(e){return D.get(e)}const j={appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1},M={ios:j,ipados:j,visionos:{appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1},tvos:{appAndDeviceLifecycle:!0,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1},macos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!0},watchos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1}};function N(e){return a(e.platform)?M[o(e)]:void 0}const P=e=>{let t=N(e);return t?t.appAndDeviceLifecycle:!0},F=e=>e.platform!==`apple`||e.kind!==`device`||e.iosPhysicalDeviceBackend!==`xctest`,I=e=>{let t=N(e);return t?t.keyboard:e.platform===`android`},L=e=>{let t=N(e);return t?t.orientation:e.platform===`android`},R=e=>{let t=N(e);return t&&t.physicalDeviceSurfaces||e.kind===`simulator`},z=e=>e.platform===`android`||e.platform===`apple`&&o(e)===`ios`||R(e),B=e=>e.platform===`android`?e.target===`tv`:i(e),V={[s.perf]:F,[s.home]:P,[s.appSwitcher]:P,[s.clipboard]:e=>e.platform===`android`||e.platform===`linux`||R(e),[s.keyboard]:I,[s.orientation]:L,[s.tvRemote]:B,[s.alert]:z,[s.settings]:e=>e.platform===`android`||R(e),[s.audio]:n},H={[s.perf]:U,[s.viewport]:e=>e.platform===`apple`?`viewport resizes web targets only (--platform web). Apple screen geometry is fixed by the selected simulator or device type — open a different simulator to test another screen size.`:void 0,[s.tvRemote]:e=>e.platform===`android`?e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`:N(e)?i(e)?void 0:`tv-remote is supported only on tvOS devices.`:void 0};function U(e){if(!F(e))return`This command requires a CoreDevice-backed physical iOS device. The selected XCTest backend supports open, close, interactions, snapshots, and screenshots.`}const W={id:`apple`,platforms:[`apple`],familySelector:`apple`,capability:{bucket:`apple`,supportsByDefault:V,unsupportedHintByDefault:H},perf:{supportsObservations:()=>!0},providers:{platformGatedResolvers:[`appleRunnerProvider`,`appleToolProvider`]},createInteractor:async(e,t)=>{let{createAppleInteractor:n}=await import(`./interactor.js`);return n(e,t)}},G=[s.back,s.home,s.tvRemote],K=e=>e.target===`tv`,q=e=>e.kind===`emulator`&&K(e),J={id:`vega`,platforms:[`vega`],capability:{bucket:`vega`,supportsByDefault:Object.fromEntries(G.map(e=>[e,K])),unsupportedHintByDefault:Object.fromEntries(G.map(e=>[e,t=>q(t)?void 0:`${e} currently supports only Vega Virtual Devices.`]))},providers:{platformGatedResolvers:[`vegaToolProvider`]},createInteractor:async(e,t)=>{let{createVegaInteractor:n}=await import(`./interactor2.js`);return n(e,t)}},Y=[W,{id:`android`,platforms:[`android`],capability:{bucket:`android`,supportsByDefault:{[s.audio]:n,[s.tvRemote]:e=>e.target===`tv`},unsupportedHintByDefault:{[s.tvRemote]:e=>e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`}},perf:{supportsObservations:()=>!0},providers:{platformGatedResolvers:[`androidAdbProvider`]},createInteractor:async(e,t)=>{let{createAndroidInteractor:n}=await import(`./android.js`).then(e=>e.t);return n(e,void 0,t)}},{id:`harmonyos`,platforms:[`harmonyos`],capability:{bucket:`harmonyos`},perf:{supportsObservations:()=>!0},createInteractor:async(e,t)=>{let{createHarmonyInteractor:n}=await import(`./harmonyos.js`);return n(e,t)}},J,{id:`linux`,platforms:[`linux`],capability:{bucket:`linux`},providers:{platformGatedResolvers:[`linuxToolProvider`]},createInteractor:async()=>{let{createLinuxInteractor:e}=await import(`./linux.js`);return e()}},{id:`web`,platforms:[`web`],capability:{bucket:`web`},providers:{platformGatedResolvers:[`webProvider`]},createInteractor:async()=>{let{createWebInteractor:e}=await import(`./web.js`);return e()}}];let X=!1;function Z(){if(!X){for(let e of Y)O(e);X=!0}}var ne=e({getInteractor:()=>Q,getLocalInteractor:()=>$});Z();async function Q(e,n){if(p(e)){let i=f(e,n);if(i)return i;throw new t(`UNSUPPORTED_OPERATION`,`Provider device runtime does not have an active interactor for this device.`,{deviceId:e.id,platform:r(e)})}return await $(e,n)}async function $(e,t){return await k(e.platform).createInteractor(e,t)}export{ee as a,A as i,ne as n,p as o,Z as r,Q as t};
@@ -1,2 +1,2 @@
1
- const e=new Map([{alias:`long-press`,command:`longpress`},{alias:`metrics`,command:`perf`},{alias:`tap`,command:`press`},{alias:`launch`,command:`open`},{alias:`relaunch`,command:`open`,impliedFlags:[`relaunch`]}].map(e=>[e.alias,e]));function t(t){return e.get(t.toLowerCase())?.command??t}function n(t){return e.get(t.toLowerCase())}const r=process.argv.slice(2);i(r)||(r[0]===`mcp`&&!r.includes(`--help`)&&!r.includes(`-h`)?import(`../server.js`).then(({runAgentDeviceMcpServer:e})=>e()).catch(g):h(r));function i(e){return a(e)||o(e)||s(e)}function a(e){return e.length!==1||!m(e[0])?!1:(process.stdout.write(`0.20.8
2
- `),!0)}function o(e){return e.length===0?(import(`../cli-help.js`).then(async({buildUsageText:e})=>{process.stdout.write(`${e()}\n`);let{exitAfterFlush:t}=await import(`../process-exit.js`);await t(1)}).catch(g),!0):!1}function s(e){let n=c(e);return n===void 0?!1:(import(`../cli-help.js`).then(({buildCommandUsageText:r,buildUsageText:i})=>{if(n===null){process.stdout.write(`${i()}\n`);return}let a=r(t(n));if(a){process.stdout.write(a);return}h(e)}).catch(g),!0)}function c(e){switch(e.length){case 1:return l(e[0]);case 2:return u(e[0],e[1]);default:return}}function l(e){return e===`help`||p(e)?null:void 0}function u(e,t){return f(e)?t:d(e,t)}function d(e,t){return p(t)?e:void 0}function f(e){return e===`help`}function p(e){return e===`--help`||e===`-h`}function m(e){return e===`--version`||e===`-V`}function h(e){import(`../process-entry.js`).then(({runCliProcess:t})=>t(e)).catch(g)}function g(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),import(`../process-exit.js`).then(({exitAfterFlush:e})=>e(1)).catch(()=>process.exit(1))}export{t as n,n as t};
1
+ const e=new Map([{alias:`long-press`,command:`longpress`},{alias:`tap`,command:`press`},{alias:`launch`,command:`open`},{alias:`relaunch`,command:`open`,impliedFlags:[`relaunch`]},{alias:`metrics`,command:`perf`}].map(e=>[e.alias,e]));function t(t){return e.get(t.toLowerCase())?.command??t}function n(t){return e.get(t.toLowerCase())}const r=process.argv.slice(2);i(r)||(r[0]===`mcp`&&!r.includes(`--help`)&&!r.includes(`-h`)?import(`../server.js`).then(({runAgentDeviceMcpServer:e})=>e()).catch(g):h(r));function i(e){return a(e)||o(e)||s(e)}function a(e){return e.length!==1||!m(e[0])?!1:(process.stdout.write(`0.20.10
2
+ `),!0)}function o(e){return e.length===0?(import(`../cli-help.js`).then(e=>e.r).then(async({buildUsageText:e})=>{process.stdout.write(`${e()}\n`);let{exitAfterFlush:t}=await import(`../process-exit.js`);await t(1)}).catch(g),!0):!1}function s(e){let n=c(e);return n===void 0?!1:(import(`../cli-help.js`).then(e=>e.r).then(({buildCommandUsageText:r,buildUsageText:i})=>{if(n===null){process.stdout.write(`${i()}\n`);return}let a=r(t(n));if(a){process.stdout.write(a);return}h(e)}).catch(g),!0)}function c(e){switch(e.length){case 1:return l(e[0]);case 2:return u(e[0],e[1]);default:return}}function l(e){return e===`help`||p(e)?null:void 0}function u(e,t){return f(e)?t:d(e,t)}function d(e,t){return p(t)?e:void 0}function f(e){return e===`help`}function p(e){return e===`--help`||e===`-h`}function m(e){return e===`--version`||e===`-V`}function h(e){import(`../process-entry.js`).then(({runCliProcess:t})=>t(e)).catch(g)}function g(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),import(`../process-exit.js`).then(({exitAfterFlush:e})=>e(1)).catch(()=>process.exit(1))}export{t as n,n as t};