diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index 03beb69a..3bc8970c 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -50,13 +50,17 @@ jobs: preferred-device-name: iPhone 17 Pro - name: Run iOS simulator smoke replay - run: node --experimental-strip-types src/bin.ts test test/integration/replays/ios/simulator/01-settings.ad --retries 2 --report-junit test/artifacts/replays-ios-simulator-smoke.junit.xml + run: | + pnpm clean:daemon + node --experimental-strip-types src/bin.ts test test/integration/replays/ios/simulator/01-settings.ad --retries 2 --report-junit test/artifacts/replays-ios-simulator-smoke.junit.xml - name: Run iOS physical device smoke replay if: env.IOS_UDID != '' env: IOS_UDID: ${{ vars.IOS_UDID }} - run: node --experimental-strip-types src/bin.ts test test/integration/replays/ios/device/01-physical-lifecycle.ad --udid "$IOS_UDID" --retries 2 --report-junit test/artifacts/replays-ios-device-smoke.junit.xml + run: | + pnpm clean:daemon + node --experimental-strip-types src/bin.ts test test/integration/replays/ios/device/01-physical-lifecycle.ad --udid "$IOS_UDID" --retries 2 --report-junit test/artifacts/replays-ios-device-smoke.junit.xml - name: Upload iOS artifacts if: always() diff --git a/.github/workflows/pr-preview.yml b/.github/workflows/pr-preview.yml index de8e9638..18275742 100644 --- a/.github/workflows/pr-preview.yml +++ b/.github/workflows/pr-preview.yml @@ -12,6 +12,7 @@ concurrency: preview-${{ github.ref }} jobs: deploy-preview: + if: github.event.pull_request.head.repo.full_name == github.repository runs-on: ubuntu-latest permissions: contents: write diff --git a/fallow-baselines/dupes.json b/fallow-baselines/dupes.json index 6730601d..da0588af 100644 --- a/fallow-baselines/dupes.json +++ b/fallow-baselines/dupes.json @@ -2,14 +2,14 @@ "clone_groups": [ "src/__tests__/cli-batch.test.ts:36-42|src/__tests__/cli-batch.test.ts:53-58", "src/__tests__/cli-batch.test.ts:138-147|src/__tests__/cli-batch.test.ts:92-102", - "src/__tests__/cli-batch.test.ts:95-102|src/__tests__/cli-config.test.ts:925-931", + "src/__tests__/cli-batch.test.ts:95-102|src/__tests__/cli-config.test.ts:993-999", "src/__tests__/cli-batch.test.ts:113-121|src/__tests__/cli-diagnostics.test.ts:217-221", - "src/__tests__/cli-client-commands.test.ts:129-144|src/__tests__/cli-client-commands.test.ts:18-33|src/__tests__/cli-client-commands.test.ts:60-75", - "src/__tests__/cli-client-commands.test.ts:129-149|src/__tests__/cli-client-commands.test.ts:60-80", - "src/__tests__/cli-client-commands.test.ts:231-260|src/__tests__/cli-client-commands.test.ts:661-690", - "src/__tests__/cli-client-commands.test.ts:740-757|src/__tests__/remote-connection.test.ts:1336-1353", - "src/__tests__/cli-client-commands.test.ts:910-922|src/__tests__/cli-diff.test.ts:19-31|src/__tests__/runtime-diff-screenshot.test.ts:206-218", - "src/__tests__/cli-client-commands.test.ts:915-921|src/__tests__/cli-diff.test.ts:24-30|src/__tests__/runtime-diff-screenshot.test.ts:211-217|src/utils/__tests__/screenshot-diff.test.ts:20-26", + "src/__tests__/cli-client-commands.test.ts:130-145|src/__tests__/cli-client-commands.test.ts:19-34|src/__tests__/cli-client-commands.test.ts:61-76", + "src/__tests__/cli-client-commands.test.ts:130-150|src/__tests__/cli-client-commands.test.ts:61-81", + "src/__tests__/cli-client-commands.test.ts:232-261|src/__tests__/cli-client-commands.test.ts:662-691", + "src/__tests__/cli-client-commands.test.ts:818-834|src/__tests__/remote-connection.test.ts:1399-1415", + "src/__tests__/cli-client-commands.test.ts:990-1002|src/__tests__/cli-diff.test.ts:19-31|src/__tests__/runtime-diff-screenshot.test.ts:206-218", + "src/__tests__/cli-client-commands.test.ts:995-1001|src/__tests__/cli-diff.test.ts:24-30|src/__tests__/runtime-diff-screenshot.test.ts:211-217|src/utils/__tests__/screenshot-diff.test.ts:20-26", "src/__tests__/cli-clipboard.test.ts:22-28|src/__tests__/cli-clipboard.test.ts:8-14", "src/__tests__/cli-close.test.ts:26-33|src/__tests__/cli-close.test.ts:71-78", "src/__tests__/cli-close.test.ts:34-42|src/__tests__/cli-close.test.ts:79-87", @@ -17,17 +17,19 @@ "src/__tests__/cli-close.test.ts:34-39|src/__tests__/cli-close.test.ts:79-84|src/__tests__/cli-diff.test.ts:112-117|src/__tests__/cli-diff.test.ts:331-338", "src/__tests__/cli-close.test.ts:48-55|src/__tests__/cli-close.test.ts:62-70|src/__tests__/cli-close.test.ts:71-78", "src/__tests__/cli-config.test.ts:137-142|src/__tests__/cli-config.test.ts:22-27", - "src/__tests__/cli-config.test.ts:115-120|src/__tests__/cli-config.test.ts:54-59|src/__tests__/cli-config.test.ts:75-87|src/__tests__/cli-config.test.ts:914-919", - "src/__tests__/cli-config.test.ts:124-131|src/__tests__/cli-config.test.ts:157-164|src/__tests__/cli-config.test.ts:944-951", - "src/__tests__/cli-config.test.ts:157-164|src/__tests__/cli-config.test.ts:944-951", - "src/__tests__/cli-config.test.ts:273-281|src/__tests__/cli-config.test.ts:776-784|src/__tests__/cli-config.test.ts:839-847", - "src/__tests__/cli-config.test.ts:357-365|src/__tests__/cli-config.test.ts:481-489|src/__tests__/cli-config.test.ts:538-546|src/__tests__/cli-config.test.ts:623-631", - "src/__tests__/cli-config.test.ts:357-364|src/__tests__/cli-config.test.ts:449-456|src/__tests__/cli-config.test.ts:481-488|src/__tests__/cli-config.test.ts:538-545|src/__tests__/cli-config.test.ts:623-630", - "src/__tests__/cli-config.test.ts:481-518|src/__tests__/cli-config.test.ts:623-674", - "src/__tests__/cli-config.test.ts:481-490|src/__tests__/cli-config.test.ts:538-547|src/__tests__/cli-config.test.ts:623-632", - "src/__tests__/cli-config.test.ts:776-788|src/__tests__/cli-config.test.ts:839-851", - "src/__tests__/cli-config.test.ts:826-834|src/__tests__/cli-config.test.ts:873-882", - "src/__tests__/cli-config.test.ts:962-972|src/__tests__/cli-config.test.ts:982-992", + "src/__tests__/cli-config.test.ts:115-120|src/__tests__/cli-config.test.ts:54-59|src/__tests__/cli-config.test.ts:75-87|src/__tests__/cli-config.test.ts:982-987", + "src/__tests__/cli-config.test.ts:1012-1019|src/__tests__/cli-config.test.ts:124-131|src/__tests__/cli-config.test.ts:157-164", + "src/__tests__/cli-config.test.ts:1012-1019|src/__tests__/cli-config.test.ts:157-164", + "src/__tests__/cli-config.test.ts:273-281|src/__tests__/cli-config.test.ts:844-852|src/__tests__/cli-config.test.ts:907-915", + "src/__tests__/cli-config.test.ts:357-365|src/__tests__/cli-config.test.ts:481-489|src/__tests__/cli-config.test.ts:538-546|src/__tests__/cli-config.test.ts:606-614|src/__tests__/cli-config.test.ts:691-699", + "src/__tests__/cli-config.test.ts:357-364|src/__tests__/cli-config.test.ts:449-456|src/__tests__/cli-config.test.ts:481-488|src/__tests__/cli-config.test.ts:538-545|src/__tests__/cli-config.test.ts:606-613|src/__tests__/cli-config.test.ts:691-698", + "src/__tests__/cli-config.test.ts:367-381|src/__tests__/cli-config.test.ts:547-557", + "src/__tests__/cli-config.test.ts:481-518|src/__tests__/cli-config.test.ts:538-556|src/__tests__/cli-config.test.ts:691-742", + "src/__tests__/cli-config.test.ts:481-490|src/__tests__/cli-config.test.ts:538-547|src/__tests__/cli-config.test.ts:606-615|src/__tests__/cli-config.test.ts:691-700", + "src/__tests__/cli-config.test.ts:498-523|src/__tests__/cli-config.test.ts:559-599", + "src/__tests__/cli-config.test.ts:844-856|src/__tests__/cli-config.test.ts:907-919", + "src/__tests__/cli-config.test.ts:894-902|src/__tests__/cli-config.test.ts:941-950", + "src/__tests__/cli-config.test.ts:1030-1040|src/__tests__/cli-config.test.ts:1050-1060", "src/__tests__/cli-diagnostics.test.ts:123-138|src/__tests__/cli-diagnostics.test.ts:28-41", "src/__tests__/cli-diff.test.ts:103-111|src/__tests__/cli-diff.test.ts:131-139", "src/__tests__/cli-diff.test.ts:114-123|src/__tests__/cli-diff.test.ts:147-156", @@ -37,23 +39,23 @@ "src/__tests__/cli-diff.test.ts:212-226|src/__tests__/cli-diff.test.ts:290-294", "src/__tests__/cli-diff.test.ts:233-246|src/__tests__/cli-diff.test.ts:260-273", "src/__tests__/cli-diff.test.ts:349-366|src/__tests__/runtime-diff-screenshot.test.ts:144-174", - "src/__tests__/cli-diff.test.ts:373-381|src/__tests__/cli-network.test.ts:86-94", + "src/__tests__/cli-diff.test.ts:373-381|src/__tests__/cli-help.test.ts:67-72|src/__tests__/cli-help.test.ts:73-78|src/__tests__/cli-help.test.ts:79-84|src/__tests__/cli-network.test.ts:86-94", "src/__tests__/cli-help.test.ts:22-26|src/__tests__/cli-help.test.ts:6-10", - "src/__tests__/cli-help.test.ts:30-37|src/__tests__/cli-help.test.ts:38-45", - "src/__tests__/cli-help.test.ts:46-50|src/__tests__/cli-help.test.ts:56-60", + "src/__tests__/cli-help.test.ts:30-34|src/__tests__/cli-help.test.ts:38-42|src/__tests__/cli-help.test.ts:47-51|src/__tests__/cli-help.test.ts:56-60|src/__tests__/cli-help.test.ts:65-69", + "src/__tests__/cli-help.test.ts:38-46|src/__tests__/cli-help.test.ts:47-55|src/__tests__/cli-help.test.ts:56-64", + "src/__tests__/cli-help.test.ts:55-61|src/__tests__/cli-help.test.ts:64-70", + "src/__tests__/cli-help.test.ts:67-76|src/__tests__/cli-help.test.ts:77-86", + "src/__tests__/cli-help.test.ts:67-85|src/__tests__/cli-network.test.ts:86-95", + "src/__tests__/cli-help.test.ts:100-104|src/__tests__/cli-help.test.ts:90-94", "src/__tests__/cli-logs.test.ts:18-22|src/__tests__/cli-network.test.ts:93-97", - "src/__tests__/client-companion-tunnel-worker.test.ts:151-157|test/integration/installed-package-metro.test.ts:12-17", - "src/__tests__/client-companion-tunnel-worker.test.ts:159-170|test/integration/installed-package-metro.test.ts:17-27", - "src/__tests__/client-companion-tunnel-worker.test.ts:251-269|src/__tests__/client-companion-tunnel-worker.test.ts:315-333|src/__tests__/client-companion-tunnel-worker.test.ts:610-628", - "src/__tests__/client-companion-tunnel-worker.test.ts:286-306|src/__tests__/client-companion-tunnel-worker.test.ts:468-484|src/__tests__/client-companion-tunnel-worker.test.ts:585-601", - "src/__tests__/client-companion-tunnel-worker.test.ts:291-295|test/scripts/metro-prepare-packaged-smoke.mjs:89-93", - "src/__tests__/client-companion-tunnel-worker.test.ts:297-334|src/__tests__/client-companion-tunnel-worker.test.ts:592-629", - "src/__tests__/client-companion-tunnel-worker.test.ts:315-333|src/__tests__/client-companion-tunnel-worker.test.ts:493-513|src/__tests__/client-companion-tunnel-worker.test.ts:610-628", - "src/__tests__/client-companion-tunnel-worker.test.ts:387-409|src/__tests__/client-companion-tunnel-worker.test.ts:539-561", - "src/__tests__/client-companion-tunnel-worker.test.ts:459-492|src/__tests__/client-companion-tunnel-worker.test.ts:576-609", - "src/__tests__/client-companion-tunnel-worker.test.ts:473-487|src/__tests__/client-companion-tunnel-worker.test.ts:590-604|test/integration/installed-package-metro.test.ts:226-241", - "src/__tests__/client-companion-tunnel-worker.test.ts:647-661|src/__tests__/client-companion-tunnel-worker.test.ts:695-709", - "src/__tests__/client-companion-tunnel-worker.test.ts:664-670|src/__tests__/client-companion-tunnel-worker.test.ts:709-715", + "src/__tests__/client-companion-tunnel-worker.test.ts:196-207|test/integration/installed-package-metro.test.ts:13-18", + "src/__tests__/client-companion-tunnel-worker.test.ts:209-220|test/integration/installed-package-metro.test.ts:18-28", + "src/__tests__/client-companion-tunnel-worker.test.ts:390-394|test/scripts/metro-prepare-packaged-smoke.mjs:89-93", + "src/__tests__/client-companion-tunnel-worker.test.ts:396-409|src/__tests__/client-companion-tunnel-worker.test.ts:615-628|src/__tests__/client-companion-tunnel-worker.test.ts:666-679", + "src/__tests__/client-companion-tunnel-worker.test.ts:505-526|src/__tests__/client-companion-tunnel-worker.test.ts:655-676", + "src/__tests__/client-companion-tunnel-worker.test.ts:505-519|src/__tests__/client-companion-tunnel-worker.test.ts:593-618|src/__tests__/client-companion-tunnel-worker.test.ts:655-669", + "src/__tests__/client-companion-tunnel-worker.test.ts:554-573|src/__tests__/client-companion-tunnel-worker.test.ts:595-618", + "src/__tests__/client-companion-tunnel-worker.test.ts:615-636|src/__tests__/client-companion-tunnel-worker.test.ts:666-687", "src/__tests__/client-metro-auto-companion.test.ts:157-163|src/__tests__/client-metro-auto-companion.test.ts:229-235|src/__tests__/client-metro-auto-companion.test.ts:28-34|src/__tests__/client-metro-auto-companion.test.ts:282-288|src/__tests__/client-metro-auto-companion.test.ts:333-339|src/__tests__/client-metro-auto-companion.test.ts:409-415|src/__tests__/client-metro-startup-cleanup.test.ts:28-34", "src/__tests__/client-metro-auto-companion.test.ts:340-366|src/__tests__/client-metro-auto-companion.test.ts:35-61|src/__tests__/client-metro-auto-companion.test.ts:416-442", "src/__tests__/client-metro-auto-companion.test.ts:444-470|src/__tests__/client-metro-auto-companion.test.ts:58-84", @@ -61,32 +63,34 @@ "src/__tests__/client-metro-auto-companion.test.ts:281-288|src/__tests__/client-metro-auto-companion.test.ts:332-339", "src/__tests__/client-metro-auto-companion.test.ts:340-367|src/__tests__/client-metro-auto-companion.test.ts:416-443", "src/__tests__/client-metro-companion.test.ts:161-178|src/__tests__/client-metro-companion.test.ts:62-79", - "src/__tests__/remote-connection.test.ts:121-127|src/__tests__/remote-connection.test.ts:199-205", - "src/__tests__/remote-connection.test.ts:1132-1137|src/__tests__/remote-connection.test.ts:235-240", - "src/__tests__/remote-connection.test.ts:293-311|src/__tests__/remote-connection.test.ts:455-473|src/__tests__/remote-connection.test.ts:742-760", - "src/__tests__/remote-connection.test.ts:293-307|src/__tests__/remote-connection.test.ts:455-469|src/__tests__/remote-connection.test.ts:742-756|src/__tests__/remote-connection.test.ts:842-856", - "src/__tests__/remote-connection.test.ts:293-301|src/__tests__/remote-connection.test.ts:455-463|src/__tests__/remote-connection.test.ts:509-517|src/__tests__/remote-connection.test.ts:609-617|src/__tests__/remote-connection.test.ts:681-689|src/__tests__/remote-connection.test.ts:742-750|src/__tests__/remote-connection.test.ts:793-801|src/__tests__/remote-connection.test.ts:842-850|src/__tests__/remote-connection.test.ts:914-922", - "src/__tests__/remote-connection.test.ts:333-358|src/__tests__/remote-connection.test.ts:411-436", - "src/__tests__/remote-connection.test.ts:509-525|src/__tests__/remote-connection.test.ts:609-625|src/__tests__/remote-connection.test.ts:681-697", - "src/__tests__/remote-connection.test.ts:509-522|src/__tests__/remote-connection.test.ts:609-622|src/__tests__/remote-connection.test.ts:681-694|src/__tests__/remote-connection.test.ts:793-806", - "src/__tests__/remote-connection.test.ts:609-629|src/__tests__/remote-connection.test.ts:681-701", - "src/__tests__/remote-connection.test.ts:1200-1209|src/__tests__/remote-connection.test.ts:903-913", - "src/__tests__/remote-connection.test.ts:925-945|src/__tests__/remote-connection.test.ts:972-992", - "src/__tests__/remote-connection.test.ts:1006-1016|src/__tests__/remote-connection.test.ts:1076-1086", - "src/__tests__/remote-connection.test.ts:1027-1050|src/__tests__/remote-connection.test.ts:1097-1120", - "src/__tests__/remote-connection.test.ts:1210-1228|src/__tests__/remote-connection.test.ts:1269-1287", + "src/__tests__/cloud-connect-profile.test.ts:116-134|src/__tests__/cloud-connect-profile.test.ts:61-79", + "src/__tests__/remote-connection.test.ts:121-127|src/__tests__/remote-connection.test.ts:201-207", + "src/__tests__/remote-connection.test.ts:1194-1199|src/__tests__/remote-connection.test.ts:237-242", + "src/__tests__/remote-connection.test.ts:295-314|src/__tests__/remote-connection.test.ts:683-702", + "src/__tests__/remote-connection.test.ts:295-313|src/__tests__/remote-connection.test.ts:457-475|src/__tests__/remote-connection.test.ts:683-701|src/__tests__/remote-connection.test.ts:804-822", + "src/__tests__/remote-connection.test.ts:295-309|src/__tests__/remote-connection.test.ts:457-471|src/__tests__/remote-connection.test.ts:683-697|src/__tests__/remote-connection.test.ts:804-818|src/__tests__/remote-connection.test.ts:904-918", + "src/__tests__/remote-connection.test.ts:295-303|src/__tests__/remote-connection.test.ts:457-465|src/__tests__/remote-connection.test.ts:511-519|src/__tests__/remote-connection.test.ts:611-619|src/__tests__/remote-connection.test.ts:683-691|src/__tests__/remote-connection.test.ts:743-751|src/__tests__/remote-connection.test.ts:804-812|src/__tests__/remote-connection.test.ts:855-863|src/__tests__/remote-connection.test.ts:904-912|src/__tests__/remote-connection.test.ts:976-984", + "src/__tests__/remote-connection.test.ts:335-360|src/__tests__/remote-connection.test.ts:413-438", + "src/__tests__/remote-connection.test.ts:511-527|src/__tests__/remote-connection.test.ts:611-627|src/__tests__/remote-connection.test.ts:743-759", + "src/__tests__/remote-connection.test.ts:511-524|src/__tests__/remote-connection.test.ts:611-624|src/__tests__/remote-connection.test.ts:743-756|src/__tests__/remote-connection.test.ts:855-868", + "src/__tests__/remote-connection.test.ts:611-631|src/__tests__/remote-connection.test.ts:743-763", + "src/__tests__/remote-connection.test.ts:1262-1271|src/__tests__/remote-connection.test.ts:965-975", + "src/__tests__/remote-connection.test.ts:1034-1054|src/__tests__/remote-connection.test.ts:987-1007", + "src/__tests__/remote-connection.test.ts:1068-1078|src/__tests__/remote-connection.test.ts:1138-1148", + "src/__tests__/remote-connection.test.ts:1089-1112|src/__tests__/remote-connection.test.ts:1159-1182", + "src/__tests__/remote-connection.test.ts:1272-1290|src/__tests__/remote-connection.test.ts:1331-1349", "src/__tests__/runtime-admin-router.test.ts:12-22|src/__tests__/runtime-public.test.ts:49-59", "src/__tests__/runtime-admin-router.test.ts:13-24|src/__tests__/runtime-diagnostics-router.test.ts:14-25", "src/__tests__/runtime-diff-screenshot.test.ts:113-127|src/__tests__/runtime-diff-screenshot.test.ts:62-76", "src/__tests__/runtime-snapshot.test.ts:119-132|src/__tests__/runtime-snapshot.test.ts:160-173|src/__tests__/runtime-snapshot.test.ts:206-219", "src/__tests__/runtime-snapshot.test.ts:160-180|src/__tests__/runtime-snapshot.test.ts:206-226", "src/__tests__/runtime-snapshot.test.ts:180-194|src/__tests__/runtime-snapshot.test.ts:226-240", - "src/__tests__/test-utils/mocked-binaries.ts:11-17|src/platforms/android/__tests__/index.test.ts:34-39", - "src/__tests__/test-utils/mocked-binaries.ts:18-26|src/platforms/android/__tests__/index.test.ts:1845-1853|src/platforms/android/__tests__/index.test.ts:1918-1926|src/platforms/android/__tests__/index.test.ts:370-377|src/platforms/android/__tests__/index.test.ts:39-45|src/platforms/android/__tests__/index.test.ts:862-870|src/platforms/android/__tests__/index.test.ts:901-909", + "src/__tests__/test-utils/mocked-binaries.ts:11-17|src/platforms/android/__tests__/index.test.ts:36-41", + "src/__tests__/test-utils/mocked-binaries.ts:18-26|src/platforms/android/__tests__/index.test.ts:1981-1989|src/platforms/android/__tests__/index.test.ts:2054-2062|src/platforms/android/__tests__/index.test.ts:41-47|src/platforms/android/__tests__/index.test.ts:415-422|src/platforms/android/__tests__/index.test.ts:922-930|src/platforms/android/__tests__/index.test.ts:961-969", "src/__tests__/test-utils/mocked-binaries.ts:21-35|src/__tests__/test-utils/mocked-binaries.ts:54-68", - "src/__tests__/test-utils/mocked-binaries.ts:44-48|src/platforms/ios/__tests__/index.test.ts:162-166", - "src/__tests__/test-utils/mocked-binaries.ts:51-62|src/platforms/ios/__tests__/index.test.ts:168-177", - "src/__tests__/test-utils/mocked-binaries.ts:51-63|src/platforms/ios/__tests__/index.test.ts:168-178|src/platforms/ios/__tests__/index.test.ts:959-974", + "src/__tests__/test-utils/mocked-binaries.ts:44-48|src/platforms/ios/__tests__/index.test.ts:163-167", + "src/__tests__/test-utils/mocked-binaries.ts:51-62|src/platforms/ios/__tests__/index.test.ts:169-178", + "src/__tests__/test-utils/mocked-binaries.ts:51-63|src/platforms/ios/__tests__/index.test.ts:169-179|src/platforms/ios/__tests__/index.test.ts:960-975", "src/__tests__/update-check.test.ts:66-84|src/__tests__/update-check.test.ts:93-112", "src/__tests__/upload-client.test.ts:133-146|src/__tests__/upload-client.test.ts:171-184|src/__tests__/upload-client.test.ts:241-254|src/__tests__/upload-client.test.ts:321-334|src/__tests__/upload-client.test.ts:52-65|src/__tests__/upload-client.test.ts:95-108", "src/__tests__/upload-client.test.ts:116-128|src/__tests__/upload-client.test.ts:154-166|src/__tests__/upload-client.test.ts:73-87", @@ -97,35 +101,35 @@ "src/__tests__/upload-client.test.ts:119-124|src/__tests__/upload-client.test.ts:157-162|src/__tests__/upload-client.test.ts:288-293", "src/__tests__/upload-client.test.ts:126-133|src/__tests__/upload-client.test.ts:164-171", "src/__tests__/upload-client.test.ts:196-203|src/__tests__/upload-client.test.ts:350-357", - "src/cli/commands/connection.ts:127-140|src/cli/commands/connection.ts:175-188", - "src/cli/commands/output.ts:146-150|src/cli/commands/output.ts:205-209", + "src/cli/auth-session.ts:460-473|src/cli/cloud-connection-profile.ts:76-89", + "src/cli/commands/connection.ts:152-165|src/cli/commands/connection.ts:200-213", "src/client-normalizers.ts:109-113|src/client-normalizers.ts:90-94", - "src/client.ts:632-658|src/index.ts:79-105", + "src/client.ts:638-664|src/index.ts:79-105", "src/commands/admin.ts:306-313|src/commands/apps.ts:286-295", - "src/commands/capture-snapshot.ts:104-110|src/commands/selector-read-shared.ts:42-47", - "src/commands/interactions.ts:207-215|src/core/dispatch.ts:876-884", + "src/commands/capture-snapshot.ts:107-113|src/commands/selector-read-shared.ts:42-47", + "src/commands/interactions.ts:207-215|src/core/dispatch.ts:883-891", "src/commands/selector-read.ts:169-178|src/commands/selector-read.ts:403-410", "src/contracts.ts:422-427|src/contracts.ts:457-462", "src/core/__tests__/dispatch-open.test.ts:17-25|src/core/__tests__/dispatch-push.test.ts:12-20", - "src/core/__tests__/dispatch-push.test.ts:12-22|src/platforms/android/__tests__/index.test.ts:1771-1781|src/platforms/android/__tests__/index.test.ts:1793-1803|src/platforms/android/__tests__/index.test.ts:826-836|src/platforms/ios/__tests__/index.test.ts:2197-2207", + "src/core/__tests__/dispatch-push.test.ts:12-22|src/platforms/android/__tests__/index.test.ts:1907-1917|src/platforms/android/__tests__/index.test.ts:1929-1939|src/platforms/android/__tests__/index.test.ts:886-896|src/platforms/ios/__tests__/index.test.ts:2320-2330", "src/core/__tests__/dispatch-push.test.ts:26-36|src/core/__tests__/dispatch-trigger-app-event.test.ts:258-270|src/core/__tests__/dispatch-trigger-app-event.test.ts:281-296|src/core/__tests__/dispatch-trigger-app-event.test.ts:304-316|src/core/__tests__/dispatch-trigger-app-event.test.ts:47-62", - "src/core/__tests__/dispatch-push.test.ts:26-36|src/platforms/ios/__tests__/index.test.ts:1473-1484", + "src/core/__tests__/dispatch-push.test.ts:26-36|src/platforms/ios/__tests__/index.test.ts:1474-1485", "src/core/__tests__/dispatch-trigger-app-event.test.ts:18-25|src/core/__tests__/dispatch-trigger-app-event.test.ts:301-307", - "src/core/__tests__/dispatch-trigger-app-event.test.ts:22-29|src/platforms/ios/__tests__/index.test.ts:2000-2007", + "src/core/__tests__/dispatch-trigger-app-event.test.ts:22-29|src/platforms/ios/__tests__/index.test.ts:2123-2130", "src/core/__tests__/dispatch-trigger-app-event.test.ts:258-273|src/core/__tests__/dispatch-trigger-app-event.test.ts:281-299|src/core/__tests__/dispatch-trigger-app-event.test.ts:47-65", "src/core/__tests__/dispatch-trigger-app-event.test.ts:258-271|src/core/__tests__/dispatch-trigger-app-event.test.ts:281-297|src/core/__tests__/dispatch-trigger-app-event.test.ts:304-317|src/core/__tests__/dispatch-trigger-app-event.test.ts:47-63", "src/core/__tests__/dispatch-trigger-app-event.test.ts:111-124|src/core/__tests__/dispatch-trigger-app-event.test.ts:66-78", "src/core/__tests__/dispatch-trigger-app-event.test.ts:135-145|src/core/__tests__/dispatch-trigger-app-event.test.ts:192-202|src/core/__tests__/dispatch-trigger-app-event.test.ts:237-247", "src/core/__tests__/dispatch-trigger-app-event.test.ts:179-192|src/core/__tests__/dispatch-trigger-app-event.test.ts:233-237", "src/core/__tests__/dispatch-trigger-app-event.test.ts:191-202|src/core/__tests__/dispatch-trigger-app-event.test.ts:237-247", - "src/core/dispatch.ts:68-235|src/daemon/context.ts:19-68", - "src/daemon/__tests__/app-log-android.test.ts:95-105|src/daemon/handlers/__tests__/session.test.ts:4864-4875", + "src/core/dispatch.ts:69-236|src/daemon/context.ts:19-68", + "src/daemon/__tests__/app-log-android.test.ts:114-121|src/daemon/__tests__/app-log-android.test.ts:82-88", + "src/daemon/__tests__/app-log-android.test.ts:128-138|src/daemon/handlers/__tests__/session.test.ts:4864-4875", "src/daemon/__tests__/app-log.test.ts:141-145|src/daemon/__tests__/app-log.test.ts:74-78", "src/daemon/__tests__/artifact-materialization.test.ts:223-231|src/daemon/__tests__/artifact-materialization.test.ts:259-267", "src/daemon/__tests__/http-server.test.ts:15-31|test/integration/smoke-open-remote-config.test.ts:86-102", "src/daemon/__tests__/http-server.test.ts:19-27|test/integration/smoke-daemon-http.test.ts:188-196|test/integration/smoke-open-remote-config.test.ts:90-98|test/scripts/metro-prepare-packaged-smoke.mjs:56-62", - "src/daemon/__tests__/http-server.test.ts:20-28|src/utils/__tests__/daemon-client.test.ts:36-44|test/integration/smoke-open-remote-config.test.ts:91-99", - "src/daemon/__tests__/http-server.test.ts:32-41|src/daemon/transport.ts:109-118|src/daemon/transport.ts:124-133", + "src/daemon/__tests__/http-server.test.ts:32-41|src/daemon/transport.ts:123-132|src/daemon/transport.ts:138-147", "src/daemon/__tests__/http-server.test.ts:131-153|src/daemon/__tests__/http-server.test.ts:178-200|src/daemon/__tests__/http-server.test.ts:351-373", "src/daemon/__tests__/http-server.test.ts:171-217|src/daemon/__tests__/http-server.test.ts:236-278", "src/daemon/__tests__/http-server.test.ts:171-181|src/daemon/__tests__/http-server.test.ts:236-246|src/daemon/__tests__/http-server.test.ts:344-354", @@ -135,15 +139,16 @@ "src/daemon/__tests__/materialized-path-registry.test.ts:41-48|src/daemon/handlers/__tests__/session.test.ts:765-771", "src/daemon/__tests__/materialized-path-registry.test.ts:41-47|src/daemon/handlers/__tests__/session.test.ts:765-770|src/daemon/handlers/__tests__/session.test.ts:803-808", "src/daemon/__tests__/network-log.test.ts:68-74|src/daemon/__tests__/network-log.test.ts:99-105", - "src/daemon/__tests__/request-router-android-modal.test.ts:98-112|src/daemon/__tests__/request-router-recording-health.test.ts:49-63", + "src/daemon/__tests__/request-router-android-modal.test.ts:102-116|src/daemon/__tests__/request-router-recording-health.test.ts:49-63", + "src/daemon/__tests__/request-router-android-perf.test.ts:43-72|src/daemon/__tests__/request-router-android-perf.test.ts:79-93", "src/daemon/__tests__/request-router-lock-policy.test.ts:1-16|src/daemon/__tests__/request-router-recording-health.test.ts:1-16", "src/daemon/__tests__/request-router-lock-policy.test.ts:1-7|src/daemon/__tests__/request-router-open.test.ts:1-9|src/daemon/__tests__/request-router-recording-health.test.ts:1-7", "src/daemon/__tests__/request-router-lock-policy.test.ts:2-12|src/daemon/__tests__/request-router-recording-health.test.ts:2-12|src/daemon/__tests__/request-router-screenshot.test.ts:3-13", "src/daemon/__tests__/request-router-lock-policy.test.ts:40-55|src/daemon/__tests__/request-router-lock-policy.test.ts:73-88", "src/daemon/__tests__/request-router-lock-policy.test.ts:121-140|src/daemon/__tests__/request-router-lock-policy.test.ts:42-59", "src/daemon/__tests__/request-router-lock-policy.test.ts:57-69|src/daemon/__tests__/request-router-lock-policy.test.ts:90-109", - "src/daemon/__tests__/request-router-lock-policy.test.ts:65-73|src/daemon/handlers/__tests__/replay-heal.test.ts:690-698", - "src/daemon/__tests__/request-router-lock-policy.test.ts:105-109|src/daemon/__tests__/request-router-lock-policy.test.ts:65-69|src/daemon/handlers/__tests__/find.test.ts:192-197|src/daemon/handlers/__tests__/replay-heal.test.ts:690-694|src/daemon/handlers/__tests__/replay-heal.test.ts:721-725", + "src/daemon/__tests__/request-router-lock-policy.test.ts:65-73|src/daemon/handlers/__tests__/replay-heal.test.ts:744-752", + "src/daemon/__tests__/request-router-lock-policy.test.ts:105-109|src/daemon/__tests__/request-router-lock-policy.test.ts:65-69|src/daemon/handlers/__tests__/find.test.ts:192-197|src/daemon/handlers/__tests__/replay-heal.test.ts:744-748|src/daemon/handlers/__tests__/replay-heal.test.ts:775-779", "src/daemon/__tests__/request-router-lock-policy.test.ts:116-127|src/daemon/__tests__/request-router-lock-policy.test.ts:162-173", "src/daemon/__tests__/request-router-lock-policy.test.ts:120-133|src/daemon/__tests__/request-router-screenshot.test.ts:295-308|src/daemon/__tests__/request-router-screenshot.test.ts:383-396|src/daemon/__tests__/request-router-screenshot.test.ts:454-467", "src/daemon/__tests__/request-router-open.test.ts:154-175|src/daemon/__tests__/request-router-open.test.ts:83-99", @@ -156,8 +161,7 @@ "src/daemon/__tests__/request-router-screenshot.test.ts:292-310|src/daemon/__tests__/request-router-screenshot.test.ts:370-398|src/daemon/__tests__/request-router-screenshot.test.ts:441-469", "src/daemon/__tests__/request-router-screenshot.test.ts:362-376|src/daemon/__tests__/request-router-screenshot.test.ts:433-447", "src/daemon/__tests__/request-router-screenshot.test.ts:377-400|src/daemon/__tests__/request-router-screenshot.test.ts:448-471", - "src/daemon/__tests__/runtime-hints.test.ts:138-146|src/platforms/ios/__tests__/index.test.ts:958-967", - "src/daemon/__tests__/runtime-hints.test.ts:138-150|src/platforms/ios/__tests__/index.test.ts:1493-1505|src/platforms/ios/__tests__/index.test.ts:795-807|src/platforms/ios/__tests__/index.test.ts:844-856", + "src/daemon/__tests__/runtime-hints.test.ts:138-150|src/platforms/ios/__tests__/index.test.ts:1728-1741", "src/daemon/__tests__/runtime-hints.test.ts:285-300|src/daemon/__tests__/runtime-hints.test.ts:320-334|src/daemon/__tests__/runtime-hints.test.ts:354-369", "src/daemon/__tests__/runtime-hints.test.ts:303-317|src/daemon/__tests__/runtime-hints.test.ts:337-351", "src/daemon/__tests__/session-store.test.ts:102-112|src/daemon/__tests__/session-store.test.ts:168-178|src/daemon/__tests__/session-store.test.ts:190-200|src/daemon/__tests__/session-store.test.ts:243-253|src/daemon/__tests__/session-store.test.ts:279-289", @@ -169,10 +173,10 @@ "src/daemon/app-log-ios.ts:102-119|src/daemon/app-log-ios.ts:180-195", "src/daemon/app-log-ios.ts:102-119|src/daemon/app-log-ios.ts:142-159|src/daemon/app-log-ios.ts:180-195", "src/daemon/app-log-ios.ts:120-130|src/daemon/app-log-ios.ts:160-170|src/daemon/app-log-ios.ts:196-206", - "src/daemon/handlers/__tests__/find.test.ts:282-301|src/daemon/handlers/__tests__/snapshot-handler.test.ts:210-229|src/daemon/handlers/__tests__/snapshot-handler.test.ts:282-301|src/daemon/handlers/__tests__/snapshot-handler.test.ts:398-417|src/daemon/handlers/__tests__/snapshot-handler.test.ts:460-479|src/daemon/handlers/__tests__/snapshot-handler.test.ts:510-529", - "src/daemon/handlers/__tests__/find.test.ts:313-325|src/daemon/handlers/__tests__/snapshot-handler.test.ts:242-254", + "src/daemon/handlers/__tests__/find.test.ts:283-302|src/daemon/handlers/__tests__/snapshot-handler.test.ts:210-229|src/daemon/handlers/__tests__/snapshot-handler.test.ts:282-301|src/daemon/handlers/__tests__/snapshot-handler.test.ts:398-417|src/daemon/handlers/__tests__/snapshot-handler.test.ts:460-479|src/daemon/handlers/__tests__/snapshot-handler.test.ts:510-529", + "src/daemon/handlers/__tests__/find.test.ts:314-326|src/daemon/handlers/__tests__/snapshot-handler.test.ts:242-254", "src/daemon/handlers/__tests__/install-source.test.ts:128-144|src/daemon/handlers/__tests__/install-source.test.ts:166-182", - "src/daemon/handlers/__tests__/install-source.test.ts:180-185|src/daemon/handlers/__tests__/replay-heal.test.ts:355-359", + "src/daemon/handlers/__tests__/install-source.test.ts:180-185|src/daemon/handlers/__tests__/replay-heal.test.ts:409-413", "src/daemon/handlers/__tests__/interaction.test.ts:164-176|src/daemon/handlers/__tests__/interaction.test.ts:757-769", "src/daemon/handlers/__tests__/interaction.test.ts:1784-1795|src/daemon/handlers/__tests__/interaction.test.ts:245-256", "src/daemon/handlers/__tests__/interaction.test.ts:1379-1390|src/daemon/handlers/__tests__/interaction.test.ts:1784-1795|src/daemon/handlers/__tests__/interaction.test.ts:245-256", @@ -200,7 +204,7 @@ "src/daemon/handlers/__tests__/interaction.test.ts:1442-1467|src/daemon/handlers/__tests__/interaction.test.ts:1567-1592", "src/daemon/handlers/__tests__/interaction.test.ts:1442-1457|src/daemon/handlers/__tests__/interaction.test.ts:1567-1582|src/daemon/handlers/__tests__/interaction.test.ts:1695-1710", "src/daemon/handlers/__tests__/interaction.test.ts:1459-1470|src/daemon/handlers/__tests__/interaction.test.ts:1712-1723", - "src/daemon/handlers/__tests__/interaction.test.ts:1543-1560|src/daemon/handlers/__tests__/interaction.test.ts:1671-1688|src/daemon/handlers/__tests__/snapshot-handler.test.ts:693-710", + "src/daemon/handlers/__tests__/interaction.test.ts:1543-1560|src/daemon/handlers/__tests__/interaction.test.ts:1671-1688|src/daemon/handlers/__tests__/snapshot-handler.test.ts:725-742", "src/daemon/handlers/__tests__/interaction.test.ts:1548-1567|src/daemon/handlers/__tests__/interaction.test.ts:1676-1695", "src/daemon/handlers/__tests__/interaction.test.ts:1841-1845|src/daemon/handlers/__tests__/interaction.test.ts:1948-1952", "src/daemon/handlers/__tests__/interaction.test.ts:1851-1859|src/daemon/handlers/__tests__/interaction.test.ts:1907-1914|src/daemon/handlers/__tests__/interaction.test.ts:1958-1965", @@ -209,34 +213,48 @@ "src/daemon/handlers/__tests__/interaction.test.ts:1979-1996|src/daemon/handlers/__tests__/session.test.ts:1440-1458|src/daemon/handlers/__tests__/session.test.ts:324-360", "src/daemon/handlers/__tests__/interaction.test.ts:1984-1995|src/daemon/handlers/__tests__/interaction.test.ts:2022-2033", "src/daemon/handlers/__tests__/interaction.test.ts:1992-1996|src/daemon/handlers/__tests__/session.test.ts:1454-1458|src/daemon/handlers/__tests__/session.test.ts:356-360|src/daemon/handlers/__tests__/session.test.ts:5560-5565", - "src/daemon/handlers/__tests__/record-trace.test.ts:37-51|src/daemon/handlers/__tests__/session-device-utils.test.ts:4-18", - "src/daemon/handlers/__tests__/record-trace.test.ts:88-98|src/daemon/handlers/__tests__/session-close-shutdown.test.ts:48-58|src/daemon/handlers/__tests__/session-open-runtime.test.ts:49-59", - "src/daemon/handlers/__tests__/record-trace.test.ts:280-287|src/daemon/handlers/__tests__/record-trace.test.ts:406-413", - "src/daemon/handlers/__tests__/record-trace.test.ts:282-295|src/daemon/handlers/__tests__/record-trace.test.ts:365-378", - "src/daemon/handlers/__tests__/record-trace.test.ts:327-331|src/daemon/handlers/__tests__/record-trace.test.ts:394-399", - "src/daemon/handlers/__tests__/record-trace.test.ts:474-485|src/daemon/handlers/__tests__/record-trace.test.ts:496-507", - "src/daemon/handlers/__tests__/record-trace.test.ts:519-531|src/daemon/handlers/__tests__/record-trace.test.ts:543-555", - "src/daemon/handlers/__tests__/record-trace.test.ts:531-541|src/daemon/handlers/__tests__/record-trace.test.ts:555-565", - "src/daemon/handlers/__tests__/record-trace.test.ts:551-565|src/daemon/handlers/__tests__/record-trace.test.ts:575-586", - "src/daemon/handlers/__tests__/record-trace.test.ts:571-582|src/daemon/handlers/__tests__/record-trace.test.ts:593-604", - "src/daemon/handlers/__tests__/record-trace.test.ts:594-608|src/daemon/handlers/__tests__/record-trace.test.ts:667-681", - "src/daemon/handlers/__tests__/record-trace.test.ts:1129-1139|src/daemon/handlers/__tests__/record-trace.test.ts:872-882", - "src/daemon/handlers/__tests__/record-trace.test.ts:1118-1127|src/daemon/handlers/__tests__/record-trace.test.ts:971-980", + "src/daemon/handlers/__tests__/record-trace.test.ts:41-55|src/daemon/handlers/__tests__/session-device-utils.test.ts:4-18", + "src/daemon/handlers/__tests__/record-trace.test.ts:92-102|src/daemon/handlers/__tests__/session-close-shutdown.test.ts:48-58|src/daemon/handlers/__tests__/session-open-runtime.test.ts:49-59", + "src/daemon/handlers/__tests__/record-trace.test.ts:209-216|src/daemon/handlers/__tests__/record-trace.test.ts:335-342", + "src/daemon/handlers/__tests__/record-trace.test.ts:211-224|src/daemon/handlers/__tests__/record-trace.test.ts:294-307", + "src/daemon/handlers/__tests__/record-trace.test.ts:256-260|src/daemon/handlers/__tests__/record-trace.test.ts:323-328", + "src/daemon/handlers/__tests__/record-trace.test.ts:403-414|src/daemon/handlers/__tests__/record-trace.test.ts:425-436", + "src/daemon/handlers/__tests__/record-trace.test.ts:448-462|src/daemon/handlers/__tests__/record-trace.test.ts:474-488", + "src/daemon/handlers/__tests__/record-trace.test.ts:462-472|src/daemon/handlers/__tests__/record-trace.test.ts:488-498", + "src/daemon/handlers/__tests__/record-trace.test.ts:484-498|src/daemon/handlers/__tests__/record-trace.test.ts:510-521", + "src/daemon/handlers/__tests__/record-trace.test.ts:504-517|src/daemon/handlers/__tests__/record-trace.test.ts:528-541", + "src/daemon/handlers/__tests__/record-trace.test.ts:525-537|src/daemon/handlers/__tests__/record-trace.test.ts:645-656", + "src/daemon/handlers/__tests__/record-trace.test.ts:529-545|src/daemon/handlers/__tests__/record-trace.test.ts:606-622", + "src/daemon/handlers/__tests__/record-trace.test.ts:564-576|src/daemon/handlers/__tests__/record-trace.test.ts:605-617", + "src/daemon/handlers/__tests__/record-trace.test.ts:760-780|src/daemon/handlers/__tests__/record-trace.test.ts:800-820", + "src/daemon/handlers/__tests__/record-trace.test.ts:836-851|src/daemon/handlers/__tests__/record-trace.test.ts:876-891", + "src/daemon/handlers/__tests__/record-trace.test.ts:1353-1363|src/daemon/handlers/__tests__/record-trace.test.ts:860-870", + "src/daemon/handlers/__tests__/record-trace.test.ts:1040-1072|src/daemon/handlers/__tests__/record-trace.test.ts:1301-1333|src/daemon/handlers/__tests__/record-trace.test.ts:1369-1401", + "src/daemon/handlers/__tests__/record-trace.test.ts:1040-1059|src/daemon/handlers/__tests__/record-trace.test.ts:1301-1320|src/daemon/handlers/__tests__/record-trace.test.ts:1369-1388|src/daemon/handlers/__tests__/record-trace.test.ts:1570-1589", + "src/daemon/handlers/__tests__/record-trace.test.ts:1040-1060|src/daemon/handlers/__tests__/record-trace.test.ts:1173-1189|src/daemon/handlers/__tests__/record-trace.test.ts:1301-1321|src/daemon/handlers/__tests__/record-trace.test.ts:1369-1389|src/daemon/handlers/__tests__/record-trace.test.ts:1570-1590", + "src/daemon/handlers/__tests__/record-trace.test.ts:1076-1088|src/daemon/handlers/__tests__/record-trace.test.ts:1337-1350", + "src/daemon/handlers/__tests__/record-trace.test.ts:1125-1142|src/daemon/handlers/__tests__/record-trace.test.ts:1250-1268", + "src/daemon/handlers/__tests__/record-trace.test.ts:1125-1143|src/daemon/handlers/__tests__/record-trace.test.ts:1206-1228|src/daemon/handlers/__tests__/record-trace.test.ts:1250-1272", + "src/daemon/handlers/__tests__/record-trace.test.ts:1142-1163|src/daemon/handlers/__tests__/record-trace.test.ts:1269-1292", + "src/daemon/handlers/__tests__/record-trace.test.ts:1144-1162|src/daemon/handlers/__tests__/record-trace.test.ts:1222-1240|src/daemon/handlers/__tests__/record-trace.test.ts:1273-1291", + "src/daemon/handlers/__tests__/record-trace.test.ts:1149-1162|src/daemon/handlers/__tests__/record-trace.test.ts:1278-1291|src/daemon/handlers/__tests__/record-trace.test.ts:1596-1611", + "src/daemon/handlers/__tests__/record-trace.test.ts:1154-1166|src/daemon/handlers/__tests__/record-trace.test.ts:1188-1200", + "src/daemon/handlers/__tests__/record-trace.test.ts:1553-1564|src/daemon/handlers/__tests__/record-trace.test.ts:1603-1614", "src/daemon/handlers/__tests__/replay-heal.test.ts:1-7|src/daemon/handlers/__tests__/session-reinstall.test.ts:1-7|src/daemon/handlers/__tests__/session-trigger.test.ts:1-7|src/daemon/handlers/__tests__/session.test.ts:1-7", "src/daemon/handlers/__tests__/replay-heal.test.ts:3-9|src/daemon/handlers/__tests__/session-push.test.ts:6-12", - "src/daemon/handlers/__tests__/replay-heal.test.ts:57-76|src/daemon/handlers/session-replay-script.ts:380-399", - "src/daemon/handlers/__tests__/replay-heal.test.ts:78-89|src/daemon/handlers/session-replay-script.ts:402-413", - "src/daemon/handlers/__tests__/replay-heal.test.ts:106-116|src/daemon/handlers/__tests__/replay-heal.test.ts:450-460", - "src/daemon/handlers/__tests__/replay-heal.test.ts:140-178|src/daemon/handlers/__tests__/replay-heal.test.ts:617-653", - "src/daemon/handlers/__tests__/replay-heal.test.ts:208-216|src/daemon/handlers/__tests__/replay-heal.test.ts:607-612", - "src/daemon/handlers/__tests__/replay-heal.test.ts:221-256|src/daemon/handlers/__tests__/replay-heal.test.ts:397-431|src/daemon/handlers/__tests__/replay-heal.test.ts:614-648", - "src/daemon/handlers/__tests__/replay-heal.test.ts:221-256|src/daemon/handlers/__tests__/replay-heal.test.ts:397-431|src/daemon/handlers/__tests__/replay-heal.test.ts:462-496|src/daemon/handlers/__tests__/replay-heal.test.ts:614-648", - "src/daemon/handlers/__tests__/replay-heal.test.ts:298-311|src/daemon/handlers/__tests__/replay-heal.test.ts:487-500", - "src/daemon/handlers/__tests__/replay-heal.test.ts:351-358|src/daemon/handlers/__tests__/replay-heal.test.ts:687-693|src/daemon/handlers/__tests__/replay-heal.test.ts:718-724", - "src/daemon/handlers/__tests__/replay-heal.test.ts:359-364|src/daemon/handlers/__tests__/replay-heal.test.ts:498-503", - "src/daemon/handlers/__tests__/replay-heal.test.ts:395-433|src/daemon/handlers/__tests__/replay-heal.test.ts:612-650", - "src/daemon/handlers/__tests__/replay-heal.test.ts:472-500|src/daemon/handlers/__tests__/replay-heal.test.ts:551-579", - "src/daemon/handlers/__tests__/replay-heal.test.ts:674-696|src/daemon/handlers/__tests__/replay-heal.test.ts:705-727", + "src/daemon/handlers/__tests__/replay-heal.test.ts:58-77|src/daemon/handlers/session-replay-script.ts:380-399", + "src/daemon/handlers/__tests__/replay-heal.test.ts:79-90|src/daemon/handlers/session-replay-script.ts:402-413", + "src/daemon/handlers/__tests__/replay-heal.test.ts:160-170|src/daemon/handlers/__tests__/replay-heal.test.ts:504-514", + "src/daemon/handlers/__tests__/replay-heal.test.ts:194-232|src/daemon/handlers/__tests__/replay-heal.test.ts:671-707", + "src/daemon/handlers/__tests__/replay-heal.test.ts:262-270|src/daemon/handlers/__tests__/replay-heal.test.ts:661-666", + "src/daemon/handlers/__tests__/replay-heal.test.ts:275-310|src/daemon/handlers/__tests__/replay-heal.test.ts:451-485|src/daemon/handlers/__tests__/replay-heal.test.ts:668-702", + "src/daemon/handlers/__tests__/replay-heal.test.ts:275-310|src/daemon/handlers/__tests__/replay-heal.test.ts:451-485|src/daemon/handlers/__tests__/replay-heal.test.ts:516-550|src/daemon/handlers/__tests__/replay-heal.test.ts:668-702", + "src/daemon/handlers/__tests__/replay-heal.test.ts:352-365|src/daemon/handlers/__tests__/replay-heal.test.ts:541-554", + "src/daemon/handlers/__tests__/replay-heal.test.ts:405-412|src/daemon/handlers/__tests__/replay-heal.test.ts:741-747|src/daemon/handlers/__tests__/replay-heal.test.ts:772-778", + "src/daemon/handlers/__tests__/replay-heal.test.ts:413-418|src/daemon/handlers/__tests__/replay-heal.test.ts:552-557", + "src/daemon/handlers/__tests__/replay-heal.test.ts:449-487|src/daemon/handlers/__tests__/replay-heal.test.ts:666-704", + "src/daemon/handlers/__tests__/replay-heal.test.ts:526-554|src/daemon/handlers/__tests__/replay-heal.test.ts:605-633", + "src/daemon/handlers/__tests__/replay-heal.test.ts:728-750|src/daemon/handlers/__tests__/replay-heal.test.ts:759-781", "src/daemon/handlers/__tests__/session-close-shutdown.test.ts:1-9|src/daemon/handlers/__tests__/session-open-runtime.test.ts:1-9", "src/daemon/handlers/__tests__/session-close-shutdown.test.ts:9-15|src/daemon/handlers/__tests__/session.test.ts:32-38", "src/daemon/handlers/__tests__/session-close-shutdown.test.ts:15-25|src/daemon/handlers/__tests__/session.test.ts:13-24", @@ -281,7 +299,7 @@ "src/daemon/handlers/__tests__/session-reinstall.test.ts:260-267|src/daemon/handlers/__tests__/session-reinstall.test.ts:376-383", "src/daemon/handlers/__tests__/session-replay-script.test.ts:64-73|src/daemon/handlers/__tests__/session-replay-script.test.ts:87-96", "src/daemon/handlers/__tests__/session-replay-vars.test.ts:273-282|src/daemon/handlers/__tests__/session-replay-vars.test.ts:372-381", - "src/daemon/handlers/__tests__/session-state.test.ts:19-36|src/daemon/handlers/__tests__/session.test.ts:1521-1542|src/daemon/handlers/__tests__/session.test.ts:1547-1568|src/daemon/handlers/__tests__/session.test.ts:3529-3548|src/daemon/handlers/__tests__/session.test.ts:3553-3572|src/daemon/handlers/__tests__/session.test.ts:4080-4098|src/daemon/handlers/__tests__/session.test.ts:4113-4131|src/daemon/handlers/__tests__/session.test.ts:4146-4164|src/daemon/handlers/__tests__/session.test.ts:419-443|src/daemon/handlers/__tests__/session.test.ts:4393-4412|src/daemon/handlers/__tests__/session.test.ts:4428-4446|src/daemon/handlers/__tests__/session.test.ts:4525-4543|src/daemon/handlers/__tests__/snapshot-handler.test.ts:101-119|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1010-1028|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1033-1051", + "src/daemon/handlers/__tests__/session-state.test.ts:19-36|src/daemon/handlers/__tests__/session.test.ts:1521-1542|src/daemon/handlers/__tests__/session.test.ts:1547-1568|src/daemon/handlers/__tests__/session.test.ts:3529-3548|src/daemon/handlers/__tests__/session.test.ts:3553-3572|src/daemon/handlers/__tests__/session.test.ts:4080-4098|src/daemon/handlers/__tests__/session.test.ts:4113-4131|src/daemon/handlers/__tests__/session.test.ts:4146-4164|src/daemon/handlers/__tests__/session.test.ts:419-443|src/daemon/handlers/__tests__/session.test.ts:4393-4412|src/daemon/handlers/__tests__/session.test.ts:4428-4446|src/daemon/handlers/__tests__/session.test.ts:4525-4543|src/daemon/handlers/__tests__/snapshot-handler.test.ts:101-119|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1042-1060|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1065-1083", "src/daemon/handlers/__tests__/session-state.test.ts:41-58|src/daemon/handlers/__tests__/session.test.ts:1167-1186|src/daemon/handlers/__tests__/session.test.ts:1615-1634", "src/daemon/handlers/__tests__/session-test-artifacts.test.ts:41-46|src/daemon/handlers/__tests__/session-test-artifacts.test.ts:84-89", "src/daemon/handlers/__tests__/session-trigger.test.ts:124-142|src/daemon/handlers/__tests__/session-trigger.test.ts:48-64", @@ -332,16 +350,14 @@ "src/daemon/handlers/__tests__/session.test.ts:2108-2126|src/daemon/handlers/__tests__/session.test.ts:2163-2181|src/daemon/handlers/__tests__/session.test.ts:2289-2307|src/daemon/handlers/__tests__/session.test.ts:2320-2347", "src/daemon/handlers/__tests__/session.test.ts:2126-2130|src/daemon/handlers/__tests__/session.test.ts:2181-2185|src/daemon/handlers/__tests__/session.test.ts:2307-2311", "src/daemon/handlers/__tests__/session.test.ts:2159-2181|src/daemon/handlers/__tests__/session.test.ts:2287-2307", - "src/daemon/handlers/__tests__/session.test.ts:2227-2237|src/platforms/ios/__tests__/perf.test.ts:249-259", - "src/daemon/handlers/__tests__/session.test.ts:2250-2261|src/platforms/ios/__tests__/perf.test.ts:273-284", "src/daemon/handlers/__tests__/session.test.ts:2356-2389|src/daemon/handlers/__tests__/session.test.ts:2581-2614", "src/daemon/handlers/__tests__/session.test.ts:2371-2406|src/daemon/handlers/__tests__/session.test.ts:2409-2450", "src/daemon/handlers/__tests__/session.test.ts:2371-2389|src/daemon/handlers/__tests__/session.test.ts:2409-2433|src/daemon/handlers/__tests__/session.test.ts:2453-2476", "src/daemon/handlers/__tests__/session.test.ts:2377-2401|src/daemon/handlers/__tests__/session.test.ts:2420-2445|src/daemon/handlers/__tests__/session.test.ts:2504-2530", "src/daemon/handlers/__tests__/session.test.ts:2389-2402|src/daemon/handlers/__tests__/session.test.ts:2433-2446|src/daemon/handlers/__tests__/session.test.ts:3090-3103", - "src/daemon/handlers/__tests__/session.test.ts:2389-2401|src/daemon/handlers/__tests__/session.test.ts:2433-2445|src/daemon/handlers/__tests__/session.test.ts:2476-2488|src/daemon/handlers/__tests__/session.test.ts:2518-2530|src/daemon/handlers/__tests__/session.test.ts:2563-2575|src/daemon/handlers/__tests__/session.test.ts:2614-2626|src/daemon/handlers/__tests__/session.test.ts:2662-2674|src/daemon/handlers/__tests__/session.test.ts:3046-3058|src/daemon/handlers/__tests__/session.test.ts:3090-3102", "src/daemon/handlers/__tests__/session.test.ts:2406-2433|src/daemon/handlers/__tests__/session.test.ts:2635-2662", "src/daemon/handlers/__tests__/session.test.ts:2416-2426|src/daemon/handlers/__tests__/session.test.ts:2645-2655|src/daemon/handlers/__tests__/session.test.ts:3072-3082", + "src/daemon/handlers/__tests__/session.test.ts:2476-2488|src/daemon/handlers/__tests__/session.test.ts:2518-2530|src/daemon/handlers/__tests__/session.test.ts:2563-2575|src/daemon/handlers/__tests__/session.test.ts:2614-2626|src/daemon/handlers/__tests__/session.test.ts:2662-2674|src/daemon/handlers/__tests__/session.test.ts:3046-3058", "src/daemon/handlers/__tests__/session.test.ts:2563-2576|src/daemon/handlers/__tests__/session.test.ts:2614-2627", "src/daemon/handlers/__tests__/session.test.ts:2596-2626|src/daemon/handlers/__tests__/session.test.ts:2638-2674", "src/daemon/handlers/__tests__/session.test.ts:2607-2626|src/daemon/handlers/__tests__/session.test.ts:2655-2674|src/daemon/handlers/__tests__/session.test.ts:3083-3102", @@ -394,7 +410,7 @@ "src/daemon/handlers/__tests__/session.test.ts:4813-4837|src/daemon/handlers/__tests__/session.test.ts:4876-4900", "src/daemon/handlers/__tests__/session.test.ts:4994-5033|src/daemon/handlers/__tests__/session.test.ts:5071-5110", "src/daemon/handlers/__tests__/session.test.ts:5332-5344|src/daemon/handlers/__tests__/session.test.ts:5372-5384", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1019-1031|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1042-1054|src/daemon/handlers/__tests__/snapshot-handler.test.ts:110-122", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1051-1063|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1074-1086|src/daemon/handlers/__tests__/snapshot-handler.test.ts:110-122", "src/daemon/handlers/__tests__/snapshot-handler.test.ts:140-150|src/daemon/handlers/__tests__/snapshot-handler.test.ts:191-201|src/daemon/handlers/__tests__/snapshot-handler.test.ts:322-332|src/daemon/handlers/__tests__/snapshot-handler.test.ts:438-448", "src/daemon/handlers/__tests__/snapshot-handler.test.ts:208-233|src/daemon/handlers/__tests__/snapshot-handler.test.ts:280-304|src/daemon/handlers/__tests__/snapshot-handler.test.ts:396-420", "src/daemon/handlers/__tests__/snapshot-handler.test.ts:210-234|src/daemon/handlers/__tests__/snapshot-handler.test.ts:510-534", @@ -404,25 +420,26 @@ "src/daemon/handlers/__tests__/snapshot-handler.test.ts:280-320|src/daemon/handlers/__tests__/snapshot-handler.test.ts:396-436", "src/daemon/handlers/__tests__/snapshot-handler.test.ts:282-305|src/daemon/handlers/__tests__/snapshot-handler.test.ts:398-421|src/daemon/handlers/__tests__/snapshot-handler.test.ts:460-483", "src/daemon/handlers/__tests__/snapshot-handler.test.ts:321-340|src/daemon/handlers/__tests__/snapshot-handler.test.ts:437-456", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:588-605|src/daemon/handlers/__tests__/snapshot-handler.test.ts:691-707", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1015-1027|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1038-1050|src/daemon/handlers/__tests__/snapshot-handler.test.ts:619-631", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:628-634|src/daemon/handlers/__tests__/snapshot-handler.test.ts:708-716", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1364-1370|src/daemon/handlers/__tests__/snapshot-handler.test.ts:735-741|src/daemon/handlers/__tests__/snapshot-handler.test.ts:928-934", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:739-760|src/daemon/handlers/__tests__/snapshot-handler.test.ts:832-853|src/daemon/handlers/__tests__/snapshot-handler.test.ts:881-904|src/daemon/handlers/__tests__/snapshot-handler.test.ts:932-955", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1391-1401|src/daemon/handlers/__tests__/snapshot-handler.test.ts:764-774|src/daemon/handlers/__tests__/snapshot-handler.test.ts:854-864|src/daemon/handlers/__tests__/snapshot-handler.test.ts:905-915|src/daemon/handlers/__tests__/snapshot-handler.test.ts:960-970", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:828-834|src/daemon/handlers/__tests__/snapshot-handler.test.ts:877-883", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1364-1380|src/daemon/handlers/__tests__/snapshot-handler.test.ts:928-944", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1381-1391|src/daemon/handlers/__tests__/snapshot-handler.test.ts:945-955", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1146-1162|src/daemon/handlers/__tests__/snapshot-handler.test.ts:982-1001", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1015-1031|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1038-1054", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1168-1176|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1251-1259", - "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1192-1200|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1281-1289", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:588-605|src/daemon/handlers/__tests__/snapshot-handler.test.ts:723-739", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1047-1059|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1070-1082|src/daemon/handlers/__tests__/snapshot-handler.test.ts:619-631", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:628-634|src/daemon/handlers/__tests__/snapshot-handler.test.ts:740-748", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1396-1402|src/daemon/handlers/__tests__/snapshot-handler.test.ts:767-773|src/daemon/handlers/__tests__/snapshot-handler.test.ts:960-966", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:771-792|src/daemon/handlers/__tests__/snapshot-handler.test.ts:864-885|src/daemon/handlers/__tests__/snapshot-handler.test.ts:913-936|src/daemon/handlers/__tests__/snapshot-handler.test.ts:964-987", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1423-1433|src/daemon/handlers/__tests__/snapshot-handler.test.ts:796-806|src/daemon/handlers/__tests__/snapshot-handler.test.ts:886-896|src/daemon/handlers/__tests__/snapshot-handler.test.ts:937-947|src/daemon/handlers/__tests__/snapshot-handler.test.ts:992-1002", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:860-866|src/daemon/handlers/__tests__/snapshot-handler.test.ts:909-915", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1396-1412|src/daemon/handlers/__tests__/snapshot-handler.test.ts:960-976", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1413-1423|src/daemon/handlers/__tests__/snapshot-handler.test.ts:977-987", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1014-1033|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1178-1194", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1047-1063|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1070-1086", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1200-1208|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1283-1291", + "src/daemon/handlers/__tests__/snapshot-handler.test.ts:1224-1232|src/daemon/handlers/__tests__/snapshot-handler.test.ts:1313-1321", "src/daemon/handlers/__tests__/snapshot.test.ts:101-106|src/daemon/handlers/__tests__/snapshot.test.ts:91-96", - "src/daemon/handlers/find.ts:319-327|src/daemon/handlers/find.ts:352-354", - "src/daemon/handlers/find.ts:322-333|src/daemon/handlers/find.ts:355-363", + "src/daemon/handlers/find.ts:320-328|src/daemon/handlers/find.ts:353-355", + "src/daemon/handlers/find.ts:323-334|src/daemon/handlers/find.ts:356-364", "src/daemon/handlers/install-source.ts:149-162|src/daemon/handlers/install-source.ts:87-100", "src/daemon/handlers/install-source.ts:114-143|src/daemon/handlers/install-source.ts:182-211", "src/daemon/handlers/record-trace-ios.ts:251-275|src/daemon/handlers/record-trace-ios.ts:336-359", + "src/daemon/handlers/session-perf.ts:163-169|src/daemon/handlers/session-perf.ts:176-182", "src/daemon/handlers/session-replay-script.ts:442-454|src/daemon/session-store.ts:330-342", "src/daemon/handlers/session-replay-script.ts:460-468|src/daemon/session-store.ts:359-367", "src/daemon/handlers/session-replay-script.ts:466-478|src/daemon/session-store.ts:339-351", @@ -439,104 +456,103 @@ "src/daemon/screenshot-overlay.ts:322-329|src/utils/snapshot-processing.ts:105-112", "src/daemon/snapshot-runtime.ts:17-25|src/daemon/snapshot-runtime.ts:65-73", "src/daemon/snapshot-runtime.ts:26-41|src/daemon/snapshot-runtime.ts:74-89", - "src/daemon/transport.ts:108-118|src/daemon/transport.ts:123-133", - "src/daemon-client.ts:257-269|src/daemon-client.ts:305-321", - "src/daemon-client.ts:962-970|src/upload-client.ts:327-335", + "src/daemon/transport.ts:122-132|src/daemon/transport.ts:137-147", + "src/daemon-client.ts:258-270|src/daemon-client.ts:306-322", + "src/daemon-client.ts:963-971|src/upload-client.ts:329-337", "src/platforms/__tests__/install-source.test.ts:177-197|src/platforms/__tests__/install-source.test.ts:222-242", "src/platforms/__tests__/install-source.test.ts:177-190|src/platforms/__tests__/install-source.test.ts:222-235|src/platforms/__tests__/install-source.test.ts:400-413", - "src/platforms/android/__tests__/index.test.ts:39-56|src/platforms/android/__tests__/index.test.ts:901-920", - "src/platforms/android/__tests__/index.test.ts:1845-1857|src/platforms/android/__tests__/index.test.ts:1918-1930|src/platforms/android/__tests__/index.test.ts:370-381|src/platforms/android/__tests__/index.test.ts:39-49|src/platforms/android/__tests__/index.test.ts:862-874|src/platforms/android/__tests__/index.test.ts:901-913", - "src/platforms/android/__tests__/index.test.ts:56-65|src/platforms/ios/__tests__/index.test.ts:177-186", - "src/platforms/android/__tests__/index.test.ts:69-82|src/platforms/android/__tests__/index.test.ts:83-96", - "src/platforms/android/__tests__/index.test.ts:69-76|src/platforms/android/__tests__/index.test.ts:83-90|src/platforms/android/__tests__/index.test.ts:97-104", - "src/platforms/android/__tests__/index.test.ts:225-253|src/platforms/android/__tests__/index.test.ts:279-307", - "src/platforms/android/__tests__/index.test.ts:1845-1872|src/platforms/android/__tests__/index.test.ts:1918-1942|src/platforms/android/__tests__/index.test.ts:370-388", - "src/platforms/android/__tests__/index.test.ts:394-403|src/platforms/android/__tests__/index.test.ts:468-477", - "src/platforms/android/__tests__/index.test.ts:395-408|src/platforms/android/__tests__/index.test.ts:882-895", - "src/platforms/android/__tests__/index.test.ts:1898-1908|src/platforms/android/__tests__/index.test.ts:1946-1956|src/platforms/android/__tests__/index.test.ts:396-406|src/platforms/android/__tests__/index.test.ts:883-893|src/platforms/android/__tests__/index.test.ts:933-943|src/platforms/ios/__tests__/index.test.ts:1233-1243|src/platforms/ios/__tests__/index.test.ts:1319-1329|src/platforms/ios/__tests__/index.test.ts:1386-1396|src/platforms/ios/__tests__/index.test.ts:1524-1534|src/platforms/ios/__tests__/index.test.ts:826-836|src/platforms/ios/__tests__/index.test.ts:875-885|src/platforms/ios/__tests__/index.test.ts:973-983", - "src/platforms/android/__tests__/index.test.ts:409-452|src/platforms/android/__tests__/index.test.ts:488-531", - "src/platforms/android/__tests__/index.test.ts:454-468|src/platforms/android/__tests__/index.test.ts:535-549", - "src/platforms/android/__tests__/index.test.ts:470-482|src/platforms/android/__tests__/index.test.ts:549-561", - "src/platforms/android/__tests__/index.test.ts:547-556|src/platforms/ios/__tests__/index.test.ts:971-980", - "src/platforms/android/__tests__/index.test.ts:573-583|src/platforms/android/__tests__/index.test.ts:617-627", - "src/platforms/android/__tests__/index.test.ts:602-615|src/platforms/android/__tests__/index.test.ts:639-651", - "src/platforms/android/__tests__/index.test.ts:675-683|src/platforms/ios/__tests__/index.test.ts:2072-2080", - "src/platforms/android/__tests__/index.test.ts:692-701|src/platforms/android/__tests__/index.test.ts:716-725", - "src/platforms/android/__tests__/index.test.ts:698-707|src/platforms/ios/__tests__/index.test.ts:2253-2262", - "src/platforms/android/__tests__/index.test.ts:722-730|src/platforms/ios/__tests__/index.test.ts:1856-1864|src/platforms/ios/__tests__/index.test.ts:1928-1936|src/platforms/ios/__tests__/index.test.ts:2072-2080", - "src/platforms/android/__tests__/index.test.ts:744-759|src/platforms/ios/__tests__/index.test.ts:2287-2299", - "src/platforms/android/__tests__/index.test.ts:1419-1426|src/platforms/android/__tests__/index.test.ts:744-754|src/platforms/android/__tests__/index.test.ts:842-849|src/platforms/ios/__tests__/index.test.ts:2034-2041|src/platforms/ios/__tests__/index.test.ts:2287-2294|src/platforms/ios/__tests__/index.test.ts:586-593", - "src/platforms/android/__tests__/index.test.ts:764-773|src/platforms/ios/__tests__/index.test.ts:1893-1902|src/platforms/ios/__tests__/index.test.ts:2253-2262", - "src/platforms/android/__tests__/index.test.ts:842-854|src/platforms/ios/__tests__/index.test.ts:2034-2046", - "src/platforms/android/__tests__/index.test.ts:883-895|src/platforms/ios/__tests__/index.test.ts:973-985", - "src/platforms/android/__tests__/index.test.ts:1840-1899|src/platforms/android/__tests__/index.test.ts:1912-1947|src/platforms/android/__tests__/index.test.ts:896-934", - "src/platforms/android/__tests__/index.test.ts:1876-1910|src/platforms/android/__tests__/index.test.ts:922-945|src/platforms/ios/__tests__/index.test.ts:1514-1536|src/platforms/ios/__tests__/index.test.ts:816-838|src/platforms/ios/__tests__/index.test.ts:865-887", - "src/platforms/android/__tests__/index.test.ts:1419-1431|src/platforms/ios/__tests__/index.test.ts:2034-2046|src/platforms/ios/__tests__/index.test.ts:2287-2299", - "src/platforms/android/__tests__/index.test.ts:1479-1488|src/platforms/android/__tests__/index.test.ts:1506-1515", - "src/platforms/android/__tests__/index.test.ts:1705-1718|src/platforms/ios/__tests__/index.test.ts:2474-2484", - "src/platforms/android/__tests__/index.test.ts:1723-1734|src/platforms/ios/__tests__/index.test.ts:2474-2479", - "src/platforms/android/__tests__/index.test.ts:1768-1779|src/platforms/ios/__tests__/index.test.ts:2428-2440", - "src/platforms/android/__tests__/index.test.ts:1768-1781|src/platforms/android/__tests__/index.test.ts:1791-1803|src/platforms/ios/__tests__/index.test.ts:2195-2207", - "src/platforms/android/__tests__/index.test.ts:1840-1872|src/platforms/android/__tests__/index.test.ts:1912-1942", + "src/platforms/android/__tests__/index.test.ts:41-58|src/platforms/android/__tests__/index.test.ts:961-980", + "src/platforms/android/__tests__/index.test.ts:1981-1993|src/platforms/android/__tests__/index.test.ts:2054-2066|src/platforms/android/__tests__/index.test.ts:41-51|src/platforms/android/__tests__/index.test.ts:415-426|src/platforms/android/__tests__/index.test.ts:922-934|src/platforms/android/__tests__/index.test.ts:961-973", + "src/platforms/android/__tests__/index.test.ts:58-67|src/platforms/ios/__tests__/index.test.ts:178-187", + "src/platforms/android/__tests__/index.test.ts:71-84|src/platforms/android/__tests__/index.test.ts:85-98", + "src/platforms/android/__tests__/index.test.ts:71-78|src/platforms/android/__tests__/index.test.ts:85-92|src/platforms/android/__tests__/index.test.ts:99-106", + "src/platforms/android/__tests__/index.test.ts:237-265|src/platforms/android/__tests__/index.test.ts:291-319", + "src/platforms/android/__tests__/index.test.ts:1981-2008|src/platforms/android/__tests__/index.test.ts:2054-2078|src/platforms/android/__tests__/index.test.ts:415-433", + "src/platforms/android/__tests__/index.test.ts:439-448|src/platforms/android/__tests__/index.test.ts:513-522", + "src/platforms/android/__tests__/index.test.ts:440-453|src/platforms/android/__tests__/index.test.ts:942-955", + "src/platforms/android/__tests__/index.test.ts:2034-2044|src/platforms/android/__tests__/index.test.ts:2082-2092|src/platforms/android/__tests__/index.test.ts:441-451|src/platforms/android/__tests__/index.test.ts:943-953|src/platforms/android/__tests__/index.test.ts:993-1003|src/platforms/ios/__tests__/index.test.ts:1234-1244|src/platforms/ios/__tests__/index.test.ts:1320-1330|src/platforms/ios/__tests__/index.test.ts:1387-1397|src/platforms/ios/__tests__/index.test.ts:1525-1535|src/platforms/ios/__tests__/index.test.ts:1757-1767|src/platforms/ios/__tests__/index.test.ts:827-837|src/platforms/ios/__tests__/index.test.ts:876-886|src/platforms/ios/__tests__/index.test.ts:974-984", + "src/platforms/android/__tests__/index.test.ts:454-497|src/platforms/android/__tests__/index.test.ts:533-576", + "src/platforms/android/__tests__/index.test.ts:499-513|src/platforms/android/__tests__/index.test.ts:580-594", + "src/platforms/android/__tests__/index.test.ts:515-527|src/platforms/android/__tests__/index.test.ts:594-606", + "src/platforms/android/__tests__/index.test.ts:592-601|src/platforms/ios/__tests__/index.test.ts:972-981", + "src/platforms/android/__tests__/index.test.ts:618-628|src/platforms/android/__tests__/index.test.ts:662-672", + "src/platforms/android/__tests__/index.test.ts:647-660|src/platforms/android/__tests__/index.test.ts:684-696", + "src/platforms/android/__tests__/index.test.ts:720-728|src/platforms/ios/__tests__/index.test.ts:2195-2203", + "src/platforms/android/__tests__/index.test.ts:737-746|src/platforms/android/__tests__/index.test.ts:761-770", + "src/platforms/android/__tests__/index.test.ts:743-752|src/platforms/ios/__tests__/index.test.ts:2392-2401", + "src/platforms/android/__tests__/index.test.ts:767-775|src/platforms/ios/__tests__/index.test.ts:1979-1987|src/platforms/ios/__tests__/index.test.ts:2051-2059|src/platforms/ios/__tests__/index.test.ts:2195-2203", + "src/platforms/android/__tests__/index.test.ts:789-804|src/platforms/ios/__tests__/index.test.ts:2426-2438", + "src/platforms/android/__tests__/index.test.ts:1555-1562|src/platforms/android/__tests__/index.test.ts:789-799|src/platforms/android/__tests__/index.test.ts:902-909|src/platforms/ios/__tests__/index.test.ts:2157-2164|src/platforms/ios/__tests__/index.test.ts:2426-2433|src/platforms/ios/__tests__/index.test.ts:587-594", + "src/platforms/android/__tests__/index.test.ts:809-818|src/platforms/ios/__tests__/index.test.ts:2016-2025|src/platforms/ios/__tests__/index.test.ts:2392-2401", + "src/platforms/android/__tests__/index.test.ts:902-914|src/platforms/ios/__tests__/index.test.ts:2157-2169", + "src/platforms/android/__tests__/index.test.ts:943-955|src/platforms/ios/__tests__/index.test.ts:974-986", + "src/platforms/android/__tests__/index.test.ts:1976-2035|src/platforms/android/__tests__/index.test.ts:2048-2083|src/platforms/android/__tests__/index.test.ts:956-994", + "src/platforms/android/__tests__/index.test.ts:2012-2046|src/platforms/android/__tests__/index.test.ts:982-1005|src/platforms/ios/__tests__/index.test.ts:1515-1537|src/platforms/ios/__tests__/index.test.ts:817-839|src/platforms/ios/__tests__/index.test.ts:866-888", + "src/platforms/android/__tests__/index.test.ts:1555-1567|src/platforms/ios/__tests__/index.test.ts:2157-2169|src/platforms/ios/__tests__/index.test.ts:2426-2438", + "src/platforms/android/__tests__/index.test.ts:1615-1624|src/platforms/android/__tests__/index.test.ts:1642-1651", + "src/platforms/android/__tests__/index.test.ts:1841-1854|src/platforms/ios/__tests__/index.test.ts:2613-2623", + "src/platforms/android/__tests__/index.test.ts:1859-1870|src/platforms/ios/__tests__/index.test.ts:2613-2618", + "src/platforms/android/__tests__/index.test.ts:1904-1915|src/platforms/ios/__tests__/index.test.ts:2567-2579", + "src/platforms/android/__tests__/index.test.ts:1904-1917|src/platforms/android/__tests__/index.test.ts:1927-1939|src/platforms/ios/__tests__/index.test.ts:2318-2330", + "src/platforms/android/__tests__/index.test.ts:1976-2008|src/platforms/android/__tests__/index.test.ts:2048-2078", "src/platforms/android/__tests__/scroll-hints.test.ts:59-99|src/platforms/android/__tests__/scroll-hints.test.ts:6-46", "src/platforms/android/__tests__/scroll-hints.test.ts:149-168|src/platforms/android/__tests__/scroll-hints.test.ts:198-217|src/platforms/android/__tests__/scroll-hints.test.ts:59-78|src/platforms/android/__tests__/scroll-hints.test.ts:6-25", "src/platforms/android/__tests__/scroll-hints.test.ts:112-131|src/platforms/android/__tests__/scroll-hints.test.ts:149-168|src/platforms/android/__tests__/scroll-hints.test.ts:198-217|src/platforms/android/__tests__/scroll-hints.test.ts:59-78|src/platforms/android/__tests__/scroll-hints.test.ts:6-25", "src/platforms/android/__tests__/scroll-hints.test.ts:181-198|src/platforms/android/__tests__/scroll-hints.test.ts:45-59", "src/platforms/android/__tests__/scroll-hints.test.ts:137-149|src/platforms/android/__tests__/scroll-hints.test.ts:98-112", + "src/platforms/android/__tests__/snapshot-helper.test.ts:184-203|src/platforms/android/__tests__/snapshot-helper.test.ts:223-238", + "src/platforms/android/__tests__/snapshot-helper.test.ts:184-195|src/platforms/android/__tests__/snapshot-helper.test.ts:223-234|src/platforms/android/__tests__/snapshot-helper.test.ts:289-301", "src/platforms/android/__tests__/snapshot.test.ts:1-9|src/platforms/ios/__tests__/index.test.ts:1-9|src/platforms/ios/__tests__/perf.test.ts:1-9|src/platforms/ios/__tests__/plist.test.ts:1-9", - "src/platforms/android/__tests__/snapshot.test.ts:101-112|src/platforms/android/__tests__/snapshot.test.ts:121-132|src/platforms/android/__tests__/snapshot.test.ts:79-90", - "src/platforms/android/__tests__/snapshot.test.ts:113-121|src/platforms/android/__tests__/snapshot.test.ts:93-101", - "src/platforms/android/__tests__/snapshot.test.ts:113-121|src/platforms/android/__tests__/snapshot.test.ts:152-160", - "src/platforms/android/__tests__/snapshot.test.ts:277-291|src/platforms/android/__tests__/snapshot.test.ts:305-319", - "src/platforms/android/__tests__/snapshot.test.ts:342-356|src/platforms/android/__tests__/snapshot.test.ts:473-488", - "src/platforms/android/__tests__/snapshot.test.ts:350-359|src/platforms/android/__tests__/snapshot.test.ts:438-447", - "src/platforms/android/__tests__/snapshot.test.ts:363-389|src/platforms/android/__tests__/snapshot.test.ts:420-444", - "src/platforms/android/__tests__/snapshot.test.ts:363-382|src/platforms/android/__tests__/snapshot.test.ts:396-410|src/platforms/android/__tests__/snapshot.test.ts:420-439", - "src/platforms/android/perf.ts:66-74|src/platforms/ios/perf.ts:133-139", - "src/platforms/android/settings.ts:137-148|src/platforms/ios/apps.ts:771-782", - "src/platforms/android/settings.ts:194-202|src/platforms/ios/apps.ts:509-516", + "src/platforms/android/__tests__/snapshot.test.ts:199-205|src/platforms/android/__tests__/snapshot.test.ts:596-602", + "src/platforms/android/__tests__/snapshot.test.ts:485-499|src/platforms/android/__tests__/snapshot.test.ts:513-527", + "src/platforms/android/__tests__/snapshot.test.ts:553-559|src/platforms/android/__tests__/snapshot.test.ts:625-631", + "src/platforms/android/__tests__/snapshot.test.ts:563-581|src/platforms/android/__tests__/snapshot.test.ts:612-628", + "src/platforms/android/perf-frame-analysis.ts:83-91|src/platforms/ios/perf-frame.ts:192-199", + "src/platforms/android/perf-frame-parser.ts:367-374|src/platforms/android/perf.ts:196-203", + "src/platforms/android/perf.ts:80-88|src/platforms/ios/perf.ts:431-437", + "src/platforms/android/settings.ts:144-155|src/platforms/ios/apps.ts:789-800", "src/platforms/ios/__tests__/devices.test.ts:123-140|src/platforms/ios/__tests__/devices.test.ts:176-196", "src/platforms/ios/__tests__/devices.test.ts:151-160|src/platforms/ios/__tests__/devices.test.ts:207-216", "src/platforms/ios/__tests__/index.test.ts:1-10|src/platforms/ios/__tests__/perf.test.ts:1-10|src/platforms/ios/__tests__/plist.test.ts:1-10", - "src/platforms/ios/__tests__/index.test.ts:288-298|src/platforms/ios/__tests__/index.test.ts:313-324", - "src/platforms/ios/__tests__/index.test.ts:385-403|src/platforms/ios/__tests__/index.test.ts:427-445", - "src/platforms/ios/__tests__/index.test.ts:385-391|src/platforms/ios/__tests__/index.test.ts:427-433|src/platforms/ios/__tests__/index.test.ts:510-516", - "src/platforms/ios/__tests__/index.test.ts:417-427|src/platforms/ios/__tests__/index.test.ts:500-510", - "src/platforms/ios/__tests__/index.test.ts:418-426|src/platforms/ios/__tests__/index.test.ts:501-509|src/platforms/ios/__tests__/index.test.ts:546-554", - "src/platforms/ios/__tests__/index.test.ts:454-468|src/platforms/ios/__tests__/index.test.ts:470-484", - "src/platforms/ios/__tests__/index.test.ts:1444-1455|src/platforms/ios/__tests__/index.test.ts:1476-1487|src/platforms/ios/__tests__/index.test.ts:589-601", - "src/platforms/ios/__tests__/index.test.ts:603-637|src/platforms/ios/__tests__/index.test.ts:646-671", - "src/platforms/ios/__tests__/index.test.ts:1488-1512|src/platforms/ios/__tests__/index.test.ts:790-814|src/platforms/ios/__tests__/index.test.ts:839-863", - "src/platforms/ios/__tests__/index.test.ts:1071-1083|src/platforms/ios/__tests__/index.test.ts:2162-2183", - "src/platforms/ios/__tests__/index.test.ts:1098-1123|src/platforms/ios/__tests__/index.test.ts:1154-1188", - "src/platforms/ios/__tests__/index.test.ts:1198-1209|src/platforms/ios/__tests__/index.test.ts:1337-1349", - "src/platforms/ios/__tests__/index.test.ts:1210-1218|src/platforms/ios/__tests__/index.test.ts:1372-1380", - "src/platforms/ios/__tests__/index.test.ts:1233-1245|src/platforms/ios/__tests__/index.test.ts:1319-1331|src/platforms/ios/__tests__/index.test.ts:1386-1398|src/platforms/ios/__tests__/index.test.ts:1524-1536", - "src/platforms/ios/__tests__/index.test.ts:1246-1251|src/platforms/ios/__tests__/index.test.ts:1333-1339", - "src/platforms/ios/__tests__/index.test.ts:1297-1320|src/platforms/ios/__tests__/index.test.ts:1367-1387", - "src/platforms/ios/__tests__/index.test.ts:1319-1331|src/platforms/ios/__tests__/index.test.ts:1386-1398", - "src/platforms/ios/__tests__/index.test.ts:1344-1374|src/platforms/ios/__tests__/index.test.ts:1408-1436", - "src/platforms/ios/__tests__/index.test.ts:1434-1444|src/platforms/ios/__tests__/index.test.ts:1467-1477", - "src/platforms/ios/__tests__/index.test.ts:1440-1448|src/platforms/ios/__tests__/index.test.ts:2209-2220", - "src/platforms/ios/__tests__/index.test.ts:1680-1696|src/platforms/ios/__tests__/index.test.ts:1721-1737", - "src/platforms/ios/__tests__/index.test.ts:1832-1859|src/platforms/ios/__tests__/index.test.ts:1866-1896", - "src/platforms/ios/__tests__/index.test.ts:1856-1864|src/platforms/ios/__tests__/index.test.ts:1928-1936", - "src/platforms/ios/__tests__/index.test.ts:1893-1897|src/platforms/ios/__tests__/index.test.ts:1968-1972", - "src/platforms/ios/__tests__/index.test.ts:1904-1931|src/platforms/ios/__tests__/index.test.ts:1938-1971", - "src/platforms/ios/__tests__/index.test.ts:1980-2003|src/platforms/ios/__tests__/index.test.ts:2014-2037", - "src/platforms/ios/__tests__/index.test.ts:2088-2099|src/platforms/ios/__tests__/index.test.ts:2132-2143", - "src/platforms/ios/__tests__/index.test.ts:2100-2110|src/platforms/ios/__tests__/index.test.ts:2145-2155", - "src/platforms/ios/__tests__/index.test.ts:2526-2540|src/platforms/ios/__tests__/index.test.ts:2582-2593", + "src/platforms/ios/__tests__/index.test.ts:289-299|src/platforms/ios/__tests__/index.test.ts:314-325", + "src/platforms/ios/__tests__/index.test.ts:386-404|src/platforms/ios/__tests__/index.test.ts:428-446", + "src/platforms/ios/__tests__/index.test.ts:386-392|src/platforms/ios/__tests__/index.test.ts:428-434|src/platforms/ios/__tests__/index.test.ts:511-517", + "src/platforms/ios/__tests__/index.test.ts:418-428|src/platforms/ios/__tests__/index.test.ts:501-511", + "src/platforms/ios/__tests__/index.test.ts:419-427|src/platforms/ios/__tests__/index.test.ts:502-510|src/platforms/ios/__tests__/index.test.ts:547-555", + "src/platforms/ios/__tests__/index.test.ts:455-469|src/platforms/ios/__tests__/index.test.ts:471-485", + "src/platforms/ios/__tests__/index.test.ts:1445-1456|src/platforms/ios/__tests__/index.test.ts:1477-1488|src/platforms/ios/__tests__/index.test.ts:590-602", + "src/platforms/ios/__tests__/index.test.ts:604-638|src/platforms/ios/__tests__/index.test.ts:647-672", + "src/platforms/ios/__tests__/index.test.ts:1489-1513|src/platforms/ios/__tests__/index.test.ts:791-815|src/platforms/ios/__tests__/index.test.ts:840-864", + "src/platforms/ios/__tests__/index.test.ts:1725-1737|src/platforms/ios/__tests__/index.test.ts:956-968", + "src/platforms/ios/__tests__/index.test.ts:1072-1084|src/platforms/ios/__tests__/index.test.ts:2285-2306", + "src/platforms/ios/__tests__/index.test.ts:1099-1124|src/platforms/ios/__tests__/index.test.ts:1155-1189", + "src/platforms/ios/__tests__/index.test.ts:1199-1210|src/platforms/ios/__tests__/index.test.ts:1338-1350", + "src/platforms/ios/__tests__/index.test.ts:1211-1219|src/platforms/ios/__tests__/index.test.ts:1373-1381", + "src/platforms/ios/__tests__/index.test.ts:1234-1246|src/platforms/ios/__tests__/index.test.ts:1320-1332|src/platforms/ios/__tests__/index.test.ts:1387-1399|src/platforms/ios/__tests__/index.test.ts:1525-1537|src/platforms/ios/__tests__/index.test.ts:1757-1769", + "src/platforms/ios/__tests__/index.test.ts:1247-1252|src/platforms/ios/__tests__/index.test.ts:1334-1340", + "src/platforms/ios/__tests__/index.test.ts:1298-1321|src/platforms/ios/__tests__/index.test.ts:1368-1388", + "src/platforms/ios/__tests__/index.test.ts:1320-1332|src/platforms/ios/__tests__/index.test.ts:1387-1399", + "src/platforms/ios/__tests__/index.test.ts:1345-1375|src/platforms/ios/__tests__/index.test.ts:1409-1437", + "src/platforms/ios/__tests__/index.test.ts:1435-1445|src/platforms/ios/__tests__/index.test.ts:1468-1478", + "src/platforms/ios/__tests__/index.test.ts:1441-1449|src/platforms/ios/__tests__/index.test.ts:2332-2343", + "src/platforms/ios/__tests__/index.test.ts:1681-1697|src/platforms/ios/__tests__/index.test.ts:1844-1860", + "src/platforms/ios/__tests__/index.test.ts:1955-1982|src/platforms/ios/__tests__/index.test.ts:1989-2019", + "src/platforms/ios/__tests__/index.test.ts:1979-1987|src/platforms/ios/__tests__/index.test.ts:2051-2059", + "src/platforms/ios/__tests__/index.test.ts:2016-2020|src/platforms/ios/__tests__/index.test.ts:2091-2095", + "src/platforms/ios/__tests__/index.test.ts:2027-2054|src/platforms/ios/__tests__/index.test.ts:2061-2094", + "src/platforms/ios/__tests__/index.test.ts:2103-2126|src/platforms/ios/__tests__/index.test.ts:2137-2160", + "src/platforms/ios/__tests__/index.test.ts:2211-2222|src/platforms/ios/__tests__/index.test.ts:2255-2266", + "src/platforms/ios/__tests__/index.test.ts:2223-2233|src/platforms/ios/__tests__/index.test.ts:2268-2278", + "src/platforms/ios/__tests__/index.test.ts:2665-2679|src/platforms/ios/__tests__/index.test.ts:2721-2732", "src/platforms/ios/__tests__/perf.test.ts:1-12|src/platforms/ios/__tests__/plist.test.ts:1-12", "src/platforms/ios/__tests__/runner-client.test.ts:470-474|src/platforms/ios/__tests__/runner-client.test.ts:494-498|src/platforms/ios/__tests__/runner-client.test.ts:528-532", "src/platforms/ios/__tests__/runner-client.test.ts:474-491|src/platforms/ios/__tests__/runner-client.test.ts:505-525", "src/platforms/ios/__tests__/runner-client.test.ts:494-501|src/platforms/ios/__tests__/runner-client.test.ts:528-533", "src/platforms/ios/__tests__/runner-client.test.ts:591-599|src/platforms/ios/__tests__/runner-client.test.ts:652-660", + "src/platforms/ios/__tests__/runner-transport.test.ts:106-113|src/platforms/ios/__tests__/runner-transport.test.ts:72-79", "src/platforms/ios/__tests__/runner-xctestrun.test.ts:108-114|src/platforms/ios/__tests__/runner-xctestrun.test.ts:198-204", "src/platforms/ios/__tests__/runner-xctestrun.test.ts:118-129|src/platforms/ios/__tests__/runner-xctestrun.test.ts:209-222", - "src/platforms/ios/apps.ts:56-63|src/platforms/ios/screenshot-status-bar.ts:49-61", - "src/platforms/ios/apps.ts:58-63|src/platforms/ios/screenshot.ts:23-28", - "src/platforms/ios/apps.ts:92-157|src/platforms/ios/macos-apps.ts:64-96", + "src/platforms/ios/apps.ts:67-72|src/platforms/ios/screenshot-status-bar.ts:56-61|src/platforms/ios/screenshot.ts:23-28", "src/platforms/ios/devicectl.ts:128-140|src/platforms/ios/devicectl.ts:80-92", "src/platforms/ios/macos-helper.ts:274-298|src/platforms/ios/macos-helper.ts:327-353", "src/platforms/ios/runner-xctestrun.ts:647-655|src/utils/version.ts:17-25", @@ -549,14 +565,24 @@ "src/platforms/linux/__tests__/clipboard.test.ts:109-117|src/platforms/linux/__tests__/clipboard.test.ts:72-80", "src/platforms/linux/__tests__/input-actions.test.ts:196-206|src/platforms/linux/__tests__/input-actions.test.ts:76-84", "src/remote-config-schema.ts:21-34|src/utils/command-schema.ts:35-48", - "src/utils/__tests__/args.test.ts:746-761|src/utils/__tests__/args.test.ts:764-776|src/utils/__tests__/args.test.ts:786-804", - "src/utils/__tests__/args.test.ts:747-764|src/utils/__tests__/args.test.ts:800-814", - "src/utils/__tests__/args.test.ts:764-777|src/utils/__tests__/args.test.ts:786-805", - "src/utils/__tests__/args.test.ts:1000-1005|src/utils/__tests__/args.test.ts:986-991", - "src/utils/__tests__/args.test.ts:1012-1017|src/utils/__tests__/args.test.ts:995-1003", - "src/utils/__tests__/args.test.ts:1010-1016|src/utils/__tests__/args.test.ts:1044-1050", - "src/utils/__tests__/args.test.ts:1013-1020|src/utils/__tests__/args.test.ts:1046-1053", - "src/utils/__tests__/args.test.ts:1054-1061|src/utils/__tests__/args.test.ts:1069-1079|src/utils/__tests__/args.test.ts:1080-1087", + "src/utils/__tests__/args.test.ts:746-761|src/utils/__tests__/args.test.ts:790-802", + "src/utils/__tests__/args.test.ts:747-764|src/utils/__tests__/args.test.ts:826-840", + "src/utils/__tests__/args.test.ts:791-809|src/utils/__tests__/args.test.ts:810-837", + "src/utils/__tests__/args.test.ts:840-849|src/utils/__tests__/args.test.ts:885-894", + "src/utils/__tests__/args.test.ts:842-855|src/utils/__tests__/args.test.ts:919-932", + "src/utils/__tests__/args.test.ts:842-854|src/utils/__tests__/args.test.ts:919-931|src/utils/__tests__/args.test.ts:937-952", + "src/utils/__tests__/args.test.ts:843-860|src/utils/__tests__/args.test.ts:861-881", + "src/utils/__tests__/args.test.ts:1136-1145|src/utils/__tests__/args.test.ts:843-882|src/utils/__tests__/args.test.ts:888-894|src/utils/__tests__/args.test.ts:900-906|src/utils/__tests__/args.test.ts:920-932|src/utils/__tests__/args.test.ts:938-944", + "src/utils/__tests__/args.test.ts:870-885|src/utils/__tests__/args.test.ts:920-935", + "src/utils/__tests__/args.test.ts:887-897|src/utils/__tests__/args.test.ts:899-909", + "src/utils/__tests__/args.test.ts:921-935|src/utils/__tests__/args.test.ts:938-955", + "src/utils/__tests__/args.test.ts:1153-1161|src/utils/__tests__/args.test.ts:944-955", + "src/utils/__tests__/args.test.ts:1127-1132|src/utils/__tests__/args.test.ts:1141-1146", + "src/utils/__tests__/args.test.ts:1151-1157|src/utils/__tests__/args.test.ts:1185-1191", + "src/utils/__tests__/args.test.ts:1151-1157|src/utils/__tests__/args.test.ts:1185-1191|src/utils/__tests__/args.test.ts:1258-1267", + "src/utils/__tests__/args.test.ts:1154-1161|src/utils/__tests__/args.test.ts:1187-1194", + "src/utils/__tests__/args.test.ts:1195-1202|src/utils/__tests__/args.test.ts:1210-1220|src/utils/__tests__/args.test.ts:1221-1228", + "src/utils/__tests__/daemon-client.test.ts:36-44|test/integration/smoke-daemon-http.test.ts:189-197", "src/utils/__tests__/daemon-client.test.ts:295-317|src/utils/__tests__/daemon-client.test.ts:77-95", "src/utils/__tests__/daemon-client.test.ts:195-213|src/utils/__tests__/daemon-client.test.ts:294-312|src/utils/__tests__/daemon-client.test.ts:439-457", "src/utils/__tests__/daemon-client.test.ts:216-225|src/utils/__tests__/daemon-client.test.ts:670-679", @@ -584,15 +610,16 @@ "src/utils/__tests__/mobile-snapshot-semantics.test.ts:153-172|src/utils/__tests__/mobile-snapshot-semantics.test.ts:179-197", "src/utils/__tests__/mobile-snapshot-semantics.test.ts:284-309|src/utils/__tests__/mobile-snapshot-semantics.test.ts:320-345", "src/utils/__tests__/mobile-snapshot-semantics.test.ts:310-316|src/utils/__tests__/mobile-snapshot-semantics.test.ts:346-352", - "src/utils/__tests__/output.test.ts:25-30|src/utils/__tests__/output.test.ts:765-771", - "src/utils/__tests__/output.test.ts:30-39|src/utils/__tests__/output.test.ts:51-60", - "src/utils/__tests__/output.test.ts:328-341|src/utils/__tests__/output.test.ts:83-95", - "src/utils/__tests__/output.test.ts:238-245|src/utils/__tests__/output.test.ts:488-493", - "src/utils/__tests__/output.test.ts:298-319|src/utils/__tests__/output.test.ts:376-398", - "src/utils/__tests__/output.test.ts:298-316|src/utils/__tests__/output.test.ts:376-395|src/utils/__tests__/output.test.ts:433-451", - "src/utils/__tests__/output.test.ts:327-338|src/utils/__tests__/output.test.ts:480-491", - "src/utils/__tests__/output.test.ts:568-578|src/utils/__tests__/output.test.ts:586-596", - "src/utils/__tests__/output.test.ts:619-628|src/utils/__tests__/output.test.ts:634-643", + "src/utils/__tests__/output.test.ts:31-36|src/utils/__tests__/output.test.ts:824-830", + "src/utils/__tests__/output.test.ts:36-45|src/utils/__tests__/output.test.ts:57-66", + "src/utils/__tests__/output.test.ts:334-347|src/utils/__tests__/output.test.ts:89-101", + "src/utils/__tests__/output.test.ts:244-251|src/utils/__tests__/output.test.ts:547-552", + "src/utils/__tests__/output.test.ts:304-325|src/utils/__tests__/output.test.ts:382-404", + "src/utils/__tests__/output.test.ts:304-322|src/utils/__tests__/output.test.ts:382-401|src/utils/__tests__/output.test.ts:492-510", + "src/utils/__tests__/output.test.ts:333-344|src/utils/__tests__/output.test.ts:539-550", + "src/utils/__tests__/output.test.ts:468-486|src/utils/__tests__/output.test.ts:532-551", + "src/utils/__tests__/output.test.ts:627-637|src/utils/__tests__/output.test.ts:645-655", + "src/utils/__tests__/output.test.ts:678-687|src/utils/__tests__/output.test.ts:693-702", "src/utils/__tests__/png.test.ts:19-27|src/utils/__tests__/png.test.ts:50-58", "src/utils/__tests__/screenshot-diff.test.ts:46-53|src/utils/__tests__/screenshot-diff.test.ts:67-74", "src/utils/__tests__/screenshot-diff.test.ts:46-52|src/utils/__tests__/screenshot-diff.test.ts:67-73|src/utils/__tests__/screenshot-diff.test.ts:83-89", @@ -604,10 +631,7 @@ "src/utils/__tests__/screenshot-diff.test.ts:153-168|src/utils/__tests__/screenshot-diff.test.ts:185-200", "src/utils/__tests__/screenshot-diff.test.ts:169-177|src/utils/__tests__/screenshot-diff.test.ts:201-209", "src/utils/__tests__/screenshot-diff.test.ts:169-177|src/utils/__tests__/screenshot-diff.test.ts:201-209|src/utils/__tests__/screenshot-diff.test.ts:399-407", - "src/utils/exec.ts:277-287|src/utils/exec.ts:45-55", - "src/utils/exec.ts:292-315|src/utils/exec.ts:59-82", - "src/utils/exec.ts:326-429|src/utils/exec.ts:89-158", - "src/utils/exec.ts:379-426|test/scripts/metro-prepare-packaged-smoke.mjs:124-145", + "src/utils/exec.ts:318-351|test/scripts/metro-prepare-packaged-smoke.mjs:124-145", "src/utils/mobile-snapshot-semantics.ts:287-294|src/utils/mobile-snapshot-semantics.ts:342-349", "src/utils/parsing.ts:77-81|src/utils/parsing.ts:90-94", "src/utils/screenshot-diff-non-text.ts:125-140|src/utils/screenshot-diff-regions.ts:97-119", @@ -615,14 +639,12 @@ "src/utils/screenshot-diff-non-text.ts:400-419|src/utils/screenshot-diff-ocr.ts:338-354", "src/utils/screenshot-diff-non-text.ts:473-487|src/utils/screenshot-diff-overlay-matches.ts:55-66", "src/utils/screenshot-diff-non-text.ts:489-499|src/utils/screenshot-diff-ocr.ts:352-363", - "test/integration/installed-package-metro.test.ts:14-21|test/integration/smoke-open-remote-config.test.ts:102-109", - "test/integration/installed-package-metro.test.ts:28-35|test/integration/smoke-open-remote-config.test.ts:115-122", - "test/integration/recording-overlay.test.ts:126-133|test/integration/recording-overlay.test.ts:158-165|test/integration/recording-overlay.test.ts:30-37|test/integration/recording-overlay.test.ts:58-65|test/integration/recording-overlay.test.ts:94-103", - "test/integration/recording-overlay.test.ts:125-133|test/integration/recording-overlay.test.ts:157-165", + "test/integration/installed-package-metro.test.ts:15-22|test/integration/smoke-open-remote-config.test.ts:102-109", + "test/integration/installed-package-metro.test.ts:29-36|test/integration/smoke-open-remote-config.test.ts:115-122", "test/integration/smoke-daemon-http.test.ts:173-197|test/integration/smoke-open-remote-config.test.ts:78-99", "test/integration/smoke-daemon-http.test.ts:208-216|test/integration/smoke-daemon-http.test.ts:292-300", "test/integration/smoke-open-remote-config.test.ts:103-111|test/scripts/metro-prepare-packaged-smoke.mjs:66-74", "test/integration/smoke-open-remote-config.test.ts:146-170|test/scripts/metro-prepare-packaged-smoke.mjs:200-214", "test/scripts/metro-prepare-packaged-smoke.mjs:217-226|test/scripts/metro-prepare-packaged-smoke.mjs:245-254" ] -} +} \ No newline at end of file diff --git a/fallow-baselines/health.json b/fallow-baselines/health.json index dd91dd6f..e5ac298e 100644 --- a/fallow-baselines/health.json +++ b/fallow-baselines/health.json @@ -88,23 +88,14 @@ } }, "src/cli/commands/output.ts": { - "complexity_critical": { - "count": 2 - }, - "complexity_high": { - "count": 2 - }, - "crap_critical": { - "count": 2 + "complexity_moderate": { + "count": 1 }, - "crap_high": { - "count": 2 + "crap_moderate": { + "count": 4 } }, "src/cli/commands/react-devtools.ts": { - "crap_high": { - "count": 1 - }, "crap_moderate": { "count": 1 } @@ -118,14 +109,11 @@ "complexity_high": { "count": 1 }, - "complexity_moderate": { - "count": 1 - }, "crap_high": { "count": 1 }, "crap_moderate": { - "count": 4 + "count": 3 } }, "src/client-companion-tunnel.ts": { @@ -230,7 +218,7 @@ "count": 2 }, "crap_high": { - "count": 3 + "count": 4 }, "crap_moderate": { "count": 5 @@ -256,11 +244,6 @@ "count": 4 } }, - "src/daemon.ts": { - "crap_critical": { - "count": 1 - } - }, "src/daemon/__tests__/http-server.test.ts": { "crap_moderate": { "count": 1 @@ -441,7 +424,7 @@ "count": 1 }, "crap_high": { - "count": 2 + "count": 1 } }, "src/daemon/handlers/session-perf.ts": { @@ -532,6 +515,11 @@ "count": 3 } }, + "src/daemon/handlers/snapshot-settings.ts": { + "complexity_moderate": { + "count": 1 + } + }, "src/daemon/http-server.ts": { "complexity_critical": { "count": 1 @@ -575,7 +563,7 @@ "count": 2 }, "crap_moderate": { - "count": 4 + "count": 3 } }, "src/daemon/runtime-hints.ts": { @@ -643,14 +631,6 @@ "count": 2 } }, - "src/daemon/transport.ts": { - "crap_high": { - "count": 1 - }, - "crap_moderate": { - "count": 1 - } - }, "src/platforms/android/app-lifecycle.ts": { "complexity_moderate": { "count": 1 @@ -688,7 +668,7 @@ } }, "src/platforms/android/settings.ts": { - "complexity_moderate": { + "complexity_high": { "count": 1 } }, @@ -698,18 +678,9 @@ } }, "src/platforms/android/ui-hierarchy.ts": { - "complexity_critical": { - "count": 1 - }, "complexity_high": { "count": 1 }, - "complexity_moderate": { - "count": 1 - }, - "crap_critical": { - "count": 1 - }, "crap_high": { "count": 1 }, @@ -741,11 +712,6 @@ "count": 1 } }, - "src/platforms/ios/__tests__/perf.test.ts": { - "crap_high": { - "count": 1 - } - }, "src/platforms/ios/apps.ts": { "complexity_high": { "count": 1 @@ -1035,52 +1001,51 @@ }, "runtime_coverage_findings": [], "target_keys": [ - "src/daemon/handlers/session.ts:complexity", "src/daemon/handlers/snapshot-capture.ts:high impact", + "src/daemon/handlers/session.ts:complexity", "src/daemon/handlers/session-device-utils.ts:high impact", - "src/utils/process-identity.ts:high impact", "src/client-shared.ts:high impact", "src/daemon/handlers/session-replay-script.ts:complexity", - "src/daemon/config.ts:high impact", "src/commands/selector-read-utils.ts:high impact", - "src/utils/args.ts:high impact", + "src/daemon/config.ts:high impact", + "src/daemon/handlers/session-replay-heal.ts:complexity", "src/daemon/android-snapshot-freshness.ts:high impact", - "src/daemon/session-store.ts:complexity", - "src/platforms/boot-diagnostics.ts:complexity", "src/cli/commands/connection-runtime.ts:complexity", - "src/daemon/handlers/session-replay-heal.ts:complexity", - "src/cli/commands/output.ts:complexity", + "src/platforms/boot-diagnostics.ts:complexity", + "src/utils/args.ts:high impact", + "src/daemon/session-store.ts:complexity", + "src/daemon/handlers/session-open-target.ts:high impact", "src/daemon/handlers/snapshot-alert.ts:complexity", - "src/cli/commands/connection.ts:untested risk", - "src/daemon/handlers/session-inventory.ts:complexity", "src/utils/success-text.ts:high impact", + "src/daemon/handlers/session-inventory.ts:complexity", "src/daemon/handlers/install-source.ts:complexity", - "src/daemon/script-utils.ts:high impact", "src/utils/snapshot-processing.ts:high impact", - "src/daemon/handlers/session-open-target.ts:high impact", - "src/cli.ts:complexity", + "src/cli/commands/output.ts:untested risk", + "src/daemon/script-utils.ts:high impact", + "src/utils/process-identity.ts:high impact", "src/utils/output.ts:high impact", + "src/cli.ts:complexity", + "src/platforms/ios/xml.ts:high impact", "src/daemon/handlers/session-state.ts:complexity", "src/daemon/handlers/session-open.ts:complexity", - "src/platforms/android/ui-hierarchy.ts:high impact", "src/daemon/request-cancel.ts:high impact", "src/utils/device.ts:high impact", - "src/platforms/android/input-actions.ts:complexity", - "src/daemon/app-log-process.ts:high impact", "src/utils/snapshot-lines.ts:high impact", - "src/client-metro.ts:complexity", + "src/daemon/app-log-process.ts:high impact", "src/utils/selector-build.ts:high impact", - "src/platforms/ios/xml.ts:high impact", + "src/client-metro.ts:complexity", + "src/platforms/android/input-actions.ts:complexity", "src/utils/text-surface.ts:high impact", "src/cli-test.ts:untested risk", "src/utils/keyed-lock.ts:high impact", - "src/daemon/app-log-stream.ts:high impact", "src/core/batch.ts:complexity", "src/platforms/ios/runner-xctestrun.ts:complexity", + "src/daemon/app-log-stream.ts:high impact", "src/platforms/android/sdk.ts:high impact", "src/utils/source-value.ts:high impact", "src/utils/screenshot-diff-regions.ts:complexity", + "src/client-companion-tunnel-worker.ts:complexity", "src/daemon/screenshot-overlay.ts:untested risk", "src/utils/screenshot-diff-non-text.ts:complexity" ] -} +} \ No newline at end of file diff --git a/skills/agent-device/SKILL.md b/skills/agent-device/SKILL.md index 4c6d2643..b88a0fd8 100644 --- a/skills/agent-device/SKILL.md +++ b/skills/agent-device/SKILL.md @@ -32,3 +32,5 @@ agent-device help dogfood Default loop: `open -> snapshot/-i -> get/is/find or press/fill/scroll/wait -> verify -> close`. Use this skill only to route into version-matched CLI help. Let `help workflow` provide exact command shapes, platform limits, and current workflow guidance. + +For precise location workflows, read the installed `settings` help before planning so coordinate support and platform limits come from the active CLI version. diff --git a/src/__tests__/cli-client-commands.test.ts b/src/__tests__/cli-client-commands.test.ts index 42fe9463..2354a034 100644 --- a/src/__tests__/cli-client-commands.test.ts +++ b/src/__tests__/cli-client-commands.test.ts @@ -12,6 +12,7 @@ import type { MetroPrepareOptions, MetroReloadOptions, } from '../client.ts'; +import type { SettingsUpdateOptions } from '../client-types.ts'; import { AppError } from '../utils/errors.ts'; import { resolveCliOptions } from '../utils/cli-options.ts'; @@ -740,6 +741,82 @@ test('install prints command-owned success output in human mode', async () => { assert.match(stdout, /Installed: Demo/); }); +test('settings location set forwards coordinates to client settings update', async () => { + let observed: SettingsUpdateOptions | undefined; + const client = createStubClient({ + installFromSource: async () => ({ + launchTarget: 'com.example.demo', + packageName: 'com.example.demo', + identifiers: { appId: 'com.example.demo' }, + }), + updateSettings: async (options) => { + observed = options; + return { identifiers: { session: 'default' } }; + }, + }); + + const handled = await tryRunClientBackedCommand({ + command: 'settings', + positionals: ['location', 'set', '37.3349', '-122.009'], + flags: { + json: false, + help: false, + version: false, + platform: 'ios', + session: 'maps', + }, + client, + }); + + assert.equal(handled, true); + assert.equal(observed?.platform, 'ios'); + assert.equal(observed?.setting, 'location'); + assert.equal(observed?.state, 'set'); + assert.equal(observed?.latitude, 37.3349); + assert.equal(observed?.longitude, -122.009); +}); + +test('settings location set rejects invalid coordinates before client call', async () => { + const client = createStubClient({ + installFromSource: async () => ({ + launchTarget: 'com.example.demo', + packageName: 'com.example.demo', + identifiers: { appId: 'com.example.demo' }, + }), + updateSettings: async () => { + throw new Error('unexpected settings update'); + }, + }); + + const cases: Array<[string[], RegExp]> = [ + [['location', 'set', '91', '-122.009'], /latitude must be a number from -90 to 90/], + [['location', 'set', '37.3349', 'not-a-number'], /longitude must be a number from -180 to 180/], + ]; + + for (const [positionals, message] of cases) { + await assert.rejects( + () => + tryRunClientBackedCommand({ + command: 'settings', + positionals, + flags: { + json: false, + help: false, + version: false, + platform: 'ios', + }, + client, + }), + (error: unknown) => { + assert.equal(error instanceof AppError, true); + assert.equal((error as AppError).code, 'INVALID_ARGS'); + assert.match((error as AppError).message, message); + return true; + }, + ); + } +}); + async function captureStdout(run: () => Promise): Promise { let stdout = ''; const originalWrite = process.stdout.write.bind(process.stdout); @@ -763,6 +840,7 @@ function createStubClient(params: { reloadMetro?: AgentDeviceClient['metro']['reload']; open?: AgentDeviceClient['apps']['open']; screenshot?: AgentDeviceClient['capture']['screenshot']; + updateSettings?: AgentDeviceClient['settings']['update']; }): AgentDeviceClient { const unexpectedCommandCall = async (): Promise => { throw new Error('unexpected command call'); @@ -894,7 +972,9 @@ function createStubClient(params: { batch: createThrowingMethodGroup(), observability: createThrowingMethodGroup(), recording: createThrowingMethodGroup(), - settings: createThrowingMethodGroup(), + settings: { + update: params.updateSettings ?? unexpectedCommandCall, + }, }; } diff --git a/src/cli/commands/generic.ts b/src/cli/commands/generic.ts index b30f8e2e..8e053919 100644 --- a/src/cli/commands/generic.ts +++ b/src/cli/commands/generic.ts @@ -12,6 +12,7 @@ import { announceReplayTestRun } from '../../cli-test.ts'; import { splitSelectorFromArgs } from '../../daemon/selectors.ts'; import { AppError } from '../../utils/errors.ts'; import type { CliFlags } from '../../utils/command-schema.ts'; +import { readLocationCoordinate } from '../../utils/location-coordinates.ts'; import { buildSelectionOptions } from './shared.ts'; import { writeCommandCliOutput } from './output.ts'; import type { ClientCommandHandler, ClientCommandHandlerMap } from './router-types.ts'; @@ -471,6 +472,15 @@ function readSettingsOptions(positionals: string[], flags: CliFlags): SettingsUp ) { return { ...base, setting, state }; } + if (setting === 'location' && state === 'set') { + return { + ...base, + setting, + state, + latitude: readLocationCoordinate(positionals[2], 'latitude'), + longitude: readLocationCoordinate(positionals[3], 'longitude'), + }; + } if (setting === 'appearance' && (state === 'light' || state === 'dark' || state === 'toggle')) { return { ...base, setting, state }; } diff --git a/src/client-types.ts b/src/client-types.ts index 879d2c02..07035670 100644 --- a/src/client-types.ts +++ b/src/client-types.ts @@ -707,6 +707,12 @@ export type SettingsUpdateOptions = setting: 'wifi' | 'airplane' | 'location'; state: 'on' | 'off'; }) + | (ClientCommandBaseOptions & { + setting: 'location'; + state: 'set'; + latitude: number; + longitude: number; + }) | (ClientCommandBaseOptions & { setting: 'animations'; state: 'on' | 'off'; diff --git a/src/client.ts b/src/client.ts index 340b0aed..277dbad0 100644 --- a/src/client.ts +++ b/src/client.ts @@ -471,6 +471,7 @@ export function createAgentDeviceClient( [ options.setting, options.state, + ...('latitude' in options ? [String(options.latitude), String(options.longitude)] : []), ...('permission' in options ? [options.permission] : []), ...('mode' in options && options.mode ? [options.mode] : []), ], diff --git a/src/core/dispatch.ts b/src/core/dispatch.ts index 24526120..fa92117a 100644 --- a/src/core/dispatch.ts +++ b/src/core/dispatch.ts @@ -26,6 +26,7 @@ import { parseTriggerAppEventArgs, resolveAppEventUrl } from './app-events.ts'; import type { RawSnapshotNode } from '../utils/snapshot.ts'; import type { CliFlags } from '../utils/command-schema.ts'; import { emitDiagnostic, withDiagnosticTimer } from '../utils/diagnostics.ts'; +import { readLocationCoordinate } from '../utils/location-coordinates.ts'; import { successText, withSuccessText } from '../utils/success-text.ts'; import { parseScrollDirection } from './scroll-gesture.ts'; import { @@ -39,7 +40,7 @@ import { import { readNotificationPayload } from './dispatch-payload.ts'; import { parseDeviceRotation } from './device-rotation.ts'; -export { resolveTargetDevice, withResolveTargetDeviceCacheScope } from './dispatch-resolve.ts'; +export { resolveTargetDevice } from './dispatch-resolve.ts'; export { shouldUseIosTapSeries, shouldUseIosDragSeries }; export type BatchStep = { @@ -687,14 +688,25 @@ async function handleSettingsCommand( positionals: string[], context: DispatchContext | undefined, ): Promise> { - const [setting, state, target, mode, appBundleId] = positionals; - const permissionOptions = + const [setting, state, target, mode] = positionals; + const appBundleId = + setting === 'permission' + ? (positionals[4] ?? context?.appBundleId) + : setting === 'location' && state === 'set' + ? (positionals[4] ?? context?.appBundleId) + : (positionals[2] ?? context?.appBundleId); + const settingOptions = setting === 'permission' ? { permissionTarget: target, permissionMode: mode, } - : undefined; + : setting === 'location' && state === 'set' + ? { + latitude: readLocationCoordinate(target, 'latitude'), + longitude: readLocationCoordinate(mode, 'longitude'), + } + : undefined; emitDiagnostic({ level: 'debug', phase: 'settings_apply', @@ -706,12 +718,7 @@ async function handleSettingsCommand( platform: device.platform, }, }); - const result = await interactor.setSetting( - setting, - state, - appBundleId ?? context?.appBundleId, - permissionOptions, - ); + const result = await interactor.setSetting(setting, state, appBundleId, settingOptions); return result && typeof result === 'object' ? withSuccessText( { setting, state, ...result }, diff --git a/src/core/interactor-types.ts b/src/core/interactor-types.ts index 1ab72f15..07239852 100644 --- a/src/core/interactor-types.ts +++ b/src/core/interactor-types.ts @@ -1,6 +1,6 @@ import type { DeviceRotation } from './device-rotation.ts'; import type { ScrollDirection } from './scroll-gesture.ts'; -import type { PermissionSettingOptions } from '../platforms/permission-utils.ts'; +import type { SettingOptions } from '../platforms/permission-utils.ts'; import type { SessionSurface } from './session-surface.ts'; export type RunnerContext = { @@ -59,6 +59,6 @@ export type Interactor = { setting: string, state: string, appId?: string, - options?: PermissionSettingOptions, + options?: SettingOptions, ): Promise | void>; }; diff --git a/src/core/settings-contract.ts b/src/core/settings-contract.ts index b34235e7..f3dbdeae 100644 --- a/src/core/settings-contract.ts +++ b/src/core/settings-contract.ts @@ -1,4 +1,5 @@ const SETTINGS_WIFI_USAGE = ' '; +const SETTINGS_LOCATION_SET_USAGE = 'location set '; const SETTINGS_ANIMATIONS_USAGE = 'animations '; const SETTINGS_APPEARANCE_USAGE = 'appearance '; const SETTINGS_FACEID_USAGE = 'faceid '; @@ -12,6 +13,7 @@ const SETTINGS_MACOS_SUPPORTED_MESSAGE = `macOS supports only settings ${SETTING export const SETTINGS_USAGE_OVERRIDE = [ `settings ${SETTINGS_WIFI_USAGE}`, + `settings ${SETTINGS_LOCATION_SET_USAGE}`, `settings ${SETTINGS_ANIMATIONS_USAGE}`, `settings ${SETTINGS_APPEARANCE_USAGE}`, `settings ${SETTINGS_FACEID_USAGE}`, @@ -21,7 +23,7 @@ export const SETTINGS_USAGE_OVERRIDE = [ `settings ${SETTINGS_MACOS_PERMISSION_USAGE}`, ].join(' | '); -export const SETTINGS_INVALID_ARGS_MESSAGE = `settings requires ${SETTINGS_WIFI_USAGE}, ${SETTINGS_ANIMATIONS_USAGE}, ${SETTINGS_APPEARANCE_USAGE}, ${SETTINGS_FACEID_USAGE}, ${SETTINGS_TOUCHID_USAGE}, ${SETTINGS_FINGERPRINT_USAGE}, ${SETTINGS_PERMISSION_USAGE}, or ${SETTINGS_MACOS_PERMISSION_USAGE}`; +export const SETTINGS_INVALID_ARGS_MESSAGE = `settings requires ${SETTINGS_WIFI_USAGE}, ${SETTINGS_LOCATION_SET_USAGE}, ${SETTINGS_ANIMATIONS_USAGE}, ${SETTINGS_APPEARANCE_USAGE}, ${SETTINGS_FACEID_USAGE}, ${SETTINGS_TOUCHID_USAGE}, ${SETTINGS_FINGERPRINT_USAGE}, ${SETTINGS_PERMISSION_USAGE}, or ${SETTINGS_MACOS_PERMISSION_USAGE}`; export function isMacOsSettingSupported(setting: string): boolean { const normalized = setting.trim().toLowerCase(); diff --git a/src/daemon/handlers/__tests__/snapshot-handler.test.ts b/src/daemon/handlers/__tests__/snapshot-handler.test.ts index fc4f014d..06297fc3 100644 --- a/src/daemon/handlers/__tests__/snapshot-handler.test.ts +++ b/src/daemon/handlers/__tests__/snapshot-handler.test.ts @@ -635,6 +635,38 @@ test('settings usage hint documents canonical faceid states', async () => { } }); +test('settings location set dispatches coordinates without placeholder slots', async () => { + const sessionStore = makeSessionStore(); + const sessionName = 'ios-location'; + sessionStore.set(sessionName, { + ...makeSession(sessionName, iosSimulatorDevice), + appBundleId: 'com.example.maps', + }); + mockDispatch.mockResolvedValue({ setting: 'location', state: 'set' }); + + const response = await handleSnapshotCommands({ + req: { + token: 't', + session: sessionName, + command: 'settings', + positionals: ['location', 'set', '37.3349', '-122.009'], + flags: {}, + }, + sessionName, + logPath: '/tmp/daemon.log', + sessionStore, + }); + + expect(response?.ok).toBe(true); + expect(mockDispatch).toHaveBeenCalledWith( + iosSimulatorDevice, + 'settings', + ['location', 'set', '37.3349', '-122.009', 'com.example.maps'], + undefined, + expect.objectContaining({ appBundleId: 'com.example.maps' }), + ); +}); + test('settings on macOS returns helper-backed permission status', async () => { await withMockedMacOsHelper( [ diff --git a/src/daemon/handlers/snapshot-settings.ts b/src/daemon/handlers/snapshot-settings.ts index b9ea242f..f636c463 100644 --- a/src/daemon/handlers/snapshot-settings.ts +++ b/src/daemon/handlers/snapshot-settings.ts @@ -15,6 +15,8 @@ type ParsedSettingsArgs = { setting: string; state: string; permissionTarget?: string; + latitude?: string; + longitude?: string; }; type HandleSettingsCommandParams = { @@ -32,17 +34,31 @@ export function parseSettingsArgs( const setting = req.positionals?.[0]?.toLowerCase(); const state = req.positionals?.[1]?.toLowerCase(); const permissionTarget = req.positionals?.[2]?.toLowerCase(); - if (!setting || !state || (setting === 'permission' && !permissionTarget)) { + if ( + !setting || + !state || + (setting === 'permission' && !permissionTarget) || + (setting === 'location' && state === 'set' && (!req.positionals?.[2] || !req.positionals?.[3])) + ) { return errorResponse('INVALID_ARGS', SETTINGS_INVALID_ARGS_MESSAGE); } - return { ok: true, parsed: { setting, state, permissionTarget } }; + return { + ok: true, + parsed: { + setting, + state, + permissionTarget, + latitude: req.positionals?.[2], + longitude: req.positionals?.[3], + }, + }; } export async function handleSettingsCommand( params: HandleSettingsCommandParams, ): Promise { const { req, logPath, sessionStore, session, device, parsed } = params; - const { setting, state, permissionTarget } = parsed; + const { setting, state, permissionTarget, latitude, longitude } = parsed; if (!isCommandSupportedOnDevice('settings', device)) { return errorResponse('UNSUPPORTED_OPERATION', 'settings is not supported on this device'); } @@ -51,11 +67,13 @@ export async function handleSettingsCommand( } const appBundleId = session?.appBundleId; - // Settings positional layout for dispatch: setting, state, [target, mode], appBundleId. + // Settings positional layout for dispatch: setting, state, command payload, appBundleId. const positionals = setting === 'permission' ? [setting, state, permissionTarget ?? '', req.positionals?.[3] ?? '', appBundleId ?? ''] - : [setting, state, appBundleId ?? '']; + : setting === 'location' && state === 'set' + ? [setting, state, latitude ?? '', longitude ?? '', appBundleId ?? ''] + : [setting, state, appBundleId ?? '']; const data = await dispatchCommand(device, 'settings', positionals, req.flags?.out, { ...contextFromFlags(logPath, req.flags, appBundleId, session?.trace?.outPath), }); diff --git a/src/platforms/android/__tests__/index.test.ts b/src/platforms/android/__tests__/index.test.ts index 257ea34e..e9c20cba 100644 --- a/src/platforms/android/__tests__/index.test.ts +++ b/src/platforms/android/__tests__/index.test.ts @@ -815,6 +815,21 @@ test('rotateAndroid locks auto-rotate and sets user rotation', async () => { ); }); +test('setAndroidSetting location set sends emulator geo fix with longitude then latitude', async () => { + await withMockedAdb( + 'agent-device-android-location-set-', + '#!/bin/sh\nprintf "%s\\n" "$@" >> "$AGENT_DEVICE_TEST_ARGS_FILE"\nexit 0\n', + async ({ argsLogPath, device }) => { + await setAndroidSetting(device, 'location', 'set', undefined, { + latitude: 37.3349, + longitude: -122.009, + }); + const logged = await fs.readFile(argsLogPath, 'utf8'); + assert.match(logged, /emu\ngeo\nfix\n-122\.009\n37\.3349/); + }, + ); +}); + test('setAndroidSetting fingerprint match uses adb shell cmd fingerprint touch', async () => { await withMockedAdb( 'agent-device-android-fingerprint-match-', diff --git a/src/platforms/android/settings.ts b/src/platforms/android/settings.ts index 7028795f..8d3a9a3d 100644 --- a/src/platforms/android/settings.ts +++ b/src/platforms/android/settings.ts @@ -1,11 +1,13 @@ import { AppError } from '../../utils/errors.ts'; import type { DeviceInfo } from '../../utils/device.ts'; +import { requireLocationCoordinates } from '../../utils/location-coordinates.ts'; import { parsePermissionAction, parsePermissionTarget, - type PermissionSettingOptions, + type SettingOptions, } from '../permission-utils.ts'; import { parseAppearanceAction } from '../appearance.ts'; +import { parseSettingState } from '../setting-state.ts'; import { runAndroidAdb } from './adb.ts'; const ANDROID_ANIMATION_SCALE_SETTINGS = [ @@ -19,7 +21,7 @@ export async function setAndroidSetting( setting: string, state: string, appPackage?: string, - options?: PermissionSettingOptions, + options?: SettingOptions, ): Promise | void> { const normalized = setting.toLowerCase(); switch (normalized) { @@ -46,6 +48,21 @@ export async function setAndroidSetting( return; } case 'location': { + if (state.toLowerCase() === 'set') { + if (device.kind !== 'emulator') { + throw new AppError( + 'UNSUPPORTED_OPERATION', + 'Android precise location coordinates are supported only on emulators.', + { + deviceId: device.id, + hint: 'Use an Android emulator for adb emu geo fix, or configure location through device/provider tooling.', + }, + ); + } + const { latitude, longitude } = requireLocationCoordinates(options); + await runAndroidAdb(device, ['emu', 'geo', 'fix', String(longitude), String(latitude)]); + return { latitude, longitude }; + } const enabled = parseSettingState(state); const mode = enabled ? '3' : '0'; await runAndroidAdb(device, ['shell', 'settings', 'put', 'secure', 'location_mode', mode]); @@ -185,13 +202,6 @@ function isAndroidFingerprintCapabilityMissing(stdout: string, stderr: string): ); } -function parseSettingState(state: string): boolean { - const normalized = state.toLowerCase(); - if (normalized === 'on' || normalized === 'true' || normalized === '1') return true; - if (normalized === 'off' || normalized === 'false' || normalized === '0') return false; - throw new AppError('INVALID_ARGS', `Invalid setting state: ${state}`); -} - async function resolveAndroidAppearanceTarget( device: DeviceInfo, state: string, diff --git a/src/platforms/ios/__tests__/index.test.ts b/src/platforms/ios/__tests__/index.test.ts index 959415c0..f41977da 100644 --- a/src/platforms/ios/__tests__/index.test.ts +++ b/src/platforms/ios/__tests__/index.test.ts @@ -2343,6 +2343,22 @@ test('setIosSetting rejects unsupported macOS wifi setting with explicit subset ); }); +test('setIosSetting location set sends simulator latitude and longitude', async () => { + await withMockedXcrun( + 'agent-device-ios-location-set-test-', + '#!/bin/sh\nprintf "%s\\n" "$@" >> "$AGENT_DEVICE_TEST_ARGS_FILE"\nexit 0\n', + async ({ argsLogPath }) => { + mockEnsureBootedSimulator.mockResolvedValue(undefined); + await setIosSetting(IOS_TEST_SIMULATOR, 'location', 'set', undefined, { + latitude: 37.3349, + longitude: -122.009, + }); + const logged = await fs.readFile(argsLogPath, 'utf8'); + assert.match(logged, /simctl\nlocation\nsim-1\nset\n37\.3349,-122\.009/); + }, + ); +}); + test('setIosSetting appearance toggle flips current simulator appearance', async () => { await withMockedXcrun( 'agent-device-ios-appearance-toggle-test-', diff --git a/src/platforms/ios/apps.ts b/src/platforms/ios/apps.ts index 11d7b8ab..d91c618c 100644 --- a/src/platforms/ios/apps.ts +++ b/src/platforms/ios/apps.ts @@ -4,6 +4,7 @@ import path from 'node:path'; import type { DeviceInfo } from '../../utils/device.ts'; import { AppError } from '../../utils/errors.ts'; import { runCmd } from '../../utils/exec.ts'; +import { requireLocationCoordinates } from '../../utils/location-coordinates.ts'; import { resolveIosSimulatorDeviceSetPath } from '../../utils/device-isolation.ts'; import { Deadline, retryWithPolicy } from '../../utils/retry.ts'; import { isDeepLinkTarget, resolveIosDeviceDeepLinkBundleId } from '../../core/open-target.ts'; @@ -11,9 +12,10 @@ import { getUnsupportedMacOsSettingMessage } from '../../core/settings-contract. import { parsePermissionAction, parsePermissionTarget, - type PermissionSettingOptions, + type SettingOptions, } from '../permission-utils.ts'; import { parseAppearanceAction } from '../appearance.ts'; +import { parseSettingState } from '../setting-state.ts'; import { createAppResolutionCache, type AppResolutionCacheScope } from '../app-resolution-cache.ts'; import { IOS_APP_LAUNCH_TIMEOUT_MS, IOS_DEVICECTL_TIMEOUT_MS } from './config.ts'; @@ -377,7 +379,7 @@ export async function setIosSetting( setting: string, state: string, appBundleId?: string, - options?: PermissionSettingOptions, + options?: SettingOptions, ): Promise | void> { if (device.platform === 'macos') { const normalizedSetting = setting.toLowerCase(); @@ -432,6 +434,11 @@ export async function setIosSetting( return; } case 'location': { + if (state.toLowerCase() === 'set') { + const { latitude, longitude } = requireLocationCoordinates(options); + await runSimctl(device, ['location', device.id, 'set', `${latitude},${longitude}`]); + return { latitude, longitude }; + } const enabled = parseSettingState(state); if (!appBundleId) { throw new AppError('INVALID_ARGS', 'location setting requires an active app in session'); @@ -527,13 +534,6 @@ export async function listSimulatorApps(device: DeviceInfo): Promise { test('settings usage documents canonical faceid states', () => { const help = usageForCommand('settings'); if (help === null) throw new Error('Expected command help text'); + assert.match(help, /location set /); assert.match(help, /light\|dark\|toggle/); assert.match(help, /match\|nonmatch\|enroll\|unenroll/); assert.match( diff --git a/src/utils/location-coordinates.ts b/src/utils/location-coordinates.ts new file mode 100644 index 00000000..d1ac0d0d --- /dev/null +++ b/src/utils/location-coordinates.ts @@ -0,0 +1,36 @@ +import { AppError } from './errors.ts'; + +export type LocationCoordinateLabel = 'latitude' | 'longitude'; + +export type LocationCoordinates = { + latitude: number; + longitude: number; +}; + +type LocationCoordinateInput = Partial | undefined; + +export function readLocationCoordinate( + value: string | undefined, + label: LocationCoordinateLabel, +): number { + if (value === undefined || value.trim() === '') { + throw new AppError('INVALID_ARGS', `settings location set requires ${label}`); + } + return validateLocationCoordinate(Number(value), label); +} + +export function requireLocationCoordinates(options: LocationCoordinateInput): LocationCoordinates { + return { + latitude: validateLocationCoordinate(options?.latitude, 'latitude'), + longitude: validateLocationCoordinate(options?.longitude, 'longitude'), + }; +} + +function validateLocationCoordinate(value: unknown, label: LocationCoordinateLabel): number { + const min = label === 'latitude' ? -90 : -180; + const max = label === 'latitude' ? 90 : 180; + if (typeof value !== 'number' || !Number.isFinite(value) || value < min || value > max) { + throw new AppError('INVALID_ARGS', `${label} must be a number from ${min} to ${max}`); + } + return value; +} diff --git a/website/docs/docs/commands.md b/website/docs/docs/commands.md index cec15991..fae7330f 100644 --- a/website/docs/docs/commands.md +++ b/website/docs/docs/commands.md @@ -455,6 +455,7 @@ agent-device settings airplane on agent-device settings airplane off agent-device settings location on agent-device settings location off +agent-device settings location set 37.3349 -122.009 agent-device settings animations off agent-device settings animations on agent-device settings appearance light @@ -483,6 +484,7 @@ agent-device settings permission reset screen-recording --platform macos - `settings wifi|airplane|location|animations` remain intentionally unsupported on macOS. - Android `settings animations off|on` toggles the global `window_animation_scale`, `transition_animation_scale`, and `animator_duration_scale` values. Use it as an opt-in stabilizer for automation runs with heavy system or app animations, then restore with `settings animations on` when needed. - `settings appearance` maps to macOS appearance, iOS simulator appearance, and Android night mode. +- `settings location set ` sets precise coordinates on iOS simulators and Android emulators. - Face ID and Touch ID controls are iOS simulator-only. - Fingerprint simulation is supported on Android targets where `cmd fingerprint` or `adb emu finger` is available. On physical Android devices, only `cmd fingerprint` is attempted. diff --git a/website/docs/docs/quick-start.md b/website/docs/docs/quick-start.md index 42509103..9c9e2e9e 100644 --- a/website/docs/docs/quick-start.md +++ b/website/docs/docs/quick-start.md @@ -132,6 +132,7 @@ agent-device settings wifi on agent-device settings airplane on agent-device settings appearance toggle agent-device settings location off +agent-device settings location set 37.3349 -122.009 agent-device settings permission grant camera ```