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
@@ -0,0 +1,139 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "@jest/globals";
2
+ import WebSocket from "ws";
3
+ import { collectTimeline, timelineDevices } from "../../core/timelineSources.js";
4
+ import { recordAction, resetActionLog } from "../../core/actionLog.js";
5
+ import { logBuffers, networkBuffers, connectedApps, getLogBuffer, getNetworkBuffer, bumpEpoch, resetEpochs } from "../../core/state.js";
6
+ import { recordChromiumNavigation, resetChromiumNavigations } from "../../core/chromiumNavigation.js";
7
+ const NOW = Date.now();
8
+ const window = { start: NOW - 10_000, end: NOW + 1000, label: "-10s", fallback: false };
9
+ const ALL = ["actions", "routes", "network", "logs", "restarts", "refresh"];
10
+ const noDeps = {
11
+ readRoutes: async () => { throw new Error("should not be called"); },
12
+ readRefresh: async () => { throw new Error("should not be called"); },
13
+ probeDeviceNow: async () => { throw new Error("should not be called"); },
14
+ };
15
+ function connect(deviceName, platform, extra = {}) {
16
+ connectedApps.set(`8081-${deviceName}`, {
17
+ ws: { readyState: WebSocket.OPEN },
18
+ deviceInfo: { id: deviceName, title: deviceName, description: "", appId: "", type: "node", webSocketDebuggerUrl: "ws://x", deviceName },
19
+ port: 8081, platform, ...extra,
20
+ });
21
+ }
22
+ beforeEach(() => {
23
+ resetActionLog();
24
+ resetEpochs();
25
+ resetChromiumNavigations();
26
+ logBuffers.clear();
27
+ networkBuffers.clear();
28
+ connectedApps.clear();
29
+ });
30
+ afterEach(() => connectedApps.clear());
31
+ describe("collectTimeline from buffers", () => {
32
+ it("merges actions, logs, requests and restarts in the window, and never reads the app when disconnected", async () => {
33
+ recordAction({ tool: "tap", args: { testID: "add" }, startedAt: NOW - 5000, endedAt: NOW - 4000, ok: true });
34
+ recordAction({ tool: "tap", args: { testID: "old" }, startedAt: NOW - 60_000, endedAt: NOW - 59_000, ok: true });
35
+ getLogBuffer("iPhone").add({ level: "error", message: "boom", timestamp: new Date(NOW - 3000) });
36
+ getNetworkBuffer("iPhone").set("7", { requestId: "7", timestamp: new Date(NOW - 4500), method: "GET", url: "https://a.com/x", headers: {}, completed: true, status: 200, epoch: 1 });
37
+ bumpEpoch("iPhone");
38
+ const r = await collectTimeline({ sources: [...ALL], window }, noDeps);
39
+ expect(r.devices).toEqual(["iPhone"]);
40
+ expect(r.events.map((e) => e.kind).sort()).toEqual(["action", "log", "request", "restart"]);
41
+ expect(r.events.find((e) => e.kind === "action")?.text).toContain("testID=add");
42
+ expect(r.notes.join("\n")).toMatch(/routes.*not connected/);
43
+ });
44
+ it("treats the reserved perf source as quiet: no events, no note, not unavailable", async () => {
45
+ getLogBuffer("iPhone");
46
+ const r = await collectTimeline({ sources: ["perf"], window }, noDeps);
47
+ expect(r.events).toEqual([]);
48
+ expect(r.notes).toEqual([]);
49
+ expect(r.unavailable).toEqual([]);
50
+ });
51
+ it("always includes restarts, even when only logs were asked for", async () => {
52
+ getLogBuffer("iPhone").add({ level: "log", message: "x", timestamp: new Date(NOW - 1000) });
53
+ bumpEpoch("iPhone");
54
+ const r = await collectTimeline({ sources: ["logs"], window }, noDeps);
55
+ expect(r.events.map((e) => e.kind).sort()).toEqual(["log", "restart"]);
56
+ });
57
+ it("tags an action with no device when several devices are merged", async () => {
58
+ getLogBuffer("iPhone");
59
+ getLogBuffer("Pixel");
60
+ recordAction({ tool: "tap", args: { testID: "a" }, startedAt: NOW - 1000, endedAt: NOW, ok: true });
61
+ recordAction({ tool: "tap", args: { testID: "b", device: "pixel" }, startedAt: NOW - 900, endedAt: NOW, ok: true });
62
+ const r = await collectTimeline({ sources: ["actions"], window }, noDeps);
63
+ expect(r.events.map((e) => e.device)).toEqual(["default", "Pixel"]);
64
+ });
65
+ it("filters to one device by substring", async () => {
66
+ getLogBuffer("iPhone 17 Pro").add({ level: "log", message: "ios", timestamp: new Date(NOW - 1000) });
67
+ getLogBuffer("Pixel 9").add({ level: "log", message: "android", timestamp: new Date(NOW - 1000) });
68
+ recordAction({ tool: "tap", args: { testID: "p", device: "pixel" }, startedAt: NOW - 1000, endedAt: NOW, ok: true });
69
+ const r = await collectTimeline({ device: "iphone", sources: ["logs", "actions"], window }, noDeps);
70
+ expect(r.devices).toEqual(["iPhone 17 Pro"]);
71
+ expect(r.events.map((e) => e.text).join("\n")).toContain("ios");
72
+ expect(r.events.map((e) => e.text).join("\n")).not.toContain("android");
73
+ expect(r.events.some((e) => e.kind === "action")).toBe(false);
74
+ });
75
+ it("shows hosts only when the window holds more than one", async () => {
76
+ const nb = getNetworkBuffer("iPhone");
77
+ nb.set("1", { requestId: "1", timestamp: new Date(NOW - 2000), method: "GET", url: "https://a.com/x", headers: {}, completed: true, status: 200, epoch: 1 });
78
+ nb.set("2", { requestId: "2", timestamp: new Date(NOW - 1000), method: "GET", url: "https://b.com/y", headers: {}, completed: true, status: 200, epoch: 1 });
79
+ const r = await collectTimeline({ sources: ["network"], window }, noDeps);
80
+ expect(r.events.map((e) => e.text).join("\n")).toContain("a.com/x");
81
+ });
82
+ });
83
+ describe("collectTimeline in-app sources", () => {
84
+ it("reads routes and refresh from a connected RN app, shifted by the clock offset", async () => {
85
+ connect("Pixel 9", "android");
86
+ getLogBuffer("Pixel 9");
87
+ const deps = {
88
+ probeDeviceNow: async () => Date.now() + 2000,
89
+ readRoutes: async () => [{ route: "Cart", from: "Home", enteredAt: NOW - 1000 + 2000 }],
90
+ readRefresh: async () => [{ at: NOW - 500 + 2000, modulePath: "/src/Cart.tsx" }],
91
+ };
92
+ const r = await collectTimeline({ sources: ["routes", "refresh"], window }, deps);
93
+ const route = r.events.find((e) => e.kind === "route");
94
+ expect(Math.abs(route.at - (NOW - 1000))).toBeLessThan(200);
95
+ expect(r.events.find((e) => e.kind === "refresh")?.text).toBe("↻ edit applied: Cart.tsx");
96
+ expect(r.notes.join("\n")).toMatch(/clock/i);
97
+ expect(r.notes.join("\n")).toMatch(/Network and log rows .* not corrected/);
98
+ });
99
+ it("skips the clock probe on the iOS simulator", async () => {
100
+ connect("iPhone", "ios", { simulatorUdid: "ABC" });
101
+ const deps = { ...noDeps, readRoutes: async () => [], readRefresh: async () => [] };
102
+ const r = await collectTimeline({ sources: ["routes", "refresh"], window }, deps);
103
+ expect(r.unavailable).toEqual([]);
104
+ });
105
+ it("names a failed in-app source and keeps the rest", async () => {
106
+ connect("iPhone", "ios", { simulatorUdid: "ABC" });
107
+ getLogBuffer("iPhone").add({ level: "log", message: "kept", timestamp: new Date(NOW - 1000) });
108
+ const deps = { ...noDeps, readRoutes: async () => { throw new Error("eval timed out"); }, readRefresh: async () => [] };
109
+ const r = await collectTimeline({ sources: ["routes", "logs", "refresh"], window }, deps);
110
+ expect(r.unavailable).toEqual(["routes"]);
111
+ expect(r.notes.join("\n")).toContain("routes: unavailable (eval timed out)");
112
+ expect(r.events.some((e) => e.text.includes("kept"))).toBe(true);
113
+ });
114
+ it("reads chromium routes from the navigation trail without evaluating in the page", async () => {
115
+ connect("FluentTalk", "chromium");
116
+ recordChromiumNavigation("FluentTalk", "http://x/home", 1, NOW - 3000);
117
+ recordChromiumNavigation("FluentTalk", "http://x/settings", 1, NOW - 2000);
118
+ const r = await collectTimeline({ sources: ["routes", "refresh"], window }, noDeps);
119
+ expect(r.events.map((e) => e.text)).toEqual(["➜ route /home", "➜ route /settings (from /home)"]);
120
+ });
121
+ });
122
+ describe("timelineDevices", () => {
123
+ it("lists buffered and connected devices, or the one matching", () => {
124
+ getLogBuffer("iPhone");
125
+ connect("Pixel", "android");
126
+ expect(timelineDevices().sort()).toEqual(["Pixel", "iPhone"]);
127
+ expect(timelineDevices("pix")).toEqual(["Pixel"]);
128
+ });
129
+ it("prefers an exact name over a longer one that contains it", () => {
130
+ getLogBuffer("iPhone 17 Pro Max");
131
+ getLogBuffer("iPhone 17 Pro");
132
+ expect(timelineDevices("iPhone 17 Pro")).toEqual(["iPhone 17 Pro"]);
133
+ });
134
+ it("refuses a device it cannot find instead of answering with an empty window", () => {
135
+ getLogBuffer("iPhone");
136
+ expect(() => timelineDevices("emulator-5554")).toThrow(/emulator-5554/);
137
+ });
138
+ });
139
+ //# sourceMappingURL=timelineSources.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timelineSources.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/timelineSources.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=timelineTool.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timelineTool.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/timelineTool.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ process.env.EXECBRO_TEST_MODE = "1";
2
+ import { describe, it, expect, beforeEach } from "@jest/globals";
3
+ const { toolRegistry } = await import("../../core/register.js");
4
+ const { registerTimelineTools } = await import("../../tools/timelineTools.js");
5
+ registerTimelineTools({ registerTool: () => undefined });
6
+ const { recordAction, resetActionLog } = await import("../../core/actionLog.js");
7
+ const { logBuffers, networkBuffers, connectedApps, getLogBuffer, resetEpochs } = await import("../../core/state.js");
8
+ const { CHROMIUM_TOOLS } = await import("../../core/chromiumCapabilities.js");
9
+ const call = (args) => toolRegistry.get("get_timeline").handler(args);
10
+ beforeEach(() => {
11
+ resetActionLog();
12
+ resetEpochs();
13
+ logBuffers.clear();
14
+ networkBuffers.clear();
15
+ connectedApps.clear();
16
+ });
17
+ describe("get_timeline", () => {
18
+ it("is registered and allowed on chromium", () => {
19
+ expect(toolRegistry.has("get_timeline")).toBe(true);
20
+ expect(CHROMIUM_TOOLS.has("get_timeline")).toBe(true);
21
+ });
22
+ it("starts at the last action by default", async () => {
23
+ const now = Date.now();
24
+ recordAction({ tool: "tap", args: { testID: "add-to-cart" }, startedAt: now - 2000, endedAt: now - 1500, ok: true, meaningful: true });
25
+ getLogBuffer("iPhone").add({ level: "log", message: "before", timestamp: new Date(now - 5000) });
26
+ getLogBuffer("iPhone").add({ level: "log", message: "cart updated", timestamp: new Date(now - 1000) });
27
+ const r = await call({ sources: ["actions", "logs"] });
28
+ const text = r.content[0].text;
29
+ expect(text).toMatch(/^Timeline \(iPhone\) since ▶ tap testID=add-to-cart/);
30
+ expect(text).toContain("cart updated");
31
+ expect(text).not.toContain("before");
32
+ expect(r._emptyResult).toBe(false);
33
+ });
34
+ it("says so when it falls back to the last 60s", async () => {
35
+ const r = await call({ sources: ["logs"] });
36
+ expect(r.content[0].text).toContain("No action recorded yet");
37
+ expect(r._emptyResult).toBe(true);
38
+ });
39
+ it("applies the default limit even when zod defaults are skipped", async () => {
40
+ const now = Date.now();
41
+ for (let i = 0; i < 150; i++)
42
+ getLogBuffer("iPhone").add({ level: "log", message: `m${i}`, timestamp: new Date(now - 10_000 + i) });
43
+ const r = await call({ since: "-30s", sources: ["logs"] });
44
+ expect(r.content[0].text).toContain("Over the limit, omitted: logs 50.");
45
+ });
46
+ it("rejects a bad window with the accepted formats", async () => {
47
+ await expect(call({ since: "yesterday" })).rejects.toThrow(/-30s/);
48
+ });
49
+ it("errors only when every requested source failed", async () => {
50
+ const r = await call({ since: "-30s", sources: ["refresh"] });
51
+ expect(r.isError).toBe(true);
52
+ });
53
+ it("answers a perf-only read with a plain empty window", async () => {
54
+ getLogBuffer("iPhone");
55
+ const r = await call({ since: "-30s", sources: ["perf"] });
56
+ expect(r.isError).toBeUndefined();
57
+ expect(r.content[0].text).toBe("Nothing happened in the 30.0s since -30s on iPhone.");
58
+ });
59
+ it("never names perf in the checked list", async () => {
60
+ getLogBuffer("iPhone");
61
+ const r = await call({ since: "-30s", sources: ["logs", "perf"] });
62
+ expect(r.content[0].text).toContain("(checked: logs)");
63
+ });
64
+ });
65
+ //# sourceMappingURL=timelineTool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timelineTool.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/timelineTool.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,21 @@
1
1
  process.env.RN_AI_DEVTOOLS_TEST_MODE = "1";
2
- import { describe, it, expect, beforeEach } from "@jest/globals";
3
- import { toolRegistry } from "../../index.js";
4
- import { vaultAdd, resetVaultForTests } from "../../core/vault.js";
2
+ import { jest, describe, it, expect, beforeEach } from "@jest/globals";
3
+ jest.unstable_mockModule("../../core/license.js", () => ({
4
+ ensureLicense: jest.fn(async () => ({ tier: "free" })),
5
+ getUsageInfo: jest.fn(() => null),
6
+ getPricingInfo: jest.fn(() => null),
7
+ getDashboardUrl: jest.fn(() => ""),
8
+ GRACE_WINDOW_MS: 0,
9
+ computeOfflineUsage: jest.fn(),
10
+ formatPlanPrice: jest.fn(),
11
+ getLicenseStatus: jest.fn(),
12
+ incrementLocalUsage: jest.fn(),
13
+ refreshLicense: jest.fn(),
14
+ requestLinkToken: jest.fn(),
15
+ resetLicense: jest.fn(),
16
+ }));
17
+ const { toolRegistry } = await import("../../index.js");
18
+ const { vaultAdd, resetVaultForTests } = await import("../../core/vault.js");
5
19
  describe("Phase 2 tool surface", () => {
6
20
  beforeEach(resetVaultForTests);
7
21
  it("registers all three tools", () => {
@@ -36,13 +50,13 @@ describe("Phase 2 tool surface", () => {
36
50
  describe("list_secrets marks which credential an origin sends", () => {
37
51
  beforeEach(resetVaultForTests);
38
52
  it("flags the slot holder when one origin has two credentials", async () => {
39
- vaultAdd("bearer-token-aaaaaaaaaaaaa", "auth", "https://gifted.fyi/a");
40
- vaultAdd("redux-secret-bbbbbbbbbbbbb", "auth", "https://gifted.fyi/b");
53
+ vaultAdd("bearer-token-aaaaaaaaaaaaa", "auth", "https://appa.test/a");
54
+ vaultAdd("redux-secret-bbbbbbbbbbbbb", "auth", "https://appa.test/b");
41
55
  const out = await toolRegistry.get("list_secrets").handler({});
42
56
  const text = out.content[0].text;
43
57
  const marked = text.split("\n").filter((l) => l.includes("<- sent for"));
44
58
  expect(marked).toHaveLength(1);
45
- expect(marked[0]).toContain("auth_gifted.fyi#2");
59
+ expect(marked[0]).toContain("auth_appa.test#2");
46
60
  expect(text).toContain("or a handle to pin one exact value");
47
61
  });
48
62
  });
@@ -1 +1 @@
1
- {"version":3,"file":"vaultTools.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/vaultTools.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vaultTools.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/vaultTools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface ActionEntry {
2
+ tool: string;
3
+ device: string | null;
4
+ startedAt: number;
5
+ endedAt: number;
6
+ ok: boolean;
7
+ summary: string;
8
+ outcome?: string;
9
+ }
10
+ export interface ActionInput {
11
+ tool: string;
12
+ args: unknown;
13
+ startedAt: number;
14
+ endedAt: number;
15
+ ok: boolean;
16
+ error?: string;
17
+ meaningful?: boolean;
18
+ }
19
+ export declare const ACTION_TOOLS: ReadonlySet<string>;
20
+ export declare function summarizeArgs(tool: string, args: unknown): string;
21
+ export declare function recordAction(input: ActionInput): void;
22
+ export declare function getActions(): ActionEntry[];
23
+ export declare function deviceMatches(entryDevice: string | null, key: string): boolean;
24
+ export declare function lastAction(device?: string): ActionEntry | null;
25
+ export declare function actionLabel(a: ActionEntry): string;
26
+ export declare function resetActionLog(): void;
27
+ //# sourceMappingURL=actionLog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionLog.d.ts","sourceRoot":"","sources":["../../src/core/actionLog.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,CAK3C,CAAC;AA6BH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CA+DjE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAsBrD;AAED,wBAAgB,UAAU,IAAI,WAAW,EAAE,CAE1C;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAI9E;AAOD,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQ9D;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
@@ -0,0 +1,144 @@
1
+ import { redactSecrets, redactionEnabled } from "./redact.js";
2
+ export const ACTION_TOOLS = new Set([
3
+ "tap", "swipe", "pinch", "input_text", "press_key", "navigate", "dismiss_keyboard",
4
+ "handle_dialog", "ios_button", "android_key_event", "android_long_press", "ios_open_url",
5
+ "reload_app", "ios_launch_app", "android_launch_app", "electron_launch_app", "ios_terminate_app",
6
+ "network_mock", "network_condition", "redux_dispatch", "execute_in_app", "app_request", "network_replay",
7
+ ]);
8
+ const CAP = 200;
9
+ let entries = [];
10
+ function str(v) {
11
+ return typeof v === "string" && v.length > 0 ? v : undefined;
12
+ }
13
+ function num(v) {
14
+ return typeof v === "number" && Number.isFinite(v) ? v : undefined;
15
+ }
16
+ function cut(s, max) {
17
+ const one = (redactionEnabled() ? redactSecrets(s) : s).replace(/\s+/g, " ").trim();
18
+ return one.length > max ? `${one.slice(0, max)}…` : one;
19
+ }
20
+ function pathOf(url) {
21
+ try {
22
+ const u = new URL(url);
23
+ return u.pathname + u.search;
24
+ }
25
+ catch {
26
+ return url;
27
+ }
28
+ }
29
+ export function summarizeArgs(tool, args) {
30
+ const a = (args && typeof args === "object" ? args : {});
31
+ switch (tool) {
32
+ case "tap": {
33
+ const x = num(a.x), y = num(a.y);
34
+ const target = str(a.testID) ? `testID=${a.testID}`
35
+ : str(a.text) ? `text=${JSON.stringify(cut(a.text, 40))}`
36
+ : str(a.component) ? `component=${a.component}`
37
+ : x !== undefined && y !== undefined ? `(${x},${y})` : "";
38
+ const hold = num(a.duration) ? ` hold ${a.duration}ms` : "";
39
+ return `${target}${hold}`;
40
+ }
41
+ case "swipe":
42
+ return str(a.direction) ?? `(${a.startX},${a.startY})→(${a.endX},${a.endY})`;
43
+ case "pinch":
44
+ return [str(a.direction), num(a.scale) !== undefined ? `scale ${a.scale}` : undefined].filter(Boolean).join(" ");
45
+ case "input_text": {
46
+ const target = str(a.testID) ? `testID=${a.testID}`
47
+ : str(a.component) ? `component=${a.component}`
48
+ : str(a.textMatch) ? `field ${JSON.stringify(cut(a.textMatch, 40))}`
49
+ : "focused field";
50
+ const n = typeof a.text === "string" ? a.text.length : 0;
51
+ return `${target} ${n} chars${a.replace === true ? " replace" : ""}`;
52
+ }
53
+ case "press_key":
54
+ return `${str(a.key) ?? ""}${num(a.repeat) && a.repeat > 1 ? ` ×${a.repeat}` : ""}`;
55
+ case "navigate":
56
+ return str(a.to) ?? str(a.screen) ?? "";
57
+ case "execute_in_app":
58
+ return cut(str(a.expression) ?? str(a.code) ?? str(a.script) ?? str(a.collect) ?? "", 60);
59
+ case "network_mock":
60
+ return [str(a.action), str(a.url) ?? str(a.id)].filter(Boolean).join(" ");
61
+ case "network_condition":
62
+ return str(a.mode) ?? "";
63
+ case "redux_dispatch": {
64
+ const list = Array.isArray(a.action) ? a.action : [a.action];
65
+ return list.map((x) => (x && typeof x === "object" ? str(x.type) : undefined))
66
+ .filter(Boolean).join(", ");
67
+ }
68
+ case "app_request":
69
+ return `${str(a.method) ?? "GET"} ${str(a.url) ? pathOf(a.url) : ""}`.trim();
70
+ case "network_replay":
71
+ return str(a.requestId) ? `request ${a.requestId}` : "";
72
+ case "ios_open_url":
73
+ return str(a.url) ? cut(a.url, 60) : "";
74
+ case "ios_button":
75
+ return str(a.button) ?? "";
76
+ case "android_key_event":
77
+ return str(a.key) ?? "";
78
+ case "android_long_press":
79
+ return `(${a.x},${a.y})`;
80
+ case "handle_dialog":
81
+ return str(a.action) ?? "";
82
+ case "ios_launch_app":
83
+ case "ios_terminate_app":
84
+ return str(a.bundleId) ?? "";
85
+ case "android_launch_app":
86
+ return str(a.packageName) ?? "";
87
+ case "electron_launch_app":
88
+ return str(a.projectPath)?.split("/").filter(Boolean).pop() ?? "";
89
+ default:
90
+ return "";
91
+ }
92
+ }
93
+ export function recordAction(input) {
94
+ try {
95
+ if (!ACTION_TOOLS.has(input.tool))
96
+ return;
97
+ const args = (input.args && typeof input.args === "object" ? input.args : {});
98
+ const outcome = !input.ok
99
+ ? cut(input.error ?? "error", 80).replace(/…$/, "")
100
+ : input.meaningful === true ? "screen changed"
101
+ : input.meaningful === false ? "no visible change"
102
+ : undefined;
103
+ entries.push({
104
+ tool: input.tool,
105
+ device: str(args.device) ?? null,
106
+ startedAt: input.startedAt,
107
+ endedAt: input.endedAt,
108
+ ok: input.ok,
109
+ summary: summarizeArgs(input.tool, args),
110
+ outcome,
111
+ });
112
+ if (entries.length > CAP)
113
+ entries.shift();
114
+ }
115
+ catch {
116
+ }
117
+ }
118
+ export function getActions() {
119
+ return [...entries];
120
+ }
121
+ export function deviceMatches(entryDevice, key) {
122
+ if (!entryDevice)
123
+ return true;
124
+ const a = entryDevice.toLowerCase(), b = key.toLowerCase();
125
+ return a.includes(b) || b.includes(a);
126
+ }
127
+ export function lastAction(device) {
128
+ let fallback = null;
129
+ for (let i = entries.length - 1; i >= 0; i--) {
130
+ if (device && !deviceMatches(entries[i].device, device))
131
+ continue;
132
+ if (entries[i].tool !== "execute_in_app")
133
+ return entries[i];
134
+ fallback ??= entries[i];
135
+ }
136
+ return fallback;
137
+ }
138
+ export function actionLabel(a) {
139
+ return a.summary ? `${a.tool} ${a.summary}` : a.tool;
140
+ }
141
+ export function resetActionLog() {
142
+ entries = [];
143
+ }
144
+ //# sourceMappingURL=actionLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionLog.js","sourceRoot":"","sources":["../../src/core/actionLog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { ScreenState } from "./screenState.js";
2
+ import { type TimelineEvent } from "./timeline.js";
3
+ export interface SnapshotItem {
4
+ text: string;
5
+ x: number;
6
+ y: number;
7
+ }
8
+ export interface OutcomeSnapshot {
9
+ route: string | null;
10
+ items: SnapshotItem[];
11
+ }
12
+ export interface ActionOutcome {
13
+ route?: string;
14
+ text?: string[];
15
+ network?: string[];
16
+ console?: string[];
17
+ restart?: string;
18
+ scroll?: string;
19
+ pending?: string;
20
+ unavailable?: string[];
21
+ }
22
+ export declare const TEXT_DIFF_CAP = 10;
23
+ export declare function snapshotFromScreenState(ss: ScreenState): OutcomeSnapshot;
24
+ export declare const ORDER_STEP = 5;
25
+ export declare function snapshotFromLines(route: string | null, lines: string[]): OutcomeSnapshot;
26
+ export declare function diffSnapshots(before: OutcomeSnapshot, after: OutcomeSnapshot, cap?: number): string[];
27
+ export declare function buildOutcome(input: {
28
+ before: OutcomeSnapshot | null;
29
+ after: OutcomeSnapshot | null;
30
+ events: TimelineEvent[];
31
+ pending: number;
32
+ capped: boolean;
33
+ unavailable: string[];
34
+ }): ActionOutcome;
35
+ //# sourceMappingURL=actionOutcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionOutcome.d.ts","sourceRoot":"","sources":["../../src/core/actionOutcome.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAwB,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAQ,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEzD,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,eAAO,MAAM,aAAa,KAAK,CAAC;AAsBhC,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,WAAW,GAAG,eAAe,CAWxE;AAGD,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,eAAe,CAExF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,EAAE,CAoFpH;AAkBD,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAChC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB,GAAG,aAAa,CA+BhB"}