react-native-ai-debugger 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +4 -3
  2. package/build/__tests__/unit/overlayGuard.test.d.ts +2 -0
  3. package/build/__tests__/unit/overlayGuard.test.d.ts.map +1 -0
  4. package/build/__tests__/unit/overlayGuard.test.js +140 -0
  5. package/build/__tests__/unit/overlayGuard.test.js.map +1 -0
  6. package/build/__tests__/unit/screenSpace.test.d.ts +2 -0
  7. package/build/__tests__/unit/screenSpace.test.d.ts.map +1 -0
  8. package/build/__tests__/unit/screenSpace.test.js +91 -0
  9. package/build/__tests__/unit/screenSpace.test.js.map +1 -0
  10. package/build/__tests__/unit/tap.test.js +2 -2
  11. package/build/__tests__/unit/tap.test.js.map +1 -1
  12. package/build/__tests__/unit/visibility.test.js +21 -0
  13. package/build/__tests__/unit/visibility.test.js.map +1 -1
  14. package/build/core/guides.d.ts.map +1 -1
  15. package/build/core/guides.js +18 -4
  16. package/build/core/guides.js.map +1 -1
  17. package/build/core/index.d.ts +1 -1
  18. package/build/core/index.d.ts.map +1 -1
  19. package/build/core/index.js +1 -1
  20. package/build/core/index.js.map +1 -1
  21. package/build/core/injected/visibility.d.ts +14 -1
  22. package/build/core/injected/visibility.d.ts.map +1 -1
  23. package/build/core/injected/visibility.js +28 -4
  24. package/build/core/injected/visibility.js.map +1 -1
  25. package/build/core/injectedFilters.d.ts +10 -2
  26. package/build/core/injectedFilters.d.ts.map +1 -1
  27. package/build/core/injectedFilters.js +10 -2
  28. package/build/core/injectedFilters.js.map +1 -1
  29. package/build/core/inspector.d.ts +6 -0
  30. package/build/core/inspector.d.ts.map +1 -1
  31. package/build/core/inspector.js +227 -40
  32. package/build/core/inspector.js.map +1 -1
  33. package/build/core/ios.d.ts +16 -0
  34. package/build/core/ios.d.ts.map +1 -1
  35. package/build/core/ios.js +48 -4
  36. package/build/core/ios.js.map +1 -1
  37. package/build/core/pressables.d.ts +0 -32
  38. package/build/core/pressables.d.ts.map +1 -1
  39. package/build/core/pressables.js +5 -1061
  40. package/build/core/pressables.js.map +1 -1
  41. package/build/core/screenLayout.d.ts +3 -0
  42. package/build/core/screenLayout.d.ts.map +1 -1
  43. package/build/core/screenLayout.js +55 -1
  44. package/build/core/screenLayout.js.map +1 -1
  45. package/build/core/screenSpace.d.ts +170 -0
  46. package/build/core/screenSpace.d.ts.map +1 -0
  47. package/build/core/screenSpace.js +221 -0
  48. package/build/core/screenSpace.js.map +1 -0
  49. package/build/core/screenSpaceDevice.d.ts +15 -0
  50. package/build/core/screenSpaceDevice.d.ts.map +1 -0
  51. package/build/core/screenSpaceDevice.js +64 -0
  52. package/build/core/screenSpaceDevice.js.map +1 -0
  53. package/build/core/screenState.d.ts +2 -1
  54. package/build/core/screenState.d.ts.map +1 -1
  55. package/build/core/screenState.js +315 -48
  56. package/build/core/screenState.js.map +1 -1
  57. package/build/pro/overlayGuard.d.ts +65 -0
  58. package/build/pro/overlayGuard.d.ts.map +1 -0
  59. package/build/pro/overlayGuard.js +166 -0
  60. package/build/pro/overlayGuard.js.map +1 -0
  61. package/build/pro/tap.d.ts.map +1 -1
  62. package/build/pro/tap.js +104 -25
  63. package/build/pro/tap.js.map +1 -1
  64. package/build/tools/componentTools.d.ts.map +1 -1
  65. package/build/tools/componentTools.js +82 -192
  66. package/build/tools/componentTools.js.map +1 -1
  67. package/build/tools/screenshotTools.d.ts.map +1 -1
  68. package/build/tools/screenshotTools.js +37 -72
  69. package/build/tools/screenshotTools.js.map +1 -1
  70. package/package.json +1 -1
  71. package/tools.json +1 -5
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Pre-dispatch overlay guard for `tap`.
3
+ *
4
+ * The OS always delivers a touch to the topmost view, so a coordinate tap physically
5
+ * cannot reach an element that an overlay is painted over — the touch goes to the
6
+ * overlay. That is correct behaviour and nothing about tap dispatch should change.
7
+ *
8
+ * What must change is that execbro not fire such a tap at all. In the reported case the
9
+ * touch did not vanish harmlessly: it opened a sheet's network-request detail view, so
10
+ * execbro mutated app state the agent never asked to change and was never told about.
11
+ * Declining is strictly better, and the agent's correct next move — dismiss the overlay,
12
+ * then retry — is the same either way.
13
+ *
14
+ * The check runs on the resolved TARGET, not on the strategy, because every strategy
15
+ * (fiber, accessibility, OCR, raw coordinates) funnels into a coordinate tap.
16
+ */
17
+ import type { ScreenState } from "../core/screenState.js";
18
+ export type OverlayVerdict =
19
+ /** Nothing reachable at the target; an overlay is painted over it. Do not dispatch. */
20
+ {
21
+ kind: "blocked";
22
+ element: string;
23
+ overlay: string;
24
+ }
25
+ /**
26
+ * A coordinate that an overlay's own control occupies, while a covered element also
27
+ * sits underneath it. The tap is legitimate — the OS will deliver it to the overlay
28
+ * control, which is a real element — but the caller may well have been aiming at the
29
+ * thing behind. Dispatch, and say which one actually got it.
30
+ */
31
+ | {
32
+ kind: "shadowed";
33
+ hit: string;
34
+ covered: string;
35
+ overlay: string;
36
+ };
37
+ export interface OverlayGuardQuery {
38
+ text?: string;
39
+ testID?: string;
40
+ component?: string;
41
+ x?: number;
42
+ y?: number;
43
+ }
44
+ /**
45
+ * The decision itself, over a screen state whose coordinates are already in the caller's
46
+ * delivered-pixel space. Pure and exported so the refusal rules — the ones that can break
47
+ * every tap in the product if they are wrong — are testable without a device.
48
+ *
49
+ * Returns null for anything short of a confident "blocked". A guard that fires on
50
+ * uncertainty blocks legitimate taps, which is a worse failure than the mis-delivery it
51
+ * is trying to prevent.
52
+ */
53
+ export declare function decideOverlayBlock(ss: ScreenState, query: OverlayGuardQuery): OverlayVerdict | null;
54
+ /**
55
+ * Read the current screen, normalise it into the caller's coordinate space, and apply
56
+ * {@link decideOverlayBlock}. Null on any I/O failure — see that function's contract.
57
+ */
58
+ export declare function checkOverlayBlocking(args: {
59
+ query: OverlayGuardQuery;
60
+ platform: "ios" | "android";
61
+ udid?: string;
62
+ deviceId?: string;
63
+ deviceName?: string;
64
+ }): Promise<OverlayVerdict | null>;
65
+ //# sourceMappingURL=overlayGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlayGuard.d.ts","sourceRoot":"","sources":["../../src/pro/overlayGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAwB,MAAM,wBAAwB,CAAC;AAIhF,MAAM,MAAM,cAAc;AACtB,uFAAuF;AACrF;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACvD;;;;;GAKG;GACD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACd;AAuDD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAC9B,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,iBAAiB,GACzB,cAAc,GAAG,IAAI,CA2DvB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC7C,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAsBjC"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Pre-dispatch overlay guard for `tap`.
3
+ *
4
+ * The OS always delivers a touch to the topmost view, so a coordinate tap physically
5
+ * cannot reach an element that an overlay is painted over — the touch goes to the
6
+ * overlay. That is correct behaviour and nothing about tap dispatch should change.
7
+ *
8
+ * What must change is that execbro not fire such a tap at all. In the reported case the
9
+ * touch did not vanish harmlessly: it opened a sheet's network-request detail view, so
10
+ * execbro mutated app state the agent never asked to change and was never told about.
11
+ * Declining is strictly better, and the agent's correct next move — dismiss the overlay,
12
+ * then retry — is the same either way.
13
+ *
14
+ * The check runs on the resolved TARGET, not on the strategy, because every strategy
15
+ * (fiber, accessibility, OCR, raw coordinates) funnels into a coordinate tap.
16
+ */
17
+ import { getScreenState } from "../core/screenState.js";
18
+ import { screenStateToScreenSpace, screenStateToDeliveredPx } from "../core/screenSpace.js";
19
+ import { resolveScreenSpaceMetrics } from "../core/screenSpaceDevice.js";
20
+ function describePressable(p) {
21
+ const tag = p.component ? `<${p.component} />` : "element";
22
+ const label = p.label ? ` "${p.label}"` : "";
23
+ const tid = p.testID ? ` testID="${p.testID}"` : "";
24
+ return `${tag}${label}${tid}`;
25
+ }
26
+ function describeOverlay(o) {
27
+ // "Unknown" is the internal bucket for a sheet recognised by geometry rather than by
28
+ // component name. Surfacing that word to an agent reads like a failure, when the
29
+ // finding itself is certain — it is the overlay's identity that is unknown, not its
30
+ // presence.
31
+ const kind = o.type === "Unknown" ? "overlay" : o.type;
32
+ return o.title ? `${kind} "${o.title}"` : kind;
33
+ }
34
+ /** Smallest pressable whose box contains the point — the innermost, most specific hit. */
35
+ function hitAt(candidates, x, y) {
36
+ let best = null;
37
+ let bestArea = Infinity;
38
+ for (const p of candidates) {
39
+ const b = p.bounds;
40
+ if (x < b.x || y < b.y || x > b.x + b.width || y > b.y + b.height)
41
+ continue;
42
+ const area = b.width * b.height;
43
+ if (area < bestArea) {
44
+ best = p;
45
+ bestArea = area;
46
+ }
47
+ }
48
+ return best;
49
+ }
50
+ /**
51
+ * Any provided field matching is a match — deliberately not a priority chain.
52
+ *
53
+ * tap itself tries testID, then text, then component, and settles for whichever resolves.
54
+ * A guard that only consulted the highest-priority field would wave through
55
+ * `tap({testID: "nope", text: "State, tab, 2 of 4"})`: the testID matches nothing, so the
56
+ * chain returns "not found" and dispatch proceeds — on the text, straight into the
57
+ * overlay. Which is exactly the bug, reached by a different door.
58
+ */
59
+ function matchesQuery(p, q) {
60
+ if (q.testID && p.testID === q.testID)
61
+ return true;
62
+ if (q.text) {
63
+ const hay = `${p.label ?? ""} ${p.nearbyText ?? ""}`.toLowerCase();
64
+ if (hay.includes(q.text.toLowerCase()))
65
+ return true;
66
+ }
67
+ if (q.component && p.component && p.component.toLowerCase().includes(q.component.toLowerCase())) {
68
+ return true;
69
+ }
70
+ return false;
71
+ }
72
+ /**
73
+ * The decision itself, over a screen state whose coordinates are already in the caller's
74
+ * delivered-pixel space. Pure and exported so the refusal rules — the ones that can break
75
+ * every tap in the product if they are wrong — are testable without a device.
76
+ *
77
+ * Returns null for anything short of a confident "blocked". A guard that fires on
78
+ * uncertainty blocks legitimate taps, which is a worse failure than the mis-delivery it
79
+ * is trying to prevent.
80
+ */
81
+ export function decideOverlayBlock(ss, query) {
82
+ if (!ss.overlays || ss.overlays.length === 0)
83
+ return null;
84
+ const blocked = ss.pressables.filter((p) => p.blockedByOverlay);
85
+ if (blocked.length === 0)
86
+ return null;
87
+ // Everything a touch CAN reach: root pressables that nothing covers, plus the
88
+ // overlays' own controls. The latter are the whole point of an open sheet and are
89
+ // stored separately from ss.pressables — omitting them made the guard refuse taps on
90
+ // the sheet itself, because the only element it found under the point was the covered
91
+ // one behind it.
92
+ const reachable = ss.pressables.filter((p) => !p.blockedByOverlay);
93
+ const overlayOwned = new Set();
94
+ for (const o of ss.overlays) {
95
+ for (const p of o.pressables ?? []) {
96
+ reachable.push(p);
97
+ overlayOwned.add(p);
98
+ }
99
+ }
100
+ // Safety valve. If the model says nothing at all on screen can be tapped, the model is
101
+ // far likelier to be wrong than the screen is to be inert — a `fullCover` overlay
102
+ // expands its block region to the entire viewport, so one misclassification there
103
+ // would refuse every tap in the app with no way back. Declining to judge keeps this
104
+ // guard's worst case "behaves like before" instead of "tap is dead".
105
+ if (reachable.length === 0)
106
+ return null;
107
+ const overlayNames = ss.overlays.map(describeOverlay).join(", ");
108
+ let target = null;
109
+ if (query.x !== undefined && query.y !== undefined) {
110
+ // Whatever reachable element sits under the point is what the OS will deliver to,
111
+ // whether it belongs to the app or to the sheet. The tap is legitimate.
112
+ const hit = hitAt(reachable, query.x, query.y);
113
+ if (hit) {
114
+ // ...but if a covered element is under the same point and the winner is the
115
+ // overlay's, the caller was plausibly aiming at the thing behind. Dispatching
116
+ // silently here is the original bug in miniature: the right element receives
117
+ // the touch, and the caller is never told it was not the one they meant.
118
+ const covered = hitAt(blocked, query.x, query.y);
119
+ if (covered && overlayOwned.has(hit)) {
120
+ return {
121
+ kind: "shadowed",
122
+ hit: describePressable(hit),
123
+ covered: describePressable(covered),
124
+ overlay: overlayNames
125
+ };
126
+ }
127
+ return null;
128
+ }
129
+ target = hitAt(blocked, query.x, query.y);
130
+ }
131
+ else {
132
+ // A named target that also exists reachable somewhere on screen is fine.
133
+ if (reachable.some((p) => matchesQuery(p, query)))
134
+ return null;
135
+ target = blocked.find((p) => matchesQuery(p, query)) ?? null;
136
+ }
137
+ if (!target)
138
+ return null;
139
+ return { kind: "blocked", element: describePressable(target), overlay: overlayNames };
140
+ }
141
+ /**
142
+ * Read the current screen, normalise it into the caller's coordinate space, and apply
143
+ * {@link decideOverlayBlock}. Null on any I/O failure — see that function's contract.
144
+ */
145
+ export async function checkOverlayBlocking(args) {
146
+ try {
147
+ const [res, metrics] = await Promise.all([
148
+ getScreenState({ device: args.deviceName }),
149
+ resolveScreenSpaceMetrics({
150
+ platform: args.platform,
151
+ udid: args.udid,
152
+ deviceId: args.deviceId
153
+ })
154
+ ]);
155
+ if (!res.success || !res.screenState)
156
+ return null;
157
+ // Inset then scale — the same normalisation the layout tools emit with, so these
158
+ // bounds and the caller's coordinates are the one canonical delivered-pixel space.
159
+ return decideOverlayBlock(screenStateToDeliveredPx(screenStateToScreenSpace(res.screenState, metrics), metrics), args.query);
160
+ }
161
+ catch {
162
+ // Best-effort: a guard that throws must never turn a valid tap into an error.
163
+ return null;
164
+ }
165
+ }
166
+ //# sourceMappingURL=overlayGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlayGuard.js","sourceRoot":"","sources":["../../src/pro/overlayGuard.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tap.d.ts","sourceRoot":"","sources":["../../src/pro/tap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tap.d.ts","sourceRoot":"","sources":["../../src/pro/tap.ts"],"names":[],"mappings":"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"}
package/build/pro/tap.js CHANGED
@@ -16,7 +16,7 @@ export function buildVerificationExplanation(v) {
16
16
  const target = action === "swipe" ? "scroll surface" : "element";
17
17
  // Burst path with typed verdict
18
18
  if (v.kind === "settled_elsewhere") {
19
- return `${Action} caused a visible UI change (${pct(v.changeRate)} pixel diff). The screen updated as expected.`;
19
+ return `${Action} caused a visible UI change (${pct(v.changeRate)} pixel diff). Something on screen responded; a pixel diff cannot identify which element, so this is not confirmation that the intended target handled it.`;
20
20
  }
21
21
  if (v.kind === "snap_back") {
22
22
  if (action === "swipe") {
@@ -33,7 +33,7 @@ export function buildVerificationExplanation(v) {
33
33
  }
34
34
  // Legacy non-burst path
35
35
  if (v.meaningful) {
36
- return `${Action} caused a visible UI change (${pct(v.changeRate)} pixel diff). The screen updated as expected.`;
36
+ return `${Action} caused a visible UI change (${pct(v.changeRate)} pixel diff). Something on screen responded; a pixel diff cannot identify which element, so this is not confirmation that the intended target handled it.`;
37
37
  }
38
38
  return (`No visual change detected between before and after screenshots. ` +
39
39
  `The ${target} may not respond visually or the ${action} may have missed.`);
@@ -957,6 +957,12 @@ async function tryCoordinateStrategy(pixelX, pixelY, platform, lastScreenshot, u
957
957
  }
958
958
  const TAP_TIMEOUT_MS = 25000;
959
959
  const MIN_STRATEGY_BUDGET_MS = 500;
960
+ /**
961
+ * Ceiling for the pre-dispatch overlay check. It shares the tap's deadline with the
962
+ * strategies that follow, so it must not be able to spend the whole budget on a fiber
963
+ * read — a screen big enough to make this slow is exactly when the tap still needs time.
964
+ */
965
+ const OVERLAY_GUARD_BUDGET_MS = 3000;
960
966
  // Per-strategy budget. OCR cap on Android is bumped via maxStrategyMs() because
961
967
  // the ADB screencap+pull leg has ~2s variance on real devices; iOS stays at 5s
962
968
  // where xcrun simctl screenshot is consistent.
@@ -1094,37 +1100,39 @@ export function resetCoordArtifactDedup() {
1094
1100
  /**
1095
1101
  * Turn an unmeaningful coordinate tap into an explanation.
1096
1102
  *
1097
- * The tricky part is coordinate spaces. The caller works in screenshot pixels;
1098
- * the tap was executed in points (iOS) or device pixels (Android); the screen
1099
- * state reports points/dp. We map the tapped point INTO screen-state space to
1100
- * do the hit test, and map the answer BACK into the caller's screenshot pixels
1101
- * so any suggested coordinates can be passed straight to another tap().
1103
+ * Coordinate spaces used to be the hard part here, and the old approach — recovering a
1104
+ * scale by dividing the caller's input by the executed tap point, then multiplying the
1105
+ * raw screen state by it — was wrong in a way that mattered. That ratio carries no inset
1106
+ * term, but the caller's coordinate comes from a space where `topInset` has been applied,
1107
+ * so on Android and inside iOS modal presentations the probe landed roughly
1108
+ * `topInset x factor` off. An offset probe can hit-test a neighbouring element, and
1109
+ * because `explainCoordinateMiss` checks reachable pressables before blocked ones, the
1110
+ * usual result was a confident "the coordinates were correct, check your onPress handler"
1111
+ * about an element that was in fact covered.
1112
+ *
1113
+ * Now that every tool shares one space, there is nothing to recover: normalise the state
1114
+ * the same way the layout tools do and hit-test the caller's own coordinate against it.
1102
1115
  */
1103
1116
  async function diagnoseCoordinateMiss(args) {
1104
1117
  try {
1105
1118
  const { getScreenState } = await import("../core/screenState.js");
1106
1119
  const { explainCoordinateMiss } = await import("./coordinateMiss.js");
1120
+ const { screenStateToScreenSpace, screenStateToDeliveredPx } = await import("../core/screenSpace.js");
1121
+ const { resolveScreenSpaceMetrics } = await import("../core/screenSpaceDevice.js");
1122
+ const { getConnectedAppByDevice, getFirstConnectedApp } = await import("../core/index.js");
1107
1123
  const ss = await getScreenState({ device: args.deviceName });
1108
1124
  if (!ss.success || !ss.screenState)
1109
1125
  return undefined;
1110
- // Android taps are executed in device pixels; screen state speaks dp.
1111
- let pointInState = args.point;
1112
- if (args.pointUnit === "pixels") {
1113
- const { androidGetDensity } = await import("../core/android.js");
1114
- const density = await androidGetDensity();
1115
- const densityScale = (density.density || 420) / 160;
1116
- pointInState = { x: args.point.x / densityScale, y: args.point.y / densityScale };
1117
- }
1118
- // Ratio between screen-state space and the caller's screenshot pixels,
1119
- // derived from the conversion this very tap already performed. Uses the
1120
- // larger axis so a near-zero coordinate can't amplify rounding error.
1121
- const useY = Math.abs(pointInState.y) > Math.abs(pointInState.x);
1122
- const numerator = useY ? args.inputPoint.y : args.inputPoint.x;
1123
- const denominator = useY ? pointInState.y : pointInState.x;
1124
- const factor = denominator !== 0 && Number.isFinite(numerator / denominator)
1125
- ? numerator / denominator
1126
- : 1;
1127
- return explainCoordinateMiss(pointInState, ss.screenState, (v) => Math.round(v * factor)) ?? undefined;
1126
+ const app = (args.deviceName ? getConnectedAppByDevice(args.deviceName) : null) ?? getFirstConnectedApp();
1127
+ const metrics = await resolveScreenSpaceMetrics({
1128
+ platform: app?.platform ?? "ios",
1129
+ udid: app?.simulatorUdid,
1130
+ deviceId: app?.adbSerial
1131
+ });
1132
+ const normalised = screenStateToDeliveredPx(screenStateToScreenSpace(ss.screenState, metrics), metrics);
1133
+ // State and probe are both in delivered pixels now, so the reported coordinates
1134
+ // are already the caller's space — no mapping back.
1135
+ return explainCoordinateMiss(args.inputPoint, normalised) ?? undefined;
1128
1136
  }
1129
1137
  catch {
1130
1138
  // Diagnosis is best-effort — never let it turn a successful tap into an error.
@@ -1516,6 +1524,69 @@ export async function tap(options) {
1516
1524
  error: errorMessage
1517
1525
  };
1518
1526
  }
1527
+ // Refuse before dispatch when the target is under an overlay. Every strategy resolves
1528
+ // to a coordinate tap, so the OS would deliver the touch to the overlay — firing it
1529
+ // would press the wrong element and mutate state the caller never asked to change.
1530
+ //
1531
+ // Bounded, and failure-open by construction: the guard costs one fiber read, and if
1532
+ // that read is slow, errors, or cannot reach a verdict, the tap proceeds exactly as it
1533
+ // did before. Blocking a legitimate tap because a diagnostic timed out would be a far
1534
+ // worse regression than the mis-delivery this prevents — tap is the tool everything
1535
+ // else is built on.
1536
+ // Set when the tap is dispatched onto an overlay control that shadows a covered
1537
+ // element; attached to the successful result so the caller learns what actually
1538
+ // received the touch.
1539
+ let shadowWarning;
1540
+ if (hasMetro) {
1541
+ const guardBudget = Math.min(remainingMs(), OVERLAY_GUARD_BUDGET_MS);
1542
+ if (guardBudget >= MIN_STRATEGY_BUDGET_MS) {
1543
+ let blockedBy = null;
1544
+ try {
1545
+ const { checkOverlayBlocking } = await import("./overlayGuard.js");
1546
+ blockedBy = await withTimeout(checkOverlayBlocking({
1547
+ query,
1548
+ platform,
1549
+ udid: targetUdid,
1550
+ deviceId: resolved.target.androidSerial,
1551
+ deviceName
1552
+ }), guardBudget, "overlay-guard");
1553
+ }
1554
+ catch {
1555
+ blockedBy = null;
1556
+ }
1557
+ if (blockedBy?.kind === "blocked") {
1558
+ // Recorded as an attempt so the refusal is distinguishable in telemetry
1559
+ // (_errorContext) from a tap that tried and failed. Without it every
1560
+ // declined tap looks like a tap-tool regression on the failure dashboard.
1561
+ attempted.push({
1562
+ strategy: "overlay-guard",
1563
+ reason: `refused — target covered by ${blockedBy.overlay}`,
1564
+ outcome: "skipped"
1565
+ });
1566
+ return {
1567
+ success: false,
1568
+ query,
1569
+ attempted,
1570
+ device: deviceName,
1571
+ platform,
1572
+ error: `Refused: ${blockedBy.element} is covered by ${blockedBy.overlay}. ` +
1573
+ `A tap here would be delivered to the overlay, not to the target, ` +
1574
+ `so it was not dispatched.`,
1575
+ suggestion: `Dismiss or close the overlay first, then retry. ` +
1576
+ `get_screen_state lists the overlay's own controls, and everything behind it under "🚫 Blocked by overlay". ` +
1577
+ `To tap the overlay itself, use coordinates from its own group.`
1578
+ };
1579
+ }
1580
+ if (blockedBy?.kind === "shadowed") {
1581
+ // Dispatch, but name the element that will actually receive the touch.
1582
+ // Staying silent here is the reported bug in miniature.
1583
+ shadowWarning =
1584
+ `This coordinate is occupied by ${blockedBy.hit}, part of ${blockedBy.overlay} — ` +
1585
+ `that is what received the tap. ${blockedBy.covered} sits underneath it and ` +
1586
+ `cannot be tapped until the overlay closes.`;
1587
+ }
1588
+ }
1589
+ }
1519
1590
  // Determine screenshot and verification behavior.
1520
1591
  // Decoupled (I5, 2026-05-16): verify can run without returning image bytes —
1521
1592
  // capture cost is paid either way; bandwidth cost is what `screenshot` toggles.
@@ -1674,6 +1745,14 @@ export async function tap(options) {
1674
1745
  screenshot,
1675
1746
  verification
1676
1747
  });
1748
+ // The guard already resolved what occupies this coordinate. Reporting it turns
1749
+ // "something responded" into "this element responded" for the one case where
1750
+ // the caller most likely meant something else.
1751
+ if (shadowWarning) {
1752
+ successResult.warning = successResult.warning
1753
+ ? `${successResult.warning}\n${shadowWarning}`
1754
+ : shadowWarning;
1755
+ }
1677
1756
  // Capture an artifact for "successful but unmeaningful" taps so we can
1678
1757
  // diagnose taps that landed wrong or hit non-responsive elements.
1679
1758
  // Uses the same `meaningful` flag the agent sees so dashboard outcomes