execbro 0.0.1-reserve → 1.10.13

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 (475) hide show
  1. package/LICENSE +32 -0
  2. package/README.md +496 -0
  3. package/build/__tests__/helpers/fake-cdp-server.d.ts +56 -0
  4. package/build/__tests__/helpers/fake-cdp-server.d.ts.map +1 -0
  5. package/build/__tests__/helpers/fake-cdp-server.js +120 -0
  6. package/build/__tests__/helpers/fake-cdp-server.js.map +1 -0
  7. package/build/__tests__/helpers/tap-test-helpers.d.ts +36 -0
  8. package/build/__tests__/helpers/tap-test-helpers.d.ts.map +1 -0
  9. package/build/__tests__/helpers/tap-test-helpers.js +130 -0
  10. package/build/__tests__/helpers/tap-test-helpers.js.map +1 -0
  11. package/build/__tests__/integration/auto-reconnect.test.d.ts +2 -0
  12. package/build/__tests__/integration/auto-reconnect.test.d.ts.map +1 -0
  13. package/build/__tests__/integration/auto-reconnect.test.js +118 -0
  14. package/build/__tests__/integration/auto-reconnect.test.js.map +1 -0
  15. package/build/__tests__/integration/connection-health.test.d.ts +2 -0
  16. package/build/__tests__/integration/connection-health.test.d.ts.map +1 -0
  17. package/build/__tests__/integration/connection-health.test.js +157 -0
  18. package/build/__tests__/integration/connection-health.test.js.map +1 -0
  19. package/build/__tests__/integration/execute-in-app.test.d.ts +2 -0
  20. package/build/__tests__/integration/execute-in-app.test.d.ts.map +1 -0
  21. package/build/__tests__/integration/execute-in-app.test.js +124 -0
  22. package/build/__tests__/integration/execute-in-app.test.js.map +1 -0
  23. package/build/__tests__/integration/per-call-timeout.test.d.ts +2 -0
  24. package/build/__tests__/integration/per-call-timeout.test.d.ts.map +1 -0
  25. package/build/__tests__/integration/per-call-timeout.test.js +103 -0
  26. package/build/__tests__/integration/per-call-timeout.test.js.map +1 -0
  27. package/build/__tests__/integration/tap-strategies.test.d.ts +2 -0
  28. package/build/__tests__/integration/tap-strategies.test.d.ts.map +1 -0
  29. package/build/__tests__/integration/tap-strategies.test.js +330 -0
  30. package/build/__tests__/integration/tap-strategies.test.js.map +1 -0
  31. package/build/__tests__/integration/tools.test.d.ts +2 -0
  32. package/build/__tests__/integration/tools.test.d.ts.map +1 -0
  33. package/build/__tests__/integration/tools.test.js +227 -0
  34. package/build/__tests__/integration/tools.test.js.map +1 -0
  35. package/build/__tests__/setup.d.ts +2 -0
  36. package/build/__tests__/setup.d.ts.map +1 -0
  37. package/build/__tests__/setup.js +15 -0
  38. package/build/__tests__/setup.js.map +1 -0
  39. package/build/__tests__/unit/androidEmulatorAvds.test.d.ts +2 -0
  40. package/build/__tests__/unit/androidEmulatorAvds.test.d.ts.map +1 -0
  41. package/build/__tests__/unit/androidEmulatorAvds.test.js +98 -0
  42. package/build/__tests__/unit/androidEmulatorAvds.test.js.map +1 -0
  43. package/build/__tests__/unit/buildToken.test.d.ts +2 -0
  44. package/build/__tests__/unit/buildToken.test.d.ts.map +1 -0
  45. package/build/__tests__/unit/buildToken.test.js +22 -0
  46. package/build/__tests__/unit/buildToken.test.js.map +1 -0
  47. package/build/__tests__/unit/bundle.test.d.ts +2 -0
  48. package/build/__tests__/unit/bundle.test.d.ts.map +1 -0
  49. package/build/__tests__/unit/bundle.test.js +53 -0
  50. package/build/__tests__/unit/bundle.test.js.map +1 -0
  51. package/build/__tests__/unit/burst.test.d.ts +2 -0
  52. package/build/__tests__/unit/burst.test.d.ts.map +1 -0
  53. package/build/__tests__/unit/burst.test.js +54 -0
  54. package/build/__tests__/unit/burst.test.js.map +1 -0
  55. package/build/__tests__/unit/connection-health.test.d.ts +2 -0
  56. package/build/__tests__/unit/connection-health.test.d.ts.map +1 -0
  57. package/build/__tests__/unit/connection-health.test.js +38 -0
  58. package/build/__tests__/unit/connection-health.test.js.map +1 -0
  59. package/build/__tests__/unit/debugGlobals.test.d.ts +2 -0
  60. package/build/__tests__/unit/debugGlobals.test.d.ts.map +1 -0
  61. package/build/__tests__/unit/debugGlobals.test.js +14 -0
  62. package/build/__tests__/unit/debugGlobals.test.js.map +1 -0
  63. package/build/__tests__/unit/deviceDiscovery.test.d.ts +2 -0
  64. package/build/__tests__/unit/deviceDiscovery.test.d.ts.map +1 -0
  65. package/build/__tests__/unit/deviceDiscovery.test.js +119 -0
  66. package/build/__tests__/unit/deviceDiscovery.test.js.map +1 -0
  67. package/build/__tests__/unit/deviceResolver.test.d.ts +2 -0
  68. package/build/__tests__/unit/deviceResolver.test.d.ts.map +1 -0
  69. package/build/__tests__/unit/deviceResolver.test.js +261 -0
  70. package/build/__tests__/unit/deviceResolver.test.js.map +1 -0
  71. package/build/__tests__/unit/escapeNonAscii.test.d.ts +2 -0
  72. package/build/__tests__/unit/escapeNonAscii.test.d.ts.map +1 -0
  73. package/build/__tests__/unit/escapeNonAscii.test.js +76 -0
  74. package/build/__tests__/unit/escapeNonAscii.test.js.map +1 -0
  75. package/build/__tests__/unit/exec.test.d.ts +2 -0
  76. package/build/__tests__/unit/exec.test.d.ts.map +1 -0
  77. package/build/__tests__/unit/exec.test.js +54 -0
  78. package/build/__tests__/unit/exec.test.js.map +1 -0
  79. package/build/__tests__/unit/executor.test.d.ts +2 -0
  80. package/build/__tests__/unit/executor.test.d.ts.map +1 -0
  81. package/build/__tests__/unit/executor.test.js +220 -0
  82. package/build/__tests__/unit/executor.test.js.map +1 -0
  83. package/build/__tests__/unit/failureArtifact.test.d.ts +2 -0
  84. package/build/__tests__/unit/failureArtifact.test.d.ts.map +1 -0
  85. package/build/__tests__/unit/failureArtifact.test.js +207 -0
  86. package/build/__tests__/unit/failureArtifact.test.js.map +1 -0
  87. package/build/__tests__/unit/fastRefreshRecorder.test.d.ts +2 -0
  88. package/build/__tests__/unit/fastRefreshRecorder.test.d.ts.map +1 -0
  89. package/build/__tests__/unit/fastRefreshRecorder.test.js +68 -0
  90. package/build/__tests__/unit/fastRefreshRecorder.test.js.map +1 -0
  91. package/build/__tests__/unit/fastRefreshTools.test.d.ts +2 -0
  92. package/build/__tests__/unit/fastRefreshTools.test.d.ts.map +1 -0
  93. package/build/__tests__/unit/fastRefreshTools.test.js +112 -0
  94. package/build/__tests__/unit/fastRefreshTools.test.js.map +1 -0
  95. package/build/__tests__/unit/fiberMatch.test.d.ts +2 -0
  96. package/build/__tests__/unit/fiberMatch.test.d.ts.map +1 -0
  97. package/build/__tests__/unit/fiberMatch.test.js +114 -0
  98. package/build/__tests__/unit/fiberMatch.test.js.map +1 -0
  99. package/build/__tests__/unit/fingerprint.test.d.ts +2 -0
  100. package/build/__tests__/unit/fingerprint.test.d.ts.map +1 -0
  101. package/build/__tests__/unit/fingerprint.test.js +99 -0
  102. package/build/__tests__/unit/fingerprint.test.js.map +1 -0
  103. package/build/__tests__/unit/focusedInput.test.d.ts +2 -0
  104. package/build/__tests__/unit/focusedInput.test.d.ts.map +1 -0
  105. package/build/__tests__/unit/focusedInput.test.js +58 -0
  106. package/build/__tests__/unit/focusedInput.test.js.map +1 -0
  107. package/build/__tests__/unit/focusedInputTools.test.d.ts +2 -0
  108. package/build/__tests__/unit/focusedInputTools.test.d.ts.map +1 -0
  109. package/build/__tests__/unit/focusedInputTools.test.js +79 -0
  110. package/build/__tests__/unit/focusedInputTools.test.js.map +1 -0
  111. package/build/__tests__/unit/iconSemantics.test.d.ts +2 -0
  112. package/build/__tests__/unit/iconSemantics.test.d.ts.map +1 -0
  113. package/build/__tests__/unit/iconSemantics.test.js +80 -0
  114. package/build/__tests__/unit/iconSemantics.test.js.map +1 -0
  115. package/build/__tests__/unit/imageBuffer.test.d.ts +2 -0
  116. package/build/__tests__/unit/imageBuffer.test.d.ts.map +1 -0
  117. package/build/__tests__/unit/imageBuffer.test.js +128 -0
  118. package/build/__tests__/unit/imageBuffer.test.js.map +1 -0
  119. package/build/__tests__/unit/logs.test.d.ts +2 -0
  120. package/build/__tests__/unit/logs.test.d.ts.map +1 -0
  121. package/build/__tests__/unit/logs.test.js +90 -0
  122. package/build/__tests__/unit/logs.test.js.map +1 -0
  123. package/build/__tests__/unit/measureComponent.test.d.ts +2 -0
  124. package/build/__tests__/unit/measureComponent.test.d.ts.map +1 -0
  125. package/build/__tests__/unit/measureComponent.test.js +66 -0
  126. package/build/__tests__/unit/measureComponent.test.js.map +1 -0
  127. package/build/__tests__/unit/measureComponentTools.test.d.ts +2 -0
  128. package/build/__tests__/unit/measureComponentTools.test.d.ts.map +1 -0
  129. package/build/__tests__/unit/measureComponentTools.test.js +94 -0
  130. package/build/__tests__/unit/measureComponentTools.test.js.map +1 -0
  131. package/build/__tests__/unit/metro.test.d.ts +2 -0
  132. package/build/__tests__/unit/metro.test.d.ts.map +1 -0
  133. package/build/__tests__/unit/metro.test.js +61 -0
  134. package/build/__tests__/unit/metro.test.js.map +1 -0
  135. package/build/__tests__/unit/network.test.d.ts +2 -0
  136. package/build/__tests__/unit/network.test.d.ts.map +1 -0
  137. package/build/__tests__/unit/network.test.js +102 -0
  138. package/build/__tests__/unit/network.test.js.map +1 -0
  139. package/build/__tests__/unit/networkInterceptor.test.d.ts +2 -0
  140. package/build/__tests__/unit/networkInterceptor.test.d.ts.map +1 -0
  141. package/build/__tests__/unit/networkInterceptor.test.js +104 -0
  142. package/build/__tests__/unit/networkInterceptor.test.js.map +1 -0
  143. package/build/__tests__/unit/probe.test.d.ts +2 -0
  144. package/build/__tests__/unit/probe.test.d.ts.map +1 -0
  145. package/build/__tests__/unit/probe.test.js +62 -0
  146. package/build/__tests__/unit/probe.test.js.map +1 -0
  147. package/build/__tests__/unit/rnGlobalsBootstrap.test.d.ts +2 -0
  148. package/build/__tests__/unit/rnGlobalsBootstrap.test.d.ts.map +1 -0
  149. package/build/__tests__/unit/rnGlobalsBootstrap.test.js +29 -0
  150. package/build/__tests__/unit/rnGlobalsBootstrap.test.js.map +1 -0
  151. package/build/__tests__/unit/screenState.test.d.ts +2 -0
  152. package/build/__tests__/unit/screenState.test.d.ts.map +1 -0
  153. package/build/__tests__/unit/screenState.test.js +384 -0
  154. package/build/__tests__/unit/screenState.test.js.map +1 -0
  155. package/build/__tests__/unit/screenshot-diff.test.d.ts +2 -0
  156. package/build/__tests__/unit/screenshot-diff.test.d.ts.map +1 -0
  157. package/build/__tests__/unit/screenshot-diff.test.js +97 -0
  158. package/build/__tests__/unit/screenshot-diff.test.js.map +1 -0
  159. package/build/__tests__/unit/tap-evidence.test.d.ts +2 -0
  160. package/build/__tests__/unit/tap-evidence.test.d.ts.map +1 -0
  161. package/build/__tests__/unit/tap-evidence.test.js +89 -0
  162. package/build/__tests__/unit/tap-evidence.test.js.map +1 -0
  163. package/build/__tests__/unit/tap.test.d.ts +2 -0
  164. package/build/__tests__/unit/tap.test.d.ts.map +1 -0
  165. package/build/__tests__/unit/tap.test.js +767 -0
  166. package/build/__tests__/unit/tap.test.js.map +1 -0
  167. package/build/__tests__/unit/timeoutClamp.test.d.ts +2 -0
  168. package/build/__tests__/unit/timeoutClamp.test.d.ts.map +1 -0
  169. package/build/__tests__/unit/timeoutClamp.test.js +17 -0
  170. package/build/__tests__/unit/timeoutClamp.test.js.map +1 -0
  171. package/build/__tests__/unit/toolDescriptions.test.d.ts +2 -0
  172. package/build/__tests__/unit/toolDescriptions.test.d.ts.map +1 -0
  173. package/build/__tests__/unit/toolDescriptions.test.js +145 -0
  174. package/build/__tests__/unit/toolDescriptions.test.js.map +1 -0
  175. package/build/__tests__/unit/transportClassify.test.d.ts +2 -0
  176. package/build/__tests__/unit/transportClassify.test.d.ts.map +1 -0
  177. package/build/__tests__/unit/transportClassify.test.js +60 -0
  178. package/build/__tests__/unit/transportClassify.test.js.map +1 -0
  179. package/build/__tests__/unit/verifyAction.test.d.ts +2 -0
  180. package/build/__tests__/unit/verifyAction.test.d.ts.map +1 -0
  181. package/build/__tests__/unit/verifyAction.test.js +26 -0
  182. package/build/__tests__/unit/verifyAction.test.js.map +1 -0
  183. package/build/core/android.d.ts +299 -0
  184. package/build/core/android.d.ts.map +1 -0
  185. package/build/core/android.js +1582 -0
  186. package/build/core/android.js.map +1 -0
  187. package/build/core/appDetection.d.ts +20 -0
  188. package/build/core/appDetection.d.ts.map +1 -0
  189. package/build/core/appDetection.js +167 -0
  190. package/build/core/appDetection.js.map +1 -0
  191. package/build/core/bundle.d.ts +49 -0
  192. package/build/core/bundle.d.ts.map +1 -0
  193. package/build/core/bundle.js +356 -0
  194. package/build/core/bundle.js.map +1 -0
  195. package/build/core/componentSearch.d.ts +41 -0
  196. package/build/core/componentSearch.d.ts.map +1 -0
  197. package/build/core/componentSearch.js +588 -0
  198. package/build/core/componentSearch.js.map +1 -0
  199. package/build/core/componentTree.d.ts +13 -0
  200. package/build/core/componentTree.d.ts.map +1 -0
  201. package/build/core/componentTree.js +275 -0
  202. package/build/core/componentTree.js.map +1 -0
  203. package/build/core/config.d.ts +9 -0
  204. package/build/core/config.d.ts.map +1 -0
  205. package/build/core/config.js +28 -0
  206. package/build/core/config.js.map +1 -0
  207. package/build/core/connection.d.ts +102 -0
  208. package/build/core/connection.d.ts.map +1 -0
  209. package/build/core/connection.js +1710 -0
  210. package/build/core/connection.js.map +1 -0
  211. package/build/core/connectionState.d.ts +122 -0
  212. package/build/core/connectionState.d.ts.map +1 -0
  213. package/build/core/connectionState.js +313 -0
  214. package/build/core/connectionState.js.map +1 -0
  215. package/build/core/debugGlobals.d.ts +6 -0
  216. package/build/core/debugGlobals.d.ts.map +1 -0
  217. package/build/core/debugGlobals.js +370 -0
  218. package/build/core/debugGlobals.js.map +1 -0
  219. package/build/core/deviceDiscovery.d.ts +52 -0
  220. package/build/core/deviceDiscovery.d.ts.map +1 -0
  221. package/build/core/deviceDiscovery.js +74 -0
  222. package/build/core/deviceDiscovery.js.map +1 -0
  223. package/build/core/deviceResolver.d.ts +44 -0
  224. package/build/core/deviceResolver.d.ts.map +1 -0
  225. package/build/core/deviceResolver.js +225 -0
  226. package/build/core/deviceResolver.js.map +1 -0
  227. package/build/core/errorScreenParser.d.ts +30 -0
  228. package/build/core/errorScreenParser.d.ts.map +1 -0
  229. package/build/core/errorScreenParser.js +198 -0
  230. package/build/core/errorScreenParser.js.map +1 -0
  231. package/build/core/errors.d.ts +14 -0
  232. package/build/core/errors.d.ts.map +1 -0
  233. package/build/core/errors.js +17 -0
  234. package/build/core/errors.js.map +1 -0
  235. package/build/core/escapeNonAscii.d.ts +18 -0
  236. package/build/core/escapeNonAscii.d.ts.map +1 -0
  237. package/build/core/escapeNonAscii.js +352 -0
  238. package/build/core/escapeNonAscii.js.map +1 -0
  239. package/build/core/exec.d.ts +22 -0
  240. package/build/core/exec.d.ts.map +1 -0
  241. package/build/core/exec.js +54 -0
  242. package/build/core/exec.js.map +1 -0
  243. package/build/core/executor.d.ts +9 -0
  244. package/build/core/executor.d.ts.map +1 -0
  245. package/build/core/executor.js +12 -0
  246. package/build/core/executor.js.map +1 -0
  247. package/build/core/failureArtifact.d.ts +120 -0
  248. package/build/core/failureArtifact.d.ts.map +1 -0
  249. package/build/core/failureArtifact.js +113 -0
  250. package/build/core/failureArtifact.js.map +1 -0
  251. package/build/core/fastRefreshRecorder.d.ts +23 -0
  252. package/build/core/fastRefreshRecorder.d.ts.map +1 -0
  253. package/build/core/fastRefreshRecorder.js +83 -0
  254. package/build/core/fastRefreshRecorder.js.map +1 -0
  255. package/build/core/fastRefreshTools.d.ts +19 -0
  256. package/build/core/fastRefreshTools.d.ts.map +1 -0
  257. package/build/core/fastRefreshTools.js +71 -0
  258. package/build/core/fastRefreshTools.js.map +1 -0
  259. package/build/core/feedback.d.ts +18 -0
  260. package/build/core/feedback.d.ts.map +1 -0
  261. package/build/core/feedback.js +73 -0
  262. package/build/core/feedback.js.map +1 -0
  263. package/build/core/fiberMatch.d.ts +25 -0
  264. package/build/core/fiberMatch.d.ts.map +1 -0
  265. package/build/core/fiberMatch.js +35 -0
  266. package/build/core/fiberMatch.js.map +1 -0
  267. package/build/core/fingerprint.d.ts +4 -0
  268. package/build/core/fingerprint.d.ts.map +1 -0
  269. package/build/core/fingerprint.js +47 -0
  270. package/build/core/fingerprint.js.map +1 -0
  271. package/build/core/focusedInput.d.ts +27 -0
  272. package/build/core/focusedInput.d.ts.map +1 -0
  273. package/build/core/focusedInput.js +110 -0
  274. package/build/core/focusedInput.js.map +1 -0
  275. package/build/core/focusedInputTools.d.ts +21 -0
  276. package/build/core/focusedInputTools.d.ts.map +1 -0
  277. package/build/core/focusedInputTools.js +51 -0
  278. package/build/core/focusedInputTools.js.map +1 -0
  279. package/build/core/format.d.ts +8 -0
  280. package/build/core/format.d.ts.map +1 -0
  281. package/build/core/format.js +34 -0
  282. package/build/core/format.js.map +1 -0
  283. package/build/core/guides.d.ts +21 -0
  284. package/build/core/guides.d.ts.map +1 -0
  285. package/build/core/guides.js +397 -0
  286. package/build/core/guides.js.map +1 -0
  287. package/build/core/iconSemantics.d.ts +18 -0
  288. package/build/core/iconSemantics.d.ts.map +1 -0
  289. package/build/core/iconSemantics.js +114 -0
  290. package/build/core/iconSemantics.js.map +1 -0
  291. package/build/core/imageBuffer.d.ts +37 -0
  292. package/build/core/imageBuffer.d.ts.map +1 -0
  293. package/build/core/imageBuffer.js +58 -0
  294. package/build/core/imageBuffer.js.map +1 -0
  295. package/build/core/index.d.ts +37 -0
  296. package/build/core/index.d.ts.map +1 -0
  297. package/build/core/index.js +66 -0
  298. package/build/core/index.js.map +1 -0
  299. package/build/core/inspector.d.ts +55 -0
  300. package/build/core/inspector.d.ts.map +1 -0
  301. package/build/core/inspector.js +603 -0
  302. package/build/core/inspector.js.map +1 -0
  303. package/build/core/ios.d.ts +263 -0
  304. package/build/core/ios.d.ts.map +1 -0
  305. package/build/core/ios.js +1705 -0
  306. package/build/core/ios.js.map +1 -0
  307. package/build/core/jsExecute.d.ts +62 -0
  308. package/build/core/jsExecute.d.ts.map +1 -0
  309. package/build/core/jsExecute.js +696 -0
  310. package/build/core/jsExecute.js.map +1 -0
  311. package/build/core/license.d.ts +48 -0
  312. package/build/core/license.d.ts.map +1 -0
  313. package/build/core/license.js +267 -0
  314. package/build/core/license.js.map +1 -0
  315. package/build/core/logbox.d.ts +58 -0
  316. package/build/core/logbox.d.ts.map +1 -0
  317. package/build/core/logbox.js +330 -0
  318. package/build/core/logbox.js.map +1 -0
  319. package/build/core/logs.d.ts +44 -0
  320. package/build/core/logs.d.ts.map +1 -0
  321. package/build/core/logs.js +149 -0
  322. package/build/core/logs.js.map +1 -0
  323. package/build/core/measureComponent.d.ts +19 -0
  324. package/build/core/measureComponent.d.ts.map +1 -0
  325. package/build/core/measureComponent.js +94 -0
  326. package/build/core/measureComponent.js.map +1 -0
  327. package/build/core/measureComponentTools.d.ts +6 -0
  328. package/build/core/measureComponentTools.d.ts.map +1 -0
  329. package/build/core/measureComponentTools.js +43 -0
  330. package/build/core/measureComponentTools.js.map +1 -0
  331. package/build/core/metro.d.ts +31 -0
  332. package/build/core/metro.d.ts.map +1 -0
  333. package/build/core/metro.js +124 -0
  334. package/build/core/metro.js.map +1 -0
  335. package/build/core/nativeOnlyHints.d.ts +14 -0
  336. package/build/core/nativeOnlyHints.d.ts.map +1 -0
  337. package/build/core/nativeOnlyHints.js +58 -0
  338. package/build/core/nativeOnlyHints.js.map +1 -0
  339. package/build/core/network.d.ts +43 -0
  340. package/build/core/network.d.ts.map +1 -0
  341. package/build/core/network.js +217 -0
  342. package/build/core/network.js.map +1 -0
  343. package/build/core/networkInterceptor.d.ts +30 -0
  344. package/build/core/networkInterceptor.d.ts.map +1 -0
  345. package/build/core/networkInterceptor.js +211 -0
  346. package/build/core/networkInterceptor.js.map +1 -0
  347. package/build/core/ocr.d.ts +87 -0
  348. package/build/core/ocr.d.ts.map +1 -0
  349. package/build/core/ocr.js +335 -0
  350. package/build/core/ocr.js.map +1 -0
  351. package/build/core/paths.d.ts +2 -0
  352. package/build/core/paths.d.ts.map +1 -0
  353. package/build/core/paths.js +28 -0
  354. package/build/core/paths.js.map +1 -0
  355. package/build/core/posthog.d.ts +5 -0
  356. package/build/core/posthog.d.ts.map +1 -0
  357. package/build/core/posthog.js +52 -0
  358. package/build/core/posthog.js.map +1 -0
  359. package/build/core/pressables.d.ts +46 -0
  360. package/build/core/pressables.d.ts.map +1 -0
  361. package/build/core/pressables.js +1719 -0
  362. package/build/core/pressables.js.map +1 -0
  363. package/build/core/probe.d.ts +12 -0
  364. package/build/core/probe.d.ts.map +1 -0
  365. package/build/core/probe.js +56 -0
  366. package/build/core/probe.js.map +1 -0
  367. package/build/core/redux.d.ts +22 -0
  368. package/build/core/redux.d.ts.map +1 -0
  369. package/build/core/redux.js +116 -0
  370. package/build/core/redux.js.map +1 -0
  371. package/build/core/register.d.ts +8 -0
  372. package/build/core/register.d.ts.map +1 -0
  373. package/build/core/register.js +202 -0
  374. package/build/core/register.js.map +1 -0
  375. package/build/core/rnGlobalsBootstrap.d.ts +16 -0
  376. package/build/core/rnGlobalsBootstrap.d.ts.map +1 -0
  377. package/build/core/rnGlobalsBootstrap.js +116 -0
  378. package/build/core/rnGlobalsBootstrap.js.map +1 -0
  379. package/build/core/screenLayout.d.ts +53 -0
  380. package/build/core/screenLayout.d.ts.map +1 -0
  381. package/build/core/screenLayout.js +878 -0
  382. package/build/core/screenLayout.js.map +1 -0
  383. package/build/core/screenState.d.ts +166 -0
  384. package/build/core/screenState.d.ts.map +1 -0
  385. package/build/core/screenState.js +1352 -0
  386. package/build/core/screenState.js.map +1 -0
  387. package/build/core/sdkBridge.d.ts +67 -0
  388. package/build/core/sdkBridge.d.ts.map +1 -0
  389. package/build/core/sdkBridge.js +148 -0
  390. package/build/core/sdkBridge.js.map +1 -0
  391. package/build/core/state.d.ts +37 -0
  392. package/build/core/state.d.ts.map +1 -0
  393. package/build/core/state.js +124 -0
  394. package/build/core/state.js.map +1 -0
  395. package/build/core/telemetry.d.ts +50 -0
  396. package/build/core/telemetry.d.ts.map +1 -0
  397. package/build/core/telemetry.js +653 -0
  398. package/build/core/telemetry.js.map +1 -0
  399. package/build/core/toolHelpers.d.ts +24 -0
  400. package/build/core/toolHelpers.d.ts.map +1 -0
  401. package/build/core/toolHelpers.js +118 -0
  402. package/build/core/toolHelpers.js.map +1 -0
  403. package/build/core/types.d.ts +162 -0
  404. package/build/core/types.d.ts.map +1 -0
  405. package/build/core/types.js +2 -0
  406. package/build/core/types.js.map +1 -0
  407. package/build/index.d.ts +4 -0
  408. package/build/index.d.ts.map +1 -0
  409. package/build/index.js +132 -0
  410. package/build/index.js.map +1 -0
  411. package/build/pro/screenshot-diff.d.ts +10 -0
  412. package/build/pro/screenshot-diff.d.ts.map +1 -0
  413. package/build/pro/screenshot-diff.js +38 -0
  414. package/build/pro/screenshot-diff.js.map +1 -0
  415. package/build/pro/tap.d.ts +291 -0
  416. package/build/pro/tap.d.ts.map +1 -0
  417. package/build/pro/tap.js +1839 -0
  418. package/build/pro/tap.js.map +1 -0
  419. package/build/pro/verifyAction.d.ts +50 -0
  420. package/build/pro/verifyAction.d.ts.map +1 -0
  421. package/build/pro/verifyAction.js +285 -0
  422. package/build/pro/verifyAction.js.map +1 -0
  423. package/build/tools/_deviceArg.d.ts +45 -0
  424. package/build/tools/_deviceArg.d.ts.map +1 -0
  425. package/build/tools/_deviceArg.js +58 -0
  426. package/build/tools/_deviceArg.js.map +1 -0
  427. package/build/tools/accountTools.d.ts +46 -0
  428. package/build/tools/accountTools.d.ts.map +1 -0
  429. package/build/tools/accountTools.js +223 -0
  430. package/build/tools/accountTools.js.map +1 -0
  431. package/build/tools/bundleTools.d.ts +3 -0
  432. package/build/tools/bundleTools.d.ts.map +1 -0
  433. package/build/tools/bundleTools.js +375 -0
  434. package/build/tools/bundleTools.js.map +1 -0
  435. package/build/tools/componentTools.d.ts +3 -0
  436. package/build/tools/componentTools.d.ts.map +1 -0
  437. package/build/tools/componentTools.js +746 -0
  438. package/build/tools/componentTools.js.map +1 -0
  439. package/build/tools/connectionTools.d.ts +3 -0
  440. package/build/tools/connectionTools.d.ts.map +1 -0
  441. package/build/tools/connectionTools.js +625 -0
  442. package/build/tools/connectionTools.js.map +1 -0
  443. package/build/tools/deviceTools.d.ts +3 -0
  444. package/build/tools/deviceTools.d.ts.map +1 -0
  445. package/build/tools/deviceTools.js +423 -0
  446. package/build/tools/deviceTools.js.map +1 -0
  447. package/build/tools/executionTools.d.ts +3 -0
  448. package/build/tools/executionTools.d.ts.map +1 -0
  449. package/build/tools/executionTools.js +243 -0
  450. package/build/tools/executionTools.js.map +1 -0
  451. package/build/tools/interactionTools.d.ts +3 -0
  452. package/build/tools/interactionTools.d.ts.map +1 -0
  453. package/build/tools/interactionTools.js +539 -0
  454. package/build/tools/interactionTools.js.map +1 -0
  455. package/build/tools/logTools.d.ts +3 -0
  456. package/build/tools/logTools.d.ts.map +1 -0
  457. package/build/tools/logTools.js +371 -0
  458. package/build/tools/logTools.js.map +1 -0
  459. package/build/tools/metaTools.d.ts +7 -0
  460. package/build/tools/metaTools.d.ts.map +1 -0
  461. package/build/tools/metaTools.js +186 -0
  462. package/build/tools/metaTools.js.map +1 -0
  463. package/build/tools/networkTools.d.ts +3 -0
  464. package/build/tools/networkTools.d.ts.map +1 -0
  465. package/build/tools/networkTools.js +478 -0
  466. package/build/tools/networkTools.js.map +1 -0
  467. package/build/tools/reduxTools.d.ts +3 -0
  468. package/build/tools/reduxTools.d.ts.map +1 -0
  469. package/build/tools/reduxTools.js +83 -0
  470. package/build/tools/reduxTools.js.map +1 -0
  471. package/build/tools/screenshotTools.d.ts +3 -0
  472. package/build/tools/screenshotTools.d.ts.map +1 -0
  473. package/build/tools/screenshotTools.js +703 -0
  474. package/build/tools/screenshotTools.js.map +1 -0
  475. package/package.json +63 -2
@@ -0,0 +1,478 @@
1
+ import { z } from "zod";
2
+ import { registerToolWithTelemetry } from "../core/register.js";
3
+ import { getNetworkRequests, searchNetworkRequests, getNetworkStats, formatRequestDetails, getConnectedAppByDevice, networkBuffers, formatNetworkAsTonl, metroMissingHintIfAbsent, checkAndEnsureConnection, getPassiveConnectionStatus, getRecentGaps, formatDuration, getNetworkBuffer, } from "../core/index.js";
4
+ import { resolveNetworkBuffer } from "../core/toolHelpers.js";
5
+ import { UserInputError } from "../core/errors.js";
6
+ import { isSDKInstalled, querySDKNetwork, getSDKNetworkEntry, getSDKNetworkStats, clearSDKNetwork } from "../core/sdkBridge.js";
7
+ export function registerNetworkTools(server) {
8
+ // Tool: Get network requests
9
+ registerToolWithTelemetry(server, "get_network_requests", {
10
+ description: "Retrieve captured network requests from connected React Native app. Shows URL, method, status, and timing. Note: On Bridgeless targets (Expo SDK 52+) without the SDK, capture may miss early startup requests. Install execbro-sdk for full capture with headers and response bodies. Tip: Use summary=true first for stats overview.\n" +
11
+ "PURPOSE: Inspect HTTP traffic the app made since connection — URLs, methods, status codes, and timings — to debug API, auth, and caching issues.\n" +
12
+ "WHEN TO USE: User reports a failed login/load, slow screen, or wrong data. Confirm a request fired, check its status, and pivot to get_request_details for headers/body.\n" +
13
+ "WORKFLOW: scan_metro -> reproduce action -> get_network_requests({ summary: true }) -> get_network_requests({ status: 500 }) or search_network -> get_request_details(id).\n" +
14
+ "LIMITATIONS: Bridgeless targets without the SDK may miss pre-connect requests and response bodies — install execbro-sdk for full fidelity.\n" +
15
+ "GOOD: get_network_requests({ summary: true }) then get_network_requests({ urlPattern: \"/login\", status: 401 })\n" +
16
+ "BAD: get_network_requests({ maxRequests: 500 }) as the first call — start with summary=true.\n" +
17
+ "SEE ALSO: call get_usage_guide(topic=\"network\") for the full network-inspect playbook.",
18
+ inputSchema: {
19
+ maxRequests: z
20
+ .number()
21
+ .optional()
22
+ .default(50)
23
+ .describe("Maximum number of requests to return (default: 50)"),
24
+ method: z.string().optional().describe("Filter by HTTP method (GET, POST, PUT, DELETE, etc.)"),
25
+ urlPattern: z.string().optional().describe("Filter by URL pattern (case-insensitive substring match)"),
26
+ status: z.number().optional().describe("Filter by HTTP status code (e.g., 200, 401, 500)"),
27
+ format: z
28
+ .enum(["text", "tonl"])
29
+ .optional()
30
+ .default("tonl")
31
+ .describe("Output format: 'text' or 'tonl' (default, compact token-optimized format, ~30-50% smaller)"),
32
+ summary: z
33
+ .boolean()
34
+ .optional()
35
+ .default(false)
36
+ .describe("Return statistics only (count, methods, domains, status codes). Use for quick overview."),
37
+ device: z.string().optional().describe("Target device name (substring match). Omit for all devices. Run get_apps to see connected devices.")
38
+ }
39
+ }, async ({ maxRequests, method, urlPattern, status, format, summary, device }) => {
40
+ // Check if SDK is installed — prefer SDK data over CDP/interceptor buffer
41
+ const sdkAvailable = await isSDKInstalled();
42
+ if (sdkAvailable) {
43
+ if (summary) {
44
+ const sdkStats = await getSDKNetworkStats();
45
+ if (sdkStats.success) {
46
+ const s = sdkStats.data;
47
+ const lines = [];
48
+ lines.push(`Total requests: ${s.total}`);
49
+ lines.push(`Completed: ${s.completed}`);
50
+ lines.push(`Errors: ${s.errors}`);
51
+ if (s.avgDuration != null)
52
+ lines.push(`Avg duration: ${s.avgDuration}ms`);
53
+ if (s.byMethod && Object.keys(s.byMethod).length > 0) {
54
+ lines.push("\nBy Method:");
55
+ for (const [m, c] of Object.entries(s.byMethod))
56
+ lines.push(` ${m}: ${c}`);
57
+ }
58
+ if (s.byStatus && Object.keys(s.byStatus).length > 0) {
59
+ lines.push("\nBy Status:");
60
+ for (const [st, c] of Object.entries(s.byStatus))
61
+ lines.push(` ${st}: ${c}`);
62
+ }
63
+ if (s.byDomain && Object.keys(s.byDomain).length > 0) {
64
+ lines.push("\nBy Domain:");
65
+ for (const [d, c] of Object.entries(s.byDomain).sort((a, b) => b[1] - a[1]).slice(0, 10))
66
+ lines.push(` ${d}: ${c}`);
67
+ }
68
+ return { content: [{ type: "text", text: `Network Summary (SDK):\n\n${lines.join("\n")}` }] };
69
+ }
70
+ }
71
+ const sdkResult = await querySDKNetwork({ count: maxRequests, method, urlPattern, status });
72
+ if (sdkResult.success) {
73
+ const entries = sdkResult.data;
74
+ if (entries.length === 0) {
75
+ return { content: [{ type: "text", text: "No network requests captured yet." }] };
76
+ }
77
+ const lines = entries.map((r) => {
78
+ const time = new Date(r.timestamp).toLocaleTimeString();
79
+ const st = r.status ?? "pending";
80
+ const dur = r.duration != null ? `${r.duration}ms` : "-";
81
+ return `[${r.id}] ${time} ${r.method} ${st} ${dur} ${r.url}`;
82
+ });
83
+ return { content: [{ type: "text", text: `Network Requests (${entries.length} entries, SDK):\n\n${lines.join("\n")}` }] };
84
+ }
85
+ }
86
+ // Fallback: read from in-process buffer (CDP/interceptor)
87
+ // Return summary if requested
88
+ if (summary) {
89
+ const stats = getNetworkStats(resolveNetworkBuffer(device));
90
+ let connectionWarning = "";
91
+ if (resolveNetworkBuffer(device).size === 0) {
92
+ const connStatus = await checkAndEnsureConnection(device);
93
+ connectionWarning = connStatus.message ? `\n\n${connStatus.message}` : "";
94
+ if (!sdkAvailable) {
95
+ connectionWarning += "\n\n[TIP] For full network capture including startup requests and response bodies, install the SDK: npm install execbro-sdk";
96
+ }
97
+ connectionWarning += await metroMissingHintIfAbsent("get_network_requests");
98
+ }
99
+ return {
100
+ content: [
101
+ {
102
+ type: "text",
103
+ text: `Network Summary:\n\n${stats}${connectionWarning}`
104
+ }
105
+ ]
106
+ };
107
+ }
108
+ const { requests, count, formatted } = getNetworkRequests(resolveNetworkBuffer(device), {
109
+ maxRequests,
110
+ method,
111
+ urlPattern,
112
+ status
113
+ });
114
+ // Check connection health
115
+ let connectionWarning = "";
116
+ if (count === 0) {
117
+ const connStatus = await checkAndEnsureConnection(device);
118
+ connectionWarning = connStatus.message ? `\n\n${connStatus.message}` : "";
119
+ if (!sdkAvailable) {
120
+ connectionWarning += "\n\n[TIP] For full network capture including startup requests and response bodies, install the SDK: npm install execbro-sdk";
121
+ }
122
+ connectionWarning += await metroMissingHintIfAbsent("get_network_requests");
123
+ }
124
+ else {
125
+ const passive = getPassiveConnectionStatus();
126
+ connectionWarning = !passive.connected
127
+ ? "\n\n[CONNECTION] Disconnected. Showing cached data. New data is not being captured."
128
+ : "";
129
+ }
130
+ // Check for recent connection gaps
131
+ const warningThresholdMs = 30000; // 30 seconds
132
+ const recentGaps = getRecentGaps(warningThresholdMs);
133
+ let gapWarning = "";
134
+ if (recentGaps.length > 0) {
135
+ const latestGap = recentGaps[recentGaps.length - 1];
136
+ const gapDuration = latestGap.durationMs || Date.now() - latestGap.disconnectedAt.getTime();
137
+ if (latestGap.reconnectedAt) {
138
+ const secAgo = Math.round((Date.now() - latestGap.reconnectedAt.getTime()) / 1000);
139
+ gapWarning = `\n\n[WARNING] Connection was restored ${secAgo}s ago. Some requests may have been missed during the ${formatDuration(gapDuration)} gap.`;
140
+ }
141
+ else {
142
+ gapWarning = `\n\n[WARNING] Connection is currently disconnected. Network data may be incomplete.`;
143
+ }
144
+ }
145
+ // Use TONL format if requested
146
+ if (format === "tonl") {
147
+ const tonlOutput = formatNetworkAsTonl(requests);
148
+ return {
149
+ content: [
150
+ {
151
+ type: "text",
152
+ text: `Network Requests (${count} entries):\n\n${tonlOutput}${gapWarning}${connectionWarning}`
153
+ }
154
+ ]
155
+ };
156
+ }
157
+ return {
158
+ content: [
159
+ {
160
+ type: "text",
161
+ text: `Network Requests (${count} entries):\n\n${formatted}${gapWarning}${connectionWarning}`
162
+ }
163
+ ]
164
+ };
165
+ },
166
+ // Empty result detector: buffer has no entries at all
167
+ () => { let total = 0; for (const b of networkBuffers.values())
168
+ total += b.size; return total === 0; });
169
+ // Tool: Search network requests
170
+ registerToolWithTelemetry(server, "search_network", {
171
+ description: "Search network requests by URL pattern (case-insensitive).\n" +
172
+ "PURPOSE: Filter the network buffer to requests whose URL matches a substring — fast way to find a specific endpoint in a noisy app.\n" +
173
+ "WHEN TO USE: You know part of the URL (e.g., \"/graphql\", \"users\", a domain) and want matching requests across all devices.\n" +
174
+ "WORKFLOW: search_network(urlPattern=\"/api/\") -> get_request_details(requestId=\"...\") for full headers/body.\n" +
175
+ "LIMITATIONS: Matches URL only; for method/status/body filtering use get_network_requests. Bodies are only present when the SDK is installed.\n" +
176
+ "GOOD: search_network({ urlPattern: \"/graphql\" })\n" +
177
+ "BAD: search_network({ urlPattern: \"\" }) — empty pattern matches everything; use get_network_requests instead.\n" +
178
+ "SEE ALSO: call get_usage_guide(topic=\"network\") for the full network-inspect playbook.",
179
+ inputSchema: {
180
+ urlPattern: z.string().describe("URL pattern to search for"),
181
+ maxResults: z.number().optional().default(50).describe("Maximum number of results to return (default: 50)"),
182
+ format: z
183
+ .enum(["text", "tonl"])
184
+ .optional()
185
+ .default("tonl")
186
+ .describe("Output format: 'text' or 'tonl' (default, compact token-optimized format)"),
187
+ device: z.string().optional().describe("Target device name (substring match). Omit for all devices. Run get_apps to see connected devices.")
188
+ }
189
+ }, async ({ urlPattern, maxResults, format, device }) => {
190
+ // Check if SDK is installed — prefer SDK data
191
+ const sdkAvailable = await isSDKInstalled();
192
+ if (sdkAvailable) {
193
+ const sdkResult = await querySDKNetwork({ count: maxResults, urlPattern });
194
+ if (sdkResult.success) {
195
+ const entries = sdkResult.data;
196
+ if (entries.length === 0) {
197
+ return { content: [{ type: "text", text: `No network requests matching "${urlPattern}" found.` }] };
198
+ }
199
+ const lines = entries.map((r) => {
200
+ const time = new Date(r.timestamp).toLocaleTimeString();
201
+ const st = r.status ?? "pending";
202
+ const dur = r.duration != null ? `${r.duration}ms` : "-";
203
+ return `[${r.id}] ${time} ${r.method} ${st} ${dur} ${r.url}`;
204
+ });
205
+ if (format === "tonl") {
206
+ return { content: [{ type: "text", text: `Network search results for "${urlPattern}" (${entries.length} matches, SDK):\n\n${lines.join("\n")}` }] };
207
+ }
208
+ return { content: [{ type: "text", text: `Network search results for "${urlPattern}" (${entries.length} matches, SDK):\n\n${lines.join("\n")}` }] };
209
+ }
210
+ }
211
+ const { requests, count, formatted } = searchNetworkRequests(resolveNetworkBuffer(device), urlPattern, maxResults);
212
+ // Check connection health
213
+ let connectionWarning = "";
214
+ if (count === 0) {
215
+ const status = await checkAndEnsureConnection(device);
216
+ connectionWarning = status.message ? `\n\n${status.message}` : "";
217
+ connectionWarning += await metroMissingHintIfAbsent("search_network");
218
+ }
219
+ else {
220
+ const passive = getPassiveConnectionStatus();
221
+ connectionWarning = !passive.connected
222
+ ? "\n\n[CONNECTION] Disconnected. Showing cached data. New data is not being captured."
223
+ : "";
224
+ }
225
+ // Use TONL format if requested
226
+ if (format === "tonl") {
227
+ const tonlOutput = formatNetworkAsTonl(requests);
228
+ return {
229
+ content: [
230
+ {
231
+ type: "text",
232
+ text: `Network search results for "${urlPattern}" (${count} matches):\n\n${tonlOutput}${connectionWarning}`
233
+ }
234
+ ]
235
+ };
236
+ }
237
+ return {
238
+ content: [
239
+ {
240
+ type: "text",
241
+ text: `Network search results for "${urlPattern}" (${count} matches):\n\n${formatted}${connectionWarning}`
242
+ }
243
+ ]
244
+ };
245
+ });
246
+ // Tool: Get request details
247
+ registerToolWithTelemetry(server, "get_request_details", {
248
+ description: "Get full details of a specific network request including headers, body, and timing. With the SDK installed, includes full request/response bodies. Without SDK, bodies are not available on most targets. Use get_network_requests first to find the request ID.\n" +
249
+ "PURPOSE: Drill into a single network entry — full request/response headers, body, status, and timing breakdown.\n" +
250
+ "WHEN TO USE: After get_network_requests or search_network returns a suspect ID and you need the payload to diagnose.\n" +
251
+ "WORKFLOW: get_network_requests / search_network -> copy id -> get_request_details(requestId).\n" +
252
+ "LIMITATIONS: Bodies require the execbro-sdk in the app; on CDP-only targets response bodies are missing. Large bodies are truncated — raise maxBodyLength.\n" +
253
+ "GOOD: get_request_details({ requestId: \"42\", maxBodyLength: 4000 })\n" +
254
+ "BAD: Guessing requestIds — always get them from get_network_requests / search_network first.\n" +
255
+ "SEE ALSO: call get_usage_guide(topic=\"network\") for the full network-inspect playbook.",
256
+ inputSchema: {
257
+ requestId: z.string().describe("The request ID to get details for"),
258
+ maxBodyLength: z.coerce
259
+ .number()
260
+ .optional()
261
+ .default(500)
262
+ .describe("Max characters for request body (default: 500, set to 0 for unlimited). Tip: Large POST bodies (file uploads, base64) can be 10KB+."),
263
+ verbose: z
264
+ .boolean()
265
+ .optional()
266
+ .default(false)
267
+ .describe("Disable body truncation. Tip: Use when you need to inspect full JSON payloads."),
268
+ device: z.string().optional().describe("Target device name (substring match). Omit for all devices. Run get_apps to see connected devices.")
269
+ }
270
+ }, async ({ requestId, maxBodyLength, verbose, device }) => {
271
+ // Resolve once per call so a mid-call SDK socket flap can't flip
272
+ // routing partway through. Try SDK first (richer data), but ALWAYS
273
+ // fall back to the CDP buffer on a miss — CDP records carry numeric
274
+ // ids the SDK store doesn't know about, and vice versa.
275
+ const sdkAvailable = await isSDKInstalled();
276
+ if (sdkAvailable) {
277
+ const sdkResult = await getSDKNetworkEntry(requestId);
278
+ if (sdkResult.success && sdkResult.data) {
279
+ const r = sdkResult.data;
280
+ const lines = [];
281
+ lines.push(`=== ${r.method} ${r.url} ===`);
282
+ lines.push(`Request ID: ${r.id}`);
283
+ lines.push(`Time: ${new Date(r.timestamp).toISOString()}`);
284
+ lines.push(`Status: ${r.status ?? "pending"} ${r.statusText ?? ""}`);
285
+ if (r.duration != null)
286
+ lines.push(`Duration: ${r.duration}ms`);
287
+ if (r.mimeType)
288
+ lines.push(`Content-Type: ${r.mimeType}`);
289
+ if (r.error)
290
+ lines.push(`Error: ${r.error}`);
291
+ if (r.requestHeaders && Object.keys(r.requestHeaders).length > 0) {
292
+ lines.push("\n--- Request Headers ---");
293
+ for (const [k, v] of Object.entries(r.requestHeaders))
294
+ lines.push(`${k}: ${v}`);
295
+ }
296
+ if (r.requestBody) {
297
+ lines.push("\n--- Request Body ---");
298
+ let body = r.requestBody;
299
+ if (!verbose && maxBodyLength > 0 && body.length > maxBodyLength) {
300
+ body = body.slice(0, maxBodyLength) + `... [truncated: ${r.requestBody.length} chars]`;
301
+ }
302
+ lines.push(body);
303
+ }
304
+ if (r.responseHeaders && Object.keys(r.responseHeaders).length > 0) {
305
+ lines.push("\n--- Response Headers ---");
306
+ for (const [k, v] of Object.entries(r.responseHeaders))
307
+ lines.push(`${k}: ${v}`);
308
+ }
309
+ if (r.responseBody) {
310
+ lines.push("\n--- Response Body ---");
311
+ let body = r.responseBody;
312
+ if (!verbose && maxBodyLength > 0 && body.length > maxBodyLength) {
313
+ body = body.slice(0, maxBodyLength) + `... [truncated: ${r.responseBody.length} chars]`;
314
+ }
315
+ lines.push(body);
316
+ }
317
+ return { content: [{ type: "text", text: lines.join("\n") }] };
318
+ }
319
+ }
320
+ // Fallback: read from in-process buffer
321
+ const request = resolveNetworkBuffer(device).get(requestId);
322
+ if (!request) {
323
+ const status = await checkAndEnsureConnection(device);
324
+ let connectionNote = status.message ? `\n\n${status.message}` : "";
325
+ connectionNote += await metroMissingHintIfAbsent("get_request_details");
326
+ // Enrich with up to 5 recent ids so the agent can pick a real one
327
+ // instead of retrying with the same stale / made-up id (telemetry
328
+ // shows ids like "latest", "js-x6e0-1208", "261" passed in).
329
+ const recent = resolveNetworkBuffer(device).getAll({ count: 5 });
330
+ let recentNote = "";
331
+ if (recent.length > 0) {
332
+ const lines = recent
333
+ .slice()
334
+ .reverse()
335
+ .map((r) => ` - ${r.requestId} — ${r.method} ${r.url}`)
336
+ .join("\n");
337
+ recentNote = `\n\nRecent request ids in buffer (most recent first):\n${lines}\n\nIds are opaque strings — use one of the above, or call get_network_requests / search_network to discover more.`;
338
+ }
339
+ else {
340
+ recentNote =
341
+ "\n\nNo network requests in the buffer for this device. " +
342
+ "Reproduce the action and call get_network_requests first to discover request ids.";
343
+ }
344
+ return {
345
+ content: [
346
+ {
347
+ type: "text",
348
+ text: `Request not found: ${requestId}${connectionNote}${recentNote}`
349
+ }
350
+ ],
351
+ isError: true
352
+ };
353
+ }
354
+ return {
355
+ content: [
356
+ {
357
+ type: "text",
358
+ text: formatRequestDetails(request, { maxBodyLength, verbose })
359
+ }
360
+ ]
361
+ };
362
+ });
363
+ // Tool: Get network stats
364
+ registerToolWithTelemetry(server, "get_network_stats", {
365
+ description: "Get statistics about captured network requests: counts by method, status code, and domain.\n" +
366
+ "PURPOSE: High-level view of traffic shape — totals, error counts, average duration, and top domains — without scanning every request.\n" +
367
+ "WHEN TO USE: To quickly answer \"is there a spike in 5xx?\", \"which domain is chattiest?\", or to sanity-check capture is working.\n" +
368
+ "WORKFLOW: get_network_stats -> if errors > 0: get_network_requests(status=\"500\") -> get_request_details.\n" +
369
+ "LIMITATIONS: Reflects only the buffered window (last 200 entries per device). Resets when clear_network is called.\n" +
370
+ "GOOD: get_network_stats()\n" +
371
+ "BAD: Using it to find a specific request — use search_network or get_network_requests.\n" +
372
+ "SEE ALSO: call get_usage_guide(topic=\"network\") for the full network-inspect playbook.",
373
+ inputSchema: {
374
+ device: z.string().optional().describe("Target device name (substring match). Omit for all devices. Run get_apps to see connected devices.")
375
+ }
376
+ }, async ({ device }) => {
377
+ // Check if SDK is installed — prefer SDK data
378
+ const sdkAvailable = await isSDKInstalled();
379
+ if (sdkAvailable) {
380
+ const sdkStats = await getSDKNetworkStats();
381
+ if (sdkStats.success) {
382
+ const s = sdkStats.data;
383
+ const lines = [];
384
+ lines.push(`Total requests: ${s.total}`);
385
+ lines.push(`Completed: ${s.completed}`);
386
+ lines.push(`Errors: ${s.errors}`);
387
+ if (s.avgDuration != null)
388
+ lines.push(`Avg duration: ${s.avgDuration}ms`);
389
+ if (s.byMethod && Object.keys(s.byMethod).length > 0) {
390
+ lines.push("\nBy Method:");
391
+ for (const [m, c] of Object.entries(s.byMethod))
392
+ lines.push(` ${m}: ${c}`);
393
+ }
394
+ if (s.byStatus && Object.keys(s.byStatus).length > 0) {
395
+ lines.push("\nBy Status:");
396
+ for (const [st, c] of Object.entries(s.byStatus))
397
+ lines.push(` ${st}: ${c}`);
398
+ }
399
+ if (s.byDomain && Object.keys(s.byDomain).length > 0) {
400
+ lines.push("\nBy Domain:");
401
+ for (const [d, c] of Object.entries(s.byDomain).sort((a, b) => b[1] - a[1]).slice(0, 10))
402
+ lines.push(` ${d}: ${c}`);
403
+ }
404
+ return { content: [{ type: "text", text: `Network Statistics (SDK):\n\n${lines.join("\n")}` }] };
405
+ }
406
+ }
407
+ const stats = getNetworkStats(resolveNetworkBuffer(device));
408
+ // Check connection health
409
+ let connectionWarning = "";
410
+ if (resolveNetworkBuffer(device).size === 0) {
411
+ const status = await checkAndEnsureConnection(device);
412
+ connectionWarning = status.message ? `\n\n${status.message}` : "";
413
+ connectionWarning += await metroMissingHintIfAbsent("get_network_stats");
414
+ }
415
+ else {
416
+ const passive = getPassiveConnectionStatus();
417
+ connectionWarning = !passive.connected
418
+ ? "\n\n[CONNECTION] Disconnected. Showing cached data. New data is not being captured."
419
+ : "";
420
+ }
421
+ return {
422
+ content: [
423
+ {
424
+ type: "text",
425
+ text: `Network Statistics:\n\n${stats}${connectionWarning}`
426
+ }
427
+ ]
428
+ };
429
+ },
430
+ // Empty result detector: buffer has no entries at all
431
+ () => { let total = 0; for (const b of networkBuffers.values())
432
+ total += b.size; return total === 0; });
433
+ // Tool: Clear network requests
434
+ registerToolWithTelemetry(server, "clear_network", {
435
+ description: "Clear the network request buffer.\n" +
436
+ "PURPOSE: Reset the captured request list to isolate new traffic from a specific user action.\n" +
437
+ "WHEN TO USE: Right before reproducing a bug so the buffer contains only the relevant requests.\n" +
438
+ "WORKFLOW: clear_network -> trigger action (tap, execute_in_app) -> get_network_requests / search_network.\n" +
439
+ "LIMITATIONS: Irreversible — cleared requests cannot be recovered. Also clears the SDK's in-app buffer when SDK is present.\n" +
440
+ "GOOD: clear_network() before a reproduction.\n" +
441
+ "BAD: Using clear_network as a workaround for stale connections — use scan_metro / ensure_connection instead.\n" +
442
+ "SEE ALSO: call get_usage_guide(topic=\"network\") for the full network-inspect playbook.",
443
+ inputSchema: {
444
+ device: z.string().optional().describe("Target device name (substring match). Omit to clear all devices. Run get_apps to see connected devices.")
445
+ }
446
+ }, async ({ device }) => {
447
+ let totalCleared = 0;
448
+ if (device) {
449
+ const app = getConnectedAppByDevice(device);
450
+ if (!app)
451
+ throw new UserInputError(`No connected device matches "${device}"`);
452
+ const deviceName = app.deviceInfo.deviceName || app.deviceInfo.title || "unknown";
453
+ totalCleared = getNetworkBuffer(deviceName).clear();
454
+ }
455
+ else {
456
+ for (const buffer of networkBuffers.values()) {
457
+ totalCleared += buffer.clear();
458
+ }
459
+ }
460
+ // Also clear SDK buffer if available
461
+ const sdkAvailable = await isSDKInstalled();
462
+ if (sdkAvailable) {
463
+ const sdkResult = await clearSDKNetwork();
464
+ if (sdkResult.success && sdkResult.count) {
465
+ totalCleared += sdkResult.count;
466
+ }
467
+ }
468
+ return {
469
+ content: [
470
+ {
471
+ type: "text",
472
+ text: `Cleared ${totalCleared} network requests from buffer.`
473
+ }
474
+ ]
475
+ };
476
+ });
477
+ }
478
+ //# sourceMappingURL=networkTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networkTools.js","sourceRoot":"","sources":["../../src/tools/networkTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerReduxTools(server: McpServer): void;
3
+ //# sourceMappingURL=reduxTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reduxTools.d.ts","sourceRoot":"","sources":["../../src/tools/reduxTools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2F1D"}
@@ -0,0 +1,83 @@
1
+ import { z } from "zod";
2
+ import { registerToolWithTelemetry } from "../core/register.js";
3
+ import { reduxDispatch, reduxGetState } from "../core/redux.js";
4
+ export function registerReduxTools(server) {
5
+ registerToolWithTelemetry(server, "redux_dispatch", {
6
+ description: "Dispatch a Redux action to the store bound to the app's <Provider>, triggering useSelector subscribers and React re-renders. Resolves the live store by walking the React fiber tree on each call (no SDK setup needed; works even if no store was registered with init()).\n" +
7
+ "PURPOSE: Drive state-controlled UI (loaders, modals, toasts, error overlays) without exercising the real flow (network, OTP, etc.).\n" +
8
+ "WHY THIS EXISTS: __RN_AI_DEVTOOLS__.stores.redux often holds a different store reference than the one passed to <Provider>, so dispatching through it updates state but does NOT notify react-redux subscribers. This tool dispatches through the actual Provider store, so views re-render.\n" +
9
+ "WHEN TO USE: Verify state-driven UI by seeding redux state directly. Example: dispatch app/setIsLoading: true, then ios_screenshot to confirm the loader rendered.\n" +
10
+ "WORKFLOW: redux_dispatch({ action: { type: 'app/setIsLoading', payload: true } }) -> ios_screenshot -> redux_dispatch({ action: { type: 'app/setIsLoading', payload: false } }).\n" +
11
+ "LIMITATIONS: Requires React DevTools hook (dev mode). Action must be plain JSON-serializable (no thunks/functions). If the app has multiple <Provider> roots, pass storeIndex (default 0).\n" +
12
+ "GOOD: redux_dispatch({ action: { type: 'app/setIsLoading', payload: true } })\n" +
13
+ "BAD: redux_dispatch({ action: () => ... }) — actions must be plain objects; for thunks use execute_in_app to call your action creator.",
14
+ inputSchema: {
15
+ action: z
16
+ .record(z.unknown())
17
+ .describe("Plain JSON-serializable Redux action object, e.g. { type: 'app/setIsLoading', payload: true }."),
18
+ storeIndex: z
19
+ .number()
20
+ .int()
21
+ .min(0)
22
+ .optional()
23
+ .describe("Index of the Provider store to dispatch to when the app has multiple <Provider> roots (default: 0)."),
24
+ returnPath: z
25
+ .string()
26
+ .optional()
27
+ .describe("Optional dotted path into the post-dispatch state to return for verification (e.g. 'app' or 'auth.user'). Omit to skip returning state — keeps the response small. Use redux_get_state for ad-hoc reads."),
28
+ device: z
29
+ .string()
30
+ .optional()
31
+ .describe("Target device name (substring match). Omit for default device. Run get_apps to see connected devices.")
32
+ }
33
+ }, async ({ action, storeIndex, returnPath, device }) => {
34
+ const result = await reduxDispatch({ action: action, storeIndex, returnPath, device });
35
+ if (!result.success) {
36
+ return {
37
+ content: [{ type: "text", text: `Error: ${result.error ?? "Unknown error"}` }],
38
+ isError: true
39
+ };
40
+ }
41
+ const ack = `Dispatched to store ${result.storeIndex} of ${result.storeCount}: ${JSON.stringify(result.previousAction)}`;
42
+ const stateLine = returnPath
43
+ ? `\n\nState at '${returnPath}':\n${JSON.stringify(result.state, null, 2)}`
44
+ : "";
45
+ return { content: [{ type: "text", text: ack + stateLine }] };
46
+ });
47
+ registerToolWithTelemetry(server, "redux_get_state", {
48
+ description: "Read state from the Redux store bound to the app's <Provider>, resolved live via the fiber tree (same store redux_dispatch targets).\n" +
49
+ "PURPOSE: Inspect the current app state without relying on __RN_AI_DEVTOOLS__.stores.redux (which may point at a different store instance than the Provider).\n" +
50
+ "WHEN TO USE: Verify state shape before/after redux_dispatch, or check what slice keys exist before crafting an action.\n" +
51
+ "WORKFLOW: redux_get_state() -> craft action -> redux_dispatch -> redux_get_state({ path: 'app' }) to confirm.\n" +
52
+ "LIMITATIONS: Requires React DevTools hook (dev mode). State must be JSON-serializable; non-serializable values are replaced with an error marker.\n" +
53
+ "GOOD: redux_get_state({ path: 'app' })\n" +
54
+ "BAD: redux_get_state({ path: 'app.isLoading.0' }) when isLoading is a boolean — path traversal returns undefined.",
55
+ inputSchema: {
56
+ storeIndex: z
57
+ .number()
58
+ .int()
59
+ .min(0)
60
+ .optional()
61
+ .describe("Index of the Provider store to read from when the app has multiple <Provider> roots (default: 0)."),
62
+ path: z
63
+ .string()
64
+ .optional()
65
+ .describe("Optional dotted path into state (e.g. 'app' or 'auth.user'). Omit for the full state."),
66
+ device: z
67
+ .string()
68
+ .optional()
69
+ .describe("Target device name (substring match). Omit for default device.")
70
+ }
71
+ }, async ({ storeIndex, path, device }) => {
72
+ const result = await reduxGetState({ storeIndex, path, device });
73
+ if (!result.success) {
74
+ return {
75
+ content: [{ type: "text", text: `Error: ${result.error ?? "Unknown error"}` }],
76
+ isError: true
77
+ };
78
+ }
79
+ const header = `Store ${result.storeIndex} of ${result.storeCount}${path ? ` at path '${path}'` : ""}:`;
80
+ return { content: [{ type: "text", text: `${header}\n\n${JSON.stringify(result.state, null, 2)}` }] };
81
+ });
82
+ }
83
+ //# sourceMappingURL=reduxTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reduxTools.js","sourceRoot":"","sources":["../../src/tools/reduxTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerScreenshotTools(server: McpServer): void;
3
+ //# sourceMappingURL=screenshotTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshotTools.d.ts","sourceRoot":"","sources":["../../src/tools/screenshotTools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6BzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwuB/D"}