react-native-ai-devtools 2.18.1 → 2.20.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 (249) hide show
  1. package/README.md +1 -0
  2. package/build/__tests__/unit/actionLog.test.d.ts +2 -0
  3. package/build/__tests__/unit/actionLog.test.d.ts.map +1 -0
  4. package/build/__tests__/unit/actionLog.test.js +116 -0
  5. package/build/__tests__/unit/actionLog.test.js.map +1 -0
  6. package/build/__tests__/unit/actionOutcome.test.d.ts +2 -0
  7. package/build/__tests__/unit/actionOutcome.test.d.ts.map +1 -0
  8. package/build/__tests__/unit/actionOutcome.test.js +166 -0
  9. package/build/__tests__/unit/actionOutcome.test.js.map +1 -0
  10. package/build/__tests__/unit/actionOutcomeCollect.test.d.ts +2 -0
  11. package/build/__tests__/unit/actionOutcomeCollect.test.d.ts.map +1 -0
  12. package/build/__tests__/unit/actionOutcomeCollect.test.js +110 -0
  13. package/build/__tests__/unit/actionOutcomeCollect.test.js.map +1 -0
  14. package/build/__tests__/unit/actionRender.test.d.ts +2 -0
  15. package/build/__tests__/unit/actionRender.test.d.ts.map +1 -0
  16. package/build/__tests__/unit/actionRender.test.js +163 -0
  17. package/build/__tests__/unit/actionRender.test.js.map +1 -0
  18. package/build/__tests__/unit/blankFrame.test.d.ts +2 -0
  19. package/build/__tests__/unit/blankFrame.test.d.ts.map +1 -0
  20. package/build/__tests__/unit/blankFrame.test.js +23 -0
  21. package/build/__tests__/unit/blankFrame.test.js.map +1 -0
  22. package/build/__tests__/unit/chromiumNavigation.test.d.ts +2 -0
  23. package/build/__tests__/unit/chromiumNavigation.test.d.ts.map +1 -0
  24. package/build/__tests__/unit/chromiumNavigation.test.js +36 -0
  25. package/build/__tests__/unit/chromiumNavigation.test.js.map +1 -0
  26. package/build/__tests__/unit/commitRecorder.test.d.ts +2 -0
  27. package/build/__tests__/unit/commitRecorder.test.d.ts.map +1 -0
  28. package/build/__tests__/unit/commitRecorder.test.js +141 -0
  29. package/build/__tests__/unit/commitRecorder.test.js.map +1 -0
  30. package/build/__tests__/unit/commitRecorderInjected.test.d.ts +2 -0
  31. package/build/__tests__/unit/commitRecorderInjected.test.d.ts.map +1 -0
  32. package/build/__tests__/unit/commitRecorderInjected.test.js +195 -0
  33. package/build/__tests__/unit/commitRecorderInjected.test.js.map +1 -0
  34. package/build/__tests__/unit/compactImageSrc.test.d.ts +2 -0
  35. package/build/__tests__/unit/compactImageSrc.test.d.ts.map +1 -0
  36. package/build/__tests__/unit/compactImageSrc.test.js +11 -0
  37. package/build/__tests__/unit/compactImageSrc.test.js.map +1 -0
  38. package/build/__tests__/unit/epochStarts.test.d.ts +2 -0
  39. package/build/__tests__/unit/epochStarts.test.d.ts.map +1 -0
  40. package/build/__tests__/unit/epochStarts.test.js +35 -0
  41. package/build/__tests__/unit/epochStarts.test.js.map +1 -0
  42. package/build/__tests__/unit/launchRecordsDevice.test.d.ts +2 -0
  43. package/build/__tests__/unit/launchRecordsDevice.test.d.ts.map +1 -0
  44. package/build/__tests__/unit/launchRecordsDevice.test.js +37 -0
  45. package/build/__tests__/unit/launchRecordsDevice.test.js.map +1 -0
  46. package/build/__tests__/unit/logOwnership.test.js +6 -6
  47. package/build/__tests__/unit/logOwnership.test.js.map +1 -1
  48. package/build/__tests__/unit/logSourceIos.test.js +2 -2
  49. package/build/__tests__/unit/logSourceIos.test.js.map +1 -1
  50. package/build/__tests__/unit/nativeLogs.test.js +10 -10
  51. package/build/__tests__/unit/nativeLogs.test.js.map +1 -1
  52. package/build/__tests__/unit/networkIdle.test.d.ts +2 -0
  53. package/build/__tests__/unit/networkIdle.test.d.ts.map +1 -0
  54. package/build/__tests__/unit/networkIdle.test.js +65 -0
  55. package/build/__tests__/unit/networkIdle.test.js.map +1 -0
  56. package/build/__tests__/unit/networkNotable.test.d.ts +2 -0
  57. package/build/__tests__/unit/networkNotable.test.d.ts.map +1 -0
  58. package/build/__tests__/unit/networkNotable.test.js +56 -0
  59. package/build/__tests__/unit/networkNotable.test.js.map +1 -0
  60. package/build/__tests__/unit/pressabilityAudit.test.js +16 -1
  61. package/build/__tests__/unit/pressabilityAudit.test.js.map +1 -1
  62. package/build/__tests__/unit/redact.test.js +2 -2
  63. package/build/__tests__/unit/redact.test.js.map +1 -1
  64. package/build/__tests__/unit/scrollClip.test.d.ts +2 -0
  65. package/build/__tests__/unit/scrollClip.test.d.ts.map +1 -0
  66. package/build/__tests__/unit/scrollClip.test.js +45 -0
  67. package/build/__tests__/unit/scrollClip.test.js.map +1 -0
  68. package/build/__tests__/unit/secureValue.test.d.ts +2 -0
  69. package/build/__tests__/unit/secureValue.test.d.ts.map +1 -0
  70. package/build/__tests__/unit/secureValue.test.js +51 -0
  71. package/build/__tests__/unit/secureValue.test.js.map +1 -0
  72. package/build/__tests__/unit/sessionOnce.test.d.ts +2 -0
  73. package/build/__tests__/unit/sessionOnce.test.d.ts.map +1 -0
  74. package/build/__tests__/unit/sessionOnce.test.js +17 -0
  75. package/build/__tests__/unit/sessionOnce.test.js.map +1 -0
  76. package/build/__tests__/unit/swipeProbeWithoutRn.test.js +28 -1
  77. package/build/__tests__/unit/swipeProbeWithoutRn.test.js.map +1 -1
  78. package/build/__tests__/unit/tap.test.js +1 -1
  79. package/build/__tests__/unit/tap.test.js.map +1 -1
  80. package/build/__tests__/unit/tapNativeScreenshot.test.d.ts +2 -0
  81. package/build/__tests__/unit/tapNativeScreenshot.test.d.ts.map +1 -0
  82. package/build/__tests__/unit/tapNativeScreenshot.test.js +99 -0
  83. package/build/__tests__/unit/tapNativeScreenshot.test.js.map +1 -0
  84. package/build/__tests__/unit/textSnapshot.test.d.ts +2 -0
  85. package/build/__tests__/unit/textSnapshot.test.d.ts.map +1 -0
  86. package/build/__tests__/unit/textSnapshot.test.js +49 -0
  87. package/build/__tests__/unit/textSnapshot.test.js.map +1 -0
  88. package/build/__tests__/unit/timeline.test.d.ts +2 -0
  89. package/build/__tests__/unit/timeline.test.d.ts.map +1 -0
  90. package/build/__tests__/unit/timeline.test.js +157 -0
  91. package/build/__tests__/unit/timeline.test.js.map +1 -0
  92. package/build/__tests__/unit/timelineReadBounds.test.d.ts +2 -0
  93. package/build/__tests__/unit/timelineReadBounds.test.d.ts.map +1 -0
  94. package/build/__tests__/unit/timelineReadBounds.test.js +21 -0
  95. package/build/__tests__/unit/timelineReadBounds.test.js.map +1 -0
  96. package/build/__tests__/unit/timelineSources.test.d.ts +2 -0
  97. package/build/__tests__/unit/timelineSources.test.d.ts.map +1 -0
  98. package/build/__tests__/unit/timelineSources.test.js +139 -0
  99. package/build/__tests__/unit/timelineSources.test.js.map +1 -0
  100. package/build/__tests__/unit/timelineTool.test.d.ts +2 -0
  101. package/build/__tests__/unit/timelineTool.test.d.ts.map +1 -0
  102. package/build/__tests__/unit/timelineTool.test.js +65 -0
  103. package/build/__tests__/unit/timelineTool.test.js.map +1 -0
  104. package/build/__tests__/unit/vaultTools.test.js +20 -6
  105. package/build/__tests__/unit/vaultTools.test.js.map +1 -1
  106. package/build/core/actionLog.d.ts +27 -0
  107. package/build/core/actionLog.d.ts.map +1 -0
  108. package/build/core/actionLog.js +144 -0
  109. package/build/core/actionLog.js.map +1 -0
  110. package/build/core/actionOutcome.d.ts +35 -0
  111. package/build/core/actionOutcome.d.ts.map +1 -0
  112. package/build/core/actionOutcome.js +184 -0
  113. package/build/core/actionOutcome.js.map +1 -0
  114. package/build/core/actionOutcomeCollect.d.ts +27 -0
  115. package/build/core/actionOutcomeCollect.d.ts.map +1 -0
  116. package/build/core/actionOutcomeCollect.js +102 -0
  117. package/build/core/actionOutcomeCollect.js.map +1 -0
  118. package/build/core/blankFrame.d.ts +3 -0
  119. package/build/core/blankFrame.d.ts.map +1 -0
  120. package/build/core/blankFrame.js +18 -0
  121. package/build/core/blankFrame.js.map +1 -0
  122. package/build/core/chromiumCapabilities.js +1 -1
  123. package/build/core/chromiumCapabilities.js.map +1 -1
  124. package/build/core/chromiumNavigation.d.ts +10 -0
  125. package/build/core/chromiumNavigation.d.ts.map +1 -0
  126. package/build/core/chromiumNavigation.js +31 -0
  127. package/build/core/chromiumNavigation.js.map +1 -0
  128. package/build/core/chromiumScreen.d.ts.map +1 -1
  129. package/build/core/chromiumScreen.js +6 -8
  130. package/build/core/chromiumScreen.js.map +1 -1
  131. package/build/core/commitRecorder.d.ts +35 -0
  132. package/build/core/commitRecorder.d.ts.map +1 -0
  133. package/build/core/commitRecorder.js +115 -0
  134. package/build/core/commitRecorder.js.map +1 -0
  135. package/build/core/componentSearch.d.ts.map +1 -1
  136. package/build/core/componentSearch.js +6 -1
  137. package/build/core/componentSearch.js.map +1 -1
  138. package/build/core/connection.d.ts.map +1 -1
  139. package/build/core/connection.js +13 -0
  140. package/build/core/connection.js.map +1 -1
  141. package/build/core/guides.d.ts.map +1 -1
  142. package/build/core/guides.js +14 -5
  143. package/build/core/guides.js.map +1 -1
  144. package/build/core/injected/commitRecorder.d.ts +2 -0
  145. package/build/core/injected/commitRecorder.d.ts.map +1 -0
  146. package/build/core/injected/commitRecorder.js +93 -0
  147. package/build/core/injected/commitRecorder.js.map +1 -0
  148. package/build/core/injected/scrollClip.d.ts +12 -0
  149. package/build/core/injected/scrollClip.d.ts.map +1 -0
  150. package/build/core/injected/scrollClip.js +46 -0
  151. package/build/core/injected/scrollClip.js.map +1 -0
  152. package/build/core/injected/secureValue.d.ts +3 -0
  153. package/build/core/injected/secureValue.d.ts.map +1 -0
  154. package/build/core/injected/secureValue.js +22 -0
  155. package/build/core/injected/secureValue.js.map +1 -0
  156. package/build/core/inputTarget.d.ts.map +1 -1
  157. package/build/core/inputTarget.js +3 -1
  158. package/build/core/inputTarget.js.map +1 -1
  159. package/build/core/inspector.d.ts.map +1 -1
  160. package/build/core/inspector.js +7 -2
  161. package/build/core/inspector.js.map +1 -1
  162. package/build/core/network.d.ts +1 -0
  163. package/build/core/network.d.ts.map +1 -1
  164. package/build/core/network.js +4 -1
  165. package/build/core/network.js.map +1 -1
  166. package/build/core/networkIdle.d.ts +21 -0
  167. package/build/core/networkIdle.d.ts.map +1 -0
  168. package/build/core/networkIdle.js +41 -0
  169. package/build/core/networkIdle.js.map +1 -0
  170. package/build/core/networkNotable.d.ts +3 -0
  171. package/build/core/networkNotable.d.ts.map +1 -0
  172. package/build/core/networkNotable.js +111 -0
  173. package/build/core/networkNotable.js.map +1 -0
  174. package/build/core/pressables.d.ts.map +1 -1
  175. package/build/core/pressables.js +7 -5
  176. package/build/core/pressables.js.map +1 -1
  177. package/build/core/register.d.ts.map +1 -1
  178. package/build/core/register.js +2 -0
  179. package/build/core/register.js.map +1 -1
  180. package/build/core/routeHistory.d.ts +3 -2
  181. package/build/core/routeHistory.d.ts.map +1 -1
  182. package/build/core/routeHistory.js +6 -6
  183. package/build/core/routeHistory.js.map +1 -1
  184. package/build/core/screenState.d.ts +5 -1
  185. package/build/core/screenState.d.ts.map +1 -1
  186. package/build/core/screenState.js +98 -19
  187. package/build/core/screenState.js.map +1 -1
  188. package/build/core/sessionOnce.d.ts +3 -0
  189. package/build/core/sessionOnce.d.ts.map +1 -0
  190. package/build/core/sessionOnce.js +11 -0
  191. package/build/core/sessionOnce.js.map +1 -0
  192. package/build/core/state.d.ts +4 -0
  193. package/build/core/state.d.ts.map +1 -1
  194. package/build/core/state.js +11 -0
  195. package/build/core/state.js.map +1 -1
  196. package/build/core/swipeDiagnosis.d.ts.map +1 -1
  197. package/build/core/swipeDiagnosis.js +25 -11
  198. package/build/core/swipeDiagnosis.js.map +1 -1
  199. package/build/core/textSnapshot.d.ts +6 -0
  200. package/build/core/textSnapshot.d.ts.map +1 -0
  201. package/build/core/textSnapshot.js +85 -0
  202. package/build/core/textSnapshot.js.map +1 -0
  203. package/build/core/timeline.d.ts +71 -0
  204. package/build/core/timeline.d.ts.map +1 -0
  205. package/build/core/timeline.js +156 -0
  206. package/build/core/timeline.js.map +1 -0
  207. package/build/core/timelineSources.d.ts +30 -0
  208. package/build/core/timelineSources.d.ts.map +1 -0
  209. package/build/core/timelineSources.js +179 -0
  210. package/build/core/timelineSources.js.map +1 -0
  211. package/build/core/toolHelpers.d.ts +1 -0
  212. package/build/core/toolHelpers.d.ts.map +1 -1
  213. package/build/core/toolHelpers.js +1 -1
  214. package/build/core/toolHelpers.js.map +1 -1
  215. package/build/index.d.ts.map +1 -1
  216. package/build/index.js +2 -0
  217. package/build/index.js.map +1 -1
  218. package/build/pro/actionRender.d.ts +40 -0
  219. package/build/pro/actionRender.d.ts.map +1 -0
  220. package/build/pro/actionRender.js +139 -0
  221. package/build/pro/actionRender.js.map +1 -0
  222. package/build/pro/tap.d.ts.map +1 -1
  223. package/build/pro/tap.js +2 -0
  224. package/build/pro/tap.js.map +1 -1
  225. package/build/tools/componentTools.d.ts.map +1 -1
  226. package/build/tools/componentTools.js +4 -3
  227. package/build/tools/componentTools.js.map +1 -1
  228. package/build/tools/deviceTools.d.ts +1 -0
  229. package/build/tools/deviceTools.d.ts.map +1 -1
  230. package/build/tools/deviceTools.js +18 -3
  231. package/build/tools/deviceTools.js.map +1 -1
  232. package/build/tools/interactionTools.d.ts.map +1 -1
  233. package/build/tools/interactionTools.js +53 -20
  234. package/build/tools/interactionTools.js.map +1 -1
  235. package/build/tools/metaTools.d.ts.map +1 -1
  236. package/build/tools/metaTools.js +15 -1
  237. package/build/tools/metaTools.js.map +1 -1
  238. package/build/tools/networkTools.d.ts.map +1 -1
  239. package/build/tools/networkTools.js +5 -1
  240. package/build/tools/networkTools.js.map +1 -1
  241. package/build/tools/screenshotTools.d.ts.map +1 -1
  242. package/build/tools/screenshotTools.js +58 -32
  243. package/build/tools/screenshotTools.js.map +1 -1
  244. package/build/tools/timelineTools.d.ts +3 -0
  245. package/build/tools/timelineTools.d.ts.map +1 -0
  246. package/build/tools/timelineTools.js +48 -0
  247. package/build/tools/timelineTools.js.map +1 -0
  248. package/package.json +1 -1
  249. package/tools.json +13 -2
package/README.md CHANGED
@@ -140,6 +140,7 @@ See the [full tool reference](docs/tools.md) for all tools with descriptions. Ke
140
140
  | `scan_metro` | **Start here** — scan for Metro servers and auto-connect |
141
141
  | `get_logs` / `search_logs` | Capture and search console logs with filtering and summaries |
142
142
  | `get_network_requests` | Monitor HTTP requests with method/status filtering |
143
+ | `get_timeline` | Actions, route changes, requests, logs and restarts in one time-ordered list |
143
144
  | `get_screen_state` | **Orientation snapshot** — active route, overlays, and every element with a tap-ready `(x, y)` |
144
145
  | `get_screen_layout` | Screen map of visible components with positions, sizes, and text content |
145
146
  | `tap` | **Unified tap** — auto-detects platform, tries fiber → accessibility → OCR → coordinates |
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=actionLog.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionLog.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/actionLog.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,116 @@
1
+ import { describe, it, expect, beforeEach } from "@jest/globals";
2
+ import { recordAction, getActions, lastAction, resetActionLog, summarizeArgs, deviceMatches, actionLabel, ACTION_TOOLS, } from "../../core/actionLog.js";
3
+ const base = { startedAt: 1000, endedAt: 1500, ok: true };
4
+ describe("recordAction", () => {
5
+ beforeEach(() => resetActionLog());
6
+ it("records action tools and ignores read tools", () => {
7
+ recordAction({ ...base, tool: "tap", args: { testID: "add-to-cart" } });
8
+ recordAction({ ...base, tool: "get_logs", args: {} });
9
+ expect(getActions().map((a) => a.tool)).toEqual(["tap"]);
10
+ });
11
+ it("records a failure with its reason, cut to 80 chars", () => {
12
+ recordAction({ ...base, tool: "tap", args: { text: "Pay" }, ok: false, error: "x".repeat(200) });
13
+ const a = getActions()[0];
14
+ expect(a.ok).toBe(false);
15
+ expect(a.outcome).toBe("x".repeat(80));
16
+ });
17
+ it("turns the pixel-diff verdict into an outcome", () => {
18
+ recordAction({ ...base, tool: "tap", args: { testID: "a" }, meaningful: true });
19
+ recordAction({ ...base, tool: "swipe", args: { direction: "up" }, meaningful: false });
20
+ expect(getActions().map((a) => a.outcome)).toEqual(["screen changed", "no visible change"]);
21
+ });
22
+ it("keeps the device argument, or null", () => {
23
+ recordAction({ ...base, tool: "tap", args: { testID: "a", device: "iPhone" } });
24
+ recordAction({ ...base, tool: "tap", args: { testID: "b" } });
25
+ expect(getActions().map((a) => a.device)).toEqual(["iPhone", null]);
26
+ });
27
+ it("caps the ring at 200", () => {
28
+ for (let i = 0; i < 210; i++)
29
+ recordAction({ ...base, tool: "tap", args: { x: i, y: 1 } });
30
+ const all = getActions();
31
+ expect(all).toHaveLength(200);
32
+ expect(all[0].summary).toBe("(10,1)");
33
+ });
34
+ it("never throws, even on hostile args", () => {
35
+ const hostile = { get testID() { throw new Error("boom"); } };
36
+ expect(() => recordAction({ ...base, tool: "tap", args: hostile })).not.toThrow();
37
+ });
38
+ });
39
+ describe("summarizeArgs", () => {
40
+ it("redacts a credential before cutting, so a split token cannot slip past", () => {
41
+ const jwt = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.c2lnbmF0dXJlc2lnbmF0dXJl";
42
+ const s = summarizeArgs("execute_in_app", { expression: `fetch(u, {headers: {a: "${jwt}"}})` });
43
+ expect(s).not.toContain("eyJhbGciOiJIUzI1NiJ9");
44
+ });
45
+ it("never includes the text typed by input_text", () => {
46
+ const s = summarizeArgs("input_text", { testID: "password", text: "hunter2-secret" });
47
+ expect(s).toBe("testID=password 14 chars");
48
+ expect(s).not.toContain("hunter2");
49
+ });
50
+ it("names an untargeted input_text as the focused field", () => {
51
+ expect(summarizeArgs("input_text", { text: "abc", native: true })).toBe("focused field 3 chars");
52
+ });
53
+ it("renders tap targets in priority order", () => {
54
+ expect(summarizeArgs("tap", { testID: "go", text: "Go" })).toBe("testID=go");
55
+ expect(summarizeArgs("tap", { text: "Checkout" })).toBe('text="Checkout"');
56
+ expect(summarizeArgs("tap", { component: "CartIcon" })).toBe("component=CartIcon");
57
+ expect(summarizeArgs("tap", { x: 300, y: 600 })).toBe("(300,600)");
58
+ expect(summarizeArgs("tap", { testID: "row", duration: 800 })).toBe("testID=row hold 800ms");
59
+ });
60
+ it("cuts execute_in_app expressions to one 60-char line", () => {
61
+ const expr = "const a = 1;\n" + "b".repeat(100);
62
+ const s = summarizeArgs("execute_in_app", { expression: expr });
63
+ expect(s).not.toContain("\n");
64
+ expect(s.length).toBeLessThanOrEqual(61);
65
+ expect(s.endsWith("…")).toBe(true);
66
+ });
67
+ it("covers the other action tools", () => {
68
+ expect(summarizeArgs("swipe", { direction: "up" })).toBe("up");
69
+ expect(summarizeArgs("swipe", { startX: 1, startY: 2, endX: 3, endY: 4 })).toBe("(1,2)→(3,4)");
70
+ expect(summarizeArgs("press_key", { key: "Enter", repeat: 3 })).toBe("Enter ×3");
71
+ expect(summarizeArgs("navigate", { to: "/checkout" })).toBe("/checkout");
72
+ expect(summarizeArgs("navigate", { screen: "TarotNav" })).toBe("TarotNav");
73
+ expect(summarizeArgs("network_mock", { action: "add", url: "/api/orders" })).toBe("add /api/orders");
74
+ expect(summarizeArgs("network_condition", { mode: "offline" })).toBe("offline");
75
+ expect(summarizeArgs("redux_dispatch", { action: [{ type: "cart/add" }, { type: "cart/clear" }] })).toBe("cart/add, cart/clear");
76
+ expect(summarizeArgs("app_request", { method: "POST", url: "https://api.x.com/orders?a=1" })).toBe("POST /orders?a=1");
77
+ expect(summarizeArgs("network_replay", { requestId: "42" })).toBe("request 42");
78
+ expect(summarizeArgs("reload_app", {})).toBe("");
79
+ });
80
+ });
81
+ describe("lastAction and deviceMatches", () => {
82
+ beforeEach(() => resetActionLog());
83
+ it("returns the newest action, optionally for one device", () => {
84
+ recordAction({ ...base, tool: "tap", args: { testID: "a", device: "iPhone" } });
85
+ recordAction({ ...base, startedAt: 2000, tool: "tap", args: { testID: "b", device: "Pixel" } });
86
+ expect(lastAction()?.summary).toBe("testID=b");
87
+ expect(lastAction("iphone")?.summary).toBe("testID=a");
88
+ expect(lastAction("nothing")).toBeNull();
89
+ });
90
+ it("does not let an execute_in_app read move the default window off the tap", () => {
91
+ recordAction({ ...base, tool: "tap", args: { testID: "add-to-cart" } });
92
+ recordAction({ ...base, startedAt: 2000, tool: "execute_in_app", args: { expression: "store.getState().cart" } });
93
+ expect(lastAction()?.summary).toBe("testID=add-to-cart");
94
+ expect(getActions().map((a) => a.tool)).toEqual(["tap", "execute_in_app"]);
95
+ });
96
+ it("anchors on execute_in_app when nothing else was done", () => {
97
+ recordAction({ ...base, tool: "execute_in_app", args: { expression: "1" } });
98
+ expect(lastAction()?.tool).toBe("execute_in_app");
99
+ });
100
+ it("treats an action without a device as belonging to any device", () => {
101
+ expect(deviceMatches(null, "iPhone 17 Pro")).toBe(true);
102
+ expect(deviceMatches("iphone", "iPhone 17 Pro")).toBe(true);
103
+ expect(deviceMatches("iPhone 17 Pro", "iphone")).toBe(true);
104
+ expect(deviceMatches("Pixel", "iPhone 17 Pro")).toBe(false);
105
+ });
106
+ it("labels an action by tool and summary", () => {
107
+ recordAction({ ...base, tool: "tap", args: { testID: "go" } });
108
+ recordAction({ ...base, tool: "reload_app", args: {} });
109
+ expect(getActions().map(actionLabel)).toEqual(["tap testID=go", "reload_app"]);
110
+ });
111
+ it("lists only tools that change state", () => {
112
+ expect(ACTION_TOOLS.has("execute_in_app")).toBe(true);
113
+ expect(ACTION_TOOLS.has("get_timeline")).toBe(false);
114
+ });
115
+ });
116
+ //# sourceMappingURL=actionLog.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionLog.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/actionLog.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=actionOutcome.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionOutcome.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/actionOutcome.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,166 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { diffSnapshots, buildOutcome, snapshotFromScreenState, snapshotFromLines, TEXT_DIFF_CAP } from "../../core/actionOutcome.js";
3
+ import { requestEvent, logEvent, restartEvent } from "../../core/timeline.js";
4
+ const snap = (route, items) => ({
5
+ route,
6
+ items: items.map(([text, x, y]) => ({ text, x, y })),
7
+ });
8
+ const none = { events: [], pending: 0, capped: false, unavailable: [] };
9
+ describe("diffSnapshots", () => {
10
+ it("pairs an in-place text change", () => {
11
+ const before = snap("TapTargets", [["Taps: 0", 446, 715], ["Last: none", 446, 791]]);
12
+ const after = snap("TapTargets", [["Taps: 1", 446, 715], ["Last: submit-btn", 446, 791]]);
13
+ expect(diffSnapshots(before, after)).toEqual(['"Taps: 0" → "Taps: 1"', '"Last: none" → "Last: submit-btn"']);
14
+ });
15
+ it("reports appeared text", () => {
16
+ const before = snap("Login", [["Sign in", 446, 801]]);
17
+ const after = snap("Login", [["Cannot read property 'setGenericPasswordForOptions' of null", 446, 684], ["Sign in", 446, 801]]);
18
+ expect(diffSnapshots(before, after)).toEqual([`+ "Cannot read property 'setGenericPasswordForOptions' of null"`]);
19
+ });
20
+ it("reports disappeared text", () => {
21
+ expect(diffSnapshots(snap("A", [["Loading…", 10, 10], ["Title", 10, 50]]), snap("A", [["Title", 10, 50]]))).toEqual(['- "Loading…"']);
22
+ });
23
+ it("does not pair texts far apart vertically", () => {
24
+ const lines = diffSnapshots(snap("A", [["old", 10, 100]]), snap("A", [["new", 10, 400]]));
25
+ expect(lines).toEqual(['- "old"', '+ "new"']);
26
+ });
27
+ it("caps at TEXT_DIFF_CAP with a pointer", () => {
28
+ const after = snap("A", Array.from({ length: 14 }, (_, i) => [`row ${i}`, 10, i * 100]));
29
+ const lines = diffSnapshots(snap("A", []), after);
30
+ expect(lines).toHaveLength(TEXT_DIFF_CAP + 1);
31
+ expect(lines[TEXT_DIFF_CAP]).toBe("+4 more, get_screen_state for all");
32
+ });
33
+ it("diff of masked values never contains the raw text", () => {
34
+ const lines = diffSnapshots(snap("Login", [["Password: [masked, 3 chars]", 446, 572]]), snap("Login", [["Password: [masked, 4 chars]", 446, 572]]));
35
+ expect(lines).toEqual(['"Password: [masked, 3 chars]" → "Password: [masked, 4 chars]"']);
36
+ });
37
+ it("is empty when nothing changed", () => {
38
+ const s = snap("A", [["x", 1, 1], ["x", 1, 50]]);
39
+ expect(diffSnapshots(s, s)).toEqual([]);
40
+ });
41
+ });
42
+ describe("buildOutcome", () => {
43
+ it("route change replaces the text diff with one line", () => {
44
+ const o = buildOutcome({ ...none, before: snap("Login", [["Sign in", 1, 1]]), after: snap("ProductList", [["Shoes", 1, 1], ["Hats", 1, 2]]) });
45
+ expect(o.route).toBe("Login → ProductList");
46
+ expect(o.text).toEqual(["new screen (route changed): get_screen_state reads it"]);
47
+ });
48
+ it("unknown route but most of the screen replaced: one line, not a diff", () => {
49
+ const before = snapshotFromLines(null, ["Shop", "Shoes", "Hats", "Socks", "Checkout"]);
50
+ const after = snapshotFromLines(null, ["Product", "Shoes", "Size 42", "Add to cart", "Reviews", "Similar"]);
51
+ const o = buildOutcome({ ...none, before, after });
52
+ expect(o.route).toBeUndefined();
53
+ expect(o.text).toEqual(["most of the screen changed (4 of 5 lines): get_screen_state reads it"]);
54
+ });
55
+ it("a small screen changing one line still gets the diff", () => {
56
+ const o = buildOutcome({ ...none, before: snapshotFromLines("A", ["Taps: 0"]), after: snapshotFromLines("A", ["Taps: 1"]) });
57
+ expect(o.text).toEqual(['"Taps: 0" → "Taps: 1"']);
58
+ });
59
+ it("unchanged route and no text change omit text", () => {
60
+ const s = snap("TapTargets", [["Taps: 0", 1, 1]]);
61
+ const o = buildOutcome({ ...none, before: s, after: s });
62
+ expect(o.route).toBe("unchanged (TapTargets)");
63
+ expect(o.text).toBeUndefined();
64
+ });
65
+ it("splits events into network, console and restart, dropping info logs", () => {
66
+ const req = { requestId: "sdk-1", timestamp: new Date(1000), method: "POST", url: "http://localhost:8092/auth/login", headers: {}, status: 200, timing: { duration: 79 }, completed: true, epoch: 1 };
67
+ const log = (level, message, seq) => ({ timestamp: new Date(1100), level, message, seq, epoch: 1 });
68
+ const events = [
69
+ requestEvent(req, "d", false),
70
+ logEvent(log("error", "boom", 1), "d"),
71
+ logEvent(log("warn", "careful", 2), "d"),
72
+ logEvent(log("log", "chatter", 3), "d"),
73
+ restartEvent(2, 1200, "d"),
74
+ ];
75
+ const o = buildOutcome({ ...none, before: null, after: null, events });
76
+ expect(o.network).toEqual([events[0].text]);
77
+ expect(o.console).toEqual([events[1].text, events[2].text]);
78
+ expect(o.restart).toBe(events[4].text);
79
+ });
80
+ it("reports pending only when capped", () => {
81
+ const o = buildOutcome({ before: null, after: null, events: [], pending: 2, capped: true, unavailable: ["route", "text: no React Native connection"] });
82
+ expect(o.pending).toBe("2 request(s) still in flight after 3s: get_timeline() shows the rest");
83
+ expect(o.unavailable).toEqual(["route", "text: no React Native connection"]);
84
+ expect(buildOutcome({ ...none, before: null, after: null, pending: 0, capped: true }).pending).toBeUndefined();
85
+ });
86
+ });
87
+ describe("snapshotFromLines", () => {
88
+ it("pairs a changed line even when a new line appears above it", () => {
89
+ const before = snapshotFromLines("Login", ["Sign in to the Shop", "Taps: 0", "Sign in"]);
90
+ const after = snapshotFromLines("Login", ["Sign in to the Shop", "Bad password", "Taps: 1", "Sign in"]);
91
+ expect(diffSnapshots(before, after)).toEqual(['+ "Bad password"', '"Taps: 0" → "Taps: 1"']);
92
+ });
93
+ });
94
+ describe("diff pairing on tree order", () => {
95
+ it("pairs a changed line across two lines inserted above it", () => {
96
+ const before = snapshotFromLines("A", ["Title", "Taps: 0", "Footer"]);
97
+ const after = snapshotFromLines("A", ["Title", "Error one", "Error two", "Taps: 1", "Footer"]);
98
+ expect(diffSnapshots(before, after)).toEqual(['+ "Error one"', '+ "Error two"', '"Taps: 0" → "Taps: 1"']);
99
+ });
100
+ it("does not pair unrelated neighbours: a cart emptying reads as removals and additions", () => {
101
+ const before = snapshotFromLines("Checkout", ["Mascara", "1", "Subtotal: $9.99"]);
102
+ const after = snapshotFromLines("Checkout", ["Your cart is empty", "Subtotal: $0.00"]);
103
+ const lines = diffSnapshots(before, after);
104
+ expect(lines).toContain('"Subtotal: $9.99" → "Subtotal: $0.00"');
105
+ expect(lines).not.toContain('"1" → "Subtotal: $0.00"');
106
+ });
107
+ it("pairs lines that moved far when rows above them were removed (Place order on device)", () => {
108
+ const before = snapshotFromLines("Checkout", ["Eyeshadow Palette with Mirror", "$19.99", "−", "1", "+", "Promo code: (empty)", "Apply", "Free shipping", "Subtotal: $19.99", "Total: $19.99", "Order #1003 placed", "Place order"]);
109
+ const after = snapshotFromLines("Checkout", ["Your cart is empty", "Promo code: (empty)", "Apply", "Free shipping", "Subtotal: $0.00", "Total: $0.00", "Order #1004 placed", "Place order"]);
110
+ expect(diffSnapshots(before, after)).toEqual([
111
+ '"Eyeshadow Palette with Mirror" → "Your cart is empty"',
112
+ '- "$19.99"',
113
+ '- "−"',
114
+ '- "1"',
115
+ '- "+"',
116
+ '"Subtotal: $19.99" → "Subtotal: $0.00"',
117
+ '"Total: $19.99" → "Total: $0.00"',
118
+ '"Order #1003 placed" → "Order #1004 placed"',
119
+ ]);
120
+ });
121
+ it("pairs by the best match, not the nearest: a new hint next to the counter", () => {
122
+ const lines = diffSnapshots(snapshotFromLines("A", ["Taps: 0", "Reset"]), snapshotFromLines("A", ["Tap again", "Taps: 1", "Reset"]));
123
+ expect(lines).toEqual(['+ "Tap again"', '"Taps: 0" → "Taps: 1"']);
124
+ });
125
+ it("does not swap partners between two similar lines", () => {
126
+ const lines = diffSnapshots(snapshotFromLines("A", ["Status: idle", "Status code: 200"]), snapshotFromLines("A", ["Status: done", "Status code: 500"]));
127
+ expect(lines).toEqual(['"Status: idle" → "Status: done"', '"Status code: 200" → "Status code: 500"']);
128
+ });
129
+ it("a deleted row in a family of similar rows is a removal, not a rename", () => {
130
+ const rows = (n) => n.map((i) => `Row ${i}`);
131
+ const before = snapshotFromLines("List", rows([1, 2, 3, 4, 5, 6, 7, 8]));
132
+ const after = snapshotFromLines("List", rows([1, 2, 4, 5, 6, 7, 8, 41]));
133
+ expect(diffSnapshots(before, after)).toEqual(['- "Row 3"', '+ "Row 41"']);
134
+ });
135
+ it("still pairs a line that changed in place with nothing in common", () => {
136
+ const lines = diffSnapshots(snapshotFromLines("Account", ["Email", "qa.buyer@shop.dev"]), snapshotFromLines("Account", ["Email", "Not signed in"]));
137
+ expect(lines).toEqual(['"qa.buyer@shop.dev" → "Not signed in"']);
138
+ });
139
+ });
140
+ describe("snapshotFromScreenState", () => {
141
+ it("takes texts, labels, masked input values and switch values, with the route", () => {
142
+ const at = (x, y) => ({ center: { x, y }, bounds: { x, y, width: 1, height: 1 } });
143
+ const ss = {
144
+ route: { name: "Login", params: null, stack: ["Shop", "Login"] },
145
+ overlays: [{ type: "Modal", title: "Oops", pressables: [{ label: "OK", testID: null, ...at(5, 900) }], texts: [{ text: "Something failed", ...at(5, 850) }] }],
146
+ pressables: [
147
+ { label: "Password", testID: "login-password", isInput: true, inputValue: "[masked, 8 chars]", ...at(446, 572) },
148
+ { label: "Notifications", testID: null, switchValue: true, ...at(446, 700) },
149
+ { label: "Sign in", testID: "login-submit", ...at(446, 801) },
150
+ ],
151
+ texts: [{ text: "Sign in to the Shop", ...at(446, 323) }],
152
+ images: [],
153
+ };
154
+ const s = snapshotFromScreenState(ss);
155
+ expect(s.route).toBe("Login");
156
+ expect(s.items.map((i) => i.text)).toEqual(expect.arrayContaining([
157
+ "Sign in to the Shop",
158
+ "Password: [masked, 8 chars]",
159
+ "[switch:ON] Notifications",
160
+ "Sign in",
161
+ "Something failed",
162
+ "OK",
163
+ ]));
164
+ });
165
+ });
166
+ //# sourceMappingURL=actionOutcome.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionOutcome.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/actionOutcome.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=actionOutcomeCollect.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionOutcomeCollect.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/actionOutcomeCollect.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,110 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { beginActionOutcome, finishActionOutcome } from "../../core/actionOutcomeCollect.js";
3
+ import { requestEvent } from "../../core/timeline.js";
4
+ const REQ = { requestId: "sdk-1", timestamp: new Date(1000), method: "POST", url: "http://localhost:8092/auth/login", headers: {}, status: 200, completed: true, epoch: 1 };
5
+ function deps(over = {}) {
6
+ let now = 1000;
7
+ const calls = { resolveApp: [], collect: [], sleeps: [] };
8
+ const snaps = [
9
+ { route: "Login", items: [{ text: "Sign in", x: 1, y: 800 }] },
10
+ { route: "Login", items: [{ text: "Bad password", x: 1, y: 680 }, { text: "Sign in", x: 1, y: 800 }] },
11
+ ];
12
+ const d = {
13
+ resolveApp: async (device) => {
14
+ calls.resolveApp.push(device);
15
+ return { deviceName: "sdk_gphone16k_arm64 - 16 - API 36", chromium: false };
16
+ },
17
+ readSnapshot: async () => snaps.shift() ?? null,
18
+ collect: async (deviceName) => {
19
+ calls.collect.push(deviceName);
20
+ return { events: [requestEvent(REQ, "d", false)], devices: ["d"], notes: [], unavailable: [] };
21
+ },
22
+ idleFor: () => ({
23
+ now: () => now,
24
+ sleep: async (ms) => {
25
+ calls.sleeps.push(ms);
26
+ now += ms;
27
+ },
28
+ refresh: async () => { },
29
+ requests: () => [],
30
+ }),
31
+ now: () => now,
32
+ ...over,
33
+ };
34
+ return { d, calls };
35
+ }
36
+ describe("action outcome collection", () => {
37
+ it("resolves the app from the tap's own target", async () => {
38
+ const { d, calls } = deps();
39
+ const h = await beginActionOutcome("emulator-5554", d);
40
+ const o = await finishActionOutcome(h, { visualSettleRan: true }, d);
41
+ expect(calls.resolveApp).toEqual(["emulator-5554"]);
42
+ expect(calls.collect).toEqual(["sdk_gphone16k_arm64 - 16 - API 36"]);
43
+ expect(o).toEqual({
44
+ route: "unchanged (Login)",
45
+ text: ['+ "Bad password"'],
46
+ network: [requestEvent(REQ, "d", false).text],
47
+ });
48
+ });
49
+ it("a throwing snapshot read degrades to unavailable", async () => {
50
+ const { d } = deps({ readSnapshot: async () => { throw new Error("timeout"); } });
51
+ const h = await beginActionOutcome(undefined, d);
52
+ const o = await finishActionOutcome(h, { visualSettleRan: true }, d);
53
+ expect(o.unavailable).toContain("text: snapshot read failed");
54
+ expect(o.network).toHaveLength(1);
55
+ expect(o.route).toBeUndefined();
56
+ });
57
+ it("does not read the after-snapshot when the before-snapshot already failed", async () => {
58
+ let reads = 0;
59
+ const { d } = deps({ readSnapshot: async () => { reads++; throw new Error("timeout"); } });
60
+ await finishActionOutcome(await beginActionOutcome(undefined, d), { visualSettleRan: true }, d);
61
+ expect(reads).toBe(1);
62
+ });
63
+ it("no app: route and text unavailable, buffers still read", async () => {
64
+ const { d, calls } = deps({ resolveApp: async () => null });
65
+ const h = await beginActionOutcome("emulator-5554", d);
66
+ const o = await finishActionOutcome(h, { visualSettleRan: true }, d);
67
+ expect(o.unavailable).toEqual(["route", "text: no React Native connection"]);
68
+ expect(o.network).toHaveLength(1);
69
+ expect(calls.collect).toEqual(["emulator-5554"]);
70
+ });
71
+ it("a failing buffer read degrades to unavailable", async () => {
72
+ const { d } = deps({ collect: async () => { throw new Error('No device matches "x"'); } });
73
+ const h = await beginActionOutcome("x", d);
74
+ const o = await finishActionOutcome(h, { visualSettleRan: true }, d);
75
+ expect(o.unavailable).toContain("network and logs: read failed");
76
+ expect(o.text).toEqual(['+ "Bad password"']);
77
+ });
78
+ it("no app and no buffer for the device: says nothing was captured, not that a read failed", async () => {
79
+ const { d } = deps({ resolveApp: async () => null, collect: async () => { throw new Error('No device matches "emulator-5554"'); } });
80
+ const o = await finishActionOutcome(await beginActionOutcome("emulator-5554", d), { visualSettleRan: true }, d);
81
+ expect(o.unavailable).toEqual(["route", "text: no React Native connection", "network and logs: nothing captured for this device"]);
82
+ });
83
+ it("the 3s cap counts from the end of the gesture, not from before the tap began", async () => {
84
+ let now = 1000;
85
+ const inflight = { requestId: "r", timestamp: new Date(1500), method: "POST", url: "http://x/auth", headers: {}, epoch: 1, completed: false };
86
+ const { d } = deps({
87
+ now: () => now,
88
+ idleFor: () => ({
89
+ now: () => now,
90
+ sleep: async (ms) => { now += ms; },
91
+ refresh: async () => { },
92
+ requests: () => [{ ...inflight, completed: now >= 5500 }],
93
+ }),
94
+ });
95
+ const h = await beginActionOutcome(undefined, d);
96
+ now = 5000;
97
+ const o = await finishActionOutcome(h, { visualSettleRan: true }, d);
98
+ expect(o.pending).toBeUndefined();
99
+ expect(now).toBeGreaterThanOrEqual(5500);
100
+ });
101
+ it("grace applies only without a visual settle", async () => {
102
+ const a = deps();
103
+ await finishActionOutcome(await beginActionOutcome(undefined, a.d), { visualSettleRan: false }, a.d);
104
+ expect(a.calls.sleeps[0]).toBe(300);
105
+ const b = deps();
106
+ await finishActionOutcome(await beginActionOutcome(undefined, b.d), { visualSettleRan: true }, b.d);
107
+ expect(b.calls.sleeps).toEqual([]);
108
+ });
109
+ });
110
+ //# sourceMappingURL=actionOutcomeCollect.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionOutcomeCollect.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/actionOutcomeCollect.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=actionRender.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionRender.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/actionRender.test.ts"],"names":[],"mappings":""}