agent-device 0.20.2 → 0.20.4

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 (141) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.2.apk → agent-device-android-ime-helper-0.20.4.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.4.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.2.manifest.json → agent-device-android-ime-helper-0.20.4.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.4.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.4.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.2.manifest.json → agent-device-android-snapshot-helper-0.20.4.manifest.json} +6 -6
  7. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +57 -4
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +45 -185
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +257 -0
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +1 -0
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +3 -2
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +1 -1
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +8 -2
  14. package/dist/src/agent-browser-tool.js +1 -1
  15. package/dist/src/agent-device-client.js +2 -2
  16. package/dist/src/android-adb.d.ts +4 -27
  17. package/dist/src/android-adb.js +1 -1
  18. package/dist/src/android.js +1 -1
  19. package/dist/src/app-helpers.js +1 -0
  20. package/dist/src/app-inventory.d.ts +4 -0
  21. package/dist/src/app-lifecycle.js +7 -7
  22. package/dist/src/app-resolution.js +1 -1
  23. package/dist/src/apps.js +5 -5
  24. package/dist/src/boot-diagnostics.js +1 -1
  25. package/dist/src/cli-config.js +1 -1
  26. package/dist/src/cli-help.js +27 -19
  27. package/dist/src/cli-runner.js +1 -1
  28. package/dist/src/cli.js +15 -14
  29. package/dist/src/client-metro.js +1 -1
  30. package/dist/src/{tv-remote.d.ts → cloud-artifacts.d.ts} +109 -126
  31. package/dist/src/command-metadata.js +1 -1
  32. package/dist/src/command-schema.js +1 -1
  33. package/dist/src/command-surface.js +1 -1
  34. package/dist/src/context.js +1 -1
  35. package/dist/src/contracts.d.ts +1 -1
  36. package/dist/src/debug-symbols.js +4 -4
  37. package/dist/src/device-input-state.d.ts +26 -0
  38. package/dist/src/device-input-state.js +1 -1
  39. package/dist/src/device.js +1 -9
  40. package/dist/src/devices2.js +1 -1
  41. package/dist/src/entities.js +1 -0
  42. package/dist/src/find.js +1 -1
  43. package/dist/src/finders.d.ts +1 -1
  44. package/dist/src/finders.js +1 -1
  45. package/dist/src/generic.js +1 -1
  46. package/dist/src/helper.js +2 -2
  47. package/dist/src/ime-lifecycle.js +9 -0
  48. package/dist/src/index.d.ts +593 -556
  49. package/dist/src/input-actions.js +4 -4
  50. package/dist/src/install-artifact.js +4 -4
  51. package/dist/src/install-artifact2.js +1 -1
  52. package/dist/src/install-source2.js +1 -1
  53. package/dist/src/interaction-snapshot.js +1 -1
  54. package/dist/src/interaction.d.ts +7 -4
  55. package/dist/src/interaction.js +1 -1
  56. package/dist/src/interactor.js +2 -2
  57. package/dist/src/interactor2.js +1 -1
  58. package/dist/src/internal/bin.js +1 -1
  59. package/dist/src/internal/daemon.js +14 -14
  60. package/dist/src/internal/png-worker.js +1 -1
  61. package/dist/src/lease-context.js +1 -1
  62. package/dist/src/lease.js +1 -1
  63. package/dist/src/limrun.d.ts +171 -190
  64. package/dist/src/limrun.js +1 -1
  65. package/dist/src/linux.js +1 -1
  66. package/dist/src/logcat.js +1 -1
  67. package/dist/src/manifest.js +1 -1
  68. package/dist/src/metro.d.ts +1 -1
  69. package/dist/src/parser.js +2 -0
  70. package/dist/src/path-resolution.js +1 -1
  71. package/dist/src/physical-device-control.js +1 -1
  72. package/dist/src/plist-xml.js +1 -0
  73. package/dist/src/plist.js +1 -1
  74. package/dist/src/png-worker-contract.js +1 -1
  75. package/dist/src/process-lock.js +1 -1
  76. package/dist/src/provider-limrun-runtime.js +1 -0
  77. package/dist/src/react-native.js +1 -1
  78. package/dist/src/record-trace.js +1 -1
  79. package/dist/src/register-builtins.js +1 -1
  80. package/dist/src/registry.js +22 -22
  81. package/dist/src/remote-config2.js +1 -1
  82. package/dist/src/reporting.js +7 -7
  83. package/dist/src/runner-client.js +1 -1
  84. package/dist/src/runner-disposal.js +1 -1
  85. package/dist/src/runner-lease.js +1 -1
  86. package/dist/src/runner-provider.js +1 -1
  87. package/dist/src/runner-sequence.js +1 -1
  88. package/dist/src/runtime-transport.js +1 -1
  89. package/dist/src/runtime.js +3 -3
  90. package/dist/src/screenshot-geometry.js +1 -0
  91. package/dist/src/screenshot-result.js +6 -0
  92. package/dist/src/sdk-android-adb.d.ts +5 -6
  93. package/dist/src/sdk-android-adb.js +3 -3
  94. package/dist/src/sdk-batch-runner.d.ts +2 -2
  95. package/dist/src/sdk-batch-runner.js +3 -3
  96. package/dist/src/sdk-contracts.d.ts +21 -25
  97. package/dist/src/sdk-contracts.js +2 -2
  98. package/dist/src/sdk-finders.d.ts +1 -1
  99. package/dist/src/sdk-finders.js +1 -1
  100. package/dist/src/sdk-io.js +1 -1
  101. package/dist/src/sdk-remote-config.d.ts +19 -4
  102. package/dist/src/sdk-remote-config.js +1 -1
  103. package/dist/src/sdk-selectors.js +1 -1
  104. package/dist/src/selector-runtime.js +1 -1
  105. package/dist/src/selector-vocabulary.js +1 -1
  106. package/dist/src/selectors.d.ts +1 -1
  107. package/dist/src/selectors.js +1 -1
  108. package/dist/src/server.js +2 -2
  109. package/dist/src/session-target-evidence.js +1 -1
  110. package/dist/src/session.js +8 -8
  111. package/dist/src/setting-state.js +1 -1
  112. package/dist/src/simulator.js +1 -1
  113. package/dist/src/snapshot.js +1 -1
  114. package/dist/src/snapshot2.js +1 -1
  115. package/dist/src/src.js +1 -0
  116. package/dist/src/tool-provider.js +3 -3
  117. package/dist/src/tool-provider2.js +1 -1
  118. package/dist/src/tool-provider3.js +1 -1
  119. package/dist/src/update-check.js +1 -1
  120. package/dist/src/version.js +1 -1
  121. package/dist/src/viewport-dimension.js +14 -0
  122. package/package.json +28 -19
  123. package/server.json +2 -2
  124. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.2.apk.sha256 +0 -1
  125. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.2.apk +0 -0
  126. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.2.apk.sha256 +0 -1
  127. package/dist/src/android-input-method-overlays.js +0 -1
  128. package/dist/src/android-input-ownership.js +0 -1
  129. package/dist/src/apple-multitouch-support.js +0 -1
  130. package/dist/src/click-button.d.ts +0 -5
  131. package/dist/src/compatibility-policy.js +0 -1
  132. package/dist/src/gesture-plan-types.js +0 -1
  133. package/dist/src/gesture-plan.js +0 -1
  134. package/dist/src/launch-console.js +0 -1
  135. package/dist/src/recording-export-quality.js +0 -15
  136. package/dist/src/rolldown-runtime.js +0 -1
  137. package/dist/src/runtime2.js +0 -1
  138. package/dist/src/sdk-app-inventory.d.ts +0 -4
  139. package/dist/src/sdk-app-inventory.js +0 -1
  140. package/dist/src/snapshot-diagnostics.js +0 -6
  141. package/dist/src/xml.js +0 -2
@@ -1 +1 @@
1
- import{_ as e,u as t}from"./sdk-contracts.js";import{$ as n,G as r,et as i}from"./sdk-batch-runner.js";const a=/^#\s*agent-device:target-v(\d+)(?:\s+(.*))?$/,o=4096;function s(e){return e.normalize(`NFC`)}function c(e){if(e===void 0)return;let t=s(e);return t.length>0?t:void 0}function l(e){return s(e)}function u(e){if(e===void 0)return;let t=s(e).trim().replace(/\s+/g,` `);return t.length>0?t:void 0}function d(e){return Buffer.byteLength(e,`utf8`)}function f(e,t){if(d(e)<=t)return e;let n=e.length;for(;n>0&&d(e.slice(0,n))>t;)--n;if(n>0){let t=e.charCodeAt(n-1);t>=55296&&t<=56319&&--n}return e.slice(0,n)}function p(e){let t={};return e.id!==void 0&&(t.id=e.id),t.role=e.role,e.label!==void 0&&(t.label=e.label),t.ancestry=e.ancestry.map(ee),t.sibling=e.sibling,t.viewportOrder=e.viewportOrder,e.scrollRegion&&(t.scrollRegion=te(e.scrollRegion)),e.rect&&(t.rect=ne(e.rect)),t.verification=e.verification,t}function ee(e){let t={role:e.role};return e.label!==void 0&&(t.label=e.label),t}function te(e){let t={role:e.role};return e.id!==void 0&&(t.id=e.id),e.label!==void 0&&(t.label=e.label),t}function ne(e){return{x:e.x,y:e.y,width:e.width,height:e.height}}function m(e){return JSON.stringify(p(e))}function re(e){return`# agent-device:target-v1 ${m(e)}`}function ie(e){let t=e.trim();if(!t.startsWith(`#`))return{kind:`none`};let n=a.exec(t);return n?Number(n[1])===1?{kind:`v1`,evidence:ae((n[2]??``).trim())}:{kind:`future-version`}:{kind:`none`}}function ae(t){if(d(t)>4096)throw new e(`INVALID_ARGS`,`target-v1 annotation exceeds the ${o}-byte payload cap.`);let n;try{n=JSON.parse(t)}catch{throw new e(`INVALID_ARGS`,`target-v1 annotation is not valid JSON.`)}if(typeof n!=`object`||!n||Array.isArray(n))throw new e(`INVALID_ARGS`,`target-v1 annotation must be a JSON object.`);let r=n,i=h(r.role,`role`),a=g(r.id,`id`),s=_(r.label,`label`),c=oe(r.ancestry),l=ce(r.sibling,`sibling`,0),u=ce(r.viewportOrder,`viewportOrder`,0),f=le(r.scrollRegion),p=ue(r.rect),ee=de(r.verification);return{...a===void 0?{}:{id:a},role:i,...s===void 0?{}:{label:s},ancestry:c,sibling:l,viewportOrder:u,...f?{scrollRegion:f}:{},...p?{rect:p}:{},verification:ee}}function h(t,n){if(t===void 0)throw new e(`INVALID_ARGS`,`target-v1 "${n}" is required.`);if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a string.`);return v(l(t),n)}function g(t,n){if(t===void 0)return;if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a string.`);let r=c(t);return r===void 0?void 0:v(r,n)}function _(t,n){if(t===void 0)return;if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a string.`);let r=u(t);return r===void 0?void 0:v(r,n)}function v(t,n){if(d(t)>256)throw new e(`INVALID_ARGS`,`target-v1 "${n}" exceeds the 256-byte field cap.`);return t}function oe(t){if(t===void 0)return[];if(!Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "ancestry" must be an array.`);if(t.length>8)throw new e(`INVALID_ARGS`,`target-v1 "ancestry" exceeds the 8-entry cap.`);return t.map((e,t)=>se(e,t))}function se(t,n){if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "ancestry[${n}]" must be an object.`);let r=t,i=h(r.role,`ancestry[${n}].role`),a=_(r.label,`ancestry[${n}].label`);return{role:i,...a===void 0?{}:{label:a}}}function ce(t,n,r){if(t===void 0)return r;if(typeof t!=`number`||!Number.isSafeInteger(t)||t<0)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a non-negative integer.`);return t}function le(t){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "scrollRegion" must be an object.`);let n=t,r=h(n.role,`scrollRegion.role`),i=g(n.id,`id`),a=_(n.label,`scrollRegion.label`);return{role:r,...i===void 0?{}:{id:i},...a===void 0?{}:{label:a}}}function ue(t){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "rect" must be an object.`);let n=t;return{x:y(n.x,`rect.x`),y:y(n.y,`rect.y`),width:y(n.width,`rect.width`),height:y(n.height,`rect.height`)}}function y(t,n){if(typeof t!=`number`||!Number.isFinite(t))throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a finite number.`);return t}function de(t){if(t===`verified`||t===`unverifiable`)return t;throw new e(`INVALID_ARGS`,`target-v1 "verification" must be "verified" or "unverifiable".`)}function fe(e){return{...e.id===void 0?{}:{id:e.id},role:e.role,...e.label===void 0?{}:{label:e.label}}}function pe(e,t){return t.id===void 0?e.role===t.role&&e.label===t.label:e.id===t.id}function me(e,t){if(e.length<t.length)return!1;for(let[n,r]of t.entries()){let t=e[n];if(!t||t.role!==r.role||r.label!==void 0&&t.label!==r.label)return!1}return!0}function he(e){return e.matchedRefs.length===0?{path:2,outcome:`unverifiable`,reason:`selector-miss`}:e.identitySetRefs.length===0?{path:3,outcome:`unverifiable`,reason:`identity-set-empty`}:e.identitySetRefs.length===1?e.identitySetRefs[0]===e.winnerRef?{path:4,outcome:`verified`}:{path:5,outcome:`unverifiable`,reason:`unique-but-wrong`}:e.siblingMatchRefs.length===1?e.siblingMatchRefs[0]===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:e.regionMemberRefs!==void 0&&e.regionMemberRefs.length>0&&e.viewportCandidateRef!==void 0?e.viewportCandidateRef===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:{path:6,outcome:`unverifiable`,reason:`no-signal-isolation`}}function ge(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r[r.length-1]?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function b(e){return new Map(e.map(e=>[e.index,e]))}function x(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function _e(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function ve(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=ye(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function ye(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function S(e){let t=C(e.label),n=C(e.value),r=C(e.identifier),i=Te(r)?r:``;return we(e.type??``)?n||t||i:t||n||i}function be(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=w(e.type??``),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`textview`)||n.includes(`textarea`)||n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`edittext`)||r.includes(`text area`)||r.includes(`text field`)}function xe(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function Se(e,t){let n=S(e),r=be(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&Ce(n)}}function Ce(e){return e?e.length>80||/[\r\n]/.test(e):!1}function C(e){return typeof e==`string`?e.trim():``}function w(e){let t=e.trim().replace(/XCUIElementType/gi,``).replace(/^AX/,``).toLowerCase(),n=Math.max(t.lastIndexOf(`.`),t.lastIndexOf(`/`));return n!==-1&&(t=t.slice(n+1)),t}function we(e){let t=w(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function Te(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}function T(e,n){let r=t(n),i=e.filter(e=>Ee(e.rect)),a=i.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)});return O(a.map(e=>e.rect).filter(e=>D(e,r.x,r.y)))||O(a.map(e=>e.rect))||O(i.map(e=>e.rect).filter(e=>D(e,r.x,r.y)))||null}function E(e,t){return k(e.x,e.x+e.width,t.x,t.x+t.width)&&k(e.y,e.y+e.height,t.y,t.y+t.height)}function Ee(e){return e?Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height):!1}function D(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function O(e){let t=null,n=-1;for(let r of e){let e=r.width*r.height;e>n&&(t=r,n=e)}return t}function k(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function A(e){let t=`${e??``}`.toLowerCase();return t.includes(`scroll`)||t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)||t.includes(`collectionview`)||t===`table`}function j(e){return A(e.type)?!0:`${e.role??``} ${e.subrole??``}`.toLowerCase().includes(`scroll`)}function De(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=M(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>Me(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:Ne(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&Ie(e)),e,t)}}function Oe(e){if(e.length===0)return new Map;let{hintedContainers:t}=M(e);return je(t.directionsByContainer)}function M(e){let t=b(e),n=new Set,r=[];for(let i of e){if(N(i,e,t)){Re(i,n,t);continue}r.push(i)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:Ae(e,r,n,t)}}function N(e,t,n=b(t)){if(!e.rect)return!0;let r=I(e,t,n);return r?E(e.rect,r):!0}function P(e,t,n=b(t)){if(!e.rect)return!0;if(!N(e,t,n))return!1;let r=T(t,e.rect);return F(e.rect,r)}function F(e,t){return!t||t.width<=0||t.height<=0?!0:D(t,e.x+e.width/2,e.y+e.height/2)}function I(e,t,n=b(t)){return He(e,n)||T(t,e.rect??{x:0,y:0,width:0,height:0})}function ke(e,t,n=b(t)){if(!e.rect)return null;let r=I(e,t,n);if(r&&!E(e.rect,r)){let t=L(e.rect,r);if(t)return t}let i=T(t,e.rect);if(i&&!F(e.rect,i)){let t=L(e.rect,i);if(t)return t}return null}function L(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function Ae(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=ze(e,n,r);if(!t?.rect)continue;let s=Fe(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return Be(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function je(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function Me(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function Ne(e,t,n){let r=new Map;for(let i of e){let e=Pe(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=Le(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function Pe(e,t,n){if(!e.rect)return null;let r=I(e,t,n);return r?Fe(e.rect,r):null}function Fe(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function Ie(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!x(e)}function Le(e){let t=new Set,n=[];for(let r of e){let e=x(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function Re(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function ze(e,t,n){return Ue(e,n,e=>t.has(e.index))}function Be(e,t,n,r,i){for(let a of e){let e=Ve(a);if(!e||e.size===0)continue;let o=ze(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function Ve(e){let t=ve(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function He(e,t){return Ue(e,t,e=>!!e.rect)?.rect??null}function Ue(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(i.add(r.index),n(r)&&j(r))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function R(e,t){return{ok:!1,code:`INVALID_ARGS`,message:e,...t?{hint:t}:{}}}function z(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite)&&e.width>0&&e.height>0)}function We(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}function Ge(e){return e.width*e.height}function Ke(e,t){let n=t.toLowerCase();return e.find(e=>{let t=(e.label??``).toLowerCase(),r=(e.value??``).toLowerCase(),i=(e.identifier??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)})??null}function qe(e,t){let n=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);return n&&B(n)?n:Je(e,t)??(n&&B(n)?n:void 0)}function B(e){let t=e.trim();return!(!t||/^(true|false)$/i.test(t)||/^\d+$/.test(t))}function Je(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);if(!t||!B(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function Ye(e){let t=[],n=[];for(let r of e){let e=r.depth??0;for(;t.length>0&&e<=t[t.length-1];)t.pop();let i=w(r.type??``),a=[r.label,r.value,r.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0),o=a?B(a):!1;if((i===`group`||i===`ioscontentgroup`)&&!o){t.push(e);continue}let s=Math.max(0,e-t.length);n.push({...r,depth:s})}return n}function V(e,t){let n=w(e);return n?t===`android`?n.includes(`edittext`)||n.includes(`autocompletetextview`):n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`textview`)||n.includes(`textarea`)||n===`search`:!0}function Xe(e,t){return t.hittable?t:W(e,t,e=>e.hittable===!0)}function H(e){return new Map(e.map(e=>[e.index,e]))}function U(e,t,n,r){let i=t,a=new Set;for(;typeof i.parentIndex==`number`&&!a.has(i.index);){if(a.add(i.index),i=n.get(i.parentIndex)??e[i.parentIndex],!i)return null;let t=r(i);if(t!==null)return t}return null}function Ze(e,t,n,r){return!!U(e,t,r,e=>e===n||e.index===n.index?e:null)}function W(e,t,n){return U(e,t,H(e),e=>n(e)?e:null)}function G(e){return[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0)[0]??``}function Qe(e){return S(e)}function K(e){return e.hittable===!0?!0:e.rect?e.rect.width>0&&e.rect.height>0:!1}function q(e,t){return V(e.type??``,t)&&e.enabled!==!1}function J(e){return[`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`].includes(e)}function $e(e){let t=e.toLowerCase();return J(t)?{ok:!0,predicate:t}:R(`is requires predicate: visible|hidden|exists|editable|selected|focused|text`,et)}const et=`Use "is <predicate> <selector>" or "is <selector> <predicate>". visible|hidden|editable|selected|focused double as selector keys: a bare predicate token after the selector is read as the predicate, so write key=true (e.g. visible=true) inside the selector to use it as a filter instead.`;function tt(e){if(J((e[0]??``).toLowerCase()))return e;for(let t=1;t<e.length;t+=1){let n=(e[t]??``).toLowerCase();if(J(n)&&i(e.slice(0,t).join(` `)))return[n,...e.slice(0,t),...e.slice(t+1)]}return e}function nt(e){let{predicate:t,node:n,nodes:r,expectedText:i,platform:a}=e,o=G(n),s=q(n,a),c=n.selected===!0,l=n.focused===!0,u=t===`text`?K(n):rt(n,r,a),d=!1;switch(t){case`visible`:d=u;break;case`hidden`:d=!u;break;case`editable`:d=s;break;case`selected`:d=c;break;case`focused`:d=l;break;case`text`:d=o===(i??``);break}let f=t===`text`?`expected="${i??``}" actual="${o}"`:`actual=${JSON.stringify({visible:u,editable:s,selected:c,focused:l})}`;return{pass:d,actualText:o,details:f}}function rt(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(z(e.rect))return it(e,t);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=at(e,t,n);return r?z(r.rect)?it(r,t):n!==`android`&&r.hittable===!0:!1}function it(e,t){return N(e,t)}function at(e,t,n){return U(t,e,H(t),e=>ot(e,n)?e:null)}function ot(e,t){if(t===`android`&&e.visibleToUser===!1)return!1;let n=w(e.type??``);return n.includes(`application`)||n.includes(`window`)||n.includes(`scrollview`)||n.includes(`tableview`)||n.includes(`collectionview`)||n===`table`||n===`list`||n===`listview`?!1:t===`android`?e.hittable===!0&&z(e.rect):e.hittable===!0||z(e.rect)}function st(e){let t=tt(e),r=t[0]??``;return{predicate:r,split:n(t.slice(1),{preferTrailingValue:r===`text`})}}const ct=`is requires a selector expression`,lt=`is text requires expected text value`;function ut(e){let{predicate:t,split:n}=st([...e]),r=$e(t);if(!r.ok)return r;if(!n)return R(ct);let i=n.rest.join(` `).trim();return r.predicate===`text`&&!i?R(lt):r.predicate!==`text`&&n.rest.length>0?R(`is ${r.predicate} does not accept trailing values`):{ok:!0,predicate:r.predicate,selectorExpression:n.selectorExpression,expectedText:i}}function dt(e){return e===`text`||e===`attrs`?{ok:!0,format:e}:R(`get only supports text or attrs`)}function ft(e){let t=e[0];if(t?.startsWith(`@`)){let n=e.slice(1).join(` `).trim();return{ok:!0,ref:t,...n?{label:n}:{}}}let n=e.join(` `).trim();return n?{ok:!0,selector:n}:R(`get requires @ref or selector expression`)}function pt(e){return e?{ok:!0,text:e}:R(`wait requires text`)}function Y(e,t,n){return t.terms.every(t=>mt(e,t,n))}function mt(e,t,n){switch(t.key){case`id`:return X(e.identifier,String(t.value));case`role`:return X(w(e.type??``),String(t.value));case`label`:return X(e.label,String(t.value));case`value`:return X(e.value,String(t.value));case`text`:return X(G(e),String(t.value));case`appname`:return X(e.appName,String(t.value));case`windowtitle`:return X(e.windowTitle,String(t.value));case`visible`:return K(e)===!!t.value;case`hidden`:return!K(e)==!!t.value;case`editable`:return q(e,n)===!!t.value;case`selected`:return e.selected===!0==!!t.value;case`focused`:return e.focused===!0==!!t.value;case`enabled`:return e.enabled!==!1==!!t.value;case`hittable`:return e.hittable===!0==!!t.value;default:return!1}}function X(e,t){return r(e??``)===r(t)}function ht(e,t,n){let r=n.requireRect??!1,i=n.requireUnique??!0,a=[];for(let[o,s]of t.selectors.entries()){let t=xt(e,s,n.platform,r);if(a.push({selector:s.raw,matches:t.count}),!(t.count===0||!t.firstNode)){if(i&&t.count!==1){if(!n.disambiguateAmbiguous||!t.disambiguated||!t.tiebreak)continue;return{node:t.disambiguated,selector:s,selectorIndex:o,matches:t.count,diagnostics:a,disambiguation:{matchCount:t.count,tiebreak:t.tiebreak,alternatives:t.candidates.filter(e=>e!==t.disambiguated)}}}return{node:t.firstNode,selector:s,selectorIndex:o,matches:t.count,diagnostics:a}}}return null}function gt(e,t,n){let r=n.requireRect??!1;for(let[i,a]of t.selectors.entries()){let t=e.filter(e=>r&&!e.rect?!1:Y(e,a,n.platform));if(t.length>0)return{selector:a,selectorIndex:i,matchedNodes:t}}return null}function _t(e,t,n){let r=n.requireRect??!1,i=[];for(let[a,o]of t.selectors.entries()){let t=Tt(e,o,n.platform,r);if(i.push({selector:o.raw,matches:t}),t>0)return{selectorIndex:a,selector:o,matches:t,diagnostics:i}}return null}const vt=`Snapshot refs expire when the UI changes. Run snapshot -i and retry with a fresh @ref.`;function yt(e){return e.some(e=>e.matches>1)?`Add more terms to disambiguate (e.g. role=button text="Sign in"), use an @ref from snapshot -i, or use find <text> --first/--last.`:`Selector text/label values match exactly (quote multi-word values: text="Sign in"). Run snapshot -i to see current elements and refs, or use find <text> for contains matching.`}function bt(e,t,n){if(t.length===0)return`Selector did not match: ${e.raw}`;let r=t.map(e=>`${e.selector} -> ${e.matches}`).join(`, `);return n.unique??!0?`Selector did not resolve uniquely (${r})`:`Selector did not match (${r})`}function xt(e,t,n,r){let i=0,a=null,o=[],s={best:null,bestVisible:!1,tie:!1},c,l=t=>(c??=b(e),P(t,e,c));for(let c of e)r&&!c.rect||Y(c,t,n)&&(i+=1,a??=c,o.push(c),St(s,c,l));return{count:i,firstNode:a,disambiguated:s.tie?null:s.best,tiebreak:s.tie?null:Ct(o,s.best,l),candidates:o}}function St(e,t,n){if(!e.best){e.best=t;return}e.bestVisible||=n(e.best);let r=n(t);if(r!==e.bestVisible){r&&(e.best=t,e.bestVisible=!0,e.tie=!1);return}let i=Et(t,e.best);i.result>0?(e.best=t,e.tie=!1):i.result===0&&(e.tie=!0)}function Ct(e,t,n){if(!t)return null;let r=null;for(let i of e)i!==t&&(!r||wt(i,r,n).result>0)&&(r=i);return r?wt(t,r,n).criterion:null}function wt(e,t,n){let r=n(e);return r===n(t)?Et(e,t):{result:r?1:-1,criterion:`visible`}}function Tt(e,t,n,r){let i=0;for(let a of e)r&&!a.rect||Y(a,t,n)&&(i+=1);return i}function Et(e,t){let n=e.depth??0,r=t.depth??0;if(n!==r)return{result:n>r?1:-1,criterion:`deepest`};let i=Dt(e),a=Dt(t);return i===a?{result:0,criterion:null}:{result:i<a?1:-1,criterion:`smallest-area`}}function Dt(e){return e.rect?e.rect.width*e.rect.height:1/0}function Z(e){let t=l(w(e.type??``)),n=c(e.identifier),r=u(e.label);return{...n===void 0?{}:{id:f(n,256)},role:f(t,256),...r===void 0?{}:{label:f(r,256)}}}function Ot(e,t){return e.id===t.id&&e.role===t.role&&e.label===t.label}function kt(e,t){let n=0;for(let r of e)Z(r).id===t&&(n+=1);return n}function At(e,t){if(e.id===void 0||kt(t,e.id)<=1)return e;let{role:n,label:r}=e;return{role:n,...r===void 0?{}:{label:r}}}function jt(e,t){let n=0;for(let r of e)if(r.parentIndex===t.parentIndex){if(r.index===t.index)return n;n+=1}return 0}function Mt(e,t){return{documentOrder:e.index,sibling:jt(t,e)}}function Nt(e,t){return e.documentOrder===t.documentOrder&&e.sibling===t.sibling}const Pt=`replay_target_guard_mismatch`,Ft=`wait_landmark_identity_mismatch`;function It(e,t,n={}){let r=[],i=w(e.type??``),a=Lt(e,n.nodes),o=$(e.label),s=$(e.value),c=$(G(e)),l=n.action===`fill`;a&&r.push(`id=${Q(a)}`),i&&o&&r.push(l?`role=${Q(i)} label=${Q(o)} editable=true`:`role=${Q(i)} label=${Q(o)}`),o&&r.push(l?`label=${Q(o)} editable=true`:`label=${Q(o)}`),s&&r.push(l?`value=${Q(s)} editable=true`:`value=${Q(s)}`),c&&c!==o&&c!==s&&r.push(l?`text=${Q(c)} editable=true`:`text=${Q(c)}`),i&&l&&!r.some(e=>e.includes(`editable=true`))&&r.push(`role=${Q(i)} editable=true`);let u=Rt(r);return u.length===0&&i&&u.push(l?`role=${Q(i)} editable=true`:`role=${Q(i)}`),u.length===0&&K(e)&&u.push(`visible=true`),u}function Lt(e,t){let n=$(e.identifier);if(!n||!t)return n;let r=Z(e).id;return r===void 0?n:kt(t,r)>1?null:n}function Rt(e){return Array.from(new Set(e))}function Q(e){return JSON.stringify(e)}function $(e){return e&&e.trim()||null}export{T as $,H as A,z as B,pt as C,tt as D,nt as E,Ke as F,Oe as G,We as H,Ze as I,I as J,N as K,V as L,G as M,W as N,q as O,Xe as P,O as Q,Ye as R,ut as S,$e as T,De as U,Ge as V,ke as W,A as X,j as Y,D as Z,Y as _,ie as _t,At as a,C as at,ft as b,Mt as c,b as ct,vt as d,o as dt,xe as et,_t as f,fe as ft,yt as g,pe as gt,ht as h,me as ht,Ft as i,we as it,Qe as j,K as k,jt as l,x as lt,gt as m,re as mt,$ as n,S as nt,Ot as o,ve as ot,bt as p,he as pt,P as q,Pt as r,w as rt,Z as s,_e as st,It as t,Se as tt,Nt as u,ge as ut,lt as v,m as vt,st as w,dt as x,ct as y,d as yt,qe as z};
1
+ import{u as e}from"./sdk-contracts.js";import{F as t,U as n,W as r}from"./sdk-batch-runner.js";import{TARGET_ANNOTATION_MAX_FIELD_BYTES as i,normalizeIdentifierField as a,normalizeLabelField as o,normalizeRoleField as s,truncateToUtf8Bytes as c}from"@agent-device/ad-script";function l(e,t){return{ok:!1,code:`INVALID_ARGS`,message:e,...t?{hint:t}:{}}}function u(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite)&&e.width>0&&e.height>0)}function d(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}function f(e){return e.width*e.height}function p(t,n){let r=e(n),i=t.filter(e=>te(e.rect)),a=i.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)});return h(a.map(e=>e.rect).filter(e=>m(e,r.x,r.y)))||h(a.map(e=>e.rect))||h(i.map(e=>e.rect).filter(e=>m(e,r.x,r.y)))||null}function ee(e,t){return g(e.x,e.x+e.width,t.x,t.x+t.width)&&g(e.y,e.y+e.height,t.y,t.y+t.height)}function te(e){return e?Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height):!1}function m(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function h(e){let t=null,n=-1;for(let r of e){let e=r.width*r.height;e>n&&(t=r,n=e)}return t}function g(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function ne(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function _(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=re(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function re(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function ie(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r[r.length-1]?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function v(e){return new Map(e.map(e=>[e.index,e]))}function y(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function ae(e){let t=`${e??``}`.toLowerCase();return t.includes(`scroll`)||t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)||t.includes(`collectionview`)||t===`table`}function oe(e){return ae(e.type)?!0:`${e.role??``} ${e.subrole??``}`.toLowerCase().includes(`scroll`)}function se(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=b(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>pe(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:me(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&ge(e)),e,t)}}function ce(e){if(e.length===0)return new Map;let{hintedContainers:t}=b(e);return fe(t.directionsByContainer)}function b(e){let t=v(e),n=new Set,r=[];for(let i of e){if(x(i,e,t)){ve(i,n,t);continue}r.push(i)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:de(e,r,n,t)}}function x(e,t,n=v(t)){if(!e.rect)return!0;let r=w(e,t,n);return r?ee(e.rect,r):!0}function S(e,t,n=v(t)){if(!e.rect)return!0;if(!x(e,t,n))return!1;let r=p(t,e.rect);return C(e.rect,r)}function C(e,t){return!t||t.width<=0||t.height<=0?!0:m(t,e.x+e.width/2,e.y+e.height/2)}function le(e,t){return e.hittable&&C(e.rect,t)}function w(e,t,n=v(t)){return xe(e,n)||p(t,e.rect??{x:0,y:0,width:0,height:0})}function ue(e,t,n=v(t)){if(!e.rect)return null;let r=w(e,t,n);if(r&&!ee(e.rect,r)){let t=T(e.rect,r);if(t)return t}let i=p(t,e.rect);if(i&&!C(e.rect,i)){let t=T(e.rect,i);if(t)return t}return null}function T(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function de(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=D(e,n,r);if(!t?.rect)continue;let s=E(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return ye(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function fe(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function pe(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function me(e,t,n){let r=new Map;for(let i of e){let e=he(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=_e(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function he(e,t,n){if(!e.rect)return null;let r=w(e,t,n);return r?E(e.rect,r):null}function E(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function ge(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!y(e)}function _e(e){let t=new Set,n=[];for(let r of e){let e=y(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function ve(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function D(e,t,n){return Se(e,n,e=>t.has(e.index))}function ye(e,t,n,r,i){for(let a of e){let e=be(a);if(!e||e.size===0)continue;let o=D(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function be(e){let t=_(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function xe(e,t){return Se(e,t,e=>!!e.rect)?.rect??null}function Se(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(i.add(r.index),n(r)&&oe(r))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function O(e){let t=k(e.label),n=k(e.value),r=k(e.identifier),i=De(r)?r:``;return j(e.type??``)?n||t||i:t||n||i}function Ce(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=A(e.type??``),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`textview`)||n.includes(`textarea`)||n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`edittext`)||r.includes(`text area`)||r.includes(`text field`)}function we(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function Te(e,t){let n=O(e),r=Ce(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&Ee(n)}}function Ee(e){return e?e.length>80||/[\r\n]/.test(e):!1}function k(e){return typeof e==`string`?e.trim():``}function A(e){let t=e.trim().replace(/XCUIElementType/gi,``).replace(/^AX/,``).toLowerCase(),n=Math.max(t.lastIndexOf(`.`),t.lastIndexOf(`/`));return n!==-1&&(t=t.slice(n+1)),t}function j(e){let t=A(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function De(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}function Oe(e,t){let n=t.toLowerCase();return e.find(e=>{let t=(e.label??``).toLowerCase(),r=(e.value??``).toLowerCase(),i=(e.identifier??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)})??null}function ke(e,t){let n=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);return n&&M(n)?n:Ae(e,t)??(n&&M(n)?n:void 0)}function M(e){let t=e.trim();return!(!t||/^(true|false)$/i.test(t)||/^\d+$/.test(t))}function Ae(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);if(!t||!M(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function je(e){let t=[],n=[];for(let r of e){let e=r.depth??0;for(;t.length>0&&e<=t[t.length-1];)t.pop();let i=A(r.type??``),a=[r.label,r.value,r.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0),o=a?M(a):!1;if((i===`group`||i===`ioscontentgroup`)&&!o){t.push(e);continue}let s=Math.max(0,e-t.length);n.push({...r,depth:s})}return n}function N(e,t){let n=A(e);return n?t===`android`?n.includes(`edittext`)||n.includes(`autocompletetextview`):n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`textview`)||n.includes(`textarea`)||n===`search`:!0}function Me(e,t){return t.hittable?t:I(e,t,e=>e.hittable===!0)}function P(e){return new Map(e.map(e=>[e.index,e]))}function F(e,t,n,r){let i=t,a=new Set;for(;typeof i.parentIndex==`number`&&!a.has(i.index);){if(a.add(i.index),i=n.get(i.parentIndex)??e[i.parentIndex],!i)return null;let t=r(i);if(t!==null)return t}return null}function I(e,t,n){return F(e,t,P(e),e=>n(e)?e:null)}function L(e){return[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0)[0]??``}function Ne(e){return O(e)}function R(e){return e.hittable===!0?!0:e.rect?e.rect.width>0&&e.rect.height>0:!1}function z(e,t){return N(e.type??``,t)&&e.enabled!==!1}function B(e){return[`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`].includes(e)}function V(e){let t=e.toLowerCase();return B(t)?{ok:!0,predicate:t}:l(`is requires predicate: visible|hidden|exists|editable|selected|focused|text`,Pe)}const Pe=`Use "is <predicate> <selector>" or "is <selector> <predicate>". visible|hidden|editable|selected|focused double as selector keys: a bare predicate token after the selector is read as the predicate, so write key=true (e.g. visible=true) inside the selector to use it as a filter instead.`;function H(e){if(B((e[0]??``).toLowerCase()))return e;for(let t=1;t<e.length;t+=1){let n=(e[t]??``).toLowerCase();if(B(n)&&r(e.slice(0,t).join(` `)))return[n,...e.slice(0,t),...e.slice(t+1)]}return e}function Fe(e){let{predicate:t,node:n,nodes:r,expectedText:i,platform:a}=e,o=L(n),s=z(n,a),c=n.selected===!0,l=n.focused===!0,u=t===`text`?R(n):Ie(n,r,a),d=!1;switch(t){case`visible`:d=u;break;case`hidden`:d=!u;break;case`editable`:d=s;break;case`selected`:d=c;break;case`focused`:d=l;break;case`text`:d=o===(i??``);break}let f=t===`text`?`expected="${i??``}" actual="${o}"`:`actual=${JSON.stringify({visible:u,editable:s,selected:c,focused:l})}`;return{pass:d,actualText:o,details:f}}function Ie(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(u(e.rect))return U(e,t);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=Le(e,t,n);return r?u(r.rect)?U(r,t):n!==`android`&&r.hittable===!0:!1}function U(e,t){return x(e,t)}function Le(e,t,n){return F(t,e,P(t),e=>Re(e,n)?e:null)}function Re(e,t){if(t===`android`&&e.visibleToUser===!1)return!1;let n=A(e.type??``);return n.includes(`application`)||n.includes(`window`)||n.includes(`scrollview`)||n.includes(`tableview`)||n.includes(`collectionview`)||n===`table`||n===`list`||n===`listview`?!1:t===`android`?e.hittable===!0&&u(e.rect):e.hittable===!0||u(e.rect)}function W(e){let t=H(e),r=t[0]??``;return{predicate:r,split:n(t.slice(1),{preferTrailingValue:r===`text`})}}const G=`is requires a selector expression`,K=`is text requires expected text value`;function ze(e){let{predicate:t,split:n}=W([...e]),r=V(t);if(!r.ok)return r;if(!n)return l(G);let i=n.rest.join(` `).trim();return r.predicate===`text`&&!i?l(K):r.predicate!==`text`&&n.rest.length>0?l(`is ${r.predicate} does not accept trailing values`):{ok:!0,predicate:r.predicate,selectorExpression:n.selectorExpression,expectedText:i}}function Be(e){return e===`text`||e===`attrs`?{ok:!0,format:e}:l(`get only supports text or attrs`)}function Ve(e){let t=e[0];if(t?.startsWith(`@`)){let n=e.slice(1).join(` `).trim();return{ok:!0,ref:t,...n?{label:n}:{}}}let n=e.join(` `).trim();return n?{ok:!0,selector:n}:l(`get requires @ref or selector expression`)}function He(e){return e?{ok:!0,text:e}:l(`wait requires text`)}function q(e,t,n){return t.terms.every(t=>Ue(e,t,n))}function Ue(e,t,n){switch(t.key){case`id`:return J(e.identifier,String(t.value));case`role`:return J(A(e.type??``),String(t.value));case`label`:return J(e.label,String(t.value));case`value`:return J(e.value,String(t.value));case`text`:return J(L(e),String(t.value));case`appname`:return J(e.appName,String(t.value));case`windowtitle`:return J(e.windowTitle,String(t.value));case`visible`:return R(e)===!!t.value;case`hidden`:return!R(e)==!!t.value;case`editable`:return z(e,n)===!!t.value;case`selected`:return e.selected===!0==!!t.value;case`focused`:return e.focused===!0==!!t.value;case`enabled`:return e.enabled!==!1==!!t.value;case`hittable`:return e.hittable===!0==!!t.value;default:return!1}}function J(e,n){return t(e??``)===t(n)}function We(e,t,n){let r=n.requireRect??!1,i=n.requireUnique??!0,a=[];for(let[o,s]of t.selectors.entries()){let t=Xe(e,s,n.platform,r);if(a.push({selector:s.raw,matches:t.count}),!(t.count===0||!t.firstNode)){if(i&&t.count!==1){if(!n.disambiguateAmbiguous||!t.disambiguated||!t.tiebreak)continue;return{node:t.disambiguated,selector:s,selectorIndex:o,matches:t.count,diagnostics:a,disambiguation:{matchCount:t.count,tiebreak:t.tiebreak,alternatives:t.candidates.filter(e=>e!==t.disambiguated)}}}return{node:t.firstNode,selector:s,selectorIndex:o,matches:t.count,diagnostics:a}}}return null}function Ge(e,t,n){let r=n.requireRect??!1;for(let[i,a]of t.selectors.entries()){let t=e.filter(e=>r&&!e.rect?!1:q(e,a,n.platform));if(t.length>0)return{selector:a,selectorIndex:i,matchedNodes:t}}return null}function Ke(e,t,n){let r=n.requireRect??!1,i=[];for(let[a,o]of t.selectors.entries()){let t=$e(e,o,n.platform,r);if(i.push({selector:o.raw,matches:t}),t>0)return{selectorIndex:a,selector:o,matches:t,diagnostics:i}}return null}const qe=`Snapshot refs expire when the UI changes. Run snapshot -i and retry with a fresh @ref.`;function Je(e){return e.some(e=>e.matches>1)?`Add more terms to disambiguate (e.g. role=button text="Sign in"), use an @ref from snapshot -i, or use find <text> --first/--last.`:`Selector text/label values match exactly (quote multi-word values: text="Sign in"). Run snapshot -i to see current elements and refs, or use find <text> for contains matching.`}function Ye(e,t,n){if(t.length===0)return`Selector did not match: ${e.raw}`;let r=t.map(e=>`${e.selector} -> ${e.matches}`).join(`, `);return n.unique??!0?`Selector did not resolve uniquely (${r})`:`Selector did not match (${r})`}function Xe(e,t,n,r){let i=0,a=null,o=[],s={best:null,bestVisible:!1,tie:!1},c,l=t=>(c??=v(e),S(t,e,c));for(let c of e)r&&!c.rect||q(c,t,n)&&(i+=1,a??=c,o.push(c),Ze(s,c,l));return{count:i,firstNode:a,disambiguated:s.tie?null:s.best,tiebreak:s.tie?null:Qe(o,s.best,l),candidates:o}}function Ze(e,t,n){if(!e.best){e.best=t;return}e.bestVisible||=n(e.best);let r=n(t);if(r!==e.bestVisible){r&&(e.best=t,e.bestVisible=!0,e.tie=!1);return}let i=X(t,e.best);i.result>0?(e.best=t,e.tie=!1):i.result===0&&(e.tie=!0)}function Qe(e,t,n){if(!t)return null;let r=null;for(let i of e)i!==t&&(!r||Y(i,r,n).result>0)&&(r=i);return r?Y(t,r,n).criterion:null}function Y(e,t,n){let r=n(e);return r===n(t)?X(e,t):{result:r?1:-1,criterion:`visible`}}function $e(e,t,n,r){let i=0;for(let a of e)r&&!a.rect||q(a,t,n)&&(i+=1);return i}function X(e,t){let n=e.depth??0,r=t.depth??0;if(n!==r)return{result:n>r?1:-1,criterion:`deepest`};let i=et(e),a=et(t);return i===a?{result:0,criterion:null}:{result:i<a?1:-1,criterion:`smallest-area`}}function et(e){return e.rect?e.rect.width*e.rect.height:1/0}function Z(e){let t=s(A(e.type??``)),n=a(e.identifier),r=o(e.label);return{...n===void 0?{}:{id:c(n,i)},role:c(t,i),...r===void 0?{}:{label:c(r,i)}}}function tt(e,t){return e.id===t.id&&e.role===t.role&&e.label===t.label}function nt(e,t){let n=0;for(let r of e)Z(r).id===t&&(n+=1);return n}function rt(e,t){if(e.id===void 0||nt(t,e.id)<=1)return e;let{role:n,label:r}=e;return{role:n,...r===void 0?{}:{label:r}}}function it(e,t){let n=0;for(let r of e)if(r.parentIndex===t.parentIndex){if(r.index===t.index)return n;n+=1}return 0}function at(e,t){return{documentOrder:e.index,sibling:it(t,e)}}function ot(e,t){return e.documentOrder===t.documentOrder&&e.sibling===t.sibling}const st=`replay_target_guard_mismatch`,ct=`wait_landmark_identity_mismatch`;function lt(e,t,n={}){let r=[],i=A(e.type??``),a=ut(e,n.nodes),o=$(e.label),s=$(e.value),c=$(L(e)),l=n.action===`fill`;a&&r.push(`id=${Q(a)}`),i&&o&&r.push(l?`role=${Q(i)} label=${Q(o)} editable=true`:`role=${Q(i)} label=${Q(o)}`),o&&r.push(l?`label=${Q(o)} editable=true`:`label=${Q(o)}`),s&&r.push(l?`value=${Q(s)} editable=true`:`value=${Q(s)}`),c&&c!==o&&c!==s&&r.push(l?`text=${Q(c)} editable=true`:`text=${Q(c)}`),i&&l&&!r.some(e=>e.includes(`editable=true`))&&r.push(`role=${Q(i)} editable=true`);let u=dt(r);return u.length===0&&i&&u.push(l?`role=${Q(i)} editable=true`:`role=${Q(i)}`),u.length===0&&R(e)&&u.push(`visible=true`),u}function ut(e,t){let n=$(e.identifier);if(!n||!t)return n;let r=Z(e).id;return r===void 0?n:nt(t,r)>1?null:n}function dt(e){return Array.from(new Set(e))}function Q(e){return JSON.stringify(e)}function $(e){return e&&e.trim()||null}export{v as $,Ne as A,O as B,He as C,H as D,Fe as E,N as F,ue as G,j as H,je as I,x as J,ce as K,ke as L,I as M,Me as N,z as O,Oe as P,ae as Q,we as R,ze as S,V as T,k as U,A as V,se as W,w as X,S as Y,oe as Z,q as _,rt as a,h as at,Ve as b,at as c,f as ct,qe as d,y as et,Ke as f,Je as g,We as h,ct as i,m as it,L as j,R as k,it as l,d as lt,Ge as m,$ as n,_ as nt,tt as o,p as ot,Ye as p,le as q,st as r,ne as rt,Z as s,u as st,lt as t,ie as tt,ot as u,K as v,W as w,Be as x,G as y,Te as z};
@@ -1 +1 @@
1
- import{S as e,_ as t,h as n,l as r,m as i,s as a,v as o}from"./sdk-contracts.js";import{j as s}from"./sdk-android-adb.js";import{H as c,R as l,W as u,et as d}from"./sdk-batch-runner.js";import{o as f}from"./recording-export-quality.js";import{q as p}from"./snapshot-diagnostics.js";import{c as m,h as ee,o as te,s as h}from"./sdk-device.js";import{C as ne,E as re,F as ie,S as ae,b as oe,it as se,j as ce,rt as le,x as ue}from"./sdk-selectors.js";import{_ as de,o as fe}from"./gesture-plan-types.js";import{u as pe}from"./android-input-method-overlays.js";import{i as me,n as he,t as ge}from"./runtime.js";import{r as _e}from"./app-lifecycle.js";import{C as g,c as ve,g as _,l as v,n as ye,s as y,t as be}from"./context.js";import{C as xe}from"./physical-device-control.js";import{a as b,l as Se}from"./runner-client.js";import{At as x,Ot as Ce,Rt as S,g as C,jt as w,kt as we,qt as T,u as E}from"./internal/daemon.js";import{a as Te}from"./apps.js";import{i as Ee}from"./session-target-evidence.js";function D(e,t){let n=me(t);if(!n)return e;if(e.ok){let t=O(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:O(r.hint,n)}}}}function O(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function k(e,t,n){let r=e.get(t),i=r?.device??await _(n??{});return r||await C(i),{session:r,device:i}}async function A(e,t,n){let r=!e&&h(t);try{return await n()}finally{r&&(await Se(t.id),await De(t))}}async function De(e){let t=xe();await Te(e,t).catch(n=>{s({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Oe(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function ke(e){let{session:t,sessionName:n,device:r,snapshot:i,appBundleId:a}=e;return t?{...t,snapshot:i,lastComparisonSafeSnapshot:i?.comparisonSafe===!0?i:t.lastComparisonSafeSnapshot}:{name:n,device:r,createdAt:Date.now(),appBundleId:a,snapshot:i,...i?.comparisonSafe===!0?{lastComparisonSafeSnapshot:i}:{},actions:[]}}const Ae=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function j(e,t){let n=je(t);return n.length===0?null:y(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function je(e){if(!e)return[];let t=[];for(let[n,r]of Ae)e[n]!==void 0&&t.push(r);return t}function Me(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:y(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function Ne(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function M(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function N(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:y(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function P(e,t){let n=M(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=N(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:y(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Pe(e){let t=M(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...He(e[2])};let n=Ve(e),r=P(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Fe(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=N(t);if(!n.ok)return{ok:!1,response:n.response};let r=f(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Be(e)},refGeneration:n.generation,text:r}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after ref`)}}let n=M(e);if(n){let t=e.slice(2).join(` `);return t?{ok:!0,target:{kind:`point`,x:n.x,y:n.y},text:t}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Ie(e);return!r||r.kind!==`selector`?{ok:!1,response:y(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)}:r.text.trim()?{ok:!0,target:{kind:`selector`,selector:r.target.selector},text:r.text}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after selector`)}}function Ie(e){try{return f(e)}catch{return null}}function Le(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:ze(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function Re(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function ze(e){return e?.startsWith(`@`)?e.slice(1):e}function Be(e){return e.length>=3&&e[1]?.trim()||``}function Ve(e){let t=e.at(-1);return e.length>1&&Ue(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function He(e){return e===void 0?{}:{durationMs:Number(e)}}function Ue(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function We(e,n){let r=await F(e);if(r)throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}async function F(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await _e(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!Je(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:qe(n)}}function Ge(e){return e.foregroundPackage===`com.google.android.permissioncontroller`?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ke(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function qe(e){return e===`com.google.android.permissioncontroller`?`Dismiss or allow the permission prompt, then retry the smoke assertion.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Je(e){return e===`com.android.settings`||e===`com.android.systemui`||e===`com.google.android.permissioncontroller`||e.includes(`launcher`)}function Ye(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function Xe(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:fe(e.node)}}function I(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=$e(e),i=r?.kind===`ref`?V(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:Qe(s)}}function L(e){let{target:t}=e;return{...t.kind===`ref`?{ref:V(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:fe(e.node)}}function R(e){let{node:t,preActionNodes:n,...r}=e;return r}function Ze(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function z(e){let{selectorChain:t,...n}=e;return n}function B(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=o.recordSession&&i?Ee(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:p(n),...s?{targetEvidence:s}:{}})}function Qe(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function $e(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function V(e){return e.startsWith(`@`)?e.slice(1):e}const et=[`application`,`window`,`tabbar`,`scrollbar`,`image`],tt=new Set([`tab bar`]);async function H(e,t){if(t.ok||!nt(t.error.message)||t.error.details?.captureStalled===!0)return t;let n=await rt(e).catch(()=>null);return n?y(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function nt(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function rt(e){let t=[...(await S({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(it),n=U(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=U(t.filter(e=>!st(e)),4,{includeIdentifiers:!1}),i=U(t.filter(ct),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function U(e,t,n){let r=new Set,i=[];for(let a of e){let e=ot(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function it(e,t){return W(e)-W(t)||at(e,t)}function W(e){let t=!!ot(e,{includeIdentifiers:!1});return(st(e)?2:0)+ +!t}function at(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function ot(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replace(/\s+/g,` `).slice(0,80):``}function st(e){let t=le(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return et.some(e=>t.includes(e))||tt.has(n)||n.endsWith(`.fill`)}function ct(e){return le(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e){let{session:t,selectorExpression:n}=e;if(!t||!h(t.device)||g(t.device)||t.postGestureStabilization)return null;let r=d(n);if(!r||r.selectors.length!==1)return null;let i=r.selectors[0];if(!i||i.terms.length!==1)return null;let a=i.terms[0];return!a||typeof a.value!=`string`||!lt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function lt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function ut(e,t={}){let n=o(e);if(n.code===`ELEMENT_NOT_FOUND`)return t.delegateSemanticFailures===!0||t.allowElementNotFound===!0;if(n.code===`AMBIGUOUS_MATCH`)return t.delegateSemanticFailures===!0;if(n.code===`ELEMENT_OFFSCREEN`)return t.delegateSemanticFailures!==!1;if(n.code!==`COMMAND_FAILED`)return!1;let r=n.message.toLowerCase();return r.includes(`fetch failed`)||r.includes(`timed out`)||r.includes(`timeout`)||r.includes(`runner did not accept connection`)||r.includes(`invalid runner response`)}function dt(e,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not create temporary files`)}}}function ft(e,t={}){return{artifacts:dt(e,t),policy:he()}}async function pt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:c}=e,l=ce(n),u=pe(n.rect);if(!u||h(t)&&l&&!se(n.type??``))return l;try{let e=await ye(t,`read`,[String(u.x),String(u.y)],void 0,{...c(r,i,a),surface:o}),d=e&&typeof e==`object`?e:void 0,f=typeof d?.text==`string`?d.text:``;return f.trim()?f:(s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),l)}catch(e){return s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`backend_read_failed`,nodeRef:n.ref,surface:o,platform:t.platform,error:e instanceof Error?e.message:String(e)}}),l}}function K(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Ct(c,e.req.flags?.out),d=_t({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=vt({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await mt({params:e,request:c}),m={snapshot:p};return Tt({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function mt(e){let{params:t,request:n}=e,r=await q(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&Et(r)?await ht({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&de(r.snapshotQuality)?await gt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function ht(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await q(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await q(t,n,r.query,!1)}}async function gt(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await q(t,n,r.query,!1)}catch{return i}}async function q(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await S({device:e.device,session:e.session,flags:{...t.flags,snapshotInteractiveOnly:r},outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects})).snapshot}function _t(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!T(a)&&!xt(a,o))return r}function vt(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&yt(t,r)&&bt(i,n)&&i.presentationKey===St(r))return i}function yt(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||T(e)||xt(e,t))}function bt(e,t){return t-e.createdAt<750}function xt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function St(e){return r(i(wt(e)))}function Ct(e,t){return JSON.stringify({presentationKey:St(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function wt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Tt(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||de(i.snapshotQuality)||(w(t,i),n.set(r,t))}function Et(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function Dt(e){return ge({backend:Ot(e),...ft(`selector commands`,{plural:!0}),sessions:Ce({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(w(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}})})}async function J(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:ve()};let r=n?.device??await _(e.req.flags??{});n||await C(r);let i=v(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:Dt({...e,session:n,device:r})}}function Ot(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=K({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:ee(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...kt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,c=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await s.capture({flags:i,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await pt({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>be(i??``,e,t,n))})}),findText:async(t,n)=>({found:await At(e,n)})}}function kt(e){let{interactiveOnly:t,scope:n,depth:r,raw:i,includeHiddenContentHints:a}=e??{},o={};return t!==void 0&&(o.snapshotInteractiveOnly=t),n!==void 0&&(o.snapshotScope=n),r!==void 0&&(o.snapshotDepth=r),i!==void 0&&(o.snapshotRaw=i),a!==void 0&&(o.snapshotIncludeHiddenContentHints=a),o}async function At(e,t){let n=await jt(e,t);if(n!==null)return n;let r=await Mt(e,t);return r===null?await Ft(e,t):r}async function jt(e,t){return!m(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Ft(e,t)}async function Mt(e,t){let n=Nt(e);return n?(await b(n.device,{command:`findText`,text:t,appBundleId:n.appBundleId},Pt(e,n)))?.found===!0:null}function Nt(e){return!te(e.device.platform)||g(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function Pt(e,t){return E({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Ft(e,t){return!!ie((await It(e)).nodes,t)}async function It(e){let{snapshot:t}=await K({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath,consumedSnapshot:e.consumedSnapshot}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotIncludeHiddenContentHints:!1},cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return t}async function Lt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=c(t.positionals??[],t.flags);if(!n.ok)return y(n.code,n.message);let r=n.parsed,i=r.action;if(!u(i))return null;let a=await J(e,{requireSession:!1,capability:`find`});return a.ok?D(await Q(async()=>{let n=await a.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:r.locator,query:r.query,action:i,timeoutMs:r.timeoutMs});B(e.sessionStore,e.sessionName,t,Ye(n,i));let o=Xe(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(we(t,[o.ref]),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),Y(e)):a.response}function Y(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Rt(e){let{req:t}=e;if(t.command!==`get`)return null;let n=ue(t.positionals?.[0]);if(!n.ok)return y(n.code,n.message);let r=n.format,i=Zt(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=j(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Ut(e,r,i.target.selector);if(t)return t}let o=await J(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?x({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return D(await Q(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});B(e.sessionStore,e.sessionName,t,I(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=L(n);return s?{...c,warning:s}:c}),Y(e))}async function zt(e){let{req:t}=e;if(t.command!==`is`)return null;let n=ae(t.positionals??[]);if(!n.ok)return y(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,expectedText:i}=n,a={selectorExpression:n.selectorExpression},o=t.internal?.replayTargetGuard,s=e.sessionStore.get(e.sessionName)?.recordSession===!0;if(!o&&!s){let t=await Wt(e,r,a.selectorExpression,i);if(t)return t}let c=await J(e,{requireSession:!0,capability:`is`});return c.ok?D(await $(e,await Q(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:a.selectorExpression,expectedText:i,expectedResolvedTarget:o}),s=Vt(n),l=R(n);return B(e.sessionStore,e.sessionName,t,l,s),z(l)}),`is ${r}`),Y(e)):c.response}async function Bt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=l(t.positionals??[]);if(!i)return y(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await k(r,n,t.flags);if(i.kind!==`sleep`){let e=v(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!a?.recordSession){let t=await Gt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,u;if(i.kind===`ref`){let e=N(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},u=x({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let d=async()=>{let i=Dt({...e,session:a,device:o}),l=await Q(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Qt(c,a,s)}),o=Vt(e);B(r,n,t,R(e),o,`landmark`);let l=Ze(e);return u?{...l,warning:u}:l});return await $(e,await H({req:t,logPath:e.logPath,session:a,device:o},l),`wait`)};return i.kind===`sleep`?await d():D(await A(a,o,d),Y(e))}function Vt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Ht(e,t,n){if(!e||e.recordSession)return null;let r=G({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Ut(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Ht(r,t,n);if(!r||!i)return null;let a=await X(e,r,i);if(Z(a))return a.response;if(!a)return null;let o=Jt(t,i.raw,a);return o?(B(e.sessionStore,e.sessionName,e.req,I(o,t)),{ok:!0,data:L(o)}):null}async function Wt(e,t,n,r){if(t===`hidden`)return null;let i=await Kt(e,n);if(Z(i))return i.response;if(!i?.result.found||!i.result.node)return null;let a=t===`exists`?{predicate:t,pass:!0,selector:i.selector.raw,matches:1,selectorChain:[i.selector.raw]}:Yt(t,r,i.selector.raw,i.session,i.result.node);return a?(B(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:z(a)}):null}async function Gt(e){let t=G({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await X(e,e.session,t);if(Z(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};B(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:z(i)};return await H({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Kt(e,t){let n=e.sessionStore.get(e.sessionName),r=G({session:n,selectorExpression:t});if(!n||!r)return null;let i=await X(e,n,r);return Z(i)?i:i?{session:n,selector:r,result:i}:null}async function qt(e,t,n){let r=await b(t.device,{command:`querySelector`,selectorKey:n.key,selectorValue:n.value,appBundleId:t.appBundleId},E({req:e.req,logPath:e.logPath,traceLogPath:t.trace?.outPath})),i=r.found===!0,a=Xt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function X(t,n,r){try{return await qt(t,n,r)}catch(t){return ut(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Z(e){return e!==null&&`kind`in e&&e.kind===`error`}function Jt(e,t,n){if(!n.found||!n.node)return null;let r={target:{kind:`selector`,selector:t},node:n.node,selectorChain:[t]};return e===`attrs`?{kind:`attrs`,...r}:typeof n.text==`string`?{kind:`text`,...r,text:n.text}:null}function Yt(e,t,n,r,i){let a=re({predicate:e,node:i,nodes:[i],expectedText:t,platform:r.device.platform});return{predicate:e,pass:a.pass,selector:n,...e===`text`?{text:a.actualText}:{},selectorChain:[n]}}function Xt(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function Zt(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=N(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=oe(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:y(n.code,n.message)}}function Qt(e,n,r){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...r?{recordedLandmark:r}:{}};if(e.kind===`ref`){if(!n?.snapshot)throw new t(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:e.rawRef,timeoutMs:e.timeoutMs}}if(e.kind===`stable`)return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};let i=ne(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return y(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await F(r)}catch{return t}return i?y(t.error.code,`${n} failed because ${Ge(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{A as C,k as S,Ne as _,K as a,ke as b,G as c,Re as d,Le as f,ze as g,P as h,Bt as i,We as l,Pe as m,Rt as n,ft as o,Fe as p,zt as r,ut as s,Lt as t,Ke as u,j as v,D as w,Oe as x,Me as y};
1
+ import{S as e,_ as t,h as n,l as r,m as i,s as a,v as o}from"./sdk-contracts.js";import{M as s,Y as c,a as l}from"./viewport-dimension.js";import{M as u,O as d,P as f,W as p}from"./sdk-batch-runner.js";import{N as m}from"./screenshot-result.js";import{c as ee,h as te,o as ne,s as h}from"./sdk-device.js";import{A as re,C as ie,E as ae,H as oe,P as se,S as ce,V as le,b as ue,x as de}from"./sdk-selectors.js";import{S as g}from"./device.js";import{i as fe,n as pe,t as me}from"./runtime.js";import{j as _}from"./sdk-android-adb.js";import{r as he}from"./app-lifecycle.js";import{h as v}from"./ime-lifecycle.js";import{j as ge}from"./runner-disposal.js";import{S as y,c as _e,g as ve,l as b,n as ye,s as x,t as be}from"./context.js";import{C as xe}from"./physical-device-control.js";import{a as S,l as Se}from"./runner-client.js";import{Ht as Ce,Qt as C,Ut as w,Vt as we,Wt as T,an as Te,g as Ee,u as De}from"./internal/daemon.js";import{a as Oe}from"./apps.js";import{i as ke}from"./session-target-evidence.js";function E(e,t){let n=fe(t);if(!n)return e;if(e.ok){let t=Ae(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:Ae(r.hint,n)}}}}function Ae(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function je(e,t,n){let r=e.get(t),i=r?.device??await ve(n??{});return r||await Ee(i),{session:r,device:i}}async function Me(e,t,n){let r=!e&&h(t);try{return await n()}finally{r&&(await Se(t.id),await Ne(t))}}async function Ne(e){let t=xe();await Oe(e,t).catch(n=>{_({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Pe(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function Fe(e){let{session:t,sessionName:n,device:r,snapshot:i,appBundleId:a}=e;return t?{...t,snapshot:i,lastComparisonSafeSnapshot:i?.comparisonSafe===!0?i:t.lastComparisonSafeSnapshot}:{name:n,device:r,createdAt:Date.now(),appBundleId:a,snapshot:i,...i?.comparisonSafe===!0?{lastComparisonSafeSnapshot:i}:{},actions:[]}}const Ie=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function D(e,t){let n=Le(t);return n.length===0?null:x(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function Le(e){if(!e)return[];let t=[];for(let[n,r]of Ie)e[n]!==void 0&&t.push(r);return t}function Re(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:x(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function ze(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function O(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function k(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:x(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function A(e,t){let n=O(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=k(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:x(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Be(e){let t=O(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...qe(e[2])};let n=Ke(e),r=A(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Ve(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=k(t);if(!n.ok)return{ok:!1,response:n.response};let r=l(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Ge(e)},refGeneration:n.generation,text:r}:{ok:!1,response:x(`INVALID_ARGS`,`fill requires text after ref`)}}let n=O(e);if(n){let t=e.slice(2).join(` `);return t?{ok:!0,target:{kind:`point`,x:n.x,y:n.y},text:t}:{ok:!1,response:x(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=He(e);return!r||r.kind!==`selector`?{ok:!1,response:x(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)}:r.text.trim()?{ok:!0,target:{kind:`selector`,selector:r.target.selector},text:r.text}:{ok:!1,response:x(`INVALID_ARGS`,`fill requires text after selector`)}}function He(e){try{return l(e)}catch{return null}}function Ue(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:j(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function We(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function j(e){return e?.startsWith(`@`)?e.slice(1):e}function Ge(e){return e.length>=3&&e[1]?.trim()||``}function Ke(e){let t=e.at(-1);return e.length>1&&Je(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function qe(e){return e===void 0?{}:{durationMs:Number(e)}}function Je(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function Ye(e,n){let r=await M(e);if(r){if(v(r.foregroundPackage))return`press ${n} opened an Android permission dialog (${r.foregroundPackage}) over ${r.expectedPackage}. ${r.hint}`;throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}}async function M(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await he(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!$e(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:Qe(n)}}function Xe(e){return v(e.foregroundPackage)?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ze(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function Qe(e){return v(e)?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function $e(e){return e===`com.android.settings`||e===`com.android.systemui`||v(e)||e.includes(`launcher`)}function et(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function tt(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:g(e.node)}}function N(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=it(e),i=r?.kind===`ref`?R(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:rt(s)}}function P(e){let{target:t}=e;return{...t.kind===`ref`?{ref:R(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:g(e.node)}}function F(e){let{node:t,preActionNodes:n,...r}=e;return r}function nt(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function I(e){let{selectorChain:t,...n}=e;return n}function L(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=o.recordSession&&i?ke(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:m(n),...s?{targetEvidence:s}:{}})}function rt(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function it(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function R(e){return e.startsWith(`@`)?e.slice(1):e}const at=[`application`,`window`,`tabbar`,`scrollbar`,`image`],ot=new Set([`tab bar`]);async function z(e,t){if(t.ok||!st(t.error.message)||t.error.details?.captureStalled===!0||t.error.details?.captureTruncated===!0)return t;let n=await ct(e).catch(()=>null);return n?x(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function st(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function ct(e){let t=[...(await C({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(lt),n=B(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=B(t.filter(e=>!dt(e)),4,{includeIdentifiers:!1}),i=B(t.filter(ft),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function B(e,t,n){let r=new Set,i=[];for(let a of e){let e=H(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function lt(e,t){return V(e)-V(t)||ut(e,t)}function V(e){let t=!!H(e,{includeIdentifiers:!1});return(dt(e)?2:0)+ +!t}function ut(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function H(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replace(/\s+/g,` `).slice(0,80):``}function dt(e){let t=le(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return at.some(e=>t.includes(e))||ot.has(n)||n.endsWith(`.fill`)}function ft(e){return le(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function U(e,t){return!(!e||!h(e.device)||y(e.device)||t.skipPendingPostGestureStabilization&&e.postGestureStabilization)}function W(e){let{session:t,selectorExpression:n}=e;if(!U(t,{skipPendingPostGestureStabilization:!0}))return null;let r=p(n);if(!r||r.selectors.length!==1)return null;let i=r.selectors[0];if(!i||i.terms.length!==1)return null;let a=i.terms[0];return!a||typeof a.value!=`string`||!pt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function pt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function mt(e){let t=e.identifier?.trim();if(t)return{key:`id`,value:t};let n=e.label?.trim();return n?{key:`label`,value:n}:null}function G(e,t={}){let n=o(e);if(n.code===`ELEMENT_NOT_FOUND`)return t.delegateSemanticFailures===!0||t.allowElementNotFound===!0;if(n.code===`AMBIGUOUS_MATCH`)return t.delegateSemanticFailures===!0;if(n.code===`ELEMENT_OFFSCREEN`)return t.delegateSemanticFailures!==!1;if(n.code!==`COMMAND_FAILED`)return!1;let r=n.message.toLowerCase();return r.includes(`fetch failed`)||r.includes(`timed out`)||r.includes(`timeout`)||r.includes(`runner did not accept connection`)||r.includes(`invalid runner response`)}function ht(e,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not create temporary files`)}}}function K(e,t={}){return{artifacts:ht(e,t),policy:pe()}}async function gt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,l=re(n),u=c(n.rect);if(!u||h(t)&&l&&!oe(n.type??``))return l;try{let e=await ye(t,`read`,[String(u.x),String(u.y)],void 0,{...s(r,i,a),surface:o}),c=e&&typeof e==`object`?e:void 0,d=typeof c?.text==`string`?c.text:``;return d.trim()?d:(_({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),l)}catch(e){return _({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`backend_read_failed`,nodeRef:n.ref,surface:o,platform:t.platform,error:e instanceof Error?e.message:String(e)}}),l}}function q(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Et(c,e.req.flags?.out),d=bt({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=xt({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await _t({params:e,request:c});c.signal?.throwIfAborted();let m={snapshot:p};return Ot({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function _t(e){let{params:t,request:n}=e,r=await J(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&kt(r)?await vt({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&s(r.snapshotQuality)?await yt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function vt(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await J(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await J(t,n,r.query,!1)}}async function yt(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await J(t,n,r.query,!1)}catch{return i}}async function J(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await C({device:e.device,session:e.session,flags:{...t.flags,snapshotInteractiveOnly:r},outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects,signal:t.signal})).snapshot}function bt(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!Te(a)&&!wt(a,o))return r}function xt(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&St(t,r)&&Ct(i,n)&&i.presentationKey===Tt(r))return i}function St(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||Te(e)||wt(e,t))}function Ct(e,t){return t-e.createdAt<750}function wt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function Tt(e){return r(i(Dt(e)))}function Et(e,t){return JSON.stringify({presentationKey:Tt(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function Dt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Ot(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||s(i.snapshotQuality)||(T(t,i),n.set(r,t))}function kt(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function At(e){return me({backend:jt(e),...K(`selector commands`,{plural:!0}),sessions:we({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(T(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}}),signal:e.signal??ge(e.req.meta?.requestId)})}async function Y(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:_e()};let r=n?.device??await ve(e.req.flags??{});n||await Ee(r);let i=b(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:At({...e,session:n,device:r})}}function jt(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=q({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:te(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...Mt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,c=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await s.capture({flags:i,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await gt({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>be(i??``,e,t,n))})}),findText:async(t,n)=>({found:await Nt(e,n,t.signal)})}}function Mt(e){let{interactiveOnly:t,scope:n,depth:r,raw:i,includeHiddenContentHints:a}=e??{},o={};return t!==void 0&&(o.snapshotInteractiveOnly=t),n!==void 0&&(o.snapshotScope=n),r!==void 0&&(o.snapshotDepth=r),i!==void 0&&(o.snapshotRaw=i),a!==void 0&&(o.snapshotIncludeHiddenContentHints=a),o}async function Nt(e,t,n){let r=await Pt(e,t,n);return r===null?await Ft(e,t,n)===!0?!0:await Rt(e,t,n):r}async function Pt(e,t,n){return!ee(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Rt(e,t,n)}async function Ft(e,t,n){let r=It(e);return r?(await S(r.device,{command:`findText`,text:t,appBundleId:r.appBundleId},{...Lt(e,r),signal:n}))?.found===!0:null}function It(e){return!ne(e.device.platform)||y(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function Lt(e,t){return De({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Rt(e,t,n){return!!se((await zt(e,n)).nodes,t)}async function zt(e,t){let{snapshot:n}=await q({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath,consumedSnapshot:e.consumedSnapshot}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotIncludeHiddenContentHints:!1},signal:t,cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return n}async function Bt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=u(t.positionals??[],t.flags);if(!n.ok)return x(n.code,n.message);let r=n.parsed,i=r.action;if(!f(i))return null;let a=await Y(e,{requireSession:!1,capability:`find`});return a.ok?E(await $(async()=>{let n=await a.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:r.locator,query:r.query,action:i,timeoutMs:r.timeoutMs});L(e.sessionStore,e.sessionName,t,et(n,i));let o=tt(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(Ce(t,[o.ref]),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),X(e)):a.response}function X(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Vt(e){let{req:t}=e;if(t.command!==`get`)return null;let n=de(t.positionals?.[0]);if(!n.ok)return x(n.code,n.message);let r=n.format,i=en(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=D(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Kt(e,r,i.target.selector);if(t)return t}let o=await Y(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?w({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return E(await $(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});L(e.sessionStore,e.sessionName,t,N(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=P(n);return s?{...c,warning:s}:c}),X(e))}async function Ht(e){let{req:t}=e;if(t.command!==`is`)return null;let n=ce(t.positionals??[]);if(!n.ok)return x(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,expectedText:i}=n,a={selectorExpression:n.selectorExpression},o=t.internal?.replayTargetGuard,s=e.sessionStore.get(e.sessionName)?.recordSession===!0;if(!o&&!s){let t=await qt(e,r,a.selectorExpression,i);if(t)return t}let c=await Y(e,{requireSession:!0,capability:`is`});return c.ok?E(await nn(e,await $(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:a.selectorExpression,expectedText:i,expectedResolvedTarget:o}),s=Wt(n),l=F(n);return L(e.sessionStore,e.sessionName,t,l,s),I(l)}),`is ${r}`),X(e)):c.response}async function Ut(e){let{req:t,sessionName:n,sessionStore:r}=e,i=d(t.positionals??[]);if(!i)return x(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await je(r,n,t.flags);if(i.kind!==`sleep`){let e=b(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!a?.recordSession){let t=await Jt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,l;if(i.kind===`ref`){let e=k(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},l=w({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let u=async()=>{let i=At({...e,session:a,device:o}),u=await $(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:tn(c,a,s)}),o=Wt(e);L(r,n,t,F(e),o,`landmark`);let u=nt(e);return l?{...u,warning:l}:u});return await nn(e,await z({req:t,logPath:e.logPath,session:a,device:o},u),`wait`)};return i.kind===`sleep`?await u():E(await Me(a,o,u),X(e))}function Wt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Gt(e,t,n){if(!e||e.recordSession)return null;let r=W({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Kt(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Gt(r,t,n);if(!r||!i)return null;let a=await Z(e,r,i);if(Q(a))return a.response;if(!a)return null;let o=Zt(t,i.raw,a);return o?(L(e.sessionStore,e.sessionName,e.req,N(o,t)),{ok:!0,data:P(o)}):null}async function qt(e,t,n,r){if(t===`hidden`)return null;let i=await Yt(e,n);if(Q(i))return i.response;if(!i?.result.found||!i.result.node)return null;let a=t===`exists`?{predicate:t,pass:!0,selector:i.selector.raw,matches:1,selectorChain:[i.selector.raw]}:Qt(t,r,i.selector.raw,i.session,i.result.node);return a?(L(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:I(a)}):null}async function Jt(e){let t=W({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await Z(e,e.session,t);if(Q(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};L(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:I(i)};return await z({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Yt(e,t){let n=e.sessionStore.get(e.sessionName),r=W({session:n,selectorExpression:t});if(!n||!r)return null;let i=await Z(e,n,r);return Q(i)?i:i?{session:n,selector:r,result:i}:null}async function Xt(e,t,n){let r=await S(e.device,{command:`querySelector`,selectorKey:t.key,selectorValue:t.value,appBundleId:e.appBundleId},n),i=r.found===!0,a=$t(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function Z(t,n,r){try{return await Xt(n,r,De({req:t.req,logPath:t.logPath,traceLogPath:n.trace?.outPath}))}catch(t){return G(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Q(e){return e!==null&&`kind`in e&&e.kind===`error`}function Zt(e,t,n){if(!n.found||!n.node)return null;let r={target:{kind:`selector`,selector:t},node:n.node,selectorChain:[t]};return e===`attrs`?{kind:`attrs`,...r}:typeof n.text==`string`?{kind:`text`,...r,text:n.text}:null}function Qt(e,t,n,r,i){let a=ae({predicate:e,node:i,nodes:[i],expectedText:t,platform:r.device.platform});return{predicate:e,pass:a.pass,selector:n,...e===`text`?{text:a.actualText}:{},selectorChain:[n]}}function $t(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function en(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=k(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=ue(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:x(n.code,n.message)}}function tn(e,n,r){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...r?{recordedLandmark:r}:{}};if(e.kind===`ref`){if(!n?.snapshot)throw new t(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:e.rawRef,timeoutMs:e.timeoutMs}}if(e.kind===`stable`)return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};let i=ie(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function $(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return x(t.code,t.message,t.details)}}async function nn(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await M(r)}catch{return t}return i?x(t.error.code,`${n} failed because ${Xe(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{Fe as C,E as D,Me as E,Re as S,je as T,Be as _,Xt as a,ze as b,mt as c,W as d,Ye as f,Ve as g,Ue as h,Ut as i,G as l,We as m,Vt as n,q as o,Ze as p,Ht as r,K as s,Bt as t,U as u,A as v,Pe as w,D as x,j as y};
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{l as t,r as n,wn as r}from"./recording-export-quality.js";import{G as i,Q as a,R as o,U as s,V as c,W as l}from"./snapshot-diagnostics.js";import{i as u,m as d,n as f}from"./sdk-device.js";import{_t as p}from"./sdk-selectors.js";import{n as ee,o as m}from"./host-process.js";import h from"node:crypto";import g from"node:fs";import te from"node:os";import _ from"node:path";function v(e,t){let n=h.createHash(`sha256`).update(e).digest(),r=h.createHash(`sha256`).update(t).digest();return h.timingSafeEqual(n,r)}const y={browserStack:`browserstack`,awsDeviceFarm:`aws-device-farm`},b=new Set(Object.values(y));function x(e){return e!==void 0&&b.has(e)}function S(){return{pid:process.pid,startTime:m(process.pid)}}function C(e,t){return e.pid===t.pid&&e.startTime===t.startTime}function w(e){let{owner:t,stateDir:n}=e;if(!ee(t.pid)||t.startTime&&m(t.pid)!==t.startTime)return`owner-process-dead`;if(!n)return`live`;try{return g.statSync(n),`live`}catch(e){let t=e?.code;return t===`ENOENT`||t===`ENOTDIR`?`owner-state-dir-gone`:`unknown`}}function T(){let e=process.env.AGENT_DEVICE_CLAIMS_DIR?.trim();return e?_.resolve(e):_.join(te.homedir(),`.agent-device`,`device-claims`)}function ne(e){let t=h.createHash(`sha256`).update(e).digest(`hex`);return _.join(T(),`${t}.json`)}function re(e){let t=T(),n=ie(t);return`claims`in n?n.claims:n.entries.filter(e=>e.isFile()&&e.name.endsWith(`.json`)).map(e=>A(_.join(t,e.name))).filter(e=>e!==null).filter(t=>E(t.claim,e))}function ie(e){try{return{entries:g.readdirSync(e,{withFileTypes:!0})}}catch(t){let n=t.code;return n===`ENOENT`||n===`ENOTDIR`?{claims:[]}:{claims:[{fileName:_.basename(e),classification:`unknown`,error:String(t)}]}}}function E(e,t){return e?[D(e,t.udid??t.serial),O(e,t.device),k(e,t.platform)].every(Boolean):!0}function D(e,t){return!t||e.device.id===t}function O(e,t){return!t||e.device.name===t||e.device.id===t}function k(e,t){return d({...u(e.device.platform),appleOs:e.device.appleOs},t)}function A(e){let t=_.basename(e);try{return j(t,g.readFileSync(e,`utf8`))}catch(e){let n=e.code;return n===`ENOENT`||n===`ENOTDIR`?null:{fileName:t,classification:`unknown`,error:String(e)}}}function j(e,t){try{let n=M(JSON.parse(t));return n?{fileName:e,deviceKey:n.deviceKey,claim:n,classification:w({owner:{pid:n.ownerPid,startTime:n.ownerStartTime},stateDir:n.stateDir})}:{fileName:e,classification:`inconsistent`}}catch(t){return{fileName:e,classification:`inconsistent`,error:String(t)}}}function M(e){if(!N(e))return null;let t=e;return P(t)?t:null}function N(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function P(e){return e.schemaVersion===1&&F(e.device)&&[e.deviceKey,e.session,e.workspace,e.stateDir,e.ownerToken].every(I)&&L(e.ownerPid)&&R(e.createdAtMs)&&R(e.updatedAtMs)}function F(e){if(!N(e))return!1;let t=e;return[t.id,t.name,t.platform,t.kind].every(I)}function I(e){return typeof e==`string`&&e.length>0}function L(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function R(e){return typeof e==`number`&&Number.isFinite(e)}function z(e,t){let n={providerReleases:{released:t.released.map(U),pending:t.pending.map(U)}},r=H(e),i=`${r}.${process.pid}.${Date.now()}.tmp`;try{g.writeFileSync(i,`${JSON.stringify(n)}\n`,{mode:384}),g.renameSync(i,r),g.chmodSync(r,384)}catch{try{g.rmSync(i,{force:!0})}catch{}}}function B(e){try{let t=JSON.parse(g.readFileSync(H(e),`utf8`));return W(t)?t:null}catch{return null}}function V(e){try{g.rmSync(H(e),{force:!0})}catch{}}function H(e){return _.join(e,`daemon-shutdown.json`)}function U(e){return{leaseId:e.leaseId,...e.leaseProvider?{provider:e.leaseProvider}:{}}}function W(e){if(!e||typeof e!=`object`)return!1;let t=e.providerReleases;if(!t||typeof t!=`object`)return!1;let n=t;return Array.isArray(n.released)&&Array.isArray(n.pending)&&n.released.every(G)&&n.pending.every(G)}function G(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.leaseId==`string`&&t.leaseId.trim().length>0&&(t.provider===void 0||typeof t.provider==`string`)}const ae=new Set(f.filter(e=>e!==`web`)),K=new Set([`mobile`,`tv`,`desktop`]);function q(n){let r=[],i=[],a=n.split(/\r?\n/),o=!1,s,c=(t,n,r)=>{throw new e(`INVALID_ARGS`,`target-v1 annotation on line ${t.line} must be immediately followed by its action line (line ${n+1} ${r}).`)};for(let[n,l]of a.entries()){let a=l.trim();if(a.length===0){s&&c(s,n,`is blank`);continue}if(a.startsWith(`#`)){let e=p(a);if(e.kind===`v1`){s&&c(s,n,`is another target-v1 annotation`),s={evidence:e.evidence,line:n+1};continue}s&&c(s,n,`is a comment`);continue}if(Y(a)){if(s&&c(s,n,`is an env directive`),o)throw new e(`INVALID_ARGS`,`env directives must precede all actions (line ${n+1}).`);continue}let u=Z(l);if(!u){s&&c(s,n,`did not parse as an action`);continue}let d=t(u.command,u.positionals??[],`line ${n+1}`);if(d)throw new e(`INVALID_ARGS`,d);s&&=(u.targetEvidence=s.evidence,void 0),r.push(u),i.push(n+1),o=!0}if(s)throw new e(`INVALID_ARGS`,`target-v1 annotation on line ${s.line} must be immediately followed by its action line (end of script reached).`);return{actions:r,actionLines:i}}function J(e){let t=e.split(/\r?\n/),n={};for(let[e,r]of t.entries()){let t=r.trim();if(t.length===0||t.startsWith(`#`))continue;if(Y(t)){ce(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&ae.has(e)&&X(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&K.has(e)&&X(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&X(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&X(n,`retries`,Math.floor(e))}}return n}function Y(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function oe(t,n){let r=t.slice(3).replace(/^[\s]+/,``),i=r.indexOf(`=`);if(i<=0)throw new e(`INVALID_ARGS`,`Invalid env directive on line ${n}: expected "env KEY=VALUE".`);let o=r.slice(0,i);if(!a.test(o))throw new e(`INVALID_ARGS`,`Invalid env key "${o}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(o.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid env key "${o}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${o} to avoid the AD_ prefix.`);return{key:o,value:se(r.slice(i+1),n)}}function se(t,n){if(t.length===0)return``;if(t.startsWith(`"`))try{let e=JSON.parse(t);if(typeof e!=`string`)throw Error(`not a string literal`);return e}catch{throw new e(`INVALID_ARGS`,`Invalid quoted env value on line ${n}.`)}return t}function ce(t,n,r){let{key:i,value:a}=oe(n,r),o=t.env??{};if(Object.prototype.hasOwnProperty.call(o,i))throw new e(`INVALID_ARGS`,`Duplicate env directive "${i}" on line ${r}.`);o[i]=a,t.env=o}function X(t,n,r){let i=t[n];if(i!==void 0)throw new e(`INVALID_ARGS`,i===r?`Duplicate replay test metadata "${n}" in context header.`:`Conflicting replay test metadata "${n}" in context header: ${String(i)} vs ${String(r)}.`);t[n]=r}function Z(e){let t=e.trim();if(t.length===0||t.startsWith(`#`))return null;let[a,...u]=ue(t);if(a===void 0||a===`context`)return null;let d={ts:Date.now(),command:a,positionals:[],flags:{}};if(a===`snapshot`){d.positionals=[];for(let e=0;e<u.length;e+=1){let t=u[e];if(t===`-i`){d.flags.snapshotInteractiveOnly=!0;continue}if(t!==`-c`){if(t===`--raw`){d.flags.snapshotRaw=!0;continue}if(t===`--force-full`){d.flags.snapshotForceFull=!0;continue}if((t===`-d`||t===`--depth`)&&e+1<u.length){let t=Number(u[e+1]);Number.isFinite(t)&&t>=0&&(d.flags.snapshotDepth=Math.floor(t)),e+=1;continue}if((t===`-s`||t===`--scope`)&&e+1<u.length){d.flags.snapshotScope=u[e+1],e+=1;continue}if(t===`--backend`&&e+1<u.length){e+=1;continue}}}return d}if(a===`open`){let e=o(u);return d.positionals=e.positionals,Object.assign(d.flags,e.flags),d.runtime=e.runtime,d}if(a===`runtime`){let e=s(u);return d.positionals=e.positionals,Object.assign(d.flags,e.flags),d}if(c(a)){let e=l(a,u);Object.assign(d.flags,e.flags);let t=e.positionals[0];if(t===void 0)return d;if(t.startsWith(`@`))return d.positionals=[i(t)],e.positionals[1]&&(d.result={refLabel:e.positionals[1]}),d;let n=e.positionals[0],r=e.positionals[1];return Q(n)&&Q(r)&&e.positionals.length>=2?(d.positionals=[n,r],d):(d.positionals=[e.positionals.join(` `)],d)}if(a===`fill`){let e=l(a,u);if(Object.assign(d.flags,e.flags),!le(e.positionals))return d.positionals=e.positionals,d;let[t,n,...r]=e.positionals;if(Q(t)&&Q(n))return d.positionals=[t,n,r.join(` `)],d;let[o,s,...c]=e.positionals;if(o.startsWith(`@`)){let e=i(o);return c.length>0?(d.positionals=[e,c.join(` `)],d.result={refLabel:s},d):(d.positionals=[e,s],d)}return d.positionals=[o,[s,...c].join(` `)],d}if(a===`get`){let e=u[0],t=u[1];return e===void 0||t===void 0?(d.positionals=u,d):t.startsWith(`@`)?(d.positionals=[e,i(t)],u[2]&&(d.result={refLabel:u[2]}),d):(d.positionals=[e,u.slice(1).join(` `)],d)}if(a===`swipe`||a===`type`||a===`gesture`){let e=l(a,u);return Object.assign(d.flags,e.flags),d.positionals=e.positionals,d}if(a===`record`){let e=[];for(let t=0;t<u.length;t+=1){let r=u[t];if(r===`--hide-touches`){d.flags.hideTouches=!0;continue}if(r===`--fps`&&t+1<u.length){let e=Number(u[t+1]);Number.isFinite(e)&&(d.flags.fps=Math.floor(e)),t+=1;continue}if(r===`--quality`&&t+1<u.length){let e=u[t+1],r=n(e);r!==void 0&&(d.flags.quality=r),t+=1;continue}if(r===`--max-size`&&t+1<u.length){let e=Number(u[t+1]);Number.isFinite(e)&&(d.flags.screenshotMaxSize=Math.floor(e)),t+=1;continue}e.push(r)}return d.positionals=e,d}if(a===`screenshot`){let e=[];for(let t=0;t<u.length;t+=1){let n=u[t],i=r({args:u,index:t,flags:d.flags});if(i.handled){t=i.nextIndex;continue}e.push(n)}return d.positionals=e,d}return d.positionals=a===`wait`||a===`longpress`?u.map(e=>i(e)):u,d}function le(e){return e.length>=2}function Q(e){return e?!Number.isNaN(Number(e)):!1}function ue(e){let t=[],n=0;for(;n<e.length&&(n=de(e,n),!(n>=e.length));){let r=e[n]===`"`?fe(e,n):pe(e,n);t.push(r.value),n=r.nextCursor}return t}function de(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function fe(t,n){let r=n+1,i=!1,a=r;for(;a<t.length;a+=1){let e=t.charAt(a);if(e===`"`&&!i)break;if(i){i=!1;continue}i=e===`\\`}if(a>=t.length)throw new e(`INVALID_ARGS`,`Invalid replay script line: ${t}`);let o=t.slice(n,a+1),s;try{s=JSON.parse(o)}catch{throw new e(`INVALID_ARGS`,`Invalid quoted value ${o} in replay script line: ${t}`,{hint:`Quoted replay values are JSON strings: escape backslashes, quotes, tabs, and newlines (\\\\, \\", \\t, \\n).`})}return{value:s,nextCursor:a+1}}function pe(e,t){let n=t;for(;n<e.length&&!/\s/.test(e.charAt(n));)n+=1;return{value:e.slice(t,n),nextCursor:n}}const $=[`id`,`text`,`enabled`,`selected`],me=[...$,`label`],he=[`id`,`text`,`label`],ge=[`enabled`,`selected`];export{x as _,q as a,B as c,re as d,ne as f,y as g,S as h,he as i,z as l,C as m,ge as n,J as o,w as p,me as r,V as s,$ as t,A as u,v};
1
+ import{_ as e}from"./sdk-contracts.js";import{V as t}from"./screenshot-geometry.js";import{h as n,i as r,m as i}from"./sdk-device.js";import{a}from"./sdk-remote-config.js";import{i as o,r as s}from"./device.js";import{v as c}from"./sdk-android-adb.js";import{n as l}from"./version.js";import{n as u,o as d}from"./host-process.js";import{r as ee}from"./entities.js";import{t as te}from"./parser.js";import f from"node:path";import p from"node:crypto";import m from"node:fs";import ne from"node:os";import h from"node:fs/promises";import{setTimeout as g}from"node:timers/promises";function re(e,t){let n=p.createHash(`sha256`).update(e).digest(),r=p.createHash(`sha256`).update(t).digest();return p.timingSafeEqual(n,r)}const _={support:`supported`},v={support:`unsupported`},ie={lease:_,inventory:{support:`partial`,note:`Inventory exposes only the leased cloud device, not the provider catalog.`},install:{support:`partial`,note:`Requires provider-specific upload or a path visible to the remote Appium server.`},open:_,close:_,snapshot:{support:`partial`,note:`Uses Appium page source XML, not agent-device native snapshot backends.`},screenshot:_,tap:_,doubleTap:_,longPress:_,swipe:_,scroll:{support:`partial`,note:`Implemented as viewport-relative W3C pointer gestures.`},fill:_,type:_,back:_,home:{support:`partial`,note:`Uses provider/Appium mobile pressButton support where available.`},orientation:{support:`partial`,note:`Uses the WebDriver rotation/orientation endpoints; four-way rotation collapses to portrait/landscape on drivers that only accept the two-way endpoint. Rotates the current display, so an activity that does not pin its orientation may need rotating again once it is foreground.`},appSwitcher:{support:`partial`,note:`Uses provider/Appium mobile pressButton support where available.`},tvRemote:v,"clipboard.read":{support:`partial`,note:`Uses provider/Appium clipboard extension support where available.`},"clipboard.write":{support:`partial`,note:`Uses provider/Appium clipboard extension support where available.`},settings:v,pinch:v,rotateGesture:v,transformGesture:v,logs:v,record:v,artifacts:v,portReverse:v,nativeSnapshotBackend:{support:`unsupported`,note:`Cloud WebDriver cannot upload or run agent-device native runner/helper backends.`}};function ae(e){return{provider:e.provider,platform:e.platform,snapshotBackend:e.platform===`ios`?`xctest`:`android`,snapshotSource:`appium-page-source`,operations:se(ie,e.overrides)}}function oe(e,t){return e.operations[t].support!==`unsupported`}function y(e,t){let n=e.operations[t],r=n.note?` ${n.note}`:``;return`${e.provider} WebDriver runtime does not support ${t}.${r}`}function se(e,t){let n={...e};for(let[r,i]of Object.entries(t??{}))n[r]=typeof i==`string`?{...e[r],support:i}:{...e[r],...i};return n}function b(e){return{provider:e.provider,providerSessionId:e.providerSessionId,status:e.artifacts.length>0?`ready`:`pending`,cloudArtifacts:e.artifacts,...e.artifacts.length>0?{}:{message:e.pendingMessage}}}function ce(e){return{provider:e.provider,providerSessionId:e.providerSessionId,status:`unavailable`,cloudArtifacts:[],message:e.error instanceof Error?e.error.message:String(e.error)}}function le(e,t){let n=e?.bundleId??t?.appIdentifierHint,r=e?.packageName??t?.packageNameHint;return{bundleId:n,packageName:r,appName:e?.appName,launchTarget:de(e?.launchTarget,n,r)}}function ue(e){return e===`ios`?`xctest`:`android`}function de(...e){return e.find(e=>e!==void 0)}function x(e){return{"x-agent-device-client":`agent-device-cli`,"x-agent-device-version":e}}function fe(e,t){return typeof e==`function`?e(t):e}function S(e){return`Basic ${Buffer.from(`${e.username}:${e.accessKey}`).toString(`base64`)}`}function pe(e){let t=0;for(;t<e.length&&e.charCodeAt(t)===47;)t+=1;return t===0?e:e.slice(t)}function me(e){let t=e.length-1;for(;t>=0&&e.charCodeAt(t)===47;)--t;return t===e.length-1?e:e.slice(0,t+1)}function he(e){if(e.pathname.endsWith(`/`))return e;let t=new URL(e);return t.pathname=`${t.pathname}/`,t}var ge=class{endpoint;headers;requestPolicy;sessionId;constructor(e){this.endpoint=he(new URL(e.endpoint)),this.headers={...x(e.clientVersion),...e.auth?{Authorization:S(e.auth)}:{},...e.headers},this.requestPolicy={timeoutMs:e.requestPolicy?.timeoutMs??3e4,retryAttempts:e.requestPolicy?.retryAttempts??1,retryDelayMs:e.requestPolicy?.retryDelayMs??250}}async createSession(e){let t=ye(await this.requestValue(`POST`,`/session`,{capabilities:ve(e)}));return this.sessionId=t.sessionId,t}async deleteSession(){let e=this.requireSessionId();await this.requestValue(`DELETE`,`/session/${e}`),this.sessionId=void 0}async installApp(e){await this.sessionRequest(`POST`,`/appium/device/install_app`,{appPath:e})}async activateApp(e){try{await this.sessionRequest(`POST`,`/appium/device/activate_app`,{appId:e})}catch{await this.executeScript(`mobile: activateApp`,[{appId:e,bundleId:e}])}}async terminateApp(e){try{await this.sessionRequest(`POST`,`/appium/device/terminate_app`,{appId:e})}catch{await this.executeScript(`mobile: terminateApp`,[{appId:e,bundleId:e}])}}async performActions(e){await this.sessionRequest(`POST`,`/actions`,{actions:e})}async releaseActions(){await this.sessionRequest(`DELETE`,`/actions`,void 0,{retryAttempts:0})}async sendKeys(e){await this.sessionRequest(`POST`,`/keys`,{value:Array.from(e)})}async hideKeyboard(){await this.sessionRequest(`POST`,`/appium/device/hide_keyboard`,void 0,{retryAttempts:0})}async back(){await this.sessionRequest(`POST`,`/back`)}async setRotation(e){await this.sessionRequest(`POST`,`/rotation`,{x:0,y:0,z:e})}async setOrientation(e){await this.sessionRequest(`POST`,`/orientation`,{orientation:e})}async source(){let t=await this.sessionRequest(`GET`,`/source`);if(typeof t!=`string`)throw new e(`COMMAND_FAILED`,`WebDriver source response was not a string`,{valueType:typeof t});return t}async screenshot(t){let n=await this.sessionRequest(`GET`,`/screenshot`);if(typeof n!=`string`)throw new e(`COMMAND_FAILED`,`WebDriver screenshot response was not base64 text`,{valueType:typeof n});await h.writeFile(t,Buffer.from(n,`base64`))}async windowRect(){return _e(await this.sessionRequest(`GET`,`/window/rect`))}async executeScript(e,t=[]){return await this.sessionRequest(`POST`,`/execute/sync`,{script:e,args:t})}async sessionRequest(e,t,n,r){let i=this.requireSessionId();return await this.requestValue(e,`/session/${i}${t}`,n,r)}requireSessionId(){if(!this.sessionId)throw new e(`SESSION_NOT_FOUND`,`WebDriver session has not been created yet.`);return this.sessionId}async requestValue(e,t,n,r){let i,a=r?.retryAttempts??this.requestPolicy.retryAttempts;for(let r=0;r<=a;r+=1)try{return await this.requestValueOnce(e,t,n)}catch(e){if(i=e,!Ce(e)||r>=a)throw e;await g(this.requestPolicy.retryDelayMs)}throw i}async requestValueOnce(e,t,n){let r=await fetch(new URL(pe(t),this.endpoint),{method:e,headers:{Accept:`application/json`,...n===void 0?{}:{"Content-Type":`application/json`},...this.headers},body:n===void 0?void 0:JSON.stringify(n),signal:AbortSignal.timeout(this.requestPolicy.timeoutMs)}),i=await r.text(),a=i?xe(i):{};if(!r.ok)throw Se(r.status,a);return be(a)}};function _e(t){if(!t||typeof t!=`object`)throw new e(`COMMAND_FAILED`,`WebDriver window rect response was empty.`);let n=t,r={x:C(n,`x`),y:C(n,`y`),width:C(n,`width`),height:C(n,`height`)};if(r.x===void 0||r.y===void 0||r.width===void 0||r.height===void 0)throw new e(`COMMAND_FAILED`,`WebDriver window rect response was invalid.`,{response:n});return r}function C(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}function ve(e){return`alwaysMatch`in e||`firstMatch`in e?e:{alwaysMatch:e}}function ye(t){if(!t||typeof t!=`object`)throw new e(`COMMAND_FAILED`,`WebDriver create-session response was empty.`);let n=t,r=typeof n.sessionId==`string`?n.sessionId:typeof n.session_id==`string`?n.session_id:void 0;if(!r)throw new e(`COMMAND_FAILED`,`WebDriver create-session response missed sessionId.`,{response:n});return{sessionId:r,capabilities:n.capabilities&&typeof n.capabilities==`object`?n.capabilities:{}}}function be(e){if(!e||typeof e!=`object`)return e;let t=e;return`value`in t?t.value:e}function xe(t){try{return JSON.parse(t)}catch(n){throw new e(`COMMAND_FAILED`,`WebDriver response was not valid JSON.`,{text:t},n)}}function Se(t,n){let r=n&&typeof n==`object`&&`value`in n?n.value:n;return new e(`COMMAND_FAILED`,r&&typeof r==`object`&&typeof r.message==`string`?r.message:`WebDriver request failed with HTTP ${t}.`,{status:t,response:n})}function Ce(t){if(t instanceof e){let e=t.details?.status;return typeof e==`number`&&e>=500}return t instanceof TypeError||t instanceof Error&&t.name===`TimeoutError`}function we(e,t){return{type:`pointer`,id:e,parameters:{pointerType:`touch`},actions:t}}function Te(t){let n;try{n=te(t)}catch(t){throw new e(`COMMAND_FAILED`,`Failed to parse WebDriver page source XML: ${t instanceof Error?t.message:String(t)}`,void 0,t)}let r=[];for(let e of n)Ee(r,e);return r}function Ee(e,t,n,r=0){let i=Object.keys(t.attributes).length===0?n:De(e,t,n,r),a=i===n?r:r+1;for(let n of t.children)Ee(e,n,i,a)}function De(e,t,n,r){let i=e.length;return e.push(Oe(i,t.name,t.attributes,n,r)),i}function Oe(e,t,n,r,i){let a=ke(n),o=E(n.enabled,!0),s=E(n.displayed??n.visible,!0);return{index:e,type:t,role:Ae(t,n),label:w(n,[`content-desc`,`label`,`text`,`name`]),value:T(n.value),identifier:w(n,[`resource-id`,`id`,`accessibility-id`,`name`]),rect:a,enabled:o,selected:E(n.selected),focused:E(n.focused),visibleToUser:s,hittable:s&&o&&a!==void 0&&a.width>0&&a.height>0,depth:i,parentIndex:r}}function ke(e){let t=ee(e.bounds??null);if(t)return t;let n=D(e.x),r=D(e.y),i=D(e.width),a=D(e.height);if(!(n===void 0||r===void 0||i===void 0||a===void 0))return{x:n,y:r,width:i,height:a}}function w(e,t){for(let n of t){let t=T(e[n]);if(t!==void 0)return t}}function T(e){return e||void 0}function E(e,t=!1){return e===void 0?t:e===`true`||e===`1`}function D(e){if(e===void 0||e===``)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function Ae(e,t){return T(t.class)??T(e.replace(/^XCUIElementType/,``).toLowerCase())}function je(e){let t=Te(e).flatMap(e=>Me(e)&&Ne(e.rect)?[e.rect]:[]).sort((e,t)=>t.width*t.height-e.width*e.height)[0];return t?{x:t.x,y:t.y,width:t.width,height:t.height}:void 0}function Me(e){let t=e.type?.toLowerCase()??``;return e.visibleToUser!==!1&&(t.includes(`scrollview`)||t.includes(`listview`)||t.includes(`recyclerview`))}function Ne(e){return!!e&&e.width>=50&&e.height>=50}async function Pe(t,n,r){let i=[];for(let e of n===`android`?[`rotation`,`orientation`]:[`orientation`,`rotation`])try{await ze(t,e,r);return}catch(t){if(!Le(t))throw t;i.push({transport:e,error:t instanceof Error?t.message:String(t)})}throw new e(`COMMAND_FAILED`,`Could not set device orientation to ${r} on the hosted WebDriver session.`,{hint:`The provider driver rejected both orientation endpoints. Set the orientation as a session capability instead, for example connect --provider-device-orientation portrait.`,rotation:r,attempts:i})}const Fe=new Set([`unknown command`,`unknown method`]),Ie=new Set([404,405]);function Le(t){if(!(t instanceof e)||t.code===`SESSION_NOT_FOUND`)return!1;let n=Re(t.details?.response);if(n)return Fe.has(n);let r=t.details?.status;return typeof r==`number`&&Ie.has(r)}function Re(e){if(!e||typeof e!=`object`)return``;let t=e.value;if(!t||typeof t!=`object`)return``;let n=t.error;return typeof n==`string`?n:``}async function ze(e,t,n){if(t===`rotation`){await e.setRotation(o(n));return}await e.setOrientation(s(n))}function Be(e){return new Ve(e.client,e.backend,e.capabilities)}var Ve=class{client;backend;capabilities;constructor(e,t,n){this.client=e,this.backend=t,this.capabilities=n}async open(e,t){if(this.requireSupport(`open`),t?.url){await this.client.executeScript(`mobile: deepLink`,[{url:t.url,package:e}]);return}let n=t?.appBundleId??e;n&&await this.client.activateApp(n)}async openDevice(){this.requireSupport(`open`),await this.client.executeScript(`mobile: activateApp`,[{}])}async close(e){this.requireSupport(`close`),e&&await this.client.terminateApp(e)}async tap(e,t){return this.requireSupport(`tap`),await this.pointerGesture(`tap`,[{type:`pointerMove`,duration:0,x:e,y:t},{type:`pointerDown`,button:0},{type:`pointerUp`,button:0}]),{backend:`webdriver`,x:e,y:t}}async doubleTap(e,t){return this.requireSupport(`doubleTap`),await this.pointerGesture(`doubleTap`,[{type:`pointerMove`,duration:0,x:e,y:t},{type:`pointerDown`,button:0},{type:`pointerUp`,button:0},{type:`pause`,duration:80},{type:`pointerDown`,button:0},{type:`pointerUp`,button:0}]),{backend:`webdriver`,x:e,y:t}}async swipe(e,t,n,r,i=400){return this.requireSupport(`swipe`),await this.pointerGesture(`swipe`,[{type:`pointerMove`,duration:0,x:e,y:t},{type:`pointerDown`,button:0},{type:`pointerMove`,duration:i,x:n,y:r},{type:`pointerUp`,button:0}]),{backend:`webdriver`,x1:e,y1:t,x2:n,y2:r,durationMs:i}}async longPress(e,t,n=600){return this.requireSupport(`longPress`),await this.pointerGesture(`longPress`,[{type:`pointerMove`,duration:0,x:e,y:t},{type:`pointerDown`,button:0},{type:`pause`,duration:n},{type:`pointerUp`,button:0}]),{backend:`webdriver`,x:e,y:t,durationMs:n}}async focus(e,t){return await this.tap(e,t)}async type(e){this.requireSupport(`type`),await this.client.sendKeys(e)}async fill(e,t,n,r){return this.requireSupport(`fill`),await this.tap(e,t),await this.type(n),{backend:`webdriver`,x:e,y:t,text:n}}async scroll(e,n){this.requireSupport(`scroll`);let r=n?.durationMs??350;await this.client.hideKeyboard().catch(()=>void 0);let i=await this.scrollGestureFrame(),a=t({direction:e,amount:n?.amount,pixels:n?.pixels,referenceWidth:i.width,referenceHeight:i.height}),o={...a,x1:a.x1+i.x,y1:a.y1+i.y,x2:a.x2+i.x,y2:a.y2+i.y};return await this.swipe(o.x1,o.y1,o.x2,o.y2,r),{backend:`webdriver`,...o,distance:a.pixels,durationMs:r}}async gestureViewport(){return await this.scrollGestureFrame()}async performGesture(e){return this.requireSupport(Ue(e)),await this.client.performActions(e.pointers.map(e=>we(`gesture-pointer-${e.pointerId}`,He(e.samples)))),await this.client.releaseActions().catch(()=>void 0),{backend:`webdriver-w3c-actions`}}async screenshot(e,t){this.requireSupport(`screenshot`),await this.client.screenshot(e)}async snapshot(e){return this.requireSupport(`snapshot`),{backend:this.backend,nodes:Te(await this.client.source())}}async back(e){this.requireSupport(`back`),await this.client.back()}async home(){this.requireSupport(`home`),await this.client.executeScript(`mobile: pressButton`,[{name:`home`}])}async setOrientation(e){this.requireSupport(`orientation`),await Pe(this.client,this.backend,e)}async appSwitcher(){this.requireSupport(`appSwitcher`),await this.client.executeScript(`mobile: pressButton`,[{name:`appSwitch`}])}async tvRemote(e,t){this.unsupported(`tvRemote`)}async readClipboard(){this.requireSupport(`clipboard.read`);let e=await this.client.executeScript(`mobile: getClipboard`,[{}]);return typeof e==`string`?e:``}async writeClipboard(e){this.requireSupport(`clipboard.write`),await this.client.executeScript(`mobile: setClipboard`,[{content:e}])}async setSetting(e,t,n,r){this.unsupported(`settings`)}async pointerGesture(e,t){await this.client.performActions([we(e,t)]),await this.client.releaseActions().catch(()=>void 0)}async scrollGestureFrame(){return await this.client.source().then(e=>je(e)).catch(()=>void 0)||await this.client.windowRect()}requireSupport(e){oe(this.capabilities,e)||this.unsupported(e)}unsupported(t){throw new e(`UNSUPPORTED_OPERATION`,y(this.capabilities,t),{provider:this.capabilities.provider,platform:this.capabilities.platform,operation:t})}};function He(t){let n=t[0];if(!n)throw new e(`INVALID_ARGS`,`WebDriver gesture pointer requires samples`);let r=[{type:`pointerMove`,duration:0,x:n.point.x,y:n.point.y},{type:`pointerDown`,button:0}];for(let e=1;e<t.length;e+=1){let n=t[e-1],i=t[e];r.push({type:`pointerMove`,duration:i.offsetMs-n.offsetMs,x:i.point.x,y:i.point.y})}return r.push({type:`pointerUp`,button:0}),r}function Ue(e){if(e.topology===`single`)return`swipe`;switch(e.intent){case`pan`:case`transform`:return`transformGesture`;case`pinch`:return`pinch`;case`rotate`:return`rotateGesture`}}function O(e){return new We(e)}function k(e,t,n={}){return{platformName:e===`ios`?`iOS`:`Android`,"appium:deviceName":t,...n}}var We=class{provider;leaseLifecycle;cloudArtifacts;deviceInventoryProvider;capabilities;sessionsByLeaseId=new Map;releasedProviderSessionIdsByLeaseId=new Map;options;constructor(e){this.options=e,this.provider=e.provider,this.capabilities=ae({provider:e.provider,platform:e.platform,overrides:e.capabilityOverrides}),this.leaseLifecycle={allocate:async(e,t)=>await this.allocate(e,t),heartbeat:async e=>this.heartbeat(e),release:async e=>await this.release(e)},this.cloudArtifacts={listCloudArtifacts:async e=>await this.listCloudArtifacts(e)},this.deviceInventoryProvider=async e=>{if(e.leaseProvider!==this.provider)return null;if(!e.leaseId)return[];let t=this.sessionsByLeaseId.get(e.leaseId);return t?[t.device]:[]}}ownsDevice(e){return[...this.sessionsByLeaseId.values()].some(t=>t.device.id===e.id)}getInteractor(e){return[...this.sessionsByLeaseId.values()].find(t=>t.device.id===e.id)?.interactor}async installApp(e,t,n,r){let i=this.findSessionForDevice(e);if(!i)return;let a=await this.uploadAppIfNeeded(i,e,t,n,r);return await i.client.installApp(a?.appReference??n),le(a,r)}async installInstallablePath(e,t,n){return await this.installApp(e,``,t,n)}async shutdown(){await Promise.allSettled([...this.sessionsByLeaseId.values()].map(async e=>await this.closeSession(e))),this.sessionsByLeaseId.clear()}async allocate(e,t){if(e.leaseProvider!==this.provider)return;if(this.sessionsByLeaseId.has(e.leaseId))return this.heartbeat(e);let n=await this.prepareSession(e,t),r=new ge({clientVersion:this.options.clientVersion,endpoint:n.endpoint,auth:n.auth,headers:n.headers,requestPolicy:this.options.requestPolicy}),i=await this.createSessionWithPreparedCleanup(r,n),a=this.deviceForLease(e,n),o=n.providerSessionId??i.sessionId,s=this.capabilitiesForPlatform(n.platform);return this.sessionsByLeaseId.set(e.leaseId,{lease:e,device:a,client:r,prepared:n,capabilities:s,webDriverSessionId:i.sessionId,providerSessionId:o,interactor:Be({client:r,backend:ue(n.platform),capabilities:s})}),{provider:this.provider,deviceId:a.id,sessionId:i.sessionId,providerSessionId:o,capabilities:s,...n.providerData}}async createSessionWithPreparedCleanup(e,t){try{return await e.createSession(t.webdriverCapabilities)}catch(e){throw await Ge(t,e),e}}heartbeat(e){if(e.leaseProvider===this.provider&&this.sessionsByLeaseId.has(e.leaseId))return{provider:this.provider}}async release(e){if(e.leaseProvider!==this.provider)return;let t=this.sessionsByLeaseId.get(e.leaseId);if(!t)return;this.sessionsByLeaseId.delete(e.leaseId),this.releasedProviderSessionIdsByLeaseId.set(e.leaseId,t.providerSessionId);let n=await this.closeSession(t),r=await this.safeListArtifacts(t);return{provider:this.provider,providerSessionId:t.providerSessionId,...n.cleanup,...n.warnings.length>0?{warnings:n.warnings}:{},...r?{cloudArtifacts:r}:{}}}async listCloudArtifacts(e){if(e.provider!==this.provider)return;let t=e.leaseId?this.sessionsByLeaseId.get(e.leaseId):void 0;if(t)return await this.safeListArtifacts(t);let n=e.providerSessionId??(e.leaseId?this.releasedProviderSessionIdsByLeaseId.get(e.leaseId):void 0);if(!(!n||!this.options.listArtifacts))return await this.options.listArtifacts({provider:this.provider,providerSessionId:n})}async prepareSession(e,t){let n=this.baseSessionForLease(e);return this.options.prepareSession?await this.options.prepareSession({lease:e,req:t,base:n}):n}capabilitiesForPlatform(e){return ae({provider:this.provider,platform:e,overrides:this.options.capabilityOverrides})}baseSessionForLease(e){let t=typeof this.options.webdriverCapabilities==`function`?this.options.webdriverCapabilities(e):this.options.webdriverCapabilities??{};return{provider:this.provider,endpoint:this.options.endpoint,platform:this.options.platform,deviceName:this.options.deviceName,auth:this.options.auth,headers:this.options.headers,webdriverCapabilities:k(this.options.platform,this.options.deviceName,t)}}deviceForLease(e,t){return{...r(t.platform),id:t.deviceId??this.options.deviceId?.(e)??`${this.provider}:${t.platform}:${e.leaseId}`,name:t.deviceName,kind:`device`,target:`mobile`,booted:!0}}findSessionForDevice(e){return[...this.sessionsByLeaseId.values()].find(t=>t.device.id===e.id)}async uploadAppIfNeeded(t,r,i,a,o){if(!oe(t.capabilities,`install`))throw new e(`UNSUPPORTED_OPERATION`,y(t.capabilities,`install`),{provider:this.provider,deviceId:r.id,platform:n(r)});let s=t.prepared.uploadApp??this.options.uploadApp;if(s)return await s({provider:this.provider,lease:t.lease,device:r,app:i,appPath:a,options:o})}async closeSession(e){let t=[],n;try{await e.client.deleteSession()}catch(e){t.push({code:`WEBDRIVER_SESSION_DELETE_FAILED`,message:A(e)})}try{n=await e.prepared.cleanup?.()}catch(e){t.push({code:`PROVIDER_CLEANUP_FAILED`,message:A(e)})}return{cleanup:n,warnings:t}}async safeListArtifacts(e){let t=e.prepared.listArtifacts??this.options.listArtifacts;if(t)try{return await t({provider:this.provider,lease:e.lease,device:e.device,webDriverSessionId:e.webDriverSessionId,providerSessionId:e.providerSessionId})}catch(t){return ce({provider:this.provider,providerSessionId:e.providerSessionId,error:t})}}};function A(e){return e instanceof Error?e.message:String(e)}async function Ge(t,n){try{await t.cleanup?.()}catch(t){n instanceof e&&(n.details={...n.details,cleanupError:A(t)})}}async function j(e,t,n){if(t)return b({provider:e,providerSessionId:t,artifacts:(await Promise.all([n.listArtifacts(t,`FILE`),n.listArtifacts(t,`LOG`)])).flat().flatMap(n=>qe(e,t,n)),pendingMessage:`AWS Device Farm artifacts are not ready yet.`})}function Ke(e){if(!e||typeof e!=`object`)return[];let t=e.artifacts;return Array.isArray(t)?t:[]}function qe(e,t,n){let r=n.url;return typeof r!=`string`||r.length===0?[]:[{provider:e,providerSessionId:t,kind:Je(n.type),name:n.name??n.type??`AWS Device Farm artifact`,url:r,providerArtifactId:n.arn,extension:n.extension,availability:`ready`,metadata:{awsType:n.type,...n.metadata?{awsMetadata:n.metadata}:{}}}]}function Je(e){switch(e){case`VIDEO`:return`video`;case`APPIUM_SERVER_OUTPUT`:return`appium-log`;case`DEVICE_LOG`:return`device-log`;case`MESSAGE_LOG`:case`UNKNOWN`:return`automation-log`;default:return`raw`}}const M={browserStack:`browserstack`,awsDeviceFarm:`aws-device-farm`},Ye=new Set(Object.values(M));function Xe(e){return e!==void 0&&Ye.has(e)}M.awsDeviceFarm;const Ze={install:{support:`unsupported`,note:`Pass appArn when creating the remote access session; local artifact upload/install is not implemented.`},portReverse:{support:`unsupported`,note:`AWS Device Farm remote access does not expose agent-device port reverse.`},artifacts:{support:`supported`,note:`AWS Device Farm remote access exposes provider-hosted video, Appium logs, and device logs after session completion.`}};function N(e){let t=P(e);return{createRemoteAccessSession:async e=>F(await t(`create-remote-access-session`,[`--project-arn`,e.projectArn,`--device-arn`,e.deviceArn,`--name`,e.name,...e.appArn?[`--app-arn`,e.appArn]:[],...e.interactionMode?[`--interaction-mode`,e.interactionMode]:[],...e.configuration?[`--configuration`,JSON.stringify(e.configuration)]:[]])),getRemoteAccessSession:async e=>F(await t(`get-remote-access-session`,[`--arn`,e])),stopRemoteAccessSession:async e=>F(await t(`stop-remote-access-session`,[`--arn`,e])),listArtifacts:async(e,n)=>Ke(await t(`list-artifacts`,[`--arn`,e,`--type`,n]))}}function Qe(t){return async({lease:n,base:r})=>{let i=await tt((await t.client.createRemoteAccessSession({projectArn:t.projectArn,deviceArn:t.deviceArn,appArn:t.appArn,name:fe(t.sessionName,n)??`agent-device-${n.leaseId}`,interactionMode:t.interactionMode,configuration:t.configuration})).arn,t),a=$e(i);if(!a)throw new e(`COMMAND_FAILED`,`AWS Device Farm did not expose a WebDriver endpoint.`,{sessionArn:i.arn,status:i.status});let o=i.device?.name??t.deviceName,s=typeof t.webdriverCapabilities==`function`?t.webdriverCapabilities(n):t.webdriverCapabilities??{};return{...r,endpoint:a,platform:t.platform,deviceName:o,webdriverCapabilities:k(t.platform,o,s),cleanup:async()=>(await t.client.stopRemoteAccessSession(i.arn),{awsDeviceFarmSessionArn:i.arn}),providerSessionId:i.arn,providerData:{awsDeviceFarmSessionArn:i.arn}}}}function $e(e){let t=e.endpoints&&typeof e.endpoints==`object`?Object.values(e.endpoints):[],n=[e.remoteDriverEndpoint,e.endpoint,...t,e.remoteDebugUrl,e.remoteRecordAppUrl].filter(e=>typeof e==`string`&&e.length>0).find(e=>!/^wss?:\/\//i.test(e));return n?et(n):void 0}function et(e){return/^https?:\/\//i.test(e)?e:`http://${e}`}async function tt(t,n){let r=n.startupTimeoutMs??12e4,i=n.pollIntervalMs??5e3,a=Date.now(),o=await n.client.getRemoteAccessSession(t);for(;Date.now()-a<r;){if(o.status===`RUNNING`)return o;if(o.status===`ERRORED`||o.status===`STOPPED`||o.status===`COMPLETED`)throw new e(`COMMAND_FAILED`,`AWS Device Farm remote access session did not start.`,{sessionArn:t,status:o.status,result:o.result});await g(i),o=await n.client.getRemoteAccessSession(t)}throw new e(`COMMAND_FAILED`,`Timed out waiting for AWS Device Farm remote access.`,{sessionArn:t,status:o.status,result:o.result,timeoutMs:r})}async function nt(t,n,r){let i=await t(n,r);try{return JSON.parse(i.stdout)}catch(t){throw new e(`COMMAND_FAILED`,`AWS Device Farm returned invalid JSON.`,void 0,t)}}function P(e){let t=e.region?[`--region`,e.region]:[],n=e.awsCommand??`aws`;return async(r,i)=>await nt(e.runHostCommand,n,[`devicefarm`,r,...t,...i,`--output`,`json`])}function F(t){if(!t||typeof t!=`object`)throw new e(`COMMAND_FAILED`,`AWS Device Farm response was not an object.`,{response:t});let n=t.remoteAccessSession;if(!n||typeof n!=`object`)throw new e(`COMMAND_FAILED`,`AWS Device Farm response missed remoteAccessSession.`,{response:t});return n}const I=[{field:`providerDeviceOrientation`,capability:`deviceOrientation`,flag:`--provider-device-orientation`,type:`enum`,enumValues:a},{field:`providerGeoLocation`,capability:`geoLocation`,flag:`--provider-geo-location`,type:`string`},{field:`providerTimezone`,capability:`timezone`,flag:`--provider-timezone`,type:`string`},{field:`providerLanguage`,capability:`language`,flag:`--provider-language`,type:`string`},{field:`providerLocale`,capability:`locale`,flag:`--provider-locale`,type:`string`},{field:`providerNetworkProfile`,capability:`networkProfile`,flag:`--provider-network-profile`,type:`string`},{field:`providerCustomNetwork`,capability:`customNetwork`,flag:`--provider-custom-network`,type:`string`},{field:`providerNoResignApp`,capability:`resignApp`,flag:`--provider-no-resign-app`,type:`negated-boolean`,platform:`ios`}];function rt(e,t){lt(e);let n={};for(let r of I){let i=e[r.field];i===void 0||i===!1||i===``||(ct(r,t),n[r.capability]=r.type===`negated-boolean`?!1:i)}return n}function it(e){return I.filter(t=>{let n=e?.[t.field];return n!==void 0&&n!==!1&&n!==``}).map(e=>e.flag)}function L(t,n){let r=it(t);if(r.length===0)return;let i=r.length!==1;throw new e(`INVALID_ARGS`,`${r.join(`, `)} ${i?`are`:`is`} only supported by BrowserStack, not ${n}.`,{hint:`Drop ${i?`those flags`:`the flag`} or use the browserstack provider.`,provider:n,flags:r})}function at(e){let t={};for(let n of I){let r=e?.[n.field];if(n.type===`negated-boolean`){r===!0&&(t.providerNoResignApp=!0);continue}typeof r!=`string`||r.length===0||ot(t,n,r)}return t}function ot(e,t,n){if(t.field===`providerDeviceOrientation`){e.providerDeviceOrientation=st(t,n);return}t.field!==`providerNoResignApp`&&(e[t.field]=n)}function st(t,n){let r=a.find(e=>e===n);if(r)return r;throw new e(`INVALID_ARGS`,`Invalid ${t.flag} value: ${n}.`,{hint:`Use ${a.join(`|`)}.`,flag:t.flag,capability:t.capability})}function ct(t,n){if(!(!t.platform||t.platform===n))throw new e(`INVALID_ARGS`,`${t.flag} applies to ${t.platform} sessions only, but the session platform is ${n}.`,{hint:`Drop ${t.flag} or connect with --platform ${t.platform}.`,flag:t.flag,capability:t.capability,platform:n})}function lt(t){if(!(!t.providerNetworkProfile||!t.providerCustomNetwork))throw new e(`INVALID_ARGS`,`BrowserStack accepts either a named network profile or a custom network shape, not both.`,{hint:`Pass only one of --provider-network-profile or --provider-custom-network.`,networkProfile:t.providerNetworkProfile,customNetwork:t.providerCustomNetwork})}M.browserStack;const ut={install:{support:`partial`,note:`Local app artifacts are uploaded to BrowserStack App Automate, then installed with Appium.`},portReverse:{support:`unsupported`,note:`Use BrowserStack Local for network tunneling; agent-device port reverse is not available.`},artifacts:{support:`supported`,note:`BrowserStack session details expose provider-hosted video, Appium logs, device logs, and dashboard links.`}};async function R(e,t,n){if(t)return b({provider:e,providerSessionId:t,artifacts:ht(e,t,await mt(t,n)),pendingMessage:`BrowserStack artifacts are not ready yet.`})}async function z(t,n){let r=await h.readFile(t),i=new FormData;i.set(`file`,new Blob([r]),f.basename(t));let a=await fetch(n.endpoint??`https://api-cloud.browserstack.com/app-automate/upload`,{method:`POST`,headers:{...x(n.clientVersion),Authorization:S(n)},body:i}),o=await a.json(),s=gt(o);if(!a.ok||!s)throw new e(`COMMAND_FAILED`,`BrowserStack app upload failed.`,{status:a.status,response:o});return s}function dt(e){return async({appPath:t,options:n})=>({appReference:await z(t,e),bundleId:n?.appIdentifierHint,packageName:n?.packageNameHint,launchTarget:n?.appIdentifierHint??n?.packageNameHint})}function ft(e){let{"bstack:options":t,...n}=e.configured??{};return{device:e.deviceName,os_version:e.osVersion,...e.app?{app:e.app}:{},...n,"bstack:options":{...e.projectName?{projectName:e.projectName}:{},buildName:e.buildName,sessionName:e.sessionName,...e.deviceFeatures??{},...pt(t)}}}function pt(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}async function mt(t,n){let r=new URL(`${me(String(n.endpoint??`https://api-cloud.browserstack.com/app-automate/sessions`))}/${t}.json`),i=await fetch(r,{headers:{...x(n.clientVersion),Authorization:S(n)}}),a=await i.json();if(!i.ok||!a||typeof a!=`object`)throw new e(`COMMAND_FAILED`,`BrowserStack session details lookup failed.`,{status:i.status,response:a});let o=a.automation_session??a;return o&&typeof o==`object`?o:{}}function ht(e,t,n){return[B(e,t,n,`video_url`,`video`,`Session video`),B(e,t,n,`appium_logs_url`,`appium-log`,`Appium logs`),B(e,t,n,`device_logs_url`,`device-log`,`Device logs`),B(e,t,n,`browser_url`,`provider-session`,`BrowserStack dashboard`),B(e,t,n,`public_url`,`provider-session`,`Public session link`)].filter(e=>e!==void 0)}function B(e,t,n,r,i,a){let o=n[r];if(!(typeof o!=`string`||o.length===0))return{provider:e,providerSessionId:t,kind:i,name:a,url:o,availability:`ready`}}function gt(e){if(!e||typeof e!=`object`)return;let t=e.app_url;return typeof t==`string`?t:void 0}function V(e){return/^arn:[^:]+:devicefarm:([^:]+):/.exec(e)?.[1]}async function _t(t,n){let r=P({runHostCommand:n,region:t.region}),[i,a,o]=await Promise.all([r(`get-project`,[`--arn`,t.projectArn]),r(`get-device`,[`--arn`,t.deviceArn]),t.appArn?r(`get-upload`,[`--arn`,t.appArn]):void 0]),s=H(i,`project`),c=H(a,`device`),l=yt(c.platform);if(l!==t.platform)throw new e(`INVALID_ARGS`,`AWS Device Farm device "${U(c.name)??t.deviceArn}" is ${l}, not ${t.platform}.`);let u=t.appArn?vt(H(o,`upload`),t):{status:`missing`,message:`No app upload is attached; AWS Device Farm does not support install after allocation. Reconnect with --aws-app-arn <arn>.`};return{provider:`aws-device-farm`,service:`AWS Device Farm`,verificationMessage:t.appArn?`Credentials, project, device, and app upload verified.`:`Credentials, project, and device verified.`,project:{name:U(s.name),reference:t.projectArn},device:{status:`verified`,name:U(c.name)??t.deviceArn,reference:t.deviceArn,platform:l,osVersion:U(c.os),availability:U(c.availability)},app:u}}function vt(t,n){let r=U(t.status);if(r!==`SUCCEEDED`)throw new e(`COMMAND_FAILED`,`AWS Device Farm app upload is not ready (${r??`unknown status`}).`,{status:r,hint:`Wait for the upload to succeed or reconnect with a different --aws-app-arn.`});let i=n.platform===`android`?`ANDROID_APP`:`IOS_APP`,a=U(t.type);if(a!==i)throw new e(`INVALID_ARGS`,`AWS Device Farm app upload type is ${a??`unknown`}, expected ${i}.`);return{status:`verified`,name:U(t.name),reference:n.appArn}}function H(t,n){if(!t||typeof t!=`object`)throw new e(`COMMAND_FAILED`,`AWS Device Farm ${n} response was not an object.`);let r=t[n];if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`COMMAND_FAILED`,`AWS Device Farm response missed ${n}.`);return r}function yt(t){if(t===`ANDROID`)return`android`;if(t===`IOS`)return`ios`;throw new e(`UNSUPPORTED_PLATFORM`,`AWS Device Farm device platform is ${String(t)}.`)}function U(e){return typeof e==`string`&&e.length>0?e:void 0}async function bt(t,n){let r={username:t.username,accessKey:t.accessKey},i=Ct(await W(t.devicesEndpoint??`https://api-cloud.browserstack.com/app-automate/devices.json`,r,n)).find(e=>e.device===t.deviceName&&e.os.toLowerCase()===t.platform&&St(e.osVersion,t.osVersion));if(!i)throw new e(`INVALID_ARGS`,`BrowserStack device "${t.deviceName}" with ${t.platform} ${t.osVersion} is not available.`,{hint:`Choose an exact device and OS version from the BrowserStack App Automate device list.`});let a=await xt(t,r,n);return{provider:`browserstack`,service:`BrowserStack`,verificationMessage:a.status===`verified`?`Credentials, device, and uploaded app verified.`:`Credentials and device access verified; app availability is checked when the session is created.`,device:{status:`verified`,name:i.device,platform:t.platform,osVersion:i.osVersion},app:a}}async function xt(e,t,n){let{app:r}=e;if(r.startsWith(`bs://`)){let i=wt(await W(e.appsEndpoint??`https://api-cloud.browserstack.com/app-automate/recent_apps?limit=100`,t,n)).find(e=>e.reference===r);return i?{status:`verified`,...i}:{status:`configured`,reference:r,message:`App reference was not found in the 100 most recent uploads; BrowserStack validates it when creating the session.`}}return/^https?:\/\//i.test(r)?{status:`configured`,reference:r,message:`Public app URL configured; BrowserStack validates it when creating the session.`}:{status:`configured`,name:f.basename(r),reference:r,message:`Local app artifact is ready and will be uploaded when creating the session.`}}async function W(t,n,r){try{let i=await fetch(t,{headers:{...x(r),Authorization:S(n)},signal:AbortSignal.timeout(15e3)});if(!i.ok){let t=i.status===401||i.status===403;throw new e(t?`UNAUTHORIZED`:`COMMAND_FAILED`,`BrowserStack rejected connection verification.`,{status:i.status,hint:t?`Check BROWSERSTACK_USERNAME and BROWSERSTACK_ACCESS_KEY.`:`Retry connect or check the BrowserStack service status.`})}return await i.json()}catch(t){throw t instanceof e?t:new e(`COMMAND_FAILED`,`BrowserStack connection verification failed.`,{hint:`Check network access to api-cloud.browserstack.com and retry connect.`},t)}}function St(e,t){let n=e=>e.replace(/(?:\.0)+$/,``);return n(e)===n(t)}function Ct(t){if(!Array.isArray(t))throw new e(`COMMAND_FAILED`,`BrowserStack device verification response was not a list.`);return t.flatMap(e=>{let t=G(e),n=t?.os_version;return t&&typeof t.device==`string`&&typeof t.os==`string`&&(typeof n==`string`||typeof n==`number`)?[{device:t.device,os:t.os,osVersion:String(n)}]:[]})}function wt(t){let n=G(t);if(n&&Object.keys(n).length===0)return[];if(!Array.isArray(t))throw new e(`COMMAND_FAILED`,`BrowserStack app verification response was not a list.`);return t.flatMap(e=>{let t=G(e);return!t||typeof t.app_url!=`string`?[]:[{reference:t.app_url,...typeof t.app_name==`string`?{name:t.app_name}:{},...typeof t.app_version==`string`?{version:t.app_version}:{}}]})}function G(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}async function Tt(e,t){return e.provider===`browserstack`?await bt(e,t.clientVersion):await _t(e,t.runHostCommand)}function Et(e){return[{provider:M.browserStack,createRuntime:t=>O({clientVersion:e.clientVersion,provider:M.browserStack,platform:`android`,deviceName:`BrowserStack device`,endpoint:t.BROWSERSTACK_WEBDRIVER_ENDPOINT??`https://hub-cloud.browserstack.com/wd/hub/`,capabilityOverrides:ut,listArtifacts:async({provider:n,providerSessionId:r})=>{let i=X(t,`BROWSERSTACK_USERNAME`,`BrowserStack artifact lookup`),a=X(t,`BROWSERSTACK_ACCESS_KEY`,`BrowserStack artifact lookup`);return await R(n,r,{clientVersion:e.clientVersion,username:i,accessKey:a,endpoint:t.BROWSERSTACK_SESSION_DETAILS_ENDPOINT})},prepareSession:async({req:n,lease:r,base:i})=>{let a=K(n,`BrowserStack`),o=X(t,`BROWSERSTACK_USERNAME`,`BrowserStack`),s=X(t,`BROWSERSTACK_ACCESS_KEY`,`BrowserStack`),c=q(a,`BrowserStack`),l=J(a,`device`,`BrowserStack requires --device <name>.`),u=J(a,`providerOsVersion`,`BrowserStack requires --provider-os-version <version>.`),d=await Dt({clientVersion:e.clientVersion,app:J(a,`providerApp`,`BrowserStack requires --provider-app <bs://app-id-or-local-path>.`),cwd:a.cwd,username:o,accessKey:s,uploadEndpoint:t.BROWSERSTACK_APP_UPLOAD_ENDPOINT});return{...i,platform:c,deviceName:l,auth:{username:o,accessKey:s},uploadApp:dt({clientVersion:e.clientVersion,username:o,accessKey:s,endpoint:t.BROWSERSTACK_APP_UPLOAD_ENDPOINT??`https://api-cloud.browserstack.com/app-automate/upload`}),webdriverCapabilities:ft({deviceName:l,osVersion:u,app:d,projectName:Y(a,`providerProject`),buildName:Y(a,`providerBuild`)??r.runId,sessionName:Y(a,`providerSessionName`)??r.leaseId,deviceFeatures:rt(at(a.flags),c),configured:k(c,l)})}}}),listArtifactsFromEnv:async(t,n)=>{let r=X(n,`BROWSERSTACK_USERNAME`,`BrowserStack artifact lookup`),i=X(n,`BROWSERSTACK_ACCESS_KEY`,`BrowserStack artifact lookup`);return await R(M.browserStack,t,{clientVersion:e.clientVersion,username:r,accessKey:i,endpoint:n.BROWSERSTACK_SESSION_DETAILS_ENDPOINT})}},{provider:M.awsDeviceFarm,createRuntime:t=>O({clientVersion:e.clientVersion,provider:M.awsDeviceFarm,endpoint:`http://127.0.0.1/`,platform:`android`,deviceName:`AWS Device Farm device`,capabilityOverrides:Ze,listArtifacts:async({provider:n,providerSessionId:r})=>await j(n,r,N({runHostCommand:e.runHostCommand,region:t.AWS_REGION??t.AWS_DEFAULT_REGION??V(r??``)})),prepareSession:async({req:n,lease:r,base:i})=>{let a=K(n,`AWS Device Farm`);L(a.flags,M.awsDeviceFarm);let o=q(a,`AWS Device Farm`);return await Qe({client:N({runHostCommand:e.runHostCommand,region:Y(a,`awsRegion`)??t.AWS_REGION??t.AWS_DEFAULT_REGION}),projectArn:kt(a,t,`awsProjectArn`,`AGENT_DEVICE_AWS_DEVICE_FARM_PROJECT_ARN`,`AWS_DEVICE_FARM_PROJECT_ARN`),deviceArn:kt(a,t,`awsDeviceArn`,`AGENT_DEVICE_AWS_DEVICE_FARM_DEVICE_ARN`,`AWS_DEVICE_FARM_DEVICE_ARN`),appArn:Y(a,`awsAppArn`)??t.AGENT_DEVICE_AWS_DEVICE_FARM_APP_ARN??t.AWS_DEVICE_FARM_APP_ARN,platform:o,deviceName:Y(a,`device`)??`AWS Device Farm device`,sessionName:Y(a,`providerSessionName`)??r.leaseId,interactionMode:At(a)})({lease:r,req:n,base:i})}}),listArtifactsFromEnv:async(t,n)=>{let r=N({runHostCommand:e.runHostCommand,region:n.AWS_REGION??n.AWS_DEFAULT_REGION??V(t)});return await j(M.awsDeviceFarm,t,r)}}]}async function Dt(t){if(Ot(t.app))return t.app;let n=f.resolve(t.cwd??process.cwd(),t.app);if(!m.existsSync(n))throw new e(`INVALID_ARGS`,`BrowserStack --provider-app must be a bs:// app id, URL, or existing local app path.`,{providerApp:t.app});return await z(n,{clientVersion:t.clientVersion,username:t.username,accessKey:t.accessKey,endpoint:t.uploadEndpoint})}function Ot(e){return e.startsWith(`bs://`)||/^https?:\/\//.test(e)}function K(t,n){if(t)return t;throw new e(`INVALID_ARGS`,`${n} lease allocation requires provider profile flags on the request.`)}function q(t,n){let r=t.flags?.platform;if(r===`android`||r===`ios`)return r;throw new e(`INVALID_ARGS`,`${n} requires --platform ios|android.`)}function J(t,n,r){let i=Y(t,n);if(i)return i;throw new e(`INVALID_ARGS`,r)}function Y(e,t){let n=e.flags?.[t];return typeof n==`string`&&n.length>0?n:void 0}function X(t,n,r){let i=t[n];if(i)return i;throw new e(`INVALID_ARGS`,`${r} requires ${n} in the environment.`)}function kt(t,n,r,i,a){let o=Y(t,r)??n[i]??n[a];if(o)return o;throw new e(`INVALID_ARGS`,`AWS Device Farm requires --${jt(String(r))} or ${a}.`)}function At(e){let t=Y(e,`awsInteractionMode`);if(t===`INTERACTIVE`||t===`NO_VIDEO`||t===`VIDEO_ONLY`)return t}function jt(e){return e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}function Mt(e){let t=Et(e);return{providerIds:t.map(e=>e.provider),createDefaultRuntimes:(e=process.env)=>t.map(t=>t.createRuntime(e)),listArtifactsFromEnv:async(e,n)=>{if(e.providerSessionId)return await t.find(t=>t.provider===e.provider)?.listArtifactsFromEnv(e.providerSessionId,n)},verifyConnection:async t=>await Tt(t,e)}}const Nt=Mt({clientVersion:l(),runHostCommand:async(e,t)=>({stdout:(await c(e,[...t],{maxBuffer:10*1024*1024,timeoutMs:3e4})).stdout})});function Pt(){return{pid:process.pid,startTime:d(process.pid)}}function Ft(e,t){return e.pid===t.pid&&e.startTime===t.startTime}function It(e){let{owner:t,stateDir:n}=e;if(!u(t.pid)||t.startTime&&d(t.pid)!==t.startTime)return`owner-process-dead`;if(!n)return`live`;try{return m.statSync(n),`live`}catch(e){let t=e?.code;return t===`ENOENT`||t===`ENOTDIR`?`owner-state-dir-gone`:`unknown`}}function Z(){let e=process.env.AGENT_DEVICE_CLAIMS_DIR?.trim();return e?f.resolve(e):f.join(ne.homedir(),`.agent-device`,`device-claims`)}function Lt(e){let t=p.createHash(`sha256`).update(e).digest(`hex`);return f.join(Z(),`${t}.json`)}function Rt(e){let t=Z(),n=zt(t);return`claims`in n?n.claims:n.entries.filter(e=>e.isFile()&&e.name.endsWith(`.json`)).map(e=>Wt(f.join(t,e.name))).filter(e=>e!==null).filter(t=>Bt(t.claim,e))}function zt(e){try{return{entries:m.readdirSync(e,{withFileTypes:!0})}}catch(t){let n=t.code;return n===`ENOENT`||n===`ENOTDIR`?{claims:[]}:{claims:[{fileName:f.basename(e),classification:`unknown`,error:String(t)}]}}}function Bt(e,t){return e?[Vt(e,t.udid??t.serial),Ht(e,t.device),Ut(e,t.platform)].every(Boolean):!0}function Vt(e,t){return!t||e.device.id===t}function Ht(e,t){return!t||e.device.name===t||e.device.id===t}function Ut(e,t){return i({...r(e.device.platform),appleOs:e.device.appleOs},t)}function Wt(e){let t=f.basename(e);try{return Gt(t,m.readFileSync(e,`utf8`))}catch(e){let n=e.code;return n===`ENOENT`||n===`ENOTDIR`?null:{fileName:t,classification:`unknown`,error:String(e)}}}function Gt(e,t){try{let n=Kt(JSON.parse(t));return n?{fileName:e,deviceKey:n.deviceKey,claim:n,classification:It({owner:{pid:n.ownerPid,startTime:n.ownerStartTime},stateDir:n.stateDir})}:{fileName:e,classification:`inconsistent`}}catch(t){return{fileName:e,classification:`inconsistent`,error:String(t)}}}function Kt(e){if(!qt(e))return null;let t=e;return Jt(t)?t:null}function qt(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Jt(e){return e.schemaVersion===1&&Yt(e.device)&&[e.deviceKey,e.session,e.workspace,e.stateDir,e.ownerToken].every(Xt)&&Zt(e.ownerPid)&&Qt(e.createdAtMs)&&Qt(e.updatedAtMs)}function Yt(e){if(!qt(e))return!1;let t=e;return[t.id,t.name,t.platform,t.kind].every(Xt)}function Xt(e){return typeof e==`string`&&e.length>0}function Zt(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function Qt(e){return typeof e==`number`&&Number.isFinite(e)}function $t(e,t){let n={providerReleases:{released:t.released.map(nn),pending:t.pending.map(nn)}},r=Q(e),i=`${r}.${process.pid}.${Date.now()}.tmp`;try{m.writeFileSync(i,`${JSON.stringify(n)}\n`,{mode:384}),m.renameSync(i,r),m.chmodSync(r,384)}catch{try{m.rmSync(i,{force:!0})}catch{}}}function en(e){try{let t=JSON.parse(m.readFileSync(Q(e),`utf8`));return rn(t)?t:null}catch{return null}}function tn(e){try{m.rmSync(Q(e),{force:!0})}catch{}}function Q(e){return f.join(e,`daemon-shutdown.json`)}function nn(e){return{leaseId:e.leaseId,...e.leaseProvider?{provider:e.leaseProvider}:{}}}function rn(e){if(!e||typeof e!=`object`)return!1;let t=e.providerReleases;if(!t||typeof t!=`object`)return!1;let n=t;return Array.isArray(n.released)&&Array.isArray(n.pending)&&n.released.every(an)&&n.pending.every(an)}function an(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.leaseId==`string`&&t.leaseId.trim().length>0&&(t.provider===void 0||typeof t.provider==`string`)}const $={control:{retryMaxRetries:3},command:{retryTapMaxAttempts:2,targetLookupTimeoutMs:17e3,optionalTargetLookupTimeoutMs:7e3,scrollUntilVisibleTimeoutMs:2e4,waitForAnimationToEndTimeoutMs:15e3,waitForAnimationToEndDifferencePercent:.005,longPressDurationMs:3e3,swipeDurationMs:400,repeatDelayMs:100,scrollUntilVisibleSpeed:40,scrollUntilVisiblePercentage:100,eraseTextMaxCharacters:50},observation:{pollIntervalMs:200,defaultSettleAttempts:10},targetSwipe:{nearEdgeFraction:.1,farEdgeFraction:.9},screenSwipe:{nearEdgeFraction:.1,farEdgeFraction:.9,centerFraction:.5,downStartFraction:.2,upStartFraction:{android:.5,ios:.9}},scrollUntilVisibleSwipe:{nearEdgeFraction:.1,farEdgeFraction:.9}};function on(e){return Math.trunc(1e3*(100-e)/100)+1}const sn={assertVisibleTimeoutMs:$.command.targetLookupTimeoutMs,assertNotVisibleTimeoutMs:$.command.targetLookupTimeoutMs,extendedWaitUntilTimeoutMs:$.command.targetLookupTimeoutMs,runFlowConditionTimeoutMs:$.command.optionalTargetLookupTimeoutMs},cn=$.observation.pollIntervalMs*$.observation.defaultSettleAttempts,ln=[`id`,`text`,`enabled`,`selected`],un=[...ln,`label`],dn=[`id`,`text`,`label`],fn=[`enabled`,`selected`];export{Xe as C,M as S,Ft as _,sn as a,V as b,on as c,$t as d,Wt as f,It as g,Z as h,dn as i,tn as l,Lt as m,fn as n,$ as o,Rt as p,un as r,cn as s,ln as t,en as u,Pt as v,re as w,L as x,Nt as y};
@@ -1,6 +1,6 @@
1
1
  import { A as SnapshotNode, N as SnapshotState, U as PublicPlatform, V as Platform } from "./sdk-contracts.js";
2
- import { a as Selector, c as parseSelectorChain, l as tryParseSelectorChain, o as SelectorChain, s as isSelectorToken } from "./sdk-finders.js";
3
2
  import { n as DisambiguationTiebreak } from "./interaction.js";
3
+ import { a as SelectorChain, c as tryParseSelectorChain, i as Selector, o as isSelectorToken, s as parseSelectorChain } from "./sdk-finders.js";
4
4
  //#region src/selectors/resolve.d.ts
5
5
  type SelectorDiagnostics = {
6
6
  selector: string;
@@ -1 +1 @@
1
- import{Q as e,Z as t,et as n}from"./sdk-batch-runner.js";import{O as r,f as i,h as a,k as o,p as s}from"./sdk-selectors.js";export{i as findSelectorChainMatch,s as formatSelectorFailure,r as isNodeEditable,o as isNodeVisible,t as isSelectorToken,e as parseSelectorChain,a as resolveSelectorChain,n as tryParseSelectorChain};
1
+ import{H as e,V as t,W as n}from"./sdk-batch-runner.js";import{O as r,f as i,h as a,k as o,p as s}from"./sdk-selectors.js";export{i as findSelectorChainMatch,s as formatSelectorFailure,r as isNodeEditable,o as isNodeVisible,t as isSelectorToken,e as parseSelectorChain,a as resolveSelectorChain,n as tryParseSelectorChain};
@@ -1,3 +1,3 @@
1
- import{S as e,_ as t,n,o as r}from"./sdk-contracts.js";import{N as i,f as a}from"./sdk-batch-runner.js";import{at as o,fn as s,in as c}from"./recording-export-quality.js";import{n as l}from"./version.js";import{r as u,t as d}from"./sdk-device.js";import{b as f,s as p,x as m,y as h}from"./registry.js";import{i as ee,n as te,t as ne}from"./command-metadata.js";import{i as re,n as ie,r as ae,t as oe}from"./cli-config.js";const g=[`simulator`,`emulator`,`device`];function _(e){return{type:`number`,...e?{description:e}:{}}}function v(e,t){return{type:`string`,enum:e,...t?{description:t}:{}}}function y(e){return{type:`string`,const:e}}function b(e,t=[],n){return{type:`object`,...n?{description:n}:{},properties:e,...t.length>0?{required:t}:{}}}const x={type:`array`,items:{type:`string`}},S=b({wallClockMs:_(`Total wall-clock time for the request in milliseconds.`),runnerRoundTrips:_(`Number of real runner round-trips made while serving the request.`),nodeCount:_(`Number of nodes in the original node tree when the response carries one.`)},[`wallClockMs`,`runnerRoundTrips`]),se=b({field:m(),artifactType:m(),path:m(),localPath:m(),fileName:m()},[`field`]);function C(e={}){let t=e.properties??{},n=e.required??[];return b({targetKind:v([`point`,`ref`,`selector`],`Resolved interaction target kind.`),x:_(`Resolved interaction x coordinate when available.`),y:_(`Resolved interaction y coordinate when available.`),referenceWidth:_(`Reference frame width for visualizing the interaction point.`),referenceHeight:_(`Reference frame height for visualizing the interaction point.`),ref:m(`Snapshot ref without the @ prefix when the target was an @ref.`),selector:m(`Selector expression when the target was a selector.`),selectorChain:x,refLabel:m(),targetHittable:h(),hint:m(),warning:m(),message:m(),evidence:T,resolution:ce,cost:S,maestroNonHittableCoordinateFallbackAllowed:h(`Whether the direct iOS Maestro coordinate fallback was allowed for this selector.`),maestroNonHittableCoordinateFallbackUsed:h(`Whether the direct iOS Maestro coordinate fallback was actually used.`),maestroFallbackReason:y(`non-hittable-coordinate`),...t},[`targetKind`,...n])}const w=b({diagnosticRef:m(`Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.`),role:m(`UTF-8 truncated to 256 bytes.`),label:m(`UTF-8 truncated to 256 bytes.`)},[`diagnosticRef`]),ce={type:`object`,description:`Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.`,oneOf:[b({source:y(`runtime`),phase:y(`pre-action`),kind:y(`unique`)},[`source`,`phase`,`kind`]),b({source:y(`runtime`),phase:y(`pre-action`),kind:y(`disambiguated`),matchCount:_(`Total matches resolveSelectorChain found before disambiguation.`),winnerDiagnostic:w,tiebreak:v([`visible`,`deepest`,`smallest-area`],`The comparison that decided the winner.`),alternatives:{type:`array`,description:`At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.`,items:w}},[`source`,`phase`,`kind`,`matchCount`,`winnerDiagnostic`,`tiebreak`]),b({source:y(`ref`),phase:y(`pre-action`),kind:y(`exact`)},[`source`,`phase`,`kind`]),b({source:y(`ref`),phase:y(`pre-action`),kind:y(`label-fallback`)},[`source`,`phase`,`kind`]),b({source:y(`direct-ios`),kind:y(`not-observed`)},[`source`,`kind`])]},T=b({foregroundApp:m(`Foreground app bundle id or name, when the capture carries it.`),nodeCount:_(`Node count in the post-action interactive-only capture.`),interactiveNodeCount:_(`Subset of nodeCount the platform reports as hittable.`),digest:m(`Order-independent digest of the post-action node multiset.`),changedFromBefore:h(`Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.`)},[`nodeCount`,`interactiveNodeCount`,`digest`,`changedFromBefore`]),E=b({settled:h(`Whether the UI held the quiet window before the deadline. false is advisory, not failure.`),waitedMs:_(),captures:_(),quietMs:_(),timeoutMs:_(),refsGeneration:_(`Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.`),refs:{type:`array`,items:b({ref:m(`Plain ref body (e12) minted from the stored settled tree.`)},[`ref`])},diff:b({summary:b({additions:_(),removals:_(),unchanged:_()},[`additions`,`removals`,`unchanged`]),lines:{type:`array`,items:b({kind:v([`added`,`removed`]),text:m(),ref:m(`Plain ref body (e12) for added lines.`)},[`kind`,`text`])},truncated:h(`Lines were capped to the response bound.`)},[`summary`,`lines`],`Settled diff vs the pre-action tree (changed lines only).`),tail:{type:`array`,description:`Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).`,items:b({ref:m(`Plain ref body (e12) minted from the stored settled tree.`),role:m(),label:m()},[`ref`,`role`])},tailTruncated:h(`Present (true) when tail candidates exceeded the response cap.`),hint:m()},[`settled`,`waitedMs`,`captures`,`quietMs`,`timeoutMs`]),D={platform:v(u),target:v(d),device:m(`Human-readable device name.`),id:m(`Stable device id.`),kind:v(g)},O=[`platform`,`target`,`device`,`id`,`kind`],le=b({success:h(),exitCode:_(),stdout:m(),stderr:m(),error:f(`Normalized error detail when shutdown failed.`)},[`success`,`exitCode`,`stdout`,`stderr`]),k=C({properties:{evidence:T,settle:E,button:v([`secondary`,`middle`]),count:_(`Number of press/click repetitions.`),intervalMs:_(`Delay between repeated press/click actions.`),holdMs:_(`Hold duration for each action.`),jitterPx:_(`Randomization radius in pixels.`),doubleTap:h(`Whether the command requested a double-tap action.`)}}),ue={press:k,click:k,fill:C({properties:{text:m(`Text submitted to the field.`),delayMs:_(`Delay between typed characters in milliseconds.`),evidence:T,settle:E},required:[`text`]}),longpress:C({properties:{durationMs:_(),settle:E,gesture:y(`longpress`)}}),find:b({ref:m(`Snapshot ref without the @ prefix when the find action returns one.`),refsGeneration:_(`ADR 0014 ref frame epoch for read-only find actions.`),found:h(`Whether a wait/exists/read-only find satisfied its condition.`),waitedMs:_(`Milliseconds waited for a read-only find condition.`),text:m(`Text value returned by find get_text.`),node:f(`Snapshot node for find get_attrs/get_text.`),locator:m(`Locator kind used for the find action.`),query:m(`Query argument used for the find action.`),x:_(`Resolved x coordinate for mutating find actions.`),y:_(`Resolved y coordinate for mutating find actions.`),message:m(`Diagnostic message for mutating find actions.`),settle:E,cost:S},[],`Daemon response data for the find command.`),boot:b({...D,booted:{type:`boolean`,const:!0}},[...O,`booted`]),shutdown:b({...D,shutdown:le},[...O,`shutdown`]),viewport:b({width:_(),height:_(),message:m()},[`width`,`height`,`message`]),...p,wait:b({waitedMs:_(),kind:y(`selector`),text:m(),selector:m(),captures:_(),nodeCount:_(),hint:m(),warning:m()},[`waitedMs`]),prepare:b({action:y(`ios-runner`),platform:v(u),deviceId:m(),deviceName:m(),kind:v(g),durationMs:_(),runner:b({},[]),cache:v([`exact`,`restore-key`,`miss`,`external`]),artifact:v([`valid`,`rebuilt`]),buildMs:_(),connectMs:_(),healthCheckMs:_(),xctestrunPath:m(),recoveryReason:m(),failureReason:m(),timing:b({totalMs:_(),additiveParts:b({buildMs:_(),connectAfterBuildMs:_(),healthCheckMs:_()},[`connectAfterBuildMs`,`healthCheckMs`]),containment:b({connectMs:{type:`array`,items:y(`buildMs`)},healthCheckMs:{type:`array`,items:m()}},[`healthCheckMs`]),note:m()},[`totalMs`,`additiveParts`,`containment`,`note`]),message:m()},[`action`,`platform`,`deviceId`,`deviceName`,`kind`,`durationMs`,`runner`,`connectMs`,`healthCheckMs`,`timing`,`message`]),push:{type:`object`,oneOf:[b({platform:y(`ios`),bundleId:m(),message:m()},[`platform`,`bundleId`,`message`]),b({platform:y(`android`),package:m(),action:m(),extrasCount:_(),message:m()},[`platform`,`package`,`action`,`extrasCount`,`message`])]},"trigger-app-event":b({event:m(),eventUrl:m(),transport:y(`deep-link`),message:m()},[`event`,`eventUrl`,`transport`,`message`]),clipboard:{type:`object`,oneOf:[b({action:y(`read`),text:m()},[`action`,`text`]),b({action:y(`write`),textLength:_(),message:m()},[`action`,`textLength`,`message`])]},appstate:{type:`object`,oneOf:[b({platform:v([`ios`,`macos`]),appName:m(),appBundleId:m(),source:y(`session`),surface:v(s),device_udid:m(`iOS only — the session device UDID.`),ios_simulator_device_set:{type:[`string`,`null`],description:`iOS only — the simulator set path, or null when unknown.`}},[`platform`,`appName`,`source`,`surface`]),b({platform:y(`android`),package:m(),activity:m()},[`platform`,`package`,`activity`])]},keyboard:b({platform:v([`android`,`ios`]),action:v([`status`,`dismiss`,`enter`]),visible:h(),wasVisible:h(),dismissed:h(),attempts:_(),inputType:m(),type:v([`text`,`number`,`email`,`phone`,`password`,`datetime`,`unknown`]),inputMethodPackage:m(),focusedPackage:m(),focusedResourceId:m(),inputOwner:v([`app`,`ime`,`unknown`]),message:m()},[`platform`,`action`]),doctor:b({status:v([`pass`,`warn`,`fail`,`info`]),summary:m(),kind:v([`auto`,`react-native`,`expo`,`repack`]),platform:m(),target:v(d),targetApp:m(),metro:b({host:m(),port:_()},[`host`,`port`]),checks:{type:`array`,items:b({id:m(),status:v([`pass`,`warn`,`fail`,`info`]),summary:m(),hint:m(),command:m(),evidence:f()},[`id`,`status`,`summary`])}},[`status`,`summary`,`kind`,`checks`]),diff:b({mode:y(`snapshot`),baselineInitialized:h(),summary:b({additions:_(),removals:_(),unchanged:_()},[`additions`,`removals`,`unchanged`]),lines:{type:`array`,items:b({kind:v([`added`,`removed`]),text:m(),ref:m()},[`kind`,`text`])},warnings:x},[`mode`,`baselineInitialized`,`summary`,`lines`]),replay:b({replayed:_(),healed:_(),session:m(),sessionActive:h(`True iff the session is still active — the script had no terminal close.`),artifactPaths:x,snapshotDiagnostics:f(),message:m()},[`replayed`,`healed`,`session`,`sessionActive`,`artifactPaths`,`message`]),test:b({total:_(),executed:_(),passed:_(),failed:_(),skipped:_(),notRun:_(),durationMs:_(),failures:{type:`array`,items:f()},tests:{type:`array`,items:f()},snapshotDiagnostics:f()},[`total`,`executed`,`passed`,`failed`,`skipped`,`notRun`,`durationMs`,`failures`,`tests`]),record:{type:`object`,oneOf:[b({recording:y(`started`),outPath:m(),sessionStateDir:m(),recordingBackend:m(),recordingScope:m(),recordOnlySession:h(),activeSessionApp:f(),showTouches:h()},[`recording`,`outPath`,`sessionStateDir`,`showTouches`]),b({recording:y(`stopped`),outPath:m(),telemetryPath:m(),artifacts:{type:`array`,items:se},recordingBackend:m(),recordingScope:m(),recordOnlySession:h(),activeSessionApp:f(),durationMs:_(),showTouches:h(),warning:m(),overlayWarning:m(),chunks:{type:`array`,items:f()}},[`recording`,`outPath`,`artifacts`,`durationMs`,`showTouches`])]},trace:{type:`object`,oneOf:[b({trace:y(`started`),outPath:m()},[`trace`,`outPath`]),b({trace:y(`stopped`),outPath:m()},[`trace`,`outPath`])]}},de={devices:{type:`object`,properties:{devices:{type:`array`,items:{type:`object`,properties:{platform:{type:`string`,enum:u},target:{type:`string`,enum:d},kind:{type:`string`,enum:g},id:{type:`string`},name:{type:`string`}},required:[`platform`,`target`,`kind`,`id`,`name`]}}},required:[`devices`]},apps:{type:`object`,properties:{apps:{type:`array`,items:{type:`string`}}},required:[`apps`]}},A={...ue,...de};function j(t){return e(t)}function M(e){let t=[`Error (${e.code}): ${e.message}`];e.hint&&t.push(`Hint: ${e.hint}`),e.supportedOn&&t.push(`Supported on: ${e.supportedOn}`);let n=c(e.details);return n&&t.push(n),t.join(`
2
- `)}function N(e,t,n){let r=oe({command:e,cwd:process.cwd(),cliFlags:t}),i={};for(let[t,a]of Object.entries(r))Object.hasOwn(n,t)&&ae(t,e)&&(i[t]=a);return re(i,t)}const P={devices:e=>({devices:e.map(o)}),apps:e=>({apps:e})};function F(e,t){let n=P[e];return n?n(t):t}function I(){let e=new Map;return{pinInput:(t,n,r)=>ve(t,n,B(e,r,n.session)),mergeCommandResult:(t,n,r,i)=>H(e,t,n,r,i),mergeDivergenceScreen:(t,n,r)=>ge(e,V(n,r),t)}}const L=new Set([`snapshot`,`find`]),R=new Set([`press`,`click`,`fill`,`longpress`]),z=new Set([`press`,`click`,`fill`,`longpress`,`get`]);function B(e,t,n){return e.get(V(t,n))}function V(e,t){let n=typeof t==`string`&&t.length>0?t:`default`;return`${e??``}\u0000${n}`}function H(e,t,n,r,i){let a=V(r,i);if(R.has(t)){me(e,a,n);return}L.has(t)&&(t===`find`?pe(e,a,n):fe(e,a,n))}function fe(e,t,n){let r=n.refsGeneration;if(typeof r!=`number`){e.delete(t);return}let i=[];for(let{ref:e}of n.refs??[])i.push(e);for(let e of n.nodes??[])i.push(e.ref);U(e,t,i,r)}function pe(e,t,n){let r=n.refsGeneration,i=n.ref;typeof r!=`number`||typeof i!=`string`||!i.startsWith(`@`)||U(e,t,[i.slice(1)],r)}function me(e,t,n){let{settle:r}=n;r?.refsGeneration!==void 0&&U(e,t,[...r.diff?.lines??[],...r.refs??[],...r.tail??[]].map(e=>e.ref).filter(e=>typeof e==`string`),r.refsGeneration)}function U(e,t,n,r){if(n.length===0)return;let i=e.get(t)??new Map;e.set(t,i),he(i,n,r)}function he(e,t,n){for(let r of t)e.delete(r),e.set(r,n);for(;e.size>1e3;)e.delete(e.keys().next().value)}function ge(e,t,n){let r=a(a(n?.divergence)?.screen);if(r?.state!==`available`)return;let i=r.refsGeneration;if(typeof i!=`number`)return;let o=[];_e(r.refs,o),U(e,t,o,i)}function _e(e,t){if(Array.isArray(e))for(let n of e){let e=a(n)?.ref;typeof e==`string`&&e.length>0&&t.push(e)}}function ve(e,t,n){return n===void 0||n.size===0?t:e===`wait`?ye(t,n)??t:z.has(e)?be(t,n)??t:t}function ye(e,t){if(typeof e.ref!=`string`)return;let n=W(e.ref,t);return n===e.ref?void 0:{...e,ref:n}}function be(e,t){let n=a(e.target);if(n?.kind!==`ref`||typeof n.ref!=`string`)return;let r=W(n.ref,t);return r===n.ref?void 0:{...e,target:{...n,ref:r}}}function W(e,t){if(!e.startsWith(`@`)||e.includes(`~`))return e;let n=t.get(e.slice(1));return n===void 0?e:`${e}~s${n}`}function xe(){return ee().map(e=>{let t=e.name in A?A[e.name]:void 0;return{name:e.name,description:e.description,inputSchema:G(e.name,e.inputSchema),...t?{outputSchema:t}:{}}})}function Se(e={}){let n=I();return{execute:async(r,i)=>{if(!te(r))throw new t(`INVALID_ARGS`,`Unknown command tool: ${r}`);let a=G(r,ne(r).inputSchema).properties,o=N(r,i,a),s=De(o),c=je(o),l=n.pinInput(r,c,s.client.stateDir),u=await Te(e,s.client);try{let t=await(e.runCommand??Ee)(u,r,l);return n.mergeCommandResult(r,t,s.client.stateDir,c.session),{isError:!1,structuredContent:F(r,t),content:[{type:`text`,text:Me({name:r,input:c,result:t,outputFormat:s.outputFormat,responseLevel:s.client.responseLevel})}]}}catch(e){return Ce(e,n,s.client.stateDir,c.session)}}}}function Ce(e,t,n,r){let i=j(e);return t.mergeDivergenceScreen(i.details,n,r),{isError:!0,structuredContent:i,content:[{type:`text`,text:M(i)}]}}const we=Se();async function Te(e,t){if(e.createClient)return await e.createClient(t);let{createAgentDeviceClient:n}=await import(`./agent-device-client.js`).then(e=>e.t);return n(t)}async function Ee(e,t,n){return await(await import(`./command-surface.js`).then(e=>e.t)).runCommand(e,t,n)}function De(e){return{client:Oe(e),outputFormat:Ae(e.mcpOutputFormat)}}function Oe(e){let n=e.stateDir,r=e.includeCost,i=e.responseLevel,a={};if(n!==void 0){if(typeof n!=`string`||n.length===0)throw new t(`INVALID_ARGS`,`Expected stateDir to be a non-empty string.`);a.stateDir=n}if(r!==void 0){if(typeof r!=`boolean`)throw new t(`INVALID_ARGS`,`Expected includeCost to be a boolean.`);r&&(a.cost=!0)}let o=ke(i);return o!==void 0&&(a.responseLevel=o),a}function ke(e){if(e===void 0)return;let r=n.find(t=>t===e);if(r===void 0)throw new t(`INVALID_ARGS`,`Expected responseLevel to be one of 'digest', 'default', or 'full'.`);return r}function Ae(e){if(e===void 0)return`optimized`;if(e!==`optimized`&&e!==`json`)throw new t(`INVALID_ARGS`,`Expected mcpOutputFormat to be "optimized" or "json".`);return e}function je(e){let{stateDir:t,mcpOutputFormat:n,includeCost:r,responseLevel:i,...a}=e;return a}function G(e,t){let n=i(e);return{...t,properties:{...t.properties,...n&&!t.properties?.noRecord?{noRecord:{type:`boolean`,description:`Do not record this action.`}}:{},stateDir:{type:`string`,description:`Agent-device state directory.`},mcpOutputFormat:{type:`string`,enum:[`optimized`,`json`],description:`MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.`},includeCost:{type:`boolean`,description:`Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.`},responseLevel:{type:`string`,enum:[`digest`,`default`,`full`],description:`Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.`}}}}function Me(e){if(e.outputFormat===`json`||e.responseLevel!==void 0&&e.responseLevel!=="default")return K(e.result);let t=ie({name:e.name,input:e.input,result:e.result});return typeof t?.text==`string`?t.text:K(t?.data??e.result)}function K(e){return typeof e==`string`?e:JSON.stringify(e,null,2)}async function Ne(e){if(e.jsonrpc!==`2.0`||typeof e.method!=`string`)return q(e.id??null,-32600,`Invalid JSON-RPC request.`);if(e.id===void 0)return null;try{return Re(e.id,await Pe(e.method,e.params))}catch(t){return t instanceof X?q(e.id,-32601,t.message):q(e.id,-32602,t instanceof Error?t.message:String(t))}}async function Pe(e,t){switch(e){case`initialize`:return{protocolVersion:Ie(t),capabilities:{tools:{}},serverInfo:{name:`agent-device`,version:l()}};case`ping`:return{};case`tools/list`:return{tools:xe()};case`tools/call`:return await Fe(t);default:throw new X(`Unsupported MCP method: ${e}`)}}async function Fe(e){let t=J(e),n=ze(t,`name`);try{return await we.execute(n,Y(t.arguments))}catch(e){return Le(M(j(e)),!0)}}function Ie(e){return`2025-11-25`}function Le(e,t=!1){return{isError:t,content:[{type:`text`,text:e}]}}function Re(e,t){return{jsonrpc:`2.0`,id:e,result:t}}function q(e,t,n){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n}}}function J(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`Expected object parameters.`);return e}function Y(e){return e===void 0?{}:J(e)}function ze(e,n){let r=e[n];if(typeof r!=`string`||r.length===0)throw new t(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r}var X=class extends Error{};async function Be(){let e=Ve(),t=new Ke(t=>{e.push(t)});process.stdin.setEncoding(`utf8`),process.stdin.on(`data`,e=>{try{t.push(e)}catch(e){$({jsonrpc:`2.0`,id:null,error:{code:-32700,message:e instanceof Error?e.message:String(e)}})}}),await new Promise(e=>{process.stdin.on(`end`,e),process.stdin.on(`close`,e),process.stdin.resume()}),await e.idle()}function Ve(e={}){let t=e.handlePayload??He,n=e.write??$,r=Promise.resolve();return{push:e=>{let i=Ge(e);r=r.then(async()=>{let r=await t(e);r&&n(r)}).catch(e=>{n({jsonrpc:`2.0`,id:i,error:{code:-32603,message:e instanceof Error?e.message:String(e)}})})},idle:async()=>{await r}}}function He(e){return Array.isArray(e)?Ue(e):Z(e)}async function Ue(e){let t=[];for(let n of e)t.push(...qe(await Z(n)));return t.length>0?t:null}async function Z(e){let t;try{t=r.parse(e)}catch{return We(Q(e))}return Ne(t)}function We(e){return{jsonrpc:`2.0`,id:e,error:{code:-32600,message:`Invalid JSON-RPC request.`}}}function Ge(e){return Array.isArray(e)?e.length===1?Q(e[0]):null:Q(e)}function Q(e){if(e&&typeof e==`object`&&!Array.isArray(e)){let t=e.id;if(typeof t==`string`||typeof t==`number`||t===null)return t}return null}var Ke=class{buffer=``;sink;constructor(e){this.sink=e}push(e){for(this.buffer+=e;;){let e=this.tryReadLineMessage();if(e!==void 0){this.emit(e);continue}break}}tryReadLineMessage(){let e=this.buffer.indexOf(`
1
+ import{S as e,_ as t,n,o as r}from"./sdk-contracts.js";import{Pt as i,Zt as a,ht as o}from"./viewport-dimension.js";import{C as s,G as c}from"./sdk-batch-runner.js";import{r as l,t as u}from"./sdk-device.js";import{_ as d,g as f,s as p,v as m}from"./registry.js";import{i as ee,n as te,t as ne}from"./command-metadata.js";import{n as re}from"./version.js";import{i as ie,n as ae,r as oe,t as se}from"./cli-config.js";const h=[`simulator`,`emulator`,`device`];function g(e){return{type:`number`,...e?{description:e}:{}}}function _(e,t){return{type:`string`,enum:e,...t?{description:t}:{}}}function v(e){return{type:`string`,const:e}}function y(e,t=[],n){return{type:`object`,...n?{description:n}:{},properties:e,...t.length>0?{required:t}:{}}}const b={type:`array`,items:{type:`string`}},x=y({wallClockMs:g(`Total wall-clock time for the request in milliseconds.`),runnerRoundTrips:g(`Number of real runner round-trips made while serving the request.`),nodeCount:g(`Number of nodes in the original node tree when the response carries one.`)},[`wallClockMs`,`runnerRoundTrips`]),S=y({field:m(),artifactType:m(),path:m(),localPath:m(),fileName:m()},[`field`]);function C(e={}){let t=e.properties??{},n=e.required??[];return y({targetKind:_([`point`,`ref`,`selector`],`Resolved interaction target kind.`),x:g(`Resolved interaction x coordinate when available.`),y:g(`Resolved interaction y coordinate when available.`),referenceWidth:g(`Reference frame width for visualizing the interaction point.`),referenceHeight:g(`Reference frame height for visualizing the interaction point.`),ref:m(`Snapshot ref without the @ prefix when the target was an @ref.`),selector:m(`Selector expression when the target was a selector.`),selectorChain:b,refLabel:m(),targetHittable:f(),hint:m(),warning:m(),message:m(),evidence:T,resolution:ce,cost:x,maestroNonHittableCoordinateFallbackAllowed:f(`Whether the direct iOS Maestro coordinate fallback was allowed for this selector.`),maestroNonHittableCoordinateFallbackUsed:f(`Whether the direct iOS Maestro coordinate fallback was actually used.`),maestroFallbackReason:v(`non-hittable-coordinate`),...t},[`targetKind`,...n])}const w=y({diagnosticRef:m(`Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.`),role:m(`UTF-8 truncated to 256 bytes.`),label:m(`UTF-8 truncated to 256 bytes.`)},[`diagnosticRef`]),ce={type:`object`,description:`Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.`,oneOf:[y({source:v(`runtime`),phase:v(`pre-action`),kind:v(`unique`)},[`source`,`phase`,`kind`]),y({source:v(`runtime`),phase:v(`pre-action`),kind:v(`disambiguated`),matchCount:g(`Total matches resolveSelectorChain found before disambiguation.`),winnerDiagnostic:w,tiebreak:_([`visible`,`deepest`,`smallest-area`],`The comparison that decided the winner.`),alternatives:{type:`array`,description:`At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.`,items:w}},[`source`,`phase`,`kind`,`matchCount`,`winnerDiagnostic`,`tiebreak`]),y({source:v(`ref`),phase:v(`pre-action`),kind:v(`exact`)},[`source`,`phase`,`kind`]),y({source:v(`ref`),phase:v(`pre-action`),kind:v(`label-fallback`)},[`source`,`phase`,`kind`]),y({source:v(`direct-ios`),kind:v(`not-observed`)},[`source`,`kind`])]},T=y({foregroundApp:m(`Foreground app bundle id or name, when the capture carries it.`),nodeCount:g(`Node count in the post-action interactive-only capture.`),interactiveNodeCount:g(`Subset of nodeCount the platform reports as hittable.`),digest:m(`Order-independent digest of the post-action node multiset.`),changedFromBefore:f(`Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.`)},[`nodeCount`,`interactiveNodeCount`,`digest`,`changedFromBefore`]),E=y({settled:f(`Whether the UI held the quiet window before the deadline. false is advisory, not failure.`),waitedMs:g(),captures:g(),quietMs:g(),timeoutMs:g(),refsGeneration:g(`Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.`),refs:{type:`array`,items:y({ref:m(`Plain ref body (e12) minted from the stored settled tree.`)},[`ref`])},diff:y({summary:y({additions:g(),removals:g(),unchanged:g()},[`additions`,`removals`,`unchanged`]),lines:{type:`array`,items:y({kind:_([`added`,`removed`]),text:m(),ref:m(`Plain ref body (e12) for added lines.`)},[`kind`,`text`])},truncated:f(`Lines were capped to the response bound.`)},[`summary`,`lines`],`Settled diff vs the pre-action tree (changed lines only).`),tail:{type:`array`,description:`Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).`,items:y({ref:m(`Plain ref body (e12) minted from the stored settled tree.`),role:m(),label:m()},[`ref`,`role`])},tailTruncated:f(`Present (true) when tail candidates exceeded the response cap.`),hint:m()},[`settled`,`waitedMs`,`captures`,`quietMs`,`timeoutMs`]),D={platform:_(l),target:_(u),device:m(`Human-readable device name.`),id:m(`Stable device id.`),kind:_(h)},O=[`platform`,`target`,`device`,`id`,`kind`],le=y({success:f(),exitCode:g(),stdout:m(),stderr:m(),error:d(`Normalized error detail when shutdown failed.`)},[`success`,`exitCode`,`stdout`,`stderr`]),k=C({properties:{evidence:T,settle:E,button:_([`secondary`,`middle`]),count:g(`Number of press/click repetitions.`),intervalMs:g(`Delay between repeated press/click actions.`),holdMs:g(`Hold duration for each action.`),jitterPx:g(`Randomization radius in pixels.`),doubleTap:f(`Whether the command requested a double-tap action.`)}}),ue={press:k,click:k,fill:C({properties:{text:m(`Text submitted to the field.`),delayMs:g(`Delay between typed characters in milliseconds.`),evidence:T,settle:E},required:[`text`]}),longpress:C({properties:{durationMs:g(),settle:E,gesture:v(`longpress`)}}),find:y({ref:m(`Snapshot ref without the @ prefix when the find action returns one.`),refsGeneration:g(`ADR 0014 ref frame epoch for read-only find actions.`),found:f(`Whether a wait/exists/read-only find satisfied its condition.`),waitedMs:g(`Milliseconds waited for a read-only find condition.`),text:m(`Text value returned by find get_text.`),node:d(`Snapshot node for find get_attrs/get_text.`),locator:m(`Locator kind used for the find action.`),query:m(`Query argument used for the find action.`),x:g(`Resolved x coordinate for mutating find actions.`),y:g(`Resolved y coordinate for mutating find actions.`),message:m(`Diagnostic message for mutating find actions.`),settle:E,cost:x},[],`Daemon response data for the find command.`),boot:y({...D,booted:{type:`boolean`,const:!0}},[...O,`booted`]),shutdown:y({...D,shutdown:le},[...O,`shutdown`]),viewport:y({width:g(),height:g(),message:m()},[`width`,`height`,`message`]),...p,wait:y({waitedMs:g(),kind:v(`selector`),text:m(),selector:m(),captures:g(),nodeCount:g(),hint:m(),warning:m()},[`waitedMs`]),prepare:y({action:v(`ios-runner`),platform:_(l),deviceId:m(),deviceName:m(),kind:_(h),durationMs:g(),runner:y({},[]),cache:_([`exact`,`restore-key`,`miss`,`external`]),artifact:_([`valid`,`rebuilt`]),buildMs:g(),connectMs:g(),healthCheckMs:g(),xctestrunPath:m(),recoveryReason:m(),failureReason:m(),timing:y({totalMs:g(),additiveParts:y({buildMs:g(),connectAfterBuildMs:g(),healthCheckMs:g()},[`connectAfterBuildMs`,`healthCheckMs`]),containment:y({connectMs:{type:`array`,items:v(`buildMs`)},healthCheckMs:{type:`array`,items:m()}},[`healthCheckMs`]),note:m()},[`totalMs`,`additiveParts`,`containment`,`note`]),message:m()},[`action`,`platform`,`deviceId`,`deviceName`,`kind`,`durationMs`,`runner`,`connectMs`,`healthCheckMs`,`timing`,`message`]),push:{type:`object`,oneOf:[y({platform:v(`ios`),bundleId:m(),message:m()},[`platform`,`bundleId`,`message`]),y({platform:v(`android`),package:m(),action:m(),extrasCount:g(),message:m()},[`platform`,`package`,`action`,`extrasCount`,`message`])]},"trigger-app-event":y({event:m(),eventUrl:m(),transport:v(`deep-link`),message:m()},[`event`,`eventUrl`,`transport`,`message`]),clipboard:{type:`object`,oneOf:[y({action:v(`read`),text:m()},[`action`,`text`]),y({action:v(`write`),textLength:g(),message:m()},[`action`,`textLength`,`message`])]},appstate:{type:`object`,oneOf:[y({platform:_([`ios`,`macos`]),appName:m(),appBundleId:m(),source:v(`session`),surface:_(i),device_udid:m(`iOS only — the session device UDID.`),ios_simulator_device_set:{type:[`string`,`null`],description:`iOS only — the simulator set path, or null when unknown.`}},[`platform`,`appName`,`source`,`surface`]),y({platform:v(`android`),package:m(),activity:m()},[`platform`,`package`,`activity`])]},keyboard:y({platform:_([`android`,`ios`]),action:_([`status`,`dismiss`,`enter`]),visible:f(),wasVisible:f(),dismissed:f(),attempts:g(),inputType:m(),type:_([`text`,`number`,`email`,`phone`,`password`,`datetime`,`unknown`]),inputMethodPackage:m(),focusedPackage:m(),focusedResourceId:m(),inputOwner:_([`app`,`ime`,`unknown`]),message:m()},[`platform`,`action`]),doctor:y({status:_([`pass`,`warn`,`fail`,`info`]),summary:m(),kind:_([`auto`,`react-native`,`expo`,`repack`]),platform:m(),target:_(u),targetApp:m(),metro:y({host:m(),port:g()},[`host`,`port`]),checks:{type:`array`,items:y({id:m(),status:_([`pass`,`warn`,`fail`,`info`]),summary:m(),hint:m(),command:m(),evidence:d()},[`id`,`status`,`summary`])}},[`status`,`summary`,`kind`,`checks`]),diff:y({mode:v(`snapshot`),baselineInitialized:f(),summary:y({additions:g(),removals:g(),unchanged:g()},[`additions`,`removals`,`unchanged`]),lines:{type:`array`,items:y({kind:_([`added`,`removed`]),text:m(),ref:m()},[`kind`,`text`])},warnings:b},[`mode`,`baselineInitialized`,`summary`,`lines`]),replay:y({replayed:g(),healed:g(),session:m(),sessionActive:f(`True iff the session is still active — the script had no terminal close.`),artifactPaths:b,snapshotDiagnostics:d(),message:m()},[`replayed`,`healed`,`session`,`sessionActive`,`artifactPaths`,`message`]),test:y({total:g(),executed:g(),passed:g(),failed:g(),skipped:g(),notRun:g(),durationMs:g(),failures:{type:`array`,items:d()},tests:{type:`array`,items:d()},snapshotDiagnostics:d()},[`total`,`executed`,`passed`,`failed`,`skipped`,`notRun`,`durationMs`,`failures`,`tests`]),record:{type:`object`,oneOf:[y({recording:v(`started`),outPath:m(),sessionStateDir:m(),recordingBackend:m(),recordingScope:m(),recordOnlySession:f(),activeSessionApp:d(),showTouches:f()},[`recording`,`outPath`,`sessionStateDir`,`showTouches`]),y({recording:v(`stopped`),outPath:m(),telemetryPath:m(),artifacts:{type:`array`,items:S},recordingBackend:m(),recordingScope:m(),recordOnlySession:f(),activeSessionApp:d(),durationMs:g(),showTouches:f(),warning:m(),overlayWarning:m(),chunks:{type:`array`,items:d()}},[`recording`,`outPath`,`artifacts`,`durationMs`,`showTouches`])]},trace:{type:`object`,oneOf:[y({trace:v(`started`),outPath:m()},[`trace`,`outPath`]),y({trace:v(`stopped`),outPath:m(),artifacts:{type:`array`,items:S}},[`trace`,`outPath`,`artifacts`])]}},de={devices:{type:`object`,properties:{devices:{type:`array`,items:{type:`object`,properties:{platform:{type:`string`,enum:l},target:{type:`string`,enum:u},kind:{type:`string`,enum:h},id:{type:`string`},name:{type:`string`}},required:[`platform`,`target`,`kind`,`id`,`name`]}}},required:[`devices`]},apps:{type:`object`,properties:{apps:{type:`array`,items:{type:`string`}}},required:[`apps`]}},A={...ue,...de};function j(t){return e(t)}function M(e){let t=[`Error (${e.code}): ${e.message}`];e.hint&&t.push(`Hint: ${e.hint}`),e.supportedOn&&t.push(`Supported on: ${e.supportedOn}`);let n=o(e.details);return n&&t.push(n),t.join(`
2
+ `)}function N(e,t,n){let r=se({command:e,cwd:process.cwd(),cliFlags:t}),i={};for(let[t,a]of Object.entries(r))Object.hasOwn(n,t)&&oe(t,e)&&(i[t]=a);return ie(i,t)}const P={devices:e=>({devices:e.map(a)}),apps:e=>({apps:e})};function F(e,t){let n=P[e];return n?n(t):t}function I(){let e=new Map;return{pinInput:(t,n,r)=>ve(t,n,B(e,r,n.session)),mergeCommandResult:(t,n,r,i)=>H(e,t,n,r,i),mergeDivergenceScreen:(t,n,r)=>ge(e,V(n,r),t)}}const L=new Set([`snapshot`,`find`]),R=new Set([`press`,`click`,`fill`,`longpress`]),z=new Set([`press`,`click`,`fill`,`longpress`,`get`]);function B(e,t,n){return e.get(V(t,n))}function V(e,t){let n=typeof t==`string`&&t.length>0?t:`default`;return`${e??``}\u0000${n}`}function H(e,t,n,r,i){let a=V(r,i);if(R.has(t)){me(e,a,n);return}L.has(t)&&(t===`find`?pe(e,a,n):fe(e,a,n))}function fe(e,t,n){let r=n.refsGeneration;if(typeof r!=`number`){e.delete(t);return}let i=[];for(let{ref:e}of n.refs??[])i.push(e);for(let e of n.nodes??[])i.push(e.ref);U(e,t,i,r)}function pe(e,t,n){let r=n.refsGeneration,i=n.ref;typeof r!=`number`||typeof i!=`string`||!i.startsWith(`@`)||U(e,t,[i.slice(1)],r)}function me(e,t,n){let{settle:r}=n;r?.refsGeneration!==void 0&&U(e,t,[...r.diff?.lines??[],...r.refs??[],...r.tail??[]].map(e=>e.ref).filter(e=>typeof e==`string`),r.refsGeneration)}function U(e,t,n,r){if(n.length===0)return;let i=e.get(t)??new Map;e.set(t,i),he(i,n,r)}function he(e,t,n){for(let r of t)e.delete(r),e.set(r,n);for(;e.size>1e3;)e.delete(e.keys().next().value)}function ge(e,t,n){let r=c(c(n?.divergence)?.screen);if(r?.state!==`available`)return;let i=r.refsGeneration;if(typeof i!=`number`)return;let a=[];_e(r.refs,a),U(e,t,a,i)}function _e(e,t){if(Array.isArray(e))for(let n of e){let e=c(n)?.ref;typeof e==`string`&&e.length>0&&t.push(e)}}function ve(e,t,n){return n===void 0||n.size===0?t:e===`wait`?ye(t,n)??t:z.has(e)?be(t,n)??t:t}function ye(e,t){if(typeof e.ref!=`string`)return;let n=W(e.ref,t);return n===e.ref?void 0:{...e,ref:n}}function be(e,t){let n=c(e.target);if(n?.kind!==`ref`||typeof n.ref!=`string`)return;let r=W(n.ref,t);return r===n.ref?void 0:{...e,target:{...n,ref:r}}}function W(e,t){if(!e.startsWith(`@`)||e.includes(`~`))return e;let n=t.get(e.slice(1));return n===void 0?e:`${e}~s${n}`}function xe(){return ee().map(e=>{let t=e.name in A?A[e.name]:void 0;return{name:e.name,description:e.description,inputSchema:G(e.name,e.inputSchema),...t?{outputSchema:t}:{}}})}function Se(e={}){let n=I();return{execute:async(r,i)=>{if(!te(r))throw new t(`INVALID_ARGS`,`Unknown command tool: ${r}`);let a=G(r,ne(r).inputSchema).properties,o=N(r,i,a),s=De(o),c=je(o),l=n.pinInput(r,c,s.client.stateDir),u=await Te(e,s.client);try{let t=await(e.runCommand??Ee)(u,r,l);return n.mergeCommandResult(r,t,s.client.stateDir,c.session),{isError:!1,structuredContent:F(r,t),content:[{type:`text`,text:Me({name:r,input:c,result:t,outputFormat:s.outputFormat,responseLevel:s.client.responseLevel})}]}}catch(e){return Ce(e,n,s.client.stateDir,c.session)}}}}function Ce(e,t,n,r){let i=j(e);return t.mergeDivergenceScreen(i.details,n,r),{isError:!0,structuredContent:i,content:[{type:`text`,text:M(i)}]}}const we=Se();async function Te(e,t){if(e.createClient)return await e.createClient(t);let{createAgentDeviceClient:n}=await import(`./agent-device-client.js`).then(e=>e.t);return n(t)}async function Ee(e,t,n){return await(await import(`./command-surface.js`).then(e=>e.t)).runCommand(e,t,n)}function De(e){return{client:Oe(e),outputFormat:Ae(e.mcpOutputFormat)}}function Oe(e){let n=e.stateDir,r=e.includeCost,i=e.responseLevel,a={};if(n!==void 0){if(typeof n!=`string`||n.length===0)throw new t(`INVALID_ARGS`,`Expected stateDir to be a non-empty string.`);a.stateDir=n}if(r!==void 0){if(typeof r!=`boolean`)throw new t(`INVALID_ARGS`,`Expected includeCost to be a boolean.`);r&&(a.cost=!0)}let o=ke(i);return o!==void 0&&(a.responseLevel=o),a}function ke(e){if(e===void 0)return;let r=n.find(t=>t===e);if(r===void 0)throw new t(`INVALID_ARGS`,`Expected responseLevel to be one of 'digest', 'default', or 'full'.`);return r}function Ae(e){if(e===void 0)return`optimized`;if(e!==`optimized`&&e!==`json`)throw new t(`INVALID_ARGS`,`Expected mcpOutputFormat to be "optimized" or "json".`);return e}function je(e){let{stateDir:t,mcpOutputFormat:n,includeCost:r,responseLevel:i,...a}=e;return a}function G(e,t){let n=s(e);return{...t,properties:{...t.properties,...n&&!t.properties?.noRecord?{noRecord:{type:`boolean`,description:`Do not record this action.`}}:{},stateDir:{type:`string`,description:`Agent-device state directory.`},mcpOutputFormat:{type:`string`,enum:[`optimized`,`json`],description:`MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.`},includeCost:{type:`boolean`,description:`Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.`},responseLevel:{type:`string`,enum:[`digest`,`default`,`full`],description:`Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.`}}}}function Me(e){if(e.outputFormat===`json`||e.responseLevel!==void 0&&e.responseLevel!=="default")return K(e.result);let t=ae({name:e.name,input:e.input,result:e.result});return typeof t?.text==`string`?t.text:K(t?.data??e.result)}function K(e){return typeof e==`string`?e:JSON.stringify(e,null,2)}async function Ne(e){if(e.jsonrpc!==`2.0`||typeof e.method!=`string`)return q(e.id??null,-32600,`Invalid JSON-RPC request.`);if(e.id===void 0)return null;try{return Re(e.id,await Pe(e.method,e.params))}catch(t){return t instanceof X?q(e.id,-32601,t.message):q(e.id,-32602,t instanceof Error?t.message:String(t))}}async function Pe(e,t){switch(e){case`initialize`:return{protocolVersion:Ie(t),capabilities:{tools:{}},serverInfo:{name:`agent-device`,version:re()}};case`ping`:return{};case`tools/list`:return{tools:xe()};case`tools/call`:return await Fe(t);default:throw new X(`Unsupported MCP method: ${e}`)}}async function Fe(e){let t=J(e),n=ze(t,`name`);try{return await we.execute(n,Y(t.arguments))}catch(e){return Le(M(j(e)),!0)}}function Ie(e){return`2025-11-25`}function Le(e,t=!1){return{isError:t,content:[{type:`text`,text:e}]}}function Re(e,t){return{jsonrpc:`2.0`,id:e,result:t}}function q(e,t,n){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n}}}function J(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`Expected object parameters.`);return e}function Y(e){return e===void 0?{}:J(e)}function ze(e,n){let r=e[n];if(typeof r!=`string`||r.length===0)throw new t(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r}var X=class extends Error{};async function Be(){let e=Ve(),t=new Ke(t=>{e.push(t)});process.stdin.setEncoding(`utf8`),process.stdin.on(`data`,e=>{try{t.push(e)}catch(e){$({jsonrpc:`2.0`,id:null,error:{code:-32700,message:e instanceof Error?e.message:String(e)}})}}),await new Promise(e=>{process.stdin.on(`end`,e),process.stdin.on(`close`,e),process.stdin.resume()}),await e.idle()}function Ve(e={}){let t=e.handlePayload??He,n=e.write??$,r=Promise.resolve();return{push:e=>{let i=Ge(e);r=r.then(async()=>{let r=await t(e);r&&n(r)}).catch(e=>{n({jsonrpc:`2.0`,id:i,error:{code:-32603,message:e instanceof Error?e.message:String(e)}})})},idle:async()=>{await r}}}function He(e){return Array.isArray(e)?Ue(e):Z(e)}async function Ue(e){let t=[];for(let n of e)t.push(...qe(await Z(n)));return t.length>0?t:null}async function Z(e){let t;try{t=r.parse(e)}catch{return We(Q(e))}return Ne(t)}function We(e){return{jsonrpc:`2.0`,id:e,error:{code:-32600,message:`Invalid JSON-RPC request.`}}}function Ge(e){return Array.isArray(e)?e.length===1?Q(e[0]):null:Q(e)}function Q(e){if(e&&typeof e==`object`&&!Array.isArray(e)){let t=e.id;if(typeof t==`string`||typeof t==`number`||t===null)return t}return null}var Ke=class{buffer=``;sink;constructor(e){this.sink=e}push(e){for(this.buffer+=e;;){let e=this.tryReadLineMessage();if(e!==void 0){this.emit(e);continue}break}}tryReadLineMessage(){let e=this.buffer.indexOf(`
3
3
  `);if(e===-1)return;let t=this.buffer.slice(0,e).trim();return this.buffer=this.buffer.slice(e+1),t.length>0?t:void 0}emit(e){this.sink(JSON.parse(e))}};function qe(e){return e?[e]:[]}function $(e){process.stdout.write(`${JSON.stringify(e)}\n`)}export{Be as runAgentDeviceMcpServer};
@@ -1 +1 @@
1
- import{a as e,dt as t,gt as n,l as r,pt as i,s as a,vt as o,yt as s}from"./sdk-selectors.js";import{a as c,i as l,o as u,u as d}from"./android-input-method-overlays.js";import{Ht as f}from"./internal/daemon.js";function p(e,t={}){let n=t.mode??`action`,{node:r,preActionNodes:i}=e;if(typeof r.index!=`number`)return;let a=c(i),o=S(_(r),i);if(n===`landmark`&&o.id===void 0&&o.label===void 0)return;let s=l(r,a,8),u=s.chain,d=v(i,r),f=y(r,a),p=x(r),b=+(u.length>0),w=e=>{let t=u.slice(0,e),n=C({nodes:i,byIndex:a,node:r,identity:o,ancestry:t,sibling:d,scrollRegion:f});return{candidate:{...o,ancestry:t,sibling:d,viewportOrder:n.viewportOrder,...f?{scrollRegion:f}:{},...p?{rect:p}:{},verification:`verified`},domain:n}};for(let e=u.length;e>=b;--e){let{candidate:t,domain:i}=w(e);if(h(t))return t.verification=m({node:r,domain:i,mode:n,brokenWalk:s.broken}),t;if(e===b)return g(t)}}function m(e){return e.brokenWalk?`unverifiable`:e.mode===`landmark`?`verified`:T({node:e.node,domain:e.domain})}function h(e){return s(o({...e,verification:`unverifiable`}))<=t}function g(e){return e.verification=`unverifiable`,s(o(e))>4096&&delete e.rect,e}const _=a;function v(e,t){return r(e,t)}function y(e,t){let n=f(e,t);if(!n)return;let r=_(n);return{role:r.role,...r.id===void 0?r.label===void 0?{}:{label:r.label}:{id:r.id}}}function b(e,t){return!e&&!t?!0:!e||!t?!1:n(e,t)}function x(e){let t=e.rect;if(t)return{x:t.x,y:t.y,width:t.width,height:t.height}}function S(t,n){return e(t,n)}function C(e){let{nodes:t,byIndex:n,node:r,identity:i,ancestry:a,sibling:o,scrollRegion:s}=e,c=u(t,n,i,a),l=c.filter(e=>v(t,e)===o),d=c.length>0?c.filter(e=>b(y(e,n),s)):void 0,f=d?w(d):[];return{identitySet:c,siblingMatches:l,regionMembers:d,orderedRegion:f,viewportOrder:Math.max(f.findIndex(e=>e.index===r.index),0)}}function w(e){return e.map((e,t)=>({node:e,documentOrder:t,center:d(e.rect)})).sort((e,t)=>!e.center&&!t.center?e.documentOrder-t.documentOrder:e.center?t.center?e.center.y===t.center.y?e.center.x===t.center.x?e.documentOrder-t.documentOrder:e.center.x-t.center.x:e.center.y-t.center.y:-1:1).map(e=>e.node)}function T(e){let{node:t,domain:n}=e,r=t.ref,a=n.identitySet.map(e=>e.ref);return i({winnerRef:r,matchedRefs:a,identitySetRefs:a,siblingMatchRefs:n.siblingMatches.map(e=>e.ref),regionMemberRefs:n.regionMembers?.map(e=>e.ref),viewportCandidateRef:n.orderedRegion[n.viewportOrder]?.ref}).outcome}export{w as a,p as i,y as n,b as o,v as r,_ as t};
1
+ import{B as e,H as t,K as n,V as r,W as i,Y as a}from"./viewport-dimension.js";import{a as o,l as s,s as c}from"./sdk-selectors.js";import{tn as l}from"./internal/daemon.js";import{TARGET_ANNOTATION_MAX_ANCESTRY as u,TARGET_ANNOTATION_MAX_PAYLOAD_BYTES as d,serializeTargetAnnotationV1 as f,utf8ByteLength as p}from"@agent-device/ad-script";function m(t,n={}){let i=n.mode??`action`,{node:a,preActionNodes:o}=t;if(typeof a.index!=`number`)return;let s=r(o),c=C(v(a),o);if(i===`landmark`&&c.id===void 0&&c.label===void 0)return;let l=e(a,s,u),d=l.chain,f=y(o,a),p=b(a,s),m=S(a),x=+(d.length>0),T=e=>{let t=d.slice(0,e),n=w({nodes:o,byIndex:s,node:a,identity:c,ancestry:t,sibling:f,scrollRegion:p});return{candidate:{...c,ancestry:t,sibling:f,viewportOrder:n.viewportOrder,...p?{scrollRegion:p}:{},...m?{rect:m}:{},verification:`verified`},domain:n}};for(let e=d.length;e>=x;--e){let{candidate:t,domain:n}=T(e);if(g(t))return t.verification=h({node:a,domain:n,mode:i,brokenWalk:l.broken}),t;if(e===x)return _(t)}}function h(e){return e.brokenWalk?`unverifiable`:e.mode===`landmark`?`verified`:E({node:e.node,domain:e.domain})}function g(e){return p(f({...e,verification:`unverifiable`}))<=d}function _(e){return e.verification=`unverifiable`,p(f(e))>d&&delete e.rect,e}const v=c;function y(e,t){return s(e,t)}function b(e,t){let n=l(e,t);if(!n)return;let r=v(n);return{role:r.role,...r.id===void 0?r.label===void 0?{}:{label:r.label}:{id:r.id}}}function x(e,t){return!e&&!t?!0:!e||!t?!1:n(e,t)}function S(e){let t=e.rect;if(t)return{x:t.x,y:t.y,width:t.width,height:t.height}}function C(e,t){return o(e,t)}function w(e){let{nodes:n,byIndex:r,node:i,identity:a,ancestry:o,sibling:s,scrollRegion:c}=e,l=t(n,r,a,o),u=l.filter(e=>y(n,e)===s),d=l.length>0?l.filter(e=>x(b(e,r),c)):void 0,f=d?T(d):[];return{identitySet:l,siblingMatches:u,regionMembers:d,orderedRegion:f,viewportOrder:Math.max(f.findIndex(e=>e.index===i.index),0)}}function T(e){return e.map((e,t)=>({node:e,documentOrder:t,center:a(e.rect)})).sort((e,t)=>!e.center&&!t.center?e.documentOrder-t.documentOrder:e.center?t.center?e.center.y===t.center.y?e.center.x===t.center.x?e.documentOrder-t.documentOrder:e.center.x-t.center.x:e.center.y-t.center.y:-1:1).map(e=>e.node)}function E(e){let{node:t,domain:n}=e,r=t.ref,a=n.identitySet.map(e=>e.ref);return i({winnerRef:r,matchedRefs:a,identitySetRefs:a,siblingMatchRefs:n.siblingMatches.map(e=>e.ref),regionMemberRefs:n.regionMembers?.map(e=>e.ref),viewportCandidateRef:n.orderedRegion[n.viewportOrder]?.ref}).outcome}export{T as a,m as i,b as n,x as o,y as r,v as t};