agent-device 0.20.5 → 0.20.7

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 (196) hide show
  1. package/README.md +5 -3
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.5.apk → agent-device-android-ime-helper-0.20.7.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.7.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.5.manifest.json → agent-device-android-ime-helper-0.20.7.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.5.apk → agent-device-android-snapshot-helper-0.20.7.apk} +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.7.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.5.manifest.json → agent-device-android-snapshot-helper-0.20.7.manifest.json} +6 -6
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +48 -0
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +1 -0
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +108 -1
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +630 -89
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSelectorMatchPolicy.swift +78 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +126 -187
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.h +32 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.m +212 -0
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +149 -10
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +161 -32
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +4 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +36 -28
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +23 -5
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +10 -0
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -67
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +18 -1
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +2 -22
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +4 -0
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +2 -1
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +145 -20
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -20
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +4 -0
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +234 -0
  31. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +106 -448
  32. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +4 -0
  33. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +602 -0
  34. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +18 -0
  35. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerXCTestEventBridge.h +72 -0
  36. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerXCTestEventBridge.m +89 -0
  37. package/dist/src/agent-browser-tool.js +1 -1
  38. package/dist/src/agent-device-client.js +2 -2
  39. package/dist/src/android-adb.js +1 -1
  40. package/dist/src/android.js +1 -1
  41. package/dist/src/app-helpers.js +1 -1
  42. package/dist/src/app-lifecycle.js +7 -7
  43. package/dist/src/app-lifecycle2.js +2 -0
  44. package/dist/src/app-log-files.js +1 -0
  45. package/dist/src/app-log-reconnect.js +1 -0
  46. package/dist/src/app-log-runtime.js +4 -0
  47. package/dist/src/app-resolution.js +2 -1
  48. package/dist/src/apps.js +5 -5
  49. package/dist/src/audio-probe.js +1 -1
  50. package/dist/src/auth-session.js +1 -0
  51. package/dist/src/auth.js +2 -0
  52. package/dist/src/boot-diagnostics.js +2 -2
  53. package/dist/src/cli-config.js +1 -1
  54. package/dist/src/cli-grammar.js +1 -0
  55. package/dist/src/cli-help.js +204 -254
  56. package/dist/src/cli-output.js +1 -0
  57. package/dist/src/cli-runner.js +1 -2
  58. package/dist/src/cli.js +6 -16
  59. package/dist/src/client-metro.js +1 -1
  60. package/dist/src/cloud-artifacts.d.ts +2 -137
  61. package/dist/src/command-metadata.js +1 -1
  62. package/dist/src/command-schema.js +3 -3
  63. package/dist/src/connection-runtime.js +1 -0
  64. package/dist/src/connection.js +5 -0
  65. package/dist/src/context.js +1 -1
  66. package/dist/src/daemon-shutdown-report.js +1 -0
  67. package/dist/src/daemon.js +2 -0
  68. package/dist/src/debug-symbols.js +3 -3
  69. package/dist/src/device-claim-inspection.js +1 -0
  70. package/dist/src/device-input-state.js +2 -2
  71. package/dist/src/device.js +1 -1
  72. package/dist/src/device2.js +2 -0
  73. package/dist/src/find.js +1 -1
  74. package/dist/src/finders.js +1 -1
  75. package/dist/src/generic-settle.js +1 -0
  76. package/dist/src/generic.js +1 -1
  77. package/dist/src/harmonyos.js +1 -0
  78. package/dist/src/helper.js +1 -1
  79. package/dist/src/host-process.js +2 -2
  80. package/dist/src/ime-lifecycle.js +7 -7
  81. package/dist/src/index.d.ts +69 -18
  82. package/dist/src/input-actions.js +4 -4
  83. package/dist/src/input-actions2.js +1 -1
  84. package/dist/src/input-actions3.js +1 -0
  85. package/dist/src/install-artifact.js +1 -5
  86. package/dist/src/install-artifact2.js +1 -1
  87. package/dist/src/install-source2.js +1 -1
  88. package/dist/src/interaction-runtime.js +1 -0
  89. package/dist/src/interaction-snapshot.js +1 -1
  90. package/dist/src/interaction-touch-reference-frame.js +1 -0
  91. package/dist/src/interaction.js +1 -1
  92. package/dist/src/interactor.js +2 -2
  93. package/dist/src/interactor2.js +1 -1
  94. package/dist/src/internal/bin.js +2 -2
  95. package/dist/src/internal/daemon.js +9 -16
  96. package/dist/src/inventory.js +5 -0
  97. package/dist/src/inventory2.js +1 -0
  98. package/dist/src/inventory3.js +2 -0
  99. package/dist/src/inventory4.js +1 -0
  100. package/dist/src/inventory5.js +1 -0
  101. package/dist/src/inventory6.js +1 -0
  102. package/dist/src/lease-context.js +1 -1
  103. package/dist/src/lease.js +1 -1
  104. package/dist/src/limrun-runtime-dependencies.js +1 -0
  105. package/dist/src/limrun.d.ts +10 -104
  106. package/dist/src/limrun.js +1 -1
  107. package/dist/src/linux.js +1 -1
  108. package/dist/src/logcat.js +1 -1
  109. package/dist/src/manifest.js +1 -1
  110. package/dist/src/owner-identity.js +1 -0
  111. package/dist/src/physical-device-control.js +1 -1
  112. package/dist/src/platform-runtime-app-log-android-transport.js +1 -0
  113. package/dist/src/platform-runtime-app-log-process.js +1 -0
  114. package/dist/src/platform-runtime-host.js +1 -0
  115. package/dist/src/platform-runtime-network-web-transport.js +1 -0
  116. package/dist/src/platform-runtime-operation-host.js +5 -0
  117. package/dist/src/platform-runtime-toolchain-host.js +1 -0
  118. package/dist/src/platform-runtime.js +1 -0
  119. package/dist/src/prepare-kind.js +15 -0
  120. package/dist/src/process-entry.js +1 -0
  121. package/dist/src/process-exit.js +1 -0
  122. package/dist/src/process-lock.js +1 -1
  123. package/dist/src/provider-webdriver.js +1 -0
  124. package/dist/src/provider.js +1 -0
  125. package/dist/src/proxy.js +2 -0
  126. package/dist/src/react-native.js +1 -1
  127. package/dist/src/record-trace.js +1 -1
  128. package/dist/src/registry.js +25 -24
  129. package/dist/src/remote-config.js +1 -1
  130. package/dist/src/remote-config2.js +1 -1
  131. package/dist/src/replay.js +3 -0
  132. package/dist/src/reporting.js +4 -4
  133. package/dist/src/runner-client.js +1 -1
  134. package/dist/src/runner-disposal.js +1 -1
  135. package/dist/src/runner-lease.js +1 -1
  136. package/dist/src/runtime.js +3 -3
  137. package/dist/src/runtime2.js +4 -0
  138. package/dist/src/runtime3.js +3 -0
  139. package/dist/src/runtime4.js +1 -0
  140. package/dist/src/runtime5.js +1 -0
  141. package/dist/src/runtime6.js +1 -0
  142. package/dist/src/runtime7.js +1 -0
  143. package/dist/src/screenshot-result.js +4 -4
  144. package/dist/src/screenshot.js +1 -0
  145. package/dist/src/sdk-android-adb.d.ts +20 -2
  146. package/dist/src/sdk-android-adb.js +2 -2
  147. package/dist/src/sdk-batch-runner.js +3 -3
  148. package/dist/src/sdk-contracts.d.ts +47 -6
  149. package/dist/src/sdk-contracts.js +1 -1
  150. package/dist/src/sdk-device.js +1 -1
  151. package/dist/src/sdk-finders.d.ts +4 -20
  152. package/dist/src/sdk-finders.js +1 -1
  153. package/dist/src/sdk-remote-config.js +1 -1
  154. package/dist/src/sdk-selectors.d.ts +601 -0
  155. package/dist/src/sdk-selectors.js +1 -1
  156. package/dist/src/selector-runtime.js +1 -1
  157. package/dist/src/selector-vocabulary.js +1 -1
  158. package/dist/src/selectors.d.ts +1 -46
  159. package/dist/src/selectors.js +1 -1
  160. package/dist/src/server.js +3 -3
  161. package/dist/src/session-target-evidence.js +1 -1
  162. package/dist/src/session.js +10 -9
  163. package/dist/src/shared.js +2 -0
  164. package/dist/src/shell-quote.js +1 -0
  165. package/dist/src/simulator.js +1 -1
  166. package/dist/src/snapshot-runtime.js +1 -0
  167. package/dist/src/snapshot-session.js +1 -0
  168. package/dist/src/snapshot.js +1 -1
  169. package/dist/src/snapshot2.js +1 -1
  170. package/dist/src/src.js +1 -1
  171. package/dist/src/src2.js +2 -0
  172. package/dist/src/src3.js +1 -0
  173. package/dist/src/text-surface.js +1 -0
  174. package/dist/src/timing-safe-equal.js +1 -0
  175. package/dist/src/tool-provider.js +3 -3
  176. package/dist/src/tool-provider2.js +1 -1
  177. package/dist/src/tool-provider3.js +1 -1
  178. package/dist/src/update-check.js +1 -1
  179. package/dist/src/version.js +1 -1
  180. package/dist/src/web.js +1 -1
  181. package/package.json +72 -50
  182. package/server.json +3 -3
  183. package/skills/agent-device/SKILL.md +6 -31
  184. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.5.apk.sha256 +0 -1
  185. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.5.apk.sha256 +0 -1
  186. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -225
  187. package/dist/src/app-log-request-scope.js +0 -1
  188. package/dist/src/devices.js +0 -1
  189. package/dist/src/devices2.js +0 -1
  190. package/dist/src/devices3.js +0 -1
  191. package/dist/src/devices4.js +0 -1
  192. package/dist/src/interaction.d.ts +0 -230
  193. package/dist/src/provider-limrun-runtime.js +0 -1
  194. package/dist/src/register-builtins.js +0 -1
  195. package/dist/src/screenshot-geometry.js +0 -1
  196. package/dist/src/viewport-dimension.js +0 -14
@@ -1,230 +0,0 @@
1
- import { A as SnapshotNode, m as ResponseCost } from "./sdk-contracts.js";
2
- //#region packages/contracts/src/click-button.d.ts
3
- declare const CLICK_BUTTONS: readonly ['primary', 'secondary', 'middle'];
4
- type ClickButton = (typeof CLICK_BUTTONS)[number];
5
- //#endregion
6
- //#region packages/contracts/src/interaction.d.ts
7
- /** The decisive criterion separating a resolveSelectorChain winner from its strongest runner-up (ADR 0012). */
8
- type DisambiguationTiebreak = 'visible' | 'deepest' | 'smallest-area';
9
- /**
10
- * A disambiguation winner or losing alternative. `diagnosticRef` is an opaque,
11
- * non-`@` token — never a snapshot ref, never issued via `refsGeneration`,
12
- * never pinnable or usable as an `@ref` target. Strings are UTF-8 truncated
13
- * to 256 bytes.
14
- */
15
- type ResolutionDiagnosticEntry = {
16
- diagnosticRef: string;
17
- role?: string;
18
- label?: string;
19
- };
20
- /**
21
- * ADR 0012 decision 2: pre-action disclosure of how the acting path resolved
22
- * its target, on every press/click/fill/longpress response. Never ref-issuing.
23
- * `direct-ios`/`not-observed` = the XCTest fast path has no daemon tree to
24
- * report from; `ref`/`label-fallback` = a stale `@ref` recovered via
25
- * first-match label lookup, never exact ref provenance; `alternatives` holds
26
- * at most 5 losing candidates, winner excluded.
27
- */
28
- type ResolutionDisclosure = {
29
- source: 'runtime';
30
- phase: 'pre-action';
31
- kind: 'unique';
32
- } | {
33
- source: 'runtime';
34
- phase: 'pre-action';
35
- kind: 'disambiguated';
36
- matchCount: number;
37
- winnerDiagnostic: ResolutionDiagnosticEntry;
38
- tiebreak: DisambiguationTiebreak;
39
- alternatives: ResolutionDiagnosticEntry[];
40
- } | {
41
- source: 'ref';
42
- phase: 'pre-action';
43
- kind: 'exact';
44
- } | {
45
- source: 'ref';
46
- phase: 'pre-action';
47
- kind: 'label-fallback';
48
- } | {
49
- source: 'direct-ios';
50
- kind: 'not-observed';
51
- };
52
- /**
53
- * Opt-in (`--verify`) cheap post-condition evidence for mutating interaction
54
- * commands (#1047). `digest`/`nodeCount`/`interactiveNodeCount` describe a single
55
- * interactive-only capture taken right after the action; `changedFromBefore`
56
- * compares that digest against the pre-action capture the resolution path already
57
- * held, so no extra device round trip is spent beyond the one verify capture.
58
- * `changedFromBefore: false` is evidence, not failure — the command still
59
- * succeeded.
60
- */
61
- type InteractionEvidence = {
62
- foregroundApp?: string;
63
- nodeCount: number;
64
- interactiveNodeCount: number;
65
- digest: string;
66
- changedFromBefore: boolean;
67
- };
68
- type SettleDiffLine = {
69
- kind: 'added' | 'removed';
70
- text: string;
71
- /**
72
- * Plain ref body (`e12`) for ADDED lines: minted from the settled tree that
73
- * became the stored session snapshot, so it is immediately actionable and
74
- * lets the MCP layer pin it at `refsGeneration`. Removed lines never carry
75
- * one — their refs name nodes of the replaced tree.
76
- */
77
- ref?: string;
78
- };
79
- /**
80
- * One still-present, actionable element on the settled tree, surfaced by the
81
- * unchanged-interactive tail (see `SettleObservation.tail`).
82
- */
83
- type SettleTailEntry = {
84
- ref: string;
85
- role: string;
86
- label?: string;
87
- };
88
- type SettleObservation = {
89
- settled: boolean;
90
- waitedMs: number;
91
- captures: number;
92
- quietMs: number;
93
- timeoutMs: number;
94
- /**
95
- * The session's snapshot generation after the settled tree became the stored
96
- * snapshot (#1076 versioned refs). Attached by the daemon response layer
97
- * when `diff` is present: added lines carry refs minted from that tree, so
98
- * the response is ref-issuing — the MCP layer merges per-ref pins from it
99
- * exactly like snapshot/find responses.
100
- */
101
- refsGeneration?: number;
102
- /**
103
- * Digest response view only: capped added-line refs preserved without the
104
- * verbose diff line text, so MCP can still pin refs when `diff.lines` is
105
- * intentionally omitted.
106
- */
107
- refs?: Array<{
108
- ref: string;
109
- }>;
110
- /** Present only for `settled: true` observations that stored the settled tree. */
111
- diff?: {
112
- summary: {
113
- additions: number;
114
- removals: number;
115
- unchanged: number;
116
- };
117
- lines: SettleDiffLine[];
118
- /** Present (true) when lines were capped to the response bound. */
119
- truncated?: boolean;
120
- };
121
- /**
122
- * Unchanged interactive refs tail: benchmarks (July 2026) showed 27% of
123
- * `--settle` actions were followed by a fallback `snapshot -i` because a
124
- * change-only diff omits refs for elements that did not change — after a
125
- * modal dismiss the diff shows only removals, and the next button to press
126
- * (already on screen, untouched) is absent from the response. `tail` lists
127
- * the settled tree's remaining uncovered interactive elements (excluding
128
- * structural application/window chrome and the keyboard window's chrome)
129
- * so the response stays actionable without that extra round trip. Attached
130
- * ONLY when `diff` carries zero added-line refs naming a NEW target (the
131
- * modal-dismiss/toast-only/fill signature) — a diff whose added refs hand
132
- * the next target already pays its way, so the tail would be pure byte
133
- * cost. Keyboard-chrome refs and self-echo refs (added lines whose node
134
- * contains the action point: the acted-on element re-describing itself,
135
- * e.g. a filled field re-labeled with its new value) do not count as new
136
- * targets. Refs already present on `diff`'s added lines are excluded.
137
- * Capped; `tailTruncated` marks when candidates exceeded the cap.
138
- */
139
- tail?: SettleTailEntry[];
140
- tailTruncated?: true;
141
- hint?: string;
142
- };
143
- /**
144
- * Public daemon response data shared by press/click/fill/longpress.
145
- * `buildInteractionResponseData` emits this shape (ADR 0011 Layer 2):
146
- * `targetKind` discriminates the resolved target, identity fields are FLAT
147
- * (`ref`, `selector`, `x`, `y`), and per-command extras ride alongside.
148
- */
149
- type TouchResponseDataBase = {
150
- message?: string;
151
- warning?: string;
152
- x?: number;
153
- y?: number;
154
- referenceWidth?: number;
155
- referenceHeight?: number;
156
- evidence?: InteractionEvidence;
157
- settle?: SettleObservation;
158
- resolution?: ResolutionDisclosure;
159
- cost?: ResponseCost;
160
- /** Direct iOS Maestro coordinate-fallback signals. */
161
- maestroNonHittableCoordinateFallbackAllowed?: boolean;
162
- maestroNonHittableCoordinateFallbackUsed?: boolean;
163
- maestroFallbackReason?: 'non-hittable-coordinate';
164
- };
165
- type TouchResponsePoint = TouchResponseDataBase & {
166
- targetKind: 'point';
167
- x: number;
168
- y: number;
169
- };
170
- type TouchResponseRef = TouchResponseDataBase & {
171
- targetKind: 'ref';
172
- ref: string;
173
- refLabel?: string;
174
- selectorChain?: string[];
175
- targetHittable?: boolean;
176
- hint?: string;
177
- };
178
- type TouchResponseSelector = TouchResponseDataBase & {
179
- targetKind: 'selector';
180
- selector: string;
181
- selectorChain?: string[];
182
- refLabel?: string;
183
- targetHittable?: boolean;
184
- hint?: string;
185
- };
186
- type TouchPressExtras = {
187
- button?: ClickButton;
188
- count?: number;
189
- intervalMs?: number;
190
- holdMs?: number;
191
- jitterPx?: number;
192
- doubleTap?: boolean;
193
- };
194
- type PressCommandResponseData = (TouchResponsePoint & TouchPressExtras) | (TouchResponseRef & TouchPressExtras) | (TouchResponseSelector & TouchPressExtras);
195
- type ClickCommandResponseData = PressCommandResponseData;
196
- type TouchFillExtras = {
197
- text: string;
198
- delayMs?: number;
199
- };
200
- type FillCommandResponseData = (TouchResponsePoint & TouchFillExtras) | (TouchResponseRef & TouchFillExtras) | (TouchResponseSelector & TouchFillExtras);
201
- type TouchLongPressExtras = {
202
- durationMs?: number;
203
- gesture: 'longpress';
204
- };
205
- type LongPressCommandResponseData = (TouchResponsePoint & TouchLongPressExtras) | (TouchResponseRef & TouchLongPressExtras) | (TouchResponseSelector & TouchLongPressExtras);
206
- /**
207
- * Daemon response data for the `find` command. Read-only actions (`exists`,
208
- * `wait`, `get_text`, `get_attrs`) may issue a pinnable ref with
209
- * `refsGeneration`; mutating actions (`click`, `fill`, `focus`, `type`) carry
210
- * `ref` as diagnostic pre-action identity and intentionally omit `refsGeneration`
211
- * (ADR 0014). The shape is intentionally a flat, optional-field record because
212
- * the action positional changes which fields are present.
213
- */
214
- type FindCommandResponseData = {
215
- ref?: string;
216
- refsGeneration?: number;
217
- found?: true;
218
- waitedMs?: number;
219
- text?: string;
220
- node?: SnapshotNode;
221
- locator?: string;
222
- query?: string;
223
- x?: number;
224
- y?: number;
225
- message?: string;
226
- settle?: SettleObservation;
227
- cost?: ResponseCost;
228
- };
229
- //#endregion
230
- export { LongPressCommandResponseData as a, FindCommandResponseData as i, DisambiguationTiebreak as n, PressCommandResponseData as o, FillCommandResponseData as r, ClickButton as s, ClickCommandResponseData as t };
@@ -1 +0,0 @@
1
- import{o as e}from"./png-worker-contract.js";import{_ as t}from"./sdk-contracts.js";import{p as n,v as r}from"./sdk-android-adb.js";import{n as i}from"./version.js";import{n as a,r as o}from"./src.js";import{n as s}from"./android.js";function c(){return{clientVersion:i(),android:{createInteractor:(e,t)=>s(e,t),createPortReverse:async e=>{let{createAndroidPortReverseManager:t}=await import(`./sdk-android-adb.js`).then(e=>e.t);return t(e)},inferAppName:async e=>{let{inferAndroidAppName:t}=await import(`./app-lifecycle.js`).then(e=>e.t);return t(e)},listApps:async(e,t)=>{let{listAndroidAppsWithAdb:n}=await import(`./app-helpers.js`).then(e=>e.t);return(await n(e,{filter:t,target:`mobile`})).map(e=>({id:e.package,name:e.name}))},getForegroundApp:async e=>{let{getAndroidAppStateWithAdb:t}=await import(`./app-helpers.js`).then(e=>e.t),n=await t(e);return n.package?{appId:n.package,activity:n.activity}:void 0},getKeyboardState:async e=>{let{getAndroidKeyboardStatusWithAdb:t}=await import(`./device-input-state.js`).then(e=>e.t);return await t(e)},dismissKeyboard:async e=>{let{dismissAndroidKeyboardWithAdb:t}=await import(`./device-input-state.js`).then(e=>e.t);return await t(e)},readLogs:async(e,t)=>{let{captureAndroidLogcatWithAdb:n}=await import(`./logcat.js`).then(e=>e.n);return await n(e,{lines:t,timeoutMs:5e3})},adbError:async(e,t,n)=>{let{androidAdbResultError:r}=await import(`./sdk-android-adb.js`).then(e=>e.t);return r(e,t,n)}},host:{runAdb:async(e,t)=>await r(`adb`,e,t),archiveDirectory:async({sourceDirectory:e,entryName:i,archivePath:a})=>{let o=[`-qr`,a,i],s=await r(`zip`,o,{cwd:e,timeoutMs:12e4});if(s.exitCode!==0)throw new t(`COMMAND_FAILED`,`Failed to package iOS .app for Limrun install`,{command:[`zip`,...o].join(` `),...n(s)})}},ios:{resolveAppAlias:async e=>{let{resolveIosAppAlias:t}=await import(`./app-resolution.js`).then(e=>e.t);return t(e)},readBundleAppName:async e=>{let{readIosBundleInfo:t}=await import(`./install-artifact2.js`).then(e=>e.t);return(await t(e)).appName}}}}var l=e({LimrunRuntime:()=>u}),u=class{implementation;provider=o;constructor(e){this.implementation=a(e,c())}get leaseLifecycle(){return this.implementation.leaseLifecycle}get recoverExpiredLease(){return this.implementation.recoverExpiredLease}get deviceInventoryProvider(){return this.implementation.deviceInventoryProvider}ownsDevice(e){return this.implementation.ownsDevice(e)}getInteractor(e){return this.implementation.getInteractor(e)}getDeviceSession(e){return this.implementation.getDeviceSession(e)}async installApp(e,t,n,r){return await this.implementation.installApp?.(e,t,n,r)}async installInstallablePath(e,t,n){return await this.implementation.installInstallablePath?.(e,t,n)}async configurePortReverse(e){return await this.implementation.configurePortReverse?.(e)}async shutdown(){await this.implementation.shutdown()}};export{l as n,u as t};
@@ -1 +0,0 @@
1
- import{_ as e}from"./sdk-contracts.js";import{Ut as t}from"./viewport-dimension.js";import{c as n,f as r,o as i,y as a}from"./sdk-device.js";import{l as o,o as s,p as c,s as l}from"./device.js";async function u(e){if(e.platform===`web`)return[l];if(o(e)){let{listMacosDevices:e}=await import(`./devices.js`);return await e()}if(e.platform===`linux`){let{listLinuxDevices:e}=await import(`./devices3.js`);return await e()}if(e.platform===`android`){let{listAndroidDevices:t}=await import(`./install-artifact.js`).then(e=>e.o);return await t({serialAllowlist:d(e)})}if(e.platform===`vega`){let{listVegaDevices:e}=await import(`./devices4.js`);return await e()}if(e.platform){let{listAppleDevices:t}=await import(`./devices2.js`);return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}return(await Promise.all(s.map(async t=>{try{let n=await u({...e,platform:t});return Array.isArray(n)?n:[]}catch{return[]}}))).flat()}function d(e){let t=e.androidSerialAllowlist,n=e.serial?.trim();return n?t?new Set(t.includes(n)?[n]:[]):new Set([n]):t?new Set(t):void 0}const f=new Map;function p(e){for(let t of e.platforms){if(f.has(t))throw Error(`PlatformPlugin already registered for platform "${t}"`);f.set(t,e)}}function m(t){let n=f.get(t);if(!n)throw new e(`UNSUPPORTED_PLATFORM`,`Unsupported platform: ${t}`);return n}function h(e){return f.get(e)}const g={appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1},_={ios:g,ipados:g,visionos:{appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1},tvos:{appAndDeviceLifecycle:!0,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1},macos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!0},watchos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1}};function v(e){return i(e.platform)?_[a(e)]:void 0}const y=e=>{let t=v(e);return t?t.appAndDeviceLifecycle:!0},b=e=>e.platform!==`apple`||e.kind!==`device`||e.iosPhysicalDeviceBackend!==`xctest`,x=e=>y(e)&&b(e),S=e=>{let t=v(e);return t?t.keyboard:e.platform===`android`},C=e=>{let t=v(e);return t?t.orientation:e.platform===`android`},w=e=>{let t=v(e);return t&&t.physicalDeviceSurfaces||e.kind===`simulator`},T=e=>e.platform===`android`||e.platform===`apple`&&a(e)===`ios`||w(e),E=e=>e.platform===`android`?e.target===`tv`:r(e),D={[t.boot]:y,[t.apps]:b,[t.install]:x,[t.reinstall]:x,[t.installFromSource]:x,[t.logs]:b,[t.perf]:b,[t.record]:b,[t.push]:y,[t.home]:y,[t.appSwitcher]:y,[t.clipboard]:e=>e.platform===`android`||e.platform===`linux`||w(e),[t.keyboard]:S,[t.orientation]:C,[t.tvRemote]:E,[t.alert]:T,[t.settings]:e=>e.platform===`android`||w(e),[t.audio]:c},O={[t.apps]:k,[t.install]:k,[t.reinstall]:k,[t.installFromSource]:k,[t.logs]:k,[t.perf]:k,[t.record]:k,[t.viewport]:e=>e.platform===`apple`?`viewport resizes web targets only (--platform web). Apple screen geometry is fixed by the selected simulator or device type — open a different simulator to test another screen size.`:void 0,[t.tvRemote]:e=>e.platform===`android`?e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`:v(e)?r(e)?void 0:`tv-remote is supported only on tvOS devices.`:void 0};function k(e){if(!b(e))return`This command requires a CoreDevice-backed physical iOS device. The selected XCTest backend supports open, close, interactions, snapshots, and screenshots.`}const A={id:`apple`,platforms:[`apple`],familySelector:`apple`,capability:{bucket:`apple`,supportsByDefault:D,unsupportedHintByDefault:O},appLog:{resolveBackend:e=>n(e)?`macos`:e.kind===`device`?`ios-device`:`ios-simulator`},perf:{supportsMetrics:()=>!0,metricsSamplerTag:()=>`apple`},recording:{resolveBackendTag:e=>n(e)?`macos`:e.kind===`device`?`ios-device`:`ios-simulator`},providers:{platformGatedResolvers:[`appleRunnerProvider`,`appleToolProvider`]},createInteractor:async(e,t)=>{let{createAppleInteractor:n}=await import(`./interactor.js`);return n(e,t)},discoverDevices:async e=>{if(o(e)){let{listMacosDevices:e}=await import(`./devices.js`);return await e()}let{listAppleDevices:t}=await import(`./devices2.js`);return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}},j=[t.open,t.close,t.back,t.home,t.tvRemote],M=e=>e.target===`tv`,N=e=>e.kind===`emulator`&&M(e),P={id:`vega`,platforms:[`vega`],capability:{bucket:`vega`,supportsByDefault:Object.fromEntries(j.map(e=>[e,M])),unsupportedHintByDefault:Object.fromEntries(j.map(e=>[e,t=>N(t)?void 0:`${e} currently supports only Vega Virtual Devices.`]))},providers:{platformGatedResolvers:[`vegaToolProvider`]},createInteractor:async(e,t)=>{let{createVegaInteractor:n}=await import(`./interactor2.js`);return n(e,t)},discoverDevices:async e=>{let{listVegaDevices:t}=await import(`./devices4.js`);return await t()}},F=[A,{id:`android`,platforms:[`android`],capability:{bucket:`android`,supportsByDefault:{[t.audio]:c,[t.tvRemote]:e=>e.target===`tv`},unsupportedHintByDefault:{[t.tvRemote]:e=>e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`}},appLog:{resolveBackend:()=>`android`},perf:{supportsMetrics:()=>!0,metricsSamplerTag:()=>`android`},recording:{resolveBackendTag:()=>`android`},providers:{platformGatedResolvers:[`androidAdbProvider`]},createInteractor:async(e,t)=>{let{createAndroidInteractor:n}=await import(`./android.js`).then(e=>e.t);return n(e,void 0,t)},discoverDevices:async e=>{let{listAndroidDevices:t}=await import(`./install-artifact.js`).then(e=>e.o);return await t({serialAllowlist:d(e)})}},P,{id:`linux`,platforms:[`linux`],capability:{bucket:`linux`},providers:{platformGatedResolvers:[`linuxToolProvider`]},createInteractor:async()=>{let{createLinuxInteractor:e}=await import(`./linux.js`);return e()},discoverDevices:async()=>{let{listLinuxDevices:e}=await import(`./devices3.js`);return await e()}},{id:`web`,platforms:[`web`],capability:{bucket:`web`},recording:{resolveBackendTag:()=>`web`},providers:{platformGatedResolvers:[`webProvider`]},createInteractor:async()=>{let{createWebInteractor:e}=await import(`./web.js`);return e()},discoverDevices:async()=>[l]}];let I=!1;function L(){if(!I){for(let e of F)p(e);I=!0}}export{u as i,m as n,h as r,L as t};
@@ -1 +0,0 @@
1
- import{_ as e}from"./sdk-contracts.js";import{u as t}from"./sdk-batch-runner.js";function n(e){let t=a(e.quality);return{...e.analysis?{analysis:e.analysis}:{},...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.freshness?{freshness:e.freshness}:{},...t?{quality:t}:{},...e.warnings?{warnings:e.warnings}:{}}}function r(e){return{...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.quality?{snapshotQuality:e.quality}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function i(e){let t=o(e.androidSnapshot),n=Array.isArray(e.warnings)?e.warnings.filter(e=>typeof e==`string`):void 0,i=a(e.snapshotQuality);return r({...t?{androidSnapshot:t}:{},...i?{quality:i}:{},...n?{warnings:n}:{}})}function a(e){if(!e||typeof e!=`object`)return;let t=e;return typeof t.state==`string`&&typeof t.backend==`string`?t:void 0}function o(e){return typeof e==`object`&&e?e:void 0}function s(t,n={message:e=>`Invalid value: ${e}`}){let r=new Set(t),i=n.normalize??(e=>e);return{is:e=>typeof e==`string`&&r.has(e),parse:t=>{let a=i(t??``);if(r.has(a))return a;throw new e(`INVALID_ARGS`,n.message(t??``))}}}const c=1e4,l=2e3,u=[`get`,`accept`,`dismiss`,`wait`],d=[`in-app`,`system`],ee=[`primary`,`secondary`,`middle`];function te(e){return e?.clickButton??`primary`}function ne(t){return t.button===`primary`?null:t.commandLabel===`click`?t.platform!==`macos`&&t.platform!==`linux`?new e(`UNSUPPORTED_OPERATION`,`click --button ${t.button} is supported only on macOS and Linux`):t.platform===`macos`&&t.button===`middle`?new e(`UNSUPPORTED_OPERATION`,`click --button middle is not supported by the macOS runner yet`):typeof t.count==`number`||typeof t.intervalMs==`number`||typeof t.holdMs==`number`||typeof t.jitterPx==`number`||t.doubleTap===!0?new e(`INVALID_ARGS`,`click --button ${t.button} does not support repeat or gesture modifier flags`):null:new e(`INVALID_ARGS`,`--button is supported only for click`)}function re(e){return e===`primary`?{}:{button:e}}const ie=[`up`,`down`,`left`,`right`,`top`,`bottom`],f=[`up`,`down`,`left`,`right`],p=[`left`,`right`,`left-edge`,`right-edge`],ae=[`one-way`,`ping-pong`],oe=1e4,se=6e4,ce=s(f,{message:e=>`Unknown direction: ${e}`});function le(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=ve(e.amount),i=e.pixels===void 0?Math.round(n*r):_(e.pixels),a=Math.max(1,Math.round(n*.05)),o=Math.max(1,n-a*2),s=Math.max(1,Math.min(i,o)),c=Math.round(s/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),d=(n,r,i,a)=>({direction:t,x1:n,y1:r,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:s});switch(t){case`up`:return d(l,u-c,l,u+c);case`down`:return d(l,u+c,l,u-c);case`left`:return d(l-c,u,l+c,u);case`right`:return d(l+c,u,l-c,u)}}function ue(e){ve(e.amount),e.pixels!==void 0&&_(e.pixels)}function de(e,t){if(e===`left`||e===`right`){let n=m(e,t);return{preset:e,x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,referenceWidth:n.referenceWidth,referenceHeight:n.referenceHeight}}let[n,r]=e===`left-edge`?[99,15]:[1,85],i=g(h(t,n,50),t,8),a=g(h(t,r,50),t,8);return{preset:e,x1:i.x,y1:i.y,x2:a.x,y2:a.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function fe(e,t){switch(e){case`up`:return{x:0,y:-t};case`down`:return{x:0,y:t};case`left`:return{x:-t,y:0};case`right`:return{x:t,y:0}}}function m(e,t){let n=e===`left`||e===`up`,r=n?85:15,i=n?15:85,a=e===`up`||e===`down`,o=g(h(t,a?50:r,a?r:50),t,8),s=g(h(t,a?50:i,a?i:50),t,8);return{direction:e,x1:o.x,y1:o.y,x2:s.x,y2:s.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function pe(e){let t=he(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function h(e,t,n){let r=Math.trunc(e.referenceWidth*t/100),i=Math.trunc(e.referenceHeight*n/100);return{x:Number.isFinite(r)?r:0,y:Number.isFinite(i)?i:0}}function g(e,t,n){return{x:v(e.x,n,t.referenceWidth),y:v(e.y,n,t.referenceHeight)}}function me(e){return ce.parse(e)}function he(e){let t=e.filter(e=>ge(e.type)&&_e(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(t)return t;let n=e.map(e=>e.rect).filter(_e);if(n.length===0)return;let r=Math.max(...n.map(e=>e.x+e.width)),i=Math.max(...n.map(e=>e.y+e.height));if(!(r<=0||i<=0))return{x:0,y:0,width:r,height:i}}function ge(e){if(!e)return!1;let t=e.toLowerCase();return t.includes(`application`)||t.includes(`window`)}function _e(e){return!!e&&e.width>0&&e.height>0}function ve(t){if(t===void 0)return .6;if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll amount must be a positive number`);return t}function _(t){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll pixels must be a positive integer`);return Math.max(1,Math.round(t))}function v(e,t,n){let r=Math.round(t);if(!Number.isFinite(r))return 0;let i=Math.max(r,Math.round(n-t));return!Number.isFinite(i)||!Number.isFinite(e)?r:Math.min(i,Math.max(r,Math.round(e)))}const y=1e4,b=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`];function x(n){let r=C(n),i=D(r,`kind`,b);if(i===`pan`)return{kind:i,origin:w(r,`origin`),delta:w(r,`delta`),pointerCount:t(r,`pointerCount`,{min:1,max:2}),durationMs:S(r)};if(r.pointerCount!==void 0)throw new e(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(i===`fling`){if(r.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:i,direction:D(r,`direction`,f),origin:w(r,`origin`),distance:t(r,`distance`,{min:0})}}if(i===`swipe`){if(r.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:i,preset:D(r,`preset`,p)}}if(i===`pinch`)return{kind:i,scale:E(r,`scale`),origin:T(r,`origin`)};if(i===`rotate`){if(r.velocity!==void 0)throw new e(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:i,degrees:E(r,`degrees`),origin:T(r,`origin`)}}return{kind:i,origin:w(r,`origin`),delta:w(r,`delta`),scale:E(r,`scale`),degrees:E(r,`degrees`),durationMs:S(r)}}function S(n){let r=t(n,`durationMs`);if(r!==void 0){if(r<16||r>1e4)throw new e(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${y}.`);return r}}function C(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`gesture requires structured object input`);return t}function w(e,t){let n=C(e[t]);return{x:E(n,`x`),y:E(n,`y`)}}function T(e,t){return e[t]===void 0?void 0:w(e,t)}function E(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function D(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}const O={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:ye}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`}};function ye(e,t){let[n,r,i,a,o]=e,s=k(n,i),c=k(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function k(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function A(e,t){let n=O[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!be(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function be(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function xe(t){if(!(!t||typeof t!=`object`||Array.isArray(t))&&t.durationMs!==void 0)throw new e(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function j(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function M(t,n){let r=A(t,n);if(r)throw new e(`INVALID_ARGS`,j(r))}function Se(e,t,n){let r=Ce(e,t);return r?j(r,n):void 0}function Ce(e,t){if(e===`swipe`)return A(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(O,n))return A(n,t.slice(1))}function N(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function we(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{M(`gesture pan`,r);let{origin:e,delta:i}=N(r);return x({kind:n,origin:e,delta:i,pointerCount:t,durationMs:P(r[4])})}case`fling`:return M(`gesture fling`,r),x({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:P(r[3])});case`swipe`:return M(`gesture swipe`,r),x({kind:n,preset:r[0]});case`pinch`:return M(`gesture pinch`,r),x({kind:n,scale:Number(r[0]),origin:F(r[1],r[2])});case`rotate`:return M(`gesture rotate`,r),x({kind:n,degrees:Number(r[0]),origin:F(r[1],r[2])});case`transform`:{M(`gesture transform`,r);let{origin:e,delta:t}=N(r);return x({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:P(r[6])})}default:return x({kind:n})}}function Te(e){switch(e.kind){case`pan`:return I([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return I([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return I([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?I([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return I([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs])}}function Ee(e,t={}){return M(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function De(e){switch(e.kind){case`pan`:return{gesture:{intent:`pan`,origin:e.origin,delta:e.delta,pointerCount:e.pointerCount,durationMs:e.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:e.direction,origin:e.origin,distance:e.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:e.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:e.origin,scale:e.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:e.origin,degrees:e.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:e.origin,delta:e.delta,scale:e.scale,degrees:e.degrees,durationMs:e.durationMs}}}}function Oe(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function P(e){return e===void 0?void 0:Number(e)}function F(t,n){if(t===void 0!=(n===void 0))throw new e(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return t===void 0?void 0:{x:Number(t),y:Number(n)}}function I(e){return e.filter(e=>e!==void 0).map(String)}const L={pinchAxisDegrees:-90,frameCount:Math.floor},ke={ios:L,macos:L,android:{pinchAxisDegrees:0,frameCount:Math.round},vega:L,linux:L,web:L};function Ae(e,t,n){let r=Le(t),i=Ue(n);switch(e.intent){case`fling`:return Me(e,r,i);case`pan`:return Ne(e,r,i);case`pinch`:return z({intent:`pinch`,origin:e.origin??Be(r),delta:{x:0,y:0},scale:Re(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=K(e.degrees,`gesture rotate degrees`);return z({intent:`rotate`,origin:e.origin??Be(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:W(t)},r,i)}case`transform`:{let t=K(e.degrees,`gesture transform degrees`);return z({intent:`transform`,origin:e.origin,delta:e.delta,scale:Re(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:U(e.durationMs,W(t),`gesture transform durationMs`)},r,i)}}}function je(t){let n=t.pointers[0].samples[0]?.point,r=t.pointers[0].samples.at(-1)?.point;if(!n||!r)throw new e(`INVALID_ARGS`,`single-pointer gesture plan requires samples`);return{start:n,end:r}}function Me(e,t,n){if(`preset`in e){let{from:r,to:i}=He(e.preset,t);return R(`fling`,r,i,100,t,`endpoint-hold`,n)}if(`from`in e)return R(`fling`,e.from,e.to,100,t,`endpoint-hold`,n);let r=G(e.origin,`gesture fling origin`),i=ze(e.distance??180,`gesture fling distance`);return R(`fling`,r,q(r,fe(e.direction,i)),100,t,`endpoint-hold`,n)}function Ne(t,n,r){let i=U(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=G(t.origin,`gesture pan origin`);return R(`pan`,e,q(e,G(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`,r)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return z({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function R(e,t,n,r,i,a,o){let s=G(t,`gesture ${e} start`),c=G(n,`gesture ${e} end`),l=B(r,o).map(e=>({offsetMs:e,point:Ve(s,c,e/r)}));return V(l,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:l}]}}function z(e,t,n){let r=G(e.origin,`gesture ${e.intent} origin`),i=q(r,G(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*Ie(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw H({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=B(e.durationMs,n),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:Pe({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return V(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function Pe(e){let t=e.offsetMs/e.durationMs,n=Ve(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=We(Fe(e.intent,e.profile)+e.rotationDegrees*t);return{x:n.x+Math.cos(i)*r*e.side,y:n.y+Math.sin(i)*r*e.side}}function Fe(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function Ie(e){return e===`pinch`?.4:.25}function B(e,t){let n=e/16,r=Math.max(3,t.frameCount(n));return Array.from({length:r+1},(t,n)=>Math.round(e*n/r))}function V(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw H({...r,viewport:n,sample:o})}}function H(t){return new e(`INVALID_ARGS`,`Gesture trajectory does not fit inside the viewport`,{...t,reason:`GESTURE_TRAJECTORY_OUT_OF_BOUNDS`,hint:`Move the gesture away from the edge or reduce its translation, scale, or rotation.`})}function Le(t){let n={x:K(t.x,`gesture viewport x`),y:K(t.y,`gesture viewport y`),width:K(t.width,`gesture viewport width`),height:K(t.height,`gesture viewport height`)};if(n.width<=0||n.height<=0)throw new e(`INVALID_ARGS`,`gesture viewport width and height must be positive`);return n}function U(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<16||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 16 and ${y}`);return i}function W(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function G(e,t){return{x:K(e.x,`${t} x`),y:K(e.y,`${t} y`)}}function K(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function Re(t,n){let r=K(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function ze(t,n){let r=K(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function Be(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function q(e,t){return{x:e.x+t.x,y:e.y+t.y}}function Ve(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function He(e,t){let n=de(e,{referenceWidth:t.width,referenceHeight:t.height});return{from:{x:t.x+n.x1,y:t.y+n.y1},to:{x:t.x+n.x2,y:t.y+n.y2}}}function Ue(e){return e===void 0?L:ke[e]}function We(e){return e*Math.PI/180}const Ge={occlusion:{kind:`runtime`,via:`src/snapshot/snapshot-occlusion.ts#isSnapshotNodeInteractionBlocked`},offscreen:{kind:`runtime`,via:`src/commands/interaction/runtime/resolution.ts#throwIfOffscreenInteractionTarget`},nonHittable:{kind:`runtime`,via:`src/core/interaction-targeting.ts#resolveActionableTouchResolution`},responseConstruction:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-response.ts#buildInteractionResponseData`},responseIdentity:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-targets.ts#interactionResultExtra`},verifyEvidence:{kind:`runtime`,via:`src/commands/interaction/runtime/interactions.ts#pressCommand`,appliesTo:[`press`,`click`,`fill`]},settleObservation:{kind:`runtime`,via:`src/commands/interaction/runtime/settle.ts#settleAfterInteraction`}};({...Ge}),{...Ge};const Ke=`tapped via non-hittable coordinate fallback`,qe=1e4;function Je(t,n=`scroll accepts either a relative amount or --pixels, not both`){if(t.amount!==void 0&&t.pixels!==void 0)throw new e(`INVALID_ARGS`,n)}function Ye(t,n={}){if(t===void 0)return;let r=n.field??`scroll durationMs`,i=n.max??1e4,a=n.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(t)||!Number.isInteger(t)||t<0)throw new e(`INVALID_ARGS`,a);if(t>i)throw new e(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return t}function Xe(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}const Ze={android:`longpress`,apple:`exact`,vega:`exact`},J={up:{aliases:[],androidKeyevent:`KEYCODE_DPAD_UP`,appleRemoteButton:`up`,vegaKey:`KEY_UP`},down:{aliases:[],androidKeyevent:`KEYCODE_DPAD_DOWN`,appleRemoteButton:`down`,vegaKey:`KEY_DOWN`},left:{aliases:[],androidKeyevent:`KEYCODE_DPAD_LEFT`,appleRemoteButton:`left`,vegaKey:`KEY_LEFT`},right:{aliases:[],androidKeyevent:`KEYCODE_DPAD_RIGHT`,appleRemoteButton:`right`,vegaKey:`KEY_RIGHT`},select:{aliases:[`ok`,`center`,`enter`],androidKeyevent:`KEYCODE_DPAD_CENTER`,appleRemoteButton:`select`,vegaKey:`KEY_ENTER`},menu:{aliases:[],androidKeyevent:`KEYCODE_MENU`,appleRemoteButton:`menu`,vegaKey:`KEY_MENU`},home:{aliases:[],androidKeyevent:`KEYCODE_HOME`,appleRemoteButton:`home`,vegaKey:`KEY_HOMEPAGE`},back:{aliases:[],androidKeyevent:`KEYCODE_BACK`,appleRemoteButton:`menu`,vegaKey:`KEY_BACK`}},Y=Object.keys(J),Qe=`<${Y.join(`|`)}>`;function $e(t){let n=t?.toLowerCase();if(et(n))return n;let r=n?at.get(n):void 0;if(r)return r;throw new e(`INVALID_ARGS`,`tv-remote button must be one of: ${Y.join(`, `)}.`)}function et(e){return typeof e==`string`&&Y.includes(e)}function tt(e){return J[e].appleRemoteButton}function nt(e){return J[e].androidKeyevent}function rt(e){return J[e].vegaKey}function it(e){return Ze[e]}const at=new Map(Y.flatMap(e=>J[e].aliases.map(t=>[t,e]))),ot=[`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`],st=`<wifi|airplane|location> <on|off>`,X=`location set <lat> <lon>`,ct=`animations <on|off>`,Z=`appearance <light|dark|toggle>`,lt=`faceid <match|nonmatch|enroll|unenroll>`,ut=`touchid <match|nonmatch|enroll|unenroll>`,dt=`fingerprint <match|nonmatch>`,ft=`clear-app-state [app-id]`,pt=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,Q=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,mt=`macOS supports only settings ${Z} and settings ${Q}. wifi|airplane|location|animations remain unsupported on macOS.`,ht=[`settings ${st}`,`settings ${X}`,`settings ${ct}`,`settings ${Z}`,`settings ${lt}`,`settings ${ut}`,`settings ${dt}`,`settings ${ft}`,`settings ${pt}`,`settings ${Q}`].join(` | `),gt=`settings requires ${st}, ${X}, ${ct}, ${Z}, ${lt}, ${ut}, ${dt}, ${ft}, ${pt}, or ${Q}`;function _t(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function vt(e){return`Unsupported macOS setting: ${e}. ${mt}`}function yt(t){let n=t.trim().toLowerCase();if(n===`grant`)return`grant`;if(n===`deny`)return`deny`;if(n===`reset`)return`reset`;throw new e(`INVALID_ARGS`,`Invalid permission action: ${t}. Use grant|deny|reset.`)}function bt(t){let n=t?.trim().toLowerCase();if(n===`camera`||n===`microphone`||n===`photos`||n===`contacts`||n===`contacts-limited`||n===`notifications`||n===`calendar`||n===`location`||n===`location-always`||n===`media-library`||n===`motion`||n===`reminders`||n===`siri`)return n;throw new e(`INVALID_ARGS`,`permission setting requires a target: ${ot.join(`|`)}`)}function xt(t,n){if(t===void 0||t.trim()===``)throw new e(`INVALID_ARGS`,`settings location set requires ${n}`);return $(Number(t),n)}function St(e){return{latitude:$(e?.latitude,`latitude`),longitude:$(e?.longitude,`longitude`)}}function $(t,n){let r=n===`latitude`?-90:-180,i=n===`latitude`?90:180;if(typeof t!=`number`||!Number.isFinite(t)||t<r||t>i)throw new e(`INVALID_ARGS`,`${n} must be a number from ${r} to ${i}`);return t}function Ct(e){return e}function wt(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}export{s as $,Oe as A,ue as B,Ae as C,we as D,Se as E,ie as F,ee as G,le as H,ae as I,te as J,re as K,oe as L,b as M,x as N,Te as O,f as P,c as Q,p as R,Ke as S,xe as T,pe as U,m as V,me as W,u as X,d as Y,l as Z,it as _,gt as a,Xe as b,_t as c,Y as d,r as et,Qe as f,rt as g,tt as h,St as i,Ee as j,De as k,yt as l,nt as m,Ct as n,n as nt,ht as o,$e as p,ne as q,xt as r,vt as s,wt as t,i as tt,bt as u,qe as v,je as w,Ye as x,Je as y,se as z};
@@ -1,14 +0,0 @@
1
- import{E as e,S as t,_ as n,d as r,f as i,g as a,p as o,u as s}from"./sdk-contracts.js";import{$ as c,b as l,et as u,t as d,x as f,y as p}from"./screenshot-geometry.js";import{B as m,H as h,R as g,U as _,V as ee,b as te,it as v,z as ne}from"./sdk-batch-runner.js";import{d as re}from"./sdk-device.js";import{$ as ie,G as ae,H as oe,J as se,K as y,R as ce,U as le,W as ue,X as de,Y as fe,Z as pe,a as me,at as he,b,c as ge,ct as _e,dt as ve,et as ye,g as be,lt as x,n as xe,nt as Se,o as Ce,r as we,s as S,t as Te,tt as Ee,u as De,ut as Oe,v as ke,x as Ae,z as je}from"./sdk-selectors.js";import{b as Me,w as Ne,y as Pe}from"./device.js";import Fe from"node:path";import{styleText as Ie}from"node:util";import{createHash as Le}from"node:crypto";const Re=[`out`,`overlayRefs`,`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotMaxSize`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],ze=[`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotMaxSize`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],Be=[{key:`screenshotPixelDensity`,names:[`--pixel-density`],type:`int`,min:1,usageLabel:`--pixel-density <n>`,usageDescription:`Screenshot: output PNG pixel density in pixels per logical point (currently supported on iOS simulators)`},{key:`screenshotFullscreen`,names:[`--fullscreen`,`--full`,`-f`],type:`boolean`,usageLabel:`--fullscreen, --full, -f`,usageDescription:`Screenshot: on web capture the full page; on macOS app sessions capture the full desktop instead of the app window`},{key:`screenshotMaxSize`,names:[`--max-size`],type:`int`,min:1,usageLabel:`--max-size <px>`,usageDescription:`Screenshot/record: downscale so the longest edge is at most <px>`},{key:`screenshotNoStabilize`,names:[`--no-stabilize`],type:`boolean`,usageLabel:`--no-stabilize`,usageDescription:`Screenshot: skip Android demo-mode/status-bar stabilization and settle delay for low-latency capture loops`},{key:`screenshotNormalizeStatusBar`,names:[`--normalize-status-bar`],type:`boolean`,usageLabel:`--normalize-status-bar`,usageDescription:`Screenshot: on iOS simulators temporarily normalize status-bar chrome for deterministic screenshot diffs`}],Ve=[{tokens:[`--fullscreen`,`--full`,`-f`],key:`screenshotFullscreen`},{tokens:[`--no-stabilize`],key:`screenshotNoStabilize`},{tokens:[`--normalize-status-bar`],key:`screenshotNormalizeStatusBar`}],He=[{token:`--pixel-density`,key:`screenshotPixelDensity`,label:`screenshot --pixel-density`},{token:`--max-size`,key:`screenshotMaxSize`,label:`screenshot --max-size`}];function Ue(e){return qe({overlayRefs:e?.overlayRefs,pixelDensity:e?.screenshotPixelDensity,fullscreen:e?.screenshotFullscreen,maxSize:e?.screenshotMaxSize,stabilize:e?.screenshotNoStabilize?!1:void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function We(e={}){return qe({overlayRefs:e.overlayRefs,screenshotPixelDensity:e.screenshotPixelDensity??e.pixelDensity,screenshotFullscreen:e.screenshotFullscreen??e.fullscreen,screenshotMaxSize:e.screenshotMaxSize??e.maxSize,screenshotNoStabilize:e.screenshotNoStabilize??(e.stabilize===!1?!0:void 0),screenshotNormalizeStatusBar:e.screenshotNormalizeStatusBar??e.normalizeStatusBar})}function Ge(e,t){typeof t?.screenshotPixelDensity==`number`&&e.push(`--pixel-density`,String(t.screenshotPixelDensity)),t?.screenshotFullscreen&&e.push(`--fullscreen`),typeof t?.screenshotMaxSize==`number`&&e.push(`--max-size`,String(t.screenshotMaxSize)),t?.screenshotNoStabilize&&e.push(`--no-stabilize`),t?.screenshotNormalizeStatusBar&&e.push(`--normalize-status-bar`)}function Ke(e){let{args:t,flags:n,index:r}=e,i=t[r];return Je(i,n,r)??Ye({args:t,index:r,flags:n,token:i})??{handled:!1}}function qe(e){return Object.fromEntries(Object.entries(e).filter(e=>e[1]!==void 0))}function Je(e,t,n){let r=Ve.find(t=>t.tokens.some(t=>t===e));if(r)return t[r.key]=!0,{handled:!0,nextIndex:n}}function Ye(e){let t=He.find(t=>t.token===e.token);if(!t)return;let r=e.args[e.index+1],i=r===void 0?NaN:Number(r);if(!Number.isInteger(i)||i<1)throw new n(`INVALID_ARGS`,`${t.label} requires a positive integer`);return e.flags[t.key]=i,{handled:!0,nextIndex:e.index+1}}const Xe=3e5,Ze=[`leaseId`,`tenantId`,`runId`,`clientId`,`deviceKey`];function Qe(e){return v({tenantId:e.meta?.tenantId??C(e.flags,`tenant`),runId:e.meta?.runId??C(e.flags,`runId`),leaseId:e.meta?.leaseId??C(e.flags,`leaseId`),leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend,leaseProvider:e.meta?.leaseProvider??C(e.flags,`leaseProvider`)??C(e.flags,`provider`),deviceKey:e.meta?.deviceKey??C(e.flags,`deviceKey`),clientId:e.meta?.clientId??C(e.flags,`clientId`)})}function $e(e){return v({tenantId:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs??e.ttlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider??e.provider,deviceKey:e.deviceKey,clientId:e.clientId})}function et(e){return v({tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function tt(e){return v({tenant:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function nt(e){return v({tenantId:e.tenantId??``,runId:e.runId??``,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function rt(e){return lt(e)}function it(e){let{ttlMs:t,...n}=lt(e);return n}function at(e,t,n){let r=v({...n.includeTokenParam?{token:n.token}:{},session:n.session,tenantId:e.tenantId,runId:e.runId,leaseProvider:e.leaseProvider,clientId:e.clientId,deviceKey:e.deviceKey});switch(t){case`lease_allocate`:return{...r,...v({ttlMs:e.leaseTtlMs,backend:e.leaseBackend})};case`lease_heartbeat`:return{...r,...v({leaseId:e.leaseId,ttlMs:e.leaseTtlMs})};case`lease_release`:return{...r,...v({leaseId:e.leaseId})}}}function ot(e){let t=v({leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId});return Object.keys(t).length>0?t:void 0}function st(e){return e.leaseProvider===`proxy`}function ct(e){return st(e)?Ze.filter(t=>!e[t]):[]}function lt(e){return v({leaseId:e.leaseId??``,tenantId:e.tenantId,runId:e.runId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function C(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function w(e){return e?{message:e}:{}}function T(e,t){return t?{...e,message:t}:e}function ut(e){return typeof e?.message==`string`&&e.message.length>0?e.message:null}function dt(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function ft(e,t,n){return{deviceId:t,deviceName:n,...re(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function pt(e,t={}){let n=t.includeSerial??!0,r=mt(e);return{platform:e.platform,target:e.target,device:e.name,id:e.id,...e.platform===`ios`?{device_udid:e.ios?.udid??e.id,ios_simulator_device_set:e.ios?.simulatorSetPath??null}:{},...n&&r?{serial:r}:{}}}function mt(e){return re(e.platform)?e.identifiers.serial??e.id:void 0}function ht(e){return{name:e.name,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...pt(e.device,{includeSerial:!1}),createdAt:e.createdAt}}function gt(e){return{platform:e.platform,...e.appleOs?{appleOs:e.appleOs}:{},id:e.id,name:e.name,kind:e.kind,target:e.target,...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function _t(e){return e.bundleId??e.package??e.app}function vt(e){return T({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${_t(e)}`)}function yt(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function bt(e){return T({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${yt(e)}`)}function xt(e){let t=e.appName??e.appBundleId??e.session;return T({session:e.session,...e.warnings?.length?{warnings:e.warnings}:{},...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...e.requestLogPath?{requestLogPath:e.requestLogPath}:{},...e.eventLogPath?{eventLogPath:e.eventLogPath}:{},...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?pt(e.device):{}},t?`Opened: ${t}`:`Opened`)}function St(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...`provider`in e&&e.provider?{provider:e.provider}:{},...w(e.session?`Closed: ${e.session}`:`Closed`)}}function Ct(e){return{nodes:e.nodes,truncated:e.truncated,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...u(wt(e)),...e.unchanged?{unchanged:e.unchanged}:{},...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{},...e.refsGeneration===void 0?{}:{refsGeneration:e.refsGeneration}}}function wt(e){return{...e,...e.snapshotQuality?{quality:e.snapshotQuality}:{}}}const Tt=jt(`public`),Et=jt(`internal`),Dt=jt(`local-cli`),Ot={help:`help`};function kt(){return[...Object.values(Tt),...Object.values(Dt)].sort()}function At(e){return Object.values(Ot).includes(e)||Object.values(Et).includes(e)?!0:kt().includes(e)}function jt(e){let t={};for(let[n,r]of te(e))t[n]=r;return t}const Mt=[`medium`,`high`],Nt=`medium`;function Pt(e){return Mt.includes(e)}function Ft(e){let t=typeof e==`number`?e:It(e);return t!==void 0&&Number.isInteger(t)&&t>=5&&t<=10?t:void 0}function It(e){return typeof e==`string`&&/^\d+$/.test(e)?Number(e):void 0}function Lt(e){if(Pt(e))return e;let t=Ft(e);if(t!==void 0)return t<=7?`medium`:`high`}const Rt=[`app`,`device`,`system`];function zt(e){return e===`device`||e===`system`}const Bt=[`app`,`frontmost-app`,`desktop`,`menubar`],Vt=c(Bt,{normalize:e=>e.trim().toLowerCase(),message:e=>`Invalid surface: ${e}. Use ${Bt.join(`|`)}.`});function Ht(e){return Vt.parse(e)}const Ut=`--launch-console is supported only for iOS simulator app launches`,Wt=`--launch-console requires a direct app launch and cannot be used with URL opens`,Gt=[`path`,`start`,`stop`,`doctor`,`mark`,`clear`],Kt=[`metrics`,`frames`,`memory`,`cpu`,`trace`],qt=[`sample`,`snapshot`,`start`,`stop`,`report`],Jt=[`profile`],Yt=[`xctrace`,`simpleperf`,`perfetto`,`android-hprof`,`memgraph`],Xt=[`android-hprof`,`memgraph`],Zt=c(Kt),Qt=c(qt),$t=c(Jt),en=c(Yt),tn=c(Xt),nn=`perf area must be metrics, frames, memory, cpu, or trace`,rn=`perf action must be sample, snapshot, start, stop, or report`,an=`perf cpu requires profile`,on=`perf --kind must be xctrace, simpleperf, perfetto, android-hprof, or memgraph`,sn=`perf memory snapshot --kind must be android-hprof or memgraph`,cn=Zt.is,ln=Qt.is,un=$t.is,dn=en.is,fn=tn.is;function E(e){return e.width>0&&e.height>0}function pn(e,t){return!e||!t?!1:e.x>=t.x-2&&e.y>=t.y-2&&e.x+e.width<=t.x+t.width+2&&e.y+e.height<=t.y+t.height+2}function mn(e,t){if(!e||!t)return!0;let n=e.y+e.height/2,r=t.y+t.height/2;return Math.abs(n-r)<=Math.max(e.height,t.height,1)}function hn(e){return typeof e.parentIndex!=`number`}function D(e){let t=(e.type??``).toLowerCase(),n=(e.identifier??``).trim().toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)||n===`composer`}function gn(e){let t=(e.type??``).toLowerCase();return t.includes(`scroll`)||t.includes(`list`)||t.includes(`recyclerview`)}function O(e){let t=he(e);if(!t||t!==e.identifier?.trim()||!_n(t))return t;let n=(e.type??``).toLowerCase();return n.includes(`view`)||n.includes(`layout`)||n.includes(`image`)||n.includes(`list`)||n.includes(`recyclerview`)||n.includes(`collection`)?``:t}function k(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}function _n(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function vn(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){let e=t.get(r.parentIndex);if(!e)return null;if(n(e))return e;r=e}return null}function yn(e,t){let n=[],r=[t];for(;r.length>0;){let t=r.pop();for(let i of e)i.parentIndex===t&&(n.push(i),r.push(i.index))}return n}function A(e,t,n){let r=[t];for(;r.length>0;){let t=r.pop();if(!n.has(t)){n.add(t);for(let i of e)i.parentIndex!==t||n.has(i.index)||r.push(i.index)}}}const bn=[`button`,`switch`,`checkbox`,`radio`],xn=[`button`,`image`,`textview`,`view`];function Sn(e,t,n){for(let r of e){if(t.has(r.index)||!Tn(r))continue;let i=En(yn(e,r.index),r,t);if(i.label){n.set(r.index,{...r,...n.get(r.index),label:i.label});for(let n of i.removableIndexes)A(e,n,t)}}}function Cn(e,t,n){let r=new Map;for(let i of e){if(t.has(i.index)||!Nn(i))continue;let a=k(O(i));if(!a)continue;let o=r.get(a);if(o&&An(o,i,t)){let s=jn(e,o,i,t,n);r.set(a,s);continue}r.set(a,i)}}function wn(e,t){for(let n of e){if(t.has(n.index)||!On(n))continue;let r=k(O(n));if(!r)continue;let i=yn(e,n.index).filter(e=>!t.has(e.index)&&kn(n,e,r));for(let n of i.filter(Dn))A(e,n.index,t);let a=i.filter(e=>!Dn(e)),o=new Set(a.map(e=>k(O(e))).filter(e=>!!e));if(!(a.length<2||o.size<2))for(let n of a)A(e,n.index,t)}}function Tn(e){return e.hittable===!0&&!D(e)&&!!(e.rect&&E(e.rect))&&O(e).trim().length===0}function En(e,t,n){let r=[],i=[],a=new Set;for(let o of e){if(n.has(o.index)||!Dn(o)||!pn(o.rect,t.rect))continue;let e=O(o).trim().replace(/\s+/g,` `),s=k(e);i.push(o.index),!(!e||!s||a.has(s))&&(a.add(s),r.push(e))}return{label:r.join(`, `),removableIndexes:i}}function Dn(e){if(e.hittable===!0||D(e))return!1;let t=(e.type??``).toLowerCase();return t.includes(`text`)||t.includes(`image`)||t.includes(`icon`)}function On(e){return e.hittable===!0&&!D(e)&&!!(e.rect&&E(e.rect))&&!!k(O(e))}function kn(e,t,n){if(!Nn(t)||!pn(t.rect,e.rect))return!1;let r=k(O(t));return!!(r&&n!==r&&n.includes(r))}function An(e,t,n){return!n.has(e.index)&&mn(e.rect,t.rect)&&(Rn(e,t)||Ln(e,t))}function jn(e,t,n,r,i){let a=Pn(t,n),o=a.index===t.index?n:t,s=(o.type??``).toLowerCase().includes(`image`)?`has image`:null,c=i.get(a.index)??a,l=i.get(o.index)?.presentationHints??o.presentationHints;return i.set(a.index,{...c,presentationHints:Mn(c.presentationHints,l,s)}),A(e,o.index,r),i.get(a.index)??a}function Mn(e,t,n){return[...new Set([...Array.isArray(e)?e:[],...Array.isArray(t)?t:[],...n?[n]:[]])]}function Nn(e){if(!e.rect||!E(e.rect)||hn(e)||D(e))return!1;let t=(e.type??``).toLowerCase();return t===`text`||In(t,xn)}function Pn(e,t){let n=Fn(e);return Fn(t)>n?t:e}function Fn(e){let t=(e.type??``).toLowerCase(),n=0;return In(t,bn)?n+=100:t.includes(`image`)?n+=30:t.includes(`textview`)||t===`text`?n+=20:t.includes(`view`)&&(n+=10),e.hittable===!0&&(n+=20),e.enabled!==!1&&(n+=5),n}function In(e,t){return t.some(t=>e.includes(t))}function Ln(e,t){let n=e.parentIndex===t.index?t:t.parentIndex===e.index?e:null,r=n?.index===e.index?t:n?.index===t.index?e:null;return!n||!r?!1:Pn(n,r).index===n.index}function Rn(e,t){return e.parentIndex===t.parentIndex?Math.abs(e.index-t.index)<=3:e.parentIndex===t.index||t.parentIndex===e.index?!1:Math.abs((e.depth??0)-(t.depth??0))<=1&&Math.abs(e.index-t.index)<=2}function zn(e,t,n){if(n.raw||!Bn(e))return{nodes:t,filteredCount:0};let r=Vn(t);return{nodes:r,filteredCount:t.length-r.length}}function Bn(e){let t=e.androidSnapshot;return!t||typeof t!=`object`?!1:t.backend===`android-helper`}function Vn(e){if(e.length===0)return e;let t=new Set,n=new Map,r=new Map(e.map(e=>[e.index,e]));return Hn(e,t),Un(e,r,t,n),Sn(e,t,n),wn(e,t),Cn(e,t,n),e.filter(e=>!t.has(e.index)).map(e=>n.get(e.index)??e)}function Hn(e,t){for(let n of e)!n.rect||E(n.rect)||hn(n)||A(e,n.index,t)}function Un(e,t,n,r){for(let i of e){if(n.has(i.index)||i.rect||hn(i))continue;let a=vn(i,t,gn);a&&Gn(r,a,Wn(i,e)),A(e,i.index,n)}}function Wn(e,t){let n=t.filter(t=>t.parentIndex===e.parentIndex&&t.rect&&E(t.rect)).map(e=>e.index);return n.length===0?null:e.index<Math.min(...n)?`above`:e.index>Math.max(...n)?`below`:null}function Gn(e,t,n){if(!n)return;let r=e.get(t.index)??t;e.set(t.index,{...r,hiddenContentAbove:r.hiddenContentAbove===!0||n===`above`?!0:void 0,hiddenContentBelow:r.hiddenContentBelow===!0||n===`below`?!0:void 0})}function Kn(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||qn(t)?null:t}function qn(e){return/\S+@\S+\.\S+/.test(e)}function Jn(e){if(e.length<20)return!1;let t=new Map;for(let n of e){let e=(n.type??``).toLowerCase(),r=Kn(he(n));if(!r)continue;let i=`${e}|${r}`,a=t.get(i)??[];a.push(n),t.set(i,a)}let n=0;for(let e of t.values())e.length<=1||!Yn(e)||(n+=e.length);return n>=8}function Yn(e){for(let t=0;t<e.length;t+=1)for(let n=t+1;n<e.length;n+=1)if(Xn(e[t]?.rect,e[n]?.rect))return!0;return!1}function Xn(e,t){if(!e||!t)return!0;let n=.5;return!(e.x+e.width<=t.x+n||t.x+t.width<=e.x+n||e.y+e.height<=t.y+n||t.y+t.height<=e.y+n)}const Zn={digest:8*1024,default:24*1024,full:64*1024};function Qn(e){return e===`digest`||e===`full`?e:`default`}function $n(e,t=256){let n=Buffer.from(e,`utf8`);if(n.length<=t)return e;let r=`…<truncated>`,i=Buffer.byteLength(r,`utf8`),a=Math.max(0,t-i);for(;a>0&&(n[a]&192)==128;)--a;return`${n.subarray(0,a).toString(`utf8`)}${r}`}function j(t,n=256){return $n(e(t),n)}function er(e,t){let n=e;for(let e of t)e.value&&(n=n.split(e.value).join(`<var:${e.name}>`));return n}function tr(e){return(t,n)=>j(er(t,e),n)}function nr(e,t){return e.state!==`available`||e.refs.length<=t?e:{...e,refs:e.refs.slice(0,t),truncated:!0}}function rr(e,t){let n=Qn(t),r=n===`digest`?8:20,i=nr(e.screen,r),a=n===`digest`?[]:e.suggestions.slice(0,5);return{...e,screen:i,suggestions:a}}function ir(e){return Buffer.byteLength(JSON.stringify(e),`utf8`)}function ar(e){let{divergence:t,level:n,writeOverflowArtifact:r}=e,i=Qn(n),a=Zn[i],o=rr(t,n),s=ir(o);if(s<=a)return o;let c=s-a,l=r(rr(t,`full`)),u=or(o);return`artifactPath`in l?{...u,overflow:{omittedBytes:c,artifactPath:l.artifactPath}}:{...u,artifactUnavailable:!0}}function or(e){return{version:e.version,kind:e.kind,step:{index:e.step.index,source:{path:j(e.step.source.path),line:e.step.source.line}},action:j(e.action),cause:{code:e.cause.code,message:j(e.cause.message),...e.cause.hint?{hint:j(e.cause.hint)}:{}},screen:{state:`unavailable`,reason:`omitted-for-size`,hint:`The screen digest and suggestions were omitted to stay within the response byte budget. See overflow.artifactPath (or retry at --level full) for the complete report.`},suggestions:[],suggestionCount:e.suggestionCount,resume:e.resume,repairHint:e.repairHint,...e.targetBinding?{targetBinding:e.targetBinding}:{}}}function sr(e){let t=e?.divergence;if(!t||typeof t!=`object`)return null;let n=t,r=[...yr(n.step),...hr(n.kind,n.targetBinding),...cr(n.repairHint,n.resume),...br(n.screen),...wr(n.suggestions,n.suggestionCount),...Er(n.overflow,n.artifactUnavailable)];return r.length>0?r.join(`
2
- `):null}function cr(e,t){if(typeof e!=`string`)return[];let n=dr(e,t);return[`Repair hint: ${e}${n?` — ${n}`:``}`]}function lr(e){let t=e;if(!t||typeof t.allowed!=`boolean`)return;if(!t.allowed)return{allowed:!1,reason:typeof t.reason==`string`?t.reason:void 0};let{from:n,planDigest:r,alternateFrom:i}=t;if(!(typeof n!=`number`||typeof r!=`string`||r.length===0))return{allowed:!0,from:n,planDigest:r,alternateFrom:typeof i==`number`?i:void 0}}function M(e,t){return`replay --from ${e} --plan-digest ${t}`}function ur(e){return e?.repairSessionHeld===!0}function dr(e,t){let n=fr(e,lr(t));if(n!==void 0)return ur(t)?`${n} Read-only inspection while armed (snapshot -i, get attrs, find, is) is excluded from the healed script by default — no --no-record needed. If the step you are repairing is itself a read, add --record to that command so it lands in the heal.`:n}function fr(e,t){switch(e){case`record-and-heal`:return t?.allowed?`press the correct control via a blessed @ref from screen.refs (recorded), then ${M(t.from,t.planDigest)}.`:`press the correct control via a blessed @ref from screen.refs (recorded). ${mr(t)}`;case`state-repair`:return t?.allowed?`fix app state with --no-record actions, then ${M(t.from,t.planDigest)} to re-run it.`:`fix app state with --no-record actions. ${mr(t)}`;case`caution`:return pr({lead:`something already matches the recorded selector; a blind re-press may repeat the mistake.`,guidance:t});case`manual`:return pr({lead:`no safe automated repair could be proven; inspect the screen and repair by hand.`,guidance:t});default:return}}function pr(e){let{lead:t,guidance:n}=e;if(!n?.allowed)return`${t} ${mr(n)}`;let r=`if you fixed app state with --no-record actions: ${M(n.from,n.planDigest)}`;return n.alternateFrom===void 0?`${t} ${r}.`:`${t} ${r}; ${`if you performed the step's intent as a recorded action: ${M(n.alternateFrom,n.planDigest)}`}.`}function mr(e){return e&&!e.allowed&&e.reason?`This step cannot currently be resumed automatically (${e.reason}) — run a fresh full replay instead.`:`This step cannot currently be resumed automatically — run a fresh full replay instead.`}function hr(e,t){if(typeof e!=`string`||e===`action-failure`)return[];let n=t;return n?[gr(e,n.matchCount),..._r(n.mismatches),...vr(n.candidates)]:[]}function gr(e,t){return`Target binding: ${e}${typeof t==`number`?` (matchCount ${t})`:``} — recorded target evidence did not verify.`}function _r(e){return!Array.isArray(e)||e.length===0?[]:[` mismatches: ${e.slice(0,5).join(`; `)}`]}function vr(e){return!Array.isArray(e)||e.length===0?[]:[` ${e.length} candidate(s) shared the recorded identity:`,...e.slice(0,5).map(e=>` ${Cr(e)}`)]}function yr(e){let t=e;if(typeof t?.index!=`number`)return[];let n=t.source,r=typeof n?.path==`string`&&typeof n.line==`number`?` (${n.path}:${n.line})`:``;return[`Divergence at step ${t.index}${r}`]}function br(e){let t=e;return t?.state===`available`&&Array.isArray(t.refs)?xr(t.refs,t.refsGeneration):t?.state===`unavailable`?[Sr(t)]:[]}function xr(e,t){let n=e.slice(0,8).map(Cr),r=e.length-n.length;return[`Screen: ${e.length} actionable ref(s) captured (refsGeneration ${t}).`,...n,...r>0?[` ... ${r} more`]:[]]}function Sr(e){let t=typeof e.hint==`string`&&e.hint.length>0?` ${e.hint}`:``;return`Screen: unavailable (${String(e.reason??`unknown`)}).${t}`}function Cr(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` @${String(t.ref)} [${String(t.role)}]${n}`}function wr(e,t){return Array.isArray(e)&&e.length>0?[`Suggestions:`,...e.slice(0,5).map(Tr)]:typeof t==`number`&&t>0?[`Suggestions: ${t} available (omitted at this response level; rerun with --json for the full report).`]:[]}function Tr(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` - [${String(t.basis)}]${n} ${String(t.selector)}`}function Er(e,t){return e&&typeof e==`object`?[`Full report written to ${String(e.artifactPath)}.`]:t===!0?[`Full report exceeded the response budget and the overflow artifact could not be written.`]:[]}const Dr={application:`application`,navigationbar:`navigation-bar`,tabbar:`tab-bar`,button:`button`,imagebutton:`button`,link:`link`,cell:`cell`,statictext:`text`,checkedtextview:`text`,textbox:`text-field`,textfield:`text-field`,edittext:`text-field`,textarea:`text-view`,switch:`switch`,slider:`slider`,image:`image`,imageview:`image`,webview:`webview`,framelayout:`group`,linearlayout:`group`,relativelayout:`group`,constraintlayout:`group`,viewgroup:`group`,view:`group`,listview:`list`,recyclerview:`list`,collectionview:`collection`,searchfield:`search`,heading:`heading`,activityindicator:`activity-indicator`,progressindicator:`progress-indicator`,segmentedcontrol:`segmented-control`,group:`group`,window:`window`,checkbox:`checkbox`,radio:`radio`,menuitem:`menu-item`,toolbar:`toolbar`,scrollarea:`scroll-area`,scrollview:`scroll-area`,nestedscrollview:`scroll-area`,table:`table`};function Or(e,t={}){let n=[],r=[];for(let i of e){let e=i.depth??0,a=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||``,o=P(i.type??`Element`),s=i.inheritsLabel===!0||i.inheritsIdentifier===!0;if(o===`group`&&!a&&!s)continue;for(;n.length>0&&e<=n[n.length-1];)n.pop();let c=n.length;n.push(e),r.push({node:i,depth:c,type:o,text:kr(i,c,!1,o,t)})}return r}function kr(e,t,n,r,i={}){let a=r??P(e.type??`Element`),o=ue(e,a),s=Pr(e,a,i,o),c=` `.repeat(t),l=e.ref?`@${e.ref}`:``,u=Fr(e,a,i,o);!s&&(e.inheritsLabel===!0||e.inheritsIdentifier===!0)&&u.push(`same label as parent`);let d=u.map(e=>` [${e}]`).join(``),f=s?` "${s}"`:``;return n?`${c}${l} [${a}]${d}`.trimEnd():`${c}${l} [${a}]${f}${d}`.trimEnd()}function N(e,t){let n=e.label?.trim();if(n&&Mr(t,n))return``;let r=e.value?.trim();if(jr(t)){if(r)return r;if(n)return n}else if(n)return n;if(r)return r;let i=e.identifier?.trim();return!i||Nr(i)&&(t===`group`||t===`image`||t===`list`||t===`collection`)?``:i}function P(e){let t=e,n=e.replace(/XCUIElementType/gi,``).toLowerCase(),r=t.includes(`.`)&&(t.startsWith(`android.`)||t.startsWith(`androidx.`)||t.startsWith(`com.`));return n.includes(`.`)&&(n=n.replace(/^android\.widget\./,``).replace(/^android\.view\./,``).replace(/^android\.webkit\./,``).replace(/^androidx\./,``).replace(/^com\.google\.android\./,``).replace(/^com\.android\./,``),r&&n.includes(`.`)&&(n=n.slice(n.lastIndexOf(`.`)+1))),n===`textview`?r?`text`:`text-view`:Ar(n)||n||`element`}function Ar(e){return Object.prototype.hasOwnProperty.call(Dr,e)?Dr[e]:void 0}function jr(e){return e===`text-field`||e===`text-view`||e===`search`}function Mr(e,t){return e!==`scroll-area`&&e!==`list`&&e!==`collection`&&e!==`table`?!1:_e(t)}function Nr(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function Pr(e,t,n,r){return!n.summarizeTextSurfaces||!r.shouldSummarize?N(e,t):Ir(e,t,r.text)||N(e,t)}function Fr(e,t,n,r){let i=[];return e.enabled===!1&&i.push(`disabled`),i.push(...e.presentationHints??[]),!n.summarizeTextSurfaces||(e.selected===!0&&i.push(`selected`),e.focused===!0&&i.push(`focused`),jr(t)&&i.push(`editable`),Lr(e,t)&&i.push(`scrollable`),!r.shouldSummarize)?zr(i):(i.push(`preview:"${Rr(le(r.text))}"`),i.push(`truncated`),zr(i))}function Ir(e,t,n){let r=se(e.label);if(r&&r!==n)return r;let i=se(e.identifier);if(i&&!Nr(i)&&i!==n)return i;switch(t){case`text`:case`text-view`:return`Text view`;case`text-field`:return`Text field`;case`search`:return`Search field`;default:return``}}function Lr(e,t){if(t===`scroll-area`)return!0;let n=(e.type??``).toLowerCase(),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`scroll`)||r.includes(`scroll`)}function Rr(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function zr(e){return[...new Set(e)]}function Br(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function Vr(e,r={}){let i=e instanceof n?t(e):e;process.stderr.write(`Error (${i.code}): ${i.message}\n`),i.hint&&process.stderr.write(`Hint: ${i.hint}\n`),i.diagnosticId&&process.stderr.write(`Diagnostic ID: ${i.diagnosticId}\n`),i.logPath&&process.stderr.write(`Diagnostics Log: ${i.logPath}\n`);let a=sr(i.details);a&&process.stderr.write(`${a}\n`),r.showDetails&&i.details&&process.stderr.write(`${JSON.stringify(i.details,null,2)}\n`)}function Hr(e,t={}){let n=e.nodes,r=Array.isArray(n)?n:[],o=a(i(e.backend)?e.backend:void 0),s=zn(e,r,t),c=Kr(e),l=di(e,r,t,s),u=l.length>0?`${l.join(`
3
- `)}\n`:``,d=t.raw?null:Ur(e);if(d)return`${c}${u}${Wr(d)}\n`;let f=t.raw||!o?null:fe(s.nodes),p=!!e.truncated,m=f?.nodes??r,h=t.raw||!o?null:Qr(e,f,m.length,r.length,s.filteredCount),g=qr(r.length,h,p);return r.length===0?`${c}${g}\n${u}`:t.raw?`${c}${g}\n${u}${Jr(r)}\n`:t.flatten?`${c}${g}\n${u}${Yr(m)}${Zr(f)}\n`:`${c}${g}\n${u}${Xr(m)}${Zr(f)}\n`}function Ur(e){let t=e.unchanged;if(!t||typeof t!=`object`)return null;let n=t;return typeof n.ageMs!=`number`||typeof n.nodeCount!=`number`?null:{ageMs:n.ageMs,nodeCount:n.nodeCount,interactiveOnly:n.interactiveOnly===!0?!0:void 0,scope:typeof n.scope==`string`?n.scope:void 0}}function Wr(e){let t=Gr(e.ageMs);return e.scope?[`Scoped snapshot unchanged for scope "${e.scope}" since previous read ${t} ago.`,`Previous refs in this scope remain valid. Use find/get/is for a targeted query, or --force-full to re-emit.`].join(`
4
- `):e.interactiveOnly?[`Interactive snapshot unchanged since previous read ${t} ago.`,`${e.nodeCount} visible nodes are unchanged. Previous @e refs are still valid. Use find/get/is for a targeted query, or --force-full to re-emit.`].join(`
5
- `):[`Snapshot unchanged since previous read ${t} ago.`,`Refs from the previous snapshot are still valid. Use --force-full to re-emit the tree, or use find/get/is for a targeted query.`].join(`
6
- `)}function Gr(e){if(e<1e3)return`${Math.round(e)}ms`;if(e<6e4)return`${(Math.round(e/100)/10).toFixed(1)}s`;let t=e/6e4;if(t<60)return`${(Math.round(t*10)/10).toFixed(1)}m`;let n=t/60;return`${(Math.round(n*10)/10).toFixed(1)}h`}function Kr(e){let t=typeof e.appName==`string`?e.appName:void 0,n=typeof e.appBundleId==`string`?e.appBundleId:void 0,r=[];return t&&r.push(`Page: ${t}`),n&&r.push(`App: ${n}`),r.length>0?`${r.join(`
7
- `)}\n`:``}function qr(e,t,n){let r=n?` (truncated)`:``;return t?.partial?t.totalNodeCount>t.visibleNodeCount?`Snapshot: ${t.visibleNodeCount} visible nodes (${t.totalNodeCount} total)${r}`:`Snapshot: ${t.visibleNodeCount} visible nodes${r}`:`Snapshot: ${e} nodes${r}`}function Jr(e){return e.map(e=>JSON.stringify(e)).join(`
8
- `)}function Yr(e){return yi(e).join(`
9
- `)}function Xr(e){return gi(Or(e,{summarizeTextSurfaces:!0})).join(`
10
- `)}function Zr(e){return e&&e.summaryLines.length>0?`\n${e.summaryLines.join(`
11
- `)}`:``}function Qr(e,t,n,r,i=0){let a=$r(e);if(i===0&&a)return a;let o=(t?.hiddenCount??0)+i,s=t?t.nodes.some(e=>e.hiddenContentAbove||e.hiddenContentBelow):!1;return o>0?{partial:!0,visibleNodeCount:n,totalNodeCount:Math.max(r,a?.totalNodeCount??r),reasons:ei([...a?.reasons??[],`offscreen-nodes`])}:a||(s?{partial:!0,visibleNodeCount:n,totalNodeCount:n,reasons:[]}:null)}function $r(e){let t=e.visibility;if(!t||typeof t!=`object`)return null;let n=t;return typeof n.partial!=`boolean`||typeof n.visibleNodeCount!=`number`||typeof n.totalNodeCount!=`number`||!Array.isArray(n.reasons)?null:{partial:n.partial,visibleNodeCount:n.visibleNodeCount,totalNodeCount:n.totalNodeCount,reasons:n.reasons.filter(e=>typeof e==`string`)}}function ei(e){return[...new Set(e)]}function ti(e){let t=e.baselineInitialized===!0,n=e.summary??{},r=F(n.additions),i=F(n.removals),a=F(n.unchanged),o=I(),s=hi(e),c=s.length>0?`${s.join(`
12
- `)}\n`:``;if(t)return`${c}Baseline initialized (${a} lines).\n`;let l=li(Array.isArray(e.lines)?e.lines:[],1).map(e=>{let t=typeof e.text==`string`?e.text:``;if(e.kind===`added`){let e=t.startsWith(` `)?`+${t}`:`+ ${t}`;return o?L(e,`green`):e}if(e.kind===`removed`){let e=t.startsWith(` `)?`-${t}`:`- ${t}`;return o?L(e,`red`):e}return o?L(t,`dim`):t}),u=l.length>0?`${l.join(`
13
- `)}\n`:``;return o?`${c}${u}${[`${L(String(r),`green`)} additions`,`${L(String(i),`red`)} removals`,`${L(String(a),`dim`)} unchanged`].join(`, `)}\n`:`${c}${u}${r} additions, ${i} removals, ${a} unchanged\n`}function ni(e){let t=I(),n=e.match===!0,r=e.dimensionMismatch,i=[];return i.push(...ri(e,t)),i.push(...ii(e,n,t)),!n&&!r&&(i.push(...ai(e,t)),i.push(...oi(e,t))),`${i.join(`
14
- `)}\n`}function ri(e,t){if(e.match===!0)return[`${t?L(`✓`,`green`):`✓`} Screenshots match.`];let n=e.dimensionMismatch,r=t?L(`✗`,`red`):`✗`;if(n){let e=n.expected,t=n.actual;return[`${r} Screenshots have different dimensions: expected ${e?.width}x${e?.height}, got ${t?.width}x${t?.height}`]}let i=F(e.differentPixels),a=F(e.mismatchPercentage),o=`${a===0&&i>0?`<0.01`:String(a)}% pixels differ`;return[`${r} ${t?L(o,`red`):o}`]}function ii(e,t,n){if(t)return[];let r=[];if(e.diffPath){let t=ci(e.diffPath),i=n?L(`Diff image:`,`dim`):`Diff image:`,a=n?L(t,`green`):t;r.push(` ${i} ${a}`)}if(e.currentOverlayPath){let t=ci(e.currentOverlayPath),i=n?L(`Current overlay:`,`dim`):`Current overlay:`,a=n?L(t,`green`):t,o=F(e.currentOverlayRefCount),s=o>0?` (${o} refs)`:``;r.push(` ${i} ${a}${s}`)}return r}function ai(e,t){let n=F(e.differentPixels),r=F(e.totalPixels);return[` ${t?L(String(n),`red`):String(n)} different / ${r} total pixels`]}function oi(e,t){let n=Array.isArray(e.regions)?e.regions:[];if(n.length===0)return[];let r=[` ${ui(`Changed regions:`,t)}`];for(let e of n.slice(0,5))r.push(...si(e));return r}function si(e){let t=e.shareOfDiffPercentage===0&&e.differentPixels>0?`<0.01`:String(e.shareOfDiffPercentage),n=e.rect,r=[` ${e.index}. x=${n.x} y=${n.y} ${n.width}x${n.height}, ${t}% of diff`],i=e.currentOverlayMatches?.[0];if(i){let e=i.label?` "${i.label}"`:``;r.push(` overlaps @${i.ref}${e}, ${i.regionCoveragePercentage}% of region`)}return r}function ci(e){let t=process.cwd(),n=Fe.relative(t,e);return n===``||!n.startsWith(`..`)&&!Fe.isAbsolute(n)?n===``?`.`:`.${Fe.sep}${n}`:e}function F(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function li(e,t){if(e.length===0)return e;let n=e.map((e,t)=>({index:t,kind:e.kind})).filter(e=>e.kind===`added`||e.kind===`removed`).map(e=>e.index);if(n.length===0)return e;let r=Array(e.length).fill(!1);for(let i of n){let n=Math.max(0,i-t),a=Math.min(e.length-1,i+t);for(let e=n;e<=a;e+=1)r[e]=!0}return e.filter((e,t)=>r[t])}function I(e=process.stdout){let t=process.env.FORCE_COLOR;return typeof t==`string`?t!==`0`:typeof process.env.NO_COLOR==`string`?!1:!!e.isTTY}function L(e,t,n){return Ie(t,e,n)}function ui(e,t){return t?L(e,`dim`):e}function di(e,t,n,r={nodes:t,filteredCount:0}){let i=hi(e);if(fi(e)){let e=mi(t,n);e&&i.push(e)}!n.raw&&r.filteredCount>0&&i.push(`Collapsed ${r.filteredCount} Android helper node${r.filteredCount===1?``:`s`} from the agent-facing text snapshot; use --raw or --json for the full hierarchy.`);let a=r.filteredCount>0?r.nodes:t;return!n.raw&&Jn(a)&&i.push(`Warning: possible repeated nav subtree detected.`),i}function fi(e){return!e.snapshotQuality&&!pi(e)}function pi(e){let t=e.snapshotDiagnostics;if(!t||typeof t!=`object`)return!1;let n=t.stats;return!!(n&&typeof n==`object`&&n.platform===`web`)}function mi(e,t){if(t.scoped===!0||t.depthLimited===!0||e.length>3)return null;let n=e.length===1?`node`:`nodes`;return`Hint: sparse accessibility snapshot returned ${e.length} ${n}; snapshot state is invalid or unavailable for this screen. Use plain screenshot, not screenshot --overlay-refs, as visual truth. If screenshot shows the Home Screen or another app, run open for this app again first. Then navigate away with coordinates if needed and retry snapshot -i on the next screen.`}function hi(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.length>0):[]}function gi(e){let t=[],n=[],r=new Map(e.map(e=>[e.node.index,e.node])),i=e=>{for(;n.length>0&&(!e||_i(e,n[n.length-1],r));)t.push(...bi(n.pop(),`below`))};for(let r of e)i(r),t.push(r.text),t.push(...bi(r,`above`)),r.node.hiddenContentBelow&&n.push(r);return i(),t}function _i(e,t,n){return vi(e.node,t.node,n)?!1:e.depth<=t.depth}function vi(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){if(r.parentIndex===t.index)return!0;let e=n.get(r.parentIndex);if(!e)return!1;r=e}return!1}function yi(e){return Or(e,{summarizeTextSurfaces:!0}).flatMap(e=>[kr(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...bi({...e,depth:0})])}function bi(e,t){let n=xi(e.type);if(!n)return[];let r=[];if(e.node.hiddenContentAbove&&t!==`below`&&r.push(`[content above ${n} hidden]`),e.node.hiddenContentBelow&&t!==`above`&&r.push(`[content below ${n} hidden]`),r.length===0)return[];let i=` `.repeat(e.depth+1);return r.map(e=>`${i}${e}`)}function xi(e){return e===`scroll-area`||e===`list`||e===`collection`||e===`table`?e:null}function Si(e,t,n={}){let r=Di(e);if(r.length===0)return{canScroll:!1,emptySnapshot:!0};let i=pe(r),a=Oi(r,i,t,n);return a?{canScroll:Ai(a,i.get(a.index),t),emptySnapshot:!1,scope:ji(a,r)}:{canScroll:!1,emptySnapshot:!1}}async function Ci(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=Si(await i(r),t,n);return r&&e.emptySnapshot?await Ci({edge:t,target:n,captureNodes:i}):e}catch(e){throw Ei(t,r,e)}}async function wi(e){let{edge:t,captureState:r,scroll:i}=e,a=await r();a.scope&&(a=await r(a.scope));let o=0,s;for(;a.canScroll;){if(o>=40)throw new n(`COMMAND_FAILED`,`scroll ${t} reached the safety limit before the snapshot showed the edge`,{hint:`The scoped scroll container still reports hidden content. Use a smaller manual scroll + snapshot loop to inspect the current state.`});s=await i(),o+=1,a=await r(a.scope)}return{passes:o,result:s}}function Ti(e,t,n,r,i){return t&&n===0?`Already at ${t}; no hidden content ${t===`bottom`?`below`:`above`} detected`:t?`Scrolled to ${t} with ${n} ${e} passes`:i===void 0?r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`:`Scrolled ${e} by ${i}px`}function Ei(e,t,r){return t?new n(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:t,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},r):new n(`COMMAND_FAILED`,`Failed to verify scroll ${e} state`,{hint:`scroll ${e} needs a snapshot showing hidden content ${e===`bottom`?`below`:`above`} before it will move.`},r)}function Di(e){return e.map((e,t)=>({...e,ref:`ref`in e&&e.ref?e.ref:`e${t+1}`}))}function Oi(e,t,n,r){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>Se(e)&&Li(e.rect));if(a.length===0)return null;let o=ki(r.nodeIndex,i);if(o)return o;let s=r.point;if(s){let e=a.filter(e=>e.rect&&Ii(e.rect,s)).sort(Pi);if(e.length>0)return e.find(e=>Ai(e,t.get(e.index),n))??e[0]??null}let c=a.filter(e=>Ai(e,t.get(e.index),n)).sort(Fi);return c.length>0?c[0]??null:a.filter(t=>ie(t,e)).sort(Fi)[0]??a.sort(Fi)[0]??null}function ki(e,t){if(e===void 0)return null;let n=t.get(e);for(;n;){if(Se(n)&&Li(n.rect))return n;n=n.parentIndex===void 0?void 0:t.get(n.parentIndex)}return null}function Ai(e,t,n){return n===`bottom`?e.hiddenContentBelow===!0||t?.hiddenContentBelow===!0:e.hiddenContentAbove===!0||t?.hiddenContentAbove===!0}function ji(e,t){return[e.identifier,e.label].filter(e=>typeof e==`string`).map(e=>e.trim()).find(n=>Ni(n)&&Mi(n,e,t))}function Mi(e,t,n){let r=e.toLowerCase(),i=n.filter(e=>[e.identifier,e.label,e.value].some(e=>typeof e==`string`&&e.trim().toLowerCase().includes(r)));return i.length===1&&i[0]?.index===t.index}function Ni(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function Pi(e,t){return R(e.rect)-R(t.rect)}function Fi(e,t){return R(t.rect)-R(e.rect)}function R(e){return e?e.width*e.height:0}function Ii(e,t){return t.x>=e.x&&t.x<=e.x+e.width&&t.y>=e.y&&t.y<=e.y+e.height}function Li(e){return!!(e&&e.width>0&&e.height>0)}function Ri(e,t,r,i){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>i)throw new n(`INVALID_ARGS`,`${t} must be an integer between ${r} and ${i}`);return e}function z(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function B(e){return e.clock?.now()??Date.now()}async function zi(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function Bi(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,e=>n(t,e)]))}function V(e){return e&&typeof e==`object`?e:void 0}function Vi(e){let t=Buffer.alloc(16);for(let n of e)Ui(t,Hi(n));return{digest:`ax1:${Le(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function Hi(e){return Le(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function Ui(e,t){for(let n=0;n<e.length;n+=1)e[n]=(e[n]??0)^(t[n]??0)}function H(e){let{digest:t,nodeCount:n}=Vi(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=Wi(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function Wi(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}const Gi=[`x`,`y`,`width`,`height`];function U(e){let t=W(e);if(!t)return null;let n=s(t);return!Number.isFinite(n.x)||!Number.isFinite(n.y)?null:n}function W(e){if(!e)return null;let t=Number(e.x),n=Number(e.y),r=Number(e.width),i=Number(e.height);return!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(r)||!Number.isFinite(i)||r<0||i<0?null:{x:t,y:n,width:r,height:i}}function G(e,t){return!e||!t?!1:Gi.every(n=>Math.abs(e[n]-t[n])<=.5)}function Ki(e){return{x:qi(e.x,e.width),y:qi(e.y,e.height)}}function qi(e,t){if(t<=1)return Math.floor(e);let n=Math.ceil(e),r=Math.floor(e+t-1);return Math.round(Math.min(r,Math.max(n,e+t/2)))}function Ji(e){return{...e.id===void 0?{}:{id:e.id},role:e.role,...e.label===void 0?{}:{label:e.label}}}function Yi(e,t){return t.id===void 0?e.role===t.role&&e.label===t.label:e.id===t.id}function Xi(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 Zi(e,t){let n=[];return e.id!==t.id&&n.push(`id: recorded=${e.id??`(none)`} observed=${t.id??`(none)`}`),e.role!==t.role&&n.push(`role: recorded=${e.role} observed=${t.role}`),e.label!==t.label&&n.push(`label: recorded=${e.label??`(none)`} observed=${t.label??`(none)`}`),n}function Qi(e){return e?`${e.role}${e.label?`/${e.label}`:``}`:`(missing)`}function $i(e,t){return!t||t.role!==e.role?!0:e.label!==void 0&&t.label!==e.label}function ea(e,t){for(let[n,r]of e.entries()){let e=t[n];if($i(r,e))return[`ancestry[${n}]: recorded=${Qi(r)} observed=${Qi(e)}`]}return[]}function ta(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function na(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=S(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function ra(e,t,n,r){return e.filter(e=>{if(!Yi(S(e),n))return!1;let i=na(e,t,Math.max(r.length,1));return!i.broken&&Xi(i.chain,r)})}const ia=[`tabbar`,`toolbar`,`navigationbar`,`bottomnavigation`,`bottomnavigationview`,`sheet`,`dialog`,`alert`,`popover`,`menu`],aa=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`edittext`,`checkbox`,`radio`,`switch`,`cell`];function oa(e,t={}){if(e.length<2)return e;let n=new Map(e.map(e=>[e.index,e])),r={nodes:e,byIndex:n,overlayPositions:e.flatMap((e,r)=>fa(e,n,t)?[r]:[]),coverCache:new Map},i=[];for(let[n,a]of e.entries())da(a)&&sa(r,n,a,t)&&i.push(n);if(i.length===0)return e;let a=[...e];for(let t of i){let n=e[t];a[t]={...n,hittable:!1,interactionBlocked:`covered`,presentationHints:Sa(n.presentationHints)}}return a}function K(e){return e.interactionBlocked!==void 0}function sa(e,t,n,r){let i=e.coverCache.get(t);if(i!==void 0)return i;e.coverCache.set(t,null);let a=q(n.rect);if(!a)return ca(e,t,null);let o=s(a);for(let i of e.overlayPositions){if(i<=t)continue;let s=e.nodes[i];if(s&&la(e,i,n,a,o,r))return ca(e,t,s)}return ca(e,t,null)}function ca(e,t,n){return e.coverCache.set(t,n),n}function la(e,t,n,r,i,a){if(!e.nodes[t])return!1;let o=ua(e,t,n,r,a);return!!(o&&x(o,i.x,i.y))}function ua(e,t,n,r,i){let a=e.nodes[t];if(!a||!fa(a,e.byIndex,i)||ba(n,a,e.byIndex))return null;let o=q(a.rect);return!o||G(r,o)||sa(e,t,a,i)?null:o}function da(e){return q(e.rect)?e.hittable===!0||ga(e)?!0:!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()):!1}function fa(e,t,n){return!q(e.rect)||ya(e)?!1:_a(e,ia)||pa(e,t,n)}function pa(e,t,n){return n.isAdditionalOverlayNode?.(e)===!0?!ma(e,t,n):!1}function ma(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(ha(r,n))return!0;i.add(r.index),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function ha(e,t){return t.isAdditionalOverlayNode?.(e)===!0&&q(e.rect)!==null&&!ya(e)}function ga(e){return _a(e,aa)}function _a(e,t){let n=va(e);return t.some(e=>n.includes(e))}function va(e){return[e.type,e.role,e.subrole].map(e=>y(e??``)).join(` `)}function ya(e){let t=va(e);return t.includes(`application`)||t.includes(`window`)}function ba(e,t,n){return xa(e,t,n)||xa(t,e,n)}function xa(e,t,n){let r=typeof t.parentIndex==`number`?n.get(t.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(r.index===e.index)return!0;i.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}return!1}function q(e){let t=W(e);return t&&t.width>0&&t.height>0?t:null}function Sa(e){return Array.from(new Set([...e??[],`covered`]))}const Ca=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function wa(e,t){return Ta(e,t).node}function Ta(e,t){if(K(t))return{node:t,reason:`covered`};let n=Ea(e,t);if(n?.rect&&U(n.rect))return{node:n,reason:`same-rect-descendant`};if(Da(t)&&t.rect&&U(t.rect))return{node:t,reason:`semantic-target`};let r=ce(e,t);return r?.rect&&!K(r)&&U(r.rect)?ka(t,r,e)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}:{node:t,reason:`original`}}function Ea(e,t){let n=W(t.rect);if(!n)return null;let r=t,i=new Set;for(;!i.has(r.ref);){i.add(r.ref);let t=e.filter(e=>{if(e.parentIndex!==r.index||!e.hittable||K(e))return!1;let t=W(e.rect);return t?G(t,n):!1});if(t.length!==1)break;r=t[0]}return r===t?null:r}function Da(e){return[e.type,e.role,e.subrole].map(e=>y(e??``)).some(Oa)}function Oa(e){return e===`tab`||Ca.some(t=>e.includes(t))}function ka(e,t,n){let r=W(e.rect),i=W(t.rect);if(!r||!i)return!1;let a=Aa(n,r);return!a||!ja(i,a)?!1:!G(r,i)}function Aa(e,t){let n=s(t),r=e.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)}).map(e=>W(e.rect)).filter(e=>e!==null);if(r.length===0)return null;let i=r.filter(e=>x(e,n.x,n.y));return Oe(i.length>0?i:r)}function ja(e,t){let n=d(e,t),r=e.width*e.height,i=t.width*t.height;if(n<=0||r<=0||i<=0)return!1;let a=n/i,o=n/r;return a>=.9&&o>=.8}function Ma(e){return e.hittable===!0||Da(e)}function Na(e,t){let n=me(S(e),t);return n.id!==void 0||n.label!==void 0?!1:xe(e.value)===null}function Pa(e,t,n){let r=new Set,i=e;for(;typeof i.parentIndex==`number`;){if(r.has(i.index))return!1;if(r.add(i.index),i.parentIndex===t.index)return!0;let e=n.get(i.parentIndex);if(!e)return!1;i=e}return!1}function Fa(e,t){let n=ta(t);return t.filter(t=>t.index!==e.index&&Pa(t,e,n)).sort((e,t)=>e.index-t.index)}function Ia(e,t){let n=U(e.rect);return!n||!t.rect?!1:x(t.rect,n.x,n.y)}function La(e,t){if(!Na(e,t))return e;let n=Fa(e,t);if(n.some(Ma))return e;let r=n.find(e=>S(e).label!==void 0);return!r||!Ia(r,e)?e:r}const Ra=new Set([`healthy`,`recovered`,`sparse`]),za=new Set([`tree`,`queries`,`private-ax`]),Ba=new Set([`ax-rejected`,`sparse-tree`,`budget`,`no-nodes`,`capture-failed`]);function Va(e){if(!e||typeof e!=`object`)return;let t=e;if(!(typeof t.state!=`string`||!Ra.has(t.state))&&!(typeof t.backend!=`string`||!za.has(t.backend)))return{state:t.state,backend:t.backend,reason:typeof t.reason==`string`?t.reason:void 0,reasonCode:typeof t.reasonCode==`string`&&Ba.has(t.reasonCode)?t.reasonCode:void 0,effectiveDepth:typeof t.effectiveDepth==`number`?t.effectiveDepth:void 0,collapsedLeafIndexes:Array.isArray(t.collapsedLeafIndexes)?t.collapsedLeafIndexes.filter(e=>typeof e==`number`):void 0}}function Ha(e){return e?.state===`sparse`}function Ua(e,t){return[...Wa(e),...Ga(e),...Ka(e,t)]}function Wa(e){return e.state===`recovered`?[`Detected an overly complex or slow accessibility tree. Fell back to the ${e.backend} snapshot backend. It is OK to continue; use --json to inspect snapshotQuality.reason if you need recovery details.`]:e.state===`sparse`?[`No snapshot backend could read this screen`+(e.reason?` (${e.reason})`:``)+`. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`]:[]}function Ga(e){return e.effectiveDepth===void 0?[]:[`Some deeper accessibility nodes were omitted; this tree is capped at depth ${e.effectiveDepth}. Re-run with --depth ${e.effectiveDepth} --scope <container> only if you need deeper content.`]}function Ka(e,t){let n=[];for(let r of e.collapsedLeafIndexes??[]){let e=t.find(e=>e.index===r);if(!e)continue;let i=e.identifier?` (${e.identifier})`:``;n.push(`@${e.ref} [${e.type??`element`}]${i} merges many labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`)}return n}const qa=new Set([`empty-helper-output`,`system-window-only`,`content-poor-app-window`]);function Ja(e){if(!e||typeof e!=`object`)return!1;let t=e.details?.androidSnapshotHelperFailureReason;return typeof t==`string`&&qa.has(t)}function Ya(e){return e===`text`||e===`label`||e===`any`}function Xa(e,t,n,r){if(!(r||e===`web`))return Ya(t)?n:void 0}function Za(e){return new n(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}async function Qa(e,t){let r=t??`default`,i=await e.sessions.get(r);if(!i)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let a=i.refFrameSnapshot??i.snapshot;if(!a)throw new n(`INVALID_ARGS`,`No snapshot in session. Run snapshot first.`);return{sessionName:r,session:i,snapshot:a}}async function $a(e,t,r={updateSession:!0}){let i=e.backend.captureSnapshot;if(!i)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let a=t.session??`default`,o=await e.sessions.get(a),s=await i(z(e,t),{interactiveOnly:r.interactiveOnly??!1,depth:t.depth,scope:r.scope??t.scope,raw:t.raw,includeRects:r.includeRects,...r.includeHiddenContentHints===void 0?{}:{includeHiddenContentHints:r.includeHiddenContentHints}}),c=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,...s.quality?{snapshotQuality:s.quality}:{},createdAt:B(e)};return(t.signal??e.signal)?.throwIfAborted(),r.updateSession&&o&&!Ha(c.snapshotQuality)&&await e.sessions.set({...o,snapshot:c}),{sessionName:a,session:o,snapshot:c}}async function eo(e,t,n){if(e.backend.readText){let r=await e.backend.readText(z(e,{session:t.sessionName}),n);if(r.text.trim())return r.text}return ae(n)}function to(e,t,i){let a=o(t);if(!a)throw new n(`INVALID_ARGS`,i.invalidRefMessage);let s=r(e,a)??(i.fallbackLabel.length>0?je(e,i.fallbackLabel):null);if(!s)throw new n(`COMMAND_FAILED`,i.notFoundMessage);return{ref:a,node:s}}function no(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=Buffer.byteLength(`…`,`utf8`),r=Math.max(0,t-n),i=Buffer.from(e,`utf8`),a=Math.min(r,i.length);for(;a>0&&(i[a]&192)==128;)--a;return i.subarray(0,a).toString(`utf8`)+`…`}function ro(e,t,r,i){if(!r)return;let a=S(e),o=ge(e,t);if(!(Ce(a,r.identity)&&De(o,r.structural)))throw new n(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:we,observed:a,observedStructural:o,expected:r.identity,expectedStructural:r.structural})}async function J(e,t,n){return await X(e,t,n.action),t.target.kind===`point`?await ao(e,t,t.target,n):t.target.kind===`ref`?await so(e,t,t.target,n):await co(e,t,t.target,n)}async function io(e,t,n){let r=t.session??`default`,i=await e.sessions.get(r);if(!i?.snapshot)return;let a={x:n.x,y:n.y,width:0,height:0},o=ve(i.snapshot.nodes,a);if(!o)return;let s={x:n.x,y:n.y};if(!x(o,s.x,s.y))return`Coordinates (${s.x}, ${s.y}) are outside the last-known viewport (${o.width}x${o.height}). The tap will be forwarded anyway; take a fresh snapshot if the screen changed.`}async function ao(e,t,n,r){let i=await io(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await oo(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preActionNodes:a}:{},...i?{warning:i}:{}}}async function oo(e,t){try{return(await Y(e,t,!0)).snapshot.nodes}catch{return}}async function so(e,t,n,r){let i=await wo(e,t,n),a=i.resolved;ro(a.node,i.snapshot.nodes,r.expectedResolvedTarget,r.action);let o=r.promoteToHittableAncestor?yo(i.snapshot.nodes,a.node,{action:r.action,label:`Ref ${n.ref}`}):a.node;bo(o,`Ref ${n.ref}`,r.action);let s=await Ao(e,t,o,i.snapshot.nodes,n.ref,r.action);return{kind:`ref`,point:Do(s,`Ref ${n.ref} not found or has invalid bounds`),target:{kind:`ref`,ref:`@${a.ref}`},...ho(e,s,i.snapshot.nodes,r.action,a.resolution)}}async function co(e,t,r,i){let a=h(r.selector),o=await Y(e,t,i.requireInteractive),s=b(vo(o.snapshot.nodes),a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if((!s||!s.node.rect)&&i.requireInteractive&&(o=await Y(e,t,!1),s=b(vo(o.snapshot.nodes),a,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0})),!s||!s.node.rect){let t=b(o.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!0,requireUnique:!1});throw t?.node&&K(t.node)?xo({label:`Selector ${t.selector.raw}`,node:t.node,action:i.action,selector:t.selector.raw}):new n(`COMMAND_FAILED`,ke(a,s?.diagnostics??[],{unique:!0}),{hint:Ae(s?.diagnostics??[])})}ro(s.node,o.snapshot.nodes,i.expectedResolvedTarget,i.action);let c=i.promoteToHittableAncestor?yo(o.snapshot.nodes,s.node,{action:i.action,label:`Selector ${s.selector.raw}`}):s.node;bo(c,`Selector ${s.selector.raw}`,i.action);let l=await ko(e,t,c,o.snapshot.nodes,s.selector.raw,i.action);return{kind:`selector`,point:Do(l,`Selector ${s.selector.raw} resolved to invalid bounds`),target:{kind:`selector`,selector:s.selector.raw},...ho(e,l,o.snapshot.nodes,i.action,po(s,o.snapshot.nodes))}}const lo={source:`ref`,phase:`pre-action`,kind:`exact`},uo={source:`ref`,phase:`pre-action`,kind:`label-fallback`},fo={source:`runtime`,phase:`pre-action`,kind:`unique`};function po(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:mo(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>mo(e,t))}:fo}function mo(e,t){let n=y(e.type??``),r=oe(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:no(n,256)}:{},...r===void 0?{}:{label:no(r,256)}}}function ho(e,t,n,r,i){return{node:t,selectorChain:Te(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:n}),refLabel:oe(t,n),..._o(t,r),preActionNodes:n,resolution:i,...go(e,t,n,r)}}function go(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=La(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:Te(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:oe(i,n)}}}function _o(e,t){return e.hittable===!1?{targetHittable:!1,hint:`The resolved element reports hittable: false, so this ${t} may have had no visible effect. Verify with a snapshot, or prefer a @ref or a longer/more specific selector to target the intended element.`}:{}}function vo(e){return e.filter(e=>!K(e))}function yo(e,t,n){let r=Ta(e,t);if(r.reason===`covered`)throw xo({label:n.label,node:t,action:n.action});return r.node}function bo(e,t,n){if(K(e))throw xo({label:t,node:e,action:n})}function xo(e){return new n(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${So(e.action)} safely`,{hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`,...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}function So(e){switch(e){case`fill`:return`be filled`;case`focus`:return`be focused`;case`longPress`:return`be long-pressed`;default:return`be tapped`}}async function Y(e,t,r){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`snapshot is not supported by this backend`);let i=t.session??`default`,a=await e.sessions.get(i);if(!a)throw new n(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let o=await e.backend.captureSnapshot(z(e,t),{interactiveOnly:r,includeRects:!0}),s=o.snapshot??{nodes:o.nodes??[],truncated:o.truncated,backend:o.backend,createdAt:B(e)};return await e.sessions.set({...a,snapshot:s}),{snapshot:s}}async function X(e,t,r){if(e.backend.platform!==`macos`)return;let i=await Co(e,t);if(!(i!==`desktop`&&i!==`menubar`)&&!(i===`menubar`&&(r===`click`||r===`press`)))throw new n(`UNSUPPORTED_OPERATION`,`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function Co(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function wo(e,t,r){let{session:i,snapshot:a}=await Qa(e,t.session),o=r.fallbackLabel??``,s=Eo(a.nodes,r.ref,{fallbackLabel:o});if(!s)throw new n(`COMMAND_FAILED`,`Ref ${r.ref} not found or has no bounds`,{hint:be});return To({session:i,frameTree:a,target:r,fallbackLabel:o,authorized:s})}function To(e){let{session:t,frameTree:n,target:r,fallbackLabel:i,authorized:a}=e,o=t.snapshot;if(!o||o===n)return{snapshot:n,resolved:a};let s=Eo(o.nodes,r.ref,{fallbackLabel:i});return s&&Ce(S(a.node),S(s.node))?{snapshot:o,resolved:s}:{snapshot:n,resolved:a}}function Eo(e,t,i){let a=o(t);if(!a)throw new n(`INVALID_ARGS`,`Invalid ref: ${t}`);let s=r(e,a);if(Oo(s))return{ref:a,node:s,resolution:lo};let c=i.fallbackLabel.length>0?je(e,i.fallbackLabel):null;return Oo(c)?{ref:a,node:c,resolution:uo}:null}function Do(e,t){let r=U(e.rect);if(!r)throw new n(`COMMAND_FAILED`,t);return r}function Oo(e){return e?U(e.rect)!==null:!1}async function ko(e,t,n,r,i,a){return await No(e,t,n,r,{message:`Selector ${i} resolved to an off-screen element and is not safe to ${a}`,details:{reason:`offscreen_selector`,selector:i},hint:e=>`${jo(e)} in small steps, retrying ${a} with the same selector after each (it re-resolves against a fresh snapshot). A single large scroll can overshoot the target; a short bounded gesture pan lands it more reliably. If it is inside a closed drawer or another tab, open that container first.`})}async function Ao(e,t,n,r,i,a){return await No(e,t,n,r,{message:`Ref ${i} is off-screen and not safe to ${a}`,details:{reason:`offscreen_ref`,ref:o(i)},hint:e=>`${jo(e)} in small steps (a single large scroll can overshoot; a short bounded gesture pan lands it more reliably), then retry ${a} with a selector (e.g. text=/id=) rather than this @ref — the scroll expires the ref frame, so re-run snapshot -i before reusing any @ref.`})}function jo(e){return e?`Scroll ${e} toward it`:`Scroll toward it`}async function Mo(e,t,n,r){let i=(await e.sessions.get(t.session??`default`))?.snapshot?.nodes;if(!i||o(n.ref)===null)return{};let a=Eo(i,n.ref,{fallbackLabel:n.fallbackLabel??``});if(!a)return{};bo(a.node,`Ref ${n.ref}`,r);let s=await Ao(e,t,a.node,i,n.ref,r);return{..._o(s,r),node:s,preActionNodes:i}}async function No(e,t,r,i,a){let o=r.rect?Ee(r,i):null;if(!r.rect||!o||ye(r,i))return r;let s=ve(i,r.rect),c=await e.backend.confirmOffscreenTargetVisible?.(z(e,t),r,s);if(c)return{...r,rect:c};let l=de(r,i);throw new n(`COMMAND_FAILED`,a.message,{...a.details,rect:r.rect,viewport:o,...l?{scrollDirection:l}:{},hint:a.hint(l)})}function Po(e,t){let n=P(e.type??`Element`),r=N(e,n),i=e.enabled===!1?`disabled`:`enabled`,a=e.selected===!0?`selected`:`unselected`,o=e.hittable===!0?`hittable`:`not-hittable`;return[String(t??e.depth??0),n,r,i,a,o].join(`|`)}function Fo(e,t,n={}){let r=Ro(Lo(e,n),Lo(t,n)),i={additions:0,removals:0,unchanged:0};for(let e of r)e.kind===`added`&&(i.additions+=1),e.kind===`removed`&&(i.removals+=1),e.kind===`unchanged`&&(i.unchanged+=1);return{summary:i,lines:r}}function Io(e,t={}){return Lo(e,t).length}function Lo(e,t){return t.flatten?e.map(e=>({text:kr(e,0,!1),comparable:Po(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):Or(e).map(e=>({text:e.text,comparable:Po(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function Ro(e,t){let n=e.length,r=t.length,i=n+r,a=new Map,o=[];a.set(1,0);for(let s=0;s<=i;s+=1){o.push(new Map(a));for(let i=-s;i<=s;i+=2){let c=Bo(a,i,s)?Z(a,i+1):Z(a,i-1)+1,l=c-i;for(;c<n&&l<r&&e[c].comparable===t[l].comparable;)c+=1,l+=1;if(a.set(i,c),c>=n&&l>=r)return zo(o,e,t,n,r)}}return[]}function zo(e,t,n,r,i){let a=[],o=r,s=i;for(let r=e.length-1;r>=0;--r){let i=e[r],c=o-s,l=Bo(i,c,r)?c+1:c-1,u=Z(i,l),d=u-l;for(;o>u&&s>d;)a.push({kind:`unchanged`,text:n[s-1].text}),--o,--s;if(r===0)break;if(o===u){let e=n[d];a.push({kind:`added`,text:e.text,...e.ref?{ref:e.ref}:{}}),s=d}else a.push({kind:`removed`,text:t[u].text}),o=u}return a.reverse(),a}function Bo(e,t,n){return t===-n||t!==n&&Z(e,t-1)<Z(e,t+1)}function Z(e,t){return e.get(t)??0}function Vo(e){return e?Ne({packageName:e.bundleId,resourceId:e.identifier}).inputMethodOwned:!1}const Ho=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),Uo={strippedIndexes:new Set,refs:new Set};function Wo(e){let t=new Set(e.filter(e=>y(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return Uo;let n=new Map(e.map(e=>[e.index,e])),r=Yo(e,n,t),i=new Set(r),a=rs(e,n,r);for(let t of Yo(e,n,a))i.add(t);for(let o of Go(e,n,a,t,r))i.delete(o);let o=new Set(e.filter(e=>e.ref&&i.has(e.index)).map(e=>e.ref));return{strippedIndexes:new Set([...i].filter(e=>!t.has(e))),refs:o}}function Go(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=qo(t,n,r);if(o.size===0)return a;let s=Jo(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&Ko(n,t,o)&&a.add(n.index);return a}function Ko(e,t,n){if(!e.rect)return!1;let r=is(e,t);if(r===void 0)return!1;let i=n.get(r);return i!==void 0&&e.rect.y+e.rect.height/2<i}function qo(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=is(n,e);if(a===void 0||!t.has(a))continue;let o=r.get(a);(o===void 0||n.rect.y<o)&&r.set(a,n.rect.y)}return r}function Jo(e,t){let n=new Set;for(let r of t){let t=e.get(r),i=t&&typeof t.parentIndex==`number`?e.get(t.parentIndex):void 0;for(;i;)n.add(i.index),i=typeof i.parentIndex==`number`?e.get(i.parentIndex):void 0}return n}function Yo(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)as(i,t,n)&&r.add(i.index);return r}function Xo(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Pe(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Me(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function Zo(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(e=>Vo(e)).map(e=>e.index)),i=new Set([...r].filter(e=>{let t=n.get(e)?.parentIndex,i=t===void 0?void 0:n.get(t);return!i||!r.has(i.index)})),a=t===`com.android.systemui`?new Set:Qo(e,n,r),o=new Set([...r].filter(e=>!i.has(e)));for(let e of a)o.add(e);let s=new Set(e.filter(e=>e.ref&&(r.has(e.index)||a.has(e.index))).map(e=>e.ref));return o.size===0&&s.size===0?Uo:{strippedIndexes:o,refs:s}}function Qo(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&Xo(e,t)).map(e=>e.index))}function $o(e,t){let n=Wo(e),r=Zo(e,t);return n.strippedIndexes.size===0&&n.refs.size===0?r:r.strippedIndexes.size===0&&r.refs.size===0?n:{strippedIndexes:new Set([...n.strippedIndexes,...r.strippedIndexes]),refs:new Set([...n.refs,...r.refs])}}function es(e,t){let{strippedIndexes:n}=$o(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function ts(e,t){return $o(e,t).refs}function ns(e){return Wo(e).refs}function rs(e,t,n){let r=new Set;for(let e of n){let n=t.get(e);if(!n||y(n.type??``)!==`keyboard`)continue;let i=is(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>Ho.has(y(e.type??``))&&!n.has(e.index)&&as(e,t,a))&&r.delete(i)}return r}function is(e,t){let n=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;n;){if(y(n.type??``)===`window`)return n.index;n=typeof n.parentIndex==`number`?t.get(n.parentIndex):void 0}}function as(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){if(n.has(r.index))return!0;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}async function os(e,t,n,r){let i=new AbortController,a=[t.signal,e.signal].filter(e=>e!==void 0),o=AbortSignal.any([...a,i.signal]),s=!1,c=setTimeout(()=>{s=!0,i.abort(new DOMException(`Wait deadline exceeded`,`TimeoutError`))},Math.max(0,n));c.unref();try{let e=await r(o);return s&&!a.some(e=>e.aborted)?{timedOut:!0}:(o.throwIfAborted(),{timedOut:!1,value:e})}catch(e){if(s&&!a.some(e=>e.aborted))return{timedOut:!0};throw e}finally{clearTimeout(c)}}const ss=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function cs(e,t,n){let{quietMs:r,timeoutMs:i}=n,a=B(e),o=a+i,s=!1,c=Math.min(300,Math.max(25,r)),l=0,u,d=0,f,p=a;for(;B(e)<o;){let m=await ds(e,t,o-B(e));if(!m)return{settled:!1,stalled:!0,waitedMs:B(e)-a,captures:l,nodeCount:d,lastCapture:f};l+=1,f=m;let h=fs(m.snapshot.nodes),g=B(e);if(n.resetBudgetOnPrivateAxRecovery===!0&&!s&&ls(m.snapshot.snapshotQuality)){s=!0,o=Math.max(o,g+i),p=g,u=h,d=m.snapshot.nodes.length;let t=us({nowMs:g,quietSinceMs:p,quietMs:r,pollMs:c,deadlineMs:o});if(t<=0)break;await zi(e,t);continue}if(h!==u)u=h,d=m.snapshot.nodes.length,p=g;else if(l>=2&&g-p>=r)return{settled:!0,stalled:!1,waitedMs:g-a,captures:l,nodeCount:d,lastCapture:f};let _=us({nowMs:g,quietSinceMs:p,quietMs:r,pollMs:c,deadlineMs:o});if(_<=0)break;await zi(e,_)}return{settled:!1,stalled:!1,waitedMs:B(e)-a,captures:l,nodeCount:d,lastCapture:f}}function ls(e){return e?.state===`recovered`&&e.backend===`private-ax`}function us(e){let t=e.quietSinceMs+e.quietMs-e.nowMs,n=t>e.pollMs?e.pollMs:Math.max(25,t+2),r=e.deadlineMs-e.nowMs,i=r-1;return i<2?r>=2?r:0:Math.min(n,i)}async function ds(e,t,n){let r=await os(e,t,n,async n=>await $a(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0}));return r.timedOut?void 0:r.value}function fs(e){return e.map(ps).join(`|`)}function ps(e){let t=e.rect?`${Math.round(e.rect.x)},${Math.round(e.rect.y)},${Math.round(e.rect.width)},${Math.round(e.rect.height)}`:``;return`${e.type??``}#${e.label??``}#${e.identifier??``}#${t}`}const ms=`The UI kept changing for the whole settle budget (animation, carousel, or ticker?), so no settled diff is shown. Raise --timeout, wait for specific content, or take a fresh snapshot.`,hs=`A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot.`;async function gs(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{let o=await cs(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0}),s={...a,settled:o.settled,waitedMs:o.waitedMs,captures:o.captures};if(!o.lastCapture)return{observation:{...s,hint:o.stalled?hs:ms}};let{stored:c,session:l}=await Ds(e,t,o.lastCapture),u=o.lastCapture.snapshot.nodes;return{observation:{...s,...o.settled&&c?bs(vs(n.resolved),u,n.resolved.point,l?.appBundleId):{},...Es(o,c,u.length)},settledNodes:u}}catch(e){return{observation:{...a,hint:`Settle observation unavailable (${e instanceof Error?e.message:String(e)}). The action itself succeeded; take a snapshot to observe the result.`}}}}function _s(e,t){if(!e)return;let n=H(e),r=t!==void 0&&n.digest!==H(t).digest;return{...n,changedFromBefore:r}}function vs(e){return`preActionNodes`in e&&e.preActionNodes?e.preActionNodes:[]}function ys(e,t,n){let r=Fo(es(e,n),es(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=Ts(i).map(e=>({kind:e.kind,text:e.text,...e.ref?{ref:e.ref}:{}}));return{summary:r.summary,lines:a,...i.length>a.length?{truncated:!0}:{}}}function bs(e,t,n,r){let i=ys(e,t,r);return{diff:i,...xs(i,t,n,r)}}function xs(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=ts(t,r),o=new Map(t.filter(e=>e.ref).map(e=>[e.ref,e]));return[...i].some(e=>e!==void 0&&!a.has(e)&&!Ss(o.get(e),n))?{}:ws(t,i,r)}function Ss(e,t){if(!e?.rect||!t)return!1;let{x:n,y:r,width:i,height:a}=e.rect;return t.x>=n&&t.x<=n+i&&t.y>=r&&t.y<=r+a}const Cs=new Set([`application`,`window`]);function ws(e,t,n){let r=ts(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!Cs.has(P(e.type??`Element`)));if(i.length===0)return{};let a=i.slice(0,20).map(e=>{let t=P(e.type??`Element`),n=N(e,t);return{ref:e.ref,role:t,...n?{label:n}:{}}});return{tail:a,...i.length>a.length?{tailTruncated:!0}:{}}}function Ts(e){if(e.length<=80)return e;let t=e.filter(e=>e.kind===`added`),n=new Set(t.slice(0,80)),r=80-n.size,i=[];for(let t of e)n.has(t)?i.push(t):t.kind===`removed`&&r>0&&(i.push(t),--r);return i}function Es(e,t,n){return e.stalled?{hint:hs}:e.settled?t?n<5?{hint:ss}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted. Use screenshot as visual truth before interacting further.`}:{hint:ms}}async function Ds(e,t,n){if(Ha(n.snapshot.snapshotQuality))return{stored:!1};let r=await e.sessions.get(t.session??`default`);return r?(await e.sessions.set({...r,snapshot:n.snapshot}),{stored:!0,session:r}):{stored:!1}}function Os(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function ks(e,t,n,r,i){let a=await As(e,t,n,i);return Ms({...r,...a})}async function As(e,t,n,r){if(r.settle!==void 0){let i=await gs(e,t,{...r.settle,resolved:n}),a=r.verify?_s(i.settledNodes,`preActionNodes`in n?n.preActionNodes:void 0):void 0;return{settle:i.observation,...a?{evidence:a}:{}}}if(!r.verify)return{};let i=await js(e,t,n);return i?{evidence:i}:{}}async function js(e,t,n){let r=`preActionNodes`in n?n.preActionNodes:void 0;try{let n=H((await Y(e,t,!0)).snapshot.nodes),i=r!==void 0&&n.digest!==H(r).digest;return{...n,changedFromBefore:i}}catch{return}}function Ms(e){let t=e;if(t.targetHittable!==!1||!Ns(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function Ns(e){if(e.evidence?.changedFromBefore===!0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}const Ps=async(e,t)=>{let r=await J(e,t,{action:`focus`,requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new n(`UNSUPPORTED_OPERATION`,`focus is not supported by this backend`);let i=Bs(r),a=V(await e.backend.focus(z(e,t),i));return{...r,...a?{backendResult:a}:{},...w(`Focused (${i.x}, ${i.y})`)}},Fs=async(e,t)=>{let r=Os(t),i=await J(e,t,{action:`longPress`,requireInteractive:!0,promoteToHittableAncestor:!0,captureEvidenceBaseline:r.needsPreActionBaseline,expectedResolvedTarget:t.expectedResolvedTarget});if(!e.backend.longPress)throw new n(`UNSUPPORTED_OPERATION`,`longPress is not supported by this backend`);let a=t.durationMs===void 0?void 0:Ri(t.durationMs,`durationMs`,0,12e4),o=Bs(i),s=V(await e.backend.longPress(z(e,t),o,{durationMs:a}));return await ks(e,t,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...w(`Long pressed (${o.x}, ${o.y})`)},r)},Is=async(e,t)=>{if(!e.backend.scroll)throw new n(`UNSUPPORTED_OPERATION`,`scroll is not supported by this backend`);let r=Rs(t.direction),i=Us(t.amount,`scroll amount`),a=Gs(t.pixels,`scroll pixels`),o=f(t.durationMs);p({amount:i,pixels:a},`scroll accepts either amount or pixels, not both`);let s=await Ls(e,t),c=s.kind===`viewport`?{kind:`viewport`}:{kind:`point`,point:Bs(s)},u=e.backend.scroll,d=async()=>await u(z(e,t),c,{direction:r.direction,...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},...o===void 0?{}:{durationMs:o}}),m,h=0;if(r.edge){let n=r.edge,i=zs(s),a=await wi({edge:n,captureState:async r=>await Vs(e,t,n,i,r),scroll:d});m=a.result,h=a.passes}else m=await d(),h=1;let g=V(m),_=l(g);return{...s,direction:r.direction,...r.edge?{edge:r.edge,passes:h}:{},...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},..._===void 0?{}:{durationMs:_},...g?{backendResult:g}:{},...w(Ti(r.direction,r.edge,h,i,a))}};async function Ls(e,t){let n=t.target??{kind:`viewport`};return n.kind===`viewport`?(await X(e,t,`scroll`),{kind:`viewport`}):await J(e,{...t,target:n},{action:`scroll`,requireInteractive:!1,promoteToHittableAncestor:!1})}function Rs(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:Hs(e,`scroll direction`)}}function zs(e){return e.kind===`viewport`?{}:{point:e.point,nodeIndex:`node`in e?e.node?.index:void 0}}function Bs(e){if(!e.point)throw new n(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function Vs(e,t,r,i,a){if(!e.backend.captureSnapshot)throw new n(`UNSUPPORTED_OPERATION`,`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:o}=e.backend;return await Ci({edge:r,target:i,scope:a,captureNodes:async n=>{let r=await o(z(e,t),{scope:n});return r.snapshot?.nodes??r.nodes??[]}})}function Hs(e,t){switch(e){case`up`:case`down`:case`left`:case`right`:return e;default:throw new n(`INVALID_ARGS`,`${t} must be up, down, left, or right`)}}function Us(e,t){return e===void 0?void 0:Ws(e,t)}function Ws(e,t){if(!Number.isFinite(e)||e<=0)throw new n(`INVALID_ARGS`,`${t} must be a positive number`);return e}function Gs(e,t){if(e!==void 0){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new n(`INVALID_ARGS`,`${t} must be a positive integer`);return e}}const Ks=/^e\d+$/;function qs(e){if(e[0]?.startsWith(`@`)){let t=tc(e.slice(1));return{ref:e[0],...t===void 0?{}:{label:t}}}if(Ks.test(e[0]??``))throw new n(`INVALID_ARGS`,`Did you mean "@${e[0]}"? Snapshot refs need the @ prefix.`);let t=_(e);if(t){if(t.rest.length>0)throw new n(`INVALID_ARGS`,$s(e,t));return{selector:t.selectorExpression}}return Ys(e)}function Js(e){let t=e[0];if(t?.startsWith(`@`)){let n=e.length>=3?e.slice(2).join(` `):e.slice(1).join(` `);return{kind:`ref`,target:{ref:t,label:e.length>=3?tc(e.slice(1,2)):void 0},text:n}}if(Ks.test(t??``))throw new n(`INVALID_ARGS`,`Did you mean "@${t}"? Snapshot refs need the @ prefix.`);let r=_(e,{preferTrailingValue:!0});return r?{kind:`selector`,target:{selector:r.selectorExpression},text:r.rest.join(` `)}:{kind:`point`,target:Ys(e.slice(0,2)),text:e.slice(2).join(` `)}}function Ys(e){let t=e[0]??``,r=ne(t);if(r){let i=Xs(t)?r.value:[r.value,...e.slice(1)].join(` `).trim();throw new n(`INVALID_ARGS`,Zs({key:r.key,value:i}))}let i=Number(e[0]),a=Number(e[1]);if(Number.isFinite(i)&&Number.isFinite(a))return{x:i,y:a};throw new n(`INVALID_ARGS`,Qs(e))}function Xs(e){let t=e.slice(e.indexOf(`=`)+1).trim();if(t.length<2)return!1;let n=t[0];return(n===`"`||n===`'`)&&t.endsWith(n)}function Zs(e){let{key:t,value:n}=e;return`Unknown selector key "${t}". Supported: ${g.join(`, `)}. ${m(t)?`Did you mean role=${t} label=${Q(n)}?`:`Did you mean label=${Q(n)}?`}`}function Qs(e){let t=e.filter(e=>e!==void 0).join(` `);if(!t.trim())return`Missing target. Pass an @ref from snapshot, a selector like text="Sign in", or "x y" coordinates.`;let n=`Target "${t}" is not a @ref, selector, or "x y" point.`;return e.some(e=>ee(e??``))?`${n} Selector values with spaces need quotes, e.g. text="Sign in".`:`${n} To match by visible text, use text=${Q(t)} (or label=/id=/role=), or pass an @ref from snapshot.`}function $s(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${ec(e,t)??`text="Sign in"`}.`}function ec(e,t){let n=e.length-t.rest.length,r=e[n-1];if(r===void 0)return;let i=r.indexOf(`=`);if(i<=0)return;let a=[r.slice(i+1),...t.rest].join(` `),o=`${r.slice(0,i+1)}${Q(a)}`;return[...e.slice(0,n-1),o].join(` `)}function Q(e){return`"${e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}"`}function tc(e){return e.join(` `).trim()||void 0}function nc(e,t={}){let n=I(process.stderr);if(e===`pass`){let e=t.passFormat??`green`;return n?$(`✓`,e):`✓`}return e===`fail`?n?$(`⨯`,`red`):`⨯`:e===`warn`?n?$(`!`,`yellow`):`!`:n?$(`-`,`dim`):`-`}function $(e,t){return L(e,t,{validateStream:!1})}function rc(e){return`${nc(ac(e.status))} ${oc(e)}`}function ic(e){return e.status!==`fail`&&e.status!==`warn`?[]:typeof e.command==`string`?[` run: ${e.command}`]:typeof e.hint==`string`?[` hint: ${e.hint}`]:[]}function ac(e){return e===`pass`?`pass`:e===`fail`?`fail`:e===`warn`?`warn`:`skip`}function oc(e){let t=typeof e.id==`string`&&e.id.length>0?e.id:`check`,n=typeof e.summary==`string`&&e.summary.length>0?e.summary:t;return n===t?t:`${t}: ${n}`}function sc(e,t){let r=e===void 0?NaN:Number(e);if(!Number.isInteger(r)||r<1)throw new n(`INVALID_ARGS`,`viewport ${t} must be a positive integer`);return r}export{B as $,bt as $t,Xa as A,fn as At,na as B,Mt as Bt,Y as C,We as Cn,Yt as Ct,eo as D,ln as Dt,$a as E,Jt as Et,Ua as F,Bt as Ft,Zi as G,kt as Gt,ra as H,Et as Ht,wa as I,Ht as It,G as J,_t as Jt,Xi as K,dt as Kt,Ta as L,Rt as Lt,Ha as M,Gt as Mt,Ja as N,Wt as Nt,Qa as O,cn as Ot,Va as P,Ut as Pt,V as Q,gt as Qt,oa as R,zt as Rt,X as S,Ke as Sn,on as St,J as T,an as Tt,Ji as U,Tt as Ut,ta as V,Lt as Vt,ea as W,At as Wt,U as X,St as Xt,Ki as Y,yt as Yt,Bi as Z,vt as Zt,Vo as _,et as _n,er as _t,Js as a,T as an,L as at,lo as b,Be as bn,nn as bt,Fs as c,st as cn,Hr as ct,Os as d,nt as dn,I as dt,xt as en,z as et,ss as f,tt as fn,N as ft,ts as g,it as gn,sr as gt,ns as h,at as hn,tr as ht,nc as i,w as in,wi as it,Za as j,un as jt,to as k,dn as kt,Is as l,$e as ln,Vr as lt,os as m,rt as mn,ar as mt,ic as n,Ct as nn,Ci as nt,qs as o,Xe as on,ni as ot,cs as p,ot as pn,P as pt,Yi as q,ft as qt,rc as r,ut as rn,Ti as rt,Ps as s,ct as sn,ti as st,sc as t,ht as tn,Ri as tt,ks as u,Qe as un,Br as ut,Fo as v,ze as vn,rn as vt,Mo as w,Ue as wn,sn as wt,ro as x,Ge as xn,Kt as xt,Io as y,Re as yn,qt as yt,K as z,Nt as zt};