agent-device 0.20.6 → 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.
- package/README.md +3 -3
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.6.apk → agent-device-android-ime-helper-0.20.7.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.7.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.6.manifest.json → agent-device-android-ime-helper-0.20.7.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.6.apk → agent-device-android-snapshot-helper-0.20.7.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.7.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.6.manifest.json → agent-device-android-snapshot-helper-0.20.7.manifest.json} +6 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +20 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +67 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +339 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSelectorMatchPolicy.swift +78 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +31 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +29 -7
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CoordinateTextEntryTests.swift +4 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +36 -28
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +7 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SelectorMatchPolicyTests.swift +4 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +2 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +100 -12
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +4 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +57 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +1 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +18 -3
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android.js +1 -1
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-lifecycle.js +7 -7
- package/dist/src/app-lifecycle2.js +2 -0
- package/dist/src/app-log-files.js +1 -0
- package/dist/src/app-log-reconnect.js +1 -0
- package/dist/src/app-log-runtime.js +4 -0
- package/dist/src/app-resolution.js +2 -1
- package/dist/src/apps.js +5 -5
- package/dist/src/audio-probe.js +1 -1
- package/dist/src/auth-session.js +1 -0
- package/dist/src/auth.js +2 -0
- package/dist/src/boot-diagnostics.js +2 -2
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-grammar.js +1 -0
- package/dist/src/cli-help.js +199 -259
- package/dist/src/cli-output.js +1 -0
- package/dist/src/cli-runner.js +1 -2
- package/dist/src/cli.js +6 -16
- package/dist/src/client-metro.js +1 -1
- package/dist/src/cloud-artifacts.d.ts +2 -137
- package/dist/src/command-schema.js +3 -3
- package/dist/src/connection-runtime.js +1 -0
- package/dist/src/connection.js +5 -0
- package/dist/src/context.js +1 -1
- package/dist/src/daemon-shutdown-report.js +1 -0
- package/dist/src/daemon.js +2 -0
- package/dist/src/debug-symbols.js +3 -3
- package/dist/src/device-claim-inspection.js +1 -0
- package/dist/src/device-input-state.js +2 -2
- package/dist/src/device.js +1 -1
- package/dist/src/device2.js +2 -0
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/harmonyos.js +1 -0
- package/dist/src/helper.js +1 -1
- package/dist/src/host-process.js +2 -2
- package/dist/src/ime-lifecycle.js +7 -7
- package/dist/src/index.d.ts +43 -12
- package/dist/src/input-actions.js +4 -4
- package/dist/src/input-actions2.js +1 -1
- package/dist/src/input-actions3.js +1 -0
- package/dist/src/install-artifact.js +1 -5
- package/dist/src/install-artifact2.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-runtime.js +1 -1
- package/dist/src/interaction-snapshot.js +1 -1
- package/dist/src/interaction-touch-reference-frame.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +2 -2
- package/dist/src/interactor2.js +1 -1
- package/dist/src/internal/bin.js +2 -2
- package/dist/src/internal/daemon.js +8 -15
- package/dist/src/inventory.js +5 -0
- package/dist/src/inventory2.js +1 -0
- package/dist/src/inventory3.js +2 -0
- package/dist/src/inventory4.js +1 -0
- package/dist/src/inventory5.js +1 -0
- package/dist/src/inventory6.js +1 -0
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -0
- package/dist/src/limrun.d.ts +10 -125
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/logcat.js +1 -1
- package/dist/src/manifest.js +1 -1
- package/dist/src/owner-identity.js +1 -0
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-runtime-app-log-android-transport.js +1 -0
- package/dist/src/platform-runtime-app-log-process.js +1 -0
- package/dist/src/platform-runtime-host.js +1 -0
- package/dist/src/platform-runtime-network-web-transport.js +1 -0
- package/dist/src/platform-runtime-operation-host.js +5 -0
- package/dist/src/platform-runtime-toolchain-host.js +1 -0
- package/dist/src/platform-runtime.js +1 -0
- package/dist/src/prepare-kind.js +15 -0
- package/dist/src/process-entry.js +1 -0
- package/dist/src/process-lock.js +1 -1
- package/dist/src/provider-webdriver.js +1 -0
- package/dist/src/provider.js +1 -0
- package/dist/src/proxy.js +2 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/registry.js +24 -24
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay.js +3 -0
- package/dist/src/reporting.js +3 -3
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-lease.js +1 -1
- package/dist/src/runtime.js +2 -2
- package/dist/src/runtime2.js +4 -0
- package/dist/src/runtime3.js +3 -0
- package/dist/src/runtime4.js +1 -0
- package/dist/src/runtime5.js +1 -0
- package/dist/src/runtime6.js +1 -0
- package/dist/src/runtime7.js +1 -0
- package/dist/src/screenshot-result.js +4 -4
- package/dist/src/screenshot.js +1 -0
- package/dist/src/sdk-android-adb.js +2 -2
- package/dist/src/sdk-batch-runner.js +3 -3
- package/dist/src/sdk-contracts.d.ts +31 -5
- package/dist/src/sdk-contracts.js +1 -1
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +280 -4
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selector-vocabulary.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +3 -3
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session.js +10 -9
- package/dist/src/shared.js +2 -0
- package/dist/src/shell-quote.js +1 -0
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -0
- package/dist/src/snapshot-session.js +1 -0
- package/dist/src/snapshot.js +1 -1
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/src.js +1 -1
- package/dist/src/src2.js +2 -0
- package/dist/src/src3.js +1 -0
- package/dist/src/text-surface.js +1 -1
- package/dist/src/timing-safe-equal.js +1 -0
- package/dist/src/tool-provider.js +3 -3
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/tool-provider3.js +1 -1
- package/dist/src/update-check.js +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/web.js +1 -1
- package/package.json +36 -20
- package/server.json +2 -2
- package/skills/agent-device/SKILL.md +6 -31
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.6.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.6.apk.sha256 +0 -1
- package/dist/src/app-log-request-scope.js +0 -1
- package/dist/src/devices.js +0 -1
- package/dist/src/devices2.js +0 -1
- package/dist/src/devices3.js +0 -1
- package/dist/src/devices4.js +0 -1
- package/dist/src/provider-limrun-runtime.js +0 -1
- package/dist/src/register-builtins.js +0 -1
- package/dist/src/screenshot-geometry.js +0 -1
- package/dist/src/viewport-dimension.js +0 -15
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-device",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.7",
|
|
4
4
|
"description": "Agent-native CLI for AI app automation across iOS, Android, tvOS, Android TV, macOS, Linux, and web.",
|
|
5
5
|
"mcpName": "io.github.callstack/agent-device",
|
|
6
6
|
"license": "MIT",
|
|
@@ -101,15 +101,15 @@
|
|
|
101
101
|
"build:android-ime-helper": "AGENT_DEVICE_ANDROID_HELPER=ime sh ./scripts/build-android-helper.sh $(node -p \"require('./package.json').version\") .tmp/android-ime-helper",
|
|
102
102
|
"package:android-ime-helper": "AGENT_DEVICE_ANDROID_HELPER=ime sh ./scripts/package-android-helper.sh $(node -p \"require('./package.json').version\") .tmp/android-ime-helper",
|
|
103
103
|
"package:android-ime-helper:npm": "rm -rf android/ime-helper/dist && AGENT_DEVICE_ANDROID_HELPER=ime sh ./scripts/package-android-helper.sh $(node -p \"require('./package.json').version\") android/ime-helper/dist",
|
|
104
|
-
"build:macos-helper": "swift build -c release --package-path apple/macos-helper",
|
|
105
|
-
"build:macos-helper:clean": "swift package --package-path apple/macos-helper clean && pnpm build:macos-helper",
|
|
104
|
+
"build:macos-helper": "node --experimental-strip-types scripts/swift-toolchain-tmpdir.ts swift build -c release --package-path apple/macos-helper",
|
|
105
|
+
"build:macos-helper:clean": "node --experimental-strip-types scripts/swift-toolchain-tmpdir.ts swift package --package-path apple/macos-helper clean && pnpm build:macos-helper",
|
|
106
106
|
"build:package": "pnpm build && pnpm build:xcuitest:ios && pnpm build:xcuitest:macos && pnpm build:xcuitest:tvos && pnpm build:xcuitest:visionos && pnpm build:macos-helper:clean && pnpm package:apple-runner:npm && pnpm build:android",
|
|
107
107
|
"package:npm": "pnpm build:package && pnpm check:package",
|
|
108
108
|
"release:prepare": "rm -rf .tmp/release && pnpm check:mcp-metadata && pnpm build:package && pnpm check:package -- --pack-destination .tmp/release",
|
|
109
109
|
"release:publish": "pnpm release:prepare && npm publish --ignore-scripts .tmp/release/*.tgz",
|
|
110
110
|
"ad": "node bin/agent-device.mjs",
|
|
111
111
|
"bench:help-conformance": "node scripts/help-conformance-bench.mjs",
|
|
112
|
-
"maestro:conformance": "node --experimental-strip-types --test packages/maestro/test/conformance/verify.test.ts packages/maestro/test/conformance/differential/run.test.ts packages/maestro/test/conformance/differential/invariants.test.ts",
|
|
112
|
+
"maestro:conformance": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test packages/maestro/test/conformance/verify.test.ts packages/maestro/test/conformance/differential/run.test.ts packages/maestro/test/conformance/differential/invariants.test.ts",
|
|
113
113
|
"maestro:conformance:regenerate": "node --experimental-strip-types scripts/maestro-conformance/regenerate.mjs",
|
|
114
114
|
"maestro:conformance:differential": "node --experimental-strip-types packages/maestro/test/conformance/differential/run.ts",
|
|
115
115
|
"size": "node scripts/size-report.mjs",
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
"mutation:baseline": "node --experimental-strip-types scripts/mutation/run.ts --update",
|
|
119
119
|
"mutation:check": "node --experimental-strip-types scripts/mutation/run.ts --no-run",
|
|
120
120
|
"mutation:affected": "node --experimental-strip-types scripts/mutation/run.ts --affected",
|
|
121
|
-
"mutation:test": "node --experimental-strip-types --test scripts/mutation/*.test.ts",
|
|
121
|
+
"mutation:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/mutation/*.test.ts",
|
|
122
122
|
"lint": "oxlint . --deny-warnings",
|
|
123
123
|
"format": "node ./node_modules/oxfmt/bin/oxfmt --write",
|
|
124
124
|
"format:check": "node ./node_modules/oxfmt/bin/oxfmt --check",
|
|
@@ -127,19 +127,21 @@
|
|
|
127
127
|
"fallow:baseline": "fallow dead-code --save-baseline fallow-baselines/dead-code.json --summary && fallow health --report-only --save-baseline fallow-baselines/health.json --summary",
|
|
128
128
|
"check:fallow": "fallow audit",
|
|
129
129
|
"check:affected": "node --experimental-strip-types scripts/check-affected/run.ts",
|
|
130
|
-
"check:affected:test": "node --experimental-strip-types --test scripts/check-affected/model.test.ts scripts/check-affected/run.test.ts",
|
|
130
|
+
"check:affected:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/check-affected/model.test.ts scripts/check-affected/platform-packages.test.ts scripts/check-affected/run.test.ts",
|
|
131
131
|
"check:coverage-changed": "node --experimental-strip-types scripts/coverage-changed/run.ts",
|
|
132
|
-
"check:coverage-changed:test": "node --experimental-strip-types --test scripts/coverage-changed/model.test.ts scripts/coverage-changed/run.test.ts",
|
|
133
|
-
"check:layering": "node --experimental-strip-types --test scripts/layering/model.test.ts scripts/layering/zone-policy.test.ts scripts/layering/daemon-modularity.test.ts scripts/layering/package-boundaries.test.ts scripts/layering/facade-exports.test.ts scripts/layering/bin-alias-fast-path.test.ts && node --experimental-strip-types scripts/layering/check.ts",
|
|
132
|
+
"check:coverage-changed:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/coverage-changed/model.test.ts scripts/coverage-changed/run.test.ts",
|
|
133
|
+
"check:layering": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/layering/model.test.ts scripts/layering/zone-policy.test.ts scripts/layering/daemon-modularity.test.ts scripts/layering/package-boundaries.test.ts scripts/layering/platform-package-policy.test.ts scripts/layering/platform-package-repository.test.ts scripts/layering/platform-package-source-policy.test.ts scripts/layering/device-inventory-cutover-policy.test.ts scripts/layering/logs-runtime-cutover-policy.test.ts scripts/layering/network-runtime-cutover-policy.test.ts scripts/layering/contracts-implementation-policy.test.ts scripts/layering/facade-exports.test.ts scripts/layering/bin-alias-fast-path.test.ts && node --experimental-strip-types scripts/layering/check.ts",
|
|
134
134
|
"depgraph": "node --experimental-strip-types scripts/depgraph/build.ts",
|
|
135
|
-
"depgraph:test": "node --experimental-strip-types --test scripts/depgraph/model.test.ts scripts/depgraph/affected.test.ts",
|
|
135
|
+
"depgraph:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/depgraph/model.test.ts scripts/depgraph/affected.test.ts",
|
|
136
136
|
"check:production-exports": "fallow dead-code --config fallow-production-exports.json --production --unused-exports --fail-on-issues",
|
|
137
137
|
"check:bundle-owner-files": "node --experimental-strip-types scripts/check-bundle-owner-files.ts",
|
|
138
138
|
"check:package": "node --experimental-strip-types scripts/check-package.ts",
|
|
139
139
|
"check:command-docs": "vitest run --project unit-core src/__tests__/command-doc-coverage.test.ts",
|
|
140
140
|
"check:replay-compat": "node --experimental-strip-types scripts/check-replay-compat-provenance.ts",
|
|
141
|
+
"check:daemon-wire-compat": "node --experimental-strip-types scripts/wire-compat/run.ts",
|
|
142
|
+
"check:daemon-wire-compat:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/wire-compat/model.test.ts",
|
|
141
143
|
"check:tmpdir-leaks": "node --experimental-strip-types scripts/check-tmpdir-leaks.ts",
|
|
142
|
-
"check:tmpdir-leaks:test": "node --experimental-strip-types --test scripts/check-tmpdir-leaks-model.test.ts scripts/vitest-tmpdir-global-setup.test.ts",
|
|
144
|
+
"check:tmpdir-leaks:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/check-tmpdir-leaks-model.test.ts scripts/vitest-tmpdir-global-setup.test.ts scripts/node-test-tmpdir.test.ts scripts/swift-toolchain-tmpdir.test.ts",
|
|
143
145
|
"check:freerange": "fr",
|
|
144
146
|
"check:quick": "pnpm lint && pnpm typecheck",
|
|
145
147
|
"sync:mcp-metadata": "node scripts/sync-mcp-metadata.mjs",
|
|
@@ -149,7 +151,7 @@
|
|
|
149
151
|
"check:unit": "pnpm check:contention-retry && pnpm test:unit && pnpm check:tmpdir-leaks && pnpm test:smoke",
|
|
150
152
|
"check": "pnpm check:tooling && pnpm check:fallow && pnpm check:unit",
|
|
151
153
|
"prepack": "pnpm check:mcp-metadata && pnpm package:npm",
|
|
152
|
-
"typecheck": "tsc -b packages/xml packages/kernel packages/contracts packages/ad-script packages/selectors packages/ad-replay packages/maestro packages/replay-test packages/provider-webdriver packages/provider-limrun && tsc -p tsconfig.json && tsc -p examples/sdk/tsconfig.json",
|
|
154
|
+
"typecheck": "tsc -b packages/xml packages/kernel packages/contracts packages/capture-kit packages/platform-apple packages/platform-android packages/platform-harmonyos packages/platform-vega packages/platform-linux packages/platform-web packages/ad-script packages/selectors packages/ad-replay packages/maestro packages/replay-test packages/provider-webdriver packages/provider-limrun && tsc -p tsconfig.json && tsc -p examples/sdk/tsconfig.json",
|
|
153
155
|
"test-app:install": "pnpm install --dir examples/test-app",
|
|
154
156
|
"test-app:start": "pnpm --dir examples/test-app start",
|
|
155
157
|
"test-app:ios": "pnpm --dir examples/test-app ios",
|
|
@@ -165,17 +167,17 @@
|
|
|
165
167
|
"test:maestro-compat": "vitest run --project unit-core packages/maestro src/daemon/adapters/maestro src/compat/__tests__/replay-input.test.ts",
|
|
166
168
|
"test:coverage": "vitest run --coverage",
|
|
167
169
|
"test:coverage:ci": "node --experimental-strip-types scripts/lib/contention-retry-run.ts --coverage",
|
|
168
|
-
"check:contention-retry": "node --experimental-strip-types --test scripts/lib/contention-retry-policy.test.ts",
|
|
170
|
+
"check:contention-retry": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/lib/contention-retry-policy.test.ts",
|
|
169
171
|
"test:integration:provider": "vitest run --project provider-integration",
|
|
170
172
|
"test:integration:progress": "node --experimental-strip-types scripts/integration-progress.ts",
|
|
171
173
|
"test:integration:progress:check": "node --experimental-strip-types scripts/integration-progress.ts --check",
|
|
172
|
-
"test:fixture-cache": "node --test test/ci/trusted-fixture-artifact.test.mjs",
|
|
174
|
+
"test:fixture-cache": "node --experimental-strip-types scripts/node-test-tmpdir.ts --test test/ci/trusted-fixture-artifact.test.mjs",
|
|
173
175
|
"test:output-economy": "vitest run --project output-economy",
|
|
174
|
-
"test:smoke:web": "pnpm build && node --test test/integration/smoke-web-platform.test.ts",
|
|
175
|
-
"test:smoke": "node --test test/integration/smoke-*.test.ts",
|
|
176
|
-
"test:integration:node": "node --test test/integration/*.test.ts",
|
|
176
|
+
"test:smoke:web": "pnpm build && node --experimental-strip-types scripts/node-test-tmpdir.ts --test test/integration/smoke-web-platform.test.ts",
|
|
177
|
+
"test:smoke": "node --experimental-strip-types scripts/node-test-tmpdir.ts --test test/integration/smoke-*.test.ts",
|
|
178
|
+
"test:integration:node": "node --experimental-strip-types scripts/node-test-tmpdir.ts --test --experimental-test-isolation=none test/integration/*.test.ts",
|
|
177
179
|
"test:integration": "pnpm test:integration:node && pnpm test:integration:provider",
|
|
178
|
-
"test:concurrency-torture": "node --test test/integration/nightly/concurrency-torture.test.ts",
|
|
180
|
+
"test:concurrency-torture": "node --experimental-strip-types scripts/node-test-tmpdir.ts --test test/integration/nightly/concurrency-torture.test.ts",
|
|
179
181
|
"test:replay:ios": "node --experimental-strip-types src/bin.ts test test/integration/replays/ios/simulator",
|
|
180
182
|
"test:replay:ios-device": "node --experimental-strip-types src/bin.ts test test/integration/replays/ios/device",
|
|
181
183
|
"test:replay:android": "node --experimental-strip-types src/bin.ts test test/integration/replays/android",
|
|
@@ -194,7 +196,8 @@
|
|
|
194
196
|
"!android/ime-helper/dist/*.idsig",
|
|
195
197
|
"!android/ime-helper/README.md",
|
|
196
198
|
"linux/atspi-dump.py",
|
|
197
|
-
"skills",
|
|
199
|
+
"skills/agent-device",
|
|
200
|
+
"skills/dogfood",
|
|
198
201
|
"server.json",
|
|
199
202
|
"smithery.yaml",
|
|
200
203
|
"README.md",
|
|
@@ -245,18 +248,29 @@
|
|
|
245
248
|
],
|
|
246
249
|
"dependencies": {
|
|
247
250
|
"@limrun/api": "^0.24.5",
|
|
248
|
-
"
|
|
251
|
+
"ipaddr.js": "^2.5.0",
|
|
252
|
+
"tar-stream": "^3.2.0",
|
|
253
|
+
"undici": "7.29.0",
|
|
254
|
+
"yaml": "^2.9.0",
|
|
255
|
+
"yauzl": "^3.4.0"
|
|
249
256
|
},
|
|
250
257
|
"devDependencies": {
|
|
258
|
+
"@agent-device/capture-kit": "workspace:*",
|
|
251
259
|
"@agent-device/ad-replay": "workspace:*",
|
|
252
260
|
"@agent-device/ad-script": "workspace:*",
|
|
253
261
|
"@agent-device/contracts": "workspace:*",
|
|
254
262
|
"@agent-device/kernel": "workspace:*",
|
|
255
|
-
"@agent-device/selectors": "workspace:*",
|
|
256
263
|
"@agent-device/maestro": "workspace:*",
|
|
264
|
+
"@agent-device/platform-android": "workspace:*",
|
|
265
|
+
"@agent-device/platform-apple": "workspace:*",
|
|
266
|
+
"@agent-device/platform-harmonyos": "workspace:*",
|
|
267
|
+
"@agent-device/platform-linux": "workspace:*",
|
|
268
|
+
"@agent-device/platform-vega": "workspace:*",
|
|
269
|
+
"@agent-device/platform-web": "workspace:*",
|
|
257
270
|
"@agent-device/provider-limrun": "workspace:*",
|
|
258
271
|
"@agent-device/provider-webdriver": "workspace:*",
|
|
259
272
|
"@agent-device/replay-test": "workspace:*",
|
|
273
|
+
"@agent-device/selectors": "workspace:*",
|
|
260
274
|
"@agent-device/xml": "workspace:*",
|
|
261
275
|
"@arethetypeswrong/cli": "^0.18.5",
|
|
262
276
|
"@chenglou/freerange": "^0.0.1",
|
|
@@ -264,6 +278,8 @@
|
|
|
264
278
|
"@stryker-mutator/vitest-runner": "9.6.1",
|
|
265
279
|
"@types/node": "^22.19.21",
|
|
266
280
|
"@types/pngjs": "^6.0.5",
|
|
281
|
+
"@types/tar-stream": "^3.1.4",
|
|
282
|
+
"@types/yauzl": "^2.10.3",
|
|
267
283
|
"@vitest/coverage-v8": "4.1.8",
|
|
268
284
|
"fallow": "^2.95.0",
|
|
269
285
|
"fast-check": "^4.9.0",
|
package/server.json
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"url": "https://github.com/callstack/agent-device",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "0.20.
|
|
10
|
+
"version": "0.20.7",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "agent-device",
|
|
15
|
-
"version": "0.20.
|
|
15
|
+
"version": "0.20.7",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
}
|
|
@@ -5,41 +5,16 @@ description: Automates Apple-platform apps (iOS, tvOS, macOS), Android devices,
|
|
|
5
5
|
|
|
6
6
|
# agent-device
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
For a normal app-driving task, start immediately. Do not probe first with `--help`, `--version`, `devices`, `appstate`, `snapshot`, or `screenshot`:
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
|
-
agent-device --
|
|
11
|
+
agent-device open <app> --foreground
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
That starts the session and returns the initial interactive snapshot with `@refs`.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Loop: act with `press|click|fill|longpress <target> ... --settle`, `scroll <direction> --settle`, or `back --settle`; continue from the printed diff, verify the named expectation (`wait text "..."`, `is`, `get`, or `find`), then run `agent-device close`.
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Copy refs byte-for-byte: `@e12`, `@e12~s4` — keep the `@` and any `~sN`. Prefer current refs, then `id`/`label`/`role` selectors; coordinates are a last resort. If snapshot reports sparse/AX-unavailable, its refs and selectors are invalid: run `agent-device screenshot`, inspect the image, use coordinates, then retry `snapshot -i` after navigating. Otherwise run `snapshot -i` only when the diff lacks the next target.
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
agent-device help manual-qa # scripted/manual QA, acceptance checks, checklist execution
|
|
22
|
-
agent-device help validate # code/runtime validation, stale build or daemon risk
|
|
23
|
-
agent-device help dogfood # exploratory app dogfooding and evidence collection
|
|
24
|
-
agent-device help workflow # fallback reference for general app driving or mixed tasks
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
Read additional topics only when relevant:
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
agent-device help debugging
|
|
31
|
-
agent-device help react-native
|
|
32
|
-
agent-device help react-devtools
|
|
33
|
-
agent-device help cdp
|
|
34
|
-
agent-device help remote
|
|
35
|
-
agent-device help macos
|
|
36
|
-
agent-device help dogfood
|
|
37
|
-
agent-device help tv
|
|
38
|
-
agent-device help ios-system-ui # iOS SpringBoard, widgets, and system-UI surfaces
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
Default loop: `open -> snapshot/-i -> get/is/find or press/fill/scroll/wait -> verify -> close`. When target-specific help says capture or selectors are unsupported, use its control-only loop and the device display as visual truth.
|
|
42
|
-
|
|
43
|
-
Use this skill only to route into version-matched CLI help. Let the selected help topic provide exact command shapes, platform limits, and current workflow guidance; use `help workflow` as the full reference when a task-specific topic is too narrow.
|
|
44
|
-
|
|
45
|
-
For precise location workflows, read the installed `settings` help before planning so coordinate support and platform limits come from the active CLI version.
|
|
20
|
+
Error output includes corrective hints; follow them instead of re-planning. Only when the task is specialized (for example gestures, scripting, TV, macOS, remote, or debugging) or a command shape is unclear, run `agent-device help <topic>`. `agent-device --help` lists topics, but is not a startup step.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
7f719c5e1698e827948a9de22bf31aab065d7f2cb7d17731793b586fd3f88f4f agent-device-android-ime-helper-0.20.6.apk
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
696f8e518bbc2ad66225cb80f2e9e70d2b19b75d382918edd8fce3009200e434 agent-device-android-snapshot-helper-0.20.6.apk
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{it as e}from"./internal/daemon.js";export{e as withAppLogProvider};
|
package/dist/src/devices.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import e from"node:os";function t(){return{platform:`apple`,id:`host-macos-local`,name:e.hostname(),kind:`device`,target:`desktop`,appleOs:`macos`,booted:!0}}async function n(){return[t()]}export{t as buildHostMacDevice,n as listMacosDevices};
|
package/dist/src/devices2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{b as t,s as n}from"./sdk-device.js";import{o as r}from"./boot-diagnostics.js";import{a as i,r as a}from"./tool-provider.js";import{I as o}from"./physical-device-control.js";import{r as s}from"./simulator.js";import{buildHostMacDevice as c}from"./devices.js";import l from"node:path";import{promises as u}from"node:fs";import d from"node:os";const f=/^(iphone|ipad|ipod|appletv|realitydevice)/i,p=/ipad/i,m=/\b(apple vision|vision pro|xros|visionos|realitydevice)\b/i,h=/\b(iphone|ipad|ipod)\b/i,g=/^appletv/i,_=[`apple tv`,`appletv`,`tvos`],v=/^==\s*(.+?)\s*==$/,y=/^(?<name>.+?)\s+(?:\[(?<idBracket>[^[\]]+)\]|\((?<osVersion>[^)]+)\)\s+\((?<idParen>[^)]+)\))\s*$/;function b(e){return(e??``).trim().toLowerCase()}function x(e){return b(e)}function S(e){return b(e.hardwareProperties?.platform)}function C(e){return e.includes(`tvos`)}function w(e){return e.includes(`xros`)||e.includes(`visionos`)}function T(e){return C(x(e))?`tv`:`mobile`}function E(e){let t=x(e);return t.includes(`ios`)||t.includes(`tvos`)||t.includes(`xros`)||t.includes(`visionos`)}function D(e){let t=b(e);return _.some(e=>t.includes(e))}function O(e){return h.test(e.trim())}function k(e){return D(e)?`tv`:O(e)||m.test(e)?`mobile`:null}function A(e,t){return e===`tv`?`tvos`:t.some(e=>m.test(e))?`visionos`:t.some(e=>p.test(e))?`ipados`:`ios`}function j(e){return f.test(e.trim())}function M(e){return g.test(e.trim())}function N(e){return[e.name??``,e.deviceProperties?.name??``,e.deviceProperties?.deviceType??``]}function P(e){return e.hardwareProperties?.productType??e.deviceProperties?.productType??``}function F(e){return C(S(e))||M(P(e))||N(e).some(D)?`tv`:`mobile`}function I(e){let t=S(e);return t.includes(`ios`)||t.includes(`tvos`)||w(t)||j(P(e))?!0:N(e).some(D)}async function L(e={}){let n=r(e.simulatorSetPath),a=e.target,s;try{s=await i(o([`list`,`devices`,`-j`],{simulatorSetPath:n}))}catch{return null}let c;try{c=JSON.parse(s.stdout)}catch{return null}return t(R(c,n)).find(e=>!a||e.target===a)??null}function R(e,t){let n=[];for(let[r,i]of Object.entries(e.devices))if(E(r))for(let e of i){if(!e.isAvailable)continue;let i=T(r),a={platform:`apple`,id:e.udid,name:e.name,kind:`simulator`,target:i,appleOs:A(i,[e.deviceTypeIdentifier??``,e.name]),booted:e.state===`Booted`,...t?{simulatorSetPath:t}:{}};a.booted&&s(a),n.push(a)}return n}function z(e){let t=[];for(let n of e.result?.devices??[]){if(!I(n))continue;let e=n.hardwareProperties?.udid??n.identifier??``,r=n.name??n.deviceProperties?.name??e;if(!e)continue;let i=F(n);t.push({platform:`apple`,id:e,name:r,kind:`device`,target:i,appleOs:A(i,[P(n),...N(n)]),iosPhysicalDeviceBackend:`coredevice`,booted:!0})}return t}function B(e){let t=y.exec(e);if(!t?.groups)return null;let n=t.groups.name?.trim()??``,r=t.groups.idBracket?.trim()??t.groups.idParen?.trim()??``,i=t.groups.osVersion?.trim();return!n||!r?null:{name:n,id:r,osVersion:i}}function V(e,t,n){let r=k(e);return r?{platform:`apple`,id:t,name:e,kind:`device`,target:r,appleOs:A(r,n?[e,n]:[e]),iosPhysicalDeviceBackend:`xctest`,booted:!0}:null}function H(e){let t=[],n=null;for(let r of e.split(/\r?\n/)){let e=r.trim();if(!e)continue;let i=v.exec(e);if(i){n=i[1]?.trim()??null;continue}if(n!==`Devices`)continue;let a=B(e);if(!a)continue;let o=V(a.name,a.id,a.osVersion);o&&t.push(o)}return t}function U(e,t){let n=new Set(e.map(e=>e.id)),r=[...e];for(let e of t)n.has(e.id)||(n.add(e.id),r.push(e));return r}async function W(){let e=null;try{if(e=l.join(d.tmpdir(),`agent-device-devicectl-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),(await i([`devicectl`,`list`,`devices`,`--json-output`,e],{allowFailure:!0,timeoutMs:8e3})).exitCode!==0)return[];let t=await u.readFile(e,`utf8`);return z(JSON.parse(t))}catch{return[]}finally{e&&await u.rm(e,{force:!0}).catch(()=>{})}}async function G(){try{let e=await i([`xctrace`,`list`,`devices`],{allowFailure:!0});return e.exitCode===0?H(e.stdout):[]}catch{return[]}}async function K(s={}){if(process.platform!==`darwin`)throw new e(`UNSUPPORTED_PLATFORM`,`Apple tools are only available on macOS`);if(!await a().whichCommand(`xcrun`))throw new e(`TOOL_MISSING`,`xcrun not found in PATH`);let l=r(s.simulatorSetPath),u=await i(o([`list`,`devices`,`-j`],{simulatorSetPath:l})),d=[];try{d=R(JSON.parse(u.stdout),l)}catch(t){throw new e(`COMMAND_FAILED`,`Failed to parse simctl devices JSON`,void 0,t)}if(d.push(c()),s.udid&&d.some(e=>n(e)&&e.id===s.udid))return d;if(l)return t(d);let[f,p]=await Promise.all([W(),G()]);return d=U(d,f),t(U(d,p))}export{L as findBootableIosSimulator,K as listAppleDevices};
|
package/dist/src/devices3.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{hostname as e}from"node:os";async function t(){return process.platform===`linux`?[{platform:`linux`,id:`local`,name:e(),kind:`device`,target:`desktop`,booted:!0}]:[]}export{t as listLinuxDevices};
|
package/dist/src/devices4.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{h as t}from"./sdk-android-adb.js";import{t as n}from"./tool-provider3.js";const r=`VirtualDevice`;async function i(){let r=n();if(!await r.isAvailable())throw new e(`TOOL_MISSING`,`Vega CLI not found in PATH`,{hint:`Install Vega Developer Tools, source ~/vega/env, and retry devices.`});let i=t(await r.listDevices({allowFailure:!0,timeoutMs:1e4}),`Failed to list Vega devices`),o=a(i.stdout),c=s(i.stdout);if(o.length===0&&c.length>0)throw new e(`DEVICE_NOT_FOUND`,`Vega CLI found devices, but no supported Vega Virtual Device is running.`,{listedSerials:c,hint:`Start the Vega Virtual Device, then retry with --platform vega --target tv.`});return o}function a(e){return s(e).some(o)?[{platform:`vega`,id:r,name:`Vega Virtual Device (${r})`,kind:`emulator`,target:`tv`,booted:!0}]:[]}function o(e){return e.toLowerCase()===`virtualdevice`}function s(e){let t=new Set;for(let n of e.split(/\r?\n/)){let e=/^\s*([^\s:]+)\s*:\s*\S/.exec(n)?.[1]?.trim();e&&t.add(e)}return[...t]}export{i as listVegaDevices,a as parseVegaDeviceList};
|
|
@@ -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{c as t,f as n,o as r,y as i}from"./sdk-device.js";import{Kt as a}from"./viewport-dimension.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 r(e.platform)?_[i(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`&&i(e)===`ios`||w(e),E=e=>e.platform===`android`?e.target===`tv`:n(e),D={[a.boot]:y,[a.apps]:b,[a.install]:x,[a.reinstall]:x,[a.installFromSource]:x,[a.logs]:b,[a.perf]:b,[a.record]:b,[a.push]:y,[a.home]:y,[a.appSwitcher]:y,[a.clipboard]:e=>e.platform===`android`||e.platform===`linux`||w(e),[a.keyboard]:S,[a.orientation]:C,[a.tvRemote]:E,[a.alert]:T,[a.settings]:e=>e.platform===`android`||w(e),[a.audio]:c},O={[a.apps]:k,[a.install]:k,[a.reinstall]:k,[a.installFromSource]:k,[a.logs]:k,[a.perf]:k,[a.record]:k,[a.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,[a.tvRemote]:e=>e.platform===`android`?e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`:v(e)?n(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=>t(e)?`macos`:e.kind===`device`?`ios-device`:`ios-simulator`},perf:{supportsMetrics:()=>!0,metricsSamplerTag:()=>`apple`},recording:{resolveBackendTag:e=>t(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=[a.open,a.close,a.back,a.home,a.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:{[a.audio]:c,[a.tvRemote]:e=>e.target===`tv`},unsupportedHintByDefault:{[a.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{Gt as t,Jt as n,Kt as r,Qt as i,Tn as a,Xt as o,Zt as s,dt as c,rn as l,sn as u}from"./sdk-batch-runner.js";const d={min:.01,max:1},f={flagKey:`screenshotMaxSize`,cliToken:`--max-size`,envVar:`AGENT_DEVICE_SCREENSHOT_MAX_SIZE`,publicOptionKey:`maxSize`,migration:{screenshot:`screenshot --max-size was removed; use --scale <0.01-1> (or AGENT_DEVICE_SCREENSHOT_SCALE) to downscale proportionally`,record:`record --max-size was removed; recordings capture at native resolution`}};function ee(e,t){return t&&Object.hasOwn(t,f.flagKey)?f.migration[e]:void 0}function te(t,n){if(Object.hasOwn(n,f.publicOptionKey)||Object.hasOwn(n,f.flagKey))throw new e(`INVALID_ARGS`,f.migration[t])}const ne=[`out`,`overlayRefs`,`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotScale`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],re=[`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotScale`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],ie=[{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:`screenshotScale`,names:[`--scale`],type:`number`,min:d.min,max:d.max,usageLabel:`--scale <0.01-1>`,usageDescription:`Screenshot: resize both dimensions by this factor (or use AGENT_DEVICE_SCREENSHOT_SCALE)`},{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`}],ae=[{tokens:[`--fullscreen`,`--full`,`-f`],key:`screenshotFullscreen`},{tokens:[`--no-stabilize`],key:`screenshotNoStabilize`},{tokens:[`--normalize-status-bar`],key:`screenshotNormalizeStatusBar`}],oe=[{token:`--pixel-density`,key:`screenshotPixelDensity`,label:`screenshot --pixel-density`}],se=[{token:`--scale`,key:`screenshotScale`,label:`screenshot --scale`,min:d.min,max:d.max}];function ce(e){return p({overlayRefs:e?.overlayRefs,pixelDensity:e?.screenshotPixelDensity,fullscreen:e?.screenshotFullscreen,scale:e?.screenshotScale,stabilize:e?.screenshotNoStabilize?!1:void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function le(e={}){return p({overlayRefs:e.overlayRefs,screenshotPixelDensity:e.screenshotPixelDensity??e.pixelDensity,screenshotFullscreen:e.screenshotFullscreen??e.fullscreen,screenshotScale:e.screenshotScale,screenshotNoStabilize:e.screenshotNoStabilize??(e.stabilize===!1?!0:void 0),screenshotNormalizeStatusBar:e.screenshotNormalizeStatusBar??e.normalizeStatusBar})}function ue(e={}){return le({...e,screenshotScale:e.screenshotScale??e.scale})}function de(t){let{min:n,max:r}=d;if(t.scale!==void 0&&(!Number.isFinite(t.scale)||t.scale<n||t.scale>r))throw new e(`INVALID_ARGS`,`screenshot scale must be between ${n} and ${r}`)}function fe(e,t){typeof t?.screenshotPixelDensity==`number`&&e.push(`--pixel-density`,String(t.screenshotPixelDensity)),t?.screenshotFullscreen&&e.push(`--fullscreen`),typeof t?.screenshotScale==`number`&&e.push(`--scale`,String(t.screenshotScale)),t?.screenshotNoStabilize&&e.push(`--no-stabilize`),t?.screenshotNormalizeStatusBar&&e.push(`--normalize-status-bar`)}function pe(t){let{args:n,flags:r,index:i}=t,a=n[i];if(a===f.cliToken)throw new e(`INVALID_ARGS`,f.migration.screenshot);return me(a,r,i)??he({args:n,index:i,flags:r,token:a})??ge({args:n,index:i,flags:r,token:a})??{handled:!1}}function p(e){return Object.fromEntries(Object.entries(e).filter(e=>e[1]!==void 0))}function me(e,t,n){let r=ae.find(t=>t.tokens.some(t=>t===e));if(r)return t[r.key]=!0,{handled:!0,nextIndex:n}}function he(t){let n=oe.find(e=>e.token===t.token);if(!n)return;let r=Number(t.args[t.index+1]);if(!Number.isInteger(r)||r<1)throw new e(`INVALID_ARGS`,`${n.label} requires a positive integer`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function ge(t){let n=se.find(e=>e.token===t.token);if(!n)return;let r=Number(t.args[t.index+1]);if(!Number.isFinite(r)||r<n.min||r>n.max)throw new e(`INVALID_ARGS`,`${n.label} requires a number from ${n.min} to ${n.max}`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function _e(e){let t=ye(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 m(e){return{...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.quality?{snapshotQuality:e.quality}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function ve(e){let t=be(e.androidSnapshot),n=Array.isArray(e.warnings)?e.warnings.filter(e=>typeof e==`string`):void 0,r=ye(e.snapshotQuality);return m({...t?{androidSnapshot:t}:{},...r?{quality:r}:{},...n?{warnings:n}:{}})}function ye(e){if(!e||typeof e!=`object`)return;let t=e;return typeof t.state==`string`&&typeof t.backend==`string`?t:void 0}function be(e){return typeof e==`object`&&e?e:void 0}const h=1500;function xe(e,t){e&&(e.snapshotDiagnostics??={samples:[]}).samples.push({...t,durationMs:Math.max(0,Math.round(t.durationMs))})}function Se(e){let t=e?.snapshotDiagnostics?.samples;if(!(!t||t.length===0))return Ce(t)}function Ce(e){if(e.length===0)return;let t=e.slice(1),n=t.length>=3?g(t):void 0,r=t.filter(e=>e.durationMs>=h).length,i=n!==void 0&&n.p95Ms>=h&&r>=2;return{stats:g(e),...i&&n?{warning:ke(n)}:{}}}function we(e){let t=e.filter(e=>e!==void 0),n=t.flatMap(e=>Fe(e.stats));if(n.length===0)return;let r=g(n),i=t.filter(e=>e.warning);return{stats:r,...i.length>0?{warning:Ae({warnedCount:i.length,totalCount:t.length,worst:i.reduce((e,t)=>Math.max(e,t.stats.p95Ms),0),platform:r.platform})}:{}}}function Te(e){if(!a(e))return;let t=je(e.stats);if(!t)return;let n=typeof e.warning==`string`?e.warning:void 0;return{stats:t,...n?{warning:n}:{}}}function g(e){let t=e.map(e=>e.durationMs).sort((e,t)=>e-t);return{count:t.length,p50Ms:Ee(t,50),p95Ms:Ee(t,95),maxMs:t[t.length-1]??0,slowThresholdMs:h,...De(e),...Oe(e)}}function Ee(e,t){if(e.length===0)return 0;let n=Math.max(0,Math.ceil(t/100*e.length)-1);return e[Math.min(n,e.length-1)]??0}function De(e){let t=e.map(e=>e.platform).filter(e=>!!e);return new Set(t).size===1?{platform:t[0]}:{}}function Oe(e){let t={};for(let n of e)n.backend&&(t[n.backend]=(t[n.backend]??0)+1);return Object.keys(t).length>0?{backends:t}:{}}function ke(e){return`Warning: ${e.platform?`${e.platform} `:``}snapshots are slow in this run: p95 ${e.p95Ms}ms over ${e.count} captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}function Ae(e){return`Warning: ${e.platform?`${e.platform} `:``}snapshots were slow in ${e.warnedCount} of ${e.totalCount} runs (worst run p95 ${e.worst}ms). Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}function je(e){if(!a(e))return;let t=Me(e);if(t)return{...t,...Pe(e)}}function Me(e){let t={count:e.count,p50Ms:e.p50Ms,p95Ms:e.p95Ms,maxMs:e.maxMs,slowThresholdMs:e.slowThresholdMs};if(!Object.values(t).some(e=>typeof e!=`number`))return t}function Ne(e){let t=Object.entries(e).filter(e=>typeof e[1]==`number`);return t.length>0?Object.fromEntries(t):void 0}function Pe(e){let t=typeof e.platform==`string`?e.platform:void 0,n=a(e.backends)?Ne(e.backends):void 0;return{...t?{platform:t}:{},...n?{backends:n}:{}}}function Fe(e){if(!e||e.count<=0)return[];let t=e.platform;return e.count===1?[{durationMs:e.maxMs,platform:t}]:e.count===2?[{durationMs:e.p50Ms,platform:t},{durationMs:e.maxMs,platform:t}]:[...Array.from({length:e.count-3},()=>({durationMs:e.p50Ms,platform:t})),{durationMs:e.p50Ms,platform:t},{durationMs:e.p95Ms,platform:t},{durationMs:e.maxMs,platform:t}]}const Ie=1e4,Le=2e3,Re=[`get`,`accept`,`dismiss`,`wait`],ze=[`in-app`,`system`],Be=[`primary`,`secondary`,`middle`];function Ve(e){return e?.clickButton??`primary`}function He(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 Ue(e){return e===`primary`?{}:{button:e}}function We(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 Ge=[`up`,`down`,`left`,`right`,`top`,`bottom`],_=[`up`,`down`,`left`,`right`],Ke=[`left`,`right`,`left-edge`,`right-edge`],qe=[`one-way`,`ping-pong`],Je=1e4,Ye=6e4,Xe=We(_,{message:e=>`Unknown direction: ${e}`});function Ze(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=x(e.amount),i=e.pixels===void 0?Math.round(n*r):S(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 Qe(e){x(e.amount),e.pixels!==void 0&&S(e.pixels)}function $e(e,t){if(e===`left`||e===`right`){let n=tt(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=y(v(t,n,50),t,8),a=y(v(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 et(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 tt(e,t){let n=e===`left`||e===`up`,r=n?85:15,i=n?15:85,a=e===`up`||e===`down`,o=y(v(t,a?50:r,a?r:50),t,8),s=y(v(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 nt(e){let t=it(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function v(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 y(e,t,n){return{x:at(e.x,n,t.referenceWidth),y:at(e.y,n,t.referenceHeight)}}function rt(e){return Xe.parse(e)}function it(e){let t=e.filter(e=>o(e)&&b(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(b);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 b(e){return!!e&&e.width>0&&e.height>0}function x(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 S(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 at(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 C=1e4,ot=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`,`drag`];function w(t){let n=E(t),r=k(n,`kind`,ot);if(r===`pan`)return{kind:r,origin:D(n,`origin`),delta:D(n,`delta`),pointerCount:c(n,`pointerCount`,{min:1,max:2}),durationMs:T(n)};if(r===`drag`)return st(n);if(n.pointerCount!==void 0)throw new e(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(r===`fling`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:r,direction:k(n,`direction`,_),origin:D(n,`origin`),distance:c(n,`distance`,{min:0})}}if(r===`swipe`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:r,preset:k(n,`preset`,Ke)}}if(r===`pinch`)return{kind:r,scale:O(n,`scale`),origin:ct(n,`origin`)};if(r===`rotate`){if(n.velocity!==void 0)throw new e(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:r,degrees:O(n,`degrees`),origin:ct(n,`origin`)}}return{kind:r,origin:D(n,`origin`),delta:D(n,`delta`),scale:O(n,`scale`),degrees:O(n,`degrees`),durationMs:T(n)}}function st(t){let n=c(t,`sourceHoldMs`,{min:1,max:1e4}),r=c(t,`moveMs`,{min:16,max:1e4}),i=c(t,`destinationHoldMs`,{min:0,max:1e4});if((n??800)+(r??500)+(i??0)>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${C}`);return{kind:`drag`,source:lt(t,`source`),destination:lt(t,`destination`),sourceHoldMs:n,moveMs:r,destinationHoldMs:i}}function T(t){let n=c(t,`durationMs`);if(n!==void 0){if(n<16||n>1e4)throw new e(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${C}.`);return n}}function E(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`gesture requires structured object input`);return t}function D(e,t){let n=E(e[t]);return{x:O(n,`x`),y:O(n,`y`)}}function ct(e,t){return e[t]===void 0?void 0:D(e,t)}function O(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 lt(t,n){let r=t[n];if(typeof r!=`string`||r.trim().length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r.trim()}function k(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 ut={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:dt}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`},"gesture drag":{max:5,usage:`gesture drag accepts at most 5 arguments: source destination [sourceHoldMs] [moveMs] [destinationHoldMs]`}};function dt(e,t){let[n,r,i,a,o]=e,s=ft(n,i),c=ft(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 ft(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function A(e,t){let n=ut[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!pt(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 pt(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function mt(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 ht(e,t,n){let r=gt(e,t);return r?j(r,n):void 0}function gt(e,t){if(e===`swipe`)return A(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(ut,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 P(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{M(`gesture pan`,r);let{origin:e,delta:i}=N(r);return w({kind:n,origin:e,delta:i,pointerCount:t,durationMs:F(r[4])})}case`fling`:return M(`gesture fling`,r),w({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:F(r[3])});case`swipe`:return M(`gesture swipe`,r),w({kind:n,preset:r[0]});case`pinch`:return M(`gesture pinch`,r),w({kind:n,scale:Number(r[0]),origin:I(r[1],r[2])});case`rotate`:return M(`gesture rotate`,r),w({kind:n,degrees:Number(r[0]),origin:I(r[1],r[2])});case`transform`:{M(`gesture transform`,r);let{origin:e,delta:t}=N(r);return w({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:F(r[6])})}case`drag`:return M(`gesture drag`,r),w({kind:n,source:r[0],destination:r[1],sourceHoldMs:F(r[2]),moveMs:F(r[3]),destinationHoldMs:F(r[4])});default:return w({kind:n})}}function _t(e){if(e[0]!==`drag`)return;let t=P(e);return t.kind===`drag`?t:void 0}function vt(e){switch(e.kind){case`pan`:return L([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return L([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return L([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?L([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return L([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs]);case`drag`:return[e.kind,e.source,e.destination,String(e.sourceHoldMs??800),String(e.moveMs??500),String(e.destinationHoldMs??0)]}}function yt(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 bt(t){switch(t.kind){case`pan`:return{gesture:{intent:`pan`,origin:t.origin,delta:t.delta,pointerCount:t.pointerCount,durationMs:t.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:t.direction,origin:t.origin,distance:t.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:t.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:t.origin,scale:t.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:t.origin,degrees:t.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:t.origin,delta:t.delta,scale:t.scale,degrees:t.degrees,durationMs:t.durationMs}};case`drag`:throw new e(`INVALID_ARGS`,`gesture drag targets must be resolved before coordinate normalization`)}}function xt(e){return e.kind===`drag`?{intent:`drag`,source:e.source,destination:e.destination,sourceHoldMs:e.sourceHoldMs,moveMs:e.moveMs,destinationHoldMs:e.destinationHoldMs}:bt(e).gesture}function St(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function F(e){return e===void 0?void 0:Number(e)}function I(t,n){if(t===void 0!=(n===void 0))throw new e(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return t===void 0?void 0:{x:Number(t),y:Number(n)}}function L(e){return e.filter(e=>e!==void 0).map(String)}const R={pinchAxisDegrees:-90,samplingProfile:`default`},Ct={ios:R,macos:R,android:{pinchAxisDegrees:0,samplingProfile:`android`},vega:R,linux:R,web:R};function wt(e,t,n){let r=Pt(t),i=Ht(n);switch(e.intent){case`fling`:return Ot(e,r);case`pan`:return kt(e,r,i);case`pinch`:return B({intent:`pinch`,origin:e.origin??zt(r),delta:{x:0,y:0},scale:Lt(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=K(e.degrees,`gesture rotate degrees`);return B({intent:`rotate`,origin:e.origin??zt(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 B({intent:`transform`,origin:e.origin,delta:e.delta,scale:Lt(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:U(e.durationMs,W(t),`gesture transform durationMs`)},r,i)}}}function Tt(e){let[{samples:t}]=e.pointers,n=t[0],r=t.at(-1);return{start:n.point,end:r.point}}function Et(t,n){let r=Pt(n),i=Ft(t.sourceHoldMs,800,`gesture drag sourceHoldMs`),a=U(t.moveMs,500,`gesture drag moveMs`),o=It(t.destinationHoldMs,0,`gesture drag destinationHoldMs`);if(i+a+o>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${C}`);return Dt(z(`pan`,t.from,t.to,a,r,`timed-pan`),i,o)}function Dt(e,t,n){let r=e.pointers[0],[i,a]=r.samples,o=t+e.durationMs+n,s=[{offsetMs:0,point:i.point},{...i,offsetMs:i.offsetMs+t},{...a,offsetMs:a.offsetMs+t},...n>0?[{offsetMs:o,point:a.point}]:[]];return{...e,durationMs:o,pointers:[{...r,samples:s}]}}function Ot(e,t){if(`preset`in e){let{from:n,to:r}=Vt(e.preset,t);return z(`fling`,n,r,100,t,`endpoint-hold`)}if(`from`in e)return z(`fling`,e.from,e.to,100,t,`endpoint-hold`);let n=G(e.origin,`gesture fling origin`),r=Rt(e.distance??180,`gesture fling distance`);return z(`fling`,n,q(n,et(e.direction,r)),100,t,`endpoint-hold`)}function kt(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 z(`pan`,e,q(e,G(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return B({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function z(e,t,n,r,i,a){let o=G(t,`gesture ${e} start`),s=G(n,`gesture ${e} end`),c=[{offsetMs:0,point:o},{offsetMs:r,point:s}];return H(c,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:c}]}}function B(e,t,n){let r=G(e.origin,`gesture ${e.intent} origin`),i=q(r,G(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*Mt(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw Nt({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=V(e.durationMs,n.samplingProfile),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:At({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return H(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function At(e){let t=e.offsetMs/e.durationMs,n=Bt(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=Ut(jt(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 jt(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function Mt(e){return e===`pinch`?.4:.25}function V(t,n){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`gesture sample duration must be a positive finite number`);let r=t/16,i=Math.max(3,n===`android`?Math.round(r):Math.floor(r));return Array.from({length:i+1},(e,n)=>Math.round(t*n/i))}function H(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw Nt({...r,viewport:n,sample:o})}}function Nt(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 Pt(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 ${C}`);return i}function Ft(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<1||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 1 and ${C}`);return i}function It(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<0||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 0 and ${C}`);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 Lt(t,n){let r=K(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function Rt(t,n){let r=K(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function zt(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 Bt(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function Vt(e,t){let n=$e(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 Ht(e){return e===void 0?R:Ct[e]}function Ut(e){return e*Math.PI/180}const Wt={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`}};({...Wt}),{...Wt};const Gt=`tapped via non-hittable coordinate fallback`,Kt=[`xctest-element`,`synthesized-first-responder`,`synthesized-first-responder-replacement`,`xctest-application-fallback`],qt=1e4;function Jt(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 Yt(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 Xt(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}const Zt={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),Qt=`<${Y.join(`|`)}>`;function $t(t){let n=t?.toLowerCase();if(en(n))return n;let r=n?on.get(n):void 0;if(r)return r;throw new e(`INVALID_ARGS`,`tv-remote button must be one of: ${Y.join(`, `)}.`)}function en(e){return typeof e==`string`&&Y.includes(e)}function tn(e){return J[e].appleRemoteButton}function nn(e){return J[e].androidKeyevent}function rn(e){return J[e].vegaKey}function an(e){return Zt[e]}const on=new Map(Y.flatMap(e=>J[e].aliases.map(t=>[t,e]))),sn={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,targetAbsent:`wait_target_absent`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},cn=[`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`],ln=`<wifi|airplane|location> <on|off>`,un=`location set <lat> <lon>`,dn=`animations <on|off>`,X=`appearance <light|dark|toggle>`,fn=`faceid <match|nonmatch|enroll|unenroll>`,pn=`touchid <match|nonmatch|enroll|unenroll>`,mn=`fingerprint <match|nonmatch>`,hn=`clear-app-state [app-id]`,gn=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,Z=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,_n=`macOS supports only settings ${X} and settings ${Z}. wifi|airplane|location|animations remain unsupported on macOS.`,vn=[`settings ${ln}`,`settings ${un}`,`settings ${dn}`,`settings ${X}`,`settings ${fn}`,`settings ${pn}`,`settings ${mn}`,`settings ${hn}`,`settings ${gn}`,`settings ${Z}`].join(` | `),yn=`settings requires ${ln}, ${un}, ${dn}, ${X}, ${fn}, ${pn}, ${mn}, ${hn}, ${gn}, or ${Z}`;function bn(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function xn(e){return`Unsupported macOS setting: ${e}. ${_n}`}function Sn(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 Cn(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: ${cn.join(`|`)}`)}function wn(t,n){if(t===void 0||t.trim()===``)throw new e(`INVALID_ARGS`,`settings location set requires ${n}`);return Q(Number(t),n)}function Tn(e){return{latitude:Q(e?.latitude,`latitude`),longitude:Q(e?.longitude,`longitude`)}}function Q(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 En(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r[r.length-1]?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function $(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function Dn(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function On(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=kn(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function kn(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function An(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=Mn(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>Rn(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:zn(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&Hn(e)),e,t)}}function jn(e){if(e.length===0)return new Map;let{hintedContainers:t}=Mn(e);return Ln(t.directionsByContainer)}function Mn(e){let t=u(e),n=new Set,i=[];for(let a of e){if(r(a,e,t)){Wn(a,n,t);continue}i.push(a)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:i,hintedContainers:In(e,i,n,t)}}function Nn(e,t){return e.hittable&&n(e.rect,t)}function Pn(e,t,r=u(t)){if(!e.rect)return null;let a=s(e,t,r);if(a&&!l(e.rect,a)){let t=Fn(e.rect,a);if(t)return t}let o=i(t,e.rect);if(o&&!n(e.rect,o)){let t=Fn(e.rect,o);if(t)return t}return null}function Fn(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function In(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=Gn(e,n,r);if(!t?.rect)continue;let s=Vn(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return Kn(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function Ln(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function Rn(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function zn(e,t,n){let r=new Map;for(let i of e){let e=Bn(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=Un(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function Bn(e,t,n){if(!e.rect)return null;let r=s(e,t,n);return r?Vn(e.rect,r):null}function Vn(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function Hn(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!$(e)}function Un(e){let t=new Set,n=[];for(let r of e){let e=$(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function Wn(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function Gn(e,n,r){return t(e,r,e=>n.has(e.index))}function Kn(e,t,n,r,i){for(let a of e){let e=qn(a);if(!e||e.size===0)continue;let o=Gn(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function qn(e){let t=On(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function Jn(e){return e}function Yn(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{Ye as $,Yt as A,le as At,_t as B,nn as C,re as Ct,qt as D,fe as Dt,an as E,ie as Et,Bt as F,yt as G,vt as H,V as I,_ as J,ot as K,Tt as L,Kt as M,ce as Mt,Et as N,te as Nt,Jt as O,pe as Ot,wt as P,de as Pt,Ke as Q,mt as R,$t as S,f as St,rn as T,d as Tt,xt as U,P as V,St as W,qe as X,Ge as Y,Je as Z,Sn as _,Se as _t,jn as a,We as at,Y as b,ve as bt,Dn as c,He as ct,wn as d,Re as dt,Qe as et,Tn as f,Le as ft,bn as g,xe as gt,xn as h,Te as ht,Pn as i,rt as it,Gt as j,ue as jt,Xt as k,ee as kt,$ as l,Ve as lt,vn as m,we as mt,Jn as n,Ze as nt,Nn as o,Be as ot,yn as p,Ie as pt,w as q,An as r,nt as rt,On as s,Ue as st,Yn as t,tt,En as u,ze as ut,Cn as v,Ce as vt,tn as w,ne as wt,Qt as x,_e as xt,sn as y,m as yt,ht as z};
|
|
@@ -1,15 +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{A as c,L as l,N as u,O as d,a as f,at as p,c as m,i as h,k as g,l as _,r as ee,t as te,y as ne,yt as re}from"./screenshot-geometry.js";import{$ as ie,Et as ae,F as oe,G as se,It as ce,J as le,K as ue,Kt as de,Lt as fe,Q as pe,Qt as me,R as he,Rt as ge,St as _e,Vt as ve,Xt as v,Z as ye,Zt as be,cn as xe,en as y,et as b,in as Se,ln as Ce,qt as we,rt as Te,sn as Ee,tn as De,tt as Oe,wn as x,wt as ke,y as Ae,z as je,zt as Me}from"./sdk-batch-runner.js";import{d as Ne}from"./sdk-device.js";import{a as Pe,n as Fe,r as Ie,t as Le}from"./text-surface.js";import{b as Re,w as ze,y as Be}from"./device.js";import Ve from"node:path";import{styleText as He}from"node:util";import{createHash as Ue}from"node:crypto";const We=3e5,Ge=[`leaseId`,`tenantId`,`runId`,`clientId`,`deviceKey`];function Ke(e){return x({tenantId:e.meta?.tenantId??S(e.flags,`tenant`),runId:e.meta?.runId??S(e.flags,`runId`),leaseId:e.meta?.leaseId??S(e.flags,`leaseId`),leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend,leaseProvider:e.meta?.leaseProvider??S(e.flags,`leaseProvider`)??S(e.flags,`provider`),deviceKey:e.meta?.deviceKey??S(e.flags,`deviceKey`),clientId:e.meta?.clientId??S(e.flags,`clientId`)})}function qe(e){return x({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 Je(e){return x({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 Ye(e){return x({tenant:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function Xe(e){return x({tenantId:e.tenantId??``,runId:e.runId??``,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function Ze(e){return rt(e)}function Qe(e){let{ttlMs:t,...n}=rt(e);return n}function $e(e,t,n){let r=x({...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,...x({ttlMs:e.leaseTtlMs,backend:e.leaseBackend})};case`lease_heartbeat`:return{...r,...x({leaseId:e.leaseId,ttlMs:e.leaseTtlMs})};case`lease_release`:return{...r,...x({leaseId:e.leaseId})}}}function et(e){let t=x({leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId});return Object.keys(t).length>0?t:void 0}function tt(e){return e.leaseProvider===`proxy`}function nt(e){return tt(e)?Ge.filter(t=>!e[t]):[]}function rt(e){return x({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 S(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function C(e){return e?{message:e}:{}}function w(e,t){return t?{...e,message:t}:e}function it(e){return typeof e?.message==`string`&&e.message.length>0?e.message:null}function at(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function ot(e,t,n){return{deviceId:t,deviceName:n,...Ne(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function st(e,t={}){let n=t.includeSerial??!0,r=ct(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 ct(e){return Ne(e.platform)?e.identifiers.serial??e.id:void 0}function lt(e){return{name:e.name,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...st(e.device,{includeSerial:!1}),createdAt:e.createdAt}}function ut(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 dt(e){return e.bundleId??e.package??e.app}function ft(e){return w({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: ${dt(e)}`)}function pt(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function mt(e){return w({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: ${pt(e)}`)}function ht(e){let t=e.appName??e.appBundleId??e.session;return w({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?st(e.device):{}},t?`Opened: ${t}`:`Opened`)}function gt(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...`provider`in e&&e.provider?{provider:e.provider}:{},...C(e.session?`Closed: ${e.session}`:`Closed`)}}function _t(e){return{nodes:e.nodes,truncated:e.truncated,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...re(vt(e)),...e.unchanged?{unchanged:e.unchanged}:{},...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{},...e.refsGeneration===void 0?{}:{refsGeneration:e.refsGeneration}}}function vt(e){return{...e,...e.snapshotQuality?{quality:e.snapshotQuality}:{}}}const yt=[`medium`,`high`],bt=`medium`;function xt(e){return yt.includes(e)}function St(e){let t=typeof e==`number`?e:Ct(e);return t!==void 0&&Number.isInteger(t)&&t>=5&&t<=10?t:void 0}function Ct(e){return typeof e==`string`&&/^\d+$/.test(e)?Number(e):void 0}function wt(e){if(xt(e))return e;let t=St(e);if(t!==void 0)return t<=7?`medium`:`high`}const Tt=[`app`,`device`,`system`];function Et(e){return e===`device`||e===`system`}const Dt=Nt(`public`),Ot=Nt(`internal`),kt=Nt(`local-cli`),At={help:`help`};function jt(){return[...Object.values(Dt),...Object.values(kt)].sort()}function Mt(e){return Object.values(At).includes(e)||Object.values(Ot).includes(e)?!0:jt().includes(e)}function Nt(e){let t={};for(let[n,r]of Ae(e))t[n]=r;return t}const Pt=[`app`,`frontmost-app`,`desktop`,`menubar`],Ft=p(Pt,{normalize:e=>e.trim().toLowerCase(),message:e=>`Invalid surface: ${e}. Use ${Pt.join(`|`)}.`});function It(e){return Ft.parse(e)}const Lt=`--launch-console is supported only for iOS simulator app launches`,Rt=`--launch-console requires a direct app launch and cannot be used with URL opens`,zt=[`path`,`start`,`stop`,`doctor`,`mark`,`clear`],Bt=[`metrics`,`frames`,`memory`,`cpu`,`trace`],Vt=[`sample`,`snapshot`,`start`,`stop`,`report`],Ht=[`profile`],Ut=[`xctrace`,`simpleperf`,`perfetto`,`android-hprof`,`memgraph`],Wt=[`android-hprof`,`memgraph`],Gt=p(Bt),Kt=p(Vt),qt=p(Ht),Jt=p(Ut),Yt=p(Wt),Xt=`perf area must be metrics, frames, memory, cpu, or trace`,Zt=`perf action must be sample, snapshot, start, stop, or report`,Qt=`perf cpu requires profile`,$t=`perf --kind must be xctrace, simpleperf, perfetto, android-hprof, or memgraph`,en=`perf memory snapshot --kind must be android-hprof or memgraph`,tn=Gt.is,nn=Kt.is,rn=qt.is,an=Jt.is,on=Yt.is;function T(e){return e.width>0&&e.height>0}function sn(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 cn(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 ln(e){return typeof e.parentIndex!=`number`}function E(e){let t=(e.type??``).toLowerCase(),n=(e.identifier??``).trim().toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)||n===`composer`}function un(e){let t=(e.type??``).toLowerCase();return t.includes(`scroll`)||t.includes(`list`)||t.includes(`recyclerview`)}function D(e){let t=_(e);if(!t||t!==e.identifier?.trim()||!dn(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 O(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}function dn(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function fn(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 pn(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 k(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 mn=[`button`,`switch`,`checkbox`,`radio`],hn=[`button`,`image`,`textview`,`view`];function gn(e,t,n){for(let r of e){if(t.has(r.index)||!yn(r))continue;let i=bn(pn(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)k(e,n,t)}}}function _n(e,t,n){let r=new Map;for(let i of e){if(t.has(i.index)||!Dn(i))continue;let a=O(D(i));if(!a)continue;let o=r.get(a);if(o&&wn(o,i,t)){let s=Tn(e,o,i,t,n);r.set(a,s);continue}r.set(a,i)}}function vn(e,t){for(let n of e){if(t.has(n.index)||!Sn(n))continue;let r=O(D(n));if(!r)continue;let i=pn(e,n.index).filter(e=>!t.has(e.index)&&Cn(n,e,r));for(let n of i.filter(xn))k(e,n.index,t);let a=i.filter(e=>!xn(e)),o=new Set(a.map(e=>O(D(e))).filter(e=>!!e));if(!(a.length<2||o.size<2))for(let n of a)k(e,n.index,t)}}function yn(e){return e.hittable===!0&&!E(e)&&!!(e.rect&&T(e.rect))&&D(e).trim().length===0}function bn(e,t,n){let r=[],i=[],a=new Set;for(let o of e){if(n.has(o.index)||!xn(o)||!sn(o.rect,t.rect))continue;let e=D(o).trim().replace(/\s+/g,` `),s=O(e);i.push(o.index),!(!e||!s||a.has(s))&&(a.add(s),r.push(e))}return{label:r.join(`, `),removableIndexes:i}}function xn(e){if(e.hittable===!0||E(e))return!1;let t=(e.type??``).toLowerCase();return t.includes(`text`)||t.includes(`image`)||t.includes(`icon`)}function Sn(e){return e.hittable===!0&&!E(e)&&!!(e.rect&&T(e.rect))&&!!O(D(e))}function Cn(e,t,n){if(!Dn(t)||!sn(t.rect,e.rect))return!1;let r=O(D(t));return!!(r&&n!==r&&n.includes(r))}function wn(e,t,n){return!n.has(e.index)&&cn(e.rect,t.rect)&&(Mn(e,t)||jn(e,t))}function Tn(e,t,n,r,i){let a=On(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:En(c.presentationHints,l,s)}),k(e,o.index,r),i.get(a.index)??a}function En(e,t,n){return[...new Set([...Array.isArray(e)?e:[],...Array.isArray(t)?t:[],...n?[n]:[]])]}function Dn(e){if(!e.rect||!T(e.rect)||ln(e)||E(e))return!1;let t=(e.type??``).toLowerCase();return t===`text`||An(t,hn)}function On(e,t){let n=kn(e);return kn(t)>n?t:e}function kn(e){let t=(e.type??``).toLowerCase(),n=0;return An(t,mn)?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 An(e,t){return t.some(t=>e.includes(t))}function jn(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:On(n,r).index===n.index}function Mn(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 Nn(e,t,n){if(n.raw||!Pn(e))return{nodes:t,filteredCount:0};let r=Fn(t);return{nodes:r,filteredCount:t.length-r.length}}function Pn(e){let t=e.androidSnapshot;return!t||typeof t!=`object`?!1:t.backend===`android-helper`}function Fn(e){if(e.length===0)return e;let t=new Set,n=new Map,r=new Map(e.map(e=>[e.index,e]));return In(e,t),Ln(e,r,t,n),gn(e,t,n),vn(e,t),_n(e,t,n),e.filter(e=>!t.has(e.index)).map(e=>n.get(e.index)??e)}function In(e,t){for(let n of e)!n.rect||T(n.rect)||ln(n)||k(e,n.index,t)}function Ln(e,t,n,r){for(let i of e){if(n.has(i.index)||i.rect||ln(i))continue;let a=fn(i,t,un);a&&zn(r,a,Rn(i,e)),k(e,i.index,n)}}function Rn(e,t){let n=t.filter(t=>t.parentIndex===e.parentIndex&&t.rect&&T(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 zn(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 Bn(e){return[...Vn(e),...Hn(e)]}function Vn(e){let t=Un(e?.candidates);if(t.length===0)return[];let n=(typeof e?.matches==`number`?e.matches:t.length)-t.length;return[`Candidates:`,...t.map(e=>` ${e}`),...n>0?[` +${n} more`]:[]]}function Hn(e){let t=Wn(e?.devices);return t.length===0?[]:[`Devices:`,...t.map(e=>` ${e.id} ${e.name}`)]}function Un(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Wn(e){return Array.isArray(e)?e.filter(e=>typeof e==`object`&&!!e&&typeof e.id==`string`&&typeof e.name==`string`):[]}function Gn(e){let t=e.trim().replace(/\s+/g,` `).toLowerCase();return!t||Kn(t)?null:t}function Kn(e){return/\S+@\S+\.\S+/.test(e)}function qn(e){if(e.length<20)return!1;let t=new Map;for(let n of e){let e=(n.type??``).toLowerCase(),r=Gn(_(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||!Jn(e)||(n+=e.length);return n>=8}function Jn(e){for(let t=0;t<e.length;t+=1)for(let n=t+1;n<e.length;n+=1)if(Yn(e[t]?.rect,e[n]?.rect))return!0;return!1}function Yn(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 Xn={digest:8*1024,default:24*1024,full:64*1024};function Zn(e){return e===`digest`||e===`full`?e:`default`}function Qn(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 A(t,n=256){return Qn(e(t),n)}function $n(e,t){let n=e;for(let e of t)e.value&&(n=n.split(e.value).join(`<var:${e.name}>`));return n}function er(e){return(t,n)=>A($n(t,e),n)}function tr(e,t){return e.state!==`available`||e.refs.length<=t?e:{...e,refs:e.refs.slice(0,t),truncated:!0}}function nr(e,t){let n=Zn(t),r=n===`digest`?8:20,i=tr(e.screen,r),a=n===`digest`?[]:e.suggestions.slice(0,5);return{...e,screen:i,suggestions:a}}function rr(e){return Buffer.byteLength(JSON.stringify(e),`utf8`)}function ir(e){let{divergence:t,level:n,writeOverflowArtifact:r}=e,i=Zn(n),a=Xn[i],o=nr(t,n),s=rr(o);if(s<=a)return o;let c=s-a,l=r(nr(t,`full`)),u=ar(o);return`artifactPath`in l?{...u,overflow:{omittedBytes:c,artifactPath:l.artifactPath}}:{...u,artifactUnavailable:!0}}function ar(e){return{version:e.version,kind:e.kind,step:{index:e.step.index,source:{path:A(e.step.source.path),line:e.step.source.line}},action:A(e.action),cause:{code:e.cause.code,message:A(e.cause.message),...e.cause.hint?{hint:A(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 or(e){let t=e?.divergence;if(!t||typeof t!=`object`)return null;let n=t,r=[...vr(n.step),...mr(n.kind,n.targetBinding),...sr(n.repairHint,n.resume),...yr(n.screen),...Cr(n.suggestions,n.suggestionCount),...Tr(n.overflow,n.artifactUnavailable)];return r.length>0?r.join(`
|
|
2
|
-
`):null}function sr(e,t){if(typeof e!=`string`)return[];let n=ur(e,t);return[`Repair hint: ${e}${n?` — ${n}`:``}`]}function cr(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 j(e,t){return`replay --from ${e} --plan-digest ${t}`}function lr(e){return e?.repairSessionHeld===!0}function ur(e,t){let n=dr(e,cr(t));if(n!==void 0)return lr(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 dr(e,t){switch(e){case`record-and-heal`:return t?.allowed?`press the correct control via a blessed @ref from screen.refs (recorded), then ${j(t.from,t.planDigest)}.`:`press the correct control via a blessed @ref from screen.refs (recorded). ${pr(t)}`;case`state-repair`:return t?.allowed?`fix app state with --no-record actions, then ${j(t.from,t.planDigest)} to re-run it.`:`fix app state with --no-record actions. ${pr(t)}`;case`caution`:return fr({lead:`something already matches the recorded selector; a blind re-press may repeat the mistake.`,guidance:t});case`manual`:return fr({lead:`no safe automated repair could be proven; inspect the screen and repair by hand.`,guidance:t});default:return}}function fr(e){let{lead:t,guidance:n}=e;if(!n?.allowed)return`${t} ${pr(n)}`;let r=`if you fixed app state with --no-record actions: ${j(n.from,n.planDigest)}`;return n.alternateFrom===void 0?`${t} ${r}.`:`${t} ${r}; ${`if you performed the step's intent as a recorded action: ${j(n.alternateFrom,n.planDigest)}`}.`}function pr(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 mr(e,t){if(typeof e!=`string`||e===`action-failure`)return[];let n=t;return n?[hr(e,n.matchCount),...gr(n.mismatches),..._r(n.candidates)]:[]}function hr(e,t){return`Target binding: ${e}${typeof t==`number`?` (matchCount ${t})`:``} — recorded target evidence did not verify.`}function gr(e){return!Array.isArray(e)||e.length===0?[]:[` mismatches: ${e.slice(0,5).join(`; `)}`]}function _r(e){return!Array.isArray(e)||e.length===0?[]:[` ${e.length} candidate(s) shared the recorded identity:`,...e.slice(0,5).map(e=>` ${Sr(e)}`)]}function vr(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 yr(e){let t=e;return t?.state===`available`&&Array.isArray(t.refs)?br(t.refs,t.refsGeneration):t?.state===`unavailable`?[xr(t)]:[]}function br(e,t){let n=e.slice(0,8).map(Sr),r=e.length-n.length;return[`Screen: ${e.length} actionable ref(s) captured (refsGeneration ${t}).`,...n,...r>0?[` ... ${r} more`]:[]]}function xr(e){let t=typeof e.hint==`string`&&e.hint.length>0?` ${e.hint}`:``;return`Screen: unavailable (${String(e.reason??`unknown`)}).${t}`}function Sr(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` @${String(t.ref)} [${String(t.role)}]${n}`}function Cr(e,t){return Array.isArray(e)&&e.length>0?[`Suggestions:`,...e.slice(0,5).map(wr)]:typeof t==`number`&&t>0?[`Suggestions: ${t} available (omitted at this response level; rerun with --json for the full report).`]:[]}function wr(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` - [${String(t.basis)}]${n} ${String(t.selector)}`}function Tr(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 Er={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 Dr(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:M(i,c,!1,o,t)})}return r}function M(e,t,n,r,i={}){let a=r??P(e.type??`Element`),o=Fe(e,a),s=Mr(e,a,i,o),c=` `.repeat(t),l=e.ref?`@${e.ref}`:``,u=Nr(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&&Ar(t,n))return``;let r=e.value?.trim();if(kr(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||jr(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`:Or(n)||n||`element`}function Or(e){return Object.prototype.hasOwnProperty.call(Er,e)?Er[e]:void 0}function kr(e){return e===`text-field`||e===`text-view`||e===`search`}function Ar(e,t){return e!==`scroll-area`&&e!==`list`&&e!==`collection`&&e!==`table`?!1:m(t)}function jr(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function Mr(e,t,n,r){return!n.summarizeTextSurfaces||!r.shouldSummarize?N(e,t):Pr(e,t,r.text)||N(e,t)}function Nr(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`),kr(t)&&i.push(`editable`),Fr(e,t)&&i.push(`scrollable`),!r.shouldSummarize)?Lr(i):(i.push(`preview:"${Ir(Le(r.text))}"`),i.push(`truncated`),Lr(i))}function Pr(e,t,n){let r=Pe(e.label);if(r&&r!==n)return r;let i=Pe(e.identifier);if(i&&!jr(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 Fr(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 Ir(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function Lr(e){return[...new Set(e)]}function Rr(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function zr(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`);let a=Bn(i.details);a.length>0&&process.stderr.write(`${a.join(`
|
|
3
|
-
`)}\n`),i.diagnosticId&&process.stderr.write(`Diagnostic ID: ${i.diagnosticId}\n`),i.logPath&&process.stderr.write(`Diagnostics Log: ${i.logPath}\n`);let o=or(i.details);o&&process.stderr.write(`${o}\n`),r.showDetails&&i.details&&process.stderr.write(`${JSON.stringify(i.details,null,2)}\n`)}function Br(e,t={}){let n=e.nodes,r=Array.isArray(n)?n:[],o=a(i(e.backend)?e.backend:void 0),s=Nn(e,r,t),c=Wr(e),l=li(e,r,t,s),u=l.length>0?`${l.join(`
|
|
4
|
-
`)}\n`:``,d=t.raw?null:Vr(e);if(d)return`${c}${u}${Hr(d)}\n`;let f=t.raw||!o?null:ee(s.nodes),p=!!e.truncated,m=f?.nodes??r,h=t.raw||!o?null:Xr(e,f,m.length,r.length,s.filteredCount),g=Gr(r.length,h,p);return r.length===0?`${c}${g}\n${u}`:t.raw?`${c}${g}\n${u}${Kr(r)}\n`:t.flatten?`${c}${g}\n${u}${qr(m)}${Yr(f)}\n`:`${c}${g}\n${u}${Jr(m)}${Yr(f)}\n`}function Vr(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 Hr(e){let t=Ur(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(`
|
|
5
|
-
`):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(`
|
|
6
|
-
`):[`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(`
|
|
7
|
-
`)}function Ur(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 Wr(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(`
|
|
8
|
-
`)}\n`:``}function Gr(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 Kr(e){return e.map(e=>JSON.stringify(e)).join(`
|
|
9
|
-
`)}function qr(e){return _i(e).join(`
|
|
10
|
-
`)}function Jr(e){return mi(Dr(e,{summarizeTextSurfaces:!0})).join(`
|
|
11
|
-
`)}function Yr(e){return e&&e.summaryLines.length>0?`\n${e.summaryLines.join(`
|
|
12
|
-
`)}`:``}function Xr(e,t,n,r,i=0){let a=Zr(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:Qr([...a?.reasons??[],`offscreen-nodes`])}:a||(s?{partial:!0,visibleNodeCount:n,totalNodeCount:n,reasons:[]}:null)}function Zr(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 Qr(e){return[...new Set(e)]}function $r(e){let t=e.baselineInitialized===!0,n=e.summary??{},r=F(n.additions),i=F(n.removals),a=F(n.unchanged),o=I(),s=pi(e),c=s.length>0?`${s.join(`
|
|
13
|
-
`)}\n`:``;if(t)return`${c}Baseline initialized (${a} lines).\n`;let l=si(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(`
|
|
14
|
-
`)}\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 ei(e){let t=I(),n=e.match===!0,r=e.dimensionMismatch,i=[];return i.push(...ti(e,t)),i.push(...ni(e,n,t)),!n&&!r&&(i.push(...ri(e,t)),i.push(...ii(e,t))),`${i.join(`
|
|
15
|
-
`)}\n`}function ti(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 ni(e,t,n){if(t)return[];let r=[];if(e.diffPath){let t=oi(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=oi(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 ri(e,t){let n=F(e.differentPixels),r=F(e.totalPixels);return[` ${t?L(String(n),`red`):String(n)} different / ${r} total pixels`]}function ii(e,t){let n=Array.isArray(e.regions)?e.regions:[];if(n.length===0)return[];let r=[` ${ci(`Changed regions:`,t)}`];for(let e of n.slice(0,5))r.push(...ai(e));return r}function ai(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 oi(e){let t=process.cwd(),n=Ve.relative(t,e);return n===``||!n.startsWith(`..`)&&!Ve.isAbsolute(n)?n===``?`.`:`.${Ve.sep}${n}`:e}function F(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function si(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 He(t,e,n)}function ci(e,t){return t?L(e,`dim`):e}function li(e,t,n,r={nodes:t,filteredCount:0}){let i=pi(e);if(ui(e)){let e=fi(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&&qn(a)&&i.push(`Warning: possible repeated nav subtree detected.`),i}function ui(e){return!e.snapshotQuality&&!di(e)}function di(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 fi(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 pi(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.length>0):[]}function mi(e){let t=[],n=[],r=new Map(e.map(e=>[e.node.index,e.node])),i=e=>{for(;n.length>0&&(!e||hi(e,n[n.length-1],r));)t.push(...vi(n.pop(),`below`))};for(let r of e)i(r),t.push(r.text),t.push(...vi(r,`above`)),r.node.hiddenContentBelow&&n.push(r);return i(),t}function hi(e,t,n){return gi(e.node,t.node,n)?!1:e.depth<=t.depth}function gi(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 _i(e){return Dr(e,{summarizeTextSurfaces:!0}).flatMap(e=>[M(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...vi({...e,depth:0})])}function vi(e,t){let n=yi(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 yi(e){return e===`scroll-area`||e===`list`||e===`collection`||e===`table`?e:null}function bi(e,t,n={}){let r=Ti(e);if(r.length===0)return{canScroll:!1,emptySnapshot:!0};let i=f(r),a=Ei(r,i,t,n);return a?{canScroll:Oi(a,i.get(a.index),t),emptySnapshot:!1,scope:ki(a,r)}:{canScroll:!1,emptySnapshot:!1}}async function xi(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=bi(await i(r),t,n);return r&&e.emptySnapshot?await xi({edge:t,target:n,captureNodes:i}):e}catch(e){throw wi(t,r,e)}}async function Si(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 Ci(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 wi(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 Ti(e){return e.map((e,t)=>({...e,ref:`ref`in e&&e.ref?e.ref:`e${t+1}`}))}function Ei(e,t,n,r){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>Ce(e)&&Fi(e.rect));if(a.length===0)return null;let o=Di(r.nodeIndex,i);if(o)return o;let s=r.point;if(s){let e=a.filter(e=>e.rect&&Pi(e.rect,s)).sort(Mi);if(e.length>0)return e.find(e=>Oi(e,t.get(e.index),n))??e[0]??null}let c=a.filter(e=>Oi(e,t.get(e.index),n)).sort(Ni);return c.length>0?c[0]??null:a.filter(t=>de(t,e)).sort(Ni)[0]??a.sort(Ni)[0]??null}function Di(e,t){if(e===void 0)return null;let n=t.get(e);for(;n;){if(Ce(n)&&Fi(n.rect))return n;n=n.parentIndex===void 0?void 0:t.get(n.parentIndex)}return null}function Oi(e,t,n){return n===`bottom`?e.hiddenContentBelow===!0||t?.hiddenContentBelow===!0:e.hiddenContentAbove===!0||t?.hiddenContentAbove===!0}function ki(e,t){return[e.identifier,e.label].filter(e=>typeof e==`string`).map(e=>e.trim()).find(n=>ji(n)&&Ai(n,e,t))}function Ai(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 ji(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function Mi(e,t){return R(e.rect)-R(t.rect)}function Ni(e,t){return R(t.rect)-R(e.rect)}function R(e){return e?e.width*e.height:0}function Pi(e,t){return t.x>=e.x&&t.x<=e.x+e.width&&t.y>=e.y&&t.y<=e.y+e.height}function Fi(e){return!!(e&&e.width>0&&e.height>0)}function Ii(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 Li(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function Ri(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 zi(e){let t=Buffer.alloc(16);for(let n of e)Vi(t,Bi(n));return{digest:`ax1:${Ue(`sha256`).update(t).update(`\0`).update(String(e.length)).digest(`hex`).slice(0,16)}`,nodeCount:e.length}}function Bi(e){return Ue(`sha256`).update(e.type??``).update(`\0`).update(e.label??``).update(`\0`).update(e.identifier??``).digest().subarray(0,16)}function Vi(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}=zi(e),r=e.reduce((e,t)=>t.hittable===!1?e:e+1,0),i=Hi(e);return{digest:t,nodeCount:n,interactiveNodeCount:r,...i?{foregroundApp:i}:{}}}function Hi(e){for(let t of e)if(t.bundleId)return t.bundleId;for(let t of e)if(t.appName)return t.appName}const Ui=[`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:Ui.every(n=>Math.abs(e[n]-t[n])<=.5)}function Wi(e){return{x:Gi(e.x,e.width),y:Gi(e.y,e.height)}}function Gi(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 Ki(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function qi(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=b(e);r.push({role:n.role,...n.label===void 0?{}:{label:n.label}}),a=e}return{chain:r,broken:!1}}function Ji(e,t,n,r){return e.filter(e=>{if(!ie(b(e),n))return!1;let i=qi(e,t,Math.max(r.length,1));return!i.broken&&pe(i.chain,r)})}function Yi(e,t){let n=t.toLowerCase();return e.find(e=>{let t=(e.label??``).toLowerCase(),r=(e.value??``).toLowerCase(),i=(e.identifier??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)})??null}function K(e,t){let n=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);return n&&q(n)?n:Xi(e,t)??(n&&q(n)?n:void 0)}function q(e){let t=e.trim();return!(!t||/^(true|false)$/i.test(t)||/^\d+$/.test(t))}function Xi(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);if(!t||!q(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function Zi(e){let t=[],n=[];for(let r of e){let e=r.depth??0;for(;t.length>0&&e<=t[t.length-1];)t.pop();let i=y(r.type??``),a=[r.label,r.value,r.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0),o=a?q(a):!1;if((i===`group`||i===`ioscontentgroup`)&&!o){t.push(e);continue}let s=Math.max(0,e-t.length);n.push({...r,depth:s})}return n}function Qi(e,t){return t.hittable?t:$i(e,t,e=>e.hittable===!0)}function $i(e,t,n){return xe(e,t,Ee(e),e=>n(e)?e:null)}function ea(e){return Ie(e)}const ta=[`tabbar`,`toolbar`,`navigationbar`,`bottomnavigation`,`bottomnavigationview`,`sheet`,`dialog`,`alert`,`popover`,`menu`],na=[`tabbar`,`toolbar`,`navigationbar`],ra=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`edittext`,`checkbox`,`radio`,`switch`,`cell`];function ia(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)=>ua(e,n,t)?[r]:[]),coverCache:new Map},i=[];for(let[n,a]of e.entries())la(a)&&aa(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:ba(n.presentationHints)}}return a}function J(e){return e.interactionBlocked!==void 0}function aa(e,t,n,r){let i=e.coverCache.get(t);if(i!==void 0)return i;e.coverCache.set(t,null);let a=Y(n.rect);if(!a)return oa(e,t,null);let o=s(a);for(let i of e.overlayPositions){if(i<=t)continue;let s=e.nodes[i];if(s&&sa(e,i,n,a,o,r))return oa(e,t,s)}return oa(e,t,null)}function oa(e,t,n){return e.coverCache.set(t,n),n}function sa(e,t,n,r,i,a){if(!e.nodes[t])return!1;let o=ca(e,t,n,r,a);return!!(o&&De(o,i.x,i.y))}function ca(e,t,n,r,i){let a=e.nodes[t];if(!a||!ua(a,e.byIndex,i)||va(n,a,e.byIndex))return null;let o=Y(a.rect);return!o||G(r,o)||aa(e,t,a,i)?null:o}function la(e){return Y(e.rect)?e.hittable===!0||ha(e)?!0:!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()):!1}function ua(e,t,n){return!Y(e.rect)||v(e)||da(e,t)?!1:ga(e,ta)||fa(e,t,n)}function da(e,t){if(!ga(e,na))return!1;let n=Y(e.rect);if(!n)return!1;let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(v(r)){let e=Y(r.rect);return!!(e&&G(n,e))}i.add(r.index),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function fa(e,t,n){return n.isAdditionalOverlayNode?.(e)===!0?!pa(e,t,n):!1}function pa(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(ma(r,n))return!0;i.add(r.index),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function ma(e,t){return t.isAdditionalOverlayNode?.(e)===!0&&Y(e.rect)!==null&&!v(e)}function ha(e){return ga(e,ra)}function ga(e,t){let n=_a(e);return t.some(e=>n.includes(e))}function _a(e){return[e.type,e.role,e.subrole].map(e=>y(e??``)).join(` `)}function va(e,t,n){return ya(e,t,n)||ya(t,e,n)}function ya(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 Y(e){let t=W(e);return t&&t.width>0&&t.height>0?t:null}function ba(e){return Array.from(new Set([...e??[],`covered`]))}const xa=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];function Sa(e,t){return Ca(e,t).node}function Ca(e,t){if(J(t))return{node:t,reason:`covered`};let n=wa(e,t);if(n?.rect&&U(n.rect))return{node:n,reason:`same-rect-descendant`};if(Ta(t)&&t.rect&&U(t.rect))return{node:t,reason:`semantic-target`};let r=Qi(e,t);return r?.rect&&!J(r)&&U(r.rect)?Da(t,r,e)?{node:t,reason:`overly-broad-ancestor`}:{node:r,reason:`hittable-ancestor`}:{node:t,reason:`original`}}function wa(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||J(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 Ta(e){return[e.type,e.role,e.subrole].map(e=>y(e??``)).some(Ea)}function Ea(e){return e===`tab`||xa.some(t=>e.includes(t))}function Da(e,t,n){let r=W(e.rect),i=W(t.rect);if(!r||!i)return!1;if(Oa(t)&&!G(r,i))return!0;let a=ka(n,r);return!a||!Aa(i,a)?!1:!G(r,i)}function Oa(e){let t=y(e.type??``);return t.includes(`scrollview`)||t.includes(`scrollarea`)||t.includes(`listview`)||t.includes(`recyclerview`)||t.includes(`collectionview`)||t===`list`||t===`table`||t===`collection`}function ka(e,t){let n=s(t),r=e.filter(v).map(e=>W(e.rect)).filter(e=>e!==null);if(r.length===0)return null;let i=r.filter(e=>De(e,n.x,n.y));return Se(i.length>0?i:r)}function Aa(e,t){let n=te(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 ja(e){return e.hittable===!0||Ta(e)}function Ma(e,t){let n=le(b(e),t);return n.id!==void 0||n.label!==void 0?!1:ue(e.value)===null}function Na(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 Pa(e,t){let n=Ki(t);return t.filter(t=>t.index!==e.index&&Na(t,e,n)).sort((e,t)=>e.index-t.index)}function Fa(e,t){let n=U(e.rect);return!n||!t.rect?!1:De(t.rect,n.x,n.y)}function Ia(e,t){if(!Ma(e,t))return e;let n=Pa(e,t);if(n.some(ja))return e;let r=n.find(e=>b(e).label!==void 0);return!r||!Fa(r,e)?e:r}const La=new Set([`healthy`,`recovered`,`sparse`]),Ra=new Set([`tree`,`queries`,`private-ax`]),za=new Set([`ax-rejected`,`sparse-tree`,`budget`,`no-nodes`,`capture-failed`,`deferred`]);function Ba(e){if(!e||typeof e!=`object`)return;let t=e;if(!(typeof t.state!=`string`||!La.has(t.state))&&!(typeof t.backend!=`string`||!Ra.has(t.backend)))return{state:t.state,backend:t.backend,reason:typeof t.reason==`string`?t.reason:void 0,reasonCode:typeof t.reasonCode==`string`&&za.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 Va(e){return e?.state===`sparse`}function Ha(e,t){return[...Wa(e),...Ga(e),...Ka(e,t)]}function Ua(e){return`Detected an overly complex or slow accessibility tree. Fell back to the ${e} snapshot backend. It is OK to continue; use --json to inspect snapshotQuality.reason if you need recovery details.`}function Wa(e){return e.state===`recovered`?e.reasonCode===`deferred`?[]:[Ua(e.backend)]: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&&!Va(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 Ie(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?Yi(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`)+`…`}const ro=`replay_target_guard_mismatch`,io=ne.landmarkIdentityMismatch;function ao(e,t,r,i,a){if(!r)return;let o=b(e),s=Oe(e,t);if(!(ye(o,r.identity)&&Te(s,r.structural)))throw new n(`COMMAND_FAILED`,`${i} resolved to a different element than replay verification isolated; the action was not sent`,{reason:ro,observed:o,observedStructural:s,expected:r.identity,expectedStructural:r.structural,...a?{targetRole:a}:{}})}async function X(e,t,n){return await Eo(e,t,n.action),t.target.kind===`point`?await so(e,t,t.target,n):t.target.kind===`ref`?await lo(e,t,t.target,n):await uo(e,t,t.target,n)}async function oo(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=me(i.snapshot.nodes,a);if(!o)return;let s={x:n.x,y:n.y};if(!De(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 so(e,t,n,r){let i=await oo(e,t,n);if(!r.captureEvidenceBaseline)return{kind:`point`,point:{x:n.x,y:n.y},...i?{warning:i}:{}};let a=await co(e,t);return{kind:`point`,point:{x:n.x,y:n.y},...a?{preActionNodes:a}:{},...i?{warning:i}:{}}}async function co(e,t){try{return(await Z(e,t,!0)).snapshot.nodes}catch{return}}async function lo(e,t,n,r){let i=await Oo(e,t,n),a=i.resolved;fo(a.node,i.snapshot.nodes,r);let o=r.promoteToHittableAncestor?So(i.snapshot.nodes,a.node,{action:r.action,label:`Ref ${n.ref}`}):a.node;Co(o,`Ref ${n.ref}`,r.action);let s=await Po(e,t,o,i.snapshot.nodes,n.ref,r.action);return{kind:`ref`,point:jo(s,`Ref ${n.ref} not found or has invalid bounds`),target:{kind:`ref`,ref:`@${a.ref}`},...vo(e,s,i.snapshot.nodes,r.action,a.resolution)}}async function uo(e,t,r,i){let a=r.selector,o=await Z(e,t,i.requireInteractive),s=oe(xo(o.snapshot.nodes),a,{platform:e.backend.platform,...je(he.act)});if((!s||!s.node.rect)&&i.requireInteractive&&(o=await Z(e,t,!1),s=oe(xo(o.snapshot.nodes),a,{platform:e.backend.platform,...je(he.act)})),!s||!s.node.rect){let t=oe(o.snapshot.nodes,a,{platform:e.backend.platform,...je(he.actCoveredDiagnosis)});throw t?.node&&J(t.node)?wo({label:`Selector ${t.selector}`,node:t.node,action:i.action,selector:t.selector}):new n(`COMMAND_FAILED`,ke(a,s?.diagnostics??[],{unique:!0}),{hint:ae(s?.diagnostics??[])})}fo(s.node,o.snapshot.nodes,i);let c=i.promoteToHittableAncestor?So(o.snapshot.nodes,s.node,{action:i.action,label:`Selector ${s.selector}`}):s.node;Co(c,`Selector ${s.selector}`,i.action);let l=await No(e,t,c,o.snapshot.nodes,s.selector,i.action);return{kind:`selector`,point:jo(l,`Selector ${s.selector} resolved to invalid bounds`),target:{kind:`selector`,selector:s.selector},...vo(e,l,o.snapshot.nodes,i.action,go(s,o.snapshot.nodes))}}function fo(e,t,n){ao(e,t,n.expectedResolvedTarget,n.action,n.replayTargetRole)}const po={source:`ref`,phase:`pre-action`,kind:`exact`},mo={source:`ref`,phase:`pre-action`,kind:`label-fallback`},ho={source:`runtime`,phase:`pre-action`,kind:`unique`};function go(e,t){return e.disambiguation?{source:`runtime`,phase:`pre-action`,kind:`disambiguated`,matchCount:e.disambiguation.matchCount,winnerDiagnostic:_o(e.node,t),tiebreak:e.disambiguation.tiebreak,alternatives:e.disambiguation.alternatives.slice(0,5).map(e=>_o(e,t))}:ho}function _o(e,t){let n=y(e.type??``),r=K(e,t);return{diagnosticRef:`diag-${e.ref}`,...n?{role:no(n,256)}:{},...r===void 0?{}:{label:no(r,256)}}}function vo(e,t,n,r,i){return{node:t,selectorChain:se(t,e.backend.platform,{action:r===`fill`?`fill`:`click`,nodes:n}),refLabel:K(t,n),...bo(t,r),preActionNodes:n,resolution:i,...yo(e,t,n,r)}}function yo(e,t,n,r){if(r!==`click`&&r!==`press`)return{};let i=Ia(t,n);return i===t?{}:{recordingTarget:{node:i,selectorChain:se(i,e.backend.platform,{action:`click`,nodes:n}),refLabel:K(i,n)}}}function bo(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 xo(e){return e.filter(e=>!J(e))}function So(e,t,n){let r=Ca(e,t);if(r.reason===`covered`)throw wo({label:n.label,node:t,action:n.action});return r.node}function Co(e,t,n){if(J(e))throw wo({label:t,node:e,action:n})}function wo(e){return new n(`COMMAND_FAILED`,`${e.label} is covered by another visible element and cannot ${To(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 To(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 Z(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 Eo(e,t,r){if(e.backend.platform!==`macos`)return;let i=await Do(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 Do(e,t){return(await e.sessions.get(t.session??`default`))?.metadata?.surface}async function Oo(e,t,r){let{session:i,snapshot:a}=await Qa(e,t.session),o=r.fallbackLabel??``,s=Ao(a.nodes,r.ref,{fallbackLabel:o});if(!s)throw new n(`COMMAND_FAILED`,`Ref ${r.ref} not found or has no bounds`,{hint:_e});return ko({session:i,frameTree:a,target:r,fallbackLabel:o,authorized:s})}function ko(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=Ao(o.nodes,r.ref,{fallbackLabel:i});return s&&ye(b(a.node),b(s.node))?{snapshot:o,resolved:s}:{snapshot:n,resolved:a}}function Ao(e,t,i){let a=o(t);if(!a)throw new n(`INVALID_ARGS`,`Invalid ref: ${t}`);let s=r(e,a);if(Mo(s))return{ref:a,node:s,resolution:po};let c=i.fallbackLabel.length>0?Yi(e,i.fallbackLabel):null;return Mo(c)?{ref:a,node:c,resolution:mo}:null}function jo(e,t){let r=U(e.rect);if(!r)throw new n(`COMMAND_FAILED`,t);return r}function Mo(e){return e?U(e.rect)!==null:!1}async function No(e,t,n,r,i,a){return await Lo(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=>`${Fo(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 Po(e,t,n,r,i,a){return await Lo(e,t,n,r,{message:`Ref ${i} is off-screen and not safe to ${a}`,details:{reason:`offscreen_ref`,ref:o(i)},hint:e=>`${Fo(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 Fo(e){return e?`Scroll ${e} toward it`:`Scroll toward it`}async function Io(e,t,n,r){let i=(await e.sessions.get(t.session??`default`))?.snapshot?.nodes;if(!i||o(n.ref)===null)return{};let a=Ao(i,n.ref,{fallbackLabel:n.fallbackLabel??``});if(!a)return{};Co(a.node,`Ref ${n.ref}`,r);let s=await Po(e,t,a.node,i,n.ref,r);return{...bo(s,r),node:s,preActionNodes:i}}async function Lo(e,t,r,i,a){let o=r.rect?be(r,i):null;if(!r.rect||!o||we(r,i))return r;let s=me(i,r.rect),c=await e.backend.confirmOffscreenTargetVisible?.(z(e,t),r,s);if(c)return{...r,rect:c};let l=h(r,i);throw new n(`COMMAND_FAILED`,a.message,{...a.details,rect:r.rect,viewport:o,...l?{scrollDirection:l}:{},hint:a.hint(l)})}function Ro(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 zo(e,t,n={}){let r=Ho(Vo(e,n),Vo(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 Bo(e,t={}){return Vo(e,t).length}function Vo(e,t){return t.flatten?e.map(e=>({text:M(e,0,!1),comparable:Ro(e,0),...t.withRefs&&e.ref?{ref:e.ref}:{}})):Dr(e).map(e=>({text:e.text,comparable:Ro(e.node,e.depth),...t.withRefs&&e.node.ref?{ref:e.node.ref}:{}}))}function Ho(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=Wo(a,i,s)?Q(a,i+1):Q(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 Uo(o,e,t,n,r)}}return[]}function Uo(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=Wo(i,c,r)?c+1:c-1,u=Q(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 Wo(e,t,n){return t===-n||t!==n&&Q(e,t-1)<Q(e,t+1)}function Q(e,t){return e.get(t)??0}function Go(e){return e?ze({packageName:e.bundleId,resourceId:e.identifier}).inputMethodOwned:!1}const Ko=new Set([`textfield`,`securetextfield`,`textview`,`textarea`,`searchfield`,`edittext`]),qo={strippedIndexes:new Set,refs:new Set};function Jo(e){let t=new Set(e.filter(e=>y(e.type??``)===`keyboard`).map(e=>e.index));if(t.size===0)return qo;let n=new Map(e.map(e=>[e.index,e])),r=$o(e,n,t),i=new Set(r),a=ss(e,n,r);for(let t of $o(e,n,a))i.add(t);for(let o of Yo(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 Yo(e,t,n,r,i){let a=new Set;if(n.size===0)return a;let o=Zo(t,n,r);if(o.size===0)return a;let s=Qo(t,r);for(let n of e)!i.has(n.index)&&!s.has(n.index)&&n.rect&&Xo(n,t,o)&&a.add(n.index);return a}function Xo(e,t,n){if(!e.rect)return!1;let r=cs(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 Zo(e,t,n){let r=new Map;for(let i of n){let n=e.get(i);if(!n?.rect)continue;let a=cs(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 Qo(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 $o(e,t,n){let r=new Set(n);if(n.size===0)return r;for(let i of e)ls(i,t,n)&&r.add(i.index);return r}function es(e,t){if(e.bundleId!==`com.android.systemui`)return!1;if(Be(e))return!0;let n=new Set,r=e;for(;r?.bundleId===`com.android.systemui`&&!n.has(r.index);){if(Re(r.identifier))return!0;n.add(r.index),r=r.parentIndex===void 0?void 0:t.get(r.parentIndex)}return!1}function ts(e,t){let n=new Map(e.map(e=>[e.index,e])),r=new Set(e.filter(e=>Go(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:ns(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?qo:{strippedIndexes:o,refs:s}}function ns(e,t,n){return new Set(e.filter(e=>!n.has(e.index)&&es(e,t)).map(e=>e.index))}function rs(e,t){let n=Jo(e),r=ts(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 is(e,t){let{strippedIndexes:n}=rs(e,t);return n.size===0?e:e.filter(e=>!n.has(e.index))}function as(e,t){return rs(e,t).refs}function os(e){return Jo(e).refs}function ss(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=cs(n,t);i!==void 0&&r.add(i)}for(let i of r){let a=new Set([i]);e.some(e=>Ko.has(y(e.type??``))&&!n.has(e.index)&&ls(e,t,a))&&r.delete(i)}return r}function cs(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 ls(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 us(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 ds=`Settled on a nearly-empty tree — the app may still be loading. Wait for specific content (wait text ...) before interacting.`;async function fs(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 hs(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=gs(m.snapshot.nodes),g=B(e);if(n.resetBudgetOnPrivateAxRecovery===!0&&!s&&ps(m.snapshot.snapshotQuality)){s=!0,o=Math.max(o,g+i),p=g,u=h,d=m.snapshot.nodes.length;let t=ms({nowMs:g,quietSinceMs:p,quietMs:r,pollMs:c,deadlineMs:o});if(t<=0)break;await Li(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 _=ms({nowMs:g,quietSinceMs:p,quietMs:r,pollMs:c,deadlineMs:o});if(_<=0)break;await Li(e,_)}return{settled:!1,stalled:!1,waitedMs:B(e)-a,captures:l,nodeCount:d,lastCapture:f}}function ps(e){return e?.state===`recovered`&&e.backend===`private-ax`&&e.reasonCode!==`deferred`}function ms(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 hs(e,t,n){let r=await us(e,t,n,async n=>await $a(e,{...t,signal:n},{updateSession:!1,interactiveOnly:!0}));return r.timedOut?void 0:r.value}function gs(e){return e.map(_s).join(`|`)}function _s(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 vs=`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.`,ys=`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 bs(e,t,n){return await Ss(e,t,{...n,baselineNodes:Ts(n.resolved),actionPoint:n.resolved.point})}const xs=async(e,t)=>(await Ss(e,t,t)).observation;async function Ss(e,t,n){let r=n.quietMs??500,i=n.timeoutMs??1e4,a={settled:!1,waitedMs:0,captures:0,quietMs:r,timeoutMs:i};try{return await Cs(e,t,n,a,await fs(e,t,{quietMs:r,timeoutMs:i,resetBudgetOnPrivateAxRecovery:!0}))}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.`}}}}async function Cs(e,t,n,r,i){let a={...r,settled:i.settled,waitedMs:i.waitedMs,captures:i.captures};if(!i.lastCapture)return{observation:{...a,hint:i.stalled?ys:vs}};let{stored:o,session:s}=await Ps(e,t,i.lastCapture),c=i.lastCapture.snapshot.nodes;return{observation:{...a,...i.settled&&o?Ds(n.baselineNodes,c,n.actionPoint,s?.appBundleId):{},...Ns(i,o,c.length)},settledNodes:c}}function ws(e,t){if(!e)return;let n=H(e),r=t!==void 0&&n.digest!==H(t).digest;return{...n,changedFromBefore:r}}function Ts(e){return`preActionNodes`in e&&e.preActionNodes?e.preActionNodes:[]}function Es(e,t,n){let r=zo(is(e,n),is(t,n),{flatten:!0,withRefs:!0}),i=r.lines.filter(e=>e.kind!==`unchanged`),a=Ms(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 Ds(e,t,n,r){let i=Es(e,t,r);return{diff:i,...Os(i,t,n,r)}}function Os(e,t,n,r){let i=new Set(e.lines.filter(e=>e.kind===`added`&&e.ref).map(e=>e.ref)),a=as(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)&&!ks(o.get(e),n))?{}:js(t,i,r)}function ks(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 As=new Set([`application`,`window`]);function js(e,t,n){let r=as(e,n),i=e.filter(e=>e.ref&&e.interactionBlocked!==`covered`&&!t.has(e.ref)&&!r.has(e.ref)&&!As.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 Ms(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 Ns(e,t,n){return e.stalled?{hint:ys}:e.settled?t?n<5?{hint:ds}:{}:{hint:`Settled on a sparse, unreadable tree — the diff is omitted. Use screenshot as visual truth before interacting further.`}:{hint:vs}}async function Ps(e,t,n){if(Va(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 Fs(e){let t=e.verify===!0;return{verify:t,needsPreActionBaseline:t||e.settle!==void 0,...e.settle===void 0?{}:{settle:e.settle}}}async function Is(e,t,n,r,i){let a=await Ls(e,t,n,i);return zs({...r,...a})}async function Ls(e,t,n,r){if(r.settle!==void 0){let i=await bs(e,t,{...r.settle,resolved:n}),a=r.verify?ws(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 Rs(e,t,n);return i?{evidence:i}:{}}async function Rs(e,t,n){let r=`preActionNodes`in n?n.preActionNodes:void 0;try{let n=H((await Z(e,t,!0)).snapshot.nodes),i=r!==void 0&&n.digest!==H(r).digest;return{...n,changedFromBefore:i}}catch{return}}function zs(e){let t=e;if(t.targetHittable!==!1||!Bs(t)||t.hint===void 0)return e;let{hint:n,...r}=t;return r}function Bs(e){if(e.evidence?.changedFromBefore===!0)return!0;let t=e.settle?.diff?.summary;return!!t&&(t.additions>0||t.removals>0)}function Vs(e,t){let r=e.filter(t=>de(t,e)).map(e=>e.rect).filter(Hs),i=r.length>0?r:e.map(e=>e.rect).filter(Hs);if(i.length===0)throw new n(`COMMAND_FAILED`,`Cannot infer viewport for ${t}`);let a=Math.min(...i.map(e=>e.x)),o=Math.min(...i.map(e=>e.y)),s=Math.max(...i.map(e=>e.x+e.width)),c=Math.max(...i.map(e=>e.y+e.height));return{x:a,y:o,width:s-a,height:c-o}}function Hs(e){return!!(e&&e.width>0&&e.height>0)}async function Us(e,t){return await e.backend.resolveGestureViewport?.(z(e,t))||Vs((await Z(e,t,!1)).snapshot.nodes,`gesture`)}const Ws=async(e,t)=>{let r=await X(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=$(r),a=V(await e.backend.focus(z(e,t),i));return{...r,...a?{backendResult:a}:{},...C(`Focused (${i.x}, ${i.y})`)}},Gs=async(e,t)=>{let r=Fs(t),i=await X(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:Ii(t.durationMs,`durationMs`,0,12e4),o=$(i),s=V(await e.backend.longPress(z(e,t),o,{durationMs:a}));return await Is(e,t,i,{...i,...a===void 0?{}:{durationMs:a},...s?{backendResult:s}:{},...C(`Long pressed (${o.x}, ${o.y})`)},r)},Ks=async(e,t)=>{if(!e.backend.performGesture)throw new n(`UNSUPPORTED_OPERATION`,`gesture is not supported by this backend`);await Eo(e,t,`drag`);let r=await Us(e,t),i=await qs(e,t,`source`),a=await qs(e,t,`destination`),o=u({from:$(i),to:$(a),sourceHoldMs:t.gesture.sourceHoldMs,moveMs:t.gesture.moveMs,destinationHoldMs:t.gesture.destinationHoldMs},r),s=V(await e.backend.performGesture(z(e,t),o)),{start:c,end:d}=l(o);return{kind:`drag`,durationMs:o.durationMs,pointerCount:1,from:c,to:d,targets:{source:Js(i),destination:Js(a)},recording:Ys(i,a),...s?{backendResult:s}:{},...C(`Dragged ${t.gesture.source} to ${t.gesture.destination}`)}};async function qs(e,t,n){let r=t.gesture[n];return await X(e,{...t,target:r.startsWith(`@`)?{kind:`ref`,ref:r}:{kind:`selector`,selector:r}},{action:`drag`,requireInteractive:!1,promoteToHittableAncestor:!1,expectedResolvedTarget:t.expectedResolvedTargets?.[n],replayTargetRole:n})}function Js(e){if(e.kind===`point`||!e.resolution)throw new n(`COMMAND_FAILED`,`gesture drag target resolution was not disclosed`);let t=`selectorChain`in e?e.selectorChain:void 0;return{...t?.length?{selectorChain:t}:{},resolution:e.resolution}}function Ys(e,t){let n=Xs(e),r=Xs(t),i=Zs(e),a=Zs(t);return{...n?{sourceSelector:n}:{},...r?{destinationSelector:r}:{},...i?{sourceTarget:i}:{},...a?{destinationTarget:a}:{}}}function Xs(e){return`selectorChain`in e&&e.selectorChain?.length?e.selectorChain.join(` || `):void 0}function Zs(e){if(!(!(`selectorChain`in e)||!e.selectorChain?.length||!e.node||!e.preActionNodes))return{selectorChain:e.selectorChain,node:e.node,preActionNodes:e.preActionNodes}}const Qs=async(e,t)=>{if(!e.backend.scroll)throw new n(`UNSUPPORTED_OPERATION`,`scroll is not supported by this backend`);let r=ec(t.direction),i=ic(t.amount,`scroll amount`),a=oc(t.pixels,`scroll pixels`),o=c(t.durationMs);d({amount:i,pixels:a},`scroll accepts either amount or pixels, not both`);let s=await $s(e,t),l=s.kind===`viewport`?{kind:`viewport`}:{kind:`point`,point:$(s)},u=e.backend.scroll,f=async()=>await u(z(e,t),l,{direction:r.direction,...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},...o===void 0?{}:{durationMs:o}}),p,m=0;if(r.edge){let n=r.edge,i=tc(s),a=await Si({edge:n,captureState:async r=>await nc(e,t,n,i,r),scroll:f});p=a.result,m=a.passes}else p=await f(),m=1;let h=V(p),_=g(h);return{...s,direction:r.direction,...r.edge?{edge:r.edge,passes:m}:{},...i===void 0?{}:{amount:i},...a===void 0?{}:{pixels:a},..._===void 0?{}:{durationMs:_},...h?{backendResult:h}:{},...C(Ci(r.direction,r.edge,m,i,a))}};async function $s(e,t){let n=t.target??{kind:`viewport`};return n.kind===`viewport`?(await Eo(e,t,`scroll`),{kind:`viewport`}):await X(e,{...t,target:n},{action:`scroll`,requireInteractive:!1,promoteToHittableAncestor:!1})}function ec(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:rc(e,`scroll direction`)}}function tc(e){return e.kind===`viewport`?{}:{point:e.point,nodeIndex:`node`in e?e.node?.index:void 0}}function $(e){if(!e.point)throw new n(`COMMAND_FAILED`,`Interaction target resolved without coordinates`);return e.point}async function nc(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 xi({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 rc(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 ic(e,t){return e===void 0?void 0:ac(e,t)}function ac(e,t){if(!Number.isFinite(e)||e<=0)throw new n(`INVALID_ARGS`,`${t} must be a positive number`);return e}function oc(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 sc=/^e\d+$/;function cc(e){if(e[0]?.startsWith(`@`)){let t=_c(e.slice(1));return{ref:e[0],...t===void 0?{}:{label:t}}}if(sc.test(e[0]??``))throw new n(`INVALID_ARGS`,`Did you mean "@${e[0]}"? Snapshot refs need the @ prefix.`);let t=ve(e);if(t){if(t.rest.length>0)throw new n(`INVALID_ARGS`,mc(e,t));return{selector:t.selectorExpression}}return uc(e)}function lc(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?_c(e.slice(1,2)):void 0},text:n}}if(sc.test(t??``))throw new n(`INVALID_ARGS`,`Did you mean "@${t}"? Snapshot refs need the @ prefix.`);let r=ve(e,{preferTrailingValue:!0});return r?{kind:`selector`,target:{selector:r.selectorExpression},text:r.rest.join(` `)}:{kind:`point`,target:uc(e.slice(0,2)),text:e.slice(2).join(` `)}}function uc(e){let t=e[0]??``,r=fe(t);if(r){let i=dc(t)?r.value:[r.value,...e.slice(1)].join(` `).trim();throw new n(`INVALID_ARGS`,fc({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`,pc(e))}function dc(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 fc(e){let{key:t,value:n}=e;return`Unknown selector key "${t}". Supported: ${ce.join(`, `)}. ${ge(t)?`Did you mean role=${t} label=${gc(n)}?`:`Did you mean label=${gc(n)}?`}`}function pc(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=>Me(e??``))?`${n} Selector values with spaces need quotes, e.g. text="Sign in".`:`${n} To match by visible text, use text=${gc(t)} (or label=/id=/role=), or pass an @ref from snapshot.`}function mc(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${hc(e,t)??`text="Sign in"`}.`}function hc(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)}${gc(a)}`;return[...e.slice(0,n-1),o].join(` `)}function gc(e){return`"${e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}"`}function _c(e){return e.join(` `).trim()||void 0}function vc(e,t={}){let n=I(process.stderr);if(e===`pass`){let e=t.passFormat??`green`;return n?yc(`✓`,e):`✓`}return e===`fail`?n?yc(`⨯`,`red`):`⨯`:e===`warn`?n?yc(`!`,`yellow`):`!`:n?yc(`-`,`dim`):`-`}function yc(e,t){return L(e,t,{validateStream:!1})}function bc(e){return`${vc(Sc(e.status))} ${Cc(e)}`}function xc(e){return e.status!==`fail`&&e.status!==`warn`?[]:typeof e.command==`string`?[` run: ${e.command}`]:typeof e.hint==`string`?[` hint: ${e.hint}`]:[]}function Sc(e){return e===`pass`?`pass`:e===`fail`?`fail`:e===`warn`?`warn`:`skip`}function Cc(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 wc(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{G as $,wt as $t,$a as A,$t as At,Ha as B,zt as Bt,po as C,$e as Cn,or as Ct,X as D,Vt as Dt,Io as E,Zt as Et,Za as F,nn as Ft,ea as G,Ot as Gt,Ca as H,Lt as Ht,Va as I,tn as It,Zi as J,jt as Jt,$i as K,Dt as Kt,Ja as L,an as Lt,Qa as M,en as Mt,to as N,Qt as Nt,ro as O,Xt as Ot,Xa as P,Ht as Pt,Ji as Q,yt as Qt,Ba as R,on as Rt,Bo as S,Ze as Sn,er as St,Eo as T,Je as Tn,Bn as Tt,ia as U,Pt as Ut,Sa as V,Rt as Vt,J as W,It as Wt,qi as X,Et as Xt,K as Y,Tt as Yt,Ki as Z,bt as Zt,us as _,qe as _n,I as _t,lc as a,ft as an,B as at,Go as b,Ye as bn,M as bt,Ws as c,ht as cn,xi as ct,Qs as d,it as dn,L as dt,at as en,Wi as et,Is as f,C as fn,ei as ft,fs as g,tt as gn,Rr as gt,ds as h,nt as hn,zr as ht,vc as i,gt as in,V as it,eo as j,Ut as jt,io as k,Bt as kt,Gs as l,lt as ln,Ci as lt,xs as m,We as mn,Br as mt,xc as n,dt as nn,H as nt,cc as o,ut as on,z as ot,Fs as p,w as pn,$r as pt,Yi as q,Mt as qt,bc as r,pt as rn,Ri as rt,Ks as s,mt as sn,Ii as st,wc as t,ot as tn,U as tt,Us as u,_t as un,Si as ut,os as v,Ke as vn,N as vt,ao as w,Qe as wn,$n as wt,zo as x,et as xn,ir as xt,as as y,Xe as yn,P as yt,Ua as z,rn as zt};
|