execbro 2.7.0 → 2.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/build/__tests__/unit/deviceResolver.test.js +2 -0
  2. package/build/__tests__/unit/deviceResolver.test.js.map +1 -1
  3. package/build/__tests__/unit/deviceResolverStaleRetry.test.js +1 -0
  4. package/build/__tests__/unit/deviceResolverStaleRetry.test.js.map +1 -1
  5. package/build/__tests__/unit/feedbackRepoSlug.test.d.ts +2 -0
  6. package/build/__tests__/unit/feedbackRepoSlug.test.d.ts.map +1 -0
  7. package/build/__tests__/unit/feedbackRepoSlug.test.js +34 -0
  8. package/build/__tests__/unit/feedbackRepoSlug.test.js.map +1 -0
  9. package/build/__tests__/unit/fingerprint.test.js +34 -1
  10. package/build/__tests__/unit/fingerprint.test.js.map +1 -1
  11. package/build/__tests__/unit/getLogsNativeSource.test.js +7 -0
  12. package/build/__tests__/unit/getLogsNativeSource.test.js.map +1 -1
  13. package/build/__tests__/unit/hidTypeVerify.test.d.ts +2 -0
  14. package/build/__tests__/unit/hidTypeVerify.test.d.ts.map +1 -0
  15. package/build/__tests__/unit/hidTypeVerify.test.js +89 -0
  16. package/build/__tests__/unit/hidTypeVerify.test.js.map +1 -0
  17. package/build/__tests__/unit/iosKeyboardLayout.test.d.ts +2 -0
  18. package/build/__tests__/unit/iosKeyboardLayout.test.d.ts.map +1 -0
  19. package/build/__tests__/unit/iosKeyboardLayout.test.js +63 -0
  20. package/build/__tests__/unit/iosKeyboardLayout.test.js.map +1 -0
  21. package/build/__tests__/unit/jsonProjection.test.d.ts +2 -0
  22. package/build/__tests__/unit/jsonProjection.test.d.ts.map +1 -0
  23. package/build/__tests__/unit/jsonProjection.test.js +148 -0
  24. package/build/__tests__/unit/jsonProjection.test.js.map +1 -0
  25. package/build/__tests__/unit/logEvents.test.js +10 -1
  26. package/build/__tests__/unit/logEvents.test.js.map +1 -1
  27. package/build/__tests__/unit/logOwnership.test.js +58 -0
  28. package/build/__tests__/unit/logOwnership.test.js.map +1 -1
  29. package/build/__tests__/unit/logSourceIos.test.js +13 -3
  30. package/build/__tests__/unit/logSourceIos.test.js.map +1 -1
  31. package/build/__tests__/unit/measureComponentResolution.test.d.ts +2 -0
  32. package/build/__tests__/unit/measureComponentResolution.test.d.ts.map +1 -0
  33. package/build/__tests__/unit/measureComponentResolution.test.js +111 -0
  34. package/build/__tests__/unit/measureComponentResolution.test.js.map +1 -0
  35. package/build/__tests__/unit/metroIdentity.test.d.ts +2 -0
  36. package/build/__tests__/unit/metroIdentity.test.d.ts.map +1 -0
  37. package/build/__tests__/unit/metroIdentity.test.js +41 -0
  38. package/build/__tests__/unit/metroIdentity.test.js.map +1 -0
  39. package/build/__tests__/unit/nativeLogs.test.js +93 -2
  40. package/build/__tests__/unit/nativeLogs.test.js.map +1 -1
  41. package/build/__tests__/unit/netSuppressionFlag.test.d.ts +2 -0
  42. package/build/__tests__/unit/netSuppressionFlag.test.d.ts.map +1 -0
  43. package/build/__tests__/unit/netSuppressionFlag.test.js +61 -0
  44. package/build/__tests__/unit/netSuppressionFlag.test.js.map +1 -0
  45. package/build/__tests__/unit/requestDetailsProjection.test.d.ts +2 -0
  46. package/build/__tests__/unit/requestDetailsProjection.test.d.ts.map +1 -0
  47. package/build/__tests__/unit/requestDetailsProjection.test.js +69 -0
  48. package/build/__tests__/unit/requestDetailsProjection.test.js.map +1 -0
  49. package/build/__tests__/unit/screenState.test.js +63 -2
  50. package/build/__tests__/unit/screenState.test.js.map +1 -1
  51. package/build/__tests__/unit/sdkMirrorPoller.test.js +26 -0
  52. package/build/__tests__/unit/sdkMirrorPoller.test.js.map +1 -1
  53. package/build/__tests__/unit/sdkPackageName.test.d.ts +2 -0
  54. package/build/__tests__/unit/sdkPackageName.test.d.ts.map +1 -0
  55. package/build/__tests__/unit/sdkPackageName.test.js +35 -0
  56. package/build/__tests__/unit/sdkPackageName.test.js.map +1 -0
  57. package/build/__tests__/unit/swipeDiagnosis.test.d.ts +2 -0
  58. package/build/__tests__/unit/swipeDiagnosis.test.d.ts.map +1 -0
  59. package/build/__tests__/unit/swipeDiagnosis.test.js +47 -0
  60. package/build/__tests__/unit/swipeDiagnosis.test.js.map +1 -0
  61. package/build/__tests__/unit/swipeDirection.test.js +30 -0
  62. package/build/__tests__/unit/swipeDirection.test.js.map +1 -1
  63. package/build/__tests__/unit/toolDescriptions.test.js +15 -0
  64. package/build/__tests__/unit/toolDescriptions.test.js.map +1 -1
  65. package/build/__tests__/unit/typedTextVerify.test.d.ts +2 -0
  66. package/build/__tests__/unit/typedTextVerify.test.d.ts.map +1 -0
  67. package/build/__tests__/unit/typedTextVerify.test.js +133 -0
  68. package/build/__tests__/unit/typedTextVerify.test.js.map +1 -0
  69. package/build/core/androidForeground.d.ts +4 -0
  70. package/build/core/androidForeground.d.ts.map +1 -0
  71. package/build/core/androidForeground.js +34 -0
  72. package/build/core/androidForeground.js.map +1 -0
  73. package/build/core/androidSystemBars.d.ts +1 -1
  74. package/build/core/androidSystemBars.d.ts.map +1 -1
  75. package/build/core/androidSystemBars.js +2 -2
  76. package/build/core/androidSystemBars.js.map +1 -1
  77. package/build/core/connection.d.ts +6 -0
  78. package/build/core/connection.d.ts.map +1 -1
  79. package/build/core/connection.js +63 -14
  80. package/build/core/connection.js.map +1 -1
  81. package/build/core/debugGlobals.js +1 -1
  82. package/build/core/deviceResolver.d.ts.map +1 -1
  83. package/build/core/deviceResolver.js +7 -1
  84. package/build/core/deviceResolver.js.map +1 -1
  85. package/build/core/feedback.d.ts +2 -0
  86. package/build/core/feedback.d.ts.map +1 -1
  87. package/build/core/feedback.js +21 -2
  88. package/build/core/feedback.js.map +1 -1
  89. package/build/core/fingerprint.d.ts +1 -0
  90. package/build/core/fingerprint.d.ts.map +1 -1
  91. package/build/core/fingerprint.js +48 -6
  92. package/build/core/fingerprint.js.map +1 -1
  93. package/build/core/guides.d.ts.map +1 -1
  94. package/build/core/guides.js +6 -0
  95. package/build/core/guides.js.map +1 -1
  96. package/build/core/hidTypeVerify.d.ts +28 -0
  97. package/build/core/hidTypeVerify.d.ts.map +1 -0
  98. package/build/core/hidTypeVerify.js +76 -0
  99. package/build/core/hidTypeVerify.js.map +1 -0
  100. package/build/core/index.d.ts +1 -1
  101. package/build/core/index.d.ts.map +1 -1
  102. package/build/core/index.js +1 -1
  103. package/build/core/index.js.map +1 -1
  104. package/build/core/inputTarget.d.ts +1 -0
  105. package/build/core/inputTarget.d.ts.map +1 -1
  106. package/build/core/inputTarget.js +1 -0
  107. package/build/core/inputTarget.js.map +1 -1
  108. package/build/core/ios.d.ts.map +1 -1
  109. package/build/core/ios.js +1 -1
  110. package/build/core/ios.js.map +1 -1
  111. package/build/core/iosKeyboardLayout.d.ts +11 -0
  112. package/build/core/iosKeyboardLayout.d.ts.map +1 -0
  113. package/build/core/iosKeyboardLayout.js +55 -0
  114. package/build/core/iosKeyboardLayout.js.map +1 -0
  115. package/build/core/jsonProjection.d.ts +18 -0
  116. package/build/core/jsonProjection.d.ts.map +1 -0
  117. package/build/core/jsonProjection.js +249 -0
  118. package/build/core/jsonProjection.js.map +1 -0
  119. package/build/core/license.d.ts.map +1 -1
  120. package/build/core/license.js +2 -1
  121. package/build/core/license.js.map +1 -1
  122. package/build/core/logEvents.d.ts +3 -0
  123. package/build/core/logEvents.d.ts.map +1 -1
  124. package/build/core/logEvents.js +1 -0
  125. package/build/core/logEvents.js.map +1 -1
  126. package/build/core/logOwnership.d.ts +1 -1
  127. package/build/core/logOwnership.d.ts.map +1 -1
  128. package/build/core/logOwnership.js +3 -0
  129. package/build/core/logOwnership.js.map +1 -1
  130. package/build/core/logSourceIos.d.ts.map +1 -1
  131. package/build/core/logSourceIos.js +8 -2
  132. package/build/core/logSourceIos.js.map +1 -1
  133. package/build/core/measureComponent.d.ts.map +1 -1
  134. package/build/core/measureComponent.js +45 -11
  135. package/build/core/measureComponent.js.map +1 -1
  136. package/build/core/metroIdentity.d.ts +8 -0
  137. package/build/core/metroIdentity.d.ts.map +1 -0
  138. package/build/core/metroIdentity.js +65 -0
  139. package/build/core/metroIdentity.js.map +1 -0
  140. package/build/core/nativeLogs.d.ts +6 -0
  141. package/build/core/nativeLogs.d.ts.map +1 -1
  142. package/build/core/nativeLogs.js +42 -13
  143. package/build/core/nativeLogs.js.map +1 -1
  144. package/build/core/network.d.ts +2 -0
  145. package/build/core/network.d.ts.map +1 -1
  146. package/build/core/network.js +24 -11
  147. package/build/core/network.js.map +1 -1
  148. package/build/core/register.d.ts.map +1 -1
  149. package/build/core/register.js +25 -23
  150. package/build/core/register.js.map +1 -1
  151. package/build/core/rnGlobalsBootstrap.js +1 -1
  152. package/build/core/screenSpaceDevice.d.ts +5 -0
  153. package/build/core/screenSpaceDevice.d.ts.map +1 -1
  154. package/build/core/screenSpaceDevice.js +18 -0
  155. package/build/core/screenSpaceDevice.js.map +1 -1
  156. package/build/core/screenState.d.ts +8 -0
  157. package/build/core/screenState.d.ts.map +1 -1
  158. package/build/core/screenState.js +245 -32
  159. package/build/core/screenState.js.map +1 -1
  160. package/build/core/sdkMirrorPoller.d.ts.map +1 -1
  161. package/build/core/sdkMirrorPoller.js +2 -1
  162. package/build/core/sdkMirrorPoller.js.map +1 -1
  163. package/build/core/swipeDiagnosis.d.ts +17 -0
  164. package/build/core/swipeDiagnosis.d.ts.map +1 -0
  165. package/build/core/swipeDiagnosis.js +179 -0
  166. package/build/core/swipeDiagnosis.js.map +1 -0
  167. package/build/core/typedTextVerify.d.ts +18 -0
  168. package/build/core/typedTextVerify.d.ts.map +1 -0
  169. package/build/core/typedTextVerify.js +88 -0
  170. package/build/core/typedTextVerify.js.map +1 -0
  171. package/build/index.js +15 -0
  172. package/build/index.js.map +1 -1
  173. package/build/pro/tap.d.ts +6 -1
  174. package/build/pro/tap.d.ts.map +1 -1
  175. package/build/pro/tap.js +12 -3
  176. package/build/pro/tap.js.map +1 -1
  177. package/build/tools/componentTools.d.ts.map +1 -1
  178. package/build/tools/componentTools.js +12 -4
  179. package/build/tools/componentTools.js.map +1 -1
  180. package/build/tools/connectionTools.d.ts.map +1 -1
  181. package/build/tools/connectionTools.js +18 -0
  182. package/build/tools/connectionTools.js.map +1 -1
  183. package/build/tools/executionTools.d.ts.map +1 -1
  184. package/build/tools/executionTools.js +22 -6
  185. package/build/tools/executionTools.js.map +1 -1
  186. package/build/tools/interactionTools.d.ts.map +1 -1
  187. package/build/tools/interactionTools.js +68 -23
  188. package/build/tools/interactionTools.js.map +1 -1
  189. package/build/tools/logTools.d.ts.map +1 -1
  190. package/build/tools/logTools.js +9 -6
  191. package/build/tools/logTools.js.map +1 -1
  192. package/build/tools/networkTools.d.ts.map +1 -1
  193. package/build/tools/networkTools.js +18 -13
  194. package/build/tools/networkTools.js.map +1 -1
  195. package/build/tools/reduxTools.d.ts.map +1 -1
  196. package/build/tools/reduxTools.js +23 -4
  197. package/build/tools/reduxTools.js.map +1 -1
  198. package/build/tools/requestTools.d.ts.map +1 -1
  199. package/build/tools/requestTools.js +4 -3
  200. package/build/tools/requestTools.js.map +1 -1
  201. package/package.json +1 -1
  202. package/tools.json +7 -1
@@ -0,0 +1,35 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { readFileSync, readdirSync, statSync } from "fs";
3
+ import { join, dirname } from "path";
4
+ import { fileURLToPath } from "url";
5
+ const SRC = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
6
+ const OLD_SDK = ["react-native", "ai-devtools", "sdk"].join("-");
7
+ const OLD_REPO = ["igorzheludkov/react-native", "ai-devtools"].join("-");
8
+ function sourceFiles(dir) {
9
+ return readdirSync(dir).flatMap((entry) => {
10
+ const path = join(dir, entry);
11
+ if (statSync(path).isDirectory()) {
12
+ return entry === "__tests__" || entry === "pro" ? [] : sourceFiles(path);
13
+ }
14
+ return path.endsWith(".ts") ? [path] : [];
15
+ });
16
+ }
17
+ const hits = sourceFiles(SRC).flatMap((path) => readFileSync(path, "utf-8")
18
+ .split("\n")
19
+ .map((line, i) => ({ path, line: i + 1, text: line }))
20
+ .filter((entry) => entry.text.includes(OLD_SDK) || entry.text.includes(OLD_REPO)));
21
+ describe("pre-rename names do not leak into shipped strings", () => {
22
+ it("actually scans source (the surviving 'formerly' mentions are found)", () => {
23
+ expect(hits.length).toBeGreaterThan(0);
24
+ expect(hits.every((h) => h.text.includes("formerly"))).toBe(true);
25
+ });
26
+ it("names no repo slug from before the execbro rename", () => {
27
+ const repoHits = hits.filter((h) => h.text.includes(OLD_REPO));
28
+ expect(repoHits.map((h) => `${h.path}:${h.line}`)).toEqual([]);
29
+ });
30
+ it("names the SDK package only as a 'formerly' aid to recognition", () => {
31
+ const bare = hits.filter((h) => h.text.includes(OLD_SDK) && !h.text.includes("formerly"));
32
+ expect(bare.map((h) => `${h.path}:${h.line}`)).toEqual([]);
33
+ });
34
+ });
35
+ //# sourceMappingURL=sdkPackageName.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkPackageName.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/sdkPackageName.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=swipeDiagnosis.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swipeDiagnosis.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/swipeDiagnosis.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { explainNoOpSwipe } from "../../core/swipeDiagnosis.js";
3
+ const start = { x: 400, y: 900 };
4
+ function probe(over = {}) {
5
+ return { found: true, horizontal: false, offset: 500, maxOffset: 4820, component: "FlatList", ...over };
6
+ }
7
+ describe("explainNoOpSwipe", () => {
8
+ it("says the gesture missed every scrollable surface, with the coordinates", () => {
9
+ const out = explainNoOpSwipe({ found: false }, start);
10
+ expect(out).toContain("no scroll view found under (400, 900)");
11
+ expect(out).not.toContain("end-of-scroll");
12
+ });
13
+ it("reports already-at-top with the offset", () => {
14
+ const out = explainNoOpSwipe(probe({ offset: 0 }), start);
15
+ expect(out).toContain("offset unchanged at 0");
16
+ expect(out).toContain("already at the top");
17
+ });
18
+ it("treats a subpixel offset as the top", () => {
19
+ expect(explainNoOpSwipe(probe({ offset: 1 }), start)).toContain("already at the top");
20
+ });
21
+ it("reports already-at-end with the offset and its maximum", () => {
22
+ const out = explainNoOpSwipe(probe({ offset: 4820, maxOffset: 4820 }), start);
23
+ expect(out).toContain("offset unchanged at 4820 (max)");
24
+ expect(out).toContain("already at the end");
25
+ });
26
+ it("reports a non-scrollable surface separately from an exhausted one", () => {
27
+ const out = explainNoOpSwipe(probe({ offset: 0, maxOffset: 0 }), start);
28
+ expect(out).toContain("not scrollable");
29
+ expect(out).not.toContain("already at the end");
30
+ });
31
+ it("names the axis mismatch when the gesture crosses the surface's axis", () => {
32
+ const out = explainNoOpSwipe(probe(), start, { dx: -400, dy: 0 });
33
+ expect(out).toContain("wrong axis");
34
+ expect(out).toContain("up/down");
35
+ });
36
+ it("does not cry axis mismatch when the axes agree", () => {
37
+ const out = explainNoOpSwipe(probe({ offset: 0 }), start, { dx: 0, dy: -600 });
38
+ expect(out).not.toContain("wrong axis");
39
+ expect(out).toContain("already at the top");
40
+ });
41
+ it("falls through to 'did not reach it' only when mid-scroll on the right axis", () => {
42
+ const out = explainNoOpSwipe(probe({ offset: 1648, maxOffset: 30036 }), start, { dx: 0, dy: -600 });
43
+ expect(out).toContain("offset unchanged at 1648 of 30036");
44
+ expect(out).toContain("did not reach it");
45
+ });
46
+ });
47
+ //# sourceMappingURL=swipeDiagnosis.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swipeDiagnosis.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/swipeDiagnosis.test.ts"],"names":[],"mappings":"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"}
@@ -64,4 +64,34 @@ describe("computeSwipeFromDirection — odd distance and one-sided clamp", () =>
64
64
  expect(r.endY).toBeGreaterThanOrEqual(lo);
65
65
  });
66
66
  });
67
+ describe("computeSwipeFromDirection — system-bar safe band", () => {
68
+ const band = { top: 140, bottom: 150 };
69
+ it("keeps a vertical gesture clear of the bottom strip when the band is stricter", () => {
70
+ const r = computeSwipeFromDirection("up", 500, 400, 600, band);
71
+ expect(r.startY).toBeLessThanOrEqual(600 - band.bottom);
72
+ expect(r.endY).toBeGreaterThanOrEqual(band.top);
73
+ });
74
+ it("keeps the 10% margin when it is the stricter of the two", () => {
75
+ const withBand = computeSwipeFromDirection("up", 5000, W, H, band);
76
+ const without = computeSwipeFromDirection("up", 5000, W, H);
77
+ expect(withBand.startY).toBe(without.startY);
78
+ expect(withBand.endY).toBe(without.endY);
79
+ });
80
+ it("clamps a distance large enough to push past the strip", () => {
81
+ const r = computeSwipeFromDirection("up", 100000, W, H, band);
82
+ expect(r.startY).toBeLessThanOrEqual(H - band.bottom);
83
+ expect(r.startY).toBeGreaterThan(r.endY);
84
+ });
85
+ it("leaves horizontal gestures alone — the band is a vertical constraint", () => {
86
+ const withBand = computeSwipeFromDirection("left", 400, W, H, band);
87
+ const without = computeSwipeFromDirection("left", 400, W, H);
88
+ expect(withBand).toEqual(without);
89
+ });
90
+ it("falls back to the plain margin when the band would swallow the axis", () => {
91
+ const r = computeSwipeFromDirection("up", 200, 400, 300, { top: 200, bottom: 200 });
92
+ expect(r.startY).toBeGreaterThan(r.endY);
93
+ expect(r.startY).toBeLessThanOrEqual(300);
94
+ expect(r.endY).toBeGreaterThanOrEqual(0);
95
+ });
96
+ });
67
97
  //# sourceMappingURL=swipeDirection.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"swipeDirection.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/swipeDirection.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"swipeDirection.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/swipeDirection.test.ts"],"names":[],"mappings":"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"}
@@ -102,4 +102,19 @@ describe("Tool descriptions (registration enforcement)", () => {
102
102
  expect(totalBytes).toBeLessThan(500_000);
103
103
  });
104
104
  });
105
+ describe("request tools describe their real auth resolution", () => {
106
+ const byName = new Map(Array.from(toolRegistry.entries()).map(([name, { config }]) => [
107
+ name,
108
+ String(config?.description ?? ""),
109
+ ]));
110
+ it("app_request documents the captured-request fallback it implements", () => {
111
+ expect(byName.get("app_request")).toMatch(/captured request/i);
112
+ });
113
+ it("app_request says cookie auth needs no token resolution at all", () => {
114
+ expect(byName.get("app_request")).toMatch(/cookie/i);
115
+ });
116
+ it("network_replay says cookies ride along with the captured credentials", () => {
117
+ expect(byName.get("network_replay")).toMatch(/cookie/i);
118
+ });
119
+ });
105
120
  //# sourceMappingURL=toolDescriptions.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolDescriptions.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/toolDescriptions.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toolDescriptions.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/toolDescriptions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=typedTextVerify.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typedTextVerify.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/typedTextVerify.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,133 @@
1
+ import { describe, expect, it } from "@jest/globals";
2
+ import { matchTypedText, scriptOf, verdictForTypedText } from "../../core/typedTextVerify.js";
3
+ describe("field-applied formatting vs. a real remap (device-found)", () => {
4
+ it("verifies text the field capitalized itself", () => {
5
+ const v = verdictForTypedText({
6
+ sent: "abc",
7
+ expected: "abc",
8
+ landed: "Abc",
9
+ nonLatinKeyboards: ["uk_UA (Ukrainian)"]
10
+ });
11
+ expect(v.status).toBe("verified");
12
+ expect(v.message).toContain("its own formatting");
13
+ });
14
+ it("verifies an append when the prior text could not be known", () => {
15
+ const v = verdictForTypedText({
16
+ sent: "envcheck@example.com",
17
+ expected: "Searchenvcheck@example.com",
18
+ landed: "Envcheck@example.com",
19
+ nonLatinKeyboards: []
20
+ });
21
+ expect(v.status).toBe("verified");
22
+ });
23
+ it("still fails the Cyrillic remap that motivated the check", () => {
24
+ const v = verdictForTypedText({
25
+ sent: "envcheck@example.com",
26
+ expected: "envcheck@example.com",
27
+ landed: 'envchус"учфьздуюсщь',
28
+ nonLatinKeyboards: ["uk_UA (Ukrainian)"]
29
+ });
30
+ expect(v.status).toBe("mismatch");
31
+ expect(v.message).toContain("Cyrillic");
32
+ expect(v.message).toContain("uk_UA (Ukrainian)");
33
+ });
34
+ it("still fails when nothing was typed and the placeholder remains", () => {
35
+ const v = verdictForTypedText({
36
+ sent: "abc",
37
+ expected: "Searchabc",
38
+ landed: "Search",
39
+ nonLatinKeyboards: []
40
+ });
41
+ expect(v.status).toBe("mismatch");
42
+ });
43
+ it("still fails a truncated write", () => {
44
+ expect(matchTypedText("envcheck@exa", "envcheck@example.com", "envcheck@example.com")).toBe("none");
45
+ });
46
+ it("does not treat an empty send as proof of anything", () => {
47
+ expect(matchTypedText("Search", "Search", "")).toBe("exact");
48
+ expect(matchTypedText("anything else", "Search", "")).toBe("none");
49
+ });
50
+ });
51
+ describe("scriptOf", () => {
52
+ it("returns null for plain ASCII", () => {
53
+ expect(scriptOf("envcheck@example.com")).toBeNull();
54
+ });
55
+ it("names the script that actually arrived", () => {
56
+ expect(scriptOf("учфьздуюсщь")).toBe("Cyrillic");
57
+ expect(scriptOf("שלום")).toBe("Hebrew");
58
+ expect(scriptOf("δοκιμή")).toBe("Greek");
59
+ expect(scriptOf("مرحبا")).toBe("Arabic");
60
+ expect(scriptOf("テスト")).toBe("Japanese");
61
+ });
62
+ it("names the script even when only part of the text was remapped", () => {
63
+ expect(scriptOf("envchусл\"учфьздуюсщь")).toBe("Cyrillic");
64
+ });
65
+ });
66
+ describe("verdictForTypedText", () => {
67
+ it("confirms only when the field really holds the expected text", () => {
68
+ const v = verdictForTypedText({
69
+ sent: "hello",
70
+ expected: "hello",
71
+ landed: "hello",
72
+ nonLatinKeyboards: []
73
+ });
74
+ expect(v.status).toBe("verified");
75
+ expect(v.message).toContain('"hello"');
76
+ });
77
+ it("reports a layout remap as a mismatch, naming the script and the fix", () => {
78
+ const v = verdictForTypedText({
79
+ sent: "envcheck@example.com",
80
+ expected: "envcheck@example.com",
81
+ landed: "Ким Русь»учфьздуюсщь",
82
+ nonLatinKeyboards: ["uk_UA (Ukrainian)", "he_IL (Hebrew)"]
83
+ });
84
+ expect(v.status).toBe("mismatch");
85
+ expect(v.message).toContain("did NOT land");
86
+ expect(v.message).toContain("Cyrillic");
87
+ expect(v.message).toContain("uk_UA (Ukrainian)");
88
+ expect(v.message).toContain("input_text");
89
+ expect(v.message).not.toMatch(/^Typed text/);
90
+ });
91
+ it("reports a plain ASCII mismatch without inventing a layout cause", () => {
92
+ const v = verdictForTypedText({
93
+ sent: "CASEB",
94
+ expected: "CASEB",
95
+ landed: "CSEBA",
96
+ nonLatinKeyboards: []
97
+ });
98
+ expect(v.status).toBe("mismatch");
99
+ expect(v.message).not.toContain("keyboard layout");
100
+ });
101
+ it("does not claim success when the field could not be read", () => {
102
+ const v = verdictForTypedText({
103
+ sent: "hello",
104
+ expected: "hello",
105
+ landed: null,
106
+ readError: "axe describe-ui failed",
107
+ nonLatinKeyboards: []
108
+ });
109
+ expect(v.status).toBe("unverified");
110
+ expect(v.message).toContain("NOT verified");
111
+ expect(v.message).toContain("axe describe-ui failed");
112
+ });
113
+ it("warns about non-Latin keyboards even when the read-back failed", () => {
114
+ const v = verdictForTypedText({
115
+ sent: "hello",
116
+ expected: "hello",
117
+ landed: null,
118
+ nonLatinKeyboards: ["uk_UA (Ukrainian)"]
119
+ });
120
+ expect(v.status).toBe("unverified");
121
+ expect(v.message).toContain("uk_UA (Ukrainian)");
122
+ });
123
+ it("treats an append onto existing text as expected, not as corruption", () => {
124
+ const v = verdictForTypedText({
125
+ sent: "world",
126
+ expected: "hello world",
127
+ landed: "hello world",
128
+ nonLatinKeyboards: []
129
+ });
130
+ expect(v.status).toBe("verified");
131
+ });
132
+ });
133
+ //# sourceMappingURL=typedTextVerify.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typedTextVerify.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/typedTextVerify.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function androidForegroundPackage(deviceId?: string): Promise<string | null>;
2
+ export declare function parseForegroundPackage(dump: string): string | null;
3
+ export declare function foregroundLossWarning(expectedPackage: string | null | undefined, actualPackage: string | null): string | null;
4
+ //# sourceMappingURL=androidForeground.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"androidForeground.d.ts","sourceRoot":"","sources":["../../src/core/androidForeground.ts"],"names":[],"mappings":"AAeA,wBAAsB,wBAAwB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxF;AAWD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASlE;AAUD,wBAAgB,qBAAqB,CACjC,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC1C,aAAa,EAAE,MAAM,GAAG,IAAI,GAC7B,MAAM,GAAG,IAAI,CASf"}
@@ -0,0 +1,34 @@
1
+ import { execFileAsync } from "./exec.js";
2
+ export async function androidForegroundPackage(deviceId) {
3
+ const deviceArgs = deviceId ? ["-s", deviceId] : [];
4
+ try {
5
+ const { stdout } = await execFileAsync("adb", [...deviceArgs, "shell", "dumpsys window | grep -m2 mCurrentFocus"], { timeout: 5000 });
6
+ return parseForegroundPackage(stdout);
7
+ }
8
+ catch {
9
+ return null;
10
+ }
11
+ }
12
+ export function parseForegroundPackage(dump) {
13
+ if (!dump)
14
+ return null;
15
+ for (const line of dump.split("\n")) {
16
+ if (line.indexOf("mCurrentFocus") === -1)
17
+ continue;
18
+ const m = line.match(/([A-Za-z][A-Za-z0-9_]*(?:\.[A-Za-z0-9_]+)+)\//);
19
+ if (m)
20
+ return m[1];
21
+ }
22
+ return null;
23
+ }
24
+ export function foregroundLossWarning(expectedPackage, actualPackage) {
25
+ if (!expectedPackage || !actualPackage)
26
+ return null;
27
+ if (actualPackage === expectedPackage)
28
+ return null;
29
+ return (`⚠️ APP LEFT THE FOREGROUND — the focused package is now "${actualPackage}", not "${expectedPackage}". ` +
30
+ `The gesture was probably claimed by the system (the home-gesture strip at the bottom edge does this). ` +
31
+ `Any screenshot taken now shows another app, and coordinates captured before this gesture are no longer valid — ` +
32
+ `do NOT tap them. Bring the app back with android_launch_app, then re-read the screen.`);
33
+ }
34
+ //# sourceMappingURL=androidForeground.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"androidForeground.js","sourceRoot":"","sources":["../../src/core/androidForeground.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAe1C,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,QAAiB;IAC5D,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAClC,KAAK,EACL,CAAC,GAAG,UAAU,EAAE,OAAO,EAAE,yCAAyC,CAAC,EACnE,EAAE,OAAO,EAAE,IAAI,EAAE,CACpB,CAAC;QACF,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAWD,MAAM,UAAU,sBAAsB,CAAC,IAAY;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAAE,SAAS;QAEnD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACtE,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAUD,MAAM,UAAU,qBAAqB,CACjC,eAA0C,EAC1C,aAA4B;IAE5B,IAAI,CAAC,eAAe,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,aAAa,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,CACH,4DAA4D,aAAa,WAAW,eAAe,KAAK;QACxG,wGAAwG;QACxG,iHAAiH;QACjH,uFAAuF,CAC1F,CAAC;AACN,CAAC"}
@@ -3,5 +3,5 @@ export interface SystemBarInsets {
3
3
  top: number;
4
4
  bottom: number;
5
5
  }
6
- export declare function androidSystemBarInsets(deviceId?: string): Promise<SystemBarInsets | null>;
6
+ export declare function androidSystemBarInsets(deviceId?: string, marginPx?: number): Promise<SystemBarInsets | null>;
7
7
  //# sourceMappingURL=androidSystemBars.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"androidSystemBars.d.ts","sourceRoot":"","sources":["../../src/core/androidSystemBars.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,MAAM,WAAW,eAAe;IAE5B,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,MAAM,CAAC;CAClB;AAkBD,wBAAsB,sBAAsB,CACxC,QAAQ,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAiCjC"}
1
+ {"version":3,"file":"androidSystemBars.d.ts","sourceRoot":"","sources":["../../src/core/androidSystemBars.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,MAAM,WAAW,eAAe;IAE5B,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,MAAM,CAAC;CAClB;AAkBD,wBAAsB,sBAAsB,CACxC,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,GAAE,MAAiC,GAC5C,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAqCjC"}
@@ -1,6 +1,6 @@
1
1
  import { execFileAsync } from "./exec.js";
2
2
  export const SYSTEM_GESTURE_MARGIN_PX = 64;
3
- export async function androidSystemBarInsets(deviceId) {
3
+ export async function androidSystemBarInsets(deviceId, marginPx = SYSTEM_GESTURE_MARGIN_PX) {
4
4
  const deviceArgs = deviceId ? ["-s", deviceId] : [];
5
5
  try {
6
6
  const { stdout } = await execFileAsync("adb", [...deviceArgs, "shell", "dumpsys window | grep -E 'InsetsSource.*(statusBars|navigationBars)'"], { timeout: 10000 });
@@ -12,7 +12,7 @@ export async function androidSystemBarInsets(deviceId) {
12
12
  return null;
13
13
  if (top === 0 && bottom === 0)
14
14
  return null;
15
- return { top: top + SYSTEM_GESTURE_MARGIN_PX, bottom: bottom + SYSTEM_GESTURE_MARGIN_PX };
15
+ return { top: top + marginPx, bottom: bottom + marginPx };
16
16
  }
17
17
  catch {
18
18
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"androidSystemBars.js","sourceRoot":"","sources":["../../src/core/androidSystemBars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAM1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAyB3C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,QAAiB;IAEjB,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAClC,KAAK,EACL,CAAC,GAAG,UAAU,EAAE,OAAO,EAAE,sEAAsE,CAAC,EAChG,EAAE,OAAO,EAAE,KAAK,EAAE,CACrB,CAAC;QAIF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAE9E,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAErE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACnE,IAAI,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAW3C,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,wBAAwB,EAAE,MAAM,EAAE,MAAM,GAAG,wBAAwB,EAAE,CAAC;IAC9F,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"androidSystemBars.js","sourceRoot":"","sources":["../../src/core/androidSystemBars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAM1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAyB3C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,QAAiB,EACjB,WAAmB,wBAAwB;IAE3C,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAClC,KAAK,EACL,CAAC,GAAG,UAAU,EAAE,OAAO,EAAE,sEAAsE,CAAC,EAChG,EAAE,OAAO,EAAE,KAAK,EAAE,CACrB,CAAC;QAIF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAE9E,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAErE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACnE,IAAI,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAe3C,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC"}
@@ -1,5 +1,11 @@
1
1
  import WebSocket from "ws";
2
2
  import { DeviceInfo, RemoteObject, ConnectedApp, ConnectOptions, EnsureConnectionResult, ConnectionCheckResult } from "./types.js";
3
+ export declare function recordDeviceSeen(name: string | null | undefined): void;
4
+ export declare function findDisconnectedDeviceName(device: string): {
5
+ name: string;
6
+ lastSeenAt: number;
7
+ } | null;
8
+ export declare function resetDevicesSeenThisSession(): void;
3
9
  export declare function suppressReconnection(): void;
4
10
  export declare function suppressReconnectionForKey(appKey: string): void;
5
11
  export declare function clearReconnectionSuppression(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/core/connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/core/connection.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAoB,YAAY,EAAkB,cAAc,EAAsB,sBAAsB,EAAmB,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAyD1M,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAGtE;AAOD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQtG;AAGD,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AA6GD,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C;AAMD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/D;AAKD,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAoBD,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CA6DnG;AAaD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ3D;AASD,wBAAgB,6BAA6B,CACzC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,GAC9C,MAAM,EAAE,CAoCV;AAGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA4B/D;AA2RD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CA8X3G;AAGD,wBAAsB,eAAe,CACjC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,cAAmB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAgWjB;AA8FD,wBAAgB,gBAAgB,IAAI,KAAK,CAAC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,YAAY,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACxB,CAAC,CAMD;AAGD,wBAAgB,oBAAoB,IAAI,YAAY,GAAG,IAAI,CAW1D;AAOD,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAWhF;AASD,wBAAgB,gCAAgC,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAuBvF;AAoBD,MAAM,MAAM,gBAAgB,GACtB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC;AA8BnE,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAoD7E;AAMD,wBAAgB,2BAA2B,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA0C7E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAU5E;AAGD,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAMD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CA4C7E;AAqCD,MAAM,WAAW,iBAAiB;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAaD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsErF;AAKD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE5D;AAcD,wBAAsB,gBAAgB,CAAC,OAAO,GAAE;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAmLvC;AAED,MAAM,WAAW,uBAAuB;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,IAAI,GAAG,eAAe,GAAG,eAAe,GAAG,aAAa,GAAG,gBAAgB,CAAC;CACvF;AAED,wBAAgB,0BAA0B,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAmDzF;AAED,wBAAsB,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAgD9F"}
@@ -15,6 +15,26 @@ import { startSdkMirrorPoller, stopSdkMirrorPoller } from "./sdkMirrorPoller.js"
15
15
  import { DEFAULT_RECONNECTION_CONFIG, MIN_STABLE_CONNECTION_MS, initConnectionState, updateConnectionState, getConnectionState, recordConnectionGap, closeConnectionGap, saveConnectionMetadata, clearConnectionMetadata, getConnectionMetadata, saveReconnectionTimer, cancelReconnectionTimer, calculateBackoffDelay, initContextHealth, markContextHealthy, markContextStale, getContextHealth, updateContextHealth, formatDuration, recordConnectionEvent, } from "./connectionState.js";
16
16
  const connectionLocks = new Set();
17
17
  const lastTargetIdByDevice = new Map();
18
+ const devicesSeenThisSession = new Map();
19
+ export function recordDeviceSeen(name) {
20
+ const key = (name || "").trim();
21
+ if (key)
22
+ devicesSeenThisSession.set(key, Date.now());
23
+ }
24
+ export function findDisconnectedDeviceName(device) {
25
+ const needle = normalizeDeviceId(device);
26
+ if (!needle)
27
+ return null;
28
+ for (const [name, lastSeenAt] of devicesSeenThisSession.entries()) {
29
+ const norm = normalizeDeviceId(name);
30
+ if (norm.includes(needle) || needle.includes(norm))
31
+ return { name, lastSeenAt };
32
+ }
33
+ return null;
34
+ }
35
+ export function resetDevicesSeenThisSession() {
36
+ devicesSeenThisSession.clear();
37
+ }
18
38
  const pendingNetworkEnableIds = new Set();
19
39
  const pendingSdkProbeIds = new Map();
20
40
  const SDK_PROBE_INITIAL_DELAY_MS = 200;
@@ -69,6 +89,22 @@ function scheduleFastSdkReprobe(ws, appKey) {
69
89
  ws.once("close", () => clearTimeout(t));
70
90
  }
71
91
  }
92
+ function sendNetSuppressionFlag(ws, disabled) {
93
+ if (ws.readyState !== WebSocket.OPEN)
94
+ return;
95
+ try {
96
+ ws.send(JSON.stringify({
97
+ id: getNextMessageId(),
98
+ method: "Runtime.evaluate",
99
+ params: {
100
+ expression: `globalThis.__RN_NET_DISABLED__ = ${disabled ? "true" : "false"}`,
101
+ returnByValue: true
102
+ }
103
+ }));
104
+ }
105
+ catch {
106
+ }
107
+ }
72
108
  const reconnectionSuppressed = new Set();
73
109
  export function suppressReconnection() {
74
110
  for (const key of connectedApps.keys()) {
@@ -464,20 +500,7 @@ export function handleCDPMessage(message, device, ws) {
464
500
  app.sdkPresent = nextPresent;
465
501
  if (nextPresent !== wasPresent) {
466
502
  console.error(`[execbro] SDK ${present ? "detected" : "no longer detected"} on ${app.deviceInfo.title}; CDP/JS-interceptor buffer writes ${present ? "suppressed" : "restored"}`);
467
- if (app.ws.readyState === WebSocket.OPEN) {
468
- try {
469
- app.ws.send(JSON.stringify({
470
- id: getNextMessageId(),
471
- method: "Runtime.evaluate",
472
- params: {
473
- expression: `globalThis.__RN_NET_DISABLED__ = ${present ? "true" : "false"}`,
474
- returnByValue: true
475
- }
476
- }));
477
- }
478
- catch {
479
- }
480
- }
503
+ sendNetSuppressionFlag(app.ws, nextPresent);
481
504
  }
482
505
  }
483
506
  return;
@@ -634,6 +657,7 @@ export function handleCDPMessage(message, device, ws) {
634
657
  const ctxApp = connectedApps.get(appKey);
635
658
  if (ctxApp?.ws?.readyState === WebSocket.OPEN) {
636
659
  injectNetworkInterceptor(ctxApp.ws);
660
+ sendNetSuppressionFlag(ctxApp.ws, ctxApp.sdkPresent === true);
637
661
  pushMockRules(ctxApp.ws, serializeRules(device.deviceName || device.title || "unknown"));
638
662
  const nEnableId = sendNetworkEnable(ctxApp.ws);
639
663
  pendingNetworkEnableIds.add(nEnableId);
@@ -790,6 +814,7 @@ export async function connectToDevice(device, port, options = {}) {
790
814
  }
791
815
  connectionLocks.delete(appKey);
792
816
  connectedApps.set(appKey, { ws, deviceInfo: device, port, platform: "android" });
817
+ recordDeviceSeen(device.deviceName || device.title);
793
818
  markConnectionEstablished();
794
819
  const bufferKey = device.deviceName || device.title || "unknown";
795
820
  const previousTargetId = lastTargetIdByDevice.get(bufferKey);
@@ -1032,6 +1057,17 @@ function guessRequestedPlatform(device) {
1032
1057
  function deviceLabel(app) {
1033
1058
  return app.deviceInfo.deviceName || app.deviceInfo.title || "";
1034
1059
  }
1060
+ function formatAgo(ms) {
1061
+ if (!Number.isFinite(ms) || ms < 0)
1062
+ return "just now";
1063
+ const s = Math.round(ms / 1000);
1064
+ if (s < 60)
1065
+ return `${s}s ago`;
1066
+ const m = Math.round(s / 60);
1067
+ if (m < 60)
1068
+ return `${m}m ago`;
1069
+ return `${Math.round(m / 60)}h ago`;
1070
+ }
1035
1071
  export function describeDeviceResolution(resolution) {
1036
1072
  if (resolution.kind === "ok")
1037
1073
  return "";
@@ -1043,6 +1079,19 @@ export function describeDeviceResolution(resolution) {
1043
1079
  if (!device) {
1044
1080
  return "No apps connected. Run scan_metro to discover and connect to Metro servers.";
1045
1081
  }
1082
+ const dropped = findDisconnectedDeviceName(device);
1083
+ if (dropped) {
1084
+ const ago = formatAgo(Date.now() - dropped.lastSeenAt);
1085
+ const others = connected.length > 0
1086
+ ? ` Still connected: ${connected.map(a => `"${deviceLabel(a)}"`).join(", ")}.`
1087
+ : " No devices are connected right now.";
1088
+ return [
1089
+ `Device "${dropped.name}" DISCONNECTED — it was attached earlier in this session (last seen ${ago})`,
1090
+ `and no longer is. The name is correct; the device dropped off.${others}`,
1091
+ `Run scan_metro to re-attach. If that finds nothing, the emulator/simulator or the app itself has exited —`,
1092
+ `check list_devices, then relaunch the app.`
1093
+ ].join(" ");
1094
+ }
1046
1095
  if (connected.length === 0) {
1047
1096
  return `No connected device matches "${device}". No devices are currently connected — run scan_metro to discover and connect to Metro servers.`;
1048
1097
  }