react-native-ai-debugger 2.18.1 → 2.19.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 (101) 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/chromiumNavigation.test.d.ts +2 -0
  7. package/build/__tests__/unit/chromiumNavigation.test.d.ts.map +1 -0
  8. package/build/__tests__/unit/chromiumNavigation.test.js +36 -0
  9. package/build/__tests__/unit/chromiumNavigation.test.js.map +1 -0
  10. package/build/__tests__/unit/commitRecorder.test.d.ts +2 -0
  11. package/build/__tests__/unit/commitRecorder.test.d.ts.map +1 -0
  12. package/build/__tests__/unit/commitRecorder.test.js +141 -0
  13. package/build/__tests__/unit/commitRecorder.test.js.map +1 -0
  14. package/build/__tests__/unit/commitRecorderInjected.test.d.ts +2 -0
  15. package/build/__tests__/unit/commitRecorderInjected.test.d.ts.map +1 -0
  16. package/build/__tests__/unit/commitRecorderInjected.test.js +195 -0
  17. package/build/__tests__/unit/commitRecorderInjected.test.js.map +1 -0
  18. package/build/__tests__/unit/epochStarts.test.d.ts +2 -0
  19. package/build/__tests__/unit/epochStarts.test.d.ts.map +1 -0
  20. package/build/__tests__/unit/epochStarts.test.js +35 -0
  21. package/build/__tests__/unit/epochStarts.test.js.map +1 -0
  22. package/build/__tests__/unit/timeline.test.d.ts +2 -0
  23. package/build/__tests__/unit/timeline.test.d.ts.map +1 -0
  24. package/build/__tests__/unit/timeline.test.js +157 -0
  25. package/build/__tests__/unit/timeline.test.js.map +1 -0
  26. package/build/__tests__/unit/timelineReadBounds.test.d.ts +2 -0
  27. package/build/__tests__/unit/timelineReadBounds.test.d.ts.map +1 -0
  28. package/build/__tests__/unit/timelineReadBounds.test.js +21 -0
  29. package/build/__tests__/unit/timelineReadBounds.test.js.map +1 -0
  30. package/build/__tests__/unit/timelineSources.test.d.ts +2 -0
  31. package/build/__tests__/unit/timelineSources.test.d.ts.map +1 -0
  32. package/build/__tests__/unit/timelineSources.test.js +139 -0
  33. package/build/__tests__/unit/timelineSources.test.js.map +1 -0
  34. package/build/__tests__/unit/timelineTool.test.d.ts +2 -0
  35. package/build/__tests__/unit/timelineTool.test.d.ts.map +1 -0
  36. package/build/__tests__/unit/timelineTool.test.js +65 -0
  37. package/build/__tests__/unit/timelineTool.test.js.map +1 -0
  38. package/build/__tests__/unit/vaultTools.test.js +17 -3
  39. package/build/__tests__/unit/vaultTools.test.js.map +1 -1
  40. package/build/core/actionLog.d.ts +27 -0
  41. package/build/core/actionLog.d.ts.map +1 -0
  42. package/build/core/actionLog.js +144 -0
  43. package/build/core/actionLog.js.map +1 -0
  44. package/build/core/chromiumCapabilities.js +1 -1
  45. package/build/core/chromiumCapabilities.js.map +1 -1
  46. package/build/core/chromiumNavigation.d.ts +10 -0
  47. package/build/core/chromiumNavigation.d.ts.map +1 -0
  48. package/build/core/chromiumNavigation.js +31 -0
  49. package/build/core/chromiumNavigation.js.map +1 -0
  50. package/build/core/chromiumScreen.d.ts.map +1 -1
  51. package/build/core/chromiumScreen.js +6 -8
  52. package/build/core/chromiumScreen.js.map +1 -1
  53. package/build/core/commitRecorder.d.ts +35 -0
  54. package/build/core/commitRecorder.d.ts.map +1 -0
  55. package/build/core/commitRecorder.js +115 -0
  56. package/build/core/commitRecorder.js.map +1 -0
  57. package/build/core/connection.d.ts.map +1 -1
  58. package/build/core/connection.js +13 -0
  59. package/build/core/connection.js.map +1 -1
  60. package/build/core/guides.d.ts.map +1 -1
  61. package/build/core/guides.js +2 -0
  62. package/build/core/guides.js.map +1 -1
  63. package/build/core/injected/commitRecorder.d.ts +2 -0
  64. package/build/core/injected/commitRecorder.d.ts.map +1 -0
  65. package/build/core/injected/commitRecorder.js +93 -0
  66. package/build/core/injected/commitRecorder.js.map +1 -0
  67. package/build/core/register.d.ts.map +1 -1
  68. package/build/core/register.js +2 -0
  69. package/build/core/register.js.map +1 -1
  70. package/build/core/routeHistory.d.ts +3 -2
  71. package/build/core/routeHistory.d.ts.map +1 -1
  72. package/build/core/routeHistory.js +6 -6
  73. package/build/core/routeHistory.js.map +1 -1
  74. package/build/core/state.d.ts +4 -0
  75. package/build/core/state.d.ts.map +1 -1
  76. package/build/core/state.js +11 -0
  77. package/build/core/state.js.map +1 -1
  78. package/build/core/timeline.d.ts +59 -0
  79. package/build/core/timeline.d.ts.map +1 -0
  80. package/build/core/timeline.js +156 -0
  81. package/build/core/timeline.js.map +1 -0
  82. package/build/core/timelineSources.d.ts +30 -0
  83. package/build/core/timelineSources.d.ts.map +1 -0
  84. package/build/core/timelineSources.js +179 -0
  85. package/build/core/timelineSources.js.map +1 -0
  86. package/build/core/toolHelpers.d.ts +1 -0
  87. package/build/core/toolHelpers.d.ts.map +1 -1
  88. package/build/core/toolHelpers.js +1 -1
  89. package/build/core/toolHelpers.js.map +1 -1
  90. package/build/index.d.ts.map +1 -1
  91. package/build/index.js +2 -0
  92. package/build/index.js.map +1 -1
  93. package/build/tools/metaTools.d.ts.map +1 -1
  94. package/build/tools/metaTools.js +15 -1
  95. package/build/tools/metaTools.js.map +1 -1
  96. package/build/tools/timelineTools.d.ts +3 -0
  97. package/build/tools/timelineTools.d.ts.map +1 -0
  98. package/build/tools/timelineTools.js +48 -0
  99. package/build/tools/timelineTools.js.map +1 -0
  100. package/package.json +1 -1
  101. package/tools.json +9 -1
@@ -0,0 +1,35 @@
1
+ import { describe, it, expect, beforeEach } from "@jest/globals";
2
+ import { bumpEpoch, epochStarts, resetEpochs } from "../../core/state.js";
3
+ describe("epochStarts", () => {
4
+ beforeEach(() => resetEpochs());
5
+ it("records when each new app run began, per device", () => {
6
+ const before = Date.now();
7
+ bumpEpoch("iPhone 17 Pro");
8
+ bumpEpoch("iPhone 17 Pro");
9
+ bumpEpoch("Pixel 9");
10
+ const after = Date.now();
11
+ const iphone = epochStarts("iPhone 17 Pro");
12
+ expect(iphone.map((e) => e.epoch)).toEqual([2, 3]);
13
+ for (const e of iphone) {
14
+ expect(e.at).toBeGreaterThanOrEqual(before);
15
+ expect(e.at).toBeLessThanOrEqual(after);
16
+ }
17
+ expect(epochStarts("Pixel 9").map((e) => e.epoch)).toEqual([2]);
18
+ });
19
+ it("is empty for a device that never restarted", () => {
20
+ expect(epochStarts("never")).toEqual([]);
21
+ });
22
+ it("keeps the last 50 starts", () => {
23
+ for (let i = 0; i < 60; i++)
24
+ bumpEpoch("d");
25
+ const starts = epochStarts("d");
26
+ expect(starts).toHaveLength(50);
27
+ expect(starts[starts.length - 1].epoch).toBe(61);
28
+ });
29
+ it("is cleared by resetEpochs", () => {
30
+ bumpEpoch("d");
31
+ resetEpochs();
32
+ expect(epochStarts("d")).toEqual([]);
33
+ });
34
+ });
35
+ //# sourceMappingURL=epochStarts.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epochStarts.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/epochStarts.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE1E,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAEhC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,SAAS,CAAC,eAAe,CAAC,CAAC;QAC3B,SAAS,CAAC,eAAe,CAAC,CAAC;QAC3B,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,MAAM,MAAM,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACjC,SAAS,CAAC,GAAG,CAAC,CAAC;QACf,WAAW,EAAE,CAAC;QACd,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=timeline.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/timeline.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,157 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { resolveWindow, actionEvent, logEvent, requestEvent, routeEvent, restartEvent, refreshEvent, sortEvents, trimEvents, formatRelative, formatTimeline, FALLBACK_WINDOW_MS, } from "../../core/timeline.js";
3
+ const NOW = 1_800_000_000_000;
4
+ const tapAction = { tool: "tap", device: null, startedAt: NOW - 3400, endedAt: NOW - 2400, ok: true, summary: "testID=add-to-cart", outcome: "screen changed" };
5
+ function log(level, message, at, seq = 1) {
6
+ return { level, message, timestamp: new Date(at), seq, epoch: 1 };
7
+ }
8
+ function req(over) {
9
+ return { requestId: "42", timestamp: new Date(NOW - 3000), method: "GET", url: "https://api.shop.com/cart", headers: {}, completed: true, epoch: 1, ...over };
10
+ }
11
+ describe("resolveWindow", () => {
12
+ it("rejects an until earlier than the last action instead of an empty window", () => {
13
+ expect(() => resolveWindow({ until: NOW - 5000, now: NOW, lastAction: tapAction })).toThrow(/before the last action/);
14
+ });
15
+ it("defaults to the last action", () => {
16
+ const w = resolveWindow({ now: NOW, lastAction: tapAction });
17
+ expect(w).toEqual({ start: NOW - 3400, end: NOW, label: "▶ tap testID=add-to-cart", fallback: false });
18
+ });
19
+ it("falls back to the last 60s when nothing was done yet", () => {
20
+ const w = resolveWindow({ now: NOW, lastAction: null });
21
+ expect(w.start).toBe(NOW - FALLBACK_WINDOW_MS);
22
+ expect(w.fallback).toBe(true);
23
+ });
24
+ it("accepts relative strings", () => {
25
+ expect(resolveWindow({ since: "-30s", now: NOW, lastAction: null }).start).toBe(NOW - 30_000);
26
+ expect(resolveWindow({ since: "-5m", now: NOW, lastAction: null }).start).toBe(NOW - 300_000);
27
+ expect(resolveWindow({ since: "-1h", now: NOW, lastAction: null }).start).toBe(NOW - 3_600_000);
28
+ expect(resolveWindow({ since: "-250ms", now: NOW, lastAction: null }).start).toBe(NOW - 250);
29
+ });
30
+ it("accepts epoch ms as a number or a numeric string", () => {
31
+ expect(resolveWindow({ since: NOW - 10, now: NOW, lastAction: null }).start).toBe(NOW - 10);
32
+ expect(resolveWindow({ since: String(NOW - 10), now: NOW, lastAction: null }).start).toBe(NOW - 10);
33
+ });
34
+ it("rejects nonsense with a message naming the formats", () => {
35
+ expect(() => resolveWindow({ since: "yesterday", now: NOW, lastAction: null })).toThrow(/-30s/);
36
+ expect(() => resolveWindow({ until: "last_action", now: NOW, lastAction: tapAction })).toThrow(/until/);
37
+ expect(() => resolveWindow({ since: "-1s", until: "-5s", now: NOW, lastAction: null })).toThrow(/after/);
38
+ });
39
+ });
40
+ describe("event builders", () => {
41
+ it("renders an action with its outcome, and a failure", () => {
42
+ expect(actionEvent(tapAction, "d").text).toBe("▶ tap testID=add-to-cart → ok, screen changed");
43
+ expect(actionEvent({ ...tapAction, ok: false, outcome: "no element" }, "d").text).toBe("▶ tap testID=add-to-cart → failed: no element");
44
+ });
45
+ it("marks log levels and keeps the j id", () => {
46
+ const e = logEvent(log("error", "Failed to load", NOW, 813), "d");
47
+ expect(e.text).toBe('✖ error "Failed to load" [j813]');
48
+ expect(e.tier).toBe(4);
49
+ expect(logEvent(log("warn", "slow", NOW), "d").tier).toBe(6);
50
+ expect(logEvent(log("log", "x".repeat(300), NOW), "d").text.length).toBeLessThan(150);
51
+ });
52
+ it("renders request outcomes: status, failure, pending, mock", () => {
53
+ expect(requestEvent(req({ status: 201, method: "POST", timing: { duration: 180 } }), "d", false).text)
54
+ .toBe("⇄ POST /cart 201 · 180ms [n42]");
55
+ const failed = requestEvent(req({ status: 500 }), "d", false);
56
+ expect(failed.tier).toBe(5);
57
+ expect(requestEvent(req({ completed: false, status: undefined }), "d", false).text).toContain(" pending ");
58
+ expect(requestEvent(req({ error: "Network request failed", completed: true }), "d", false).text).toContain("failed: Network request failed");
59
+ expect(requestEvent(req({ status: 200, mocked: true }), "d", false).text).toContain("[MOCK] GET");
60
+ expect(requestEvent(req({ status: 200 }), "d", true).text).toContain("api.shop.com/cart");
61
+ });
62
+ it("renders routes, restarts and refreshes", () => {
63
+ expect(routeEvent({ route: "Cart", from: "ProductDetails", at: NOW }, "d").text).toBe("➜ route Cart (from ProductDetails)");
64
+ expect(routeEvent({ route: "Cart", from: null, at: NOW }, "d").text).toBe("➜ route Cart");
65
+ expect(restartEvent(3, NOW, "d").text).toBe("⟳ app restarted (epoch 3)");
66
+ expect(refreshEvent({ at: NOW, modulePath: "/app/src/Cart.tsx" }, NOW, "d").text).toBe("↻ edit applied: Cart.tsx");
67
+ expect(refreshEvent({ at: NOW }, NOW, "d").text).toBe("↻ edit applied (Fast Refresh)");
68
+ });
69
+ });
70
+ describe("sortEvents and trimEvents", () => {
71
+ it("orders same-millisecond events restart, action, route, request, log, refresh", () => {
72
+ const at = NOW;
73
+ const events = [
74
+ refreshEvent({ at }, at, "d"),
75
+ logEvent(log("log", "l", at), "d"),
76
+ requestEvent(req({ timestamp: new Date(at), status: 200 }), "d", false),
77
+ routeEvent({ route: "R", from: null, at }, "d"),
78
+ actionEvent({ ...tapAction, startedAt: at }, "d"),
79
+ restartEvent(2, at, "d"),
80
+ ];
81
+ expect(sortEvents(events).map((e) => e.kind)).toEqual(["restart", "action", "route", "request", "log", "refresh"]);
82
+ });
83
+ const perf = (at) => ({ at, kind: "perf", source: "perf", device: "d", tier: 2, text: "◷ settled" });
84
+ it("sorts a same-millisecond perf event after the route", () => {
85
+ const events = [requestEvent(req({ timestamp: new Date(NOW), status: 200 }), "d", false), perf(NOW), routeEvent({ route: "R", from: null, at: NOW }, "d")];
86
+ expect(sortEvents(events).map((e) => e.kind)).toEqual(["route", "perf", "request"]);
87
+ });
88
+ it("keeps perf at the route tier, ahead of refresh and errors", () => {
89
+ const events = [logEvent(log("error", "e", NOW - 3000, 1), "d"), refreshEvent({ at: NOW - 2000 }, NOW - 2000, "d"), perf(NOW - 1000)];
90
+ expect(trimEvents(events, 1).kept.map((e) => e.kind)).toEqual(["perf"]);
91
+ });
92
+ it("keeps high tiers first, earliest within a tier, and counts what it dropped", () => {
93
+ const events = [
94
+ actionEvent(tapAction, "d"),
95
+ ...Array.from({ length: 5 }, (_, i) => logEvent(log("log", `l${i}`, NOW - 3000 + i, i), "d")),
96
+ logEvent(log("error", "boom", NOW - 1000, 99), "d"),
97
+ requestEvent(req({ status: 200 }), "d", false),
98
+ ];
99
+ const { kept, dropped } = trimEvents(events, 4);
100
+ expect(kept.map((e) => e.text)).toEqual([
101
+ "▶ tap testID=add-to-cart → ok, screen changed",
102
+ "⇄ GET /cart 200 [n42]",
103
+ '· log "l0" [j0]',
104
+ '✖ error "boom" [j99]',
105
+ ]);
106
+ expect(dropped).toEqual({ logs: 4 });
107
+ });
108
+ it("returns everything sorted when under the limit", () => {
109
+ const { kept, dropped } = trimEvents([logEvent(log("log", "b", NOW), "d"), actionEvent(tapAction, "d")], 10);
110
+ expect(kept[0].kind).toBe("action");
111
+ expect(dropped).toEqual({});
112
+ });
113
+ });
114
+ describe("formatRelative", () => {
115
+ it("uses ms, then seconds, then minutes", () => {
116
+ expect(formatRelative(0)).toBe("+0ms");
117
+ expect(formatRelative(905)).toBe("+905ms");
118
+ expect(formatRelative(2100)).toBe("+2.1s");
119
+ expect(formatRelative(125_000)).toBe("+2m05s");
120
+ });
121
+ });
122
+ describe("formatTimeline", () => {
123
+ const window = { start: NOW - 3400, end: NOW, label: "▶ tap testID=add-to-cart", fallback: false };
124
+ it("renders header, lines, id hint and notes", () => {
125
+ const events = sortEvents([
126
+ actionEvent(tapAction, "iPhone"),
127
+ requestEvent(req({ timestamp: new Date(NOW - 3280), status: 201, method: "POST", timing: { duration: 180 } }), "iPhone", false),
128
+ logEvent(log("error", "Failed", NOW - 2495, 813), "iPhone"),
129
+ ]);
130
+ const text = formatTimeline({ window, deviceLabel: "iPhone", events, tagDevices: false, dropped: {}, notes: ["a note"], checked: ["actions", "network", "logs"] });
131
+ const lines = text.split("\n");
132
+ expect(lines[0]).toBe("Timeline (iPhone) since ▶ tap testID=add-to-cart · 3.4s · 3 events");
133
+ expect(lines[1]).toBe("+0ms ▶ tap testID=add-to-cart → ok, screen changed");
134
+ expect(lines[2]).toBe("+120ms ⇄ POST /cart 201 · 180ms [n42]");
135
+ expect(lines[3]).toBe('+905ms ✖ error "Failed" [j813]');
136
+ expect(text).toContain('get_log_details({ id: "j813" })');
137
+ expect(text).toContain('get_request_details({ requestId: "42" })');
138
+ expect(text).toContain("a note");
139
+ });
140
+ it("tags devices when several are merged", () => {
141
+ const text = formatTimeline({ window, deviceLabel: "all devices", events: [actionEvent(tapAction, "Pixel")], tagDevices: true, dropped: {}, notes: [], checked: ["actions"] });
142
+ expect(text).toContain("[Pixel] ▶ tap");
143
+ });
144
+ it("names what was dropped over the limit", () => {
145
+ const text = formatTimeline({ window, deviceLabel: "iPhone", events: [actionEvent(tapAction, "d")], tagDevices: false, dropped: { logs: 40, network: 12 }, notes: [], checked: ["actions"] });
146
+ expect(text).toContain("Over the limit, omitted: logs 40, network 12.");
147
+ });
148
+ it("says plainly when nothing happened", () => {
149
+ const text = formatTimeline({ window, deviceLabel: "iPhone", events: [], tagDevices: false, dropped: {}, notes: [], checked: ["actions", "logs"] });
150
+ expect(text).toBe("Nothing happened in the 3.4s since ▶ tap testID=add-to-cart on iPhone (checked: actions, logs).\nLog capture is not re-verified by this read; if you expected output, get_logs checks the pipeline.");
151
+ });
152
+ it("drops the checked list when nothing was checked", () => {
153
+ const text = formatTimeline({ window, deviceLabel: "iPhone", events: [], tagDevices: false, dropped: {}, notes: [], checked: [] });
154
+ expect(text).toBe("Nothing happened in the 3.4s since ▶ tap testID=add-to-cart on iPhone.");
155
+ });
156
+ });
157
+ //# sourceMappingURL=timeline.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/timeline.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=timelineReadBounds.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timelineReadBounds.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/timelineReadBounds.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { makeSourceDeps } from "../../core/timelineSources.js";
3
+ describe("timeline in-app reads", () => {
4
+ it("never retry, never reconnect, and give up within 3s", async () => {
5
+ const calls = [];
6
+ const deps = makeSourceDeps(async (_expr, _await, options) => {
7
+ calls.push(options);
8
+ return { success: true, result: "null" };
9
+ });
10
+ await deps.readRoutes("iPhone").catch(() => undefined);
11
+ await deps.readRefresh("iPhone").catch(() => undefined);
12
+ await deps.probeDeviceNow("iPhone").catch(() => undefined);
13
+ expect(calls.length).toBeGreaterThanOrEqual(3);
14
+ for (const o of calls) {
15
+ expect(o.maxRetries).toBe(0);
16
+ expect(o.autoReconnect).toBe(false);
17
+ expect(o.timeoutMs).toBeLessThanOrEqual(3000);
18
+ }
19
+ });
20
+ });
21
+ //# sourceMappingURL=timelineReadBounds.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timelineReadBounds.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/timelineReadBounds.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAI/D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,KAAK,GAA8B,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YACzD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACpB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,CAAC,CAAC,CAAC,SAAmB,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=timelineSources.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timelineSources.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/timelineSources.test.ts"],"names":[],"mappings":""}
@@ -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", () => {
@@ -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"}