@jshookmcp/jshook 0.3.2 → 0.3.4

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 (357) hide show
  1. package/README.md +19 -4
  2. package/README.zh.md +19 -4
  3. package/dist/AntiCheatDetector-B-mz4DK_.mjs +1 -0
  4. package/dist/{BrowserSessionCoordinator-BJ-HOxo0.mjs → BrowserSessionCoordinator-Cdic8FsH.mjs} +1 -1
  5. package/dist/CodeAnalyzerDataFlow-a-NkwcaG.mjs +2 -0
  6. package/dist/CodeInjector-B099WO6x.mjs +1 -0
  7. package/dist/ConsoleMonitor-BZRqrBH-.mjs +306 -0
  8. package/dist/CpuEngine-BC8jayy9.mjs +1 -0
  9. package/dist/DartAotExecutor-B7WVTKsd.mjs +1 -0
  10. package/dist/DartAotLoader-BxdhW-K2.mjs +2 -0
  11. package/dist/DarwinAPI-DzojdfjF.mjs +1 -0
  12. package/dist/DetailedDataManager-Dgh402Gp.mjs +5 -0
  13. package/dist/ExecutionSandbox-QbWQmzuC.mjs +45 -0
  14. package/dist/ExtensionManager.tools-D3h818Xs.mjs +1 -0
  15. package/dist/FingerprintManager-D9Zlr6be.mjs +1 -0
  16. package/dist/HardwareBreakpoint-C_lJ22bj.mjs +1 -0
  17. package/dist/HeapAnalyzer-bJbLvzp6.mjs +1 -0
  18. package/dist/HookPatternScanner-yx4vJ9sd.mjs +1 -0
  19. package/dist/InstrumentationSession-Cv1wikLA.mjs +1 -0
  20. package/dist/IntegrityScanner-BB7sw-SA.mjs +1 -0
  21. package/dist/JScramblerDeobfuscator-NVR5VatT.mjs +1 -0
  22. package/dist/MCPServer.activation.ttl-C2wOCMLV.mjs +1 -0
  23. package/dist/MCPServer.search.helpers-DlassAew.mjs +2 -0
  24. package/dist/MCPServer.search.validation-DnifPCCv.mjs +1 -0
  25. package/dist/MemoryController-CCsGuGJS.mjs +2 -0
  26. package/dist/{MemoryScanSession-DG_F-PjE.mjs → MemoryScanSession-BZ2A9Ph1.mjs} +1 -1
  27. package/dist/MemoryScanner-DAxsq7Sx.mjs +1 -0
  28. package/dist/NativeMemoryManager.impl-BIJzXMqH.mjs +1 -0
  29. package/dist/{NativeMemoryManager.utils-BHy1P_jM.mjs → NativeMemoryManager.utils-CMoul2an.mjs} +1 -1
  30. package/dist/PEAnalyzer-CB_kaTis.mjs +1 -0
  31. package/dist/PackerDeobfuscator-BpwGjxDL.mjs +7 -0
  32. package/dist/PointerChainEngine-B6SYv6ZM.mjs +1 -0
  33. package/dist/ProcessRegistry-C5W1Tkn9.mjs +1 -0
  34. package/dist/{handlers-mPFiNPe8.mjs → QuickJSSandbox-CIde-jzG.mjs} +2 -5
  35. package/dist/{ResponseBuilder-BfWP-uaT.mjs → ResponseBuilder-BLicSCjn.mjs} +1 -1
  36. package/dist/ReverseEvidenceGraph-DJzk0GQz.mjs +2 -0
  37. package/dist/ServerRuntimeState-DGXNv8Ji.mjs +1 -0
  38. package/dist/Speedhack-MGoeq1ZS.mjs +1 -0
  39. package/dist/StructureAnalyzer-CCTWAXR3.mjs +2 -0
  40. package/dist/ToolHandlerMap-C40EmuLT.mjs +1 -0
  41. package/dist/{ToolProbe-C7ZU2x7M.mjs → ToolProbe-B02GC3ZY.mjs} +1 -1
  42. package/dist/ToolRegistry-CzqQxFqf.mjs +1 -0
  43. package/dist/ToolRouter.policy-Bgb3S8jc.mjs +4 -0
  44. package/dist/TraceRecorder-BfeCTQUj.mjs +407 -0
  45. package/dist/VMDeobfuscator-BHtkV850.mjs +1 -0
  46. package/dist/Win32API-G7QPyckq.mjs +1 -0
  47. package/dist/{Win32Debug-CYrIQBvr.mjs → Win32Debug-6yzmtv5b.mjs} +1 -1
  48. package/dist/allocation-track-CiI-CnaI.mjs +1 -0
  49. package/dist/analysis-CojUzwX-.mjs +27 -0
  50. package/dist/antidebug-CgU84TE1.mjs +1 -0
  51. package/dist/apk-DrPBsOq8.mjs +1 -0
  52. package/dist/artifactRetention-Bk6fW2uF.mjs +1 -0
  53. package/dist/artifacts-Bx9GLx4J.mjs +1 -0
  54. package/dist/ast-bridge-BlOrmVAv.mjs +1 -0
  55. package/dist/ast-utils-B9E5k_v1.mjs +1 -0
  56. package/dist/{betterSqlite3-Brtq-SIQ.mjs → betterSqlite3-Bdo_ifuJ.mjs} +1 -1
  57. package/dist/binary-instrument-DiE1BP0x.mjs +12 -0
  58. package/dist/boringssl-inspector-C6M3sOga.mjs +2 -0
  59. package/dist/browser-QDUu5ML9.mjs +29 -0
  60. package/dist/{handlers-yo_xYzT8.mjs → canvas-g5kmLdY-.mjs} +1098 -24
  61. package/dist/{capabilities-CyXuKUl1.mjs → capabilities-DwzyxL2w.mjs} +1 -1
  62. package/dist/cdp-session-Dy4OwMOP.mjs +1 -0
  63. package/dist/collector-Cld4i-E4.mjs +1 -0
  64. package/dist/config-5ODJ3Aj0.mjs +3 -0
  65. package/dist/constants-nvsLpSri.mjs +1 -0
  66. package/dist/coordination-C6y2gM9O.mjs +98 -0
  67. package/dist/coverage-and-block--cWjjEe5.mjs +1 -0
  68. package/dist/dart-inspector-D4IKxZ6u.mjs +0 -0
  69. package/dist/debugger-C2SpiXoO.mjs +1 -0
  70. package/dist/definitions-0mtilYzG.mjs +1 -0
  71. package/dist/definitions-9csunmeX.mjs +1 -0
  72. package/dist/definitions-B11MudW_.mjs +1 -0
  73. package/dist/definitions-BKpRDjcI.mjs +1 -0
  74. package/dist/definitions-BXE3H4re.mjs +1 -0
  75. package/dist/definitions-BlPHe5DX.mjs +1 -0
  76. package/dist/definitions-Bob4XMxI.mjs +27 -0
  77. package/dist/definitions-BpIQN2nm.mjs +1 -0
  78. package/dist/definitions-BvolWeSu.mjs +1 -0
  79. package/dist/definitions-C-6j3Ejl.mjs +1 -0
  80. package/dist/definitions-C-AdFfFu.mjs +1 -0
  81. package/dist/definitions-CArdw_9T.mjs +1 -0
  82. package/dist/definitions-CCvIcRrT.mjs +1 -0
  83. package/dist/definitions-CJPE5PIl.mjs +1 -0
  84. package/dist/definitions-CbqeW06u.mjs +1 -0
  85. package/dist/definitions-Cexmkypg.mjs +1 -0
  86. package/dist/definitions-D1dxl8qt.mjs +1 -0
  87. package/dist/definitions-D3uT-ZbU.mjs +1 -0
  88. package/dist/definitions-DtOY5iUc.mjs +1 -0
  89. package/dist/{definitions-DxFNRQNK2.mjs → definitions-DvrYdDCJ2.mjs} +1 -1
  90. package/dist/{definitions-Cenu6mxo.mjs → definitions-aeRd5DAR.mjs} +1 -1
  91. package/dist/definitions-ihxOqOC4.mjs +1 -0
  92. package/dist/deopt-trace-qnAcC931.mjs +17 -0
  93. package/dist/disasm-DoxSucGp.mjs +1 -0
  94. package/dist/dumpsys-parser-Du-5ruEe.mjs +2 -0
  95. package/dist/encoding-UMtwgy4M.mjs +2 -0
  96. package/dist/ensure-browser-core-BP70x0TB.mjs +285 -0
  97. package/dist/factory-BeND77hf.mjs +2 -0
  98. package/dist/graphql-CF7QKJME.mjs +68 -0
  99. package/dist/grpc-raw-Dp7ps2sv.mjs +1 -0
  100. package/dist/handlers--qCl9vNv.mjs +1 -0
  101. package/dist/handlers-BHIu1LqA.mjs +1 -0
  102. package/dist/{antidebug-7L3ygj_9.mjs → handlers-BQ4K8Jbr.mjs} +2 -2
  103. package/dist/handlers-BxQv-wtf.mjs +8 -0
  104. package/dist/handlers-ByYG27-5.mjs +1 -0
  105. package/dist/handlers-C0I9-BtX.mjs +5 -0
  106. package/dist/handlers-CL0Iokmw.mjs +1 -0
  107. package/dist/handlers-CNbhIdSK.mjs +4 -0
  108. package/dist/handlers-CnTTSJFs.mjs +109 -0
  109. package/dist/handlers-CoDx6akJ2.mjs +49 -0
  110. package/dist/{handlers-0yKLRIfo.mjs → handlers-DASJI0Pn.mjs} +1 -1
  111. package/dist/handlers-DRKMaA-_.mjs +74 -0
  112. package/dist/handlers-Dalu0olz.mjs +2 -0
  113. package/dist/handlers-KY0g31ny.mjs +9 -0
  114. package/dist/handlers-oGo60aVv.mjs +1 -0
  115. package/dist/handlers.impl-BTXLw6Qc.mjs +1 -0
  116. package/dist/heap-sampling-BqdiU-5j.mjs +1 -0
  117. package/dist/{hooks-D4XLfgtV.mjs → hooks-COK3t5rT.mjs} +52 -33
  118. package/dist/index.mjs +11 -11
  119. package/dist/logger-BGCcd-jJ.mjs +1 -0
  120. package/dist/macro-nUYUjKNZ.mjs +2 -0
  121. package/dist/maintenance-CfnE7ZKU.mjs +4 -0
  122. package/dist/manifest-7EOTUc0D.mjs +1 -0
  123. package/dist/manifest-B5ujuQmf.mjs +1 -0
  124. package/dist/manifest-BErXl3zn.mjs +1 -0
  125. package/dist/manifest-BKA-mD3J.mjs +1 -0
  126. package/dist/manifest-BUXj23bX.mjs +1 -0
  127. package/dist/manifest-BfXt9cau.mjs +1 -0
  128. package/dist/manifest-Bx-tpURK.mjs +1 -0
  129. package/dist/manifest-C0owVAdq.mjs +1 -0
  130. package/dist/manifest-C5XqYc9o.mjs +1 -0
  131. package/dist/manifest-CVKzLjsA.mjs +1 -0
  132. package/dist/manifest-CaeFjdhj.mjs +1 -0
  133. package/dist/manifest-CegBgip0.mjs +1 -0
  134. package/dist/manifest-CoJHqlgS.mjs +1 -0
  135. package/dist/manifest-D0dbtDqd.mjs +1 -0
  136. package/dist/manifest-D5Gr8ujd.mjs +12 -0
  137. package/dist/manifest-D82z-5og.mjs +1 -0
  138. package/dist/manifest-DA2afIwh.mjs +1 -0
  139. package/dist/manifest-DAbiFP5o.mjs +1 -0
  140. package/dist/manifest-DEY0s1O72.mjs +1 -0
  141. package/dist/manifest-DTOqNqiA.mjs +1 -0
  142. package/dist/manifest-DZ6ELNgX.mjs +1 -0
  143. package/dist/manifest-DjHkjddT.mjs +1 -0
  144. package/dist/manifest-DocA_itf2.mjs +1 -0
  145. package/dist/manifest-Dpnhvfq0.mjs +1 -0
  146. package/dist/manifest-DucPMG_a.mjs +1 -0
  147. package/dist/manifest-Dw5yYEac.mjs +1 -0
  148. package/dist/manifest-Ic_Cg66S.mjs +1 -0
  149. package/dist/manifest-JHaG6GMN.mjs +1 -0
  150. package/dist/manifest-QdkIzmYM.mjs +1 -0
  151. package/dist/manifest-YZqaCe25.mjs +1 -0
  152. package/dist/manifest-f0lUeXwq.mjs +1 -0
  153. package/dist/manifest-h-Ebisf8.mjs +1 -0
  154. package/dist/manifest-oOfTymBS.mjs +1 -0
  155. package/dist/manifest-qXqrO6KC.mjs +2 -0
  156. package/dist/mapsParser-DrJoeC0c.mjs +1 -0
  157. package/dist/modules-CC_ADmwi.mjs +333 -0
  158. package/dist/mojo-ipc-kVztXYw-.mjs +140 -0
  159. package/dist/native-D9ouskXO.mjs +961 -0
  160. package/dist/native-bridge-Dzd7hYoq.mjs +1 -0
  161. package/dist/network-C5Y-S87J.mjs +7 -0
  162. package/dist/one-gadget-CiWFE17F.mjs +1 -0
  163. package/dist/outputPaths-CHtELDyi.mjs +1 -0
  164. package/dist/parse-args-B6dwWc9k.mjs +1 -0
  165. package/dist/platform-BIXgJaM3.mjs +94 -0
  166. package/dist/process-aDIfLC0v.mjs +6 -0
  167. package/dist/proxy-DsHsQ1I4.mjs +2 -0
  168. package/dist/registry-7h8jJ9y9.mjs +1 -0
  169. package/dist/{registry-DH4sc1dt.mjs → registry-DJDnkQW2.mjs} +1 -1
  170. package/dist/response-R8ghbZSb.mjs +1 -0
  171. package/dist/retry-policy-DtYv0kDi.mjs +1 -0
  172. package/dist/reverseEngineeringConfig-BhZLOa3C.mjs +1 -0
  173. package/dist/safeOutput-Dt4mfjXA.mjs +1 -0
  174. package/dist/search-defaults-BBRJNAzC.mjs +1 -0
  175. package/dist/server/plugin-api.mjs +1 -1
  176. package/dist/server/search/EmbeddingWorker.d.mts +1 -0
  177. package/dist/server/search/EmbeddingWorker.mjs +1 -0
  178. package/dist/shared-BKtWZDGN.mjs +1 -0
  179. package/dist/sourcemap-2VIeVeKw.mjs +3 -0
  180. package/dist/streaming-DkpE3GGU.mjs +15 -0
  181. package/dist/syscall-DGZoYM_U.mjs +1 -0
  182. package/dist/transform-BJqsBC_-.mjs +105 -0
  183. package/dist/turbofan-graph-CbGHNVtl.mjs +1 -0
  184. package/dist/turbofan-inspect--NdCuYXi.mjs +23 -0
  185. package/dist/types-CWSvzmIh.mjs +1 -0
  186. package/dist/v8-inspector-CTJo08-K.mjs +297 -0
  187. package/dist/wasm-DX4Qm2Vs.mjs +235 -0
  188. package/dist/weakrefs-inspect-CnhaF-rN.mjs +57 -0
  189. package/dist/webgpu-D4-DxbxZ.mjs +6 -0
  190. package/dist/workflow-DHktRNF2.mjs +108 -0
  191. package/package.json +33 -27
  192. package/dist/AntiCheatDetector-B6d4Qe9D.mjs +0 -1
  193. package/dist/CodeInjector-Cll_7bLJ.mjs +0 -1
  194. package/dist/ConsoleMonitor-CxDJV15E.mjs +0 -306
  195. package/dist/DOMInspector-C19J4zeq.mjs +0 -95
  196. package/dist/DarwinAPI-ZfQdpLNI.mjs +0 -1
  197. package/dist/DetailedDataManager-DmQ1LT-W.mjs +0 -1
  198. package/dist/ExtensionManager-BD724zkO.mjs +0 -1
  199. package/dist/ExtensionManager.tools-oVMJgPcN.mjs +0 -1
  200. package/dist/FingerprintManager-DT0EAUEo.mjs +0 -1
  201. package/dist/HardwareBreakpoint-BUfPdp0f.mjs +0 -1
  202. package/dist/HeapAnalyzer-B_aqY8oj.mjs +0 -1
  203. package/dist/InstrumentationSession-D_G1ZPyd.mjs +0 -1
  204. package/dist/MCPServer.search.handlers.domain-BbS-6LnX.mjs +0 -1
  205. package/dist/MemoryController-X1XNSn1n.mjs +0 -2
  206. package/dist/MemoryScanner-g1_L1ub5.mjs +0 -1
  207. package/dist/NativeMemoryManager.impl-DniBe2wf.mjs +0 -1
  208. package/dist/NetworkMonitor-B_-au6aV.mjs +0 -185
  209. package/dist/PEAnalyzer-yWQaGrcx.mjs +0 -1
  210. package/dist/PageController-Dfsm1_o7.mjs +0 -1
  211. package/dist/PointerChainEngine-BhCUkmxY.mjs +0 -1
  212. package/dist/PrerequisiteError-BjCQA-gK.mjs +0 -1
  213. package/dist/ProcessRegistry-C-bN48oR.mjs +0 -1
  214. package/dist/ReverseEvidenceGraph-BhSYYdiI.mjs +0 -2
  215. package/dist/ScriptManager-LWGPTdvD.mjs +0 -7
  216. package/dist/ServerRuntimeState-D2bWHqEE.mjs +0 -1
  217. package/dist/Speedhack-yseDPSZ9.mjs +0 -1
  218. package/dist/StructureAnalyzer-C5lpuZkg.mjs +0 -2
  219. package/dist/ToolCatalog-CYdD9F5f.mjs +0 -1
  220. package/dist/ToolRegistry-C5oB8KP8.mjs +0 -1
  221. package/dist/ToolRouter.policy-CfhJczkt.mjs +0 -4
  222. package/dist/TraceRecorder-BiJWBXHX.mjs +0 -272
  223. package/dist/VersionDetector-CHT36Az0.mjs +0 -9
  224. package/dist/Win32API-eUCF57l_.mjs +0 -1
  225. package/dist/WorkflowEngine-D876meOO.mjs +0 -1
  226. package/dist/analysis-D4swdMvq.mjs +0 -6
  227. package/dist/apk-packer-BqXcInnX.mjs +0 -1
  228. package/dist/artifactRetention-BCPQASm7.mjs +0 -1
  229. package/dist/artifacts-CkodUM4j.mjs +0 -1
  230. package/dist/binary-instrument-DU7V6TUM.mjs +0 -7
  231. package/dist/binary-secrets-PdMVoyt0.mjs +0 -1
  232. package/dist/boringssl-inspector-BBaJwwkU.mjs +0 -2
  233. package/dist/browser-Qqco2rOT.mjs +0 -11
  234. package/dist/collector-Bpl6qy2L.mjs +0 -1
  235. package/dist/constants-BYj8Xek8.mjs +0 -1
  236. package/dist/coordination-CWXW1o8K.mjs +0 -1
  237. package/dist/dart-inspector-7AkPeZ_Q.mjs +0 -0
  238. package/dist/debugger-DyALjYMk.mjs +0 -1
  239. package/dist/definitions-BWxBke3r.mjs +0 -1
  240. package/dist/definitions-BYwATKc-.mjs +0 -1
  241. package/dist/definitions-B_83XfNQ.mjs +0 -1
  242. package/dist/definitions-Bf3H1EwV.mjs +0 -1
  243. package/dist/definitions-BftdXgXI.mjs +0 -1
  244. package/dist/definitions-Bio5XJYy.mjs +0 -1
  245. package/dist/definitions-C3qNgSn1.mjs +0 -1
  246. package/dist/definitions-CB6vmOer.mjs +0 -1
  247. package/dist/definitions-CMZRSy3k.mjs +0 -1
  248. package/dist/definitions-CQd7yCQH.mjs +0 -1
  249. package/dist/definitions-CT8ln6GQ.mjs +0 -1
  250. package/dist/definitions-D4g-MS10.mjs +0 -1
  251. package/dist/definitions-D5wl_8HN.mjs +0 -1
  252. package/dist/definitions-DAQm1Xar.mjs +0 -1
  253. package/dist/definitions-DP1vgxEY.mjs +0 -1
  254. package/dist/definitions-Ibci7e_L.mjs +0 -1
  255. package/dist/definitions-OeLvmlQy.mjs +0 -1
  256. package/dist/definitions-RZYGD_Ey.mjs +0 -1
  257. package/dist/definitions-Tls8c0A0.mjs +0 -1
  258. package/dist/definitions-bybDvnG0.mjs +0 -26
  259. package/dist/definitions-l7TjdE6V.mjs +0 -1
  260. package/dist/encoding-ycOaz8Vr.mjs +0 -2
  261. package/dist/ensure-browser-core-DxWC-NTp.mjs +0 -1
  262. package/dist/factory-CKr4fAE1.mjs +0 -1
  263. package/dist/flat-target-session-DvcQX7J5.mjs +0 -1
  264. package/dist/graphql-B2TiPEow.mjs +0 -62
  265. package/dist/handlers-8zN_vBIz.mjs +0 -1
  266. package/dist/handlers-B62K4FTc.mjs +0 -1
  267. package/dist/handlers-BpDlVVVU.mjs +0 -1
  268. package/dist/handlers-CMJK7m1c.mjs +0 -31
  269. package/dist/handlers-D2ZOul9p.mjs +0 -54
  270. package/dist/handlers-D5E40ssn.mjs +0 -5
  271. package/dist/handlers-DGbdQAgD.mjs +0 -4
  272. package/dist/handlers-DHO3rjsW.mjs +0 -1
  273. package/dist/handlers-FJ80VzUI.mjs +0 -2
  274. package/dist/handlers-VHWrxbM_.mjs +0 -1
  275. package/dist/handlers-l8QIKqBj.mjs +0 -2
  276. package/dist/handlers.impl-D9Hh8Bgl.mjs +0 -1
  277. package/dist/jadx-search-B_Yse0Zh.mjs +0 -5
  278. package/dist/logger-sBC6IdRT.mjs +0 -1
  279. package/dist/maintenance-BUpIukhg.mjs +0 -1
  280. package/dist/manifest-0Jpt_AQa.mjs +0 -1
  281. package/dist/manifest-B3fZbSWR.mjs +0 -1
  282. package/dist/manifest-B7NB2rh2.mjs +0 -1
  283. package/dist/manifest-BDi4nbH1.mjs +0 -1
  284. package/dist/manifest-BLDfkE7n.mjs +0 -1
  285. package/dist/manifest-BcXbB4gf.mjs +0 -1
  286. package/dist/manifest-Bdnc_vrc.mjs +0 -1
  287. package/dist/manifest-BuYKgCnp.mjs +0 -1
  288. package/dist/manifest-CBfNnGPV.mjs +0 -1
  289. package/dist/manifest-CPS1Xv69.mjs +0 -1
  290. package/dist/manifest-CQH9FhwI.mjs +0 -1
  291. package/dist/manifest-CRryuZF4.mjs +0 -1
  292. package/dist/manifest-CctIumog.mjs +0 -1
  293. package/dist/manifest-CvTe5ZGV2.mjs +0 -1
  294. package/dist/manifest-D-5GH0DV.mjs +0 -1
  295. package/dist/manifest-D3Ssf3IC.mjs +0 -1
  296. package/dist/manifest-D5ck3NvC.mjs +0 -1
  297. package/dist/manifest-D9jUUJAu.mjs +0 -1
  298. package/dist/manifest-DCx6w2XV.mjs +0 -1
  299. package/dist/manifest-DG19q-Ld.mjs +0 -1
  300. package/dist/manifest-DLMlD0Zc.mjs +0 -1
  301. package/dist/manifest-DYpn8w_h.mjs +0 -1
  302. package/dist/manifest-DYzWI8Xs.mjs +0 -1
  303. package/dist/manifest-D_obs5F4.mjs +0 -1
  304. package/dist/manifest-DujQqEQR.mjs +0 -2
  305. package/dist/manifest-DwL2ik8P.mjs +0 -1
  306. package/dist/manifest-ItF5P8A12.mjs +0 -1
  307. package/dist/manifest-KZphqIyX.mjs +0 -1
  308. package/dist/manifest-LG42zPLY2.mjs +0 -1
  309. package/dist/manifest-LLdI5m4T.mjs +0 -1
  310. package/dist/manifest-QYbQXJn0.mjs +0 -1
  311. package/dist/manifest-RcpX_MyZ.mjs +0 -123
  312. package/dist/manifest-YgVd8Sgz.mjs +0 -1
  313. package/dist/manifest-Zy7Odg5J.mjs +0 -1
  314. package/dist/manifest-ff1H7Pdp.mjs +0 -1
  315. package/dist/manifest-iuhF6pTL2.mjs +0 -1
  316. package/dist/manifest-nXHmtMSp2.mjs +0 -1
  317. package/dist/manifest-xWfu6iLo.mjs +0 -1
  318. package/dist/manifest-yC16OhL2.mjs +0 -1
  319. package/dist/manifest-ztWJoXy4.mjs +0 -1
  320. package/dist/matchesWildcardPattern-BAG6LvX5.mjs +0 -1
  321. package/dist/modules-BPBcSaM-.mjs +0 -333
  322. package/dist/mojo-ipc-BhwsdVUW.mjs +0 -9
  323. package/dist/native-j8l473zn.mjs +0 -961
  324. package/dist/network-T0VRwNPd.mjs +0 -7
  325. package/dist/outputPaths-B4Ic4RZh.mjs +0 -2
  326. package/dist/parse-args-Bw413PlW.mjs +0 -1
  327. package/dist/platform-CzaQtISh.mjs +0 -93
  328. package/dist/playwright-cdp-fallback-DqFdx9-s.mjs +0 -1
  329. package/dist/process-CWhsCWrf.mjs +0 -2
  330. package/dist/proxy-DZFlDsG3.mjs +0 -2
  331. package/dist/renderer-pid-9tJnZ_9N.mjs +0 -1
  332. package/dist/response-C7rKQst4.mjs +0 -1
  333. package/dist/search-defaults-lYBVn_3L.mjs +0 -1
  334. package/dist/shared-state-board-BSjXLUV1.mjs +0 -1
  335. package/dist/sourcemap-Dh3Ai_ur.mjs +0 -1
  336. package/dist/streaming-BcJ0B6ao.mjs +0 -1
  337. package/dist/transform-DOxzeWPB.mjs +0 -103
  338. package/dist/types-D9EiE5o9.mjs +0 -1
  339. package/dist/wasm-CZ_HTfKR.mjs +0 -174
  340. package/dist/webcrack-C1iYG_EX.mjs +0 -46
  341. package/dist/workflow-BdwQmARn.mjs +0 -101
  342. /package/dist/{CacheAdapters-CsNtQIR8.mjs → CacheAdapters-BlDrQg8f.mjs} +0 -0
  343. /package/dist/{EventBus-DL8iLA09.mjs → EventBus-Cm-t-B65.mjs} +0 -0
  344. /package/dist/{EvidenceGraphBridge-BtbwXsLC.mjs → EvidenceGraphBridge-DBDc0wUA.mjs} +0 -0
  345. /package/dist/{HookGeneratorBuilders.core.generators.storage-DzD6dIJd.mjs → HookGeneratorBuilders.core.generators.storage-CWaWpOHa.mjs} +0 -0
  346. /package/dist/{RingBuffer-Dm54ELKT.mjs → RingBuffer-B6RTHmij.mjs} +0 -0
  347. /package/dist/{StealthVerifier-BmcxfwSF.mjs → StealthVerifier-DMBrtkhN.mjs} +0 -0
  348. /package/dist/{ToolError-DWU_z7gp.mjs → ToolError-g3rjWzhx.mjs} +0 -0
  349. /package/dist/{authorization-schema-BOFwSXUN.mjs → authorization-schema-Jtikc5Yt.mjs} +0 -0
  350. /package/dist/{bind-helpers-m2U8glkF.mjs → bind-helpers-D0mGAOof.mjs} +0 -0
  351. /package/dist/{concurrency-DCr8WQ2M.mjs → concurrency-Dehnw4JC.mjs} +0 -0
  352. /package/dist/{evidence-graph-bridge-CV_UdYqj.mjs → evidence-graph-bridge-eT9icP6a.mjs} +0 -0
  353. /package/dist/{formatAddress-vLA_hOJt.mjs → formatAddress-DAcw4Ckg.mjs} +0 -0
  354. /package/dist/{chunk-C_pMuVsO.mjs → rolldown-runtime-88NL7fhV.mjs} +0 -0
  355. /package/dist/{ssrf-policy-CsIJGkpd.mjs → ssrf-policy-B72vdy23.mjs} +0 -0
  356. /package/dist/{tool-builder-qif8M9-K.mjs → tool-builder-CpLh-UQd.mjs} +0 -0
  357. /package/dist/{types-Fz69RzbZ.mjs → types-BzPBzmVB.mjs} +0 -0
@@ -0,0 +1 @@
1
+ import{ct as e,ot as t,st as n}from"./constants-nvsLpSri.mjs";import{i as r}from"./artifacts-Bx9GLx4J.mjs";import{n as i,r as a,t as o}from"./CpuEngine-BC8jayy9.mjs";import{t as s}from"./apk-DrPBsOq8.mjs";import{a as c,c as l,i as u,l as d,n as f,r as p,u as m}from"./parse-args-B6dwWc9k.mjs";import{r as h,t as ee}from"./ResponseBuilder-BLicSCjn.mjs";import{t as g}from"./reverseEngineeringConfig-BhZLOa3C.mjs";import{readFile as _,writeFile as te}from"node:fs/promises";import{randomUUID as ne}from"node:crypto";const re=new TextDecoder,ie=new TextEncoder,ae=new Set([`-`,`+`,` `,`#`,`0`]),oe=new Set([`h`,`l`,`j`,`z`,`t`,`L`]);function v(e,t,n=g().nativeEmulator.cstringDefaultLimitBytes){if(t===0||n<=0)return new Uint8Array;let r=[],i=0,a=t,o=n;for(;o>0;){let t=Math.min(g().nativeEmulator.cstringReadChunkBytes,o),n=ue(e,a,t);if(n.length===0)break;let s=n.indexOf(0),c=s>=0?n.subarray(0,s):n;if(c.length>0&&(r.push(c),i+=c.length),s>=0)break;a+=n.length,o-=n.length}return de(r,i)}function y(e,t,n=g().nativeEmulator.cstringDefaultLimitBytes){return re.decode(v(e,t,n))}function b(e){return ie.encode(e).length}function x(e,t,n,r){let i=ie.encode(n);if(r!==void 0&&r<=0)return i.length;let a=r===void 0?i:i.subarray(0,Math.max(0,r-1)),o=new Uint8Array(a.length+1);return o.set(a,0),e.write(t,o),i.length}function S(e,t,n){let r=y(e,t),i=``,a=n;for(let t=0;t<r.length;t++){let n=r[t]??``;if(n!==`%`){i+=n;continue}let o=se(r,t+1);if(!o){i+=n;continue}if(t=o.endIndex,o.specifier===`%`){i+=`%`;continue}a+=o.consumedWidthArgs,i+=ce(e,o,e.x(a++))}return i}function se(e,t){let n=t,r=0;for(;ae.has(e[n]??``);)n++;if(e[n]===`*`)r++,n++;else for(;le(e[n]);)n++;let i;if(e[n]===`.`)if(n++,e[n]===`*`)r++,n++;else{let t=n;for(;le(e[n]);)n++;i=n>t?Number.parseInt(e.slice(t,n),10):0}for(;oe.has(e[n]??``);)n++;let a=e[n];return a?{specifier:a,precision:i,consumedWidthArgs:r,endIndex:n}:null}function ce(e,t,n){switch(t.specifier){case`s`:{let r=n===0n?`(null)`:y(e,Number(n));return t.precision===void 0?r:r.slice(0,t.precision)}case`d`:case`i`:return BigInt.asIntN(64,n).toString(10);case`u`:return BigInt.asUintN(64,n).toString(10);case`x`:return BigInt.asUintN(64,n).toString(16);case`X`:return BigInt.asUintN(64,n).toString(16).toUpperCase();case`p`:return n===0n?`(nil)`:`0x${BigInt.asUintN(64,n).toString(16)}`;case`c`:return String.fromCharCode(Number(n&255n));case`o`:return BigInt.asUintN(64,n).toString(8);default:return`%${t.specifier}`}}function le(e){return e!==void 0&&e>=`0`&&e<=`9`}function ue(e,t,n){let r=n;for(;;)try{return e.read(t,r)}catch(e){if(r<=1)throw e;r=Math.max(1,r>>>1)}}function de(e,t){if(e.length===0)return new Uint8Array;if(e.length===1)return e[0];let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}const C={GetVersion:4,FindClass:6,GetObjectClass:31,IsInstanceOf:32,GetMethodID:33,CallObjectMethod:34,CallBooleanMethod:37,CallIntMethod:49,CallLongMethod:51,CallVoidMethod:61,GetFieldID:94,GetObjectField:95,GetBooleanField:96,GetIntField:100,GetLongField:101,SetObjectField:104,SetBooleanField:105,SetIntField:109,SetLongField:110,GetStaticMethodID:113,CallStaticObjectMethod:114,CallStaticBooleanMethod:117,CallStaticIntMethod:119,CallStaticLongMethod:121,CallStaticVoidMethod:143,GetStaticFieldID:144,GetStaticObjectField:145,GetStaticBooleanField:146,GetStaticIntField:150,GetStaticLongField:151,SetStaticObjectField:154,SetStaticIntField:159,NewStringUTF:167,GetStringUTFLength:168,GetStringUTFChars:169,ReleaseStringUTFChars:170,GetArrayLength:171,NewObjectArray:172,GetObjectArrayElement:173,SetObjectArrayElement:174,NewByteArray:176,GetByteArrayElements:184,ReleaseByteArrayElements:187,GetByteArrayRegion:208,SetByteArrayRegion:209,RegisterNatives:215,GetJavaVM:219,Throw:13,ThrowNew:14,ExceptionOccurred:15,ExceptionClear:17,ExceptionCheck:228,NewGlobalRef:21,DeleteGlobalRef:22,DeleteLocalRef:23,NewLocalRef:25,IsSameObject:24},fe={DestroyJavaVM:3,AttachCurrentThread:4,DetachCurrentThread:5,GetEnv:6,AttachCurrentThreadAsDaemon:7},w=1610612736,T=1610612992,pe=1611661312,E=1610743808,D=1610744064,me=1611792384,he=1879048192;var ge=class{engine;stubBump=pe;vmStubBump=me;handleBump=he;handles=new Map;classes=new Map;classByHandle=new Map;natives=new Map;arrayElements=new Map;javaMethods=new Map;javaFields=new Map;pendingException=0;constructor(e){this.engine=e,this.installEnvTable(),this.installVmTable()}envPointer(){return w}javaVmPointer(){return E}defineClass(e){let t=this.classes.get(e);if(t!==void 0)return t;let n=this.allocHandle({kind:`class`,name:e});return this.classes.set(e,n),this.classByHandle.set(n,{name:e,methods:new Map,fields:new Map}),n}classNameOf(e){return this.classByHandle.get(e)?.name}registerJavaMethod(e,t,n,r){let i=this.classByHandle.get(this.defineClass(e));if(!i)return;let a=`${t}#${n}`,o=i.methods.get(a);o===void 0&&(o=this.allocHandle({kind:`method`,name:t,sig:n,cls:e}),i.methods.set(a,o)),this.javaMethods.set(o,{className:e,name:t,sig:n,impl:r})}registerJavaField(e,t,n,r){let i=this.classByHandle.get(this.defineClass(e));if(!i)return;let a=`${t}#${n}`,o=i.fields.get(a);o===void 0&&(o=this.allocHandle({kind:`field`,name:t,sig:n,cls:e}),i.fields.set(a,o)),this.javaFields.set(o,{className:e,name:t,sig:n,value:r})}nativeBinding(e,t,n){return this.natives.get(`${e}#${t}#${n}`)}valueOf(e){return this.handles.get(e)}allocHandle(e){let t=this.handleBump;return this.handleBump+=8,this.handles.set(t,e),t}dispose(){this.handles.clear(),this.handleBump=he,this.classes.clear(),this.classByHandle.clear(),this.natives.clear(),this.arrayElements.clear(),this.javaMethods.clear(),this.javaFields.clear(),this.stubBump=pe,this.vmStubBump=me,this.pendingException=0}installEnvTable(){this.engine.mapMemory(w,8),this.engine.mapMemory(T,1856),this.writePointer(w,T),this.bind(C.GetVersion,()=>BigInt(65542)),this.bind(C.FindClass,e=>this.jniFindClass(e)),this.bind(C.GetMethodID,e=>this.jniGetMethodID(e)),this.bind(C.RegisterNatives,e=>this.jniRegisterNatives(e)),this.bind(C.NewStringUTF,e=>this.jniNewStringUTF(e)),this.bind(C.GetStringUTFChars,e=>this.jniGetStringUTFChars(e)),this.bind(C.ReleaseStringUTFChars,()=>void 0),this.bind(C.NewByteArray,e=>this.jniNewByteArray(e)),this.bind(C.GetArrayLength,e=>this.jniGetArrayLength(e)),this.bind(C.GetByteArrayElements,e=>this.jniGetByteArrayElements(e)),this.bind(C.ReleaseByteArrayElements,e=>this.jniReleaseByteArrayElements(e)),this.bind(C.SetByteArrayRegion,e=>this.jniSetByteArrayRegion(e)),this.bind(C.GetByteArrayRegion,e=>this.jniGetByteArrayRegion(e)),this.bind(C.GetJavaVM,e=>this.jniGetJavaVM(e)),this.bind(C.GetStaticMethodID,e=>this.jniGetMethodID(e)),this.bind(C.CallObjectMethod,e=>this.jniCallMethod(e)),this.bind(C.CallBooleanMethod,e=>this.jniCallMethod(e)),this.bind(C.CallIntMethod,e=>this.jniCallMethod(e)),this.bind(C.CallVoidMethod,e=>this.jniCallMethod(e)),this.bind(C.CallStaticObjectMethod,e=>this.jniCallMethod(e)),this.bind(C.CallStaticIntMethod,e=>this.jniCallMethod(e)),this.bind(C.CallLongMethod,e=>this.jniCallMethod(e)),this.bind(C.CallStaticBooleanMethod,e=>this.jniCallMethod(e)),this.bind(C.CallStaticLongMethod,e=>this.jniCallMethod(e)),this.bind(C.CallStaticVoidMethod,e=>this.jniCallMethod(e)),this.bind(C.GetFieldID,e=>this.jniGetFieldID(e)),this.bind(C.GetStaticFieldID,e=>this.jniGetFieldID(e)),this.bind(C.GetObjectField,e=>this.jniGetField(e)),this.bind(C.GetBooleanField,e=>this.jniGetField(e)),this.bind(C.GetIntField,e=>this.jniGetField(e)),this.bind(C.GetLongField,e=>this.jniGetField(e)),this.bind(C.GetStaticObjectField,e=>this.jniGetStaticField(e)),this.bind(C.GetStaticBooleanField,e=>this.jniGetStaticField(e)),this.bind(C.GetStaticIntField,e=>this.jniGetStaticField(e)),this.bind(C.GetStaticLongField,e=>this.jniGetStaticField(e)),this.bind(C.SetObjectField,()=>void 0),this.bind(C.SetBooleanField,()=>void 0),this.bind(C.SetIntField,()=>void 0),this.bind(C.SetLongField,()=>void 0),this.bind(C.SetStaticObjectField,()=>void 0),this.bind(C.SetStaticIntField,()=>void 0),this.bind(C.GetStringUTFLength,e=>this.jniGetStringUTFLength(e)),this.bind(C.GetObjectClass,e=>this.jniGetObjectClass(e)),this.bind(C.NewObjectArray,e=>this.jniNewObjectArray(e)),this.bind(C.GetObjectArrayElement,e=>this.jniGetObjectArrayElement(e)),this.bind(C.SetObjectArrayElement,e=>this.jniSetObjectArrayElement(e)),this.bind(C.Throw,e=>(this.pendingException=Number(e.x(1)),0n)),this.bind(C.ThrowNew,e=>(this.pendingException=this.allocHandle({kind:`throwable`,cls:Number(e.x(1))}),0n)),this.bind(C.ExceptionOccurred,()=>BigInt(this.pendingException)),this.bind(C.ExceptionCheck,()=>this.pendingException===0?0n:1n),this.bind(C.ExceptionClear,()=>{this.pendingException=0}),this.bind(C.NewGlobalRef,e=>e.x(1)),this.bind(C.NewLocalRef,e=>e.x(1)),this.bind(C.DeleteGlobalRef,()=>void 0),this.bind(C.DeleteLocalRef,()=>void 0),this.bind(C.IsSameObject,e=>e.x(1)===e.x(2)?1n:0n),this.bind(C.IsInstanceOf,()=>1n)}installVmTable(){this.engine.mapMemory(E,8),this.engine.mapMemory(D,128),this.writePointer(E,D),this.bindVm(fe.GetEnv,e=>{let t=Number(e.x(1));return this.writePointer(t,w),0n})}bind(e,t){let n=this.stubBump;this.stubBump+=8,this.engine.registerHostFunction(n,t),this.writePointer(T+e*8,n)}bindVm(e,t){let n=this.vmStubBump;this.vmStubBump+=8,this.engine.registerHostFunction(n,t),this.writePointer(D+e*8,n)}jniFindClass(e){let t=this.readCString(e,Number(e.x(1)));return BigInt(this.defineClass(t))}jniGetMethodID(e){let t=this.classByHandle.get(Number(e.x(1))),n=this.readCString(e,Number(e.x(2))),r=this.readCString(e,Number(e.x(3))),i=`${n}#${r}`;if(t){let e=t.methods.get(i);if(e!==void 0)return BigInt(e);let a=this.allocHandle({kind:`method`,name:n,sig:r,cls:t.name});return t.methods.set(i,a),BigInt(a)}return BigInt(this.allocHandle({kind:`method`,name:n,sig:r}))}jniRegisterNatives(e){let t=this.classByHandle.get(Number(e.x(1))),n=Number(e.x(2)),r=Number(e.x(3));for(let i=0;i<r;i++){let r=n+i*24,a=this.readPointer(e,r),o=this.readPointer(e,r+8),s=this.readPointer(e,r+16),c=this.readCString(e,a),l=this.readCString(e,o),u=t?.name??``;this.natives.set(`${u}#${c}#${l}`,{name:c,signature:l,fnAddr:s})}return 0n}jniNewStringUTF(e){let t=this.readCString(e,Number(e.x(1)));return BigInt(this.allocHandle({kind:`string`,value:t}))}jniGetStringUTFChars(e){let t=this.handles.get(Number(e.x(1))),n=_e(t)?t.value:``,r=new TextEncoder().encode(n+`\0`),i=this.allocGuestBuffer(r);return BigInt(i)}jniNewByteArray(e){let t=Number(e.x(1));return BigInt(this.allocHandle({kind:`bytes`,value:new Uint8Array(t)}))}jniGetArrayLength(e){let t=this.handles.get(Number(e.x(1)));return O(t)||k(t)?BigInt(t.value.length):0n}jniGetByteArrayElements(e){let t=Number(e.x(1)),n=this.handles.get(t),r=O(n)?n.value:new Uint8Array,i=this.allocGuestBuffer(r);return this.arrayElements.set(i,{handle:t,length:r.length}),BigInt(i)}jniReleaseByteArrayElements(e){let t=Number(e.x(2)),n=Number(e.x(3)),r=this.arrayElements.get(t);if(!r)return;let i=this.handles.get(r.handle);n!==2&&O(i)&&i.value.set(e.read(t,r.length)),n!==1&&this.arrayElements.delete(t)}jniSetByteArrayRegion(e){let t=this.handles.get(Number(e.x(1)));if(!O(t))return;let n=Number(e.x(2)),r=Number(e.x(3)),i=Number(e.x(4)),a=e.read(i,r);t.value.set(a.subarray(0,r),n)}jniGetByteArrayRegion(e){let t=this.handles.get(Number(e.x(1)));if(!O(t))return;let n=Number(e.x(2)),r=Number(e.x(3)),i=Number(e.x(4));e.write(i,t.value.subarray(n,n+r))}jniGetJavaVM(e){let t=Number(e.x(1));return this.writePointer(t,E),0n}jniCallMethod(e){let t=Number(e.x(1)),n=Number(e.x(2)),r=this.javaMethods.get(n);if(!r)return 0n;let i=[e.x(3),e.x(4),e.x(5),e.x(6),e.x(7)],a=r.impl({args:i,self:t,jni:this});return a===void 0?0n:BigInt.asUintN(64,BigInt(a))}jniGetFieldID(e){let t=this.classByHandle.get(Number(e.x(1))),n=this.readCString(e,Number(e.x(2))),r=this.readCString(e,Number(e.x(3))),i=`${n}#${r}`;if(t){let e=t.fields.get(i);if(e!==void 0)return BigInt(e);let a=this.allocHandle({kind:`field`,name:n,sig:r,cls:t.name});return t.fields.set(i,a),BigInt(a)}return BigInt(this.allocHandle({kind:`field`,name:n,sig:r}))}jniGetField(e){let t=this.javaFields.get(Number(e.x(2)));return t?t.value:0n}jniGetStaticField(e){let t=this.javaFields.get(Number(e.x(2)));return t?t.value:0n}jniGetStringUTFLength(e){let t=this.handles.get(Number(e.x(1))),n=_e(t)?t.value:``;return BigInt(new TextEncoder().encode(n).length)}jniGetObjectClass(e){let t=this.handles.get(Number(e.x(1)));if(t&&typeof t==`object`&&`cls`in t){let e=t.cls;if(typeof e==`string`)return BigInt(this.defineClass(e))}return BigInt(this.defineClass(`java/lang/Object`))}jniNewObjectArray(e){let t=Number(e.x(1)),n=e.x(3),r=Array.from({length:t}).fill(n);return BigInt(this.allocHandle({kind:`objarray`,value:r}))}jniGetObjectArrayElement(e){let t=this.handles.get(Number(e.x(1))),n=Number(e.x(2));return k(t)?t.value[n]??0n:0n}jniSetObjectArrayElement(e){let t=this.handles.get(Number(e.x(1))),n=Number(e.x(2));k(t)&&(t.value[n]=e.x(3))}allocGuestBuffer(e){let t=this.handleBump;return this.handleBump+=Math.max(8,e.length+8),this.engine.mapMemory(t,Math.max(8,e.length+8)),e.length>0&&this.engine.writeCode(t,e),t}writePointer(e,t){let n=new Uint8Array(8),r=BigInt(t);for(let e=0;e<8;e++)n[e]=Number(r&255n),r>>=8n;this.engine.writeCode(e,n)}readPointer(e,t){let n=e.read(t,8),r=0;for(let e=0;e<8;e++)r+=n[e]*2**(e*8);return r}readCString(e,t){return y(e,t)}};function _e(e){return typeof e==`object`&&!!e&&e.kind===`string`}function O(e){return typeof e==`object`&&!!e&&e.kind===`bytes`}function k(e){return typeof e==`object`&&!!e&&e.kind===`objarray`}const ve=1048576,ye=g().nativeEmulator.guestPageSizeBytes,be=new Set([30,47]),xe=new Set([84]);function Se(e,t={}){let n=new Map,r=ve,i=new Map,a=t=>{let n=Math.max(16,t+16-1&-16),a=r;return e.mapMemory(a,n),r+=n,i.set(a,t),a},o=new Map,s=t.files,c=new Map,l=``,u=e=>{if(l.length===0)return 0n;let t=a(b(l)+1);x(e,t,l);let n=BigInt(t);return l=``,n};n.set(`strlen`,e=>BigInt(v(e,Number(e.x(0))).length)),n.set(`memcpy`,e=>{let t=Number(e.x(0));return e.write(t,e.read(Number(e.x(1)),Number(e.x(2)))),e.x(0)}),n.set(`memmove`,e=>{let t=Number(e.x(0)),n=Uint8Array.from(e.read(Number(e.x(1)),Number(e.x(2))));return e.write(t,n),e.x(0)}),n.set(`memset`,e=>{let t=Number(e.x(0)),n=Number(e.x(1)&255n),r=Number(e.x(2));return e.write(t,new Uint8Array(r).fill(n)),e.x(0)}),n.set(`memcmp`,e=>{let t=e.read(Number(e.x(0)),Number(e.x(2))),n=e.read(Number(e.x(1)),Number(e.x(2)));for(let e=0;e<t.length;e++){let r=(t[e]??0)-(n[e]??0);if(r!==0)return BigInt(r<0?-1:1)}return 0n}),n.set(`strcmp`,e=>{let t=v(e,Number(e.x(0))),n=v(e,Number(e.x(1)));return BigInt(Ee(t,n,Math.max(t.length,n.length)+1))}),n.set(`strncmp`,e=>{let t=Number(e.x(2));if(t<=0)return 0n;let n=v(e,Number(e.x(0)),t),r=v(e,Number(e.x(1)),t);return BigInt(Ee(n,r,t))}),n.set(`strcpy`,e=>{let t=Number(e.x(0)),n=v(e,Number(e.x(1))),r=new Uint8Array(n.length+1);return r.set(n),e.write(t,r),e.x(0)}),n.set(`strncpy`,e=>{let t=Number(e.x(0)),n=Number(e.x(1)),r=Number(e.x(2));if(r>0){let i=v(e,n,r),a=new Uint8Array(r);a.set(i.subarray(0,r)),e.write(t,a)}return e.x(0)}),n.set(`strchr`,e=>{let t=Number(e.x(0)),n=Number(e.x(1)&255n),r=v(e,t);if(n===0)return BigInt(t+r.length);let i=r.indexOf(n);return i>=0?BigInt(t+i):0n}),n.set(`strrchr`,e=>{let t=Number(e.x(0)),n=Number(e.x(1)&255n),r=v(e,t);if(n===0)return BigInt(t+r.length);let i=r.lastIndexOf(n);return i>=0?BigInt(t+i):0n}),n.set(`strdup`,e=>{let t=v(e,Number(e.x(0))),n=a(t.length+1),r=new Uint8Array(t.length+1);return r.set(t),e.write(n,r),BigInt(n)}),n.set(`malloc`,e=>BigInt(a(Number(e.x(0))))),n.set(`calloc`,e=>{let t=Number(e.x(0))*Number(e.x(1)),n=a(t);return e.write(n,new Uint8Array(t)),BigInt(n)}),n.set(`realloc`,e=>{let t=Number(e.x(0)),n=Number(e.x(1));if(t===0)return BigInt(a(n));let r=a(n),o=i.get(t)??0;return o>0&&e.write(r,e.read(t,Math.min(o,n))),BigInt(r)}),n.set(`free`,()=>void 0),n.set(`__stack_chk_fail`,()=>{throw Error(`bionic: __stack_chk_fail (stack canary corrupted in emulated code)`)}),n.set(`abort`,()=>{throw Error(`bionic: abort() called by emulated code`)}),n.set(`fopen`,e=>{let t=y(e,Number(e.x(0))),n=s?.get(t);if(!n)return 0n;let r=a(1);return o.set(r,{bytes:n,pos:0}),BigInt(r)}),n.set(`fclose`,e=>(o.delete(Number(e.x(0))),0n)),n.set(`fread`,e=>{let t=Number(e.x(0)),n=Number(e.x(1)),r=Number(e.x(2)),i=o.get(Number(e.x(3)));if(!i||n===0)return 0n;let a=n*r,s=i.bytes.subarray(i.pos,i.pos+a);return s.length>0&&e.write(t,s),i.pos+=s.length,BigInt(Math.floor(s.length/n))}),n.set(`fgets`,e=>{let t=Number(e.x(0)),n=Number(e.x(1)),r=o.get(Number(e.x(2)));if(!r||n<=0||r.pos>=r.bytes.length)return 0n;let i=[];for(;i.length<n-1&&r.pos<r.bytes.length;){let e=r.bytes[r.pos++]??0;if(i.push(e),e===10)break}return i.push(0),e.write(t,Uint8Array.from(i)),BigInt(t)}),n.set(`feof`,e=>{let t=o.get(Number(e.x(0)));return t&&t.pos>=t.bytes.length?1n:0n}),n.set(`__android_log_print`,e=>{let n=Number(e.x(0)),r=y(e,Number(e.x(1))),i=S(e,Number(e.x(2)),3);return t.onLog?.(n,r,i),1n}),n.set(`__cxa_atexit`,()=>0n),n.set(`__cxa_finalize`,()=>void 0),n.set(`getpagesize`,()=>BigInt(ye)),n.set(`sysconf`,e=>{let t=Number(e.x(0));return be.has(t)?BigInt(ye):xe.has(t)?1n:BigInt(-1)}),n.set(`mprotect`,()=>0n),n.set(`munmap`,()=>0n),n.set(`prctl`,()=>0n),n.set(`getpid`,()=>10000n),n.set(`getuid`,()=>10000n),n.set(`sleep`,()=>0n),n.set(`usleep`,()=>0n),n.set(`time`,e=>{let t=Number(e.x(0)),n=Math.floor(Date.now()/1e3);if(t!==0){let r=new Uint8Array(8),i=BigInt(n);for(let e=0;e<8;e++)r[e]=Number(i&255n),i>>=8n;e.write(t,r)}return BigInt(n)}),n.set(`gettimeofday`,e=>{let t=Number(e.x(0));if(t!==0){let n=Date.now(),r=Math.floor(n/1e3),i=n%1e3*1e3,a=new Uint8Array(16),o=BigInt(r);for(let e=0;e<8;e++)a[e]=Number(o&255n),o>>=8n;o=BigInt(i);for(let e=8;e<16;e++)a[e]=Number(o&255n),o>>=8n;e.write(t,a)}return 0n}),n.set(`getenv`,()=>0n),n.set(`memchr`,e=>{let t=Number(e.x(0)),n=Number(e.x(1))&255,r=Number(e.x(2)),i=e.read(t,r);for(let e=0;e<i.length;e++)if(i[e]===n)return BigInt(t+e);return 0n}),n.set(`dlopen`,e=>{let t=Number(e.x(0)),n=t===0?`<self>`:y(e,t),r=n.length>0?n:`<self>`,i=c.get(r);return i===void 0&&(i=a(1),c.set(r,i)),l=``,BigInt(i)}),n.set(`dlsym`,t=>{let r=y(t,Number(t.x(1)));if(!r)return l=`dlsym: empty symbol`,0n;let i=e.lookupSymbol?.(r);if(i!==void 0)return l=``,BigInt(i);let a=n.get(r),o=a?e.bindImportStub?.(r,a):void 0;return o===void 0?(l=`dlsym: symbol not found: ${r}`,0n):(l=``,BigInt(o))}),n.set(`dlerror`,e=>u(e)),n.set(`puts`,e=>{let n=`${y(e,Number(e.x(0)))}\n`;return t.onStdout?.(n),BigInt(b(n))}),n.set(`printf`,e=>{let n=S(e,Number(e.x(0)),1);return t.onStdout?.(n),BigInt(b(n))}),n.set(`fprintf`,e=>{let n=S(e,Number(e.x(1)),2);return Number(e.x(0))===2?t.onStderr?.(n):t.onStdout?.(n),BigInt(b(n))}),n.set(`sprintf`,e=>{let t=S(e,Number(e.x(1)),2);return BigInt(x(e,Number(e.x(0)),t))}),n.set(`snprintf`,e=>{let t=S(e,Number(e.x(2)),3);return BigInt(x(e,Number(e.x(0)),t,Number(e.x(1))))}),n.set(`putchar`,e=>e.x(0)&255n),n.set(`getchar`,()=>BigInt(-1)),n.set(`exp`,e=>BigInt(Math.floor(Math.exp(Number(e.x(0)))))),n.set(`pow`,e=>BigInt(Math.floor(Number(e.x(0))**+Number(e.x(1))))),n.set(`fmod`,e=>BigInt(Math.floor(Number(e.x(0))%Number(e.x(1))))),n.set(`sqrt`,e=>BigInt(Math.floor(Math.sqrt(Number(e.x(0)))))),n.set(`log`,e=>BigInt(Math.floor(Math.log(Number(e.x(0)))))),n.set(`log10`,e=>BigInt(Math.floor(Math.log10(Number(e.x(0)))))),n.set(`log2`,e=>BigInt(Math.floor(Math.log2(Number(e.x(0)))))),n.set(`sin`,e=>BigInt(Math.floor(Math.sin(Number(e.x(0)))))),n.set(`cos`,e=>BigInt(Math.floor(Math.cos(Number(e.x(0)))))),n.set(`tan`,e=>BigInt(Math.floor(Math.tan(Number(e.x(0)))))),n.set(`asin`,e=>BigInt(Math.floor(Math.asin(Number(e.x(0)))))),n.set(`acos`,e=>BigInt(Math.floor(Math.acos(Number(e.x(0)))))),n.set(`atan`,e=>BigInt(Math.floor(Math.atan(Number(e.x(0)))))),n.set(`atan2`,e=>BigInt(Math.floor(Math.atan2(Number(e.x(0)),Number(e.x(1)))))),n.set(`sinh`,e=>BigInt(Math.floor(Math.sinh(Number(e.x(0)))))),n.set(`cosh`,e=>BigInt(Math.floor(Math.cosh(Number(e.x(0)))))),n.set(`tanh`,e=>BigInt(Math.floor(Math.tanh(Number(e.x(0)))))),n.set(`asinh`,e=>BigInt(Math.floor(Math.asinh(Number(e.x(0)))))),n.set(`acosh`,e=>BigInt(Math.floor(Math.acosh(Number(e.x(0)))))),n.set(`atanh`,e=>BigInt(Math.floor(Math.atanh(Number(e.x(0)))))),n.set(`trunc`,e=>BigInt(Math.trunc(Number(e.x(0))))),n.set(`pthread_mutexattr_init`,()=>0n),n.set(`pthread_mutexattr_settype`,()=>0n),n.set(`pthread_mutexattr_destroy`,()=>0n),n.set(`pthread_mutex_init`,()=>0n),n.set(`pthread_mutex_destroy`,()=>0n),n.set(`pthread_mutex_lock`,()=>0n),n.set(`pthread_mutex_trylock`,()=>0n),n.set(`pthread_mutex_unlock`,()=>0n),n.set(`pthread_create`,()=>BigInt(-1)),n.set(`pthread_join`,()=>BigInt(-1)),n.set(`strcspn`,e=>{let t=v(e,Number(e.x(0))),n=v(e,Number(e.x(1))),r=new Set(n);for(let e=0;e<t.length;e++)if(r.has(t[e]))return BigInt(e);return BigInt(t.length)}),n.set(`strspn`,e=>{let t=v(e,Number(e.x(0))),n=v(e,Number(e.x(1))),r=new Set(n);for(let e=0;e<t.length;e++)if(!r.has(t[e]))return BigInt(e);return BigInt(t.length)}),n.set(`open`,()=>BigInt(-1)),n.set(`close`,()=>0n),n.set(`read`,()=>0n),n.set(`write`,e=>BigInt(Number(e.x(2)))),n.set(`fstat`,e=>{let t=Number(e.x(1));return t!==0&&e.write(t,new Uint8Array(128)),0n}),n.set(`mmap`,e=>{let t=Number(e.x(1)),n=a(Math.max(16,Math.ceil(t/16)*16));return BigInt(n)}),n.set(`access`,()=>BigInt(-1)),n.set(`stat`,()=>BigInt(-1)),n.set(`lstat`,()=>BigInt(-1)),n.set(`fcntl`,()=>BigInt(-1)),n.set(`pread`,()=>BigInt(-1)),n.set(`pwrite`,()=>BigInt(-1)),n.set(`ftruncate`,()=>BigInt(-1)),n.set(`fsync`,()=>0n),n.set(`fchmod`,()=>BigInt(-1)),n.set(`fchown`,()=>BigInt(-1)),n.set(`unlink`,()=>BigInt(-1)),n.set(`mkdir`,()=>BigInt(-1)),n.set(`rmdir`,()=>BigInt(-1)),n.set(`readlink`,()=>BigInt(-1)),n.set(`utimes`,()=>BigInt(-1)),n.set(`getcwd`,e=>{let t=Number(e.x(0)),n=Number(e.x(1));return t!==0&&n>0?(x(e,t,`/`,n),BigInt(t)):0n}),n.set(`nanosleep`,()=>0n),n.set(`localtime`,()=>0n);let d;return n.set(`__errno`,()=>(d===void 0&&(d=a(4)),BigInt(d))),n.set(`dlclose`,()=>0n),n.set(`geteuid`,()=>10000n),n.set(`mremap`,()=>BigInt(-1)),n}const Ce=new Set(Se({mapMemory:()=>void 0}).keys());function we(e){return Ce.has(e)}function Te(e,t){if(t.strlen!==void 0&&e.registerHostFunction(t.strlen,e=>BigInt(v(e,Number(e.x(0))).length)),t.memcpy!==void 0&&e.registerHostFunction(t.memcpy,e=>{let t=Number(e.x(0)),n=Number(e.x(1)),r=Number(e.x(2));return e.write(t,e.read(n,r)),e.x(0)}),t.memset!==void 0&&e.registerHostFunction(t.memset,e=>{let t=Number(e.x(0)),n=Number(e.x(1)&255n),r=Number(e.x(2));return e.write(t,new Uint8Array(r).fill(n)),e.x(0)}),t.malloc!==void 0){let n=ve;e.registerHostFunction(t.malloc,t=>{let r=Number(t.x(0)),i=Math.max(16,r+16-1&-16),a=n;return e.mapMemory(a,i),n+=i,BigInt(a)})}t.free!==void 0&&e.registerHostFunction(t.free,()=>void 0)}function Ee(e,t,n){for(let r=0;r<n;r++){let n=r<e.length?e[r]:0,i=r<t.length?t[r]:0;if(n!==i)return n<i?-1:1;if(n===0)return 0}return 0}const A=g().nativeEmulator.guestPageSizeBytes;function De(e,t={}){let n=t.pid??1e4;e.registerSyscall(172,()=>BigInt(n)),e.registerSyscall(178,()=>BigInt(t.tid??n)),e.registerSyscall(113,e=>(je(e,Number(e.x(1)),Ae(t)),0n)),e.registerSyscall(169,e=>{let n=Number(e.x(0));return n!==0&&Me(e,n,Ae(t)),0n}),e.registerSyscall(64,e=>{let n=Number(e.x(0)),r=Number(e.x(1)),i=Number(e.x(2)),a=e.read(r,i);return t.onWrite?.(n,a),BigInt(i)}),e.registerSyscall(63,e=>{let n=Number(e.x(0)),r=Number(e.x(1)),i=Number(e.x(2)),a=t.onRead?.(n,i)??new Uint8Array,o=Math.min(a.length,i);return o>0&&e.write(r,a.subarray(0,o)),BigInt(o)}),e.registerSyscall(57,()=>0n);let r=1342177280;e.registerSyscall(222,t=>{let n=Number(t.x(1)),i=Math.max(A,Math.ceil(n/A)*A),a=r;return e.mapMemory(a,i),r+=i,BigInt(a)}),e.registerSyscall(215,()=>0n),e.registerSyscall(226,()=>0n),e.registerSyscall(29,()=>0n),e.registerSyscall(98,()=>0n),e.registerSyscall(135,()=>0n),e.registerSyscall(96,()=>BigInt(t.tid??n)),e.registerSyscall(278,e=>{let n=Number(e.x(0)),r=Number(e.x(1)),i=t.onGetrandom?.(r)??Oe(r),a=Math.min(i.length,r);return a>0&&e.write(n,i.subarray(0,a)),BigInt(a)});let i=3;e.registerSyscall(56,e=>{let n=ke(e,Number(e.x(1))),r=Number(e.x(2)),a=t.onOpen?.(n,r);return BigInt(a===void 0?-2:a>=0?a:i++)}),e.registerSyscall(62,e=>{let t=Number(e.x(1)),n=Number(e.x(2));return BigInt(n===0?t:0)}),e.registerSyscall(80,e=>{let t=Number(e.x(1));return t!==0&&e.write(t,new Uint8Array(128)),0n}),e.registerSyscall(93,()=>{e.requestStop()}),e.registerSyscall(94,()=>{e.requestStop()})}function Oe(e){let t=new Uint8Array(Math.max(0,e)),n=625341585;for(let e=0;e<t.length;e++)n=Math.imul(n,1103515245)+12345>>>0,t[e]=n>>>16&255;return t}function ke(e,t,n=g().nativeEmulator.syscallCStringLimitBytes){return y(e,t,n)}function Ae(e){return e.clockSeconds??Math.floor(Date.now()/1e3)}function j(e,t,n){let r=new Uint8Array(8),i=BigInt(n);for(let e=0;e<8;e++)r[e]=Number(i&255n),i>>=8n;e.write(t,r)}function je(e,t,n){j(e,t,n),j(e,t+8,0)}function Me(e,t,n){j(e,t,n),j(e,t+8,0)}var Ne=class e{engine;jni;bionic;nextAllocAddr=1073741824;static HEAP_CEIL=1610612736;disposed=!1;constructor(e={}){this.engine=new o,this.jni=new ge(this.engine),this.bionic=Se(this.engine,e.bionic??{}),e.syscalls!==!1&&De(this.engine,e.syscalls??{})}isAvailable(){return this.engine.isAvailable()}loadLibrary(e){this.checkNotDisposed();let{entry:t}=this.engine.loadElf(e,this.bionic);return{entry:t,unresolvedImports:[...this.engine.unresolvedImports()],constructorFaults:[...this.engine.constructorFaultLog()]}}loadLibraryChain(e,t){return this.engine.loadLibraryChain(e,t,this.bionic)}installLibc(e){Te(this.engine,e)}call(e,t=[]){return this.checkNotDisposed(),this.engine.callSymbol(e,t)}callJniExport(e,t=[],n=0){return this.engine.callSymbol(e,[this.jni.envPointer(),n,...t])}setupJava(e,t,n,r){this.jni.registerJavaMethod(e,t,n,r)}setupJavaField(e,t,n,r){this.jni.registerJavaField(e,t,n,r)}newByteArray(e){return this.jni.allocHandle({kind:`bytes`,value:e})}bytesOf(e){let t=this.jni.valueOf(e);return Pe(t)?t.value:void 0}stringOf(e){let t=this.jni.valueOf(e);return Fe(t)?t.value:void 0}allocGuestMemory(t,n){this.checkNotDisposed();let r=g().nativeEmulator.guestPageSizeBytes,i=Math.ceil(t/r)*r;if(this.nextAllocAddr+i>e.HEAP_CEIL)throw Error(`Guest heap exhausted: cannot allocate ${i} bytes (nextAddr=0x${this.nextAllocAddr.toString(16)}, ceil=0x${e.HEAP_CEIL.toString(16)})`);let a=this.nextAllocAddr;return this.engine.mapMemory(a,i),n&&n.length>0&&this.engine.writeCode(a,n),this.nextAllocAddr+=i,a}readGuestMemory(e,t){return this.engine.readMemory(e,t)}writeGuestMemory(e,t){this.checkNotDisposed(),this.engine.writeCode(e,t)}dispose(){this.disposed||(this.disposed=!0,this.engine.dispose(),this.jni.dispose(),this.nextAllocAddr=1073741824)}checkNotDisposed(){if(this.disposed)throw Error(`NativeEmulator has been disposed; create a new instance or reuse an active session`)}};function Pe(e){return typeof e==`object`&&!!e&&`kind`in e&&e.kind===`bytes`}function Fe(e){return typeof e==`object`&&!!e&&`kind`in e&&e.kind===`string`}var Ie=class{sessions=new Map;idleTtlMs;sweepIntervalMs;maxSessions;emulatorOptions;sweepTimer=null;constructor(r={}){this.idleTtlMs=r.idleTtlMs??n,this.sweepIntervalMs=r.sweepIntervalMs??e,this.maxSessions=r.maxSessions??t,this.emulatorOptions=r.emulatorOptions??{},this.startSweep()}createSession(e={}){if(this.sessions.size>=this.maxSessions)throw Error(`Emulator session limit reached (${this.maxSessions}); destroy an existing session first`);let t=e.syscalls===void 0?this.emulatorOptions:{...this.emulatorOptions,syscalls:e.syscalls},n=Date.now(),r={id:ne(),emulator:new Ne(t),createdAt:n,lastUsedAt:n};return this.sessions.set(r.id,r),r}getSession(e){let t=this.sessions.get(e);return t&&(t.lastUsedAt=Date.now()),t}requireSession(e){let t=this.getSession(e);if(!t)throw Error(`Unknown emulator session: ${e}`);return t}destroySession(e){let t=this.sessions.get(e);return t?(t.emulator.dispose(),this.sessions.delete(e),!0):!1}listSessions(){let e=[];for(let t of this.sessions.values())e.push({id:t.id,createdAt:t.createdAt,lastUsedAt:t.lastUsedAt});return e}count(){return this.sessions.size}dispose(){this.sweepTimer&&=(clearInterval(this.sweepTimer),null);for(let e of this.sessions.values())e.emulator.dispose();this.sessions.clear()}startSweep(){this.sweepTimer=setInterval(()=>this.sweep(),this.sweepIntervalMs),this.sweepTimer.unref&&this.sweepTimer.unref()}sweep(){let e=Date.now();for(let[t,n]of this.sessions)e-n.lastUsedAt>=this.idleTtlMs&&(n.emulator.dispose(),this.sessions.delete(t))}};function Le(e,t={}){let n=new a(e),r=t.supportsSymbol??we,i=n.relocations().filter(Re).map(e=>Be(e,r)),o=i.filter(e=>e.resolution===`unresolved`).length;return{totalImports:i.length,supportedImports:i.length-o,unresolvedImports:o,imports:i}}function Re(e){return e.symbolName!==``&&ze(e.type)&&e.symbolValue===0}function ze(e){return e===1026||e===1025}function Be(e,t){let n=t(e.symbolName)?`bionic`:`unresolved`;return{symbol:e.symbolName,gotOffset:e.offset,relocationType:Ve(e.type),addend:e.addend,resolution:n}}function Ve(e){return e===1026?`R_AARCH64_JUMP_SLOT`:e===1025?`R_AARCH64_GLOB_DAT`:`R_AARCH64_${e}`}function He(e,t){let n=Ue(e,t);return n?`${n.mnemonic.padEnd(8)} ${n.operands}`:`<unknown> 0x${e.toString(16).padStart(8,`0`)}`}function Ue(e,t){if(e===3596551104)return{mnemonic:`ret`,operands:``};if(e===3573751839)return{mnemonic:`nop`,operands:``};if(M(e,2145452e3,704644064)){let t=e>>16&31,n=e&31,r=e>>31&1?`x`:`w`;return{mnemonic:`mov`,operands:`${r}${n}, ${r}${t}`}}return M(e,4293918720,3576692736)?st(e):M(e,4293918720,3574595584)?ct(e):M(e,520093696,268435456)?We(e,t):M(e,520093696,285212672)?Ge(e):M(e,528482304,301989888)?Ke(e):M(e,528482304,310378496)?Je(e):M(e,528482304,318767104)?Ye(e):M(e,2080374784,335544320)?Xe(e,t):M(e,4278190096,1409286144)?Ze(e,t):M(e,2113929216,872415232)?Qe(e,t):M(e,4294966303,3594452992)?{mnemonic:`blr`,operands:`x${e>>5&31}`}:M(e,4294966303,3592355840)?{mnemonic:`br`,operands:`x${e>>5&31}`}:M(e,989855744,402653184)?$e(e,t):M(e,989855744,956301312)?et(e):M(e,991955968,939525120)?tt(e):M(e,939524096,671088640)?nt(e):M(e,1056964608,134217728)?rt(e):M(e,522190848,167772160)?it(e):M(e,522190848,184549376)?at(e):M(e,534773760,444596224)?ot(e):M(e,522190848,236978176)?lt(e):null}function M(e,t,n){return(e&t)>>>0==n>>>0}function We(e,t){let n=e>>31&1,r=e>>29&3,i=e&31,a=e>>5&524287,o=BigInt(a)<<2n|BigInt(r),s=1n<<20n,c=(o^s)-s;return n?{mnemonic:`adrp`,operands:`x${i}, 0x${((t>>12n<<12n)+(c<<12n)).toString(16)}`}:{mnemonic:`adr`,operands:`x${i}, 0x${(t+c).toString(16)}`}}function Ge(e){let t=e>>31&1,n=e>>30&1,r=e>>29&1,i=e>>22&1,a=e>>10&4095,o=e>>5&31,s=e&31,c=t?`x`:`w`,l=i?a<<12:a;return{mnemonic:r?n?`subs`:`adds`:n?`sub`:`add`,operands:`${c}${s}, ${c}${o}, #${l}`}}function Ke(e){let t=e>>31&1,n=e>>29&3,r=e&31,i=e>>5&31,a=t?`x`:`w`,o=e>>16&63,s=e>>10&63,c=qe(e>>22&1,o,s,t);return{mnemonic:[`and`,`orr`,`eor`,`ands`][n]||`logical`,operands:`${a}${r}, ${a}${i}, #0x${c.toString(16)}`}}function qe(e,t,n,r){let i=r?e?6:32-Math.clz32(~n&63):e?0:32-Math.clz32(~n&63);if(i<1)return 0n;let a=(1<<i)-1,o=n&a,s=t&a,c=1<<i,l=BigInt((1<<o+1)-1);if(s>0){let e=BigInt(c),t=BigInt(s);l=(l>>t|l<<e-t)&(1n<<BigInt(c))-1n}let u=0n,d=BigInt(c),f=r?64n:32n;for(let e=0n;e<f;e+=d)u|=l<<e;return u}function Je(e){let t=e>>31&1,n=e>>29&3,r=e>>21&3,i=e>>5&65535,a=e&31,o=t?`x`:`w`,s=[`movn`,`reserved`,`movz`,`movk`],c=r*16;return n===2&&!c?{mnemonic:`mov`,operands:`${o}${a}, #0x${i.toString(16)}`}:{mnemonic:s[n]||`mov`,operands:c?`${o}${a}, #0x${i.toString(16)}, lsl #${c}`:`${o}${a}, #0x${i.toString(16)}`}}function Ye(e){let t=e>>31&1,n=e>>29&3,r=e>>16&63,i=e>>10&63,a=e>>5&31,o=e&31,s=t?`x`:`w`,c=t?64:32;if(n===2){if(i===c-1)return{mnemonic:`lsr`,operands:`${s}${o}, ${s}${a}, #${r}`};if(i+1===r)return{mnemonic:`ubfx`,operands:`${s}${o}, ${s}${a}, #${r}, #${i-r+1}`};if(r===0){if(i===7)return{mnemonic:`uxtb`,operands:`${s}${o}, ${s}${a}`};if(i===15)return{mnemonic:`uxth`,operands:`${s}${o}, ${s}${a}`}}return{mnemonic:`ubfm`,operands:`${s}${o}, ${s}${a}, #${r}, #${i}`}}if(n===0){if(i===c-1)return{mnemonic:`asr`,operands:`${s}${o}, ${s}${a}, #${r}`};if(r===0){if(i===7)return{mnemonic:`sxtb`,operands:`${s}${o}, ${s}${a}`};if(i===15)return{mnemonic:`sxth`,operands:`${s}${o}, ${s}${a}`};if(i===31&&t)return{mnemonic:`sxtw`,operands:`x${o}, w${a}`}}return{mnemonic:`sbfm`,operands:`${s}${o}, ${s}${a}, #${r}, #${i}`}}return{mnemonic:`bfm`,operands:`${s}${o}, ${s}${a}, #${r}, #${i}`}}function Xe(e,t){let n=e>>31&1,r=e&67108863,i=t+(BigInt(r<<6)>>4n);return{mnemonic:n?`bl`:`b`,operands:`0x${i.toString(16)}`}}function Ze(e,t){let n=e&15,r=e>>5&524287,i=t+(BigInt(r)<<45n>>43n);return{mnemonic:`b.${[`eq`,`ne`,`cs`,`cc`,`mi`,`pl`,`vs`,`vc`,`hi`,`ls`,`ge`,`lt`,`gt`,`le`,`al`,`nv`][n]}`,operands:`0x${i.toString(16)}`}}function Qe(e,t){let n=e>>31&1,r=e>>24&1,i=e>>5&524287,a=e&31,o=t+(BigInt(i)<<45n>>43n);return{mnemonic:r?`cbnz`:`cbz`,operands:`${n?`x`:`w`}${a}, 0x${o.toString(16)}`}}function $e(e,t){let n=e>>30&3,r=e>>26&1,i=e>>5&524287,a=e&31,o=t+(BigInt(i)<<45n>>43n);return r?{mnemonic:`ldr`,operands:`${[`b`,`h`,`s`,`d`][n]}${a}, 0x${o.toString(16)}`}:{mnemonic:`ldr`,operands:`${[`w`,`w`,`x`,`x`][n]}${a}, 0x${o.toString(16)}`}}function et(e){let t=e>>30&3,n=e>>26&1,r=e>>22&3,i=e>>10&4095,a=e>>5&31,o=e&31;if(n)return{mnemonic:`ldr/str`,operands:`<simd>`};let s=i<<t,c=r&1,l=t===3?`x`:`w`;return{mnemonic:c?`ldr`:`str`,operands:s?`${l}${o}, [x${a}, #${s}]`:`${l}${o}, [x${a}]`}}function tt(e){let t=e>>30&3,n=e>>22&3,r=e>>16&31,i=e>>13&7,a=e>>12&1,o=e>>5&31,s=e&31,c=n&1,l=t===3?`x`:`w`,u=[`uxtw`,`uxth`,`uxtb`,`sxtw`,`sxth`,`sxtb`,`lsl`][i]||`lsl`,d=a?`#${t}`:``;return{mnemonic:c?`ldr`:`str`,operands:`${l}${s}, [x${o}, x${r}${u===`lsl`?``:`, ${u}`}${d?` ${d}`:``}]`}}function nt(e){let t=e>>30&3,n=e>>26&1,r=e>>22&1,i=e>>15&127,a=e>>10&31,o=e>>5&31,s=e&31;if(n)return{mnemonic:`ldp/stp`,operands:`<simd>`};let c=2+t,l=i<<25>>25<<c,u=t===2?`x`:`w`;return{mnemonic:r?`ldp`:`stp`,operands:`${u}${s}, ${u}${a}, [x${o}, #${l}]`}}function rt(e){let t=e>>30&3,n=e>>15&1,r=e>>22&1,i=e>>16&31,a=e&31,o=e>>5&31,s=t===3?`x`:`w`;return r?n?{mnemonic:`ldaxr`,operands:`${s}${a}, [x${o}]`}:{mnemonic:`ldxr`,operands:`${s}${a}, [x${o}]`}:{mnemonic:`stxr`,operands:`${s}${i}, ${s}${a}, [x${o}]`}}function it(e){let t=e>>31&1,n=e>>29&3,r=e>>22&3,i=e>>16&31,a=e>>10&63,o=e>>5&31,s=e&31,c=t?`x`:`w`;return{mnemonic:[`and`,`bic`,`orr`,`orn`,`eor`,`eon`,`ands`,`bics`][n]||`logical`,operands:a?`${c}${s}, ${c}${o}, ${c}${i}, ${[`lsl`,`lsr`,`asr`,`ror`][r]} #${a}`:`${c}${s}, ${c}${o}, ${c}${i}`}}function at(e){let t=e>>31&1,n=e>>30&1,r=e>>29&1,i=e>>22&3,a=e>>16&31,o=e>>10&63,s=e>>5&31,c=e&31,l=t?`x`:`w`;return{mnemonic:r?n?`subs`:`adds`:n?`sub`:`add`,operands:o?`${l}${c}, ${l}${s}, ${l}${a}, ${[`lsl`,`lsr`,`asr`,`reserved`][i]} #${o}`:`${l}${c}, ${l}${s}, ${l}${a}`}}function ot(e){let t=e>>31&1,n=e>>16&31,r=e>>12&15,i=e>>10&3,a=e>>5&31,o=e&31,s=t?`x`:`w`;return{mnemonic:[`csel`,`csinc`,`csinv`,`csneg`][i]||`csel`,operands:`${s}${o}, ${s}${a}, ${s}${n}, ${[`eq`,`ne`,`cs`,`cc`,`mi`,`pl`,`vs`,`vc`,`hi`,`ls`,`ge`,`lt`,`gt`,`le`,`al`,`nv`][r]}`}}function st(e){return{mnemonic:`mrs`,operands:`x${e&31}, ${`s${e>>16&7}_${e>>12&15}_${e>>8&15}_${e>>5&7}`}`}}function ct(e){let t=e>>16&7,n=e>>12&15,r=e>>8&15,i=e>>5&7,a=e&31;return{mnemonic:`msr`,operands:`${`s${t}_${n}_${r}_${i}`}, x${a}`}}function lt(e){if((e&1595932672)==1579155456){let t=e>>22&3,n=e>>12&31,r=e>>5&31,i=e&31,a=[`b`,`h`,`s`,`d`],o=a[t]||`s`;if(n===4)return{mnemonic:`fcvt`,operands:`${a[e>>15&3]||`s`}${i}, ${o}${r}`};if(n===1)return{mnemonic:`fabs`,operands:`${o}${i}, ${o}${r}`};if(n===2)return{mnemonic:`fneg`,operands:`${o}${i}, ${o}${r}`};if(n===3)return{mnemonic:`fsqrt`,operands:`${o}${i}, ${o}${r}`};if(n>=6&&n<=9)return{mnemonic:[`frintn`,`frintm`,`frintp`,`frintz`][n-6]||`frint`,operands:`${o}${i}, ${o}${r}`};if(n===10)return{mnemonic:`frinta`,operands:`${o}${i}, ${o}${r}`};if(n===14)return{mnemonic:`frintx`,operands:`${o}${i}, ${o}${r}`};if(n===15)return{mnemonic:`frinti`,operands:`${o}${i}, ${o}${r}`}}if((e&1595948032)==505421824){let t=e>>22&3,n=e>>16&31,r=e>>3&3,i=e>>5&31,a=[`b`,`h`,`s`,`d`][t]||`s`;if(r===0)return{mnemonic:`fcmp`,operands:`${a}${i}, ${a}${n}`};if(r===1)return{mnemonic:`fcmpe`,operands:`${a}${i}, ${a}${n}`}}if((e&1595964416)==505421824){let t=e>>22&3,n=e>>5&31;return{mnemonic:`fcmp`,operands:`${[`b`,`h`,`s`,`d`][t]||`s`}${n}, #0.0`}}if((e&1595935744)==505415680){let t=e>>22&3,n=e>>16&31,r=e>>12&15,i=e>>5&31,a=e&31,o=[`b`,`h`,`s`,`d`][t]||`s`,s=[`fmul`,`fdiv`,`fadd`,`fsub`,`fmax`,`fmin`,`fmaxnm`,`fminnm`][r];if(s)return{mnemonic:s,operands:`${o}${a}, ${o}${i}, ${o}${n}`}}if((e&1610596352)==505430016){let t=e>>22&3,n=e>>5&31,r=e&31,i=[`b`,`h`,`s`,`d`][t]||`s`;return{mnemonic:`fmov`,operands:`${i}${r}, ${i}${n}`}}if((e&1595935744)==505416704){let t=e>>22&3,n=e>>16&31,r=e>>12&15,i=e>>5&31,a=e&31,o=[`b`,`h`,`s`,`d`][t]||`s`;return{mnemonic:`fcsel`,operands:`${o}${a}, ${o}${i}, ${o}${n}, ${[`eq`,`ne`,`cs`,`cc`,`mi`,`pl`,`vs`,`vc`,`hi`,`ls`,`ge`,`lt`,`gt`,`le`,`al`,`nv`][r]}`}}if((e&1595936768)==505417728){let t=e>>22&3,n=e&31;return{mnemonic:`fmov`,operands:`${[`b`,`h`,`s`,`d`][t]||`s`}${n}, #<fp-imm>`}}return null}function N(e){return`${e.mnemonic.padEnd(8)} ${e.operands}`}function P(e,t){if(typeof e==`number`)return e>>>0;let n=Array.from(e);if(n.length<4)throw Error(`Need at least 4 bytes for fixed-width instruction decode, got ${n.length}`);let r=F(n,0),i=F(n,1),a=F(n,2),o=F(n,3);return t===`little`?(r|i<<8|a<<16|o<<24)>>>0:(r<<24|i<<16|a<<8|o)>>>0}function ut(e){return typeof e==`number`?e<=255?[e&255]:[e&255,e>>>8&255,e>>>16&255,e>>>24&255]:Array.from(e,e=>e&255)}function F(e,t){return(e[t]??0)&255}function dt(e,t){let n=F(e,t);return n&128?n-256:n}function I(e,t){return F(e,t)|F(e,t+1)<<8|F(e,t+2)<<16|F(e,t+3)<<24}function L(e,t){return I(e,t)>>>0}function ft(e,t){let n=BigInt(L(e,t));return BigInt(L(e,t+4))<<32n|n}function R(e,t){let n=32-t;return e<<n>>n}function z(e,t,n){return`0x${(e+BigInt(t)+BigInt(n)).toString(16)}`}const pt=`$zero.$at.$v0.$v1.$a0.$a1.$a2.$a3.$t0.$t1.$t2.$t3.$t4.$t5.$t6.$t7.$s0.$s1.$s2.$s3.$s4.$s5.$s6.$s7.$t8.$t9.$k0.$k1.$gp.$sp.$fp.$ra`.split(`.`);function mt(e,t){if(e===0)return N({mnemonic:`nop`,operands:``});let n=e>>>26&63,r=e>>>21&31,i=e>>>16&31,a=e>>>11&31,o=e>>>6&31,s=e&63,c=e&65535,l=R(c,16);if(n===0)return N(ht(r,i,a,o,s,e));if(n===2||n===3){let r=t+4n&4026531840n|BigInt(e&67108863)<<2n;return N({mnemonic:n===3?`jal`:`j`,operands:`0x${r.toString(16)}`})}if(n===4||n===5){let e=t+4n+(BigInt(l)<<2n);return N({mnemonic:n===4?`beq`:`bne`,operands:`${B(r)}, ${B(i)}, 0x${e.toString(16)}`})}if(n===15)return N({mnemonic:`lui`,operands:`${B(i)}, #0x${c.toString(16)}`});let u=_t[n];if(u){let e=n===12||n===13||n===14?`#0x${c.toString(16)}`:`#${l}`;return N({mnemonic:u,operands:`${B(i)}, ${B(r)}, ${e}`})}let d=vt[n];return d?N({mnemonic:d,operands:`${B(i)}, ${l}(${B(r)})`}):`<unknown> 0x${e.toString(16).padStart(8,`0`)}`}function ht(e,t,n,r,i,a){if(i===8)return{mnemonic:`jr`,operands:B(e)};if(i===9)return{mnemonic:`jalr`,operands:`${B(n)}, ${B(e)}`};if(i===0)return{mnemonic:`sll`,operands:`${B(n)}, ${B(t)}, #${r}`};if(i===2)return{mnemonic:`srl`,operands:`${B(n)}, ${B(t)}, #${r}`};if(i===3)return{mnemonic:`sra`,operands:`${B(n)}, ${B(t)}, #${r}`};let o=gt[i];return o?{mnemonic:o,operands:`${B(n)}, ${B(e)}, ${B(t)}`}:{mnemonic:`<unknown>`,operands:`0x${a.toString(16).padStart(8,`0`)}`}}const gt={32:`add`,33:`addu`,34:`sub`,35:`subu`,36:`and`,37:`or`,38:`xor`,39:`nor`,42:`slt`,43:`sltu`},_t={8:`addi`,9:`addiu`,10:`slti`,11:`sltiu`,12:`andi`,13:`ori`,14:`xori`},vt={32:`lb`,33:`lh`,35:`lw`,36:`lbu`,37:`lhu`,40:`sb`,41:`sh`,43:`sw`};function B(e){return pt[e]??`$r${e}`}const yt=Array.from({length:32},(e,t)=>`x${t}`);function bt(e,t){if(e===19)return N({mnemonic:`nop`,operands:``});if(e===32871)return N({mnemonic:`ret`,operands:``});let n=e&127,r=e>>7&31,i=e>>12&7,a=e>>15&31,o=e>>20&31,s=e>>25&127;if(n===19){let t=R(e>>>20,12),n=[`addi`,`slli`,`slti`,`sltiu`,`xori`,`srli`,`ori`,`andi`][i];if(i===5&&s===32)return N({mnemonic:`srai`,operands:`${V(r)}, ${V(a)}, #${e>>20&31}`});if(n)return N({mnemonic:n,operands:`${V(r)}, ${V(a)}, #${t}`})}if(n===51){let e=xt[`${s}:${i}`];if(e)return N({mnemonic:e,operands:`${V(r)}, ${V(a)}, ${V(o)}`})}if(n===3){let t=R(e>>>20,12),n=[`lb`,`lh`,`lw`,`ld`,`lbu`,`lhu`,`lwu`][i];if(n)return N({mnemonic:n,operands:`${V(r)}, ${t}(${V(a)})`})}if(n===35){let t=R(e>>7&31|(e>>25&127)<<5,12),n=[`sb`,`sh`,`sw`,`sd`][i];if(n)return N({mnemonic:n,operands:`${V(o)}, ${t}(${V(a)})`})}if(n===99){let n=R(e>>7&30|e>>20&2016|e<<4&2048|e>>19&4096,13),r=[`beq`,`bne`,void 0,void 0,`blt`,`bge`,`bltu`,`bgeu`][i];if(r)return N({mnemonic:r,operands:`${V(a)}, ${V(o)}, 0x${(t+BigInt(n)).toString(16)}`})}if(n===111){let n=R((e>>21&1023)<<1|(e>>20&1)<<11|(e>>12&255)<<12|(e>>31&1)<<20,21);return N({mnemonic:`jal`,operands:`${V(r)}, 0x${(t+BigInt(n)).toString(16)}`})}if(n===103){let t=R(e>>>20,12);return N({mnemonic:`jalr`,operands:`${V(r)}, ${t}(${V(a)})`})}return n===55?N({mnemonic:`lui`,operands:`${V(r)}, #0x${(e&4294963200).toString(16)}`}):n===23?N({mnemonic:`auipc`,operands:`${V(r)}, #0x${(e&4294963200).toString(16)}`}):`<unknown> 0x${e.toString(16).padStart(8,`0`)}`}const xt={"0:0":`add`,"32:0":`sub`,"0:1":`sll`,"0:2":`slt`,"0:3":`sltu`,"0:4":`xor`,"0:5":`srl`,"32:5":`sra`,"0:6":`or`,"0:7":`and`};function V(e){return yt[e]??`x${e}`}const St=[`o`,`no`,`b`,`ae`,`e`,`ne`,`be`,`a`,`s`,`ns`,`p`,`np`,`l`,`ge`,`le`,`g`],Ct=[`eax`,`ecx`,`edx`,`ebx`,`esp`,`ebp`,`esi`,`edi`,`r8d`,`r9d`,`r10d`,`r11d`,`r12d`,`r13d`,`r14d`,`r15d`],wt=[`rax`,`rcx`,`rdx`,`rbx`,`rsp`,`rbp`,`rsi`,`rdi`,`r8`,`r9`,`r10`,`r11`,`r12`,`r13`,`r14`,`r15`];function Tt(e,t,n){let r=ut(e),i=0,a=0,o=`none`;for(;Et(F(r,i));)o=Dt(F(r,i))??o,i++;let s=Ot(r,i,n);if(s)return s;n===`x64`&&F(r,i)>=64&&F(r,i)<=79&&(a=F(r,i),i++);let c=F(r,i++),l=n===`x64`&&(a&8)!=0;if(c===144)return N({mnemonic:`nop`,operands:``});if(c===195)return N({mnemonic:`ret`,operands:``});if(c===204)return N({mnemonic:`int3`,operands:``});if(c>=80&&c<=87)return N({mnemonic:`push`,operands:Y(c-80+(a&1?8:0),n===`x64`?`64`:`32`)});if(c>=88&&c<=95)return N({mnemonic:`pop`,operands:Y(c-88+(a&1?8:0),n===`x64`?`64`:`32`)});if(c>=112&&c<=127){let e=St[c&15],n=z(t,i+1,dt(r,i));return N({mnemonic:`j${e}`,operands:n})}if(c===15){let e=F(r,i++);if(e>=128&&e<=143){let n=St[e&15],a=z(t,i+4,I(r,i));return N({mnemonic:`j${n}`,operands:a})}if(e===56){let e=jt(2,F(r,i++),o,r,i,a,l);if(e)return N(e)}if(e===58){let e=jt(3,F(r,i++),o,r,i,a,l);if(e)return N(e)}let n=At(e,o,r,i,a,l);if(n)return N(n)}if(c===232)return N({mnemonic:`call`,operands:z(t,i+4,I(r,i))});if(c===233)return N({mnemonic:`jmp`,operands:z(t,i+4,I(r,i))});if(c===235)return N({mnemonic:`jmp`,operands:z(t,i+1,dt(r,i))});if(c>=184&&c<=191){let e=Y(c-184+(a&1?8:0),l?`64`:`32`);return l&&r.length>=i+8?N({mnemonic:`mov`,operands:`${e}, #0x${ft(r,i).toString(16)}`}):N({mnemonic:`mov`,operands:`${e}, #0x${L(r,i).toString(16)}`})}let u={1:[`add`,!1],3:[`add`,!0],41:[`sub`,!1],43:[`sub`,!0],49:[`xor`,!1],51:[`xor`,!0],57:[`cmp`,!1],59:[`cmp`,!0],137:[`mov`,!1],139:[`mov`,!0]}[c];if(u&&r.length>i){let[e,t]=u;return N(H(e,t,F(r,i),a,l))}return`<unknown> ${r.map(e=>e.toString(16).padStart(2,`0`)).join(` `)}`}function H(e,t,n,r,i){let a=n>>6&3,o=(n>>3&7)+(r&4?8:0),s=(n&7)+(r&1?8:0),c=i?`64`:`32`,l=Y(o,c),u=a===3?Y(s,c):`[${Y(s,`64`)}]`;return{mnemonic:e,operands:t?`${l}, ${u}`:`${u}, ${l}`}}function Et(e){return e===102||e===242||e===243||e===240||e===46||e===54||e===62||e===38||e===100||e===101||e===103}function Dt(e){return e===102?`66`:e===242?`f2`:e===243?`f3`:null}function Ot(e,t,n){let r=kt(e,t,n);if(!r)return null;let i=F(e,r.opIndex),a=r.opIndex+1;if(e.length<=a)return N({mnemonic:r.evex?`evex`:`vex`,operands:`0x${i.toString(16)}`});if(r.map===1){let t=r.evex?Ft(i,r,e,a):Mt(i,r,e,a);if(t)return N(t)}if(r.map===2){let t=r.evex?It(i,r,e,a):Nt(i,r,e,a);if(t)return N(t)}if(r.map===3){let t=Pt(i,r,e,a);if(t)return N(t)}return null}function kt(e,t,n){let r=F(e,t);if(r===197&&e.length>t+2){let r=F(e,t+1);return{evex:!1,map:1,pp:U(r&3),w:0,vectorBits:r&4?256:128,opIndex:t+2,regExt:n===`x64`&&!(r&128)?8:0,rmExt:0,vvvv:~(r>>3)&15}}if(r===196&&e.length>t+3){let r=F(e,t+1),i=F(e,t+2);return{evex:!1,map:r&31,pp:U(i&3),w:i>>7&1,vectorBits:i&4?256:128,opIndex:t+3,regExt:n===`x64`&&!(r&128)?8:0,rmExt:n===`x64`&&!(r&32)?8:0,vvvv:~(i>>3)&15}}if(r===98&&e.length>t+4){let n=F(e,t+1),r=F(e,t+2),i=F(e,t+3),a=i&64?512:i&32?256:128,o=n&128?0:8,s=n&16?0:16,c=n&64?0:8,l=n&32?0:8;return{evex:!0,map:n&3,pp:U(r&3),w:r>>7&1,vectorBits:a,opIndex:t+4,regExt:o+s,rmExt:l+c,vvvv:~(r>>3)&15,opmask:i&7,zeroing:(i&128)!=0,broadcastOrRounding:(i&16)!=0}}return null}function U(e){return e===1?`66`:e===2?`f3`:e===3?`f2`:`none`}function At(e,t,n,r,i,a){if(n.length<=r)return null;let o=F(n,r),s=Bt[W(t,e)];return s?G(s,`xmm`,o,q(i),J(i)):t===`66`&&e===111?G(`movdqa`,`xmm`,o,q(i),J(i)):t===`f3`&&e===111?G(`movdqu`,`xmm`,o,q(i),J(i)):t===`66`&&e===127?G(`movdqa`,`xmm`,o,q(i),J(i),!1):t===`f3`&&e===127?G(`movdqu`,`xmm`,o,q(i),J(i),!1):t===`66`&&e===56?null:t===`f3`&&e===184?H(`popcnt`,!0,o,i,(a?`64`:`32`)==`64`):t===`f3`&&e===189?H(`lzcnt`,!0,o,i,(a?`64`:`32`)==`64`):null}function jt(e,t,n,r,i,a,o){if(r.length<=i)return null;let s=F(r,i);if(e===2){if(n===`66`&&t===219)return G(`aesimc`,`xmm`,s,q(a),J(a));if(n===`66`&&t>=220&&t<=223)return G([`aesenc`,`aesenclast`,`aesdec`,`aesdeclast`][t-220],`xmm`,s,q(a),J(a));if(n===`66`&&t===64)return G(`pmulld`,`xmm`,s,q(a),J(a));if(n===`66`&&t===65)return G(`phminposuw`,`xmm`,s,q(a),J(a))}if(e===3){if(n===`66`&&t===68)return K(`pclmulqdq`,`xmm`,s,r,i+1,q(a),J(a));if(n===`66`&&t===223)return K(`aeskeygenassist`,`xmm`,s,r,i+1,q(a),J(a))}return n===`f3`&&e===2&&t===245?H(`bzhi`,!0,s,a,o):null}function Mt(e,t,n,r){let i=F(n,r),a=t.vectorBits===256?`ymm`:`xmm`,o=Vt[W(t.pp,e)];return o?G(o,a,i,t.regExt,t.rmExt,!0,t.vvvv):t.pp===`66`&&e===111?G(`vmovdqa`,a,i,t.regExt,t.rmExt):t.pp===`f3`&&e===111?G(`vmovdqu`,a,i,t.regExt,t.rmExt):t.pp===`66`&&e===127?G(`vmovdqa`,a,i,t.regExt,t.rmExt,!1):t.pp===`f3`&&e===127?G(`vmovdqu`,a,i,t.regExt,t.rmExt,!1):null}function Nt(e,t,n,r){let i=F(n,r),a=t.vectorBits===256?`ymm`:`xmm`,o=Ht[W(t.pp,e)];return o?G(o,a,i,t.regExt,t.rmExt,!0,t.vvvv):null}function Pt(e,t,n,r){let i=F(n,r),a=t.vectorBits===256?`ymm`:`xmm`;return t.pp===`66`&&e===68?K(`vpclmulqdq`,a,i,n,r+1,t.regExt,t.rmExt,t.vvvv):null}function Ft(e,t,n,r){let i=F(n,r),a=zt(t),o=Ut[W(t.pp,e)];return o?G(o,a,i,t.regExt,t.rmExt,!0,t.vvvv,t):t.pp===`66`&&e===111?G(`vmovdqa64`,a,i,t.regExt,t.rmExt,!0,void 0,t):t.pp===`f3`&&e===111?G(`vmovdqu64`,a,i,t.regExt,t.rmExt,!0,void 0,t):t.pp===`66`&&e===127?G(`vmovdqa64`,a,i,t.regExt,t.rmExt,!1,void 0,t):t.pp===`f3`&&e===127?G(`vmovdqu64`,a,i,t.regExt,t.rmExt,!1,void 0,t):null}function It(e,t,n,r){let i=F(n,r),a=zt(t),o=Wt[W(t.pp,e)];return o?G(o,a,i,t.regExt,t.rmExt,!0,t.vvvv,t):null}function W(e,t){return`${e}:${t.toString(16).padStart(2,`0`)}`}function G(e,t,n,r,i,a=!0,o,s){let c=(n>>3&7)+r,l=(n&7)+i,u=`${t}${c}${Lt(s)}`,d=(n>>6&3)==3?`${t}${l}`:`[${wt[l&15]??`r${l}`}]`,f=o===void 0?void 0:`${t}${o}`,p=a?u:d,m=a?d:u;return{mnemonic:e,operands:f?`${p}, ${f}, ${m}${Rt(s)}`:`${p}, ${m}${Rt(s)}`}}function K(e,t,n,r,i,a,o,s){let c=G(e,t,n,a,o,!0,s);return{mnemonic:c.mnemonic,operands:`${c.operands}, #0x${F(r,i).toString(16)}`}}function Lt(e){return!e?.evex||!e.opmask?``:`{k${e.opmask}}${e.zeroing?`{z}`:``}`}function Rt(e){return e?.evex&&e.broadcastOrRounding?` {evex-b}`:``}function zt(e){return e.vectorBits===512?`zmm`:e.vectorBits===256?`ymm`:`xmm`}function q(e){return e&4?8:0}function J(e){return e&1?8:0}const Bt={"none:58":`addps`,"66:58":`addpd`,"f3:58":`addss`,"f2:58":`addsd`,"none:59":`mulps`,"66:59":`mulpd`,"f3:59":`mulss`,"f2:59":`mulsd`,"none:5c":`subps`,"66:5c":`subpd`,"f3:5c":`subss`,"f2:5c":`subsd`,"none:5e":`divps`,"66:5e":`divpd`,"f3:5e":`divss`,"f2:5e":`divsd`,"none:28":`movaps`,"66:28":`movapd`,"none:10":`movups`,"66:10":`movupd`,"66:74":`pcmpeqb`,"66:75":`pcmpeqw`,"66:76":`pcmpeqd`,"66:db":`pand`,"66:df":`pandn`,"66:eb":`por`,"66:ef":`pxor`},Vt={"none:58":`vaddps`,"66:58":`vaddpd`,"f3:58":`vaddss`,"f2:58":`vaddsd`,"none:59":`vmulps`,"66:59":`vmulpd`,"f3:59":`vmulss`,"f2:59":`vmulsd`,"none:5c":`vsubps`,"66:5c":`vsubpd`,"f3:5c":`vsubss`,"f2:5c":`vsubsd`,"none:5e":`vdivps`,"66:5e":`vdivpd`,"f3:5e":`vdivss`,"f2:5e":`vdivsd`,"none:28":`vmovaps`,"66:28":`vmovapd`,"none:10":`vmovups`,"66:10":`vmovupd`,"66:74":`vpcmpeqb`,"66:75":`vpcmpeqw`,"66:76":`vpcmpeqd`,"66:db":`vpand`,"66:df":`vpandn`,"66:eb":`vpor`,"66:ef":`vpxor`},Ht={"66:40":`vpmulld`,"66:dc":`vaesenc`,"66:dd":`vaesenclast`,"66:de":`vaesdec`,"66:df":`vaesdeclast`,"66:f6":`vpsadbw`,"66:5a":`vbroadcasti128`},Ut={"none:58":`vaddps`,"66:58":`vaddpd`,"f3:58":`vaddss`,"f2:58":`vaddsd`,"none:59":`vmulps`,"66:59":`vmulpd`,"none:5c":`vsubps`,"66:5c":`vsubpd`,"none:5e":`vdivps`,"66:5e":`vdivpd`,"none:28":`vmovaps`,"66:28":`vmovapd`,"none:10":`vmovups`,"66:10":`vmovupd`},Wt={"66:25":`vpternlogd`,"66:40":`vpmulld`,"66:58":`vpbroadcastd`,"66:59":`vpbroadcastq`,"66:7c":`vpbroadcastd`,"66:7e":`vpbroadcastq`,"66:dc":`vaesenc`,"66:dd":`vaesenclast`,"66:de":`vaesdec`,"66:df":`vaesdeclast`};function Y(e,t){return(t===`64`?wt:Ct)[e]??`r${e}`}const Gt=[`arm64`,`aarch64`,`x86`,`x64`,`riscv32`,`riscv64`,`mips`,`mips32`,`mipsel`];function Kt(e){switch(e){case`arm64`:case`aarch64`:return`arm64`;case`x86`:return`x86`;case`x64`:return`x64`;case`riscv32`:case`riscv64`:return`riscv`;case`mips`:case`mips32`:return`mips`;case`mipsel`:return`mipsel`}}function qt(e,t,n=0n){switch(Kt(e)){case`arm64`:return He(P(t,`little`),n);case`x86`:return Tt(t,n,`x86`);case`x64`:return Tt(t,n,`x64`);case`riscv`:return bt(P(t,`little`),n);case`mips`:return mt(P(t,`big`),n);case`mipsel`:return mt(P(t,`little`),n)}}function X(e){return{unresolvedImports:[...e.emulator.engine.unresolvedImports()],constructorFaults:[...e.emulator.engine.constructorFaultLog()]}}function Jt(e,t,n,r){let a=e instanceof Error?e.message:String(e),o={...t?{sessionId:t.id}:{},...n?{symbol:n}:{}};return t&&(o.diagnostics=X(t)),e instanceof i&&(o.fault={kind:`null-indirect-call`,phase:r,message:a}),ee.fail(e).merge(o).json()}function Yt(e){if(typeof e==`number`){if(!Number.isFinite(e)||e<0)throw Error(`opcode number must be a finite unsigned integer`);return Math.trunc(e)>>>0}if(typeof e!=`string`)throw Error(`Missing required opcode argument`);let t=e.trim();if(!t)throw Error(`opcode must not be empty`);if(/^(?:0x)?[0-9a-f]+$/i.test(t)&&t.replace(/^0x/i,``).length>2)return Number.parseInt(t.replace(/^0x/i,``),16)>>>0;let n=t.replace(/,/g,` `).split(/\s+/).filter(Boolean).map(e=>{let t=e.replace(/^0x/i,``);if(!/^[0-9a-f]{1,2}$/i.test(t))throw Error(`Invalid opcode byte: ${e}`);return Number.parseInt(t,16)});if(n.length===0)throw Error(`opcode must include at least one byte`);return n}function Xt(e){let t=e.trim();if(!t)return 0n;if(/^0x[0-9a-f]+$/i.test(t)||/^\d+$/.test(t))return BigInt(t);throw Error(`Invalid pc: ${e}`)}function Zt(e){return typeof e==`number`?`0x${e.toString(16)}`:Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(` `)}function Z(e){let t=g().nativeEmulator.rawMemoryMaxBytes,n=u(e,`maxBytes`,t);return Math.max(1,Math.min(n,t))}function Q(e,t,n){if(!Number.isFinite(e)||e<0)throw Error(`Invalid raw memory ${n} size`);if(e>t)throw Error(`Raw guest memory ${n} exceeds limit: ${e} > ${t} bytes`)}function $(e){return new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}function Qt(e,t){return t.filter(t=>e[t]!==void 0&&e[t]!==null)}function $t(e){if(Qt(e,[`returnInt`,`returnString`,`returnBytes`]).length>1)throw Error(`returnInt, returnString, and returnBytes are mutually exclusive; provide only one return value.`)}function en(e){if(Qt(e,[`valueInt`,`valueString`,`valueBytes`]).length>1)throw Error(`valueInt, valueString, and valueBytes are mutually exclusive; provide only one field value.`)}function tn(e){$t(e);let t=u(e,`returnInt`),n=l(e,`returnString`),r=l(e,`returnBytes`);if(t!==void 0)return{kind:`int`,fn:()=>BigInt(Math.trunc(t))};if(n!==void 0)return{kind:`string`,fn:e=>BigInt(e.jni.allocHandle({kind:`string`,value:n}))};if(r!==void 0){let e=$(Buffer.from(r,`base64`));return{kind:`bytes`,fn:t=>BigInt(t.jni.allocHandle({kind:`bytes`,value:e}))}}return{kind:`void`,fn:()=>void 0}}function nn(e,t){en(t);let n=u(t,`valueInt`),r=l(t,`valueString`),i=l(t,`valueBytes`);if(n!==void 0)return{kind:`int`,value:BigInt(Math.trunc(n))};if(r!==void 0){let t=e.emulator.jni.allocHandle({kind:`string`,value:r});return{kind:`string`,value:BigInt(t)}}if(i!==void 0){let t=$(Buffer.from(i,`base64`)),n=e.emulator.newByteArray(t);return{kind:`bytes`,value:BigInt(n)}}return{kind:`int`,value:0n}}const rn=/^[vqdshb]\d{1,2}$/i;function an(e,t){let n={step:e.step,pc:`0x${e.pc.toString(16)}`,insn:`0x${e.insn.toString(16).padStart(8,`0`)}`,asm:qt(`arm64`,e.insn,BigInt(e.pc))};if(t.length>0){let r={};for(let n of t)r[n]=rn.test(n)?e.vector(n):e.reg(n);n.registers=r}return n}async function on(e,t,n,i,a){let o=await r({category:`traces`,toolName:`nemu_trace`,target:t,ext:`json`}),s={schema:`jshookmcp.native-emulator.trace.v1`,sessionId:e,symbol:t,result:n,steps:i.length,truncated:a,trace:i},c=`${JSON.stringify(s,null,2)}\n`;return await te(o.absolutePath,c,`utf8`),{category:`traces`,path:o.displayPath,eventCount:i.length,bytes:Buffer.byteLength(c,`utf8`)}}const sn=new Set(Gt);var cn=class{sessions;constructor(e){this.sessions=e??new Ie}handleCapabilities(e){return h(async()=>({backend:`self-built-arm64`,available:!0,external_dependencies:[],features:`load-elf-so.elf-relocations.init-array-constructors.pt-dynamic-symbols.elf-import-inspection.auto-wire-bionic-libc.bionic-stdio-vfs.raw-guest-memory.android-syscalls.getrandom.system-register-read.memory-barriers.exclusive-load-store.simd-fp-load-store.simd-ld1-st1-multi.aes-crypto.sha1-crypto.sha256-crypto.sm3-crypto.sm4-crypto.pmull-ghash.scalar-fp.neon-integer-simd.call-exported-symbol.call-jni-export.null-indirect-call-detection.jni-object-array-iteration.java-mock-callback.java-mock-field.apk-arm64-extract.instruction-trace`.split(`.`),isa:`aarch64-integer+neon+crypto+fp16`,simd:{supported:[`simd-fp-load-store`,`contiguous-ld1-st1`,`ld2-ld3-ld4-deinterleaving`,`aes-sha-pmull`,`sm3-sm4-crypto`,`scalar-fp`,`neon-three-same`,`neon-two-register-misc`,`neon-dup`,`neon-movi-mvni`,`neon-shift-immediate`,`neon-reductions`,`neon-zip-uzp-trn`,`neon-ext`,`neon-tbl-tbx`,`long-widening-neon`,`saturating-neon`,`neon-ins-general`,`neon-bit-bif`,`neon-pmul-vector`,`vector-fmov-immediate`,`fp16`],unsupported:[]},activeSessions:this.sessions.count(),note:`In-process AArch64 interpreter: integer ISA (incl. DMB/DSB/ISB barriers as no-ops) + a declared SIMD/FP subset + NEON integer-lane subset including saturating add/sub + crypto extension primitives + scalar IEEE-754 floating-point across single/double AND half precision (FEAT_FP16, software binary16 model). SIMD support is reported as supported/unsupported lists; unsupported opcodes fail loudly with the raw opcode instead of being treated as success. On load, DT_INIT + DT_INIT_ARRAY constructors run after relocation; constructor NULL indirect calls are tolerated and logged, while direct call_symbol/call_jni_export NULL indirect calls throw "NULL indirect call". Raw guest memory tools are bounded by configured byte caps and return previews unless full base64 output is explicitly requested. Managed runtime snapshot payloads are outside this emulator boundary.`}))}handleCreateSession(e){return h(async()=>{let t=f(e,`installSyscalls`,!0),n=this.sessions.createSession(t?{}:{syscalls:!1});return{sessionId:n.id,createdAt:n.createdAt,activeSessions:this.sessions.count()}})}handleDestroySession(e){return h(async()=>{let t=m(e,`sessionId`);return{sessionId:t,destroyed:this.sessions.destroySession(t),activeSessions:this.sessions.count()}})}handleListSessions(e){return h(async()=>({sessions:this.sessions.listSessions(),count:this.sessions.count()}))}handleSessionInfo(e){return h(async()=>{let t=this.requireSession(e),n=t.emulator.engine.exportedSymbolNames();return{sessionId:t.id,createdAt:t.createdAt,lastUsedAt:t.lastUsedAt,activeSessions:this.sessions.count(),symbols:n,symbolCount:n.length,diagnostics:X(t)}})}handleLoadLibrary(e){return h(async()=>{let t=this.requireSession(e),n=m(e,`soPath`),r=await _(n),i=t.emulator.loadLibrary($(r));return{sessionId:t.id,soPath:n,entry:i.entry,unresolvedImports:i.unresolvedImports,constructorFaults:i.constructorFaults,symbols:t.emulator.engine.exportedSymbolNames()}})}handleLoadLibraryChain(e){return h(async()=>{let t=this.requireSession(e),n=d(e,`dependencyPaths`)??[],r=m(e,`primaryPath`);if(n.length===0)throw Error(`dependencyPaths must contain at least one dependency .so path`);let i=[];for(let e of n){let t=await _(e);i.push($(t))}let a=$(await _(r)),o=t.emulator.loadLibraryChain(i,a);return{sessionId:t.id,dependencyPaths:n,primaryPath:r,entry:o.entry,unresolvedImports:o.unresolvedImports,constructorFaults:o.constructorFaults,symbols:t.emulator.engine.exportedSymbolNames()}})}handleExtractApkLibs(e){return h(async()=>{let t=m(e,`apkPath`),n=await s(t);return{apkPath:t,abi:`arm64-v8a`,libs:n.map(e=>({name:e.name,bytes:e.bytes.length})),count:n.length}})}handleInspectImports(e){return h(async()=>{let t=m(e,`soPath`);return{soPath:t,...Le($(await _(t)))}})}handleLoadApkLibrary(e){return h(async()=>{let t=this.requireSession(e),n=m(e,`apkPath`),r=m(e,`libName`),i=await s(n),a=i.find(e=>e.name===r);if(!a)throw Error(`Library "${r}" not found in ${n} (available: ${i.map(e=>e.name).join(`, `)||`none`})`);let o=t.emulator.loadLibrary(a.bytes);return{sessionId:t.id,apkPath:n,libName:r,entry:o.entry,unresolvedImports:o.unresolvedImports,constructorFaults:o.constructorFaults,symbols:t.emulator.engine.exportedSymbolNames()}})}handleListSymbols(e){return h(async()=>{let t=this.requireSession(e),n=t.emulator.engine.exportedSymbolNames();return{sessionId:t.id,symbols:n,count:n.length}})}handleCallSymbol(e){return this.handleNativeCall(e,`call_symbol`,(t,n)=>{let r=c(e,`args`);return t.emulator.call(n,r)})}handleCallJniExport(e){return this.handleNativeCall(e,`call_jni_export`,(t,n)=>{let r=c(e,`javaArgs`),i=u(e,`thiz`,0);return t.emulator.callJniExport(n,r,i)})}async handleNativeCall(e,t,n){let r,i=``;try{r=this.requireSession(e),i=m(e,`symbol`);let t=n(r,i);return ee.ok().merge({sessionId:r.id,symbol:i,result:t,diagnostics:X(r)}).json()}catch(e){return Jt(e,r,i,t)}}handleSetupJavaMock(e){return h(async()=>{let t=this.requireSession(e),n=m(e,`className`),r=m(e,`methodName`),i=m(e,`signature`),a=tn(e);return t.emulator.setupJava(n,r,i,a.fn),{sessionId:t.id,className:n,methodName:r,signature:i,returns:a.kind}})}handleSetupJavaField(e){return h(async()=>{let t=this.requireSession(e),n=m(e,`className`),r=m(e,`fieldName`),i=m(e,`signature`),a=nn(t,e);return t.emulator.setupJavaField(n,r,i,a.value),{sessionId:t.id,className:n,fieldName:r,signature:i,kind:a.kind}})}handleNewByteArray(e){return h(async()=>{let t=this.requireSession(e),n=m(e,`dataBase64`),r=$(Buffer.from(n,`base64`)),i=t.emulator.newByteArray(r);return{sessionId:t.id,handle:i,length:r.length}})}handleReadByteArray(e){return h(async()=>{let t=this.requireSession(e),n=u(e,`handle`);if(n===void 0)throw Error(`Missing required number argument: "handle"`);let r=t.emulator.bytesOf(n);if(!r)throw Error(`Handle ${n} does not resolve to a byte array`);return{sessionId:t.id,handle:n,dataBase64:Buffer.from(r).toString(`base64`),length:r.length}})}handleTrace(e){return h(async()=>{let t=this.requireSession(e),n=m(e,`symbol`),r=c(e,`args`),i=d(e,`captureRegisters`),a=Math.min(u(e,`maxSteps`,1e3),1e5),o=f(e,`persistArtifact`,!1),s=u(e,`traceInlineLimit`),l=[],p=!1,h=t.emulator.engine.addInstructionHook(e=>{if(l.length>=a){p=!0;return}l.push(an(e,i))});try{let e=t.emulator.call(n,r),i=s===void 0?l.length:Math.max(0,Math.min(Math.trunc(s),l.length)),a=o?await on(t.id,n,e,l,p):void 0;return{sessionId:t.id,symbol:n,result:e,steps:l.length,truncated:p,traceInlineLimit:i,...a?{traceArtifact:a}:{},trace:l.slice(0,i)}}finally{h()}})}handleDisassemble(e){return h(async()=>{let t=p(e,`architecture`,sn,`arm64`),n=Yt(e.opcode),r=Xt(l(e,`pc`,`0x0`)),i=qt(t,n,r);return{architecture:t,normalizedArchitecture:Kt(t),opcode:Zt(n),pc:`0x${r.toString(16)}`,asm:i}})}dispose(){this.sessions.dispose()}handleAllocMemory(e){return h(async()=>{let t=this.requireSession(e),n=u(e,`size`);if(n===void 0||n<=0)throw Error(`Missing or invalid "size": must be a positive number`);let r=Z(e);Q(n,r,`allocation`);let i=l(e,`fillBytes`,``),a=i?$(Buffer.from(i,`base64`)):void 0;if(a&&a.length>n)throw Error(`fillBytes exceeds allocation size: ${a.length} > ${n} bytes`);a&&Q(a.length,r,`fillBytes`);let o=t.emulator.allocGuestMemory(n,a);return{sessionId:t.id,address:o,size:n}})}handleReadMemory(e){return h(async()=>{let t=this.requireSession(e),n=u(e,`address`),r=u(e,`length`);if(n===void 0||r===void 0||r<=0)throw Error(`Missing or invalid "address" or "length"`);Q(r,Z(e),`read`);let i=t.emulator.readGuestMemory(n,r),a=f(e,`includeDataBase64`,!1),o=Math.max(0,Math.min(u(e,`previewBytes`,g().nativeEmulator.rawMemoryPreviewBytes),i.length));return{sessionId:t.id,address:n,length:i.length,previewBase64:Buffer.from(i.subarray(0,o)).toString(`base64`),...a?{dataBase64:Buffer.from(i).toString(`base64`)}:{dataBase64Omitted:!0}}})}handleWriteMemory(e){return h(async()=>{let t=this.requireSession(e),n=u(e,`address`);if(n===void 0)throw Error(`Missing required number argument: "address"`);let r=m(e,`dataBase64`),i=$(Buffer.from(r,`base64`));return Q(i.length,Z(e),`write`),t.emulator.writeGuestMemory(n,i),{sessionId:t.id,address:n,bytesWritten:i.length}})}requireSession(e){return this.sessions.requireSession(m(e,`sessionId`))}};export{cn as NativeEmulatorHandlers};
@@ -0,0 +1,5 @@
1
+ import{a as e}from"./constants-nvsLpSri.mjs";import{n as t}from"./response-R8ghbZSb.mjs";import{a as n,c as r,d as i,f as a,i as o,l as s,n as c,o as l,r as u,s as d,u as f}from"./boringssl-inspector-C6M3sOga.mjs";import{c as p,i as m,l as h,n as g,r as _}from"./parse-args-B6dwWc9k.mjs";import{r as v}from"./ResponseBuilder-BLicSCjn.mjs";import{a as y,s as b}from"./ssrf-policy-B72vdy23.mjs";import{readFile as x}from"node:fs/promises";import{X509Certificate as S,createHash as C,randomBytes as w,randomUUID as T}from"node:crypto";import{createSocket as E}from"node:dgram";import{Socket as D,createServer as O,isIP as k}from"node:net";import{checkServerIdentity as A,connect as j}from"node:tls";const M=new Set([`TLSv1`,`TLSv1.1`,`TLSv1.2`,`TLSv1.3`]);function N(e){return e instanceof Error?e.message:String(e)}function P(e){return e.replace(/\s+/g,``).toUpperCase()}function F(e){return e.length>0&&e.length%2==0&&/^[0-9A-F]+$/i.test(e)}function I(e){return b(e)&&!y(e)?{ok:!1,error:`Blocked: target host "${e}" resolves to a private/internal address. SSRF protection applies.`}:null}function L(e){return typeof e==`string`&&e.length>0?e:null}function R(e){return typeof e==`string`&&e.length>0?e:null}function z(e,t){let n={...e};return Reflect.set(n,`rejectUnauthorized`,!t),n}async function B(e){let t=p(e,`caPem`)??null,n=p(e,`caPath`)??null;if(t&&n)return{ok:!1,error:`caPem and caPath are mutually exclusive`};if(t)return{ok:!0,ca:t,source:`inline`,path:null,bytes:Buffer.byteLength(t)};if(n)try{let e=await x(n,`utf8`);return{ok:!0,ca:e,source:`path`,path:n,bytes:Buffer.byteLength(e)}}catch(e){return{ok:!1,error:`Failed to read caPath "${n}": ${N(e)}`}}return{ok:!0,ca:void 0,source:null,path:null,bytes:null}}function V(e){return typeof e==`object`&&!!e&&Object.keys(e).length>0}function H(e){return V(e)}function ee(e,t){let n=Buffer.isBuffer(e.raw)?e.raw:null,r=n?new S(n):null,i=r?.subject??null,a=r?.issuer??null;return{depth:t,subject:i,issuer:a,subjectAltName:r?.subjectAltName??e.subjectaltname??null,serialNumber:r?.serialNumber??e.serialNumber??null,validFrom:r?.validFrom??e.valid_from??null,validTo:r?.validTo??e.valid_to??null,fingerprint256:r?.fingerprint256??e.fingerprint256??null,fingerprint512:r?.fingerprint512??e.fingerprint512??null,rawLength:n?.length??null,isCA:r?.ca??e.ca??null,selfIssued:i&&a?i===a:null}}function U(e){if(!e)return[];let t=[],n=new Set,r=e,i=0;for(;r&&H(r);){let e=ee(r,i),a=e.fingerprint256??`${e.subject??`unknown-subject`}:${e.serialNumber??`unknown-serial`}:${i}`;if(n.has(a)||(n.add(a),t.push(e),!(`issuerCertificate`in r)))break;let o=r.issuerCertificate;if(!o||o===r||!H(o))break;r=o,i+=1}return t}function te(e){let t=C(`sha256`).update(e).digest(`hex`).toUpperCase();try{let n=new S(e),r={subject:n.subject||void 0,issuer:n.issuer||void 0,serialNumber:n.serialNumber||void 0,validFrom:n.validFrom||void 0,validTo:n.validTo||void 0,sha256:t,fingerprint256:n.fingerprint256||void 0,subjectAltName:n.subjectAltName??void 0,keyUsage:n.keyUsage??void 0,rawCertLength:n.raw.length,length:e.length},i=n.ca;if(r.basicConstraintsCA=typeof i==`string`&&i===``?null:i,n.publicKey)try{let e=n.publicKey.export({format:`der`,type:`spki`}),t=C(`sha256`).update(e).digest();r.publicKeyAlgorithm=n.publicKey.asymmetricKeyType??void 0,r.publicKeySpkiSha256=t.toString(`hex`).toUpperCase(),r.publicKeyPinBase64=t.toString(`base64`)}catch{}return r}catch{return{sha256:t,length:e.length}}}function ne(e){let t=Buffer.from(P(e),`hex`),n=[],r=0;for(;r<t.length-4;)if(t[r]===48){let e=te(t.subarray(r));n.push(e);let i=e.rawCertLength??0;r+=i>0?i:1}else r+=1;return n.length===0&&t.length>0&&n.push({sha256:C(`sha256`).update(t).digest(`hex`).toUpperCase(),length:t.length}),n}function W(e){return`${e}_${T()}`}function G(e){return{localAddress:e.localAddress??null,localPort:e.localPort??null,remoteAddress:e.remoteAddress??null,remotePort:e.remotePort??null}}function K(e){return{bufferedBytes:e.buffer.length,remoteEnded:e.ended,socketClosed:e.closed,error:e.error}}function q(e){for(let t of e.waiters)t();e.waiters.clear()}function J(e){e.socket.on(`data`,t=>{e.buffer=Buffer.concat([e.buffer,t]),q(e)}),e.socket.on(`end`,()=>{e.ended=!0,q(e)}),e.socket.on(`close`,()=>{e.closed=!0,q(e)}),e.socket.on(`error`,t=>{e.error=t.message,q(e)})}function re(e,t){return new Promise(n=>{let r=()=>{clearTimeout(i),e.waiters.delete(r),n(!0)},i=setTimeout(()=>{e.waiters.delete(r),n(!1)},t);e.waiters.add(r)})}function ie(e,t,n,r){let i=t?t.toString(`hex`).toUpperCase():null;if(t){let r=e.buffer.indexOf(t);if(r>=0){let a=r+t.length,o=n?e.buffer.subarray(0,a):e.buffer.subarray(0,r);return e.buffer=e.buffer.subarray(a),{data:o,matchedDelimiter:!0,stopReason:`delimiter`,delimiterHex:i}}}if(typeof r==`number`&&e.buffer.length>=r){let t=e.buffer.subarray(0,r);return e.buffer=e.buffer.subarray(r),{data:t,matchedDelimiter:!1,stopReason:`maxBytes`,delimiterHex:i}}if((e.error||e.ended||e.closed)&&e.buffer.length>0){let t=e.buffer;return e.buffer=Buffer.alloc(0),{data:t,matchedDelimiter:!1,stopReason:e.error?`error`:`closed`,delimiterHex:i}}return null}function Y(e){return{bufferedBytes:e.parserBuffer.length,queuedFrames:e.frames.length,remoteEnded:e.ended,socketClosed:e.closed,closeSent:e.closeSent,closeReceived:e.closeReceived,error:e.error}}function X(e){return!e||e.trim().length===0?`/`:e.startsWith(`/`)?e:`/${e}`}function ae(e){return{1:`text`,2:`binary`,8:`close`,9:`ping`,10:`pong`}[e]??null}function oe(e){return C(`sha1`).update(`${e}258EAFA5-E914-47DA-95CA-C5AB0DC85B11`,`utf8`).digest(`base64`)}function Z(e,t,n,r){let i={text:1,binary:2,close:8,ping:9,pong:10},a=t;if(e===`close`)if(n!=null){let e=r?Buffer.from(r,`utf8`):Buffer.alloc(0);a=Buffer.alloc(2+e.length),a.writeUInt16BE(n,0),e.copy(a,2)}else r&&(a=Buffer.from(r,`utf8`));let o=w(4),s=a.length,c;s<126?(c=Buffer.alloc(2),c[1]=128|s):s<=65535?(c=Buffer.alloc(4),c[1]=254,c.writeUInt16BE(s,2)):(c=Buffer.alloc(10),c[1]=255,c.writeBigUInt64BE(BigInt(s),2)),c[0]=128|i[e];let l=Buffer.alloc(s);for(let e=0;e<s;e+=1)l[e]=a[e]^o[e%4];return Buffer.concat([c,o,l])}function se(e){if(e.length<2)return null;let t=e[0],n=e[1],r=(t&128)!=0,i=t&15,a=(n&128)!=0,o=n&127,s=2;if(o===126){if(e.length<s+2)return null;o=e.readUInt16BE(s),s+=2}else if(o===127){if(e.length<s+8)return null;let t=e.readBigUInt64BE(s);if(t>BigInt(2**53-1))throw Error(`WebSocket frame payload length exceeds supported limits`);o=Number(t),s+=8}let c=a?e.subarray(s,s+4):null;if(a){if(e.length<s+4)return null;s+=4}if(e.length<s+o)return null;let l=e.subarray(s,s+o),u=Buffer.alloc(l.length);if(a&&c)for(let e=0;e<l.length;e+=1)u[e]=l[e]^c[e%4];else l.copy(u);let d=ae(i);if(!d)throw Error(`Unsupported WebSocket opcode 0x${i.toString(16)}`);let f=null,p=null;return d===`close`&&u.length>=2&&(f=u.readUInt16BE(0),p=u.subarray(2).toString(`utf8`)),{frame:{type:d,fin:r,opcode:i,masked:a,data:u,closeCode:f,closeReason:p,receivedAt:Date.now()},bytesConsumed:s+o}}function Q(e){for(let t of e.waiters)t();e.waiters.clear()}function ce(e,t){return new Promise(n=>{let r=()=>{clearTimeout(i),e.waiters.delete(r),n(!0)},i=setTimeout(()=>{e.waiters.delete(r),n(!1)},t);e.waiters.add(r)})}const le={"3:1":`TLS 1.0`,"3:2":`TLS 1.1`,"3:3":`TLS 1.2`,"3:4":`TLS 1.3`},ue={20:`change_cipher_spec`,21:`alert`,22:`handshake`,23:`application_data`,24:`heartbeat`},de={156:`TLS_RSA_WITH_AES_128_GCM_SHA256`,157:`TLS_RSA_WITH_AES_256_GCM_SHA384`,52392:`TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256`,52393:`TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384`,4865:`TLS_AES_128_GCM_SHA256`,4866:`TLS_AES_256_GCM_SHA384`,4867:`TLS_CHACHA20_POLY1305_SHA256`,4868:`TLS_AES_128_CCM_SHA256`,4869:`TLS_AES_128_CCM_8_SHA256`,49195:`TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256`,49196:`TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384`,49199:`TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256`,49200:`TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384`},fe={0:`server_name`,1:`max_fragment_length`,5:`status_request`,10:`supported_groups`,13:`signature_algorithms`,16:`application_layer_protocol_negotiation`,18:`signed_certificate_timestamp`,23:`record_size_limit`,27:`compress_certificate`,35:`session_ticket`,43:`supported_versions`,44:`cookie`,45:`psk_key_exchange_modes`,49:`post_handshake_auth`,51:`key_share`};function $(e,t){return le[`${e}:${t}`]??`0x${e.toString(16).padStart(2,`0`)}${t.toString(16).padStart(2,`0`)}`}function pe(e){return ue[e]??`unknown`}function me(e){let t={cipherSuites:[],extensions:[]},n=e[0]!==void 0&&e[0]<25?4:0;if(e.length<n+38)return t;let r=n+34,i=e[r]??0,a=r+1+i;if(a+2>e.length)return t;let o=e.readUInt16BE(a);a+=2;let s=a+o;for(;a+2<=s;){let n=e.readUInt16BE(a);t.cipherSuites.push(de[n]??`0x${n.toString(16).padStart(4,`0`)}`),a+=2}if(a=s+1,a<e.length){let t=e[a];t!==void 0&&(a+=1+t)}if(a+2<=e.length){let n=e.readUInt16BE(a);a+=2;let r=a+n;for(;a+4<=r;){let n=e.readUInt16BE(a),i=e.readUInt16BE(a+2);a+=4;let o=fe[n]??`unknown(0x${n.toString(16)})`;if(t.extensions.push({type:n,name:o,length:i}),n===0&&a+2<=r){let n=a+2;if(n+3<=r&&e[n]===0){let i=e.readUInt16BE(n+1),a=n+3;a+i<=r&&(t.serverName=e.subarray(a,a+i).toString(`utf8`))}}a+=i}}return t}var he=class{keyLogExtractor;extensionInvoke;eventBus;tcpSessions=new Map;tlsSessions=new Map;websocketSessions=new Map;constructor(e=new o){this.keyLogExtractor=e}setExtensionInvoke(e){this.extensionInvoke=e}setEventBus(e){this.eventBus=e}getTcpSession(e){return this.tcpSessions.get(e)??null}getTlsSession(e){return this.tlsSessions.get(e)??null}getWebSocketSession(e){return this.websocketSessions.get(e)??null}parseWritePayload(e){let t=p(e,`dataHex`),n=p(e,`dataText`);if(!t&&!n)return{ok:!1,error:`dataHex or dataText is required`};if(t&&n)return{ok:!1,error:`dataHex and dataText are mutually exclusive`};if(t){let e=P(t);return F(e)?{ok:!0,data:Buffer.from(e,`hex`),inputEncoding:`hex`}:{ok:!1,error:`dataHex must be valid even-length hexadecimal data`}}return{ok:!0,data:Buffer.from(n??``,`utf8`),inputEncoding:`utf8`}}async writeBufferedSession(e,t){if(e.socket.destroyed||e.closed)return{ok:!1,error:`Session "${e.id}" is already closed`,sessionId:e.id,kind:e.kind,state:K(e)};let n=this.parseWritePayload(t);if(!n.ok)return{ok:!1,error:n.error,sessionId:e.id,kind:e.kind};let r=m(t,`timeoutMs`)??5e3;return!Number.isFinite(r)||r<=0?{ok:!1,error:`timeoutMs must be a positive number`}:new Promise(t=>{let i=!1,a=n=>{i||(i=!0,clearTimeout(o),e.socket.off(`error`,s),t(n))},o=setTimeout(()=>{a({ok:!1,error:`write timed out`,sessionId:e.id,kind:e.kind,state:K(e)})},r),s=t=>{a({ok:!1,error:t.message,sessionId:e.id,kind:e.kind,state:K(e)})};e.socket.once(`error`,s),e.socket.write(n.data,()=>{e.kind===`tcp`?this.eventBus?.emit(`tcp:session_written`,{sessionId:e.id,byteLength:n.data.length,timestamp:new Date().toISOString()}):this.eventBus?.emit(`tls:session_written`,{sessionId:e.id,byteLength:n.data.length,timestamp:new Date().toISOString()}),a({ok:!0,sessionId:e.id,kind:e.kind,inputEncoding:n.inputEncoding,bytesWritten:n.data.length,transport:G(e.socket),state:K(e)})})})}async readBufferedSessionUntil(e,t){let n=p(t,`delimiterHex`),r=p(t,`delimiterText`);if(n&&r)return{ok:!1,error:`delimiterHex and delimiterText are mutually exclusive`};let i=null;if(n){let e=P(n);if(!F(e))return{ok:!1,error:`delimiterHex must be valid even-length hexadecimal data`};i=Buffer.from(e,`hex`)}else r!==void 0&&(i=Buffer.from(r,`utf8`));if(i&&i.length===0)return{ok:!1,error:`delimiter must not be empty`};let a=g(t,`includeDelimiter`)??!0,o=m(t,`maxBytes`),s=o===void 0?void 0:Math.trunc(o);if(s!==void 0&&(!Number.isFinite(s)||s<=0))return{ok:!1,error:`maxBytes must be a positive integer when provided`};if(!i&&s===void 0)return{ok:!1,error:`delimiterHex, delimiterText, or maxBytes is required`};let c=m(t,`timeoutMs`)??5e3;if(!Number.isFinite(c)||c<=0)return{ok:!1,error:`timeoutMs must be a positive number`};if(e.activeRead)return{ok:!1,error:`Session "${e.id}" already has a pending read`,sessionId:e.id,kind:e.kind,state:K(e)};e.activeRead=!0;let l=Date.now();try{for(;;){let t=ie(e,i,a,s);if(t)return e.kind===`tcp`?this.eventBus?.emit(`tcp:session_read`,{sessionId:e.id,byteLength:t.data.length,matched:t.matchedDelimiter,timestamp:new Date().toISOString()}):this.eventBus?.emit(`tls:session_read`,{sessionId:e.id,byteLength:t.data.length,matched:t.matchedDelimiter,timestamp:new Date().toISOString()}),{ok:!0,sessionId:e.id,kind:e.kind,bytesRead:t.data.length,matchedDelimiter:t.matchedDelimiter,stopReason:t.stopReason,delimiterHex:t.delimiterHex,dataHex:t.data.toString(`hex`).toUpperCase(),dataText:t.data.toString(`utf8`),elapsedMs:Date.now()-l,state:K(e)};if(e.error)return{ok:!1,error:e.error,sessionId:e.id,kind:e.kind,state:K(e)};if(e.ended||e.closed)return{ok:!1,error:`socket closed before the requested read condition was satisfied`,sessionId:e.id,kind:e.kind,state:K(e)};let n=c-(Date.now()-l);if(n<=0||!await re(e,n))return{ok:!1,error:`read timed out`,sessionId:e.id,kind:e.kind,state:K(e)}}}finally{e.activeRead=!1}}async closeBufferedSession(e,t,n,r){let i=t.get(e);if(!i)return{ok:!1,error:`Unknown ${n} sessionId "${e}"`};let a=g(r,`force`)??!1,o=m(r,`timeoutMs`)??1e3;if(!Number.isFinite(o)||o<=0)return{ok:!1,error:`timeoutMs must be a positive number`};let s=i.buffer.length;return i.closed||i.socket.destroyed?(t.delete(e),{ok:!0,sessionId:e,kind:n,force:a,closed:!0,bufferedBytesDiscarded:s,state:K(i)}):new Promise(r=>{let c=!1,l=o=>{c||(c=!0,clearTimeout(f),i.socket.off(`close`,u),i.socket.off(`error`,d),t.delete(e),n===`tcp`?this.eventBus?.emit(`tcp:session_closed`,{sessionId:e,reason:i.error,timestamp:new Date().toISOString()}):this.eventBus?.emit(`tls:session_closed`,{sessionId:e,reason:i.error,timestamp:new Date().toISOString()}),r({ok:!0,sessionId:e,kind:n,force:a,closed:o,bufferedBytesDiscarded:s,state:K(i)}))},u=()=>l(!0),d=()=>l(i.socket.destroyed||i.closed),f=setTimeout(()=>{i.socket.destroy(),l(i.socket.destroyed||i.closed)},o);if(i.socket.once(`close`,u),i.socket.once(`error`,d),a){i.socket.destroy();return}i.socket.end()})}};const ge=new Set([`all`,`1.3`,`1.2`]);var _e=class extends he{async handleTlsKeylogEnable(e){let t=await this.keyLogExtractor.enableKeyLog();return{enabled:!0,keyLogPath:t,environmentVariable:`SSLKEYLOGFILE`,scope:`node-process`,browserLaunch:{flag:`--ssl-key-log=${t}`,hint:`Env var covers Node-side TLS only. To keylog a CDP-driven browser, relaunch via browser_launch with sslKeyLogFile set (or pass this flag in args) so the browser emits TLS secrets to the same path.`}}}async handleTlsKeylogDisable(e){let t=p(e,`path`)??null;return t?await this.keyLogExtractor.disableKeyLog():d(),{disabled:!0,previousPath:t??s()}}async handleTlsKeylogParse(e){let t=p(e,`path`)??null,n=this.keyLogExtractor.parseKeyLog(t??void 0),r=this.keyLogExtractor.summarizeKeyLog(t??void 0);return{path:t??this.keyLogExtractor.getKeyLogFilePath(),entries:n,summary:r}}async handleTlsDecryptPayload(e){let t=p(e,`encryptedHex`)??null,n=p(e,`keyHex`)??null,r=p(e,`nonceHex`)??null,i=p(e,`algorithm`)??`aes-256-gcm`,a=p(e,`authTagHex`)??null;if(!t||!n||!r)return{ok:!1,error:`encryptedHex, keyHex, and nonceHex are required`};let o=l(t,n,r,i,a??void 0);return{ok:!0,algorithm:i,decrypted:o,isFailed:o.startsWith(`DECRYPTION_FAILED:`)}}async handleTlsKeylogSummarize(e){let t=p(e,`content`)??null,r=p(e,`path`)??null,o,s,c;if(t)o=i(t);else{o=this.keyLogExtractor.parseKeyLog(r??void 0);let e=this.keyLogExtractor.summarizeKeyLog(r??void 0);s=e.firstSeen,c=e.lastSeen}let l=a(o),u=n(o);return{totalEntries:l.totalEntries,labels:l.labels,uniqueClientRandom:l.uniqueClients,...s||c?{firstSeen:s,lastSeen:c}:{},classification:u}}async handleTlsKeylogLookupSecret(e){let t=p(e,`clientRandom`)??null,n=p(e,`label`)??void 0;if(!t)return{ok:!1,error:`clientRandom is required`};let r=this.keyLogExtractor.lookupSecret(t);if(r)return{ok:!0,clientRandom:P(t),secret:r};let i=f(this.keyLogExtractor.parseKeyLog(),t,n);return{ok:i!==null,clientRandom:P(t),secret:i??null}}async handleTlsCertPinBypass(e){let t=p(e,`target`)??null;return t!==`android`&&t!==`ios`&&t!==`desktop`?{error:`target must be one of android, ios, or desktop`}:{bypassStrategy:{android:`hook-trust-manager`,ios:`replace-sec-trust-evaluation`,desktop:`patch-custom-verifier`}[t],affectedDomains:[`*`],instructions:{android:[`Inject a Frida script that overrides X509TrustManager checks.`,`Re-run the target flow after SSLKEYLOGFILE capture is enabled.`],ios:[`Hook SecTrustEvaluateWithError and return success for the target session.`,`Collect TLS keys after the app resumes the failing request.`],desktop:[`Patch the custom verifier callback or disable pin comparison in the client.`,`Capture a fresh handshake after the patched build starts.`]}[t]}}async handleParseHandshake(e){let n=p(e,`rawHex`)??null;if(!n)return t({success:!1,error:`rawHex is required`});let r=P(n);if(!/^(?:[0-9a-f]{2})+$/i.test(r))return t({success:!1,error:`Invalid hex payload`});let i=Buffer.from(r,`hex`);if(i.length<5)return t({success:!1,error:`TLS record is too short`});let a=i[0],o=i[1],s=i[2],c=i.readUInt16BE(3),l=i.subarray(5),u=a===22&&l.length>0&&l[0]===1?me(l):void 0;return t({success:!0,record:{contentType:a,contentTypeName:pe(a),version:$(o,s),declaredLength:c,actualLength:l.length},handshake:{version:$(o,s),contentType:pe(a),...u?{type:`client_hello`,serverName:u.serverName,cipherSuites:u.cipherSuites,extensions:u.extensions}:{cipherSuite:[],extensions:[]}},sni:u?.serverName?{serverName:u.serverName}:void 0})}async handleKeyLogEnable(n){let i=p(n,`filePath`)??e;return r(i),this.eventBus?.emit(`tls:keylog_started`,{filePath:i,timestamp:new Date().toISOString()}),t({success:!0,filePath:i,currentFilePath:s()})}async handleCipherSuites(e){let n=p(e,`filter`)??null,r=_(e,`protocol`,ge,`all`),i=u().map(e=>c(e));if(r===`1.3`||r===`1.2`){let e=r===`1.3`?`TLS1.3`:`TLS1.2`;i=i.filter(t=>t.protocol===e)}if(n){let e=n.toLowerCase();i=i.filter(t=>t.name.toLowerCase().includes(e))}return t({success:!0,filter:n,protocol:r,total:i.length,suites:i})}async handleParseCertificate(e){let n=p(e,`rawHex`)??null;if(!n)return t({success:!1,error:`rawHex is required`});let r=ne(n);return t({success:!0,certificateCount:r.length,certificates:r,fingerprints:r.map(e=>({sha256:e.sha256,length:e.length,publicKeySpkiSha256:e.publicKeySpkiSha256}))})}};const ve=[`TLSv1`,`TLSv1.1`,`TLSv1.2`,`TLSv1.3`];var ye=class extends _e{async handleTlsProbeEndpoint(e){let t=p(e,`host`)?.trim()??null;if(!t)return{ok:!1,error:`host is required`};let n=m(e,`port`)??443;if(!Number.isInteger(n)||n<1||n>65535)return{ok:!1,error:`port must be an integer between 1 and 65535`};let r=m(e,`timeoutMs`)??5e3;if(!Number.isFinite(r)||r<=0)return{ok:!1,error:`timeoutMs must be a positive number`};let i=g(e,`allowInvalidCertificates`)??!1,a=g(e,`skipHostnameCheck`)??!1,o=p(e,`servername`)?.trim()??null,s=[...new Set(h(e,`alpnProtocols`).map(e=>e.trim()))].filter(e=>e.length>0),c,l;try{c=_(e,`minVersion`,M),l=_(e,`maxVersion`,M)}catch(e){return{ok:!1,error:N(e)}}if(c&&l&&ve.indexOf(c)>ve.indexOf(l))return{ok:!1,error:`minVersion must not be greater than maxVersion`};let u=I(t);if(u)return u;let d=await B(e);if(!d.ok)return{ok:!1,error:d.error};let f=o??t,v=o??(k(t)===0?t:void 0),y=Date.now();return new Promise(e=>{let o=!1,u=j(z({host:t,port:n,servername:v,...c?{minVersion:c}:{},...l?{maxVersion:l}:{},...s.length>0?{ALPNProtocols:s}:{},...d.ca?{ca:d.ca}:{}},i)),p=t=>{o||(o=!0,clearTimeout(m),u.removeAllListeners(),u.destroy(),e(t))},m=setTimeout(()=>{this.eventBus?.emit(`tls:probe_completed`,{host:t,port:n,success:!1,timestamp:new Date().toISOString()}),p({ok:!1,error:`TLS probe timed out`,target:{host:t,port:n,requestedServername:v??null,validationTarget:f},policy:{allowInvalidCertificates:i,skipHostnameCheck:a,timeoutMs:r,minVersion:c??null,maxVersion:l??null,alpnProtocols:s,customCa:{source:d.source,path:d.path,bytes:d.bytes}}})},r);u.once(`error`,e=>{this.eventBus?.emit(`tls:probe_completed`,{host:t,port:n,success:!1,timestamp:new Date().toISOString()}),p({ok:!1,error:e.message,errorCode:e.code??null,target:{host:t,port:n,requestedServername:v??null,validationTarget:f},policy:{allowInvalidCertificates:i,skipHostnameCheck:a,timeoutMs:r,minVersion:c??null,maxVersion:l??null,alpnProtocols:s,customCa:{source:d.source,path:d.path,bytes:d.bytes}}})}),u.once(`secureConnect`,()=>{let e=Date.now()-y,o=u.getPeerCertificate(!0),m=H(o),h=m?U(o):[],g=h[0]??null,_=a||!m?void 0:A(f,o),b={checked:!a,target:a?null:f,matched:a?null:_===void 0,error:!a&&!m?`Peer certificate was not presented by the server`:_?.message??null},x=[u.authorized?`Certificate chain validated against the active trust store.`:`Certificate chain validation failed: ${u.authorizationError??`unknown_authority`}`,a?`Hostname validation was skipped by request.`:b.matched?`Hostname validation passed.`:`Hostname validation failed: ${b.error??`unknown_error`}`,!u.authorized&&i?`Policy allowed the probe to continue despite certificate trust failure.`:null].filter(e=>!!e),S=u.getCipher();this.eventBus?.emit(`tls:probe_completed`,{host:t,port:n,success:!0,timestamp:new Date().toISOString()}),p({ok:!0,target:{host:t,port:n,requestedServername:v??null,validationTarget:f},policy:{allowInvalidCertificates:i,skipHostnameCheck:a,timeoutMs:r,minVersion:c??null,maxVersion:l??null,alpnProtocols:s,customCa:{source:d.source,path:d.path,bytes:d.bytes}},transport:{protocol:u.getProtocol()??null,alpnProtocol:R(u.alpnProtocol),cipher:{name:S.name,standardName:S.standardName,version:S.version},localAddress:u.localAddress??null,localPort:u.localPort??null,remoteAddress:u.remoteAddress??null,remotePort:u.remotePort??null,servernameSent:L(u.servername),sessionReused:u.isSessionReused()},authorization:{socketAuthorized:u.authorized,authorizationError:typeof u.authorizationError==`string`?u.authorizationError:u.authorizationError?.message??null,hostnameValidation:b,policyAllowed:(u.authorized||i)&&(a||b.matched===!0),reasons:x},certificates:{leaf:g,chain:h},timing:{handshakeMs:e}})})})}};const be=[`TLSv1`,`TLSv1.1`,`TLSv1.2`,`TLSv1.3`];var xe=class extends ye{async handleTcpOpen(e){let t=p(e,`host`)??`127.0.0.1`,n=m(e,`port`);if(n===void 0||!Number.isInteger(n)||n<1||n>65535)return{ok:!1,error:`port must be an integer between 1 and 65535`};let r=m(e,`timeoutMs`)??5e3;if(!Number.isFinite(r)||r<=0)return{ok:!1,error:`timeoutMs must be a positive number`};let i=g(e,`noDelay`)??!0;return I(t)||new Promise(e=>{let a=!1,o=new D,s=t=>{a||(a=!0,clearTimeout(c),o.off(`connect`,u),o.off(`error`,l),e(t))},c=setTimeout(()=>{o.destroy(),s({ok:!1,error:`TCP connect timed out`,target:{host:t,port:n}})},r),l=e=>{s({ok:!1,error:e.message,target:{host:t,port:n}})},u=()=>{o.setNoDelay(i);let e=W(`tcp`),r={id:e,kind:`tcp`,socket:o,host:t,port:n,createdAt:Date.now(),buffer:Buffer.alloc(0),ended:!1,closed:!1,error:null,waiters:new Set,activeRead:!1};J(r),this.tcpSessions.set(e,r),this.eventBus?.emit(`tcp:session_opened`,{sessionId:e,host:t,port:n,timestamp:new Date().toISOString()}),s({ok:!0,sessionId:e,kind:`tcp`,target:{host:t,port:n},createdAt:new Date(r.createdAt).toISOString(),transport:G(o),state:K(r)})};o.once(`connect`,u),o.once(`error`,l),o.connect(n,t)})}async handleTcpWrite(e){let t=p(e,`sessionId`)?.trim()??null;if(!t)return{ok:!1,error:`sessionId is required`};let n=this.getTcpSession(t);return n?this.writeBufferedSession(n,e):{ok:!1,error:`Unknown tcp sessionId "${t}"`}}async handleTcpReadUntil(e){let t=p(e,`sessionId`)?.trim()??null;if(!t)return{ok:!1,error:`sessionId is required`};let n=this.getTcpSession(t);return n?this.readBufferedSessionUntil(n,e):{ok:!1,error:`Unknown tcp sessionId "${t}"`}}async handleTcpClose(e){let t=p(e,`sessionId`)?.trim()??null;return t?this.closeBufferedSession(t,this.tcpSessions,`tcp`,e):{ok:!1,error:`sessionId is required`}}async handleTlsOpen(e){let t=p(e,`host`)?.trim()??null;if(!t)return{ok:!1,error:`host is required`};let n=m(e,`port`)??443;if(!Number.isInteger(n)||n<1||n>65535)return{ok:!1,error:`port must be an integer between 1 and 65535`};let r=m(e,`timeoutMs`)??5e3;if(!Number.isFinite(r)||r<=0)return{ok:!1,error:`timeoutMs must be a positive number`};let i=g(e,`allowInvalidCertificates`)??!1,a=g(e,`skipHostnameCheck`)??!1,o=p(e,`servername`)?.trim()??null,s=[...new Set(h(e,`alpnProtocols`).map(e=>e.trim()))].filter(e=>e.length>0),c,l;try{c=_(e,`minVersion`,M),l=_(e,`maxVersion`,M)}catch(e){return{ok:!1,error:N(e)}}if(c&&l&&be.indexOf(c)>be.indexOf(l))return{ok:!1,error:`minVersion must not be greater than maxVersion`};let u=I(t);if(u)return u;let d=await B(e);if(!d.ok)return{ok:!1,error:d.error};let f={host:t,port:n,requestedServername:o??(k(t)===0?t:void 0)??null,validationTarget:o??t},v={allowInvalidCertificates:i,skipHostnameCheck:a,timeoutMs:r,minVersion:c??null,maxVersion:l??null,alpnProtocols:s,customCa:{source:d.source,path:d.path,bytes:d.bytes}},y=Date.now();return new Promise(e=>{let o=!1,u=j(z({host:t,port:n,servername:f.requestedServername??void 0,...c?{minVersion:c}:{},...l?{maxVersion:l}:{},...s.length>0?{ALPNProtocols:s}:{},...d.ca?{ca:d.ca}:{}},i)),p=t=>{o||(o=!0,clearTimeout(m),u.off(`error`,h),u.off(`secureConnect`,g),e(t))},m=setTimeout(()=>{u.destroy(),this.eventBus?.emit(`tls:probe_completed`,{host:t,port:n,success:!1,timestamp:new Date().toISOString()}),p({ok:!1,error:`TLS open timed out`,target:f,policy:v})},r),h=e=>{this.eventBus?.emit(`tls:probe_completed`,{host:t,port:n,success:!1,timestamp:new Date().toISOString()}),p({ok:!1,error:e.message,errorCode:e.code??null,target:f,policy:v})},g=()=>{let e=Date.now()-y,r=u.getPeerCertificate(!0),o=H(r),s=o?U(r):[],c=s[0]??null,l=a||!o?void 0:A(f.validationTarget,r),d={checked:!a,target:a?null:f.validationTarget,matched:a?null:l===void 0,error:!a&&!o?`Peer certificate was not presented by the server`:l?.message??null},m=[u.authorized?`Certificate chain validated against the active trust store.`:`Certificate chain validation failed: ${u.authorizationError??`unknown_authority`}`,a?`Hostname validation was skipped by request.`:d.matched?`Hostname validation passed.`:`Hostname validation failed: ${d.error??`unknown_error`}`,!u.authorized&&i?`Policy allowed the session to continue despite certificate trust failure.`:null].filter(e=>!!e),h=u.getCipher(),g={target:f,policy:v,transport:{protocol:u.getProtocol()??null,alpnProtocol:R(u.alpnProtocol),cipher:{name:h.name,standardName:h.standardName,version:h.version},localAddress:u.localAddress??null,localPort:u.localPort??null,remoteAddress:u.remoteAddress??null,remotePort:u.remotePort??null,servernameSent:L(u.servername),sessionReused:u.isSessionReused()},authorization:{socketAuthorized:u.authorized,authorizationError:typeof u.authorizationError==`string`?u.authorizationError:u.authorizationError?.message??null,hostnameValidation:d,policyAllowed:(u.authorized||i)&&(a||d.matched===!0),reasons:m},certificates:{leaf:c,chain:s}};if(!g.authorization.policyAllowed){u.destroy(),this.eventBus?.emit(`tls:probe_completed`,{host:t,port:n,success:!1,timestamp:new Date().toISOString()}),p({ok:!1,error:`TLS session authorization failed`,...g,timing:{handshakeMs:e}});return}let _=W(`tls`),b={id:_,kind:`tls`,socket:u,host:t,port:n,createdAt:Date.now(),buffer:Buffer.alloc(0),ended:!1,closed:!1,error:null,waiters:new Set,activeRead:!1,metadata:g};J(b),this.tlsSessions.set(_,b),this.eventBus?.emit(`tls:session_opened`,{sessionId:_,host:t,port:n,timestamp:new Date().toISOString()}),this.eventBus?.emit(`tls:probe_completed`,{host:t,port:n,success:!0,timestamp:new Date().toISOString()}),p({ok:!0,sessionId:_,kind:`tls`,...g,timing:{handshakeMs:e},state:K(b)})};u.once(`error`,h),u.once(`secureConnect`,g)})}async handleTlsWrite(e){let t=p(e,`sessionId`)?.trim()??null;if(!t)return{ok:!1,error:`sessionId is required`};let n=this.getTlsSession(t);return n?this.writeBufferedSession(n,e):{ok:!1,error:`Unknown tls sessionId "${t}"`}}async handleTlsReadUntil(e){let t=p(e,`sessionId`)?.trim()??null;if(!t)return{ok:!1,error:`sessionId is required`};let n=this.getTlsSession(t);return n?this.readBufferedSessionUntil(n,e):{ok:!1,error:`Unknown tls sessionId "${t}"`}}async handleTlsClose(e){let t=p(e,`sessionId`)?.trim()??null;return t?this.closeBufferedSession(t,this.tlsSessions,`tls`,e):{ok:!1,error:`sessionId is required`}}},Se=class extends xe{emitWebSocketEvent(e,t){this.eventBus?.emit(e,t)}attachWebSocketSession(e){let t=()=>{for(;e.parserBuffer.length>0;){let t;try{t=se(e.parserBuffer)}catch(t){e.error=N(t),e.socket.destroy();break}if(!t)break;e.parserBuffer=e.parserBuffer.subarray(t.bytesConsumed);let n=t.frame;if(e.frames.push(n),n.type===`ping`&&!e.closeSent&&!e.socket.destroyed){let t=Z(`pong`,n.data);e.socket.write(t),this.emitWebSocketEvent(`websocket:session_written`,{sessionId:e.id,frameType:`pong`,byteLength:n.data.length,automatic:!0,timestamp:new Date().toISOString()})}n.type===`close`&&(e.closeReceived=!0,!e.closeSent&&!e.socket.destroyed&&(e.closeSent=!0,e.socket.write(Z(`close`,n.data,n.closeCode,n.closeReason)),this.emitWebSocketEvent(`websocket:session_written`,{sessionId:e.id,frameType:`close`,byteLength:n.data.length,automatic:!0,timestamp:new Date().toISOString()})))}Q(e)};e.socket.on(`data`,n=>{e.parserBuffer=Buffer.concat([e.parserBuffer,n]),t()}),e.socket.on(`end`,()=>{e.ended=!0,Q(e)}),e.socket.on(`close`,()=>{e.closed=!0,Q(e)}),e.socket.on(`error`,t=>{e.error=t.message,Q(e)}),t()}async readWebSocketFrame(e,t){let n=m(t,`timeoutMs`)??5e3;if(!Number.isFinite(n)||n<=0)return{ok:!1,error:`timeoutMs must be a positive number`};if(e.activeRead)return{ok:!1,error:`Session "${e.id}" already has a pending read`,sessionId:e.id,kind:e.kind,state:Y(e)};e.activeRead=!0;let r=Date.now();try{for(;;){let t=e.frames.shift();if(t)return this.emitWebSocketEvent(`websocket:frame_read`,{sessionId:e.id,frameType:t.type,byteLength:t.data.length,timestamp:new Date().toISOString()}),{ok:!0,sessionId:e.id,kind:e.kind,scheme:e.scheme,frameType:t.type,fin:t.fin,opcode:t.opcode,masked:t.masked,byteLength:t.data.length,dataHex:t.data.toString(`hex`).toUpperCase(),dataText:t.type===`binary`?null:t.data.toString(`utf8`),closeCode:t.closeCode,closeReason:t.closeReason,elapsedMs:Date.now()-r,state:Y(e)};if(e.error)return{ok:!1,error:e.error,sessionId:e.id,kind:e.kind,state:Y(e)};if(e.closed||e.ended)return{ok:!1,error:`socket closed before a WebSocket frame was available`,sessionId:e.id,kind:e.kind,state:Y(e)};let i=n-(Date.now()-r);if(i<=0||!await ce(e,i))return{ok:!1,error:`read timed out`,sessionId:e.id,kind:e.kind,state:Y(e)}}}finally{e.activeRead=!1}}async sendWebSocketFrame(e,t){if(e.closed||e.socket.destroyed)return{ok:!1,error:`Session "${e.id}" is already closed`,sessionId:e.id,kind:e.kind,state:Y(e)};let n=_(t,`frameType`,new Set([`text`,`binary`,`ping`,`pong`,`close`]));if(!n)return{ok:!1,error:`frameType is required`};let r=p(t,`dataHex`),i=p(t,`dataText`);if(r&&i)return{ok:!1,error:`dataHex and dataText are mutually exclusive`};let a=m(t,`timeoutMs`)??5e3;if(!Number.isFinite(a)||a<=0)return{ok:!1,error:`timeoutMs must be a positive number`};let o=Buffer.alloc(0);if(r){let e=P(r);if(!F(e))return{ok:!1,error:`dataHex must be valid even-length hexadecimal data`};o=Buffer.from(e,`hex`)}else i!==void 0&&(o=Buffer.from(i,`utf8`));let s=null,c=null;if(n===`close`){let n=m(t,`closeCode`);if(n!==void 0){if(!Number.isInteger(n)||n<1e3||n>4999)return{ok:!1,error:`closeCode must be an integer between 1000 and 4999`};s=n}if(c=p(t,`closeReason`)??null,r||i)return{ok:!1,error:`close frames use closeCode/closeReason instead of dataHex/dataText`};e.closeSent=!0}if(n===`text`&&r)return{ok:!1,error:`text frames require UTF-8 dataText instead of dataHex`};let l=Z(n,o,s,c);return new Promise(t=>{let r=!1,i=n=>{r||(r=!0,clearTimeout(u),e.socket.off(`error`,d),t(n))},u=setTimeout(()=>{i({ok:!1,error:`write timed out`,sessionId:e.id,kind:e.kind,state:Y(e)})},a),d=t=>{i({ok:!1,error:t.message,sessionId:e.id,kind:e.kind,state:Y(e)})};e.socket.once(`error`,d),e.socket.write(l,()=>{this.emitWebSocketEvent(`websocket:session_written`,{sessionId:e.id,frameType:n,byteLength:n===`close`?c?Buffer.byteLength(c)+2:s?2:0:o.length,automatic:!1,timestamp:new Date().toISOString()}),i({ok:!0,sessionId:e.id,kind:e.kind,scheme:e.scheme,frameType:n,bytesWritten:l.length,payloadBytes:n===`close`?c?Buffer.byteLength(c)+2:s?2:0:o.length,state:Y(e)})})})}async closeWebSocketSession(e,t){let n=this.websocketSessions.get(e);if(!n)return{ok:!1,error:`Unknown websocket sessionId "${e}"`};let r=g(t,`force`)??!1,i=m(t,`timeoutMs`)??1e3;if(!Number.isFinite(i)||i<=0)return{ok:!1,error:`timeoutMs must be a positive number`};let a=n.frames.length;if(n.closed||n.socket.destroyed)return this.websocketSessions.delete(e),{ok:!0,sessionId:e,kind:n.kind,force:r,closed:!0,queuedFramesDiscarded:a,state:Y(n)};let o=null,s=m(t,`closeCode`);if(s!==void 0){if(!Number.isInteger(s)||s<1e3||s>4999)return{ok:!1,error:`closeCode must be an integer between 1000 and 4999`};o=s}let c=p(t,`closeReason`)??null;return new Promise(t=>{let s=!1,l=i=>{s||(s=!0,clearTimeout(f),n.socket.off(`close`,u),n.socket.off(`error`,d),this.websocketSessions.delete(e),this.emitWebSocketEvent(`websocket:session_closed`,{sessionId:e,reason:n.error,timestamp:new Date().toISOString()}),t({ok:!0,sessionId:e,kind:n.kind,force:r,closed:i,queuedFramesDiscarded:a,state:Y(n)}))},u=()=>l(!0),d=()=>l(n.socket.destroyed||n.closed),f=setTimeout(()=>{n.socket.destroy(),l(n.socket.destroyed||n.closed)},i);if(n.socket.once(`close`,u),n.socket.once(`error`,d),r){n.socket.destroy();return}n.closeSent||(n.closeSent=!0,n.socket.write(Z(`close`,Buffer.alloc(0),o,c)),this.emitWebSocketEvent(`websocket:session_written`,{sessionId:e,frameType:`close`,byteLength:c?Buffer.byteLength(c)+2:o?2:0,automatic:!1,timestamp:new Date().toISOString()}))})}async handleWebSocketSendFrame(e){let t=p(e,`sessionId`)?.trim()??null;if(!t)return{ok:!1,error:`sessionId is required`};let n=this.getWebSocketSession(t);return n?this.sendWebSocketFrame(n,e):{ok:!1,error:`Unknown websocket sessionId "${t}"`}}async handleWebSocketReadFrame(e){let t=p(e,`sessionId`)?.trim()??null;if(!t)return{ok:!1,error:`sessionId is required`};let n=this.getWebSocketSession(t);return n?this.readWebSocketFrame(n,e):{ok:!1,error:`Unknown websocket sessionId "${t}"`}}async handleWebSocketClose(e){let t=p(e,`sessionId`)?.trim()??null;return t?this.closeWebSocketSession(t,e):{ok:!1,error:`sessionId is required`}}};const Ce=[`TLSv1`,`TLSv1.1`,`TLSv1.2`,`TLSv1.3`];var we=class extends Se{async handleWebSocketOpen(e){let t=p(e,`url`)?.trim()??null,n=p(e,`host`)?.trim()??null,r=p(e,`path`)?.trim()??null,i=m(e,`port`),a=p(e,`scheme`)?.trim()??null;if(t&&(n||r||i!==void 0||a))return{ok:!1,error:`url is mutually exclusive with explicit scheme/host/port/path inputs`};let o=`ws`,s=n,c=i??void 0,l=X(r),u;if(t){let e;try{e=new URL(t)}catch(e){return{ok:!1,error:`Invalid url: ${N(e)}`}}if(e.protocol!==`ws:`&&e.protocol!==`wss:`)return{ok:!1,error:`url must use ws:// or wss:// protocol`};o=e.protocol===`wss:`?`wss`:`ws`,s=e.hostname,c=e.port.length>0?Number(e.port):o===`wss`?443:80,l=X(`${e.pathname}${e.search}`),u=`${o}://${e.host}${l}`}else{if(!s)return{ok:!1,error:`host or url is required`};if(a){if(a!==`ws`&&a!==`wss`)return{ok:!1,error:`scheme must be ws or wss`};o=a}c??=o===`wss`?443:80;let e=c===(o===`wss`?443:80)?s:`${s}:${String(c)}`;u=`${o}://${e}${l}`}if(!s||!c||!Number.isInteger(c)||c<1||c>65535)return{ok:!1,error:`port must be an integer between 1 and 65535`};let d=m(e,`timeoutMs`)??5e3;if(!Number.isFinite(d)||d<=0)return{ok:!1,error:`timeoutMs must be a positive number`};let f=[...new Set(h(e,`subprotocols`).map(e=>e.trim()))].filter(e=>e.length>0),v=I(s);if(v)return v;let y=g(e,`allowInvalidCertificates`)??!1,b=g(e,`skipHostnameCheck`)??!1,x=p(e,`servername`)?.trim()??null,S=[...new Set(h(e,`alpnProtocols`).map(e=>e.trim()))].filter(e=>e.length>0),C,T;try{C=_(e,`minVersion`,M),T=_(e,`maxVersion`,M)}catch(e){return{ok:!1,error:N(e)}}if(C&&T&&Ce.indexOf(C)>Ce.indexOf(T))return{ok:!1,error:`minVersion must not be greater than maxVersion`};let E=o===`wss`?await B(e):{ok:!0,ca:void 0,source:null,path:null,bytes:null};if(!E.ok)return{ok:!1,error:E.error};let O={scheme:o,url:u,host:s,port:c,path:l,requestedServername:o===`wss`?x??(k(s)===0?s:void 0)??null:null,validationTarget:o===`wss`?x??s:null},P=w(16).toString(`base64`),F=oe(P),V=Date.now();return new Promise(e=>{let t=!1,n=Buffer.alloc(0),r=null,i=null,a=null,u=o===`wss`?j(z({host:s,port:c,servername:O.requestedServername??void 0,...C?{minVersion:C}:{},...T?{maxVersion:T}:{},...S.length>0?{ALPNProtocols:S}:{},...E.ca?{ca:E.ca}:{}},y)):new D,p=n=>{t||(t=!0,clearTimeout(h),u.off(`error`,g),u.off(`connect`,v),u.off(`secureConnect`,x),u.off(`data`,w),e(n))},m=()=>{let e=c===(o===`wss`?443:80)?s:`${s}:${String(c)}`,t=[`GET ${l} HTTP/1.1`,`Host: ${e}`,`Upgrade: websocket`,`Connection: Upgrade`,`Sec-WebSocket-Key: ${P}`,`Sec-WebSocket-Version: 13`];return f.length>0&&t.push(`Sec-WebSocket-Protocol: ${f.join(`, `)}`),t.push(``,``),Buffer.from(t.join(`\r
2
+ `),`utf8`)},h=setTimeout(()=>{u.destroy(),p({ok:!1,error:`WebSocket open timed out`,target:O})},d),g=e=>{p({ok:!1,error:e.message,errorCode:e.code??null,target:O})},_=()=>{u.write(m())},v=()=>{u instanceof D&&u.setNoDelay(!0),r={...G(u),protocol:null,alpnProtocol:null,servernameSent:null,sessionReused:null},_()},x=()=>{let e=u,t=e.getPeerCertificate(!0),n=H(t),o=n?U(t):[],s=o[0]??null,c=b||!n||!O.validationTarget?void 0:A(O.validationTarget,t),l={checked:!b,target:b?null:O.validationTarget,matched:b?null:c===void 0,error:!b&&!n?`Peer certificate was not presented by the server`:c?.message??null},d=[e.authorized?`Certificate chain validated against the active trust store.`:`Certificate chain validation failed: ${e.authorizationError??`unknown_authority`}`,b?`Hostname validation was skipped by request.`:l.matched?`Hostname validation passed.`:`Hostname validation failed: ${l.error??`unknown_error`}`,!e.authorized&&y?`Policy allowed the session to continue despite certificate trust failure.`:null].filter(e=>!!e);if(i={socketAuthorized:e.authorized,authorizationError:typeof e.authorizationError==`string`?e.authorizationError:e.authorizationError?.message??null,hostnameValidation:l,policyAllowed:(e.authorized||y)&&(b||l.matched===!0),reasons:d},a={leaf:s,chain:o},r={...G(e),protocol:e.getProtocol()??null,alpnProtocol:R(e.alpnProtocol),servernameSent:L(e.servername),sessionReused:e.isSessionReused()},!i.policyAllowed){e.destroy(),p({ok:!1,error:`WebSocket TLS authorization failed`,target:O,authorization:i,certificates:a});return}_()},w=e=>{n=Buffer.concat([n,e]);let t=n.indexOf(`\r
3
+ \r
4
+ `);if(t<0)return;let d=n.subarray(0,t).toString(`utf8`).split(`\r
5
+ `),m=d.shift()??``;if(!/^HTTP\/1\.1 101\b/.test(m)){u.destroy(),p({ok:!1,error:`Unexpected WebSocket upgrade response: ${m}`,target:O});return}let h=new Map;for(let e of d){let t=e.indexOf(`:`);if(t<=0)continue;let n=e.slice(0,t).trim().toLowerCase(),r=e.slice(t+1).trim();h.set(n,r)}let g=h.get(`upgrade`)?.toLowerCase()??``,_=h.get(`connection`)?.toLowerCase()??``,v=h.get(`sec-websocket-accept`)??null;if(g!==`websocket`){u.destroy(),p({ok:!1,error:`Upgrade header did not confirm websocket`,target:O});return}if(!_.split(`,`).map(e=>e.trim()).includes(`upgrade`)){u.destroy(),p({ok:!1,error:`Connection header did not confirm upgrade`,target:O});return}if(v!==F){u.destroy(),p({ok:!1,error:`sec-websocket-accept did not match the client key`,target:O});return}let y=h.get(`sec-websocket-protocol`)??null;if(y&&!f.includes(y)){u.destroy(),p({ok:!1,error:`Server selected unexpected subprotocol "${y}"`,target:O});return}let b=W(`websocket`),x={id:b,kind:`websocket`,scheme:o,socket:u,host:s,port:c,path:l,createdAt:Date.now(),parserBuffer:n.subarray(t+4),frames:[],ended:!1,closed:!1,error:null,waiters:new Set,activeRead:!1,closeSent:!1,closeReceived:!1,metadata:{target:O,handshake:{requestKey:P,acceptKey:F,responseAcceptKey:v,subprotocol:y},transport:r??{...G(u),protocol:null,alpnProtocol:null,servernameSent:null,sessionReused:null},authorization:i,certificates:a}};this.attachWebSocketSession(x),this.websocketSessions.set(b,x),this.emitWebSocketEvent(`websocket:session_opened`,{sessionId:b,scheme:o,host:s,port:c,path:l,timestamp:new Date().toISOString()}),p({ok:!0,sessionId:b,kind:x.kind,scheme:o,target:O,handshake:x.metadata.handshake,transport:x.metadata.transport,authorization:x.metadata.authorization,certificates:x.metadata.certificates,timing:{handshakeMs:Date.now()-V},state:Y(x)})};u.once(`error`,g),u.on(`data`,w),o===`wss`?u.once(`secureConnect`,x):(u.once(`connect`,v),u.connect(c,s))})}async handleBypassCertPinning(e){if(this.extensionInvoke)try{let n=await this.extensionInvoke(e);if(n)return t({success:!0,strategy:`frida-injection`,result:n})}catch{}return t({success:!0,strategy:`manual-bypass`,instructions:{android:[`Use Frida to hook X509TrustManager.checkServerTrusted and return without throwing.`,`Alternatively, use OkHttp CertificatePinner.Builder().add() with the target cert.`],ios:[`Hook SecTrustEvaluateWithError to always return true.`,`Or use SSLSetSessionOption to disable certificate validation.`],desktop:[`Set NODE_TLS_REJECT_UNAUTHORIZED=0 for Node.js targets.`,`Or patch the certificate comparison function in the HTTP client.`]},args:e})}},Te=class extends we{async handleRawTcpSend(e){let t=p(e,`host`)??`127.0.0.1`,n=m(e,`port`);if(n===void 0||n<1||n>65535)return{ok:!1,error:`port must be a number between 1 and 65535`};let r=I(t);if(r)return r;let i=p(e,`dataHex`),a=p(e,`dataText`);if(!i&&!a)return{ok:!1,error:`dataHex or dataText is required`};let o=i?Buffer.from(P(i),`hex`):Buffer.from(a??``,`utf8`),s=m(e,`timeout`)??5e3;return new Promise(e=>{let r=new D,i=setTimeout(()=>{r.destroy(),e({ok:!1,error:`Connection timed out`})},s);r.on(`connect`,()=>{r.write(o,()=>{r.end()})}),r.on(`data`,a=>{clearTimeout(i),e({ok:!0,host:t,port:n,sentBytes:o.length,responseHex:a.toString(`hex`).toUpperCase(),responseText:a.toString(`utf8`)}),r.destroy()}),r.on(`error`,t=>{clearTimeout(i),e({ok:!1,error:t.message})}),r.connect(n,t)})}async handleRawTcpListen(e){let t=m(e,`port`);if(t===void 0||t<1||t>65535)return{ok:!1,error:`port must be a number between 1 and 65535`};let n=m(e,`timeout`)??1e4;return new Promise(e=>{let r=O(),i=setTimeout(()=>{r.close(),e({ok:!1,error:`Listen timed out - no connection received`})},n);r.on(`connection`,n=>{clearTimeout(i);let a=[];n.on(`data`,e=>{a.push(e)}),n.on(`end`,()=>{let n=Buffer.concat(a);r.close(),e({ok:!0,port:t,receivedBytes:n.length,dataHex:n.toString(`hex`).toUpperCase(),dataText:n.toString(`utf8`)})}),n.on(`error`,t=>{clearTimeout(i),r.close(),e({ok:!1,error:t.message})})}),r.on(`error`,t=>{clearTimeout(i),e({ok:!1,error:t.message})}),r.listen(t,`127.0.0.1`)})}async handleRawUdpSend(e){let t=p(e,`host`)??`127.0.0.1`,n=m(e,`port`);if(n===void 0||n<1||n>65535)return{ok:!1,error:`port must be a number between 1 and 65535`};let r=I(t);if(r)return r;let i=p(e,`dataHex`),a=p(e,`dataText`);if(!i&&!a)return{ok:!1,error:`dataHex or dataText is required`};let o=i?Buffer.from(P(i),`hex`):Buffer.from(a??``,`utf8`),s=m(e,`timeout`)??5e3;return new Promise(e=>{let r=E(`udp4`),i=setTimeout(()=>{r.close(),e({ok:!1,error:`UDP response timed out`})},s);r.on(`message`,a=>{clearTimeout(i),r.close(),e({ok:!0,host:t,port:n,sentBytes:o.length,responseHex:a.toString(`hex`).toUpperCase(),responseText:a.toString(`utf8`)})}),r.on(`error`,t=>{clearTimeout(i),r.close(),e({ok:!1,error:t.message})}),r.send(o,0,o.length,n,t)})}async handleRawUdpListen(e){let t=m(e,`port`);if(t===void 0||t<1||t>65535)return{ok:!1,error:`port must be a number between 1 and 65535`};let n=m(e,`timeout`)??1e4;return new Promise(e=>{let r=E(`udp4`),i=setTimeout(()=>{r.close(),e({ok:!1,error:`UDP listen timed out`})},n);r.on(`message`,(n,a)=>{clearTimeout(i),r.close(),e({ok:!0,localPort:t,receivedBytes:n.length,from:a,dataHex:n.toString(`hex`).toUpperCase(),dataText:n.toString(`utf8`)})}),r.on(`error`,t=>{clearTimeout(i),r.close(),e({ok:!1,error:t.message})}),r.bind(t,`127.0.0.1`)})}},Ee=class extends Te{handleTlsKeylogEnableTool(e){return v(async()=>await this.handleTlsKeylogEnable(e))}handleTlsKeylogParseTool(e){return v(async()=>await this.handleTlsKeylogParse(e))}handleTlsKeylogDisableTool(e){return v(async()=>await this.handleTlsKeylogDisable(e))}handleTlsDecryptPayloadTool(e){return v(async()=>await this.handleTlsDecryptPayload(e))}handleTlsKeylogSummarizeTool(e){return v(async()=>await this.handleTlsKeylogSummarize(e))}handleTlsKeylogLookupSecretTool(e){return v(async()=>await this.handleTlsKeylogLookupSecret(e))}handleTlsCertPinBypassTool(e){return v(async()=>await this.handleTlsCertPinBypass(e))}handleParseHandshakeTool(e){return v(async()=>await this.handleParseHandshake(e))}handleCipherSuitesTool(e){return v(async()=>await this.handleCipherSuites(e))}handleParseCertificateTool(e){return v(async()=>await this.handleParseCertificate(e))}handleTlsProbeEndpointTool(e){return v(async()=>await this.handleTlsProbeEndpoint(e))}handleTcpOpenTool(e){return v(async()=>await this.handleTcpOpen(e))}handleTcpWriteTool(e){return v(async()=>await this.handleTcpWrite(e))}handleTcpReadUntilTool(e){return v(async()=>await this.handleTcpReadUntil(e))}handleTcpCloseTool(e){return v(async()=>await this.handleTcpClose(e))}handleTlsOpenTool(e){return v(async()=>await this.handleTlsOpen(e))}handleTlsWriteTool(e){return v(async()=>await this.handleTlsWrite(e))}handleTlsReadUntilTool(e){return v(async()=>await this.handleTlsReadUntil(e))}handleTlsCloseTool(e){return v(async()=>await this.handleTlsClose(e))}handleWebSocketOpenTool(e){return v(async()=>await this.handleWebSocketOpen(e))}handleWebSocketSendFrameTool(e){return v(async()=>await this.handleWebSocketSendFrame(e))}handleWebSocketReadFrameTool(e){return v(async()=>await this.handleWebSocketReadFrame(e))}handleWebSocketCloseTool(e){return v(async()=>await this.handleWebSocketClose(e))}handleBypassCertPinningTool(e){return v(async()=>await this.handleBypassCertPinning(e))}handleRawTcpSendTool(e){return v(async()=>await this.handleRawTcpSend(e))}handleRawTcpListenTool(e){return v(async()=>await this.handleRawTcpListen(e))}handleRawUdpSendTool(e){return v(async()=>await this.handleRawUdpSend(e))}handleRawUdpListenTool(e){return v(async()=>await this.handleRawUdpListen(e))}};export{Ee as BoringsslInspectorHandlers};
@@ -0,0 +1 @@
1
+ import{t as e}from"./ToolError-g3rjWzhx.mjs";import{i as t,n,s as r,u as i}from"./parse-args-B6dwWc9k.mjs";import{r as a}from"./ResponseBuilder-BLicSCjn.mjs";import{createReadStream as o}from"node:fs";import{stat as s}from"node:fs/promises";import{Buffer as c}from"node:buffer";const l=(e,t)=>{let n=process.env[e];if(n===void 0||n===``)return t;let r=parseInt(n,10);return Number.isFinite(r)?r:t},u=((e,t)=>{let n=process.env[e];if(n===void 0||n===``)return t;let r=n.split(`,`).map(e=>parseInt(e.trim(),10)).filter(e=>Number.isFinite(e)&&e>0);return r.length>0?r:t})(`BINARY_SECRETS_DEFAULT_KEY_LENGTHS`,[16,24,32,64]),d=l(`BINARY_SECRETS_MAX_RESULTS`,500),f=l(`BINARY_SECRETS_MIN_ENTROPY_X10`,70);l(`BINARY_SECRETS_REGEX_TIMEOUT_MS`,50);const p=l(`BINARY_SECRETS_MAX_CHUNK_BYTES`,16*1024*1024),m=l(`BINARY_SECRETS_CHUNK_OVERLAP_BYTES`,1024),h=l(`BINARY_SECRETS_CONTEXT_BYTES`,16),g=l(`BINARY_SECRETS_VALUE_PREVIEW_BYTES`,256),_=l(`BINARY_SECRETS_MIN_BASE64_LENGTH`,24),v=l(`BINARY_SECRETS_MAX_BASE64_LENGTH`,1024),y=l(`BINARY_SECRETS_MIN_HEX_LENGTH`,32),b=l(`BINARY_SECRETS_MAX_HEX_LENGTH`,1024),x=l(`BINARY_SECRETS_MAX_EXTRACT_DURATION_MS`,6e4);function S(e,t,n){if(n<=0)return 0;let r=t+n;if(r>e.length)return 0;let i=new Uint32Array(256);for(let n=t;n<r;n++)i[e[n]]=i[e[n]]+1>>>0;let a=1/n,o=0;for(let e=0;e<256;e++){let t=i[e];if(t===0)continue;let n=t*a;o-=n*Math.log2(n)}return o>8?8:o<0?0:o}function*C(e,t){if(t<=0||t>e.length)return;let n=new Uint32Array(256);for(let r=0;r<t;r++)n[e[r]]=n[e[r]]+1>>>0;yield[0,w(n,t)];for(let r=t;r<e.length;r++){let i=e[r-t],a=e[r];n[i]=n[i]-1>>>0,n[a]=n[a]+1>>>0,yield[r-t+1,w(n,t)]}}function w(e,t){let n=1/t,r=0;for(let t=0;t<256;t++){let i=e[t];if(i===0)continue;let a=i*n;r-=a*Math.log2(a)}return r>8?8:r<0?0:r}const T=p;var E=class{async extractFromFile(t,n={}){if(typeof t!=`string`||t.length===0)throw new e(`VALIDATION`,`filePath must be a non-empty string`);let r=0;try{r=(await s(t)).size}catch(n){throw new e(`NOT_FOUND`,`File not found: ${t}`,{details:{filePath:t},cause:n})}let i=D(n),a=performance.now(),l=Math.max(0,Math.min(i.scanWindowStart,r)),u=Math.max(l,Math.min(i.scanWindowEnd,r)),d=u-l,f=[],p=new Set;if(d===0)return{candidates:[],scannedBytes:0,durationMs:performance.now()-a};let m=c.alloc(0),h=l,g=l,_=o(t,{highWaterMark:i.maxChunkBytes,start:l,end:u-1});for await(let t of _){if(performance.now()-a>x)throw new e(`TIMEOUT`,`binary_key_extract exceeded BINARY_SECRETS_MAX_EXTRACT_DURATION_MS (${x} ms)`);let n=t,r=m.length===0?n:c.concat([m,n]);O(r,h,i,e=>{let t=`${e.format}@${e.absOffset}:${e.length}`;p.has(t)||(p.add(t),f.push(e))}),g+=n.length;let o=Math.min(r.length,i.overlapBytes);m=c.from(r.subarray(r.length-o)),h=g-o}let v=f.map(e=>({hit:e,entropy:S(e.bytes,0,e.length)}));v.sort((e,t)=>e.entropy===t.entropy?e.hit.absOffset-t.hit.absOffset:t.entropy-e.entropy);let y=v.length>i.maxResults;return{candidates:await P(t,y?v.slice(0,i.maxResults):v,i,r),scannedBytes:d,durationMs:performance.now()-a,...y?{truncated:!0}:{}}}};function D(t){let n=(()=>{if(!t.keyLengths)return u;if(!Array.isArray(t.keyLengths))throw new e(`VALIDATION`,`keyLengths must be an array of positive integers`);let n=t.keyLengths.map(t=>{if(!Number.isFinite(t)||!Number.isInteger(t)||t<=0)throw new e(`VALIDATION`,`keyLengths entries must be positive integers (got ${String(t)})`);return t}).filter((e,t,n)=>n.indexOf(e)===t);if(n.length===0)throw new e(`VALIDATION`,`keyLengths must contain at least one positive integer`);return n})(),r=(()=>{if(t.minEntropy===void 0)return f/10;if(typeof t.minEntropy!=`number`||!Number.isFinite(t.minEntropy))throw new e(`VALIDATION`,`minEntropy must be a finite number in [0, 8]`);if(t.minEntropy<0||t.minEntropy>8)throw new e(`VALIDATION`,`minEntropy must be in [0, 8] (got ${t.minEntropy})`);return t.minEntropy})(),i=new Set(t.formats??[`raw`,`base64`,`hex`]);for(let t of i)if(t!==`raw`&&t!==`base64`&&t!==`hex`)throw new e(`VALIDATION`,`Invalid formats entry: "${t}". Expected one of: raw, base64, hex`);let a=t.includeContext??!0,o=(()=>{if(t.contextBytes===void 0)return h;if(typeof t.contextBytes!=`number`||!Number.isInteger(t.contextBytes)||t.contextBytes<0||t.contextBytes>1024)throw new e(`VALIDATION`,`contextBytes must be an integer in [0, 1024] (got ${String(t.contextBytes)})`);return t.contextBytes})(),s=(()=>{if(t.maxResults===void 0)return d;if(typeof t.maxResults!=`number`||!Number.isInteger(t.maxResults)||t.maxResults<=0)throw new e(`VALIDATION`,`maxResults must be a positive integer (got ${String(t.maxResults)})`);return t.maxResults})(),c=Math.max(t.maxChunkBytes??T,8192),l=Math.min(m,c-1),p=t.scanWindow?.start??0,g=t.scanWindow?.end??2**53-1;if(!Number.isFinite(p)||!Number.isFinite(g)||p<0||g<=p)throw new e(`VALIDATION`,`scanWindow must satisfy 0 <= start < end (got start=${p}, end=${g})`);return{keyLengths:n,maxRawWindow:Math.max(...n),minRawWindow:Math.min(...n),minEntropy:r,formats:i,includeContext:a,contextBytes:o,maxResults:s,maxChunkBytes:c,overlapBytes:l,scanWindowStart:p,scanWindowEnd:g}}function O(e,t,n,r){if(n.formats.has(`raw`)){for(let i of n.keyLengths)if(!(i>e.length))for(let[a,o]of C(e,i)){if(o<n.minEntropy)continue;let s=e.subarray(a,a+i);r({absOffset:t+a,length:i,format:`raw`,bytes:Uint8Array.from(s)})}}if(n.formats.has(`base64`))for(let i of j(e,t,n))r(i);if(n.formats.has(`hex`))for(let i of M(e,t,n))r(i)}function k(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||e===43||e===47}function A(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function*j(e,t,n){let r=_,i=v,a=new Set(n.keyLengths),o=-1;for(let n=0;n<=e.length;n++){let s=n<e.length?e[n]:-1;if(s!==-1&&k(s)){o===-1&&(o=n);continue}if(o===-1)continue;let l=o;o=-1;let u=n,d=0;for(;d<2&&u<e.length&&e[u]===61;)u++,d++;let f=u-l;if(f<r||f>i||N(e,l,f)<5)continue;let p=e.subarray(l,u),m;try{m=c.from(p.toString(`ascii`),`base64`)}catch{continue}m.length!==0&&a.has(m.length)&&(yield{absOffset:t+l,length:m.length,format:`base64`,bytes:Uint8Array.from(m)})}}function*M(e,t,n){let r=y,i=b,a=new Set(n.keyLengths),o=-1;for(let n=0;n<=e.length;n++){let s=n<e.length?e[n]:-1;if(s!==-1&&A(s)){o===-1&&(o=n);continue}if(o===-1)continue;let l=n-o;l%2==1&&--l;let u=o;if(o=-1,l<r||l>i)continue;let d=l/2;if(!a.has(d))continue;let f=e.subarray(u,u+l),p=c.from(f.toString(`ascii`),`hex`);p.length===d&&(yield{absOffset:t+u,length:d,format:`hex`,bytes:Uint8Array.from(p)})}}function N(e,t,n){let r=new Uint8Array(256),i=0;for(let a=t;a<t+n;a++){let t=e[a];r[t]===0&&(r[t]=1,i++)}return i}async function P(e,t,n,r){let i=[];for(let{hit:a,entropy:o}of t){let t=Math.min(a.length,g),s=c.from(a.bytes.subarray(0,t)).toString(`hex`),l={offset:a.absOffset,length:a.length,format:a.format,entropy:o,value:s,...a.length>t?{valueTruncated:!0}:{},...n.includeContext?{context:await F(e,a,n.contextBytes,r)}:{}};i.push(l)}return i}async function F(e,t,n,r){if(n===0)return{before:``,after:``,beforeAscii:``,afterAscii:``};let i=t.format===`hex`?t.length*2:t.format===`base64`?Math.ceil(t.length/3)*4:t.length,a=Math.max(0,t.absOffset-n),o=t.absOffset,s=Math.min(r,t.absOffset+i),c=Math.min(r,s+n),l=await I(e,a,o),u=await I(e,s,c);return{before:l.toString(`hex`),after:u.toString(`hex`),beforeAscii:L(l),afterAscii:L(u)}}async function I(e,t,n){if(n<=t)return c.alloc(0);let r=[],i=o(e,{start:t,end:n-1});for await(let e of i)r.push(e);return c.concat(r)}function L(e){let t=``;for(let n=0;n<e.length;n++){let r=e[n];t+=r>=32&&r<=126?String.fromCharCode(r):`.`}return t}const R=new Set([`raw`,`base64`,`hex`]);function z(t){if(t==null)return;if(!Array.isArray(t))throw new e(`VALIDATION`,`keyLengths must be an array of positive integers`);let n=[];for(let r=0;r<t.length;r++){let i=t[r];if(typeof i!=`number`||!Number.isFinite(i)||!Number.isInteger(i)||i<=0)throw new e(`VALIDATION`,`keyLengths[${r}] must be a positive integer (got ${String(i)})`);n.push(i)}return n}function B(t){if(t==null)return;if(!Array.isArray(t))throw new e(`VALIDATION`,`formats must be an array of strings`);let n=[];for(let r=0;r<t.length;r++){let i=t[r];if(typeof i!=`string`||!R.has(i))throw new e(`VALIDATION`,`formats[${r}] must be one of: raw, base64, hex (got ${String(i)})`);n.push(i)}return n}var V=class{extractor;constructor(e=new E){this.extractor=e}handleBinaryKeyExtract(e){return a(async()=>{let a=i(e,`filePath`),o={},s=z(e.keyLengths);s!==void 0&&(o.keyLengths=s);let c=t(e,`minEntropy`);c!==void 0&&(o.minEntropy=c);let l=B(e.formats);l!==void 0&&(o.formats=l);let u=n(e,`includeContext`);u!==void 0&&(o.includeContext=u);let d=t(e,`contextBytes`);d!==void 0&&(o.contextBytes=d);let f=t(e,`maxResults`);f!==void 0&&(o.maxResults=f);let p=t(e,`maxChunkBytes`);p!==void 0&&(o.maxChunkBytes=p);let m=r(e,`scanWindow`);return m!==void 0&&(o.scanWindow={start:typeof m.start==`number`?m.start:void 0,end:typeof m.end==`number`?m.end:void 0}),{result:await this.extractor.extractFromFile(a,o)}})}};export{V as BinarySecretsHandlers};
@@ -0,0 +1,4 @@
1
+ import{$n as e,Gn as t,Hn as n,Jn as r,Kn as i,Qn as a,Un as o,Wn as s,Xn as c,Yn as l,Zn as u,ar as d,er as f,ir as p,nr as m,or as h,qn as g,rr as _,tr as v}from"./constants-nvsLpSri.mjs";import{t as y}from"./ToolError-g3rjWzhx.mjs";import{n as b}from"./response-R8ghbZSb.mjs";import{t as x}from"./ToolProbe-B02GC3ZY.mjs";import{c as S,i as C,l as w,n as T,o as E,r as D,u as O}from"./parse-args-B6dwWc9k.mjs";import{r as k}from"./ResponseBuilder-BLicSCjn.mjs";import{tmpdir as A}from"node:os";import{basename as ee,dirname as j,join as M}from"node:path";import{mkdir as N,open as te,stat as P,writeFile as F}from"node:fs/promises";import{execFile as I,spawn as ne}from"node:child_process";var re=class{filter;lines=[];pending=``;constructor(e){this.filter=e}pushChunk(e){this.pending+=e;let t=0,n=this.pending.indexOf(`
2
+ `,t);for(;n>=0;)this.acceptLine(this.pending.slice(t,n).replace(/\r$/,``)),t=n+1,n=this.pending.indexOf(`
3
+ `,t);this.pending=this.pending.slice(t),this.pending.length>65536&&(this.pending=this.pending.slice(-65536))}finish(){return this.pending.length>0&&(this.acceptLine(this.pending.replace(/\r$/,``)),this.pending=``),[...this.lines]}acceptLine(e){e.trim()&&(this.filter.pid&&!e.includes(` ${this.filter.pid} `)||this.filter.packageName&&!this.filter.pid&&!e.includes(this.filter.packageName)||this.filter.pattern&&!this.filter.pattern.test(e)||this.filter.predicate&&!this.filter.predicate(e)||(this.lines.push(e),this.lines.length>this.filter.maxLines&&this.lines.splice(0,this.lines.length-this.filter.maxLines)))}};async function L(e){return new Promise((t,n)=>{let r=ne(e.adb,e.args,{windowsHide:!0,stdio:[`ignore`,`pipe`,`pipe`]}),i=new re(e),a=[],o=0,s=e.maxStderrBytes??65536,c=!1,l=setTimeout(()=>{r.kill()},e.timeoutMs);r.stdout.setEncoding(`utf8`),r.stdout.on(`data`,e=>i.pushChunk(e)),r.stderr.setEncoding(`utf8`),r.stderr.on(`data`,e=>{if(o>=s)return;let t=s-o,n=e.length>t?e.slice(0,t):e;a.push(n),o+=n.length}),r.on(`error`,e=>{c||(c=!0,clearTimeout(l),n(e))}),r.on(`close`,(e,n)=>{c||(c=!0,clearTimeout(l),t({lines:i.finish(),stderr:a.join(``),exitCode:e??+!!n,...n?{signal:n}:{}}))})})}const R={V:0,D:1,I:2,W:3,E:4,F:5,S:6},z=[`V`,`D`,`I`,`W`,`E`,`F`,`S`],ie=/^(\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})\s+(\d+)\s+(\d+)\s+([VDIWEFS])\s+(.*?):\s?(.*)$/;function B(e){let t=e.match(ie);return t?{raw:e,timestamp:t[1],pid:Number(t[2]),tid:Number(t[3]),priority:t[4],tag:(t[5]??``).trim(),message:t[6]??``}:{raw:e}}function ae(e){if(e===void 0)return;let t=e.trim().toUpperCase();if(z.includes(t))return t;throw Error(`Invalid minPriority "${e}". Expected one of: ${z.join(`, `)}`)}function V(e,t){return e.priority?R[e.priority]>=R[t]:!0}function H(e){return t=>V(B(t),e)}const U=/^\[([^\]]*)\]:\s*\[([^\]]*)\]$/;function W(e){let t=[];for(let n of e.split(/\r?\n/)){let e=n.match(U);if(!e)continue;let r=e[1]??``,i=e[2]??``;r&&t.push({key:r,value:i})}return t}const G=[[`model`,`ro.product.model`],[`manufacturer`,`ro.product.manufacturer`],[`brand`,`ro.product.brand`],[`device`,`ro.product.device`],[`product`,`ro.product.name`],[`release`,`ro.build.version.release`],[`sdk`,`ro.build.version.sdk`],[`abi`,`ro.product.cpu.abi`],[`abiList`,`ro.product.cpu.abilist`],[`buildId`,`ro.build.id`],[`buildFingerprint`,`ro.build.fingerprint`],[`securityPatch`,`ro.build.version.security_patch`],[`buildTags`,`ro.build.tags`],[`buildType`,`ro.build.type`],[`verifiedBoot`,`ro.boot.verifiedbootstate`],[`bootloaderLock`,`ro.boot.vbmeta.device_state`]];function K(e){let t={};for(let[n,r]of G){let i=e[r];i!==void 0&&(t[n]=i)}if(t.bootloaderLock===void 0){let n=e[`ro.boot.flash.locked`];n===`1`?t.bootloaderLock=`locked`:n===`0`&&(t.bootloaderLock=`unlocked`)}return t}function q(e){return e instanceof Error?e.message:String(e)}function J(e){return e?[`-s`,e]:[]}async function Y(e,t,n={}){return new Promise((i,a)=>{I(e,t,{encoding:`utf8`,windowsHide:!0,timeout:n.timeoutMs??r,maxBuffer:n.maxBufferBytes??m},(e,t,r)=>{let o={stdout:t??``,stderr:r??``,exitCode:typeof e?.code==`number`?e.code??1:0,signal:typeof e?.signal==`string`?e.signal??void 0:void 0};if(e&&!n.allowNonZero){a(e);return}i(o)})})}async function oe(e,t,n={}){return new Promise((i,a)=>{I(e,t,{encoding:`buffer`,windowsHide:!0,timeout:n.timeoutMs??r,maxBuffer:n.maxBufferBytes??m},(e,t,r)=>{let o={stdout:Buffer.isBuffer(t)?t:Buffer.from(t??``),stderr:Buffer.isBuffer(r)?r.toString(`utf8`):typeof r==`string`?r:``,exitCode:typeof e?.code==`number`?e.code??1:0,signal:typeof e?.signal==`string`?e.signal??void 0:void 0};if(e&&!n.allowNonZero){a(e);return}i(o)})})}function se(e){let t=[];for(let n of e.split(/\r?\n/)){let e=n.trim();if(!e.startsWith(`package:`))continue;let r=e.slice(8).trim();r&&t.push(r)}return t}function X(e){return e.replace(/[^A-Za-z0-9._-]+/g,`_`).replace(/^_+|_+$/g,``)||`file`}function ce(e){let t={};for(let n of[`Status`,`LaunchState`,`Activity`,`ThisTime`,`TotalTime`,`WaitTime`]){let r=e.match(RegExp(`^${n}:\\s*(.+)$`,`m`));if(!r?.[1])continue;let i=r[1].trim();t[n.charAt(0).toLowerCase()+n.slice(1)]=n.endsWith(`Time`)&&/^\d+$/.test(i)?Number(i):i}return t}function le(e){return e.match(/\buserId=(\d+)/)?.[1]??e.match(/\buid=(\d+)/)?.[1]??e.match(/\bappId=(\d+)/)?.[1]}async function ue(e){let t=await P(e);if(!t.isFile())throw Error(`Pulled APK path is not a regular file: ${e}`);if(t.size<=0)throw Error(`Pulled APK is empty: ${e}`);let n=await te(e,`r`),r=Buffer.alloc(4);try{await n.read(r,0,4,0)}finally{await n.close()}let i=r.toString(`hex`).toLowerCase(),a=h.some(e=>e===i);return{size:t.size,zipLike:a}}async function Z(e,t){let{stdout:n}=await Y(e,[...J(t),`shell`,`cat /proc/net/unix`]),r=[];for(let e of n.split(/\r?\n/)){let t=e.trim();if(t.includes(`@webview_devtools_remote`)){let e=t.match(/@webview_devtools_remote\S+/);e&&r.push(e[0])}}return r}function de(e){return e.trim().replace(/\/+$/,``)}function Q(e,t,n){let r=new Set;for(let i of[/nativeLibraryDir=([^\s]+)/g,/legacyNativeLibraryDir=([^\s]+)/g,/secondaryNativeLibraryDir=([^\s]+)/g]){let a;for(;(a=i.exec(e))!==null;){let e=de(a[1]??``);e&&(!n&&!e.includes(t)||r.add(e))}}return[...r]}function $(e){let t=[];for(let n of e.split(/\r?\n/)){let e=n.match(/^([0-9a-fA-F]+)-([0-9a-fA-F]+)\s+(\S+)\s+([0-9a-fA-F]+)\s+(\S+)\s+(\d+)\s*(.*)$/);if(!e)continue;let[,r,i,a,o,s,c,l]=e;t.push({start:`0x${(r??``).toLowerCase()}`,end:`0x${(i??``).toLowerCase()}`,perms:a??``,offset:`0x${(o??``).toLowerCase()}`,dev:s??``,inode:c??``,pathname:l?.trim()??``})}return t}function fe(e){return e.replace(/\\/g,`\\\\`).replace(/%/g,`\\%`).replace(/\s/g,`%s`).replace(/(["'`$&|;<>(){}[\]*?~!])/g,`\\$1`)}const pe=new Set([`add`,`remove`,`remove_all`,`list`]),me=new Set([`forward`,`reverse`]);function he(e){let t=D(e,`action`,pe);if(!t)throw Error(`Missing required port mapping action: add, remove, remove_all, or list`);return t}function ge(e){let t=D(e,`direction`,me);if(!t)throw Error(`Missing required port mapping direction: forward or reverse`);return t}function _e(e,t){let n=[];for(let r of e.split(/\r?\n/)){let[e,i,a]=r.trim().split(/\s+/);!e||!i||!a||n.push(t===`forward`?{serial:e,local:i,remote:a}:{serial:e,local:a,remote:i})}return n}var ve=class{cachedAdb;async resolveAdb(){if(this.cachedAdb)return this.cachedAdb;let e=await x(`adb`);if(!e.available)throw new y(`PREREQUISITE`,e.reason??`adb not found in PATH. Install Android Platform Tools.`,{toolName:`adb-bridge`});return this.cachedAdb=e.path??`adb`,this.cachedAdb}async run(e,t){try{return b(await t())}catch(t){throw t instanceof y?t:new y(`RUNTIME`,q(t),{toolName:e})}}async handleDeviceListTool(e){return k(async()=>await this.handleDeviceList(e))}async handleShellTool(e){return k(async()=>await this.handleShell(e))}async handleInstallTool(e){return k(async()=>await this.handleInstall(e))}async handleUninstallTool(e){return k(async()=>await this.handleUninstall(e))}async handleInputTapTool(e){return k(async()=>await this.handleInputTap(e))}async handleInputSwipeTool(e){return k(async()=>await this.handleInputSwipe(e))}async handleInputKeyeventTool(e){return k(async()=>await this.handleInputKeyevent(e))}async handleInputTextTool(e){return k(async()=>await this.handleInputText(e))}async handleProcMapsTool(e){return k(async()=>await this.handleProcMaps(e))}async handleRootCheckTool(e){return k(async()=>await this.handleRootCheck(e))}async handleGetpropTool(e){return k(async()=>await this.handleGetprop(e))}async handleScreenshotTool(e){return k(async()=>await this.handleScreenshot(e))}async handleScreenrecordTool(e){return k(async()=>await this.handleScreenrecord(e))}async handlePortForwardTool(e){return k(async()=>await this.handlePortForward(e))}async handleApkPullTool(e){return k(async()=>await this.handleApkPull(e))}async handleAnalyzeApkTool(e){return k(async()=>await this.handleAnalyzeApk(e))}async handlePackageSummaryTool(e){return k(async()=>await this.handlePackageSummary(e))}async handleLogcatQueryTool(e){return k(async()=>await this.handleLogcatQuery(e))}async handleAppColdStartTraceTool(e){return k(async()=>await this.handleAppColdStartTrace(e))}async handleFilePullTool(e){return k(async()=>await this.handleFilePull(e))}async handleFilePushTool(e){return k(async()=>await this.handleFilePush(e))}async handlePullNativeLibsTool(e){return k(async()=>await this.handlePullNativeLibs(e))}async handleWebViewListTool(e){return k(async()=>await this.handleWebViewList(e))}async handleWebViewAttachTool(e){return k(async()=>await this.handleWebViewAttach(e))}async handleDeviceList(e){return this.run(`adb_device_list`,async()=>{let{stdout:e}=await Y(await this.resolveAdb(),[`devices`,`-l`]),t=[];for(let n of e.split(/\r?\n/)){let e=n.trim();if(!e||e.startsWith(`List of devices`))continue;let r=e.split(/\s+/),i=r[0];if(!i)continue;let a={};for(let e=2;e<r.length;e++){let t=r[e];if(!t)continue;let n=t.indexOf(`:`);if(n>0){let e=t.slice(0,n),r=t.slice(n+1);e&&r&&(a[e]=r)}}t.push({serial:i,state:r[1]??``,model:a.model??``,product:a.product??``})}return{success:!0,count:t.length,devices:t}})}async handleShell(e){return this.run(`adb_shell`,async()=>{let t=O(e,`serial`),n=O(e,`command`),r=T(e,`allowNonZero`)??!0,i=C(e,`timeoutMs`)??p,a=C(e,`maxBufferBytes`),{stdout:o,stderr:s,exitCode:c,signal:l}=await Y(await this.resolveAdb(),[...J(t),`shell`,n],{allowNonZero:r,timeoutMs:i,maxBufferBytes:a});return{success:c===0,serial:t,command:n,stdout:o,stderr:s||``,exitCode:c,...l?{signal:l}:{}}})}async handleInstall(e){return this.run(`adb_install`,async()=>{let t=O(e,`serial`),n=S(e,`apkPath`),r=[...n?[n]:[],...w(e,`apkPaths`)];if(r.length===0)return{success:!1,serial:t,error:`apkPath or apkPaths is required`};let i=T(e,`reinstall`)??!0,a=T(e,`allowDowngrade`)??!1,o=T(e,`grantPermissions`)??!1,s=T(e,`allowTestOnly`)??!0,c=T(e,`installSplit`)??r.length>1,u=S(e,`user`),d=await this.resolveAdb(),f=[...J(t),c||r.length>1?`install-multiple`:`install`];i&&f.push(`-r`),a&&f.push(`-d`),o&&f.push(`-g`),s&&f.push(`-t`),u&&f.push(`--user`,u),f.push(...r);let p=await Y(d,f,{allowNonZero:!0,timeoutMs:l,maxBufferBytes:m}),h=`${p.stdout}\n${p.stderr}`;return{success:p.exitCode===0&&/Success/i.test(h),serial:t,command:f,apkPaths:r,installSplit:c||r.length>1,stdout:p.stdout,stderr:p.stderr,exitCode:p.exitCode}})}async handleUninstall(e){return this.run(`adb_uninstall`,async()=>{let t=O(e,`serial`),n=O(e,`packageName`),r=T(e,`keepData`)??!1,i=await this.resolveAdb(),a=[...J(t),`uninstall`];r&&a.push(`-k`),a.push(n);let o=await Y(i,a,{allowNonZero:!0,timeoutMs:l}),s=`${o.stdout}\n${o.stderr}`;return{success:o.exitCode===0&&/Success/i.test(s),serial:t,packageName:n,keepData:r,stdout:o.stdout,stderr:o.stderr,exitCode:o.exitCode}})}async handleInputTap(e){return this.run(`adb_input_tap`,async()=>{let t=O(e,`serial`),n=E(e,`x`),r=E(e,`y`),i=await Y(await this.resolveAdb(),[...J(t),`shell`,`input`,`tap`,`${n}`,`${r}`],{allowNonZero:!0,timeoutMs:p});return{success:i.exitCode===0,serial:t,x:n,y:r,...i}})}async handleInputSwipe(e){return this.run(`adb_input_swipe`,async()=>{let t=O(e,`serial`),n=E(e,`x1`),r=E(e,`y1`),i=E(e,`x2`),a=E(e,`y2`),o=C(e,`durationMs`),s=await this.resolveAdb(),c=[...J(t),`shell`,`input`,`swipe`,`${n}`,`${r}`,`${i}`,`${a}`];o!==void 0&&c.push(`${o}`);let l=await Y(s,c,{allowNonZero:!0,timeoutMs:p});return{success:l.exitCode===0,serial:t,x1:n,y1:r,x2:i,y2:a,durationMs:o,...l}})}async handleInputKeyevent(e){return this.run(`adb_input_keyevent`,async()=>{let t=O(e,`serial`),n=O(e,`keyCode`),r=await Y(await this.resolveAdb(),[...J(t),`shell`,`input`,`keyevent`,n],{allowNonZero:!0,timeoutMs:p});return{success:r.exitCode===0,serial:t,keyCode:n,...r}})}async handleInputText(e){return this.run(`adb_input_text`,async()=>{let t=O(e,`serial`),n=O(e,`text`),r=fe(n),i=await Y(await this.resolveAdb(),[...J(t),`shell`,`input`,`text`,r],{allowNonZero:!0,timeoutMs:p});return{success:i.exitCode===0,serial:t,textLength:n.length,encodedText:r,...i}})}async handleProcMaps(e){return this.run(`adb_proc_maps`,async()=>{let t=O(e,`serial`),n=S(e,`packageName`),r=S(e,`pid`),i=T(e,`includeRaw`)??!1,a=S(e,`localPath`);if(!r&&n&&(r=await this.resolvePackagePid(t,n)),!r)return{success:!1,serial:t,packageName:n,error:`pid or resolvable packageName is required`};let{stdout:o,stderr:s,exitCode:c}=await Y(await this.resolveAdb(),[...J(t),`shell`,`cat /proc/${r}/maps`],{allowNonZero:!0,timeoutMs:p,maxBufferBytes:u});a&&(await N(j(a),{recursive:!0}),await F(a,o,`utf8`));let l=$(o);return{success:c===0,serial:t,packageName:n,pid:r,count:l.length,modules:l,localPath:a,stderr:s,exitCode:c,...i?{raw:o}:{}}})}async handleRootCheck(e){return this.run(`adb_root_check`,async()=>{let t=O(e,`serial`),n=await this.resolveAdb(),r=async e=>await Y(n,[...J(t),`shell`,e],{allowNonZero:!0,timeoutMs:p,maxBufferBytes:m}),[i,a,o,s,c]=await Promise.all([r(`which su`),r(`pm list packages com.topjohnwu.magisk`),r(`getprop ro.build.tags`),r(`getenforce`),r(`id`)]),l=[];i.exitCode===0&&i.stdout.trim()&&l.push({name:`su-binary`,evidence:i.stdout.trim(),severity:`high`}),a.stdout.includes(`com.topjohnwu.magisk`)&&l.push({name:`magisk-package`,evidence:a.stdout.trim(),severity:`high`}),o.stdout.includes(`test-keys`)&&l.push({name:`test-keys`,evidence:o.stdout.trim(),severity:`medium`}),/permissive/i.test(s.stdout)&&l.push({name:`selinux-permissive`,evidence:s.stdout.trim(),severity:`medium`}),/\buid=0\b/.test(c.stdout)&&l.push({name:`adbd-root-shell`,evidence:c.stdout.trim(),severity:`high`});let u=l.filter(e=>e.severity===`high`).length,d=Math.min(1,u*.4+(l.length-u)*.2);return{success:!0,serial:t,rooted:l.length>0,confidence:d,indicators:l}})}async handleGetprop(e){return this.run(`adb_getprop`,async()=>{let t=O(e,`serial`),n=S(e,`pattern`),{stdout:r,stderr:i,exitCode:a}=await Y(await this.resolveAdb(),[...J(t),`shell`,`getprop`],{allowNonZero:!0,timeoutMs:p,maxBufferBytes:u}),o=W(r),s=n?new RegExp(n,`i`):void 0,l=s?o.filter(e=>s.test(e.key)):o,d=l.slice(0,c),f={};for(let e of d)f[e.key]=e.value;let m={};for(let e of o)m[e.key]=e.value;let h=K(m);return{success:a===0,serial:t,...n?{pattern:n}:{},count:d.length,truncated:l.length>d.length,properties:f,fingerprint:h,stderr:i,exitCode:a}})}async handleScreenshot(e){return this.run(`adb_screenshot`,async()=>{let t=O(e,`serial`),n=S(e,`localPath`)??M(A(),`jshook-adb-screenshot-${X(t)}-${Date.now()}.png`),r=await oe(await this.resolveAdb(),[...J(t),`exec-out`,`screencap`,`-p`],{allowNonZero:!0,timeoutMs:p,maxBufferBytes:u});return r.exitCode===0?(await N(j(n),{recursive:!0}),await F(n,r.stdout),{success:!0,serial:t,localPath:n,size:(await P(n)).size,stderr:r.stderr,exitCode:r.exitCode}):{success:!1,serial:t,localPath:n,stderr:r.stderr,exitCode:r.exitCode}})}async handleScreenrecord(e){return this.run(`adb_screenrecord`,async()=>{let t=O(e,`serial`),n=S(e,`localPath`)??M(A(),`jshook-adb-screenrecord-${X(t)}-${Date.now()}.mp4`),r=S(e,`remotePath`)??`/sdcard/Download/jshook-screenrecord-${X(t)}-${Date.now()}.mp4`,i=Math.max(1,Math.min(180,Math.floor(C(e,`durationSec`)??10))),a=C(e,`bitRateMbps`),o=S(e,`size`),s=await this.resolveAdb(),c=[...J(t),`shell`,`screenrecord`,`--time-limit`,`${i}`];if(a!==void 0){let e=Math.max(1,Math.floor(a*1e6));c.push(`--bit-rate`,`${e}`)}o&&c.push(`--size`,o),c.push(r);let u=await Y(s,c,{allowNonZero:!0,timeoutMs:(i+10)*1e3,maxBufferBytes:m});if(u.exitCode!==0)return{success:!1,serial:t,localPath:n,remotePath:r,durationSec:i,stdout:u.stdout,stderr:u.stderr,exitCode:u.exitCode};await N(j(n),{recursive:!0});let d=await Y(s,[...J(t),`pull`,r,n],{allowNonZero:!0,timeoutMs:l,maxBufferBytes:m}),f=await Y(s,[...J(t),`shell`,`rm`,`-f`,r],{allowNonZero:!0,timeoutMs:p});return d.exitCode===0?{success:!0,serial:t,localPath:n,remotePath:r,durationSec:i,size:(await P(n)).size,record:u,pull:d,cleanupExitCode:f.exitCode}:{success:!1,serial:t,localPath:n,remotePath:r,durationSec:i,record:u,pull:d,cleanupExitCode:f.exitCode}})}async handlePortForward(e){return this.run(`adb_port_forward`,async()=>{let t=O(e,`serial`),n=he(e),r=ge(e),i=await this.resolveAdb();if(n===`list`){let e=await Y(i,[...J(t),r,`--list`],{allowNonZero:!0,timeoutMs:p}),a=_e(e.stdout,r);return{success:e.exitCode===0,serial:t,action:n,direction:r,count:a.length,mappings:a,stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode}}if(n===`remove_all`){let e=await Y(i,[...J(t),r,`--remove-all`],{allowNonZero:!0,timeoutMs:p});return{success:e.exitCode===0,serial:t,action:n,direction:r,stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode}}if(n===`remove`){let a=r===`forward`?O(e,`local`):O(e,`remote`),o=await Y(i,[...J(t),r,`--remove`,a],{allowNonZero:!0,timeoutMs:p});return{success:o.exitCode===0,serial:t,action:n,direction:r,local:r===`forward`?a:S(e,`local`),remote:r===`reverse`?a:S(e,`remote`),stdout:o.stdout,stderr:o.stderr,exitCode:o.exitCode}}let a=O(e,`local`),o=O(e,`remote`),s=await Y(i,r===`forward`?[...J(t),`forward`,a,o]:[...J(t),`reverse`,o,a],{allowNonZero:!0,timeoutMs:p});return{success:s.exitCode===0,serial:t,action:n,direction:r,local:a,remote:o,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode}})}async handleApkPull(e){return this.run(`adb_apk_pull`,async()=>{let t=O(e,`serial`),n=S(e,`packageName`),r=S(e,`outputPath`)??`.`,i=S(e,`outputFile`),a=T(e,`includeSplits`)??!1,o=T(e,`validateZip`)??!0;if(!n)return{success:!1,error:`packageName is required`};if(a&&i)return{success:!1,error:`outputFile can only be used for a single base APK pull; omit it with includeSplits=true`};let s=await this.resolveAdb(),{stdout:c}=await Y(s,[...J(t),`shell`,`pm path ${n}`]),u=se(c);if(u.length===0)return{success:!1,error:`APK not found for ${n}`,raw:c};let d=u.find(e=>/\/base\.apk$/i.test(e))??u[0],f=a?u:[d],p=[];for(let e of f){let c=ee(e)||`base.apk`,d=i??M(r,a?`${n}-${X(c)}`:`${n}.apk`);d=d.replace(/\\/g,`/`),await N(j(d),{recursive:!0});let f;try{if((await P(d)).isDirectory()){let e=M(r,`${n}-${X(c)}`).replace(/\\/g,`/`);f=`Destination existed as a directory; wrote to ${e} instead.`,d=e,await N(j(d),{recursive:!0})}}catch{}await Y(s,[...J(t),`pull`,e,d],{timeoutMs:l,maxBufferBytes:m});let h=await ue(d);if(o&&!h.zipLike)return{success:!1,serial:t,packageName:n,remotePaths:u,error:`Pulled file does not look like a ZIP/APK: ${d}`,localPath:d,size:h.size};p.push({remotePath:e,localPath:d,size:h.size,zipLike:h.zipLike,...f?{warning:f}:{}})}return{success:!0,serial:t,packageName:n,includeSplits:a,remotePaths:u,remotePath:p[0]?.remotePath,localPath:p[0]?.localPath,files:p}})}async handleAnalyzeApk(e){return this.run(`adb_apk_analyze`,async()=>{let t=O(e,`serial`),n=O(e,`packageName`);return{success:!0,serial:t,...await this.buildPackageSummary(t,n)}})}async handlePackageSummary(e){return this.run(`adb_package_summary`,async()=>{let t=O(e,`serial`),n=O(e,`packageName`);return{success:!0,serial:t,...await this.buildPackageSummary(t,n)}})}async buildPackageSummary(e,t){let{stdout:n}=await Y(await this.resolveAdb(),[...J(e),`shell`,`dumpsys package ${t}`],{timeoutMs:p,maxBufferBytes:u}),r={packageName:t},i=n.match(/versionName=([^\s]+)/);i?.[1]&&(r.versionName=i[1]);let a=n.match(/versionCode=(\d+)/);a?.[1]&&(r.versionCode=a[1]);let o=n.match(/minSdk=(\d+)/);o?.[1]&&(r.minSdk=o[1]);let s=n.match(/targetSdk=(\d+)/);s?.[1]&&(r.targetSdk=s[1]);let c=le(n);c&&(r.uid=c);let l=[],d=[],f=[],m=[],h=``;for(let e of n.split(/\r?\n/)){if(e.includes(`requested permissions:`)||e.includes(`install permissions:`)){h=`permissions`;continue}if(e.includes(`Activity Resolver Table`)||e.includes(`activities:`)){h=`activities`;continue}if(e.includes(`Service Resolver Table`)||e.includes(`services:`)){h=`services`;continue}if(e.includes(`Receiver Resolver Table`)||e.includes(`receivers:`)){h=`receivers`;continue}let n=e.trim(),r=n.split(/\s+/)[0];h===`permissions`?r&&n.startsWith(`android.permission.`)&&l.push(r):h===`activities`&&n.includes(t)?r&&d.push(r):h===`services`&&n.includes(t)?r&&f.push(r):h===`receivers`&&n.includes(t)&&r&&m.push(r)}r.permissions=[...new Set(l)].slice(0,_),r.activities=[...new Set(d)].slice(0,_),r.services=[...new Set(f)].slice(0,_),r.receivers=[...new Set(m)].slice(0,_),r.nativeLibraryDirs=Q(n,t,!0);let g=await this.resolveLauncherActivity(e,t);return g&&(r.launcherActivity=g),r}async resolveLauncherActivity(e,t){let{stdout:n}=await Y(await this.resolveAdb(),[...J(e),`shell`,`cmd package resolve-activity --brief ${t} android.intent.action.MAIN`],{allowNonZero:!0,timeoutMs:p});return n.split(/\r?\n/).map(e=>e.trim()).filter(Boolean).findLast(e=>e.includes(`/`))}async resolvePackagePid(e,t){let{stdout:n,exitCode:r}=await Y(await this.resolveAdb(),[...J(e),`shell`,`pidof -s ${t}`],{allowNonZero:!0,timeoutMs:p});if(r===0)return n.trim().split(/\s+/)[0]||void 0}async handleLogcatQuery(t){return this.run(`adb_logcat_query`,async()=>{let n=O(t,`serial`),r=S(t,`packageName`),i=S(t,`pid`),o=S(t,`pattern`),s=Math.max(1,Math.min(C(t,`tail`)??f,v)),c=Math.max(1,Math.min(C(t,`maxLines`)??a,e)),l=T(t,`clearBefore`)??!1,u=await this.resolveAdb();l&&await Y(u,[...J(n),`shell`,`logcat -c`],{allowNonZero:!0,timeoutMs:p}),!i&&r&&(i=await this.resolvePackagePid(n,r));let d=o?new RegExp(o,`i`):void 0,m=ae(S(t,`minPriority`)),h=T(t,`structured`)??!1,g=m?H(m):void 0,_=await L({adb:u,args:[...J(n),`shell`,`logcat -d -v threadtime -t ${s}`],timeoutMs:p,pid:i,packageName:r,pattern:d,...g?{predicate:g}:{},maxLines:c});return{success:_.exitCode===0,serial:n,packageName:r,pid:i,pattern:o,tail:s,count:_.lines.length,...m?{minPriority:m}:{},lines:_.lines,...h?{parsedLines:_.lines.map(B)}:{},stderr:_.stderr,exitCode:_.exitCode,..._.signal?{signal:_.signal}:{}}})}async handleAppColdStartTrace(e){return this.run(`adb_app_cold_start_trace`,async()=>{let r=O(e,`serial`),a=O(e,`packageName`),c=Math.max(0,Math.min(C(e,`waitMs`)??i,g)),l=Math.max(s,Math.min(C(e,`logcatTail`)??n,o)),u=w(e,`extraPatterns`),d=await this.resolveAdb(),f=S(e,`activity`)??await this.resolveLauncherActivity(r,a);if(!f)return{success:!1,serial:r,packageName:a,error:`Unable to resolve launcher activity`};let h=this.normalizeActivityComponent(a,f);await Y(d,[...J(r),`shell`,`am force-stop ${a}`],{allowNonZero:!0,timeoutMs:p}),await Y(d,[...J(r),`shell`,`logcat -c`],{allowNonZero:!0,timeoutMs:p});let _=await Y(d,[...J(r),`shell`,`am start -W -S ${h}`],{allowNonZero:!0,timeoutMs:p,maxBufferBytes:m});c>0&&await new Promise(e=>setTimeout(e,c));let v=await this.resolvePackagePid(r,a),y=new RegExp([a.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),`ActivityManager`,`ActivityTaskManager`,`Displayed`,`Looper`,`Choreographer`,`skipped`,`ANR`,`bindApplication`,`ClassLoader`,`DexClassLoader`,`PathClassLoader`,`JNI`,`dlopen`,`permission`,...u].join(`|`),`i`),b=await L({adb:d,args:[...J(r),`shell`,`logcat -d -t ${l}`],timeoutMs:p,maxLines:t,predicate:e=>!!(v&&e.includes(` ${v} `))||y.test(e)}),x=b.lines,T=x.map(e=>{let t=e.match(/\blatency=(\d+)ms/)?.[1],n=e.match(/\bwall=(\d+)ms/)?.[1];if(!(!t&&!n))return{latencyMs:t?Number(t):void 0,wallMs:n?Number(n):void 0,line:e}}).filter(e=>e!==void 0);return{success:_.exitCode===0,serial:r,packageName:a,activity:h,pid:v,launch:{...ce(_.stdout),stdout:_.stdout,stderr:_.stderr,exitCode:_.exitCode},logcat:{tail:l,exitCode:b.exitCode,count:x.length,timeline:x,looperEvents:T}}})}normalizeActivityComponent(e,t){let n=t.trim();return n.includes(`/`)?n:(n.startsWith(`.`)||n.startsWith(e),`${e}/${n}`)}async handleFilePull(e){return this.run(`adb_file_pull`,async()=>{let t=O(e,`serial`),n=O(e,`remotePath`),r=O(e,`localPath`).replace(/\\/g,`/`),i=await this.resolveAdb();await N(j(r),{recursive:!0});let a=await Y(i,[...J(t),`pull`,n,r],{timeoutMs:l,maxBufferBytes:m});return{success:!0,serial:t,remotePath:n,localPath:r,size:(await P(r)).size,stdout:a.stdout,stderr:a.stderr}})}async handleFilePush(e){return this.run(`adb_file_push`,async()=>{let t=O(e,`serial`),n=O(e,`localPath`).replace(/\\/g,`/`),r=O(e,`remotePath`),i=await this.resolveAdb(),a=await P(n);if(!a.isFile())return{success:!1,serial:t,localPath:n,remotePath:r,error:`localPath is not a file`};let o=await Y(i,[...J(t),`push`,n,r],{timeoutMs:l,maxBufferBytes:m});return{success:!0,serial:t,localPath:n,remotePath:r,size:a.size,stdout:o.stdout,stderr:o.stderr}})}async handlePullNativeLibs(e){return this.run(`adb_pull_native_libs`,async()=>{let t=O(e,`serial`),n=O(e,`packageName`),r=S(e,`outputPath`)??`.`,i=T(e,`includeSystemLibs`)??!1,a=await this.resolveAdb(),{stdout:o}=await Y(a,[...J(t),`shell`,`dumpsys package ${n}`]),s=Q(o,n,i);if(s.length===0)return{success:!1,serial:t,packageName:n,error:`No native library directories found for ${n}`};let c=M(r,`${n}-native-libs`).replace(/\\/g,`/`);await N(c,{recursive:!0});let u=[];for(let e of s){let n=M(c,e.split(`/`).filter(Boolean).pop()??`lib`).replace(/\\/g,`/`);await N(n,{recursive:!0}),await Y(a,[...J(t),`pull`,e,n],{timeoutMs:l,maxBufferBytes:m}),u.push({remoteDir:e,localPath:n})}return{success:!0,serial:t,packageName:n,includeSystemLibs:i,count:u.length,outputPath:c,libraries:u}})}async handleWebViewList(e){return this.run(`adb_webview_list`,async()=>{let t=O(e,`serial`),n=C(e,`hostPort`)??d,r=await this.resolveAdb(),i=await Z(r,t);if(i.length===0)return{success:!0,serial:t,hostPort:n,webviews:[],count:0};let a=i[0];await Y(r,[...J(t),`forward`,`tcp:${n}`,`localabstract:${a}`]);let o=await import(`node:http`),s=await new Promise(e=>{o.get(`http://localhost:${n}/json/list`,t=>{let n=``;t.on(`data`,e=>{n+=e}),t.on(`end`,()=>{try{e(JSON.parse(n))}catch{e([])}})}).on(`error`,()=>e([]))});return{success:!0,serial:t,hostPort:n,webviews:s.map(e=>({id:e.id,url:e.url,title:e.title,webSocketDebuggerUrl:e.webSocketDebuggerUrl})),count:s.length}})}async handleWebViewAttach(e){return this.run(`adb_webview_attach`,async()=>{let t=O(e,`serial`),n=O(e,`targetId`),r=C(e,`hostPort`)??d,i=await this.resolveAdb(),a=await Z(i,t);if(a.length===0)return{success:!1,error:`No WebView devtools sockets found on device`};let o=a[0];await Y(i,[...J(t),`forward`,`tcp:${r}`,`localabstract:${o}`]);let s=await import(`node:http`),c=await new Promise(e=>{s.get(`http://localhost:${r}/json`,t=>{let r=``;t.on(`data`,e=>{r+=e}),t.on(`end`,()=>{try{e(JSON.parse(r).find(e=>e.id===n)?.webSocketDebuggerUrl)}catch{e(void 0)}})}).on(`error`,()=>e(void 0))});return c?{success:!0,serial:t,targetId:n,hostPort:r,webSocketDebuggerUrl:c,attached:!0}:{success:!1,error:`Target ${n} not found`}})}async handleDumpsysTool(e){return k(async()=>{let t=O(e,`serial`),n=O(e,`service`),r=T(e,`includeRaw`,!1),i=C(e,`timeoutMs`)??p,{stdout:a,stderr:o}=await Y(await this.resolveAdb(),[...J(t),`shell`,`dumpsys`,n],{allowNonZero:!0,timeoutMs:i}),{parseDumpsys:s}=await import(`./dumpsys-parser-Du-5ruEe.mjs`),c=s(a,n);return{service:n,sectionCount:c.sectionCount,sections:c.sections.slice(0,50),truncated:c.sectionCount>50,stderr:o||void 0,...r?{raw:a}:{}}})}async handleUiDumpTool(e){return k(async()=>{let t=O(e,`serial`),n=T(e,`includeRawXml`,!1),r=S(e,`localPath`),i=C(e,`timeoutMs`)??p,a=await this.resolveAdb(),o=`/sdcard/window_dump.xml`,s=r??M(A(),`ui_dump_${t}_${Date.now()}.xml`),c=await Y(a,[...J(t),`shell`,`uiautomator`,`dump`,o],{allowNonZero:!0,timeoutMs:i});if(c.exitCode!==0&&!c.stdout.includes(`UI hierarchy`))return{success:!1,error:`uiautomator dump failed: ${c.stderr||c.stdout}`,exitCode:c.exitCode};let l=await Y(a,[...J(t),`pull`,o,s],{allowNonZero:!0,timeoutMs:i});await Y(a,[...J(t),`shell`,`rm`,o],{allowNonZero:!0,timeoutMs:5e3});let u=``,d=0;if(l.exitCode===0&&s)try{u=await import(`node:fs`).then(e=>e.promises.readFile(s,`utf-8`));let e=u.match(/<node\b/g);d=e?e.length:0}catch{}return{success:!0,elementCount:d,uiDumpStatus:c.stdout.trim().split(`
4
+ `).pop()??`completed`,localPath:l.exitCode===0?s:void 0,...n?{rawXml:u}:{}}})}};export{ve as ADBBridgeHandlers};
@@ -0,0 +1,109 @@
1
+ import{dt as e,lt as t,n,ut as r}from"./constants-nvsLpSri.mjs";import{n as i}from"./response-R8ghbZSb.mjs";import{c as a,i as o,l as s,n as c,u as l}from"./parse-args-B6dwWc9k.mjs";import{r as u}from"./ResponseBuilder-BLicSCjn.mjs";import d from"node:os";import f from"node:path";const p=[`etw`,`strace`,`dtrace`],m={"nt-kernel":`NT Kernel Logger`,"kernel-process":`{22fb2cd6-0e7b-422b-a0c7-2fad1fd0e716}`,"kernel-network":`{7dd42a49-5329-4832-8dfd-43d979153a88}`,"kernel-file":`{edd08927-9cc4-4e65-b970-c2560fb5c289}`,"kernel-image":`{65d92380-231d-4e56-8f6f-2e1e6e6e6e6e}`},h=[{name:`nt-kernel`,guid:m[`nt-kernel`],description:`Legacy "NT Kernel Logger" session with the Process + File I/O flag (0x10000). The default fallback when no providers are requested; surfaces a baseline mix of process and file events.`},{name:`kernel-process`,guid:m[`kernel-process`],description:"Process lifecycle events: ImageID/ProcessID create + exit with command line and exit code. Feeds the `process_spawn` pattern in syscall_pattern_detect."},{name:`kernel-network`,guid:m[`kernel-network`],description:"Kernel network events: connect / sendto / recvfrom with local + remote addresses. Required for the `network_beacon` pattern on Windows."},{name:`kernel-file`,guid:m[`kernel-file`],description:"File events: CreateFile / Read / Write / Close with full paths. Required for the `file_enum` pattern on Windows."},{name:`kernel-image`,guid:m[`kernel-image`],description:`Image (DLL/EXE) load + unload events with full paths. Useful for tracking payload unpacking and dynamic module loading.`}],g={etw:[{syscall:`NtCreateFile`,args:[f.join(d.tmpdir(),`jshookmcp.log`),`GENERIC_READ`],returnValue:0,duration:.7},{syscall:`NtReadFile`,args:[`handle=0x90`,`buffer=4096`],returnValue:512,duration:.2},{syscall:`NtWriteFile`,args:[`handle=0x90`,`buffer=128`],returnValue:128,duration:.3},{syscall:`NtDeviceIoControlFile`,args:[`handle=0x44`,`code=0x222004`],returnValue:0,duration:1.1}],strace:[{syscall:`openat`,args:[`/tmp/jshookmcp.log`,`O_RDONLY`],returnValue:3,duration:.4},{syscall:`read`,args:[`fd=3`,`count=4096`],returnValue:256,duration:.1},{syscall:`write`,args:[`fd=3`,`count=128`],returnValue:128,duration:.2},{syscall:`connect`,args:[`fd=18`,`127.0.0.1:9222`],returnValue:0,duration:1.4}],dtrace:[{syscall:`open_nocancel`,args:[`/private/tmp/jshookmcp.log`,`O_RDONLY`],returnValue:3,duration:.5},{syscall:`read_nocancel`,args:[`fd=3`,`count=4096`],returnValue:320,duration:.1},{syscall:`write_nocancel`,args:[`fd=3`,`count=128`],returnValue:128,duration:.2},{syscall:`connect`,args:[`fd=21`,`127.0.0.1:9222`],returnValue:0,duration:1.3}]};function _(e){return e===`etw`?process.platform===`win32`:e===`strace`?process.platform===`linux`:e===`dtrace`?process.platform===`darwin`:!1}function v(){return process.platform===`win32`?`etw`:process.platform===`linux`?`strace`:process.platform===`darwin`?`dtrace`:`etw`}function ee(e){return{timestamp:e.timestamp,pid:e.pid,syscall:e.syscall,args:[...e.args],returnValue:e.returnValue,duration:e.duration}}function y(e,t,r,i){let a=!1,o=setTimeout(()=>{if(!a){a=!0;try{i?.()}catch{}r(Error(`${e} did not signal readiness within ${n}ms`))}},n);return{resolveReady(e){a||(a=!0,clearTimeout(o),t(e))},rejectReady(e){a||(a=!0,clearTimeout(o),r(e))}}}function te(e){if(!e||e.length===0)return[`-p`,m[`nt-kernel`],`0x10000`];let t=[];for(let n of e){let e=m[n.toLowerCase()];e&&t.push(`-p`,e,`0xff`)}return t.length>0?t:[`-p`,m[`nt-kernel`],`0x10000`]}function b(e,t){return t?!(t.pid!==void 0&&e.pid!==t.pid||t.name&&t.name.length>0&&!t.name.includes(e.syscall)):!0}function ne(e,t,n){let r=/^(\d+)\s+([\d:.]+)\s+(\w+)\(([^)]*)\)\s*=\s*(-?\d+)(?:\s+<([\d.]+)>)?$/u.exec(e.trim());if(!r)return null;let i=r[3]??`unknown`,a=r[4]??``,o=Number(r[5]),s=r[6]?Number(r[6]):void 0,c=a.split(`,`).map(e=>e.trim()).filter(e=>e.length>0);return{timestamp:Date.now()-n,pid:t,syscall:i,args:c,returnValue:Number.isFinite(o)?o:void 0,duration:s!==void 0&&Number.isFinite(s)?s*1e3:void 0}}function re(e,t,n){let r=/^\[([^\]]+)\]\s+PID=(\d+)\s+(\w+)\s+(.*)$/u.exec(e.trim());if(!r)return null;let i=r[3]??`unknown`,a=r[4]??``,o=Number(r[2]),s=a.split(/\s+/u).filter(e=>e.length>0);return{timestamp:Date.now()-n,pid:Number.isFinite(o)?o:t,syscall:i,args:s}}function ie(e,t,n,r){let i=/^\s*(\d+)\s+\d+\s+(\d+)\s+(\w+):(entry|return)\s+(.*)$/u.exec(e.trim());if(!i)return null;let a=Number(i[2]),o=i[3]??`unknown`,s=i[4]??`entry`,c=i[5]??``,l=Number.isFinite(a)?a:t,u=c.split(/\s+/u).filter(e=>e.length>0);if(!r)return{timestamp:Date.now()-n,pid:l,syscall:o,args:u};if(s===`entry`){let e=u.length>0?Number(u[0]):NaN;return r.set(`${l}:${o}`,{timestampNs:Number.isFinite(e)?e:0,args:u.slice(1)}),null}let d=u[0],f=u[1],p=`${l}:${o}`,m=r.get(p),h=d===void 0?NaN:Number(d);if(m){r.delete(p);let e=f===void 0?NaN:Number(f),t=Number.isFinite(e)?e-m.timestampNs:NaN;return{timestamp:Date.now()-n,pid:l,syscall:o,args:m.args,returnValue:Number.isFinite(h)?h:void 0,duration:Number.isFinite(t)?t/1e6:void 0}}return{timestamp:Date.now()-n,pid:l,syscall:o,args:u.slice(2),returnValue:Number.isFinite(h)?h:void 0}}var ae=class{activeState;capturedEvents=[];lastBackend=v();subprocessError;dtracePendingEntries=new Map;async start(e){let t=e?.backend??v(),n=Date.now();if(!_(t))throw Error(`Backend "${t}" is not available on platform "${process.platform}"`);if(e?.simulate??process.env.JSHOOK_SIMULATE===`1`){this.activeState={backend:t,pid:e?.pid,startedAt:n,generatedEvents:0,etwProviders:t===`etw`?e?.etwProviders:void 0},this.lastBackend=t,this.capturedEvents.length=0,this.generateSyntheticEvents();return}let r=e?.pid??process.pid,i;try{t===`strace`?i=await this.captureWithStrace(r,n):t===`etw`?i=await this.captureWithETW(r,n):t===`dtrace`&&(i=await this.captureWithDTrace(r,n))}catch(r){this.subprocessError=r instanceof Error?r.message:String(r),this.activeState={backend:t,pid:e?.pid,startedAt:n,generatedEvents:0,etwProviders:t===`etw`?e?.etwProviders:void 0},this.lastBackend=t,this.capturedEvents.length=0,this.generateSyntheticEvents();return}this.activeState={backend:t,pid:e?.pid,startedAt:n,generatedEvents:0,subprocess:i,etwProviders:t===`etw`?e?.etwProviders:void 0},this.lastBackend=t,this.capturedEvents.length=0,this.subprocessError=void 0}async stop(){this.activeState?.subprocess&&(this.activeState.subprocess.kill(`SIGTERM`),this.activeState.subprocess=void 0),this.activeState=void 0}async captureEvents(e){return this.activeState&&!this.activeState.subprocess&&this.generateSyntheticEvents(),this.capturedEvents.filter(t=>b(t,e)).map(ee)}getStats(){let e=this.activeState?.backend??this.lastBackend,t=this.activeState?Date.now()-this.activeState.startedAt:0,n=this.activeState;return{eventsCaptured:this.capturedEvents.length,uptime:t,backend:e,subprocessActive:!!n?.subprocess,subprocessError:this.subprocessError,...n?{pid:n.pid,simulate:!n.subprocess,...n.etwProviders?{etwProviders:n.etwProviders}:{}}:{}}}getSupportedBackends(){return p.filter(e=>_(e))}isRunning(){return this.activeState!==void 0}async captureWithStrace(e,t=this.activeState?.startedAt??Date.now()){let{spawn:n}=await import(`node:child_process`);return new Promise((r,i)=>{let a=n(`strace`,[`-p`,String(e),`-f`,`-yy`,`-X`,`verbose`,`-e`,`trace=all`,`-t`],{stdio:[`ignore`,`pipe`,`pipe`]}),o=y(`strace process`,r,i,()=>a.kill(`SIGTERM`)),s=``,c=``;a.stdout?.on(`data`,t=>{c+=t.toString(),this.processLineBuffer(c,e,`strace`)}),a.stderr?.on(`data`,n=>{s+=n.toString();let r=s.split(/\r?\n/u);s=r.pop()??``;for(let n of r)if(n.length>0){let r=ne(n,e,t);r&&this.capturedEvents.push(r)}}),a.on(`error`,e=>{o.rejectReady(Error(`strace process error: ${e.message}. Is strace installed?`))}),a.on(`spawn`,()=>{o.resolveReady(a)})})}async captureWithETW(e,t=this.activeState?.startedAt??Date.now()){let{spawn:n}=await import(`node:child_process`);return new Promise((r,i)=>{let a=n(`logman`,[`create`,`trace`,`JSHookETW_${e}`,...te(this.activeState?.etwProviders??[]),`-o`,`jshook_etw_${e}.etl`,`-ets`],{stdio:[`ignore`,`pipe`,`pipe`],windowsHide:!0}),o=y(`ETW trace session`,r,i,()=>a.kill(`SIGTERM`)),s=``;a.stdout?.on(`data`,n=>{s+=n.toString();let r=s.split(/\r?\n/u);s=r.pop()??``;for(let n of r){let r=re(n,e,t);r&&this.capturedEvents.push(r)}}),a.stderr?.on(`data`,e=>{let t=e.toString().trim();t.length>0&&t.startsWith(`The command completed successfully`)}),a.on(`error`,e=>{o.rejectReady(Error(`ETW trace error: ${e.message}. Run as Administrator.`))}),a.on(`exit`,e=>{e!==0&&e!==void 0&&o.rejectReady(Error(`ETW trace session ended (code ${e}). Check permissions.`))}),a.on(`spawn`,()=>{o.resolveReady(a)})})}async captureWithDTrace(e,t=this.activeState?.startedAt??Date.now()){let{spawn:n}=await import(`node:child_process`);return new Promise((r,i)=>{let a=n(`dtrace`,[`-n`,`
2
+ syscall:::entry
3
+ /pid == ${e}/
4
+ {
5
+ printf("%d %d %s:entry %d %s\\n", pid, pid, probefunc, timestamp, copyinstr(arg0));
6
+ }
7
+ syscall:::return
8
+ /pid == ${e}/
9
+ {
10
+ printf("%d %d %s:return %d %d\\n", pid, pid, probefunc, arg1, timestamp);
11
+ }
12
+ `],{stdio:[`ignore`,`pipe`,`pipe`]}),o=y(`dtrace process`,r,i,()=>a.kill(`SIGTERM`)),s=``;a.stdout?.on(`data`,n=>{s+=n.toString();let r=s.split(/\r?\n/u);s=r.pop()??``;for(let n of r){let r=ie(n,e,t,this.dtracePendingEntries);r&&this.capturedEvents.push(r)}}),a.stderr?.on(`data`,()=>{}),a.on(`error`,e=>{o.rejectReady(Error(`dtrace error: ${e.message}. Run with sudo.`))}),a.on(`spawn`,()=>{o.resolveReady(a)})})}generateSyntheticEvents(){if(!this.activeState)return;let e=g[this.activeState.backend];if(!e)return;let t=Date.now()-this.activeState.startedAt,n=Math.max(1,Math.min(e.length*3,Math.floor(t/150)+1)),r=this.activeState.pid??process.pid;for(;this.activeState.generatedEvents<n;){let t=e[this.activeState.generatedEvents%e.length];if(!t)break;let n=this.activeState.generatedEvents*75;this.capturedEvents.push({timestamp:n,pid:r,syscall:t.syscall,args:[...t.args],returnValue:t.returnValue,duration:t.duration}),this.activeState.generatedEvents+=1}}processLineBuffer(e,t,n){}};const x=[{syscallNames:[`NtCreateFile`,`openat`,`open_nocancel`],jsFunction:`fs.open`,baseConfidence:.8,explanation:`File open syscalls commonly originate from Node.js file-system entry points.`},{syscallNames:[`NtReadFile`,`read`,`read_nocancel`],jsFunction:`fs.readFile`,baseConfidence:.78,explanation:`Read-oriented syscalls usually map back to file or stream reads in JavaScript.`},{syscallNames:[`NtWriteFile`,`write`,`write_nocancel`],jsFunction:`fs.writeFile`,baseConfidence:.78,explanation:`Write-oriented syscalls are strongly associated with Node.js file writes.`},{syscallNames:[`NtDeviceIoControlFile`,`ioctl`],jsFunction:`child_process.spawn`,baseConfidence:.55,explanation:`Device and control syscalls are often triggered by child processes or native helpers.`},{syscallNames:[`connect`,`sendto`,`recvfrom`],jsFunction:`fetch`,baseConfidence:.7,explanation:`Socket syscalls generally indicate outbound network activity from fetch-like APIs.`}];function S(e){return x.find(t=>t.syscallNames.includes(e))}function C(e){return e<0?0:e>1?1:e}function w(e,t){return e.some(e=>t.some(t=>e.toLowerCase().includes(t)))}var T=class{map(e){let t=this.findJSFunction(e.syscall);if(!t)return null;let n=S(e.syscall);if(!n)return null;let r=n.baseConfidence;return t.startsWith(`fs.`)&&w(e.args,[`.js`,`.json`,`.node`])&&(r+=.08),t===`fetch`&&w(e.args,[`80`,`443`,`http`,`https`])&&(r+=.1),{syscall:{timestamp:e.timestamp,pid:e.pid,syscall:e.syscall,args:[...e.args],returnValue:e.returnValue,duration:e.duration},jsFunction:t,confidence:C(r),reasoning:this.getCorrelationReason(e,t)}}findJSFunction(e){let t=S(e);return t?t.jsFunction:null}getCorrelationReason(e,t){let n=S(e.syscall),r=[];return n&&r.push(n.explanation),t.startsWith(`fs.`)&&w(e.args,[`.js`,`.json`,`.node`])&&r.push(`The syscall arguments reference module-like file extensions, which strengthens the fs correlation.`),t===`fetch`&&w(e.args,[`80`,`443`,`http`,`https`])&&r.push(`The syscall arguments look like network endpoints, which aligns with fetch or low-level HTTP clients.`),r.length===0&&r.push(`Mapped ${e.syscall} to ${t} using the default syscall-to-JS heuristic table.`),r.join(` `)}};async function E(){let e=process.platform;if(e===`linux`)try{if(process.geteuid?.()===0)return{hasPermission:!0,platform:e};let{readFileSync:t}=await import(`node:fs`);return t(`/proc/sys/kernel/yama/ptrace_scope`,`utf8`).trim()===`0`?{hasPermission:!0,platform:e}:{hasPermission:!1,platform:e,reason:`strace requires root (EUID=0) or ptrace_scope=0`,requiredCapabilities:[`root`,`CAP_SYS_PTRACE`]}}catch{return{hasPermission:!0,platform:e}}if(e===`win32`)try{let{execFile:t}=await import(`node:child_process`),{promisify:n}=await import(`node:util`);return await n(t)(`logman`,[`query`,`providers`],{timeout:5e3}),{hasPermission:!0,platform:e}}catch{return{hasPermission:!1,platform:e,reason:`ETW trace requires Administrator privileges`,requiredCapabilities:[`Administrator`]}}if(e===`darwin`)try{return process.geteuid?.()===0?{hasPermission:!0,platform:e}:{hasPermission:!1,platform:e,reason:`dtrace requires root privileges on macOS`,requiredCapabilities:[`root`]}}catch{return{hasPermission:!0,platform:e}}return{hasPermission:!0,platform:e}}var D=class{async handleSyscallResolveSsn(e){try{if(process.platform!==`win32`)return{success:!1,error:`NT syscall resolution is Windows-only`,platform:process.platform};let{resolveNtdll:t}=await import(`./syscall-DGZoYM_U.mjs`).then(e=>e.t),n=t(a(e,`ntdllPath`,``).trim()||void 0);return{success:!0,platform:`win32`,path:n.path,syscalls:n.syscalls,tableSize:n.syscalls.length,lookup:n.byName,warnings:n.warnings.length>0?n.warnings:void 0,kernelImageBase:n.kernelImageBase}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async handleSyscallDirectInvoke(e){try{if(process.platform!==`win32`)return{success:!1,error:`Direct NT syscall invocation is Windows-only`,platform:process.platform};let t=l(e,`functionName`).trim();if(!/^Nt[A-Z][a-zA-Z0-9]*$/.test(t)&&!/^Zw[A-Za-z][a-zA-Z0-9]*$/.test(t))return{success:!1,error:`Invalid NT function name: "${t}". Expected format: Nt<Name> or Zw<Name>`};let{resolveNtdll:n}=await import(`./syscall-DGZoYM_U.mjs`).then(e=>e.t),r=n(),i=r.byName[t];if(!i){let e=t.startsWith(`Nt`)?t.replace(/^Nt/,`Zw`):t.replace(/^Zw/,`Nt`);i=r.byName[e]??r.byName[t]}if(!i)return{success:!1,functionName:t,error:`Function "${t}" not found in ntdll export table. Available: ${r.syscalls.map(e=>e.name).slice(0,20).join(`, `)}${r.syscalls.length>20?` (+${r.syscalls.length-20} more)`:``}`};let a=Buffer.alloc(4);a.writeUInt32LE(i.ssn,0);let o=[`4C`,`8B`,`D1`,`B8`,...Array.from(a).map(e=>e.toString(16).padStart(2,`0`).toUpperCase()),`FF`,`25`,`02`,`00`,`00`,`00`,`EB`,`00`,`<syscall_gadget at RVA 0x${r.syscallGadgetRva.toString(16)}>`].join(` `);return{success:!0,functionName:t,ssn:i.ssn,usage:`To invoke ${t} directly:\n1. Allocate an RWX page (VirtualAlloc)\n2. Copy the stub + gadget address into the page\n3. Call the stub as a function pointer\nSSN: 0x${i.ssn.toString(16).padStart(4,`0`)} (${i.ssn})\nStub: ${o}\nGadget RVA: 0x${r.syscallGadgetRva.toString(16)}`,note:`Direct syscall invocation bypasses user-mode hooks (EDR/EAV) placed on ntdll.dll. Syscall numbers are OS-build-specific and may change across Windows versions. Use resolveNtdll() once per boot and cache the result.`}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}};function oe(e){let t=e.debuggerManager;if(!t)return;let n=t.getPausedState()?.callFrames;if(!(!n||n.length===0))return n.map(e=>({functionName:e.functionName||`<anonymous>`,scriptUrl:e.url||void 0,lineNumber:e.location?.lineNumber,columnNumber:e.location?.columnNumber}))}async function se(e,t,n){let r=o(e,`maxEvents`,20),i=c(e,`useDebugger`,!0),a=t.slice(-r),s=new T,l=`heuristic`,u=0,d=0,f=[];for(let e of a){let t={syscall:e},r=!1;if(i&&n){let e=oe(n);e&&(t.stack=e,r=!0,u++)}let a=s.map(e);a&&(t.mapped={jsFunction:a.jsFunction??`unknown`,confidence:a.confidence,reasoning:a.reasoning},r||d++),f.push(t)}return l=u>0&&d>0?`mixed`:u>0?`debugger`:`heuristic`,{success:!0,events:f,eventCount:f.length,withStacks:u,withHeuristicsOnly:d,mode:l}}function O(e){return`${e.syscall}|${e.args.join(`|`)}|${e.returnValue??``}`}function k(e){let t=new Map;for(let n of e)t.set(n.syscall,(t.get(n.syscall)??0)+1);return t}function A(e,t){let n=Math.abs(t-e),r=e+t;if(r===0)return`low`;let i=n/r;return i>.5&&n>=3?`high`:i>.25&&n>=2?`moderate`:`low`}async function j(e,t,n){let r=o(e,`maxDeltas`,30),i=t,a=n,s=new Set(i.map(O)),c=new Set(a.map(O)),l=a.filter(e=>!s.has(O(e))),u=i.filter(e=>!c.has(O(e))),d=k(i),f=k(a),p=new Set([...d.keys(),...f.keys()]),m=[];for(let e of p){let t=d.get(e)??0,n=f.get(e)??0;t!==n&&m.push({name:e,baselineCount:t,targetCount:n,delta:n-t,significance:A(t,n)})}let h=m.toSorted((e,t)=>Math.abs(t.delta)-Math.abs(e.delta)).slice(0,r),g=[];if(l.length>0&&g.push(`${l.length} new syscalls appeared`),u.length>0&&g.push(`${u.length} syscalls disappeared`),h.length>0){let e=h.filter(e=>e.significance===`high`);e.length>0&&g.push(`${e.length} high-significance frequency changes`)}return g.length===0&&g.push(`no significant differences`),{success:!0,baselineCount:i.length,targetCount:a.length,appeared:l,disappeared:u,freqDeltas:h,summary:g.join(`; `)}}function M(e){return`${e.syscall}|${e.args.join(`|`)}|${e.returnValue??``}|${e.pid}`}function N(e,t){if(e.length===0)return[];let n=[e[0]],r=new Map;r.set(M(e[0]),e[0].timestamp);for(let i=1;i<e.length;i++){let a=e[i],o=M(a),s=r.get(o);s!==void 0&&a.timestamp-s<t||(r.set(o,a.timestamp),n.push(a))}return n}async function P(e,t){let n=o(e,`minTimestamp`,0),r=o(e,`maxTimestamp`,0),i=c(e,`deduplicate`,!1),a=o(e,`dedupWindowMs`,100),s=c(e,`includeNdjson`,!0),l=t.length,u=[...t],d=0;if(n>0||r>0){let e=u.length;u=u.filter(e=>!(n>0&&e.timestamp<n||r>0&&e.timestamp>r)),d=e-u.length}let f=0;if(i){let e=u.length;u=N(u,a),f=e-u.length}let p={success:!0,events:u.slice(0,1e4),eventCount:u.length,totalCaptured:l,filteredOut:d,deduplicatedOut:f,filters:{minTimestamp:n>0?n:void 0,maxTimestamp:r>0?r:void 0,deduplicate:i,...i?{dedupWindowMs:a}:{}}};return s&&u.length>0&&(p.ndjson=u.slice(0,5e3).map(e=>JSON.stringify(e)).join(`
13
+ `)),p}const F=[`read`,`write`,`openat`,`close`,`fstat`,`mmap`,`mprotect`,`munmap`,`brk`,`ioctl`,`connect`,`sendto`,`recvfrom`,`clone`,`execve`];function I(e){return/^[a-z][a-z0-9_]*$/.test(e)&&e.length<=64}function L(e,t){return e[t]===!0}function R(e,t,n){let r=e>0?`/pid == ${e}/`:``,i=t.map(e=>`tracepoint:syscalls:sys_enter_${e}`).join(`, `),a=t.map(e=>`tracepoint:syscalls:sys_exit_${e}`).join(`, `);return`#!/usr/bin/env bpftrace
14
+ // Generated by jshookmcp syscall_ebpf_attach
15
+ // Target PID: ${e||`all`} | Duration: ${n}s | Syscalls: ${t.join(`, `)}
16
+
17
+ BEGIN {
18
+ printf("{\\"type\\":\\"start\\",\\"targetPid\\":%d,\\"durationSec\\":%d,\\"syscalls\\":[%s]}\\n",
19
+ ${e||0}, ${n}, "${t.join(`","`)}");
20
+ }
21
+
22
+ ${i} ${r}
23
+ {
24
+ @enter_ts[tid] = nsecs;
25
+ printf("{\\"type\\":\\"enter\\",\\"elapsedMs\\":%llu,\\"pid\\":%d,\\"tid\\":%d,\\"syscall\\":\\"%s\\",\\"args\\":\\"\\"",
26
+ elapsed / 1000000, pid, tid, probe);
27
+ if (probe == "tracepoint:syscalls:sys_enter_openat" || probe == "tracepoint:syscalls:sys_enter_open") {
28
+ printf("\\"pathname\\": \\"%s\\", \\"flags\\": %d, \\"mode\\": %d", str(args->pathname), args->flags, args->mode);
29
+ } else if (probe == "tracepoint:syscalls:sys_enter_read" || probe == "tracepoint:syscalls:sys_enter_write") {
30
+ printf("\\"fd\\": %d, \\"count\\": %d", args->fd, args->count);
31
+ } else if (probe == "tracepoint:syscalls:sys_enter_connect") {
32
+ printf("\\"fd\\": %d", args->fd);
33
+ } else if (probe == "tracepoint:syscalls:sys_enter_mmap") {
34
+ printf("\\"addr\\": %llu, \\"length\\": %llu, \\"prot\\": %d, \\"flags\\": %d, \\"fd\\": %d",
35
+ args->addr, args->length, args->prot, args->flags, args->fd);
36
+ } else if (probe == "tracepoint:syscalls:sys_enter_execve") {
37
+ printf("\\"filename\\": \\"%s\\"", str(args->filename));
38
+ }
39
+ printf("\\"}\\n");
40
+ }
41
+
42
+ ${a} ${r}
43
+ {
44
+ $elapsed_ns = nsecs - @enter_ts[tid];
45
+ printf("{\\"type\\":\\"exit\\",\\"elapsedMs\\":%llu,\\"pid\\":%d,\\"tid\\":%d,\\"syscall\\":\\"%s\\",\\"ret\\":%d,\\"durationUs\\":%llu}\\n",
46
+ elapsed / 1000000, pid, tid, probe, args->ret, $elapsed_ns / 1000);
47
+ delete(@enter_ts[tid]);
48
+ }
49
+
50
+ interval:s:${n} {
51
+ printf("{\\"type\\":\\"stop\\",\\"elapsedMs\\":%llu}\\n", elapsed / 1000000);
52
+ exit();
53
+ }
54
+
55
+ END {
56
+ printf("{\\"type\\":\\"end\\",\\"elapsedMs\\":%llu}\\n", elapsed / 1000000);
57
+ clear(@enter_ts);
58
+ }
59
+ `}function z(e,t,n){let r=[],i=[],a=0,o=0,s=new Map;for(let c of e){let e=c.trim();if(!e)continue;let l;try{l=JSON.parse(e)}catch{i.push(`Unparseable bpftrace line: ${e.substring(0,80)}`);continue}let u=typeof l.type==`string`?l.type:void 0;if(!(u===`start`||u===`stop`||u===`end`)){if(u===`enter`){a++;let e=typeof l.tid==`number`?l.tid:void 0,r=typeof l.elapsedMs==`number`?l.elapsedMs:void 0,i=typeof l.pid==`number`?l.pid:t,o=B(typeof l.syscall==`string`?l.syscall:``,n);if(!o||e===void 0||r===void 0)continue;let c=V(l);s.set(e,{elapsedMs:r,pid:i,syscall:o,args:c})}else if(u===`exit`){o++;let e=typeof l.tid==`number`?l.tid:void 0,i=typeof l.elapsedMs==`number`?l.elapsedMs:void 0,a=typeof l.ret==`number`?l.ret:void 0,c=typeof l.durationUs==`number`?l.durationUs:void 0,u=B(typeof l.syscall==`string`?l.syscall:``,n);if(e===void 0||i===void 0)continue;let d=s.get(e),f=d?.syscall??u??`unknown`,p=d?.args??[],m=d?.pid??(typeof l.pid==`number`?l.pid:t);s.delete(e),r.push({timestamp:i,pid:m,syscall:f,args:p,returnValue:a,duration:c===void 0?void 0:c/1e3})}}}for(let[,e]of s)r.push({timestamp:e.elapsedMs,pid:e.pid,syscall:e.syscall,args:e.args});return{events:r,warnings:i,enterCount:a,exitCount:o}}function B(e,t){let n=/sys_(?:enter|exit)_(\w+)$/.exec(e);if(!n)return;let r=n[1];return t.includes(r),r}function V(e){let t=[];for(let n of[`pathname`,`fd`,`count`,`flags`,`mode`,`addr`,`length`,`prot`,`filename`]){let r=e[n];(typeof r==`string`||typeof r==`number`)&&t.push(`${n}=${r}`)}return t}async function H(){if(process.platform!==`linux`)return{available:!1,liveCapable:!1,reason:`Platform ${process.platform} does not support bpftrace`};try{let{execFile:e}=await import(`node:child_process`),{promisify:t}=await import(`node:util`),{stdout:n}=await t(e)(`bpftrace`,[`--version`],{timeout:5e3});return{available:n.trim().length>0,liveCapable:!0}}catch{return{available:!1,liveCapable:!0,reason:`bpftrace binary not found. Install with: apt install bpftrace (Debian/Ubuntu) or equivalent.`}}}async function U(e,t,n){let r=R(e,t,n);return new Promise((i,a)=>{import(`node:child_process`).then(({spawn:o})=>{let s=o(`bpftrace`,[`-e`,r],{stdio:[`ignore`,`pipe`,`pipe`],env:{...process.env}}),c=[],l=[],u=``,d=!1,f=setTimeout(()=>{if(!d){d=!0;try{s.kill(`SIGTERM`)}catch{}if(c.length>0){let{events:n,warnings:a}=z(c,e,t);i({events:n,warnings:[...l,...a],script:r})}else a(Error(`bpftrace timed out after ${n+5}s with no output`))}},(n+5)*1e3);s.stdout?.on(`data`,e=>{let t=e.toString().split(`
60
+ `);for(let e of t)c.push(e)}),s.stderr?.on(`data`,e=>{u+=e.toString();let t=u.split(`
61
+ `),n=t.pop()??``;for(let e of t)e.trim()&&l.push(e.trim());u=n}),s.on(`error`,e=>{d||(d=!0,clearTimeout(f),a(Error(`bpftrace spawn failed: ${e.message}. Is bpftrace installed?`)))}),s.on(`close`,n=>{if(d)return;if(d=!0,clearTimeout(f),u.trim()&&l.push(u.trim()),n!==0&&c.length===0){a(Error(`bpftrace exited with code ${n}: ${l.join(`; `)}`));return}let{events:o,warnings:s,enterCount:p,exitCount:m}=z(c,e,t);p>0&&m===0&&l.push(`No exit tracepoints captured. Ensure kernel supports sys_exit tracepoints.`),i({events:o,warnings:[...l,...s],script:r})})}).catch(a)})}function W(e,t,n){let r=[],i=Math.max(5,Math.min(t.length*3,Math.floor(n*4))),a=n*1e3/i;for(let n=0;n<i;n++){let i=t[n%t.length],o=n>0?(Math.random()-.5)*a*.6:0,s=n*a+o;r.push({timestamp:Math.max(0,Math.round(s*100)/100),pid:e||1234,syscall:i,args:G(i,n),returnValue:n%4==0?-1:(n+1)*64,duration:Math.round(Math.random()*200)/100})}return r}function G(e,t){switch(e){case`read`:case`write`:return[`fd=${t%7+3}`,`count=${(t+1)*128}`];case`openat`:return[`pathname=/tmp/jshook_${t}.log`,`flags=${t%2==0?`O_RDONLY`:`O_RDWR`}`,`mode=0644`];case`close`:return[`fd=${t%7+3}`];case`connect`:return[`fd=${t%5+10}`,`addr=127.0.0.1:${8080+t}`];case`sendto`:case`recvfrom`:return[`fd=${t%5+10}`,`count=${(t+1)*256}`];case`mmap`:return[`addr=0x0`,`length=${(t+1)*4096}`,`prot=${t%2==0?3:7}`,`flags=34`];case`mprotect`:return[`addr=0x7f000000`,`length=${(t+1)*4096}`,`prot=${t%2==0?1:7}`];case`clone`:return[`flags=0x3d0f00`];case`execve`:return[`filename=/usr/bin/sleep`];case`ioctl`:return[`fd=${t%7+3}`,`request=0x${(21504+t).toString(16)}`];default:return[`arg0=0x${(100+t).toString(16)}`]}}async function K(e){let t;if(e.pid!==void 0&&e.pid!==null&&(t=o(e,`pid`),t===void 0||!Number.isInteger(t)||t<0))return{success:!1,error:`pid must be a non-negative integer (0 for all processes)`,pid:0,durationSec:0,syscallsTraced:[],eventCount:0,mode:`script`,liveCapable:!1,bpftraceAvailable:!1};let n=t??0,r=s(e,`syscalls`);if(e.syscalls!==void 0&&r.length===0)return{success:!1,error:`syscalls must be an array of valid syscall name strings`,pid:n,durationSec:0,syscallsTraced:[],eventCount:0,mode:`script`,liveCapable:!1,bpftraceAvailable:!1};let i=r.length>0?[...new Set(r.map(e=>e.trim().toLowerCase()).filter(Boolean))]:[...F],a=i.filter(e=>!I(e));if(a.length>0)return{success:!1,error:`Invalid syscall names (must be lowercase alphanumeric with underscores): ${a.join(`, `)}`,pid:n,durationSec:0,syscallsTraced:i,eventCount:0,mode:`script`,liveCapable:!1,bpftraceAvailable:!1};let c=o(e,`durationSec`)??10;if(Number.isFinite(c)||(c=10),c<1||c>300)return{success:!1,error:`durationSec must be between 1 and 300`,pid:n,durationSec:c,syscallsTraced:i,eventCount:0,mode:`script`,liveCapable:!1,bpftraceAvailable:!1};if(L(e,`simulate`)){let e=W(n,i,c);return{success:!0,mode:`simulated`,pid:n,durationSec:c,syscallsTraced:i,events:e,eventCount:e.length,liveCapable:process.platform===`linux`,bpftraceAvailable:!1,isSimulated:!0}}let l=await H();if(l.available&&l.liveCapable)try{let{events:e,warnings:t}=await U(n,i,c);return{success:!0,mode:`live`,pid:n,durationSec:c,syscallsTraced:i,events:e,eventCount:e.length,liveCapable:!0,bpftraceAvailable:!0,...t.length>0?{script:`# Capture warnings:\n# ${t.join(`
62
+ # `)}`}:{}}}catch(e){return{success:!1,error:`Live eBPF attach failed: ${e instanceof Error?e.message:String(e)}`,mode:`script`,pid:n,durationSec:c,syscallsTraced:i,eventCount:0,liveCapable:!0,bpftraceAvailable:l.available}}let u=R(n,i,c);return{success:!0,mode:`script`,pid:n,durationSec:c,syscallsTraced:i,eventCount:0,script:u,usage:`bpftrace -e '${u.replace(/'/g,`'\\''`)}'`,liveCapable:l.liveCapable,bpftraceAvailable:l.available}}function ce(e){let t=e.debuggerManager;if(!t)return;let n=t.getPausedState()?.callFrames;if(!(!n||n.length===0))return n.map(e=>({functionName:e.functionName||`<anonymous>`,scriptUrl:e.url||void 0,lineNumber:e.location?.lineNumber,columnNumber:e.location?.columnNumber}))}async function le(e,t,n){let r=o(e,`maxEvents`,50),i=c(e,`useDebugger`,!0),a=t.slice(-r),s=new T,l;i&&n&&(l=ce(n));let u=new Map,d=0;for(let e of a){let t=s.map(e),n=l?.[0],r=t?.jsFunction,i,a;n?(i=n.functionName,a=`debugger`):r?(i=r,a=`heuristic`):(i=`<unmapped>`,a=`unknown`,d++);let o=n?1:t?.confidence??0,c=u.get(i);c||(c={jsFunction:i,totalEvents:0,sources:new Set,syscallStats:new Map,...n?{topFrame:n}:{}},u.set(i,c)),c.totalEvents++,c.sources.add(a),n&&!c.topFrame&&(c.topFrame=n);let f=c.syscallStats.get(e.syscall)??{count:0,confidenceSum:0,sampleArgs:[]};f.count++,f.confidenceSum+=o,e.args.length>0&&(f.sampleArgs=e.args.slice(0,4)),c.syscallStats.set(e.syscall,f)}let f=[],p=!1,m=!1;for(let e of u.values()){let t=Array.from(e.syscallStats.entries()).map(([e,t])=>({syscall:e,count:t.count,avgConfidence:t.count>0?Number((t.confidenceSum/t.count).toFixed(3)):0,sampleArgs:t.sampleArgs})).toSorted((e,t)=>t.count-e.count),n=e.sources,r;n.has(`debugger`)?(r=`debugger`,p=!0):n.has(`heuristic`)?(r=`heuristic`,m=!0):r=`unknown`,f.push({jsFunction:e.jsFunction,totalEvents:e.totalEvents,source:r,syscalls:t,...e.topFrame?{topFrame:e.topFrame}:{}})}if(f=f.toSorted((e,t)=>t.totalEvents-e.totalEvents),p&&m)for(let e of f)(e.source===`debugger`||e.source===`heuristic`)&&(e.source=`mixed`);let h=p&&m?`mixed`:p?`debugger`:`heuristic`;return{success:!0,eventsAnalyzed:a.length,unmappedCount:d,mode:h,origins:f}}const ue=[{kind:`anti_debug`,name:`Anti-debug probe`,description:`Debugger detection via ptrace / IsDebuggerPresent / NtQueryInformationProcess. Common in packed and anti-analysis binaries.`,syscalls:new Set([`ptrace`,`IsDebuggerPresent`,`CheckRemoteDebuggerPresent`,`NtQueryInformationProcess`,`NtSetInformationThread`]),minDistinct:0,minEvents:1},{kind:`fingerprint`,name:`System fingerprinting`,description:`Rapid sequence of identity queries (uname / getuid / sysinfo / hostname). Typical of environment fingerprinting before beaconing or payload selection.`,syscalls:new Set([`uname`,`getuid`,`geteuid`,`getgid`,`getegid`,`sysinfo`,`gethostname`,`getdomainname`]),minDistinct:2,minEvents:3},{kind:`file_enum`,name:`Filesystem enumeration`,description:`Repeated directory enumeration (openat + getdents/readdir + stat). Indicates file discovery, often followed by exfiltration or targeted reads.`,syscalls:new Set([`openat`,`open`,`getdents`,`getdents64`,`readdir`,`stat`,`lstat`,`newfstatat`,`access`,`faccessat`]),minDistinct:2,minEvents:5},{kind:`network_beacon`,name:`Network beaconing`,description:`Outbound socket activity (connect / sendto / recvfrom). Periodic clustering suggests C2 beaconing or telemetry polling.`,syscalls:new Set([`connect`,`sendto`,`recvfrom`,`sendmsg`,`recvmsg`,`getpeername`,`getsockname`]),minDistinct:1,minEvents:3},{kind:`process_spawn`,name:`Process spawning`,description:`Child-process creation (clone / fork / execve / CreateProcess). May indicate process hollowing, lateral movement, or legitimate helper launch.`,syscalls:new Set([`clone`,`clone3`,`fork`,`vfork`,`execve`,`execveat`,`CreateProcess`,`CreateProcessAsUser`,`CreateRemoteThread`]),minDistinct:1,minEvents:1},{kind:`registry_probe`,name:`Windows registry probing`,description:`Registry key enumeration (RegOpenKey / RegQueryValue / NtEnumerateKey). Common in persistence installation and software inventory fingerprinting.`,syscalls:new Set([`RegOpenKey`,`RegOpenKeyEx`,`RegQueryValue`,`RegQueryValueEx`,`RegEnumKey`,`RegEnumValue`,`NtOpenKey`,`NtQueryKey`,`NtEnumerateKey`]),minDistinct:2,minEvents:3}];async function de(e,t){let n=o(e,`maxEvents`,200),r=t.slice(-n),i=[];for(let e of ue){let t=r.filter(t=>e.syscalls.has(t.syscall));if(t.length<e.minEvents)continue;let n=new Set(t.map(e=>e.syscall));if(n.size<e.minDistinct)continue;let a=fe(t.length,n.size,e);i.push({kind:e.kind,name:e.name,description:e.description,confidence:Number(a.toFixed(3)),eventCount:t.length,eventTimestamps:t.map(e=>e.timestamp).slice(0,50),syscalls:Array.from(n).toSorted()})}let a=i.toSorted((e,t)=>t.confidence-e.confidence);return{success:!0,eventsAnalyzed:r.length,patterns:a}}function fe(e,t,n){let r=Math.min(e/Math.max(n.minEvents*2,4),1),i=n.minDistinct>0?Math.min(t/(n.minDistinct+1),1):.5,a=(n.minEvents<=1?.5:.4)+.3*r+.2*i;return Math.max(0,Math.min(1,a))}function q(e){return typeof e==`object`&&!!e}function J(e){if(typeof e==`number`&&Number.isFinite(e))return e}function Y(e){if(typeof e==`boolean`)return e}function pe(e){if(typeof e==`string`)return e}function X(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(typeof n!=`string`)return;t.push(n)}return t}const me=/^[a-z][a-z0-9_]*$/,he=new Set(Object.keys(m));function ge(e){return me.test(e)&&e.length<=64}function _e(e){let t=X(e);if(!t)return;let n=[],r=new Set;for(let e of t){let t=e.trim().toLowerCase();!t||r.has(t)||(r.add(t),n.push(t))}return n}function ve(e){if(e===`etw`||e===`strace`||e===`dtrace`)return e}function ye(e){if(!e||e.length===0)return;let t=new Set,n=[],r=[];for(let i of e){let e=i.toLowerCase();t.has(e)||(t.add(e),he.has(e)?n.push(e):r.push(e))}return{validProviders:n,unknownProviders:r}}function Z(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function be(e){if(e===void 0)return{ok:!0};if(!q(e))return{ok:!1,error:`filter must be an object when provided`};let t={};if(Z(e,`name`)&&e.name!==void 0){let n=X(e.name);if(!n)return{ok:!1,error:`filter.name must be an array of strings when provided`};t.name=n}if(Z(e,`pid`)&&e.pid!==void 0){let n=J(e.pid);if(n===void 0)return{ok:!1,error:`filter.pid must be a number when provided`};t.pid=n}return{ok:!0,filter:t}}function Q(e){if(!q(e))return!1;let t=J(e.timestamp),n=J(e.pid),r=pe(e.syscall),i=X(e.args),a=e.returnValue,o=e.duration,s=a===void 0||J(a)!==void 0,c=o===void 0||J(o)!==void 0;return t!==void 0&&n!==void 0&&r!==void 0&&i!==void 0&&s&&c}function xe(e){return{timestamp:e.timestamp,pid:e.pid,syscall:e.syscall,args:[...e.args],returnValue:e.returnValue,duration:e.duration}}function Se(e){let t={},n={},r={},i={},a={},o=0,s=0,c=0;for(let l of e)t[l.syscall]=(t[l.syscall]??0)+1,n[String(l.pid)]=(n[String(l.pid)]??0)+1,typeof l.returnValue==`number`&&l.returnValue<0&&(o++,r[l.syscall]=(r[l.syscall]??0)+1),typeof l.duration==`number`&&Number.isFinite(l.duration)&&(s+=l.duration,c++,i[l.syscall]=(i[l.syscall]??0)+l.duration,a[l.syscall]=(a[l.syscall]??0)+1);let l=Object.keys(t).map(e=>{let n=t[e]??0,o=a[e]??0,s=i[e]??0,c={name:e,count:n,errorCount:r[e]??0};return o>0&&(c.avgDurationMs=s/o),c}).toSorted((e,t)=>t.count-e.count||e.name.localeCompare(t.name)).slice(0,20),u=Object.entries(n).map(([e,t])=>({pid:Number(e),count:t})).toSorted((e,t)=>t.count-e.count||e.pid-t.pid).slice(0,20);return{total:e.length,bySyscall:t,byPid:n,errorCount:o,averageDuration:c>0?s/c:void 0,topSyscalls:l,topPids:u}}function $(e){return e instanceof Error?e.message:`Unknown syscall-hook error`}var Ce=class{monitor;mapper;eventBus;directNt;ctx;constructor(e,t,n,r=new D,i){this.monitor=e,this.mapper=t,this.eventBus=n,this.directNt=r,this.ctx=i}async handleSyscallStartMonitorTool(e){return u(async()=>await this.handleSyscallStartMonitor(e))}async handleSyscallStopMonitorTool(){return u(async()=>await this.handleSyscallStopMonitor())}async handleSyscallCaptureEventsTool(e){return u(async()=>await this.handleSyscallCaptureEvents(e))}async handleSyscallCorrelateJsTool(e){return u(async()=>await this.handleSyscallCorrelateJs(e))}async handleSyscallFilterTool(e){return u(async()=>await this.handleSyscallFilter(e))}async handleSyscallGetStatsTool(){return u(async()=>await this.handleSyscallGetStats())}async handleSyscallEbpfTraceTool(e){return u(async()=>await this.handleSyscallEbpfTrace(e))}async handleSyscallResolveSsnTool(e){return u(async()=>await this.handleSyscallResolveSsn(e))}async handleSyscallDirectInvokeTool(e){return u(async()=>await this.handleSyscallDirectInvoke(e))}async handleSyscallStackCaptureTool(e){return u(async()=>await this.handleSyscallStackCapture(e))}async handleSyscallTraceCompareTool(e){return u(async()=>await this.handleSyscallTraceCompare(e))}async handleSyscallTraceExportTool(e){return u(async()=>await this.handleSyscallTraceExport(e))}async handleSyscallEbpfAttachTool(e){return u(async()=>await this.handleSyscallEbpfAttach(e))}async handleSyscallOriginMapTool(e){return u(async()=>await this.handleSyscallOriginMap(e))}async handleSyscallPatternDetectTool(e){return u(async()=>await this.handleSyscallPatternDetect(e))}async handleSyscallStartMonitor(e){let t=ve(e.backend);if(!t)return{ok:!1,error:`backend must be one of: etw, strace, dtrace`};let n=J(e.pid),r=Y(e.simulate)??!1;if(e.pid!==void 0&&e.pid!==null&&(n===void 0||!Number.isInteger(n)||n<0))return{ok:!1,error:`pid must be a non-negative integer when provided`};let a=n;if(process.env.NODE_ENV!==`test`&&process.env.VITEST!==`true`){let e=await E();if(!e.hasPermission)return i({success:!1,error:e.reason,platform:e.platform,requiredCapabilities:e.requiredCapabilities})}let o=this.ensureMonitor(),s=t===`etw`?ye(X(e.etwProviders)):void 0;try{return await o.start({backend:t,pid:a,simulate:r,...s&&s.validProviders.length>0?{etwProviders:s.validProviders}:{}}),this.eventBus?.emit(`syscall:trace_started`,{backend:t,pid:a,simulate:r,timestamp:new Date().toISOString()}),{ok:!0,started:!0,backend:t,pid:a,simulate:r,stats:o.getStats(),...s&&s.unknownProviders.length>0?{etwProviderWarning:{unknownProviders:s.unknownProviders,validProviders:s.validProviders,availableProviders:h.map(e=>e.name)}}:{}}}catch(e){return{ok:!1,error:$(e),requestedBackend:t,supportedBackends:o.getSupportedBackends()}}}async handleSyscallStopMonitor(){let e=this.ensureMonitor();try{return await e.stop(),{ok:!0,stopped:!0,stats:e.getStats()}}catch(e){return{ok:!1,error:$(e)}}}async handleSyscallCaptureEvents(e){let t=this.ensureMonitor(),n=be(e.filter);if(!n.ok)return{ok:!1,error:n.error};let r=n.filter,i=J(e.minTimestamp);if(e.minTimestamp!==void 0&&e.minTimestamp!==null&&i===void 0)return{ok:!1,error:`minTimestamp must be a number when provided`};let a=J(e.maxTimestamp);if(e.maxTimestamp!==void 0&&e.maxTimestamp!==null&&a===void 0)return{ok:!1,error:`maxTimestamp must be a number when provided`};let o=J(e.limit);if(e.limit!==void 0&&e.limit!==null&&(o===void 0||!Number.isInteger(o)||o<1))return{ok:!1,error:`limit must be a positive integer when provided`};let s=Y(e.includeSummary)??!0;if(e.includeSummary!==void 0&&e.includeSummary!==null&&Y(e.includeSummary)===void 0)return{ok:!1,error:`includeSummary must be a boolean when provided`};let c=await t.captureEvents(r),l=c;i!==void 0&&(l=l.filter(e=>e.timestamp>=i)),a!==void 0&&(l=l.filter(e=>e.timestamp<=a));let u=l.length;return o!==void 0&&l.length>o&&(l=l.slice(l.length-o)),{ok:!0,events:l,count:l.length,totalBeforePostFilters:c.length,totalAfterTimeFilter:u,summary:s?Se(l):void 0,stats:t.getStats()}}async handleSyscallCorrelateJs(e){let t=e.syscallEvents;if(!Array.isArray(t)||!t.every(e=>Q(e)))return{ok:!1,error:`syscallEvents must be an array of valid SyscallEvent objects`};let n=this.ensureMapper(),r=[],i=[];for(let e of t){let t=xe(e),a=n.map(t);a?r.push(a):i.push(t)}return{ok:!0,correlations:r,matched:r.length,unmatched:i}}async handleSyscallFilter(e){let t=X(e.names);if(e.names!==void 0&&t===void 0)return{ok:!1,error:`names must be an array of strings when provided`};let n=J(e.pid);if(e.pid!==void 0&&e.pid!==null&&n===void 0)return{ok:!1,error:`pid must be a number when provided`};let r=J(e.returnValueMin);if(e.returnValueMin!==void 0&&e.returnValueMin!==null&&r===void 0)return{ok:!1,error:`returnValueMin must be a number when provided`};let i=J(e.returnValueMax);if(e.returnValueMax!==void 0&&e.returnValueMax!==null&&i===void 0)return{ok:!1,error:`returnValueMax must be a number when provided`};let a=Y(e.errorOnly);if(e.errorOnly!==void 0&&e.errorOnly!==null&&a===void 0)return{ok:!1,error:`errorOnly must be a boolean when provided`};let o=a??!1,s={};t&&t.length>0&&(s.name=t),n!==void 0&&(s.pid=n);let c=await this.ensureMonitor().captureEvents(s.name!==void 0||s.pid!==void 0?s:void 0),l=c;return r!==void 0&&(l=l.filter(e=>typeof e.returnValue==`number`&&e.returnValue>=r)),i!==void 0&&(l=l.filter(e=>typeof e.returnValue==`number`&&e.returnValue<=i)),o&&(l=l.filter(e=>typeof e.returnValue==`number`&&e.returnValue<0)),{ok:!0,names:t,pid:n,returnValueMin:r,returnValueMax:i,errorOnly:o,events:l,count:l.length,totalBeforeFilters:c.length}}async handleSyscallGetStats(){let e=this.ensureMonitor();return{ok:!0,...e.getStats(),running:e.isRunning(),supportedBackends:e.getSupportedBackends(),etwProviderCatalog:h}}async handleSyscallEbpfTrace(n){let i=J(n.pid),a=_e(n.syscalls),o=J(n.durationSec)??t,s=Y(n.simulate)??!1;if(n.pid!==void 0&&n.pid!==null&&(i===void 0||!Number.isInteger(i)||i<0))return{ok:!1,error:`pid must be a non-negative integer (0 for all processes)`};let c=i??0;if(o<e||o>r)return{ok:!1,error:`durationSec must be between ${e} and ${r}`};if(a?.length){let e=a.filter(e=>!ge(e));if(e.length>0)return{ok:!1,error:`Invalid syscall names (must be lowercase alphanumeric with underscores): ${e.join(`, `)}`}}if(s){let e=[],t=a?.length?a:[`read`,`write`,`openat`,`close`,`fstat`,`mmap`,`mprotect`,`munmap`,`brk`,`ioctl`],n=o*50,r=0;for(let i=0;i<20;i++){if(i>0){let e=(Math.random()-.5)*.6*n;r+=n+e}e.push({timestamp:r,pid:c||1234,syscall:t[i%t.length]??`read`,args:[`fd=${i%5+3}`,`count=${(i+1)*64}`],returnValue:i%3==0?-1:(i+1)*64,duration:Math.random()*2})}return{ok:!0,backend:`ebpf`,_simulated:!0,simulated:!0,pid:c,durationSec:o,events:e,count:e.length,syscallsTraced:t,warning:`This is simulated data with synthetic timestamps and patterns. Use simulate: false for real syscall tracing.`}}let l=a?.length?a:[`read`,`write`,`openat`,`close`,`fstat`,`mmap`,`mprotect`,`munmap`,`brk`,`ioctl`,`connect`,`sendto`,`recvfrom`,`clone`,`execve`],u=c>0?`/pid == ${c}/`:``,d=l.map(e=>`tracepoint:syscalls:sys_enter_${e}`).join(`, `),f=l.map(e=>`tracepoint:syscalls:sys_exit_${e}`).join(`, `),p=`#!/usr/bin/env bpftrace
63
+ // Generated by jshookmcp syscall_ebpf_trace
64
+ // Target PID: ${c||`all`} | Duration: ${o}s | Syscalls: ${l.join(`, `)}
65
+
66
+ BEGIN {
67
+ printf("=== eBPF syscall trace started (pid=${c||`all`}, duration=${o}s) ===\\n");
68
+ }
69
+
70
+ ${d} ${u}
71
+ {
72
+ @enter_ts[tid] = nsecs;
73
+ printf("{\\"timestamp\\": %llu, \\"pid\\": %d, \\"tid\\": %d, \\"syscall\\": \\"%s\\", \\"phase\\": \\"enter\\", \\"args\\": {",
74
+ elapsed / 1000000, pid, tid, probe);
75
+ // Log key arguments based on syscall
76
+ if (probe == "tracepoint:syscalls:sys_enter_openat" || probe == "tracepoint:syscalls:sys_enter_open") {
77
+ printf("\\"pathname\\": \\"%s\\", \\"flags\\": %d, \\"mode\\": %d", args->pathname, args->flags, args->mode);
78
+ } else if (probe == "tracepoint:syscalls:sys_enter_read" || probe == "tracepoint:syscalls:sys_enter_write") {
79
+ printf("\\"fd\\": %d, \\"count\\": %d", args->fd, args->count);
80
+ } else if (probe == "tracepoint:syscalls:sys_enter_connect") {
81
+ printf("\\"fd\\": %d", args->fd);
82
+ } else if (probe == "tracepoint:syscalls:sys_enter_mmap") {
83
+ printf("\\"addr\\": %llu, \\"length\\": %llu, \\"prot\\": %d, \\"flags\\": %d, \\"fd\\": %d", args->addr, args->length, args->prot, args->flags, args->fd);
84
+ } else if (probe == "tracepoint:syscalls:sys_enter_execve") {
85
+ printf("\\"filename\\": \\"%s\\"", args->filename);
86
+ } else {
87
+ printf("\\"raw_args\\": \\"(see bpftrace -v output)\\"");
88
+ }
89
+ printf("}}\\n");
90
+ }
91
+
92
+ ${f} ${u}
93
+ {
94
+ $elapsed_ns = nsecs - @enter_ts[tid];
95
+ printf("{\\"timestamp\\": %llu, \\"pid\\": %d, \\"tid\\": %d, \\"syscall\\": \\"%s\\", \\"phase\\": \\"exit\\", \\"ret\\": %d, \\"duration_us\\": %llu}\\n",
96
+ elapsed / 1000000, pid, tid, probe, args->ret, $elapsed_ns / 1000);
97
+ delete(@enter_ts[tid]);
98
+ }
99
+
100
+ interval:s:${o} {
101
+ printf("=== Trace duration (${o}s) elapsed, exiting ===\\n");
102
+ exit();
103
+ }
104
+
105
+ END {
106
+ printf("=== eBPF syscall trace complete ===\\n");
107
+ clear(@enter_ts);
108
+ }
109
+ `;return{ok:!0,backend:`ebpf`,mode:`script`,pid:c,durationSec:o,syscallCount:l.length,syscallsTraced:l,script:p,usage:`bpftrace -e '${p.replace(/'/g,`'\\''`)}'`,note:`Run the generated bpftrace script on a Linux system with bpftrace installed and CAP_BPF/root privileges.`,requiredCapabilities:[`CAP_BPF`,`root`,`bpftrace`]}}async handleSyscallResolveSsn(e){return this.directNt.handleSyscallResolveSsn(e)}async handleSyscallDirectInvoke(e){return this.directNt.handleSyscallDirectInvoke(e)}async handleSyscallStackCapture(e){return se(e,await this.ensureMonitor().captureEvents(),this.ctx)}async handleSyscallTraceCompare(e){let t=e.baselineEvents,n=e.targetEvents;return!Array.isArray(t)||!t.every(e=>Q(e))?{ok:!1,error:`baselineEvents must be an array of valid SyscallEvent objects`}:!Array.isArray(n)||!n.every(e=>Q(e))?{ok:!1,error:`targetEvents must be an array of valid SyscallEvent objects`}:j(e,t,n)}async handleSyscallTraceExport(e){return P(e,await this.ensureMonitor().captureEvents())}async handleSyscallEbpfAttach(e){return K(e)}async handleSyscallOriginMap(e){return le(e,await this.ensureMonitor().captureEvents(),this.ctx)}async handleSyscallPatternDetect(e){return de(e,await this.ensureMonitor().captureEvents())}ensureMonitor(){return this.monitor||=new ae,this.monitor}ensureMapper(){return this.mapper||=new T,this.mapper}};export{Ce as SyscallHookHandlers};