react-native-ai-devtools 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -32
- package/build/core/ocr.d.ts +2 -3
- package/build/core/ocr.d.ts.map +1 -1
- package/build/core/ocr.js +112 -6
- package/build/core/ocr.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ Have an idea or found something that could be better? Head over to [GitHub Discu
|
|
|
27
27
|
- **Unified Tap** - Single `tap` tool with automatic fallback chain: fiber tree → accessibility → OCR → coordinates. Auto-detects platform, accepts pixels from screenshots
|
|
28
28
|
- **UI Automation** - Swipe, long press, text input, and key events on both platforms
|
|
29
29
|
- **Accessibility Inspection** - Query UI hierarchy to find elements by text, label, or resource ID
|
|
30
|
-
- **OCR Text Extraction** - Extract visible text with tap-ready coordinates (works on any screen content)
|
|
30
|
+
- **OCR Text Extraction** - Extract visible text with tap-ready coordinates via Google Cloud Vision (works on any screen content)
|
|
31
31
|
|
|
32
32
|
### Under the Hood
|
|
33
33
|
|
|
@@ -87,7 +87,7 @@ Skills can also be triggered **automatically** — each skill file contains a "W
|
|
|
87
87
|
- Node.js 18+
|
|
88
88
|
- React Native app running with Metro bundler
|
|
89
89
|
- **Optional for iOS UI automation**: [Facebook IDB](https://fbidb.io/) - `brew install idb-companion`
|
|
90
|
-
- **Optional for OCR**: Python 3.6+ (
|
|
90
|
+
- **Optional for offline OCR fallback**: Python 3.6+ (only needed when cloud OCR is unavailable, see [OCR Setup](#ocr-text-extraction))
|
|
91
91
|
|
|
92
92
|
## Claude Code Setup
|
|
93
93
|
|
|
@@ -1092,11 +1092,11 @@ Returns all visible text with tap-ready coordinates:
|
|
|
1092
1092
|
```json
|
|
1093
1093
|
{
|
|
1094
1094
|
"platform": "ios",
|
|
1095
|
-
"engine": "
|
|
1096
|
-
"processingTimeMs":
|
|
1095
|
+
"engine": "cloud",
|
|
1096
|
+
"processingTimeMs": 550,
|
|
1097
1097
|
"elementCount": 24,
|
|
1098
1098
|
"elements": [
|
|
1099
|
-
{ "text": "Settings", "confidence":
|
|
1099
|
+
{ "text": "Settings", "confidence": 95, "tapX": 195, "tapY": 52 },
|
|
1100
1100
|
{ "text": "Login", "confidence": 95, "tapX": 187, "tapY": 420 }
|
|
1101
1101
|
]
|
|
1102
1102
|
}
|
|
@@ -1110,11 +1110,13 @@ tap with x=187 y=420
|
|
|
1110
1110
|
|
|
1111
1111
|
### OCR Engine
|
|
1112
1112
|
|
|
1113
|
-
|
|
1113
|
+
OCR uses **Google Cloud Vision API** via a cloud proxy for fast, accurate text recognition (~97%+ accuracy, ~0.5s processing time). This works out of the box with no local dependencies.
|
|
1114
1114
|
|
|
1115
|
-
|
|
1115
|
+
Screenshots are sent over HTTPS to our cloud endpoint for processing and immediately deleted after recognition — no images are stored.
|
|
1116
1116
|
|
|
1117
|
-
|
|
1117
|
+
### Offline Fallback (EasyOCR)
|
|
1118
|
+
|
|
1119
|
+
If the cloud endpoint is unreachable (no internet, timeout), OCR falls back to local EasyOCR (Python-based). This requires Python 3.6+:
|
|
1118
1120
|
|
|
1119
1121
|
```bash
|
|
1120
1122
|
# macOS
|
|
@@ -1122,40 +1124,20 @@ brew install python@3.11
|
|
|
1122
1124
|
|
|
1123
1125
|
# Ubuntu/Debian
|
|
1124
1126
|
sudo apt install python3
|
|
1125
|
-
|
|
1126
|
-
# Windows
|
|
1127
|
-
# Download from https://www.python.org/downloads/
|
|
1128
1127
|
```
|
|
1129
1128
|
|
|
1130
|
-
|
|
1129
|
+
EasyOCR and its Python dependencies are installed automatically by `node-easyocr`. The local fallback is slower (~2-3s) and less accurate (~85-90%) but works offline.
|
|
1131
1130
|
|
|
1132
1131
|
### OCR Language Configuration
|
|
1133
1132
|
|
|
1134
|
-
|
|
1133
|
+
Google Cloud Vision automatically detects and recognizes text in most languages without configuration.
|
|
1134
|
+
|
|
1135
|
+
For the offline EasyOCR fallback, set `EASYOCR_LANGUAGES` to add language support:
|
|
1135
1136
|
|
|
1136
1137
|
```bash
|
|
1137
|
-
# Add Spanish and French (English always included)
|
|
1138
1138
|
EASYOCR_LANGUAGES=es,fr
|
|
1139
1139
|
```
|
|
1140
1140
|
|
|
1141
|
-
Add to your MCP configuration:
|
|
1142
|
-
|
|
1143
|
-
```json
|
|
1144
|
-
{
|
|
1145
|
-
"mcpServers": {
|
|
1146
|
-
"rn-debugger": {
|
|
1147
|
-
"command": "npx",
|
|
1148
|
-
"args": ["react-native-ai-devtools"],
|
|
1149
|
-
"env": {
|
|
1150
|
-
"EASYOCR_LANGUAGES": "es,fr"
|
|
1151
|
-
}
|
|
1152
|
-
}
|
|
1153
|
-
}
|
|
1154
|
-
}
|
|
1155
|
-
```
|
|
1156
|
-
|
|
1157
|
-
See [EasyOCR supported languages](https://www.jaided.ai/easyocr/) for the full list of language codes.
|
|
1158
|
-
|
|
1159
1141
|
### Recommended Workflow
|
|
1160
1142
|
|
|
1161
1143
|
1. **Use unified `tap`** - Handles fallback chain automatically
|
package/build/core/ocr.d.ts
CHANGED
|
@@ -51,7 +51,7 @@ export interface OCRResult {
|
|
|
51
51
|
words: OCRWord[];
|
|
52
52
|
lines: OCRLine[];
|
|
53
53
|
processingTimeMs: number;
|
|
54
|
-
engine: "easyocr";
|
|
54
|
+
engine: "easyocr" | "cloud";
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
57
|
* Infer iOS device pixel ratio from screenshot dimensions
|
|
@@ -61,8 +61,7 @@ export interface OCRResult {
|
|
|
61
61
|
*/
|
|
62
62
|
export declare function inferIOSDevicePixelRatio(width: number, height: number): number;
|
|
63
63
|
/**
|
|
64
|
-
* Run OCR
|
|
65
|
-
* Requires Python 3.6+ on the system; easyocr is provided by node-easyocr's bundled venv.
|
|
64
|
+
* Run OCR — tries cloud (Google Vision) first, falls back to local EasyOCR.
|
|
66
65
|
*/
|
|
67
66
|
export declare function recognizeText(imageBuffer: Buffer, options?: OCROptions): Promise<OCRResult>;
|
|
68
67
|
export declare function terminateOCRWorker(): Promise<void>;
|
package/build/core/ocr.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ocr.d.ts","sourceRoot":"","sources":["../../src/core/ocr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ocr.d.ts","sourceRoot":"","sources":["../../src/core/ocr.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACF,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,EAAE;QACJ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,wEAAwE;IACxE,SAAS,EAAE;QACP,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;CACL;AAED,MAAM,WAAW,UAAU;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAC7B,0GAA0G;IAC1G,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACF,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,EAAE;QACJ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,wEAAwE;IACxE,SAAS,EAAE;QACP,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;CACL;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;CAC/B;AA6GD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAsB9E;AAwID;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CASjG;AAkFD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUxD"}
|
package/build/core/ocr.js
CHANGED
|
@@ -5,6 +5,13 @@ import { existsSync } from "fs";
|
|
|
5
5
|
import { randomUUID } from "crypto";
|
|
6
6
|
import { createRequire } from "module";
|
|
7
7
|
import { spawn } from "child_process";
|
|
8
|
+
import { getInstallationId } from "./telemetry.js";
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Cloud OCR Configuration
|
|
11
|
+
// ============================================================================
|
|
12
|
+
const OCR_ENDPOINT = "https://rn-debugger-ocr.500griven.workers.dev";
|
|
13
|
+
const OCR_API_KEY = "4adf74c1f1afa5c4dc5eddcfc17787aea3b21b4a518bad27df152515d71f3d54";
|
|
14
|
+
const OCR_TIMEOUT_MS = 5_000;
|
|
8
15
|
// EasyOCR instance
|
|
9
16
|
let easyOCRInstance = null;
|
|
10
17
|
let easyOCRInitPromise = null;
|
|
@@ -130,10 +137,109 @@ function toTapCoord(ocrCoord, scaleFactor, platform, devicePixelRatio = 3) {
|
|
|
130
137
|
return platform === "ios" ? Math.round(pixelCoord / devicePixelRatio) : Math.round(pixelCoord);
|
|
131
138
|
}
|
|
132
139
|
/**
|
|
133
|
-
* Run OCR
|
|
134
|
-
*
|
|
140
|
+
* Run OCR via Cloudflare Worker → Google Cloud Vision.
|
|
141
|
+
* Returns null on failure (caller should fall back to local EasyOCR).
|
|
142
|
+
*/
|
|
143
|
+
async function recognizeTextCloud(imageBuffer, options) {
|
|
144
|
+
const scaleFactor = options?.scaleFactor ?? 1;
|
|
145
|
+
const platform = options?.platform ?? "ios";
|
|
146
|
+
const devicePixelRatio = options?.devicePixelRatio ?? 3;
|
|
147
|
+
const startTime = Date.now();
|
|
148
|
+
const body = new Uint8Array(imageBuffer);
|
|
149
|
+
const fetchOptions = {
|
|
150
|
+
method: "POST",
|
|
151
|
+
headers: {
|
|
152
|
+
"X-API-Key": OCR_API_KEY,
|
|
153
|
+
"X-Installation-Id": getInstallationId(),
|
|
154
|
+
"Content-Type": "image/png",
|
|
155
|
+
},
|
|
156
|
+
body,
|
|
157
|
+
};
|
|
158
|
+
let response;
|
|
159
|
+
try {
|
|
160
|
+
const controller = new AbortController();
|
|
161
|
+
const timeout = setTimeout(() => controller.abort(), OCR_TIMEOUT_MS);
|
|
162
|
+
response = await fetch(`${OCR_ENDPOINT}/ocr`, {
|
|
163
|
+
...fetchOptions,
|
|
164
|
+
signal: controller.signal,
|
|
165
|
+
});
|
|
166
|
+
clearTimeout(timeout);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return null; // Network error or timeout — fall back to local
|
|
170
|
+
}
|
|
171
|
+
// On 502, retry once after 500ms
|
|
172
|
+
if (response.status === 502) {
|
|
173
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
174
|
+
try {
|
|
175
|
+
const controller = new AbortController();
|
|
176
|
+
const timeout = setTimeout(() => controller.abort(), OCR_TIMEOUT_MS);
|
|
177
|
+
response = await fetch(`${OCR_ENDPOINT}/ocr`, {
|
|
178
|
+
...fetchOptions,
|
|
179
|
+
signal: controller.signal,
|
|
180
|
+
});
|
|
181
|
+
clearTimeout(timeout);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Any non-200 → fall back to local
|
|
188
|
+
if (!response.ok) {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
let data;
|
|
192
|
+
try {
|
|
193
|
+
data = (await response.json());
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
if (!data.success) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
// Map cloud response to OCRResult, computing center and tapCenter client-side
|
|
202
|
+
const words = data.words.map((w) => {
|
|
203
|
+
const centerX = Math.round((w.bbox.x0 + w.bbox.x1) / 2);
|
|
204
|
+
const centerY = Math.round((w.bbox.y0 + w.bbox.y1) / 2);
|
|
205
|
+
return {
|
|
206
|
+
text: w.text,
|
|
207
|
+
confidence: w.confidence,
|
|
208
|
+
bbox: w.bbox,
|
|
209
|
+
center: { x: centerX, y: centerY },
|
|
210
|
+
tapCenter: {
|
|
211
|
+
x: toTapCoord(centerX, scaleFactor, platform, devicePixelRatio),
|
|
212
|
+
y: toTapCoord(centerY, scaleFactor, platform, devicePixelRatio),
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
});
|
|
216
|
+
return {
|
|
217
|
+
success: true,
|
|
218
|
+
fullText: data.fullText,
|
|
219
|
+
confidence: data.confidence,
|
|
220
|
+
words,
|
|
221
|
+
lines: [],
|
|
222
|
+
processingTimeMs: Date.now() - startTime,
|
|
223
|
+
engine: "cloud",
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Run OCR — tries cloud (Google Vision) first, falls back to local EasyOCR.
|
|
135
228
|
*/
|
|
136
229
|
export async function recognizeText(imageBuffer, options) {
|
|
230
|
+
// Try cloud OCR first
|
|
231
|
+
const cloudResult = await recognizeTextCloud(imageBuffer, options);
|
|
232
|
+
if (cloudResult) {
|
|
233
|
+
return cloudResult;
|
|
234
|
+
}
|
|
235
|
+
// Fall back to local EasyOCR
|
|
236
|
+
return recognizeTextLocal(imageBuffer, options);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Run OCR using local EasyOCR (fallback).
|
|
240
|
+
* Requires Python 3.6+ on the system; easyocr is provided by node-easyocr's bundled venv.
|
|
241
|
+
*/
|
|
242
|
+
async function recognizeTextLocal(imageBuffer, options) {
|
|
137
243
|
const scaleFactor = options?.scaleFactor ?? 1;
|
|
138
244
|
const platform = options?.platform ?? "ios";
|
|
139
245
|
const devicePixelRatio = options?.devicePixelRatio ?? 3;
|
|
@@ -170,8 +276,8 @@ export async function recognizeText(imageBuffer, options) {
|
|
|
170
276
|
center: { x: centerX, y: centerY },
|
|
171
277
|
tapCenter: {
|
|
172
278
|
x: toTapCoord(centerX, scaleFactor, platform, devicePixelRatio),
|
|
173
|
-
y: toTapCoord(centerY, scaleFactor, platform, devicePixelRatio)
|
|
174
|
-
}
|
|
279
|
+
y: toTapCoord(centerY, scaleFactor, platform, devicePixelRatio),
|
|
280
|
+
},
|
|
175
281
|
});
|
|
176
282
|
textParts.push(result.text.trim());
|
|
177
283
|
totalConfidence += result.confidence;
|
|
@@ -182,9 +288,9 @@ export async function recognizeText(imageBuffer, options) {
|
|
|
182
288
|
fullText: textParts.join(" "),
|
|
183
289
|
confidence: results.length > 0 ? (totalConfidence / results.length) * 100 : 0,
|
|
184
290
|
words,
|
|
185
|
-
lines: [],
|
|
291
|
+
lines: [],
|
|
186
292
|
processingTimeMs: Date.now() - startTime,
|
|
187
|
-
engine: "easyocr"
|
|
293
|
+
engine: "easyocr",
|
|
188
294
|
};
|
|
189
295
|
}
|
|
190
296
|
finally {
|
package/build/core/ocr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ocr.js","sourceRoot":"","sources":["../../src/core/ocr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ocr.js","sourceRoot":"","sources":["../../src/core/ocr.ts"],"names":[],"mappings":"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"}
|