agent-device 0.19.2 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +61 -70
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.0.apk +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.0.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.0.manifest.json +10 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.0.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.0.apk.sha256 +1 -0
  7. package/{android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.2.manifest.json → android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.0.manifest.json} +6 -6
  8. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +2 -0
  9. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +5 -0
  10. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +12 -10
  11. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +154 -185
  12. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +113 -19
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +82 -0
  14. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +275 -113
  15. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +2 -2
  16. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +150 -104
  17. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +56 -2
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +73 -0
  19. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +44 -14
  20. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +2 -2
  21. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +2 -106
  22. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +126 -11
  23. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +51 -8
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +24 -0
  25. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +1 -1
  26. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +43 -35
  27. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +14 -0
  28. package/dist/src/agent-browser-tool.js +1 -1
  29. package/dist/src/agent-device-client.js +3 -0
  30. package/dist/src/android-adb.d.ts +1 -1
  31. package/dist/src/android-adb.js +1 -1
  32. package/dist/src/android-input-method-overlays.js +1 -0
  33. package/dist/src/android-input-ownership.js +1 -6
  34. package/dist/src/android-system-chrome.js +1 -0
  35. package/dist/src/android.js +1 -1
  36. package/dist/src/app-lifecycle.js +5 -5
  37. package/dist/src/app-log-request-scope.js +1 -0
  38. package/dist/src/app-resolution.js +1 -0
  39. package/dist/src/apple-multitouch-support.js +1 -0
  40. package/dist/src/apps.js +5 -5
  41. package/dist/src/audio-probe.js +1 -1
  42. package/dist/src/boot-diagnostics.js +2 -0
  43. package/dist/src/cli-config.js +1 -0
  44. package/dist/src/cli-help.js +64 -30
  45. package/dist/src/cli-runner.js +1 -1
  46. package/dist/src/cli.js +15 -11
  47. package/dist/src/command-schema.js +3 -3
  48. package/dist/src/config.js +1 -0
  49. package/dist/src/context.js +1 -0
  50. package/dist/src/contracts.d.ts +1 -1
  51. package/dist/src/contracts.js +1 -1
  52. package/dist/src/daemon-shutdown-report.js +1 -0
  53. package/dist/src/debug-symbols.js +1 -1
  54. package/dist/src/device-input-state.js +1 -1
  55. package/dist/src/devices2.js +1 -1
  56. package/dist/src/find.js +1 -1
  57. package/dist/src/finders.js +1 -1
  58. package/dist/src/generic.js +1 -1
  59. package/dist/src/helper.js +1 -1
  60. package/dist/src/index.d.ts +412 -289
  61. package/dist/src/index.js +1 -1
  62. package/dist/src/input-actions.js +4 -3
  63. package/dist/src/input-actions2.js +1 -1
  64. package/dist/src/install-artifact.js +1 -0
  65. package/dist/src/install-source.d.ts +5 -1
  66. package/dist/src/install-source.js +1 -1
  67. package/dist/src/install-source2.js +1 -1
  68. package/dist/src/interaction-snapshot.js +1 -1
  69. package/dist/src/interaction.d.ts +230 -0
  70. package/dist/src/interaction.js +1 -1
  71. package/dist/src/interactor.js +2 -2
  72. package/dist/src/internal/bin.js +1 -1
  73. package/dist/src/internal/daemon.js +43 -17
  74. package/dist/src/internal/png-worker.d.ts +22 -0
  75. package/dist/src/internal/png-worker.js +1 -1
  76. package/dist/src/launch-console.js +1 -0
  77. package/dist/src/lease-context.js +1 -0
  78. package/dist/src/lease.js +1 -1
  79. package/dist/src/linux.js +1 -1
  80. package/dist/src/logcat.js +5 -0
  81. package/dist/src/metro.d.ts +2 -2
  82. package/dist/src/notifications.js +1 -1
  83. package/dist/src/png-worker-contract.js +1 -1
  84. package/dist/src/process-lock.js +1 -0
  85. package/dist/src/react-native.js +1 -1
  86. package/dist/src/record-trace.js +1 -1
  87. package/dist/src/register-builtins.js +1 -0
  88. package/dist/src/registry.js +24 -24
  89. package/dist/src/reporting.js +8 -7
  90. package/dist/src/runner-client.js +1 -1
  91. package/dist/src/runner-disposal.js +2 -0
  92. package/dist/src/runner-lease.js +1 -0
  93. package/dist/src/runner-sequence.js +1 -1
  94. package/dist/src/runtime-transport.js +1 -1
  95. package/dist/src/runtime.js +3 -3
  96. package/dist/src/runtime2.js +1 -0
  97. package/dist/src/sdk-android-adb.d.ts +119 -33
  98. package/dist/src/sdk-android-adb.js +4 -4
  99. package/dist/src/sdk-app-inventory.js +1 -1
  100. package/dist/src/sdk-batch-runner.d.ts +2 -1
  101. package/dist/src/sdk-batch-runner.js +2 -2
  102. package/dist/src/sdk-batch.js +2 -2
  103. package/dist/src/sdk-contracts.d.ts +105 -98
  104. package/dist/src/sdk-contracts.js +2 -2
  105. package/dist/src/sdk-device.js +1 -0
  106. package/dist/src/sdk-finders.d.ts +3 -3
  107. package/dist/src/sdk-finders.js +1 -1
  108. package/dist/src/sdk-io.d.ts +1 -1
  109. package/dist/src/sdk-io.js +1 -1
  110. package/dist/src/sdk-remote-config.d.ts +9 -1
  111. package/dist/src/sdk-remote-config.js +1 -1
  112. package/dist/src/sdk-selectors.js +1 -1
  113. package/dist/src/selector-runtime.js +1 -1
  114. package/dist/src/selector-vocabulary.js +1 -0
  115. package/dist/src/selectors.d.ts +12 -3
  116. package/dist/src/selectors.js +1 -1
  117. package/dist/src/server.js +3 -3
  118. package/dist/src/session-target-evidence.js +1 -0
  119. package/dist/src/session.js +8 -10
  120. package/dist/src/setting-state.js +1 -1
  121. package/dist/src/simulator.js +1 -1
  122. package/dist/src/snapshot-diagnostics.js +5 -2
  123. package/dist/src/snapshot.js +1 -1
  124. package/dist/src/snapshot2.js +1 -2
  125. package/dist/src/tool-provider.js +2 -2
  126. package/dist/src/tool-provider2.js +1 -1
  127. package/dist/src/tv-remote.js +13 -12
  128. package/dist/src/url.js +1 -1
  129. package/dist/src/web.js +1 -1
  130. package/package.json +33 -20
  131. package/server.json +2 -2
  132. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.2.apk +0 -0
  133. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.2.apk.sha256 +0 -1
  134. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.2.manifest.json +0 -10
  135. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.2.apk +0 -0
  136. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.2.apk.sha256 +0 -1
  137. package/dist/src/apple-runner-options.js +0 -1
  138. package/dist/src/cli-output.js +0 -1
  139. package/dist/src/client.js +0 -3
  140. package/dist/src/handler-utils.js +0 -1
  141. package/dist/src/output-path.js +0 -1
  142. package/dist/src/points.js +0 -4
  143. package/dist/src/provider.js +0 -1
  144. package/dist/src/providers.js +0 -1
  145. package/dist/src/record-trace-recording.js +0 -23
  146. package/dist/src/recording-provider.js +0 -1
  147. package/dist/src/selectors2.js +0 -1
  148. package/dist/src/simctl.js +0 -1
  149. package/dist/src/snapshot-helper.js +0 -5
  150. package/dist/src/ttl-memo.js +0 -1
  151. package/dist/src/xml.js +0 -2
  152. /package/{macos-helper → apple/macos-helper}/Package.swift +0 -0
  153. /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +0 -0
  154. /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +0 -0
  155. /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/main.swift +0 -0
  156. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +0 -0
  157. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -0
  158. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  159. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
  160. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
  161. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
  162. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
  163. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
  164. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +0 -0
  165. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +0 -0
  166. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
  167. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
  168. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -0
  169. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +0 -0
  170. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
  171. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +0 -0
  172. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +0 -0
  173. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
  174. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
  175. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
  176. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
  177. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
  178. /package/{src/platforms/linux → linux}/atspi-dump.py +0 -0
@@ -1,4 +1,4 @@
1
- import { B as PlatformSelector, R as DeviceTarget, c as DaemonServerMode, l as DaemonTransportPreference, p as LeaseBackend, v as SessionIsolationMode, y as SessionRuntimeHints } from "./sdk-contracts.js";
1
+ import { U as PlatformSelector, V as DeviceTarget, b as SessionIsolationMode, l as DaemonServerMode, m as LeaseBackend, u as DaemonTransportPreference, x as SessionRuntimeHints } from "./sdk-contracts.js";
2
2
  //#region src/client/client-companion-tunnel-contract.d.ts
3
3
  type CompanionTunnelScope = {
4
4
  tenantId: string;
@@ -75,11 +75,18 @@ type PrepareMetroRuntimeResult = {
75
75
  androidRuntime: MetroRuntimeHints;
76
76
  bridge: MetroBridgeResult | null;
77
77
  };
78
+ /**
79
+ * `transport` says which channel delivered the reload: `http` for the classic GET /reload route,
80
+ * `message-socket` for the /message websocket broadcast used when the server has no HTTP reload
81
+ * route (Expo). `status`/`body` always describe the HTTP probe; on the websocket path `reloadUrl`
82
+ * is the ws(s) message-socket URL.
83
+ */
78
84
  type ReloadMetroResult = {
79
85
  reloaded: true;
80
86
  reloadUrl: string;
81
87
  status: number;
82
88
  body: string;
89
+ transport: 'http' | 'message-socket';
83
90
  };
84
91
  //#endregion
85
92
  //#region src/remote/remote-config-schema.d.ts
@@ -97,6 +104,7 @@ type RemoteConfigMetroOptions = {
97
104
  metroRuntimeFile?: string;
98
105
  metroNoReuseExisting?: boolean;
99
106
  metroNoInstallDeps?: boolean;
107
+ launchUrl?: string;
100
108
  };
101
109
  type RemoteConnectionProfileFields = {
102
110
  stateDir?: string;
@@ -1 +1 @@
1
- import{l as e}from"./sdk-contracts.js";import{E as t}from"./sdk-android-adb.js";const n=[{key:`stateDir`,type:`string`,path:!0},{key:`daemonBaseUrl`,type:`string`},{key:`daemonAuthToken`,type:`string`},{key:`daemonTransport`,type:`enum`,enumValues:[`auto`,`socket`,`http`]},{key:`daemonServerMode`,type:`enum`,enumValues:[`socket`,`http`,`dual`]},{key:`tenant`,type:`string`},{key:`sessionIsolation`,type:`enum`,enumValues:[`none`,`tenant`]},{key:`runId`,type:`string`},{key:`leaseId`,type:`string`},{key:`leaseBackend`,type:`enum`,enumValues:[`ios-simulator`,`ios-instance`,`android-instance`]},{key:`platform`,type:`enum`,enumValues:e},{key:`target`,type:`enum`,enumValues:[`mobile`,`tv`,`desktop`]},{key:`device`,type:`string`},{key:`udid`,type:`string`},{key:`serial`,type:`string`},{key:`iosSimulatorDeviceSet`,type:`string`,path:!0,env:!1},{key:`androidDeviceAllowlist`,type:`string`},{key:`session`,type:`string`},{key:`providerApp`,type:`string`},{key:`providerOsVersion`,type:`string`},{key:`providerProject`,type:`string`},{key:`providerBuild`,type:`string`},{key:`providerSessionName`,type:`string`},{key:`awsProjectArn`,type:`string`},{key:`awsDeviceArn`,type:`string`},{key:`awsAppArn`,type:`string`},{key:`awsRegion`,type:`string`},{key:`awsInteractionMode`,type:`enum`,enumValues:[`INTERACTIVE`,`NO_VIDEO`,`VIDEO_ONLY`]},{key:`metroProjectRoot`,type:`string`,path:!0},{key:`metroKind`,type:`enum`,enumValues:[`auto`,`react-native`,`expo`,`repack`]},{key:`metroPublicBaseUrl`,type:`string`},{key:`metroProxyBaseUrl`,type:`string`},{key:`metroBearerToken`,type:`string`},{key:`metroPreparePort`,type:`int`,min:1,max:65535},{key:`metroListenHost`,type:`string`},{key:`metroStatusHost`,type:`string`},{key:`metroStartupTimeoutMs`,type:`int`,min:1},{key:`metroProbeTimeoutMs`,type:`int`,min:1},{key:`metroRuntimeFile`,type:`string`,path:!0},{key:`metroNoReuseExisting`,type:`boolean`},{key:`metroNoInstallDeps`,type:`boolean`}],r=[{key:`leaseProvider`,type:`string`,env:!1},{key:`deviceKey`,type:`string`,env:!1},{key:`clientId`,type:`string`,env:!1}],i=[...n,...r],a=new Map(i.map(e=>[e.key,e]));function o(e){return a.get(e)}function s(e){return o(e)?.env===!1?[]:[t(e)]}export{o as i,i as n,s as r,n as t};
1
+ import{E as e}from"./sdk-android-adb.js";import{n as t}from"./sdk-device.js";const n=[{key:`stateDir`,type:`string`,path:!0},{key:`daemonBaseUrl`,type:`string`},{key:`daemonAuthToken`,type:`string`},{key:`daemonTransport`,type:`enum`,enumValues:[`auto`,`socket`,`http`]},{key:`daemonServerMode`,type:`enum`,enumValues:[`socket`,`http`,`dual`]},{key:`tenant`,type:`string`},{key:`sessionIsolation`,type:`enum`,enumValues:[`none`,`tenant`]},{key:`runId`,type:`string`},{key:`leaseId`,type:`string`},{key:`leaseBackend`,type:`enum`,enumValues:[`ios-simulator`,`ios-instance`,`android-instance`]},{key:`platform`,type:`enum`,enumValues:t},{key:`target`,type:`enum`,enumValues:[`mobile`,`tv`,`desktop`]},{key:`device`,type:`string`},{key:`udid`,type:`string`},{key:`serial`,type:`string`},{key:`iosSimulatorDeviceSet`,type:`string`,path:!0,env:!1},{key:`androidDeviceAllowlist`,type:`string`},{key:`session`,type:`string`},{key:`providerApp`,type:`string`},{key:`providerOsVersion`,type:`string`},{key:`providerProject`,type:`string`},{key:`providerBuild`,type:`string`},{key:`providerSessionName`,type:`string`},{key:`awsProjectArn`,type:`string`},{key:`awsDeviceArn`,type:`string`},{key:`awsAppArn`,type:`string`},{key:`awsRegion`,type:`string`},{key:`awsInteractionMode`,type:`enum`,enumValues:[`INTERACTIVE`,`NO_VIDEO`,`VIDEO_ONLY`]},{key:`metroProjectRoot`,type:`string`,path:!0},{key:`metroKind`,type:`enum`,enumValues:[`auto`,`react-native`,`expo`,`repack`]},{key:`metroPublicBaseUrl`,type:`string`},{key:`metroProxyBaseUrl`,type:`string`},{key:`metroBearerToken`,type:`string`},{key:`metroPreparePort`,type:`int`,min:1,max:65535},{key:`metroListenHost`,type:`string`},{key:`metroStatusHost`,type:`string`},{key:`metroStartupTimeoutMs`,type:`int`,min:1},{key:`metroProbeTimeoutMs`,type:`int`,min:1},{key:`metroRuntimeFile`,type:`string`,path:!0},{key:`metroNoReuseExisting`,type:`boolean`},{key:`metroNoInstallDeps`,type:`boolean`},{key:`launchUrl`,type:`string`}],r=[{key:`leaseProvider`,type:`string`,env:!1},{key:`deviceKey`,type:`string`,env:!1},{key:`clientId`,type:`string`,env:!1}],i=[...n,...r],a=new Map(i.map(e=>[e.key,e]));function o(e){return a.get(e)}function s(t){return o(t)?.env===!1?[]:[e(t)]}export{o as i,i as n,s as r,n as t};
@@ -1 +1 @@
1
- import{O as e}from"./sdk-contracts.js";import{T as t,w as n}from"./sdk-batch.js";function r(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 i(e){return new Map(e.map(e=>[e.index,e]))}function a(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function o(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function s(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=c(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function c(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 l(e){let t=m(e.label),n=m(e.value),r=m(e.identifier),i=ee(r)?r:``;return g(e.type??``)?n||t||i:t||n||i}function u(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=h(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 d(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function f(e,t){let n=l(e),r=u(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&p(n)}}function p(e){return e?e.length>80||/[\r\n]/.test(e):!1}function m(e){return typeof e==`string`?e.trim():``}function h(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 g(e){let t=h(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function ee(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}function _(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 b(a.map(e=>e.rect).filter(e=>y(e,r.x,r.y)))||b(a.map(e=>e.rect))||b(i.map(e=>e.rect).filter(e=>y(e,r.x,r.y)))||null}function v(e,t){return x(e.x,e.x+e.width,t.x,t.x+t.width)&&x(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 y(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function b(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 x(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function S(e){let t=`${e??``}`.toLowerCase();return t.includes(`scroll`)||t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)||t.includes(`collectionview`)||t===`table`}function C(e){return S(e.type)?!0:`${e.role??``} ${e.subrole??``}`.toLowerCase().includes(`scroll`)}function w(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=E(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>oe(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:se(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&le(e)),e,t)}}function T(e){if(e.length===0)return new Map;let{hintedContainers:t}=E(e);return ae(t.directionsByContainer)}function E(e){let t=i(e),n=new Set,r=[];for(let i of e){if(D(i,e,t)){A(i,n,t);continue}r.push(i)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:ie(e,r,n,t)}}function D(e,t,n=i(t)){if(!e.rect)return!0;let r=O(e,t,n);return r?v(e.rect,r):!0}function ne(e,t,n=i(t)){if(!e.rect)return!0;if(!D(e,t,n))return!1;let r=_(t,e.rect);return re(e.rect,r)}function re(e,t){return!t||t.width<=0||t.height<=0?!0:y(t,e.x+e.width/2,e.y+e.height/2)}function O(e,t,n=i(t)){return P(e,n)||_(t,e.rect??{x:0,y:0,width:0,height:0})}function ie(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=j(e,n,r);if(!t?.rect)continue;let s=k(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 M(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function ae(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 oe(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 se(e,t,n){let r=new Map;for(let i of e){let e=ce(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=ue(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 ce(e,t,n){if(!e.rect)return null;let r=O(e,t,n);return r?k(e.rect,r):null}function k(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function le(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`)||!!a(e)}function ue(e){let t=new Set,n=[];for(let r of e){let e=a(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function A(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 j(e,t,n){return F(e,n,e=>t.has(e.index))}function M(e,t,n,r,i){for(let a of e){let e=N(a);if(!e||e.size===0)continue;let o=j(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 N(e){let t=s(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 P(e,t){return F(e,t,e=>!!e.rect)?.rect??null}function F(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)&&C(r))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function I(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 L(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&&R(n)?n:z(e,t)??(n&&R(n)?n:void 0)}function R(e){let t=e.trim();return!(!t||/^(true|false)$/i.test(t)||/^\d+$/.test(t))}function z(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||!R(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 B(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=h(r.type??``),a=[r.label,r.value,r.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0),o=a?R(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=h(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 H(e,t){return t.hittable?t:G(e,t,e=>e.hittable===!0)}function U(e){return new Map(e.map(e=>[e.index,e]))}function W(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 de(e,t,n,r){return!!W(e,t,r,e=>e===n||e.index===n.index?e:null)}function G(e,t,n){return W(e,t,U(e),e=>n(e)?e:null)}function K(e){return[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0)[0]??``}function fe(e){return l(e)}function q(e){return e.hittable===!0?!0:e.rect?e.rect.width>0&&e.rect.height>0:!1}function J(e,t){return V(e.type??``,t)&&e.enabled!==!1}function Y(e){return[`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`].includes(e)}const pe=`is requires predicate: visible|hidden|exists|editable|selected|focused|text`,me=`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 X(e){if(Y((e[0]??``).toLowerCase()))return e;for(let n=1;n<e.length;n+=1){let r=(e[n]??``).toLowerCase();if(Y(r)&&t(e.slice(0,n).join(` `)))return[r,...e.slice(0,n),...e.slice(n+1)]}return e}function he(e){let{predicate:t,node:n,nodes:r,expectedText:i,platform:a}=e,o=K(n),s=J(n,a),c=n.selected===!0,l=n.focused===!0,u=t===`text`?q(n):Z(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 Z(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if($(e.rect))return Q(e,t);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=ge(e,t,n);return r?$(r.rect)?Q(r,t):n!==`android`&&r.hittable===!0:!1}function Q(e,t){return D(e,t)}function ge(e,t,n){return W(t,e,U(t),e=>_e(e,n)?e:null)}function _e(e,t){if(t===`android`&&e.visibleToUser===!1)return!1;let n=h(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&&$(e.rect):e.hittable===!0||$(e.rect)}function $(e){return!!(e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0)}function ve(e){let t=X(e),r=t[0]??``;return{predicate:r,split:n(t.slice(1),{preferTrailingValue:r===`text`})}}export{d as A,r as B,ne as C,y as D,S as E,m as F,s as I,o as L,l as M,h as N,b as O,g as P,i as R,D as S,C as T,V as _,Y as a,w as b,q as c,K as d,G as f,de as g,W as h,he as i,f as j,_ as k,U as l,I as m,pe as n,X as o,H as p,me as r,J as s,ve as t,fe as u,B as v,O as w,T as x,L as y,a as z};
1
+ import{_ as e,u as t}from"./sdk-contracts.js";import{N as n,P as r,T as i}from"./sdk-batch.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(m),t.sibling=e.sibling,t.viewportOrder=e.viewportOrder,e.scrollRegion&&(t.scrollRegion=ee(e.scrollRegion)),e.rect&&(t.rect=te(e.rect)),t.verification=e.verification,t}function m(e){let t={role:e.role};return e.label!==void 0&&(t.label=e.label),t}function ee(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 te(e){return{x:e.x,y:e.y,width:e.width,height:e.height}}function ne(e){return JSON.stringify(p(e))}function re(e){return`# agent-device:target-v1 ${ne(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=y(r.sibling,`sibling`,0),u=y(r.viewportOrder,`viewportOrder`,0),f=ce(r.scrollRegion),p=le(r.rect),m=ue(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:m}}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 y(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 ce(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 le(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:b(n.x,`rect.x`),y:b(n.y,`rect.y`),width:b(n.width,`rect.width`),height:b(n.height,`rect.height`)}}function b(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 ue(t){if(t===`verified`||t===`unverifiable`)return t;throw new e(`INVALID_ARGS`,`target-v1 "verification" must be "verified" or "unverifiable".`)}function de(e,t){return t.id===void 0?e.role===t.role&&e.label===t.label:e.id===t.id}function fe(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 pe(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 me(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 x(e){return new Map(e.map(e=>[e.index,e]))}function S(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function he(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function ge(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=_e(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function _e(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 C(e){let t=w(e.label),n=w(e.value),r=w(e.identifier),i=Se(r)?r:``;return E(e.type??``)?n||t||i:t||n||i}function ve(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=T(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 ye(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function be(e,t){let n=C(e),r=ve(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&xe(n)}}function xe(e){return e?e.length>80||/[\r\n]/.test(e):!1}function w(e){return typeof e==`string`?e.trim():``}function T(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 E(e){let t=T(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function Se(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}function D(e,n){let r=t(n),i=e.filter(e=>we(e.rect)),a=i.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)});return k(a.map(e=>e.rect).filter(e=>O(e,r.x,r.y)))||k(a.map(e=>e.rect))||k(i.map(e=>e.rect).filter(e=>O(e,r.x,r.y)))||null}function Ce(e,t){return A(e.x,e.x+e.width,t.x,t.x+t.width)&&A(e.y,e.y+e.height,t.y,t.y+t.height)}function we(e){return e?Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height):!1}function O(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function k(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 A(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function j(e){let t=`${e??``}`.toLowerCase();return t.includes(`scroll`)||t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)||t.includes(`collectionview`)||t===`table`}function M(e){return j(e.type)?!0:`${e.role??``} ${e.subrole??``}`.toLowerCase().includes(`scroll`)}function Te(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=N(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>Ae(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:je(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&Ne(e)),e,t)}}function Ee(e){if(e.length===0)return new Map;let{hintedContainers:t}=N(e);return ke(t.directionsByContainer)}function N(e){let t=x(e),n=new Set,r=[];for(let i of e){if(P(i,e,t)){Fe(i,n,t);continue}r.push(i)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:Oe(e,r,n,t)}}function P(e,t,n=x(t)){if(!e.rect)return!0;let r=I(e,t,n);return r?Ce(e.rect,r):!0}function F(e,t,n=x(t)){if(!e.rect)return!0;if(!P(e,t,n))return!1;let r=D(t,e.rect);return De(e.rect,r)}function De(e,t){return!t||t.width<=0||t.height<=0?!0:O(t,e.x+e.width/2,e.y+e.height/2)}function I(e,t,n=x(t)){return Re(e,n)||D(t,e.rect??{x:0,y:0,width:0,height:0})}function Oe(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=R(e,n,r);if(!t?.rect)continue;let s=L(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 Ie(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function ke(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 Ae(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 je(e,t,n){let r=new Map;for(let i of e){let e=Me(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=Pe(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 Me(e,t,n){if(!e.rect)return null;let r=I(e,t,n);return r?L(e.rect,r):null}function L(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function Ne(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`)||!!S(e)}function Pe(e){let t=new Set,n=[];for(let r of e){let e=S(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function Fe(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 R(e,t,n){return ze(e,n,e=>t.has(e.index))}function Ie(e,t,n,r,i){for(let a of e){let e=Le(a);if(!e||e.size===0)continue;let o=R(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 Le(e){let t=ge(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 Re(e,t){return ze(e,t,e=>!!e.rect)?.rect??null}function ze(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)&&M(r))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function z(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite)&&e.width>0&&e.height>0)}function Be(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 Ve(e){return e.width*e.height}function He(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 Ue(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:We(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 We(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 Ge(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=T(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 Ke(e,t){let n=T(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 qe(e,t){return t.hittable?t:Ye(e,t,e=>e.hittable===!0)}function V(e){return new Map(e.map(e=>[e.index,e]))}function H(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 Je(e,t,n,r){return!!H(e,t,r,e=>e===n||e.index===n.index?e:null)}function Ye(e,t,n){return H(e,t,V(e),e=>n(e)?e:null)}function U(e){return[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0)[0]??``}function Xe(e){return C(e)}function W(e){return e.hittable===!0?!0:e.rect?e.rect.width>0&&e.rect.height>0:!1}function G(e,t){return Ke(e.type??``,t)&&e.enabled!==!1}function K(e){return[`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`].includes(e)}const Ze=`is requires predicate: visible|hidden|exists|editable|selected|focused|text`,Qe=`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 $e(e){if(K((e[0]??``).toLowerCase()))return e;for(let t=1;t<e.length;t+=1){let n=(e[t]??``).toLowerCase();if(K(n)&&r(e.slice(0,t).join(` `)))return[n,...e.slice(0,t),...e.slice(t+1)]}return e}function et(e){let{predicate:t,node:n,nodes:r,expectedText:i,platform:a}=e,o=U(n),s=G(n,a),c=n.selected===!0,l=n.focused===!0,u=t===`text`?W(n):tt(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 tt(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(z(e.rect))return nt(e,t);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=rt(e,t,n);return r?z(r.rect)?nt(r,t):n!==`android`&&r.hittable===!0:!1}function nt(e,t){return P(e,t)}function rt(e,t,n){return H(t,e,V(t),e=>it(e,n)?e:null)}function it(e,t){if(t===`android`&&e.visibleToUser===!1)return!1;let n=T(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 at(e){let t=$e(e),r=t[0]??``;return{predicate:r,split:n(t.slice(1),{preferTrailingValue:r===`text`})}}function q(e,t,n){return t.terms.every(t=>ot(e,t,n))}function ot(e,t,n){switch(t.key){case`id`:return J(e.identifier,String(t.value));case`role`:return J(T(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(U(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 W(e)===!!t.value;case`hidden`:return!W(e)==!!t.value;case`editable`:return G(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,t){return i(e??``)===i(t)}function st(e,t,n){let r=n.requireRect??!1,i=n.requireUnique??!0,a=[];for(let[o,s]of t.selectors.entries()){let t=pt(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 ct(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 lt(e,t,n){let r=n.requireRect??!1,i=[];for(let[a,o]of t.selectors.entries()){let t=gt(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 ut=`Snapshot refs expire when the UI changes. Run snapshot -i and retry with a fresh @ref.`;function dt(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 ft(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 pt(e,t,n,r){let i=0,a=null,o=[],s={best:null,bestVisible:!1,tie:!1},c,l=t=>(c??=x(e),F(t,e,c));for(let c of e)r&&!c.rect||q(c,t,n)&&(i+=1,a??=c,o.push(c),mt(s,c,l));return{count:i,firstNode:a,disambiguated:s.tie?null:s.best,tiebreak:s.tie?null:ht(o,s.best,l),candidates:o}}function mt(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=_t(t,e.best);i.result>0?(e.best=t,e.tie=!1):i.result===0&&(e.tie=!0)}function ht(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)?_t(e,t):{result:r?1:-1,criterion:`visible`}}function gt(e,t,n,r){let i=0;for(let a of e)r&&!a.rect||q(a,t,n)&&(i+=1);return i}function _t(e,t){let n=e.depth??0,r=t.depth??0;if(n!==r)return{result:n>r?1:-1,criterion:`deepest`};let i=vt(e),a=vt(t);return i===a?{result:0,criterion:null}:{result:i<a?1:-1,criterion:`smallest-area`}}function vt(e){return e.rect?e.rect.width*e.rect.height:1/0}function X(e){let t=l(T(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 yt(e,t){return e.id===t.id&&e.role===t.role&&e.label===t.label}function bt(e,t){let n=0;for(let r of e)X(r).id===t&&(n+=1);return n}function xt(e,t){if(e.id===void 0||bt(t,e.id)<=1)return e;let{role:n,label:r}=e;return{role:n,...r===void 0?{}:{label:r}}}function Z(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 St(e,t){return{documentOrder:e.index,sibling:Z(t,e)}}function Ct(e,t){return e.documentOrder===t.documentOrder&&e.sibling===t.sibling}const wt=`replay_target_guard_mismatch`;function Tt(e,t,n={}){let r=[],i=T(e.type??``),a=Et(e,n.nodes),o=$(e.label),s=$(e.value),c=$(U(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&&W(e)&&u.push(`visible=true`),u}function Et(e,t){let n=$(e.identifier);if(!n||!t)return n;let r=X(e).id;return r===void 0?n:bt(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{w as $,He as A,P as B,G as C,U as D,Xe as E,z as F,O as G,I as H,Ve as I,ye as J,k as K,Be as L,Ke as M,Ge as N,Ye as O,Ue as P,E as Q,Te as R,$e as S,V as T,M as U,F as V,j as W,C as X,be as Y,T as Z,at as _,yt as a,o as at,et as b,Z as c,fe as ct,lt as d,ne as dt,ge as et,ft as f,d as ft,q as g,dt as h,xt as i,me as it,Je as j,qe as k,Ct as l,de as lt,st as m,$ as n,x as nt,X as o,pe as ot,ct as p,D as q,wt as r,S as rt,St as s,re as st,Tt as t,he as tt,ut as u,ie as ut,Ze as v,W as w,K as x,Qe as y,Ee as z};
@@ -1 +1 @@
1
- import{B as e,D as t,F as n,I as r,M as i,N as a,T as o,b as s,f as c,m as l,p as u}from"./sdk-contracts.js";import{j as d}from"./sdk-android-adb.js";import{T as f,v as p}from"./sdk-batch.js";import{J as ee,m}from"./tv-remote.js";import{N as h,P as te,a as ne,i as re,m as ie,n as ae,r as oe,t as se,u as ce}from"./sdk-selectors.js";import{t as le}from"./snapshot-quality.js";import{a as ue}from"./sdk-finders.js";import"./selectors2.js";import{n as de,t as fe}from"./runtime.js";import{r as pe}from"./app-lifecycle.js";import{c as me,f as he,i as g}from"./runner-client.js";import{$t as _,Gt as ge,Ht as v,Mt as y,Ot as _e,Pt as b,en as ve,jt as x,kt as ye,ln as S,tn as C,zt as be}from"./internal/daemon.js";import{a as w,t as T}from"./apple-runner-options.js";import{o as xe}from"./apps.js";function E(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}}async function D(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,c=ce(n),l=ee(n.rect);if(!l||u(t)&&c&&!te(n.type??``))return c;try{let e=await ge(t,`read`,[String(l.x),String(l.y)],void 0,{...s(r,i,a),surface:o}),u=e&&typeof e==`object`?e:void 0,f=typeof u?.text==`string`?u.text:``;return f.trim()?f:(d({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),c)}catch(e){return d({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)}}),c}}async function O(e,t,n){let r=e.get(t),i=r?.device??await S(n??{});return r||await w(i),{session:r,device:i}}async function k(e,t,n){let r=!e&&u(t);try{return await n()}finally{r&&(await me(t.id),await Se(t))}}async function Se(e){let t=he();await xe(e,t).catch(n=>{d({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Ce(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function we(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 Te=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function A(e,t){let n=Ee(t);return n.length===0?null:_(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function Ee(e){if(!e)return[];let t=[];for(let[n,r]of Te)e[n]!==void 0&&t.push(r);return t}function De(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:_(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function Oe(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function j(e){let t=a(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:_(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:o})}}function ke(e,t){let n=E(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=j(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:_(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Ae(e){let t=E(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...Le(e[2])};let n=Ie(e),r=ke(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function je(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=j(t);if(!n.ok)return{ok:!1,response:n.response};let r=m(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Fe(e)},refGeneration:n.generation,text:r}:{ok:!1,response:_(`INVALID_ARGS`,`fill requires text after ref`)}}let n=E(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:_(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Me(e);return!r||r.kind!==`selector`?{ok:!1,response:_(`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:_(`INVALID_ARGS`,`fill requires text after selector`)}}function Me(e){try{return m(e)}catch{return null}}function Ne(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:M(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}: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}:{evidence:t,settle:n}}function Pe(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 M(e){return e?.startsWith(`@`)?e.slice(1):e}function Fe(e){return e.length>=3&&e[1]?.trim()||``}function Ie(e){let t=e.at(-1);return e.length>1&&Re(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function Le(e){return e===void 0?{}:{durationMs:Number(e)}}function Re(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function ze(e,t){let r=await N(e);if(r)throw new n(`COMMAND_FAILED`,`press ${t} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}async function N(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await pe(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!Ue(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:He(n)}}function Be(e){return e.foregroundPackage===`com.google.android.permissioncontroller`?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ve(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function He(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 Ue(e){return e===`com.android.settings`||e===`com.android.systemui`||e===`com.google.android.permissioncontroller`||e.includes(`launcher`)}function We(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 Ge(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{...typeof e.ref==`string`?{ref:e.ref}:{},...typeof e.text==`string`?{text:e.text}:{},...e.node&&typeof e.node==`object`?{node:e.node}:{}}}function P(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=R(e),i=r?.kind===`ref`?z(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 F(e){let t=R(e);return{...t?.kind===`ref`?{ref:z(t.ref)}:{},...t?.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},...e.node&&typeof e.node==`object`?{node:e.node}:{}}}function Ke(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){let i=e.get(t);i&&e.recordAction(i,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function qe(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function R(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 z(e){return e.startsWith(`@`)?e.slice(1):e}const Je=[`application`,`window`,`tabbar`,`scrollbar`,`image`],Ye=new Set([`tab bar`]);async function B(e,t){if(t.ok||!Xe(t.error.message)||t.error.details?.captureStalled===!0)return t;let n=await Ze(e).catch(()=>null);return n?_(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function Xe(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function Ze(e){let t=[...(await b({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(Qe),n=V(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=V(t.filter(e=>!W(e)),4,{includeIdentifiers:!1}),i=V(t.filter(et),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function V(e,t,n){let r=new Set,i=[];for(let a of e){let e=U(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function Qe(e,t){return H(e)-H(t)||$e(e,t)}function H(e){let t=!!U(e,{includeIdentifiers:!1});return(W(e)?2:0)+ +!t}function $e(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 U(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 W(e){let t=h(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return Je.some(e=>t.includes(e))||Ye.has(n)||n.endsWith(`.fill`)}function et(e){return h(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e){let{session:t,selectorExpression:n}=e;if(!t||!u(t.device)||t.postGestureStabilization)return null;let r=f(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`||!tt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function tt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function K(e,t={}){let n=r(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!0;if(n.code!==`COMMAND_FAILED`)return!1;let i=n.message.toLowerCase();return i.includes(`fetch failed`)||i.includes(`timed out`)||i.includes(`timeout`)||i.includes(`runner did not accept connection`)||i.includes(`invalid runner response`)}function nt(e,t={}){let r=t.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new n(`UNSUPPORTED_OPERATION`,`${e} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new n(`UNSUPPORTED_OPERATION`,`${e} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new n(`UNSUPPORTED_OPERATION`,`${e} ${r} not create temporary files`)}}}function rt(e,t={}){return{artifacts:nt(e,t),policy:de()}}function q(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o;return{capture:async s=>{let c=Date.now(),l=pt(s,e.req.flags?.out),u=st({timestamp:c,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:s,cacheKey:l});if(u)return u;let d=ct({session:t,timestamp:c,request:s});if(d)return i=d.createdAt,a={snapshot:d},o=l,a;let f=await it({params:e,request:s}),p={snapshot:f};return ht({session:t,sessionStore:n,sessionName:r,snapshot:f}),i=c,a=p,o=l,p}}}async function it(e){let{params:t,request:n}=e,r=await J(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&gt(r)?await at({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&le(r.snapshotQuality)?await ot({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function at(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await J(t,n,r.scope,!1)}catch(e){if(!r.shouldScope)throw e;return await J(t,n,r.query,!1)}}async function ot(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 b({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 st(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)&&!v(a)&&!dt(a,o))return r}function ct(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&lt(t,r)&&ut(i,n)&&i.presentationKey===ft(r))return i}function lt(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||v(e)||dt(e,t))}function ut(e,t){return t-e.createdAt<750}function dt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function ft(e){return t(i(mt(e)))}function pt(e,t){return JSON.stringify({presentationKey:ft(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function mt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function ht(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||le(i.snapshotQuality)||(y(t,i),n.set(r,t))}function gt(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function _t(e){return fe({backend:vt(e),...rt(`selector commands`,{plural:!0}),sessions:_e({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(y(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}})})}async function Y(e,t){let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:ve()};let r=n?.device??await S(e.req.flags??{});n||await w(r);let i=C(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:_t({...e,session:n,device:r})}}function vt(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,c=q({device:r,session:n,sessionStore:o,sessionName:a,req:t,logPath:i});return{platform:s(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...yt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,s=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await c.capture({flags:i,snapshotScope:o,includeRects:a,cache:{forceFresh:s,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await D({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 bt(e,n)})}}function yt(e){let t={};return e?.interactiveOnly!==void 0&&(t.snapshotInteractiveOnly=e.interactiveOnly),e?.scope!==void 0&&(t.snapshotScope=e.scope),e?.depth!==void 0&&(t.snapshotDepth=e.depth),e?.raw!==void 0&&(t.snapshotRaw=e.raw),t}async function bt(e,t){let n=await xt(e,t);if(n!==null)return n;let r=await St(e,t);return r===null?await Tt(e,t):r}async function xt(e,t){return!l(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Tt(e,t)}async function St(e,t){let n=Ct(e);return n?(await g(n.device,{command:`findText`,text:t,appBundleId:n.appBundleId},wt(e,n)))?.found===!0:null}function Ct(e){return!c(e.device.platform)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function wt(e,t){return T({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Tt(e,t){return!!ie((await Et(e)).nodes,t)}async function Et(e){let{snapshot:t}=await q({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1},cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return t}async function Dt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=t.positionals??[];if(n.length===0)return _(`INVALID_ARGS`,`find requires a locator or text`);let r=ue(n);if(!r.query)return _(`INVALID_ARGS`,`find requires a value`);if(t.flags?.findFirst&&t.flags?.findLast)return _(`INVALID_ARGS`,`find accepts only one of --first or --last`);let i=r.action;if(!Vt(i))return null;let a=await Y(e,{requireSession:!1,capability:`find`});return a.ok?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});L(e.sessionStore,e.sessionName,t,We(n,i));let o=Ge(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(ye(t),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}):a.response}async function Ot(e){let{req:t}=e;if(t.command!==`get`)return null;let n=t.positionals?.[0];if(n!==`text`&&n!==`attrs`)return _(`INVALID_ARGS`,`get only supports text or attrs`);let r=zt(t);if(!r.ok)return r.response;if(r.target.kind===`ref`){let e=A(`get`,t.flags);if(e)return e}if(r.target.kind===`selector`){let t=await jt(e,n,r.target.selector);if(t)return t}let i=await Y(e,{requireSession:!0,capability:`get`});if(!i.ok)return i.response;let a=r.target.kind===`ref`?x({session:e.sessionStore.get(e.sessionName),ref:r.target.ref,mintedGeneration:r.refGeneration}):void 0;return await Q(async()=>{let o=await i.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:n,target:r.target});L(e.sessionStore,e.sessionName,t,P(o,n));let s=F(o);return a?{...s,warning:a}:s})}async function kt(e){let{req:t}=e;if(t.command!==`is`)return null;let{predicate:n,split:r}=se(t.positionals??[]),i=n.toLowerCase();if(!ne(i))return _(`INVALID_ARGS`,ae,{hint:oe});if(!r)return _(`INVALID_ARGS`,`is requires a selector expression`);let a=r.rest.join(` `).trim();if(i===`text`&&!a)return _(`INVALID_ARGS`,`is text requires expected text value`);if(i!==`text`&&r.rest.length>0)return _(`INVALID_ARGS`,`is ${i} does not accept trailing values`);let o=await Mt(e,i,r.selectorExpression,a);if(o)return o;let s=await Y(e,{requireSession:!0,capability:`is`});return s.ok?await $(e,await Q(async()=>{let n=await s.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:i,selector:r.selectorExpression,expectedText:a});return L(e.sessionStore,e.sessionName,t,n),I(n)}),`is ${i}`):s.response}async function At(e){let{req:t,sessionName:n,sessionStore:r}=e,i=p(t.positionals??[]);if(!i)return _(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await O(r,n,t.flags);if(i.kind!==`sleep`){let e=C(`wait`,o);if(e)return e}if(i.kind===`selector`){let t=await Nt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let s=i,c;if(i.kind===`ref`){let e=j(i.rawRef);if(!e.ok)return e.response;s={...i,rawRef:e.ref},c=x({session:a,ref:e.ref,mintedGeneration:e.generation})}let l=async()=>{let i=_t({...e,session:a,device:o}),l=await Q(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Bt(s,a)});L(r,n,t,e);let o=Ke(e);return c?{...o,warning:c}:o});return await $(e,await B({req:t,logPath:e.logPath,session:a,device:o},l),`wait`)};return i.kind===`sleep`?await l():await k(a,o,l)}async function jt(e,t,n){let r=e.sessionStore.get(e.sessionName),i=G({session:r,selectorExpression:n});if(!r||!i||t===`text`&&i.key!==`id`)return null;let a=await X(e,r,i);if(Z(a))return a.response;if(!a)return null;let o={session:r,selector:i,result:a},s=It(t,o.selector.raw,o.result);return s?(L(e.sessionStore,e.sessionName,e.req,P(s,t)),{ok:!0,data:F(s)}):null}async function Mt(e,t,n,r){if(t===`hidden`)return null;let i=await Pt(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]}:Lt(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 Nt(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]};L(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:I(i)};return await B({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Pt(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 Ft(e,t,n){let r=await g(t.device,{command:`querySelector`,selectorKey:n.key,selectorValue:n.value,appBundleId:t.appBundleId},T({req:e.req,logPath:e.logPath,traceLogPath:t.trace?.outPath})),i=r.found===!0,a=Rt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function X(t,n,r){try{return await Ft(t,n,r)}catch(t){return K(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 It(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 Lt(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 Rt(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=j(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=e.positionals?.slice(1).join(` `).trim()??``;return n?{ok:!0,target:{kind:`selector`,selector:n}}:{ok:!1,response:_(`INVALID_ARGS`,`get requires @ref or selector expression`)}}function Bt(e,t){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs};if(e.kind===`ref`){if(!t?.snapshot)throw new n(`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};if(!e.text)throw new n(`INVALID_ARGS`,`wait requires text`);return{kind:`text`,text:e.text,timeoutMs:e.timeoutMs}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=r(e);return _(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 N(r)}catch{return t}return i?_(t.error.code,`${n} failed because ${Be(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}function Vt(e){return e===`exists`||e===`wait`||e===`get_text`||e===`get_attrs`}export{k as C,O as S,Oe as _,q as a,we as b,G as c,Pe as d,Ne as f,M as g,ke as h,At as i,ze as l,Ae as m,Ot as n,rt as o,je as p,kt as r,K as s,Dt as t,Ve as u,A as v,D as w,Ce as x,De 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{j as s}from"./sdk-android-adb.js";import{E as c,P as l,b as u,w as d}from"./sdk-batch.js";import{m as f}from"./tv-remote.js";import{G as p}from"./snapshot-diagnostics.js";import{c as m,m as ee,o as te,s as h}from"./sdk-device.js";import{A as ne,E as re,Q as ie,Z as ae,_ as oe,b as se,v as ce,x as le,y as ue}from"./sdk-selectors.js";import{t as de}from"./snapshot-quality.js";import{s as fe}from"./android-input-method-overlays.js";import{n as pe,o as me,t as he}from"./runtime.js";import{r as ge}from"./app-lifecycle.js";import{E as _e}from"./runner-disposal.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{a as b,l as xe}from"./runner-client.js";import{Kt as Se,Xt as Ce,Yt as we,dn as x,g as S,nn as C,qt as Te,u as w}from"./internal/daemon.js";import{a as Ee}from"./apps.js";import{o as De}from"./session-target-evidence.js";function T(e,t){let n=me(t);if(!n)return e;if(e.ok){let t=E(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:E(r.hint,n)}}}}function E(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function D(e,t,n){let r=e.get(t),i=r?.device??await _(n??{});return r||await S(i),{session:r,device:i}}async function Oe(e,t,n){let r=!e&&h(t);try{return await n()}finally{r&&(await xe(t.id),await ke(t))}}async function ke(e){let t=_e();await Ee(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 Ae(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function je(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 Me=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function Ne(e,t){let n=Pe(t);return n.length===0?null:y(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function Pe(e){if(!e)return[];let t=[];for(let[n,r]of Me)e[n]!==void 0&&t.push(r);return t}function Fe(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 Ie(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:y(`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:y(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Le(e){let t=O(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...We(e[2])};let n=Ue(e),r=A(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Re(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=k(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:He(e)},refGeneration:n.generation,text:r}:{ok:!1,response:y(`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:y(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=ze(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 ze(e){try{return f(e)}catch{return null}}function Be(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 Ve(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 He(e){return e.length>=3&&e[1]?.trim()||``}function Ue(e){let t=e.at(-1);return e.length>1&&Ge(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function We(e){return e===void 0?{}:{durationMs:Number(e)}}function Ge(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function Ke(e,n){let r=await M(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 M(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await ge(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!Xe(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:Ye(n)}}function qe(e){return e.foregroundPackage===`com.google.android.permissioncontroller`?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Je(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function Ye(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 Xe(e){return e===`com.android.settings`||e===`com.android.systemui`||e===`com.google.android.permissioncontroller`||e.includes(`launcher`)}function Ze(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 Qe(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{...typeof e.ref==`string`?{ref:e.ref}:{},...typeof e.text==`string`?{text:e.text}:{},...e.node&&typeof e.node==`object`?{node:e.node}:{}}}function N(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=L(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:et(s)}}function P(e){let t=L(e);return{...t?.kind===`ref`?{ref:R(t.ref)}:{},...t?.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},...e.node&&typeof e.node==`object`?{node:e.node}:{}}}function $e(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 F(e){let{selectorChain:t,...n}=e;return n}function I(e,t,n,r,i){let a=e.get(t);if(!a)return;let o=a.recordSession&&i?De(i):void 0;e.recordAction(a,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:p(n),...o?{targetEvidence:o}:{}})}function et(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function L(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 tt=[`application`,`window`,`tabbar`,`scrollbar`,`image`],nt=new Set([`tab bar`]);async function z(e,t){if(t.ok||!rt(t.error.message)||t.error.details?.captureStalled===!0)return t;let n=await it(e).catch(()=>null);return n?y(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function rt(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function it(e){let t=[...(await C({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(at),n=B(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=B(t.filter(e=>!st(e)),4,{includeIdentifiers:!1}),i=B(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 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 at(e,t){return V(e)-V(t)||ot(e,t)}function V(e){let t=!!H(e,{includeIdentifiers:!1});return(st(e)?2:0)+ +!t}function ot(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 st(e){let t=ae(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return tt.some(e=>t.includes(e))||nt.has(n)||n.endsWith(`.fill`)}function ct(e){return ae(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function U(e){let{session:t,selectorExpression:n}=e;if(!t||!h(t.device)||g(t.device)||t.postGestureStabilization)return null;let r=l(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 W(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 ut(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 G(e,t={}){return{artifacts:ut(e,t),policy:pe()}}async function dt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:c}=e,l=re(n),u=fe(n.rect);if(!u||h(t)&&l&&!ie(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=bt(c,e.req.flags?.out),d=ht({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=gt({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await ft({params:e,request:c}),m={snapshot:p};return St({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function ft(e){let{params:t,request:n}=e,r=await q(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&Ct(r)?await pt({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&de(r.snapshotQuality)?await mt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function pt(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 mt(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 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})).snapshot}function ht(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)&&!x(a)&&!J(a,o))return r}function gt(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&_t(t,r)&&vt(i,n)&&i.presentationKey===yt(r))return i}function _t(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||x(e)||J(e,t))}function vt(e,t){return t-e.createdAt<750}function J(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function yt(e){return r(i(xt(e)))}function bt(e,t){return JSON.stringify({presentationKey:yt(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function xt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function St(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||de(i.snapshotQuality)||(Ce(t,i),n.set(r,t))}function Ct(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function wt(e){return he({backend:Tt(e),...G(`selector commands`,{plural:!0}),sessions:Se({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(Ce(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}})})}async function Y(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 S(r);let i=v(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:wt({...e,session:n,device:r})}}function Tt(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,...Et(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 dt({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 Dt(e,n)})}}function Et(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 Dt(e,t){let n=await Ot(e,t);if(n!==null)return n;let r=await kt(e,t);return r===null?await Mt(e,t):r}async function Ot(e,t){return!m(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Mt(e,t)}async function kt(e,t){let n=At(e);return n?(await b(n.device,{command:`findText`,text:t,appBundleId:n.appBundleId},jt(e,n)))?.found===!0:null}function At(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 jt(e,t){return w({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Mt(e,t){return!!ne((await Nt(e)).nodes,t)}async function Nt(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 Pt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=t.positionals??[];if(n.length===0)return y(`INVALID_ARGS`,`find requires a locator or text`);let r=c(n);if(!r.query)return y(`INVALID_ARGS`,`find requires a value`);if(t.flags?.findFirst&&t.flags?.findLast)return y(`INVALID_ARGS`,`find accepts only one of --first or --last`);let i=r.action;if(!d(i))return null;let a=await Y(e,{requireSession:!1,capability:`find`});return a.ok?T(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});I(e.sessionStore,e.sessionName,t,Ze(n,i));let o=Qe(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(Te(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 Ft(e){let{req:t}=e;if(t.command!==`get`)return null;let n=t.positionals?.[0];if(n!==`text`&&n!==`attrs`)return y(`INVALID_ARGS`,`get only supports text or attrs`);let r=qt(t);if(!r.ok)return r.response;if(r.target.kind===`ref`){let e=Ne(`get`,t.flags);if(e)return e}let i=t.internal?.replayTargetGuard;if(r.target.kind===`selector`&&!i){let t=await zt(e,n,r.target.selector);if(t)return t}let a=await Y(e,{requireSession:!0,capability:`get`});if(!a.ok)return a.response;let o=r.target.kind===`ref`?we({session:e.sessionStore.get(e.sessionName),ref:r.target.ref,mintedGeneration:r.refGeneration}):void 0;return T(await $(async()=>{let s=await a.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:n,target:r.target,expectedResolvedTarget:i});I(e.sessionStore,e.sessionName,t,N(s,n),{node:s.node,preActionNodes:s.preActionNodes});let c=P(s);return o?{...c,warning:o}:c}),X(e))}async function It(e){let{req:t}=e;if(t.command!==`is`)return null;let{predicate:n,split:r}=oe(t.positionals??[]),i=n.toLowerCase();if(!le(i))return y(`INVALID_ARGS`,ce,{hint:ue});if(!r)return y(`INVALID_ARGS`,`is requires a selector expression`);let a=r.rest.join(` `).trim();if(i===`text`&&!a)return y(`INVALID_ARGS`,`is text requires expected text value`);if(i!==`text`&&r.rest.length>0)return y(`INVALID_ARGS`,`is ${i} does not accept trailing values`);let o=await Bt(e,i,r.selectorExpression,a);if(o)return o;let s=await Y(e,{requireSession:!0,capability:`is`});return s.ok?T(await Yt(e,await $(async()=>{let n=await s.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:i,selector:r.selectorExpression,expectedText:a});return I(e.sessionStore,e.sessionName,t,n),F(n)}),`is ${i}`),X(e)):s.response}async function Lt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=u(t.positionals??[]);if(!i)return y(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await D(r,n,t.flags);if(i.kind!==`sleep`){let e=v(`wait`,o);if(e)return e}if(i.kind===`selector`){let t=await Vt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let s=i,c;if(i.kind===`ref`){let e=k(i.rawRef);if(!e.ok)return e.response;s={...i,rawRef:e.ref},c=we({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let l=async()=>{let i=wt({...e,session:a,device:o}),l=await $(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Jt(s,a)});I(r,n,t,e);let o=$e(e);return c?{...o,warning:c}:o});return await Yt(e,await z({req:t,logPath:e.logPath,session:a,device:o},l),`wait`)};return i.kind===`sleep`?await l():T(await Oe(a,o,l),X(e))}function Rt(e,t,n){if(!e||e.recordSession)return null;let r=U({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function zt(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Rt(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=Wt(t,i.raw,a);return o?(I(e.sessionStore,e.sessionName,e.req,N(o,t)),{ok:!0,data:P(o)}):null}async function Bt(e,t,n,r){if(t===`hidden`)return null;let i=await Ht(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]}:Gt(t,r,i.selector.raw,i.session,i.result.node);return a?(I(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:F(a)}):null}async function Vt(e){let t=U({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]};I(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:F(i)};return await z({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Ht(e,t){let n=e.sessionStore.get(e.sessionName),r=U({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 Ut(e,t,n){let r=await b(t.device,{command:`querySelector`,selectorKey:n.key,selectorValue:n.value,appBundleId:t.appBundleId},w({req:e.req,logPath:e.logPath,traceLogPath:t.trace?.outPath})),i=r.found===!0,a=Kt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function Z(t,n,r){try{return await Ut(t,n,r)}catch(t){return W(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 Wt(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 Gt(e,t,n,r,i){let a=se({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 Kt(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function qt(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=e.positionals?.slice(1).join(` `).trim()??``;return n?{ok:!0,target:{kind:`selector`,selector:n}}:{ok:!1,response:y(`INVALID_ARGS`,`get requires @ref or selector expression`)}}function Jt(e,n){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs};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};if(!e.text)throw new t(`INVALID_ARGS`,`wait requires text`);return{kind:`text`,text:e.text,timeoutMs:e.timeoutMs}}async function $(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return y(t.code,t.message,t.details)}}async function Yt(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?y(t.error.code,`${n} failed because ${qe(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{Oe as C,D as S,Ie as _,K as a,je as b,U as c,Ve as d,Be as f,j as g,A as h,Lt as i,Ke as l,Le as m,Ft as n,G as o,Re as p,It as r,W as s,Pt as t,Je as u,Ne as v,T as w,Ae as x,Fe as y};
@@ -0,0 +1 @@
1
+ import{_ as e}from"./sdk-contracts.js";import{$n as t,d as n}from"./tv-remote.js";import{H as r,I as i,U as a,V as o,z as s}from"./snapshot-diagnostics.js";import{n as c}from"./sdk-device.js";import{ut as l}from"./sdk-selectors.js";const u=/^[A-Z_][A-Z0-9_]*$/,d=/(\\\$\{)|\$\{([A-Za-z_][A-Za-z0-9_.]*)(?::-((?:[^}\\]|\\.)*))?\}/g;function f(e){return e.startsWith(`AD_`)}function p(t){return new e(`INVALID_ARGS`,`The AD_* namespace is reserved for built-in variables. Rename ${t} to avoid the AD_ prefix.`)}function m(e){let t={};if(e.builtins)for(let[n,r]of Object.entries(e.builtins))t[n]=r;let n=[e.fileEnv,e.shellEnv,e.cliEnv];for(let e of n)if(e)for(let[n,r]of Object.entries(e)){if(f(n))throw p(n);t[n]=r}return{values:t,expandedBuiltinNames:new Set}}function h(e){let t={};for(let[n,r]of Object.entries(e)){if(typeof r!=`string`||!n.startsWith(`AD_VAR_`))continue;let e=n.slice(7);e.length!==0&&u.test(e)&&(f(e)||(t[e]=r))}return t}function g(t){let n={};for(let r of t){let t=r.indexOf(`=`);if(t<=0)throw new e(`INVALID_ARGS`,`Invalid -e entry "${r}": expected KEY=VALUE.`);let i=r.slice(0,t);if(!u.test(i))throw new e(`INVALID_ARGS`,`Invalid -e key "${i}": keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(f(i))throw p(i);n[i]=r.slice(t+1)}return n}function _(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function v(e){if(e&&typeof e==`object`&&!Array.isArray(e)){let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}return process.env}function y(t,n,r){return t.replace(d,(t,i,a,o)=>{if(i)return"${";if(!a)return t;if(Object.prototype.hasOwnProperty.call(n.values,a))return f(a)&&(n.expandedBuiltinNames??=new Set).add(a),String(n.values[a]);if(o!==void 0)return o.replace(/\\(.)/g,`$1`);throw new e(`INVALID_ARGS`,`Unresolved variable \${${a}} at ${r.file}:${r.line}.`)})}function b(e,t,n){return{...e,positionals:(e.positionals??[]).map(e=>y(e,t,n)),flags:x(e.flags,t,n)??{},runtime:x(e.runtime,t,n)}}function x(e,t,n){return e&&S(e,t,n)}function S(e,t,n){return typeof e==`string`?y(e,t,n):Array.isArray(e)?e.map(e=>S(e,t,n)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,r])=>[e,S(r,t,n)])):e}function C(e){return Object.entries(e.values).filter(([t,n])=>n.length>0&&(!f(t)||e.expandedBuiltinNames?.has(t))).map(([e,t])=>({name:e,value:t})).sort((e,t)=>t.value.length-e.value.length)}const w=new Set(c.filter(e=>e!==`web`)),T=new Set([`mobile`,`tv`,`desktop`]);function E(t){let n=[],r=[],i=t.split(/\r?\n/),a=!1,o,s=(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[t,c]of i.entries()){let i=c.trim();if(i.length===0){o&&s(o,t,`is blank`);continue}if(i.startsWith(`#`)){let e=l(i);if(e.kind===`v1`){o&&s(o,t,`is another target-v1 annotation`),o={evidence:e.evidence,line:t+1};continue}o&&s(o,t,`is a comment`);continue}if(O(i)){if(o&&s(o,t,`is an env directive`),a)throw new e(`INVALID_ARGS`,`env directives must precede all actions (line ${t+1}).`);continue}let u=N(c);if(!u){o&&s(o,t,`did not parse as an action`);continue}o&&=(u.targetEvidence=o.evidence,void 0),n.push(u),r.push(t+1),a=!0}if(o)throw new e(`INVALID_ARGS`,`target-v1 annotation on line ${o.line} must be immediately followed by its action line (end of script reached).`);return{actions:n,actionLines:r}}function D(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(O(t)){j(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&w.has(e)&&M(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&T.has(e)&&M(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&M(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&M(n,`retries`,Math.floor(e))}}return n}function O(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function k(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 a=r.slice(0,i);if(!u.test(a))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(a.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${a} to avoid the AD_ prefix.`);return{key:a,value:A(r.slice(i+1),n)}}function A(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 j(t,n,r){let{key:i,value:a}=k(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 M(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 N(e){let c=e.trim();if(c.length===0||c.startsWith(`#`))return null;let[l,...u]=I(c);if(l===void 0||l===`context`)return null;let d={ts:Date.now(),command:l,positionals:[],flags:{}};if(l===`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(l===`open`){let e=i(u);return d.positionals=e.positionals,Object.assign(d.flags,e.flags),d.runtime=e.runtime,d}if(l===`runtime`){let e=o(u);return d.positionals=e.positionals,Object.assign(d.flags,e.flags),d}if(s(l)){let e=r(l,u);Object.assign(d.flags,e.flags);let t=e.positionals[0];if(t===void 0)return d;if(t.startsWith(`@`))return d.positionals=[a(t)],e.positionals[1]&&(d.result={refLabel:e.positionals[1]}),d;let n=e.positionals[0],i=e.positionals[1];return F(n)&&F(i)&&e.positionals.length>=2?(d.positionals=[n,i],d):(d.positionals=[e.positionals.join(` `)],d)}if(l===`fill`){let e=r(l,u);if(Object.assign(d.flags,e.flags),!P(e.positionals))return d.positionals=e.positionals,d;let[t,n,...i]=e.positionals;if(t.startsWith(`@`)){let e=a(t);return i.length>0?(d.positionals=[e,i.join(` `)],d.result={refLabel:n},d):(d.positionals=[e,n],d)}return d.positionals=[t,[n,...i].join(` `)],d}if(l===`get`){let e=u[0],t=u[1];return e===void 0||t===void 0?(d.positionals=u,d):t.startsWith(`@`)?(d.positionals=[e,a(t)],u[2]&&(d.result={refLabel:u[2]}),d):(d.positionals=[e,u.slice(1).join(` `)],d)}if(l===`swipe`||l===`type`||l===`gesture`){let e=r(l,u);return Object.assign(d.flags,e.flags),d.positionals=e.positionals,d}if(l===`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(l===`screenshot`){let e=[];for(let n=0;n<u.length;n+=1){let r=u[n],i=t({args:u,index:n,flags:d.flags});if(i.handled){n=i.nextIndex;continue}e.push(r)}return d.positionals=e,d}return d.positionals=l===`wait`||l===`longpress`?u.map(e=>a(e)):u,d}function P(e){return e.length>=2}function F(e){return e?!Number.isNaN(Number(e)):!1}function I(e){let t=[],n=0;for(;n<e.length&&(n=L(e,n),!(n>=e.length));){let r=e[n]===`"`?R(e,n):z(e,n);t.push(r.value),n=r.nextCursor}return t}function L(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function R(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}`);return{value:JSON.parse(t.slice(n,a+1)),nextCursor:a+1}}function z(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 B={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 V(e){return Math.trunc(1e3*(100-e)/100)+1}const H={assertVisibleTimeoutMs:B.command.targetLookupTimeoutMs,assertNotVisibleTimeoutMs:B.command.targetLookupTimeoutMs,extendedWaitUntilTimeoutMs:B.command.targetLookupTimeoutMs,runFlowConditionTimeoutMs:B.command.optionalTargetLookupTimeoutMs},U=B.observation.pollIntervalMs*B.observation.defaultSettleAttempts;function W(t={}){let n={...H,...t};for(let[t,r]of Object.entries(n))if(!Number.isInteger(r)||r<0)throw new e(`INVALID_ARGS`,`Maestro timing policy ${t} must be a non-negative integer.`);return n}const G=[`id`,`text`,`enabled`,`selected`],K=[...G,`label`],q=[`id`,`text`,`label`],J=[`enabled`,`selected`];export{v as _,H as a,V as c,D as d,m as f,_ as g,g as h,q as i,W as l,h as m,J as n,B as o,C as p,K as r,U as s,G as t,E as u,b as v};
@@ -1,16 +1,25 @@
1
- import { S as SnapshotNode, V as PublicPlatform, w as SnapshotState, z as Platform } from "./sdk-contracts.js";
1
+ import { F as SnapshotState, H as Platform, N as SnapshotNode, W as PublicPlatform } from "./sdk-contracts.js";
2
2
  import { a as Selector, c as parseSelectorChain, l as tryParseSelectorChain, o as SelectorChain, s as isSelectorToken } from "./sdk-finders.js";
3
- //#region src/daemon/selectors-resolve.d.ts
3
+ import { n as DisambiguationTiebreak } from "./interaction.js";
4
+ //#region src/selectors/resolve.d.ts
4
5
  type SelectorDiagnostics = {
5
6
  selector: string;
6
7
  matches: number;
7
8
  };
9
+ /** Present only when the heuristic picked among N>1 matches (ADR 0012). */
10
+ type SelectorDisambiguationDisclosure = {
11
+ matchCount: number;
12
+ tiebreak: DisambiguationTiebreak;
13
+ /** Every losing matched node, document order, uncapped (response layer caps). */
14
+ alternatives: SnapshotNode[];
15
+ };
8
16
  type SelectorResolution = {
9
17
  node: SnapshotNode;
10
18
  selector: Selector;
11
19
  selectorIndex: number;
12
20
  matches: number;
13
21
  diagnostics: SelectorDiagnostics[];
22
+ disambiguation?: SelectorDisambiguationDisclosure;
14
23
  };
15
24
  declare function resolveSelectorChain(nodes: SnapshotState['nodes'], chain: SelectorChain, options: {
16
25
  platform: Platform | PublicPlatform;
@@ -31,7 +40,7 @@ declare function formatSelectorFailure(chain: SelectorChain, diagnostics: Select
31
40
  unique?: boolean;
32
41
  }): string;
33
42
  //#endregion
34
- //#region src/utils/selector-node.d.ts
43
+ //#region src/selectors/node.d.ts
35
44
  declare function isNodeVisible(node: SnapshotNode): boolean;
36
45
  declare function isNodeEditable(node: SnapshotNode, platform: Platform | PublicPlatform): boolean;
37
46
  //#endregion
@@ -1 +1 @@
1
- import{C as e,S as t,T as n}from"./sdk-batch.js";import{c as r,s as i}from"./sdk-selectors.js";import{a,i as o,r as s}from"./selectors2.js";export{s as findSelectorChainMatch,o as formatSelectorFailure,i as isNodeEditable,r as isNodeVisible,t as isSelectorToken,e as parseSelectorChain,a as resolveSelectorChain,n as tryParseSelectorChain};
1
+ import{M as e,P as t,j as n}from"./sdk-batch.js";import{C as r,d as i,f as a,m as o,w as s}from"./sdk-selectors.js";export{i as findSelectorChainMatch,a as formatSelectorFailure,r as isNodeEditable,s as isNodeVisible,n as isSelectorToken,e as parseSelectorChain,o as resolveSelectorChain,t as tryParseSelectorChain};
@@ -1,3 +1,3 @@
1
- import{B as e,F as t,c as n,n as r,o as i,s as a}from"./sdk-contracts.js";import{Qt as o,s,t as c}from"./tv-remote.js";import{n as l}from"./version.js";import{M as u,N as d,c as f,j as p}from"./registry.js";import{i as ee,n as m}from"./command-metadata.js";import{t as h}from"./cli-output.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`}};function S(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:d(`Snapshot ref without the @ prefix when the target was an @ref.`),selector:d(`Selector expression when the target was a selector.`),selectorChain:x,refLabel:d(),targetHittable:p(),hint:d(),warning:d(),message:d(),evidence:C,...t},[`targetKind`,...n])}const C=b({foregroundApp:d(`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:d(`Order-independent digest of the post-action node multiset.`),changedFromBefore:p(`Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.`)},[`nodeCount`,`interactiveNodeCount`,`digest`,`changedFromBefore`]),w=b({settled:p(`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:d(`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:d(),ref:d(`Plain ref body (e12) for added lines.`)},[`kind`,`text`])},truncated:p(`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:d(`Plain ref body (e12) minted from the stored settled tree.`),role:d(),label:d()},[`ref`,`role`])},tailTruncated:p(`Present (true) when tail candidates exceeded the response cap.`),hint:d()},[`settled`,`waitedMs`,`captures`,`quietMs`,`timeoutMs`]),T={platform:v(n),target:v(a),device:d(`Human-readable device name.`),id:d(`Stable device id.`),kind:v(g)},E=[`platform`,`target`,`device`,`id`,`kind`],te=b({success:p(),exitCode:_(),stdout:d(),stderr:d(),error:u(`Normalized error detail when shutdown failed.`)},[`success`,`exitCode`,`stdout`,`stderr`]),D={press:S({properties:{evidence:C,settle:w,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:p(`Whether the command requested a double-tap action.`)}}),fill:S({properties:{text:d(`Text submitted to the field.`),delayMs:_(`Delay between typed characters in milliseconds.`),evidence:C,settle:w},required:[`text`]}),longpress:S({properties:{durationMs:_(),settle:w,gesture:y(`longpress`)}}),boot:b({...T,booted:{type:`boolean`,const:!0}},[...E,`booted`]),shutdown:b({...T,shutdown:te},[...E,`shutdown`]),viewport:b({width:_(),height:_(),message:d()},[`width`,`height`,`message`]),home:b({action:y(`home`),message:d()},[`action`,`message`]),back:b({action:y(`back`),mode:v(f),message:d()},[`action`,`mode`,`message`]),rotate:b({action:y(`rotate`),orientation:v(s),message:d()},[`action`,`orientation`,`message`]),"app-switcher":b({action:y(`app-switcher`),message:d()},[`action`,`message`]),"tv-remote":b({action:y(`tv-remote`),button:v(c),durationMs:_(),message:d()},[`action`,`button`,`message`]),wait:b({waitedMs:_(),kind:y(`selector`),text:d(),selector:d(),captures:_(),nodeCount:_(),hint:d(),warning:d()},[`waitedMs`]),prepare:b({action:y(`ios-runner`),platform:v(n),deviceId:d(),deviceName:d(),kind:v(g),durationMs:_(),runner:b({},[]),cache:v([`exact`,`restore-key`,`miss`,`external`]),artifact:v([`valid`,`rebuilt`]),buildMs:_(),connectMs:_(),healthCheckMs:_(),xctestrunPath:d(),recoveryReason:d(),failureReason:d(),timing:b({totalMs:_(),additiveParts:b({buildMs:_(),connectAfterBuildMs:_(),healthCheckMs:_()},[`connectAfterBuildMs`,`healthCheckMs`]),containment:b({connectMs:{type:`array`,items:y(`buildMs`)},healthCheckMs:{type:`array`,items:d()}},[`healthCheckMs`]),note:d()},[`totalMs`,`additiveParts`,`containment`,`note`]),message:d()},[`action`,`platform`,`deviceId`,`deviceName`,`kind`,`durationMs`,`runner`,`connectMs`,`healthCheckMs`,`timing`,`message`]),push:{type:`object`,oneOf:[b({platform:y(`ios`),bundleId:d(),message:d()},[`platform`,`bundleId`,`message`]),b({platform:y(`android`),package:d(),action:d(),extrasCount:_(),message:d()},[`platform`,`package`,`action`,`extrasCount`,`message`])]},"trigger-app-event":b({event:d(),eventUrl:d(),transport:y(`deep-link`),message:d()},[`event`,`eventUrl`,`transport`,`message`]),clipboard:{type:`object`,oneOf:[b({action:y(`read`),text:d()},[`action`,`text`]),b({action:y(`write`),textLength:_(),message:d()},[`action`,`textLength`,`message`])]},appstate:{type:`object`,oneOf:[b({platform:v([`ios`,`macos`]),appName:d(),appBundleId:d(),source:y(`session`),surface:v(o),device_udid:d(`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:d(),activity:d()},[`platform`,`package`,`activity`])]},keyboard:b({platform:v([`android`,`ios`]),action:v([`status`,`dismiss`,`enter`]),visible:p(),wasVisible:p(),dismissed:p(),attempts:_(),inputType:d(),type:v([`text`,`number`,`email`,`phone`,`password`,`datetime`,`unknown`]),inputMethodPackage:d(),focusedPackage:d(),focusedResourceId:d(),inputOwner:v([`app`,`ime`,`unknown`]),message:d()},[`platform`,`action`])};function ne(){return ee().map(e=>{let t=e.name in D?D[e.name]:void 0;return{name:e.name,description:e.description,inputSchema:K(e.inputSchema),...t?{outputSchema:t}:{}}})}function re(e={}){let n=new Map;return{execute:async(r,i)=>{if(!m(r))throw new t(`INVALID_ARGS`,`Unknown command tool: ${r}`);let a=V(i),o=G(i),s=se(a,o),c=N(r,o,n.get(s)),l=await z(e,a.client),u=await(e.runCommand??B)(l,r,c);return O(n,s,r,u),{isError:!1,structuredContent:u,content:[{type:`text`,text:ce({name:r,input:o,result:u,outputFormat:a.outputFormat,responseLevel:a.client.responseLevel})}]}}}}const ie=new Set([`snapshot`,`find`]),ae=new Set([`press`,`click`,`fill`,`longpress`]),oe=new Set([`press`,`click`,`fill`,`longpress`,`get`]);function se(e,t){let n=L(t)?.session,r=typeof n==`string`&&n.length>0?n:`default`;return`${e.client.stateDir??``}\u0000${r}`}function O(e,t,n,r){if(ae.has(n)){k(e,t,r);return}if(!ie.has(n))return;let i=L(r),a=i?.refsGeneration;if(i===void 0||typeof a!=`number`){e.delete(t);return}let o=j(i);if(o.length===0)return;let s=e.get(t)??new Map;e.set(t,s),A(s,o,a)}function k(e,t,n){let r=L(L(n)?.settle);if(!r)return;let i=r?.refsGeneration;if(typeof i!=`number`)return;let a=L(r?.diff)?.lines,o=[];if(M(a,o),M(r.refs,o),M(r.tail,o),o.length===0)return;let s=e.get(t)??new Map;e.set(t,s),A(s,o,i)}function A(e,t,n){for(let r of t)e.delete(r),e.set(r,n);for(;e.size>1e3;){let t=e.keys().next().value;if(t===void 0)break;e.delete(t)}}function j(e){let t=[];return typeof e.ref==`string`&&e.ref.startsWith(`@`)&&t.push(e.ref.slice(1)),M(e.nodes,t),M(e.refs,t),t}function M(e,t){if(Array.isArray(e))for(let n of e){let e=L(n)?.ref;typeof e==`string`&&e.length>0&&t.push(e)}}function N(e,t,n){if(n===void 0||n.size===0)return t;let r=L(t);return r?e===`wait`?P(r,n)??t:oe.has(e)?F(r,n)??t:t:t}function P(e,t){if(typeof e.ref!=`string`)return;let n=I(e.ref,t);return n===e.ref?void 0:{...e,ref:n}}function F(e,t){let n=L(e.target);if(n?.kind!==`ref`||typeof n.ref!=`string`)return;let r=I(n.ref,t);return r===n.ref?void 0:{...e,target:{...n,ref:r}}}function I(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 L(e){if(!(!e||typeof e!=`object`||Array.isArray(e)))return e}const R=re();async function z(e,t){if(e.createClient)return await e.createClient(t);let{createAgentDeviceClient:n}=await import(`./client.js`).then(e=>e.t);return n(t)}async function B(e,t,n){return await(await import(`./command-surface.js`).then(e=>e.t)).runCommand(e,t,n)}function V(e){if(!e||typeof e!=`object`||Array.isArray(e))return{client:{},outputFormat:`optimized`};let t=e;return{client:H(t),outputFormat:W(t.mcpOutputFormat)}}function H(e){let n=e.stateDir,r=e.includeCost,i=e.responseLevel,a={};if(n!==void 0&&(typeof n!=`string`||n.length===0))throw new t(`INVALID_ARGS`,`Expected stateDir to be a non-empty string.`);if(typeof n==`string`&&(a.stateDir=n),r!==void 0&&typeof r!=`boolean`)throw new t(`INVALID_ARGS`,`Expected includeCost to be a boolean.`);r===!0&&(a.cost=!0);let o=U(i);return o!==void 0&&(a.responseLevel=o),a}function U(e){if(e!==void 0){if(typeof e!=`string`||!r.includes(e))throw new t(`INVALID_ARGS`,`Expected responseLevel to be one of 'digest', 'default', or 'full'.`);return e}}function W(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 G(e){if(!e||typeof e!=`object`||Array.isArray(e))return e;let{stateDir:t,mcpOutputFormat:n,includeCost:r,responseLevel:i,...a}=e;return a}function K(e){return{...e,properties:{...e.properties,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 ce(e){if(e.outputFormat===`json`||e.responseLevel!==void 0&&e.responseLevel!=="default")return q(e.result);let t=h({name:e.name,input:e.input,result:e.result});return typeof t?.text==`string`?t.text:q(t?.data??e.result)}function q(e){return typeof e==`string`?e:JSON.stringify(e,null,2)}async function le(e){if(e.jsonrpc!==`2.0`||typeof e.method!=`string`)return J(e.id??null,-32600,`Invalid JSON-RPC request.`);if(e.id===void 0)return null;try{return he(e.id,await ue(e.method,e.params))}catch(t){return t instanceof Y?J(e.id,-32601,t.message):J(e.id,-32602,t instanceof Error?t.message:String(t))}}async function ue(e,t){switch(e){case`initialize`:return{protocolVersion:pe(t),capabilities:{tools:{}},serverInfo:{name:`agent-device`,version:l()}};case`ping`:return{};case`tools/list`:return{tools:ne()};case`tools/call`:return await de(t);default:throw new Y(`Unsupported MCP method: ${e}`)}}async function de(e){let t=ge(e),n=_e(t,`name`);try{return await R.execute(n,t.arguments)}catch(e){return me(fe(e),!0)}}function fe(t){let n=e(t),r=[`Error (${n.code}): ${n.message}`];return n.hint&&r.push(`Hint: ${n.hint}`),n.supportedOn&&r.push(`Supported on: ${n.supportedOn}`),r.join(`
2
- `)}function pe(e){return`2025-11-25`}function me(e,t=!1){return{isError:t,content:[{type:`text`,text:e}]}}function he(e,t){return{jsonrpc:`2.0`,id:e,result:t}}function J(e,t,n){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n}}}function ge(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`Expected object parameters.`);return e}function _e(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 Y=class extends Error{};async function ve(){let e=ye(),t=new Ce(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 ye(e={}){let t=e.handlePayload??X,n=e.write??$,r=Promise.resolve();return{push:e=>{let i=Se(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 X(e){return Array.isArray(e)?be(e):Z(e)}async function be(e){let t=[];for(let n of e)t.push(...we(await Z(n)));return t.length>0?t:null}async function Z(e){let t;try{t=i.parse(e)}catch{return xe(Q(e))}return le(t)}function xe(e){return{jsonrpc:`2.0`,id:e,error:{code:-32600,message:`Invalid JSON-RPC request.`}}}function Se(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 Ce=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
- `);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 we(e){return e?[e]:[]}function $(e){process.stdout.write(`${JSON.stringify(e)}\n`)}export{ve as runAgentDeviceMcpServer};
1
+ import{S as e,_ as t,n,o as r}from"./sdk-contracts.js";import{g as i}from"./sdk-batch.js";import{Ft as a,Wn as o,fn as s}from"./tv-remote.js";import{n as c}from"./version.js";import{r as l,t as u}from"./sdk-device.js";import{c as d}from"./sdk-batch-runner.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(l),target:v(u),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(l),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(u),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(),artifactPaths:x,snapshotDiagnostics:f(),message:m()},[`replayed`,`healed`,`session`,`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:l},target:{type:`string`,enum:u},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=o(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(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=d(d(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=d(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=d(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:c()}};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
+ `);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};
@@ -0,0 +1 @@
1
+ import{c as e,ct as t,dt as n,ft as r,i,lt as a,o,ot as s}from"./sdk-selectors.js";import{s as c}from"./android-input-method-overlays.js";import{on as l}from"./internal/daemon.js";function u(e){let{node:t,preActionNodes:i}=e;if(typeof t.index!=`number`)return;let a=d(i),o=y(f(t),i),s=p(t,a,8),c=s.chain,l=m(i,t),u=h(t,a),g=_(t),v=+(c.length>0),x=e=>{let n=c.slice(0,e),r=b({nodes:i,byIndex:a,node:t,identity:o,ancestry:n,sibling:l,scrollRegion:u});return{candidate:{...o,ancestry:n,sibling:l,viewportOrder:r.viewportOrder,...u?{scrollRegion:u}:{},...g?{rect:g}:{},verification:`verified`},domain:r}};for(let e=c.length;e>=v;--e){let{candidate:i,domain:a}=x(e);if(r(n({...i,verification:`unverifiable`}))<=4096)return i.verification=s.broken?`unverifiable`:S({node:t,domain:a}),i;if(e===v)return i.verification=`unverifiable`,r(n(i))>4096&&delete i.rect,i}}function d(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}const f=o;function p(e,t,n){let r=[],i=new Set([e.index]),a=e;for(;r.length<n;){if(typeof a.parentIndex!=`number`)return{chain:r,broken:!1};let e=t.get(a.parentIndex);if(!e||i.has(e.index))return{chain:r,broken:!0};i.add(e.index);let n=f(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function m(t,n){return e(t,n)}function h(e,t){let n=l(e,t);if(!n)return;let r=f(n);return{role:r.role,...r.id===void 0?r.label===void 0?{}:{label:r.label}:{id:r.id}}}function g(e,t){return!e&&!t?!0:!e||!t?!1:a(e,t)}function _(e){let t=e.rect;if(t)return{x:t.x,y:t.y,width:t.width,height:t.height}}function v(e,n,r,i){return e.filter(e=>{if(!a(f(e),r))return!1;let o=p(e,n,Math.max(i.length,1));return!o.broken&&t(o.chain,i)})}function y(e,t){return i(e,t)}function b(e){let{nodes:t,byIndex:n,node:r,identity:i,ancestry:a,sibling:o,scrollRegion:s}=e,c=v(t,n,i,a),l=c.filter(e=>m(t,e)===o),u=c.length>0?c.filter(e=>g(h(e,n),s)):void 0,d=u?x(u):[];return{identitySet:c,siblingMatches:l,regionMembers:u,orderedRegion:d,viewportOrder:Math.max(d.findIndex(e=>e.index===r.index),0)}}function x(e){return e.map((e,t)=>({node:e,documentOrder:t,center:c(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 S(e){let{node:t,domain:n}=e,r=t.ref,i=n.identitySet.map(e=>e.ref);return s({winnerRef:r,matchedRefs:i,identitySetRefs:i,siblingMatchRefs:n.siblingMatches.map(e=>e.ref),regionMemberRefs:n.regionMembers?.map(e=>e.ref),viewportCandidateRef:n.orderedRegion[n.viewportOrder]?.ref}).outcome}export{m as a,x as c,h as i,g as l,p as n,u as o,d as r,v as s,f as t};