execbro 0.0.1-reserve → 1.10.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +32 -0
- package/README.md +496 -0
- package/build/__tests__/helpers/fake-cdp-server.d.ts +56 -0
- package/build/__tests__/helpers/fake-cdp-server.d.ts.map +1 -0
- package/build/__tests__/helpers/fake-cdp-server.js +120 -0
- package/build/__tests__/helpers/fake-cdp-server.js.map +1 -0
- package/build/__tests__/helpers/tap-test-helpers.d.ts +36 -0
- package/build/__tests__/helpers/tap-test-helpers.d.ts.map +1 -0
- package/build/__tests__/helpers/tap-test-helpers.js +130 -0
- package/build/__tests__/helpers/tap-test-helpers.js.map +1 -0
- package/build/__tests__/integration/auto-reconnect.test.d.ts +2 -0
- package/build/__tests__/integration/auto-reconnect.test.d.ts.map +1 -0
- package/build/__tests__/integration/auto-reconnect.test.js +118 -0
- package/build/__tests__/integration/auto-reconnect.test.js.map +1 -0
- package/build/__tests__/integration/connection-health.test.d.ts +2 -0
- package/build/__tests__/integration/connection-health.test.d.ts.map +1 -0
- package/build/__tests__/integration/connection-health.test.js +157 -0
- package/build/__tests__/integration/connection-health.test.js.map +1 -0
- package/build/__tests__/integration/execute-in-app.test.d.ts +2 -0
- package/build/__tests__/integration/execute-in-app.test.d.ts.map +1 -0
- package/build/__tests__/integration/execute-in-app.test.js +124 -0
- package/build/__tests__/integration/execute-in-app.test.js.map +1 -0
- package/build/__tests__/integration/per-call-timeout.test.d.ts +2 -0
- package/build/__tests__/integration/per-call-timeout.test.d.ts.map +1 -0
- package/build/__tests__/integration/per-call-timeout.test.js +103 -0
- package/build/__tests__/integration/per-call-timeout.test.js.map +1 -0
- package/build/__tests__/integration/tap-strategies.test.d.ts +2 -0
- package/build/__tests__/integration/tap-strategies.test.d.ts.map +1 -0
- package/build/__tests__/integration/tap-strategies.test.js +330 -0
- package/build/__tests__/integration/tap-strategies.test.js.map +1 -0
- package/build/__tests__/integration/tools.test.d.ts +2 -0
- package/build/__tests__/integration/tools.test.d.ts.map +1 -0
- package/build/__tests__/integration/tools.test.js +227 -0
- package/build/__tests__/integration/tools.test.js.map +1 -0
- package/build/__tests__/setup.d.ts +2 -0
- package/build/__tests__/setup.d.ts.map +1 -0
- package/build/__tests__/setup.js +15 -0
- package/build/__tests__/setup.js.map +1 -0
- package/build/__tests__/unit/androidEmulatorAvds.test.d.ts +2 -0
- package/build/__tests__/unit/androidEmulatorAvds.test.d.ts.map +1 -0
- package/build/__tests__/unit/androidEmulatorAvds.test.js +98 -0
- package/build/__tests__/unit/androidEmulatorAvds.test.js.map +1 -0
- package/build/__tests__/unit/buildToken.test.d.ts +2 -0
- package/build/__tests__/unit/buildToken.test.d.ts.map +1 -0
- package/build/__tests__/unit/buildToken.test.js +22 -0
- package/build/__tests__/unit/buildToken.test.js.map +1 -0
- package/build/__tests__/unit/bundle.test.d.ts +2 -0
- package/build/__tests__/unit/bundle.test.d.ts.map +1 -0
- package/build/__tests__/unit/bundle.test.js +53 -0
- package/build/__tests__/unit/bundle.test.js.map +1 -0
- package/build/__tests__/unit/burst.test.d.ts +2 -0
- package/build/__tests__/unit/burst.test.d.ts.map +1 -0
- package/build/__tests__/unit/burst.test.js +54 -0
- package/build/__tests__/unit/burst.test.js.map +1 -0
- package/build/__tests__/unit/connection-health.test.d.ts +2 -0
- package/build/__tests__/unit/connection-health.test.d.ts.map +1 -0
- package/build/__tests__/unit/connection-health.test.js +38 -0
- package/build/__tests__/unit/connection-health.test.js.map +1 -0
- package/build/__tests__/unit/debugGlobals.test.d.ts +2 -0
- package/build/__tests__/unit/debugGlobals.test.d.ts.map +1 -0
- package/build/__tests__/unit/debugGlobals.test.js +14 -0
- package/build/__tests__/unit/debugGlobals.test.js.map +1 -0
- package/build/__tests__/unit/deviceDiscovery.test.d.ts +2 -0
- package/build/__tests__/unit/deviceDiscovery.test.d.ts.map +1 -0
- package/build/__tests__/unit/deviceDiscovery.test.js +119 -0
- package/build/__tests__/unit/deviceDiscovery.test.js.map +1 -0
- package/build/__tests__/unit/deviceResolver.test.d.ts +2 -0
- package/build/__tests__/unit/deviceResolver.test.d.ts.map +1 -0
- package/build/__tests__/unit/deviceResolver.test.js +261 -0
- package/build/__tests__/unit/deviceResolver.test.js.map +1 -0
- package/build/__tests__/unit/escapeNonAscii.test.d.ts +2 -0
- package/build/__tests__/unit/escapeNonAscii.test.d.ts.map +1 -0
- package/build/__tests__/unit/escapeNonAscii.test.js +76 -0
- package/build/__tests__/unit/escapeNonAscii.test.js.map +1 -0
- package/build/__tests__/unit/exec.test.d.ts +2 -0
- package/build/__tests__/unit/exec.test.d.ts.map +1 -0
- package/build/__tests__/unit/exec.test.js +54 -0
- package/build/__tests__/unit/exec.test.js.map +1 -0
- package/build/__tests__/unit/executor.test.d.ts +2 -0
- package/build/__tests__/unit/executor.test.d.ts.map +1 -0
- package/build/__tests__/unit/executor.test.js +220 -0
- package/build/__tests__/unit/executor.test.js.map +1 -0
- package/build/__tests__/unit/failureArtifact.test.d.ts +2 -0
- package/build/__tests__/unit/failureArtifact.test.d.ts.map +1 -0
- package/build/__tests__/unit/failureArtifact.test.js +207 -0
- package/build/__tests__/unit/failureArtifact.test.js.map +1 -0
- package/build/__tests__/unit/fastRefreshRecorder.test.d.ts +2 -0
- package/build/__tests__/unit/fastRefreshRecorder.test.d.ts.map +1 -0
- package/build/__tests__/unit/fastRefreshRecorder.test.js +68 -0
- package/build/__tests__/unit/fastRefreshRecorder.test.js.map +1 -0
- package/build/__tests__/unit/fastRefreshTools.test.d.ts +2 -0
- package/build/__tests__/unit/fastRefreshTools.test.d.ts.map +1 -0
- package/build/__tests__/unit/fastRefreshTools.test.js +112 -0
- package/build/__tests__/unit/fastRefreshTools.test.js.map +1 -0
- package/build/__tests__/unit/fiberMatch.test.d.ts +2 -0
- package/build/__tests__/unit/fiberMatch.test.d.ts.map +1 -0
- package/build/__tests__/unit/fiberMatch.test.js +114 -0
- package/build/__tests__/unit/fiberMatch.test.js.map +1 -0
- package/build/__tests__/unit/fingerprint.test.d.ts +2 -0
- package/build/__tests__/unit/fingerprint.test.d.ts.map +1 -0
- package/build/__tests__/unit/fingerprint.test.js +99 -0
- package/build/__tests__/unit/fingerprint.test.js.map +1 -0
- package/build/__tests__/unit/focusedInput.test.d.ts +2 -0
- package/build/__tests__/unit/focusedInput.test.d.ts.map +1 -0
- package/build/__tests__/unit/focusedInput.test.js +58 -0
- package/build/__tests__/unit/focusedInput.test.js.map +1 -0
- package/build/__tests__/unit/focusedInputTools.test.d.ts +2 -0
- package/build/__tests__/unit/focusedInputTools.test.d.ts.map +1 -0
- package/build/__tests__/unit/focusedInputTools.test.js +79 -0
- package/build/__tests__/unit/focusedInputTools.test.js.map +1 -0
- package/build/__tests__/unit/iconSemantics.test.d.ts +2 -0
- package/build/__tests__/unit/iconSemantics.test.d.ts.map +1 -0
- package/build/__tests__/unit/iconSemantics.test.js +80 -0
- package/build/__tests__/unit/iconSemantics.test.js.map +1 -0
- package/build/__tests__/unit/imageBuffer.test.d.ts +2 -0
- package/build/__tests__/unit/imageBuffer.test.d.ts.map +1 -0
- package/build/__tests__/unit/imageBuffer.test.js +128 -0
- package/build/__tests__/unit/imageBuffer.test.js.map +1 -0
- package/build/__tests__/unit/logs.test.d.ts +2 -0
- package/build/__tests__/unit/logs.test.d.ts.map +1 -0
- package/build/__tests__/unit/logs.test.js +90 -0
- package/build/__tests__/unit/logs.test.js.map +1 -0
- package/build/__tests__/unit/measureComponent.test.d.ts +2 -0
- package/build/__tests__/unit/measureComponent.test.d.ts.map +1 -0
- package/build/__tests__/unit/measureComponent.test.js +66 -0
- package/build/__tests__/unit/measureComponent.test.js.map +1 -0
- package/build/__tests__/unit/measureComponentTools.test.d.ts +2 -0
- package/build/__tests__/unit/measureComponentTools.test.d.ts.map +1 -0
- package/build/__tests__/unit/measureComponentTools.test.js +94 -0
- package/build/__tests__/unit/measureComponentTools.test.js.map +1 -0
- package/build/__tests__/unit/metro.test.d.ts +2 -0
- package/build/__tests__/unit/metro.test.d.ts.map +1 -0
- package/build/__tests__/unit/metro.test.js +61 -0
- package/build/__tests__/unit/metro.test.js.map +1 -0
- package/build/__tests__/unit/network.test.d.ts +2 -0
- package/build/__tests__/unit/network.test.d.ts.map +1 -0
- package/build/__tests__/unit/network.test.js +102 -0
- package/build/__tests__/unit/network.test.js.map +1 -0
- package/build/__tests__/unit/networkInterceptor.test.d.ts +2 -0
- package/build/__tests__/unit/networkInterceptor.test.d.ts.map +1 -0
- package/build/__tests__/unit/networkInterceptor.test.js +104 -0
- package/build/__tests__/unit/networkInterceptor.test.js.map +1 -0
- package/build/__tests__/unit/probe.test.d.ts +2 -0
- package/build/__tests__/unit/probe.test.d.ts.map +1 -0
- package/build/__tests__/unit/probe.test.js +62 -0
- package/build/__tests__/unit/probe.test.js.map +1 -0
- package/build/__tests__/unit/rnGlobalsBootstrap.test.d.ts +2 -0
- package/build/__tests__/unit/rnGlobalsBootstrap.test.d.ts.map +1 -0
- package/build/__tests__/unit/rnGlobalsBootstrap.test.js +29 -0
- package/build/__tests__/unit/rnGlobalsBootstrap.test.js.map +1 -0
- package/build/__tests__/unit/screenState.test.d.ts +2 -0
- package/build/__tests__/unit/screenState.test.d.ts.map +1 -0
- package/build/__tests__/unit/screenState.test.js +384 -0
- package/build/__tests__/unit/screenState.test.js.map +1 -0
- package/build/__tests__/unit/screenshot-diff.test.d.ts +2 -0
- package/build/__tests__/unit/screenshot-diff.test.d.ts.map +1 -0
- package/build/__tests__/unit/screenshot-diff.test.js +97 -0
- package/build/__tests__/unit/screenshot-diff.test.js.map +1 -0
- package/build/__tests__/unit/tap-evidence.test.d.ts +2 -0
- package/build/__tests__/unit/tap-evidence.test.d.ts.map +1 -0
- package/build/__tests__/unit/tap-evidence.test.js +89 -0
- package/build/__tests__/unit/tap-evidence.test.js.map +1 -0
- package/build/__tests__/unit/tap.test.d.ts +2 -0
- package/build/__tests__/unit/tap.test.d.ts.map +1 -0
- package/build/__tests__/unit/tap.test.js +767 -0
- package/build/__tests__/unit/tap.test.js.map +1 -0
- package/build/__tests__/unit/timeoutClamp.test.d.ts +2 -0
- package/build/__tests__/unit/timeoutClamp.test.d.ts.map +1 -0
- package/build/__tests__/unit/timeoutClamp.test.js +17 -0
- package/build/__tests__/unit/timeoutClamp.test.js.map +1 -0
- package/build/__tests__/unit/toolDescriptions.test.d.ts +2 -0
- package/build/__tests__/unit/toolDescriptions.test.d.ts.map +1 -0
- package/build/__tests__/unit/toolDescriptions.test.js +145 -0
- package/build/__tests__/unit/toolDescriptions.test.js.map +1 -0
- package/build/__tests__/unit/transportClassify.test.d.ts +2 -0
- package/build/__tests__/unit/transportClassify.test.d.ts.map +1 -0
- package/build/__tests__/unit/transportClassify.test.js +60 -0
- package/build/__tests__/unit/transportClassify.test.js.map +1 -0
- package/build/__tests__/unit/verifyAction.test.d.ts +2 -0
- package/build/__tests__/unit/verifyAction.test.d.ts.map +1 -0
- package/build/__tests__/unit/verifyAction.test.js +26 -0
- package/build/__tests__/unit/verifyAction.test.js.map +1 -0
- package/build/core/android.d.ts +299 -0
- package/build/core/android.d.ts.map +1 -0
- package/build/core/android.js +1582 -0
- package/build/core/android.js.map +1 -0
- package/build/core/appDetection.d.ts +20 -0
- package/build/core/appDetection.d.ts.map +1 -0
- package/build/core/appDetection.js +167 -0
- package/build/core/appDetection.js.map +1 -0
- package/build/core/bundle.d.ts +49 -0
- package/build/core/bundle.d.ts.map +1 -0
- package/build/core/bundle.js +356 -0
- package/build/core/bundle.js.map +1 -0
- package/build/core/componentSearch.d.ts +41 -0
- package/build/core/componentSearch.d.ts.map +1 -0
- package/build/core/componentSearch.js +588 -0
- package/build/core/componentSearch.js.map +1 -0
- package/build/core/componentTree.d.ts +13 -0
- package/build/core/componentTree.d.ts.map +1 -0
- package/build/core/componentTree.js +275 -0
- package/build/core/componentTree.js.map +1 -0
- package/build/core/config.d.ts +9 -0
- package/build/core/config.d.ts.map +1 -0
- package/build/core/config.js +28 -0
- package/build/core/config.js.map +1 -0
- package/build/core/connection.d.ts +102 -0
- package/build/core/connection.d.ts.map +1 -0
- package/build/core/connection.js +1710 -0
- package/build/core/connection.js.map +1 -0
- package/build/core/connectionState.d.ts +122 -0
- package/build/core/connectionState.d.ts.map +1 -0
- package/build/core/connectionState.js +313 -0
- package/build/core/connectionState.js.map +1 -0
- package/build/core/debugGlobals.d.ts +6 -0
- package/build/core/debugGlobals.d.ts.map +1 -0
- package/build/core/debugGlobals.js +370 -0
- package/build/core/debugGlobals.js.map +1 -0
- package/build/core/deviceDiscovery.d.ts +52 -0
- package/build/core/deviceDiscovery.d.ts.map +1 -0
- package/build/core/deviceDiscovery.js +74 -0
- package/build/core/deviceDiscovery.js.map +1 -0
- package/build/core/deviceResolver.d.ts +44 -0
- package/build/core/deviceResolver.d.ts.map +1 -0
- package/build/core/deviceResolver.js +225 -0
- package/build/core/deviceResolver.js.map +1 -0
- package/build/core/errorScreenParser.d.ts +30 -0
- package/build/core/errorScreenParser.d.ts.map +1 -0
- package/build/core/errorScreenParser.js +198 -0
- package/build/core/errorScreenParser.js.map +1 -0
- package/build/core/errors.d.ts +14 -0
- package/build/core/errors.d.ts.map +1 -0
- package/build/core/errors.js +17 -0
- package/build/core/errors.js.map +1 -0
- package/build/core/escapeNonAscii.d.ts +18 -0
- package/build/core/escapeNonAscii.d.ts.map +1 -0
- package/build/core/escapeNonAscii.js +352 -0
- package/build/core/escapeNonAscii.js.map +1 -0
- package/build/core/exec.d.ts +22 -0
- package/build/core/exec.d.ts.map +1 -0
- package/build/core/exec.js +54 -0
- package/build/core/exec.js.map +1 -0
- package/build/core/executor.d.ts +9 -0
- package/build/core/executor.d.ts.map +1 -0
- package/build/core/executor.js +12 -0
- package/build/core/executor.js.map +1 -0
- package/build/core/failureArtifact.d.ts +120 -0
- package/build/core/failureArtifact.d.ts.map +1 -0
- package/build/core/failureArtifact.js +113 -0
- package/build/core/failureArtifact.js.map +1 -0
- package/build/core/fastRefreshRecorder.d.ts +23 -0
- package/build/core/fastRefreshRecorder.d.ts.map +1 -0
- package/build/core/fastRefreshRecorder.js +83 -0
- package/build/core/fastRefreshRecorder.js.map +1 -0
- package/build/core/fastRefreshTools.d.ts +19 -0
- package/build/core/fastRefreshTools.d.ts.map +1 -0
- package/build/core/fastRefreshTools.js +71 -0
- package/build/core/fastRefreshTools.js.map +1 -0
- package/build/core/feedback.d.ts +18 -0
- package/build/core/feedback.d.ts.map +1 -0
- package/build/core/feedback.js +73 -0
- package/build/core/feedback.js.map +1 -0
- package/build/core/fiberMatch.d.ts +25 -0
- package/build/core/fiberMatch.d.ts.map +1 -0
- package/build/core/fiberMatch.js +35 -0
- package/build/core/fiberMatch.js.map +1 -0
- package/build/core/fingerprint.d.ts +4 -0
- package/build/core/fingerprint.d.ts.map +1 -0
- package/build/core/fingerprint.js +47 -0
- package/build/core/fingerprint.js.map +1 -0
- package/build/core/focusedInput.d.ts +27 -0
- package/build/core/focusedInput.d.ts.map +1 -0
- package/build/core/focusedInput.js +110 -0
- package/build/core/focusedInput.js.map +1 -0
- package/build/core/focusedInputTools.d.ts +21 -0
- package/build/core/focusedInputTools.d.ts.map +1 -0
- package/build/core/focusedInputTools.js +51 -0
- package/build/core/focusedInputTools.js.map +1 -0
- package/build/core/format.d.ts +8 -0
- package/build/core/format.d.ts.map +1 -0
- package/build/core/format.js +34 -0
- package/build/core/format.js.map +1 -0
- package/build/core/guides.d.ts +21 -0
- package/build/core/guides.d.ts.map +1 -0
- package/build/core/guides.js +397 -0
- package/build/core/guides.js.map +1 -0
- package/build/core/iconSemantics.d.ts +18 -0
- package/build/core/iconSemantics.d.ts.map +1 -0
- package/build/core/iconSemantics.js +114 -0
- package/build/core/iconSemantics.js.map +1 -0
- package/build/core/imageBuffer.d.ts +37 -0
- package/build/core/imageBuffer.d.ts.map +1 -0
- package/build/core/imageBuffer.js +58 -0
- package/build/core/imageBuffer.js.map +1 -0
- package/build/core/index.d.ts +37 -0
- package/build/core/index.d.ts.map +1 -0
- package/build/core/index.js +66 -0
- package/build/core/index.js.map +1 -0
- package/build/core/inspector.d.ts +55 -0
- package/build/core/inspector.d.ts.map +1 -0
- package/build/core/inspector.js +603 -0
- package/build/core/inspector.js.map +1 -0
- package/build/core/ios.d.ts +263 -0
- package/build/core/ios.d.ts.map +1 -0
- package/build/core/ios.js +1705 -0
- package/build/core/ios.js.map +1 -0
- package/build/core/jsExecute.d.ts +62 -0
- package/build/core/jsExecute.d.ts.map +1 -0
- package/build/core/jsExecute.js +696 -0
- package/build/core/jsExecute.js.map +1 -0
- package/build/core/license.d.ts +48 -0
- package/build/core/license.d.ts.map +1 -0
- package/build/core/license.js +267 -0
- package/build/core/license.js.map +1 -0
- package/build/core/logbox.d.ts +58 -0
- package/build/core/logbox.d.ts.map +1 -0
- package/build/core/logbox.js +330 -0
- package/build/core/logbox.js.map +1 -0
- package/build/core/logs.d.ts +44 -0
- package/build/core/logs.d.ts.map +1 -0
- package/build/core/logs.js +149 -0
- package/build/core/logs.js.map +1 -0
- package/build/core/measureComponent.d.ts +19 -0
- package/build/core/measureComponent.d.ts.map +1 -0
- package/build/core/measureComponent.js +94 -0
- package/build/core/measureComponent.js.map +1 -0
- package/build/core/measureComponentTools.d.ts +6 -0
- package/build/core/measureComponentTools.d.ts.map +1 -0
- package/build/core/measureComponentTools.js +43 -0
- package/build/core/measureComponentTools.js.map +1 -0
- package/build/core/metro.d.ts +31 -0
- package/build/core/metro.d.ts.map +1 -0
- package/build/core/metro.js +124 -0
- package/build/core/metro.js.map +1 -0
- package/build/core/nativeOnlyHints.d.ts +14 -0
- package/build/core/nativeOnlyHints.d.ts.map +1 -0
- package/build/core/nativeOnlyHints.js +58 -0
- package/build/core/nativeOnlyHints.js.map +1 -0
- package/build/core/network.d.ts +43 -0
- package/build/core/network.d.ts.map +1 -0
- package/build/core/network.js +217 -0
- package/build/core/network.js.map +1 -0
- package/build/core/networkInterceptor.d.ts +30 -0
- package/build/core/networkInterceptor.d.ts.map +1 -0
- package/build/core/networkInterceptor.js +211 -0
- package/build/core/networkInterceptor.js.map +1 -0
- package/build/core/ocr.d.ts +87 -0
- package/build/core/ocr.d.ts.map +1 -0
- package/build/core/ocr.js +335 -0
- package/build/core/ocr.js.map +1 -0
- package/build/core/paths.d.ts +2 -0
- package/build/core/paths.d.ts.map +1 -0
- package/build/core/paths.js +28 -0
- package/build/core/paths.js.map +1 -0
- package/build/core/posthog.d.ts +5 -0
- package/build/core/posthog.d.ts.map +1 -0
- package/build/core/posthog.js +52 -0
- package/build/core/posthog.js.map +1 -0
- package/build/core/pressables.d.ts +46 -0
- package/build/core/pressables.d.ts.map +1 -0
- package/build/core/pressables.js +1719 -0
- package/build/core/pressables.js.map +1 -0
- package/build/core/probe.d.ts +12 -0
- package/build/core/probe.d.ts.map +1 -0
- package/build/core/probe.js +56 -0
- package/build/core/probe.js.map +1 -0
- package/build/core/redux.d.ts +22 -0
- package/build/core/redux.d.ts.map +1 -0
- package/build/core/redux.js +116 -0
- package/build/core/redux.js.map +1 -0
- package/build/core/register.d.ts +8 -0
- package/build/core/register.d.ts.map +1 -0
- package/build/core/register.js +202 -0
- package/build/core/register.js.map +1 -0
- package/build/core/rnGlobalsBootstrap.d.ts +16 -0
- package/build/core/rnGlobalsBootstrap.d.ts.map +1 -0
- package/build/core/rnGlobalsBootstrap.js +116 -0
- package/build/core/rnGlobalsBootstrap.js.map +1 -0
- package/build/core/screenLayout.d.ts +53 -0
- package/build/core/screenLayout.d.ts.map +1 -0
- package/build/core/screenLayout.js +878 -0
- package/build/core/screenLayout.js.map +1 -0
- package/build/core/screenState.d.ts +166 -0
- package/build/core/screenState.d.ts.map +1 -0
- package/build/core/screenState.js +1352 -0
- package/build/core/screenState.js.map +1 -0
- package/build/core/sdkBridge.d.ts +67 -0
- package/build/core/sdkBridge.d.ts.map +1 -0
- package/build/core/sdkBridge.js +148 -0
- package/build/core/sdkBridge.js.map +1 -0
- package/build/core/state.d.ts +37 -0
- package/build/core/state.d.ts.map +1 -0
- package/build/core/state.js +124 -0
- package/build/core/state.js.map +1 -0
- package/build/core/telemetry.d.ts +50 -0
- package/build/core/telemetry.d.ts.map +1 -0
- package/build/core/telemetry.js +653 -0
- package/build/core/telemetry.js.map +1 -0
- package/build/core/toolHelpers.d.ts +24 -0
- package/build/core/toolHelpers.d.ts.map +1 -0
- package/build/core/toolHelpers.js +118 -0
- package/build/core/toolHelpers.js.map +1 -0
- package/build/core/types.d.ts +162 -0
- package/build/core/types.d.ts.map +1 -0
- package/build/core/types.js +2 -0
- package/build/core/types.js.map +1 -0
- package/build/index.d.ts +4 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +132 -0
- package/build/index.js.map +1 -0
- package/build/pro/screenshot-diff.d.ts +10 -0
- package/build/pro/screenshot-diff.d.ts.map +1 -0
- package/build/pro/screenshot-diff.js +38 -0
- package/build/pro/screenshot-diff.js.map +1 -0
- package/build/pro/tap.d.ts +291 -0
- package/build/pro/tap.d.ts.map +1 -0
- package/build/pro/tap.js +1839 -0
- package/build/pro/tap.js.map +1 -0
- package/build/pro/verifyAction.d.ts +50 -0
- package/build/pro/verifyAction.d.ts.map +1 -0
- package/build/pro/verifyAction.js +285 -0
- package/build/pro/verifyAction.js.map +1 -0
- package/build/tools/_deviceArg.d.ts +45 -0
- package/build/tools/_deviceArg.d.ts.map +1 -0
- package/build/tools/_deviceArg.js +58 -0
- package/build/tools/_deviceArg.js.map +1 -0
- package/build/tools/accountTools.d.ts +46 -0
- package/build/tools/accountTools.d.ts.map +1 -0
- package/build/tools/accountTools.js +223 -0
- package/build/tools/accountTools.js.map +1 -0
- package/build/tools/bundleTools.d.ts +3 -0
- package/build/tools/bundleTools.d.ts.map +1 -0
- package/build/tools/bundleTools.js +375 -0
- package/build/tools/bundleTools.js.map +1 -0
- package/build/tools/componentTools.d.ts +3 -0
- package/build/tools/componentTools.d.ts.map +1 -0
- package/build/tools/componentTools.js +746 -0
- package/build/tools/componentTools.js.map +1 -0
- package/build/tools/connectionTools.d.ts +3 -0
- package/build/tools/connectionTools.d.ts.map +1 -0
- package/build/tools/connectionTools.js +625 -0
- package/build/tools/connectionTools.js.map +1 -0
- package/build/tools/deviceTools.d.ts +3 -0
- package/build/tools/deviceTools.d.ts.map +1 -0
- package/build/tools/deviceTools.js +423 -0
- package/build/tools/deviceTools.js.map +1 -0
- package/build/tools/executionTools.d.ts +3 -0
- package/build/tools/executionTools.d.ts.map +1 -0
- package/build/tools/executionTools.js +243 -0
- package/build/tools/executionTools.js.map +1 -0
- package/build/tools/interactionTools.d.ts +3 -0
- package/build/tools/interactionTools.d.ts.map +1 -0
- package/build/tools/interactionTools.js +539 -0
- package/build/tools/interactionTools.js.map +1 -0
- package/build/tools/logTools.d.ts +3 -0
- package/build/tools/logTools.d.ts.map +1 -0
- package/build/tools/logTools.js +371 -0
- package/build/tools/logTools.js.map +1 -0
- package/build/tools/metaTools.d.ts +7 -0
- package/build/tools/metaTools.d.ts.map +1 -0
- package/build/tools/metaTools.js +186 -0
- package/build/tools/metaTools.js.map +1 -0
- package/build/tools/networkTools.d.ts +3 -0
- package/build/tools/networkTools.d.ts.map +1 -0
- package/build/tools/networkTools.js +478 -0
- package/build/tools/networkTools.js.map +1 -0
- package/build/tools/reduxTools.d.ts +3 -0
- package/build/tools/reduxTools.d.ts.map +1 -0
- package/build/tools/reduxTools.js +83 -0
- package/build/tools/reduxTools.js.map +1 -0
- package/build/tools/screenshotTools.d.ts +3 -0
- package/build/tools/screenshotTools.d.ts.map +1 -0
- package/build/tools/screenshotTools.js +703 -0
- package/build/tools/screenshotTools.js.map +1 -0
- package/package.json +63 -2
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { registerToolWithTelemetry } from "../core/register.js";
|
|
3
|
+
import { androidLongPress, androidSwipe, androidInputText, androidKeyEvent, ANDROID_KEY_EVENTS, iosButton, iosInputText, iosSwipe, IOS_BUTTON_TYPES, getDevicePixelRatio, connectedApps, } from "../core/index.js";
|
|
4
|
+
import { tap, convertScreenshotToTapCoords } from "../pro/tap.js";
|
|
5
|
+
import { captureScreenshot, verifyAndCapture, burstCaptureAndVerify, } from "../pro/verifyAction.js";
|
|
6
|
+
import { clearFocusedInput, dismissKeyboard, inputTextWithReplace } from "../core/focusedInputTools.js";
|
|
7
|
+
import { primaryInteractionBanner, platformFallbackBanner, platformUniqueBanner } from "../core/toolHelpers.js";
|
|
8
|
+
import { resolveDeviceTarget, formatResolverError } from "../core/deviceResolver.js";
|
|
9
|
+
import { resolveAndroidDeviceId, resolveIosUdid } from "./_deviceArg.js";
|
|
10
|
+
export function registerInteractionTools(server) {
|
|
11
|
+
// Tool: Unified tap — tries fiber, accessibility, OCR, coordinate strategies
|
|
12
|
+
registerToolWithTelemetry(server, "tap", {
|
|
13
|
+
description: "Tap a UI element. Automatically tries multiple strategies: fiber tree (React), accessibility tree (native), and OCR (visual)." +
|
|
14
|
+
primaryInteractionBanner() + "\n" +
|
|
15
|
+
"PURPOSE: Single unified tap entry point — resolves text/testID/component/coordinates into a real touch event on the correct device.\n" +
|
|
16
|
+
"WHEN TO USE: Any time you need to press a button, focus an input, open a menu, or verify a handler fires. Prefer testID, then text, then component, then (x,y) from a screenshot's pressables list.\n" +
|
|
17
|
+
"WORKFLOW: ios_screenshot or android_screenshot -> tap(testID=\"...\") | tap(text=\"...\") | tap(x, y) -> screenshot again to verify. Use burst=true when meaningful=false but visual feedback looks transient.\n" +
|
|
18
|
+
"LIMITATIONS: iOS needs AXe (brew install cameroncooke/axe/axe) or IDB for accessibility/coordinate taps. Non-ASCII text skips fiber (Hermes); prefer testID. Pass `device` to target a specific simulator/emulator when multiple are available — call list_devices for the inventory.\n" +
|
|
19
|
+
"GOOD: tap({ testID: \"login-btn\" }); tap({ text: \"Submit\" }); tap({ x: 300, y: 600 }); tap({ x: 300, y: 600, native: true, device: \"emulator-5554\" })\n" +
|
|
20
|
+
"BAD: tap({ text: \"\" }) or tap({ x: 0, y: 0 }) — missing a target. tap({ text: \"Submit\" }) without first screenshotting an ambiguous screen.\n" +
|
|
21
|
+
"SEE ALSO: call get_usage_guide(topic=\"interact\") for the full device-interaction playbook.",
|
|
22
|
+
inputSchema: {
|
|
23
|
+
text: z
|
|
24
|
+
.string()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Visible text to match (case-insensitive substring). ASCII only for fiber strategy; OCR handles non-ASCII."),
|
|
27
|
+
testID: z
|
|
28
|
+
.string()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe("Exact match on the element's testID prop."),
|
|
31
|
+
component: z
|
|
32
|
+
.string()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe("Component name match (case-insensitive substring, e.g. 'Button', 'MenuItem')."),
|
|
35
|
+
index: z.coerce
|
|
36
|
+
.number()
|
|
37
|
+
.optional()
|
|
38
|
+
.describe("Zero-based index when multiple elements match (default: 0)."),
|
|
39
|
+
x: z.coerce
|
|
40
|
+
.number()
|
|
41
|
+
.optional()
|
|
42
|
+
.describe("X coordinate in pixels (from screenshot). Must provide both x and y."),
|
|
43
|
+
y: z.coerce
|
|
44
|
+
.number()
|
|
45
|
+
.optional()
|
|
46
|
+
.describe("Y coordinate in pixels (from screenshot). Must provide both x and y."),
|
|
47
|
+
strategy: z
|
|
48
|
+
.enum(["auto", "fiber", "accessibility", "ocr", "coordinate"])
|
|
49
|
+
.optional()
|
|
50
|
+
.default("auto")
|
|
51
|
+
.describe('"auto" (default) tries fiber -> accessibility -> OCR. Set explicitly to skip strategies you know will fail.'),
|
|
52
|
+
maxTraversalDepth: z.coerce
|
|
53
|
+
.number()
|
|
54
|
+
.optional()
|
|
55
|
+
.describe("Max parent levels to traverse when searching by component name (default: 15). " +
|
|
56
|
+
"Increase if your component is deeply wrapped (e.g. inside multiple HOCs/animation wrappers)."),
|
|
57
|
+
native: z
|
|
58
|
+
.boolean()
|
|
59
|
+
.optional()
|
|
60
|
+
.default(false)
|
|
61
|
+
.describe("When true, tap coordinates directly via ADB/simctl without requiring a React Native connection. " +
|
|
62
|
+
"Useful for interacting with native UI, system dialogs, or non-RN apps. Requires x/y coordinates."),
|
|
63
|
+
device: z
|
|
64
|
+
.string()
|
|
65
|
+
.optional()
|
|
66
|
+
.describe("Target device. Accepts (a) an iOS simulator UDID, " +
|
|
67
|
+
"(b) an Android adb serial like 'emulator-5554', " +
|
|
68
|
+
"(c) the iOS simulator or Android emulator/device name (substring match), or " +
|
|
69
|
+
"(d) a connected RN app's deviceName (substring match against get_apps output). " +
|
|
70
|
+
"Omit when exactly one device is available. Call list_devices to enumerate."),
|
|
71
|
+
screenshot: z
|
|
72
|
+
.boolean()
|
|
73
|
+
.optional()
|
|
74
|
+
.default(true)
|
|
75
|
+
.describe("Return post-tap image bytes in the response. Default true. Set to false to drop the PNG bytes — verification still runs (set verify=false to skip that too). Combine with verify=true to get the meaningful/changeRate signal without paying the ~1MB-per-tap bandwidth cost."),
|
|
76
|
+
verify: z
|
|
77
|
+
.boolean()
|
|
78
|
+
.optional()
|
|
79
|
+
.describe("Run before/after screenshot diff to detect if the tap had a meaningful visual effect. " +
|
|
80
|
+
"Default: true for coordinate/accessibility/ocr strategies, false for fiber. " +
|
|
81
|
+
"Independent of `screenshot` — verify can run with screenshot=false (the diff is computed internally; image bytes are dropped). " +
|
|
82
|
+
"When skipped, the response contains `verification: { skipped: true, skippedReason }` so callers can tell apart \"ran clean\" from \"never ran\"."),
|
|
83
|
+
burst: z
|
|
84
|
+
.boolean()
|
|
85
|
+
.optional()
|
|
86
|
+
.default(false)
|
|
87
|
+
.describe("Enable burst screenshot capture for enhanced verification. " +
|
|
88
|
+
"Captures 4 rapid screenshots (~150ms intervals) after the tap to detect transient visual feedback " +
|
|
89
|
+
"(press animations, highlights, ripples) that may settle before a standard after-screenshot. " +
|
|
90
|
+
"Results are stored in the image buffer (use get_images to inspect individual frames). " +
|
|
91
|
+
"Default: false."),
|
|
92
|
+
},
|
|
93
|
+
}, async (args) => {
|
|
94
|
+
const result = await tap({
|
|
95
|
+
text: args.text,
|
|
96
|
+
testID: args.testID,
|
|
97
|
+
component: args.component,
|
|
98
|
+
index: args.index,
|
|
99
|
+
x: args.x,
|
|
100
|
+
y: args.y,
|
|
101
|
+
strategy: args.strategy,
|
|
102
|
+
maxTraversalDepth: args.maxTraversalDepth,
|
|
103
|
+
native: args.native,
|
|
104
|
+
device: args.device,
|
|
105
|
+
screenshot: args.screenshot,
|
|
106
|
+
verify: args.verify,
|
|
107
|
+
burst: args.burst,
|
|
108
|
+
});
|
|
109
|
+
const { screenshot: screenshotData, ...resultWithoutScreenshot } = result;
|
|
110
|
+
const text = JSON.stringify(resultWithoutScreenshot, null, 2);
|
|
111
|
+
// Pack predicate + strategy mode + attempted strategies into errorContext for telemetry.
|
|
112
|
+
// Always include the predicate so unmeaningful outcomes (no isError, no _errorMessage) still
|
|
113
|
+
// carry triage context — otherwise blob8 ends up blank and the dashboard shows empty rows.
|
|
114
|
+
// e.g. "p={\"text\":\"Save\"}|s=ocr|fiber:no_pressable|ocr:no_match"
|
|
115
|
+
const stratPrefix = args.strategy && args.strategy !== "auto" ? `s=${args.strategy}|` : "";
|
|
116
|
+
let predicatePrefix = "";
|
|
117
|
+
try {
|
|
118
|
+
if (result.query !== undefined) {
|
|
119
|
+
predicatePrefix = `p=${JSON.stringify(result.query)}|`;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// query may contain non-serializable values — drop the prefix rather than fail.
|
|
124
|
+
}
|
|
125
|
+
const attemptedPart = result.attempted?.length
|
|
126
|
+
? result.attempted.map(a => `${a.strategy}:${a.reason.slice(0, 40)}`).join("|")
|
|
127
|
+
: "";
|
|
128
|
+
const ctxParts = `${predicatePrefix}${stratPrefix}${attemptedPart}`;
|
|
129
|
+
const errorContext = ctxParts ? ctxParts.replace(/\|$/, "") : undefined;
|
|
130
|
+
const content = [
|
|
131
|
+
{ type: "text", text },
|
|
132
|
+
];
|
|
133
|
+
if (screenshotData) {
|
|
134
|
+
content.push({
|
|
135
|
+
type: "image",
|
|
136
|
+
data: screenshotData.image,
|
|
137
|
+
mimeType: "image/jpeg",
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
content,
|
|
142
|
+
isError: !result.success && !result.ambiguous,
|
|
143
|
+
_errorMessage: !result.success && !result.ambiguous
|
|
144
|
+
? `${JSON.stringify(result.query)}|${result.error || ""}`
|
|
145
|
+
: undefined,
|
|
146
|
+
_errorContext: errorContext,
|
|
147
|
+
_meaningful: result.verification?.meaningful,
|
|
148
|
+
_changeRate: result.verification?.changeRate,
|
|
149
|
+
_tapStrategy: result.method,
|
|
150
|
+
_iosDriver: result.platform === "ios" ? (process.env.IOS_DRIVER?.toLowerCase() || "axe") : undefined,
|
|
151
|
+
_artifactKey: result.artifactKey,
|
|
152
|
+
_ocrClosestMatch: result.ocrClosestMatch,
|
|
153
|
+
_fiberPressableCount: result.fiberPressableCount,
|
|
154
|
+
_accessibilityMatchCount: result.accessibilityMatchCount,
|
|
155
|
+
_appRoute: result.appRoute,
|
|
156
|
+
};
|
|
157
|
+
});
|
|
158
|
+
// Android UI Input Tools (Phase 2)
|
|
159
|
+
// ============================================================================
|
|
160
|
+
// Tool: Android long press
|
|
161
|
+
registerToolWithTelemetry(server, "android_long_press", {
|
|
162
|
+
description: "Long press at specific coordinates on an Android device/emulator screen" +
|
|
163
|
+
platformFallbackBanner("`tap` for short taps; keep android_long_press for long-press gestures specifically") +
|
|
164
|
+
"\nPURPOSE: Emit a sustained touch at raw pixel coordinates to trigger long-press handlers (context menus, drag starts, multi-select)." +
|
|
165
|
+
"\nWHEN TO USE: Only when a long-press gesture is required — regular taps should go through `tap`." +
|
|
166
|
+
"\nSEE ALSO: call get_usage_guide(topic=\"interact\") for the full UI-interaction playbook.",
|
|
167
|
+
inputSchema: {
|
|
168
|
+
x: z.coerce.number().describe("X coordinate in pixels"),
|
|
169
|
+
y: z.coerce.number().describe("Y coordinate in pixels"),
|
|
170
|
+
durationMs: z.number().optional().default(1000).describe("Press duration in milliseconds (default: 1000)"),
|
|
171
|
+
deviceId: z
|
|
172
|
+
.string()
|
|
173
|
+
.optional()
|
|
174
|
+
.describe("Optional Android target. Accepts an adb serial (e.g. 'emulator-5554', 'RFCX20CLX3F'), an emulator name, or a substring of the connected RN device name (e.g. 'sdk_gphone'). Uses first available device if not specified.")
|
|
175
|
+
}
|
|
176
|
+
}, async ({ x, y, durationMs, deviceId }) => {
|
|
177
|
+
const r = await resolveAndroidDeviceId(deviceId);
|
|
178
|
+
if (!r.ok)
|
|
179
|
+
return r.response;
|
|
180
|
+
const result = await androidLongPress(x, y, durationMs, r.serial);
|
|
181
|
+
return {
|
|
182
|
+
content: [
|
|
183
|
+
{
|
|
184
|
+
type: "text",
|
|
185
|
+
text: result.success ? result.result : `Error: ${result.error}`
|
|
186
|
+
}
|
|
187
|
+
],
|
|
188
|
+
isError: !result.success
|
|
189
|
+
};
|
|
190
|
+
});
|
|
191
|
+
// Tool: Cross-platform swipe — auto-routes to iOS or Android backend
|
|
192
|
+
registerToolWithTelemetry(server, "swipe", {
|
|
193
|
+
description: "Swipe gesture that auto-routes to the correct platform (iOS or Android), with pixel-diff verification." +
|
|
194
|
+
primaryInteractionBanner() + "\n" +
|
|
195
|
+
"PURPOSE: Single unified swipe entry point — accepts screenshot pixel coordinates, dispatches to the correct native driver, and returns a `verification` block indicating whether the swipe produced a visual change.\n" +
|
|
196
|
+
"WHEN TO USE: Scrolling lists, paging carousels, pull-to-refresh, dismissing sheets, opening drawers — anything that needs a gesture rather than a tap. Especially useful in virtualized lists (FlatList/SectionList) where off-screen items aren't mounted in the fiber tree.\n" +
|
|
197
|
+
"VERIFICATION: verify=true (default) returns `verification.meaningful` — false means the scroll did nothing (end-of-list, non-scrollable surface, or missed coordinates). burst=true catches transient feedback like overscroll bounce.\n" +
|
|
198
|
+
"WORKFLOW: ios_screenshot or android_screenshot -> swipe({ startX, startY, endX, endY }) -> read response.verification.meaningful to confirm it worked.\n" +
|
|
199
|
+
"LIMITATIONS: iOS needs AXe (brew install cameroncooke/axe/axe) or IDB. Pass `device` to target a specific simulator/emulator when multiple are available — call list_devices for the inventory.\n" +
|
|
200
|
+
"SEE ALSO: call get_usage_guide(topic=\"interact\") for the full UI-interaction playbook.",
|
|
201
|
+
inputSchema: {
|
|
202
|
+
startX: z.coerce.number().describe("Starting X coordinate in screenshot pixels"),
|
|
203
|
+
startY: z.coerce.number().describe("Starting Y coordinate in screenshot pixels"),
|
|
204
|
+
endX: z.coerce.number().describe("Ending X coordinate in screenshot pixels"),
|
|
205
|
+
endY: z.coerce.number().describe("Ending Y coordinate in screenshot pixels"),
|
|
206
|
+
durationMs: z.coerce
|
|
207
|
+
.number()
|
|
208
|
+
.optional()
|
|
209
|
+
.describe("Swipe duration in milliseconds (default: 300 on Android; iOS uses driver default if omitted)"),
|
|
210
|
+
delta: z.coerce
|
|
211
|
+
.number()
|
|
212
|
+
.optional()
|
|
213
|
+
.describe("iOS only — touch step size between events (driver-dependent default). Ignored on Android."),
|
|
214
|
+
device: z
|
|
215
|
+
.string()
|
|
216
|
+
.optional()
|
|
217
|
+
.describe("Target device. Accepts (a) an iOS simulator UDID, " +
|
|
218
|
+
"(b) an Android adb serial like 'emulator-5554', " +
|
|
219
|
+
"(c) the iOS simulator or Android emulator/device name (substring match), or " +
|
|
220
|
+
"(d) a connected RN app's deviceName (substring match against get_apps output). " +
|
|
221
|
+
"Omit when exactly one device is available. Call list_devices to enumerate."),
|
|
222
|
+
verify: z
|
|
223
|
+
.boolean()
|
|
224
|
+
.optional()
|
|
225
|
+
.default(true)
|
|
226
|
+
.describe("Compare before/after screenshots to detect whether the swipe produced a visual change. " +
|
|
227
|
+
"Set false to skip. When skipped, the response contains `verification: { skipped: true, skippedReason }` " +
|
|
228
|
+
"so callers can tell apart \"ran clean\" from \"never ran\"."),
|
|
229
|
+
screenshot: z
|
|
230
|
+
.boolean()
|
|
231
|
+
.optional()
|
|
232
|
+
.default(true)
|
|
233
|
+
.describe("Return the post-swipe image bytes in the response. Default true. Set to false to drop the PNG bytes — " +
|
|
234
|
+
"verification still runs (set verify=false to skip that too)."),
|
|
235
|
+
burst: z
|
|
236
|
+
.boolean()
|
|
237
|
+
.optional()
|
|
238
|
+
.default(false)
|
|
239
|
+
.describe("Capture rapid sequential frames after the swipe to detect transient feedback (overscroll bounce, " +
|
|
240
|
+
"fling-then-snap-back) even when the final state is unchanged. Frames are stored in the image buffer; " +
|
|
241
|
+
"use get_images(groupId=verification.burstGroupId) to retrieve them."),
|
|
242
|
+
}
|
|
243
|
+
}, async ({ startX, startY, endX, endY, durationMs, delta, device, verify, screenshot, burst }) => {
|
|
244
|
+
const resolved = await resolveDeviceTarget(device);
|
|
245
|
+
if (!resolved.ok) {
|
|
246
|
+
return {
|
|
247
|
+
content: [{ type: "text", text: `Error: ${formatResolverError(resolved.error)}` }],
|
|
248
|
+
isError: true
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
const resolvedPlatform = resolved.target.platform;
|
|
252
|
+
const resolvedUdid = resolved.target.iosUdid;
|
|
253
|
+
const shouldVerify = verify !== false;
|
|
254
|
+
const shouldScreenshot = screenshot !== false;
|
|
255
|
+
const shouldBurst = burst === true;
|
|
256
|
+
// Capture before-screenshot only if we'll need it (verify or burst).
|
|
257
|
+
const wantBefore = shouldVerify || shouldBurst;
|
|
258
|
+
const beforeCapture = wantBefore
|
|
259
|
+
? await captureScreenshot(resolvedPlatform, resolvedUdid)
|
|
260
|
+
: null;
|
|
261
|
+
const beforeBuffer = beforeCapture?.buffer ?? null;
|
|
262
|
+
const beforeScaleFactor = beforeCapture?.scaleFactor;
|
|
263
|
+
let driverResult;
|
|
264
|
+
if (resolvedPlatform === "ios") {
|
|
265
|
+
const dpr = await getDevicePixelRatio(resolvedUdid);
|
|
266
|
+
const firstApp = connectedApps.values().next().value;
|
|
267
|
+
const scaleFactor = firstApp?.lastScreenshot?.scaleFactor ?? 1;
|
|
268
|
+
const start = convertScreenshotToTapCoords(startX, startY, "ios", dpr, scaleFactor);
|
|
269
|
+
const end = convertScreenshotToTapCoords(endX, endY, "ios", dpr, scaleFactor);
|
|
270
|
+
const duration = durationMs !== undefined ? durationMs / 1000 : undefined;
|
|
271
|
+
driverResult = await iosSwipe(start.x, start.y, end.x, end.y, { duration, delta, udid: resolvedUdid });
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
const firstApp = connectedApps.values().next().value;
|
|
275
|
+
const scaleFactor = firstApp?.lastScreenshot?.scaleFactor ?? 1;
|
|
276
|
+
const start = convertScreenshotToTapCoords(startX, startY, "android", 1, scaleFactor);
|
|
277
|
+
const end = convertScreenshotToTapCoords(endX, endY, "android", 1, scaleFactor);
|
|
278
|
+
driverResult = await androidSwipe(start.x, start.y, end.x, end.y, durationMs ?? 300, resolved.target.androidSerial);
|
|
279
|
+
}
|
|
280
|
+
if (!driverResult.success) {
|
|
281
|
+
return {
|
|
282
|
+
content: [{ type: "text", text: `Error: ${driverResult.error}` }],
|
|
283
|
+
isError: true
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
// Driver succeeded — run verification.
|
|
287
|
+
const verifyResult = shouldBurst
|
|
288
|
+
? await burstCaptureAndVerify({
|
|
289
|
+
platform: resolvedPlatform,
|
|
290
|
+
beforeBuffer,
|
|
291
|
+
udid: resolvedUdid,
|
|
292
|
+
beforeScaleFactor,
|
|
293
|
+
source: "swipe-burst",
|
|
294
|
+
})
|
|
295
|
+
: await verifyAndCapture({
|
|
296
|
+
platform: resolvedPlatform,
|
|
297
|
+
shouldVerify,
|
|
298
|
+
shouldScreenshot,
|
|
299
|
+
beforeBuffer,
|
|
300
|
+
udid: resolvedUdid,
|
|
301
|
+
beforeScaleFactor,
|
|
302
|
+
source: "swipe-verify",
|
|
303
|
+
});
|
|
304
|
+
const { screenshot: screenshotData, verification } = verifyResult;
|
|
305
|
+
const warning = verification && !verification.skipped && verification.meaningful === false
|
|
306
|
+
? "Swipe executed but no visual change detected — list may be at end-of-scroll, content is non-scrollable, or the gesture missed the scroll surface. Inspect the screenshot and retry with adjusted coordinates if needed."
|
|
307
|
+
: undefined;
|
|
308
|
+
const responseBody = {
|
|
309
|
+
success: true,
|
|
310
|
+
platform: resolvedPlatform,
|
|
311
|
+
from: { x: startX, y: startY },
|
|
312
|
+
to: { x: endX, y: endY },
|
|
313
|
+
driverMessage: driverResult.result,
|
|
314
|
+
...(verification && { verification }),
|
|
315
|
+
...(warning && { warning }),
|
|
316
|
+
};
|
|
317
|
+
const content = [
|
|
318
|
+
{ type: "text", text: JSON.stringify(responseBody, null, 2) },
|
|
319
|
+
];
|
|
320
|
+
if (shouldScreenshot && screenshotData) {
|
|
321
|
+
content.push({
|
|
322
|
+
type: "image",
|
|
323
|
+
data: screenshotData.image,
|
|
324
|
+
mimeType: "image/jpeg",
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
content,
|
|
329
|
+
isError: false,
|
|
330
|
+
_meaningful: verification && !verification.skipped ? verification.meaningful : undefined,
|
|
331
|
+
_changeRate: verification && !verification.skipped ? verification.changeRate : undefined,
|
|
332
|
+
};
|
|
333
|
+
});
|
|
334
|
+
// Tool: Android input text
|
|
335
|
+
registerToolWithTelemetry(server, "android_input_text", {
|
|
336
|
+
description: "Type text on an Android device/emulator." +
|
|
337
|
+
platformFallbackBanner("`tap(text=...)` — it auto-focuses TextInput via the fiber tree") +
|
|
338
|
+
" The text will be input at the current focus point (tap an input field first)." +
|
|
339
|
+
"\nPURPOSE: Send keystrokes to whichever input currently has focus on Android — the tool does NOT focus a field itself." +
|
|
340
|
+
"\nWHEN TO USE: Only after an input is already focused, or when `tap(text=...)` on the input didn't take focus for some reason." +
|
|
341
|
+
"\nPREREQUISITE: A TextInput must already have focus. Tap the field first (e.g. tap({ testID: 'search' })) — `android_input_text` does NOT focus a field itself; replace:true also requires React focus." +
|
|
342
|
+
"\nREPLACE MODE: pass replace:true to clear the focused field first (via React onChangeText so controlled state stays consistent), then type the new value. Use for pre-filled fields where appending would corrupt the value." +
|
|
343
|
+
"\nSEE ALSO: call get_usage_guide(topic=\"interact\") for the full UI-interaction playbook.",
|
|
344
|
+
inputSchema: {
|
|
345
|
+
text: z.string().describe("Text to type"),
|
|
346
|
+
replace: z
|
|
347
|
+
.boolean()
|
|
348
|
+
.optional()
|
|
349
|
+
.describe("If true, clear the focused TextInput via React onChangeText before typing. Use to set a pre-filled field to an exact value without concatenation. Requires Bridgeless/Fabric."),
|
|
350
|
+
device: z
|
|
351
|
+
.string()
|
|
352
|
+
.optional()
|
|
353
|
+
.describe("Optional RN device name (substring match) — needed by replace:true when multiple RN apps are connected, to disambiguate which device's focused input to clear. Single-device sessions can omit."),
|
|
354
|
+
deviceId: z
|
|
355
|
+
.string()
|
|
356
|
+
.optional()
|
|
357
|
+
.describe("Optional Android target. Accepts an adb serial (e.g. 'emulator-5554', 'RFCX20CLX3F'), an emulator name, or a substring of the connected RN device name (e.g. 'sdk_gphone'). Uses first available device if not specified.")
|
|
358
|
+
}
|
|
359
|
+
}, async ({ text, replace, device, deviceId }) => {
|
|
360
|
+
const r = await resolveAndroidDeviceId(deviceId);
|
|
361
|
+
if (!r.ok)
|
|
362
|
+
return r.response;
|
|
363
|
+
const result = await inputTextWithReplace(text, replace === true, (t) => androidInputText(t, r.serial), () => clearFocusedInput(device));
|
|
364
|
+
return {
|
|
365
|
+
content: [
|
|
366
|
+
{
|
|
367
|
+
type: "text",
|
|
368
|
+
text: result.success ? result.result : `Error: ${result.error}`
|
|
369
|
+
}
|
|
370
|
+
],
|
|
371
|
+
isError: !result.success
|
|
372
|
+
};
|
|
373
|
+
});
|
|
374
|
+
// Tool: Android key event
|
|
375
|
+
registerToolWithTelemetry(server, "android_key_event", {
|
|
376
|
+
description: "Send a key event to an Android device/emulator." +
|
|
377
|
+
platformUniqueBanner("sending Android key events (BACK, HOME, MENU, etc.)") +
|
|
378
|
+
` Common keys: ${Object.keys(ANDROID_KEY_EVENTS).join(", ")}` +
|
|
379
|
+
"\nPURPOSE: Dispatch Android system keys (BACK, HOME, MENU, ENTER, DEL, etc.) that aren't reachable via on-screen tap." +
|
|
380
|
+
"\nWHEN TO USE: Navigate back from a screen, submit a form with ENTER, dismiss the keyboard, or press hardware-style keys during a flow." +
|
|
381
|
+
"\nSEE ALSO: call get_usage_guide(topic=\"interact\") for the full UI-interaction playbook.",
|
|
382
|
+
inputSchema: {
|
|
383
|
+
key: z.string().describe(`Key name (${Object.keys(ANDROID_KEY_EVENTS).join(", ")}) or numeric keycode`),
|
|
384
|
+
deviceId: z
|
|
385
|
+
.string()
|
|
386
|
+
.optional()
|
|
387
|
+
.describe("Optional Android target. Accepts an adb serial (e.g. 'emulator-5554', 'RFCX20CLX3F'), an emulator name, or a substring of the connected RN device name (e.g. 'sdk_gphone'). Uses first available device if not specified.")
|
|
388
|
+
}
|
|
389
|
+
}, async ({ key, deviceId }) => {
|
|
390
|
+
// Try to parse as number first, otherwise treat as key name
|
|
391
|
+
const keyCode = /^\d+$/.test(key) ? parseInt(key, 10) : key.toUpperCase();
|
|
392
|
+
const r = await resolveAndroidDeviceId(deviceId);
|
|
393
|
+
if (!r.ok)
|
|
394
|
+
return r.response;
|
|
395
|
+
const result = await androidKeyEvent(keyCode, r.serial);
|
|
396
|
+
return {
|
|
397
|
+
content: [
|
|
398
|
+
{
|
|
399
|
+
type: "text",
|
|
400
|
+
text: result.success ? result.result : `Error: ${result.error}`
|
|
401
|
+
}
|
|
402
|
+
],
|
|
403
|
+
isError: !result.success
|
|
404
|
+
};
|
|
405
|
+
});
|
|
406
|
+
// ============================================================================
|
|
407
|
+
// Android Accessibility Tools (UI Hierarchy)
|
|
408
|
+
// ============================================================================
|
|
409
|
+
// ============================================================================
|
|
410
|
+
// iOS Simulator Tools
|
|
411
|
+
// ============================================================================
|
|
412
|
+
// Tool: iOS install app
|
|
413
|
+
// ============================================================================
|
|
414
|
+
// iOS UI Interaction Tools (require an iOS UI driver)
|
|
415
|
+
// Default: AXe — brew install cameroncooke/axe/axe
|
|
416
|
+
// Alternative: IDB — brew install idb-companion (set IOS_DRIVER=idb)
|
|
417
|
+
// ============================================================================
|
|
418
|
+
// Tool: iOS button
|
|
419
|
+
server.registerTool("ios_button", {
|
|
420
|
+
description: "Press a hardware button on an iOS simulator." +
|
|
421
|
+
platformUniqueBanner("pressing iOS hardware buttons (HOME, LOCK, SIRI, APPLE_PAY)") +
|
|
422
|
+
" Requires an iOS UI driver: AXe (recommended: brew install cameroncooke/axe/axe) or IDB (brew install idb-companion)." +
|
|
423
|
+
"\nPURPOSE: Trigger iOS hardware buttons (HOME, LOCK, SIDE_BUTTON, SIRI, APPLE_PAY) that aren't reachable via on-screen tap." +
|
|
424
|
+
"\nWHEN TO USE: Send the app to background (HOME), lock the simulator (LOCK), or exercise Siri/Apple Pay flows." +
|
|
425
|
+
"\nSEE ALSO: call get_usage_guide(topic=\"interact\") for the full UI-interaction playbook.",
|
|
426
|
+
inputSchema: {
|
|
427
|
+
button: z
|
|
428
|
+
.enum(IOS_BUTTON_TYPES)
|
|
429
|
+
.describe("Hardware button to press: HOME, LOCK, SIDE_BUTTON, SIRI, or APPLE_PAY"),
|
|
430
|
+
duration: z.coerce.number().optional().describe("Optional button press duration in seconds"),
|
|
431
|
+
udid: z.string().optional().describe("Optional iOS target. Accepts a simulator UDID, the simulator name (e.g. 'iPhone 17 Pro'), or a substring of the connected RN device name. Uses booted simulator if not specified.")
|
|
432
|
+
}
|
|
433
|
+
}, async ({ button, duration, udid }) => {
|
|
434
|
+
const r = await resolveIosUdid(udid);
|
|
435
|
+
if (!r.ok)
|
|
436
|
+
return r.response;
|
|
437
|
+
const result = await iosButton(button, { duration, udid: r.udid });
|
|
438
|
+
return {
|
|
439
|
+
content: [
|
|
440
|
+
{
|
|
441
|
+
type: "text",
|
|
442
|
+
text: result.success ? result.result : `Error: ${result.error}`
|
|
443
|
+
}
|
|
444
|
+
],
|
|
445
|
+
isError: !result.success
|
|
446
|
+
};
|
|
447
|
+
});
|
|
448
|
+
// Tool: Clear focused text input
|
|
449
|
+
registerToolWithTelemetry(server, "clear_focused_input", {
|
|
450
|
+
description: "Clear the contents of the currently focused TextInput, updating React state correctly so controlled components (Formik, react-hook-form, useState) stay consistent." +
|
|
451
|
+
"\nPURPOSE: Reset whatever TextInput has focus to empty, with the React state owner notified via onChangeText. Use BEFORE typing a replacement value into a pre-filled field." +
|
|
452
|
+
"\nWHEN TO USE: After tap(testID=...) focuses an input that already has text. Pair with ios_input_text/android_input_text (or use their replace:true flag for one-shot)." +
|
|
453
|
+
"\nPREREQUISITE: A TextInput must already have React focus. Tap the field first (e.g. tap({ testID: 'search' })) — this tool does NOT focus a field itself." +
|
|
454
|
+
"\nLIMITATIONS: Requires Bridgeless/Fabric (RN new architecture). Returns 'no focused TextInput' if nothing is focused — does not silently no-op." +
|
|
455
|
+
"\nSEE ALSO: dismiss_keyboard, ios_input_text({replace:true}), android_input_text({replace:true}). call get_usage_guide(topic=\"interact\") for the full UI-interaction playbook.",
|
|
456
|
+
inputSchema: {
|
|
457
|
+
device: z
|
|
458
|
+
.string()
|
|
459
|
+
.optional()
|
|
460
|
+
.describe("Optional device name (substring match). Uses default device if not specified.")
|
|
461
|
+
}
|
|
462
|
+
}, async ({ device }) => {
|
|
463
|
+
const result = await clearFocusedInput(device);
|
|
464
|
+
return {
|
|
465
|
+
content: [
|
|
466
|
+
{
|
|
467
|
+
type: "text",
|
|
468
|
+
text: result.success ? `Cleared focused input (via ${result.via}).` : `Error: ${result.error}`
|
|
469
|
+
}
|
|
470
|
+
],
|
|
471
|
+
isError: !result.success
|
|
472
|
+
};
|
|
473
|
+
});
|
|
474
|
+
// Tool: Dismiss keyboard
|
|
475
|
+
registerToolWithTelemetry(server, "dismiss_keyboard", {
|
|
476
|
+
description: "Blur the currently focused TextInput, dismissing the on-screen keyboard." +
|
|
477
|
+
"\nPURPOSE: Close the keyboard when it's blocking content beneath the input, or move focus off an input before a tap that would otherwise be intercepted." +
|
|
478
|
+
"\nWHEN TO USE: After typing into a field and before tapping a button that is hidden by the keyboard. Or to verify a 'tap outside dismisses' UX is wired up." +
|
|
479
|
+
"\nPREREQUISITE: A TextInput must already have React focus. Tap the field first (e.g. tap({ testID: 'search' }))." +
|
|
480
|
+
"\nLIMITATIONS: Requires Bridgeless/Fabric (RN new architecture). Returns 'no focused TextInput' if nothing is focused.",
|
|
481
|
+
inputSchema: {
|
|
482
|
+
device: z
|
|
483
|
+
.string()
|
|
484
|
+
.optional()
|
|
485
|
+
.describe("Optional device name (substring match). Uses default device if not specified.")
|
|
486
|
+
}
|
|
487
|
+
}, async ({ device }) => {
|
|
488
|
+
const result = await dismissKeyboard(device);
|
|
489
|
+
return {
|
|
490
|
+
content: [
|
|
491
|
+
{
|
|
492
|
+
type: "text",
|
|
493
|
+
text: result.success
|
|
494
|
+
? `Dismissed keyboard (nativeTag ${result.nativeTag}).`
|
|
495
|
+
: `Error: ${result.error}`
|
|
496
|
+
}
|
|
497
|
+
],
|
|
498
|
+
isError: !result.success
|
|
499
|
+
};
|
|
500
|
+
});
|
|
501
|
+
// Tool: iOS input text
|
|
502
|
+
registerToolWithTelemetry(server, "ios_input_text", {
|
|
503
|
+
description: "Type text on an iOS simulator." +
|
|
504
|
+
platformFallbackBanner("`tap(text=...)` — it auto-focuses TextInput via the fiber tree") +
|
|
505
|
+
" The text is typed into whichever field currently has focus (tap an input first). Mirrors `android_input_text` so cross-platform agents can use `<platform>_input_text` without branching on the iOS driver shell-out." +
|
|
506
|
+
"\nPURPOSE: Send keystrokes to the focused field on an iOS simulator via the active UI driver (AXe — preferred — or IDB)." +
|
|
507
|
+
"\nWHEN TO USE: Only after an input is already focused, or when `tap(testID=...)` on the input didn't take focus for some reason. Use the testID-first flow whenever possible — it's faster and survives UI repositioning." +
|
|
508
|
+
"\nREPLACE MODE: pass replace:true to clear the focused field first (via React onChangeText so controlled state stays consistent), then type the new value. Use for pre-filled fields where appending would corrupt the value." +
|
|
509
|
+
"\nLIMITATIONS: AXe types via the US-keyboard HID — non-ASCII characters (Cyrillic, CJK, Arabic) may not transmit correctly. If the active driver is AXe and the text contains non-ASCII chars, prefer pasting via the simulator pasteboard or setting IOS_DRIVER=idb." +
|
|
510
|
+
"\nSEE ALSO: call get_usage_guide(topic=\"interact\") for the full UI-interaction playbook.",
|
|
511
|
+
inputSchema: {
|
|
512
|
+
text: z.string().describe("Text to type into the currently focused field."),
|
|
513
|
+
replace: z
|
|
514
|
+
.boolean()
|
|
515
|
+
.optional()
|
|
516
|
+
.describe("If true, clear the focused TextInput via React onChangeText before typing. Use to set a pre-filled field to an exact value without concatenation. Requires Bridgeless/Fabric."),
|
|
517
|
+
device: z
|
|
518
|
+
.string()
|
|
519
|
+
.optional()
|
|
520
|
+
.describe("Optional RN device name (substring match) — needed by replace:true when multiple RN apps are connected, to disambiguate which device's focused input to clear. Single-device sessions can omit."),
|
|
521
|
+
udid: z.string().optional().describe("Optional iOS target. Accepts a simulator UDID, the simulator name (e.g. 'iPhone 17 Pro'), or a substring of the connected RN device name. Uses booted simulator if not specified.")
|
|
522
|
+
}
|
|
523
|
+
}, async ({ text, replace, device, udid }) => {
|
|
524
|
+
const r = await resolveIosUdid(udid);
|
|
525
|
+
if (!r.ok)
|
|
526
|
+
return r.response;
|
|
527
|
+
const result = await inputTextWithReplace(text, replace === true, (t) => iosInputText(t, r.udid), () => clearFocusedInput(device));
|
|
528
|
+
return {
|
|
529
|
+
content: [
|
|
530
|
+
{
|
|
531
|
+
type: "text",
|
|
532
|
+
text: result.success ? result.result : `Error: ${result.error}`
|
|
533
|
+
}
|
|
534
|
+
],
|
|
535
|
+
isError: !result.success
|
|
536
|
+
};
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=interactionTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactionTools.js","sourceRoot":"","sources":["../../src/tools/interactionTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logTools.d.ts","sourceRoot":"","sources":["../../src/tools/logTools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8BzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqZxD"}
|