mobile-device-mcp 0.1.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 (74) hide show
  1. package/README.md +181 -0
  2. package/dist/ai/analyzer.d.ts +98 -0
  3. package/dist/ai/analyzer.d.ts.map +1 -0
  4. package/dist/ai/analyzer.js +451 -0
  5. package/dist/ai/analyzer.js.map +1 -0
  6. package/dist/ai/client.d.ts +92 -0
  7. package/dist/ai/client.d.ts.map +1 -0
  8. package/dist/ai/client.js +281 -0
  9. package/dist/ai/client.js.map +1 -0
  10. package/dist/ai/element-search.d.ts +12 -0
  11. package/dist/ai/element-search.d.ts.map +1 -0
  12. package/dist/ai/element-search.js +387 -0
  13. package/dist/ai/element-search.js.map +1 -0
  14. package/dist/ai/prompts.d.ts +27 -0
  15. package/dist/ai/prompts.d.ts.map +1 -0
  16. package/dist/ai/prompts.js +153 -0
  17. package/dist/ai/prompts.js.map +1 -0
  18. package/dist/drivers/android/adb.d.ts +21 -0
  19. package/dist/drivers/android/adb.d.ts.map +1 -0
  20. package/dist/drivers/android/adb.js +122 -0
  21. package/dist/drivers/android/adb.js.map +1 -0
  22. package/dist/drivers/android/index.d.ts +70 -0
  23. package/dist/drivers/android/index.d.ts.map +1 -0
  24. package/dist/drivers/android/index.js +529 -0
  25. package/dist/drivers/android/index.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +131 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/server.d.ts +13 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +41 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/tools/ai-tools.d.ts +11 -0
  35. package/dist/tools/ai-tools.d.ts.map +1 -0
  36. package/dist/tools/ai-tools.js +238 -0
  37. package/dist/tools/ai-tools.js.map +1 -0
  38. package/dist/tools/app-tools.d.ts +4 -0
  39. package/dist/tools/app-tools.d.ts.map +1 -0
  40. package/dist/tools/app-tools.js +222 -0
  41. package/dist/tools/app-tools.js.map +1 -0
  42. package/dist/tools/device-tools.d.ts +4 -0
  43. package/dist/tools/device-tools.d.ts.map +1 -0
  44. package/dist/tools/device-tools.js +104 -0
  45. package/dist/tools/device-tools.js.map +1 -0
  46. package/dist/tools/index.d.ts +21 -0
  47. package/dist/tools/index.d.ts.map +1 -0
  48. package/dist/tools/index.js +30 -0
  49. package/dist/tools/index.js.map +1 -0
  50. package/dist/tools/interaction-tools.d.ts +4 -0
  51. package/dist/tools/interaction-tools.d.ts.map +1 -0
  52. package/dist/tools/interaction-tools.js +304 -0
  53. package/dist/tools/interaction-tools.js.map +1 -0
  54. package/dist/tools/log-tools.d.ts +4 -0
  55. package/dist/tools/log-tools.d.ts.map +1 -0
  56. package/dist/tools/log-tools.js +60 -0
  57. package/dist/tools/log-tools.js.map +1 -0
  58. package/dist/tools/screen-tools.d.ts +4 -0
  59. package/dist/tools/screen-tools.d.ts.map +1 -0
  60. package/dist/tools/screen-tools.js +105 -0
  61. package/dist/tools/screen-tools.js.map +1 -0
  62. package/dist/types.d.ts +219 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +19 -0
  65. package/dist/types.js.map +1 -0
  66. package/dist/utils/discovery.d.ts +20 -0
  67. package/dist/utils/discovery.d.ts.map +1 -0
  68. package/dist/utils/discovery.js +156 -0
  69. package/dist/utils/discovery.js.map +1 -0
  70. package/dist/utils/image.d.ts +46 -0
  71. package/dist/utils/image.d.ts.map +1 -0
  72. package/dist/utils/image.js +170 -0
  73. package/dist/utils/image.js.map +1 -0
  74. package/package.json +69 -0
@@ -0,0 +1,387 @@
1
+ // ============================================================
2
+ // Local Element Search — Fast UI tree search without AI calls
3
+ //
4
+ // Searches UIElement[] by text, content description, resource ID,
5
+ // and class name. Returns an ElementMatch compatible with the AI
6
+ // findElement response so callers can use it as a drop-in fast
7
+ // path before falling back to the AI.
8
+ // ============================================================
9
+ // ----------------------------------------------------------
10
+ // Number-word mapping for natural language queries
11
+ // ----------------------------------------------------------
12
+ const WORD_TO_DIGIT = {
13
+ zero: "0",
14
+ one: "1",
15
+ two: "2",
16
+ three: "3",
17
+ four: "4",
18
+ five: "5",
19
+ six: "6",
20
+ seven: "7",
21
+ eight: "8",
22
+ nine: "9",
23
+ ten: "10",
24
+ };
25
+ const DIGIT_TO_WORD = {};
26
+ for (const [word, digit] of Object.entries(WORD_TO_DIGIT)) {
27
+ DIGIT_TO_WORD[digit] = word;
28
+ }
29
+ // Common UI label aliases — maps user-friendly terms to what Android actually uses
30
+ const ALIASES = {
31
+ ac: ["clear", "clr", "all_clear"],
32
+ "all clear": ["clear", "clr", "ac"],
33
+ clear: ["clr", "ac", "all_clear"],
34
+ delete: ["del", "backspace"],
35
+ backspace: ["del", "delete"],
36
+ back: ["navigate_up", "back"],
37
+ close: ["dismiss", "close", "cancel"],
38
+ cancel: ["dismiss", "close", "cancel"],
39
+ ok: ["confirm", "accept", "done"],
40
+ confirm: ["ok", "accept", "done"],
41
+ search: ["search", "find", "query"],
42
+ settings: ["settings", "preferences", "gear"],
43
+ more: ["more_options", "overflow", "menu"],
44
+ share: ["share", "send"],
45
+ add: ["add", "plus", "new", "create"],
46
+ subtract: ["minus", "subtract"],
47
+ minus: ["subtract", "minus"],
48
+ divide: ["division", "divide"],
49
+ enter: ["return", "submit", "done"],
50
+ submit: ["enter", "return", "done"],
51
+ };
52
+ // Words that provide type hints but are not part of the search text
53
+ const TYPE_HINT_WORDS = new Set([
54
+ "button",
55
+ "field",
56
+ "input",
57
+ "text",
58
+ "label",
59
+ "icon",
60
+ "image",
61
+ "checkbox",
62
+ "switch",
63
+ "toggle",
64
+ "link",
65
+ "tab",
66
+ "menu",
67
+ "item",
68
+ "option",
69
+ "card",
70
+ "toolbar",
71
+ ]);
72
+ // Filler words to strip from queries
73
+ const FILLER_WORDS = new Set([
74
+ "the",
75
+ "a",
76
+ "an",
77
+ "that",
78
+ "this",
79
+ "which",
80
+ "with",
81
+ "for",
82
+ "on",
83
+ "at",
84
+ "in",
85
+ "of",
86
+ "to",
87
+ "says",
88
+ "saying",
89
+ "labeled",
90
+ "labelled",
91
+ "called",
92
+ "named",
93
+ "number",
94
+ "digit",
95
+ ]);
96
+ function parseQuery(query) {
97
+ const raw = query.toLowerCase().trim();
98
+ const words = raw.split(/\s+/);
99
+ const searchTokens = [];
100
+ const typeHints = [];
101
+ const numericVariants = [];
102
+ const aliasVariants = [];
103
+ for (const word of words) {
104
+ if (FILLER_WORDS.has(word))
105
+ continue;
106
+ if (TYPE_HINT_WORDS.has(word)) {
107
+ typeHints.push(word);
108
+ continue;
109
+ }
110
+ // Convert number words to digits and vice versa
111
+ if (WORD_TO_DIGIT[word]) {
112
+ const digit = WORD_TO_DIGIT[word];
113
+ searchTokens.push(digit);
114
+ numericVariants.push(word);
115
+ }
116
+ else if (DIGIT_TO_WORD[word]) {
117
+ searchTokens.push(word);
118
+ numericVariants.push(DIGIT_TO_WORD[word]);
119
+ }
120
+ else {
121
+ searchTokens.push(word);
122
+ }
123
+ // Expand aliases for all non-filler words
124
+ if (ALIASES[word]) {
125
+ aliasVariants.push(...ALIASES[word]);
126
+ }
127
+ }
128
+ // Also check multi-word aliases (e.g., "all clear")
129
+ const joined = words.filter(w => !FILLER_WORDS.has(w)).join(" ");
130
+ if (ALIASES[joined]) {
131
+ aliasVariants.push(...ALIASES[joined]);
132
+ }
133
+ // If all words were fillers/hints, use the full raw query minus fillers
134
+ if (searchTokens.length === 0) {
135
+ // Use type hints as search tokens as fallback
136
+ searchTokens.push(...typeHints);
137
+ }
138
+ return { raw, searchTokens, typeHints, numericVariants, aliasVariants };
139
+ }
140
+ /**
141
+ * Map simplified class name to AnalyzedElement type.
142
+ */
143
+ function classNameToType(className) {
144
+ const simple = className.toLowerCase();
145
+ if (simple.includes("button"))
146
+ return "button";
147
+ if (simple.includes("edittext") || simple.includes("textfield"))
148
+ return "text_field";
149
+ if (simple.includes("checkbox"))
150
+ return "checkbox";
151
+ if (simple.includes("switch") || simple.includes("toggle"))
152
+ return "switch";
153
+ if (simple.includes("image"))
154
+ return "image";
155
+ if (simple.includes("tab"))
156
+ return "tab";
157
+ if (simple.includes("textview") || simple.includes("text"))
158
+ return "text";
159
+ return "other";
160
+ }
161
+ /**
162
+ * Map class name to a suggested action.
163
+ */
164
+ function suggestedActionForClass(className) {
165
+ const simple = className.toLowerCase();
166
+ if (simple.includes("edittext") || simple.includes("textfield"))
167
+ return "type";
168
+ if (simple.includes("scroll"))
169
+ return "scroll";
170
+ return "tap";
171
+ }
172
+ /**
173
+ * Flatten the element tree, collecting all elements with their children recursively.
174
+ */
175
+ function flattenElements(elements) {
176
+ const result = [];
177
+ function walk(els) {
178
+ for (const el of els) {
179
+ result.push(el);
180
+ if (el.children) {
181
+ walk(el.children);
182
+ }
183
+ }
184
+ }
185
+ walk(elements);
186
+ return result;
187
+ }
188
+ /**
189
+ * Get the stripped resource ID (after the last '/').
190
+ */
191
+ function stripResourceId(resourceId) {
192
+ const slash = resourceId.lastIndexOf("/");
193
+ return slash >= 0 ? resourceId.slice(slash + 1) : resourceId;
194
+ }
195
+ /**
196
+ * Score a single element against the parsed query.
197
+ * Returns a score from 0.0 to 1.0 and a match reason.
198
+ */
199
+ function scoreElement(el, pq) {
200
+ let bestScore = 0;
201
+ let bestReason = "";
202
+ const elText = el.text.toLowerCase();
203
+ const elDesc = el.contentDescription.toLowerCase();
204
+ const elId = stripResourceId(el.resourceId).toLowerCase();
205
+ const elClass = el.className.toLowerCase();
206
+ // All search tokens joined
207
+ const searchString = pq.searchTokens.join(" ");
208
+ // Also build variant strings that include numeric word forms and aliases
209
+ const allVariants = [...pq.searchTokens, ...pq.numericVariants, ...pq.aliasVariants];
210
+ // ---- Strategy 1: Exact text match (highest confidence) ----
211
+ if (elText && elText === searchString) {
212
+ bestScore = 1.0;
213
+ bestReason = `Exact text match: "${el.text}"`;
214
+ }
215
+ // ---- Strategy 2: Text contains all search tokens ----
216
+ if (bestScore < 0.95 && elText) {
217
+ const tokensMatched = pq.searchTokens.filter((t) => elText.includes(t)).length;
218
+ if (tokensMatched === pq.searchTokens.length && pq.searchTokens.length > 0) {
219
+ // All tokens found in text
220
+ const ratio = searchString.length / Math.max(elText.length, 1);
221
+ const score = 0.85 + 0.1 * Math.min(ratio, 1);
222
+ if (score > bestScore) {
223
+ bestScore = score;
224
+ bestReason = `Text contains all tokens: "${el.text}"`;
225
+ }
226
+ }
227
+ else if (tokensMatched > 0) {
228
+ const score = 0.5 * (tokensMatched / pq.searchTokens.length);
229
+ if (score > bestScore) {
230
+ bestScore = score;
231
+ bestReason = `Text partial match: "${el.text}"`;
232
+ }
233
+ }
234
+ }
235
+ // ---- Strategy 2b: Text matches numeric variants ----
236
+ if (bestScore < 0.9 && elText && pq.numericVariants.length > 0) {
237
+ const variantsMatched = allVariants.filter((v) => elText.includes(v)).length;
238
+ if (variantsMatched > 0) {
239
+ const score = 0.8 * (variantsMatched / allVariants.length);
240
+ if (score > bestScore) {
241
+ bestScore = score;
242
+ bestReason = `Text matches numeric variant: "${el.text}"`;
243
+ }
244
+ }
245
+ }
246
+ // ---- Strategy 3: Content description match ----
247
+ if (bestScore < 0.9 && elDesc) {
248
+ // Exact match on search string
249
+ if (elDesc === searchString) {
250
+ const score = 0.95;
251
+ if (score > bestScore) {
252
+ bestScore = score;
253
+ bestReason = `Exact content description match: "${el.contentDescription}"`;
254
+ }
255
+ }
256
+ // Exact match on an alias variant (e.g., "AC" → desc="clear")
257
+ if (bestScore < 0.9 && pq.aliasVariants.some((a) => elDesc === a)) {
258
+ const score = 0.9;
259
+ if (score > bestScore) {
260
+ bestScore = score;
261
+ bestReason = `Alias match on content description: "${el.contentDescription}"`;
262
+ }
263
+ }
264
+ // Partial token/variant match
265
+ if (bestScore < 0.85) {
266
+ const tokensMatched = allVariants.filter((t) => elDesc.includes(t)).length;
267
+ if (tokensMatched > 0) {
268
+ // Use max of search tokens and alias variants separately to avoid dilution
269
+ const searchMatched = pq.searchTokens.filter((t) => elDesc.includes(t)).length;
270
+ const aliasMatched = pq.aliasVariants.filter((t) => elDesc.includes(t)).length;
271
+ const bestRatio = Math.max(pq.searchTokens.length > 0 ? searchMatched / pq.searchTokens.length : 0, pq.aliasVariants.length > 0 ? aliasMatched / pq.aliasVariants.length : 0);
272
+ const score = 0.7 * bestRatio;
273
+ if (score > bestScore) {
274
+ bestScore = score;
275
+ bestReason = `Content description match: "${el.contentDescription}"`;
276
+ }
277
+ }
278
+ }
279
+ }
280
+ // ---- Strategy 3b: Alias matches on text ----
281
+ if (bestScore < 0.9 && elText && pq.aliasVariants.length > 0) {
282
+ if (pq.aliasVariants.some((a) => elText === a)) {
283
+ const score = 0.9;
284
+ if (score > bestScore) {
285
+ bestScore = score;
286
+ bestReason = `Alias match on text: "${el.text}"`;
287
+ }
288
+ }
289
+ }
290
+ // ---- Strategy 4: Resource ID match ----
291
+ if (bestScore < 0.85 && elId) {
292
+ // Resource IDs use snake_case, so split on underscores
293
+ const idParts = elId.split(/[_\-]/);
294
+ // Exact alias match on resource ID
295
+ if (pq.aliasVariants.some((a) => idParts.includes(a))) {
296
+ const score = 0.8;
297
+ if (score > bestScore) {
298
+ bestScore = score;
299
+ bestReason = `Alias match on resource ID: "${el.resourceId}"`;
300
+ }
301
+ }
302
+ // Partial token match
303
+ if (bestScore < 0.75) {
304
+ const tokensMatched = pq.searchTokens.filter((t) => idParts.some((p) => p === t || p.includes(t))).length;
305
+ if (tokensMatched > 0) {
306
+ const score = 0.6 * (tokensMatched / pq.searchTokens.length);
307
+ if (score > bestScore) {
308
+ bestScore = score;
309
+ bestReason = `Resource ID match: "${el.resourceId}"`;
310
+ }
311
+ }
312
+ }
313
+ }
314
+ // ---- Strategy 5: Class name hint match ----
315
+ if (pq.typeHints.length > 0 && bestScore > 0) {
316
+ // Boost score if the type hint matches the element class
317
+ const classMatches = pq.typeHints.some((hint) => elClass.includes(hint));
318
+ if (classMatches) {
319
+ bestScore = Math.min(bestScore + 0.1, 1.0);
320
+ bestReason += " (type hint match)";
321
+ }
322
+ }
323
+ // ---- Penalty: non-interactive elements get a small penalty ----
324
+ if (!el.clickable && !el.focusable && !el.scrollable) {
325
+ bestScore *= 0.9;
326
+ }
327
+ // ---- Penalty: empty/invisible elements ----
328
+ if (el.bounds.left === el.bounds.right || el.bounds.top === el.bounds.bottom) {
329
+ bestScore *= 0.1;
330
+ }
331
+ return { element: el, score: bestScore, matchReason: bestReason };
332
+ }
333
+ // ----------------------------------------------------------
334
+ // Public API
335
+ // ----------------------------------------------------------
336
+ /**
337
+ * Search UI elements locally by text matching.
338
+ * This is INSTANT and FREE — no AI API call needed.
339
+ * Falls back to AI only when local search fails (returns found: false).
340
+ *
341
+ * @param elements - The UI element tree from the device
342
+ * @param query - Natural language query like "the number 7 button"
343
+ * @returns An ElementMatch result compatible with AI findElement output
344
+ */
345
+ export function searchElementsLocally(elements, query) {
346
+ if (!elements || elements.length === 0) {
347
+ return { found: false, confidence: 0 };
348
+ }
349
+ const pq = parseQuery(query);
350
+ // If we couldn't extract any meaningful tokens, bail out to AI
351
+ if (pq.searchTokens.length === 0) {
352
+ return { found: false, confidence: 0 };
353
+ }
354
+ // Flatten the tree and score every element
355
+ const flat = flattenElements(elements);
356
+ const scored = flat
357
+ .map((el) => scoreElement(el, pq))
358
+ .filter((s) => s.score > 0)
359
+ .sort((a, b) => b.score - a.score);
360
+ if (scored.length === 0) {
361
+ return { found: false, confidence: 0 };
362
+ }
363
+ const best = scored[0];
364
+ // Convert UIElement to AnalyzedElement
365
+ function toAnalyzed(se) {
366
+ const el = se.element;
367
+ return {
368
+ description: se.matchReason,
369
+ type: classNameToType(el.className),
370
+ text: el.text || el.contentDescription,
371
+ bounds: { ...el.bounds },
372
+ suggestedAction: suggestedActionForClass(el.className),
373
+ confidence: se.score,
374
+ };
375
+ }
376
+ const alternatives = scored
377
+ .slice(1, 4) // up to 3 runners-up
378
+ .filter((s) => s.score > 0.2)
379
+ .map(toAnalyzed);
380
+ return {
381
+ found: best.score > 0.7,
382
+ element: toAnalyzed(best),
383
+ confidence: best.score,
384
+ alternatives,
385
+ };
386
+ }
387
+ //# sourceMappingURL=element-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-search.js","sourceRoot":"","sources":["../../src/ai/element-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { UIElement } from '../types.js';
2
+ export interface UIElementSummary {
3
+ idx: number;
4
+ text: string;
5
+ desc: string;
6
+ type: string;
7
+ id: string;
8
+ cx: number;
9
+ cy: number;
10
+ actions: string[];
11
+ }
12
+ export declare const PROMPTS: {
13
+ readonly ANALYZE_SCREEN: "You are a mobile app screenshot analyzer. Return ONLY valid JSON, no markdown or explanation.\n\nCoordinate system: origin (0,0) at top-left, x increases right, y increases down.\n\nJSON schema:\n{\"description\":\"string\",\"appName\":\"string\",\"screenType\":\"string\",\"elements\":[{\"description\":\"string\",\"type\":\"string\",\"text\":\"string\",\"bounds\":{\"left\":0,\"top\":0,\"right\":0,\"bottom\":0,\"centerX\":0,\"centerY\":0},\"suggestedAction\":\"string\",\"confidence\":0.0}],\"visibleText\":[\"string\"],\"suggestions\":[\"string\"]}\n\nscreenType: one of \"login\",\"settings\",\"list\",\"detail\",\"dialog\",\"home\",\"search\",\"menu\",\"form\",\"media\",\"navigation\",\"error\",\"loading\",\"onboarding\",\"other\".\ntype: one of \"button\",\"text_field\",\"checkbox\",\"switch\",\"icon\",\"image\",\"link\",\"tab\",\"text\",\"toolbar\",\"menu_item\",\"list_item\",\"card\",\"other\".\nsuggestedAction: one of \"tap\",\"type\",\"scroll\",\"long_press\",\"swipe\",\"none\".\nconfidence: 0.0 to 1.0.\n\nIdentify all interactive elements with precise bounding boxes. Include all visible text strings.";
14
+ readonly FIND_ELEMENT: "You are a UI element locator for mobile app screenshots. Return ONLY valid JSON, no markdown or explanation.\n\nCoordinate system: origin (0,0) at top-left, x increases right, y increases down.\n\nJSON schema:\n{\"found\":true,\"element\":{\"description\":\"string\",\"type\":\"string\",\"text\":\"string\",\"bounds\":{\"left\":0,\"top\":0,\"right\":0,\"bottom\":0,\"centerX\":0,\"centerY\":0},\"suggestedAction\":\"string\",\"confidence\":0.0},\"confidence\":0.0,\"alternatives\":[]}\n\nIf no match, set found=false, element=null, confidence=0, and list any partial matches in alternatives.\nconfidence: 0.0 to 1.0. Return the single best match as element, up to 3 runners-up in alternatives.";
15
+ readonly SUGGEST_ACTIONS: "You are a mobile app automation planner. Given the current screen and a goal, plan a sequence of actions. Return ONLY valid JSON, no markdown or explanation.\n\nCoordinate system: origin (0,0) at top-left, x increases right, y increases down.\n\nJSON schema:\n{\"goal\":\"string\",\"steps\":[{\"step\":1,\"action\":\"tap\",\"target\":\"string\",\"coordinates\":{\"x\":0,\"y\":0},\"text\":null,\"key\":null,\"swipe\":null,\"description\":\"string\"}]}\n\naction: one of \"tap\",\"type\",\"swipe\",\"press_key\",\"wait\",\"long_press\".\nFor \"type\": set text to the string to enter.\nFor \"press_key\": set key (e.g. \"KEYCODE_BACK\",\"KEYCODE_HOME\",\"KEYCODE_ENTER\").\nFor \"swipe\": set swipe to {\"startX\":0,\"startY\":0,\"endX\":0,\"endY\":0}.\nFor \"wait\": coordinates may be null.\nProvide precise coordinates for tap/long_press targets. Keep steps minimal.";
16
+ readonly VISUAL_DIFF: "You are a visual diff analyzer for mobile app screenshots. You will receive two images: the first is \"before\", the second is \"after\". Return ONLY valid JSON, no markdown or explanation.\n\nJSON schema:\n{\"hasChanges\":true,\"summary\":\"string\",\"changes\":[{\"description\":\"string\",\"region\":\"string\",\"type\":\"added|removed|changed\"}]}\n\nregion: one of \"top-left\",\"top-center\",\"top-right\",\"center-left\",\"center\",\"center-right\",\"bottom-left\",\"bottom-center\",\"bottom-right\".\ntype: one of \"added\",\"removed\",\"changed\".\nIf screens are identical, set hasChanges=false, summary=\"No changes detected\", changes=[].";
17
+ readonly EXTRACT_TEXT: "You are an OCR engine for mobile app screenshots. Extract every readable text element. Return ONLY valid JSON, no markdown or explanation.\n\nJSON schema:\n{\"texts\":[\"string\"]}\n\nRead in order: top to bottom, left to right. Include all labels, buttons, headers, body text, hints, placeholders, status bar text, and navigation items. Preserve original casing and punctuation.";
18
+ readonly VERIFY_SCREEN: "You are a screen state verifier for mobile app testing. Check whether a given assertion holds true for the screenshot. Return ONLY valid JSON, no markdown or explanation.\n\nJSON schema:\n{\"verified\":true,\"confidence\":0.0,\"details\":\"string\",\"evidence\":[\"string\"]}\n\nverified: true if assertion holds, false otherwise.\nconfidence: 0.0 to 1.0.\ndetails: brief explanation of your judgment.\nevidence: list of specific visual observations supporting your conclusion.";
19
+ };
20
+ export declare function summarizeUIElements(elements: UIElement[]): UIElementSummary[];
21
+ export declare function buildAnalyzeScreenPrompt(uiElements?: UIElementSummary[]): string;
22
+ export declare function buildFindElementPrompt(query: string, uiElements?: UIElementSummary[]): string;
23
+ export declare function buildSuggestActionsPrompt(goal: string, currentApp?: string, uiElements?: UIElementSummary[]): string;
24
+ export declare function buildVisualDiffPrompt(): string;
25
+ export declare function buildExtractTextPrompt(): string;
26
+ export declare function buildVerifyScreenPrompt(assertion: string, uiElements?: UIElementSummary[]): string;
27
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ai/prompts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAsED,eAAO,MAAM,OAAO;;;;;;;CAOV,CAAC;AAMX,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,gBAAgB,EAAE,CAI7E;AA4DD,wBAAgB,wBAAwB,CAAC,UAAU,CAAC,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAEhF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAE7F;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,gBAAgB,EAAE,GAC9B,MAAM,CAGR;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,gBAAgB,EAAE,GAC9B,MAAM,CAER"}
@@ -0,0 +1,153 @@
1
+ // ============================================================
2
+ // AI Visual Analysis — System Prompts & User Prompt Builders
3
+ // ============================================================
4
+ // ----------------------------------------------------------
5
+ // System Prompts
6
+ // ----------------------------------------------------------
7
+ const ANALYZE_SCREEN = `You are a mobile app screenshot analyzer. Return ONLY valid JSON, no markdown or explanation.
8
+
9
+ Coordinate system: origin (0,0) at top-left, x increases right, y increases down.
10
+
11
+ JSON schema:
12
+ {"description":"string","appName":"string","screenType":"string","elements":[{"description":"string","type":"string","text":"string","bounds":{"left":0,"top":0,"right":0,"bottom":0,"centerX":0,"centerY":0},"suggestedAction":"string","confidence":0.0}],"visibleText":["string"],"suggestions":["string"]}
13
+
14
+ screenType: one of "login","settings","list","detail","dialog","home","search","menu","form","media","navigation","error","loading","onboarding","other".
15
+ type: one of "button","text_field","checkbox","switch","icon","image","link","tab","text","toolbar","menu_item","list_item","card","other".
16
+ suggestedAction: one of "tap","type","scroll","long_press","swipe","none".
17
+ confidence: 0.0 to 1.0.
18
+
19
+ Identify all interactive elements with precise bounding boxes. Include all visible text strings.`;
20
+ const FIND_ELEMENT = `You are a UI element locator for mobile app screenshots. Return ONLY valid JSON, no markdown or explanation.
21
+
22
+ Coordinate system: origin (0,0) at top-left, x increases right, y increases down.
23
+
24
+ JSON schema:
25
+ {"found":true,"element":{"description":"string","type":"string","text":"string","bounds":{"left":0,"top":0,"right":0,"bottom":0,"centerX":0,"centerY":0},"suggestedAction":"string","confidence":0.0},"confidence":0.0,"alternatives":[]}
26
+
27
+ If no match, set found=false, element=null, confidence=0, and list any partial matches in alternatives.
28
+ confidence: 0.0 to 1.0. Return the single best match as element, up to 3 runners-up in alternatives.`;
29
+ const SUGGEST_ACTIONS = `You are a mobile app automation planner. Given the current screen and a goal, plan a sequence of actions. Return ONLY valid JSON, no markdown or explanation.
30
+
31
+ Coordinate system: origin (0,0) at top-left, x increases right, y increases down.
32
+
33
+ JSON schema:
34
+ {"goal":"string","steps":[{"step":1,"action":"tap","target":"string","coordinates":{"x":0,"y":0},"text":null,"key":null,"swipe":null,"description":"string"}]}
35
+
36
+ action: one of "tap","type","swipe","press_key","wait","long_press".
37
+ For "type": set text to the string to enter.
38
+ For "press_key": set key (e.g. "KEYCODE_BACK","KEYCODE_HOME","KEYCODE_ENTER").
39
+ For "swipe": set swipe to {"startX":0,"startY":0,"endX":0,"endY":0}.
40
+ For "wait": coordinates may be null.
41
+ Provide precise coordinates for tap/long_press targets. Keep steps minimal.`;
42
+ const VISUAL_DIFF = `You are a visual diff analyzer for mobile app screenshots. You will receive two images: the first is "before", the second is "after". Return ONLY valid JSON, no markdown or explanation.
43
+
44
+ JSON schema:
45
+ {"hasChanges":true,"summary":"string","changes":[{"description":"string","region":"string","type":"added|removed|changed"}]}
46
+
47
+ region: one of "top-left","top-center","top-right","center-left","center","center-right","bottom-left","bottom-center","bottom-right".
48
+ type: one of "added","removed","changed".
49
+ If screens are identical, set hasChanges=false, summary="No changes detected", changes=[].`;
50
+ const EXTRACT_TEXT = `You are an OCR engine for mobile app screenshots. Extract every readable text element. Return ONLY valid JSON, no markdown or explanation.
51
+
52
+ JSON schema:
53
+ {"texts":["string"]}
54
+
55
+ Read in order: top to bottom, left to right. Include all labels, buttons, headers, body text, hints, placeholders, status bar text, and navigation items. Preserve original casing and punctuation.`;
56
+ const VERIFY_SCREEN = `You are a screen state verifier for mobile app testing. Check whether a given assertion holds true for the screenshot. Return ONLY valid JSON, no markdown or explanation.
57
+
58
+ JSON schema:
59
+ {"verified":true,"confidence":0.0,"details":"string","evidence":["string"]}
60
+
61
+ verified: true if assertion holds, false otherwise.
62
+ confidence: 0.0 to 1.0.
63
+ details: brief explanation of your judgment.
64
+ evidence: list of specific visual observations supporting your conclusion.`;
65
+ export const PROMPTS = {
66
+ ANALYZE_SCREEN,
67
+ FIND_ELEMENT,
68
+ SUGGEST_ACTIONS,
69
+ VISUAL_DIFF,
70
+ EXTRACT_TEXT,
71
+ VERIFY_SCREEN,
72
+ };
73
+ // ----------------------------------------------------------
74
+ // Helper: summarize UIElement[] into compact form
75
+ // ----------------------------------------------------------
76
+ export function summarizeUIElements(elements) {
77
+ const results = [];
78
+ flattenAndSummarize(elements, results);
79
+ return results;
80
+ }
81
+ function flattenAndSummarize(elements, out) {
82
+ for (const el of elements) {
83
+ const actions = [];
84
+ if (el.clickable)
85
+ actions.push('tap');
86
+ if (el.scrollable)
87
+ actions.push('scroll');
88
+ if (el.focusable)
89
+ actions.push('focus');
90
+ // Only include elements that have at least some useful info
91
+ const hasText = el.text.length > 0;
92
+ const hasDesc = el.contentDescription.length > 0;
93
+ const hasId = el.resourceId.length > 0;
94
+ const hasActions = actions.length > 0;
95
+ if (hasText || hasDesc || hasId || hasActions) {
96
+ out.push({
97
+ idx: el.index,
98
+ text: el.text,
99
+ desc: el.contentDescription,
100
+ type: simplifyClassName(el.className),
101
+ id: stripPackageFromId(el.resourceId),
102
+ cx: el.bounds.centerX,
103
+ cy: el.bounds.centerY,
104
+ actions,
105
+ });
106
+ }
107
+ if (el.children) {
108
+ flattenAndSummarize(el.children, out);
109
+ }
110
+ }
111
+ }
112
+ function simplifyClassName(className) {
113
+ // "android.widget.Button" → "Button"
114
+ // "com.example.custom.MyView" → "MyView"
115
+ const dot = className.lastIndexOf('.');
116
+ return dot >= 0 ? className.slice(dot + 1) : className;
117
+ }
118
+ function stripPackageFromId(resourceId) {
119
+ // "com.example.app:id/login_btn" → "login_btn"
120
+ const slash = resourceId.lastIndexOf('/');
121
+ return slash >= 0 ? resourceId.slice(slash + 1) : resourceId;
122
+ }
123
+ // ----------------------------------------------------------
124
+ // Format UI tree summary as compact string for prompt injection
125
+ // ----------------------------------------------------------
126
+ function formatUITreeContext(uiElements) {
127
+ if (!uiElements || uiElements.length === 0)
128
+ return '';
129
+ return `\n\nUI element tree:\n${JSON.stringify(uiElements)}`;
130
+ }
131
+ // ----------------------------------------------------------
132
+ // User Prompt Builders
133
+ // ----------------------------------------------------------
134
+ export function buildAnalyzeScreenPrompt(uiElements) {
135
+ return `Analyze this mobile app screenshot.${formatUITreeContext(uiElements)}`;
136
+ }
137
+ export function buildFindElementPrompt(query, uiElements) {
138
+ return `Find the element matching: '${query}'${formatUITreeContext(uiElements)}`;
139
+ }
140
+ export function buildSuggestActionsPrompt(goal, currentApp, uiElements) {
141
+ const appCtx = currentApp ? ` Current app: ${currentApp}.` : '';
142
+ return `I want to: ${goal}.${appCtx}${formatUITreeContext(uiElements)}`;
143
+ }
144
+ export function buildVisualDiffPrompt() {
145
+ return 'Compare these two mobile app screenshots and describe what changed.';
146
+ }
147
+ export function buildExtractTextPrompt() {
148
+ return 'Extract all visible text from this mobile app screenshot.';
149
+ }
150
+ export function buildVerifyScreenPrompt(assertion, uiElements) {
151
+ return `Verify: ${assertion}${formatUITreeContext(uiElements)}`;
152
+ }
153
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ai/prompts.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,6DAA6D;AAC7D,+DAA+D;AAmB/D,6DAA6D;AAC7D,iBAAiB;AACjB,6DAA6D;AAE7D,MAAM,cAAc,GAAG;;;;;;;;;;;;iGAY0E,CAAC;AAElG,MAAM,YAAY,GAAG;;;;;;;;qGAQgF,CAAC;AAEtG,MAAM,eAAe,GAAG;;;;;;;;;;;;4EAYoD,CAAC;AAE7E,MAAM,WAAW,GAAG;;;;;;;2FAOuE,CAAC;AAE5F,MAAM,YAAY,GAAG;;;;;oMAK+K,CAAC;AAErM,MAAM,aAAa,GAAG;;;;;;;;2EAQqD,CAAC;AAE5E,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,cAAc;IACd,YAAY;IACZ,eAAe;IACf,WAAW;IACX,YAAY;IACZ,aAAa;CACL,CAAC;AAEX,6DAA6D;AAC7D,kDAAkD;AAClD,6DAA6D;AAE7D,MAAM,UAAU,mBAAmB,CAAC,QAAqB;IACvD,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAqB,EAAE,GAAuB;IACzE,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC,UAAU;YAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,EAAE,CAAC,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAExC,4DAA4D;QAC5D,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAEtC,IAAI,OAAO,IAAI,OAAO,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,EAAE,EAAE,CAAC,KAAK;gBACb,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,IAAI,EAAE,EAAE,CAAC,kBAAkB;gBAC3B,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC,SAAS,CAAC;gBACrC,EAAE,EAAE,kBAAkB,CAAC,EAAE,CAAC,UAAU,CAAC;gBACrC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO;gBACrB,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO;gBACrB,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChB,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,qCAAqC;IACrC,yCAAyC;IACzC,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,+CAA+C;IAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AAC/D,CAAC;AAED,6DAA6D;AAC7D,gEAAgE;AAChE,6DAA6D;AAE7D,SAAS,mBAAmB,CAAC,UAA+B;IAC1D,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACtD,OAAO,yBAAyB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED,6DAA6D;AAC7D,uBAAuB;AACvB,6DAA6D;AAE7D,MAAM,UAAU,wBAAwB,CAAC,UAA+B;IACtE,OAAO,sCAAsC,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,UAA+B;IACnF,OAAO,+BAA+B,KAAK,IAAI,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,IAAY,EACZ,UAAmB,EACnB,UAA+B;IAE/B,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,iBAAiB,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,OAAO,cAAc,IAAI,IAAI,MAAM,GAAG,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,qEAAqE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,2DAA2D,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,SAAiB,EACjB,UAA+B;IAE/B,OAAO,WAAW,SAAS,GAAG,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;AAClE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { ADBResult } from "../../types.js";
2
+ export declare class ADB {
3
+ private readonly adbPath;
4
+ private readonly timeoutMs;
5
+ constructor(adbPath?: string, timeoutMs?: number);
6
+ /**
7
+ * Execute an ADB command and return structured result.
8
+ * If `deviceId` is provided, `-s deviceId` is prepended to args.
9
+ */
10
+ execute(args: string[], deviceId?: string): Promise<ADBResult>;
11
+ /**
12
+ * Execute an ADB command and return raw stdout as a Buffer.
13
+ * Useful for binary data such as screenshots (screencap -p).
14
+ * Throws on non-zero exit code.
15
+ */
16
+ executeBuffer(args: string[], deviceId?: string): Promise<Buffer>;
17
+ private buildArgs;
18
+ private handleExecError;
19
+ }
20
+ export default ADB;
21
+ //# sourceMappingURL=adb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adb.d.ts","sourceRoot":"","sources":["../../../src/drivers/android/adb.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAUhD,qBAAa,GAAG;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,GAAE,MAAc,EAAE,SAAS,GAAE,MAA2B;IAK3E;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAoBpE;;;;OAIG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqDvE,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,eAAe;CAsCxB;AAED,eAAe,GAAG,CAAC"}