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
@@ -1,10 +1,28 @@
1
1
  import { z } from "zod";
2
2
  import { registerToolWithTelemetry } from "../core/register.js";
3
- import { iconLabel } from "../core/iconSemantics.js";
4
- import { getComponentTree, getScreenLayout, getPressableElements, getScreenState, formatScreenStateSummary, inspectComponent, findComponents, harvestStacksAtPoint, enrichWithSource, inspectAtPoint, measureComponent, iosScreenshot, androidScreenshot, androidGetDensity, getDevicePixelRatio, getIOSSafeAreaTop, inferIOSDevicePixelRatio, metroMissingHintIfAbsent, hasMetro, getConnectedAppByDevice, getFirstConnectedApp, } from "../core/index.js";
3
+ import { getComponentTree, getScreenLayout, getScreenState, formatScreenStateSummary, inspectComponent, findComponents, harvestStacksAtPoint, enrichWithSource, inspectAtPoint, measureComponent, metroMissingHintIfAbsent, hasMetro, getConnectedAppByDevice, getFirstConnectedApp, } from "../core/index.js";
4
+ import { screenStateToScreenSpace, toDeliveredPxY, toDeliveredPxX, toDeliveredPxLength, pxScaleConverter, unresolvedScaleNote } from "../core/screenSpace.js";
5
+ import { resolveScreenSpaceMetrics } from "../core/screenSpaceDevice.js";
5
6
  import { readKeyboardState } from "../core/keyboardMetrics.js";
6
7
  import { primaryInteractionBanner } from "../core/toolHelpers.js";
7
8
  import { DEVICE_ARG_DESC } from "./_deviceArg.js";
9
+ /**
10
+ * Top inset for whichever device a layout tool is about to answer for.
11
+ *
12
+ * A zero inset is the safe default: {@link toScreenSpaceY} treats it as "leave coordinates
13
+ * alone", so an unresolvable device degrades to the previous raw-fiber behaviour rather
14
+ * than to a wrongly shifted one.
15
+ */
16
+ async function resolveScreenSpaceMetricsFor(device) {
17
+ const app = (device ? getConnectedAppByDevice(device) : getFirstConnectedApp()) ?? getFirstConnectedApp();
18
+ if (!app)
19
+ return { platform: "ios", topInset: 0 };
20
+ return resolveScreenSpaceMetrics({
21
+ platform: app.platform,
22
+ udid: app.simulatorUdid,
23
+ deviceId: app.adbSerial
24
+ });
25
+ }
8
26
  function collectMetaNotes(r) {
9
27
  const out = [];
10
28
  if (r._meta?.reconnected) {
@@ -18,7 +36,7 @@ function collectMetaNotes(r) {
18
36
  export function registerComponentTools(server) {
19
37
  // Tool: Get full screen layout (all components with layout styles)
20
38
  registerToolWithTelemetry(server, "get_screen_layout", {
21
- description: "Get a screen map showing visible components as an indented tree with actual screen positions. Uses measureInWindow for real coordinates and filters out off-screen components. Returns meaningful component names with text content and frame data (x,y width x height). Coordinates are in **points** (iOS) or **dp** (Android) — NOT screenshot pixels. Use extended=true to include layout styles (padding, margin, flex, backgroundColor, etc.)." +
39
+ description: "Get a screen map showing visible components as an indented tree with actual screen positions. Uses measureInWindow for real coordinates and filters out off-screen components. Returns meaningful component names with text content and frame data (x,y width x height). Coordinates are delivered-screenshot pixels — the same space screenshots, get_screen_state and tap() use, so pass them through unchanged. Use extended=true to include layout styles (padding, margin, flex, backgroundColor, etc.)." +
22
40
  primaryInteractionBanner() + "\n" +
23
41
  "PURPOSE: Quickest textual map of what is actually on screen right now — component names, positions, and text — so you can plan taps and inspections without guessing.\n" +
24
42
  "WHEN TO USE: First step whenever the user asks \"what's on screen\", \"why is X covering Y\", or before tapping a visually ambiguous element.\n" +
@@ -53,7 +71,14 @@ export function registerComponentTools(server) {
53
71
  };
54
72
  }
55
73
  const effectiveTimeoutMs = timeoutMs ?? (extended ? 15000 : 5000);
56
- const result = await getScreenLayout({ extended, summary, device, timeoutMs: effectiveTimeoutMs });
74
+ const layoutMetrics = await resolveScreenSpaceMetricsFor(device);
75
+ const result = await getScreenLayout({
76
+ extended,
77
+ summary,
78
+ device,
79
+ timeoutMs: effectiveTimeoutMs,
80
+ screenSpace: layoutMetrics
81
+ });
57
82
  const metaNotes = collectMetaNotes(result);
58
83
  if (!result.success) {
59
84
  const errText = metaNotes.length > 0 ? `Error: ${result.error}\n\n${metaNotes.join("\n")}` : `Error: ${result.error}`;
@@ -62,8 +87,10 @@ export function registerComponentTools(server) {
62
87
  isError: true
63
88
  };
64
89
  }
65
- const body = metaNotes.length > 0
66
- ? `Screen Layout:\n\n${result.result}\n\n${metaNotes.join("\n")}`
90
+ const layoutScaleNote = unresolvedScaleNote(layoutMetrics);
91
+ const layoutNotes = layoutScaleNote ? [layoutScaleNote, ...metaNotes] : metaNotes;
92
+ const body = layoutNotes.length > 0
93
+ ? `Screen Layout:\n\n${result.result}\n\n${layoutNotes.join("\n")}`
67
94
  : `Screen Layout:\n\n${result.result}`;
68
95
  return { content: [{ type: "text", text: body }] };
69
96
  });
@@ -140,129 +167,14 @@ export function registerComponentTools(server) {
140
167
  : `React Component Tree:\n\n${result.result}`;
141
168
  return { content: [{ type: "text", text: body }] };
142
169
  });
143
- // Tool: Get all pressable elements on screen
144
- registerToolWithTelemetry(server, "get_pressable_elements", {
145
- description: "Prefer get_screen_state after navigation (route + overlays + pressables in one call).\n\n" +
146
- "Find all pressable (onPress) and input (TextInput) elements currently visible on screen. Returns component names, ready-to-tap center coordinates in SCREENSHOT PIXELS (same space as ios_screenshot/android_screenshot — pass directly to tap(x, y)), text labels, testID, accessibilityLabel, and a spatial nearbyText hint for icon-only buttons. Each element includes hasLabel (true if it contains text) and isInput (true for TextInput fields).\n" +
147
- "HELPER — call before `tap` when you need to enumerate candidate elements before committing to a target; not a replacement for tap itself.\n" +
148
- "PURPOSE: Produce a ready-to-tap inventory of every interactive element on screen with screenshot-pixel coordinates that tap(x, y) accepts directly.\n" +
149
- "WHEN TO USE: Before tapping icon-only buttons, when text-based tap keeps failing, or to enumerate what the user can actually interact with.\n" +
150
- "WORKFLOW: ios_screenshot / android_screenshot -> get_pressable_elements -> tap(testID=\"...\") or tap(x, y) using the center coordinates.\n" +
151
- "LIMITATIONS: Visible-only (off-screen pressables are excluded). Requires a live React connection. Coordinates are in screenshot pixels — the tap tool converts to points internally.\n" +
152
- "GOOD: get_pressable_elements()\n" +
153
- "BAD: Calling when tap(testID=\"...\") already works — testID matching is faster and more stable.\n",
154
- inputSchema: {
155
- device: z.string().optional().describe(DEVICE_ARG_DESC)
156
- }
157
- }, async ({ device }) => {
158
- const result = await getPressableElements({ device });
159
- if (!result.success) {
160
- return {
161
- content: [
162
- {
163
- type: "text",
164
- text: `Error: ${result.error}`
165
- }
166
- ],
167
- isError: true
168
- };
169
- }
170
- const elements = result.parsedElements;
171
- if (!elements || elements.length === 0) {
172
- return {
173
- content: [{ type: "text", text: result.result || "No pressable elements found." }]
174
- };
175
- }
176
- // Resolve target app so we can pick the right simulator / android device
177
- const targetApp = device ? getConnectedAppByDevice(device) : getFirstConnectedApp();
178
- if (!targetApp) {
179
- // No connected app — return raw (points) output; better than nothing
180
- return {
181
- content: [{ type: "text", text: result.result || "No pressable elements found." }]
182
- };
183
- }
184
- // Capture a lightweight screenshot to learn scaleFactor (downscale) and dimensions.
185
- // Conversion: screenshot_px = native_coord * devicePixelRatio / screenshotScale
186
- let lines = [];
187
- try {
188
- if (targetApp.platform === "ios") {
189
- const udid = targetApp.simulatorUdid;
190
- const shot = await iosScreenshot(undefined, udid);
191
- const screenshotScale = shot.scaleFactor || 1;
192
- const devicePixelRatio = (shot.originalWidth && shot.originalHeight
193
- ? inferIOSDevicePixelRatio(shot.originalWidth, shot.originalHeight)
194
- : null) ?? (await getDevicePixelRatio(udid)) ?? 3;
195
- // Fallback to 59pt (iPhone typical) when the UI driver preflight can't
196
- // resolve the true inset — matches ios_screenshot's default. Without this
197
- // shift, react-native-screens modal-presented screens report y relative
198
- // to content origin and taps land in the status bar instead of the button.
199
- const safeAreaTop = (await getIOSSafeAreaTop(udid).catch(() => 0)) || 59;
200
- // Keep the app's lastScreenshot metadata in sync so tap(x, y) uses the
201
- // same scaleFactor when converting our pixel coords back to points.
202
- if (shot.originalWidth && shot.originalHeight) {
203
- targetApp.lastScreenshot = {
204
- originalWidth: shot.originalWidth,
205
- originalHeight: shot.originalHeight,
206
- scaleFactor: screenshotScale
207
- };
208
- }
209
- lines = formatPressablesInPixels(elements, {
210
- platform: "ios",
211
- devicePixelRatio,
212
- screenshotScale,
213
- safeAreaTop
214
- });
215
- }
216
- else {
217
- // Metro's `deviceName` is the device model (e.g. "sdk_gphone16k_arm64"),
218
- // not the adb serial (e.g. "emulator-5554"), so passing it as -s makes
219
- // adb miss the device and androidScreenshot/androidGetDensity silently
220
- // return defaults (scale=1, density=160). That leaves coords in raw
221
- // device pixels — off by ~1.2× from the screenshot/JPEG space the tool
222
- // description promises. Pass undefined to let adb auto-pick (matches
223
- // how android_screenshot works when called without deviceId). Multi-
224
- // Android-device support tracks separately under the multi-device
225
- // refactor; this path is a single-Android-device fix.
226
- const shot = await androidScreenshot(undefined, undefined);
227
- const screenshotScale = shot.scaleFactor || 1;
228
- const density = await androidGetDensity(undefined).catch(() => ({ density: 160 }));
229
- const devicePixelRatio = (density.density || 160) / 160;
230
- if (shot.originalWidth && shot.originalHeight) {
231
- targetApp.lastScreenshot = {
232
- originalWidth: shot.originalWidth,
233
- originalHeight: shot.originalHeight,
234
- scaleFactor: screenshotScale
235
- };
236
- }
237
- lines = formatPressablesInPixels(elements, {
238
- platform: "android",
239
- devicePixelRatio,
240
- screenshotScale,
241
- safeAreaTop: 0
242
- });
243
- }
244
- }
245
- catch {
246
- // Fallback to points if screenshot/metadata unavailable
247
- return {
248
- content: [{ type: "text", text: result.result || "No pressable elements found." }]
249
- };
250
- }
251
- const iconCount = elements.filter((e) => !e.hasLabel).length;
252
- const labeledCount = elements.length - iconCount;
253
- const summary = `Found ${elements.length} pressable elements (${iconCount} icon-only, ${labeledCount} with text labels)`;
254
- const text = [summary, "", ...lines].join("\n");
255
- return {
256
- content: [{ type: "text", text }]
257
- };
258
- });
259
170
  // Tool: Get current screen state — route, overlays, pressables (post-navigation checkpoint)
260
171
  registerToolWithTelemetry(server, "get_screen_state", {
261
172
  description: "Screenshot-free snapshot of the current screen: active route + params, blocking overlays (sheets, modals, alerts), and every on-screen element merged top-to-bottom within reachability groups. Call after any tap or navigation to orient before the next action. " +
262
173
  "Each line carries an (x, y) center + frame bounds (so anything is a tap(x, y) target), typed by a leading marker: 🔘 pressable (with component JSX tag, label, testID, onPress hint), 📝 text, 🖼 image (with src/alt). " +
263
174
  "Elements covered by an open overlay are grouped under 🚫 Blocked — visible for context, but taps will NOT reach them until the overlay closes. Long text truncates to 80 chars (fullText=true for full strings); pressablesOnly=true returns just the lean tappable list.\n\n" +
264
175
  "WHEN TO USE: After every tap/swipe that may navigate, and to read screen content (prices, labels, which image loaded) without a screenshot+OCR round-trip.\n" +
265
- "LIMITATIONS: route is null without React Navigation / Expo Router. Requires a live Metro connection. Coordinates in points (iOS) / dp (Android); text frames are container-level (climb to nearest measurable host).\n" +
176
+ "COORDINATES: delivered-screenshot pixels — the same space as ios_screenshot/android_screenshot, get_screen_layout, inspect_at_point, measure and tap(). Pass them through unchanged; never scale by devicePixelRatio yourself.\n" +
177
+ "LIMITATIONS: route is null without React Navigation / Expo Router. Requires a live Metro connection.\n" +
266
178
  "SOURCE: this lists what is on screen, not where it lives in code — for the file:line that renders an element, call inspect_at_point(x, y).\n" +
267
179
  "SEE ALSO: get_screen_layout for the full hierarchical component tree (deep inspection) — this gives a flat, tap-ready content list instead.",
268
180
  inputSchema: {
@@ -295,69 +207,28 @@ export function registerComponentTools(server) {
295
207
  isError: true
296
208
  };
297
209
  }
298
- const ss = result.screenState;
299
- const summary = ss ? formatScreenStateSummary(ss, undefined, { pressablesOnly, fullText, keyboard }) : (result.result ?? "{}");
300
- const body = metaNotes.length > 0
301
- ? `${summary}\n\n${metaNotes.join("\n")}`
210
+ // Normalise to screen space, then into delivered-screenshot pixels — the one
211
+ // unit every tool speaks, so a coordinate read here goes straight to tap().
212
+ // Raw measureInWindow is neither: it is not screen-relative (Android excludes
213
+ // the status bar; iOS modals measure from their own container) *and* it is in
214
+ // points. Emitting it unconverted, which this call used to do by passing no
215
+ // converter at all, is what made these coordinates disagree with every
216
+ // screenshot by the device scale.
217
+ const metrics = await resolveScreenSpaceMetricsFor(device);
218
+ const rawSs = result.screenState;
219
+ const ss = rawSs ? screenStateToScreenSpace(rawSs, metrics) : rawSs;
220
+ const summary = ss
221
+ ? formatScreenStateSummary(ss, pxScaleConverter(metrics), {
222
+ pressablesOnly, fullText, keyboard, pixelScale: metrics.pixelScale
223
+ })
224
+ : (result.result ?? "{}");
225
+ const scaleNote = unresolvedScaleNote(metrics);
226
+ const allNotes = scaleNote ? [scaleNote, ...metaNotes] : metaNotes;
227
+ const body = allNotes.length > 0
228
+ ? `${summary}\n\n${allNotes.join("\n")}`
302
229
  : summary;
303
230
  return { content: [{ type: "text", text: body }] };
304
231
  });
305
- function formatPressablesInPixels(elements, opts) {
306
- const { platform, devicePixelRatio, screenshotScale, safeAreaTop } = opts;
307
- const out = [];
308
- for (let i = 0; i < elements.length; i++) {
309
- const el = elements[i];
310
- // react-native-screens modal presentations report y relative to content origin;
311
- // shift into the window frame when the element's center sits inside the safe-area
312
- // band. The shift MUST be applied to center and frame atomically — independent
313
- // checks (cy<inset, fy<inset) drift apart on iPad-style insets where a header's
314
- // center is just below the inset but its frame top is just above, producing
315
- // center/frame.y values that don't satisfy center = frame.y + frame.h/2.
316
- let cy = el.center.y;
317
- let fy = el.frame.y;
318
- if (platform === "ios" && safeAreaTop > 0 && cy < safeAreaTop) {
319
- cy += safeAreaTop;
320
- fy += safeAreaTop;
321
- }
322
- // iOS: fiber returns points → convert points × DPR / screenshotScale = JPEG px.
323
- // Android: getPressableElements reconciles fiber DP against uiautomator device-pixel
324
- // bounds (executor.ts, 2026-05-17). After reconciliation, coords are already in
325
- // device pixels — only the JPEG downscale needs to be applied. Multiplying by DPR
326
- // here would re-inflate them by ~density/160 (~2.6× on a 420dpi device), reproducing
327
- // the original out-of-bounds bug.
328
- const toPx = (v) => platform === "android"
329
- ? Math.round(v / screenshotScale)
330
- : Math.round((v * devicePixelRatio) / screenshotScale);
331
- const cx = toPx(el.center.x);
332
- const cyPx = toPx(cy);
333
- const fx = toPx(el.frame.x);
334
- const fyPx = toPx(fy);
335
- const fw = toPx(el.frame.width);
336
- const fh = toPx(el.frame.height);
337
- const num = i + 1;
338
- const iconHint = !el.hasLabel ? iconLabel(el.component, el.icon) : null;
339
- const label = el.hasLabel
340
- ? `"${el.text}"`
341
- : iconHint
342
- ? `(${iconHint})`
343
- : el.intent
344
- ? `(${el.intent} icon)`
345
- : "(icon/image)";
346
- const ids = [];
347
- if (el.testID)
348
- ids.push(`testID="${el.testID}"`);
349
- if (el.accessibilityLabel)
350
- ids.push(`a11y="${el.accessibilityLabel}"`);
351
- const idStr = ids.length > 0 ? ` [${ids.join(", ")}]` : "";
352
- const inputStr = el.isInput ? " (input)" : "";
353
- const wrapperStr = el.isWrapper ? " [wrapper — skip unless dismissing keyboard]" : "";
354
- const nearPart = el.nearbyText ? ` near "${el.nearbyText}"` : "";
355
- out.push(`${num}. ${el.component} ${label}${nearPart} — center:(${cx},${cyPx}) frame:(${fx},${fyPx} ${fw}x${fh})${idStr}${inputStr}${wrapperStr}`);
356
- if (el.path)
357
- out.push(` path: ${el.path}`);
358
- }
359
- return out;
360
- }
361
232
  // Tool: Inspect a specific component by name
362
233
  registerToolWithTelemetry(server, "inspect_component", {
363
234
  description: "Inspect a specific React component by name. **DRILL-DOWN TOOL**: Use after get_screen_layout or find_components to identify which component to inspect. Returns props, style, state (hooks), and optionally children tree. Use childrenDepth to control how deep nested children go." +
@@ -496,19 +367,19 @@ export function registerComponentTools(server) {
496
367
  // Tool: Toggle Element Inspector programmatically
497
368
  // Tool: Inspect component at coordinates (like Element Inspector)
498
369
  registerToolWithTelemetry(server, "inspect_at_point", {
499
- description: "Inspect layout AND props at (x, y). Returns FRAME PER ANCESTOR (position/size in dp for every ancestor that hit-tested the point) + the innermost component's PROPS (handlers as [Function], refs, custom props like onPress/data/testID). Pure JS hit-test via fiber + measureInWindow — no overlay toggled, zero visual side effect. Works on Paper and Fabric.\n" +
370
+ description: "Inspect layout AND props at (x, y). Returns FRAME PER ANCESTOR (position/size in delivered-screenshot pixels, the same space as screenshots/get_screen_state/tap, for every ancestor that hit-tested the point) + the innermost component's PROPS (handlers as [Function], refs, custom props like onPress/data/testID). Pure JS hit-test via fiber + measureInWindow — no overlay toggled, zero visual side effect. Works on Paper and Fabric.\n" +
500
371
  "PURPOSE: Layout/props diagnosis — \"where is each ancestor positioned, and what props does the touched component expose?\"\n" +
501
372
  "WHEN TO USE: A button is clipped, hit area is wrong, animated frame is unexpected — or you need handler/ref/non-style props. Also preferred for tight loops (no overlay flicker).\n" +
502
- "WORKFLOW: screenshot → suspect pixel → divide by pixel ratio → inspect_at_point(x, y).\n" +
503
- "LIMITATIONS: Coordinates MUST be in dp, not screenshot pixels — wrong unit = wrong node. Style is the node's own style object, not the merged cascade.\n" +
373
+ "WORKFLOW: screenshot or get_screen_state → take the coordinate as-is → inspect_at_point(x, y).\n" +
374
+ "LIMITATIONS: Style is the node's own style object, not the merged cascade. `frame` is the element's own box; `hitFrame` (when present) is the innermost node actually under the point.\n" +
504
375
  "SOURCE: also returns `source: {file, line, column}` for the component at the point, plus the owner chain as `Source ancestors` (set source=false to skip in tight loops).\n",
505
376
  inputSchema: {
506
377
  x: z
507
378
  .number()
508
- .describe("X coordinate in dp (logical pixels). Convert from screenshot pixels by dividing by the device pixel ratio."),
379
+ .describe("X coordinate in screen space — take it straight from a screenshot, get_screen_state or get_screen_layout. No conversion."),
509
380
  y: z
510
381
  .number()
511
- .describe("Y coordinate in dp (logical pixels). Convert from screenshot pixels by dividing by the device pixel ratio."),
382
+ .describe("Y coordinate in screen space — take it straight from a screenshot, get_screen_state or get_screen_layout. No conversion."),
512
383
  includeProps: z
513
384
  .boolean()
514
385
  .optional()
@@ -527,7 +398,12 @@ export function registerComponentTools(server) {
527
398
  .describe("Resolve the component's source file and line via Metro symbolication. Default true. Set false to skip in tight loops.")
528
399
  }
529
400
  }, async ({ x, y, includeProps, includeFrame, device, source = true }) => {
530
- const result = await inspectAtPoint(x, y, { includeProps, includeFrame, device });
401
+ const result = await inspectAtPoint(x, y, {
402
+ includeProps,
403
+ includeFrame,
404
+ device,
405
+ screenSpace: await resolveScreenSpaceMetricsFor(device)
406
+ });
531
407
  if (!result.success) {
532
408
  return {
533
409
  content: [
@@ -595,7 +471,7 @@ export function registerComponentTools(server) {
595
471
  });
596
472
  // Tool: Measure on-screen geometry of a named component
597
473
  registerToolWithTelemetry(server, "measure", {
598
- description: "Get on-screen geometry {x, y, width, height} for a named React component instance. Calls measureInWindow on the matched fiber (or its nearest host descendant for composite components). Coordinates are in points (iOS) / dp (Android), same space as get_screen_layout and inspect_at_point.\n" +
474
+ description: "Get on-screen geometry {x, y, width, height} for a named React component instance. Calls measureInWindow on the matched fiber (or its nearest host descendant for composite components). Coordinates are delivered-screenshot pixels, the same space as screenshots, get_screen_layout, get_screen_state, inspect_at_point and tap().\n" +
599
475
  "PURPOSE: One-shot, name-based component measurement — avoids hand-rolling fiber walks and Promise-wrapping measureInWindow callbacks in execute_in_app.\n" +
600
476
  "WHEN TO USE: You already know the component's display name (from get_screen_layout or find_components) and just need its current bounds — e.g. to verify a layout change, compute a tap target, or compare against design specs.\n" +
601
477
  "WORKFLOW: find_components(pattern=\"...\") -> measure(componentName=\"...\", index=N) -> tap(x, y) at the center, or inspect_at_point at the center to verify identity.\n" +
@@ -633,14 +509,28 @@ export function registerComponentTools(server) {
633
509
  _errorContext: result.outcome
634
510
  };
635
511
  }
512
+ // measure returns a single leaf box, so the band rule applies directly — there is
513
+ // no root container here to exempt. Without this the tool's own promise of "the
514
+ // same space as get_screen_layout and inspect_at_point" would be false: off by the
515
+ // status bar on every Android screen, and by the safe area inside an iOS modal.
516
+ const measureMetrics = await resolveScreenSpaceMetricsFor(device);
517
+ // Inset shift *and* scale, since measureComponent hands back raw fiber-space
518
+ // points — unlike the screen-state path, nothing has normalised them yet.
519
+ const mx = toDeliveredPxX(result.x, measureMetrics);
520
+ const my = toDeliveredPxY(result.y, measureMetrics);
521
+ const mw = toDeliveredPxLength(result.width, measureMetrics);
522
+ const mh = toDeliveredPxLength(result.height, measureMetrics);
636
523
  const lines = [
637
524
  `Component: ${result.name}`,
638
- `Frame: (${result.x.toFixed(1)}, ${result.y.toFixed(1)}) ${result.width.toFixed(1)}x${result.height.toFixed(1)}`,
639
- `Center: (${(result.x + result.width / 2).toFixed(1)}, ${(result.y + result.height / 2).toFixed(1)})`,
525
+ `Frame: (${mx.toFixed(1)}, ${my.toFixed(1)}) ${mw.toFixed(1)}x${mh.toFixed(1)}`,
526
+ `Center: (${(mx + mw / 2).toFixed(1)}, ${(my + mh / 2).toFixed(1)})`,
640
527
  ];
641
528
  if (typeof result.nativeTag === "number") {
642
529
  lines.push(`nativeTag: ${result.nativeTag}`);
643
530
  }
531
+ const measureScaleNote = unresolvedScaleNote(measureMetrics);
532
+ if (measureScaleNote)
533
+ lines.push(measureScaleNote);
644
534
  return {
645
535
  content: [{ type: "text", text: lines.join("\n") }]
646
536
  };
@@ -1 +1 @@
1
- {"version":3,"file":"componentTools.js","sourceRoot":"","sources":["../../src/tools/componentTools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"componentTools.js","sourceRoot":"","sources":["../../src/tools/componentTools.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"screenshotTools.d.ts","sourceRoot":"","sources":["../../src/tools/screenshotTools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8BzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0yB/D"}
1
+ {"version":3,"file":"screenshotTools.d.ts","sourceRoot":"","sources":["../../src/tools/screenshotTools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2BzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAywB/D"}
@@ -1,9 +1,9 @@
1
1
  import { z } from "zod";
2
2
  import { registerToolWithTelemetry } from "../core/register.js";
3
3
  import { resolveAndroidDeviceId, resolveIosUdid, ANDROID_ARG_DESC, IOS_ARG_DESC } from "./_deviceArg.js";
4
- import { iconLabel } from "../core/iconSemantics.js";
5
4
  import { recordScreenMetrics } from "../core/projectMemory.js";
6
- import { iosScreenshot, androidScreenshot, detectLogBox, formatLogBoxWarning, recognizeText, inferIOSDevicePixelRatio, getPressableElements, getScreenState, formatScreenStateSummary, imageBuffer, getActiveOrBootedSimulatorUdid, connectedApps, getConnectedAppBySimulatorUdid, getConnectedAppByAndroidDeviceId, iosDescribeAll, detectIOSSystemOverlay, formatIOSSystemOverlayWarning, androidGetStatusBarHeight, androidGetDensity, } from "../core/index.js";
5
+ import { iosScreenshot, androidScreenshot, detectLogBox, formatLogBoxWarning, recognizeText, inferIOSDevicePixelRatio, getScreenState, formatScreenStateSummary, imageBuffer, getActiveOrBootedSimulatorUdid, connectedApps, getConnectedAppBySimulatorUdid, getConnectedAppByAndroidDeviceId, iosDescribeAll, detectIOSSystemOverlay, formatIOSSystemOverlayWarning, androidGetStatusBarHeight, androidGetDensity, } from "../core/index.js";
6
+ import { screenStateToScreenSpace } from "../core/screenSpace.js";
7
7
  export function registerScreenshotTools(server) {
8
8
  // Tool: iOS screenshot
9
9
  registerToolWithTelemetry(server, "ios_screenshot", {
@@ -145,20 +145,23 @@ export function registerScreenshotTools(server) {
145
145
  if (ssResult && ssResult.success && ssResult.screenState) {
146
146
  const screenshotScale = result.scaleFactor || 1;
147
147
  const toPx = (v) => Math.round((v * scaleFactor) / screenshotScale);
148
- pressablesText = formatScreenStateSummary(ssResult.screenState, (p) => {
149
- // See enrichScreenshotWithLayout: shift y when fiber reports the
150
- // element inside the safe-area band (react-native-screens modals).
151
- const yShift = safeAreaTop > 0 && p.center.y < safeAreaTop ? safeAreaTop : 0;
152
- return {
153
- center: { x: toPx(p.center.x), y: toPx(p.center.y + yShift) },
154
- frame: {
155
- x: toPx(p.bounds.x),
156
- y: toPx(p.bounds.y + yShift),
157
- width: toPx(p.bounds.width),
158
- height: toPx(p.bounds.height),
159
- },
160
- };
148
+ // Normalise once, then scale. The y-shift used to live inline here
149
+ // (and in a second copy for the flat pressables path), which is how
150
+ // the pixel output ended up correct while the point-space tools were
151
+ // an inset off — see core/screenSpace.ts.
152
+ const screenSpaceSs = screenStateToScreenSpace(ssResult.screenState, {
153
+ platform: "ios",
154
+ topInset: safeAreaTop
161
155
  });
156
+ pressablesText = formatScreenStateSummary(screenSpaceSs, (p) => ({
157
+ center: { x: toPx(p.center.x), y: toPx(p.center.y) },
158
+ frame: {
159
+ x: toPx(p.bounds.x),
160
+ y: toPx(p.bounds.y),
161
+ width: toPx(p.bounds.width),
162
+ height: toPx(p.bounds.height),
163
+ },
164
+ }));
162
165
  pressablesIsScreenState = true;
163
166
  }
164
167
  }
@@ -166,37 +169,14 @@ export function registerScreenshotTools(server) {
166
169
  // Non-fatal: fall through to the flat pressables list below
167
170
  }
168
171
  }
169
- if (!pressablesText) {
170
- try {
171
- const pressables = await getPressableElements({
172
- device: targetDeviceName,
173
- platform: "ios",
174
- udid: resolvedUdid ?? undefined
175
- });
176
- if (pressables.success && pressables.parsedElements && pressables.parsedElements.length > 0) {
177
- const screenshotScale = result.scaleFactor || 1;
178
- pressablesText = pressables.parsedElements.map((el) => {
179
- // See enrichScreenshotWithLayout: shift y when fiber reports the element
180
- // inside the safe-area band (a react-native-screens modal artifact).
181
- let centerYPoints = el.center.y;
182
- if (safeAreaTop > 0 && centerYPoints < safeAreaTop) {
183
- centerYPoints += safeAreaTop;
184
- }
185
- const px = Math.round((el.center.x * scaleFactor) / screenshotScale);
186
- const py = Math.round((centerYPoints * scaleFactor) / screenshotScale);
187
- const label = el.accessibilityLabel || el.text || el.testID || iconLabel(el.component, el.icon) || (el.intent ? `${el.intent} icon` : el.component);
188
- const idPart = el.testID ? ` testID="${el.testID}"` : "";
189
- const kindPart = el.isInput ? " [input]" : "";
190
- const wrapPart = el.isWrapper ? " [wrapper — skip]" : "";
191
- const nearPart = !el.text && !el.accessibilityLabel && el.nearbyText ? ` near "${el.nearbyText}"` : "";
192
- return ` (${px}, ${py}) ${el.component}: "${label}"${nearPart}${idPart}${kindPart}${wrapPart}`;
193
- }).join("\n");
194
- }
195
- }
196
- catch {
197
- // Non-fatal: screenshot works without pressables enrichment
198
- }
199
- }
172
+ // No second rendering path on purpose. This used to fall back to a flat
173
+ // getPressableElements list, which is what let the two renderings drift:
174
+ // the screenState path groups overlay/keyboard-blocked elements, the flat
175
+ // one did not, so an Android screenshot with the keyboard up advertised 12
176
+ // blocked elements as tappable. The flat path also mis-mapped Android
177
+ // coordinates (five distinct rows sharing one 11x57 frame). screenState is
178
+ // the single source of truth; if it fails the screenshot ships without
179
+ // enrichment rather than with a worse answer.
200
180
  const deliveredWidth = result.scaleFactor && result.scaleFactor > 1
201
181
  ? Math.round(pixelWidth / result.scaleFactor)
202
182
  : pixelWidth;
@@ -442,12 +422,18 @@ export function registerScreenshotTools(server) {
442
422
  const screenshotScale = result.scaleFactor || 1;
443
423
  const densityScale = densityDpi / 160;
444
424
  const toPx = (v) => Math.round((v * densityScale) / screenshotScale);
445
- const toPxY = (v) => Math.round((v * densityScale + statusBarPixels) / screenshotScale);
446
- pressablesText = formatScreenStateSummary(ssResult.screenState, (p) => ({
447
- center: { x: toPx(p.center.x), y: toPxY(p.center.y) },
425
+ // Same normalise-then-scale as iOS. Android's inset is the status bar,
426
+ // which measureInWindow excludes because it reports app-window
427
+ // coordinates — see core/screenSpace.ts.
428
+ const screenSpaceSs = screenStateToScreenSpace(ssResult.screenState, {
429
+ platform: "android",
430
+ topInset: statusBarDp
431
+ });
432
+ pressablesText = formatScreenStateSummary(screenSpaceSs, (p) => ({
433
+ center: { x: toPx(p.center.x), y: toPx(p.center.y) },
448
434
  frame: {
449
435
  x: toPx(p.bounds.x),
450
- y: toPxY(p.bounds.y),
436
+ y: toPx(p.bounds.y),
451
437
  width: toPx(p.bounds.width),
452
438
  height: toPx(p.bounds.height),
453
439
  },
@@ -459,28 +445,7 @@ export function registerScreenshotTools(server) {
459
445
  // Non-fatal: fall through to the flat pressables list below
460
446
  }
461
447
  }
462
- // Fallback: flat pressable elements. With targetApp present this uses the
463
- // fiber path (uiautomator-reconciled coords). Without targetApp it degrades
464
- // to the Android accessibility (uiautomator) tree (E1).
465
- try {
466
- const pressables = pressablesText ? null : await getPressableElements({ device: targetDeviceName, platform: "android" });
467
- if (pressables && pressables.success && pressables.parsedElements && pressables.parsedElements.length > 0) {
468
- const screenshotScale = result.scaleFactor || 1;
469
- pressablesText = pressables.parsedElements.map((el) => {
470
- const px = Math.round(el.center.x / screenshotScale);
471
- const py = Math.round(el.center.y / screenshotScale);
472
- const label = el.accessibilityLabel || el.text || el.testID || iconLabel(el.component, el.icon) || (el.intent ? `${el.intent} icon` : el.component);
473
- const idPart = el.testID ? ` testID="${el.testID}"` : "";
474
- const kindPart = el.isInput ? " [input]" : "";
475
- const wrapPart = el.isWrapper ? " [wrapper — skip]" : "";
476
- const nearPart = !el.text && !el.accessibilityLabel && el.nearbyText ? ` near "${el.nearbyText}"` : "";
477
- return ` (${px}, ${py}) ${el.component}: "${label}"${nearPart}${idPart}${kindPart}${wrapPart}`;
478
- }).join("\n");
479
- }
480
- }
481
- catch {
482
- // Non-fatal: screenshot works without pressables enrichment
483
- }
448
+ // No flat-pressables fallback here either — see the iOS branch for why.
484
449
  infoText += `\n📱 Android uses PIXELS for all coordinates`;
485
450
  if (result.scaleFactor && result.scaleFactor > 1) {
486
451
  infoText += `\n📐 tap() handles coordinate conversion automatically — pass pixel coords from this image directly`;