@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{Da as e,at as t,wa as n}from"./constants-nvsLpSri.mjs";import{i as r,n as i}from"./response-R8ghbZSb.mjs";import{r as a}from"./ResponseBuilder-BLicSCjn.mjs";import"./manifest-C5XqYc9o.mjs";const o=[`status`,`open_project`,`list_functions`,`decompile_function`,`run_script`,`get_xrefs`,`search_strings`,`get_segments`],s=[`status`,`open_binary`,`list_functions`,`decompile_function`,`run_script`,`get_xrefs`,`search_strings`,`get_strings`,`get_segments`],c=[`status`,`open_binary`,`analyze`,`list_functions`,`disassemble_function`,`run_command`,`get_xrefs`,`search_strings`,`get_segments`],l=[`status`,`open_binary`,`list_functions`,`decompile_function`,`disassemble_function`,`run_script`,`get_xrefs`,`search_strings`,`get_strings`,`get_segments`,`get_types`];function u(e,t,n={}){return i({...r(t),tool:e,...n})}async function d(e,n,r=`GET`,i){let a=`${e.replace(/\/$/,``)}${n}`,o=await fetch(a,{method:r,headers:{"Content-Type":`application/json`},...i===void 0?{}:{body:i},signal:AbortSignal.timeout(t)}),s=await o.json().catch(()=>({}));return{status:o.status,data:s}}async function f(e,t){try{let{status:n,data:r}=await d(e,`/health`),i=await p(e,t);return{backend:t,available:n===200,endpoint:e,version:r,capabilities:i.actions,capabilitySource:i.source}}catch(n){return{backend:t,available:!1,endpoint:e,error:n instanceof Error?n.message:String(n),capabilities:m(t),capabilitySource:`static`}}}async function p(e,t){try{let{status:t,data:n}=await d(e,`/capabilities`);if(t>=200&&t<300){let e=h(n);if(e.length>0)return{actions:e,source:`remote`}}}catch{}return{actions:m(t),source:`static`}}function m(e){switch(e){case`ghidra`:return[...o];case`ida`:return[...s];case`rizin`:return[...c];case`binaryninja`:return[...l]}}function h(e){if(Array.isArray(e))return e.filter(e=>typeof e==`string`);if(!e||typeof e!=`object`)return[];let t=e;for(let e of[`actions`,`capabilities`,`supportedActions`]){let n=t[e];if(Array.isArray(n))return n.filter(e=>typeof e==`string`)}return[]}function g(e,t){let n=new URL(e);if(n.protocol!==`http:`&&n.protocol!==`https:`)throw Error(`${t}: only http/https protocols allowed, got ${n.protocol}`);let r=n.hostname.replace(/^\[|\]$/g,``);if(!(r===`127.0.0.1`||r===`localhost`||r===`::1`))throw Error(`${t}: only loopback addresses allowed (127.0.0.1/localhost/::1), got ${r}`)}var _=class{ghidraEndpoint;idaEndpoint;rizinEndpoint;binaryNinjaEndpoint;constructor(t=n,r=e,i=`http://127.0.0.1:18082`,a=`http://127.0.0.1:18083`){g(t,`Ghidra bridge`),g(r,`IDA bridge`),g(i,`Rizin bridge`),g(a,`Binary Ninja bridge`),this.ghidraEndpoint=t,this.idaEndpoint=r,this.rizinEndpoint=i,this.binaryNinjaEndpoint=a}getGhidraEndpoint(e){return this.ghidraEndpoint}getIdaEndpoint(e){return this.idaEndpoint}getRizinEndpoint(e){return this.rizinEndpoint}getBinaryNinjaEndpoint(e){return this.binaryNinjaEndpoint}handleNativeBridgeStatusTool(e){return a(()=>this.handleNativeBridgeStatus(e))}handleGhidraBridgeTool(e){return a(()=>this.handleGhidraBridge(e))}handleIdaBridgeTool(e){return a(()=>this.handleIdaBridge(e))}handleRizinBridgeTool(e){return a(()=>this.handleRizinBridge(e))}handleBinaryNinjaBridgeTool(e){return a(()=>this.handleBinaryNinjaBridge(e))}handleNativeSymbolSyncTool(e){return a(()=>this.handleNativeSymbolSync(e))}async handleNativeBridgeStatus(e){let t=e.backend||`all`,n=[];return(t===`ghidra`||t===`all`)&&n.push(await f(this.getGhidraEndpoint(e),`ghidra`)),(t===`ida`||t===`all`)&&n.push(await f(this.getIdaEndpoint(e),`ida`)),(t===`rizin`||t===`all`)&&n.push(await f(this.getRizinEndpoint(e),`rizin`)),(t===`binaryninja`||t===`all`)&&n.push(await f(this.getBinaryNinjaEndpoint(e),`binaryninja`)),i({success:!0,backends:n,hint:`Install bridge servers: Ghidra → ghidra_bridge, IDA → ida_bridge, Rizin → local rizin/r2 bridge, Binary Ninja → local Binary Ninja bridge`})}async handleGhidraBridge(e){let t=e.action,n=this.getGhidraEndpoint(e);if(!t)return u(`ghidra_bridge`,Error(`action is required`));try{switch(t){case`status`:return i(await f(n,`ghidra`));case`open_project`:{let r=e.binaryPath;if(!r)throw Error(`binaryPath is required for open_project`);let{status:a,data:o}=await d(n,`/project/open`,`POST`,JSON.stringify({binaryPath:r}));return i({success:a<300,action:t,result:o})}case`list_functions`:{let{status:e,data:r}=await d(n,`/functions`);return i({success:e<300,action:t,functions:r})}case`decompile_function`:{let r=e.functionName;if(!r)throw Error(`functionName is required for decompile_function`);let{status:a,data:o}=await d(n,`/functions/${encodeURIComponent(r)}/decompile`);return i({success:a<300,action:t,functionName:r,decompiled:o})}case`run_script`:{let r=e.scriptPath;if(!r)throw Error(`scriptPath is required for run_script`);let{status:a,data:o}=await d(n,`/script/run`,`POST`,JSON.stringify({scriptPath:r,args:e.scriptArgs??[]}));return i({success:a<300,action:t,result:o})}case`get_xrefs`:{let r=e.functionName;if(!r)throw Error(`functionName is required for get_xrefs`);let{status:a,data:o}=await d(n,`/xrefs/${encodeURIComponent(r)}`);return i({success:a<300,action:t,symbol:r,xrefs:o})}case`search_strings`:{let r=e.searchPattern,{status:a,data:o}=await d(n,`/strings`,`POST`,JSON.stringify({pattern:r??``}));return i({success:a<300,action:t,strings:o})}case`get_segments`:{let{status:e,data:r}=await d(n,`/segments`);return i({success:e<300,action:t,segments:r})}default:return i({success:!0,guide:{what:`Ghidra is an open-source SRE framework by NSA.`,actions:[...o],bridgeSetup:[`pip install ghidra_bridge`,`In Ghidra: File → Run Script → ghidra_bridge_server.py`,`Default endpoint: http://127.0.0.1:18080`],links:[`https://ghidra-sre.org/`,`https://github.com/justfoxing/ghidra_bridge`]}})}}catch(e){return u(`ghidra_bridge`,e,{action:t,endpoint:n})}}async handleIdaBridge(e){let t=e.action,n=this.getIdaEndpoint(e);if(!t)return u(`ida_bridge`,Error(`action is required`));try{switch(t){case`status`:return i(await f(n,`ida`));case`open_binary`:{let r=e.binaryPath;if(!r)throw Error(`binaryPath is required for open_binary`);let{status:a,data:o}=await d(n,`/binary/open`,`POST`,JSON.stringify({binaryPath:r}));return i({success:a<300,action:t,result:o})}case`list_functions`:{let{status:e,data:r}=await d(n,`/functions`);return i({success:e<300,action:t,functions:r})}case`decompile_function`:{let r=e.functionName;if(!r)throw Error(`functionName is required for decompile_function`);let{status:a,data:o}=await d(n,`/functions/${encodeURIComponent(r)}/decompile`);return i({success:a<300,action:t,functionName:r,decompiled:o})}case`run_script`:{let r=e.scriptPath;if(!r)throw Error(`scriptPath is required for run_script`);let{status:a,data:o}=await d(n,`/script/run`,`POST`,JSON.stringify({scriptPath:r,args:e.scriptArgs??[]}));return i({success:a<300,action:t,result:o})}case`get_xrefs`:{let r=e.functionName;if(!r)throw Error(`functionName is required for get_xrefs`);let{status:a,data:o}=await d(n,`/xrefs/${encodeURIComponent(r)}`);return i({success:a<300,action:t,symbol:r,xrefs:o})}case`get_strings`:{let{status:e,data:r}=await d(n,`/strings`);return i({success:e<300,action:t,strings:r})}case`search_strings`:{let r=e.searchPattern,{status:a,data:o}=await d(n,`/strings`,`POST`,JSON.stringify({pattern:r??``}));return i({success:a<300,action:t,strings:o})}case`get_segments`:{let{status:e,data:r}=await d(n,`/segments`);return i({success:e<300,action:t,segments:r})}default:return i({success:!0,guide:{what:`IDA Pro is a commercial disassembler/decompiler by Hex-Rays.`,actions:[...s],bridgeSetup:[`pip install ida_bridge // or use idalink`,`In IDA: File → Script file → ida_bridge_server.py`,`Default endpoint: http://127.0.0.1:18081`],links:[`https://hex-rays.com/ida-pro/`,`https://github.com/williballenthin/ida-bridge`]}})}}catch(e){return u(`ida_bridge`,e,{action:t,endpoint:n})}}async handleRizinBridge(e){let t=e.action,n=this.getRizinEndpoint(e);if(!t)return u(`rizin_bridge`,Error(`action is required`));try{switch(t){case`status`:return i(await f(n,`rizin`));case`open_binary`:{let r=e.binaryPath;if(!r)throw Error(`binaryPath is required for open_binary`);let{status:a,data:o}=await d(n,`/binary/open`,`POST`,JSON.stringify({binaryPath:r}));return i({success:a<300,action:t,result:o})}case`analyze`:{let{status:r,data:a}=await d(n,`/analysis/run`,`POST`,JSON.stringify({level:e.analysisLevel??`default`}));return i({success:r<300,action:t,result:a})}case`list_functions`:{let{status:e,data:r}=await d(n,`/functions`);return i({success:e<300,action:t,functions:r})}case`disassemble_function`:{let r=e.functionName;if(!r)throw Error(`functionName is required for disassemble_function`);let{status:a,data:o}=await d(n,`/functions/${encodeURIComponent(r)}/disassemble`);return i({success:a<300,action:t,functionName:r,disassembly:o})}case`run_command`:{let r=e.command;if(!r)throw Error(`command is required for run_command`);let{status:a,data:o}=await d(n,`/commands/run`,`POST`,JSON.stringify({command:r}));return i({success:a<300,action:t,result:o})}case`get_xrefs`:{let r=e.functionName;if(!r)throw Error(`functionName is required for get_xrefs`);let{status:a,data:o}=await d(n,`/xrefs/${encodeURIComponent(r)}`);return i({success:a<300,action:t,symbol:r,xrefs:o})}case`search_strings`:{let r=e.searchPattern,{status:a,data:o}=await d(n,`/strings`,`POST`,JSON.stringify({pattern:r??``}));return i({success:a<300,action:t,strings:o})}case`get_segments`:{let{status:e,data:r}=await d(n,`/segments`);return i({success:e<300,action:t,segments:r})}default:return i({success:!0,guide:{what:`Rizin/r2 is an open-source reverse engineering framework.`,actions:[...c],bridgeSetup:[`Start a loopback HTTP bridge that translates these routes to rizin/r2 commands`,`Default endpoint: http://127.0.0.1:18082`],links:[`https://rizin.re/`,`https://github.com/rizinorg/rizin`]}})}}catch(e){return u(`rizin_bridge`,e,{action:t,endpoint:n})}}async handleBinaryNinjaBridge(e){let t=e.action,n=this.getBinaryNinjaEndpoint(e);if(!t)return u(`binary_ninja_bridge`,Error(`action is required`));try{switch(t){case`status`:return i(await f(n,`binaryninja`));case`open_binary`:{let r=e.binaryPath;if(!r)throw Error(`binaryPath is required for open_binary`);let{status:a,data:o}=await d(n,`/binary/open`,`POST`,JSON.stringify({binaryPath:r}));return i({success:a<300,action:t,result:o})}case`list_functions`:{let{status:e,data:r}=await d(n,`/functions`);return i({success:e<300,action:t,functions:r})}case`decompile_function`:{let r=e.functionName;if(!r)throw Error(`functionName is required for decompile_function`);let{status:a,data:o}=await d(n,`/functions/${encodeURIComponent(r)}/decompile`);return i({success:a<300,action:t,functionName:r,decompiled:o})}case`disassemble_function`:{let r=e.functionName;if(!r)throw Error(`functionName is required for disassemble_function`);let{status:a,data:o}=await d(n,`/functions/${encodeURIComponent(r)}/disassemble`);return i({success:a<300,action:t,functionName:r,disassembly:o})}case`run_script`:{let r=e.scriptPath;if(!r)throw Error(`scriptPath is required for run_script`);let{status:a,data:o}=await d(n,`/script/run`,`POST`,JSON.stringify({scriptPath:r,args:e.scriptArgs??[]}));return i({success:a<300,action:t,result:o})}case`get_xrefs`:{let r=e.functionName;if(!r)throw Error(`functionName is required for get_xrefs`);let{status:a,data:o}=await d(n,`/xrefs/${encodeURIComponent(r)}`);return i({success:a<300,action:t,symbol:r,xrefs:o})}case`get_strings`:{let{status:e,data:r}=await d(n,`/strings`);return i({success:e<300,action:t,strings:r})}case`search_strings`:{let r=e.searchPattern,{status:a,data:o}=await d(n,`/strings`,`POST`,JSON.stringify({pattern:r??``}));return i({success:a<300,action:t,strings:o})}case`get_segments`:{let{status:e,data:r}=await d(n,`/segments`);return i({success:e<300,action:t,segments:r})}case`get_types`:{let{status:e,data:r}=await d(n,`/types`);return i({success:e<300,action:t,types:r})}default:return i({success:!0,guide:{what:`Binary Ninja is a commercial reverse engineering platform.`,actions:[...l],bridgeSetup:[`Run a Binary Ninja plugin that exposes the loopback HTTP bridge routes`,`Default endpoint: http://127.0.0.1:18083`],links:[`https://binary.ninja/`]}})}}catch(e){return u(`binary_ninja_bridge`,e,{action:t,endpoint:n})}}async handleNativeSymbolSync(e){let t=e.source;if(!t||![`ghidra`,`ida`,`rizin`,`binaryninja`].includes(t))return u(`native_symbol_sync`,Error(`source must be one of: ghidra, ida, rizin, binaryninja`));let n=t===`ghidra`?this.getGhidraEndpoint(e):t===`ida`?this.getIdaEndpoint(e):t===`rizin`?this.getRizinEndpoint(e):this.getBinaryNinjaEndpoint(e),r=typeof e.sinceHash==`string`&&e.sinceHash.trim().length>0?e.sinceHash.trim():``;try{let a={filter:e.filter??``,format:e.exportFormat??`json`};r&&(a.sinceHash=r);let{status:o,data:s}=await d(n,`/symbols/export`,`POST`,JSON.stringify(a));return i({success:o<300,source:t,format:e.exportFormat??`json`,...r?{sinceHash:r}:{},symbols:s})}catch(e){return u(`native_symbol_sync`,e,{source:t,endpoint:n})}}};export{_ as NativeBridgeHandlers};
@@ -0,0 +1,7 @@
1
+ import{t as e}from"./logger-BGCcd-jJ.mjs";import{Gt as t,Ht as n,Kt as r,Ut as i,Vt as a,Wt as o}from"./constants-nvsLpSri.mjs";import{a as s,i as c}from"./outputPaths-CHtELDyi.mjs";import{t as l}from"./DetailedDataManager-Dgh402Gp.mjs";import{r as u}from"./modules-CC_ADmwi.mjs";import{c as d,i as f,l as p,n as m,r as h,u as g}from"./parse-args-B6dwWc9k.mjs";import{r as _,t as v}from"./ResponseBuilder-BLicSCjn.mjs";import{a as y,c as b,i as x,l as S,n as C,o as w,r as T,s as E,t as D}from"./ssrf-policy-B72vdy23.mjs";import{i as ee,n as O}from"./safeOutput-Dt4mfjXA.mjs";import"./definitions-BlPHe5DX.mjs";import{n as te,t as ne}from"./grpc-raw-Dp7ps2sv.mjs";import*as re from"node:http";import{createHash as ie}from"node:crypto";import ae from"koffi";import*as k from"node:net";import*as oe from"node:dns/promises";import*as se from"node:tls";import*as ce from"node:http2";import*as le from"node:https";function ue(){return l.getInstance()}function A(e,t,n){e?.emit(t,n)}function j(e,t){if(typeof e==`boolean`)return e;if(typeof e==`number`)return e===1?!0:e===0?!1:t;if(typeof e==`string`){let t=e.trim().toLowerCase();if([`true`,`1`,`yes`,`on`].includes(t))return!0;if([`false`,`0`,`no`,`off`].includes(t))return!1}return t}function M(e,t){let n;if(typeof e==`number`&&Number.isFinite(e))n=e;else if(typeof e==`string`){let t=e.trim();if(t.length>0){let e=Number(t);Number.isFinite(e)&&(n=e)}}return n===void 0&&(n=t.defaultValue),t.integer&&(n=Math.trunc(n)),typeof t.min==`number`&&(n=Math.max(t.min,n)),typeof t.max==`number`&&(n=Math.min(t.max,n)),n}const de=new Set([`Image`,`Font`,`Stylesheet`,`Media`,`Manifest`,`Ping`]),fe={XHR:0,Fetch:1,Document:2,Script:3,WebSocket:4,EventSource:5},N=e=>typeof e==`object`&&!!e,pe=e=>N(e)?typeof e.url==`string`&&typeof e.method==`string`:!1,me=e=>N(e)?typeof e.status==`number`:!1,he=e=>typeof e==`number`&&Number.isFinite(e),P=e=>typeof e==`string`?e:void 0,ge=e=>typeof e==`boolean`?e:void 0,F=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,_e=e=>{if(Array.isArray(e))return e.every(e=>typeof e==`string`)?e:void 0},ve=e=>!(!N(e)||e.hitCount!==void 0&&typeof e.hitCount!=`number`||e.callFrame!==void 0&&!N(e.callFrame)||N(e.callFrame)&&(e.callFrame.functionName!==void 0&&typeof e.callFrame.functionName!=`string`||e.callFrame.url!==void 0&&typeof e.callFrame.url!=`string`||e.callFrame.lineNumber!==void 0&&typeof e.callFrame.lineNumber!=`number`)),ye=e=>!N(e)||!Array.isArray(e.nodes)||typeof e.startTime!=`number`||typeof e.endTime!=`number`||!e.nodes.every(e=>ve(e))?null:{nodes:e.nodes,samples:Array.isArray(e.samples)?e.samples:void 0,startTime:e.startTime,endTime:e.endTime};function be(e,t,n){if(!N(t))return null;let r=P(t.url),i=P(t.method);if(!r||!i)return null;let a=F(t.timestamp),o=P(t.requestId)??`${e.toLowerCase()}-injected-${a??0}-${n}`;return{...t,requestId:o,url:r,method:i,type:P(t.type)??e,timestamp:a,injected:!0,captureSource:`inpage`}}function xe(e){let t=(e.type??``).toString().toLowerCase();return t.includes(`xhr`)?`xhr`:t.includes(`fetch`)?`fetch`:t||`unknown`}function Se(e){return`${e.targetId??``}|${e.sessionId??``}|${e.method.toUpperCase()}|${e.url}|${xe(e)}`}function Ce(e){return`${e.targetId??``}|${e.sessionId??``}|${e.method.toUpperCase()}|${e.url}`}function we(e,t){let n=F(e.timestamp),r=F(t.timestamp);return n===void 0||r===void 0?!1:Math.abs(n-r)<=1500}function Te(e,t){let n=xe(e),r=xe(t);return n===r||n===`unknown`||r===`unknown`}function Ee(e,t,n,r,i){if(!e)return null;for(let a=0;a<e.length;a+=1){let o=e[a];if(o===void 0||n.has(o))continue;let s=t[o];if(!(!s||!we(s,r))&&!(i&&!Te(s,r)))return e.splice(a,1),o}return null}async function De(e){let t=e.getNetworkRequests().filter(e=>pe(e)).map(e=>({...e,captureSource:`cdp`})),[n,r]=await Promise.all([typeof e.getXHRRequests==`function`?e.getXHRRequests().catch(()=>[]):Promise.resolve([]),typeof e.getFetchRequests==`function`?e.getFetchRequests().catch(()=>[]):Promise.resolve([])]),i=n.map((e,t)=>be(`XHR`,e,t)).filter(e=>e!==null),a=r.map((e,t)=>be(`Fetch`,e,t)).filter(e=>e!==null),o=[...i,...a],s=new Set,c=new Map,l=new Map;t.forEach((e,t)=>{let n=Se(e),r=Ce(e);c.set(n,[...c.get(n)??[],t]),l.set(r,[...l.get(r)??[],t])});for(let e of o){let n=e.requestId?t.findIndex((t,n)=>!s.has(n)&&t.requestId===e.requestId):-1,r=Se(e),i=Ce(e),a=n>=0?n:Ee(c.get(r),t,s,e,!1)??Ee(l.get(i),t,s,e,!0);if(a===null||a===-1){t.push(e);continue}s.add(a);let o=t[a];t[a]={...e,...o,injected:!!(o.injected||e.injected),captureSource:e.captureSource??o.captureSource}}return t}async function Oe(e,t){let n=String(t.action??``);switch(n){case`enable`:return ke(e,t);case`disable`:return Ae(e,t);case`status`:return je(e,t);default:return v.fail(`Invalid generic action parameter: ${n}. Expected enable, disable, status.`).json()}}async function ke(e,t){return _(async()=>{let n=j(t.enableExceptions,!0);await e.consoleMonitor.enable({enableNetwork:!0,enableExceptions:n});let r=e.consoleMonitor.getNetworkStatus();return{message:` Network monitoring enabled successfully`,enabled:r.enabled,cdpSessionActive:r.cdpSessionActive,listenerCount:r.listenerCount,usage:{step1:`Network monitoring is now active`,step2:`Navigate to a page using page_navigate tool`,step3:`Use network_get_requests to retrieve captured requests`,step4:`Use network_get_response_body to get response content`},important:`Network monitoring must be enabled BEFORE navigating to capture requests`}})}async function Ae(e,t){return _(async()=>(await e.consoleMonitor.disable(),{message:`Network monitoring disabled`}))}async function je(e,t){try{let t=e.consoleMonitor.getNetworkStatus();return t.enabled?v.ok().merge({enabled:!0,message:` Network monitoring is active. Captured ${t.requestCount} requests and ${t.responseCount} responses.`,requestCount:t.requestCount,responseCount:t.responseCount,listenerCount:t.listenerCount,cdpSessionActive:t.cdpSessionActive,nextSteps:t.requestCount===0?{hint:`No requests captured yet`,action:`Navigate to a page using page_navigate to capture network traffic`}:{hint:`${t.requestCount} requests captured`,action:`Use network_get_requests to retrieve them`}}).json():v.fail(` Network monitoring is NOT enabled`).merge({enabled:!1,nextSteps:{step1:`Call network_enable tool to start monitoring`,step2:`Then navigate to a page using page_navigate`,step3:`Finally use network_get_requests to see captured requests`},example:`network_enable -> page_navigate -> network_get_requests`}).json()}catch(e){return v.fail(e).json()}}async function Me(e,t){return _(async()=>{if(!e.consoleMonitor.isNetworkEnabled())throw Error(`Network monitoring is not enabled. Use network_enable tool first`);let t=e.consoleMonitor.getNetworkRequests().filter(e=>pe(e)),n=e.consoleMonitor.getNetworkResponses().filter(me),r={};t.forEach(e=>{r[e.method]=(r[e.method]||0)+1});let i={};n.forEach(e=>{i[e.status]=(i[e.status]||0)+1});let a={};t.forEach(e=>{let t=e.type||`unknown`;a[t]=(a[t]||0)+1});let o=t.map(e=>e.timestamp).filter(e=>he(e)),s=o.length>0?{earliest:Math.min(...o),latest:Math.max(...o),duration:Math.max(...o)-Math.min(...o)}:null;return{stats:{totalRequests:t.length,totalResponses:n.length,byMethod:r,byStatus:i,byType:a,timeStats:s,monitoringEnabled:!0}}})}async function Ne(e,t,n){try{let r=P(t.requestId)||``,i=M(t.maxSize,{defaultValue:1e5,min:1024,max:20*1024*1024,integer:!0}),a=j(t.returnSummary,!1),o=M(t.retries,{defaultValue:3,min:0,max:10,integer:!0}),s=M(t.retryIntervalMs,{defaultValue:500,min:50,max:5e3,integer:!0}),c=j(t.autoEnable,!1),l=j(t.enableExceptions,!0);if(!r)return v.fail(`requestId parameter is required`).set(`hint`,`Get requestId from network_get_requests tool`).json();let u=await n({autoEnable:c,enableExceptions:l});if(!u.enabled)return v.fail(`Network monitoring is not enabled`).merge({hint:c?`Auto-enable failed. Check active page and call network_enable manually.`:`Use network_enable tool first, or set autoEnable=true`,detail:u.error}).json();let d=null,f=0;for(let t=0;t<=o&&(f=t+1,d=await e.consoleMonitor.getResponseBody(r),!d);t+=1)t<o&&await new Promise(e=>setTimeout(e,s));return d?Pe(r,d,f,i,a):v.fail(`No response body found for requestId: ${r}`).merge({hint:`The request may not have completed yet, or the requestId is invalid`,attempts:f,waitedMs:o*s,retryConfig:{retries:o,retryIntervalMs:s}}).json()}catch(e){return v.fail(e).json()}}function Pe(e,t,n,r,i){let a=t.body.length,o=a>r;if(i||o){let i=t.body.substring(0,500);return v.ok().merge({requestId:e,attempts:n,summary:{size:a,sizeKB:(a/1024).toFixed(2),base64Encoded:t.base64Encoded,preview:i+(a>500?`...`:``),truncated:o,reason:o?`Response too large (${(a/1024).toFixed(2)} KB > ${(r/1024).toFixed(2)} KB)`:`Summary mode enabled`},tip:o?`Use collect_code tool to collect and compress this script, or increase maxSize parameter`:`Set returnSummary=false to get full body`}).json()}return v.ok().merge({requestId:e,attempts:n,body:t.body,base64Encoded:t.base64Encoded,size:a,sizeKB:(a/1024).toFixed(2)}).json()}const Fe=/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i,Ie=/\/[0-9a-f]{16,}(?=[/?#]|$)/gi,Le=/\/\d{2,}(?=[/?#]|$)/g;function Re(e){try{let t=new URL(e),n=t.pathname;return n=n.replace(Fe,`{id}`),n=n.replace(Ie,`/{id}`),n=n.replace(Le,`/{id}`),`${t.origin}${n}`}catch{return e}}function ze(e){let t=e.response;if(typeof t==`object`&&t){let e=t.status;if(typeof e==`number`)return e}if(typeof e.status==`number`)return e.status}function Be(e,t){if(e===void 0)return!1;let n=t.trim(),r=/^(\d)xx$/i.exec(n);if(r){let t=Number.parseInt(r[1],10)*100;return e>=t&&e<t+100}let i=Number.parseInt(n,10);return Number.isNaN(i)?!1:e===i}function Ve(e,t){let{url:n,urlRegex:r,method:i,sinceTimestamp:a,sinceRequestId:o,tail:s,limit:c,offset:l,autoEnabled:u,fields:d,statusCode:f,deduplicateUrls:p}=t,m=e.length,h=e.map(e=>e.url),g=!!(n||r||i&&i.toUpperCase()!==`ALL`||a||o||s||f),_=0;if(!g){let t=e.length;e=e.filter(e=>!e.type||!de.has(e.type)),_=t-e.length}if(o){let t=e.findIndex(e=>e.requestId===o);t>=0&&(e=e.slice(t+1))}if(a!==void 0&&(e=e.filter(e=>(e.timestamp??0)>a)),r){if(r.length>500)throw Error(`urlRegex too long (max 500 characters)`);let t=new RegExp(r,`i`);if(e.length>0){let n=performance.now();t.test(e[0].url);let r=performance.now()-n;if(r>100)throw Error(`urlRegex pattern is too expensive (${r.toFixed(0)}ms on first URL). Use a simpler pattern.`)}e=e.filter(e=>t.test(e.url))}else if(n){let t=n.toLowerCase();e=e.filter(e=>e.url.toLowerCase().includes(t))}i&&i.toUpperCase()!==`ALL`&&(e=e.filter(e=>e.method.toUpperCase()===i.toUpperCase())),f&&(e=e.filter(e=>Be(ze(e),f))),s!==void 0&&e.length>s&&(e=e.slice(-s)),e.sort((e,t)=>(fe[e.type??``]??6)-(fe[t.type??``]??6));let v=e.length;e=e.slice(l,l+c);let y=l+e.length<v,b=v===0&&m>0&&!!(n||i&&i.toUpperCase()!==`ALL`),x=b?h.slice(0,10).map(e=>e.substring(0,120)):void 0;if(p){let t=new Map;for(let n of e){let e=Re(n.url),r=`${n.method.toUpperCase()} ${e}`,i=t.get(r);i?i.count++:t.set(r,{pattern:e,method:n.method.toUpperCase(),count:1,example:n.url})}let n=[...t.values()].toSorted((e,t)=>t.count-e.count);return{finalPayload:{message:` Deduplicated ${e.length} requests into ${n.length} unique endpoint(s)`,endpoints:n,totalRequests:e.length,uniqueEndpoints:n.length,stats:{totalCaptured:m,afterFilter:v},filtered:g,monitoring:{autoEnabled:u}}}}let S=d?e.map(e=>{let t={};for(let n of d)n in e&&(t[n]=e[n]);return t}):e;return{finalPayload:{message:` Retrieved ${e.length} network request(s)`,requests:S,total:e.length,page:{offset:l,limit:c,returned:e.length,totalAfterFilter:v,hasMore:y,nextOffset:y?l+e.length:null},stats:{totalCaptured:m,afterFilter:v,returned:e.length,truncated:v>l+c},filtered:g,filters:{url:n,urlRegex:r,method:i,statusCode:f,sinceTimestamp:a,sinceRequestId:o,tail:s,limit:c,offset:l},monitoring:{autoEnabled:u},...b&&{filterMiss:!0,hint:`URL filter "${n}" matched 0 of ${m} captured requests. Check urlSamples to verify the correct filter substring.`,urlSamples:x},tip:e.length>0?`Use network_get_response_body(requestId) to get response content`:void 0,..._>0&&{staticResourcesExcluded:_,staticFilterNote:`${_} static resources (Image/Font/Stylesheet/Media) excluded by default. Set any filter to include all types.`},...m>100&&!g&&{optimizationHint:`${m} requests captured. Use url/method filters to reduce payload size.`}}}}function He(e){return v.ok().merge({message:`No network requests captured yet`,requests:[],total:0,hint:`Network monitoring is enabled, but no requests have been captured`,possibleReasons:[`1. You haven't navigated to any page yet (use page_navigate)`,`2. The page has already loaded before network monitoring was enabled`,`3. The page doesn't make any network requests`,`4. The page uses frontend-wrapped fetch/XHR not captured by CDP`],recommended_actions:[`console_inject_fetch_interceptor() — capture frontend-wrapped fetch calls (SPAs, React, Vue)`,`console_inject_xhr_interceptor() — capture XMLHttpRequest calls`,`page_navigate(url, enableNetworkMonitoring=true) — re-navigate with monitoring enabled`],nextAction:`Call console_inject_fetch_interceptor(), then re-navigate or trigger the target action`,monitoring:{autoEnabled:e}}).json()}async function Ue(e,t,n,r,i){try{let a=j(i.autoEnable,!0),o=await t({autoEnable:a,enableExceptions:j(i.enableExceptions,!0)});if(!o.enabled)return n(a,o.error);let s=P(i.url),c=P(i.urlRegex),l=P(i.method),u=he(i.sinceTimestamp)?i.sinceTimestamp:void 0,d=P(i.sinceRequestId),f=he(i.tail)&&i.tail>0?Math.floor(i.tail):void 0,p=P(i.statusCode),m=j(i.deduplicateUrls,!1),h=i.fields,g=Array.isArray(h)&&h.length>0?h.filter(e=>typeof e==`string`):void 0,_=M(i.limit,{defaultValue:100,min:1,max:1e3,integer:!0}),y=M(i.offset,{defaultValue:0,min:0,integer:!0}),b=await e();if(b.length===0)return He(o.autoEnabled);let x=Ve(b,{url:s,urlRegex:c,method:l,statusCode:p,sinceTimestamp:u,sinceRequestId:d,tail:f,limit:_,offset:y,autoEnabled:o.autoEnabled,fields:g,deduplicateUrls:m}),S=r.smartHandle(x.finalPayload,25600);return v.ok().merge(S).json()}catch(e){return v.fail(e).json()}}async function We(e,t){if(e.consoleMonitor.isNetworkEnabled())return{enabled:!0,autoEnabled:!1};if(!t.autoEnable)return{enabled:!1,autoEnabled:!1};try{return await e.consoleMonitor.enable({enableNetwork:!0,enableExceptions:t.enableExceptions}),{enabled:e.consoleMonitor.isNetworkEnabled(),autoEnabled:!0}}catch(e){return{enabled:!1,autoEnabled:!1,error:e instanceof Error?e.message:String(e)}}}function Ge(e,t){return e&&t?v.fail(`Failed to auto-enable network monitoring`).merge({detail:t,solution:{step1:`Ensure browser page is active and reachable`,step2:`Call network_enable manually`,step3:`Navigate to target page: page_navigate(url)`,step4:`Get requests: network_get_requests`}}).json():v.fail(` Network monitoring is not enabled`).merge({requests:[],total:0,solution:{step1:`Enable network monitoring: network_enable`,step2:`Navigate to target page: page_navigate(url)`,step3:`Get requests: network_get_requests`},tip:`Set autoEnable=true to auto-enable monitoring in this call`}).json()}var Ke=class{deps;detailedDataManager=ue();constructor(e){this.deps=e}async handleNetworkMonitor(e){return Oe(this.deps,e)}async handleNetworkEnable(e){return ke(this.deps,e)}async handleNetworkDisable(e){return Ae(this.deps,e)}async handleNetworkGetStatus(e){return je(this.deps,e)}async getMergedNetworkRequests(){return await De(this.deps.consoleMonitor)}async handleNetworkGetRequests(e){return Ue(()=>this.getMergedNetworkRequests(),e=>We(this.deps,e),Ge,this.detailedDataManager,e)}async handleNetworkGetResponseBody(e){return Ne(this.deps,e,e=>We(this.deps,e))}async handleNetworkGetStats(e){return Me(this.deps,e)}},qe=class{deps;constructor(e){this.deps=e}async handlePerformanceGetMetrics(e){return _(async()=>{let t=e.includeTimeline===!0,n=this.deps.getPerformanceMonitor(),r={metrics:await n.getPerformanceMetrics()};return t&&(r.timeline=await n.getPerformanceTimeline()),r})}async handlePerformanceCoverage(e){return h(e,`action`,new Set([`start`,`stop`]))===`stop`?this.handlePerformanceStopCoverage(e):this.handlePerformanceStartCoverage(e)}async handlePerformanceStartCoverage(e){return _(async()=>(await this.deps.getPerformanceMonitor().startCoverage(),{message:`Code coverage collection started`}))}async handlePerformanceStopCoverage(e){return _(async()=>{let e=await this.deps.getPerformanceMonitor().stopCoverage(),t=e.length>0?e.reduce((e,t)=>e+t.coveragePercentage,0)/e.length:0;return{coverage:e,totalScripts:e.length,avgCoverage:t}})}async handlePerformanceTakeHeapSnapshot(e){try{let e=this.deps.getTraceRecorder?.()??null;if(e?.getState()===`recording`)try{let t=await e.captureActiveHeapSnapshot();return v.ok().merge({snapshotSize:t,persistedToTrace:!0,message:`Heap snapshot taken and persisted to the active trace recording (data too large to return)`}).json()}catch(e){let t=await this.deps.getPerformanceMonitor().takeHeapSnapshot();return v.ok().merge({snapshotSize:t,persistedToTrace:!1,tracePersistenceError:e instanceof Error?e.message:String(e),message:`Heap snapshot taken, but the active trace recording could not persist it (data too large to return)`}).json()}let t=await this.deps.getPerformanceMonitor().takeHeapSnapshot();return v.ok().merge({snapshotSize:t,persistedToTrace:!1,message:`Heap snapshot taken (data too large to return, saved internally)`}).json()}catch(e){return v.fail(e).json()}}async handlePerformanceTraceStart(e){return _(async()=>{let t=this.deps.getPerformanceMonitor(),n=_e(e.categories),r=ge(e.screenshots);return await t.startTracing({categories:n,screenshots:r}),{message:`Performance tracing started. Call performance_trace with action="stop" to save the trace.`}})}async handlePerformanceTraceStop(e){return _(async()=>{let t=this.deps.getPerformanceMonitor(),n=P(e.artifactPath),r=await t.stopTracing({artifactPath:n});return{artifactPath:r.artifactPath,eventCount:r.eventCount,sizeBytes:r.sizeBytes,sizeKB:(r.sizeBytes/1024).toFixed(1),hint:`Open the trace file in Chrome DevTools -> Performance tab -> Load profile`}})}async handleProfilerCpuStart(e){return _(async()=>(await this.deps.getPerformanceMonitor().startCPUProfiling(),{message:`CPU profiling started. Call profiler_cpu with action="stop" to save the profile.`}))}async handleProfilerCpuStop(e){return _(async()=>{let t=await this.deps.getPerformanceMonitor().stopCPUProfiling(),n=ye(t)||t,{writeFile:r}=await import(`node:fs/promises`),{resolveArtifactPath:i}=await import(`./artifacts-Bx9GLx4J.mjs`).then(e=>e.t),a=P(e.artifactPath),o=JSON.stringify(n,null,2),s;if(a)await r(a,o,`utf-8`),s=a;else{let{absolutePath:e,displayPath:t}=await i({category:`profiles`,toolName:`cpu-profile`,ext:`cpuprofile`});await r(e,o,`utf-8`),s=t}let c=n.nodes.filter(e=>(e.hitCount||0)>0).toSorted((e,t)=>(t.hitCount||0)-(e.hitCount||0)).slice(0,20).map(e=>({functionName:e.callFrame?.functionName||`(anonymous)`,url:e.callFrame?.url,line:e.callFrame?.lineNumber,hitCount:e.hitCount}));return{artifactPath:s,totalNodes:n.nodes.length,totalSamples:n.samples?.length||0,durationMs:n.endTime-n.startTime,hotFunctions:c,hint:`Open the .cpuprofile file in Chrome DevTools -> Performance tab`}})}async handleProfilerHeapSamplingStart(e){return _(async()=>{let t=this.deps.getPerformanceMonitor(),n=F(e.samplingInterval);return await t.startHeapSampling({samplingInterval:n}),{message:`Heap sampling started. Call profiler_heap_sampling with action="stop" to save the report.`}})}async handleProfilerHeapSamplingStop(e){return _(async()=>{let t=this.deps.getPerformanceMonitor(),n=P(e.artifactPath),r=F(e.topN),i=await t.stopHeapSampling({artifactPath:n,topN:r});return{artifactPath:i.artifactPath,sampleCount:i.sampleCount,topAllocations:i.topAllocations}})}},Je=class{deps;constructor(e){this.deps=e}async handleConsoleGetExceptions(e){return _(async()=>{let t=P(e.url),n=M(e.limit,{defaultValue:50,min:1,max:1e3,integer:!0}),r=this.deps.consoleMonitor.getExceptions();return t&&(r=r.filter(e=>e.url?.includes(t))),r=r.slice(0,n),{exceptions:r,total:r.length}})}async handleConsoleInjectScriptMonitor(e){return _(async()=>{let t=m(e,`persistent`,!1);return await this.deps.consoleMonitor.enableDynamicScriptMonitoring({persistent:t}),{message:t?`Dynamic script monitoring enabled (persistent — survives navigations)`:`Dynamic script monitoring enabled`}})}async handleConsoleInjectXhrInterceptor(e){return _(async()=>{let t=m(e,`persistent`,!1);return await this.deps.consoleMonitor.injectXHRInterceptor({persistent:t}),{message:t?`XHR interceptor injected (persistent)`:`XHR interceptor injected`}})}async handleConsoleInjectFetchInterceptor(e){return _(async()=>{let t=m(e,`persistent`,!1);return await this.deps.consoleMonitor.injectFetchInterceptor({persistent:t}),{message:t?`Fetch interceptor injected (persistent)`:`Fetch interceptor injected`}})}async handleConsoleClearInjectedBuffers(e){return _(async()=>({message:`Injected buffers cleared`,...await this.deps.consoleMonitor.clearInjectedBuffers()}))}async handleConsoleResetInjectedInterceptors(e){return _(async()=>({message:`Injected interceptors/monitors reset`,...await this.deps.consoleMonitor.resetInjectedInterceptors()}))}async handleConsoleInjectFunctionTracer(e){return _(async()=>{let t=P(e.functionName)||``;if(!t)throw Error(`functionName is required`);let n=m(e,`persistent`,!1);return await this.deps.consoleMonitor.injectFunctionTracer(t,{persistent:n}),{message:n?`Function tracer injected for: ${t} (persistent — survives navigations)`:`Function tracer injected for: ${t}`}})}};const Ye=[`authorization`,`cookie`,`x-token`,`x-auth-token`,`x-access-token`,`x-api-key`,`x-signature`,`x-sign`,`x-csrf-token`],Xe=/^(token|access_token|refresh_token|sign|signature|auth|jwt|api_key|apikey|key|secret)$/i,Ze=/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/,Qe=/^Bearer\s+\S+/i,$e=/^AWS4-HMAC-SHA256\s/i,et=/^ACS3-HMAC-SHA256\s/i,tt=new Set([`x-acs-signature-nonce`,`x-acs-signature-version`,`x-acs-signature-method`,`x-acs-signature-version-tool`]),nt=new Set([`x-amz-signature`,`x-amz-credential`,`x-amz-algorithm`,`x-amz-date`,`x-amz-signedheaders`,`x-amz-expires`,`x-amz-security-token`]);function rt(e){let t=[];for(let[n,r]of Object.entries(e)){if(!r||r.length<4)continue;let e=n.toLowerCase();if(e===`authorization`){$e.test(r)?t.push({scheme:`aws-sigv4`,header:n,value:r,confidence:.92,source:`header`}):et.test(r)&&t.push({scheme:`aliyun-acs3`,header:n,value:r,confidence:.9,source:`header`});continue}if(e===`dpop`){t.push({scheme:`dpop`,header:n,value:r,confidence:.9,source:`header`});continue}(e===`x-acs-signature`||tt.has(e))&&t.push({scheme:`aliyun-acs3`,header:n,value:r,confidence:.9,source:`header`})}return t}function it(e){let t=[],n=new Set;for(let[r,i]of e.entries()){let e=r.toLowerCase();nt.has(e)&&(n.has(e)||!i||i.length<8||(n.add(e),t.push({scheme:`aws-sigv4`,header:r,value:i,confidence:.9,source:`query`})))}return t}function at(e){let t=[],n=e.get(`client_assertion_type`),r=e.get(`client_assertion`);return r&&r.length>=8?t.push({scheme:`oauth2-client-assertion`,header:`client_assertion`,value:r,confidence:.85,source:`body`}):n&&t.push({scheme:`oauth2-client-assertion`,header:`client_assertion_type`,value:n,confidence:.7,source:`body`}),t}function ot(e){try{let t=new URLSearchParams(e);if(t.toString().length===0)return null;let n=new Map;for(let[e,r]of t.entries())n.set(e,r);return n.size>0?n:null}catch{return null}}function I(e){let t=e.trim();return t.length<=12?`***`:`${t.slice(0,6)}***${t.slice(-4)}`}function st(e){let t=e.trim();return Qe.test(t)?.95:Ze.test(t)?.9:t.length>20&&/^[A-Za-z0-9+/=_-]+$/.test(t)?.7:t.length>10?.5:.3}function ct(e){let t=[],n=new Set;for(let r of e){let e=r.headers??{},i=new Set;for(let a of rt(e)){i.add(a.header.toLowerCase());let e=`signature:${a.scheme}:${a.value.slice(0,8)}`;n.has(e)||(n.add(e),t.push({header:a.header,value_masked:I(a.value),request_url:r.url,confidence:a.confidence,source:`signature`,scheme:a.scheme}))}for(let[a,o]of Object.entries(e)){let e=a.toLowerCase();if(!Ye.includes(e)||i.has(e)||!o||o.length<4)continue;if(e===`cookie`){for(let e of o.split(`;`)){let i=e.indexOf(`=`);if(i===-1)continue;let a=e.slice(0,i).trim(),o=e.slice(i+1).trim();if(!o||o.length<8)continue;let s=`cookie:${a}:${o.slice(0,8)}`;n.has(s)||(n.add(s),t.push({header:`cookie[${a}]`,value_masked:I(o),request_url:r.url,confidence:st(o),source:`cookie`}))}continue}let s=`header:${e}:${o.slice(0,8)}`;n.has(s)||(n.add(s),t.push({header:a,value_masked:I(o),request_url:r.url,confidence:st(o),source:`header`}))}try{let e=new URL(r.url);for(let i of it(e.searchParams)){let e=`signature:${i.scheme}:${i.value.slice(0,8)}`;n.has(e)||(n.add(e),t.push({header:i.header,value_masked:I(i.value),request_url:r.url,confidence:i.confidence*.9,source:`signature`,scheme:i.scheme}))}for(let[i,a]of e.searchParams.entries()){if(!Xe.test(i)||!a||a.length<8)continue;let e=`query:${i}:${a.slice(0,8)}`;n.has(e)||(n.add(e),t.push({header:i,value_masked:I(a),request_url:r.url,confidence:st(a)*.9,source:`query`}))}}catch{}if(r.postData){let e=null;try{let t=JSON.parse(r.postData);if(t&&typeof t==`object`){e=new Map;for(let[n,r]of Object.entries(t))typeof r==`string`&&e.set(n,r);e.size===0&&(e=null)}}catch{}if(e||=ot(r.postData),e){for(let i of at(e)){let e=`signature:${i.scheme}:${i.value.slice(0,8)}`;n.has(e)||(n.add(e),t.push({header:i.header,value_masked:I(i.value),request_url:r.url,confidence:i.confidence*.85,source:`signature`,scheme:i.scheme}))}for(let[i,a]of e){if(!Xe.test(i)||typeof a!=`string`||a.length<8)continue;let e=`body:${i}:${a.slice(0,8)}`;n.has(e)||(n.add(e),t.push({header:i,value_masked:I(a),request_url:r.url,confidence:st(a)*.85,source:`body`}))}}}}return t.toSorted((e,t)=>t.confidence-e.confidence)}function lt(e={}){return Object.entries(e).filter(e=>e[1]!==void 0).map(([e,t])=>({name:e,value:t}))}function ut(e){return e.split(`;`).map(e=>{let t=e.indexOf(`=`);return t===-1?{name:e.trim(),value:``}:{name:e.slice(0,t).trim(),value:e.slice(t+1).trim()}})}function dt(e){try{let t=new URL(e);return Array.from(t.searchParams.entries()).map(([e,t])=>({name:e,value:t}))}catch{return[]}}function ft(e){if(!e||e.trim()===``)return`HTTP/1.1`;let t=e.toLowerCase().trim();return t===`http/1.0`?`HTTP/1.0`:t===`http/1.1`?`HTTP/1.1`:t===`h2`||t===`h2c`?`HTTP/2`:t===`h3`||t.startsWith(`http/2+quic`)?`HTTP/3`:t.startsWith(`http/`)?e.replace(/^http\//i,`HTTP/`):`HTTP/1.1`}async function pt(e){let{requests:n,getResponse:r,getResponseBody:i,includeBodies:a,creatorVersion:o=`unknown`}=e,s=[],c=new Map;if(a){let e=t;for(let t=0;t<n.length;t+=e){let r=n.slice(t,t+e),a=await Promise.allSettled(r.map(async e=>{try{let t=await i(e.requestId);return t?{requestId:e.requestId,text:t.body}:{requestId:e.requestId,_bodyUnavailable:!0}}catch{return{requestId:e.requestId,_bodyUnavailable:!0}}}));for(let e of a)if(e.status===`fulfilled`){let t=e.value;c.set(t.requestId,`_bodyUnavailable`in t?{_bodyUnavailable:!0}:{text:t.text})}}}for(let e of n){let t=r(e.requestId),n=e.timestamp?new Date(e.timestamp*1e3).toISOString():new Date().toISOString(),i=a?c.get(e.requestId)??{_bodyUnavailable:!0}:{},o=e.postData?{mimeType:e.headers?.[`content-type`]??`application/octet-stream`,text:e.postData}:void 0,l=e.headers?.cookie??``,u=t?.headers?.[`set-cookie`]??``,d={startedDateTime:n,time:t?.timing?.receiveHeadersEnd??0,request:{method:e.method,url:e.url,httpVersion:ft(e.protocol),headers:lt(e.headers),queryString:dt(e.url),cookies:l?ut(l):[],headersSize:-1,bodySize:e.postData?e.postData.length:0,...o?{postData:o}:{}},response:{status:t?.status??0,statusText:t?.statusText??``,httpVersion:ft(t?.protocol),headers:lt(t?.headers),cookies:u?ut(u):[],content:{size:i.text?i.text.length:-1,mimeType:t?.mimeType??`application/octet-stream`,...i},redirectURL:t?.headers?.location??``,headersSize:-1,bodySize:i.text?i.text.length:-1},cache:{},timings:{send:0,wait:t?.timing?.receiveHeadersEnd??0,receive:0},_requestId:e.requestId};s.push(d)}return{log:{version:`1.2`,creator:{name:`jshookmcp`,version:o},entries:s}}}var mt=class{chunks=[];totalLength=0;get length(){return this.totalLength}append(e){e.length!==0&&(this.chunks.push(e),this.totalLength+=e.length)}toBuffer(){if(this.chunks.length===0)return Buffer.alloc(0);if(this.chunks.length===1)return this.chunks[0];let e=Buffer.concat(this.chunks,this.totalLength);return this.chunks=[e],e}reset(){this.chunks=[],this.totalLength=0}get isEmpty(){return this.totalLength===0}};const ht=new Set([`host`,`content-length`,`transfer-encoding`,`connection`,`keep-alive`,`proxy-authenticate`,`proxy-authorization`,`te`,`trailers`,`upgrade`]),gt=new Set([`__proto__`,`constructor`,`prototype`]);function _t(e){let t=[];for(let n of e.cookies)n.name&&t.push(`${n.name}=${n.value}`);return t.length>0?t.join(`; `):void 0}function vt(e){let t=Object.create(null);for(let[n,r]of Object.entries(e))!ht.has(n.toLowerCase())&&!gt.has(n)&&(t[n]=r);return t}function yt(e){if(!e)return!1;let t=e.toLowerCase().trim();return t===`h2`||t===`h2c`||t===`http/2`}function bt(e){let t={};for(let[n,r]of Object.entries(e)){let e=n.toLowerCase();e.startsWith(`:`)||(t[e]=r)}return t}function xt(e){let t={},n=200,r=`OK`;for(let[i,a]of Object.entries(e)){if(i===`:status`){n=typeof a==`number`?a:Number.parseInt(String(a),10),n>=200&&n<300?r=`OK`:n>=300&&n<400?r=`Redirect`:n>=400&&n<500?r=`Client Error`:n>=500&&(r=`Server Error`);continue}i.startsWith(`:`)||(Array.isArray(a)?t[i]=a.join(`, `):a!==void 0&&(t[i]=String(a)))}return{status:n,statusText:r,headers:t}}async function St(e,t,n,r,i,a,o){return new Promise((s,c)=>{let l=null,u=setTimeout(()=>{l?.close(),c(Error(`HTTP/2 request timed out after ${i}ms`))},i);try{let i=Number.parseInt(e.port||(e.protocol===`https:`?`443`:`80`),10);l=ce.connect(e.origin,{createConnection:()=>e.protocol===`https:`?se.connect({host:a.resolvedAddress??a.hostname,port:i,servername:a.hostname,ALPNProtocols:[`h2`],rejectUnauthorized:!0}):k.connect({host:a.resolvedAddress??a.hostname,port:i})}),l.once(`error`,e=>{clearTimeout(u),c(e)});let d=bt(n);d[`:method`]=t,d[`:path`]=e.pathname+e.search,d[`:scheme`]=e.protocol.slice(0,-1),d[`:authority`]=e.host,r&&!d[`content-length`]&&(d[`content-length`]=String(Buffer.byteLength(r,`utf8`)));let f=l.request(d),p=new mt,m=!1,h={};f.on(`response`,e=>{h=e}),f.on(`data`,e=>{if(!m&&p.length+e.length>o){m=!0;let t=o-p.length;t>0&&p.append(e.subarray(0,t))}else m||p.append(e)}),f.on(`end`,()=>{clearTimeout(u),l?.close();let e=xt(h);s({status:e.status,statusText:e.statusText,headers:e.headers,body:p.toBuffer().toString(`utf8`),bodyTruncated:m})}),f.on(`error`,e=>{clearTimeout(u),l?.close(),c(e)}),r&&t!==`GET`&&t!==`HEAD`&&f.write(r,`utf8`),f.end()}catch(e){clearTimeout(u),l?.close(),c(e)}})}async function Ct(e,t,n=512e3){let i=t.urlOverride??e.url,a=(t.methodOverride??e.method).toUpperCase(),o=vt({...e.headers,...t.headerPatch}),s=t.sessionProfile?_t(t.sessionProfile):void 0;s&&(o.Cookie=s),t.sessionProfile?.userAgent&&!o[`User-Agent`]&&!o[`user-agent`]&&(o[`User-Agent`]=t.sessionProfile.userAgent),t.sessionProfile?.acceptLanguage&&!o[`Accept-Language`]&&!o[`accept-language`]&&(o[`Accept-Language`]=t.sessionProfile.acceptLanguage),t.sessionProfile?.referer&&!o.Referer&&!o.referer&&(o.Referer=t.sessionProfile.referer);let c=t.bodyPatch===void 0?e.postData:t.bodyPatch,l=D(t.authorization),u=!l&&x();if(l&&(l.allowPrivateNetwork||l.allowInsecureHttp)&&!C(l))throw Error(`Replay authorization must include at least one allowed host or CIDR when enabling private network or insecure HTTP access.`);if(w(l))throw Error(`Replay authorization expired before the request was executed.`);let d=e=>u?!0:l?.allowPrivateNetwork===!0&&T(l,e),f=e=>e.parsedUrl.protocol!==`http:`||u||y(e.hostname)?!0:l?.allowInsecureHttp===!0&&T(l,e),p=async e=>{let t;try{t=await S(e)}catch{throw Error(`Replay blocked: DNS resolution failed for "${e}"`)}if(!f(t))throw Error(`Replay blocked: insecure HTTP is only allowed for loopback or explicitly authorized targets, got "${e}"`);let n=E(t.hostname),r=E(t.resolvedAddress??``);if((n||r)&&!d(t))throw!n&&r&&t.resolvedAddress?Error(`Replay blocked: "${e}" resolved to private IP ${t.resolvedAddress}`):Error(`Replay blocked: target URL "${e}" resolves to a private/reserved address.`);if(t.parsedUrl.protocol===`https:`||t.isIpLiteral)return{pinnedUrl:e,originalHost:t.parsedUrl.host,target:t};let i=t.parsedUrl.host;return t.parsedUrl.hostname=t.resolvedAddress&&t.resolvedAddress.includes(`:`)?`[${t.resolvedAddress}]`:t.resolvedAddress??t.hostname,{pinnedUrl:t.parsedUrl.toString(),originalHost:i,target:t}};if(t.dryRun!==!1){if(await b(i,t.authorization))throw Error(`Replay blocked: target URL "${i}" resolves to a private/reserved address.`);let e=await S(i).catch(()=>null);if(e&&!f(e))throw Error(`Replay blocked: insecure HTTP is only allowed for loopback or explicitly authorized targets, got "${i}"`);return{dryRun:!0,preview:{url:i,method:a,headers:o,body:c}}}let m=new AbortController,h=setTimeout(()=>m.abort(),t.timeoutMs??3e4),g=r,_=yt(e.protocol);try{let e=i,r=a,s=c;if(_){let{pinnedUrl:i,originalHost:a,target:c}=await p(e),l=new URL(i),u={...o};c.parsedUrl.protocol===`http:`&&c.resolvedAddress&&!c.isIpLiteral&&(u.Host=a);let d=await St(l,r,u,r!==`GET`&&r!==`HEAD`?s:void 0,t.timeoutMs??3e4,c,n);return{dryRun:!1,status:d.status,statusText:d.statusText,headers:d.headers,body:d.body,bodyTruncated:d.bodyTruncated,requestId:t.requestId}}let l;for(let t=0;t<g;t++){let{pinnedUrl:t,originalHost:n,target:i}=await p(e),a={...o};if(i.parsedUrl.protocol===`http:`&&i.resolvedAddress&&!i.isIpLiteral&&(a.Host=n),l=await fetch(t,{method:r,headers:a,body:r!==`GET`&&r!==`HEAD`?s:void 0,signal:m.signal,redirect:`manual`}),l.status>=300&&l.status<400){let t=l.headers.get(`location`);if(!t)break;e=new URL(t,e).toString(),(l.status===301||l.status===302||l.status===303)&&(r=`GET`,s=void 0),delete o.Host,delete o.host;continue}break}if(l.status>=300&&l.status<400)throw Error(`Replay blocked: too many redirects (>${g})`);let u={};l.headers.forEach((e,t)=>{u[t]=e});let d=await l.text(),f=d.length>n,h=f?d.slice(0,n):d;return{dryRun:!1,status:l.status,statusText:l.statusText,headers:u,body:h,bodyTruncated:f,requestId:t.requestId}}finally{clearTimeout(h)}}const wt=new Set([`host`,`content-length`,`transfer-encoding`,`connection`,`keep-alive`,`proxy-authenticate`,`proxy-authorization`,`te`,`trailers`,`upgrade`]),Tt=/^[A-Z][A-Z0-9_-]{0,31}$/,Et=new Set([`Strict`,`Lax`,`None`]),Dt=new Set([`Unset`,`NonSecure`,`Secure`]);function L(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`${t} must be an object`);return e}function Ot(e,t){if(e===void 0)return[];if(!Array.isArray(e)||e.some(e=>typeof e!=`string`))throw Error(`${t} must be an array of strings`);return e.map(e=>e.trim()).filter(e=>e.length>0)}function R(e,t){if(e===void 0)return;if(typeof e!=`string`)throw Error(`${t} must be a string`);let n=e.trim();return n.length>0?n:void 0}function z(e,t){if(e!==void 0){if(typeof e!=`boolean`)throw Error(`${t} must be a boolean`);return e}}function B(e,t,n){if(e!==void 0){if(typeof e!=`number`||!Number.isFinite(e))throw Error(`${t} must be a finite number`);if(n?.integer&&!Number.isInteger(e))throw Error(`${t} must be an integer`);if(typeof n?.min==`number`&&e<n.min)throw Error(`${t} must be >= ${n.min}`);if(typeof n?.max==`number`&&e>n.max)throw Error(`${t} must be <= ${n.max}`);return e}}function kt(e){if(e===void 0)return;let t=L(e,`headerPatch`),n={};for(let[e,r]of Object.entries(t)){if(typeof r!=`string`)throw Error(`headerPatch.${e} must be a string`);let t=e.trim();if(!t)throw Error(`headerPatch keys must be non-empty`);if(/[\r\n]/.test(t)||/[\r\n]/.test(r))throw Error(`headerPatch.${t} must not contain CR/LF characters`);if(wt.has(t.toLowerCase()))throw Error(`headerPatch.${t} is not allowed`);n[t]=r}return n}function At(e,t){let n=L(e,`sessionProfile.cookies[${t}]`),r=R(n.name,`sessionProfile.cookies[${t}].name`),i=R(n.value,`sessionProfile.cookies[${t}].value`);if(!r)throw Error(`sessionProfile.cookies[${t}].name is required`);if(i===void 0)throw Error(`sessionProfile.cookies[${t}].value is required`);let a=R(n.sameSite,`sessionProfile.cookies[${t}].sameSite`);if(a&&!Et.has(a))throw Error(`sessionProfile.cookies[${t}].sameSite is invalid`);let o=R(n.sourceScheme,`sessionProfile.cookies[${t}].sourceScheme`);if(o&&!Dt.has(o))throw Error(`sessionProfile.cookies[${t}].sourceScheme is invalid`);return{name:r,value:i,domain:R(n.domain,`sessionProfile.cookies[${t}].domain`),path:R(n.path,`sessionProfile.cookies[${t}].path`),expires:B(n.expires,`sessionProfile.cookies[${t}].expires`),size:B(n.size,`sessionProfile.cookies[${t}].size`,{integer:!0,min:0}),httpOnly:z(n.httpOnly,`sessionProfile.cookies[${t}].httpOnly`),secure:z(n.secure,`sessionProfile.cookies[${t}].secure`),session:z(n.session,`sessionProfile.cookies[${t}].session`),sameSite:a,sourceScheme:o}}function jt(e){if(e===void 0)return;let t=L(e,`sessionProfile.clientHints`),n=e=>R(t[e],`sessionProfile.clientHints.${e}`);return{secChUa:n(`secChUa`),secChUaMobile:n(`secChUaMobile`),secChUaPlatform:n(`secChUaPlatform`),secChUaPlatformVersion:n(`secChUaPlatformVersion`),secChUaArch:n(`secChUaArch`),secChUaFullVersion:n(`secChUaFullVersion`),secChUaFullVersionList:n(`secChUaFullVersionList`),secChUaModel:n(`secChUaModel`),secChUaBitness:n(`secChUaBitness`),secChUaWow64:n(`secChUaWow64`)}}function Mt(e){if(e===void 0)return;let t=L(e,`sessionProfile`);if(!Array.isArray(t.cookies))throw Error(`sessionProfile.cookies must be an array`);return{cookies:t.cookies.map((e,t)=>At(e,t)),userAgent:R(t.userAgent,`sessionProfile.userAgent`),acceptLanguage:R(t.acceptLanguage,`sessionProfile.acceptLanguage`),referer:R(t.referer,`sessionProfile.referer`),clientHints:jt(t.clientHints),platform:R(t.platform,`sessionProfile.platform`),origin:R(t.origin,`sessionProfile.origin`),collectedAt:B(t.collectedAt,`sessionProfile.collectedAt`,{integer:!0,min:0})??Date.now(),ttlSec:B(t.ttlSec,`sessionProfile.ttlSec`,{integer:!0,min:0})??0}}function Nt(e,t){if(typeof e!=`string`||e.trim().length===0)throw Error(`authorizationCapability must be a non-empty base64url string`);let n;try{n=JSON.parse(Buffer.from(e,`base64url`).toString(`utf8`))}catch{throw Error(`authorizationCapability must be valid base64url-encoded JSON`)}let r=L(n,`authorizationCapability payload`);if(r.version!==void 0&&r.version!==1)throw Error(`authorizationCapability version ${String(r.version)} is not supported`);if(r.requestId!==t)throw Error(`authorizationCapability requestId does not match the replay requestId`);return r}function Pt(e,t){let n=e.authorization,r=e.authorizationCapability;if(n!==void 0&&r!==void 0)throw Error(`Provide either authorization or authorizationCapability, not both`);let i;if(n!==void 0)i=L(n,`authorization`);else if(r!==void 0)i=Nt(r,t);else return;let a=i,o=Ot(a.allowedHosts,`authorization.allowedHosts`),s=Ot(a.allowedCidrs,`authorization.allowedCidrs`),c=z(a.allowPrivateNetwork,`authorization.allowPrivateNetwork`),l=z(a.allowInsecureHttp,`authorization.allowInsecureHttp`),u=R(a.expiresAt,`authorization.expiresAt`),d=R(a.reason,`authorization.reason`),f={};return o.length>0&&(f.allowedHosts=o),s.length>0&&(f.allowedCidrs=s),c!==void 0&&(f.allowPrivateNetwork=c),l!==void 0&&(f.allowInsecureHttp=l),u!==void 0&&(f.expiresAt=u),d!==void 0&&(f.reason=d),f}function Ft(e){let t=R(e.requestId,`requestId`);if(!t)throw Error(`requestId is required`);let n=R(e.methodOverride,`methodOverride`);if(n&&!Tt.test(n.toUpperCase()))throw Error(`methodOverride must be a valid HTTP token`);let r=R(e.urlOverride,`urlOverride`);if(r)try{let e=new URL(r);if(e.protocol!==`http:`&&e.protocol!==`https:`)throw Error(`urlOverride must use http or https`)}catch(e){throw e instanceof Error&&e.message===`urlOverride must use http or https`?e:Error(`urlOverride must be an absolute http(s) URL`,{cause:e})}let i=R(e.bodyPatch,`bodyPatch`),a=B(e.timeoutMs,`timeoutMs`,{integer:!0,min:1e3,max:12e4}),o=e.dryRun===void 0?!0:z(e.dryRun,`dryRun`);if(o===void 0)throw Error(`dryRun must be a boolean`);return{requestId:t,headerPatch:kt(e.headerPatch),sessionProfile:Mt(e.sessionProfile),bodyPatch:i,methodOverride:n?.toUpperCase(),urlOverride:r,timeoutMs:a,dryRun:o,authorization:Pt(e,t)}}async function It(e,t){let n=[c(),...s()],r=await O(e,{allowedRoots:n,allowedRootsDescription:`project root or system temp directory`});return await ee(r,JSON.stringify(t,null,2),{allowedRoots:n}),r}const Lt=e=>{if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.requestId==`string`&&typeof t.url==`string`&&typeof t.method==`string`};var Rt=class{deps;detailedDataManager=ue();constructor(e){this.deps=e}async handleNetworkExtractAuth(e){return _(async()=>{let t=M(e.minConfidence,{defaultValue:.4}),n=this.deps.consoleMonitor.getNetworkRequests();if(n.length===0)throw Error(`No captured requests found. Call network_enable then page_navigate first.`);let r=ct(n).filter(e=>e.confidence>=t);return{scannedRequests:n.length,found:r.length,findings:r,note:`Values are masked (first 6 + last 4 chars). Use network_replay_request to test with actual values.`}})}async handleNetworkExportHar(e){try{let t=e.outputPath;if(t!==void 0&&typeof t!=`string`)return v.fail(`outputPath must be a string`).json();let n=t?.trim()||void 0,r=j(e.includeBodies,!1),i=this.deps.consoleMonitor.getNetworkRequests();if(i.length===0)return v.fail(`No captured requests to export. Call network_enable then page_navigate first.`).json();let a=await pt({requests:i,getResponse:e=>this.deps.consoleMonitor.getNetworkActivity(e)?.response,getResponseBody:async e=>{try{return await this.deps.consoleMonitor.getResponseBody(e)}catch{return null}},includeBodies:r,creatorVersion:`1.0.0`});if(n){let e=await It(n,a);return v.ok().merge({message:`HAR exported to ${e}`,entryCount:a.log.entries.length,outputPath:e}).json()}let o=this.detailedDataManager.smartHandle({entryCount:a.log.entries.length,har:a},51200);return v.ok().merge(o).json()}catch(e){return v.fail(e).json()}}async handleNetworkReplayRequest(e){try{let t=Ft(e),n=this.deps.consoleMonitor.getNetworkRequests().find(e=>Lt(e)&&e.requestId===t.requestId);return n?_(async()=>await Ct(n,t)):v.fail(`Request ${t.requestId} not found in captured requests`).set(`hint`,`Use network_get_requests to see available request IDs`).json()}catch(e){return v.fail(e).json()}}};const zt=e=>typeof e==`object`&&!!e;var Bt=class{deps;constructor(e){this.deps=e}async handleNetworkInterceptResponse(e){try{let t=this.parseInterceptRules(e);if(t.length===0)return v.fail(`No valid rules provided. Provide either "urlPattern" (single) or "rules" array (batch).`).merge({usage:{single:{urlPattern:`*api/status*`,responseCode:200,responseBody:`{"status":"active"}`},batch:{rules:[{urlPattern:`*api/status*`,responseBody:`{"status":"active"}`}]}}}).json();let n=await this.deps.consoleMonitor.enableFetchIntercept(t),r=this.deps.consoleMonitor.getFetchInterceptStatus();return A(this.deps.eventBus,`network:intercept_started`,{interceptType:`fetch`,timestamp:new Date().toISOString()}),v.ok().merge({message:`Added ${n.length} interception rule(s)`,createdRules:n.map(e=>({id:e.id,urlPattern:e.urlPattern,interceptAction:e.interceptAction,stage:e.stage,responseCode:e.responseCode})),totalActiveRules:r.rules.length,hint:`Use network_intercept(action: "list") to see all rules and hit counts. Use network_intercept(action: "disable") to remove rules.`}).json()}catch(e){return v.fail(e instanceof Error?e.message:String(e)).merge({hint:`Ensure browser is launched and a page is active before enabling interception.`}).json()}}async handleNetworkInterceptList(e){let t=this.deps.consoleMonitor.getFetchInterceptStatus();return v.ok().merge(t).merge({hint:t.rules.length>0?`Use network_intercept(action: "disable", ruleId) to remove a specific rule, or network_intercept(action: "disable", all: true) to remove all.`:`No active interception rules. Use network_intercept(action: "add") to add rules.`}).json()}async handleNetworkInterceptDisable(e){let t=typeof e.ruleId==`string`?e.ruleId:void 0,n=e.all===!0;return!t&&!n?v.fail(`Provide either "ruleId" to remove a specific rule, or "all": true to disable all.`).json():_(async()=>{if(n){let e=await this.deps.consoleMonitor.disableFetchIntercept();return{message:`Disabled all interception. Removed ${e.removedRules} rule(s).`,removedRules:e.removedRules}}let e=await this.deps.consoleMonitor.removeFetchInterceptRule(t),r=this.deps.consoleMonitor.getFetchInterceptStatus();return{success:e,message:e?`Rule ${t} removed.`:`Rule ${t} not found.`,remainingRules:r.rules.length}})}parseInterceptRules(e){let t=[];if(Array.isArray(e.rules))for(let n of e.rules)zt(n)&&typeof n.urlPattern==`string`&&t.push(this.toInterceptRule(n));else typeof e.urlPattern==`string`&&t.push(this.toInterceptRule(e));return t}toInterceptRule(e){return{urlPattern:e.urlPattern,urlPatternType:e.urlPatternType===`regex`?`regex`:`glob`,stage:e.stage===`Request`?`Request`:`Response`,interceptAction:this.toInterceptAction(e.interceptAction),responseCode:typeof e.responseCode==`number`?e.responseCode:200,responseHeaders:zt(e.responseHeaders)?e.responseHeaders:void 0,responseBody:typeof e.responseBody==`string`?e.responseBody:typeof e.responseBody==`object`?JSON.stringify(e.responseBody):void 0}}toInterceptAction(e){return e===`continue`||e===`abort`?e:`fulfill`}};const Vt=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,Ht=/^(?:text\/|application\/(?:json|ld\+json|xml|xhtml\+xml|javascript|x-javascript|problem\+json|problem\+xml|graphql-response\+json|x-www-form-urlencoded)|image\/svg\+xml)/i;function Ut(e,t){if(e.includes(`\r`)||e.includes(`
2
+ `))throw Error(`${t} must not contain CR or LF characters`)}function Wt(e,t){return Object.keys(e).some(e=>e.toLowerCase()===t.toLowerCase())}function Gt(e,t){return e.find(e=>e.name.toLowerCase()===t.toLowerCase())?.value??null}function Kt(e,t){return t?.toUpperCase()===`HEAD`||e>=100&&e<200||e===204||e===304}function qt(e){let t=e.indexOf(`\r
3
+ \r
4
+ `);if(t>=0)return t+4;let n=e.indexOf(`
5
+
6
+ `);return n>=0?n+2:null}function Jt(e,t){let n=e.indexOf(10,t);return n<0?null:{lineEnd:n>t&&e[n-1]===13?n-1:n,nextOffset:n+1}}function Yt(e){let t=[],n=0;for(;n<e.length;){let r=Jt(e,n);if(!r)return{complete:!1,consumedBytes:n,body:Buffer.concat(t)};let i=e.subarray(n,r.lineEnd).toString(`latin1`).trim().split(`;`,1)[0]?.trim()??``,a=Number.parseInt(i,16);if(!Number.isFinite(a)||a<0)return{complete:!1,consumedBytes:n,body:Buffer.concat(t)};if(a===0){let i=e.subarray(r.nextOffset),a=qt(i);return a===null?i.length>=2&&i[0]===13&&i[1]===10?{complete:!0,consumedBytes:r.nextOffset+2,body:Buffer.concat(t)}:i.length>=1&&i[0]===10?{complete:!0,consumedBytes:r.nextOffset+1,body:Buffer.concat(t)}:{complete:!1,consumedBytes:n,body:Buffer.concat(t)}:{complete:!0,consumedBytes:r.nextOffset+a,body:Buffer.concat(t)}}let o=r.nextOffset,s=o+a;if(s>e.length)return{complete:!1,consumedBytes:n,body:Buffer.concat(t)};t.push(e.subarray(o,s));let c=Jt(e,s);if(!c||c.lineEnd!==s)return{complete:!1,consumedBytes:n,body:Buffer.concat(t)};n=c.nextOffset}return{complete:!1,consumedBytes:n,body:Buffer.concat(t)}}function Xt(e){let t=Object.entries(e);return t.length===0?``:`${t.map(([e,t])=>`${e}: ${t}`).join(`\r
7
+ `)}\r\n`}function Zt(e){let t=e.method.trim().toUpperCase(),n=e.target.trim(),r=e.httpVersion??`1.1`;if(!Vt.test(t))throw Error(`method must be a valid HTTP token`);if(n.length===0)throw Error(`target is required`);if(Ut(n,`target`),r!==`1.0`&&r!==`1.1`)throw Error(`httpVersion must be either "1.0" or "1.1"`);let i={};for(let[t,n]of Object.entries(e.headers??{})){if(!Vt.test(t))throw Error(`Invalid HTTP header name: ${t}`);if(typeof n!=`string`)throw Error(`HTTP header "${t}" must be a string`);Ut(n,`headers.${t}`),i[t]=n}e.addHostHeader!==!1&&e.host&&!Wt(i,`Host`)&&(Ut(e.host,`host`),i.Host=e.host);let a=e.body??``;e.body!==void 0&&e.addContentLength!==!1&&!Wt(i,`Content-Length`)&&(Wt(i,`Transfer-Encoding`)||(i[`Content-Length`]=String(Buffer.byteLength(a,`utf8`)))),e.addConnectionClose!==!1&&!Wt(i,`Connection`)&&(i.Connection=`close`);let o=`${t} ${n} HTTP/${r}`,s=`${o}\r\n${Xt(i)}\r\n${a}`,c=Buffer.from(s,`utf8`);return{requestText:s,requestHex:c.toString(`hex`),requestBytes:c.length,startLine:o,headers:i,bodyBytes:Buffer.byteLength(a,`utf8`),httpVersion:r}}function Qt(e,t){let n=qt(e);if(n===null)return null;let r=e.subarray(0,n).toString(`latin1`).replace(/\r?\n\r?\n$/,``).split(/\r?\n/).filter(e=>e.length>0);if(r.length===0)throw Error(`HTTP response did not contain a status line`);let i=r[0],a=/^HTTP\/(\d+\.\d+)\s+(\d{3})(?:\s+(.*))?$/.exec(i);if(!a)throw Error(`Invalid HTTP status line: ${i}`);let o=[],s={};for(let e of r.slice(1)){let t=e.indexOf(`:`);if(t<=0)continue;let n=e.slice(0,t).trim(),r=e.slice(t+1).trim();o.push({name:n,value:r}),n in s?(n.toLowerCase(),s[n]=`${s[n]}, ${r}`):s[n]=r}let c=Number.parseInt(a[2],10),l=e.subarray(n);if(Kt(c,t))return{statusLine:i,httpVersion:a[1],statusCode:c,statusText:a[3]??``,headers:s,rawHeaders:o,headerBytes:n,bodyBytes:0,bodyBuffer:Buffer.alloc(0),bodyMode:`none`,complete:!0,expectedRawBytes:n,chunkedDecoded:!1};if(Gt(o,`transfer-encoding`)?.toLowerCase().includes(`chunked`)){let e=Yt(l);return{statusLine:i,httpVersion:a[1],statusCode:c,statusText:a[3]??``,headers:s,rawHeaders:o,headerBytes:n,bodyBytes:e.body.length,bodyBuffer:e.complete?e.body:l,bodyMode:`chunked`,complete:e.complete,expectedRawBytes:e.complete?n+e.consumedBytes:null,chunkedDecoded:e.complete}}let u=Gt(o,`content-length`);if(u!==null){let e=Number.parseInt(u,10);if(Number.isFinite(e)&&e>=0){let t=l.subarray(0,Math.min(l.length,e));return{statusLine:i,httpVersion:a[1],statusCode:c,statusText:a[3]??``,headers:s,rawHeaders:o,headerBytes:n,bodyBytes:t.length,bodyBuffer:t,bodyMode:`content-length`,complete:l.length>=e,expectedRawBytes:n+e,chunkedDecoded:!1}}}return{statusLine:i,httpVersion:a[1],statusCode:c,statusText:a[3]??``,headers:s,rawHeaders:o,headerBytes:n,bodyBytes:l.length,bodyBuffer:l,bodyMode:`until-close`,complete:!1,expectedRawBytes:null,chunkedDecoded:!1}}function $t(e,t){if(t.length===0||e&&Ht.test(e))return!0;let n=t.subarray(0,Math.min(t.length,64));for(let e of n)if(e===0)return!1;return!0}const en=2147483647,tn=4294967295,V={DATA:0,RST_STREAM:3,SETTINGS:4,PUSH_PROMISE:5,PING:6,GOAWAY:7,WINDOW_UPDATE:8};function H(e,t,n,r){if(!Number.isInteger(e)||e<n||e>r)throw Error(`${t} must be an integer between ${String(n)} and ${String(r)}`)}function nn(e,t){let n=e.replace(/\s+/g,``).trim();if(n.length===0)return Buffer.alloc(0);if(n.length%2!=0||!/^[0-9a-fA-F]+$/.test(n))throw Error(`${t} must be an even-length hexadecimal string`);return Buffer.from(n,`hex`)}function rn(e,t){return Buffer.from(e,t)}function an(e,t,n){if(e!==void 0&&t!==void 0)throw Error(`payloadHex and payloadText are mutually exclusive`);return e===void 0?t===void 0?Buffer.alloc(0):rn(t,n):nn(e,`payloadHex`)}function on(e){let t=Buffer.alloc(e.length*6);return e.forEach((e,n)=>{H(e.id,`settings[${String(n)}].id`,0,65535),H(e.value,`settings[${String(n)}].value`,0,tn),t.writeUInt16BE(e.id,n*6),t.writeUInt32BE(e.value>>>0,n*6+2)}),t}function sn(e,t){H(e,t,0,en);let n=Buffer.alloc(4);return n.writeUInt32BE(e>>>0,0),n[0]&=127,n}function cn(e){let t=e.frameType,n=e.flags??0;switch(H(n,`flags`,0,255),t){case`DATA`:return{payload:an(e.payloadHex,e.payloadText,e.payloadEncoding??`utf8`),typeCode:V.DATA,flags:n};case`SETTINGS`:if(e.ack===!0&&(e.settings?.length??0)>0)throw Error(`SETTINGS ack frames must not include settings payload`);return{payload:on(e.settings??[]),typeCode:V.SETTINGS,flags:e.ack?n|1:n};case`PING`:{let t=e.pingOpaqueDataHex?nn(e.pingOpaqueDataHex,`pingOpaqueDataHex`):Buffer.alloc(8);if(t.length!==8)throw Error(`PING frames require exactly 8 bytes of opaque data`);return{payload:t,typeCode:V.PING,flags:e.ack?n|1:n}}case`PUSH_PROMISE`:{let t=e.promisedStreamId;if(t===void 0)throw Error(`promisedStreamId is required for PUSH_PROMISE frames`);H(t,`promisedStreamId`,0,en);let r=e.headerBlockFragmentHex?nn(e.headerBlockFragmentHex,`headerBlockFragmentHex`):Buffer.alloc(0),i=typeof e.padLength==`number`;i&&H(e.padLength,`padLength`,0,255);let a=Buffer.alloc(4);a.writeUInt32BE(t>>>0,0),a[0]&=127;let o=[],s=n;return i&&(s|=8,o.push(Buffer.from([e.padLength&255]))),o.push(a,r),i&&o.push(Buffer.alloc(e.padLength)),{payload:Buffer.concat(o),typeCode:V.PUSH_PROMISE,flags:s}}case`WINDOW_UPDATE`:{let t=e.windowSizeIncrement;if(t===void 0)throw Error(`windowSizeIncrement is required for WINDOW_UPDATE frames`);return H(t,`windowSizeIncrement`,1,en),{payload:sn(t,`windowSizeIncrement`),typeCode:V.WINDOW_UPDATE,flags:n}}case`RST_STREAM`:{let t=e.errorCode??0;H(t,`errorCode`,0,tn);let r=Buffer.alloc(4);return r.writeUInt32BE(t>>>0,0),{payload:r,typeCode:V.RST_STREAM,flags:n}}case`GOAWAY`:{let t=e.lastStreamId??0,r=e.errorCode??0;H(t,`lastStreamId`,0,en),H(r,`errorCode`,0,tn);let i=e.debugDataText===void 0?Buffer.alloc(0):rn(e.debugDataText,e.debugDataEncoding??`utf8`);return{payload:Buffer.concat([sn(t,`lastStreamId`),Buffer.from([r>>>24&255,r>>>16&255,r>>>8&255,r&255]),i]),typeCode:V.GOAWAY,flags:n}}case`RAW`:{let t=e.frameTypeCode;if(t===void 0)throw Error(`frameTypeCode is required when frameType is RAW`);return H(t,`frameTypeCode`,0,255),{payload:an(e.payloadHex,e.payloadText,e.payloadEncoding??`utf8`),typeCode:t,flags:n}}}}function ln(e,t){if((e===`SETTINGS`||e===`PING`||e===`GOAWAY`)&&t!==0)throw Error(`${e} frames must use streamId 0`);if((e===`DATA`||e===`RST_STREAM`||e===`PUSH_PROMISE`)&&t===0)throw Error(`${e} frames must use a non-zero streamId`)}function un(e){let t=e.streamId??0;H(t,`streamId`,0,en),ln(e.frameType,t);let{payload:n,typeCode:r,flags:i}=cn(e);if(n.length>16777215)throw Error(`payload exceeds the HTTP/2 maximum frame size of 16777215 bytes`);let a=Buffer.alloc(9);a[0]=n.length>>>16&255,a[1]=n.length>>>8&255,a[2]=n.length&255,a[3]=r&255,a[4]=i&255,a.writeUInt32BE(t>>>0,5),a[5]&=127;let o=Buffer.concat([a,n]);return{frameType:e.frameType,typeCode:r,streamId:t,flags:i,payloadBytes:n.length,payloadHex:n.toString(`hex`),frameHeaderHex:a.toString(`hex`),frameHex:o.toString(`hex`)}}const dn={0:`DATA`,3:`RST_STREAM`,4:`SETTINGS`,5:`PUSH_PROMISE`,6:`PING`,7:`GOAWAY`,8:`WINDOW_UPDATE`};function fn(e,t){let n=e.replace(/\s+/g,``).trim();if(n.length===0)throw Error(`${t} must be a non-empty hexadecimal string`);if(n.length%2!=0||!/^[0-9a-fA-F]+$/.test(n))throw Error(`${t} must be an even-length hexadecimal string`);return Buffer.from(n,`hex`)}function pn(e){let t=fn(e,`frameHex`);if(t.length<9)throw Error(`frameHex must be at least 9 bytes (9-byte header)`);let n=t[0]<<16|t[1]<<8|t[2],r=t[3],i=t[4],a=t.readUInt32BE(5)&2147483647,o=dn[r]??`RAW`;if(9+n>t.length)throw Error(`truncated frame: header declares ${String(n)} payload bytes but only ${String(t.length-9)} remain`);let s=t.subarray(9,9+n),c=s.toString(`hex`),l={frameType:o,typeCode:r,streamId:a,flags:i,payloadBytes:s.length,payloadHex:c};switch(o){case`SETTINGS`:{if(s.length%6!=0){l.decodeError=`SETTINGS payload length ${String(s.length)} is not a multiple of 6`;break}let e=[];for(let t=0;t<s.length;t+=6)e.push({id:s.readUInt16BE(t),value:s.readUInt32BE(t+2)});l.settings=e;break}case`PING`:if(s.length!==8){l.decodeError=`PING payload length ${String(s.length)} is not 8`;break}l.pingOpaqueDataHex=c;break;case`PUSH_PROMISE`:{let e=(i&8)!=0,t=s;if(e){if(t.length<1){l.decodeError=`PUSH_PROMISE PADDED flag set but payload is empty`;break}let e=t[0];if(l.padLength=e,t.length<5+e){l.decodeError=`PUSH_PROMISE padding length ${String(e)} exceeds payload`;break}t=t.subarray(1,t.length-e)}if(t.length<4){l.decodeError=`PUSH_PROMISE payload length ${String(t.length)} is less than 4`;break}l.promisedStreamId=t.readUInt32BE(0)&2147483647,l.headerBlockFragmentHex=t.subarray(4).toString(`hex`);break}case`WINDOW_UPDATE`:if(s.length!==4){l.decodeError=`WINDOW_UPDATE payload length ${String(s.length)} is not 4`;break}l.windowSizeIncrement=s.readUInt32BE(0)&2147483647;break;case`RST_STREAM`:if(s.length!==4){l.decodeError=`RST_STREAM payload length ${String(s.length)} is not 4`;break}l.errorCode=s.readUInt32BE(0);break;case`GOAWAY`:if(s.length<8){l.decodeError=`GOAWAY payload length ${String(s.length)} is less than 8`;break}l.lastStreamId=s.readUInt32BE(0)&2147483647,l.errorCode=s.readUInt32BE(4),s.length>8&&(l.debugDataHex=s.subarray(8).toString(`hex`));break}return l}const mn=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;function U(e,t){if(e===void 0)return;if(typeof e!=`string`)throw Error(`${t} must be a string`);let n=e.trim();return n.length>0?n:void 0}function W(e,t,n={}){if(e!==void 0){if(typeof e!=`string`)throw Error(`${t} must be a string`);if(!(e.length===0&&!n.allowEmpty))return e}}function hn(e,t){if(e!==void 0){if(typeof e!=`boolean`)throw Error(`${t} must be a boolean`);return e}}function gn(e,t){if(e===void 0)return[];if(!Array.isArray(e)||e.some(e=>typeof e!=`string`))throw Error(`${t} must be an array of strings`);return e.map(e=>e.trim()).filter(e=>e.length>0)}function _n(e,t){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`${t} must be an object`);let n={};for(let[r,i]of Object.entries(e)){if(!mn.test(r))throw Error(`${t} contains an invalid HTTP header name: ${r}`);if(typeof i!=`string`)throw Error(`${t}.${r} must be a string`);n[r]=i}return n}function G(e,t=`authorization`){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`${t} must be an object`);let n=e,r=gn(n.allowedHosts,`${t}.allowedHosts`),i=gn(n.allowedCidrs,`${t}.allowedCidrs`),a=hn(n.allowPrivateNetwork,`${t}.allowPrivateNetwork`),o=hn(n.allowInsecureHttp,`${t}.allowInsecureHttp`),s=U(n.expiresAt,`${t}.expiresAt`),c=U(n.reason,`${t}.reason`),l={};return r.length>0&&(l.allowedHosts=r),i.length>0&&(l.allowedCidrs=i),a!==void 0&&(l.allowPrivateNetwork=a),o!==void 0&&(l.allowInsecureHttp=o),s!==void 0&&(l.expiresAt=s),c!==void 0&&(l.reason=c),l}function K(e,t,n){return Math.min(Math.max(e,t),n)}function vn(e){return Math.round(e*100)/100}function yn(e){let t=[...e].toSorted((e,t)=>e-t);return t.length===0?null:{count:t.length,minMs:t[0],maxMs:t[t.length-1],avgMs:vn(t.reduce((e,t)=>e+t,0)/t.length),p50Ms:t[Math.floor(t.length*.5)],p90Ms:t[Math.floor(t.length*.9)],p95Ms:t[Math.floor(t.length*.95)],p99Ms:t[Math.floor(t.length*.99)]}}async function bn(e,t,n){let r;try{r=new URL(e)}catch{throw Error(`url must be an absolute http:// or https:// URL`)}if(r.protocol!==`http:`&&r.protocol!==`https:`)throw Error(`url must use the http:// or https:// scheme`);let i=D(t),a=!i&&x();if(i&&(i.allowPrivateNetwork||i.allowInsecureHttp)&&!C(i))throw Error(`authorization must include at least one allowed host or CIDR when enabling private network or insecure HTTP access.`);if(w(i))throw Error(`authorization expired before the request was executed.`);let o;try{o=await S(r.toString())}catch{throw Error(`${n} blocked: DNS resolution failed for "${r.toString()}"`)}let s=e=>a?!0:i?.allowPrivateNetwork===!0&&T(i,e),c=e=>a||y(e.hostname)?!0:i?.allowInsecureHttp===!0&&T(i,e),l=Number.parseInt(r.port||(r.protocol===`https:`?`443`:`80`),10);if(r.protocol===`http:`&&!c(o))throw Error(`${n} blocked: insecure HTTP is only allowed for loopback or explicitly authorized targets, got "${o.hostname}:${String(l)}"`);let u=E(o.hostname),d=E(o.resolvedAddress??``),f=y(o.hostname)||y(o.resolvedAddress??``);if((u||d)&&!f&&!s(o))throw!u&&d&&o.resolvedAddress?Error(`${n} blocked: "${o.hostname}:${String(l)}" resolved to private IP ${o.resolvedAddress}`):Error(`${n} blocked: target "${o.hostname}:${String(l)}" resolves to a private or reserved address.`);return{url:r,target:o,authorizationPolicy:i,allowLegacyLocalSsrf:a}}function xn(e){let t=e.trim();return t.startsWith(`[`)&&t.endsWith(`]`)?t.slice(1,-1):t}function Sn(e){return e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function Cn(e){let t=(e.split(/\r?\n/,1)[0]?.trim()??``).split(/\s+/,1)[0]?.trim().toUpperCase()??``;if(!mn.test(t))throw Error(`requestText must start with a valid HTTP request line`);return t}async function wn(e,t,n,r,i,a){return await new Promise((o,s)=>{let c=k.createConnection({host:e,port:t}),l=!1,u=!1,d=new mt,f=()=>{c.removeAllListeners(),c.destroy()},p=e=>{l||(l=!0,f(),o({rawResponse:d.toBuffer(),endedBy:e}))},m=e=>{l||(l=!0,f(),s(e))};c.setTimeout(i),c.once(`connect`,()=>{c.end(n)}),c.on(`data`,e=>{if(u=!0,d.append(e),d.length>a){p(`max-bytes`);return}let t=Qt(d.toBuffer(),r);if(!(!t||!t.complete)){if(t.bodyMode===`none`){p(`no-body`);return}if(t.bodyMode===`content-length`){p(`content-length`);return}t.bodyMode===`chunked`&&p(`chunked`)}}),c.once(`timeout`,()=>{if(!u){m(Error(`Timed out waiting for HTTP response from ${e}:${String(t)}`));return}p(`timeout`)}),c.once(`end`,()=>{p(`socket-close`)}),c.once(`error`,e=>{m(e)})})}function Tn(e){return e===void 0?null:Array.isArray(e)?e.map(e=>String(e)):String(e)}function En(e){let t={};for(let[n,r]of Object.entries(e)){let e=Tn(r);e!==null&&(t[n]=e)}return t}async function Dn(e,t,n){let r=D(t),i=!r&&x();if(r&&r.allowPrivateNetwork&&!C(r))throw Error(`authorization must include at least one allowed host or CIDR when enabling private network access.`);if(w(r))throw Error(`authorization expired before the request was executed.`);let a;if(k.isIPv4(e))a=e;else try{a=(await oe.resolve(e,`A`))[0]}catch{throw Error(`${n} blocked: DNS resolution failed for "${e}"`)}let o=E(e),s=E(a),c=y(e)||y(a);if((o||s)&&!c&&!i&&!(r?.allowPrivateNetwork===!0&&T(r,{hostname:e,resolvedAddress:a})))throw Error(!o&&s?`${n} blocked: "${e}" resolved to private IP ${a}`:`${n} blocked: target "${e}" resolves to a private or reserved address.`);return a}function On(e){if(!e)return null;let t=e.trim();return t.length>0?t:null}function kn(e){let t={};for(let[n,r]of Object.entries(e??{}))t[n.toLowerCase()]=r;return t}function An(e){let{url:t,target:n,method:r,requestHeaders:i,bodyBuffer:a,timeoutMs:o,maxBodyBytes:s,effectivePort:c,requestedAlpnProtocols:l,connectTimeoutMs:u=1e4}=e,d=null;return new Promise((e,f)=>{let p=!1,m,h=new mt,g=!1,_=null,v=null,y=ce.connect(t.origin,{createConnection:()=>{if(t.protocol===`https:`){let e=se.connect({host:n.resolvedAddress??n.hostname,port:c,servername:n.hostname,ALPNProtocols:l,rejectUnauthorized:!0}),r=setTimeout(()=>{e.destroy(Error(`Timed out connecting to ${t.toString()} (${u}ms)`))},u);return e.once(`secureConnect`,()=>{clearTimeout(r),d=On(e.alpnProtocol)}),e.once(`error`,()=>clearTimeout(r)),e.setTimeout(o,()=>{e.destroy(Error(`Timed out probing HTTP/2 endpoint ${t.toString()}`))}),v=e,e}let e=k.connect({host:n.resolvedAddress??n.hostname,port:c});return e.setTimeout(o,()=>{e.destroy(Error(`Timed out probing HTTP/2 endpoint ${t.toString()}`))}),v=e,e}}),b=()=>{_?.removeAllListeners(),y.removeAllListeners()},x=()=>{p||(p=!0,b(),y.close(),e({responseHeaders:m??{},bodyBuffer:h.toBuffer(),truncated:g,alpnProtocol:d}))},S=e=>{p||(p=!0,b(),y.destroy(e),f(e))};y.once(`error`,e=>{v instanceof se.TLSSocket&&(d=On(v.alpnProtocol)),S(e instanceof Error?e:Error(String(e)))}),y.once(`connect`,()=>{v instanceof se.TLSSocket&&(d=On(v.alpnProtocol)),_=y.request({":method":r,":path":`${t.pathname}${t.search}`,":scheme":t.protocol.slice(0,-1),":authority":t.host,...i}),_.once(`response`,e=>{m=e}),_.on(`data`,e=>{let t=Buffer.isBuffer(e)?e:Buffer.from(e,`utf8`),n=s-h.length;n>0&&h.append(t.subarray(0,n)),t.length>n&&!g&&(g=!0,_?.close(ce.constants.NGHTTP2_CANCEL))}),_.once(`end`,x),_.once(`close`,()=>{g&&x()}),_.once(`error`,e=>{S(e instanceof Error?e:Error(String(e)))}),a.length>0?_.end(a):_.end()})})}const q=[`A`,`AAAA`,`MX`,`TXT`,`NS`,`CNAME`,`SOA`,`PTR`,`SRV`,`ANY`];function jn(e){return e?e===`ENOTFOUND`?`NXDOMAIN`:e===`ENODATA`?`NODATA`:e===`ESERVFAIL`?`SERVFAIL`:e===`ETIMEOUT`?`TIMEOUT`:e===`ECONNREFUSED`?`CONNREFUSED`:e===`EREFUSED`?`REFUSED`:`ERROR`:`ERROR`}function J(e){return Math.round((performance.now()-e)*100)/100}function Mn(e){if(!e)return oe;let t=new oe.Resolver;return t.setServers([e]),t}var Nn=class{eventBus;constructor(e){this.eventBus=e}async handleDnsResolve(e){try{let t=U(e.hostname,`hostname`);if(!t)return v.text(`hostname is required`,!0);let n=U(e.rrType,`rrType`)??`A`;if(!q.includes(n))return v.text(`Invalid rrType: "${n}". Expected one of: ${q.join(`, `)}`,!0);let r=U(e.server,`server`),i=Mn(r),a=performance.now(),o=await i.resolve(t,n),s=J(a);return v.ok().json({hostname:t,rrType:n,records:o,timing:s,...r?{server:r}:{}})}catch(e){let t=e instanceof Error?e.message:String(e);return v.fail(`DNS resolve failed: ${t}`).json()}}async handleDnsReverse(e){try{let t=U(e.ip,`ip`);if(!t)return v.text(`ip is required`,!0);let n=U(e.server,`server`),r=Mn(n),i=performance.now(),a=await r.reverse(t),o=J(i);return v.ok().json({ip:t,hostnames:a,timing:o,...n?{server:n}:{}})}catch(e){let t=e instanceof Error?e.message:String(e);return v.fail(`DNS reverse lookup failed: ${t}`).json()}}async handleDnsProbe(e){try{let t=U(e.hostname,`hostname`);if(!t)return v.text(`hostname is required`,!0);let n=U(e.rrType,`rrType`)??`A`;if(!q.includes(n))return v.text(`Invalid rrType: "${n}". Expected one of: ${q.join(`, `)}`,!0);let r=U(e.server,`server`),i=Mn(r),a=performance.now();try{let e=await i.resolve(t,n),o=J(a);return v.ok().json({hostname:t,rrType:n,status:`NOERROR`,records:e,timing:o,...r?{server:r}:{}})}catch(e){let i=J(a),o=e instanceof Error&&`code`in e?e.code:void 0,s=jn(o);return v.ok().json({hostname:t,rrType:n,status:s,records:[],timing:i,errorCode:o??null,...r?{server:r}:{}})}}catch(e){let t=e instanceof Error?e.message:String(e);return v.fail(`DNS probe failed: ${t}`).json()}}async handleDnsCnameChain(e){try{let t=U(e.hostname,`hostname`);if(!t)return v.text(`hostname is required`,!0);let n=M(e.maxDepth,{defaultValue:10,min:1,max:30,integer:!0}),r=U(e.server,`server`),i=Mn(r),a=[],o=t;for(let e=0;e<n;e++){let t=performance.now();try{let n=await i.resolve(o,`CNAME`),r=J(t),s=n[0]??null;if(a.push({host:o,target:s,status:`CNAME`,depth:e,timing:r}),s)o=s;else break}catch(n){let r=J(t),i=n instanceof Error&&`code`in n?n.code:void 0,s=i===`ENOTFOUND`||i===`ENODATA`?`TERMINAL`:jn(i);a.push({host:o,target:null,status:s,depth:e,timing:r});break}}return v.ok().json({hostname:t,chain:a,depth:a.length,...r?{server:r}:{}})}catch(e){let t=e instanceof Error?e.message:String(e);return v.fail(`CNAME chain trace failed: ${t}`).json()}}async handleDnsBulkResolve(e){try{let t=gn(e.hostnames,`hostnames`);if(t.length===0)return v.text(`hostnames must be a non-empty array`,!0);if(t.length>1e3)return v.text(`hostnames array too large (max 1000)`,!0);let n=U(e.rrType,`rrType`)??`A`;if(!q.includes(n))return v.text(`Invalid rrType: "${n}". Expected one of: ${q.join(`, `)}`,!0);let r=M(e.concurrency,{defaultValue:10,min:1,max:50,integer:!0}),i=U(e.server,`server`),a=Mn(i),o=[];for(let e=0;e<t.length;e+=r){let i=t.slice(e,e+r),s=await Promise.all(i.map(async e=>{let t=performance.now();try{return{hostname:e,status:`NOERROR`,records:await a.resolve(e,n),timing:J(t)}}catch(n){let r=J(t);return{hostname:e,status:jn(n instanceof Error&&`code`in n?n.code:void 0),records:[],timing:r}}}));o.push(...s)}let s=o.filter(e=>e.status!==`NOERROR`).length;return v.ok().json({results:o,total:o.length,errors:s,rrType:n,...i?{server:i}:{}})}catch(e){let t=e instanceof Error?e.message:String(e);return v.fail(`Bulk DNS resolve failed: ${t}`).json()}}async handleHttpRequestBuild(e){try{let t=U(e.method,`method`),n=U(e.target,`target`);if(!t)throw Error(`method is required`);if(!n)throw Error(`target is required`);let r=Zt({method:t,target:n,host:U(e.host,`host`),headers:_n(e.headers,`headers`),body:W(e.body,`body`,{allowEmpty:!0}),httpVersion:U(e.httpVersion,`httpVersion`)??`1.1`,addHostHeader:j(e.addHostHeader,!0),addContentLength:j(e.addContentLength,!0),addConnectionClose:j(e.addConnectionClose,!0)});return A(this.eventBus,`network:http_request_built`,{method:r.startLine.split(` `,1)[0]??`UNKNOWN`,target:n,byteLength:r.requestBytes,timestamp:new Date().toISOString()}),v.ok().merge(r).json()}catch(e){return v.fail(e instanceof Error?e.message:String(e)).json()}}async handleHttpPlainRequest(e){try{let t=U(e.host,`host`),n=W(e.requestText,`requestText`);if(!t)throw Error(`host is required`);if(!n)throw Error(`requestText is required`);let r=xn(t),i=M(e.port,{defaultValue:80,min:1,max:65535,integer:!0}),a=M(e.timeoutMs,{defaultValue:3e4,min:1,max:12e4,integer:!0}),o=M(e.maxResponseBytes,{defaultValue:512e3,min:256,max:5242880,integer:!0}),s=Cn(n),c=G(e.authorization),{target:l}=await bn(`http://${Sn(r)}:${String(i)}/`,c,`HTTP request`);if(c){let e=(n.split(/\r?\n/,1)[0]??``).split(/\s+/)[1]??``;if(e.includes(`://`))try{let t=xn(new URL(e).hostname);if(t!==r&&t!==(l.resolvedAddress??``))throw Error(`HTTP request blocked: request-line target host "${t}" does not match authorized host "${r}"`)}catch(e){if(e instanceof Error&&e.message.startsWith(`HTTP request blocked:`))throw e}let t=n.match(/^Host:\s*(\S+)/im)?.[1];if(t){let e=xn(t.replace(/:\d+$/,``));if(e!==r&&e!==(l.resolvedAddress??``))throw Error(`HTTP request blocked: Host header "${t}" does not match authorized host "${r}"`)}}let u=await wn(l.resolvedAddress??l.hostname,i,Buffer.from(n,`utf8`),s,a,o),d=Qt(u.rawResponse,s);if(!d)throw Error(`Received data but could not parse complete HTTP response headers.`);let f=$t(d.rawHeaders.find(e=>e.name.toLowerCase()===`content-type`)?.value??null,d.bodyBuffer),p=d.complete||d.bodyMode===`until-close`&&u.endedBy===`socket-close`;return A(this.eventBus,`network:http_plain_request_completed`,{host:r,port:i,statusCode:d.statusCode,byteLength:u.rawResponse.length,timestamp:new Date().toISOString()}),v.ok().merge({host:r,port:i,resolvedAddress:l.resolvedAddress??l.hostname,requestBytes:Buffer.byteLength(n,`utf8`),response:{statusLine:d.statusLine,httpVersion:d.httpVersion,statusCode:d.statusCode,statusText:d.statusText,headers:d.headers,rawHeaders:d.rawHeaders,headerBytes:d.headerBytes,bodyBytes:d.bodyBytes,bodyMode:d.bodyMode,chunkedDecoded:d.chunkedDecoded,complete:p,truncated:u.endedBy===`max-bytes`,endedBy:u.endedBy,bodyText:f?d.bodyBuffer.toString(`utf8`):void 0,bodyBase64:f?void 0:d.bodyBuffer.toString(`base64`)}}).json()}catch(e){return v.fail(e instanceof Error?e.message:String(e)).json()}}};function Pn(e){return e.replace(/\s+/g,``).trim().toLowerCase()}function Fn(e){let t=Pn(e),n=[];if(t.length===0)throw Error(`frameHex must be a non-empty hexadecimal string`);if(t.length%2!=0||!/^[0-9a-f]+$/.test(t))throw Error(`frameHex must be an even-length hexadecimal string`);let r=t.length/2,i=0,a=!1;r>=24&&t.slice(0,48)===`505249202a20485454502f322e300d0a0d0a534d0d0a0d0a`&&(i=24,a=!0);let o=[],s=!1;for(;i*2+18<=t.length;){let e=t.slice(i*2),r=e.length/2,a=Number.parseInt(e.slice(0,2),16)<<16|Number.parseInt(e.slice(2,4),16)<<8|Number.parseInt(e.slice(4,6),16);if(r<9+a){n.push(`trailing frame at byte offset ${String(i)} declares ${String(a)} payload bytes but only ${String(r-9)} remain; stopped`),s=!0;break}let c=9+a,l=e.slice(0,c*2);try{o.push(pn(l))}catch(e){n.push(`frame at byte offset ${String(i)} failed to parse: ${e instanceof Error?e.message:String(e)}; stopped`),s=!0;break}i+=c}if(!s){let e=t.length/2-i;e>0&&n.push(`trailing ${String(e)} bytes after last complete frame; ignored`)}return o.length===0&&n.length===0&&n.push(`no complete HTTP/2 frame header found in input`),{frames:o,prefaceSkipped:a,warnings:n}}function In(e,t){let n=Buffer.from(e,`hex`);if(n.length<5)return null;let r=n.readUInt32BE(0);return{streamId:t,exclusive:(r&2147483648)!=0,dependsOn:r&2147483647,weight:n[4]}}function Ln(e){let t=[],n=e.find(e=>e.frameType===`SETTINGS`&&(e.flags&1)==0)?.settings??[],r=e.find(e=>e.frameType===`WINDOW_UPDATE`&&e.streamId===0)?.windowSizeIncrement??null,i=[];for(let n of e){if(n.typeCode!==2)continue;let e=In(n.payloadHex,n.streamId);if(e===null){t.push(`PRIORITY frame on stream ${String(n.streamId)} has malformed payload (${String(n.payloadBytes)} bytes); skipped`);continue}i.push(e)}let a=`${n.map(e=>`${String(e.id)}:${String(e.value)}`).join(`;`)}|${r===null?``:String(r)}|${i.map(e=>`${String(e.streamId)}:${String(e.weight)}`).join(`,`)}`;return{canonical:a,hash:ie(`sha256`).update(a).digest(`hex`),settings:n,windowUpdateIncrement:r,priorities:i,frameCount:e.length,prefaceSkipped:!1,warnings:t}}var Rn=class{eventBus;constructor(e){this.eventBus=e}async handleHttp2Probe(e){let t=U(e.url,`url`),n=t??``,r=null,i=null,a=!1;try{if(!t)throw Error(`url is required`);let o=(U(e.method,`method`)??`GET`).toUpperCase();if(!mn.test(o))throw Error(`method must be a valid HTTP token`);let s=M(e.timeoutMs,{defaultValue:3e4,min:1,max:12e4,integer:!0}),c=M(e.maxBodyBytes,{defaultValue:32768,min:128,max:1048576,integer:!0}),l=e.body,u=l!=null&&typeof l!=`string`,d=typeof l==`string`?l:u?JSON.stringify(l):``,f=Buffer.from(d,`utf8`),p=gn(e.alpnProtocols,`alpnProtocols`),m=kn(_n(e.headers,`headers`));u&&f.length>0&&!(`content-type`in m)&&(m[`content-type`]=`application/json`);let{url:h,target:g}=await bn(t,G(e.authorization),`HTTP/2 probe`);n=h.toString(),!(`content-length`in m)&&f.length>0&&(m[`content-length`]=String(f.length));let{responseHeaders:_,bodyBuffer:y,truncated:b,alpnProtocol:x}=await An({url:h,target:g,method:o,requestHeaders:m,bodyBuffer:f,timeoutMs:s,maxBodyBytes:c,effectivePort:Number.parseInt(h.port||(h.protocol===`https:`?`443`:`80`),10),requestedAlpnProtocols:p.length>0?p:[`h2`,`http/1.1`]}),S=En(_),C=_[`:status`],w=typeof C==`number`?C:typeof C==`string`?Number.parseInt(C,10):null,T=$t(typeof S[`content-type`]==`string`?S[`content-type`]:Array.isArray(S[`content-type`])?S[`content-type`][0]??null:null,y);return r=Number.isFinite(w??NaN)?w:null,i=x,a=!0,v.ok().merge({url:n,statusCode:r,alpnProtocol:i,headers:S,bodyBytes:y.length,truncated:b,bodyText:T?y.toString(`utf8`):void 0,bodyBase64:T?void 0:y.toString(`base64`)}).json()}catch(e){return v.fail(e instanceof Error?e.message:String(e)).json()}finally{A(this.eventBus,`network:http2_probed`,{url:n,success:a,statusCode:r,alpnProtocol:i,timestamp:new Date().toISOString()})}}async handleHttp2FrameBuild(e){let t=U(e.frameType,`frameType`);if(!t)throw Error(`frameType is required`);let n=[`DATA`,`SETTINGS`,`PING`,`WINDOW_UPDATE`,`RST_STREAM`,`GOAWAY`,`PUSH_PROMISE`,`RAW`],r=t.toUpperCase();if(!n.includes(r))throw Error(`frameType must be one of: ${n.join(`, `)}`);let i=e.streamId===void 0?void 0:M(e.streamId,{defaultValue:0,min:0,integer:!0}),a=e.flags===void 0?void 0:M(e.flags,{defaultValue:0,min:0,max:255,integer:!0}),o=e.frameTypeCode===void 0?void 0:M(e.frameTypeCode,{defaultValue:0,min:0,max:255,integer:!0}),s=e.windowSizeIncrement===void 0?void 0:M(e.windowSizeIncrement,{defaultValue:1,min:1,integer:!0}),c=e.errorCode===void 0?void 0:M(e.errorCode,{defaultValue:0,min:0,integer:!0}),l=e.lastStreamId===void 0?void 0:M(e.lastStreamId,{defaultValue:0,min:0,integer:!0}),u=U(e.payloadHex,`payloadHex`),d=W(e.payloadText,`payloadText`,{allowEmpty:!0}),f=U(e.payloadEncoding,`payloadEncoding`),p=hn(e.ack,`ack`),m=U(e.pingOpaqueDataHex,`pingOpaqueDataHex`),h=W(e.debugDataText,`debugDataText`,{allowEmpty:!0}),g=U(e.debugDataEncoding,`debugDataEncoding`),_;if(e.settings!==void 0){if(!Array.isArray(e.settings))throw Error(`settings must be an array`);_=e.settings.map((e,t)=>{if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`settings[${String(t)}] must be an object with id and value`);return{id:typeof e.id==`number`?e.id:(()=>{throw Error(`settings[${String(t)}].id must be a number`)})(),value:typeof e.value==`number`?e.value:(()=>{throw Error(`settings[${String(t)}].value must be a number`)})()}})}let y=un({frameType:r,...i!==void 0&&{streamId:i},...a!==void 0&&{flags:a},...o!==void 0&&{frameTypeCode:o},...u!==void 0&&{payloadHex:u},...d!==void 0&&{payloadText:d},...f!==void 0&&{payloadEncoding:f},..._!==void 0&&{settings:_},...p!==void 0&&{ack:p},...m!==void 0&&{pingOpaqueDataHex:m},...s!==void 0&&{windowSizeIncrement:s},...c!==void 0&&{errorCode:c},...l!==void 0&&{lastStreamId:l},...h!==void 0&&{debugDataText:h},...g!==void 0&&{debugDataEncoding:g}});return A(this.eventBus,`network:http2_frame_build_completed`,{frameType:y.frameType,typeCode:y.typeCode,streamId:y.streamId,flags:y.flags,payloadBytes:y.payloadBytes,timestamp:new Date().toISOString()}),v.ok().merge(y).json()}async handleHttp2FrameParse(e){let t=W(e.frameHex,`frameHex`,{allowEmpty:!1});if(!t)throw Error(`frameHex is required`);let n=pn(t);return A(this.eventBus,`network:http2_frame_parsed`,{frameType:n.frameType,typeCode:n.typeCode,streamId:n.streamId,payloadBytes:n.payloadBytes,timestamp:new Date().toISOString()}),v.ok().merge(n).json()}async handleNetworkHttp2Fingerprint(e){let t=W(e.framesHex,`framesHex`,{allowEmpty:!1});if(!t)throw Error(`framesHex is required`);let{frames:n,prefaceSkipped:r,warnings:i}=Fn(t),a=Ln(n);return a.prefaceSkipped=r,a.warnings=[...i,...a.warnings],A(this.eventBus,`network:http2_fingerprint_computed`,{hash:a.hash,frameCount:a.frameCount,timestamp:new Date().toISOString()}),v.ok().merge(a).json()}},zn=class{eventBus;constructor(e){this.eventBus=e}async handleGrpcFrameParse(e){let t=U(e.data,`data`);if(!t)throw Error(`data is required`);let n=U(e.encoding,`encoding`)??`hex`;if(n!==`hex`&&n!==`base64`)throw Error(`encoding must be one of: hex, base64`);let r=te(t,n);return A(this.eventBus,`network:grpc_frame_parsed`,{messageCount:r.frames.length,totalBytes:r.totalBytes,timestamp:new Date().toISOString()}),v.ok().merge(r).json()}async handleGrpcFrameBuild(e){if(!Array.isArray(e.messages))throw Error(`messages must be an array`);let t=ne(e.messages.map((e,t)=>{if(typeof e!=`object`||!e)throw Error(`messages[${String(t)}] must be an object`);let n=typeof e.payloadHex==`string`?e.payloadHex:(()=>{throw Error(`messages[${String(t)}].payloadHex must be a string`)})(),r=e.compressed===void 0?void 0:M(e.compressed,{defaultValue:0,min:0,max:1,integer:!0})===1,i=e.isTrailer===void 0?void 0:M(e.isTrailer,{defaultValue:0,min:0,max:1,integer:!0})===1;return{payloadHex:n,...r!==void 0&&{compressed:r},...i!==void 0&&{isTrailer:i}}}));return A(this.eventBus,`network:grpc_frame_built`,{messageCount:t.messageCount,bytes:t.bytes,timestamp:new Date().toISOString()}),v.ok().merge(t).json()}},Bn=class{validateIp(e){let t=e.split(`.`);return t.length===4?t.every(e=>{let t=parseInt(e,10);return!isNaN(t)&&t>=0&&t<=255&&e===String(t)}):!1}ipToString(e){return`${e&255}.${e>>>8&255}.${e>>>16&255}.${e>>>24&255}`}};const Vn={0:`SUCCESS`,11001:`BUF_TOO_SMALL`,11002:`DEST_NET_UNREACHABLE`,11003:`DEST_HOST_UNREACHABLE`,11004:`DEST_PROT_UNREACHABLE`,11005:`DEST_PORT_UNREACHABLE`,11009:`PACKET_TOO_BIG`,11010:`REQ_TIMED_OUT`,11013:`TTL_EXPIRED_TRANSIT`,11014:`TTL_EXPIRED_REASSEM`,11015:`PARAM_PROBLEM`,11016:`SOURCE_QUENCH`,11050:`GENERAL_FAILURE`};function Hn(e){return Vn[e]??`UNKNOWN_${e}`}function Un(e){return e===0?`success`:e===11010?`timeout`:e===11013||e===11014?`time_exceeded`:e>=11002&&e<=11005?`destination_unreachable`:e===11016?`source_quench`:e===11009?`packet_too_big`:e===11015?`parameter_problem`:`error`}let Wn=null,Gn=null,Kn=null;function qn(){return Wn||(Wn=ae.load(`iphlpapi.dll`),e.debug(`Loaded iphlpapi.dll via koffi`)),Wn}function Jn(){return Gn||(Gn=ae.load(`ws2_32.dll`),e.debug(`Loaded ws2_32.dll via koffi`)),Gn}function Yn(){if(!Kn){let e=qn(),t=Jn(),n=e.func(`uint32 IcmpSendEcho(void *, uint32, void *, uint16, void *, void *, uint32, uint32)`);Kn={inetAddr:t.func(`uint32 inet_addr(char *)`),createFile:e.func(`void * IcmpCreateFile()`),closeHandle:e.func(`int IcmpCloseHandle(void *)`),sendEcho:n}}return Kn}function Xn(e){return Math.max(256,e+64)}function Zn(e){let t=Buffer.alloc(16,0);return t.writeUInt8(e,0),t}function Qn(e){return{address:e.readUInt32LE(0),status:e.readUInt32LE(4),rtt:e.readUInt32LE(8)}}var $n=class t extends Bn{static cachedInstance=null;static instance(){return this.cachedInstance||=new t,this.cachedInstance}constructor(){super()}isAvailable(){if(process.platform!==`win32`)return!1;try{return ae.load(`iphlpapi.dll`).unload(),!0}catch{return!1}}async probe(e){let{target:t,ttl:r=128,packetSize:a=n,timeout:o=i}=e,s=Yn(),c=s.inetAddr(t);if(c===4294967295)return{target:t,ip:``,alive:!1,rtt:null,ttl:r,icmpStatus:`INVALID_ADDRESS`,errorClass:`error`,packetSize:a};let l=s.createFile();try{let e=Buffer.alloc(a,170),n=Zn(r),i=Buffer.alloc(Xn(a));if(await new Promise((t,r)=>{s.sendEcho.async(l,c,e,e.length,n,i,i.length,o,(e,n)=>{if(e){r(e);return}t(Number(n))})})===0)return{target:t,ip:this.ipToString(c),alive:!1,rtt:null,ttl:r,icmpStatus:`REQ_TIMED_OUT`,errorClass:`timeout`,packetSize:a};let u=Qn(i);return{target:t,ip:this.ipToString(u.address),alive:u.status===0,rtt:u.status===0?u.rtt:null,ttl:r,icmpStatus:Hn(u.status),errorClass:Un(u.status),packetSize:a}}finally{s.closeHandle(l)}}async traceroute(e){let{target:t,maxHops:r=o,timeout:a=i,packetSize:s=n}=e,c=Yn(),l=c.inetAddr(t);if(l===4294967295)return{target:t,ip:``,hops:[],reached:!1,totalHops:0,totalTime:0};let u=c.createFile(),d=[],f=performance.now();try{for(let e=1;e<=r;e++){let t=Buffer.alloc(s,170),n=Zn(e),r=Buffer.alloc(Xn(s));if(await new Promise((e,i)=>{c.sendEcho.async(u,l,t,t.length,n,r,r.length,a,(t,n)=>{if(t){i(t);return}e(Number(n))})})===0){d.push({hop:e,ip:null,rtt:null,status:`REQ_TIMED_OUT`,errorClass:`timeout`});continue}let i=Qn(r),o=this.ipToString(i.address);if(d.push({hop:e,ip:o,rtt:i.rtt,status:Hn(i.status),errorClass:Un(i.status)}),i.status===0)break}}finally{c.closeHandle(u)}let p=d[d.length-1];return{target:t,ip:this.ipToString(l),hops:d,reached:p?.status===`SUCCESS`,totalHops:d.length,totalTime:Math.round((performance.now()-f)*100)/100}}static unloadLibraries(){Wn&&=(Wn.unload(),null),Gn&&=(Gn.unload(),null),Kn=null,e.debug(`Unloaded Windows ICMP libraries`)}};const er=process.platform===`darwin`?4102:20,tr=process.platform===`darwin`?`/usr/lib/libSystem.B.dylib`:`libc.so.6`;let nr=null,rr=null;function ir(){return nr||(nr=ae.load(tr),e.debug(`Loaded ${tr} via koffi for ICMP`)),nr}function ar(){if(!rr){let e=ir();rr={socket:e.func(`int socket(int, int, int)`),setsockopt:e.func(`int setsockopt(int, int, int, void *, int)`),sendto:e.func(`int sendto(int, void *, int, int, void *, int)`),recv:e.func(`int recv(int, void *, int, int)`),close:e.func(`int close(int)`)}}return rr}function or(e){let t=0;for(let n=0;n<e.length-1;n+=2)t+=e.readUInt16BE(n);for(e.length&1&&(t+=(e[e.length-1]??0)<<8);t>65535;)t=(t&65535)+(t>>>16);return~t&65535}function sr(e,t,n){let r=Buffer.alloc(8+n);r[0]=8,r[1]=0,r.writeUInt16BE(e&65535,4),r.writeUInt16BE(t&65535,6);for(let e=8;e<r.length;e++)r[e]=170;return r.writeUInt16BE(or(r),2),r}function cr(e){let t=Buffer.alloc(16,0);t.writeUInt16LE(2,0);let n=e.split(`.`).map(Number);return t[4]=n[0]??0,t[5]=n[1]??0,t[6]=n[2]??0,t[7]=n[3]??0,t}function lr(e,t,n){if(t<20)return null;let r=((e[0]??0)&15)*4;if(t<r+8)return null;let i=e[r]??0,a=e[r+1]??0,o=e.readUInt32LE(12);if(i===0)return e.readUInt16BE(r+4)===n?{type:i,code:a,fromIp:o}:null;if(i===11||i===3){let s=r+8;if(t<s+28)return null;let c=((e[s]??0)&15)*4;return t<s+c+8||e.readUInt16BE(s+c+4)!==n?null:{type:i,code:a,fromIp:o}}return null}function ur(e,t,n){return e===0?`SUCCESS`:n?`REQ_TIMED_OUT`:e===11&&t===0?`TTL_EXPIRED_TRANSIT`:e===11&&t===1?`TTL_EXPIRED_REASSEM`:e===3&&t===0?`DEST_NET_UNREACHABLE`:e===3&&t===1?`DEST_HOST_UNREACHABLE`:e===3&&t===2?`DEST_PROT_UNREACHABLE`:e===3&&t===3?`DEST_PORT_UNREACHABLE`:`UNKNOWN_${e}_${t}`}function dr(e,t,n){return e===0?`success`:n?`timeout`:e===11?`time_exceeded`:e===3?`destination_unreachable`:`error`}var fr=class t extends Bn{static cachedInstance=null;static instance(){return this.cachedInstance||=new t,this.cachedInstance}constructor(){super()}isAvailable(){if(process.platform!==`linux`&&process.platform!==`darwin`)return!1;try{let e=ar(),t=e.socket(2,3,1);return t>=0?(e.close(t),!0):!1}catch{return!1}}async probe(e){let{target:t,ttl:r=128,packetSize:a=n,timeout:o=i}=e;if(!this.validateIp(t))return{target:t,ip:``,alive:!1,rtt:null,ttl:r,icmpStatus:`INVALID_ADDRESS`,errorClass:`error`,packetSize:a};let s=ar(),c=s.socket(2,3,1);if(c<0)return{target:t,ip:``,alive:!1,rtt:null,ttl:r,icmpStatus:`SOCKET_ERROR`,errorClass:`error`,packetSize:a};try{this.setTtl(s,c,r),this.setRecvTimeout(s,c,o);let e=process.pid&65535,n=sr(e,1,a),i=cr(t),l=performance.now();if(s.sendto(c,n,n.length,0,i,16)<0)return{target:t,ip:t,alive:!1,rtt:null,ttl:r,icmpStatus:`SEND_ERROR`,errorClass:`error`,packetSize:a};let u=Buffer.alloc(512),d=s.recv(c,u,u.length,0),f=Math.round(performance.now()-l);if(d<=0)return{target:t,ip:t,alive:!1,rtt:null,ttl:r,icmpStatus:`REQ_TIMED_OUT`,errorClass:`timeout`,packetSize:a};let p=lr(u,d,e);if(!p)return{target:t,ip:t,alive:!1,rtt:null,ttl:r,icmpStatus:`UNEXPECTED_REPLY`,errorClass:`error`,packetSize:a};let m=p.type===0;return{target:t,ip:this.ipToString(p.fromIp),alive:m,rtt:m?f:null,ttl:r,icmpStatus:ur(p.type,p.code,!1),errorClass:dr(p.type,p.code,!1),packetSize:a}}finally{s.close(c)}}async traceroute(e){let{target:t,maxHops:r=o,timeout:a=i,packetSize:s=n}=e;if(!this.validateIp(t))return{target:t,ip:``,hops:[],reached:!1,totalHops:0,totalTime:0};let c=ar(),l=c.socket(2,3,1);if(l<0)return{target:t,ip:``,hops:[],reached:!1,totalHops:0,totalTime:0};let u=[],d=process.pid&65535,f=cr(t),p=performance.now(),m=0;try{this.setRecvTimeout(c,l,a);for(let e=1;e<=r;e++){this.setTtl(c,l,e);let t=sr(d,e,s),n=performance.now();if(c.sendto(l,t,t.length,0,f,16)<0){if(m++,u.push({hop:e,ip:null,rtt:null,status:`SEND_ERROR`,errorClass:`error`}),m>=5)break;continue}m=0;let r=Buffer.alloc(512),i=c.recv(l,r,r.length,0),a=Math.round(performance.now()-n);if(i<=0){u.push({hop:e,ip:null,rtt:null,status:`REQ_TIMED_OUT`,errorClass:`timeout`});continue}let o=lr(r,i,d);if(!o){u.push({hop:e,ip:null,rtt:null,status:`UNEXPECTED_REPLY`,errorClass:`error`});continue}let p=ur(o.type,o.code,!1),h=dr(o.type,o.code,!1);if(u.push({hop:e,ip:this.ipToString(o.fromIp),rtt:a,status:p,errorClass:h}),o.type===0)break}}finally{c.close(l)}return{target:t,ip:t,hops:u,reached:u[u.length-1]?.status===`SUCCESS`,totalHops:u.length,totalTime:Math.round((performance.now()-p)*100)/100}}setTtl(e,t,n){let r=Buffer.alloc(4);r.writeInt32LE(n),e.setsockopt(t,0,2,r,4)}setRecvTimeout(e,t,n){let r=Buffer.alloc(16,0);r.writeInt32LE(Math.floor(n/1e3),0),r.writeInt32LE(n%1e3*1e3,8),e.setsockopt(t,1,er,r,16)}static unloadLibraries(){nr&&=(nr.unload(),null),rr=null,e.debug(`Unloaded POSIX ICMP libraries`)}};let pr=null,Y=null;function mr(){if(Y)return Y;if(process.platform===`win32`)return Y=$n.instance(),Y;if(process.platform===`linux`||process.platform===`darwin`)return Y=fr.instance(),Y;throw Error(`Platform ${process.platform} not supported for ICMP operations`)}function hr(){if(pr!==null)return pr;try{pr=mr().isAvailable()}catch{pr=!1}return pr}async function gr(e){return hr()?mr().probe(e):{target:e.target,ip:``,alive:!1,rtt:null,ttl:e.ttl??128,icmpStatus:`PLATFORM_NOT_SUPPORTED`,errorClass:`error`,packetSize:e.packetSize??32}}async function _r(e){return hr()?mr().traceroute(e):{target:e.target,ip:``,hops:[],reached:!1,totalHops:0,totalTime:0}}function vr(e,t){let n=U(e,`probeType`)??t;if(n===`tcp`||n===`tls`||n===`http`)return n;throw Error(`probeType must be one of: tcp, tls, http`)}function yr(e){return typeof e==`object`&&!!e&&`all`in e&&e.all===!0}var br=class{eventBus;constructor(e){this.eventBus=e}async handleNetworkRttMeasure(e){let t=U(e.url,`url`);if(!t)throw Error(`url is required`);let n=vr(e.probeType,`tcp`),r=K(e.iterations===void 0?5:M(e.iterations,{defaultValue:5,min:1,integer:!0}),1,50),i=K(e.timeoutMs===void 0?5e3:M(e.timeoutMs,{defaultValue:5e3,min:100,integer:!0}),100,3e4),{url:a,target:o}=await bn(t,G(e.authorization),`RTT measurement`),s=o.hostname,c=Number(a.port)||(a.protocol===`https:`?443:80),l=o.resolvedAddress??s,u=a.protocol===`https:`,d=[],f=[];for(let e=0;e<r;e+=1)try{let e=await this.measureSingleRtt(s,l,c,n,i,u);d.push(e)}catch(e){f.push(e instanceof Error?e.message:String(e))}let p=yn(d);return A(this.eventBus,`network:rtt_measured`,{url:t,probeType:n,iterations:r,successCount:d.length,errorCount:f.length,stats:p,timestamp:new Date().toISOString()}),v.ok().merge({target:{hostname:s,port:c,resolvedIp:l,probeType:n},stats:p,samples:d,errors:f.length>0?f:void 0,timestamp:new Date().toISOString()}).json()}async handleNetworkTraceroute(e){try{if(!hr())return v.text(`ICMP traceroute not available on this platform (Windows: native API, Linux/macOS: requires root/CAP_NET_RAW)`,!0);let t=U(e.target,`target`);if(!t)return v.text(`target is required`,!0);let n=G(e.authorization),r;try{r=await Dn(t,n,`Traceroute`)}catch(e){let t=e instanceof Error?e.message:String(e);return v.fail(t).json()}let i=K(e.maxHops===void 0?30:M(e.maxHops,{defaultValue:30,min:1,integer:!0}),1,64),a=K(e.timeout===void 0?5e3:M(e.timeout,{defaultValue:5e3,min:100,integer:!0}),100,3e4),o=K(e.packetSize===void 0?32:M(e.packetSize,{defaultValue:32,min:8,integer:!0}),8,65500),s=await _r({target:r,maxHops:i,timeout:a,packetSize:o});return v.ok().merge({resolvedFrom:t}).json(s)}catch(e){let t=e instanceof Error?e.message:String(e);return v.fail(`Traceroute failed: ${t}`).json()}}async handleNetworkLatencyStats(e){let t=U(e.url,`url`);if(!t)return v.text(`url is required`,!0);let n;try{n=vr(e.probeType,`http`)}catch(t){return v.text(t instanceof Error?`Invalid probeType: "${String(e.probeType)}". Expected one of: tcp, tls, http`:`Invalid probeType`,!0)}let r=K(e.iterations===void 0?20:M(e.iterations,{defaultValue:20,min:5,integer:!0}),5,100),i=K(e.concurrency===void 0?5:M(e.concurrency,{defaultValue:5,min:1,integer:!0}),1,20),a=K(e.timeoutMs===void 0?5e3:M(e.timeoutMs,{defaultValue:5e3,min:100,integer:!0}),100,3e4),{url:o,target:s}=await bn(t,G(e.authorization),`Latency stats`),c=s.hostname,l=Number(o.port)||(o.protocol===`https:`?443:80),u=s.resolvedAddress??c,d=o.protocol===`https:`,f=[],p=[];for(let e=0;e<r;e+=i){let t=Array.from({length:Math.min(i,r-e)},(t,n)=>n+e),o=await Promise.allSettled(t.map(()=>this.measureSingleRtt(c,u,l,n,a,d)));for(let e of o)e.status===`fulfilled`?f.push(e.value):p.push(e.reason instanceof Error?e.reason.message:String(e.reason))}let m=yn(f);return v.ok().json({url:t,target:{hostname:c,port:l,resolvedIp:u,probeType:n},iterations:r,concurrency:i,stats:m,errors:p.length>0?p:void 0})}async handleNetworkIcmpProbe(e){try{if(!hr())return v.text(`ICMP probe not available on this platform (Windows: native API, Linux/macOS: requires root/CAP_NET_RAW)`,!0);let t=U(e.target,`target`);if(!t)return v.text(`target is required`,!0);let n=G(e.authorization),r;try{r=await Dn(t,n,`ICMP probe`)}catch(e){let t=e instanceof Error?e.message:String(e);return v.fail(t).json()}let i=K(e.ttl===void 0?128:M(e.ttl,{defaultValue:128,min:1,integer:!0}),1,255),a=K(e.timeout===void 0?5e3:M(e.timeout,{defaultValue:5e3,min:100,integer:!0}),100,3e4),o=K(e.packetSize===void 0?32:M(e.packetSize,{defaultValue:32,min:8,integer:!0}),8,65500),s=await gr({target:r,ttl:i,packetSize:o,timeout:a});return v.ok().merge({resolvedFrom:t}).json(s)}catch(e){let t=e instanceof Error?e.message:String(e);return v.fail(`ICMP probe failed: ${t}`).json()}}measureSingleRtt(e,t,n,r,i,a){switch(r){case`tcp`:return this.probeTcp(t,n,i);case`tls`:return this.probeTls(e,t,n,i);case`http`:return this.probeHttp(e,t,n,i,a)}}createPinnedLookup(e){let t=k.isIP(e)===6?6:4;return(n,r,i)=>{let a=typeof r==`function`?r:i;if(a){if(yr(r)){a(null,[{address:e,family:t}]);return}a(null,e,t)}}}probeTcp(e,t,n){return new Promise((r,i)=>{let a=performance.now(),o=setTimeout(()=>i(Error(`TCP probe timed out after ${n}ms`)),n),s=k.createConnection({host:e,port:t},()=>{clearTimeout(o),s.destroy(),r(vn(performance.now()-a))});s.on(`error`,e=>{clearTimeout(o),s.destroy(),i(e)})})}probeTls(e,t,n,r){return new Promise((i,a)=>{let o=performance.now(),s=!1,c=null,l=e=>{s||(s=!0,clearTimeout(u),c?.destroy(),e())},u=setTimeout(()=>{l(()=>a(Error(`TLS probe timed out after ${r}ms`)))},r);c=se.connect({host:e,port:n,lookup:this.createPinnedLookup(t),...k.isIP(e)===0?{servername:e}:{}},()=>{l(()=>i(vn(performance.now()-o)))}),c.on(`error`,e=>{l(()=>a(e))})})}probeHttp(e,t,n,r,i){return new Promise((a,o)=>{let s=performance.now(),c=!1,l=null,u=e=>{c||(c=!0,clearTimeout(d),l?.destroy(),e())},d=setTimeout(()=>{u(()=>o(Error(`HTTP probe timed out after ${r}ms`)))},r);l=(i?le.request:re.request)({host:e,port:n,path:`/`,method:`HEAD`,lookup:this.createPinnedLookup(t),...i&&k.isIP(e)===0?{servername:e}:{}},e=>{e.resume(),u(()=>a(vn(performance.now()-s)))}),l.on(`error`,e=>{u(()=>o(e))}),l.end()})}},xr=class extends br{dnsHttp;http2;grpc;constructor(e){super(e),this.dnsHttp=new Nn(e),this.http2=new Rn(e),this.grpc=new zn(e)}handleDnsResolve(e){return this.dnsHttp.handleDnsResolve(e)}handleDnsReverse(e){return this.dnsHttp.handleDnsReverse(e)}handleDnsProbe(e){return this.dnsHttp.handleDnsProbe(e)}handleDnsCnameChain(e){return this.dnsHttp.handleDnsCnameChain(e)}handleDnsBulkResolve(e){return this.dnsHttp.handleDnsBulkResolve(e)}handleHttpRequestBuild(e){return this.dnsHttp.handleHttpRequestBuild(e)}handleHttpPlainRequest(e){return this.dnsHttp.handleHttpPlainRequest(e)}handleHttp2Probe(e){return this.http2.handleHttp2Probe(e)}handleHttp2FrameBuild(e){return this.http2.handleHttp2FrameBuild(e)}handleHttp2FrameParse(e){return this.http2.handleHttp2FrameParse(e)}handleNetworkHttp2Fingerprint(e){return this.http2.handleNetworkHttp2Fingerprint(e)}handleGrpcFrameParse(e){return this.grpc.handleGrpcFrameParse(e)}handleGrpcFrameBuild(e){return this.grpc.handleGrpcFrameBuild(e)}};function Sr(e){return ie(`sha256`).update(e).digest(`hex`).substring(0,12)}function X(e){return e.replace(`0x`,``).toLowerCase().padStart(4,`0`)}const Cr=new Set([`0a0a`,`1a1a`,`2a2a`,`3a3a`,`4a4a`,`5a5a`,`6a6a`,`7a7a`,`8a8a`,`9a9a`,`aaaa`,`baba`,`caca`,`dada`,`eaea`,`fafa`]);function Z(e){return Cr.has(e.replace(`0x`,``).toLowerCase().padStart(4,`0`))}const wr={"0304":`13`,"0303":`12`,"0302":`11`,"0301":`10`,"0300":`s3`,"0002":`s2`,feff:`d1`,fefd:`d2`,fefc:`d3`};function Tr(e){return wr[e.toLowerCase()]??`00`}function Er(e){if(!e||e.length===0)return`00`;let t=e[0],n=e[e.length-1],r=/[0-9a-zA-Z]/.test(t),i=/[0-9a-zA-Z]/.test(n);if(r&&i)return`${t}${n}`;let a=Buffer.from(e,`utf8`).toString(`hex`);return`${a[0]??`0`}${a[a.length-1]??`0`}`}function Dr(e){let{protocol:t,tlsVersion:n,hasSni:r,ciphers:i,extensions:a,signatureAlgorithms:o,alpn:s}=e,c=t===`quic`?`q`:t===`dtls`?`d`:`t`,l=[n].map(X).filter(e=>!Z(e)&&e!==`0303`),u=(n.length>0?l:[`0303`]).toSorted(),d=Tr(u.length>0?u[u.length-1]:`0303`),f=r?`d`:`i`,p=i.map(X).filter(e=>!Z(e)),m=a.map(X).filter(e=>!Z(e)),h=`${c}${d}${f}${String(Math.min(p.length,99)).padStart(2,`0`)}${String(Math.min(m.length,99)).padStart(2,`0`)}${Er(s)}`,g=p.toSorted().join(`,`),_=p.length>0?Sr(g):`000000000000`,v=m.filter(e=>e!==`0000`&&e!==`0010`).toSorted(),y=o.map(X),b;return b=y.length>0?`${v.join(`,`)}_${y.join(`,`)}`:v.join(`,`),{tls:`${h}_${_}_${v.length>0||y.length>0?Sr(b):`000000000000`}`,tls_raw:`${h}_${p.join(`,`)}_${m.join(`,`)}_${y.join(`,`)}`}}function Or(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();if(t===`1.0`||t===`http/1.0`)return`1.0`;if(t===`1.1`||t===`http/1.1`)return`1.1`;if(t===`2`||t===`2.0`||t===`http/2`||t===`h2`)return`h2`;if(t===`3`||t===`3.0`||t===`http/3`||t===`h3`)return`h3`}function kr(e,t,n,r,i){let a=e.toUpperCase(),o={GET:`ge`,POST:`po`,PUT:`pu`,DELETE:`de`,HEAD:`he`,PATCH:`pa`,OPTIONS:`ot`}[a]??a.toLowerCase().substring(0,2).padEnd(2,a.charAt(0).toLowerCase()),s=typeof n==`string`?n.trim().toLowerCase():``,c=s===`2`||s===`2.0`||s===`h2`||s===`http/2`?`20`:s===`3`||s===`3.0`||s===`h3`||s===`http/3`?`30`:s===`1.0`||s===`http/1.0`?`10`:s===`1.1`||s===`http/1.1`?`11`:`00`,l=t.map(e=>e.toLowerCase()),u=l.includes(`cookie`)?`c`:`n`,d=l.includes(`referer`)?`r`:`n`,f=l.filter(e=>e!==`cookie`&&e!==`referer`),p=String(Math.min(f.length,99)).padStart(2,`0`),m=`0000`;i&&i.length>0&&(m=(i.split(`,`)[0]??``).replace(/[-;]/g,``).toLowerCase().trim().padEnd(4,`0`).substring(0,4));let h=`${o}${c}${u}${d}${p}${m}`,g=f.filter(e=>!e.startsWith(`:`)).toSorted(),_=g.length>0?Sr(g.join(`,`)):`000000000000`,v=`000000000000`,y=`000000000000`;if(u===`c`&&r){let e=r.split(`;`).map(e=>e.trim()).filter(Boolean),t=e.map(e=>e.split(`=`)[0]?.trim()??``).filter(Boolean).toSorted();v=t.length>0?Sr(t.join(`,`)):`000000000000`;let n=e.map(e=>{let t=e.indexOf(`=`);return{name:t>=0?e.substring(0,t).trim():e.trim(),pair:e}}).toSorted((e,t)=>e.name.localeCompare(t.name)).map(e=>e.pair);y=n.length>0?Sr(n.join(`,`)):`000000000000`}return{http:`${h}_${_}_${v}_${y}`}}function Ar(e,t,n,r,i){let a=[],o=0;!e||e.length===0?(a.push(`missing-user-agent`),o+=.3):(/bot|crawler|spider|headless|selenium|puppeteer|playwright|phantom|curl|wget|python|java|go-http|httpclient|okhttp|requests\/|aiohttp|axios|node-fetch|undici/i.test(e)&&(a.push(`bot-ua: ${e.substring(0,40)}`),o+=.5),/headless/i.test(e)&&(a.push(`headless-browser`),o+=.4),e.length<30&&!/bot|curl|wget|python/i.test(e)&&(a.push(`suspiciously-short-ua`),o+=.2));let s=t.map(e=>e.toLowerCase());s.includes(`accept`)||(a.push(`missing-accept-header`),o+=.15),s.includes(`accept-language`)||(a.push(`missing-accept-language`),o+=.1),s.includes(`accept-encoding`)||(a.push(`missing-accept-encoding`),o+=.1);let c=t.length;c<4&&(a.push(`suspicious-few-headers: ${c}`),o+=.2),n&&(n.cipherCount<=2&&(a.push(`anomalous-cipher-count: ${n.cipherCount} (real browsers typically 5-15)`),o+=.3),n.extensionCount<5&&(a.push(`few-tls-extensions: ${n.extensionCount} (real browsers 10-25+)`),o+=.2),/\bTLS\s*1\.[01]\b|\b1\.0\b|\b1\.1\b|\bSSL/i.test(n.tlsVersion)&&(a.push(`outdated-tls-version: ${n.tlsVersion}`),o+=.25));let l=[`host`,`connection`,`cache-control`,`sec-ch-ua`,`sec-ch-ua-mobile`,`sec-ch-ua-platform`,`upgrade-insecure-requests`,`user-agent`,`accept`,`sec-fetch-site`,`sec-fetch-mode`,`sec-fetch-user`,`sec-fetch-dest`,`referer`,`accept-encoding`,`accept-language`];return s.length>=5&&s.slice(0,5).filter((e,t)=>e===l[t]).length===0&&(a.push(`header-order-does-not-match-known-browser`),o+=.1),r&&(r.ja3&&(a.push(`tls-ja3: ${r.ja3}`),r.knownBadJa3?.includes(r.ja3)&&(a.push(`known-bot-ja3: ${r.ja3.slice(0,8)}`),o+=.45)),r.ja4&&(a.push(`tls-ja4: ${r.ja4}`),r.knownBadJa4?.includes(r.ja4)&&(a.push(`known-bot-ja4: ${r.ja4.slice(0,8)}`),o+=.45))),i&&i.hash&&(a.push(`http2-fingerprint: ${i.hash}`),i.knownBadH2?.includes(i.hash)&&(a.push(`known-bot-h2: ${i.hash.slice(0,8)}`),o+=.45)),{score:Math.min(o,1),signals:a}}function jr(e){return e.replace(/\s+/g,``).toLowerCase()}function Q(e,t,n){if(!(t+n*2>e.length))return e.slice(t*2,(t+n)*2)}function $(e,t){let n=Q(e,t,1);if(n!==void 0)return parseInt(n,16)}function Mr(e,t){let n=Q(e,t,2);if(n!==void 0)return parseInt(n,16)}function Nr(e,t){let n=Q(e,t,3);if(n!==void 0)return parseInt(n,16)}function Pr(e,t){let n=Mr(e,t);if(n===void 0)return;let r=t+2,i=r+n;if(i*2>e.length)return;let a=[];for(let t=r;t+2<=i;t+=2)a.push(e.slice(t*2,(t+2)*2));return{values:a,nextOffset:i}}function Fr(e){let t=jr(e);if(t.length===0)return{valid:!1,error:`empty input`};let n=$(t,0);if(n!==22)return{valid:!1,error:`not a TLS handshake record (type=0x${n?.toString(16)??`?`}, expected 0x16)`};let r=Q(t,1,2),i=Mr(t,3);if(r===void 0||i===void 0)return{valid:!1,error:`truncated record header`};if(10+i*2>t.length)return{valid:!1,error:`record length exceeds available bytes`};let a=$(t,5);if(a!==1)return{valid:!1,error:`not a ClientHello handshake (type=0x${a?.toString(16)??`?`}, expected 0x01)`};let o=Nr(t,6);if(o===void 0)return{valid:!1,error:`truncated handshake header`};if((9+o)*2>t.length)return{valid:!1,error:`handshake length exceeds available bytes`};let s=9,c=Q(t,s,2);if(c===void 0)return{valid:!1,error:`truncated legacy_version`};if(s+=2,s+32>t.length/2)return{valid:!1,error:`truncated random`};s+=32;let l=$(t,s);if(l===void 0)return{valid:!1,error:`truncated session_id length`};if(s+=1,s+l>t.length/2)return{valid:!1,error:`truncated session_id`};s+=l;let u=Pr(t,s);if(u===void 0)return{valid:!1,error:`truncated cipher_suites`};let d=u.values;s=u.nextOffset;let f=$(t,s);if(f===void 0)return{valid:!1,error:`truncated compression_methods length`};if(s+=1,s+f>t.length/2)return{valid:!1,error:`truncated compression_methods`};s+=f;let p=[];if(s+2<=t.length/2){let e=Mr(t,s);if(e===void 0)return{valid:!1,error:`truncated extensions length`};s+=2;let n=s+e;if(n>t.length/2)return{valid:!1,error:`extensions length exceeds available bytes`};for(;s+4<=n;){let e=Q(t,s,2),r=Mr(t,s+2);if(e===void 0||r===void 0)return{valid:!1,error:`truncated extension header`};if(s+=4,s+r>n)return{valid:!1,error:`extension value exceeds extensions block`};let i=Q(t,s,r)??``;p.push({type:e,data:i}),s+=r}}return Ir({recordVersion:r,legacyVersion:c,ciphers:d,extensions:p})}function Ir(e){let t=t=>e.extensions.find(e=>e.type===t),n=e.extensions.some(e=>e.type===`0000`),r=[],i=t(`0010`);if(i){let e=i.data,t=0,n=Mr(e,t);if(n!==void 0){t+=2;let i=t+n;for(;t+1<=i;){let n=$(e,t);if(n===void 0)break;t+=1;let i=e.slice(t*2,(t+n)*2);if(i.length!==n*2)break;r.push(Buffer.from(i,`hex`).toString(`ascii`)),t+=n}}}let a=[],o=t(`002b`);if(o){let e=o.data,t=0,n=$(e,t);if(n!==void 0){t+=1;let r=t+n;for(;t+2<=r;)a.push(e.slice(t*2,(t+2)*2)),t+=2}}let s=a.filter(e=>!Z(e)&&e!==`0303`),c=s.length>0?s.toSorted().at(-1):e.legacyVersion,l=[],u=t(`000a`);if(u){let e=Pr(u.data,0);e&&(l=e.values)}let d=[],f=t(`000b`);if(f){let e=f.data,t=0,n=$(e,t);if(n!==void 0){t+=1;let r=t+n;for(;t<r;)d.push(e.slice(t*2,(t+1)*2)),t+=1}}let p=[],m=t(`000d`);if(m){let e=Pr(m.data,0);e&&(p=e.values)}return{valid:!0,recordVersion:e.recordVersion,legacyVersion:e.legacyVersion,ciphers:e.ciphers,extensions:e.extensions,hasSni:n,alpn:r,supportedVersions:a,negotiatedVersion:c,ellipticCurves:l,ecPointFormats:d,signatureAlgorithms:p}}function Lr(e){return(e??[]).filter(e=>!Z(e))}function Rr(e){if(!e.valid||!e.ciphers||!e.extensions)throw Error(`cannot compute JA3 from invalid ClientHello: ${e.error??`unknown`}`);let t=`${e.legacyVersion??`0303`},${Lr(e.ciphers).join(`-`)},${Lr(e.extensions.map(e=>e.type)).join(`-`)},${Lr(e.ecPointFormats).join(`-`)},${Lr(e.ellipticCurves).join(`-`)}`;return{ja3:ie(`md5`).update(t).digest(`hex`),ja3_raw:t}}function zr(e){if(!e.valid||!e.ciphers)throw Error(`cannot compute JA4 from invalid ClientHello: ${e.error??`unknown`}`);let t=e.ciphers,n=e.extensions?.map(e=>e.type)??[],r=e.signatureAlgorithms??[],i=e.alpn?.[0]??``,{tls:a,tls_raw:o}=Dr({protocol:`tls`,tlsVersion:e.negotiatedVersion??`0303`,hasSni:e.hasSni??!1,ciphers:t,extensions:n,signatureAlgorithms:r,alpn:i});return{ja4:a,ja4_raw:o}}const Br=new Set([`compute_tls`,`compute_http`,`analyze_request`,`parse_client_hello`]),Vr=new Set([`tls`,`quic`,`dtls`]);function Hr(e){return typeof e==`object`&&e?e:void 0}var Ur=class{consoleMonitor;constructor(e){this.consoleMonitor=e.consoleMonitor}async handleNetworkTlsFingerprint(e){let t=d(e,`mode`),n=m(e,`includeAnalysis`,!0);if(!t||!Br.has(t))return v.fail(`Invalid mode: "${String(e.mode)}". Expected one of: ${[...Br].join(`, `)}`).json();let r=t;try{if(r===`compute_tls`){let t=p(e,`tlsVersions`),r=p(e,`ciphers`),i=p(e,`extensions`),a=p(e,`signatureAlgorithms`),o=h(e,`protocol`,Vr,`tls`),s=m(e,`sni`,!0),c=d(e,`alpn`,``);if(r.length===0)return v.fail(`ciphers array is required for compute_tls mode`).json();let l=t.map(X).filter(e=>!Z(e)).toSorted(),u=l.length>0?l[l.length-1]:`0303`,{tls:f,tls_raw:g}=Dr({protocol:o,tlsVersion:u,hasSni:s,ciphers:r,extensions:i,signatureAlgorithms:a,alpn:c}),_={success:!0,mode:`tls`,tls:f,tls_raw:g};if(n){let e=r.map(X).filter(e=>!Z(e)),t=i.map(X).filter(e=>!Z(e));_.analysis={protocol:o.toUpperCase(),tlsVersion:u,sni:s,cipherCount:e.length,extensionCount:t.length,signatureAlgorithmCount:a.length,alpn:c||`(none)`,sortedCiphers:e.toSorted(),sortedExtensions:t.filter(e=>e!==`0000`&&e!==`0010`).toSorted()}}return v.ok().merge(_).json()}if(r===`compute_http`){let t=p(e,`httpHeaders`),r=d(e,`userAgent`,``),i=d(e,`httpMethod`,`GET`),a=d(e,`httpVersion`,`1.1`),o=d(e,`cookieHeader`,``),s=d(e,`acceptLanguage`,``);if(t.length===0)return v.fail(`httpHeaders array is required for compute_http mode`).json();let{http:c}=kr(i,t,a,o,s),l={success:!0,mode:`http`,http:c};if(n){let e=t.map(e=>e.toLowerCase());l.analysis={method:i,httpVersion:a,headerCount:t.length,nonCookieRefererHeaders:e.filter(e=>e!==`cookie`&&e!==`referer`).length,hasCookie:e.includes(`cookie`),hasAcceptLanguage:e.includes(`accept-language`),sortedHeaders:e.filter(e=>e!==`cookie`&&e!==`referer`&&!e.startsWith(`:`)).toSorted(),userAgentLength:r.length}}return v.ok().merge(l).json()}if(r===`parse_client_hello`){let t=Fr(g(e,`clientHelloHex`));if(!t.valid)return v.fail(`Failed to parse ClientHello: ${t.error??`unknown`}`).json();let{ja3:r,ja3_raw:i}=Rr(t),{ja4:a,ja4_raw:o}=zr(t),s={success:!0,mode:`parse_client_hello`,ja3:r,ja3_raw:i,ja4:a,ja4_raw:o,recordVersion:t.recordVersion,legacyVersion:t.legacyVersion,negotiatedVersion:t.negotiatedVersion,hasSni:t.hasSni,alpn:t.alpn};return n&&(s.analysis={ciphers:t.ciphers,ciphersCount:t.ciphers.length,extensions:t.extensions.map(e=>({type:e.type,length:e.data.length/2})),supportedVersions:t.supportedVersions,ellipticCurves:t.ellipticCurves,ecPointFormats:t.ecPointFormats,signatureAlgorithms:t.signatureAlgorithms,greaseCipherCount:t.ciphers.filter(e=>Z(e)).length,greaseExtensionCount:t.extensions.filter(e=>Z(e.type)).length}),v.ok().merge(s).json()}let t=g(e,`requestId`),i=this.consoleMonitor.getNetworkRequests().find(e=>e.requestId===t);if(!i)return v.fail(`Request ${t} not found`).json();let a=i.headers||{},o=Object.keys(a),s=a[`user-agent`]||a[`User-Agent`]||``,c=i.method||`GET`,l=a.cookie||a.Cookie||``,u=a[`accept-language`]||a[`Accept-Language`]||``,f=Or(i.httpVersion),{http:_}=kr(c,o,f,l,u),y=Hr(i.securityDetails),b=y&&typeof y==`object`?{cipherCount:typeof y.cipherCount==`number`?y.cipherCount:5,extensionCount:typeof y.extensionCount==`number`?y.extensionCount:10,tlsVersion:typeof y.protocol==`string`?y.protocol:``}:void 0,x={success:!0,mode:`analyze_request`,requestId:t,url:i.url,method:c,httpVersion:f??`unknown`,http:_},S={requestId:t,url:i.url,method:c,httpVersion:f??`unknown`,http:_,headerCount:o.length,headerOrder:o.join(`, `),userAgent:s.length>80?s.substring(0,80)+`...`:s,securityHeaders:{hasCSP:void 0,hasHSTS:void 0,hasCORS:void 0},botSignals:Ar(s,o,b)};return n&&(x.analysis=S),v.ok().merge(x).json()}catch(e){return v.fail(e instanceof Error?e.message:String(e)).json()}}async handleNetworkBotDetectAnalyze(e){let t=Math.max(1,Math.min(500,f(e,`limit`,a)??a)),n=m(e,`includeDetails`,!1),r=d(e,`ja3`,``),i=d(e,`ja4`,``),o=p(e,`knownBadJa3`),s=p(e,`knownBadJa4`),c=r||i||o.length||s.length?{ja3:r||void 0,ja4:i||void 0,knownBadJa3:o.length?o:void 0,knownBadJa4:s.length?s:void 0}:void 0,l=d(e,`h2Hash`,``),u=p(e,`knownBadH2`),h=l||u.length?{hash:l||void 0,knownBadH2:u.length?u:void 0}:void 0,g=this.consoleMonitor.getNetworkRequests(),_=g.slice(0,t);if(_.length===0)return v.ok().merge({analyzed:0,summary:`No captured requests to analyze. Enable network monitoring first.`}).json();let y=[],b=[],x=0,S=new Map,C=0,w=0,T=new Map,E=null;for(let e of _){let t=e.headers||{},r=Object.keys(t),i=t[`user-agent`]||t[`User-Agent`]||``,a=e.url||``,o=e.method||`GET`,s=t.cookie||t.Cookie||``,l=t[`accept-language`]||t[`Accept-Language`]||``,u=Or(e.httpVersion),d=Hr(e.securityDetails),f=Ar(i,r,d&&typeof d==`object`?{cipherCount:typeof d.cipherCount==`number`?d.cipherCount:5,extensionCount:typeof d.extensionCount==`number`?d.extensionCount:10,tlsVersion:typeof d.protocol==`string`?d.protocol:``}:void 0,c,h),p=/\/api\/|\/v\d+\/|\/graphql/i.test(a),{http:m}=kr(o,r,u,s,l);S.set(m,(S.get(m)??0)+1),T.has(m)?T.get(m)!==i&&C++:T.set(m,i),E===null?E=r.join(`,`):r.join(`,`)!==E&&w++;let g={requestId:e.requestId,url:a.length>100?a.substring(0,100)+`...`:a,method:o,http:m,botScore:f.score,signals:f.signals};x+=f.score,f.score>.5&&y.push(`Request ${e.requestId}: ${f.signals.join(`, `)}`),p&&(g.apiPattern=!0),n&&b.push(g)}let D=_.length>0?x/_.length:0,ee=S.size,O=ee/_.length,te=[];O>.8&&te.push(`High fingerprint diversity (${ee} unique HTTP fingerprints in ${_.length} requests) — may indicate multiple clients or rotation`),O===1&&_.length>5&&te.push(`Every request has a unique HTTP fingerprint — likely automated tool rotating headers`);let ne=[];C>0&&ne.push(`${C} request(s) with different UA for same HTTP fingerprint — UA drift detected`),w>0&&ne.push(`${w} request(s) with different header order — header rotation detected`);let re=_.length>1?Math.max(0,1-(C+w)/(_.length*2)):1;return v.ok().merge({analyzed:_.length,totalRequests:g.length,averageBotScore:Math.round(D*100)/100,suspiciousRequests:y.length,httpFingerprintSummary:{uniqueFingerprints:ee,diversity:Math.round(O*100)/100,topFingerprints:[...S.entries()].toSorted((e,t)=>t[1]-e[1]).slice(0,5).map(([e,t])=>({http_fingerprint:e,count:t}))},signals:y.slice(0,20),...te.length>0?{diversitySignals:te}:{},interRequestConsistency:{consistencyScore:Math.round(re*100)/100,uaDriftCount:C,headerOrderDriftCount:w,...ne.length>0?{signals:ne}:{}},details:n?b:void 0,recommendations:D>.5?[`High bot-like signal detected. Consider TLS fingerprint rotation.`,`Review User-Agent consistency across requests.`,`Check header ordering matches real browser behavior.`,`HTTP fingerprint diversity can distinguish botnets from real users.`]:O>.8?[`Traffic appears human but fingerprint diversity is high — investigate further.`]:[`Traffic appears to follow normal browser patterns.`]}).json()}},Wr=class{collector;consoleMonitor;eventBus;performanceMonitor=null;detailedDataManager=l.getInstance();core;perf;consoleHandlers;replay;intercept;raw;tlsBot;constructor(e,t,n,r){this.collector=e,this.consoleMonitor=t,this.eventBus=n,this.core=new Ke({collector:e,consoleMonitor:t,eventBus:n}),this.perf=new qe({collector:e,getPerformanceMonitor:()=>this.getPerformanceMonitor(),getTraceRecorder:r}),this.consoleHandlers=new Je({consoleMonitor:t}),this.replay=new Rt({consoleMonitor:t}),this.intercept=new Bt({consoleMonitor:t,eventBus:n}),this.raw=new xr(n),this.tlsBot=new Ur({consoleMonitor:t})}getPerformanceMonitor(){return this.performanceMonitor||=new u(this.collector),this.performanceMonitor}handleNetworkEnable=e=>this.core.handleNetworkEnable(e);handleNetworkDisable=e=>this.core.handleNetworkDisable(e);handleNetworkGetStatus=e=>this.core.handleNetworkGetStatus(e);handleNetworkMonitor=e=>this.core.handleNetworkMonitor(e);handleNetworkGetRequests=e=>this.core.handleNetworkGetRequests(e);handleNetworkGetResponseBody=e=>this.core.handleNetworkGetResponseBody(e);handleNetworkGetStats=e=>this.core.handleNetworkGetStats(e);handlePerformanceGetMetrics=e=>this.perf.handlePerformanceGetMetrics(e);handlePerformanceCoverage=e=>this.perf.handlePerformanceCoverage(e);handlePerformanceStartCoverage=e=>this.perf.handlePerformanceStartCoverage(e);handlePerformanceStopCoverage=e=>this.perf.handlePerformanceStopCoverage(e);handlePerformanceTakeHeapSnapshot=e=>this.perf.handlePerformanceTakeHeapSnapshot(e);handlePerformanceTraceStart=e=>this.perf.handlePerformanceTraceStart(e);handlePerformanceTraceStop=e=>this.perf.handlePerformanceTraceStop(e);handlePerformanceTraceDispatch=e=>String(e.action??``)===`stop`?this.perf.handlePerformanceTraceStop(e):this.perf.handlePerformanceTraceStart(e);handleProfilerCpuStart=e=>this.perf.handleProfilerCpuStart(e);handleProfilerCpuStop=e=>this.perf.handleProfilerCpuStop(e);handleProfilerCpuDispatch=e=>String(e.action??``)===`stop`?this.perf.handleProfilerCpuStop(e):this.perf.handleProfilerCpuStart(e);handleProfilerHeapSamplingStart=e=>this.perf.handleProfilerHeapSamplingStart(e);handleProfilerHeapSamplingStop=e=>this.perf.handleProfilerHeapSamplingStop(e);handleProfilerHeapSamplingDispatch=e=>String(e.action??``)===`stop`?this.perf.handleProfilerHeapSamplingStop(e):this.perf.handleProfilerHeapSamplingStart(e);handleConsoleGetExceptions=e=>this.consoleHandlers.handleConsoleGetExceptions(e);handleConsoleInjectDispatch=e=>{switch(String(e.type??``)){case`xhr`:return this.consoleHandlers.handleConsoleInjectXhrInterceptor(e);case`fetch`:return this.consoleHandlers.handleConsoleInjectFetchInterceptor(e);case`function`:return this.consoleHandlers.handleConsoleInjectFunctionTracer(e);default:return this.consoleHandlers.handleConsoleInjectScriptMonitor(e)}};handleConsoleBuffersDispatch=e=>String(e.action??``)===`reset`?this.consoleHandlers.handleConsoleResetInjectedInterceptors(e):this.consoleHandlers.handleConsoleClearInjectedBuffers(e);handleConsoleInjectScriptMonitor=e=>this.consoleHandlers.handleConsoleInjectScriptMonitor(e);handleConsoleInjectXhrInterceptor=e=>this.consoleHandlers.handleConsoleInjectXhrInterceptor(e);handleConsoleInjectFetchInterceptor=e=>this.consoleHandlers.handleConsoleInjectFetchInterceptor(e);handleConsoleClearInjectedBuffers=e=>this.consoleHandlers.handleConsoleClearInjectedBuffers(e);handleConsoleResetInjectedInterceptors=e=>this.consoleHandlers.handleConsoleResetInjectedInterceptors(e);handleConsoleInjectFunctionTracer=e=>this.consoleHandlers.handleConsoleInjectFunctionTracer(e);handleNetworkExtractAuth=e=>this.replay.handleNetworkExtractAuth(e);handleNetworkExportHar=e=>this.replay.handleNetworkExportHar(e);handleNetworkReplayRequest=e=>this.replay.handleNetworkReplayRequest(e);handleNetworkInterceptResponse=e=>this.intercept.handleNetworkInterceptResponse(e);handleNetworkInterceptList=e=>this.intercept.handleNetworkInterceptList(e);handleNetworkInterceptDisable=e=>this.intercept.handleNetworkInterceptDisable(e);handleNetworkInterceptDispatch=e=>{let t=String(e.action??``);switch(t){case`add`:return this.intercept.handleNetworkInterceptResponse(e);case`list`:return this.intercept.handleNetworkInterceptList(e);case`disable`:return this.intercept.handleNetworkInterceptDisable(e);default:return Promise.resolve({content:[{type:`text`,text:`Invalid action: "${t}". Expected one of: add, list, disable`}],isError:!0})}};handleNetworkTraceroute=e=>this.raw.handleNetworkTraceroute(e);handleNetworkIcmpProbe=e=>this.raw.handleNetworkIcmpProbe(e);handleDnsResolve=e=>this.raw.handleDnsResolve(e);handleDnsReverse=e=>this.raw.handleDnsReverse(e);handleDnsProbe=e=>this.raw.handleDnsProbe(e);handleDnsCnameChain=e=>this.raw.handleDnsCnameChain(e);handleDnsBulkResolve=e=>this.raw.handleDnsBulkResolve(e);handleHttpRequestBuild=e=>this.raw.handleHttpRequestBuild(e);handleHttpPlainRequest=e=>this.raw.handleHttpPlainRequest(e);handleHttp2Probe=e=>this.raw.handleHttp2Probe(e);handleHttp2FrameBuild=e=>this.raw.handleHttp2FrameBuild(e);handleHttp2FrameParse=e=>this.raw.handleHttp2FrameParse(e);handleNetworkHttp2Fingerprint=e=>this.raw.handleNetworkHttp2Fingerprint(e);handleGrpcFrameParse=e=>this.raw.handleGrpcFrameParse(e);handleGrpcFrameBuild=e=>this.raw.handleGrpcFrameBuild(e);handleNetworkRttMeasure=e=>this.raw.handleNetworkRttMeasure(e);handleNetworkLatencyStats=e=>this.raw.handleNetworkLatencyStats(e);handleNetworkTlsFingerprint=e=>this.tlsBot.handleNetworkTlsFingerprint(e);handleNetworkBotDetectAnalyze=e=>this.tlsBot.handleNetworkBotDetectAnalyze(e)};export{Wr as AdvancedToolHandlers};
@@ -0,0 +1 @@
1
+ import{t as e}from"./disasm-DoxSucGp.mjs";import{readFileSync as t}from"node:fs";const n={"glibc-2.31-x64":[{offset:`0xe6c81`,constraints:[`[rsp+0x70] == NULL`]},{offset:`0xe6c84`,constraints:[`[rsp+0x70] == NULL`]},{offset:`0xe6c87`,constraints:[`[rsp+0x70] == NULL`]},{offset:`0xe6e73`,constraints:[`[rsp+0x70] == NULL`]},{offset:`0xe6e76`,constraints:[`[rsp+0x70] == NULL`]}],"glibc-2.31-x86":[{offset:`0x144963`,constraints:[]},{offset:`0x144965`,constraints:[]},{offset:`0x144968`,constraints:[]},{offset:`0x14496b`,constraints:[]}],"glibc-2.35-x64":[{offset:`0x50a37`,constraints:[`[rsp+0x30] == NULL`]},{offset:`0xebc81`,constraints:[`[rsp+0x50] == NULL`,`rcx == NULL`]},{offset:`0xebc85`,constraints:[`[rsp+0x50] == NULL`,`rcx == NULL`]},{offset:`0xebc88`,constraints:[`[rsp+0x50] == NULL`,`rcx == NULL`]},{offset:`0xebce2`,constraints:[`[rsp+0x50] == NULL`]}],"glibc-2.39-x64":[{offset:`0x540e7`,constraints:[`[rsp+0x30] == NULL`]},{offset:`0xf1472`,constraints:[`[rsp+0x50] == NULL`,`rcx == NULL`]},{offset:`0xf1475`,constraints:[`[rsp+0x50] == NULL`,`rcx == NULL`]},{offset:`0xf1478`,constraints:[`[rsp+0x50] == NULL`,`rcx == NULL`]}],"glibc-2.27-x64":[{offset:`0x4f365`,constraints:[`[rsp+0x40] == NULL`]},{offset:`0x4f3c2`,constraints:[`[rsp+0x40] == NULL`]},{offset:`0x10a45c`,constraints:[`[rsp+0x70] == NULL`]}],"glibc-2.27-x86":[{offset:`0x3d0d3`,constraints:[]},{offset:`0x3d0d5`,constraints:[]},{offset:`0x3d0d8`,constraints:[]},{offset:`0x3d0db`,constraints:[]}],"glibc-2.23-x64":[{offset:`0x45226`,constraints:[`[rsp+0x30] == NULL`]},{offset:`0x4527a`,constraints:[`[rsp+0x30] == NULL`]},{offset:`0xf0364`,constraints:[`[rsp+0x50] == NULL`,`rcx == NULL`]},{offset:`0xf1207`,constraints:[`[rsp+0x50] == NULL`,`rcx == NULL`]}],"musl-1.2-x64":[{offset:`0x4c4d0`,constraints:[]}],"musl-1.2-x86":[{offset:`0x3f520`,constraints:[]}]};async function r(e,n,r=10){let a;try{a=t(e)}catch{return{entries:[]}}return n===`x64`?i(a,e,r):n===`arm64`?s(a,e,r):{entries:[],note:`Heuristic one-gadget scan for ${n} is not yet implemented. Use a known libcId from the database (call lookupOneGadgets with a known ID).`}}async function i(t,n,r){let i=[],s=`custom-${n.replace(/[/\\]/g,`_`)}`,c=new e,l=Buffer.from(`/bin/sh\0`,`ascii`),u=0;for(;i.length<r;){let e=t.indexOf(l,u);if(e===-1)break;u=e+1;let n=Math.max(0,e-256),d=e,f=t.subarray(n,d);if(f.length===0)continue;let p;try{p=await c.disassemble(Buffer.from(f),{arch:`x64`,offset:n})}catch{continue}for(let t=0;t<p.length&&i.length<r;t++){let n=p[t];if(!a(n,e))continue;let r=0;for(let e=t+1;e<p.length&&r<=64;e++){let t=p[e];if(o(t)){i.push({libcId:s,arch:`x64`,offset:`0x${n.address.toString(16)}`,constraints:[`[rsp+0x40] == NULL`],requiredRegs:{},source:`heuristic-x64`});break}r+=t.bytes.length}}}return{entries:i}}function a(e,t){if(e.mnemonic!==`lea`)return!1;let n=e.opStr.match(/^rdi,\s*\[rip\s*([+-])\s*(0x[0-9a-f]+)\]\s*$/i);if(!n||n[1]===void 0||n[2]===void 0)return!1;let r=parseInt(n[2],16),i=n[1]===`-`?-r:r;return e.address+e.bytes.length+i===t}function o(e){return!!(e.mnemonic===`syscall`||e.mnemonic===`call`&&/\b(execve|system|do_system)\b/i.test(e.opStr))}async function s(t,n,r){let i=[],a=`custom-${n.replace(/[/\\]/g,`_`)}`,o=new e,s=Buffer.from(`/bin/sh\0`,`ascii`),d=0;for(;i.length<r;){let e=t.indexOf(s,d);if(e===-1)break;d=e+1;let n=Math.max(0,e-256),f=e,p=t.subarray(n,f);if(p.length===0)continue;let m;try{m=await o.disassemble(Buffer.from(p),{arch:`arm64`,offset:n})}catch{continue}for(let t=0;t<m.length&&i.length<r;t++){let n=c(m[t]);if(!n)continue;let r=0;for(let o=t+1;o<m.length&&r<=64;o++){let t=m[o],s=l(t,n.reg);if(s){if(n.pageTarget+s.offset!==e)break;let t=0;for(let e=o+1;e<m.length&&t<=64;e++){let r=m[e];if(u(r)){i.push({libcId:a,arch:`arm64`,offset:`0x${n.address.toString(16)}`,constraints:[`[sp+0x70] == NULL`],requiredRegs:{},source:`heuristic-arm64`});break}t+=r.bytes.length}break}r+=t.bytes.length}}}return{entries:i}}function c(e){if(e.mnemonic!==`adrp`)return null;let t=e.opStr.match(/^([a-z][a-z0-9]+),\s*#(0x[0-9a-f]+|\d+)\s*$/i);if(!t||t[1]===void 0||t[2]===void 0)return null;let n=t[2].toLowerCase().startsWith(`0x`)?parseInt(t[2],16):parseInt(t[2],10);return{address:e.address,reg:t[1].toLowerCase(),pageTarget:n}}function l(e,t){if(e.mnemonic!==`add`)return null;let n=e.opStr.match(/^([a-z][a-z0-9]+),\s*([a-z][a-z0-9]+),\s*#(0x[0-9a-f]+|\d+)\s*$/i);if(!n||n[1]===void 0||n[2]===void 0||n[3]===void 0)return null;let r=n[1].toLowerCase(),i=n[2].toLowerCase();return r!==t||i!==t?null:{offset:n[3].toLowerCase().startsWith(`0x`)?parseInt(n[3],16):parseInt(n[3],10)}}function u(e){return!!(e.mnemonic===`svc`||e.mnemonic===`bl`&&/\b(execve|system|do_system)\b/i.test(e.opStr))}function d(e){let t=n[e];if(!t||t.length===0)return{success:!1,gadgets:[],count:0,error:`No one-gadgets in database for "${e}". Known IDs: ${Object.keys(n).join(`, `)}`};let r=t.map(t=>({libcId:e,arch:e.includes(`x64`)?`x64`:e.includes(`x86`)?`x86`:e.includes(`arm64`)?`arm64`:`arm`,offset:t.offset,constraints:t.constraints,requiredRegs:m(t.constraints,e.includes(`x64`)?`x64`:`x86`),source:`database`}));return{success:!0,libcId:e,gadgets:r,count:r.length}}async function f(e,t){if(t){let e=d(t);if(e.success)return e}let n=await r(e,t?.includes(`x86`)?`x86`:t?.includes(`arm64`)?`arm64`:t?.includes(`arm`)?`arm`:`x64`);return n.entries.length>0?{success:!0,gadgets:n.entries,count:n.entries.length,note:`Heuristic scan results — verify constraints before use`}:{success:!1,gadgets:[],count:0,note:n.note??`No one-gadgets found (database miss + heuristic scan yielded nothing)`}}function p(){return Object.keys(n).toSorted()}function m(e,t){let n={};for(let t of e){let e=t.match(/^([a-z][a-z0-9]+)\s*==\s*(NULL|0)$/i);e&&e[1]&&(n[e[1].toLowerCase()]=null)}return n}export{f as discoverOneGadgets,p as listKnownLibcIds};
@@ -0,0 +1 @@
1
+ import{n as e,r as t,t as n}from"./config-5ODJ3Aj0.mjs";import{tmpdir as r}from"node:os";import{basename as i,dirname as a,extname as o,isAbsolute as s,normalize as c,relative as l,resolve as u,sep as d}from"node:path";import{mkdir as f}from"node:fs/promises";const p=t;function m(t=process.env){let n=t.MCP_PROJECT_ROOT?.trim();return n?c(h(n)?n:u(p,n)):e()?process.cwd():p}function h(e){return s(e)||/^[A-Za-z]:[\\/]/.test(e)||e.startsWith(`\\\\`)}function g(e,t){let n=l(e,t);return!(!n||n===`..`||n.startsWith(`..${d}`)||s(n))}function _(e,t=y()){let n=h(e)?c(e):u(t,e);return g(t,n)?n:u(t,`screenshots`,`external`,c(e).split(/[\\/]/).pop()||`output.bin`)}function v(e,t){return o(e)?e:`${e}.${t.replace(/^\./,``)}`}function y(){return m()}function b(e){let t=y(),n=e.trim();if(!n)throw Error(`path must be a non-empty relative path within the project root`);if(h(n))throw Error(`path must be relative to the project root`);let r=c(u(t,n));if(!g(t,r))throw Error(`path must stay within the project root`);return r}function x(e,t=`screenshots`){let n=y(),r=e?.trim();if(!r)return u(n,t);let i=_(r,n);return g(n,i)?i:u(n,t)}function S(){return n().paths.debuggerSessionsDir}function C(){return n().paths.extensionRegistryDir}function w(){return u(n().cache.dir,`code`)}function T(){return n().paths.tlsKeyLogDir}function E(){let e=new Set,t=[process.env.TEMP,process.env.TMP,r()];for(let n of t){let t=n?.trim();t&&e.add(c(u(t)))}return[...e]}async function D(e){let t=y(),r=e.type===`jpeg`?`jpg`:`png`,o=e.fallbackDir||`screenshots/manual`,s=e.fallbackName||`page`,c=x(n().paths.screenshotDir,o),d=e.requestedPath?.trim(),p,m=!1;if(!d)p=u(c,`${s}-${Date.now()}.${r}`),m=!0;else{let e=v(d,r);h(e)?(p=u(c,i(e)),m=!0):(p=u(t,e),g(t,p)||(p=u(c,i(p)),m=!0))}await f(a(p),{recursive:!0});let _=g(t,p)?l(t,p).replace(/\\/g,`/`):p.replace(/\\/g,`/`);return{absolutePath:p,displayPath:_,pathRewritten:m}}export{E as a,b as c,y as i,D as l,S as n,T as o,C as r,x as s,w as t};
@@ -0,0 +1 @@
1
+ function e(e,t,n){let r=e[t];return typeof r==`string`?r:n}function t(e,t,n){let r=e[t];return typeof r==`number`?r:n}function n(e,t,n){let r=e[t];return typeof r==`boolean`?r:n}function r(e,t,n,r){let i=e[t];if(i==null||typeof i!=`string`)return r;if(!n.has(i))throw Error(`Invalid ${t}: "${i}". Expected one of: ${[...n].join(`, `)}`);return i}function i(e,t){let n=e[t];if(typeof n!=`string`)throw Error(`Missing required string argument: "${t}"`);return n}function a(e,t){let n=e[t];if(typeof n!=`number`)throw Error(`Missing required number argument: "${t}"`);return n}function o(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`):[]}function s(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>typeof e==`number`&&Number.isFinite(e)):[]}function c(e,t){let n=e[t];if(typeof n==`object`&&n&&!Array.isArray(n))return n}function l(e,t){let n=e[t];return Array.isArray(n)?n:void 0}export{s as a,e as c,t as i,o as l,n,a as o,r,c as s,l as t,i as u};
@@ -0,0 +1,94 @@
1
+ import{t as e}from"./logger-BGCcd-jJ.mjs";import{pt as t}from"./constants-nvsLpSri.mjs";import{i as n}from"./artifacts-Bx9GLx4J.mjs";import{i as r,n as i}from"./response-R8ghbZSb.mjs";import{i as a}from"./modules-CC_ADmwi.mjs";import{r as o}from"./ResponseBuilder-BLicSCjn.mjs";import{n as s}from"./capabilities-DwzyxL2w.mjs";import{t as c}from"./ToolRegistry-CzqQxFqf.mjs";import"./definitions-BvolWeSu.mjs";import{homedir as l}from"node:os";import{basename as u,dirname as d,extname as f,join as p,normalize as m,relative as h,resolve as g,sep as _}from"node:path";import{copyFile as v,mkdir as y,readFile as b,readdir as x,stat as S,writeFile as C}from"node:fs/promises";import{promisify as w}from"node:util";import{X509Certificate as T,createHash as E}from"node:crypto";import{execFile as D,spawn as ee}from"node:child_process";function O(e,t,n={}){return i({...r(t),tool:e,...n})}function k(e){return`attached`}function A(e,t,n=!1){let r=e[t];if(typeof r==`string`){let e=r.trim();if(e.length>0)return e}if(n)throw Error(`${t} must be a non-empty string`)}function te(e,t,n){let r=e[t];if(typeof r==`boolean`)return r;if(typeof r==`number`){if(r===1)return!0;if(r===0)return!1}if(typeof r==`string`){let e=r.trim().toLowerCase();if([`true`,`1`,`yes`,`on`].includes(e))return!0;if([`false`,`0`,`no`,`off`].includes(e))return!1}return n}function j(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function M(e){if(!Array.isArray(e))return[];let t=[];for(let n of e)if(typeof n==`string`){let e=n.trim();e.length>0&&t.push(e)}return t}function N(e){let t=h(process.cwd(),e).replace(/\\/g,`/`);return t.length===0?`.`:t.startsWith(`..`)?e.replace(/\\/g,`/`):t}async function P(e){try{return await S(e),!0}catch{return!1}}function ne(){let e=process.env.USERPROFILE??l(),t=process.env.APPDATA??p(e,`AppData`,`Roaming`),n=[p(e,`Documents`),p(t)],r=[`Applet`,`XPlugin`,`MiniApp`],i=[];for(let e of n)for(let t of r)i.push(g(e,t));return Array.from(new Set(i))}async function F(t,n){let r=[g(t)];for(;r.length>0;){let t=r.pop();if(!t)continue;let i;try{i=await x(t,{withFileTypes:!0})}catch(n){e.debug(`walkDirectory skip unreadable directory`,{currentDir:t,error:n instanceof Error?n.message:String(n)});continue}for(let a of i){let i=p(t,String(a.name));if(a.isDirectory()){r.push(i);continue}if(a.isFile())try{await n(i,await S(i))}catch(t){e.warn(`walkDirectory skip unreadable file`,{absolutePath:i,error:t instanceof Error?t.message:String(t)})}}}}async function I(e,t,r){if(r){let e=g(r);return await y(e,{recursive:!0}),{absolutePath:e,displayPath:N(e)}}let{absolutePath:i,displayPath:a}=await n({category:`tmp`,toolName:e,target:t,ext:`tmpdir`}),o=i.replace(/\.tmpdir$/i,``);return await y(o,{recursive:!0}),{absolutePath:o,displayPath:a.replace(/\.tmpdir$/i,``)}}function L(e){return m(e.replace(/\\/g,`/`)).replace(/\\/g,`/`).split(`/`).filter(e=>e.length>0&&e!==`.`&&e!==`..`).join(`/`)}function R(e,t){let n=L(t),r=u(t)||`unnamed.bin`,i=g(e,n.length>0?n:r),a=g(e);if(i!==a&&!i.startsWith(`${a}${_}`))throw Error(`Path traversal blocked: ${t}`);return i}async function z(e){try{let t=await b(e,`utf-8`),n=JSON.parse(t);return j(n)?n:null}catch{return null}}function B(e){let t=e.replace(/\\/g,`/`);for(let e of[/\/([a-zA-Z]{2,4}[a-zA-Z0-9]{6,})\//,/\/Applet\/([^/]+)\//i]){let n=t.match(e);if(n?.[1])return n[1]}let n=u(e,f(e)).match(/([a-zA-Z]{2,4}[a-zA-Z0-9]{6,})/);return n?.[1]?n[1]:null}function re(e){if(e.length<18)throw Error(`Invalid miniapp package: file too small`);let t=e.readUInt8(0);if(t!==190)throw Error(`Invalid miniapp package magic: expected 0xBE, got 0x${t.toString(16)}`);let n=e.readUInt32BE(1),r=e.readUInt32BE(5),i=e.readUInt32BE(9),a=e.readUInt8(13),o=14+r;if(o>e.length)throw Error(`Invalid miniapp package: index section out of range`);let s=14;if(s+4>o)throw Error(`Invalid miniapp package: missing file count in index`);let c=e.readUInt32BE(s);s+=4;let l=[];for(let t=0;t<c;t+=1){if(s+4>o)throw Error(`Invalid miniapp package index at entry ${t}: missing nameLen`);let n=e.readUInt32BE(s);if(s+=4,n<=0||s+n>o)throw Error(`Invalid miniapp package index at entry ${t}: invalid nameLen`);let r=e.subarray(s,s+n).toString(`utf-8`);if(s+=n,s+8>o)throw Error(`Invalid miniapp package index at entry ${t}: missing offset/size`);let i=e.readUInt32BE(s);s+=4;let a=e.readUInt32BE(s);s+=4,l.push({name:r,offset:i,size:a})}return{magic:t,info:n,indexInfoLength:r,dataLength:i,lastIdent:a,dataOffset:o,entries:l}}async function ie(e,t,n){let r=(await e.probeAll())[`miniapp.unpacker`];if(!r?.available)return{used:!1,stderr:r?.reason??`外部解包工具 is unavailable`};let i=[[`unpack`,t,`-o`,n],[`unpack`,`-o`,n,t],[`-o`,n,t],[t,n]],a=`外部解包工具 failed for all argument patterns`;for(let r of i){let i=await e.run({tool:`miniapp.unpacker`,args:r,timeoutMs:18e4,cwd:d(t),expectedOutputPaths:[n],allowDirectoryOutputs:!0,outputLabel:`miniapp unpack output`});if(i.ok)return{used:!0,command:`unveilr ${r.join(` `)}`};a=i.stderr?.trim()||`exitCode=${String(i.exitCode)}`}return{used:!1,stderr:a}}var ae=class{runner;collector;constructor(e,t){this.runner=e,this.collector=t}async handleMiniappPkgScan(e){try{let t=A(e,`searchPath`),n=t?[g(t)]:ne(),r=[],a=[];for(let e of n)try{(await S(e)).isDirectory()?r.push(e):a.push(e)}catch{a.push(e)}let o=[];for(let e of r)await F(e,async(e,t)=>{if(f(e).toLowerCase()===`.pkg`){try{let t=await import(`node:fs/promises`).then(t=>t.open(e,`r`));try{let e=Buffer.alloc(1);if(await t.read(e,0,1,0),e[0]!==190)return}finally{await t.close()}}catch{return}o.push({path:e.replace(/\\/g,`/`),size:Number(t.size),appId:B(e),lastModified:t.mtime.toISOString()})}});return o.sort((e,t)=>new Date(t.lastModified).getTime()-new Date(e.lastModified).getTime()),i({success:!0,searchedRoots:r.map(e=>e.replace(/\\/g,`/`)),skippedRoots:a.map(e=>e.replace(/\\/g,`/`)),count:o.length,files:o,collectorState:k(this.collector)})}catch(e){return O(`miniapp_pkg_scan`,e)}}async handleMiniappPkgUnpack(t){try{let n=A(t,`inputPath`,!0),r=A(t,`outputDir`);if(!n)throw Error(`inputPath is required`);let a=g(n);if(!(await S(a)).isFile())throw Error(`inputPath must be a file`);let o=await I(`miniapp-unpack`,B(a)??u(a,f(a)),r);await y(o.absolutePath,{recursive:!0});let s=await ie(this.runner,a,o.absolutePath);if(s.used){let t=0;if(await F(o.absolutePath,async(e,n)=>{t+=1}),t>0)return i({success:!0,usedExternalCli:!0,cliCommand:s.command??null,outputDir:o.displayPath,extractedFiles:t,appId:B(a),collectorState:k(this.collector)});e.warn(`External unpack tool reported success but produced no output; falling back to parser`,{inputPath:a,outputDir:o.absolutePath})}let c=await b(a),l=re(c),p=[],m=0,h=0;for(let[e,t]of l.entries.entries()){let n=t.name.trim().length>0?t.name:`file-${e}.bin`;try{let e=t.offset,r=e+t.size;if(e<0||r>c.length){let n=l.dataOffset+t.offset,i=n+t.size;if(n>=0&&i<=c.length)e=n,r=i;else throw Error(`entry offset out of range`)}let i=c.subarray(e,r),a=R(o.absolutePath,n);await y(d(a),{recursive:!0}),await C(a,i),m+=1,h+=i.length}catch(e){p.push({path:n,reason:e instanceof Error?e.message:String(e)})}}return i({success:m>0,usedExternalCli:!1,cliError:s.stderr??null,outputDir:o.displayPath,appId:B(a),header:{magic:l.magic,info:l.info,indexInfoLength:l.indexInfoLength,dataLength:l.dataLength,lastIdent:l.lastIdent},fileCount:l.entries.length,extractedFiles:m,totalBytesExtracted:h,failedFiles:p,collectorState:k(this.collector)})}catch(e){return O(`miniapp_pkg_unpack`,e)}}async handleMiniappPkgAnalyze(e){try{let t=A(e,`unpackedDir`,!0);if(!t)throw Error(`unpackedDir is required`);let n=g(t);if(!(await S(n)).isDirectory())throw Error(`unpackedDir must be a directory`);let r=new Set,a=new Set,o=[],s=0,c,l,d;await F(n,async(e,t)=>{s+=Number(t.size);let r=h(n,e).replace(/\\/g,`/`),i=u(e).toLowerCase(),p=f(e).toLowerCase();i===`app.json`&&!c?c=e:i===`app-config.json`&&!l?l=e:i===`page-frame.html`&&!d&&(d=e),p===`.js`&&o.push(r),r.includes(`/components/`)&&[`.js`,`.wxml`,`.json`,`.wxss`].includes(p)&&a.add(r)});let p=[],m=null;if(c){let e=await z(c);if(e){for(let t of M(e.pages))r.add(t);let t=e.subPackages??e.subpackages;if(Array.isArray(t))for(let e of t){if(!j(e))continue;let t=typeof e.root==`string`?e.root.trim():``,n=M(e.pages);p.push({root:t,pages:n});for(let e of n)t.length>0?r.add(`${t}/${e}`):r.add(e)}let n=e.usingComponents;if(j(n))for(let e of Object.values(n))typeof e==`string`&&e.trim()&&a.add(e.trim());let i=typeof e.appId==`string`?e.appId:typeof e.appid==`string`?e.appid:null;i&&i.trim().length>0&&(m=i.trim())}}if(l){let e=await z(l);if(e){let t=typeof e.appId==`string`?e.appId:typeof e.appid==`string`?e.appid:null;t&&t.trim().length>0&&!m&&(m=t.trim());for(let t of M(e.pages))r.add(t)}}return m||=B(n),i({success:!0,unpackedDir:n.replace(/\\/g,`/`),pages:Array.from(r).toSorted(),subPackages:p,components:Array.from(a).toSorted(),jsFiles:o.toSorted(),totalSize:s,appId:m,discovered:{appJsonPath:c?N(c):null,appConfigPath:l?N(l):null,pageFramePath:d?N(d):null},collectorState:k(this.collector)})}catch(e){return O(`miniapp_pkg_analyze`,e)}}};function oe(e){let t=e.length;for(;t>0&&e.charCodeAt(t-1)===0;)--t;return t===e.length?e:e.slice(0,t)}function se(e){if(!j(e.files))return[];let t=[],n=(e,r)=>{for(let[i,a]of Object.entries(e)){if(!j(a))continue;let e=r.length>0?`${r}/${i}`:i;if(j(a.files)){n(a.files,e);continue}let o=a.size,s=a.offset,c=a.unpacked===!0,l=typeof o==`number`&&Number.isFinite(o)&&o>=0?o:0,u=0;if(typeof s==`number`||typeof s==`string`){let e=Number(s);Number.isFinite(e)&&e>=0&&(u=e)}t.push({path:L(e),size:l,offset:u,unpacked:c})}};return n(e.files,``),t}function ce(e,t,n,r){let i=e.filter(e=>!e.unpacked&&e.size>0).slice(0,64);for(let e of i){let r=t+e.offset,i=r+e.size;if(r<0||i<r||i>n)return!1}if(r&&i.length>0){let e=t+i[0].offset;if(e>=0&&e<r.length){let n=r[e];if(n===123||n===125||n===34||n===91){let e=0;for(let n of i.slice(0,4)){let i=t+n.offset;if(i<r.length){let t=r[i];(t===123||t===125||t===34||t===91||t===58)&&e++}}if(e>=3)return!1}if(i.length>=3){let e=0;for(let n of i.slice(0,4)){let i=t+n.offset;i>=0&&i<r.length&&r[i]===0&&(e+=1)}if(e>=3)return!1}}}return!0}function V(e){if(e.length<16)throw Error(`Invalid ASAR: file too small`);let t=e.readUInt32LE(0),n=e.readUInt32LE(4),r=e.readUInt32LE(8),i=e.readUInt32LE(12),a=Array.from(new Set([r,n,t-8,t])).filter(t=>t>0&&16+t<=e.length),o=null,s=0;for(let t of a){let n=oe(e.subarray(16,16+t).toString(`utf-8`)).trim();if(n.length!==0)try{let e=JSON.parse(n);if(j(e)){o=e,s=t;break}}catch{let e=n.lastIndexOf(`}`);if(e>0)try{let r=n.substring(0,e+1),i=JSON.parse(r);if(j(i)){o=i,s=t;break}}catch{}}}if(!o)throw Error(`Invalid ASAR: cannot parse header JSON`);let c=se(j(o.files)?o:{files:o}),l=Array.from(new Set([16+s,16+s+i,8+t,8+n,16+r,16+r+i,16+n,16+n+i])).filter(t=>t>=16&&t<=e.length),u=l[0]??16+s,d=l.toSorted((e,t)=>e-t);for(let t of d)if(ce(c,t,e.length,e)){u=t;break}return{files:c,dataOffset:u,headerSize:t,headerStringSize:n,headerContentSize:r,padding:i}}function le(e,t,n){let r=L(n);if(r.length===0)return;let i=t.files.find(e=>e.path===r)??t.files.find(e=>e.path.endsWith(`/${r}`));if(!i||i.unpacked)return;let a=t.dataOffset+i.offset,o=a+i.size;if(!(a<0||o>e.length||o<a))return e.subarray(a,o)}function H(e,t,n){let r=le(e,t,n);return r?r.toString(`utf-8`):void 0}function ue(e){let t=new Set,n=/preload\s*:\s*(?:path\.(?:join|resolve)\([^)]*?['"`]([^'"`]+)['"`][^)]*\)|['"`]([^'"`]+)['"`])/g,r=n.exec(e);for(;r;){let i=r[1]??r[2];i&&t.add(i.trim()),r=n.exec(e)}let i=e.match(/devTools\s*:\s*(true|false)/),a=null;return i?.[1]&&(a=i[1]===`true`),/\.openDevTools\s*\(/.test(e)&&(a=!0),{preloadScripts:Array.from(t),devToolsEnabled:a}}async function de(e){let t=new Set;return await F(e,async(e,n)=>{let r=u(e).toLowerCase();f(e).toLowerCase()===`.js`&&r.includes(`preload`)&&t.add(N(e))}),Array.from(t).toSorted().slice(0,100)}function fe(e){let t={},n=[],r=0,i=0,a=0;for(let o of e){let e=L(o.path);if(e.length!==0){if(o.unpacked){pe(t,e,{size:o.data.length,unpacked:!0}),a+=1;continue}pe(t,e,{size:o.data.length,offset:String(r)}),n.push(o.data),r+=o.data.length,i+=o.data.length,a+=1}}let o=JSON.stringify({files:t}),s=Buffer.from(o,`utf-8`),c=s.length,l=(4-c%4)%4,u=8+c+l,d=Buffer.alloc(8);d.writeUInt32LE(4,0),d.writeUInt32LE(u,4);let f=Buffer.alloc(8+c+l);return f.writeUInt32LE(4+c+l,0),f.writeUInt32LE(c,4),s.copy(f,8),{buffer:Buffer.concat([d,f,...n]),fileCount:a,totalDataSize:i}}function pe(e,t,n){let r=L(t).split(`/`),i=e;for(let e=0;e<r.length-1;e+=1){let t=r[e],n=i[t];if(j(n)&&j(n.files))i=n.files;else{let e={files:{}};i[t]=e,i=e.files}}let a=r[r.length-1];i[a]=n}var me=class{collector;constructor(e){this.collector=e}async handleAsarExtract(e){try{let t=A(e,`inputPath`,!0),n=A(e,`outputDir`),r=te(e,`listOnly`,!1);if(!t)throw Error(`inputPath is required`);let a=g(t);if(!(await S(a)).isFile())throw Error(`inputPath must be a file`);let o=await b(a),s=V(o),c=s.files.map(e=>({path:e.path,size:e.size,offset:e.offset})),l=c.reduce((e,t)=>e+t.size,0);if(r)return i({success:!0,files:c,totalFiles:c.length,totalSize:l,dataOffset:s.dataOffset,header:{headerSize:s.headerSize,headerStringSize:s.headerStringSize,headerContentSize:s.headerContentSize,padding:s.padding},collectorState:k(this.collector)});let p=await I(`asar-extract`,u(a,f(a)),n),m=0,h=[];for(let e of s.files){if(e.unpacked){h.push({path:e.path,reason:`Entry is marked as unpacked and not stored inside app.asar`});continue}let t=s.dataOffset+e.offset,n=t+e.size;if(t<0||n>o.length||n<t){h.push({path:e.path,reason:`Entry data range is out of bounds`});continue}try{let r=o.subarray(t,n),i=R(p.absolutePath,e.path);await y(d(i),{recursive:!0}),await C(i,r),m+=1}catch(t){h.push({path:e.path,reason:t instanceof Error?t.message:String(t)})}}return i({success:m>0,files:c,totalFiles:c.length,totalSize:l,extractedFiles:m,failedFiles:h,outputDir:p.displayPath,dataOffset:s.dataOffset,header:{headerSize:s.headerSize,headerStringSize:s.headerStringSize,headerContentSize:s.headerContentSize,padding:s.padding},collectorState:k(this.collector)})}catch(e){return O(`asar_extract`,e)}}async handleElectronInspectApp(t){try{let n=A(t,`appPath`,!0);if(!n)throw Error(`appPath is required`);let r=g(n),a=(await S(r)).isDirectory()?r:d(r),o=[p(a,`resources`,`app.asar`),p(a,`Contents`,`Resources`,`app.asar`),p(a,`app.asar`)],s=null;for(let e of o)if(await P(e)&&(await S(e)).isFile()){s=e;break}let c=null,l=null;if(s)try{c=await b(s),l=V(c)}catch(t){e.warn(`electron_inspect_app failed to parse asar`,{asarPath:s,error:t instanceof Error?t.message:String(t)}),c=null,l=null}let m=null,h=``,_=`none`;if(l&&c){let t=l.files.find(e=>e.path===`package.json`||e.path.endsWith(`/package.json`));if(t){let n=H(c,l,t.path);if(n)try{let e=JSON.parse(n);j(e)&&(m=e,h=t.path,_=`asar`)}catch(n){e.warn(`electron_inspect_app invalid package.json in asar`,{packagePath:t.path,error:n instanceof Error?n.message:String(n)})}}}if(!m){let e=[p(a,`package.json`),p(a,`app`,`package.json`),p(a,`resources`,`app`,`package.json`),p(a,`Contents`,`Resources`,`app`,`package.json`)];for(let t of e){let e=await z(t);if(e){m=e,h=t,_=`filesystem`;break}}}if(!m)return i({success:!1,tool:`electron_inspect_app`,error:`Cannot locate package.json in app directory or app.asar`,appPath:r.replace(/\\/g,`/`),scanRoot:a.replace(/\\/g,`/`),asarPath:s?s.replace(/\\/g,`/`):null,collectorState:k(this.collector)});let v=typeof m.main==`string`&&m.main.trim().length>0?m.main.trim():`index.js`,y=typeof m.version==`string`?m.version:null,x=m.dependencies,C=j(x)?Object.keys(x).toSorted():[],w=``,T=``;if(_===`asar`&&l&&c){let e=h.length>0?d(h):``,t=Array.from(new Set([L(p(e,v)),L(v),L(u(v))])).filter(e=>e.length>0);for(let e of t){let t=H(c,l,e);if(typeof t==`string`){w=t,T=e;break}}if(w.length===0){let e=l.files.find(e=>u(e.path)===u(v));if(e){let t=H(c,l,e.path);typeof t==`string`&&(w=t,T=e.path)}}}else if(_===`filesystem`){let t=g(d(h),v);if(await P(t)&&(await S(t)).isFile())try{w=await b(t,`utf-8`),T=t}catch(n){e.warn(`electron_inspect_app failed to read main script`,{absoluteMainPath:t,error:n instanceof Error?n.message:String(n)})}}let E=w.length>0?ue(w):{preloadScripts:[],devToolsEnabled:null},D=new Set(E.preloadScripts);if(D.size===0&&l)for(let e of l.files){let t=e.path.toLowerCase();t.includes(`preload`)&&f(t)===`.js`&&D.add(e.path)}if(D.size===0){let e=await de(a);for(let t of e)D.add(t)}let ee=E.devToolsEnabled===null?!0:E.devToolsEnabled;return i({success:!0,appPath:r.replace(/\\/g,`/`),scanRoot:a.replace(/\\/g,`/`),mainEntry:v,version:y,preloadScripts:Array.from(D).toSorted(),dependencies:C,devToolsEnabled:ee,packageSource:_,packagePath:_===`filesystem`?N(h):h,mainScriptPath:T.length>0?_===`filesystem`?N(T):T:null,asarPath:s?N(s):null,browserWindowDetected:w.length>0?w.includes(`BrowserWindow`):!1,collectorState:k(this.collector)})}catch(e){return O(`electron_inspect_app`,e)}}async handleAsarSearch(e){try{let t=A(e,`inputPath`,!0),n=A(e,`pattern`,!0);if(!t)throw Error(`inputPath is required`);if(!n)throw Error(`pattern is required`);let r=A(e,`fileGlob`)||`*.js`,a=typeof e.maxResults==`number`&&e.maxResults>0?e.maxResults:100,o=g(t);if(!await P(o))return i({success:!1,tool:`asar_search`,error:`File does not exist: ${t}`});let s=await b(o),c=V(s),l=r.startsWith(`*.`)?r.slice(1):null,u=c.files.filter(e=>e.unpacked||e.size<=0?!1:l?f(e.path).toLowerCase()===l.toLowerCase():!0),d;try{d=new RegExp(n,`gi`)}catch{return i({success:!1,tool:`asar_search`,error:`Invalid regex pattern: ${n}`})}let p=[],m=0,h=0;for(let e of u){if(m>=a)break;let t=c.dataOffset+e.offset,n=t+e.size;if(t<0||n>s.length||n<t)continue;let r=s.subarray(t,n).toString(`utf-8`);h++,d.lastIndex=0;let i=[];for(let e=0;e<r.length;e++)r[e]===`
2
+ `&&i.push(e);function o(e){let t=0,n=i.length;for(;t<n;){let r=t+n>>>1;i[r]<e?t=r+1:n=r}return t+1}let l=[],u;for(;(u=d.exec(r))!==null&&m<a;){let e=u.index,t=e+u[0].length,n=Math.max(0,e-80),i=Math.min(r.length,t+80),a=r.slice(n,i);n>0&&(a=`…${a}`),i<r.length&&(a=`${a}…`),l.push({lineNumber:o(e),text:a}),m++,u[0].length===0&&d.lastIndex++}l.length>0&&p.push({filePath:e.path,matchCount:l.length,matchLines:l})}return i({success:!0,tool:`asar_search`,matches:p,totalMatches:m,filesScanned:h,pattern:n})}catch(e){return O(`asar_search`,e)}}};async function he(e){return o(async()=>{let t=A(e,`dirPath`,!0);if(!t)throw Error(`dirPath is required`);let n=typeof e.maxFiles==`number`&&e.maxFiles>0?e.maxFiles:20,r=(typeof e.maxFileSizeKB==`number`&&e.maxFileSizeKB>0?e.maxFileSizeKB:1024)*1024;if(!await P(t))return{success:!1,error:`Directory does not exist: ${t}`};if(!(await S(t)).isDirectory())return{success:!1,error:`Path is not a directory: ${t}`};let i;try{i=await x(t)}catch{return{success:!1,error:`Cannot read directory: ${t}`}}let a=i.filter(e=>e.endsWith(`.json`)).slice(0,n),o=[],s=[];for(let e of a){let n=p(t,e);try{let t=await S(n);if(!t.isFile()){s.push({name:e,reason:`not a file`});continue}if(t.size>r){s.push({name:e,reason:`exceeds maxFileSizeKB`});continue}let i=await b(n,`utf-8`),a=JSON.parse(i);o.push({name:e,sizeBytes:t.size,content:a})}catch{s.push({name:e,reason:`read or parse error`})}}return{files:o,skipped:s,totalScanned:a.length,directory:t}})}const U=`dL7pKGdnNz796PbbjQWNKmHXBZIA`,W=[`RunAsNode`,`EnableCookieEncryption`,`EnableNodeOptionsEnvironmentVariable`,`EnableNodeCliInspectArguments`,`EnableEmbeddedAsarIntegrityValidation`,`OnlyLoadAppFromAsar`,`LoadBrowserProcessSpecificV8Snapshot`,`GrantFileProtocolExtraPrivileges`],ge={48:`DISABLE`,49:`ENABLE`,114:`REMOVED`},_e={RunAsNode:`ENABLE`,EnableNodeOptionsEnvironmentVariable:`ENABLE`,EnableNodeCliInspectArguments:`ENABLE`,OnlyLoadAppFromAsar:`DISABLE`};function G(e,t){let n=t+Buffer.from(U,`ascii`).length,r={};for(let t=0;t<W.length;t++){let i=W[t];if(!i)continue;let a=n+t;if(a>=e.length){r[i]=`UNKNOWN`;continue}let o=e[a];if(o===void 0){r[i]=`UNKNOWN`;continue}r[i]=ge[o]??`UNKNOWN`}return r}async function ve(e){return o(async()=>{let t=A(e,`exePath`,!0);if(!t)throw Error(`exePath is required`);if(!await P(t))return{success:!1,error:`File does not exist: ${t}`};let n=await b(t),r=Buffer.from(U,`ascii`),i=n.indexOf(r);return i===-1?{exePath:t,fuseWireFound:!1,fuses:{},note:`No fuse sentinel found. The application is either not built with Electron, or was built with Electron Fuse v1 (no fuse wire). Most Electron apps use default fuse values unless explicitly configured.`}:{exePath:t,fuseWireFound:!0,fuses:G(n,i)}})}async function ye(e){return o(async()=>{let t=A(e,`exePath`,!0);if(!t)throw Error(`exePath is required`);if(!await P(t))return{success:!1,error:`File does not exist: ${t}`};let n=A(e,`profile`)??`debug`,r=e.createBackup!==!1,i;if(n===`debug`)i={..._e};else if(n===`custom`){let t=e.fuses;if(!t||Object.keys(t).length===0)throw Error('profile="custom" requires a `fuses` object mapping fuse names to ENABLE/DISABLE');i={};for(let[e,n]of Object.entries(t)){if(!W.includes(e))throw Error(`Unknown fuse: ${e}. Valid: ${W.join(`, `)}`);if(n!==`ENABLE`&&n!==`DISABLE`)throw Error(`Invalid fuse value for ${e}: ${n}. Must be ENABLE or DISABLE`);i[e]=n}}else throw Error(`Unknown profile: ${n}. Use "debug" or "custom"`);let a=await b(t),o=Buffer.from(U,`ascii`),s=a.indexOf(o);if(s===-1)return{success:!1,error:`No fuse sentinel found. This may not be an Electron binary.`,exePath:t};let c=G(a,s),l=s+o.length,u=[];for(let[e,t]of Object.entries(i)){let n=W.indexOf(e);if(n===-1)continue;let r=l+n;if(r>=a.length)continue;let i=a[r];if(i===114){u.push({fuse:e,before:`REMOVED`,after:`REMOVED (cannot patch)`});continue}let o=t===`ENABLE`?49:48,s=ge[i??0]??`UNKNOWN`;i!==o&&(a[r]=o,u.push({fuse:e,before:s,after:t}))}if(u.length===0)return{exePath:t,message:`All target fuses are already in the desired state. No changes needed.`,fuses:c};let d=null;r&&(d=`${t}.bak`,await v(t,d)),await C(t,a);let f=G(a,s);return{exePath:t,backupPath:d,profile:n,changes:u,fusesBefore:c,fusesAfter:f,note:d?`Backup created at ${d}. Restore with: copy "${d}" "${t}"`:`No backup created (createBackup=false).`}})}const K=w(D),be=Buffer.from([192,222]),xe=Buffer.from(`BYTN`),Se=new Set([`.jsc`,`.bin`]);function Ce(e,t){let n=f(t).toLowerCase();if(e.length>=4&&e.subarray(0,4).equals(xe))return`bytenode`;if(e.length>=2&&e.subarray(0,2).equals(be))return`v8-raw`;if(Se.has(n))return`jsc-extension`;let r=[Buffer.from(`Ldar`),Buffer.from(`Star`),Buffer.from(`LdaSmi`),Buffer.from(`CallRuntime`)];for(let t of r)if(e.indexOf(t)!==-1)return`v8-heuristic`;return null}async function we(e){try{let{stdout:n,stderr:r}=await K(`python`,[`-m`,`view8`,e],{timeout:t,maxBuffer:10*1024*1024});return n&&n.trim().length>0?{ok:!0,output:n}:{ok:!1,error:r||`Empty output from view8`}}catch{try{let{stdout:n}=await K(`python3`,[`-m`,`view8`,e],{timeout:t,maxBuffer:10*1024*1024});return n&&n.trim().length>0?{ok:!0,output:n}:{ok:!1,error:`Empty output from view8`}}catch{return{ok:!1,error:`view8 not available. Install with: pip install view8`}}}}async function Te(e){try{return await K(e,[`-c`,`import view8; print(getattr(view8, "__file__", "view8"))`],{timeout:t,maxBuffer:1024*1024}),{available:!0,interpreter:e}}catch(t){return{available:!1,interpreter:e,reason:t instanceof Error?t.message:String(t)}}}async function Ee(){let e=await Te(`python`);if(e.available)return e;let t=await Te(`python3`);return t.available?t:{available:!1,reason:e.reason&&t.reason?`${e.reason}; ${t.reason}`:e.reason??t.reason??`view8 is not available`}}function De(e){let t=[],n=[],r=new Set,i=2e3,a=``;for(let n=0;n<e.length;n++){let o=e[n];o>=32&&o<=126?a+=String.fromCharCode(o):(a.length>=4&&a.length<=i&&Oe(a)&&!r.has(a)&&(r.add(a),t.push(a)),a=``)}for(let n=0;n<e.length-3;n++)if(e[n+1]===0&&e[n]>=32&&e[n]<=126){let a=``,o=n;for(;o<e.length-1&&e[o]>=32&&e[o]<=126&&e[o+1]===0;)a+=String.fromCharCode(e[o]),o+=2;a.length>=4&&a.length<=i&&Oe(a)&&!r.has(a)&&(r.add(a),t.push(a))}return{strings:t,numbers:n}}function Oe(e){return new Set(e).size<=2||(e.match(/[^a-zA-Z0-9_\-.\s/\\:;=+*&|!?,'"(){}[\]<>@#$%^~`]/g)??[]).length/e.length>.3?!1:[/[a-zA-Z_$][a-zA-Z0-9_$]*/,/function\s/,/return\s/,/const\s/,/let\s/,/var\s/,/require\(/,/module\.exports/,/import\s/,/\.prototype\./,/\.call\(/,/\.apply\(/,/async\s/,/await\s/,/Promise/,/https?:\/\//,/[a-zA-Z]+Error/].some(t=>t.test(e))}async function ke(e){return o(async()=>{let t=A(e,`filePath`,!0);if(!t)throw Error(`filePath is required — path to a .jsc or V8 bytecode file`);if(!await P(t))return{success:!1,error:`File does not exist: ${t}`};let n=await S(t);if(n.size>50*1024*1024)return{success:!1,error:`File too large (${(n.size/1024/1024).toFixed(1)}MB). Maximum: 50MB.`};let r=await b(t),i=Ce(r,t);if(!i)return{success:!1,filePath:t,fileSize:n.size,error:`Not a recognized V8 bytecode format. Expected .jsc, bytenode, or V8 serialized bytecode.`,hint:`Ensure the file is a V8 compiled bytecode file (created by bytenode or v8.serialize).`};let a={success:!1,tool:`v8_bytecode_decompile`,filePath:t,fileSize:n.size,detectedFormat:i,strategy:`pending`},o=await we(t);if(o.ok&&o.output)return a.success=!0,a.strategy=`view8`,a.pseudocode=o.output.length>5e4?o.output.slice(0,5e4)+`
3
+
4
+ ... [truncated, total `+o.output.length+` chars]`:o.output,a;let{strings:s}=De(r);return s.length>0?(a.success=!0,a.strategy=`constant-pool-extraction`,a.strings=s.slice(0,500),a.note=[`view8 unavailable (${o.error}). Used built-in constant pool extraction.`,`Found ${s.length} code-relevant strings. These include function names, identifiers, URLs, and string literals from the original source.`,`For full decompilation, install view8: pip install view8`].join(` `)):(a.success=!1,a.strategy=`none`,a.error=`Could not decompile. view8: ${o.error}. Built-in extraction found no code strings.`,a.note=`The bytecode may be heavily optimized or use an unsupported V8 version.`),a})}const q=new Map;async function Ae(e){try{let t=await b(e),n=Buffer.from(`dL7pKGdnNz796PbbjQWNKmHXBZIA`,`ascii`),r=t.indexOf(n);if(r===-1)return{fuseFound:!1,runAsNode:!1,inspectArgs:!1,nodeOptions:!1};let i=r+n.length;return{fuseFound:!0,runAsNode:t[i]===49,nodeOptions:t[i+2]===49,inspectArgs:t[i+3]===49}}catch{return{fuseFound:!1,runAsNode:!1,inspectArgs:!1,nodeOptions:!1}}}async function J(e,t=1e4){let n=Date.now();for(;Date.now()-n<t;){try{let t=await fetch(`http://127.0.0.1:${e}/json/version`,{signal:AbortSignal.timeout(2e3)});if(t.ok)return{ok:!0,info:await t.text()}}catch{}await new Promise(e=>setTimeout(e,500))}return{ok:!1,error:`CDP port ${e} did not respond within ${t}ms`}}async function je(e){return o(async()=>{let t=A(e,`exePath`,!0);if(!t)throw Error(`exePath is required — path to the Electron .exe`);if(!await P(t))return{success:!1,error:`File does not exist: ${t}`};let n=e.skipBinaryCheck===!0,r=t.split(/[\\/]/).pop()?.toLowerCase()??``;if(![/^electron/i,/\.app$/i,/chrome/i,/chromium/i].some(e=>e.test(r))&&!n){let e=d(t),n=[p(e,`resources`,`app.asar`),p(e,`resources`,`app`),p(e,`ffmpeg.dll`),p(e,`libEGL.dll`),p(e,`libGLESv2.dll`),p(e,`vk_swiftshader.dll`),p(e,`..`,`Frameworks`,`Electron Framework.framework`)];if(!(await Promise.all(n.map(P))).some(Boolean))return{success:!1,error:`exePath does not appear to be an Electron binary: ${r}. No Electron companion files found (resources/app.asar, Chromium DLLs, etc.). Pass skipBinaryCheck:true to override.`}}let i=e.mainPort??9229,a=e.rendererPort??9222,o=e.args??[],s=[`--require`,`--loader`,`--import`,`-e`,`--eval`,`-p`,`--print`],c=o.filter(e=>!s.some(t=>e===t||e.startsWith(`${t}=`))),l=e.skipFuseCheck===!0,u=e.waitMs??8e3,f=[];if(!l){let e=await Ae(t);e.fuseFound&&(e.inspectArgs||f.push(`EnableNodeCliInspectArguments is DISABLED — main process --inspect may be blocked. Use electron_patch_fuses first.`),e.nodeOptions||f.push(`EnableNodeOptionsEnvironmentVariable is DISABLED — NODE_OPTIONS injection blocked.`),e.runAsNode||f.push(`RunAsNode is DISABLED — ELECTRON_RUN_AS_NODE=1 will not work.`))}let m=ee(t,[`--inspect=${i}`,`--remote-debugging-port=${a}`,...c],{stdio:`ignore`,detached:!0,env:{...process.env}});if(m.unref(),!m.pid)return{success:!1,error:`Failed to spawn process — no PID returned.`};let h=`electron-${m.pid}`;q.set(h,{child:m,pid:m.pid,ports:{main:i,renderer:a}});let[g,_]=await Promise.all([J(i,u),J(a,u)]);return{sessionId:h,pid:m.pid,ports:{main:{port:i,available:g.ok,info:g.ok?`Ready`:g.error},renderer:{port:a,available:_.ok,info:_.ok?`Ready`:_.error}},fuseWarnings:f.length>0?f:void 0,usage:{main:`Use electron_attach(port=${i}) to debug the main process (Node.js)`,renderer:`Use electron_attach(port=${a}) to debug the renderer (Chromium)`,combined:`Both sessions can be used simultaneously for cross-process analysis`}}})}async function Me(e){return o(async()=>{let t=A(e,`sessionId`);if(t){let e=q.get(t);if(!e)return{success:!1,error:`No session found: ${t}`,activeSessions:Array.from(q.keys())};let[n,r]=await Promise.all([J(e.ports.main,2e3),J(e.ports.renderer,2e3)]);return{sessionId:t,pid:e.pid,main:{port:e.ports.main,alive:n.ok},renderer:{port:e.ports.renderer,alive:r.ok}}}return{sessions:Array.from(q.entries()).map(([e,t])=>({sessionId:e,pid:t.pid,ports:t.ports}))}})}const Y=new Map;function Ne(){return typeof globalThis.WebSocket==`function`?{available:!0}:{available:!1,reason:`Global WebSocket is not available in this Node runtime.`,fix:`Use Node.js 21+ or provide a WebSocket-compatible runtime.`}}async function X(e,t){let n=e.match(/ws:\/\/([\d.]+:\d+)\//);if(!n?.[1])return{ok:!1,error:`Invalid wsDebuggerUrl: ${e}`};let r=n[1];try{let e=(await(await fetch(`http://${r}/json`,{signal:AbortSignal.timeout(5e3)})).json()).find(e=>e.type===`page`);if(!e)return{ok:!1,error:`No page target found`};let n=e.webSocketDebuggerUrl;return n?await Pe(n,t):{ok:!1,error:`Page target has no WebSocket debugger URL`}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}function Pe(e,t){return new Promise(n=>{try{let r=Ne();if(!r.available){n({ok:!1,error:`${r.reason} ${r.fix??``}`.trim()});return}let i=globalThis.WebSocket,a=new i(e),o=setTimeout(()=>{try{a.close()}catch{}n({ok:!1,error:`CDP WebSocket timeout (10s)`})},1e4);a.addEventListener(`open`,()=>{a.send(JSON.stringify({id:1,method:`Runtime.evaluate`,params:{expression:t,returnByValue:!0,awaitPromise:!1}}))}),a.addEventListener(`message`,e=>{clearTimeout(o);try{let t=JSON.parse(String(e.data));t.result?.exceptionDetails?n({ok:!1,error:t.result.exceptionDetails.text}):n({ok:!0,result:String(t.result?.result?.value??``)})}catch(e){n({ok:!1,error:`Parse error: ${e}`})}try{a.close()}catch{}}),a.addEventListener(`error`,e=>{clearTimeout(o),n({ok:!1,error:`WebSocket error: ${e}`})})}catch(e){n({ok:!1,error:e instanceof Error?e.message:String(e)})}})}async function Fe(e){return o(async()=>{let t=A(e,`action`)??`guide`;if(t===`start`){let t=e.port??9222,n=`ipc-sniff-${t}-${Date.now()}`,r;try{r=(await(await fetch(`http://127.0.0.1:${t}/json/version`,{signal:AbortSignal.timeout(5e3)})).json()).webSocketDebuggerUrl??`ws://127.0.0.1:${t}/devtools/browser`}catch{return{success:!1,error:`Cannot connect to CDP at port ${t}. Ensure Electron is launched with --remote-debugging-port=${t}.`,hint:`Use electron_launch_debug to start the app with CDP enabled.`}}let i=await X(r,`
5
+ (function() {
6
+ if (window.__ipcSnifferInstalled) return 'already_installed';
7
+
8
+ const captured = [];
9
+ window.__ipcSnifferCaptured = captured;
10
+ window.__ipcSnifferInstalled = true;
11
+
12
+ // Try to access ipcRenderer from contextBridge-exposed API or require
13
+ let ipcRenderer = null;
14
+
15
+ // Method 1: Direct require (works if nodeIntegration is enabled)
16
+ try {
17
+ ipcRenderer = require('electron').ipcRenderer;
18
+ } catch(e) {}
19
+
20
+ // Method 2: window.electron (common contextBridge pattern)
21
+ if (!ipcRenderer && window.electron && window.electron.ipcRenderer) {
22
+ ipcRenderer = window.electron.ipcRenderer;
23
+ }
24
+
25
+ if (!ipcRenderer) {
26
+ return 'ipcRenderer_not_accessible';
27
+ }
28
+
29
+ // Hook invoke
30
+ const origInvoke = ipcRenderer.invoke.bind(ipcRenderer);
31
+ ipcRenderer.invoke = function(channel, ...args) {
32
+ captured.push({
33
+ timestamp: Date.now(),
34
+ method: 'invoke',
35
+ channel: channel,
36
+ args: args.map(a => {
37
+ try { return JSON.parse(JSON.stringify(a)); }
38
+ catch { return String(a); }
39
+ })
40
+ });
41
+ return origInvoke(channel, ...args);
42
+ };
43
+
44
+ // Hook send
45
+ const origSend = ipcRenderer.send.bind(ipcRenderer);
46
+ ipcRenderer.send = function(channel, ...args) {
47
+ captured.push({
48
+ timestamp: Date.now(),
49
+ method: 'send',
50
+ channel: channel,
51
+ args: args.map(a => {
52
+ try { return JSON.parse(JSON.stringify(a)); }
53
+ catch { return String(a); }
54
+ })
55
+ });
56
+ return origSend(channel, ...args);
57
+ };
58
+
59
+ // Hook sendSync
60
+ if (ipcRenderer.sendSync) {
61
+ const origSendSync = ipcRenderer.sendSync.bind(ipcRenderer);
62
+ ipcRenderer.sendSync = function(channel, ...args) {
63
+ captured.push({
64
+ timestamp: Date.now(),
65
+ method: 'sendSync',
66
+ channel: channel,
67
+ args: args.map(a => {
68
+ try { return JSON.parse(JSON.stringify(a)); }
69
+ catch { return String(a); }
70
+ })
71
+ });
72
+ return origSendSync(channel, ...args);
73
+ };
74
+ }
75
+
76
+ return 'hooks_installed';
77
+ })();
78
+ `);if(!i.ok)return{success:!1,error:`Failed to inject IPC hooks: ${i.error}`,hint:`The renderer may have contextIsolation enabled. Try injecting via main process CDP instead.`};let a={id:n,port:t,wsUrl:r,messages:[],startedAt:Date.now(),active:!0};return Y.set(n,a),{action:`start`,sessionId:n,port:t,hookStatus:i.result,usage:{dump:`electron_ipc_sniff(action="dump", sessionId="${n}")`,stop:`electron_ipc_sniff(action="stop", sessionId="${n}")`},note:i.result===`ipcRenderer_not_accessible`?`ipcRenderer not accessible — contextIsolation may be enabled. IPC hooking requires nodeIntegration or a custom preload.`:`IPC hooks installed. Interact with the app, then use dump to retrieve captured messages.`}}if(t===`dump`){let t=A(e,`sessionId`),n=e.port,r=e.clear!==!1,i;if(t)i=Y.get(t);else if(n)i=Array.from(Y.values()).find(e=>e.port===n);else{let e=Array.from(Y.values());i=e[e.length-1]}if(!i)return{success:!1,error:`No active IPC sniff session found.`,activeSessions:Array.from(Y.keys()),hint:`Start a session first: electron_ipc_sniff(action="start", port=9222)`};let a=await X(i.wsUrl,`
79
+ (function() {
80
+ const captured = window.__ipcSnifferCaptured || [];
81
+ const result = JSON.stringify(captured);
82
+ return result;
83
+ })();
84
+ `);if(!a.ok)return{success:!1,error:`Failed to dump IPC messages: ${a.error}`};let o=[];try{o=JSON.parse(a.result??`[]`)}catch{o=[]}r&&o.length>0&&await X(i.wsUrl,`
85
+ (function() {
86
+ if (window.__ipcSnifferCaptured) {
87
+ const count = window.__ipcSnifferCaptured.length;
88
+ window.__ipcSnifferCaptured.length = 0;
89
+ return String(count);
90
+ }
91
+ return '0';
92
+ })();
93
+ `);let s={};for(let e of o)s[e.channel]=(s[e.channel]??0)+1;return{action:`dump`,sessionId:i.id,messageCount:o.length,channelSummary:s,messages:o.slice(0,200),cleared:r,note:o.length>200?`Showing first 200 of ${o.length} messages. Use dump repeatedly for ongoing capture.`:void 0}}if(t===`stop`){let t=A(e,`sessionId`);if(!t)return{success:!1,error:`sessionId is required for stop.`,activeSessions:Array.from(Y.keys())};let n=Y.get(t);return n?(n.active=!1,Y.delete(t),{action:`stop`,sessionId:t,message:`IPC sniff session stopped.`,uptime:Math.round((Date.now()-n.startedAt)/1e3)}):{success:!1,error:`Session not found: ${t}`}}if(t===`list`){let e=Array.from(Y.entries()).map(([e,t])=>({sessionId:e,port:t.port,active:t.active,uptime:Math.round((Date.now()-t.startedAt)/1e3)}));return{action:`list`,sessions:e,count:e.length}}return{guide:{what:`Electron IPC sniffer — intercepts ipcRenderer.invoke/send/sendSync messages via CDP injection.`,workflow:[`1. Launch Electron with: electron_launch_debug(exePath="...")`,`2. Start sniffing: electron_ipc_sniff(action="start", port=9222)`,`3. Interact with the app to trigger IPC messages`,`4. Dump captured: electron_ipc_sniff(action="dump", sessionId="...")`,`5. Stop when done: electron_ipc_sniff(action="stop", sessionId="...")`],actions:[`start`,`dump`,`stop`,`list`,`guide`],limitations:[`Requires renderer CDP port (--remote-debugging-port)`,`contextIsolation=true may block direct ipcRenderer access`,`Main process IPC (ipcMain) is captured indirectly through renderer-side hooks`]}}})}async function Ie(e){let t=(await e.probeAll())[`miniapp.unpacker`],n=await Ee()??{available:!1,reason:`view8 probe returned no result`},r=Ne()??{available:!1,reason:`IPC runtime probe returned no result`};return i(s(`platform_capabilities`,[{capability:`miniapp_unpacker`,status:t?.available?`available`:`unavailable`,reason:t?.reason,fix:t?.available?void 0:`Install unveilr to enable the fast external unpack path.`,details:{tools:[`miniapp_pkg_unpack`],fallback:`Built-in Node.js parser remains available.`,...t?.path?{path:t.path}:{},...t?.version?{version:t.version}:{}}},{capability:`view8`,status:n.available?`available`:`unavailable`,reason:n.reason,fix:n.available?void 0:`Install view8 with pip install view8 to enable full bytecode decompilation.`,details:{tools:[`v8_bytecode_decompile`],fallback:`Built-in constant-pool extraction remains available.`,...n.interpreter?{interpreter:n.interpreter}:{}}},{capability:`electron_ipc_sniff_runtime`,status:r.available?`available`:`unavailable`,reason:r.reason,fix:r.fix,details:{tools:[`electron_ipc_sniff`],note:`A renderer CDP port is still required at call time.`}}]))}const Le=`ElectronAsarIntegrity`,Re=new Map([[`SHA256`,`sha256`],[`SHA512`,`sha512`]]);async function ze(e){return o(async()=>{let t=A(e,`exePath`,!0);if(!t)throw Error(`exePath is required`);if(!await P(t))return{success:!1,error:`File does not exist: ${t}`};let n=A(e,`asarPath`),r=Be(await b(t));if(r===null)return{exePath:t,integrityEmbedded:!1,entries:[],verifiedCount:0,mismatchCount:0,note:`No ElectronAsarIntegrity JSON found in the binary. The app was either built with an Electron version that omits ASAR integrity, or the EnableEmbeddedAsarIntegrityValidation fuse is disabled.`};let i=He(r);if(i.length===0)return{exePath:t,integrityEmbedded:!0,rawIntegrityJson:r,entries:[],verifiedCount:0,mismatchCount:0,note:`Integrity JSON was found but contains no ASAR entries.`};let a=d(g(t)),o=[];for(let[t,r]of i){let i=await We(t,n??await Ue(a,t,e),r);o.push(i)}let s=o.filter(e=>e.verdict===`verified`).length,c=o.filter(e=>e.verdict===`mismatch`).length,l=o.filter(e=>e.verdict===`unsupported-algorithm`).length;return{exePath:t,integrityEmbedded:!0,rawIntegrityJson:r,entries:o,verifiedCount:s,mismatchCount:c,unsupportedAlgorithmCount:l,overallVerdict:c>0?`tamper-detected`:s>0&&l===0?`verified`:`inconclusive`}})}function Be(e){let t=Math.min(e.length,67108864),n=Buffer.from(`"${Le}"`,`utf8`),r=0;for(;r<t;){let i=e.indexOf(n,r);if(i===-1||i>=t)break;let a=i+n.length;for(;a<t;){let t=e[a];if(t===32||t===9||t===10||t===13||t===58){a+=1;continue}break}if(a>=t||e[a]!==123){r=i+n.length;continue}let o=Ve(e,a,t);if(o!==null)return o;r=i+n.length}return null}function Ve(e,t,n){let r=0,i=!1,a=!1,o=-1;for(let s=t;s<n;s++){let t=e[s];if(i){a?a=!1:t===92?a=!0:t===34&&(i=!1);continue}if(t===34){i=!0;continue}if(t===123)r+=1;else if(t===125&&(--r,r===0)){o=s;break}}return o===-1?null:e.subarray(t,o+1).toString(`utf8`)}function He(e){let t;try{t=JSON.parse(e)}catch{return[]}if(typeof t!=`object`||!t)return[];let n=t[Le]??t;if(typeof n!=`object`||!n)return[];let r=[];for(let[e,t]of Object.entries(n)){if(typeof t!=`object`||!t)continue;let n=t,i=typeof n.algorithm==`string`?n.algorithm:`SHA256`,a=typeof n.hash==`string`?n.hash:``;a.length!==0&&r.push([e,{algorithm:i,hash:a}])}return r}async function Ue(e,t,n){let r=[],i=t.split(`/`).pop()??t;r.push(p(e,`resources`,i)),r.push(p(e,`resources`,t)),r.push(p(e,i)),r.push(p(e,t)),r.push(p(e,`..`,`Resources`,i));for(let e of r)try{if((await S(e)).isFile())return e}catch{}return null}async function We(e,t,n){if(!t)return{modulePath:e,asarPath:null,embeddedAlgorithm:n.algorithm,embeddedHash:n.hash,computedHash:null,computedFullFileHash:null,verdict:`asar-not-found`,note:`ASAR file not found near the executable. Pass asarPath to specify its location.`};let r=Ge(n.algorithm),i=Re.get(r);if(!i)return{modulePath:e,asarPath:t,embeddedAlgorithm:n.algorithm,embeddedHash:n.hash,computedHash:null,computedFullFileHash:null,verdict:`unsupported-algorithm`,note:`Unsupported ASAR integrity algorithm "${n.algorithm}". Supported algorithms: ${[...Re.keys()].join(`, `)}.`};let a;try{a=await b(t)}catch(r){return{modulePath:e,asarPath:t,embeddedAlgorithm:n.algorithm,embeddedHash:n.hash,computedHash:null,computedFullFileHash:null,verdict:`asar-not-found`,note:`Failed to read ASAR: ${r instanceof Error?r.message:String(r)}`}}let o=Z(a,i),s;try{s=V(a)}catch(r){return{modulePath:e,asarPath:t,embeddedAlgorithm:n.algorithm,embeddedHash:n.hash,computedHash:null,computedFullFileHash:o,verdict:`header-unparsable`,note:`Failed to parse ASAR header: ${r instanceof Error?r.message:String(r)}`}}let c=8+s.headerStringSize,l=16+s.headerContentSize,u=[];c>8&&c<=a.length&&u.push({label:`header-pickle`,hash:Z(a.subarray(8,c),i)}),l>16&&l<=a.length&&u.push({label:`header-json`,hash:Z(a.subarray(16,l),i)}),u.push({label:`full-file`,hash:o});let d=u.find(e=>e.hash===n.hash),f=u[0]?.hash??null;return{modulePath:e,asarPath:t,embeddedAlgorithm:n.algorithm,embeddedHash:n.hash,computedHash:f,computedFullFileHash:o,verdict:d?`verified`:`mismatch`,note:d?`${r} header hash matches embedded value (region: ${d.label}). ASAR is untampered.`:`${r} embedded hash does not match any computed region — ASAR header was modified after build (tamper detected), or the ASAR was replaced.`}}function Ge(e){return e.trim().toUpperCase().replace(/[-_]/g,``)}function Z(e,t){return E(t).update(e).digest(`base64`)}const Ke=/_0x[0-9a-fA-F]{4,8}/g,qe=/\beval\s*\(\s*atob\s*\(/,Je=/\bnew\s+Function\s*\(/,Ye=/\beval\s*\(\s*(?:window\.|global\.)?atob\s*\(/,Xe=/\b0x[0-9a-fA-F]{4,}\b/g,Ze=/(?:while\s*\([^)]*\)\s*\{|for\s*\([^)]*\)\s*\{)[\s\S]{0,2000}?\bswitch\s*\(/g,Qe=/case\s+0x[0-9a-fA-F]+:/g,$e=/case\s+\d+:/g;async function et(e){try{let t=A(e,`inputPath`,!0);if(!t)throw Error(`inputPath is required`);let n=A(e,`fileGlob`)||`*.js`,r=te(e,`extract`,!0),a=A(e,`outputDir`),o=typeof e.maxFiles==`number`&&e.maxFiles>0?e.maxFiles:500,s=g(t);if(!await P(s))return i({success:!1,tool:`asar_deobfuscate`,error:`File does not exist: ${t}`});let c=await b(s),l=V(c),p=n.startsWith(`*.`)?n.slice(1).toLowerCase():null,m=n===`*`,h=l.files.filter(e=>e.unpacked||e.size<=0?!1:m?!0:p?f(e.path).toLowerCase()===p:f(e.path).toLowerCase()===`.js`),_=[],v=0;for(let e of h){if(v>=o)break;let t=l.dataOffset+e.offset,n=t+e.size;if(t<0||n>c.length||n<t)continue;let r=c.subarray(t,n);_.push(tt(e.path,e.size,r.toString(`utf-8`),r)),v+=1}let x=_.filter(e=>e.score>=30||e.classification===`webpack-bundle`||e.classification===`obfuscated`||e.classification===`heavy-obfuscation`||e.classification===`packed`||e.classification===`encrypted`);x.sort((e,t)=>t.score-e.score);let S=null,w=0;if(r&&x.length>0){S=await I(`asar-deobfuscate`,u(s,f(s)),a);for(let e of x){let t=l.files.find(t=>t.path===e.path);if(!t||t.unpacked)continue;let n=l.dataOffset+t.offset,r=n+t.size;if(r>c.length)continue;let i=c.subarray(n,r),a=R(S.absolutePath,e.path);await y(d(a),{recursive:!0}),await C(a,i),w+=1}}let T={clean:0,minified:0,"webpack-bundle":0,obfuscated:0,"heavy-obfuscation":0,packed:0,encrypted:0};for(let e of _)T[e.classification]+=1;return i({success:!0,tool:`asar_deobfuscate`,inputPath:N(s),filesScanned:v,summary:T,flaggedFiles:x,outputDir:S?.displayPath??null,extractedCount:w})}catch(e){return O(`asar_deobfuscate`,e)}}function tt(e,t,n,r){let i={},a=0,o=rt(r);i.entropy=Number(o.toFixed(3));let s=n.match(Ke),c=s?s.length:0;i.hexNameCount=c,c>50?a+=45:c>20&&(a+=30);let l=it(n,`__webpack_require__`),u=it(n,`__webpack_modules__`);i.webpackRequireCount=l,i.webpackModulesCount=u,(l>0||u>0)&&(a+=10);let d=qe.test(n),f=Je.test(n),p=Ye.test(n);i.dynamicCode=d||f||p,i.dynamicCode&&(a+=25);let m=n.split(`
94
+ `),h=m.length,g=m.filter(e=>e.length>500).length,_=h>0?Math.round(n.length/h):0,v=h>0?g/h:0;i.lineCount=h,i.avgLineLength=_,i.longLineRatio=Number(v.toFixed(2)),_>500&&v>.3?(a+=20,i.minified=!0):i.minified=!1;let y=at(n);i.switchInLoop=y,y&&(a+=25);let b=n.match(Xe),x=b?b.length:0;i.hexLiteralCount=x,x>100&&(a+=10);let S=nt(a,i);return a>100&&(a=100),{path:e,size:t,classification:S,score:a,indicators:i}}function nt(e,t){let n=typeof t.entropy==`number`?t.entropy:0;return n>=7.5?`encrypted`:e>=60?`heavy-obfuscation`:e>=30?`obfuscated`:t.webpackRequireCount>0?`webpack-bundle`:n>=6.5?`packed`:t.minified===!0?`minified`:`clean`}function rt(e){if(e.length===0)return 0;let t=Array.from({length:256},()=>0);for(let n=0;n<e.length;n+=1)t[e[n]]=(t[e[n]]??0)+1;let n=0,r=e.length;for(let e of t){if(e===0)continue;let t=e/r;n-=t*Math.log2(t)}return n}function it(e,t){if(t.length===0)return 0;let n=0,r=e.indexOf(t);for(;r!==-1;)n+=1,r=e.indexOf(t,r+t.length);return n}function at(e){Ze.lastIndex=0;let t;for(;(t=Ze.exec(e))!==null;){let n=t.index+t[0].length,r=e.slice(n,n+4e3),i=r.match(Qe);if(i&&i.length>=5)return!0;let a=r.match($e);if(a&&a.length>=5)return!0}return!1}async function ot(e){return o(async()=>{let t=A(e,`inputDir`,!0);if(!t)throw Error(`inputDir must be a non-empty string`);let n=g(t);if(!await P(n))return{success:!1,tool:`asar_repack`,error:`Directory does not exist: ${t}`};let r=[];await F(n,async e=>{let t=await b(e),i=h(n,e).replace(/\\/g,`/`);r.push({path:i,data:t})});let i=A(e,`outputPath`),a;i?(a=g(i),await y(d(a),{recursive:!0})):a=g((await I(`asar-repack`,u(n))).absolutePath,`${u(n)}.asar`);let{buffer:o,fileCount:s,totalDataSize:c}=fe(r);return await C(a,o),{success:!0,tool:`asar_repack`,inputDir:N(n),outputPath:N(a),fileCount:s,totalDataSize:c,asarSize:o.length}})}const st={"2.16.840.1.101.3.4.2.1":`sha256`,"2.16.840.1.101.3.4.2.2":`sha384`,"2.16.840.1.101.3.4.2.3":`sha512`,"2.16.840.1.101.3.4.2.4":`sha224`,"1.3.14.3.2.26":`sha1`};function Q(e,t){if(t+2>e.length)return null;let n=e[t],r=e[t+1];if(n===void 0||r===void 0)return null;let i,a;if(r&128){let n=r&127;if(n===0||n>4||t+2+n>e.length)return null;i=0;for(let r=0;r<n;r+=1)i=i<<8|e[t+2+r];a=t+2+n}else i=r,a=t+2;if(i<0||a+i>e.length)return null;let o=e.subarray(a,a+i);return{node:{tag:n,der:e.subarray(t,a+i),value:o},next:a+i}}function $(e){let t=[],n=0;for(;n<e.value.length;){let r=Q(e.value,n);if(!r)break;t.push(r.node),n=r.next}return t}function ct(e){if(e.length===0)return``;let t=[],n=e[0];t.push(String(Math.floor(n/40))),t.push(String(n%40));let r=0;for(let n=1;n<e.length;n+=1)r=r<<7|e[n]&127,e[n]&128||(t.push(String(r)),r=0);return t.join(`.`)}function lt(e){let t={certificates:[],digestAlgorithmOid:null},n=Q(e,0);if(!n||n.node.tag!==48)return t;let r=$(n.node);if(r.length<2)return t;let i=r[1];if(i.tag!==160)return t;let a=Q(i.value,0);if(!a||a.node.tag!==48)return t;let o=$(a.node);for(let e of o)if(e.tag===160){let n=0;for(;n<e.value.length;){let r=Q(e.value,n);if(!r)break;r.node.tag===48&&t.certificates.push(Buffer.from(r.node.der)),n=r.next}}let s=o[1];if(s&&s.tag===49){let e=$(s)[0];if(e){let n=$(e)[0];n&&n.tag===6&&(t.digestAlgorithmOid=ct(n.value))}}return t}function ut(e){if(e.length<64||e[0]!==77||e[1]!==90)return{pkcs7Der:null};let t=e.readUInt32LE(60);if(t<0||t+24>e.length||e[t]!==80||e[t+1]!==69)return{pkcs7Der:null};let n=t+4+20;if(n+2>e.length)return{pkcs7Der:null};let r=e.readUInt16LE(n),i;if(r===267)i=n+96+32;else if(r===523)i=n+112+32;else return{pkcs7Der:null};if(i+8>e.length)return{pkcs7Der:null};let a=e.readUInt32LE(i),o=e.readUInt32LE(i+4);if(a===0||o===0||a+8>e.length)return{pkcs7Der:null};let s=e.readUInt32LE(a);if(e.readUInt16LE(a+6)!==2)return{pkcs7Der:null};let c=Math.min(s>8?s-8:o-8,o-8);return c<=0||a+8+c>e.length?{pkcs7Der:null}:{pkcs7Der:Buffer.from(e.subarray(a+8,a+8+c))}}function dt(e){if(e.length<28)return null;let t=e.readUInt32BE(0),n=0;if(t===3405691582){let t=e.readUInt32BE(4);if(t<1||t>16||20>e.length||(n=e.readUInt32BE(16),n+28>e.length))return null}let r=e.readUInt32LE(n),i=r===4277009103;if(r!==4277009102&&r!==4277009103)return null;let a=e.readUInt32LE(n+16),o=n+(i?32:28),s=0,c=0;for(let t=0;t<a&&o+8<=e.length;t+=1){let t=e.readUInt32LE(o),n=e.readUInt32LE(o+4);if(n<8)break;if(t===29){s=e.readUInt32LE(o+8),c=e.readUInt32LE(o+12);break}o+=n}return s===0||c<=0||s+c>e.length?null:ft(e,s,c)}function ft(e,t,n){if(t+12>e.length||e.readUInt32BE(t)!==4208856256)return null;let r=e.readUInt32BE(t+8),i=t+12,a={cmsPkcs7Der:null};for(let n=0;n<r;n+=1){let r=i+n*8;if(r+8>e.length)break;let o=e.readUInt32BE(r),s=t+e.readUInt32BE(r+4);if(s+8>e.length)continue;let c=e.readUInt32BE(s),l=e.readUInt32BE(s+4),u=Math.min(s+l,e.length);if(!(u<=s+8))if(o===0&&c===4208856066){let t=e.readUInt32BE(s+20);if(t>0&&s+t<u){let n=s+t;for(;n<u&&e[n]!==0;)n+=1;a.ident=e.subarray(s+t,n).toString(`utf-8`)}a.cdhash=E(`sha1`).update(e.subarray(s,u)).digest(`hex`)}else o===256&&c===4208855809&&(a.cmsPkcs7Der=Buffer.from(e.subarray(s+8,u)))}return a}function pt(e){try{let t=new T(e),n=typeof t.keyUsage==`string`?t.keyUsage:void 0;return{subject:t.subject,issuer:t.issuer,serialNumber:t.serialNumber,validFrom:t.validFrom,validTo:t.validTo,fingerprint256:t.fingerprint256,keyUsage:n,ca:t.ca}}catch{return null}}function mt(e){return e.match(/\(([A-Z0-9]{10})\)/)?.[1]}function ht(e){if(e)return st[e]??e}async function gt(e){return o(async()=>{let t=A(e,`exePath`,!0);if(!t)throw Error(`exePath must be a non-empty string`);if(!await P(t))return{exePath:t,signed:!1,signatureType:`none`,certificates:[],certificateCount:0,unparsedCertificateCount:0,error:`File does not exist: ${t}`};let n=await b(t);if(n.length>=2&&n[0]===77&&n[1]===90){let e=ut(n);if(e.pkcs7Der)return _t(t,e.pkcs7Der)}let r=dt(n);return r?vt(t,r):{exePath:t,signed:!1,signatureType:`none`,certificates:[],certificateCount:0,unparsedCertificateCount:0,note:`No PE Authenticode (IMAGE_DIRECTORY_ENTRY_SECURITY) or Mach-O embedded code signature (LC_CODE_SIGNATURE) detected in the binary.`}})}function _t(e,t){let n=lt(t),r=[],i=0;for(let e of n.certificates){let t=pt(e);t?r.push(t):i+=1}let a=r[0];return{exePath:e,signed:!0,signatureType:`authenticode`,certificates:r,certificateCount:n.certificates.length,unparsedCertificateCount:i,digestAlgorithm:ht(n.digestAlgorithmOid),signer:a,teamId:a?mt(a.subject):void 0,note:`Authenticode PKCS#7 SignedData parsed structurally (cert chain + digest algorithm). Cryptographic signature verification and Authenticode timestamp counter-signature are out of scope (verified:false).`}}function vt(e,t){let n={exePath:e,signed:!0,signatureType:`mach-o`,certificates:[],certificateCount:0,unparsedCertificateCount:0,ident:t.ident,cdhash:t.cdhash,note:`Mach-O embedded code signature parsed (SuperBlob + CodeDirectory). cdhash is a best-effort SHA-1 over the CodeDirectory blob — Apple’s exact cdhash zeroes the hashOffset region first (verified:false approximation).`};if(t.cmsPkcs7Der){let e=lt(t.cmsPkcs7Der);for(let t of e.certificates){let e=pt(t);e?n.certificates.push(e):n.unparsedCertificateCount+=1}n.certificateCount=e.certificates.length,n.digestAlgorithm=ht(e.digestAlgorithmOid),n.signer=n.certificates[0],n.signer&&(n.teamId=mt(n.signer.subject))}return n}var yt=class{miniapp;electron;runner;constructor(e){let t=new c;this.runner=new a(t),this.miniapp=new ae(this.runner,e),this.electron=new me(e)}handlePlatformCapabilitiesTool(){return o(async()=>await this.handlePlatformCapabilities())}handlePlatformCapabilities(){return Ie(this.runner)}handleMiniappPkgScanTool(e){return o(async()=>await this.handleMiniappPkgScan(e))}handleMiniappPkgScan(e){return this.miniapp.handleMiniappPkgScan(e)}handleMiniappPkgUnpackTool(e){return o(async()=>await this.handleMiniappPkgUnpack(e))}handleMiniappPkgUnpack(e){return this.miniapp.handleMiniappPkgUnpack(e)}handleMiniappPkgAnalyzeTool(e){return o(async()=>await this.handleMiniappPkgAnalyze(e))}handleMiniappPkgAnalyze(e){return this.miniapp.handleMiniappPkgAnalyze(e)}handleAsarExtractTool(e){return o(async()=>await this.handleAsarExtract(e))}handleAsarExtract(e){return this.electron.handleAsarExtract(e)}handleElectronInspectAppTool(e){return o(async()=>await this.handleElectronInspectApp(e))}handleElectronInspectApp(e){return this.electron.handleElectronInspectApp(e)}handleElectronScanUserdataTool(e){return o(async()=>await this.handleElectronScanUserdata(e))}handleElectronScanUserdata(e){return he(e)}handleAsarSearchTool(e){return o(async()=>await this.handleAsarSearch(e))}handleAsarSearch(e){return this.electron.handleAsarSearch(e)}handleElectronCheckFusesTool(e){return o(async()=>await this.handleElectronCheckFuses(e))}handleElectronCheckFuses(e){return ve(e)}handleElectronPatchFusesTool(e){return o(async()=>await this.handleElectronPatchFuses(e))}handleElectronPatchFuses(e){return ye(e)}handleV8BytecodeDecompileTool(e){return o(async()=>await this.handleV8BytecodeDecompile(e))}handleV8BytecodeDecompile(e){return ke(e)}handleElectronLaunchDebugTool(e){return o(async()=>await this.handleElectronLaunchDebug(e))}handleElectronLaunchDebug(e){return je(e)}handleElectronDebugStatusTool(e){return o(async()=>await this.handleElectronDebugStatus(e))}handleElectronDebugStatus(e){return Me(e)}handleElectronIPCSniffTool(e){return o(async()=>await this.handleElectronIPCSniff(e))}handleElectronIPCSniff(e){return Fe(e)}handleElectronVerifyIntegrityTool(e){return o(async()=>await this.handleElectronVerifyIntegrity(e))}handleElectronVerifyIntegrity(e){return ze(e)}handleAsarDeobfuscateTool(e){return o(async()=>await this.handleAsarDeobfuscate(e))}handleAsarDeobfuscate(e){return et(e)}handleAsarRepackTool(e){return o(async()=>await this.handleAsarRepack(e))}handleAsarRepack(e){return ot(e)}handleElectronVerifySignatureTool(e){return o(async()=>await this.handleElectronVerifySignature(e))}handleElectronVerifySignature(e){return gt(e)}};export{yt as PlatformToolHandlers};