agent-device 0.19.3 → 0.20.1
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 +62 -70
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.1.apk +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.1.apk.sha256 +1 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.1.manifest.json +10 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.1.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.1.apk.sha256 +1 -0
- package/{android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.3.manifest.json → android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.1.manifest.json} +6 -6
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +2 -0
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +5 -0
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +5 -10
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +74 -174
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +113 -19
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +82 -0
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +325 -123
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +2 -2
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +149 -105
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +56 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +73 -0
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +51 -26
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +2 -2
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +2 -107
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +130 -13
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +51 -8
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +24 -0
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +1 -1
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +43 -35
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +1 -1
- package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +16 -1
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +3 -0
- package/dist/src/android-adb.d.ts +1 -1
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-method-overlays.js +1 -0
- package/dist/src/android-input-ownership.js +1 -6
- package/dist/src/android-system-chrome.js +1 -0
- package/dist/src/android.js +1 -1
- package/dist/src/app-lifecycle.js +5 -5
- package/dist/src/app-log-request-scope.js +1 -0
- package/dist/src/app-resolution.js +1 -0
- package/dist/src/apple-multitouch-support.js +1 -0
- package/dist/src/apps.js +5 -5
- package/dist/src/boot-diagnostics.js +2 -0
- package/dist/src/cli-config.js +1 -0
- package/dist/src/cli-help.js +131 -40
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +15 -11
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-schema.js +3 -3
- package/dist/src/compatibility-policy.js +1 -0
- package/dist/src/context.js +1 -0
- package/dist/src/contracts.d.ts +2 -2
- package/dist/src/debug-symbols.js +1 -1
- package/dist/src/device-input-state.js +1 -1
- package/dist/src/devices2.js +1 -1
- package/dist/src/devices4.js +1 -0
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/helper.js +1 -1
- package/dist/src/index.d.ts +533 -279
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +4 -3
- package/dist/src/install-artifact.js +1 -0
- package/dist/src/install-source.d.ts +5 -1
- package/dist/src/install-source.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-snapshot.js +1 -1
- package/dist/src/interaction.d.ts +230 -0
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +2 -2
- package/dist/src/interactor2.js +1 -0
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +42 -20
- package/dist/src/internal/png-worker.d.ts +22 -0
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/launch-console.js +1 -0
- package/dist/src/lease-context.js +1 -0
- package/dist/src/lease.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/logcat.js +5 -0
- package/dist/src/method-scope.js +1 -0
- package/dist/src/metro-types.d.ts +52 -0
- package/dist/src/metro.d.ts +3 -3
- package/dist/src/notifications.js +1 -1
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/process-lock.js +1 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/recording-export-quality.js +15 -0
- package/dist/src/register-builtins.js +1 -0
- package/dist/src/registry.js +24 -24
- package/dist/src/remote-config.d.ts +1 -1
- package/dist/src/reporting.js +8 -7
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +2 -0
- package/dist/src/runner-lease.js +1 -0
- package/dist/src/runner-provider.js +1 -1
- package/dist/src/runner-sequence.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime2.js +1 -0
- package/dist/src/sdk-android-adb.d.ts +97 -33
- package/dist/src/sdk-android-adb.js +4 -4
- package/dist/src/sdk-batch-runner.d.ts +2 -1
- package/dist/src/sdk-batch-runner.js +3 -2
- package/dist/src/sdk-contracts.d.ts +70 -149
- package/dist/src/sdk-contracts.js +1 -1
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.d.ts +5 -4
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.d.ts +1 -1
- package/dist/src/sdk-remote-config.d.ts +19 -96
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selector-vocabulary.js +1 -0
- package/dist/src/selectors.d.ts +12 -3
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +3 -3
- package/dist/src/session-target-evidence.js +1 -0
- package/dist/src/session.js +8 -10
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-diagnostics.js +5 -2
- package/dist/src/snapshot-quality.js +1 -1
- package/dist/src/snapshot.js +1 -1
- package/dist/src/snapshot2.js +1 -2
- package/dist/src/tool-provider3.js +1 -0
- package/dist/src/unsupported-interactor.js +1 -0
- package/dist/src/url.js +1 -1
- package/dist/src/web.js +1 -1
- package/package.json +34 -27
- package/server.json +2 -2
- package/skills/agent-device/SKILL.md +5 -3
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.3.apk +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.3.apk.sha256 +0 -1
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.3.manifest.json +0 -10
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.3.apk +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.3.apk.sha256 +0 -1
- package/dist/src/apple-runner-options.js +0 -1
- package/dist/src/cli-output.js +0 -1
- package/dist/src/client.js +0 -3
- package/dist/src/handler-utils.js +0 -1
- package/dist/src/output-path.js +0 -1
- package/dist/src/points.js +0 -4
- package/dist/src/provider.js +0 -1
- package/dist/src/providers.js +0 -1
- package/dist/src/record-trace-recording.js +0 -23
- package/dist/src/recording-provider.js +0 -1
- package/dist/src/sdk-batch.js +0 -2
- package/dist/src/selectors2.js +0 -1
- package/dist/src/ttl-memo.js +0 -1
- package/dist/src/tv-remote.js +0 -14
- package/dist/src/xml.js +0 -2
- /package/{macos-helper → apple/macos-helper}/Package.swift +0 -0
- /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +0 -0
- /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +0 -0
- /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/main.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
- /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
- /package/{src/platforms/linux → linux}/atspi-dump.py +0 -0
|
@@ -1,88 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
//#region src/
|
|
3
|
-
type CompanionTunnelScope = {
|
|
4
|
-
tenantId: string;
|
|
5
|
-
runId: string;
|
|
6
|
-
leaseId: string;
|
|
7
|
-
};
|
|
8
|
-
type MetroBridgeScope = CompanionTunnelScope;
|
|
9
|
-
//#endregion
|
|
10
|
-
//#region src/metro/metro-types.d.ts
|
|
11
|
-
/** Re-export of {@link SessionRuntimeHints} under the Metro-specific alias used by public API consumers. */
|
|
12
|
-
type MetroRuntimeHints = SessionRuntimeHints;
|
|
13
|
-
type MetroBridgeResult = {
|
|
14
|
-
enabled: boolean;
|
|
15
|
-
baseUrl: string;
|
|
16
|
-
statusUrl: string;
|
|
17
|
-
bundleUrl: string;
|
|
18
|
-
iosRuntime: MetroRuntimeHints;
|
|
19
|
-
androidRuntime: MetroRuntimeHints;
|
|
20
|
-
upstream: {
|
|
21
|
-
bundleUrl: string;
|
|
22
|
-
host: string;
|
|
23
|
-
port: number;
|
|
24
|
-
statusUrl: string;
|
|
25
|
-
};
|
|
26
|
-
probe: {
|
|
27
|
-
reachable: boolean;
|
|
28
|
-
statusCode: number;
|
|
29
|
-
latencyMs: number;
|
|
30
|
-
detail: string;
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
|
-
type MetroBridgeRuntimePayload = {
|
|
34
|
-
metro_host?: string;
|
|
35
|
-
metro_port?: number;
|
|
36
|
-
metro_bundle_url?: string;
|
|
37
|
-
launch_url?: string;
|
|
38
|
-
};
|
|
39
|
-
type MetroBridgeDescriptor = {
|
|
40
|
-
enabled: boolean;
|
|
41
|
-
base_url: string;
|
|
42
|
-
status_url?: string;
|
|
43
|
-
bundle_url?: string;
|
|
44
|
-
ios_runtime: MetroBridgeRuntimePayload;
|
|
45
|
-
android_runtime: MetroBridgeRuntimePayload;
|
|
46
|
-
upstream: {
|
|
47
|
-
bundle_url?: string;
|
|
48
|
-
host?: string;
|
|
49
|
-
port?: number;
|
|
50
|
-
status_url?: string;
|
|
51
|
-
};
|
|
52
|
-
probe: {
|
|
53
|
-
reachable: boolean;
|
|
54
|
-
status_code: number;
|
|
55
|
-
latency_ms: number;
|
|
56
|
-
detail: string;
|
|
57
|
-
};
|
|
58
|
-
};
|
|
59
|
-
//#endregion
|
|
60
|
-
//#region src/metro/client-metro.d.ts
|
|
1
|
+
import { I as DeviceTarget, R as PlatformSelector, _ as SessionIsolationMode, l as DaemonServerMode, p as LeaseBackend, u as DaemonTransportPreference } from "./sdk-contracts.js";
|
|
2
|
+
//#region src/contracts/metro.d.ts
|
|
61
3
|
type MetroPrepareKind = 'auto' | 'react-native' | 'expo' | 'repack';
|
|
62
|
-
type ResolvedMetroKind = Exclude<MetroPrepareKind, 'auto'>;
|
|
63
|
-
type PrepareMetroRuntimeResult = {
|
|
64
|
-
projectRoot: string;
|
|
65
|
-
kind: ResolvedMetroKind;
|
|
66
|
-
dependenciesInstalled: boolean;
|
|
67
|
-
packageManager: string | null;
|
|
68
|
-
started: boolean;
|
|
69
|
-
reused: boolean;
|
|
70
|
-
pid: number;
|
|
71
|
-
logPath: string;
|
|
72
|
-
statusUrl: string;
|
|
73
|
-
runtimeFilePath: string | null;
|
|
74
|
-
iosRuntime: MetroRuntimeHints;
|
|
75
|
-
androidRuntime: MetroRuntimeHints;
|
|
76
|
-
bridge: MetroBridgeResult | null;
|
|
77
|
-
};
|
|
78
|
-
type ReloadMetroResult = {
|
|
79
|
-
reloaded: true;
|
|
80
|
-
reloadUrl: string;
|
|
81
|
-
status: number;
|
|
82
|
-
body: string;
|
|
83
|
-
};
|
|
84
4
|
//#endregion
|
|
85
|
-
//#region src/
|
|
5
|
+
//#region src/contracts/remote-config-fields.d.ts
|
|
6
|
+
type CloudProviderProfileFields = {
|
|
7
|
+
providerApp?: string;
|
|
8
|
+
providerOsVersion?: string;
|
|
9
|
+
providerProject?: string;
|
|
10
|
+
providerBuild?: string;
|
|
11
|
+
providerSessionName?: string;
|
|
12
|
+
awsProjectArn?: string;
|
|
13
|
+
awsDeviceArn?: string;
|
|
14
|
+
awsAppArn?: string;
|
|
15
|
+
awsRegion?: string;
|
|
16
|
+
awsInteractionMode?: 'INTERACTIVE' | 'NO_VIDEO' | 'VIDEO_ONLY';
|
|
17
|
+
};
|
|
86
18
|
type RemoteConfigMetroOptions = {
|
|
87
19
|
metroProjectRoot?: string;
|
|
88
20
|
metroKind?: MetroPrepareKind;
|
|
@@ -97,7 +29,10 @@ type RemoteConfigMetroOptions = {
|
|
|
97
29
|
metroRuntimeFile?: string;
|
|
98
30
|
metroNoReuseExisting?: boolean;
|
|
99
31
|
metroNoInstallDeps?: boolean;
|
|
32
|
+
launchUrl?: string;
|
|
100
33
|
};
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/remote/remote-config-schema.d.ts
|
|
101
36
|
type RemoteConnectionProfileFields = {
|
|
102
37
|
stateDir?: string;
|
|
103
38
|
daemonBaseUrl?: string;
|
|
@@ -113,18 +48,6 @@ type RemoteConnectionProfileFields = {
|
|
|
113
48
|
deviceKey?: string;
|
|
114
49
|
clientId?: string;
|
|
115
50
|
};
|
|
116
|
-
type CloudProviderProfileFields = {
|
|
117
|
-
providerApp?: string;
|
|
118
|
-
providerOsVersion?: string;
|
|
119
|
-
providerProject?: string;
|
|
120
|
-
providerBuild?: string;
|
|
121
|
-
providerSessionName?: string;
|
|
122
|
-
awsProjectArn?: string;
|
|
123
|
-
awsDeviceArn?: string;
|
|
124
|
-
awsAppArn?: string;
|
|
125
|
-
awsRegion?: string;
|
|
126
|
-
awsInteractionMode?: 'INTERACTIVE' | 'NO_VIDEO' | 'VIDEO_ONLY';
|
|
127
|
-
};
|
|
128
51
|
type RemoteConfigProfile = RemoteConfigMetroOptions & CloudProviderProfileFields & RemoteConnectionProfileFields & {
|
|
129
52
|
platform?: PlatformSelector;
|
|
130
53
|
target?: DeviceTarget;
|
|
@@ -136,4 +59,4 @@ type RemoteConfigProfile = RemoteConfigMetroOptions & CloudProviderProfileFields
|
|
|
136
59
|
session?: string;
|
|
137
60
|
};
|
|
138
61
|
//#endregion
|
|
139
|
-
export {
|
|
62
|
+
export { MetroPrepareKind as i, RemoteConnectionProfileFields as n, CloudProviderProfileFields as r, RemoteConfigProfile as t };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{E as e}from"./sdk-android-adb.js";import{
|
|
1
|
+
import{E as e}from"./sdk-android-adb.js";import{n as t}from"./sdk-device.js";const n=[{key:`stateDir`,type:`string`,path:!0},{key:`daemonBaseUrl`,type:`string`},{key:`daemonAuthToken`,type:`string`},{key:`daemonTransport`,type:`enum`,enumValues:[`auto`,`socket`,`http`]},{key:`daemonServerMode`,type:`enum`,enumValues:[`socket`,`http`,`dual`]},{key:`tenant`,type:`string`},{key:`sessionIsolation`,type:`enum`,enumValues:[`none`,`tenant`]},{key:`runId`,type:`string`},{key:`leaseId`,type:`string`},{key:`leaseBackend`,type:`enum`,enumValues:[`ios-simulator`,`ios-instance`,`android-instance`]},{key:`platform`,type:`enum`,enumValues:t},{key:`target`,type:`enum`,enumValues:[`mobile`,`tv`,`desktop`]},{key:`device`,type:`string`},{key:`udid`,type:`string`},{key:`serial`,type:`string`},{key:`iosSimulatorDeviceSet`,type:`string`,path:!0,env:!1},{key:`androidDeviceAllowlist`,type:`string`},{key:`session`,type:`string`},{key:`providerApp`,type:`string`},{key:`providerOsVersion`,type:`string`},{key:`providerProject`,type:`string`},{key:`providerBuild`,type:`string`},{key:`providerSessionName`,type:`string`},{key:`awsProjectArn`,type:`string`},{key:`awsDeviceArn`,type:`string`},{key:`awsAppArn`,type:`string`},{key:`awsRegion`,type:`string`},{key:`awsInteractionMode`,type:`enum`,enumValues:[`INTERACTIVE`,`NO_VIDEO`,`VIDEO_ONLY`]},{key:`metroProjectRoot`,type:`string`,path:!0},{key:`metroKind`,type:`enum`,enumValues:[`auto`,`react-native`,`expo`,`repack`]},{key:`metroPublicBaseUrl`,type:`string`},{key:`metroProxyBaseUrl`,type:`string`},{key:`metroBearerToken`,type:`string`},{key:`metroPreparePort`,type:`int`,min:1,max:65535},{key:`metroListenHost`,type:`string`},{key:`metroStatusHost`,type:`string`},{key:`metroStartupTimeoutMs`,type:`int`,min:1},{key:`metroProbeTimeoutMs`,type:`int`,min:1},{key:`metroRuntimeFile`,type:`string`,path:!0},{key:`metroNoReuseExisting`,type:`boolean`},{key:`metroNoInstallDeps`,type:`boolean`},{key:`launchUrl`,type:`string`}],r=[{key:`leaseProvider`,type:`string`,env:!1},{key:`deviceKey`,type:`string`,env:!1},{key:`clientId`,type:`string`,env:!1}],i=[...n,...r],a=new Map(i.map(e=>[e.key,e]));function o(e){return a.get(e)}function s(t){return o(t)?.env===!1?[]:[e(t)]}export{o as i,i as n,s as r,n as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as e}from"./sdk-contracts.js";import{T as t,w as n}from"./sdk-batch.js";function r(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r[r.length-1]?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function i(e){return new Map(e.map(e=>[e.index,e]))}function a(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function o(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function s(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=c(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function c(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function l(e){let t=m(e.label),n=m(e.value),r=m(e.identifier),i=ee(r)?r:``;return g(e.type??``)?n||t||i:t||n||i}function u(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=h(e.type??``),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`textview`)||n.includes(`textarea`)||n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`edittext`)||r.includes(`text area`)||r.includes(`text field`)}function d(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function f(e,t){let n=l(e),r=u(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&p(n)}}function p(e){return e?e.length>80||/[\r\n]/.test(e):!1}function m(e){return typeof e==`string`?e.trim():``}function h(e){let t=e.trim().replace(/XCUIElementType/gi,``).replace(/^AX/,``).toLowerCase(),n=Math.max(t.lastIndexOf(`.`),t.lastIndexOf(`/`));return n!==-1&&(t=t.slice(n+1)),t}function g(e){let t=h(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function ee(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}function _(t,n){let r=e(n),i=t.filter(e=>te(e.rect)),a=i.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)});return b(a.map(e=>e.rect).filter(e=>y(e,r.x,r.y)))||b(a.map(e=>e.rect))||b(i.map(e=>e.rect).filter(e=>y(e,r.x,r.y)))||null}function v(e,t){return x(e.x,e.x+e.width,t.x,t.x+t.width)&&x(e.y,e.y+e.height,t.y,t.y+t.height)}function te(e){return e?Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height):!1}function y(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function b(e){let t=null,n=-1;for(let r of e){let e=r.width*r.height;e>n&&(t=r,n=e)}return t}function x(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function S(e){let t=`${e??``}`.toLowerCase();return t.includes(`scroll`)||t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)||t.includes(`collectionview`)||t===`table`}function C(e){return S(e.type)?!0:`${e.role??``} ${e.subrole??``}`.toLowerCase().includes(`scroll`)}function w(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=E(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>oe(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:se(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&le(e)),e,t)}}function T(e){if(e.length===0)return new Map;let{hintedContainers:t}=E(e);return ae(t.directionsByContainer)}function E(e){let t=i(e),n=new Set,r=[];for(let i of e){if(D(i,e,t)){A(i,n,t);continue}r.push(i)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:ie(e,r,n,t)}}function D(e,t,n=i(t)){if(!e.rect)return!0;let r=O(e,t,n);return r?v(e.rect,r):!0}function ne(e,t,n=i(t)){if(!e.rect)return!0;if(!D(e,t,n))return!1;let r=_(t,e.rect);return re(e.rect,r)}function re(e,t){return!t||t.width<=0||t.height<=0?!0:y(t,e.x+e.width/2,e.y+e.height/2)}function O(e,t,n=i(t)){return P(e,n)||_(t,e.rect??{x:0,y:0,width:0,height:0})}function ie(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=j(e,n,r);if(!t?.rect)continue;let s=k(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return M(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function ae(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function oe(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function se(e,t,n){let r=new Map;for(let i of e){let e=ce(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=ue(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function ce(e,t,n){if(!e.rect)return null;let r=O(e,t,n);return r?k(e.rect,r):null}function k(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function le(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!a(e)}function ue(e){let t=new Set,n=[];for(let r of e){let e=a(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function A(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function j(e,t,n){return F(e,n,e=>t.has(e.index))}function M(e,t,n,r,i){for(let a of e){let e=N(a);if(!e||e.size===0)continue;let o=j(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function N(e){let t=s(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function P(e,t){return F(e,t,e=>!!e.rect)?.rect??null}function F(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(i.add(r.index),n(r)&&C(r))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function I(e,t){let n=t.toLowerCase();return e.find(e=>{let t=(e.label??``).toLowerCase(),r=(e.value??``).toLowerCase(),i=(e.identifier??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)})??null}function L(e,t){let n=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);return n&&R(n)?n:z(e,t)??(n&&R(n)?n:void 0)}function R(e){let t=e.trim();return!(!t||/^(true|false)$/i.test(t)||/^\d+$/.test(t))}function z(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);if(!t||!R(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function B(e){let t=[],n=[];for(let r of e){let e=r.depth??0;for(;t.length>0&&e<=t[t.length-1];)t.pop();let i=h(r.type??``),a=[r.label,r.value,r.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0),o=a?R(a):!1;if((i===`group`||i===`ioscontentgroup`)&&!o){t.push(e);continue}let s=Math.max(0,e-t.length);n.push({...r,depth:s})}return n}function V(e,t){let n=h(e);return n?t===`android`?n.includes(`edittext`)||n.includes(`autocompletetextview`):n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`textview`)||n.includes(`textarea`)||n===`search`:!0}function H(e,t){return t.hittable?t:G(e,t,e=>e.hittable===!0)}function U(e){return new Map(e.map(e=>[e.index,e]))}function W(e,t,n,r){let i=t,a=new Set;for(;typeof i.parentIndex==`number`&&!a.has(i.index);){if(a.add(i.index),i=n.get(i.parentIndex)??e[i.parentIndex],!i)return null;let t=r(i);if(t!==null)return t}return null}function de(e,t,n,r){return!!W(e,t,r,e=>e===n||e.index===n.index?e:null)}function G(e,t,n){return W(e,t,U(e),e=>n(e)?e:null)}function K(e){return[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0)[0]??``}function fe(e){return l(e)}function q(e){return e.hittable===!0?!0:e.rect?e.rect.width>0&&e.rect.height>0:!1}function J(e,t){return V(e.type??``,t)&&e.enabled!==!1}function Y(e){return[`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`].includes(e)}const pe=`is requires predicate: visible|hidden|exists|editable|selected|focused|text`,me=`Use "is <predicate> <selector>" or "is <selector> <predicate>". visible|hidden|editable|selected|focused double as selector keys: a bare predicate token after the selector is read as the predicate, so write key=true (e.g. visible=true) inside the selector to use it as a filter instead.`;function X(e){if(Y((e[0]??``).toLowerCase()))return e;for(let n=1;n<e.length;n+=1){let r=(e[n]??``).toLowerCase();if(Y(r)&&t(e.slice(0,n).join(` `)))return[r,...e.slice(0,n),...e.slice(n+1)]}return e}function he(e){let{predicate:t,node:n,nodes:r,expectedText:i,platform:a}=e,o=K(n),s=J(n,a),c=n.selected===!0,l=n.focused===!0,u=t===`text`?q(n):Z(n,r,a),d=!1;switch(t){case`visible`:d=u;break;case`hidden`:d=!u;break;case`editable`:d=s;break;case`selected`:d=c;break;case`focused`:d=l;break;case`text`:d=o===(i??``);break}let f=t===`text`?`expected="${i??``}" actual="${o}"`:`actual=${JSON.stringify({visible:u,editable:s,selected:c,focused:l})}`;return{pass:d,actualText:o,details:f}}function Z(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if($(e.rect))return Q(e,t);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=ge(e,t,n);return r?$(r.rect)?Q(r,t):n!==`android`&&r.hittable===!0:!1}function Q(e,t){return D(e,t)}function ge(e,t,n){return W(t,e,U(t),e=>_e(e,n)?e:null)}function _e(e,t){if(t===`android`&&e.visibleToUser===!1)return!1;let n=h(e.type??``);return n.includes(`application`)||n.includes(`window`)||n.includes(`scrollview`)||n.includes(`tableview`)||n.includes(`collectionview`)||n===`table`||n===`list`||n===`listview`?!1:t===`android`?e.hittable===!0&&$(e.rect):e.hittable===!0||$(e.rect)}function $(e){return!!(e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0)}function ve(e){let t=X(e),r=t[0]??``;return{predicate:r,split:n(t.slice(1),{preferTrailingValue:r===`text`})}}export{d as A,r as B,ne as C,y as D,S as E,m as F,s as I,o as L,l as M,h as N,b as O,g as P,i as R,D as S,C as T,V as _,Y as a,w as b,q as c,K as d,G as f,de as g,W as h,he as i,f as j,_ as k,U as l,I as m,pe as n,X as o,H as p,me as r,J as s,ve as t,fe as u,B as v,O as w,T as x,L as y,a as z};
|
|
1
|
+
import{_ as e,u as t}from"./sdk-contracts.js";import{$ as n,G as r,et as i}from"./sdk-batch-runner.js";const a=/^#\s*agent-device:target-v(\d+)(?:\s+(.*))?$/,o=4096;function s(e){return e.normalize(`NFC`)}function c(e){if(e===void 0)return;let t=s(e);return t.length>0?t:void 0}function l(e){return s(e)}function u(e){if(e===void 0)return;let t=s(e).trim().replace(/\s+/g,` `);return t.length>0?t:void 0}function d(e){return Buffer.byteLength(e,`utf8`)}function f(e,t){if(d(e)<=t)return e;let n=e.length;for(;n>0&&d(e.slice(0,n))>t;)--n;if(n>0){let t=e.charCodeAt(n-1);t>=55296&&t<=56319&&--n}return e.slice(0,n)}function p(e){let t={};return e.id!==void 0&&(t.id=e.id),t.role=e.role,e.label!==void 0&&(t.label=e.label),t.ancestry=e.ancestry.map(ee),t.sibling=e.sibling,t.viewportOrder=e.viewportOrder,e.scrollRegion&&(t.scrollRegion=te(e.scrollRegion)),e.rect&&(t.rect=ne(e.rect)),t.verification=e.verification,t}function ee(e){let t={role:e.role};return e.label!==void 0&&(t.label=e.label),t}function te(e){let t={role:e.role};return e.id!==void 0&&(t.id=e.id),e.label!==void 0&&(t.label=e.label),t}function ne(e){return{x:e.x,y:e.y,width:e.width,height:e.height}}function m(e){return JSON.stringify(p(e))}function re(e){return`# agent-device:target-v1 ${m(e)}`}function ie(e){let t=e.trim();if(!t.startsWith(`#`))return{kind:`none`};let n=a.exec(t);return n?Number(n[1])===1?{kind:`v1`,evidence:ae((n[2]??``).trim())}:{kind:`future-version`}:{kind:`none`}}function ae(t){if(d(t)>4096)throw new e(`INVALID_ARGS`,`target-v1 annotation exceeds the ${o}-byte payload cap.`);let n;try{n=JSON.parse(t)}catch{throw new e(`INVALID_ARGS`,`target-v1 annotation is not valid JSON.`)}if(typeof n!=`object`||!n||Array.isArray(n))throw new e(`INVALID_ARGS`,`target-v1 annotation must be a JSON object.`);let r=n,i=h(r.role,`role`),a=g(r.id,`id`),s=_(r.label,`label`),c=oe(r.ancestry),l=ce(r.sibling,`sibling`,0),u=ce(r.viewportOrder,`viewportOrder`,0),f=le(r.scrollRegion),p=ue(r.rect),ee=de(r.verification);return{...a===void 0?{}:{id:a},role:i,...s===void 0?{}:{label:s},ancestry:c,sibling:l,viewportOrder:u,...f?{scrollRegion:f}:{},...p?{rect:p}:{},verification:ee}}function h(t,n){if(t===void 0)throw new e(`INVALID_ARGS`,`target-v1 "${n}" is required.`);if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a string.`);return v(l(t),n)}function g(t,n){if(t===void 0)return;if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a string.`);let r=c(t);return r===void 0?void 0:v(r,n)}function _(t,n){if(t===void 0)return;if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a string.`);let r=u(t);return r===void 0?void 0:v(r,n)}function v(t,n){if(d(t)>256)throw new e(`INVALID_ARGS`,`target-v1 "${n}" exceeds the 256-byte field cap.`);return t}function oe(t){if(t===void 0)return[];if(!Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "ancestry" must be an array.`);if(t.length>8)throw new e(`INVALID_ARGS`,`target-v1 "ancestry" exceeds the 8-entry cap.`);return t.map((e,t)=>se(e,t))}function se(t,n){if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "ancestry[${n}]" must be an object.`);let r=t,i=h(r.role,`ancestry[${n}].role`),a=_(r.label,`ancestry[${n}].label`);return{role:i,...a===void 0?{}:{label:a}}}function ce(t,n,r){if(t===void 0)return r;if(typeof t!=`number`||!Number.isSafeInteger(t)||t<0)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a non-negative integer.`);return t}function le(t){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "scrollRegion" must be an object.`);let n=t,r=h(n.role,`scrollRegion.role`),i=g(n.id,`id`),a=_(n.label,`scrollRegion.label`);return{role:r,...i===void 0?{}:{id:i},...a===void 0?{}:{label:a}}}function ue(t){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "rect" must be an object.`);let n=t;return{x:y(n.x,`rect.x`),y:y(n.y,`rect.y`),width:y(n.width,`rect.width`),height:y(n.height,`rect.height`)}}function y(t,n){if(typeof t!=`number`||!Number.isFinite(t))throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a finite number.`);return t}function de(t){if(t===`verified`||t===`unverifiable`)return t;throw new e(`INVALID_ARGS`,`target-v1 "verification" must be "verified" or "unverifiable".`)}function fe(e){return{...e.id===void 0?{}:{id:e.id},role:e.role,...e.label===void 0?{}:{label:e.label}}}function pe(e,t){return t.id===void 0?e.role===t.role&&e.label===t.label:e.id===t.id}function me(e,t){if(e.length<t.length)return!1;for(let[n,r]of t.entries()){let t=e[n];if(!t||t.role!==r.role||r.label!==void 0&&t.label!==r.label)return!1}return!0}function he(e){return e.matchedRefs.length===0?{path:2,outcome:`unverifiable`,reason:`selector-miss`}:e.identitySetRefs.length===0?{path:3,outcome:`unverifiable`,reason:`identity-set-empty`}:e.identitySetRefs.length===1?e.identitySetRefs[0]===e.winnerRef?{path:4,outcome:`verified`}:{path:5,outcome:`unverifiable`,reason:`unique-but-wrong`}:e.siblingMatchRefs.length===1?e.siblingMatchRefs[0]===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:e.regionMemberRefs!==void 0&&e.regionMemberRefs.length>0&&e.viewportCandidateRef!==void 0?e.viewportCandidateRef===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:{path:6,outcome:`unverifiable`,reason:`no-signal-isolation`}}function ge(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r[r.length-1]?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function b(e){return new Map(e.map(e=>[e.index,e]))}function x(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function _e(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function ve(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=ye(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function ye(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function S(e){let t=C(e.label),n=C(e.value),r=C(e.identifier),i=Te(r)?r:``;return we(e.type??``)?n||t||i:t||n||i}function be(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=w(e.type??``),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`textview`)||n.includes(`textarea`)||n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`edittext`)||r.includes(`text area`)||r.includes(`text field`)}function xe(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function Se(e,t){let n=S(e),r=be(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&Ce(n)}}function Ce(e){return e?e.length>80||/[\r\n]/.test(e):!1}function C(e){return typeof e==`string`?e.trim():``}function w(e){let t=e.trim().replace(/XCUIElementType/gi,``).replace(/^AX/,``).toLowerCase(),n=Math.max(t.lastIndexOf(`.`),t.lastIndexOf(`/`));return n!==-1&&(t=t.slice(n+1)),t}function we(e){let t=w(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function Te(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}function T(e,n){let r=t(n),i=e.filter(e=>Ee(e.rect)),a=i.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)});return O(a.map(e=>e.rect).filter(e=>D(e,r.x,r.y)))||O(a.map(e=>e.rect))||O(i.map(e=>e.rect).filter(e=>D(e,r.x,r.y)))||null}function E(e,t){return k(e.x,e.x+e.width,t.x,t.x+t.width)&&k(e.y,e.y+e.height,t.y,t.y+t.height)}function Ee(e){return e?Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height):!1}function D(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function O(e){let t=null,n=-1;for(let r of e){let e=r.width*r.height;e>n&&(t=r,n=e)}return t}function k(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function A(e){let t=`${e??``}`.toLowerCase();return t.includes(`scroll`)||t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)||t.includes(`collectionview`)||t===`table`}function j(e){return A(e.type)?!0:`${e.role??``} ${e.subrole??``}`.toLowerCase().includes(`scroll`)}function De(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=M(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>Me(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:Ne(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&Ie(e)),e,t)}}function Oe(e){if(e.length===0)return new Map;let{hintedContainers:t}=M(e);return je(t.directionsByContainer)}function M(e){let t=b(e),n=new Set,r=[];for(let i of e){if(N(i,e,t)){Re(i,n,t);continue}r.push(i)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:Ae(e,r,n,t)}}function N(e,t,n=b(t)){if(!e.rect)return!0;let r=I(e,t,n);return r?E(e.rect,r):!0}function P(e,t,n=b(t)){if(!e.rect)return!0;if(!N(e,t,n))return!1;let r=T(t,e.rect);return F(e.rect,r)}function F(e,t){return!t||t.width<=0||t.height<=0?!0:D(t,e.x+e.width/2,e.y+e.height/2)}function I(e,t,n=b(t)){return He(e,n)||T(t,e.rect??{x:0,y:0,width:0,height:0})}function ke(e,t,n=b(t)){if(!e.rect)return null;let r=I(e,t,n);if(r&&!E(e.rect,r)){let t=L(e.rect,r);if(t)return t}let i=T(t,e.rect);if(i&&!F(e.rect,i)){let t=L(e.rect,i);if(t)return t}return null}function L(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function Ae(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=ze(e,n,r);if(!t?.rect)continue;let s=Fe(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return Be(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function je(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function Me(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function Ne(e,t,n){let r=new Map;for(let i of e){let e=Pe(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=Le(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function Pe(e,t,n){if(!e.rect)return null;let r=I(e,t,n);return r?Fe(e.rect,r):null}function Fe(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function Ie(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!x(e)}function Le(e){let t=new Set,n=[];for(let r of e){let e=x(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function Re(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function ze(e,t,n){return Ue(e,n,e=>t.has(e.index))}function Be(e,t,n,r,i){for(let a of e){let e=Ve(a);if(!e||e.size===0)continue;let o=ze(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function Ve(e){let t=ve(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function He(e,t){return Ue(e,t,e=>!!e.rect)?.rect??null}function Ue(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(i.add(r.index),n(r)&&j(r))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function R(e,t){return{ok:!1,code:`INVALID_ARGS`,message:e,...t?{hint:t}:{}}}function z(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite)&&e.width>0&&e.height>0)}function We(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}function Ge(e){return e.width*e.height}function Ke(e,t){let n=t.toLowerCase();return e.find(e=>{let t=(e.label??``).toLowerCase(),r=(e.value??``).toLowerCase(),i=(e.identifier??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)})??null}function qe(e,t){let n=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);return n&&B(n)?n:Je(e,t)??(n&&B(n)?n:void 0)}function B(e){let t=e.trim();return!(!t||/^(true|false)$/i.test(t)||/^\d+$/.test(t))}function Je(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);if(!t||!B(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function Ye(e){let t=[],n=[];for(let r of e){let e=r.depth??0;for(;t.length>0&&e<=t[t.length-1];)t.pop();let i=w(r.type??``),a=[r.label,r.value,r.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0),o=a?B(a):!1;if((i===`group`||i===`ioscontentgroup`)&&!o){t.push(e);continue}let s=Math.max(0,e-t.length);n.push({...r,depth:s})}return n}function V(e,t){let n=w(e);return n?t===`android`?n.includes(`edittext`)||n.includes(`autocompletetextview`):n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`textview`)||n.includes(`textarea`)||n===`search`:!0}function Xe(e,t){return t.hittable?t:W(e,t,e=>e.hittable===!0)}function H(e){return new Map(e.map(e=>[e.index,e]))}function U(e,t,n,r){let i=t,a=new Set;for(;typeof i.parentIndex==`number`&&!a.has(i.index);){if(a.add(i.index),i=n.get(i.parentIndex)??e[i.parentIndex],!i)return null;let t=r(i);if(t!==null)return t}return null}function Ze(e,t,n,r){return!!U(e,t,r,e=>e===n||e.index===n.index?e:null)}function W(e,t,n){return U(e,t,H(e),e=>n(e)?e:null)}function G(e){return[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0)[0]??``}function Qe(e){return S(e)}function K(e){return e.hittable===!0?!0:e.rect?e.rect.width>0&&e.rect.height>0:!1}function q(e,t){return V(e.type??``,t)&&e.enabled!==!1}function J(e){return[`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`].includes(e)}function $e(e){let t=e.toLowerCase();return J(t)?{ok:!0,predicate:t}:R(`is requires predicate: visible|hidden|exists|editable|selected|focused|text`,et)}const et=`Use "is <predicate> <selector>" or "is <selector> <predicate>". visible|hidden|editable|selected|focused double as selector keys: a bare predicate token after the selector is read as the predicate, so write key=true (e.g. visible=true) inside the selector to use it as a filter instead.`;function tt(e){if(J((e[0]??``).toLowerCase()))return e;for(let t=1;t<e.length;t+=1){let n=(e[t]??``).toLowerCase();if(J(n)&&i(e.slice(0,t).join(` `)))return[n,...e.slice(0,t),...e.slice(t+1)]}return e}function nt(e){let{predicate:t,node:n,nodes:r,expectedText:i,platform:a}=e,o=G(n),s=q(n,a),c=n.selected===!0,l=n.focused===!0,u=t===`text`?K(n):rt(n,r,a),d=!1;switch(t){case`visible`:d=u;break;case`hidden`:d=!u;break;case`editable`:d=s;break;case`selected`:d=c;break;case`focused`:d=l;break;case`text`:d=o===(i??``);break}let f=t===`text`?`expected="${i??``}" actual="${o}"`:`actual=${JSON.stringify({visible:u,editable:s,selected:c,focused:l})}`;return{pass:d,actualText:o,details:f}}function rt(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(z(e.rect))return it(e,t);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=at(e,t,n);return r?z(r.rect)?it(r,t):n!==`android`&&r.hittable===!0:!1}function it(e,t){return N(e,t)}function at(e,t,n){return U(t,e,H(t),e=>ot(e,n)?e:null)}function ot(e,t){if(t===`android`&&e.visibleToUser===!1)return!1;let n=w(e.type??``);return n.includes(`application`)||n.includes(`window`)||n.includes(`scrollview`)||n.includes(`tableview`)||n.includes(`collectionview`)||n===`table`||n===`list`||n===`listview`?!1:t===`android`?e.hittable===!0&&z(e.rect):e.hittable===!0||z(e.rect)}function st(e){let t=tt(e),r=t[0]??``;return{predicate:r,split:n(t.slice(1),{preferTrailingValue:r===`text`})}}const ct=`is requires a selector expression`,lt=`is text requires expected text value`;function ut(e){let{predicate:t,split:n}=st([...e]),r=$e(t);if(!r.ok)return r;if(!n)return R(ct);let i=n.rest.join(` `).trim();return r.predicate===`text`&&!i?R(lt):r.predicate!==`text`&&n.rest.length>0?R(`is ${r.predicate} does not accept trailing values`):{ok:!0,predicate:r.predicate,selectorExpression:n.selectorExpression,expectedText:i}}function dt(e){return e===`text`||e===`attrs`?{ok:!0,format:e}:R(`get only supports text or attrs`)}function ft(e){let t=e[0];if(t?.startsWith(`@`)){let n=e.slice(1).join(` `).trim();return{ok:!0,ref:t,...n?{label:n}:{}}}let n=e.join(` `).trim();return n?{ok:!0,selector:n}:R(`get requires @ref or selector expression`)}function pt(e){return e?{ok:!0,text:e}:R(`wait requires text`)}function Y(e,t,n){return t.terms.every(t=>mt(e,t,n))}function mt(e,t,n){switch(t.key){case`id`:return X(e.identifier,String(t.value));case`role`:return X(w(e.type??``),String(t.value));case`label`:return X(e.label,String(t.value));case`value`:return X(e.value,String(t.value));case`text`:return X(G(e),String(t.value));case`appname`:return X(e.appName,String(t.value));case`windowtitle`:return X(e.windowTitle,String(t.value));case`visible`:return K(e)===!!t.value;case`hidden`:return!K(e)==!!t.value;case`editable`:return q(e,n)===!!t.value;case`selected`:return e.selected===!0==!!t.value;case`focused`:return e.focused===!0==!!t.value;case`enabled`:return e.enabled!==!1==!!t.value;case`hittable`:return e.hittable===!0==!!t.value;default:return!1}}function X(e,t){return r(e??``)===r(t)}function ht(e,t,n){let r=n.requireRect??!1,i=n.requireUnique??!0,a=[];for(let[o,s]of t.selectors.entries()){let t=xt(e,s,n.platform,r);if(a.push({selector:s.raw,matches:t.count}),!(t.count===0||!t.firstNode)){if(i&&t.count!==1){if(!n.disambiguateAmbiguous||!t.disambiguated||!t.tiebreak)continue;return{node:t.disambiguated,selector:s,selectorIndex:o,matches:t.count,diagnostics:a,disambiguation:{matchCount:t.count,tiebreak:t.tiebreak,alternatives:t.candidates.filter(e=>e!==t.disambiguated)}}}return{node:t.firstNode,selector:s,selectorIndex:o,matches:t.count,diagnostics:a}}}return null}function gt(e,t,n){let r=n.requireRect??!1;for(let[i,a]of t.selectors.entries()){let t=e.filter(e=>r&&!e.rect?!1:Y(e,a,n.platform));if(t.length>0)return{selector:a,selectorIndex:i,matchedNodes:t}}return null}function _t(e,t,n){let r=n.requireRect??!1,i=[];for(let[a,o]of t.selectors.entries()){let t=Tt(e,o,n.platform,r);if(i.push({selector:o.raw,matches:t}),t>0)return{selectorIndex:a,selector:o,matches:t,diagnostics:i}}return null}const vt=`Snapshot refs expire when the UI changes. Run snapshot -i and retry with a fresh @ref.`;function yt(e){return e.some(e=>e.matches>1)?`Add more terms to disambiguate (e.g. role=button text="Sign in"), use an @ref from snapshot -i, or use find <text> --first/--last.`:`Selector text/label values match exactly (quote multi-word values: text="Sign in"). Run snapshot -i to see current elements and refs, or use find <text> for contains matching.`}function bt(e,t,n){if(t.length===0)return`Selector did not match: ${e.raw}`;let r=t.map(e=>`${e.selector} -> ${e.matches}`).join(`, `);return n.unique??!0?`Selector did not resolve uniquely (${r})`:`Selector did not match (${r})`}function xt(e,t,n,r){let i=0,a=null,o=[],s={best:null,bestVisible:!1,tie:!1},c,l=t=>(c??=b(e),P(t,e,c));for(let c of e)r&&!c.rect||Y(c,t,n)&&(i+=1,a??=c,o.push(c),St(s,c,l));return{count:i,firstNode:a,disambiguated:s.tie?null:s.best,tiebreak:s.tie?null:Ct(o,s.best,l),candidates:o}}function St(e,t,n){if(!e.best){e.best=t;return}e.bestVisible||=n(e.best);let r=n(t);if(r!==e.bestVisible){r&&(e.best=t,e.bestVisible=!0,e.tie=!1);return}let i=Et(t,e.best);i.result>0?(e.best=t,e.tie=!1):i.result===0&&(e.tie=!0)}function Ct(e,t,n){if(!t)return null;let r=null;for(let i of e)i!==t&&(!r||wt(i,r,n).result>0)&&(r=i);return r?wt(t,r,n).criterion:null}function wt(e,t,n){let r=n(e);return r===n(t)?Et(e,t):{result:r?1:-1,criterion:`visible`}}function Tt(e,t,n,r){let i=0;for(let a of e)r&&!a.rect||Y(a,t,n)&&(i+=1);return i}function Et(e,t){let n=e.depth??0,r=t.depth??0;if(n!==r)return{result:n>r?1:-1,criterion:`deepest`};let i=Dt(e),a=Dt(t);return i===a?{result:0,criterion:null}:{result:i<a?1:-1,criterion:`smallest-area`}}function Dt(e){return e.rect?e.rect.width*e.rect.height:1/0}function Z(e){let t=l(w(e.type??``)),n=c(e.identifier),r=u(e.label);return{...n===void 0?{}:{id:f(n,256)},role:f(t,256),...r===void 0?{}:{label:f(r,256)}}}function Ot(e,t){return e.id===t.id&&e.role===t.role&&e.label===t.label}function kt(e,t){let n=0;for(let r of e)Z(r).id===t&&(n+=1);return n}function At(e,t){if(e.id===void 0||kt(t,e.id)<=1)return e;let{role:n,label:r}=e;return{role:n,...r===void 0?{}:{label:r}}}function jt(e,t){let n=0;for(let r of e)if(r.parentIndex===t.parentIndex){if(r.index===t.index)return n;n+=1}return 0}function Mt(e,t){return{documentOrder:e.index,sibling:jt(t,e)}}function Nt(e,t){return e.documentOrder===t.documentOrder&&e.sibling===t.sibling}const Pt=`replay_target_guard_mismatch`,Ft=`wait_landmark_identity_mismatch`;function It(e,t,n={}){let r=[],i=w(e.type??``),a=Lt(e,n.nodes),o=$(e.label),s=$(e.value),c=$(G(e)),l=n.action===`fill`;a&&r.push(`id=${Q(a)}`),i&&o&&r.push(l?`role=${Q(i)} label=${Q(o)} editable=true`:`role=${Q(i)} label=${Q(o)}`),o&&r.push(l?`label=${Q(o)} editable=true`:`label=${Q(o)}`),s&&r.push(l?`value=${Q(s)} editable=true`:`value=${Q(s)}`),c&&c!==o&&c!==s&&r.push(l?`text=${Q(c)} editable=true`:`text=${Q(c)}`),i&&l&&!r.some(e=>e.includes(`editable=true`))&&r.push(`role=${Q(i)} editable=true`);let u=Rt(r);return u.length===0&&i&&u.push(l?`role=${Q(i)} editable=true`:`role=${Q(i)}`),u.length===0&&K(e)&&u.push(`visible=true`),u}function Lt(e,t){let n=$(e.identifier);if(!n||!t)return n;let r=Z(e).id;return r===void 0?n:kt(t,r)>1?null:n}function Rt(e){return Array.from(new Set(e))}function Q(e){return JSON.stringify(e)}function $(e){return e&&e.trim()||null}export{T as $,H as A,z as B,pt as C,tt as D,nt as E,Ke as F,Oe as G,We as H,Ze as I,I as J,N as K,V as L,G as M,W as N,q as O,Xe as P,O as Q,Ye as R,ut as S,$e as T,De as U,Ge as V,ke as W,A as X,j as Y,D as Z,Y as _,ie as _t,At as a,C as at,ft as b,Mt as c,b as ct,vt as d,o as dt,xe as et,_t as f,fe as ft,yt as g,pe as gt,ht as h,me as ht,Ft as i,we as it,Qe as j,K as k,jt as l,x as lt,gt as m,re as mt,$ as n,S as nt,Ot as o,ve as ot,bt as p,he as pt,P as q,Pt as r,w as rt,Z as s,_e as st,It as t,Se as tt,Nt as u,ge as ut,lt as v,m as vt,st as w,dt as x,ct as y,d as yt,qe as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{S as e,_ as t,h as n,l as r,m as i,s as a,v as o}from"./sdk-contracts.js";import{j as s}from"./sdk-android-adb.js";import{T as c,v as l}from"./sdk-batch.js";import{J as u,m as d}from"./tv-remote.js";import{N as f,P as p,a as ee,i as te,m as ne,n as re,r as ie,t as ae,u as oe}from"./sdk-selectors.js";import{c as se,m as ce,o as le,s as m}from"./sdk-device.js";import{t as ue}from"./snapshot-quality.js";import{a as de}from"./sdk-finders.js";import"./selectors2.js";import{n as fe,t as pe}from"./runtime.js";import{r as me}from"./app-lifecycle.js";import{c as he,f as ge,i as h}from"./runner-client.js";import{It as g,Lt as _,Nt as _e,Pt as ve,Wt as ye,Xt as be,an as xe,in as v,mn as y,on as b,qt as x,zt as S}from"./internal/daemon.js";import{a as C,t as w}from"./apple-runner-options.js";import{o as Se}from"./apps.js";function T(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}async function E(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:c}=e,l=oe(n),d=u(n.rect);if(!d||m(t)&&l&&!p(n.type??``))return l;try{let e=await be(t,`read`,[String(d.x),String(d.y)],void 0,{...c(r,i,a),surface:o}),u=e&&typeof e==`object`?e:void 0,f=typeof u?.text==`string`?u.text:``;return f.trim()?f:(s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),l)}catch(e){return s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`backend_read_failed`,nodeRef:n.ref,surface:o,platform:t.platform,error:e instanceof Error?e.message:String(e)}}),l}}async function D(e,t,n){let r=e.get(t),i=r?.device??await y(n??{});return r||await C(i),{session:r,device:i}}async function O(e,t,n){let r=!e&&m(t);try{return await n()}finally{r&&(await he(t.id),await Ce(t))}}async function Ce(e){let t=ge();await Se(e,t).catch(n=>{s({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function we(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function Te(e){let{session:t,sessionName:n,device:r,snapshot:i,appBundleId:a}=e;return t?{...t,snapshot:i,lastComparisonSafeSnapshot:i?.comparisonSafe===!0?i:t.lastComparisonSafeSnapshot}:{name:n,device:r,createdAt:Date.now(),appBundleId:a,snapshot:i,...i?.comparisonSafe===!0?{lastComparisonSafeSnapshot:i}:{},actions:[]}}const Ee=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function k(e,t){let n=De(t);return n.length===0?null:v(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function De(e){if(!e)return[];let t=[];for(let[n,r]of Ee)e[n]!==void 0&&t.push(r);return t}function Oe(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:v(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function ke(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function A(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:v(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function j(e,t){let n=T(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=A(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:v(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Ae(e){let t=T(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...Le(e[2])};let n=Ie(e),r=j(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function je(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=A(t);if(!n.ok)return{ok:!1,response:n.response};let r=d(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Fe(e)},refGeneration:n.generation,text:r}:{ok:!1,response:v(`INVALID_ARGS`,`fill requires text after ref`)}}let n=T(e);if(n){let t=e.slice(2).join(` `);return t?{ok:!0,target:{kind:`point`,x:n.x,y:n.y},text:t}:{ok:!1,response:v(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Me(e);return!r||r.kind!==`selector`?{ok:!1,response:v(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)}:r.text.trim()?{ok:!0,target:{kind:`selector`,selector:r.target.selector},text:r.text}:{ok:!1,response:v(`INVALID_ARGS`,`fill requires text after selector`)}}function Me(e){try{return d(e)}catch{return null}}function Ne(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:M(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n}:{evidence:t,settle:n}}function Pe(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function M(e){return e?.startsWith(`@`)?e.slice(1):e}function Fe(e){return e.length>=3&&e[1]?.trim()||``}function Ie(e){let t=e.at(-1);return e.length>1&&Re(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function Le(e){return e===void 0?{}:{durationMs:Number(e)}}function Re(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function ze(e,n){let r=await N(e);if(r)throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}async function N(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await me(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!Ue(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:He(n)}}function Be(e){return e.foregroundPackage===`com.google.android.permissioncontroller`?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ve(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function He(e){return e===`com.google.android.permissioncontroller`?`Dismiss or allow the permission prompt, then retry the smoke assertion.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Ue(e){return e===`com.android.settings`||e===`com.android.systemui`||e===`com.google.android.permissioncontroller`||e.includes(`launcher`)}function We(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function Ge(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{...typeof e.ref==`string`?{ref:e.ref}:{},...typeof e.text==`string`?{text:e.text}:{},...e.node&&typeof e.node==`object`?{node:e.node}:{}}}function P(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=R(e),i=r?.kind===`ref`?z(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:qe(s)}}function F(e){let t=R(e);return{...t?.kind===`ref`?{ref:z(t.ref)}:{},...t?.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},...e.node&&typeof e.node==`object`?{node:e.node}:{}}}function Ke(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function I(e){let{selectorChain:t,...n}=e;return n}function L(e,t,n,r){let i=e.get(t);i&&e.recordAction(i,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function qe(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function R(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function z(e){return e.startsWith(`@`)?e.slice(1):e}const Je=[`application`,`window`,`tabbar`,`scrollbar`,`image`],Ye=new Set([`tab bar`]);async function B(e,t){if(t.ok||!Xe(t.error.message)||t.error.details?.captureStalled===!0)return t;let n=await Ze(e).catch(()=>null);return n?v(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function Xe(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function Ze(e){let t=[...(await S({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(Qe),n=V(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=V(t.filter(e=>!W(e)),4,{includeIdentifiers:!1}),i=V(t.filter(et),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function V(e,t,n){let r=new Set,i=[];for(let a of e){let e=U(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function Qe(e,t){return H(e)-H(t)||$e(e,t)}function H(e){let t=!!U(e,{includeIdentifiers:!1});return(W(e)?2:0)+ +!t}function $e(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function U(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replace(/\s+/g,` `).slice(0,80):``}function W(e){let t=f(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return Je.some(e=>t.includes(e))||Ye.has(n)||n.endsWith(`.fill`)}function et(e){return f(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e){let{session:t,selectorExpression:n}=e;if(!t||!m(t.device)||t.postGestureStabilization)return null;let r=c(n);if(!r||r.selectors.length!==1)return null;let i=r.selectors[0];if(!i||i.terms.length!==1)return null;let a=i.terms[0];return!a||typeof a.value!=`string`||!tt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function tt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function K(e,t={}){let n=o(e);if(n.code===`ELEMENT_NOT_FOUND`)return t.delegateSemanticFailures===!0||t.allowElementNotFound===!0;if(n.code===`AMBIGUOUS_MATCH`)return t.delegateSemanticFailures===!0;if(n.code===`ELEMENT_OFFSCREEN`)return!0;if(n.code!==`COMMAND_FAILED`)return!1;let r=n.message.toLowerCase();return r.includes(`fetch failed`)||r.includes(`timed out`)||r.includes(`timeout`)||r.includes(`runner did not accept connection`)||r.includes(`invalid runner response`)}function nt(e,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not create temporary files`)}}}function rt(e,t={}){return{artifacts:nt(e,t),policy:fe()}}function q(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o;return{capture:async s=>{let c=Date.now(),l=pt(s,e.req.flags?.out),u=st({timestamp:c,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:s,cacheKey:l});if(u)return u;let d=ct({session:t,timestamp:c,request:s});if(d)return i=d.createdAt,a={snapshot:d},o=l,a;let f=await it({params:e,request:s}),p={snapshot:f};return ht({session:t,sessionStore:n,sessionName:r,snapshot:f}),i=c,a=p,o=l,p}}}async function it(e){let{params:t,request:n}=e,r=await J(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&>(r)?await at({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&ue(r.snapshotQuality)?await ot({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function at(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await J(t,n,r.scope,!1)}catch(e){if(!r.shouldScope)throw e;return await J(t,n,r.query,!1)}}async function ot(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await J(t,n,r.query,!1)}catch{return i}}async function J(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await S({device:e.device,session:e.session,flags:{...t.flags,snapshotInteractiveOnly:r},outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects})).snapshot}function st(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!x(a)&&!dt(a,o))return r}function ct(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&<(t,r)&&ut(i,n)&&i.presentationKey===ft(r))return i}function lt(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||x(e)||dt(e,t))}function ut(e,t){return t-e.createdAt<750}function dt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function ft(e){return r(i(mt(e)))}function pt(e,t){return JSON.stringify({presentationKey:ft(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function mt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function ht(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||ue(i.snapshotQuality)||(_(t,i),n.set(r,t))}function gt(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function _t(e){return pe({backend:vt(e),...rt(`selector commands`,{plural:!0}),sessions:_e({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(_(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}})})}async function Y(e,t){let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:xe()};let r=n?.device??await y(e.req.flags??{});n||await C(r);let i=b(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:_t({...e,session:n,device:r})}}function vt(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=q({device:r,session:n,sessionStore:o,sessionName:a,req:t,logPath:i});return{platform:ce(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...yt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,c=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await s.capture({flags:i,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await E({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>ye(i??``,e,t,n))})}),findText:async(t,n)=>({found:await bt(e,n)})}}function yt(e){let t={};return e?.interactiveOnly!==void 0&&(t.snapshotInteractiveOnly=e.interactiveOnly),e?.scope!==void 0&&(t.snapshotScope=e.scope),e?.depth!==void 0&&(t.snapshotDepth=e.depth),e?.raw!==void 0&&(t.snapshotRaw=e.raw),t}async function bt(e,t){let n=await xt(e,t);if(n!==null)return n;let r=await St(e,t);return r===null?await Tt(e,t):r}async function xt(e,t){return!se(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Tt(e,t)}async function St(e,t){let n=Ct(e);return n?(await h(n.device,{command:`findText`,text:t,appBundleId:n.appBundleId},wt(e,n)))?.found===!0:null}function Ct(e){return!le(e.device.platform)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function wt(e,t){return w({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Tt(e,t){return!!ne((await Et(e)).nodes,t)}async function Et(e){let{snapshot:t}=await q({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1},cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return t}async function Dt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=t.positionals??[];if(n.length===0)return v(`INVALID_ARGS`,`find requires a locator or text`);let r=de(n);if(!r.query)return v(`INVALID_ARGS`,`find requires a value`);if(t.flags?.findFirst&&t.flags?.findLast)return v(`INVALID_ARGS`,`find accepts only one of --first or --last`);let i=r.action;if(!Vt(i))return null;let a=await Y(e,{requireSession:!1,capability:`find`});return a.ok?await Q(async()=>{let n=await a.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:r.locator,query:r.query,action:i,timeoutMs:r.timeoutMs});L(e.sessionStore,e.sessionName,t,We(n,i));let o=Ge(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(ve(t),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}):a.response}async function Ot(e){let{req:t}=e;if(t.command!==`get`)return null;let n=t.positionals?.[0];if(n!==`text`&&n!==`attrs`)return v(`INVALID_ARGS`,`get only supports text or attrs`);let r=zt(t);if(!r.ok)return r.response;if(r.target.kind===`ref`){let e=k(`get`,t.flags);if(e)return e}if(r.target.kind===`selector`){let t=await jt(e,n,r.target.selector);if(t)return t}let i=await Y(e,{requireSession:!0,capability:`get`});if(!i.ok)return i.response;let a=r.target.kind===`ref`?g({session:e.sessionStore.get(e.sessionName),ref:r.target.ref,mintedGeneration:r.refGeneration}):void 0;return await Q(async()=>{let o=await i.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:n,target:r.target});L(e.sessionStore,e.sessionName,t,P(o,n));let s=F(o);return a?{...s,warning:a}:s})}async function kt(e){let{req:t}=e;if(t.command!==`is`)return null;let{predicate:n,split:r}=ae(t.positionals??[]),i=n.toLowerCase();if(!ee(i))return v(`INVALID_ARGS`,re,{hint:ie});if(!r)return v(`INVALID_ARGS`,`is requires a selector expression`);let a=r.rest.join(` `).trim();if(i===`text`&&!a)return v(`INVALID_ARGS`,`is text requires expected text value`);if(i!==`text`&&r.rest.length>0)return v(`INVALID_ARGS`,`is ${i} does not accept trailing values`);let o=await Mt(e,i,r.selectorExpression,a);if(o)return o;let s=await Y(e,{requireSession:!0,capability:`is`});return s.ok?await $(e,await Q(async()=>{let n=await s.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:i,selector:r.selectorExpression,expectedText:a});return L(e.sessionStore,e.sessionName,t,n),I(n)}),`is ${i}`):s.response}async function At(e){let{req:t,sessionName:n,sessionStore:r}=e,i=l(t.positionals??[]);if(!i)return v(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await D(r,n,t.flags);if(i.kind!==`sleep`){let e=b(`wait`,o);if(e)return e}if(i.kind===`selector`){let t=await Nt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let s=i,c;if(i.kind===`ref`){let e=A(i.rawRef);if(!e.ok)return e.response;s={...i,rawRef:e.ref},c=g({session:a,ref:e.ref,mintedGeneration:e.generation})}let u=async()=>{let i=_t({...e,session:a,device:o}),l=await Q(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Bt(s,a)});L(r,n,t,e);let o=Ke(e);return c?{...o,warning:c}:o});return await $(e,await B({req:t,logPath:e.logPath,session:a,device:o},l),`wait`)};return i.kind===`sleep`?await u():await O(a,o,u)}async function jt(e,t,n){let r=e.sessionStore.get(e.sessionName),i=G({session:r,selectorExpression:n});if(!r||!i||t===`text`&&i.key!==`id`)return null;let a=await X(e,r,i);if(Z(a))return a.response;if(!a)return null;let o={session:r,selector:i,result:a},s=It(t,o.selector.raw,o.result);return s?(L(e.sessionStore,e.sessionName,e.req,P(s,t)),{ok:!0,data:F(s)}):null}async function Mt(e,t,n,r){if(t===`hidden`)return null;let i=await Pt(e,n);if(Z(i))return i.response;if(!i?.result.found||!i.result.node)return null;let a=t===`exists`?{predicate:t,pass:!0,selector:i.selector.raw,matches:1,selectorChain:[i.selector.raw]}:Lt(t,r,i.selector.raw,i.session,i.result.node);return a?(L(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:I(a)}):null}async function Nt(e){let t=G({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await X(e,e.session,t);if(Z(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};L(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:I(i)};return await B({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Pt(e,t){let n=e.sessionStore.get(e.sessionName),r=G({session:n,selectorExpression:t});if(!n||!r)return null;let i=await X(e,n,r);return Z(i)?i:i?{session:n,selector:r,result:i}:null}async function Ft(e,t,n){let r=await h(t.device,{command:`querySelector`,selectorKey:n.key,selectorValue:n.value,appBundleId:t.appBundleId},w({req:e.req,logPath:e.logPath,traceLogPath:t.trace?.outPath})),i=r.found===!0,a=Rt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function X(t,n,r){try{return await Ft(t,n,r)}catch(t){return K(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Z(e){return e!==null&&`kind`in e&&e.kind===`error`}function It(e,t,n){if(!n.found||!n.node)return null;let r={target:{kind:`selector`,selector:t},node:n.node,selectorChain:[t]};return e===`attrs`?{kind:`attrs`,...r}:typeof n.text==`string`?{kind:`text`,...r,text:n.text}:null}function Lt(e,t,n,r,i){let a=te({predicate:e,node:i,nodes:[i],expectedText:t,platform:r.device.platform});return{predicate:e,pass:a.pass,selector:n,...e===`text`?{text:a.actualText}:{},selectorChain:[n]}}function Rt(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function zt(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=A(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=e.positionals?.slice(1).join(` `).trim()??``;return n?{ok:!0,target:{kind:`selector`,selector:n}}:{ok:!1,response:v(`INVALID_ARGS`,`get requires @ref or selector expression`)}}function Bt(e,n){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs};if(e.kind===`ref`){if(!n?.snapshot)throw new t(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:e.rawRef,timeoutMs:e.timeoutMs}}if(e.kind===`stable`)return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};if(!e.text)throw new t(`INVALID_ARGS`,`wait requires text`);return{kind:`text`,text:e.text,timeoutMs:e.timeoutMs}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return v(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await N(r)}catch{return t}return i?v(t.error.code,`${n} failed because ${Be(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}function Vt(e){return e===`exists`||e===`wait`||e===`get_text`||e===`get_attrs`}export{O as C,D as S,ke as _,q as a,Te as b,G as c,Pe as d,Ne as f,M as g,j as h,At as i,ze as l,Ae as m,Ot as n,rt as o,je as p,kt as r,K as s,Dt as t,Ve as u,k as v,E as w,we as x,Oe as y};
|
|
1
|
+
import{S as e,_ as t,h as n,l as r,m as i,s as a,v as o}from"./sdk-contracts.js";import{j as s}from"./sdk-android-adb.js";import{H as c,R as l,W as u,et as d}from"./sdk-batch-runner.js";import{o as f}from"./recording-export-quality.js";import{q as p}from"./snapshot-diagnostics.js";import{c as m,h as ee,o as te,s as h}from"./sdk-device.js";import{C as ne,E as re,F as ie,S as ae,b as oe,it as se,j as ce,rt as le,x as ue}from"./sdk-selectors.js";import{t as de}from"./snapshot-quality.js";import{u as fe}from"./android-input-method-overlays.js";import{a as pe}from"./android-system-chrome.js";import{i as me,n as he,t as ge}from"./runtime.js";import{r as _e}from"./app-lifecycle.js";import{W as ve}from"./runner-disposal.js";import{C as g,c as ye,g as _,l as v,n as be,s as y,t as xe}from"./context.js";import{a as b,l as Se}from"./runner-client.js";import{$t as x,Qt as S,Xt as Ce,Zt as we,g as C,hn as w,on as T,u as E}from"./internal/daemon.js";import{a as Te}from"./apps.js";import{i as Ee}from"./session-target-evidence.js";function D(e,t){let n=me(t);if(!n)return e;if(e.ok){let t=O(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:O(r.hint,n)}}}}function O(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function k(e,t,n){let r=e.get(t),i=r?.device??await _(n??{});return r||await C(i),{session:r,device:i}}async function A(e,t,n){let r=!e&&h(t);try{return await n()}finally{r&&(await Se(t.id),await De(t))}}async function De(e){let t=ve();await Te(e,t).catch(n=>{s({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Oe(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function ke(e){let{session:t,sessionName:n,device:r,snapshot:i,appBundleId:a}=e;return t?{...t,snapshot:i,lastComparisonSafeSnapshot:i?.comparisonSafe===!0?i:t.lastComparisonSafeSnapshot}:{name:n,device:r,createdAt:Date.now(),appBundleId:a,snapshot:i,...i?.comparisonSafe===!0?{lastComparisonSafeSnapshot:i}:{},actions:[]}}const Ae=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function j(e,t){let n=je(t);return n.length===0?null:y(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function je(e){if(!e)return[];let t=[];for(let[n,r]of Ae)e[n]!==void 0&&t.push(r);return t}function Me(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:y(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function Ne(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function M(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function N(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:y(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function P(e,t){let n=M(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=N(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:y(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Pe(e){let t=M(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...He(e[2])};let n=Ve(e),r=P(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Fe(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=N(t);if(!n.ok)return{ok:!1,response:n.response};let r=f(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Be(e)},refGeneration:n.generation,text:r}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after ref`)}}let n=M(e);if(n){let t=e.slice(2).join(` `);return t?{ok:!0,target:{kind:`point`,x:n.x,y:n.y},text:t}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Ie(e);return!r||r.kind!==`selector`?{ok:!1,response:y(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)}:r.text.trim()?{ok:!0,target:{kind:`selector`,selector:r.target.selector},text:r.text}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after selector`)}}function Ie(e){try{return f(e)}catch{return null}}function Le(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:ze(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function Re(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function ze(e){return e?.startsWith(`@`)?e.slice(1):e}function Be(e){return e.length>=3&&e[1]?.trim()||``}function Ve(e){let t=e.at(-1);return e.length>1&&Ue(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function He(e){return e===void 0?{}:{durationMs:Number(e)}}function Ue(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function We(e,n){let r=await F(e);if(r)throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}async function F(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await _e(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!Je(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:qe(n)}}function Ge(e){return e.foregroundPackage===`com.google.android.permissioncontroller`?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ke(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function qe(e){return e===`com.google.android.permissioncontroller`?`Dismiss or allow the permission prompt, then retry the smoke assertion.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Je(e){return e===`com.android.settings`||e===`com.android.systemui`||e===`com.google.android.permissioncontroller`||e.includes(`launcher`)}function Ye(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function Xe(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:pe(e.node)}}function I(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=$e(e),i=r?.kind===`ref`?V(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:Qe(s)}}function L(e){let{target:t}=e;return{...t.kind===`ref`?{ref:V(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:pe(e.node)}}function R(e){let{node:t,preActionNodes:n,...r}=e;return r}function Ze(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function z(e){let{selectorChain:t,...n}=e;return n}function B(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=o.recordSession&&i?Ee(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:p(n),...s?{targetEvidence:s}:{}})}function Qe(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function $e(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function V(e){return e.startsWith(`@`)?e.slice(1):e}const et=[`application`,`window`,`tabbar`,`scrollbar`,`image`],tt=new Set([`tab bar`]);async function H(e,t){if(t.ok||!nt(t.error.message)||t.error.details?.captureStalled===!0)return t;let n=await rt(e).catch(()=>null);return n?y(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function nt(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function rt(e){let t=[...(await T({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(it),n=U(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=U(t.filter(e=>!st(e)),4,{includeIdentifiers:!1}),i=U(t.filter(ct),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function U(e,t,n){let r=new Set,i=[];for(let a of e){let e=ot(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function it(e,t){return W(e)-W(t)||at(e,t)}function W(e){let t=!!ot(e,{includeIdentifiers:!1});return(st(e)?2:0)+ +!t}function at(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function ot(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replace(/\s+/g,` `).slice(0,80):``}function st(e){let t=le(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return et.some(e=>t.includes(e))||tt.has(n)||n.endsWith(`.fill`)}function ct(e){return le(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e){let{session:t,selectorExpression:n}=e;if(!t||!h(t.device)||g(t.device)||t.postGestureStabilization)return null;let r=d(n);if(!r||r.selectors.length!==1)return null;let i=r.selectors[0];if(!i||i.terms.length!==1)return null;let a=i.terms[0];return!a||typeof a.value!=`string`||!lt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function lt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function ut(e,t={}){let n=o(e);if(n.code===`ELEMENT_NOT_FOUND`)return t.delegateSemanticFailures===!0||t.allowElementNotFound===!0;if(n.code===`AMBIGUOUS_MATCH`)return t.delegateSemanticFailures===!0;if(n.code===`ELEMENT_OFFSCREEN`)return t.delegateSemanticFailures!==!1;if(n.code!==`COMMAND_FAILED`)return!1;let r=n.message.toLowerCase();return r.includes(`fetch failed`)||r.includes(`timed out`)||r.includes(`timeout`)||r.includes(`runner did not accept connection`)||r.includes(`invalid runner response`)}function dt(e,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not create temporary files`)}}}function ft(e,t={}){return{artifacts:dt(e,t),policy:he()}}async function pt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:c}=e,l=ce(n),u=fe(n.rect);if(!u||h(t)&&l&&!se(n.type??``))return l;try{let e=await be(t,`read`,[String(u.x),String(u.y)],void 0,{...c(r,i,a),surface:o}),d=e&&typeof e==`object`?e:void 0,f=typeof d?.text==`string`?d.text:``;return f.trim()?f:(s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),l)}catch(e){return s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`backend_read_failed`,nodeRef:n.ref,surface:o,platform:t.platform,error:e instanceof Error?e.message:String(e)}}),l}}function K(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Ct(c,e.req.flags?.out),d=_t({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=vt({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await mt({params:e,request:c}),m={snapshot:p};return Tt({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function mt(e){let{params:t,request:n}=e,r=await q(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&Et(r)?await ht({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&de(r.snapshotQuality)?await gt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function ht(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await q(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await q(t,n,r.query,!1)}}async function gt(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await q(t,n,r.query,!1)}catch{return i}}async function q(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await T({device:e.device,session:e.session,flags:{...t.flags,snapshotInteractiveOnly:r},outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects})).snapshot}function _t(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!w(a)&&!xt(a,o))return r}function vt(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&yt(t,r)&&bt(i,n)&&i.presentationKey===St(r))return i}function yt(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||w(e)||xt(e,t))}function bt(e,t){return t-e.createdAt<750}function xt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function St(e){return r(i(wt(e)))}function Ct(e,t){return JSON.stringify({presentationKey:St(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function wt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Tt(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||de(i.snapshotQuality)||(x(t,i),n.set(r,t))}function Et(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function Dt(e){return ge({backend:Ot(e),...ft(`selector commands`,{plural:!0}),sessions:Ce({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(x(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}})})}async function J(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:ye()};let r=n?.device??await _(e.req.flags??{});n||await C(r);let i=v(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:Dt({...e,session:n,device:r})}}function Ot(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=K({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:ee(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...kt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,c=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await s.capture({flags:i,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await pt({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>xe(i??``,e,t,n))})}),findText:async(t,n)=>({found:await At(e,n)})}}function kt(e){let{interactiveOnly:t,scope:n,depth:r,raw:i,includeHiddenContentHints:a}=e??{},o={};return t!==void 0&&(o.snapshotInteractiveOnly=t),n!==void 0&&(o.snapshotScope=n),r!==void 0&&(o.snapshotDepth=r),i!==void 0&&(o.snapshotRaw=i),a!==void 0&&(o.snapshotIncludeHiddenContentHints=a),o}async function At(e,t){let n=await jt(e,t);if(n!==null)return n;let r=await Mt(e,t);return r===null?await Ft(e,t):r}async function jt(e,t){return!m(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Ft(e,t)}async function Mt(e,t){let n=Nt(e);return n?(await b(n.device,{command:`findText`,text:t,appBundleId:n.appBundleId},Pt(e,n)))?.found===!0:null}function Nt(e){return!te(e.device.platform)||g(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function Pt(e,t){return E({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Ft(e,t){return!!ie((await It(e)).nodes,t)}async function It(e){let{snapshot:t}=await K({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath,consumedSnapshot:e.consumedSnapshot}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotIncludeHiddenContentHints:!1},cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return t}async function Lt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=c(t.positionals??[],t.flags);if(!n.ok)return y(n.code,n.message);let r=n.parsed,i=r.action;if(!u(i))return null;let a=await J(e,{requireSession:!1,capability:`find`});return a.ok?D(await Q(async()=>{let n=await a.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:r.locator,query:r.query,action:i,timeoutMs:r.timeoutMs});B(e.sessionStore,e.sessionName,t,Ye(n,i));let o=Xe(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(we(t,[o.ref]),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),Y(e)):a.response}function Y(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Rt(e){let{req:t}=e;if(t.command!==`get`)return null;let n=ue(t.positionals?.[0]);if(!n.ok)return y(n.code,n.message);let r=n.format,i=Zt(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=j(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Ut(e,r,i.target.selector);if(t)return t}let o=await J(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?S({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return D(await Q(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});B(e.sessionStore,e.sessionName,t,I(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=L(n);return s?{...c,warning:s}:c}),Y(e))}async function zt(e){let{req:t}=e;if(t.command!==`is`)return null;let n=ae(t.positionals??[]);if(!n.ok)return y(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,expectedText:i}=n,a={selectorExpression:n.selectorExpression},o=t.internal?.replayTargetGuard,s=e.sessionStore.get(e.sessionName)?.recordSession===!0;if(!o&&!s){let t=await Wt(e,r,a.selectorExpression,i);if(t)return t}let c=await J(e,{requireSession:!0,capability:`is`});return c.ok?D(await $(e,await Q(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:a.selectorExpression,expectedText:i,expectedResolvedTarget:o}),s=Vt(n),l=R(n);return B(e.sessionStore,e.sessionName,t,l,s),z(l)}),`is ${r}`),Y(e)):c.response}async function Bt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=l(t.positionals??[]);if(!i)return y(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await k(r,n,t.flags);if(i.kind!==`sleep`){let e=v(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!a?.recordSession){let t=await Gt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,u;if(i.kind===`ref`){let e=N(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},u=S({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let d=async()=>{let i=Dt({...e,session:a,device:o}),l=await Q(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Qt(c,a,s)}),o=Vt(e);B(r,n,t,R(e),o,`landmark`);let l=Ze(e);return u?{...l,warning:u}:l});return await $(e,await H({req:t,logPath:e.logPath,session:a,device:o},l),`wait`)};return i.kind===`sleep`?await d():D(await A(a,o,d),Y(e))}function Vt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Ht(e,t,n){if(!e||e.recordSession)return null;let r=G({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Ut(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Ht(r,t,n);if(!r||!i)return null;let a=await X(e,r,i);if(Z(a))return a.response;if(!a)return null;let o=Jt(t,i.raw,a);return o?(B(e.sessionStore,e.sessionName,e.req,I(o,t)),{ok:!0,data:L(o)}):null}async function Wt(e,t,n,r){if(t===`hidden`)return null;let i=await Kt(e,n);if(Z(i))return i.response;if(!i?.result.found||!i.result.node)return null;let a=t===`exists`?{predicate:t,pass:!0,selector:i.selector.raw,matches:1,selectorChain:[i.selector.raw]}:Yt(t,r,i.selector.raw,i.session,i.result.node);return a?(B(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:z(a)}):null}async function Gt(e){let t=G({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await X(e,e.session,t);if(Z(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};B(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:z(i)};return await H({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Kt(e,t){let n=e.sessionStore.get(e.sessionName),r=G({session:n,selectorExpression:t});if(!n||!r)return null;let i=await X(e,n,r);return Z(i)?i:i?{session:n,selector:r,result:i}:null}async function qt(e,t,n){let r=await b(t.device,{command:`querySelector`,selectorKey:n.key,selectorValue:n.value,appBundleId:t.appBundleId},E({req:e.req,logPath:e.logPath,traceLogPath:t.trace?.outPath})),i=r.found===!0,a=Xt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function X(t,n,r){try{return await qt(t,n,r)}catch(t){return ut(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Z(e){return e!==null&&`kind`in e&&e.kind===`error`}function Jt(e,t,n){if(!n.found||!n.node)return null;let r={target:{kind:`selector`,selector:t},node:n.node,selectorChain:[t]};return e===`attrs`?{kind:`attrs`,...r}:typeof n.text==`string`?{kind:`text`,...r,text:n.text}:null}function Yt(e,t,n,r,i){let a=re({predicate:e,node:i,nodes:[i],expectedText:t,platform:r.device.platform});return{predicate:e,pass:a.pass,selector:n,...e===`text`?{text:a.actualText}:{},selectorChain:[n]}}function Xt(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function Zt(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=N(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=oe(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:y(n.code,n.message)}}function Qt(e,n,r){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...r?{recordedLandmark:r}:{}};if(e.kind===`ref`){if(!n?.snapshot)throw new t(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:e.rawRef,timeoutMs:e.timeoutMs}}if(e.kind===`stable`)return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};let i=ne(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return y(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await F(r)}catch{return t}return i?y(t.error.code,`${n} failed because ${Ge(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{A as C,k as S,Ne as _,K as a,ke as b,G as c,Re as d,Le as f,ze as g,P as h,Bt as i,We as l,Pe as m,Rt as n,ft as o,Fe as p,zt as r,ut as s,Lt as t,Ke as u,j as v,D as w,Oe as x,Me as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";import{Hn as t,Vn as n,_ as r,ir as i,l as a,r as o}from"./recording-export-quality.js";import{G as s,Q as c,R as l,U as u,V as d,W as f}from"./snapshot-diagnostics.js";import{i as ee,m as te,n as ne}from"./sdk-device.js";import{_t as re}from"./sdk-selectors.js";import{n as p,o as m}from"./host-process.js";import h from"node:crypto";import g from"node:fs";import ie from"node:os";import _ from"node:path";function ae(e,t){let n=h.createHash(`sha256`).update(e).digest(),r=h.createHash(`sha256`).update(t).digest();return h.timingSafeEqual(n,r)}const v={browserStack:`browserstack`,awsDeviceFarm:`aws-device-farm`},y=new Set(Object.values(v));function b(e){return e!==void 0&&y.has(e)}function x(){return{pid:process.pid,startTime:m(process.pid)}}function oe(e,t){return e.pid===t.pid&&e.startTime===t.startTime}function S(e){let{owner:t,stateDir:n}=e;if(!p(t.pid)||t.startTime&&m(t.pid)!==t.startTime)return`owner-process-dead`;if(!n)return`live`;try{return g.statSync(n),`live`}catch(e){let t=e?.code;return t===`ENOENT`||t===`ENOTDIR`?`owner-state-dir-gone`:`unknown`}}function C(){let e=process.env.AGENT_DEVICE_CLAIMS_DIR?.trim();return e?_.resolve(e):_.join(ie.homedir(),`.agent-device`,`device-claims`)}function se(e){let t=h.createHash(`sha256`).update(e).digest(`hex`);return _.join(C(),`${t}.json`)}function ce(e){let t=C(),n=le(t);return`claims`in n?n.claims:n.entries.filter(e=>e.isFile()&&e.name.endsWith(`.json`)).map(e=>w(_.join(t,e.name))).filter(e=>e!==null).filter(t=>ue(t.claim,e))}function le(e){try{return{entries:g.readdirSync(e,{withFileTypes:!0})}}catch(t){let n=t.code;return n===`ENOENT`||n===`ENOTDIR`?{claims:[]}:{claims:[{fileName:_.basename(e),classification:`unknown`,error:String(t)}]}}}function ue(e,t){return e?[de(e,t.udid??t.serial),fe(e,t.device),pe(e,t.platform)].every(Boolean):!0}function de(e,t){return!t||e.device.id===t}function fe(e,t){return!t||e.device.name===t||e.device.id===t}function pe(e,t){return te({...ee(e.device.platform),appleOs:e.device.appleOs},t)}function w(e){let t=_.basename(e);try{return me(t,g.readFileSync(e,`utf8`))}catch(e){let n=e.code;return n===`ENOENT`||n===`ENOTDIR`?null:{fileName:t,classification:`unknown`,error:String(e)}}}function me(e,t){try{let n=he(JSON.parse(t));return n?{fileName:e,deviceKey:n.deviceKey,claim:n,classification:S({owner:{pid:n.ownerPid,startTime:n.ownerStartTime},stateDir:n.stateDir})}:{fileName:e,classification:`inconsistent`}}catch(t){return{fileName:e,classification:`inconsistent`,error:String(t)}}}function he(e){if(!T(e))return null;let t=e;return ge(t)?t:null}function T(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function ge(e){return e.schemaVersion===1&&_e(e.device)&&[e.deviceKey,e.session,e.workspace,e.stateDir,e.ownerToken].every(E)&&ve(e.ownerPid)&&D(e.createdAtMs)&&D(e.updatedAtMs)}function _e(e){if(!T(e))return!1;let t=e;return[t.id,t.name,t.platform,t.kind].every(E)}function E(e){return typeof e==`string`&&e.length>0}function ve(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function D(e){return typeof e==`number`&&Number.isFinite(e)}function O(e,t){let n={providerReleases:{released:t.released.map(M),pending:t.pending.map(M)}},r=j(e),i=`${r}.${process.pid}.${Date.now()}.tmp`;try{g.writeFileSync(i,`${JSON.stringify(n)}\n`,{mode:384}),g.renameSync(i,r),g.chmodSync(r,384)}catch{try{g.rmSync(i,{force:!0})}catch{}}}function k(e){try{let t=JSON.parse(g.readFileSync(j(e),`utf8`));return N(t)?t:null}catch{return null}}function A(e){try{g.rmSync(j(e),{force:!0})}catch{}}function j(e){return _.join(e,`daemon-shutdown.json`)}function M(e){return{leaseId:e.leaseId,...e.leaseProvider?{provider:e.leaseProvider}:{}}}function N(e){if(!e||typeof e!=`object`)return!1;let t=e.providerReleases;if(!t||typeof t!=`object`)return!1;let n=t;return Array.isArray(n.released)&&Array.isArray(n.pending)&&n.released.every(P)&&n.pending.every(P)}function P(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.leaseId==`string`&&t.leaseId.trim().length>0&&(t.provider===void 0||typeof t.provider==`string`)}const F={pinchAxisDegrees:-90,frameCount:Math.floor},ye={ios:F,macos:F,android:{pinchAxisDegrees:0,frameCount:Math.round},vega:F,linux:F,web:F};function be(e,t,n){let r=De(t),i=Ae(n);switch(e.intent){case`fling`:return Se(e,r,i);case`pan`:return Ce(e,r,i);case`pinch`:return L({intent:`pinch`,origin:e.origin??K(r),delta:{x:0,y:0},scale:G(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=W(e.degrees,`gesture rotate degrees`);return L({intent:`rotate`,origin:e.origin??K(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:H(t)},r,i)}case`transform`:{let t=W(e.degrees,`gesture transform degrees`);return L({intent:`transform`,origin:e.origin,delta:e.delta,scale:G(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:V(e.durationMs,H(t),`gesture transform durationMs`)},r,i)}}}function xe(t){let n=t.pointers[0].samples[0]?.point,r=t.pointers[0].samples.at(-1)?.point;if(!n||!r)throw new e(`INVALID_ARGS`,`single-pointer gesture plan requires samples`);return{start:n,end:r}}function Se(e,n,r){if(`preset`in e){let{from:t,to:i}=ke(e.preset,n);return I(`fling`,t,i,100,n,`endpoint-hold`,r)}if(`from`in e)return I(`fling`,e.from,e.to,100,n,`endpoint-hold`,r);let i=U(e.origin,`gesture fling origin`),a=Oe(e.distance??180,`gesture fling distance`);return I(`fling`,i,q(i,t(e.direction,a)),100,n,`endpoint-hold`,r)}function Ce(t,n,r){let i=V(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=U(t.origin,`gesture pan origin`);return I(`pan`,e,q(e,U(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`,r)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return L({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function I(e,t,n,r,i,a,o){let s=U(t,`gesture ${e} start`),c=U(n,`gesture ${e} end`),l=R(r,o).map(e=>({offsetMs:e,point:J(s,c,e/r)}));return z(l,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:l}]}}function L(e,t,n){let r=U(e.origin,`gesture ${e.intent} origin`),i=q(r,U(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*Ee(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw B({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=R(e.durationMs,n),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:we({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return z(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 we(e){let t=e.offsetMs/e.durationMs,n=J(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=je(Te(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 Te(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function Ee(e){return e===`pinch`?.4:.25}function R(e,t){let n=e/16,r=Math.max(3,t.frameCount(n));return Array.from({length:r+1},(t,n)=>Math.round(e*n/r))}function z(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 B({...r,viewport:n,sample:o})}}function B(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 De(t){let n={x:W(t.x,`gesture viewport x`),y:W(t.y,`gesture viewport y`),width:W(t.width,`gesture viewport width`),height:W(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 V(t,n,i){let a=t??n;if(!Number.isInteger(a)||a<16||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 16 and ${r}`);return a}function H(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function U(e,t){return{x:W(e.x,`${t} x`),y:W(e.y,`${t} y`)}}function W(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function G(t,n){let r=W(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function Oe(t,n){let r=W(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function K(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 J(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function ke(e,t){let r=n(e,{referenceWidth:t.width,referenceHeight:t.height});return{from:{x:t.x+r.x1,y:t.y+r.y1},to:{x:t.x+r.x2,y:t.y+r.y2}}}function Ae(e){return e===void 0?F:ye[e]}function je(e){return e*Math.PI/180}const Me=new Set(ne.filter(e=>e!==`web`)),Ne=new Set([`mobile`,`tv`,`desktop`]);function Pe(t){let n=[],r=[],i=t.split(/\r?\n/),o=!1,s,c=(t,n,r)=>{throw new e(`INVALID_ARGS`,`target-v1 annotation on line ${t.line} must be immediately followed by its action line (line ${n+1} ${r}).`)};for(let[t,l]of i.entries()){let i=l.trim();if(i.length===0){s&&c(s,t,`is blank`);continue}if(i.startsWith(`#`)){let e=re(i);if(e.kind===`v1`){s&&c(s,t,`is another target-v1 annotation`),s={evidence:e.evidence,line:t+1};continue}s&&c(s,t,`is a comment`);continue}if(Y(i)){if(s&&c(s,t,`is an env directive`),o)throw new e(`INVALID_ARGS`,`env directives must precede all actions (line ${t+1}).`);continue}let u=Re(l);if(!u){s&&c(s,t,`did not parse as an action`);continue}let d=a(u.command,u.positionals??[],`line ${t+1}`);if(d)throw new e(`INVALID_ARGS`,d);s&&=(u.targetEvidence=s.evidence,void 0),n.push(u),r.push(t+1),o=!0}if(s)throw new e(`INVALID_ARGS`,`target-v1 annotation on line ${s.line} must be immediately followed by its action line (end of script reached).`);return{actions:n,actionLines:r}}function Fe(e){let t=e.split(/\r?\n/),n={};for(let[e,r]of t.entries()){let t=r.trim();if(t.length===0||t.startsWith(`#`))continue;if(Y(t)){X(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&Me.has(e)&&Z(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&Ne.has(e)&&Z(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&Z(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&Z(n,`retries`,Math.floor(e))}}return n}function Y(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function Ie(t,n){let r=t.slice(3).replace(/^[\s]+/,``),i=r.indexOf(`=`);if(i<=0)throw new e(`INVALID_ARGS`,`Invalid env directive on line ${n}: expected "env KEY=VALUE".`);let a=r.slice(0,i);if(!c.test(a))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(a.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${a} to avoid the AD_ prefix.`);return{key:a,value:Le(r.slice(i+1),n)}}function Le(t,n){if(t.length===0)return``;if(t.startsWith(`"`))try{let e=JSON.parse(t);if(typeof e!=`string`)throw Error(`not a string literal`);return e}catch{throw new e(`INVALID_ARGS`,`Invalid quoted env value on line ${n}.`)}return t}function X(t,n,r){let{key:i,value:a}=Ie(n,r),o=t.env??{};if(Object.prototype.hasOwnProperty.call(o,i))throw new e(`INVALID_ARGS`,`Duplicate env directive "${i}" on line ${r}.`);o[i]=a,t.env=o}function Z(t,n,r){let i=t[n];if(i!==void 0)throw new e(`INVALID_ARGS`,i===r?`Duplicate replay test metadata "${n}" in context header.`:`Conflicting replay test metadata "${n}" in context header: ${String(i)} vs ${String(r)}.`);t[n]=r}function Re(e){let t=e.trim();if(t.length===0||t.startsWith(`#`))return null;let[n,...r]=Be(t);if(n===void 0||n===`context`)return null;let a={ts:Date.now(),command:n,positionals:[],flags:{}};if(n===`snapshot`){a.positionals=[];for(let e=0;e<r.length;e+=1){let t=r[e];if(t===`-i`){a.flags.snapshotInteractiveOnly=!0;continue}if(t!==`-c`){if(t===`--raw`){a.flags.snapshotRaw=!0;continue}if(t===`--force-full`){a.flags.snapshotForceFull=!0;continue}if((t===`-d`||t===`--depth`)&&e+1<r.length){let t=Number(r[e+1]);Number.isFinite(t)&&t>=0&&(a.flags.snapshotDepth=Math.floor(t)),e+=1;continue}if((t===`-s`||t===`--scope`)&&e+1<r.length){a.flags.snapshotScope=r[e+1],e+=1;continue}if(t===`--backend`&&e+1<r.length){e+=1;continue}}}return a}if(n===`open`){let e=l(r);return a.positionals=e.positionals,Object.assign(a.flags,e.flags),a.runtime=e.runtime,a}if(n===`runtime`){let e=u(r);return a.positionals=e.positionals,Object.assign(a.flags,e.flags),a}if(d(n)){let e=f(n,r);Object.assign(a.flags,e.flags);let t=e.positionals[0];if(t===void 0)return a;if(t.startsWith(`@`))return a.positionals=[s(t)],e.positionals[1]&&(a.result={refLabel:e.positionals[1]}),a;let i=e.positionals[0],o=e.positionals[1];return Q(i)&&Q(o)&&e.positionals.length>=2?(a.positionals=[i,o],a):(a.positionals=[e.positionals.join(` `)],a)}if(n===`fill`){let e=f(n,r);if(Object.assign(a.flags,e.flags),!ze(e.positionals))return a.positionals=e.positionals,a;let[t,i,...o]=e.positionals;if(Q(t)&&Q(i))return a.positionals=[t,i,o.join(` `)],a;let[c,l,...u]=e.positionals;if(c.startsWith(`@`)){let e=s(c);return u.length>0?(a.positionals=[e,u.join(` `)],a.result={refLabel:l},a):(a.positionals=[e,l],a)}return a.positionals=[c,[l,...u].join(` `)],a}if(n===`get`){let e=r[0],t=r[1];return e===void 0||t===void 0?(a.positionals=r,a):t.startsWith(`@`)?(a.positionals=[e,s(t)],r[2]&&(a.result={refLabel:r[2]}),a):(a.positionals=[e,r.slice(1).join(` `)],a)}if(n===`swipe`||n===`type`||n===`gesture`){let e=f(n,r);return Object.assign(a.flags,e.flags),a.positionals=e.positionals,a}if(n===`record`){let e=[];for(let t=0;t<r.length;t+=1){let n=r[t];if(n===`--hide-touches`){a.flags.hideTouches=!0;continue}if(n===`--fps`&&t+1<r.length){let e=Number(r[t+1]);Number.isFinite(e)&&(a.flags.fps=Math.floor(e)),t+=1;continue}if(n===`--quality`&&t+1<r.length){let e=r[t+1],n=o(e);n!==void 0&&(a.flags.quality=n),t+=1;continue}if(n===`--max-size`&&t+1<r.length){let e=Number(r[t+1]);Number.isFinite(e)&&(a.flags.screenshotMaxSize=Math.floor(e)),t+=1;continue}e.push(n)}return a.positionals=e,a}if(n===`screenshot`){let e=[];for(let t=0;t<r.length;t+=1){let n=r[t],o=i({args:r,index:t,flags:a.flags});if(o.handled){t=o.nextIndex;continue}e.push(n)}return a.positionals=e,a}return a.positionals=n===`wait`||n===`longpress`?r.map(e=>s(e)):r,a}function ze(e){return e.length>=2}function Q(e){return e?!Number.isNaN(Number(e)):!1}function Be(e){let t=[],n=0;for(;n<e.length&&(n=Ve(e,n),!(n>=e.length));){let r=e[n]===`"`?He(e,n):Ue(e,n);t.push(r.value),n=r.nextCursor}return t}function Ve(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function He(t,n){let r=n+1,i=!1,a=r;for(;a<t.length;a+=1){let e=t.charAt(a);if(e===`"`&&!i)break;if(i){i=!1;continue}i=e===`\\`}if(a>=t.length)throw new e(`INVALID_ARGS`,`Invalid replay script line: ${t}`);return{value:JSON.parse(t.slice(n,a+1)),nextCursor:a+1}}function Ue(e,t){let n=t;for(;n<e.length&&!/\s/.test(e.charAt(n));)n+=1;return{value:e.slice(t,n),nextCursor:n}}const $=[`id`,`text`,`enabled`,`selected`],We=[...$,`label`],Ge=[`id`,`text`,`label`],Ke=[`enabled`,`selected`];export{x as _,Pe as a,ae as b,xe as c,O as d,w as f,oe as g,S as h,Ge as i,A as l,se as m,Ke as n,Fe as o,ce as p,We as r,be as s,$ as t,k as u,v,b as y};
|
package/dist/src/selectors.d.ts
CHANGED
|
@@ -1,16 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as SnapshotState, L as Platform, O as SnapshotNode, z as PublicPlatform } from "./sdk-contracts.js";
|
|
2
2
|
import { a as Selector, c as parseSelectorChain, l as tryParseSelectorChain, o as SelectorChain, s as isSelectorToken } from "./sdk-finders.js";
|
|
3
|
-
|
|
3
|
+
import { n as DisambiguationTiebreak } from "./interaction.js";
|
|
4
|
+
//#region src/selectors/resolve.d.ts
|
|
4
5
|
type SelectorDiagnostics = {
|
|
5
6
|
selector: string;
|
|
6
7
|
matches: number;
|
|
7
8
|
};
|
|
9
|
+
/** Present only when the heuristic picked among N>1 matches (ADR 0012). */
|
|
10
|
+
type SelectorDisambiguationDisclosure = {
|
|
11
|
+
matchCount: number;
|
|
12
|
+
tiebreak: DisambiguationTiebreak;
|
|
13
|
+
/** Every losing matched node, document order, uncapped (response layer caps). */
|
|
14
|
+
alternatives: SnapshotNode[];
|
|
15
|
+
};
|
|
8
16
|
type SelectorResolution = {
|
|
9
17
|
node: SnapshotNode;
|
|
10
18
|
selector: Selector;
|
|
11
19
|
selectorIndex: number;
|
|
12
20
|
matches: number;
|
|
13
21
|
diagnostics: SelectorDiagnostics[];
|
|
22
|
+
disambiguation?: SelectorDisambiguationDisclosure;
|
|
14
23
|
};
|
|
15
24
|
declare function resolveSelectorChain(nodes: SnapshotState['nodes'], chain: SelectorChain, options: {
|
|
16
25
|
platform: Platform | PublicPlatform;
|
|
@@ -31,7 +40,7 @@ declare function formatSelectorFailure(chain: SelectorChain, diagnostics: Select
|
|
|
31
40
|
unique?: boolean;
|
|
32
41
|
}): string;
|
|
33
42
|
//#endregion
|
|
34
|
-
//#region src/
|
|
43
|
+
//#region src/selectors/node.d.ts
|
|
35
44
|
declare function isNodeVisible(node: SnapshotNode): boolean;
|
|
36
45
|
declare function isNodeEditable(node: SnapshotNode, platform: Platform | PublicPlatform): boolean;
|
|
37
46
|
//#endregion
|
package/dist/src/selectors.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Q as e,Z as t,et as n}from"./sdk-batch-runner.js";import{O as r,f as i,h as a,k as o,p as s}from"./sdk-selectors.js";export{i as findSelectorChainMatch,s as formatSelectorFailure,r as isNodeEditable,o as isNodeVisible,t as isSelectorToken,e as parseSelectorChain,a as resolveSelectorChain,n as tryParseSelectorChain};
|
package/dist/src/server.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{S as e,_ as t,n,o as r}from"./sdk-contracts.js";import{Xt as i,s as a,t as o}from"./tv-remote.js";import{n as s}from"./version.js";import{M as c,N as l,c as u,j as d}from"./registry.js";import{n as f,t as p}from"./sdk-device.js";import{i as ee,n as m}from"./command-metadata.js";import{t as h}from"./cli-output.js";const g=[`simulator`,`emulator`,`device`];function _(e){return{type:`number`,...e?{description:e}:{}}}function v(e,t){return{type:`string`,enum:e,...t?{description:t}:{}}}function y(e){return{type:`string`,const:e}}function b(e,t=[],n){return{type:`object`,...n?{description:n}:{},properties:e,...t.length>0?{required:t}:{}}}const x={type:`array`,items:{type:`string`}};function S(e={}){let t=e.properties??{},n=e.required??[];return b({targetKind:v([`point`,`ref`,`selector`],`Resolved interaction target kind.`),x:_(`Resolved interaction x coordinate when available.`),y:_(`Resolved interaction y coordinate when available.`),referenceWidth:_(`Reference frame width for visualizing the interaction point.`),referenceHeight:_(`Reference frame height for visualizing the interaction point.`),ref:l(`Snapshot ref without the @ prefix when the target was an @ref.`),selector:l(`Selector expression when the target was a selector.`),selectorChain:x,refLabel:l(),targetHittable:d(),hint:l(),warning:l(),message:l(),evidence:C,...t},[`targetKind`,...n])}const C=b({foregroundApp:l(`Foreground app bundle id or name, when the capture carries it.`),nodeCount:_(`Node count in the post-action interactive-only capture.`),interactiveNodeCount:_(`Subset of nodeCount the platform reports as hittable.`),digest:l(`Order-independent digest of the post-action node multiset.`),changedFromBefore:d(`Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.`)},[`nodeCount`,`interactiveNodeCount`,`digest`,`changedFromBefore`]),w=b({settled:d(`Whether the UI held the quiet window before the deadline. false is advisory, not failure.`),waitedMs:_(),captures:_(),quietMs:_(),timeoutMs:_(),refsGeneration:_(`Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.`),refs:{type:`array`,items:b({ref:l(`Plain ref body (e12) minted from the stored settled tree.`)},[`ref`])},diff:b({summary:b({additions:_(),removals:_(),unchanged:_()},[`additions`,`removals`,`unchanged`]),lines:{type:`array`,items:b({kind:v([`added`,`removed`]),text:l(),ref:l(`Plain ref body (e12) for added lines.`)},[`kind`,`text`])},truncated:d(`Lines were capped to the response bound.`)},[`summary`,`lines`],`Settled diff vs the pre-action tree (changed lines only).`),tail:{type:`array`,description:`Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).`,items:b({ref:l(`Plain ref body (e12) minted from the stored settled tree.`),role:l(),label:l()},[`ref`,`role`])},tailTruncated:d(`Present (true) when tail candidates exceeded the response cap.`),hint:l()},[`settled`,`waitedMs`,`captures`,`quietMs`,`timeoutMs`]),T={platform:v(f),target:v(p),device:l(`Human-readable device name.`),id:l(`Stable device id.`),kind:v(g)},E=[`platform`,`target`,`device`,`id`,`kind`],te=b({success:d(),exitCode:_(),stdout:l(),stderr:l(),error:c(`Normalized error detail when shutdown failed.`)},[`success`,`exitCode`,`stdout`,`stderr`]),D={press:S({properties:{evidence:C,settle:w,button:v([`secondary`,`middle`]),count:_(`Number of press/click repetitions.`),intervalMs:_(`Delay between repeated press/click actions.`),holdMs:_(`Hold duration for each action.`),jitterPx:_(`Randomization radius in pixels.`),doubleTap:d(`Whether the command requested a double-tap action.`)}}),fill:S({properties:{text:l(`Text submitted to the field.`),delayMs:_(`Delay between typed characters in milliseconds.`),evidence:C,settle:w},required:[`text`]}),longpress:S({properties:{durationMs:_(),settle:w,gesture:y(`longpress`)}}),boot:b({...T,booted:{type:`boolean`,const:!0}},[...E,`booted`]),shutdown:b({...T,shutdown:te},[...E,`shutdown`]),viewport:b({width:_(),height:_(),message:l()},[`width`,`height`,`message`]),home:b({action:y(`home`),message:l()},[`action`,`message`]),back:b({action:y(`back`),mode:v(u),message:l()},[`action`,`mode`,`message`]),rotate:b({action:y(`rotate`),orientation:v(a),message:l()},[`action`,`orientation`,`message`]),"app-switcher":b({action:y(`app-switcher`),message:l()},[`action`,`message`]),"tv-remote":b({action:y(`tv-remote`),button:v(o),durationMs:_(),message:l()},[`action`,`button`,`message`]),wait:b({waitedMs:_(),kind:y(`selector`),text:l(),selector:l(),captures:_(),nodeCount:_(),hint:l(),warning:l()},[`waitedMs`]),prepare:b({action:y(`ios-runner`),platform:v(f),deviceId:l(),deviceName:l(),kind:v(g),durationMs:_(),runner:b({},[]),cache:v([`exact`,`restore-key`,`miss`,`external`]),artifact:v([`valid`,`rebuilt`]),buildMs:_(),connectMs:_(),healthCheckMs:_(),xctestrunPath:l(),recoveryReason:l(),failureReason:l(),timing:b({totalMs:_(),additiveParts:b({buildMs:_(),connectAfterBuildMs:_(),healthCheckMs:_()},[`connectAfterBuildMs`,`healthCheckMs`]),containment:b({connectMs:{type:`array`,items:y(`buildMs`)},healthCheckMs:{type:`array`,items:l()}},[`healthCheckMs`]),note:l()},[`totalMs`,`additiveParts`,`containment`,`note`]),message:l()},[`action`,`platform`,`deviceId`,`deviceName`,`kind`,`durationMs`,`runner`,`connectMs`,`healthCheckMs`,`timing`,`message`]),push:{type:`object`,oneOf:[b({platform:y(`ios`),bundleId:l(),message:l()},[`platform`,`bundleId`,`message`]),b({platform:y(`android`),package:l(),action:l(),extrasCount:_(),message:l()},[`platform`,`package`,`action`,`extrasCount`,`message`])]},"trigger-app-event":b({event:l(),eventUrl:l(),transport:y(`deep-link`),message:l()},[`event`,`eventUrl`,`transport`,`message`]),clipboard:{type:`object`,oneOf:[b({action:y(`read`),text:l()},[`action`,`text`]),b({action:y(`write`),textLength:_(),message:l()},[`action`,`textLength`,`message`])]},appstate:{type:`object`,oneOf:[b({platform:v([`ios`,`macos`]),appName:l(),appBundleId:l(),source:y(`session`),surface:v(i),device_udid:l(`iOS only — the session device UDID.`),ios_simulator_device_set:{type:[`string`,`null`],description:`iOS only — the simulator set path, or null when unknown.`}},[`platform`,`appName`,`source`,`surface`]),b({platform:y(`android`),package:l(),activity:l()},[`platform`,`package`,`activity`])]},keyboard:b({platform:v([`android`,`ios`]),action:v([`status`,`dismiss`,`enter`]),visible:d(),wasVisible:d(),dismissed:d(),attempts:_(),inputType:l(),type:v([`text`,`number`,`email`,`phone`,`password`,`datetime`,`unknown`]),inputMethodPackage:l(),focusedPackage:l(),focusedResourceId:l(),inputOwner:v([`app`,`ime`,`unknown`]),message:l()},[`platform`,`action`])};function ne(){return ee().map(e=>{let t=e.name in D?D[e.name]:void 0;return{name:e.name,description:e.description,inputSchema:K(e.inputSchema),...t?{outputSchema:t}:{}}})}function re(e={}){let n=new Map;return{execute:async(r,i)=>{if(!m(r))throw new t(`INVALID_ARGS`,`Unknown command tool: ${r}`);let a=V(i),o=G(i),s=se(a,o),c=N(r,o,n.get(s)),l=await z(e,a.client),u=await(e.runCommand??B)(l,r,c);return O(n,s,r,u),{isError:!1,structuredContent:u,content:[{type:`text`,text:ce({name:r,input:o,result:u,outputFormat:a.outputFormat,responseLevel:a.client.responseLevel})}]}}}}const ie=new Set([`snapshot`,`find`]),ae=new Set([`press`,`click`,`fill`,`longpress`]),oe=new Set([`press`,`click`,`fill`,`longpress`,`get`]);function se(e,t){let n=L(t)?.session,r=typeof n==`string`&&n.length>0?n:`default`;return`${e.client.stateDir??``}\u0000${r}`}function O(e,t,n,r){if(ae.has(n)){k(e,t,r);return}if(!ie.has(n))return;let i=L(r),a=i?.refsGeneration;if(i===void 0||typeof a!=`number`){e.delete(t);return}let o=j(i);if(o.length===0)return;let s=e.get(t)??new Map;e.set(t,s),A(s,o,a)}function k(e,t,n){let r=L(L(n)?.settle);if(!r)return;let i=r?.refsGeneration;if(typeof i!=`number`)return;let a=L(r?.diff)?.lines,o=[];if(M(a,o),M(r.refs,o),M(r.tail,o),o.length===0)return;let s=e.get(t)??new Map;e.set(t,s),A(s,o,i)}function A(e,t,n){for(let r of t)e.delete(r),e.set(r,n);for(;e.size>1e3;){let t=e.keys().next().value;if(t===void 0)break;e.delete(t)}}function j(e){let t=[];return typeof e.ref==`string`&&e.ref.startsWith(`@`)&&t.push(e.ref.slice(1)),M(e.nodes,t),M(e.refs,t),t}function M(e,t){if(Array.isArray(e))for(let n of e){let e=L(n)?.ref;typeof e==`string`&&e.length>0&&t.push(e)}}function N(e,t,n){if(n===void 0||n.size===0)return t;let r=L(t);return r?e===`wait`?P(r,n)??t:oe.has(e)?F(r,n)??t:t:t}function P(e,t){if(typeof e.ref!=`string`)return;let n=I(e.ref,t);return n===e.ref?void 0:{...e,ref:n}}function F(e,t){let n=L(e.target);if(n?.kind!==`ref`||typeof n.ref!=`string`)return;let r=I(n.ref,t);return r===n.ref?void 0:{...e,target:{...n,ref:r}}}function I(e,t){if(!e.startsWith(`@`)||e.includes(`~`))return e;let n=t.get(e.slice(1));return n===void 0?e:`${e}~s${n}`}function L(e){if(!(!e||typeof e!=`object`||Array.isArray(e)))return e}const R=re();async function z(e,t){if(e.createClient)return await e.createClient(t);let{createAgentDeviceClient:n}=await import(`./client.js`).then(e=>e.t);return n(t)}async function B(e,t,n){return await(await import(`./command-surface.js`).then(e=>e.t)).runCommand(e,t,n)}function V(e){if(!e||typeof e!=`object`||Array.isArray(e))return{client:{},outputFormat:`optimized`};let t=e;return{client:H(t),outputFormat:W(t.mcpOutputFormat)}}function H(e){let n=e.stateDir,r=e.includeCost,i=e.responseLevel,a={};if(n!==void 0&&(typeof n!=`string`||n.length===0))throw new t(`INVALID_ARGS`,`Expected stateDir to be a non-empty string.`);if(typeof n==`string`&&(a.stateDir=n),r!==void 0&&typeof r!=`boolean`)throw new t(`INVALID_ARGS`,`Expected includeCost to be a boolean.`);r===!0&&(a.cost=!0);let o=U(i);return o!==void 0&&(a.responseLevel=o),a}function U(e){if(e!==void 0){if(typeof e!=`string`||!n.includes(e))throw new t(`INVALID_ARGS`,`Expected responseLevel to be one of 'digest', 'default', or 'full'.`);return e}}function W(e){if(e===void 0)return`optimized`;if(e!==`optimized`&&e!==`json`)throw new t(`INVALID_ARGS`,`Expected mcpOutputFormat to be "optimized" or "json".`);return e}function G(e){if(!e||typeof e!=`object`||Array.isArray(e))return e;let{stateDir:t,mcpOutputFormat:n,includeCost:r,responseLevel:i,...a}=e;return a}function K(e){return{...e,properties:{...e.properties,stateDir:{type:`string`,description:`Agent-device state directory.`},mcpOutputFormat:{type:`string`,enum:[`optimized`,`json`],description:`MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.`},includeCost:{type:`boolean`,description:`Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.`},responseLevel:{type:`string`,enum:[`digest`,`default`,`full`],description:`Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.`}}}}function ce(e){if(e.outputFormat===`json`||e.responseLevel!==void 0&&e.responseLevel!=="default")return q(e.result);let t=h({name:e.name,input:e.input,result:e.result});return typeof t?.text==`string`?t.text:q(t?.data??e.result)}function q(e){return typeof e==`string`?e:JSON.stringify(e,null,2)}async function le(e){if(e.jsonrpc!==`2.0`||typeof e.method!=`string`)return J(e.id??null,-32600,`Invalid JSON-RPC request.`);if(e.id===void 0)return null;try{return he(e.id,await ue(e.method,e.params))}catch(t){return t instanceof Y?J(e.id,-32601,t.message):J(e.id,-32602,t instanceof Error?t.message:String(t))}}async function ue(e,t){switch(e){case`initialize`:return{protocolVersion:pe(t),capabilities:{tools:{}},serverInfo:{name:`agent-device`,version:s()}};case`ping`:return{};case`tools/list`:return{tools:ne()};case`tools/call`:return await de(t);default:throw new Y(`Unsupported MCP method: ${e}`)}}async function de(e){let t=ge(e),n=_e(t,`name`);try{return await R.execute(n,t.arguments)}catch(e){return me(fe(e),!0)}}function fe(t){let n=e(t),r=[`Error (${n.code}): ${n.message}`];return n.hint&&r.push(`Hint: ${n.hint}`),n.supportedOn&&r.push(`Supported on: ${n.supportedOn}`),r.join(`
|
|
2
|
-
`)}function pe(e){return`2025-11-25`}function
|
|
3
|
-
`);if(e===-1)return;let t=this.buffer.slice(0,e).trim();return this.buffer=this.buffer.slice(e+1),t.length>0?t:void 0}emit(e){this.sink(JSON.parse(e))}};function
|
|
1
|
+
import{S as e,_ as t,n,o as r}from"./sdk-contracts.js";import{N as i,f as a}from"./sdk-batch-runner.js";import{Gn as o,mt as s,vn as c}from"./recording-export-quality.js";import{n as l}from"./version.js";import{r as u,t as d}from"./sdk-device.js";import{b as f,s as p,x as m,y as h}from"./registry.js";import{i as ee,n as te,t as ne}from"./command-metadata.js";import{i as re,n as ie,r as ae,t as oe}from"./cli-config.js";const g=[`simulator`,`emulator`,`device`];function _(e){return{type:`number`,...e?{description:e}:{}}}function v(e,t){return{type:`string`,enum:e,...t?{description:t}:{}}}function y(e){return{type:`string`,const:e}}function b(e,t=[],n){return{type:`object`,...n?{description:n}:{},properties:e,...t.length>0?{required:t}:{}}}const x={type:`array`,items:{type:`string`}},S=b({wallClockMs:_(`Total wall-clock time for the request in milliseconds.`),runnerRoundTrips:_(`Number of real runner round-trips made while serving the request.`),nodeCount:_(`Number of nodes in the original node tree when the response carries one.`)},[`wallClockMs`,`runnerRoundTrips`]),se=b({field:m(),artifactType:m(),path:m(),localPath:m(),fileName:m()},[`field`]);function C(e={}){let t=e.properties??{},n=e.required??[];return b({targetKind:v([`point`,`ref`,`selector`],`Resolved interaction target kind.`),x:_(`Resolved interaction x coordinate when available.`),y:_(`Resolved interaction y coordinate when available.`),referenceWidth:_(`Reference frame width for visualizing the interaction point.`),referenceHeight:_(`Reference frame height for visualizing the interaction point.`),ref:m(`Snapshot ref without the @ prefix when the target was an @ref.`),selector:m(`Selector expression when the target was a selector.`),selectorChain:x,refLabel:m(),targetHittable:h(),hint:m(),warning:m(),message:m(),evidence:T,resolution:ce,cost:S,maestroNonHittableCoordinateFallbackAllowed:h(`Whether the direct iOS Maestro coordinate fallback was allowed for this selector.`),maestroNonHittableCoordinateFallbackUsed:h(`Whether the direct iOS Maestro coordinate fallback was actually used.`),maestroFallbackReason:y(`non-hittable-coordinate`),...t},[`targetKind`,...n])}const w=b({diagnosticRef:m(`Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.`),role:m(`UTF-8 truncated to 256 bytes.`),label:m(`UTF-8 truncated to 256 bytes.`)},[`diagnosticRef`]),ce={type:`object`,description:`Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.`,oneOf:[b({source:y(`runtime`),phase:y(`pre-action`),kind:y(`unique`)},[`source`,`phase`,`kind`]),b({source:y(`runtime`),phase:y(`pre-action`),kind:y(`disambiguated`),matchCount:_(`Total matches resolveSelectorChain found before disambiguation.`),winnerDiagnostic:w,tiebreak:v([`visible`,`deepest`,`smallest-area`],`The comparison that decided the winner.`),alternatives:{type:`array`,description:`At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.`,items:w}},[`source`,`phase`,`kind`,`matchCount`,`winnerDiagnostic`,`tiebreak`]),b({source:y(`ref`),phase:y(`pre-action`),kind:y(`exact`)},[`source`,`phase`,`kind`]),b({source:y(`ref`),phase:y(`pre-action`),kind:y(`label-fallback`)},[`source`,`phase`,`kind`]),b({source:y(`direct-ios`),kind:y(`not-observed`)},[`source`,`kind`])]},T=b({foregroundApp:m(`Foreground app bundle id or name, when the capture carries it.`),nodeCount:_(`Node count in the post-action interactive-only capture.`),interactiveNodeCount:_(`Subset of nodeCount the platform reports as hittable.`),digest:m(`Order-independent digest of the post-action node multiset.`),changedFromBefore:h(`Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.`)},[`nodeCount`,`interactiveNodeCount`,`digest`,`changedFromBefore`]),E=b({settled:h(`Whether the UI held the quiet window before the deadline. false is advisory, not failure.`),waitedMs:_(),captures:_(),quietMs:_(),timeoutMs:_(),refsGeneration:_(`Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.`),refs:{type:`array`,items:b({ref:m(`Plain ref body (e12) minted from the stored settled tree.`)},[`ref`])},diff:b({summary:b({additions:_(),removals:_(),unchanged:_()},[`additions`,`removals`,`unchanged`]),lines:{type:`array`,items:b({kind:v([`added`,`removed`]),text:m(),ref:m(`Plain ref body (e12) for added lines.`)},[`kind`,`text`])},truncated:h(`Lines were capped to the response bound.`)},[`summary`,`lines`],`Settled diff vs the pre-action tree (changed lines only).`),tail:{type:`array`,description:`Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).`,items:b({ref:m(`Plain ref body (e12) minted from the stored settled tree.`),role:m(),label:m()},[`ref`,`role`])},tailTruncated:h(`Present (true) when tail candidates exceeded the response cap.`),hint:m()},[`settled`,`waitedMs`,`captures`,`quietMs`,`timeoutMs`]),D={platform:v(u),target:v(d),device:m(`Human-readable device name.`),id:m(`Stable device id.`),kind:v(g)},O=[`platform`,`target`,`device`,`id`,`kind`],le=b({success:h(),exitCode:_(),stdout:m(),stderr:m(),error:f(`Normalized error detail when shutdown failed.`)},[`success`,`exitCode`,`stdout`,`stderr`]),k=C({properties:{evidence:T,settle:E,button:v([`secondary`,`middle`]),count:_(`Number of press/click repetitions.`),intervalMs:_(`Delay between repeated press/click actions.`),holdMs:_(`Hold duration for each action.`),jitterPx:_(`Randomization radius in pixels.`),doubleTap:h(`Whether the command requested a double-tap action.`)}}),ue={press:k,click:k,fill:C({properties:{text:m(`Text submitted to the field.`),delayMs:_(`Delay between typed characters in milliseconds.`),evidence:T,settle:E},required:[`text`]}),longpress:C({properties:{durationMs:_(),settle:E,gesture:y(`longpress`)}}),find:b({ref:m(`Snapshot ref without the @ prefix when the find action returns one.`),refsGeneration:_(`ADR 0014 ref frame epoch for read-only find actions.`),found:h(`Whether a wait/exists/read-only find satisfied its condition.`),waitedMs:_(`Milliseconds waited for a read-only find condition.`),text:m(`Text value returned by find get_text.`),node:f(`Snapshot node for find get_attrs/get_text.`),locator:m(`Locator kind used for the find action.`),query:m(`Query argument used for the find action.`),x:_(`Resolved x coordinate for mutating find actions.`),y:_(`Resolved y coordinate for mutating find actions.`),message:m(`Diagnostic message for mutating find actions.`),settle:E,cost:S},[],`Daemon response data for the find command.`),boot:b({...D,booted:{type:`boolean`,const:!0}},[...O,`booted`]),shutdown:b({...D,shutdown:le},[...O,`shutdown`]),viewport:b({width:_(),height:_(),message:m()},[`width`,`height`,`message`]),...p,wait:b({waitedMs:_(),kind:y(`selector`),text:m(),selector:m(),captures:_(),nodeCount:_(),hint:m(),warning:m()},[`waitedMs`]),prepare:b({action:y(`ios-runner`),platform:v(u),deviceId:m(),deviceName:m(),kind:v(g),durationMs:_(),runner:b({},[]),cache:v([`exact`,`restore-key`,`miss`,`external`]),artifact:v([`valid`,`rebuilt`]),buildMs:_(),connectMs:_(),healthCheckMs:_(),xctestrunPath:m(),recoveryReason:m(),failureReason:m(),timing:b({totalMs:_(),additiveParts:b({buildMs:_(),connectAfterBuildMs:_(),healthCheckMs:_()},[`connectAfterBuildMs`,`healthCheckMs`]),containment:b({connectMs:{type:`array`,items:y(`buildMs`)},healthCheckMs:{type:`array`,items:m()}},[`healthCheckMs`]),note:m()},[`totalMs`,`additiveParts`,`containment`,`note`]),message:m()},[`action`,`platform`,`deviceId`,`deviceName`,`kind`,`durationMs`,`runner`,`connectMs`,`healthCheckMs`,`timing`,`message`]),push:{type:`object`,oneOf:[b({platform:y(`ios`),bundleId:m(),message:m()},[`platform`,`bundleId`,`message`]),b({platform:y(`android`),package:m(),action:m(),extrasCount:_(),message:m()},[`platform`,`package`,`action`,`extrasCount`,`message`])]},"trigger-app-event":b({event:m(),eventUrl:m(),transport:y(`deep-link`),message:m()},[`event`,`eventUrl`,`transport`,`message`]),clipboard:{type:`object`,oneOf:[b({action:y(`read`),text:m()},[`action`,`text`]),b({action:y(`write`),textLength:_(),message:m()},[`action`,`textLength`,`message`])]},appstate:{type:`object`,oneOf:[b({platform:v([`ios`,`macos`]),appName:m(),appBundleId:m(),source:y(`session`),surface:v(o),device_udid:m(`iOS only — the session device UDID.`),ios_simulator_device_set:{type:[`string`,`null`],description:`iOS only — the simulator set path, or null when unknown.`}},[`platform`,`appName`,`source`,`surface`]),b({platform:y(`android`),package:m(),activity:m()},[`platform`,`package`,`activity`])]},keyboard:b({platform:v([`android`,`ios`]),action:v([`status`,`dismiss`,`enter`]),visible:h(),wasVisible:h(),dismissed:h(),attempts:_(),inputType:m(),type:v([`text`,`number`,`email`,`phone`,`password`,`datetime`,`unknown`]),inputMethodPackage:m(),focusedPackage:m(),focusedResourceId:m(),inputOwner:v([`app`,`ime`,`unknown`]),message:m()},[`platform`,`action`]),doctor:b({status:v([`pass`,`warn`,`fail`,`info`]),summary:m(),kind:v([`auto`,`react-native`,`expo`,`repack`]),platform:m(),target:v(d),targetApp:m(),metro:b({host:m(),port:_()},[`host`,`port`]),checks:{type:`array`,items:b({id:m(),status:v([`pass`,`warn`,`fail`,`info`]),summary:m(),hint:m(),command:m(),evidence:f()},[`id`,`status`,`summary`])}},[`status`,`summary`,`kind`,`checks`]),diff:b({mode:y(`snapshot`),baselineInitialized:h(),summary:b({additions:_(),removals:_(),unchanged:_()},[`additions`,`removals`,`unchanged`]),lines:{type:`array`,items:b({kind:v([`added`,`removed`]),text:m(),ref:m()},[`kind`,`text`])},warnings:x},[`mode`,`baselineInitialized`,`summary`,`lines`]),replay:b({replayed:_(),healed:_(),session:m(),sessionActive:h(`True iff the session is still active — the script had no terminal close.`),artifactPaths:x,snapshotDiagnostics:f(),message:m()},[`replayed`,`healed`,`session`,`sessionActive`,`artifactPaths`,`message`]),test:b({total:_(),executed:_(),passed:_(),failed:_(),skipped:_(),notRun:_(),durationMs:_(),failures:{type:`array`,items:f()},tests:{type:`array`,items:f()},snapshotDiagnostics:f()},[`total`,`executed`,`passed`,`failed`,`skipped`,`notRun`,`durationMs`,`failures`,`tests`]),record:{type:`object`,oneOf:[b({recording:y(`started`),outPath:m(),sessionStateDir:m(),recordingBackend:m(),recordingScope:m(),recordOnlySession:h(),activeSessionApp:f(),showTouches:h()},[`recording`,`outPath`,`sessionStateDir`,`showTouches`]),b({recording:y(`stopped`),outPath:m(),telemetryPath:m(),artifacts:{type:`array`,items:se},recordingBackend:m(),recordingScope:m(),recordOnlySession:h(),activeSessionApp:f(),durationMs:_(),showTouches:h(),warning:m(),overlayWarning:m(),chunks:{type:`array`,items:f()}},[`recording`,`outPath`,`artifacts`,`durationMs`,`showTouches`])]},trace:{type:`object`,oneOf:[b({trace:y(`started`),outPath:m()},[`trace`,`outPath`]),b({trace:y(`stopped`),outPath:m()},[`trace`,`outPath`])]}},de={devices:{type:`object`,properties:{devices:{type:`array`,items:{type:`object`,properties:{platform:{type:`string`,enum:u},target:{type:`string`,enum:d},kind:{type:`string`,enum:g},id:{type:`string`},name:{type:`string`}},required:[`platform`,`target`,`kind`,`id`,`name`]}}},required:[`devices`]},apps:{type:`object`,properties:{apps:{type:`array`,items:{type:`string`}}},required:[`apps`]}},A={...ue,...de};function j(t){return e(t)}function M(e){let t=[`Error (${e.code}): ${e.message}`];e.hint&&t.push(`Hint: ${e.hint}`),e.supportedOn&&t.push(`Supported on: ${e.supportedOn}`);let n=c(e.details);return n&&t.push(n),t.join(`
|
|
2
|
+
`)}function N(e,t,n){let r=oe({command:e,cwd:process.cwd(),cliFlags:t}),i={};for(let[t,a]of Object.entries(r))Object.hasOwn(n,t)&&ae(t,e)&&(i[t]=a);return re(i,t)}const P={devices:e=>({devices:e.map(s)}),apps:e=>({apps:e})};function F(e,t){let n=P[e];return n?n(t):t}function I(){let e=new Map;return{pinInput:(t,n,r)=>ve(t,n,B(e,r,n.session)),mergeCommandResult:(t,n,r,i)=>H(e,t,n,r,i),mergeDivergenceScreen:(t,n,r)=>ge(e,V(n,r),t)}}const L=new Set([`snapshot`,`find`]),R=new Set([`press`,`click`,`fill`,`longpress`]),z=new Set([`press`,`click`,`fill`,`longpress`,`get`]);function B(e,t,n){return e.get(V(t,n))}function V(e,t){let n=typeof t==`string`&&t.length>0?t:`default`;return`${e??``}\u0000${n}`}function H(e,t,n,r,i){let a=V(r,i);if(R.has(t)){me(e,a,n);return}L.has(t)&&(t===`find`?pe(e,a,n):fe(e,a,n))}function fe(e,t,n){let r=n.refsGeneration;if(typeof r!=`number`){e.delete(t);return}let i=[];for(let{ref:e}of n.refs??[])i.push(e);for(let e of n.nodes??[])i.push(e.ref);U(e,t,i,r)}function pe(e,t,n){let r=n.refsGeneration,i=n.ref;typeof r!=`number`||typeof i!=`string`||!i.startsWith(`@`)||U(e,t,[i.slice(1)],r)}function me(e,t,n){let{settle:r}=n;r?.refsGeneration!==void 0&&U(e,t,[...r.diff?.lines??[],...r.refs??[],...r.tail??[]].map(e=>e.ref).filter(e=>typeof e==`string`),r.refsGeneration)}function U(e,t,n,r){if(n.length===0)return;let i=e.get(t)??new Map;e.set(t,i),he(i,n,r)}function he(e,t,n){for(let r of t)e.delete(r),e.set(r,n);for(;e.size>1e3;)e.delete(e.keys().next().value)}function ge(e,t,n){let r=a(a(n?.divergence)?.screen);if(r?.state!==`available`)return;let i=r.refsGeneration;if(typeof i!=`number`)return;let o=[];_e(r.refs,o),U(e,t,o,i)}function _e(e,t){if(Array.isArray(e))for(let n of e){let e=a(n)?.ref;typeof e==`string`&&e.length>0&&t.push(e)}}function ve(e,t,n){return n===void 0||n.size===0?t:e===`wait`?ye(t,n)??t:z.has(e)?be(t,n)??t:t}function ye(e,t){if(typeof e.ref!=`string`)return;let n=W(e.ref,t);return n===e.ref?void 0:{...e,ref:n}}function be(e,t){let n=a(e.target);if(n?.kind!==`ref`||typeof n.ref!=`string`)return;let r=W(n.ref,t);return r===n.ref?void 0:{...e,target:{...n,ref:r}}}function W(e,t){if(!e.startsWith(`@`)||e.includes(`~`))return e;let n=t.get(e.slice(1));return n===void 0?e:`${e}~s${n}`}function xe(){return ee().map(e=>{let t=e.name in A?A[e.name]:void 0;return{name:e.name,description:e.description,inputSchema:G(e.name,e.inputSchema),...t?{outputSchema:t}:{}}})}function Se(e={}){let n=I();return{execute:async(r,i)=>{if(!te(r))throw new t(`INVALID_ARGS`,`Unknown command tool: ${r}`);let a=G(r,ne(r).inputSchema).properties,o=N(r,i,a),s=De(o),c=je(o),l=n.pinInput(r,c,s.client.stateDir),u=await Te(e,s.client);try{let t=await(e.runCommand??Ee)(u,r,l);return n.mergeCommandResult(r,t,s.client.stateDir,c.session),{isError:!1,structuredContent:F(r,t),content:[{type:`text`,text:Me({name:r,input:c,result:t,outputFormat:s.outputFormat,responseLevel:s.client.responseLevel})}]}}catch(e){return Ce(e,n,s.client.stateDir,c.session)}}}}function Ce(e,t,n,r){let i=j(e);return t.mergeDivergenceScreen(i.details,n,r),{isError:!0,structuredContent:i,content:[{type:`text`,text:M(i)}]}}const we=Se();async function Te(e,t){if(e.createClient)return await e.createClient(t);let{createAgentDeviceClient:n}=await import(`./agent-device-client.js`).then(e=>e.t);return n(t)}async function Ee(e,t,n){return await(await import(`./command-surface.js`).then(e=>e.t)).runCommand(e,t,n)}function De(e){return{client:Oe(e),outputFormat:Ae(e.mcpOutputFormat)}}function Oe(e){let n=e.stateDir,r=e.includeCost,i=e.responseLevel,a={};if(n!==void 0){if(typeof n!=`string`||n.length===0)throw new t(`INVALID_ARGS`,`Expected stateDir to be a non-empty string.`);a.stateDir=n}if(r!==void 0){if(typeof r!=`boolean`)throw new t(`INVALID_ARGS`,`Expected includeCost to be a boolean.`);r&&(a.cost=!0)}let o=ke(i);return o!==void 0&&(a.responseLevel=o),a}function ke(e){if(e===void 0)return;let r=n.find(t=>t===e);if(r===void 0)throw new t(`INVALID_ARGS`,`Expected responseLevel to be one of 'digest', 'default', or 'full'.`);return r}function Ae(e){if(e===void 0)return`optimized`;if(e!==`optimized`&&e!==`json`)throw new t(`INVALID_ARGS`,`Expected mcpOutputFormat to be "optimized" or "json".`);return e}function je(e){let{stateDir:t,mcpOutputFormat:n,includeCost:r,responseLevel:i,...a}=e;return a}function G(e,t){let n=i(e);return{...t,properties:{...t.properties,...n&&!t.properties?.noRecord?{noRecord:{type:`boolean`,description:`Do not record this action.`}}:{},stateDir:{type:`string`,description:`Agent-device state directory.`},mcpOutputFormat:{type:`string`,enum:[`optimized`,`json`],description:`MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.`},includeCost:{type:`boolean`,description:`Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.`},responseLevel:{type:`string`,enum:[`digest`,`default`,`full`],description:`Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.`}}}}function Me(e){if(e.outputFormat===`json`||e.responseLevel!==void 0&&e.responseLevel!=="default")return K(e.result);let t=ie({name:e.name,input:e.input,result:e.result});return typeof t?.text==`string`?t.text:K(t?.data??e.result)}function K(e){return typeof e==`string`?e:JSON.stringify(e,null,2)}async function Ne(e){if(e.jsonrpc!==`2.0`||typeof e.method!=`string`)return q(e.id??null,-32600,`Invalid JSON-RPC request.`);if(e.id===void 0)return null;try{return Re(e.id,await Pe(e.method,e.params))}catch(t){return t instanceof X?q(e.id,-32601,t.message):q(e.id,-32602,t instanceof Error?t.message:String(t))}}async function Pe(e,t){switch(e){case`initialize`:return{protocolVersion:Ie(t),capabilities:{tools:{}},serverInfo:{name:`agent-device`,version:l()}};case`ping`:return{};case`tools/list`:return{tools:xe()};case`tools/call`:return await Fe(t);default:throw new X(`Unsupported MCP method: ${e}`)}}async function Fe(e){let t=J(e),n=ze(t,`name`);try{return await we.execute(n,Y(t.arguments))}catch(e){return Le(M(j(e)),!0)}}function Ie(e){return`2025-11-25`}function Le(e,t=!1){return{isError:t,content:[{type:`text`,text:e}]}}function Re(e,t){return{jsonrpc:`2.0`,id:e,result:t}}function q(e,t,n){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n}}}function J(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`Expected object parameters.`);return e}function Y(e){return e===void 0?{}:J(e)}function ze(e,n){let r=e[n];if(typeof r!=`string`||r.length===0)throw new t(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r}var X=class extends Error{};async function Be(){let e=Ve(),t=new Ke(t=>{e.push(t)});process.stdin.setEncoding(`utf8`),process.stdin.on(`data`,e=>{try{t.push(e)}catch(e){$({jsonrpc:`2.0`,id:null,error:{code:-32700,message:e instanceof Error?e.message:String(e)}})}}),await new Promise(e=>{process.stdin.on(`end`,e),process.stdin.on(`close`,e),process.stdin.resume()}),await e.idle()}function Ve(e={}){let t=e.handlePayload??He,n=e.write??$,r=Promise.resolve();return{push:e=>{let i=Ge(e);r=r.then(async()=>{let r=await t(e);r&&n(r)}).catch(e=>{n({jsonrpc:`2.0`,id:i,error:{code:-32603,message:e instanceof Error?e.message:String(e)}})})},idle:async()=>{await r}}}function He(e){return Array.isArray(e)?Ue(e):Z(e)}async function Ue(e){let t=[];for(let n of e)t.push(...qe(await Z(n)));return t.length>0?t:null}async function Z(e){let t;try{t=r.parse(e)}catch{return We(Q(e))}return Ne(t)}function We(e){return{jsonrpc:`2.0`,id:e,error:{code:-32600,message:`Invalid JSON-RPC request.`}}}function Ge(e){return Array.isArray(e)?e.length===1?Q(e[0]):null:Q(e)}function Q(e){if(e&&typeof e==`object`&&!Array.isArray(e)){let t=e.id;if(typeof t==`string`||typeof t==`number`||t===null)return t}return null}var Ke=class{buffer=``;sink;constructor(e){this.sink=e}push(e){for(this.buffer+=e;;){let e=this.tryReadLineMessage();if(e!==void 0){this.emit(e);continue}break}}tryReadLineMessage(){let e=this.buffer.indexOf(`
|
|
3
|
+
`);if(e===-1)return;let t=this.buffer.slice(0,e).trim();return this.buffer=this.buffer.slice(e+1),t.length>0?t:void 0}emit(e){this.sink(JSON.parse(e))}};function qe(e){return e?[e]:[]}function $(e){process.stdout.write(`${JSON.stringify(e)}\n`)}export{Be as runAgentDeviceMcpServer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,dt as t,gt as n,l as r,pt as i,s as a,vt as o,yt as s}from"./sdk-selectors.js";import{a as c,i as l,o as u,u as d}from"./android-input-method-overlays.js";import{un as f}from"./internal/daemon.js";function p(e,t={}){let n=t.mode??`action`,{node:r,preActionNodes:i}=e;if(typeof r.index!=`number`)return;let a=c(i),o=S(_(r),i);if(n===`landmark`&&o.id===void 0&&o.label===void 0)return;let s=l(r,a,8),u=s.chain,d=v(i,r),f=y(r,a),p=x(r),b=+(u.length>0),w=e=>{let t=u.slice(0,e),n=C({nodes:i,byIndex:a,node:r,identity:o,ancestry:t,sibling:d,scrollRegion:f});return{candidate:{...o,ancestry:t,sibling:d,viewportOrder:n.viewportOrder,...f?{scrollRegion:f}:{},...p?{rect:p}:{},verification:`verified`},domain:n}};for(let e=u.length;e>=b;--e){let{candidate:t,domain:i}=w(e);if(h(t))return t.verification=m({node:r,domain:i,mode:n,brokenWalk:s.broken}),t;if(e===b)return g(t)}}function m(e){return e.brokenWalk?`unverifiable`:e.mode===`landmark`?`verified`:T({node:e.node,domain:e.domain})}function h(e){return s(o({...e,verification:`unverifiable`}))<=t}function g(e){return e.verification=`unverifiable`,s(o(e))>4096&&delete e.rect,e}const _=a;function v(e,t){return r(e,t)}function y(e,t){let n=f(e,t);if(!n)return;let r=_(n);return{role:r.role,...r.id===void 0?r.label===void 0?{}:{label:r.label}:{id:r.id}}}function b(e,t){return!e&&!t?!0:!e||!t?!1:n(e,t)}function x(e){let t=e.rect;if(t)return{x:t.x,y:t.y,width:t.width,height:t.height}}function S(t,n){return e(t,n)}function C(e){let{nodes:t,byIndex:n,node:r,identity:i,ancestry:a,sibling:o,scrollRegion:s}=e,c=u(t,n,i,a),l=c.filter(e=>v(t,e)===o),d=c.length>0?c.filter(e=>b(y(e,n),s)):void 0,f=d?w(d):[];return{identitySet:c,siblingMatches:l,regionMembers:d,orderedRegion:f,viewportOrder:Math.max(f.findIndex(e=>e.index===r.index),0)}}function w(e){return e.map((e,t)=>({node:e,documentOrder:t,center:d(e.rect)})).sort((e,t)=>!e.center&&!t.center?e.documentOrder-t.documentOrder:e.center?t.center?e.center.y===t.center.y?e.center.x===t.center.x?e.documentOrder-t.documentOrder:e.center.x-t.center.x:e.center.y-t.center.y:-1:1).map(e=>e.node)}function T(e){let{node:t,domain:n}=e,r=t.ref,a=n.identitySet.map(e=>e.ref);return i({winnerRef:r,matchedRefs:a,identitySetRefs:a,siblingMatchRefs:n.siblingMatches.map(e=>e.ref),regionMemberRefs:n.regionMembers?.map(e=>e.ref),viewportCandidateRef:n.orderedRegion[n.viewportOrder]?.ref}).outcome}export{w as a,p as i,y as n,b as o,v as r,_ as t};
|