@jshookmcp/jshook 0.3.2 → 0.3.3

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 (241) hide show
  1. package/README.md +3 -3
  2. package/README.zh.md +3 -3
  3. package/dist/{AntiCheatDetector-B6d4Qe9D.mjs → AntiCheatDetector-CUpZBh5O.mjs} +1 -1
  4. package/dist/{BrowserSessionCoordinator-BJ-HOxo0.mjs → BrowserSessionCoordinator-QIt3tetp.mjs} +1 -1
  5. package/dist/CodeInjector-Btj9upnf.mjs +1 -0
  6. package/dist/{ConsoleMonitor-CxDJV15E.mjs → ConsoleMonitor-DIjN5Afa.mjs} +5 -5
  7. package/dist/{DarwinAPI-ZfQdpLNI.mjs → DarwinAPI-BuMPGzHm.mjs} +1 -1
  8. package/dist/DetailedDataManager-Z77fDl9Z.mjs +5 -0
  9. package/dist/ExtensionManager.tools-CIGOWViz.mjs +1 -0
  10. package/dist/{FingerprintManager-DT0EAUEo.mjs → FingerprintManager-BkDSsjjP.mjs} +1 -1
  11. package/dist/{HardwareBreakpoint-BUfPdp0f.mjs → HardwareBreakpoint-DMAMcPyB.mjs} +1 -1
  12. package/dist/{HeapAnalyzer-B_aqY8oj.mjs → HeapAnalyzer-Yj348FYt.mjs} +1 -1
  13. package/dist/{ExtensionManager.tools-oVMJgPcN.mjs → MCPServer.activation.ttl-CEGNBycZ.mjs} +1 -1
  14. package/dist/MCPServer.search.helpers-Cs1JpKbu.mjs +1 -0
  15. package/dist/MCPServer.search.validation-DnifPCCv.mjs +1 -0
  16. package/dist/{MemoryController-X1XNSn1n.mjs → MemoryController-DjtgiING.mjs} +1 -1
  17. package/dist/{MemoryScanSession-DG_F-PjE.mjs → MemoryScanSession-zfoVZJB0.mjs} +1 -1
  18. package/dist/MemoryScanner-Dxd657li.mjs +1 -0
  19. package/dist/{NativeMemoryManager.utils-BHy1P_jM.mjs → NativeMemoryManager.utils-Bu8srMEF.mjs} +1 -1
  20. package/dist/{PEAnalyzer-yWQaGrcx.mjs → PEAnalyzer-CMu9Ua9T.mjs} +1 -1
  21. package/dist/PointerChainEngine-CaSC1Mry.mjs +1 -0
  22. package/dist/{ProcessRegistry-C-bN48oR.mjs → ProcessRegistry-D5y1yuP2.mjs} +1 -1
  23. package/dist/{ReverseEvidenceGraph-BhSYYdiI.mjs → ReverseEvidenceGraph-BksOpsPs.mjs} +1 -1
  24. package/dist/ServerRuntimeState-CgqBBwfd.mjs +1 -0
  25. package/dist/{Speedhack-yseDPSZ9.mjs → Speedhack-pwXTHxOY.mjs} +1 -1
  26. package/dist/{StructureAnalyzer-C5lpuZkg.mjs → StructureAnalyzer-BseGzsSl.mjs} +2 -2
  27. package/dist/ToolCatalog-DgmQXdsm.mjs +1 -0
  28. package/dist/ToolHandlerMap-7HWoIgQO.mjs +1 -0
  29. package/dist/{ToolProbe-C7ZU2x7M.mjs → ToolProbe-DQiREmNp.mjs} +1 -1
  30. package/dist/{ToolRegistry-C5oB8KP8.mjs → ToolRegistry-eMZEBiR1.mjs} +1 -1
  31. package/dist/ToolRouter.policy-UKBlFlbh.mjs +4 -0
  32. package/dist/{TraceRecorder-BiJWBXHX.mjs → TraceRecorder-B5ktv3nP.mjs} +2 -2
  33. package/dist/VersionDetector-CmPJmaJg.mjs +1 -0
  34. package/dist/{Win32API-eUCF57l_.mjs → Win32API-DoP3MMHS.mjs} +1 -1
  35. package/dist/{Win32Debug-CYrIQBvr.mjs → Win32Debug-DwF8mQGm.mjs} +1 -1
  36. package/dist/{WorkflowEngine-D876meOO.mjs → WorkflowEngine-CldHG5b4.mjs} +1 -1
  37. package/dist/{analysis-D4swdMvq.mjs → analysis-C-ln0Brh.mjs} +3 -3
  38. package/dist/antidebug-CsnpOR9z.mjs +1 -0
  39. package/dist/{artifactRetention-BCPQASm7.mjs → artifactRetention-DkYKLOvi.mjs} +1 -1
  40. package/dist/{artifacts-CkodUM4j.mjs → artifacts-D-4pSS_N.mjs} +1 -1
  41. package/dist/{betterSqlite3-Brtq-SIQ.mjs → betterSqlite3-Bdo_ifuJ.mjs} +1 -1
  42. package/dist/binary-instrument-BeZ224mZ.mjs +9 -0
  43. package/dist/{boringssl-inspector-BBaJwwkU.mjs → boringssl-inspector-ZOCkaipa.mjs} +2 -2
  44. package/dist/browser-BUaB25bk.mjs +11 -0
  45. package/dist/{handlers-yo_xYzT8.mjs → canvas-396ieNv5.mjs} +22 -22
  46. package/dist/collector-CB2syQEg.mjs +1 -0
  47. package/dist/constants-DMv3svps.mjs +2 -0
  48. package/dist/coordination-Dbohmj6D.mjs +1 -0
  49. package/dist/dart-inspector-LhEqRITQ.mjs +0 -0
  50. package/dist/debugger-CLzkObIO.mjs +1 -0
  51. package/dist/{definitions-OeLvmlQy.mjs → definitions-0hxnrDU72.mjs} +1 -1
  52. package/dist/definitions-B3a9QC2t.mjs +1 -0
  53. package/dist/{definitions-Ibci7e_L.mjs → definitions-BOvju5t2.mjs} +1 -1
  54. package/dist/{definitions-D4g-MS10.mjs → definitions-CXj_cEVt.mjs} +1 -1
  55. package/dist/{definitions-C3qNgSn1.mjs → definitions-Co6AvTjH.mjs} +1 -1
  56. package/dist/{definitions-DxFNRQNK2.mjs → definitions-Cv5r8xwq.mjs} +1 -1
  57. package/dist/definitions-DBYSxChX.mjs +1 -0
  58. package/dist/{definitions-CQd7yCQH.mjs → definitions-D_dTDX9B.mjs} +1 -1
  59. package/dist/{definitions-l7TjdE6V.mjs → definitions-Db9t2ddh.mjs} +1 -1
  60. package/dist/{definitions-BWxBke3r.mjs → definitions-DbN2CjI2.mjs} +1 -1
  61. package/dist/{definitions-DAQm1Xar.mjs → definitions-DlmmHmZc.mjs} +1 -1
  62. package/dist/{definitions-Bf3H1EwV.mjs → definitions-DnYpoGig.mjs} +1 -1
  63. package/dist/{definitions-BYwATKc-.mjs → definitions-DtZ6Ktx2.mjs} +1 -1
  64. package/dist/{definitions-D5wl_8HN.mjs → definitions-DuIPS8gq.mjs} +1 -1
  65. package/dist/{definitions-RZYGD_Ey.mjs → definitions-DywfwPMb.mjs} +1 -1
  66. package/dist/definitions-EGmqr85H.mjs +1 -0
  67. package/dist/{definitions-bybDvnG0.mjs → definitions-Fetw_Cge.mjs} +3 -3
  68. package/dist/{definitions-CB6vmOer.mjs → definitions-LdkeuOeA.mjs} +1 -1
  69. package/dist/{definitions-B_83XfNQ.mjs → definitions-Ym8niHDb.mjs} +1 -1
  70. package/dist/{definitions-Cenu6mxo.mjs → definitions-aeRd5DAR.mjs} +1 -1
  71. package/dist/{definitions-CT8ln6GQ.mjs → definitions-cnG6tj17.mjs} +1 -1
  72. package/dist/{encoding-ycOaz8Vr.mjs → encoding-B4xZWErf.mjs} +2 -2
  73. package/dist/ensure-browser-core-JHwDo5ql.mjs +285 -0
  74. package/dist/{factory-CKr4fAE1.mjs → factory-BxNdBiZa.mjs} +1 -1
  75. package/dist/{graphql-B2TiPEow.mjs → graphql-GBWsZ9xC.mjs} +4 -4
  76. package/dist/{handlers-D5E40ssn.mjs → handlers-5nzR8B0a.mjs} +2 -2
  77. package/dist/handlers-6iNsXOVT.mjs +7 -0
  78. package/dist/{handlers-BpDlVVVU.mjs → handlers-BZ8n6Hvf.mjs} +1 -1
  79. package/dist/{handlers-0yKLRIfo.mjs → handlers-BbLxNbbT.mjs} +1 -1
  80. package/dist/{handlers-DGbdQAgD.mjs → handlers-BbS4hssc.mjs} +2 -2
  81. package/dist/{handlers-l8QIKqBj.mjs → handlers-CIKOP4aI.mjs} +2 -2
  82. package/dist/handlers-CWKBBjai.mjs +1 -0
  83. package/dist/{handlers-B62K4FTc.mjs → handlers-Cmb6SoRC.mjs} +1 -1
  84. package/dist/handlers-CrJsKnEI.mjs +1 -0
  85. package/dist/{antidebug-7L3ygj_9.mjs → handlers-DB6xVVWq.mjs} +2 -2
  86. package/dist/{handlers-CMJK7m1c.mjs → handlers-DOOCWUNR.mjs} +3 -3
  87. package/dist/{handlers-D2ZOul9p.mjs → handlers-Z_B5aVaU.mjs} +2 -2
  88. package/dist/handlers-gVscChvl.mjs +1 -0
  89. package/dist/handlers-xFvI9P_y.mjs +1 -0
  90. package/dist/{handlers.impl-D9Hh8Bgl.mjs → handlers.impl-BsFTW6SD.mjs} +1 -1
  91. package/dist/{hooks-D4XLfgtV.mjs → hooks-DPouiS7I.mjs} +9 -9
  92. package/dist/index.mjs +11 -11
  93. package/dist/macro-p8kuJVcm.mjs +2 -0
  94. package/dist/maintenance-DAqADb6Z.mjs +302 -0
  95. package/dist/manifest-4lmM6MZR.mjs +1 -0
  96. package/dist/{manifest-DujQqEQR.mjs → manifest-AxaxRSt6.mjs} +2 -2
  97. package/dist/{manifest-DYpn8w_h.mjs → manifest-BIqRE1Qz.mjs} +1 -1
  98. package/dist/manifest-Box-jWfr.mjs +1 -0
  99. package/dist/manifest-Bp33di0Q.mjs +1 -0
  100. package/dist/{manifest-CQH9FhwI.mjs → manifest-BvRX4nRP.mjs} +1 -1
  101. package/dist/{manifest-0Jpt_AQa.mjs → manifest-C6KoB1XE.mjs} +1 -1
  102. package/dist/manifest-C7TdXCWY.mjs +1 -0
  103. package/dist/manifest-CM-n64K0.mjs +1 -0
  104. package/dist/{manifest-nXHmtMSp2.mjs → manifest-CUokxCUN.mjs} +1 -1
  105. package/dist/manifest-CWJS45iO.mjs +1 -0
  106. package/dist/{manifest-LLdI5m4T.mjs → manifest-Cdxdgo-D.mjs} +1 -1
  107. package/dist/{manifest-D_obs5F4.mjs → manifest-Cf6SmamD.mjs} +1 -1
  108. package/dist/manifest-Cgxu2qdv.mjs +1 -0
  109. package/dist/{manifest-ztWJoXy4.mjs → manifest-CowGSURa2.mjs} +1 -1
  110. package/dist/{manifest-DYzWI8Xs.mjs → manifest-CsGIrh34.mjs} +1 -1
  111. package/dist/manifest-CvDpVToN.mjs +1 -0
  112. package/dist/manifest-D8TL9RLE.mjs +1 -0
  113. package/dist/{manifest-DCx6w2XV.mjs → manifest-DIhtCBe6.mjs} +1 -1
  114. package/dist/{manifest-D9jUUJAu.mjs → manifest-DJbruNOg.mjs} +1 -1
  115. package/dist/manifest-DLGtZH-0.mjs +1 -0
  116. package/dist/manifest-DXHdPt2T.mjs +1 -0
  117. package/dist/{manifest-B3fZbSWR.mjs → manifest-Dg5ScOyW.mjs} +1 -1
  118. package/dist/{manifest-xWfu6iLo.mjs → manifest-DzGoTS0R.mjs} +1 -1
  119. package/dist/manifest-G2H52LKz.mjs +131 -0
  120. package/dist/{manifest-CctIumog.mjs → manifest-P0Futrgb.mjs} +1 -1
  121. package/dist/{manifest-YgVd8Sgz.mjs → manifest-Qw7xgvjv.mjs} +1 -1
  122. package/dist/{manifest-QYbQXJn0.mjs → manifest-W3qvVrP2.mjs} +1 -1
  123. package/dist/manifest-dG6MuR1U.mjs +1 -0
  124. package/dist/manifest-nWXtgq5Y2.mjs +1 -0
  125. package/dist/{manifest-LG42zPLY2.mjs → manifest-vp1upSSq.mjs} +1 -1
  126. package/dist/{modules-BPBcSaM-.mjs → modules-DO3jXCgj.mjs} +10 -10
  127. package/dist/{mojo-ipc-BhwsdVUW.mjs → mojo-ipc-Be-ccWrc.mjs} +1 -1
  128. package/dist/native-g095qhpK.mjs +961 -0
  129. package/dist/network-Dvxm7eEI.mjs +7 -0
  130. package/dist/outputPaths-D2ddHrOJ.mjs +2 -0
  131. package/dist/{parse-args-Bw413PlW.mjs → parse-args-ngRrvF9e.mjs} +1 -1
  132. package/dist/platform-DjWbuiF8.mjs +93 -0
  133. package/dist/process-Dq5I-KZW.mjs +2 -0
  134. package/dist/proxy-DPNgM7TE.mjs +2 -0
  135. package/dist/{registry-DH4sc1dt.mjs → registry-xB8Wgmyj.mjs} +1 -1
  136. package/dist/{renderer-pid-9tJnZ_9N.mjs → renderer-pid-7jbTR8f5.mjs} +1 -1
  137. package/dist/search-defaults-CJik67or.mjs +1 -0
  138. package/dist/server/plugin-api.mjs +1 -1
  139. package/dist/sourcemap-DqEW15Ao.mjs +1 -0
  140. package/dist/streaming-Dbk4eStJ.mjs +1 -0
  141. package/dist/{transform-DOxzeWPB.mjs → transform-D-peM3aO.mjs} +2 -2
  142. package/dist/{wasm-CZ_HTfKR.mjs → wasm-CZajRaad.mjs} +6 -6
  143. package/dist/{webcrack-C1iYG_EX.mjs → webcrack-phEfVt5y.mjs} +3 -3
  144. package/dist/{workflow-BdwQmARn.mjs → workflow-wkXb3x-U.mjs} +3 -3
  145. package/package.json +2 -2
  146. package/dist/CodeInjector-Cll_7bLJ.mjs +0 -1
  147. package/dist/DOMInspector-C19J4zeq.mjs +0 -95
  148. package/dist/DetailedDataManager-DmQ1LT-W.mjs +0 -1
  149. package/dist/ExtensionManager-BD724zkO.mjs +0 -1
  150. package/dist/MCPServer.search.handlers.domain-BbS-6LnX.mjs +0 -1
  151. package/dist/MemoryScanner-g1_L1ub5.mjs +0 -1
  152. package/dist/NativeMemoryManager.impl-DniBe2wf.mjs +0 -1
  153. package/dist/NetworkMonitor-B_-au6aV.mjs +0 -185
  154. package/dist/PageController-Dfsm1_o7.mjs +0 -1
  155. package/dist/PointerChainEngine-BhCUkmxY.mjs +0 -1
  156. package/dist/PrerequisiteError-BjCQA-gK.mjs +0 -1
  157. package/dist/ScriptManager-LWGPTdvD.mjs +0 -7
  158. package/dist/ServerRuntimeState-D2bWHqEE.mjs +0 -1
  159. package/dist/ToolCatalog-CYdD9F5f.mjs +0 -1
  160. package/dist/ToolRouter.policy-CfhJczkt.mjs +0 -4
  161. package/dist/VersionDetector-CHT36Az0.mjs +0 -9
  162. package/dist/apk-packer-BqXcInnX.mjs +0 -1
  163. package/dist/binary-instrument-DU7V6TUM.mjs +0 -7
  164. package/dist/binary-secrets-PdMVoyt0.mjs +0 -1
  165. package/dist/browser-Qqco2rOT.mjs +0 -11
  166. package/dist/collector-Bpl6qy2L.mjs +0 -1
  167. package/dist/constants-BYj8Xek8.mjs +0 -1
  168. package/dist/coordination-CWXW1o8K.mjs +0 -1
  169. package/dist/dart-inspector-7AkPeZ_Q.mjs +0 -0
  170. package/dist/debugger-DyALjYMk.mjs +0 -1
  171. package/dist/definitions-BftdXgXI.mjs +0 -1
  172. package/dist/definitions-Bio5XJYy.mjs +0 -1
  173. package/dist/definitions-CMZRSy3k.mjs +0 -1
  174. package/dist/definitions-DP1vgxEY.mjs +0 -1
  175. package/dist/definitions-Tls8c0A0.mjs +0 -1
  176. package/dist/ensure-browser-core-DxWC-NTp.mjs +0 -1
  177. package/dist/flat-target-session-DvcQX7J5.mjs +0 -1
  178. package/dist/handlers-8zN_vBIz.mjs +0 -1
  179. package/dist/handlers-DHO3rjsW.mjs +0 -1
  180. package/dist/handlers-FJ80VzUI.mjs +0 -2
  181. package/dist/handlers-VHWrxbM_.mjs +0 -1
  182. package/dist/handlers-mPFiNPe8.mjs +0 -302
  183. package/dist/jadx-search-B_Yse0Zh.mjs +0 -5
  184. package/dist/maintenance-BUpIukhg.mjs +0 -1
  185. package/dist/manifest-B7NB2rh2.mjs +0 -1
  186. package/dist/manifest-BDi4nbH1.mjs +0 -1
  187. package/dist/manifest-BLDfkE7n.mjs +0 -1
  188. package/dist/manifest-BcXbB4gf.mjs +0 -1
  189. package/dist/manifest-Bdnc_vrc.mjs +0 -1
  190. package/dist/manifest-BuYKgCnp.mjs +0 -1
  191. package/dist/manifest-CBfNnGPV.mjs +0 -1
  192. package/dist/manifest-CPS1Xv69.mjs +0 -1
  193. package/dist/manifest-CRryuZF4.mjs +0 -1
  194. package/dist/manifest-CvTe5ZGV2.mjs +0 -1
  195. package/dist/manifest-D-5GH0DV.mjs +0 -1
  196. package/dist/manifest-D3Ssf3IC.mjs +0 -1
  197. package/dist/manifest-D5ck3NvC.mjs +0 -1
  198. package/dist/manifest-DG19q-Ld.mjs +0 -1
  199. package/dist/manifest-DLMlD0Zc.mjs +0 -1
  200. package/dist/manifest-DwL2ik8P.mjs +0 -1
  201. package/dist/manifest-ItF5P8A12.mjs +0 -1
  202. package/dist/manifest-KZphqIyX.mjs +0 -1
  203. package/dist/manifest-RcpX_MyZ.mjs +0 -123
  204. package/dist/manifest-Zy7Odg5J.mjs +0 -1
  205. package/dist/manifest-ff1H7Pdp.mjs +0 -1
  206. package/dist/manifest-iuhF6pTL2.mjs +0 -1
  207. package/dist/manifest-yC16OhL2.mjs +0 -1
  208. package/dist/matchesWildcardPattern-BAG6LvX5.mjs +0 -1
  209. package/dist/native-j8l473zn.mjs +0 -961
  210. package/dist/network-T0VRwNPd.mjs +0 -7
  211. package/dist/outputPaths-B4Ic4RZh.mjs +0 -2
  212. package/dist/platform-CzaQtISh.mjs +0 -93
  213. package/dist/playwright-cdp-fallback-DqFdx9-s.mjs +0 -1
  214. package/dist/process-CWhsCWrf.mjs +0 -2
  215. package/dist/proxy-DZFlDsG3.mjs +0 -2
  216. package/dist/search-defaults-lYBVn_3L.mjs +0 -1
  217. package/dist/shared-state-board-BSjXLUV1.mjs +0 -1
  218. package/dist/sourcemap-Dh3Ai_ur.mjs +0 -1
  219. package/dist/streaming-BcJ0B6ao.mjs +0 -1
  220. package/dist/types-D9EiE5o9.mjs +0 -1
  221. /package/dist/{CacheAdapters-CsNtQIR8.mjs → CacheAdapters-BlDrQg8f.mjs} +0 -0
  222. /package/dist/{EventBus-DL8iLA09.mjs → EventBus-Cm-t-B65.mjs} +0 -0
  223. /package/dist/{EvidenceGraphBridge-BtbwXsLC.mjs → EvidenceGraphBridge-DBDc0wUA.mjs} +0 -0
  224. /package/dist/{HookGeneratorBuilders.core.generators.storage-DzD6dIJd.mjs → HookGeneratorBuilders.core.generators.storage-CWaWpOHa.mjs} +0 -0
  225. /package/dist/{InstrumentationSession-D_G1ZPyd.mjs → InstrumentationSession-c5qZyp7d.mjs} +0 -0
  226. /package/dist/{ResponseBuilder-BfWP-uaT.mjs → ResponseBuilder-nPXl_khE.mjs} +0 -0
  227. /package/dist/{RingBuffer-Dm54ELKT.mjs → RingBuffer-B6RTHmij.mjs} +0 -0
  228. /package/dist/{StealthVerifier-BmcxfwSF.mjs → StealthVerifier-DMBrtkhN.mjs} +0 -0
  229. /package/dist/{ToolError-DWU_z7gp.mjs → ToolError-g3rjWzhx.mjs} +0 -0
  230. /package/dist/{authorization-schema-BOFwSXUN.mjs → authorization-schema-Jtikc5Yt.mjs} +0 -0
  231. /package/dist/{bind-helpers-m2U8glkF.mjs → bind-helpers-D0mGAOof.mjs} +0 -0
  232. /package/dist/{capabilities-CyXuKUl1.mjs → capabilities-L1ax5EHS.mjs} +0 -0
  233. /package/dist/{chunk-C_pMuVsO.mjs → chunk-88NL7fhV.mjs} +0 -0
  234. /package/dist/{concurrency-DCr8WQ2M.mjs → concurrency-Dehnw4JC.mjs} +0 -0
  235. /package/dist/{evidence-graph-bridge-CV_UdYqj.mjs → evidence-graph-bridge-eT9icP6a.mjs} +0 -0
  236. /package/dist/{formatAddress-vLA_hOJt.mjs → formatAddress-DAcw4Ckg.mjs} +0 -0
  237. /package/dist/{logger-sBC6IdRT.mjs → logger-CCikqqvj.mjs} +0 -0
  238. /package/dist/{response-C7rKQst4.mjs → response-B1RuVVfD.mjs} +0 -0
  239. /package/dist/{ssrf-policy-CsIJGkpd.mjs → ssrf-policy-B72vdy23.mjs} +0 -0
  240. /package/dist/{tool-builder-qif8M9-K.mjs → tool-builder-CpLh-UQd.mjs} +0 -0
  241. /package/dist/{types-Fz69RzbZ.mjs → types-BzPBzmVB.mjs} +0 -0
@@ -1 +0,0 @@
1
- import{ni as e}from"./constants-BYj8Xek8.mjs";import{t}from"./ToolProbe-C7ZU2x7M.mjs";import{a as n,c as r,i,n as a,o,r as s,s as c}from"./binary-instrument-DU7V6TUM.mjs";import{n as l,t as u}from"./capabilities-CyXuKUl1.mjs";import{tmpdir as d}from"node:os";import{join as f,relative as p}from"node:path";import{access as m,mkdir as h,mkdtemp as g,readFile as _,readdir as v,rm as y}from"node:fs/promises";import{execFile as b}from"node:child_process";import{open as x}from"yauzl";const S={plugin_frida_bridge:`Install @jshookmcpextension/plugin-frida-bridge and reload extensions.`,plugin_ghidra_bridge:`Install @jshookmcpextension/plugin-ghidra-bridge and reload extensions.`,plugin_ida_bridge:`Install @jshookmcpextension/plugin-ida-bridge and reload extensions.`,plugin_jadx_bridge:`Install @jshookmcpextension/plugin-jadx-bridge and reload extensions.`};function C(e){return{content:[{type:`text`,text:e}]}}function w(e){return C(JSON.stringify(e))}function T(e,t){let n=e[t];if(typeof n!=`string`||n.trim().length===0)throw Error(`${t} is required`);return n.trim()}function E(e,t){let n=e[t];return typeof n==`string`&&n.trim().length>0?n.trim():void 0}function D(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}function O(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function k(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`&&e.length>0):[]}function A(e){return typeof e==`object`&&!!e}function j(e){return A(e)&&e.extensionPluginsById instanceof Map&&e.extensionPluginRuntimeById instanceof Map}function M(e,t){if(!e)return;let n=e.extensionPluginsById;if(n instanceof Map)return n.has(t)}function N(e){return S[e]}function P(e,t){let n=M(e,t);return n===!0?{status:`available`,fix:N(t)}:n===!1?{status:`unavailable`,reason:`Plugin ${t.replaceAll(`_`,`-`)} is not installed`,fix:N(t)}:{status:`unknown`,reason:`Extension plugin registry is not available in the current server context`,fix:`Run inside the full MCP server with extension support enabled.`}}async function F(e,t,r,i){let a=P(e,t);if(!e||a.status!==`available`)return w({...u(r,t,a.reason??`Plugin ${t.replaceAll(`_`,`-`)} is not available`,a.fix),status:a.status});let o=await n(e,{pluginId:t,toolName:r,args:i});return o.success?w(o):w({...u(r,t,o.error??`Plugin invocation failed`,a.fix)})}function I(e,t){let n=e[t];if(!A(n))return;let r={},i=n.includeArgs,a=n.includeRetAddr;return typeof i==`boolean`&&(r.includeArgs=i),typeof a==`boolean`&&(r.includeRetAddr=a),r}function L(e){if(!/^\d+$/.test(e))return null;let t=Number.parseInt(e,10);return Number.isNaN(t)?null:t}function R(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,24)}async function z(){let e=process.env.UNIDBG_JAR??``;if(e.length===0)return{available:!1,reason:`UNIDBG_JAR is not configured`,command:`java`,jarPath:``};try{await m(e)}catch{return{available:!1,reason:`UNIDBG_JAR not found: ${e}`,command:`java`,jarPath:e}}return{available:!0,reason:``,command:`java`,jarPath:e}}function B(e,t,n){return new Promise((r,i)=>{b(e,t,{timeout:n,windowsHide:!0,maxBuffer:8388608,encoding:`utf8`},(e,t,n)=>{if(e){i(e);return}r({stdout:typeof t==`string`?t:``,stderr:typeof n==`string`?n:``})})})}function V(e){return A(e)&&Array.isArray(e.functions)&&Array.isArray(e.imports)}function H(e){let t=[];for(let n of e){if(!A(n))continue;let e=U(n,`functionName`),r=U(n,`hookCode`),i=U(n,`description`),a=W(n.parameters);!e||!r||!i||t.push({functionName:e,hookCode:r,description:i,parameters:a})}return t}function U(e,t){let n=e[t];return typeof n==`string`?n:void 0}function W(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!A(n))continue;let e=U(n,`name`),r=U(n,`type`),i=U(n,`description`);e&&r&&i&&t.push({name:e,type:r,description:i})}return t}var G=class{state;constructor(e){this.state=e}async handleFridaAttach(e){let t=E(e,`pid`);if(!E(e,`target`)&&t)return F(this.state.context,`plugin_frida_bridge`,`frida_attach`,e);let n=T(e,`target`),r=this.getFridaSession(),i=await r.getAvailability();if(!i.available){let e=`mock-frida-${R(n)}`;return w({success:!1,available:!1,capability:`frida_cli`,fix:`Install frida-tools and ensure the frida CLI is on PATH.`,target:n,sessionId:e,reason:i.reason??`Frida CLI is not available`,sessions:[{id:e,target:n,pid:L(n),status:`unavailable`}]})}let a;try{a=await r.attach(n)}catch(e){return w({success:!1,available:!0,capability:`frida_attach`,fix:`Run the server elevated or choose a target process that allows Frida injection.`,target:n,reason:e instanceof Error?e.message:String(e),sessions:r.listSessions()})}return this.state.context?.eventBus.emit(`frida:attached`,{target:n,sessionId:a,timestamp:new Date().toISOString()}),w({success:!0,available:!0,target:n,sessionId:a,sessions:r.listSessions()})}async handleFridaEnumerateModules(e){let t=T(e,`sessionId`),n=this.getFridaSession(),r=await n.getAvailability();if(!r.available)return w({available:!1,capability:`frida_cli`,fix:`Install frida-tools and ensure the frida CLI is on PATH.`,sessionId:t,reason:r.reason??`Frida CLI is not available`,modules:[{name:`mock-module`,base:`0x0`,size:0,path:`<unavailable>`}]});if(!n.useSession(t))return w({available:!1,capability:`frida_session`,fix:`Call frida_attach first and reuse the returned sessionId.`,sessionId:t,reason:`Unknown Frida session: ${t}`,modules:[]});let i=await n.enumerateModules(),a=n.getSessionDiagnostics(t);return a?.status===`error`&&a.lastError?w({success:!1,available:!0,sessionId:t,reason:a.lastError,modules:i}):w({success:!0,available:!0,sessionId:t,modules:i})}async handleFridaRunScript(e){let t=E(e,`sessionId`);if(!t)return C(`Missing required string argument: sessionId`);let n=T(e,`script`),r=this.getFridaSession(),i=await r.getAvailability();if(!i.available)return{available:!1,capability:`frida_cli`,fix:`Install frida-tools and ensure the frida CLI is on PATH.`,sessionId:t,reason:i.reason??`Frida CLI is not available`,execution:{output:``,error:`Frida unavailable`}};if(!r.useSession(t))return{available:!1,capability:`frida_session`,fix:`Call frida_attach first and reuse the returned sessionId.`,sessionId:t,reason:`Unknown Frida session: ${t}`,execution:{output:``,error:`Unknown session`}};let a=await r.executeScript(n);return a.error?w({success:!1,available:!0,sessionId:t,reason:a.error,execution:a}):w({success:!0,available:!0,sessionId:t,execution:a})}async handleFridaDetach(e){let t=E(e,`sessionId`);if(!t)return C(`Missing required string argument: sessionId`);let n=this.getFridaSession();return(await n.getAvailability()).available&&n.hasSession(t)?(n.useSession(t),await n.detach(),w({success:!0,sessionId:t,detached:!0})):F(this.state.context,`plugin_frida_bridge`,`frida_detach`,e)}async handleFridaListSessions(e){let t=this.getFridaSession(),n=await t.getAvailability(),r=t.listSessions();if(n.available)return w({success:!0,available:!0,sessions:r,count:r.length});let i=P(this.state.context,`plugin_frida_bridge`);return r.length>0||i.status===`unavailable`?w({success:!0,available:!1,capability:`frida_cli`,reason:n.reason??`Frida CLI is not available`,fix:`Install frida-tools and ensure the frida CLI is on PATH.`,sessions:r,count:r.length}):F(this.state.context,`plugin_frida_bridge`,`frida_list_sessions`,e)}async handleFridaGenerateScript(e){let t=E(e,`target`)??`unknown`,n=E(e,`template`)??`trace`,r=E(e,`functionName`)??`target_function`,i=[{functionName:r,hookCode:`console.log('[${n}] ${r} called');`,description:`${n} hook for ${r}`,parameters:[]}];return w({success:!0,target:t,template:n,functionName:r,script:this.state.hookCodeGenerator.exportScript(i,`frida`)})}async handleFridaEnumerateFunctions(e){let t=T(e,`sessionId`),n=T(e,`moduleName`),r=this.getFridaSession(),i=await r.getAvailability();if(!i.available)return{available:!1,capability:`frida_cli`,fix:`Install frida-tools and ensure the frida CLI is on PATH.`,sessionId:t,moduleName:n,reason:i.reason??`Frida CLI is not available`,functions:[]};if(!r.useSession(t))return{available:!1,capability:`frida_session`,fix:`Call frida_attach first and reuse the returned sessionId.`,sessionId:t,reason:`Unknown Frida session: ${t}`,functions:[]};let a=await r.enumerateFunctions(n),o=r.getSessionDiagnostics(t);return o?.status===`error`&&o.lastError?w({success:!1,available:!0,sessionId:t,moduleName:n,reason:o.lastError,functions:a,count:a.length}):w({success:!0,available:!0,sessionId:t,moduleName:n,functions:a,count:a.length})}async handleFridaFindSymbols(e){let t=T(e,`sessionId`),n=T(e,`pattern`),r=this.getFridaSession(),i=await r.getAvailability();if(!i.available)return{available:!1,capability:`frida_cli`,fix:`Install frida-tools and ensure the frida CLI is on PATH.`,sessionId:t,pattern:n,reason:i.reason??`Frida CLI is not available`,symbols:[]};if(!r.useSession(t))return{available:!1,capability:`frida_session`,fix:`Call frida_attach first and reuse the returned sessionId.`,sessionId:t,reason:`Unknown Frida session: ${t}`,symbols:[]};let a=await r.findSymbols(n),o=r.getSessionDiagnostics(t);return o?.status===`error`&&o.lastError?w({success:!1,available:!0,sessionId:t,pattern:n,reason:o.lastError,symbols:a,count:a.length}):w({success:!0,available:!0,sessionId:t,pattern:n,symbols:a,count:a.length})}getFridaSession(){return this.state.fridaSession||(this.state.fridaSession=new r),this.state.fridaSession}},K=class{state;constructor(e){this.state=e}async handleGhidraAnalyze(e){let t=T(e,`binaryPath`),n=D(e,`timeout`),r=this.getGhidraAnalyzer(),i=await r.getAvailability(),a=await r.analyze(t,n===void 0?void 0:{timeout:n});return i.available?{available:!0,binaryPath:t,analysis:a}:{available:!1,capability:`ghidra_headless`,fix:`Install Ghidra and ensure analyzeHeadless is on PATH.`,binaryPath:t,reason:i.reason??`Ghidra analyzeHeadless is not available`,analysis:a}}async handleGhidraDecompile(e){return F(this.state.context,`plugin_ghidra_bridge`,`ghidra_decompile`,e)}async handleIdaDecompile(e){return F(this.state.context,`plugin_ida_bridge`,`ida_decompile`,e)}async handleJadxDecompile(e){let n=T(e,`apkPath`),r=T(e,`className`),i=E(e,`methodName`),a=await t(`jadx`,[`--version`]);return a.available?this.jadxNativeDecompile(a.path??`jadx`,n,r,i):F(this.state.context,`plugin_jadx_bridge`,`jadx_decompile`,e)}async handleApktoolDecode(e){let n=T(e,`apkPath`),r=E(e,`outputDir`),i=O(e,`force`)??!1,a=await t(`apktool`,[`--version`]);if(!a.available)return w({available:!1,capability:`apktool_cli`,fix:`Install apktool and ensure it is on PATH.`,apkPath:n,reason:a.reason??`apktool is not available`});let o=r??f(d(),`jshook-apktool-${Date.now()}`);r&&await h(o,{recursive:!0});try{let e=[`decode`,`--output`,o];i&&e.push(`--force`),e.push(n);let t=await B(a.path??`apktool`,e,12e4);return w({available:!0,apkPath:n,outputDir:o,force:i,stdout:t.stdout.trim(),stderr:t.stderr.trim()})}catch(e){return w({available:!0,apkPath:n,outputDir:o,force:i,error:e instanceof Error?e.message:String(e)})}}async handleApkManifestDump(e){let n=T(e,`apkPath`),r=await this.readZipEntryBuffer(n,`AndroidManifest.xml`);if(!r.success)return w({available:!1,apkPath:n,entry:`AndroidManifest.xml`,error:r.error});let i=this.decodeTextEntry(r.buffer);if(i!==null)return w({available:!0,apkPath:n,entry:`AndroidManifest.xml`,format:`xml`,decodedBy:`zip-entry`,manifest:i});let a=await t(`jadx`,[`--version`]);if(a.available){let e=await this.decodeManifestWithJadx(a.path??`jadx`,n);if(e.success)return w({available:!0,apkPath:n,entry:`AndroidManifest.xml`,format:`xml`,decodedBy:`jadx_cli`,manifest:e.manifest})}return w({available:!0,apkPath:n,entry:`AndroidManifest.xml`,format:`binary-axml`,decodedBy:`zip-entry`,size:r.buffer.length,manifestBase64:r.buffer.toString(`base64`)})}async handleApkNativeLibsList(e){let t=T(e,`apkPath`),n=await this.listZipEntries(t);if(!n.success)return w({available:!1,apkPath:t,error:n.error});let r=n.entries.filter(e=>/^lib\/.+\/[^/]+\.so$/i.test(e)).map(e=>{let t=e.split(`/`);return{path:e,abi:t[1]??``,name:t[t.length-1]??``}});return w({available:!0,apkPath:t,count:r.length,libraries:r})}async handleGenerateHooks(e){let t=E(e,`ghidraOutput`);if(t)return this.handleLegacyGenerateHooks(t);let n=e.ghidraOutput;if(A(n))return this.handleLegacyGenerateHooks(JSON.stringify(n));let r=k(e,`symbols`);if(r.length===0)return C(`symbols or ghidraOutput is required`);let i=I(e,`options`),a=this.getHookGenerator().generateFridaHookScript(r,i);return w({available:!0,symbolCount:r.length,script:a})}async handleExportHookScript(e){let t=E(e,`hookTemplates`);if(!t){let e=this.state.hookCodeGenerator.exportScript([],`frida`);return w({format:`frida`,hookCount:0,script:e.includes(`Java.perform`)?e:`Java.perform(function() {\n${e}\n});`})}try{let e=JSON.parse(t);if(!Array.isArray(e))return C(`Invalid JSON`);let n=H(e),r=this.state.hookCodeGenerator.exportScript(n,`frida`);return w({format:`frida`,hookCount:n.length,script:r})}catch{return C(`Invalid JSON`)}}async handleUnidbgEmulate(t){let n=T(t,`binaryPath`),r=T(t,`functionName`),i=k(t,`args`),a=await z();if(!a.available)return{available:!1,capability:`unidbg_jar`,fix:`Set UNIDBG_JAR to a reachable Unidbg JAR path.`,binaryPath:n,functionName:r,args:i,reason:a.reason,result:{returnValue:`0x0`,stdout:``,stderr:``,trace:[`mock-unidbg-unavailable`]}};let o=await B(a.command,[`-jar`,a.jarPath,n,r,...i],e);return{available:!0,binaryPath:n,functionName:r,args:i,result:{returnValue:`0x0`,stdout:o.stdout.trim(),stderr:o.stderr.trim(),trace:[]}}}async handleUnidbgLaunch(e){let t=E(e,`soPath`);if(!t)return C(`Missing required string argument: soPath`);let n=E(e,`arch`)??`arm`;try{let e=await this.state.unidbgRunner.launch(t,n);return{available:!0,sessionId:e.sessionId,soPath:e.soPath,arch:e.arch,sessions:this.state.unidbgRunner.listSessions()}}catch(e){return{available:!1,capability:`unidbg_jar`,fix:`Set UNIDBG_JAR to a reachable Unidbg JAR path and retry.`,soPath:t,arch:n,reason:e instanceof Error?e.message:String(e),sessions:this.state.unidbgRunner.listSessions()}}}async handleUnidbgCall(e){let t=E(e,`sessionId`);if(!t)return C(`Missing required string argument: sessionId`);let n=E(e,`functionName`);if(!n)return C(`Missing required string argument: functionName`);let r=A(e.args)?e.args:{};try{return w(await this.state.unidbgRunner.callFunction(t,n,r))}catch(e){let t=e instanceof Error?e.message:String(e);return C(t.startsWith(`No unidbg session found`)?`${t} (not found)`:t)}}async handleUnidbgTrace(e){let t=E(e,`sessionId`);if(!t)return C(`Missing required string argument: sessionId`);try{return w(await this.state.unidbgRunner.trace(t))}catch(e){let t=e instanceof Error?e.message:String(e);return C(t.startsWith(`No unidbg session found`)?`${t} (not found)`:t)}}async handleGetAvailablePlugins(e){let t=this.state.context?i(this.state.context):[];return w({plugins:t,count:t.length})}getGhidraAnalyzer(){return this.state.ghidra||(this.state.ghidra=new c),this.state.ghidra}getHookGenerator(){return this.state.hookGen||(this.state.hookGen=new s),this.state.hookGen}handleLegacyGenerateHooks(e){let t;try{t=JSON.parse(e)}catch{return C(`Invalid JSON`)}if(!V(t))return C(`ghidraOutput is required`);let n=this.state.hookCodeGenerator.generateHooks(t);return w({count:n.length,hooks:n})}async listZipEntries(e){try{let t=await this.openZipFile(e);return{success:!0,entries:await new Promise((e,n)=>{let r=[],i=!1,a=e=>{r.push(e.fileName),t.readEntry()},o=()=>c(()=>e(r)),s=e=>c(()=>n(e)),c=e=>{i||(i=!0,t.removeListener(`entry`,a),t.removeListener(`end`,o),t.removeListener(`error`,s),e())};t.on(`entry`,a),t.on(`end`,o),t.on(`error`,s),t.readEntry()})}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async readZipEntryBuffer(e,t){try{let n=await this.openZipFile(e);return{success:!0,buffer:await new Promise((e,r)=>{let i=!1,a=()=>{try{n.close()}catch{}},o=i=>{if(i.fileName!==t){n.readEntry();return}n.openReadStream(i,(n,i)=>{if(n||!i){l(()=>r(n??Error(`Unable to read ZIP entry: ${t}`))),a();return}this.readStreamToBuffer(i).then(t=>{l(()=>e(t)),a()}).catch(e=>{l(()=>r(e)),a()})})},s=()=>l(()=>r(Error(`ZIP entry not found: ${t}`))),c=e=>l(()=>r(e)),l=e=>{i||(i=!0,n.removeListener(`entry`,o),n.removeListener(`end`,s),n.removeListener(`error`,c),e())};n.on(`entry`,o),n.on(`end`,s),n.on(`error`,c),n.readEntry()})}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async jadxNativeDecompile(e,t,n,r){let i=await g(f(d(),`jshook-jadx-`));try{let a=[`--no-res`,`--no-debug-info`,`-d`,i,t];await this.runJadx(e,a);let o=f(i,`sources`),s=await this.resolveDecompiledClassFile(o,n);if(!s.success)return w({available:!0,apkPath:t,className:n,error:`Class file not found after decompilation: ${n}`,suggestions:s.suggestions});let c;try{c=await _(s.classFile,`utf8`)}catch{return w({available:!0,apkPath:t,className:n,...s.resolvedClassName===n?{}:{resolvedClassName:s.resolvedClassName},error:`Class file not found after decompilation: ${n}`})}if(r){let e=this.extractMethodSource(c,r);return w(e?{available:!0,apkPath:t,className:n,...s.resolvedClassName===n?{}:{resolvedClassName:s.resolvedClassName},methodName:r,source:e}:{available:!0,apkPath:t,className:n,...s.resolvedClassName===n?{}:{resolvedClassName:s.resolvedClassName},methodName:r,source:``,error:`Method ${r} not found in ${n}`})}return w({available:!0,apkPath:t,className:n,...s.resolvedClassName===n?{}:{resolvedClassName:s.resolvedClassName},source:c})}catch(e){return w({available:!0,apkPath:t,className:n,error:e instanceof Error?e.message:String(e)})}finally{await y(i,{recursive:!0,force:!0})}}openZipFile(e){return new Promise((t,n)=>{x(e,{autoClose:!0,lazyEntries:!0,decodeStrings:!0,validateEntrySizes:!0,strictFileNames:!1},(r,i)=>{if(r||!i){n(r??Error(`Unable to open ZIP archive: ${e}`));return}t(i)})})}readStreamToBuffer(e){return new Promise((t,n)=>{let r=[];e.on(`data`,e=>{r.push(Buffer.isBuffer(e)?e:Buffer.from(e))}),e.on(`end`,()=>t(Buffer.concat(r))),e.on(`error`,n)})}decodeTextEntry(e){if(e.length===0)return``;let t=e.subarray(0,Math.min(e.length,1024)),n=0;for(let e of t){if(e===0)return null;(e<9||e>13&&e<32)&&(n+=1)}if(n>t.length*.1)return null;let r=e.toString(`utf8`);return r.trimStart().startsWith(`<`)?r:null}async decodeManifestWithJadx(e,t){let n=await g(f(d(),`jshook-jadx-manifest-`));try{await this.runJadx(e,[`--no-src`,`-d`,n,t]);let r=await _(f(n,`resources`,`AndroidManifest.xml`),`utf8`);return r.trimStart().startsWith(`<`)?{success:!0,manifest:r}:{success:!1,error:`Decoded manifest is not XML`}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}finally{await y(n,{recursive:!0,force:!0})}}async runJadx(e,t){await new Promise((n,r)=>{b(e,t,{encoding:`utf8`,windowsHide:!0,timeout:12e4},e=>{if(e&&e.code!==1){r(e);return}n()})})}async resolveDecompiledClassFile(e,t){let n=this.buildExpectedClassFile(e,t);try{return await _(n,`utf8`),{success:!0,classFile:n,resolvedClassName:t}}catch{}let r=await this.findClassCandidates(e,t);if(r.length===0)return{success:!1,suggestions:[]};if(r.length===1){let e=r[0];return e?{success:!0,classFile:e.classFile,resolvedClassName:e.className}:{success:!1,suggestions:[]}}let i=r[0],a=r[1];return!i||!a?{success:!1,suggestions:r.slice(0,10).map(e=>e.className)}:i.score>a.score?{success:!0,classFile:i.classFile,resolvedClassName:i.className}:{success:!1,suggestions:r.slice(0,10).map(e=>e.className)}}buildExpectedClassFile(e,t){let n=t.split(`.`),r=(n[n.length-1]??``).split(`$`)[0]??``;return f(e,...n.slice(0,-1),`${r}.java`)}async findClassCandidates(e,t){let n=t.split(`.`),r=(n[n.length-1]??``).split(`$`)[0]??``,i=n.slice(0,-1),a=`${r}.java`,o=[],s=async t=>{let n=await v(t,{withFileTypes:!0});for(let r of n){let n=f(t,r.name);if(r.isDirectory()){await s(n);continue}if(!r.isFile()||r.name!==a)continue;let c=p(e,n).replace(/\\/g,`/`).replace(/\.java$/i,``).split(`/`).join(`.`),l=c.split(`.`).slice(0,-1);o.push({className:c,classFile:n,score:this.scoreClassCandidate(i,l)})}};return await s(e),o.toSorted((e,t)=>t.score-e.score||e.className.localeCompare(t.className))}scoreClassCandidate(e,t){let n=0,r=Math.min(e.length,t.length);for(;n<r&&e[n]===t[n];)n+=1;let i=0,a=Math.min(e.length,t.length);for(;i<a&&e[e.length-1-i]===t[t.length-1-i];)i+=1;return n*10+i}extractMethodSource(e,t){let n=RegExp(`(?:public|private|protected|static|final|abstract|synchronized|native)\\s+[\\w<>\\[\\]]+\\s+${t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}\\s*\\([^)]*\\)\\s*(?:throws[^{]*)?\\{`),r=e.search(n);if(r===-1)return null;let i=0,a=e.indexOf(`{`,r);for(;a<e.length;a++)if(e[a]===`{`)i+=1;else if(e[a]===`}`&&(--i,i===0))break;return e.slice(r,a+1)}},q=class{state;constructor(e){this.state=e}async handleBinaryInstrumentCapabilities(){let[e,n,r,i,a]=await Promise.all([this.getFridaSession().getAvailability(),this.getGhidraAnalyzer().getAvailability(),t(`jadx`,[`--version`]),t(`apktool`,[`--version`]),z()]);return w(l(`binary_instrument_capabilities`,[{capability:`frida_cli`,status:e.available?`available`:`unavailable`,reason:e.reason,fix:e.available?void 0:`Install frida-tools and ensure the frida CLI is on PATH.`,details:{tools:[`frida_attach`,`frida_enumerate_modules`,`frida_run_script`,`frida_enumerate_functions`,`frida_find_symbols`],...e.path?{path:e.path}:{},...e.version?{version:e.version}:{}}},{capability:`plugin_frida_bridge`,...P(this.state.context,`plugin_frida_bridge`),details:{tools:[`frida_attach`,`frida_detach`,`frida_list_sessions`]}},{capability:`ghidra_headless`,status:n.available?`available`:`unavailable`,reason:n.reason,fix:n.available?void 0:`Install Ghidra and ensure analyzeHeadless is on PATH.`,details:{tools:[`ghidra_analyze`],...n.path?{path:n.path}:{},...n.version?{version:n.version}:{}}},{capability:`plugin_ghidra_bridge`,...P(this.state.context,`plugin_ghidra_bridge`),details:{tools:[`ghidra_decompile`]}},{capability:`plugin_ida_bridge`,...P(this.state.context,`plugin_ida_bridge`),details:{tools:[`ida_decompile`]}},{capability:`jadx_cli`,status:r.available?`available`:`unavailable`,reason:r.reason,fix:r.available?void 0:`Install JADX and ensure the jadx CLI is on PATH.`,details:{tools:[`jadx_decompile`],...r.path?{path:r.path}:{},...r.version?{version:r.version}:{}}},{capability:`plugin_jadx_bridge`,...P(this.state.context,`plugin_jadx_bridge`),details:{tools:[`jadx_decompile`]}},{capability:`apktool_cli`,status:i.available?`available`:`unavailable`,reason:i.reason,fix:i.available?void 0:`Install apktool and ensure it is on PATH.`,details:{tools:[`apktool_decode`],...i.path?{path:i.path}:{},...i.version?{version:i.version}:{}}},{capability:`unidbg_jar`,status:a.available?`available`:`unavailable`,reason:a.reason||void 0,fix:a.available?void 0:`Set UNIDBG_JAR to a reachable Unidbg JAR path.`,details:{tools:[`unidbg_emulate`,`unidbg_launch`,`unidbg_call`,`unidbg_trace`],command:a.command,jarPath:a.jarPath}}]))}getFridaSession(){return this.state.fridaSession||(this.state.fridaSession=new r),this.state.fridaSession}getGhidraAnalyzer(){return this.state.ghidra||(this.state.ghidra=new c),this.state.ghidra}},J=class{state;frida;analysis;capabilities;constructor(e,t,n){this.state={hookCodeGenerator:new o,unidbgRunner:new a},e instanceof r?this.state.fridaSession=e:j(e)&&(this.state.context=e),t&&(this.state.ghidra=t),n&&(this.state.hookGen=n),this.frida=new G(this.state),this.analysis=new K(this.state),this.capabilities=new q(this.state)}handleBinaryInstrumentCapabilities(){return this.capabilities.handleBinaryInstrumentCapabilities()}handleFridaAttach(e){return this.frida.handleFridaAttach(e)}handleFridaEnumerateModules(e){return this.frida.handleFridaEnumerateModules(e)}handleFridaRunScript(e){return this.frida.handleFridaRunScript(e)}handleFridaDetach(e){return this.frida.handleFridaDetach(e)}handleFridaListSessions(e){return this.frida.handleFridaListSessions(e)}handleFridaGenerateScript(e){return this.frida.handleFridaGenerateScript(e)}handleFridaEnumerateFunctions(e){return this.frida.handleFridaEnumerateFunctions(e)}handleFridaFindSymbols(e){return this.frida.handleFridaFindSymbols(e)}handleGhidraAnalyze(e){return this.analysis.handleGhidraAnalyze(e)}handleGhidraDecompile(e){return this.analysis.handleGhidraDecompile(e)}handleIdaDecompile(e){return this.analysis.handleIdaDecompile(e)}handleJadxDecompile(e){return this.analysis.handleJadxDecompile(e)}handleApktoolDecode(e){return this.analysis.handleApktoolDecode(e)}handleApkManifestDump(e){return this.analysis.handleApkManifestDump(e)}handleApkNativeLibsList(e){return this.analysis.handleApkNativeLibsList(e)}handleGenerateHooks(e){return this.analysis.handleGenerateHooks(e)}handleExportHookScript(e){return this.analysis.handleExportHookScript(e)}handleUnidbgEmulate(e){return this.analysis.handleUnidbgEmulate(e)}handleUnidbgLaunch(e){return this.analysis.handleUnidbgLaunch(e)}handleUnidbgCall(e){return this.analysis.handleUnidbgCall(e)}handleUnidbgTrace(e){return this.analysis.handleUnidbgTrace(e)}handleGetAvailablePlugins(e){return this.analysis.handleGetAvailablePlugins(e)}};export{J as BinaryInstrumentHandlers};
@@ -1,302 +0,0 @@
1
- import{Hn as e,Un as t,Wn as n}from"./constants-BYj8Xek8.mjs";import{randomUUID as r}from"node:crypto";const i=e,a=n*1024*1024;let o=null;function s(){return o||=import(`quickjs-emscripten`).then(e=>e.getQuickJS()),o}function c(e,t){if(t==null)return e.undefined;switch(typeof t){case`string`:return e.newString(t);case`number`:return e.newNumber(t);case`boolean`:return t?e.true:e.false;case`object`:{if(Array.isArray(t)){let n=e.newArray();for(let r=0;r<t.length;r++){let i=c(e,t[r]);e.setProp(n,r,i),i.dispose()}return n}let n=e.newObject();for(let[r,i]of Object.entries(t)){let t=c(e,i);e.setProp(n,r,t),t.dispose()}return n}default:return e.newString(String(t))}}function l(e,t){switch(e.typeof(t)){case`undefined`:return;case`number`:return e.getNumber(t);case`string`:return e.getString(t);case`boolean`:return e.dump(t);case`object`:return e.dump(t);default:return e.dump(t)}}var u=class{bridge=null;setBridge(e){this.bridge=e}async execute(e,t={}){let n=t.timeoutMs??i,r=t.memoryLimitBytes??a,o=(await s()).newRuntime();o.setMemoryLimit(r);let c=Date.now(),u=!1;o.setInterruptHandler(()=>Date.now()-c>n?(u=!0,!0):!1);let d=o.newContext(),f=[];try{this.injectConsole(d,f),this.injectHelpers(d),this.bridge&&this.injectBridge(d,this.bridge,f),t.globals&&this.injectGlobals(d,t.globals);let n=d.evalCode(e,`sandbox-eval.js`);if(n.error){let e=d.dump(n.error);return n.error.dispose(),u?{ok:!1,error:`Execution timed out`,timedOut:!0,durationMs:Date.now()-c,logs:f}:{ok:!1,error:typeof e==`object`?JSON.stringify(e):String(e),timedOut:!1,durationMs:Date.now()-c,logs:f}}let r=l(d,n.value);return n.value.dispose(),{ok:!0,output:r,timedOut:!1,durationMs:Date.now()-c,logs:f}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e),timedOut:u,durationMs:Date.now()-c,logs:f}}finally{d.dispose(),o.dispose()}}async executeWithOrchestration(e,t,n={}){let r=n.maxBridgeCalls??10,i=Date.now(),a=[],o=[];n.bridgeAllowlist&&t.setAllowlist(n.bridgeAllowlist);let s={},c,l=0;for(;l<=r;){let r={...n.globals,__bridgeRound:l};l>0&&(r.__bridgeResults=s);let u=await this.executeOneRound(e,t,{...n,globals:r});if(a.push(...u.logs),!u.ok||u.timedOut)return{...u,logs:a,durationMs:Date.now()-i,bridgeCallCount:o.length,bridgeCalls:o};if(c=u.output,!t.hasPending())break;let d=t.drainPending(),f={};for(let e of d)try{let n=await t.call(e.toolName,e.args);f[e.id]=n,o.push({toolName:e.toolName,args:e.args,result:n})}catch(t){let n=t instanceof Error?t.message:String(t);f[e.id]={__error:!0,message:n},o.push({toolName:e.toolName,args:e.args,result:{__error:!0,message:n}})}s={...s,...f},l++}return{ok:!0,output:c,timedOut:!1,durationMs:Date.now()-i,logs:a,bridgeCallCount:o.length,bridgeCalls:o}}async executeOneRound(e,t,n={}){let r=n.timeoutMs??i,o=n.memoryLimitBytes??a,c=(await s()).newRuntime();c.setMemoryLimit(o);let u=Date.now(),d=!1;c.setInterruptHandler(()=>Date.now()-u>r?(d=!0,!0):!1);let f=c.newContext(),p=[];try{this.injectConsole(f,p),this.injectHelpers(f),this.injectBridgeForOrchestration(f,t,p),n.globals&&this.injectGlobals(f,n.globals);let r=f.evalCode(e,`sandbox-eval.js`);if(r.error){let e=f.dump(r.error);return r.error.dispose(),d?{ok:!1,error:`Execution timed out`,timedOut:!0,durationMs:Date.now()-u,logs:p}:{ok:!1,error:typeof e==`object`?JSON.stringify(e):String(e),timedOut:!1,durationMs:Date.now()-u,logs:p}}let i=l(f,r.value);return r.value.dispose(),{ok:!0,output:i,timedOut:!1,durationMs:Date.now()-u,logs:p}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e),timedOut:d,durationMs:Date.now()-u,logs:p}}finally{f.dispose(),c.dispose()}}injectConsole(e,t){let n=e.newObject(),r=e.newFunction(`log`,(...n)=>{let r=n.map(t=>{let n=l(e,t);return typeof n==`string`?n:JSON.stringify(n)});t.push(r.join(` `))});e.setProp(n,`log`,r),e.setProp(n,`warn`,r),e.setProp(n,`error`,r),e.setProp(e.global,`console`,n),r.dispose(),n.dispose()}injectGlobals(e,t){for(let[n,r]of Object.entries(t)){let t=c(e,r);e.setProp(e.global,n,t),t.dispose()}}injectHelpers(e){let t=e.evalCode(`
2
- (function() {
3
- var helpers = {};
4
-
5
- // ── base64 ──
6
- helpers.base64 = {
7
- _chars: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
8
- encode: function(str) {
9
- var output = '';
10
- var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
11
- var i = 0;
12
- while (i < str.length) {
13
- chr1 = str.charCodeAt(i++);
14
- chr2 = str.charCodeAt(i++);
15
- chr3 = str.charCodeAt(i++);
16
- enc1 = chr1 >> 2;
17
- enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
18
- enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
19
- enc4 = chr3 & 63;
20
- if (isNaN(chr2)) { enc3 = enc4 = 64; }
21
- else if (isNaN(chr3)) { enc4 = 64; }
22
- output += this._chars.charAt(enc1) + this._chars.charAt(enc2) +
23
- this._chars.charAt(enc3) + this._chars.charAt(enc4);
24
- }
25
- return output;
26
- },
27
- decode: function(str) {
28
- var output = '';
29
- var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
30
- var i = 0;
31
- str = str.replace(/[^A-Za-z0-9+/=]/g, '');
32
- while (i < str.length) {
33
- enc1 = this._chars.indexOf(str.charAt(i++));
34
- enc2 = this._chars.indexOf(str.charAt(i++));
35
- enc3 = this._chars.indexOf(str.charAt(i++));
36
- enc4 = this._chars.indexOf(str.charAt(i++));
37
- chr1 = (enc1 << 2) | (enc2 >> 4);
38
- chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
39
- chr3 = ((enc3 & 3) << 6) | enc4;
40
- output += String.fromCharCode(chr1);
41
- if (enc3 !== 64) output += String.fromCharCode(chr2);
42
- if (enc4 !== 64) output += String.fromCharCode(chr3);
43
- }
44
- return output;
45
- }
46
- };
47
-
48
- // ── hex ──
49
- helpers.hex = {
50
- encode: function(str) {
51
- var hex = '';
52
- for (var i = 0; i < str.length; i++) {
53
- hex += ('0' + str.charCodeAt(i).toString(16)).slice(-2);
54
- }
55
- return hex;
56
- },
57
- decode: function(hex) {
58
- var str = '';
59
- for (var i = 0; i < hex.length; i += 2) {
60
- str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
61
- }
62
- return str;
63
- }
64
- };
65
-
66
- // ── hash (simple djb2/fnv for in-sandbox use; NOT cryptographic!) ──
67
- helpers.hash = {
68
- djb2: function(str) {
69
- var hash = 5381;
70
- for (var i = 0; i < str.length; i++) {
71
- hash = ((hash << 5) + hash) + str.charCodeAt(i);
72
- hash = hash & hash; // Convert to 32-bit
73
- }
74
- return (hash >>> 0).toString(16);
75
- },
76
- fnv1a: function(str) {
77
- var hash = 0x811c9dc5;
78
- for (var i = 0; i < str.length; i++) {
79
- hash ^= str.charCodeAt(i);
80
- hash = Math.imul(hash, 0x01000193);
81
- }
82
- return (hash >>> 0).toString(16);
83
- },
84
- /** Simple MD5 — pure JS implementation */
85
- md5: function(str) {
86
- // Lightweight MD5 for sandbox use
87
- function md5cycle(x, k) {
88
- var a = x[0], b = x[1], c = x[2], d = x[3];
89
- a = ff(a,b,c,d,k[0],7,0xd76aa478);
90
- d=ff(d,a,b,c,k[1],12,0xe8c7b756);
91
- c=ff(c,d,a,b,k[2],17,0x242070db);
92
- b=ff(b,c,d,a,k[3],22,0xc1bdceee);
93
- a=ff(a,b,c,d,k[4],7,0xf57c0faf);
94
- d=ff(d,a,b,c,k[5],12,0x4787c62a);
95
- c=ff(c,d,a,b,k[6],17,0xa8304613);
96
- b=ff(b,c,d,a,k[7],22,0xfd469501);
97
- a=ff(a,b,c,d,k[8],7,0x698098d8);
98
- d=ff(d,a,b,c,k[9],12,0x8b44f7af);
99
- c=ff(c,d,a,b,k[10],17,0xffff5bb1);
100
- b=ff(b,c,d,a,k[11],22,0x895cd7be);
101
- a=ff(a,b,c,d,k[12],7,0x6b901122);
102
- d=ff(d,a,b,c,k[13],12,0xfd987193);
103
- c=ff(c,d,a,b,k[14],17,0xa679438e);
104
- b=ff(b,c,d,a,k[15],22,0x49b40821);
105
- a=gg(a,b,c,d,k[1],5,0xf61e2562);
106
- d=gg(d,a,b,c,k[6],9,0xc040b340);
107
- c=gg(c,d,a,b,k[11],14,0x265e5a51);
108
- b=gg(b,c,d,a,k[0],20,0xe9b6c7aa);
109
- a=gg(a,b,c,d,k[5],5,0xd62f105d);
110
- d=gg(d,a,b,c,k[10],9,0x02441453);
111
- c=gg(c,d,a,b,k[15],14,0xd8a1e681);
112
- b=gg(b,c,d,a,k[4],20,0xe7d3fbc8);
113
- a=gg(a,b,c,d,k[9],5,0x21e1cde6);
114
- d=gg(d,a,b,c,k[14],9,0xc33707d6);
115
- c=gg(c,d,a,b,k[3],14,0xf4d50d87);
116
- b=gg(b,c,d,a,k[8],20,0x455a14ed);
117
- a=gg(a,b,c,d,k[13],5,0xa9e3e905);
118
- d=gg(d,a,b,c,k[2],9,0xfcefa3f8);
119
- c=gg(c,d,a,b,k[7],14,0x676f02d9);
120
- b=gg(b,c,d,a,k[12],20,0x8d2a4c8a);
121
- a=hh(a,b,c,d,k[5],4,0xfffa3942);
122
- d=hh(d,a,b,c,k[8],11,0x8771f681);
123
- c=hh(c,d,a,b,k[11],16,0x6d9d6122);
124
- b=hh(b,c,d,a,k[14],23,0xfde5380c);
125
- a=hh(a,b,c,d,k[1],4,0xa4beea44);
126
- d=hh(d,a,b,c,k[4],11,0x4bdecfa9);
127
- c=hh(c,d,a,b,k[7],16,0xf6bb4b60);
128
- b=hh(b,c,d,a,k[10],23,0xbebfbc70);
129
- a=hh(a,b,c,d,k[13],4,0x289b7ec6);
130
- d=hh(d,a,b,c,k[0],11,0xeaa127fa);
131
- c=hh(c,d,a,b,k[3],16,0xd4ef3085);
132
- b=hh(b,c,d,a,k[6],23,0x04881d05);
133
- a=hh(a,b,c,d,k[9],4,0xd9d4d039);
134
- d=hh(d,a,b,c,k[12],11,0xe6db99e5);
135
- c=hh(c,d,a,b,k[15],16,0x1fa27cf8);
136
- b=hh(b,c,d,a,k[2],23,0xc4ac5665);
137
- a=ii(a,b,c,d,k[0],6,0xf4292244);
138
- d=ii(d,a,b,c,k[7],10,0x432aff97);
139
- c=ii(c,d,a,b,k[14],15,0xab9423a7);
140
- b=ii(b,c,d,a,k[5],21,0xfc93a039);
141
- a=ii(a,b,c,d,k[12],6,0x655b59c3);
142
- d=ii(d,a,b,c,k[3],10,0x8f0ccc92);
143
- c=ii(c,d,a,b,k[10],15,0xffeff47d);
144
- b=ii(b,c,d,a,k[1],21,0x85845dd1);
145
- a=ii(a,b,c,d,k[8],6,0x6fa87e4f);
146
- d=ii(d,a,b,c,k[15],10,0xfe2ce6e0);
147
- c=ii(c,d,a,b,k[6],15,0xa3014314);
148
- b=ii(b,c,d,a,k[13],21,0x4e0811a1);
149
- a=ii(a,b,c,d,k[4],6,0xf7537e82);
150
- d=ii(d,a,b,c,k[11],10,0xbd3af235);
151
- c=ii(c,d,a,b,k[2],15,0x2ad7d2bb);
152
- b=ii(b,c,d,a,k[9],21,0xeb86d391);
153
- x[0]=add32(a,x[0]);x[1]=add32(b,x[1]);x[2]=add32(c,x[2]);x[3]=add32(d,x[3]);
154
- }
155
- function cmn(q,a,b,x,s,t){a=add32(add32(a,q),add32(x,t));return add32((a<<s)|(a>>>(32-s)),b)}
156
- function ff(a,b,c,d,x,s,t){return cmn((b&c)|((~b)&d),a,b,x,s,t)}
157
- function gg(a,b,c,d,x,s,t){return cmn((b&d)|(c&(~d)),a,b,x,s,t)}
158
- function hh(a,b,c,d,x,s,t){return cmn(b^c^d,a,b,x,s,t)}
159
- function ii(a,b,c,d,x,s,t){return cmn(c^(b|(~d)),a,b,x,s,t)}
160
- function add32(a,b){return(a+b)&0xFFFFFFFF}
161
-
162
- var n = str.length;
163
- var state = [1732584193,-271733879,-1732584194,271733878];
164
- var tail = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
165
- var i;
166
- for (i = 64; i <= n; i += 64) {
167
- var blk = [];
168
- for (var j = i - 64; j < i; j += 4) {
169
- blk.push(str.charCodeAt(j)|(str.charCodeAt(j+1)<<8)|(str.charCodeAt(j+2)<<16)|(str.charCodeAt(j+3)<<24));
170
- }
171
- md5cycle(state, blk);
172
- }
173
- for (var j = 0; j < 16; j++) tail[j] = 0;
174
- for (i = i - 64; i < n; i++) {
175
- tail[i>>2] |= str.charCodeAt(i) << ((i%4)<<3);
176
- }
177
- tail[i>>2] |= 0x80 << ((i%4)<<3);
178
- if (i > 55) { md5cycle(state, tail); for (j = 0; j < 16; j++) tail[j] = 0; }
179
- tail[14] = n * 8;
180
- md5cycle(state, tail);
181
-
182
- var hex_chr = '0123456789abcdef';
183
- var s = '';
184
- for (i = 0; i < 4; i++) {
185
- for (j = 0; j < 4; j++) {
186
- s += hex_chr.charAt((state[i] >> (j*8+4)) & 0x0F) + hex_chr.charAt((state[i] >> (j*8)) & 0x0F);
187
- }
188
- }
189
- return s;
190
- },
191
- sha256: function(str) {
192
- // Minimal pure-JS SHA-256
193
- var K = [0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
194
- 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
195
- 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
196
- 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
197
- 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
198
- 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
199
- 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
200
- 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2];
201
- function rr(x,n){return(x>>>n)|(x<<(32-n))}
202
- var H=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19];
203
- var msg=[];
204
- for(var i=0;i<str.length;i++)msg.push(str.charCodeAt(i));
205
- msg.push(0x80);
206
- var l=msg.length;
207
- while(l%64!==56){msg.push(0);l++;}
208
- var bits=str.length*8;
209
- for(i=7;i>=0;i--)msg.push((bits>>>(i*8))&0xff);
210
- for(var offset=0;offset<msg.length;offset+=64){
211
- var W=[];
212
- for(i=0;i<16;i++)W[i]=(msg[offset+i*4]<<24)|(msg[offset+i*4+1]<<16)|(msg[offset+i*4+2]<<8)|msg[offset+i*4+3];
213
- for(i=16;i<64;i++){
214
- var s0=rr(W[i-15],7)^rr(W[i-15],18)^(W[i-15]>>>3);
215
- var s1=rr(W[i-2],17)^rr(W[i-2],19)^(W[i-2]>>>10);
216
- W[i]=(W[i-16]+s0+W[i-7]+s1)|0;
217
- }
218
- var a=H[0],b=H[1],c=H[2],d=H[3],e=H[4],f=H[5],g=H[6],h=H[7];
219
- for(i=0;i<64;i++){
220
- var S1=rr(e,6)^rr(e,11)^rr(e,25);
221
- var ch=(e&f)^((~e)&g);
222
- var t1=(h+S1+ch+K[i]+W[i])|0;
223
- var S0=rr(a,2)^rr(a,13)^rr(a,22);
224
- var maj=(a&b)^(a&c)^(b&c);
225
- var t2=(S0+maj)|0;
226
- h=g;g=f;f=e;e=(d+t1)|0;d=c;c=b;b=a;a=(t1+t2)|0;
227
- }
228
- H[0]=(H[0]+a)|0;H[1]=(H[1]+b)|0;H[2]=(H[2]+c)|0;H[3]=(H[3]+d)|0;
229
- H[4]=(H[4]+e)|0;H[5]=(H[5]+f)|0;H[6]=(H[6]+g)|0;H[7]=(H[7]+h)|0;
230
- }
231
- var hex='';
232
- for(i=0;i<8;i++)for(var j=7;j>=0;j--)hex+='0123456789abcdef'.charAt((H[i]>>>(j*4))&0xf);
233
- return hex;
234
- }
235
- };
236
-
237
- // ── json ──
238
- helpers.json = {
239
- safeParse: function(str) {
240
- try { return { ok: true, value: JSON.parse(str) }; }
241
- catch(e) { return { ok: false, error: e.message }; }
242
- }
243
- };
244
-
245
- // ── array ──
246
- helpers.array = {
247
- chunk: function(arr, size) {
248
- var result = [];
249
- for (var i = 0; i < arr.length; i += size) {
250
- result.push(arr.slice(i, i + size));
251
- }
252
- return result;
253
- },
254
- flatten: function(arr) {
255
- var result = [];
256
- for (var i = 0; i < arr.length; i++) {
257
- if (Array.isArray(arr[i])) {
258
- result = result.concat(this.flatten(arr[i]));
259
- } else {
260
- result.push(arr[i]);
261
- }
262
- }
263
- return result;
264
- },
265
- unique: function(arr) {
266
- var seen = {};
267
- var result = [];
268
- for (var i = 0; i < arr.length; i++) {
269
- var key = JSON.stringify(arr[i]);
270
- if (!seen[key]) {
271
- seen[key] = true;
272
- result.push(arr[i]);
273
- }
274
- }
275
- return result;
276
- }
277
- };
278
-
279
- // ── string ──
280
- helpers.string = {
281
- camelCase: function(s) {
282
- return s.replace(/[-_\\s]+(\\w)/g, function(_, c) { return c.toUpperCase(); })
283
- .replace(/^\\w/, function(c) { return c.toLowerCase(); });
284
- },
285
- snakeCase: function(s) {
286
- return s.replace(/([A-Z])/g, '_$1').toLowerCase()
287
- .replace(/[-\\s]+/g, '_')
288
- .replace(/^_/, '');
289
- },
290
- truncate: function(s, len) {
291
- if (s.length <= len) return s;
292
- return s.slice(0, len - 3) + '...';
293
- }
294
- };
295
-
296
- // Expose to global scope
297
- globalThis.helpers = helpers;
298
- })();
299
- `,`sandbox-helpers.js`);t.error?(e.dump(t.error),t.error.dispose()):t.value.dispose()}injectBridge(e,t,n){let r=e.newObject(),i=e.newFunction(`call`,(t,r)=>{let i=e.getString(t),a=e.dump(r)??{};return n.push(`[mcp.call] ${i}(${JSON.stringify(a)})`),c(e,{pending:!0,tool:i})}),a=e.newFunction(`listTools`,()=>c(e,t.listAvailableTools()));e.setProp(r,`call`,i),e.setProp(r,`listTools`,a),e.setProp(e.global,`mcp`,r),i.dispose(),a.dispose(),r.dispose()}injectBridgeForOrchestration(e,t,n){let r=e.newObject(),i=e.newFunction(`call`,(r,i)=>{let a=e.getString(r),o=e.dump(i)??{};try{let r=t.enqueue(a,o);return n.push(`[mcp.call] enqueued ${a}(${JSON.stringify(o)}) → ${r}`),c(e,{__bridgeCall:!0,callId:r})}catch(t){let r=t instanceof Error?t.message:String(t);return n.push(`[mcp.call] rejected ${a}: ${r}`),c(e,{__bridgeCall:!1,error:r})}}),a=e.newFunction(`listTools`,()=>c(e,t.listAvailableTools()));e.setProp(r,`call`,i),e.setProp(r,`listTools`,a),e.setProp(e.global,`mcp`,r),i.dispose(),a.dispose(),r.dispose()}},d=class{ctx;allowlist=null;pendingCalls=[];constructor(e){this.ctx=e}setAllowlist(e){this.allowlist=e?new Set(e):null}enqueue(e,t={}){if(!(this.ctx.selectedTools?.map(e=>e.name)??[]).includes(e))throw Error(`Tool "${e}" is not a registered MCP tool`);if(this.allowlist&&!this.allowlist.has(e))throw Error(`Tool "${e}" is not in the sandbox allowlist`);let n=r().slice(0,8);return this.pendingCalls.push({id:n,toolName:e,args:t}),n}drainPending(){let e=[...this.pendingCalls];return this.pendingCalls.length=0,e}hasPending(){return this.pendingCalls.length>0}async call(e,t={}){if(this.allowlist&&!this.allowlist.has(e))throw Error(`Tool "${e}" is not in the sandbox allowlist`);if(!this.listAvailableTools().includes(e))throw Error(`Tool "${e}" is not a registered MCP tool`);let n=await this.ctx.executeToolWithTracking(e,t);if(n.content&&Array.isArray(n.content)){let e=[];for(let t of n.content)t.type===`text`&&e.push(t.text);let t=e.join(`
300
- `);try{return JSON.parse(t)}catch{return t}}return n}listAvailableTools(){let e=this.ctx.selectedTools.map(e=>e.name);return this.allowlist?e.filter(e=>this.allowlist.has(e)):e}},f=class{store=new Map;set(e,t,n){let r=this.store.get(e);r||(r=new Map,this.store.set(e,r)),r.set(t,JSON.stringify(n))}get(e,t){let n=this.store.get(e);if(!n)return;let r=n.get(t);if(r!==void 0)try{return JSON.parse(r)}catch{return r}}getAll(e){let t=this.store.get(e);if(!t)return{};let n={};for(let[e,r]of t)try{n[e]=JSON.parse(r)}catch{n[e]=r}return n}keys(e){let t=this.store.get(e);return t?Array.from(t.keys()):[]}clear(e){this.store.delete(e)}clearAll(){this.store.clear()}};async function p(e,t,n={},r=2){let i=null,a=t;for(let o=0;o<=r;o++){if(i=await e.execute(a,n),i.ok||i.timedOut)return{...i,retryCount:o};o<r&&(a=`/* Previous error (attempt ${o+1}): ${i.error??`unknown error`} */\n${t}`)}return{...i,retryCount:r}}var m=class{ctx;scratchpad=new f;constructor(e){this.ctx=e}async handleExecuteSandboxScript(e){let n=e.code,r=e.sessionId??void 0,i=e.timeoutMs??void 0,a=e.autoCorrect??!1;if(!n||typeof n!=`string`)return{content:[{type:`text`,text:JSON.stringify({ok:!1,error:`code parameter is required`})}]};let o=new u,s=new d(this.ctx);o.setBridge(s);let c={};if(i!==void 0){let e=t;c.timeoutMs=Math.min(Math.max(1,Number.isFinite(i)?i:0),e)}if(r){c.sessionId=r;let e=this.scratchpad.getAll(r);c.globals={...c.globals,__scratchpad:e}}let l;if(l=a?await p(o,n,c):await o.execute(n,c),r&&l.ok&&l.output&&typeof l.output==`object`){let e=l.output;if(e.__scratchpad&&typeof e.__scratchpad==`object`)for(let[t,n]of Object.entries(e.__scratchpad))this.scratchpad.set(r,t,n)}return{content:[{type:`text`,text:[`**Status:** ${l.ok?`✓ Success`:`✗ Failed`}`,l.timedOut?`**Timed out:** yes`:``,`**Duration:** ${l.durationMs}ms`,l.logs.length>0?`**Console output:**\n\`\`\`\n${l.logs.join(`
301
- `)}\n\`\`\``:``,l.output===void 0?``:`**Result:** ${JSON.stringify(l.output)}`,l.error?`**Error:** ${l.error}`:``].filter(Boolean).join(`
302
- `)}]}}};export{m as SandboxToolHandlers};
@@ -1,5 +0,0 @@
1
- import{t as e}from"./ToolError-DWU_z7gp.mjs";import{o as t,r as n,s as r,t as i}from"./parse-args-Bw413PlW.mjs";import{n as a}from"./ResponseBuilder-BfWP-uaT.mjs";import"./definitions-DP1vgxEY.mjs";import{promises as o}from"node:fs";import{posix as s,resolve as c,sep as l}from"node:path";import{execFile as u,spawn as d}from"node:child_process";import{promisify as f}from"node:util";const p=(e,t)=>{let n=process.env[e];if(n===void 0||n===``)return t;let r=parseInt(n,10);return Number.isFinite(r)?r:t},m=(e,t)=>process.env[e]||t,h=p(`JADX_SEARCH_MAX_RESULTS`,500),g=p(`JADX_SEARCH_DEFAULT_CONTEXT_LINES`,2),_=p(`JADX_SEARCH_MAX_CONTEXT_LINES`,20),v=p(`JADX_SEARCH_MAX_MATCHES_PER_FILE`,100),y=p(`JADX_SEARCH_TIMEOUT_MS`,6e4),b=p(`JADX_SEARCH_REGEX_TIMEOUT_MS`,50),x=p(`JADX_SEARCH_MAX_QUERY_LENGTH`,1024),S=p(`JADX_SEARCH_FALLBACK_FILE_LIMIT`,5e4),C=p(`JADX_SEARCH_RG_MAX_BUFFER_BYTES`,128*1024*1024),w=m(`JADX_SEARCH_DEFAULT_GLOBS`,`**/*.java,**/*.kt`).split(`,`),T=p(`JADX_SEARCH_MAX_LINE_BYTES`,64*1024),E=Object.freeze([/\([^()]*[+*][^()]*\)[+*]/,/\([^()]*\|[^()]*\)[+*][^()]*[+*]/]);function D(e){return e.replace(/[\\^$.*+?()[\]{}|]/g,`\\$&`)}function O(t,n,r){let i=n?D(t):t;if(!n){for(let n of E)if(n.test(i))throw new e(`VALIDATION`,`query rejected as potentially catastrophic (ReDoS heuristic match)`,{details:{query:t}})}let a=r?`gi`:`g`;try{return new RegExp(i,a)}catch(n){throw new e(`VALIDATION`,`query failed to compile as regex: ${n.message}`,{cause:n,details:{query:t}})}}function k(e){return e.map(e=>{let t=e.startsWith(`!`);return{negate:t,re:M(t?e.slice(1):e)}})}function A(e,t){let n=!1,r=!1;for(let{negate:i,re:a}of t)if(i||(r=!0),a.test(e)){if(i)return!1;n=!0}return r?n:!0}const j=/[\\^$.+()|[\]{}]/;function M(e){let t=`^`,n=0;for(;n<e.length;){let r=e[n];if(r===`*`){if(e[n+1]===`*`){t+=`.*`,n+=2,e[n]===`/`&&(n+=1);continue}t+=`[^/]*`}else r===`?`?t+=`[^/]`:r!==void 0&&j.test(r)?t+=`\\`+r:r===`/`?t+=`/`:r!==void 0&&(t+=r);n+=1}return t+=`$`,new RegExp(t)}function N(e,t){let n=e.split(l).join(`/`),r=t.split(l).join(`/`),i=r.endsWith(`/`)?r:`${r}/`;return n.startsWith(i)?n.slice(i.length):n}function P(e){return e.split(/\r?\n/)}function F(t,n,r){t.lastIndex=r;let i=performance.now(),a=t.exec(n),o=performance.now()-i;if(o>b)throw new e(`TIMEOUT`,`Regex match exceeded JADX_SEARCH_REGEX_TIMEOUT_MS (${b} ms): ${o.toFixed(2)} ms`,{details:{pattern:t.source,elapsedMs:o}});return a}async function I(t,n,r=S){let i;try{i=await o.readdir(t,{recursive:!0})}catch(n){throw new e(`NOT_FOUND`,`decompileDir not readable: ${t}`,{cause:n})}let a=k(n),s=[];for(let e of i){if(s.length>=r)break;let t=e.split(l).join(`/`);A(t,a)&&s.push(t)}return s}var L=class{async run(e){let t=c(e.decompileDir),n=await I(t,e.globs),r=O(e.query,e.literal,e.caseInsensitive),i=[],a=new Set,u=!1;outer:for(let c of n){let n=s.join(t.split(l).join(`/`),c),d;try{d=await o.readFile(n,`utf8`)}catch{continue}let f=P(d),p=0,m=N(n,t);for(let t=0;t<f.length;t+=1){let n=f[t];if(n===void 0||n.length>T)continue;let o=0,s=F(r,n,o);for(;s!==null;){if(p>=e.maxMatchesPerFile){u=!0;break}let c=s.index+1,l=s.index+s[0].length+1,d={file:m,line:t+1,column:c,text:n,matchStart:c,matchEnd:l};if(e.contextLines>0){let n=[];for(let r=Math.max(0,t-e.contextLines);r<t;r+=1){let e=f[r];e!==void 0&&n.push({line:r+1,text:e})}let r=[];for(let n=t+1;n<Math.min(f.length,t+1+e.contextLines);n+=1){let e=f[n];e!==void 0&&r.push({line:n+1,text:e})}d.context={before:n,after:r}}if(i.push(d),a.add(m),p+=1,i.length>=e.maxResults){u=!0;break outer}let h=s[0].length;if(o=s.index+(h>0?h:1),o>n.length)break;s=F(r,n,o)}}}return{matches:i,filesMatched:a.size,truncated:u}}};const R=f(u);let z,B;async function V(e=3e3){return z||B||(B=(async()=>{try{let t=process.platform===`win32`?`where`:`which`,{stdout:n}=await R(t,[`rg`],{timeout:e,windowsHide:!0}),r=n.trim().split(/\r?\n/)[0];if(!r){let e={available:!1,reason:`'${t} rg' produced empty output`};return z=e,e}let i;try{let{stdout:t}=await R(`rg`,[`--version`],{timeout:e,windowsHide:!0}),n=t.trim().split(/\r?\n/)[0];i=n?n.substring(0,100):void 0}catch{}let a=i?{available:!0,path:r,version:i}:{available:!0,path:r};return z=a,a}catch(e){let t=typeof e==`object`&&e&&`code`in e?e.code:void 0,n=e instanceof Error?e.message:String(e?.message??e),r={available:!1,reason:t===`ENOENT`?`Command 'rg' not found in PATH — install ripgrep (brew/apt/scoop install ripgrep)`:`Probe failed: ${n.substring(0,200)}`};return z=r,r}finally{B=void 0}})(),B)}function H(e,t){let n=t.split(l).join(`/`),r=e.split(l).join(`/`),i=n.endsWith(`/`)?n:`${n}/`;return r.startsWith(i)?r.slice(i.length):r}function U(e){return e.endsWith(`\r
2
- `)?e.slice(0,-2):e.endsWith(`
3
- `)||e.endsWith(`\r`)?e.slice(0,-1):e}function W(e){return U(e)}function G(e){let t=[`--json`,`--no-heading`,`-n`,`--no-config`];e.literal&&t.push(`-F`),e.caseInsensitive&&t.push(`-i`),e.contextLines>0&&t.push(`-C`,String(e.contextLines)),t.push(`--max-count`,String(e.maxMatchesPerFile));for(let n of e.globs)t.push(`--glob`,n);return t.push(`--`,e.query,e.decompileDir),t}var K=class{spawnFn;rgExecutable;constructor(e=d,t=`rg`){this.spawnFn=e,this.rgExecutable=t}async run(t){let n=c(t.decompileDir),r=G({...t,decompileDir:n}),i=this.spawnFn(this.rgExecutable,r,{stdio:[`ignore`,`pipe`,`pipe`],windowsHide:!0}),a=0,o=``,s=``,l=[],u=new Set,d=!1,f=new Map,p=e=>{f.delete(e)},m=e=>{if(e.type===`begin`){let t=e.data.path.text,r=H(t,n);return f.has(r)||f.set(r,{recentLines:[],pendingAfter:[],matchCount:0}),!0}if(e.type===`end`){let t=e.data.path.text;return p(H(t,n)),!0}if(e.type===`context`){let r=e,i=H(r.data.path.text,n),a=f.get(i);if(!a)return!0;let o=W(r.data.lines.text),s={line:r.data.line_number,text:o},c=[];for(let e of a.pendingAfter)e.afterRemaining>0&&e.match.context&&(e.match.context.after.push(s),--e.afterRemaining),e.afterRemaining>0&&c.push(e);return a.pendingAfter=c,a.recentLines.push(s),a.recentLines.length>Math.max(t.contextLines,8)&&a.recentLines.shift(),!0}if(e.type===`match`){let r=e,i=H(r.data.path.text,n),a=f.get(i)??{recentLines:[],pendingAfter:[],matchCount:0};if(f.has(i)||f.set(i,a),a.matchCount>=t.maxMatchesPerFile)return d=!0,!0;if(l.length>=t.maxResults)return d=!0,!1;let o=r.data.submatches[0];if(!o)return!0;let s=W(r.data.lines.text),c=o.start+1,p=o.end+1,m={file:i,line:r.data.line_number,column:c,text:s,matchStart:c,matchEnd:p};return t.contextLines>0&&(m.context={before:a.recentLines.filter(e=>e.line<r.data.line_number).slice(-t.contextLines),after:[]},a.pendingAfter.push({match:m,afterRemaining:t.contextLines})),l.push(m),u.add(i),a.matchCount+=1,l.length>=t.maxResults?(d=!0,!1):!0}return!0};return new Promise((t,n)=>{let r=setTimeout(()=>{i.kill(`SIGKILL`),n(new e(`TIMEOUT`,`ripgrep timed out after ${y} ms`,{details:{timeoutMs:y}}))},y),c=!1,f=()=>{c||(c=!0,clearTimeout(r))};i.stdout?.setEncoding(`utf8`),i.stderr?.setEncoding(`utf8`),i.stdout?.on(`data`,t=>{if(c)return;if(a+=t.length,a>C){i.kill(`SIGKILL`),f(),n(new e(`RUNTIME`,`ripgrep stdout exceeded JADX_SEARCH_RG_MAX_BUFFER_BYTES (${C} bytes)`));return}s+=t;let r=s.indexOf(`
4
- `);for(;r!==-1;){let e=s.slice(0,r).trimEnd();if(s=s.slice(r+1),e.length>0){let t;try{t=JSON.parse(e)}catch{}if(t&&!m(t)){s=``,f(),i.kill(`SIGTERM`);break}}r=s.indexOf(`
5
- `)}}),i.stderr?.on(`data`,e=>{o+=e}),i.on(`error`,t=>{f(),n(new e(`RUNTIME`,`ripgrep spawn failed: ${t.message}`,{cause:t}))}),i.on(`close`,(r,i)=>{if(f(),r===2&&i!==`SIGTERM`&&i!==`SIGKILL`){n(new e(`RUNTIME`,`ripgrep exited with code 2: ${o.trim()}`,{details:{exitCode:r,signal:i??null,stderr:o.trim()}}));return}t({matches:l,filesMatched:u.size,truncated:d})})})}},q=class{rg;fallback;probe;constructor(e={}){this.rg=e.ripgrep??new K,this.fallback=e.fallback??new L,this.probe=e.probe??(()=>V())}async search(t){let n=await this.validateAndNormalize(t),r=performance.now(),i=`node-fallback`,a;if(t.forceFallback)a=await this.fallback.run(n);else if((await this.probe()).available){i=`ripgrep`;try{a=await this.rg.run(n)}catch(t){if(t instanceof e&&t.code===`VALIDATION`)throw t;i=`node-fallback`,a=await this.fallback.run(n)}}else a=await this.fallback.run(n);let o=Math.round(performance.now()-r),s={matches:a.matches,filesMatched:a.filesMatched,totalMatches:a.matches.length,engine:i,decompileDir:n.decompileDir,durationMs:o};return a.truncated&&(s.truncated=!0),s}async validateAndNormalize(t){if(typeof t.decompileDir!=`string`||t.decompileDir.length===0)throw new e(`VALIDATION`,`decompileDir must be a non-empty string`);if(typeof t.query!=`string`||t.query.length===0)throw new e(`VALIDATION`,`query must be a non-empty string`);if(t.query.length>x)throw new e(`VALIDATION`,`query length ${t.query.length} exceeds JADX_SEARCH_MAX_QUERY_LENGTH (${x})`);let n=t.contextLines??g;if(!Number.isFinite(n)||n<0||!Number.isInteger(n))throw new e(`VALIDATION`,`contextLines must be a non-negative integer`);if(n>_)throw new e(`VALIDATION`,`contextLines ${n} exceeds JADX_SEARCH_MAX_CONTEXT_LINES (${_})`);let r=t.maxMatchesPerFile??v;if(!Number.isFinite(r)||r<1||!Number.isInteger(r))throw new e(`VALIDATION`,`maxMatchesPerFile must be a positive integer`);let i=t.maxResults??h;if(!Number.isFinite(i)||i<1||!Number.isInteger(i))throw new e(`VALIDATION`,`maxResults must be a positive integer`);let a=c(t.decompileDir),s;try{s=await o.stat(a)}catch(t){throw new e(`NOT_FOUND`,`decompileDir not found: ${a}`,{cause:t,details:{decompileDir:a}})}if(!s.isDirectory())throw new e(`VALIDATION`,`decompileDir is not a directory: ${a}`);let l=t.globs&&t.globs.length>0?Array.from(t.globs):[...w];return{decompileDir:a,query:t.query,globs:l,literal:t.literal===!0,caseInsensitive:t.caseInsensitive===!0,contextLines:n,maxMatchesPerFile:r,maxResults:i}}},J=class{engine;constructor(e=new q){this.engine=e}handleJadxSearchCode(o){return a(async()=>{let a=r(o,`decompileDir`),s=r(o,`query`);if(typeof o.apkPath==`string`&&o.apkPath.length>0)throw new e(`VALIDATION`,`apkPath is not supported by jadx_search_code (read-only). Run jadx via the binary-instrument domain first, then pass decompileDir.`);let c={decompileDir:a,query:s},l=i(o,`literal`);l!==void 0&&(c.literal=l);let u=i(o,`caseInsensitive`);u!==void 0&&(c.caseInsensitive=u);let d=n(o,`contextLines`);d!==void 0&&(c.contextLines=d);let f=n(o,`maxMatchesPerFile`);f!==void 0&&(c.maxMatchesPerFile=f);let p=n(o,`maxResults`);p!==void 0&&(c.maxResults=p);let m=o.globs;if(m!==void 0){if(!Array.isArray(m))throw new e(`VALIDATION`,`globs must be an array of strings`);let n=t(o,`globs`);if(n.length!==m.length)throw new e(`VALIDATION`,`globs contains non-string entries`);n.length>0&&(c.globs=n)}let h=await this.engine.search(c);return{matches:h.matches,filesMatched:h.filesMatched,totalMatches:h.totalMatches,engine:h.engine,durationMs:h.durationMs,decompileDir:h.decompileDir,...h.truncated?{truncated:!0}:{}}})}};export{J as JadxSearchHandlers};
@@ -1 +0,0 @@
1
- import{t as e}from"./logger-sBC6IdRT.mjs";import{at as t,ht as n,jt as r,ot as i}from"./constants-BYj8Xek8.mjs";import{n as a,t as o}from"./artifactRetention-BCPQASm7.mjs";import{a as s,n as c}from"./response-C7rKQst4.mjs";import{t as l}from"./types-Fz69RzbZ.mjs";import{i as u,l as d}from"./outputPaths-B4Ic4RZh.mjs";import{r as f}from"./betterSqlite3-Brtq-SIQ.mjs";import{r as p}from"./concurrency-DCr8WQ2M.mjs";import{n as m}from"./ResponseBuilder-BfWP-uaT.mjs";import{t as h}from"./ToolRegistry-C5oB8KP8.mjs";import"./definitions-Bf3H1EwV.mjs";import{createRequire as g}from"node:module";import{existsSync as _}from"node:fs";import{dirname as v,isAbsolute as y,join as b,relative as x,resolve as S}from"node:path";import{fileURLToPath as C}from"node:url";import{mkdir as w,readFile as T,writeFile as E}from"node:fs/promises";import{execFile as D}from"node:child_process";import{promisify as O}from"node:util";const k=O(D),A=g(import.meta.url);let j=null,M=0;function ee(){let e=Date.now();return(!j||e-M>12e4)&&(j=new h,M=e),j}function te(e){let t=v(A.resolve(e));for(;;){let n=b(t,`package.json`);if(_(n))return n;let r=v(t);if(r===t)throw Error(`Could not locate package.json for ${e}`);t=r}}function N(e){return A(te(e))}async function ne(e){let t=e?.includeBridgeHealth??!0,i=ee().probeAll(!0),o=p(()=>L(`git`,[`--version`])),s=p(()=>L(`python`,[`--version`])),c=p(()=>I()),l=p(()=>L(`corepack`,[`--version`])),d=t?Promise.all([p(()=>z(`ghidra-bridge`,`${n.replace(/\/$/,``)}/health`)),p(()=>z(`ida-bridge`,`${r.replace(/\/$/,``)}/health`)),p(()=>z(`burp-mcp-sse`,process.env.BURP_MCP_SSE_URL?.trim()||`http://127.0.0.1:9876`))]):Promise.resolve([]),[f,m,h,g,_,v]=await Promise.all([i,o,s,c,l,d]),y=ie(_,g),b=[P(`@modelcontextprotocol/sdk`),P(`rebrowser-puppeteer-core`),re(),P(`camoufox-js`,`Optional Firefox anti-detect driver`),P(`playwright-core`,`Optional browser automation dependency`),ae()],x=[m,h,g,y,...Object.entries(f).map(([e,t])=>({name:e,status:t.available?`ok`:`missing`,detail:t.available?`${t.path??`PATH`}${t.version?` (${t.version})`:``}`:t.reason??`Unavailable`}))],S=oe(),C=se(b,x,v,S);return{success:[...b,...x,...v].every(e=>e.status!==`error`),generatedAt:new Date().toISOString(),runtime:{platform:process.platform,arch:process.arch,node:process.version,cwd:process.cwd(),projectRoot:u()},packages:b,commands:x,bridges:v,config:{transport:(process.env.MCP_TRANSPORT??`stdio`).toLowerCase(),toolProfile:(process.env.MCP_TOOL_PROFILE??`search`).toLowerCase(),pluginRoots:process.env.MCP_PLUGIN_ROOTS??`<jshook-install>/plugins`,workflowRoots:process.env.MCP_WORKFLOW_ROOTS??`<jshook-install>/workflows`,pluginSignatureRequired:process.env.MCP_PLUGIN_SIGNATURE_REQUIRED??(process.env.NODE_ENV===`production`?`true (production default)`:`false`),pluginStrictLoad:process.env.MCP_PLUGIN_STRICT_LOAD??(process.env.NODE_ENV===`production`?`true (production default)`:`false`),artifactRetention:a()},limitations:S,recommendations:C}}function P(e,t){try{let t=N(e);return{name:e,status:`ok`,detail:t.version?`installed (${t.version})`:`installed`}}catch{return{name:e,status:`missing`,detail:t??`Not installed`}}}function re(){let e=f();return{name:`better-sqlite3`,status:e.status,detail:e.detail}}function F(e){return e.status===`ok`||e.detail.includes(`npx fallback works`)}async function I(){let e=await L(`pnpm`,[`--version`]);if(e.status===`ok`)return e;let t=await L(`npx`,[`pnpm`,`--version`],1e4);return t.status===`ok`?{name:`pnpm`,status:`warn`,detail:`direct pnpm command unavailable; npx fallback works (${t.detail})`}:e}function ie(e,t){return e.status!==`missing`||!F(t)?e:{name:e.name,status:`warn`,detail:process.platform===`win32`?t.detail.includes(`npx fallback works`)?"corepack not found; use `npx pnpm` directly (common with nvm4w-managed Node on Windows)":`corepack not found; standalone pnpm is available (common with nvm4w-managed Node on Windows)`:t.detail.includes(`npx fallback works`)?"corepack not found; use `npx pnpm` directly":`corepack not found; standalone pnpm is available`}}function ae(){try{let e=N(`koffi`).version??`unknown`;if(process.platform===`win32`)return{name:`native-memory`,status:`ok`,detail:`koffi ${e} — Win32 kernel32.dll available`};if(process.platform===`darwin`)try{return A(`koffi`).load(`/usr/lib/libSystem.B.dylib`).unload(),delete A.cache[A.resolve(`koffi`)],{name:`native-memory`,status:`ok`,detail:`koffi ${e} — macOS libSystem.B.dylib available (Mach APIs need root + SIP config)`}}catch{return{name:`native-memory`,status:`warn`,detail:`koffi ${e} installed but cannot load libSystem.B.dylib`}}return{name:`native-memory`,status:`warn`,detail:`koffi ${e} — no native FFI memory provider for ${process.platform} (proc-based ops available on Linux)`}}catch{return{name:`native-memory`,status:`missing`,detail:`koffi not installed — native memory tools unavailable. Install with: pnpm add koffi`}}}async function L(e,t,n=4e3){try{let{stdout:r,stderr:i}=await k(e,t,{timeout:n,windowsHide:!0});return{name:e,status:`ok`,detail:`${r||i}`.trim().split(/\r?\n/)[0]||`available`}}catch(r){if(process.platform===`win32`)try{let{stdout:r,stderr:i}=await k(`cmd`,[`/c`,e,...t],{timeout:n,windowsHide:!0});return{name:e,status:`ok`,detail:`${`${r||i}`.trim().split(/\r?\n/)[0]||`available`} (via cmd)`}}catch(t){return R(e,t)}return R(e,r)}}function R(e,t){let n=t instanceof Error?t.message:String(t);return{name:e,status:/ENOENT|not recognized|not found/i.test(n)?`missing`:`warn`,detail:n}}async function z(e,t){try{let n=await fetch(t,{method:`GET`,signal:AbortSignal.timeout(3e3)});return{name:e,status:n.ok?`ok`:`warn`,detail:`${t} -> HTTP ${n.status}`}}catch(n){return{name:e,status:`warn`,detail:`${t} -> ${n instanceof Error?n.message:String(n)}`}}}function oe(){let e=[];return process.platform===`darwin`?(e.push(`26 cross-platform memory tools available (scan, pointer-chain, structure-analysis, heap). 15 Windows-only tools unavailable (PE analysis, anti-cheat, code injection, speedhack, hardware breakpoints).`),e.push(`Native memory operations (mach_vm_read/write) require root privileges and may require SIP configuration on ARM64.`)):process.platform===`linux`?(e.push(`Process management available via /proc. Native FFI memory provider not implemented — memory read/write uses /proc/pid/mem (requires root or CAP_SYS_PTRACE).`),e.push(`Camoufox runs on Linux, but some Chrome/CDP-heavy workflows are better served by the Chrome driver.`)):process.platform!==`win32`&&e.push(`Platform ${process.platform} is not supported for native memory operations. Use Windows or macOS.`),e}function se(e,t,n,r){let i=[],a=t.find(e=>e.name===`pnpm`),o=t.find(e=>e.name===`corepack`);return e.some(e=>e.name===`better-sqlite3`&&e.status!==`ok`)&&i.push("Install or rebuild the optional SQLite trace backend with `pnpm add -O better-sqlite3@12.10.0` or `npm rebuild better-sqlite3 --foreground-scripts` under the active Node version if you need trace tooling."),e.some(e=>e.name===`camoufox-js`&&e.status!==`ok`)&&i.push("Install optional browser dependencies with `pnpm run install:full` if you need Camoufox support."),t.some(e=>e.name.startsWith(`wabt.`)&&e.status!==`ok`)&&i.push(`Install wabt if you need full WASM disassembly/decompilation; otherwise the server will stay in basic mode.`),a&&!F(a)?i.push("Install pnpm or enable Corepack (`corepack enable`) before running package-management workflows."):a?.detail.includes(`npx fallback works`)?i.push("Use `npx pnpm` directly on this machine or repair the local pnpm/Corepack shim if scripts expect bare `pnpm`."):o?.status===`warn`&&o.detail.includes(`standalone pnpm`)&&i.push("Use `pnpm` or `npx pnpm` directly on this machine; `corepack` is optional and may be absent on nvm4w-managed Windows installs."),n.some(e=>e.status!==`ok`)&&i.push(`Check local bridge endpoints (Ghidra / IDA / Burp) before relying on native-bridge workflows.`),r.length>0&&i.push(`Review platform limitations before using process/memory tooling on non-Windows hosts.`),i}var ce=class{tokenBudget;unifiedCache;artifactCleanup;environmentDoctor;constructor(e){this.tokenBudget=e.tokenBudget,this.unifiedCache=e.unifiedCache,this.artifactCleanup=e.artifactCleanup??o,this.environmentDoctor=e.environmentDoctor??ne}async handleGetTokenBudgetStats(){return m(async()=>{let e=this.tokenBudget.getStats();return{...e,sessionDuration:`${Math.round((Date.now()-e.sessionStartTime)/1e3)}s`}})}async handleManualTokenCleanup(){return m(async()=>{let e=this.tokenBudget.getStats();this.tokenBudget.manualCleanup();let t=this.tokenBudget.getStats(),n=e.currentUsage-t.currentUsage;return{message:`Manual cleanup completed`,before:{usage:e.currentUsage,percentage:e.usagePercentage},after:{usage:t.currentUsage,percentage:t.usagePercentage},freed:{tokens:n,percentage:Math.round(n/e.maxTokens*100)}}})}async handleResetTokenBudget(){return m(async()=>(this.tokenBudget.reset(),{message:`Token budget reset successfully`,currentUsage:0,maxTokens:2e5,usagePercentage:0}))}async handleGetCacheStats(){return m(async()=>this.unifiedCache.getGlobalStats())}async handleSmartCacheCleanup(e){return m(async()=>this.unifiedCache.smartCleanup(e))}async handleClearAllCaches(){return m(async()=>(await this.unifiedCache.clearAll(),{message:`All caches cleared`}))}async handleCleanupArtifacts(e){return m(async()=>this.artifactCleanup({retentionDays:e.retentionDays,maxTotalBytes:e.maxTotalBytes,dryRun:e.dryRun}))}async handleEnvironmentDoctor(e){return m(async()=>this.environmentDoctor({includeBridgeHealth:e.includeBridgeHealth}))}};const B=O(D);function V(){return C(new URL(`../../../../`,import.meta.url))}function H(e){let t=e?.trim();if(t)return t.split(`,`).map(e=>e.trim()).find(e=>e.length>0)}function U(e){let t=e===`workflow`?`MCP_WORKFLOW_ROOTS`:`MCP_PLUGIN_ROOTS`,n=H(process.env[t]);return n?S(n):S(V(),e===`workflow`?`workflows`:`plugins`)}function W(){let e=(process.env.EXTENSION_REGISTRY_BASE_URL??``).trim().replace(/\/+$/,``);if(!e)throw Error(`EXTENSION_REGISTRY_BASE_URL is not configured. Set it in .env or environment before browsing or installing extensions.`);return e}function G(e,t){let n=e?.trim();if(!n){if(t===`subpath`)return`.`;throw Error(`Registry source.${t} must be a non-empty string`)}return n}function K(e,t,n){let r=x(e,t).replace(/\\/g,`/`);if(r===`..`||r.startsWith(`../`)||y(r))throw Error(`Registry source.${n} must stay within ${e}: ${t}`)}function le(e,t){let n=S(e,G(t,`subpath`));return K(e,n,`subpath`),n}function q(e,t){let n=S(e,G(t,`entry`));return K(e,n,`entry`),n}function ue(e){let t=G(e,`entry`).replace(/\\/g,`/`),n=[t];if(!t.endsWith(`.ts`))return n;let r=`${t.slice(0,-3)}.js`;return n.unshift(r),t.startsWith(`dist/`)||n.unshift(`dist/${r}`),[...new Set(n)]}function de(e,t){let n=ue(t);for(let t of n)if(_(q(e,t)))return t;return G(t,`entry`)}async function fe(e,t,n,r){let i={version:1,kind:e,slug:t.slug,id:t.id,source:{type:t.source.type,repo:t.source.repo,ref:t.source.ref,commit:t.source.commit,subpath:G(t.source.subpath,`subpath`),entry:G(r,`entry`)}},a=S(n,l);return await E(a,`${JSON.stringify(i,null,2)}\n`,`utf8`),a}const J=`@jshookmcp/extension-sdk`,pe=[`workspace:`,`link:`,`file:`];function me(){return d().paths.registryCacheDir}var Y=class extends Error{code;url;cachePath;status;constructor(e,t,n,r,i){super(n),this.code=e,this.url=t,this.cachePath=r,this.status=i,this.name=`RegistryFetchError`}};function he(e,t){return process.platform===`win32`?{command:`${e}.cmd`,args:t}:{command:e,args:t}}async function X(e,t,n){let r=he(e,t);return B(r.command,r.args,{...n,env:{...process.env,...n?.env,CI:`true`}})}async function Z(e){let t=S(e,`package.json`),n=S(e,`pnpm-lock.yaml`),r=S(e,`package-lock.json`);if(_(t))try{let e=await T(t,`utf8`),n=JSON.parse(e).packageManager?.trim().toLowerCase().split(`@`)[0];if(n===`pnpm`)return`pnpm`;if(n===`npm`)return`npm`}catch{}return _(n)?`pnpm`:_(r)?`npm`:`pnpm`}function Q(e){return S(me(),`registry-${e}.json`)}async function ge(e){let t=Q(e);try{let e=await T(t,`utf8`);return JSON.parse(e)}catch{return null}}async function _e(e,t){let n=Q(e);await w(v(n),{recursive:!0}),await E(n,JSON.stringify(t,null,2),`utf8`)}function ve(e,t,n){if(t instanceof Y)return t;if(t instanceof DOMException&&t.name===`AbortError`)return new Y(`timeout`,e,`Registry fetch timed out after 10000ms: ${e}`,n);let r=t instanceof Error?t.message:String(t);if(r.includes(`ENOTFOUND`)||r.includes(`getaddrinfo`))return new Y(`dns_failure`,e,`DNS resolution failed for registry URL: ${e}`,n);if(r.includes(`ECONNREFUSED`))return new Y(`connection_refused`,e,`Connection refused by registry server: ${e}`,n);if(r.includes(`CERT_`)||r.includes(`certificate`)||r.includes(`SSL`))return new Y(`tls_error`,e,`TLS/certificate error when connecting to registry: ${e}`,n);let i=r.match(/HTTP\s+(\d+)/i);return i?new Y(`http_error`,e,r,n,Number(i[1])):new Y(`fetch_failed`,e,r,n)}function ye(e){return{success:!1,error:e.code,message:e.message,url:e.url,...typeof e.status==`number`?{status:e.status}:{}}}async function $(t,n){let r=new AbortController,i=setTimeout(()=>r.abort(),1e4),a=n?.cacheKey?Q(n.cacheKey):void 0;try{let i=await fetch(t,{signal:r.signal});if(!i.ok)throw new Y(`http_error`,t,`HTTP ${i.status} ${i.statusText} from ${t}`,a,i.status);let o=await i.json();if(n?.cacheKey)try{await _e(n.cacheKey,o)}catch(r){e.warn(`[extensions] Failed to persist ${n.cacheKey} registry cache for ${t}:`,r)}return{data:o,stale:!1,source:`network`,cachePath:a}}catch(r){let i=ve(t,r,a);if(n?.cacheKey){let r=await ge(n.cacheKey);if(r)return e.warn(`[extensions] Using stale ${n.cacheKey} registry cache after ${i.code}: ${t}`),{data:r,stale:!0,source:`cache`,cachePath:a}}throw i}finally{clearTimeout(i)}}function be(e){let t=e.trim();return t?pe.some(e=>t.startsWith(e))||t.startsWith(`./`)||t.startsWith(`../`)||t.startsWith(`/`)?!0:/^[A-Za-z]:[\\/]/.test(t):!1}async function xe(e){let t=await T(S(e,`package.json`),`utf8`),n=JSON.parse(t);for(let e of[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`]){let t=n[e];if(!t||typeof t!=`object`)continue;let r=t[J];if(typeof r==`string`&&be(r))throw Error(`package.json ${e}.${J} uses unsupported local dependency spec "${r}". Declare a published npm version instead, for example "^0.3.2".`)}}async function Se(e,t){let[n,r]=await Promise.allSettled([$(`${e}/workflows.index.json`,{cacheKey:`workflows`}),$(`${e}/plugins.index.json`,{cacheKey:`plugins`})]);if(n.status===`fulfilled`){let e=(Array.isArray(n.value.data.workflows)?n.value.data.workflows:[]).find(e=>e.slug===t);if(e)return{entry:e,kind:`workflow`}}if(r.status===`fulfilled`){let e=(Array.isArray(r.value.data.plugins)?r.value.data.plugins:[]).find(e=>e.slug===t);if(e)return{entry:e,kind:`plugin`}}let i=n.status===`rejected`?n.reason instanceof Error?n.reason:Error(String(n.reason)):void 0,a=r.status===`rejected`?r.reason instanceof Error?r.reason:Error(String(r.reason)):void 0;throw Error(i&&a?`Failed to resolve extension slug "${t}": workflow registry error: ${i.message}; plugin registry error: ${a.message}`:a?`Extension "${t}" was not found in workflow registry, and plugin registry lookup failed: ${a.message}`:i?`Extension "${t}" was not found in plugin registry, and workflow registry lookup failed: ${i.message}`:`Extension "${t}" not found in workflow or plugin registry`)}var Ce=class{ctx;constructor(e){this.ctx=e}async handleListExtensions(){try{return c({success:!0,...this.ctx.listExtensions()})}catch(t){return e.error(`Failed to list extensions:`,t),c(s(t))}}async handleReloadExtensions(){try{return c({success:!0,...await this.ctx.reloadExtensions()})}catch(t){return e.error(`Failed to reload extensions:`,t),c(s(t))}}async handleBrowseExtensionRegistry(t){try{let e=W(),n=t===`all`||t===`plugin`,r=t===`all`||t===`workflow`,i={success:!0},a=!1,o=n?$(`${e}/plugins.index.json`,{cacheKey:`plugins`}):void 0,s=r?$(`${e}/workflows.index.json`,{cacheKey:`workflows`}):void 0,[l,u]=await Promise.all([o??Promise.resolve(void 0),s??Promise.resolve(void 0)]);if(l){let e=Array.isArray(l.data.plugins)?l.data.plugins:[];i.plugins=e.map(e=>({slug:e.slug,id:e.id,name:e.meta.name,description:e.meta.description,author:e.meta.author,repo:e.source.repo,commit:e.source.commit,entry:e.source.entry})),i.pluginCount=e.length,i.pluginSource=l.source,a||=l.stale}if(u){let e=Array.isArray(u.data.workflows)?u.data.workflows:[];i.workflows=e.map(e=>({slug:e.slug,id:e.id,name:e.meta.name,description:e.meta.description,author:e.meta.author,repo:e.source.repo,commit:e.source.commit,entry:e.source.entry})),i.workflowCount=e.length,i.workflowSource=u.source,a||=u.stale}return a&&(i.stale=!0),c(i)}catch(t){return e.error(`Failed to browse extension registry:`,t),t instanceof Y?c(ye(t)):c(s(t))}}async handleInstallExtension(n,r){try{let{entry:e,kind:a}=await Se(W(),n),o=a===`workflow`,s=U(o?`workflow`:`plugin`),l=r?S(r):S(s,n),u=le(l,e.source.subpath);if(q(u,e.source.entry),_(l))return c({success:!1,error:`Target directory already exists: ${l}`,hint:`Remove the existing directory first, or specify a different targetDir`});if(await w(v(l),{recursive:!0}),await B(`git`,[`clone`,e.source.repo,l],{timeout:i}),await B(`git`,[`-C`,l,`checkout`,e.source.commit],{timeout:t}),_(S(u,`package.json`))){await xe(u);let e=await Z(u);await X(e,e===`pnpm`?[`--ignore-workspace`,`install`,`--no-frozen-lockfile`,`--ignore-scripts`]:[`install`,`--ignore-scripts`],{cwd:u,timeout:Math.max(i,12e4)}),await X(e,e===`pnpm`?[`--ignore-workspace`,`run`,`--if-present`,`build`]:[`run`,`build`,`--if-present`],{cwd:u,timeout:Math.max(i,12e4)})}let d=de(u,e.source.entry),f=q(u,d);if(!_(f))return c({success:!1,error:`Installed extension entry not found: ${d}`,installDir:l,projectDir:u,expectedEntryFile:f,hint:`The registry source.entry or its compiled JS output must exist after clone/build before reloadExtensions can load it.`});let p=await fe(o?`workflow`:`plugin`,e,u,d),m=await this.ctx.reloadExtensions();return c({success:!0,installed:{slug:e.slug,id:e.id,name:e.meta.name,repo:e.source.repo,commit:e.source.commit,installDir:l,projectDir:u,entry:d,entryFile:f,metadataPath:p},reload:{addedTools:m.addedTools,pluginCount:m.pluginCount,workflowCount:m.workflowCount,errors:m.errors,warnings:m.warnings}})}catch(t){return e.error(`Failed to install extension:`,t),c(s(t))}}};export{ce as CoreMaintenanceHandlers,Ce as ExtensionManagementHandlers};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./tool-builder-qif8M9-K.mjs";import{resolve as r}from"node:path";const i=[n(`evidence_query`,e=>e.desc(`Query reverse evidence graph by URL, function name, or script ID to find associated nodes.`).enum(`by`,[`url`,`function`,`script`],`Query dimension`).string(`value`,`Search value: URL/fragment, function name, or script ID`).required(`by`,`value`).query()),n(`evidence_export`,e=>e.desc(`Export the reverse evidence graph as JSON snapshot or Markdown report.`).enum(`format`,[`json`,`markdown`],`Export format`).required(`format`).query()),n(`evidence_chain`,e=>e.desc(`Get full provenance chain from a node ID in specified direction.`).string(`nodeId`,`Evidence node ID to start from`).enum(`direction`,[`forward`,`backward`],`Traversal direction`,{default:`forward`}).required(`nodeId`).query())],a=`evidence`,o=`evidenceHandlers`,s=t({domain:a,depKey:o,lookup:e(i),entries:[{tool:`evidence_query`,method:`handleQueryDispatch`},{tool:`evidence_export`,method:`handleExportDispatch`},{tool:`evidence_chain`,method:`handleChain`}]});async function c(e){let{ReverseEvidenceGraph:t}=await import(`./ReverseEvidenceGraph-BhSYYdiI.mjs`).then(e=>e.t),{EvidenceGraphBridge:n}=await import(`./EvidenceGraphBridge-BtbwXsLC.mjs`),{EvidenceHandlers:i}=await import(`./handlers-0yKLRIfo.mjs`),a=e.getDomainInstance(`evidenceGraph`);a||(a=new t,a.setEventBus(e.eventBus),e.setDomainInstance(`evidenceGraph`,a));let o=e.getDomainInstance(`evidenceGraphBridge`);o||(o=new n(a),e.setDomainInstance(`evidenceGraphBridge`,o)),e.getDomainInstance(`instrumentationSessionManager`)?.setEvidenceBridge(o),e.evidenceHandlers||=new i(a);let s=e.getDomainInstance(`snapshotScheduler`),c=e.getDomainInstance(`snapshotStateDir`);return a.setPersistNotifier(s?()=>s.notifyDirty():void 0),s&&c&&!e.getDomainInstance(`evidenceGraphSnapshotRegistered`)&&(s.register(r(c,`evidence-graph`,`current.json`),a),e.setDomainInstance(`evidenceGraphSnapshotRegistered`,!0)),e.evidenceHandlers}const l={kind:`domain-manifest`,version:1,domain:a,depKey:o,profiles:[`full`],ensure:c,workflowRule:{patterns:[/(evidence|provenance|chain).*(graph|query|export|report)/i,/(证据|溯源|链).*(图|查询|导出|报告)/i],priority:90,tools:[`evidence_query`,`evidence_export`],hint:`Evidence graph: query by URL/function/scriptId → get provenance chain → export as JSON or Markdown report`},registrations:s};export{l as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./tool-builder-qif8M9-K.mjs";const r=[n(`binary_instrument_capabilities`,e=>e.desc(`Report binary instrumentation backend availability.`).query()),n(`frida_attach`,e=>e.desc(`Attach Frida to a local target and open a session.`).string(`target`,`Process name, PID, or binary path to attach to`).required(`target`)),n(`frida_enumerate_modules`,e=>e.desc(`List loaded modules in an attached Frida session.`).string(`sessionId`,`Session id returned by frida_attach`).required(`sessionId`).query()),n(`ghidra_analyze`,e=>e.desc(`Analyze a binary and return metadata.`).string(`binaryPath`,`Path to the binary file`).number(`timeout`,`Optional timeout in milliseconds for headless analysis`).required(`binaryPath`)),n(`generate_hooks`,e=>e.desc(`Generate a Frida interceptor script for a list of symbols.`).array(`symbols`,{type:`string`},`Symbol names to hook`).object(`options`,{includeArgs:{type:`boolean`,description:`Emit argument logging on function entry`},includeRetAddr:{type:`boolean`,description:`Emit return-address logging on function entry`}},`Optional Frida hook generation flags`).required(`symbols`)),n(`unidbg_emulate`,e=>e.desc(`Emulate a native function with Unidbg when available.`).string(`binaryPath`,`Path to the binary file`).string(`functionName`,`Function name to emulate`).array(`args`,{type:`string`},`Optional string arguments forwarded to emulation`).required(`binaryPath`,`functionName`)),n(`frida_run_script`,e=>e.desc(`Execute a Frida JavaScript snippet inside an attached Frida session.`).string(`sessionId`,`Session id returned by frida_attach`).string(`script`,`Frida JavaScript to execute`).required(`sessionId`,`script`)),n(`frida_detach`,e=>e.desc(`Detach from a Frida session and clean up resources.`).string(`sessionId`,`Session id returned by frida_attach`).required(`sessionId`)),n(`frida_list_sessions`,e=>e.desc(`List all active Frida attach sessions with target info.`).query()),n(`frida_generate_script`,e=>e.desc(`Generate a Frida interceptor or hook script from built-in templates.`).string(`target`,`Target binary or module name`).string(`template`,`Hook template type: trace, intercept, replace, log`).string(`functionName`,`Function name to generate hook for`).required(`target`,`template`)),n(`get_available_plugins`,e=>e.desc(`List installed binary analysis plugins.`).query()),n(`ghidra_decompile`,e=>e.desc(`Decompile a function using Ghidra.`).string(`binaryPath`,`Path to the binary file`).string(`functionName`,`Function name to decompile`).required(`binaryPath`,`functionName`)),n(`ida_decompile`,e=>e.desc(`Decompile a function using IDA Pro.`).string(`binaryPath`,`Path to the binary file`).string(`functionName`,`Function name to decompile`).required(`binaryPath`,`functionName`)),n(`jadx_decompile`,e=>e.desc(`Decompile an APK class or method with JADX CLI, auto-resolving likely class matches when possible, or use the legacy plugin bridge when available.`).string(`apkPath`,`Path to the APK file`).string(`className`,`Fully qualified class name`).string(`methodName`,`Method name to decompile`).required(`apkPath`,`className`)),n(`apktool_decode`,e=>e.desc(`Decode an APK using apktool to inspect resources, manifest, and smali output.`).string(`apkPath`,`Path to the APK file`).string(`outputDir`,`Optional output directory for decoded contents`).boolean(`force`,`Overwrite output directory if it already exists`,{default:!1}).required(`apkPath`)),n(`apk_manifest_dump`,e=>e.desc(`Extract AndroidManifest.xml from an APK for quick inspection; return readable XML when possible, using JADX CLI as a cross-platform decode fallback for binary AXML, otherwise return base64.`).string(`apkPath`,`Path to the APK file`).required(`apkPath`)),n(`apk_native_libs_list`,e=>e.desc(`List packaged native shared libraries (.so) inside an APK.`).string(`apkPath`,`Path to the APK file`).required(`apkPath`).query()),n(`unidbg_launch`,e=>e.desc(`Emulate a native shared library in Unidbg.`).string(`soPath`,`Path to the .so library file`).string(`arch`,`Architecture: arm or arm64`).required(`soPath`)),n(`unidbg_call`,e=>e.desc(`Call a JNI function in a running Unidbg emulator session.`).string(`sessionId`,`Session id from unidbg_launch`).string(`functionName`,`JNI function name to call`).required(`sessionId`,`functionName`)),n(`unidbg_trace`,e=>e.desc(`Get execution trace from Unidbg session with configurable detail.`).string(`sessionId`,`Session id from unidbg_launch`).required(`sessionId`)),n(`export_hook_script`,e=>e.desc(`Export generated hook templates as a complete, runnable Frida script.`).string(`hookTemplates`,`JSON array of hook template objects`)),n(`frida_enumerate_functions`,e=>e.desc(`Enumerate exported functions for a specific module in a Frida session.`).string(`sessionId`,`Session id returned by frida_attach`).string(`moduleName`,`Module name to enumerate exports from`).required(`sessionId`,`moduleName`).query()),n(`frida_find_symbols`,e=>e.desc(`Search for symbols matching a pattern in a Frida session.`).string(`sessionId`,`Session id returned by frida_attach`).string(`pattern`,`Symbol search pattern (e.g. "exports:*libssl*SSL*")`).required(`sessionId`,`pattern`).query())],i=`binary-instrument`,a=`binaryInstrumentHandlers`,o=t({domain:i,depKey:a,lookup:e(r),entries:[{tool:`binary_instrument_capabilities`,method:`handleBinaryInstrumentCapabilities`},{tool:`frida_attach`,method:`handleFridaAttach`},{tool:`frida_enumerate_modules`,method:`handleFridaEnumerateModules`},{tool:`ghidra_analyze`,method:`handleGhidraAnalyze`},{tool:`generate_hooks`,method:`handleGenerateHooks`},{tool:`unidbg_emulate`,method:`handleUnidbgEmulate`},{tool:`frida_run_script`,method:`handleFridaRunScript`},{tool:`frida_detach`,method:`handleFridaDetach`},{tool:`frida_list_sessions`,method:`handleFridaListSessions`},{tool:`frida_generate_script`,method:`handleFridaGenerateScript`},{tool:`get_available_plugins`,method:`handleGetAvailablePlugins`},{tool:`ghidra_decompile`,method:`handleGhidraDecompile`},{tool:`ida_decompile`,method:`handleIdaDecompile`},{tool:`jadx_decompile`,method:`handleJadxDecompile`},{tool:`apktool_decode`,method:`handleApktoolDecode`},{tool:`apk_manifest_dump`,method:`handleApkManifestDump`},{tool:`apk_native_libs_list`,method:`handleApkNativeLibsList`},{tool:`unidbg_launch`,method:`handleUnidbgLaunch`},{tool:`unidbg_call`,method:`handleUnidbgCall`},{tool:`unidbg_trace`,method:`handleUnidbgTrace`},{tool:`export_hook_script`,method:`handleExportHookScript`},{tool:`frida_enumerate_functions`,method:`handleFridaEnumerateFunctions`},{tool:`frida_find_symbols`,method:`handleFridaFindSymbols`}]});async function s(e){let{BinaryInstrumentHandlers:t}=await import(`./handlers-VHWrxbM_.mjs`),{GhidraAnalyzer:n,HookGenerator:r}=await import(`./binary-instrument-DU7V6TUM.mjs`).then(e=>e.t),i=e.getDomainInstance(a);return i||(i=new t(e,new n,new r),e.setDomainInstance(a,i)),i}const c={kind:`domain-manifest`,version:1,domain:i,depKey:a,profiles:[`full`],ensure:s,registrations:o,workflowRule:{patterns:[/\b(frida|ghidra|ida|unidbg|jadx|binary|disassemb|decompil|dump\s?so)\b/i,/(binary|native|so|dll|elf|apk).*(analyze|hook|instrument|decompile)/i,/(apk|android).*(manifest|apktool|native\s+libs|shared\s+library|\.so)/i],priority:88,tools:[`frida_attach`,`ghidra_analyze`,`jadx_decompile`,`apktool_decode`,`apk_manifest_dump`,`apk_native_libs_list`,`generate_hooks`,`unidbg_launch`],hint:`Binary analysis pipeline: attach Frida → decompile/inspect APK, manifest, and native libs → generate hook scripts → emulate with Unidbg.`},prerequisites:{frida_attach:[{condition:`Frida CLI must be installed; device targets may also require frida-server and elevated privileges`,fix:`Install frida-tools and, for Android/device targets, launch frida-server on the target.`}],frida_run_script:[{condition:`A Frida session must be active`,fix:`Call frida_attach before running a script`}],ghidra_analyze:[{condition:`Ghidra analyzeHeadless must be installed and reachable on PATH`,fix:`Install Ghidra and ensure analyzeHeadless is on PATH.`}],ida_decompile:[{condition:`plugin_ida_bridge must be installed`,fix:`Install @jshookmcpextension/plugin-ida-bridge and provide IDA Pro license`}],jadx_decompile:[{condition:`jadx CLI or plugin_jadx_bridge must be available`,fix:`Install JADX and ensure jadx is on PATH, or install @jshookmcpextension/plugin-jadx-bridge.`}],apktool_decode:[{condition:`apktool CLI must be installed`,fix:`Install apktool and ensure it is on PATH.`}],unidbg_launch:[{condition:`Java 17+ and unidbg JAR must be reachable`,fix:`Install JDK 17+ and download unidbg from its official release`}],generate_hooks:[{condition:`Ghidra analysis output required`,fix:`Run ghidra_analyze first and pass the output to generate_hooks`}]},toolDependencies:[{from:`process`,to:`binary-instrument`,relation:`uses`,weight:.6}]};export{c as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./definitions-DAQm1Xar.mjs";const r=`coordination`,i=`coordinationHandlers`,a=t({domain:r,depKey:i,lookup:e(n),entries:[{tool:`create_task_handoff`,method:`handleCreateTaskHandoff`},{tool:`complete_task_handoff`,method:`handleCompleteTaskHandoff`},{tool:`get_task_context`,method:`handleGetTaskContext`},{tool:`append_session_insight`,method:`handleAppendSessionInsight`},{tool:`save_page_snapshot`,method:`handleSavePageSnapshot`},{tool:`restore_page_snapshot`,method:`handleRestorePageSnapshot`},{tool:`list_page_snapshots`,method:`handleListPageSnapshots`}]});async function o(e){let{CoordinationHandlers:t}=await import(`./coordination-CWXW1o8K.mjs`);return e.coordinationHandlers||=new t(e),e.coordinationHandlers}const s={kind:`domain-manifest`,version:1,domain:r,depKey:i,profiles:[`full`],ensure:o,registrations:a};export{s as default};
@@ -1 +0,0 @@
1
- import{n as e}from"./ServerRuntimeState-D2bWHqEE.mjs";import{t}from"./BrowserSessionCoordinator-BJ-HOxo0.mjs";import{t as n}from"./registry-DH4sc1dt.mjs";import{n as r}from"./bind-helpers-m2U8glkF.mjs";import{t as i}from"./ensure-browser-core-DxWC-NTp.mjs";import{n as a,t as o}from"./definitions-CMZRSy3k.mjs";const s=`browser`,c=`browserHandlers`,l=r({domain:s,depKey:c,lookup:n([...o,...a]),entries:[{tool:`get_detailed_data`,method:`handleGetDetailedData`},{tool:`browser_attach`,method:`handleBrowserAttach`},{tool:`browser_list_tabs`,method:`handleBrowserListTabs`},{tool:`browser_list_cdp_targets`,method:`handleBrowserListCdpTargets`},{tool:`browser_select_tab`,method:`handleBrowserSelectTab`},{tool:`browser_attach_cdp_target`,method:`handleBrowserAttachCdpTarget`},{tool:`browser_detach_cdp_target`,method:`handleBrowserDetachCdpTarget`},{tool:`browser_evaluate_cdp_target`,method:`handleBrowserEvaluateCdpTarget`},{tool:`browser_launch`,method:`handleBrowserLaunch`},{tool:`browser_close`,method:`handleBrowserClose`},{tool:`browser_status`,method:`handleBrowserStatus`},{tool:`page_navigate`,method:`handlePageNavigate`},{tool:`page_reload`,method:`handlePageReload`},{tool:`page_back`,method:`handlePageBack`},{tool:`page_forward`,method:`handlePageForward`},{tool:`page_list_frames`,method:`handlePageListFrames`},{tool:`page_click`,method:`handlePageClick`},{tool:`page_type`,method:`handlePageType`},{tool:`page_upload_files`,method:`handlePageUploadFiles`},{tool:`page_select`,method:`handlePageSelect`},{tool:`page_hover`,method:`handlePageHover`},{tool:`page_scroll`,method:`handlePageScroll`},{tool:`page_wait_for_selector`,method:`handlePageWaitForSelector`},{tool:`page_evaluate`,method:`handlePageEvaluate`},{tool:`page_screenshot`,method:`handlePageScreenshot`},{tool:`get_all_scripts`,method:`handleGetAllScripts`},{tool:`get_script_source`,method:`handleGetScriptSource`},{tool:`console_monitor`,method:`handleConsoleMonitor`},{tool:`console_get_logs`,method:`handleConsoleGetLogs`},{tool:`console_execute`,method:`handleConsoleExecute`},{tool:`page_inject_script`,method:`handlePageInjectScript`},{tool:`page_cookies`,method:`handlePageCookiesDispatch`},{tool:`page_set_viewport`,method:`handlePageSetViewport`},{tool:`page_emulate_device`,method:`handlePageEmulateDevice`},{tool:`page_local_storage`,method:`handlePageLocalStorageDispatch`},{tool:`page_press_key`,method:`handlePagePressKey`},{tool:`captcha_detect`,method:`handleCaptchaDetect`},{tool:`captcha_wait`,method:`handleCaptchaWait`},{tool:`captcha_config`,method:`handleCaptchaConfig`},{tool:`stealth_inject`,method:`handleStealthInject`},{tool:`stealth_set_user_agent`,method:`handleStealthSetUserAgent`},{tool:`stealth_configure_jitter`,method:`handleStealthConfigureJitter`},{tool:`stealth_generate_fingerprint`,method:`handleStealthGenerateFingerprint`},{tool:`stealth_verify`,method:`handleStealthVerify`},{tool:`camoufox_geolocation`,method:`handleCamoufoxGeolocation`},{tool:`camoufox_server`,method:`handleCamoufoxServerDispatch`},{tool:`framework_state_extract`,method:`handleFrameworkStateExtract`},{tool:`indexeddb_dump`,method:`handleIndexedDBDump`},{tool:`js_heap_search`,method:`handleJSHeapSearch`},{tool:`tab_workflow`,method:`handleTabWorkflow`},{tool:`browser_codegen_start`,method:`handleBrowserCodegenStart`},{tool:`browser_codegen_stop`,method:`handleBrowserCodegenStop`},{tool:`human_mouse`,method:`handleHumanMouse`},{tool:`human_scroll`,method:`handleHumanScroll`},{tool:`human_typing`,method:`handleHumanTyping`},{tool:`captcha_solver_capabilities`,method:`handleCaptchaSolverCapabilities`},{tool:`captcha_vision_solve`,method:`handleCaptchaVisionSolve`},{tool:`widget_challenge_solve`,method:`handleWidgetChallengeSolve`},{tool:`browser_jsdom_parse`,method:`handleJsdomParse`},{tool:`browser_jsdom_query`,method:`handleJsdomQuery`},{tool:`browser_jsdom_execute`,method:`handleJsdomExecute`},{tool:`browser_jsdom_serialize`,method:`handleJsdomSerialize`},{tool:`browser_jsdom_cookies`,method:`handleJsdomCookies`}]});async function u(n){let{BrowserToolHandlers:r}=await import(`./browser-Qqco2rOT.mjs`);if(await i(n),!n.browserHandlers){let i=n,a=typeof n.getDomainInstance==`function`?n.getDomainInstance.bind(n):null,o=typeof n.setDomainInstance==`function`?n.setDomainInstance.bind(n):null,s=a?.(`browserSessionCoordinator`)??i.browserSessionCoordinator??new t(()=>n.collector);o?o(`browserSessionCoordinator`,s):i.browserSessionCoordinator=s,n.browserHandlers=new r(n.collector,n.pageController,n.scriptManager,n.consoleMonitor,n.eventBus,()=>s.getCurrentSessionId(),s,t=>{e(n)?.setBrowserAttach(t)})}return n.browserHandlers}const d={kind:`domain-manifest`,version:1,domain:s,depKey:c,profiles:[`workflow`,`full`],ensure:u,workflowRule:{patterns:[/(browser|page|navigate|screenshot|click|type|scrape)/i,/(浏览器|页面|导航|截图|点击|输入|爬取)/i],priority:90,tools:[`page_navigate`,`page_evaluate`,`browser_jsdom_parse`,`console_get_logs`,`page_click`,`page_type`,`page_screenshot`],hint:`Browser automation workflow: bootstrap browser/page state -> inspect page state -> interact -> capture visual evidence only when needed`},prerequisites:{page_navigate:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_click:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_type:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_upload_files:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_screenshot:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_evaluate:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_hover:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_back:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_forward:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_reload:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_scroll:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}]},registrations:l};export{d as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./tool-builder-qif8M9-K.mjs";import{t as r}from"./authorization-schema-BOFwSXUN.mjs";const i=[`before-load-inject`,`runtime-hook`,`network-intercept`,`function-trace`],a=[n(`instrumentation_session`,e=>e.desc(`Start, stop, or query status of an instrumentation recording session.`).enum(`action`,[`create`,`list`,`destroy`,`status`],`Session operation`).string(`name`,`Optional session name for create`).string(`sessionId`,`Session ID (required for destroy/status)`).required(`action`)),n(`instrumentation_operation`,e=>e.desc(`Manage operations inside an instrumentation session.`).enum(`action`,[`register`,`list`],`Operation`).string(`sessionId`,`Session ID`).enum(`type`,i,`Instrumentation type (action=register)`).string(`target`,`Function name, URL pattern, or script target (action=register)`).object(`config`,{},`Operation-specific config (action=register)`).required(`action`,`sessionId`)),n(`instrumentation_artifact`,e=>e.desc(`Manage artifacts captured by instrumentation operations.`).enum(`action`,[`record`,`query`],`Artifact operation`).string(`sessionId`,`Session ID`).string(`operationId`,`Operation ID (action=record)`).object(`data`,{},`Captured artifact payload (action=record)`).enum(`type`,i,`Optional artifact type filter (action=query)`).number(`limit`,`Max artifacts to return (action=query, default: 50)`,{default:50}).required(`action`,`sessionId`)),n(`instrumentation_hook_preset`,e=>e.desc(`Apply hook presets inside an instrumentation session.`).string(`sessionId`,`Session ID`).string(`preset`,`Single preset id to inject`).array(`presets`,{type:`string`},`Multiple preset ids to inject in one call`).boolean(`captureStack`,`Whether injected presets should capture stack traces`,{default:!1}).boolean(`logToConsole`,`Whether injected presets should log to console`,{default:!0}).enum(`method`,[`evaluate`,`evaluateOnNewDocument`],`Injection method forwarded to hook_preset`,{default:`evaluate`}).prop(`customTemplate`,{type:`object`,additionalProperties:!0,description:`Optional inline custom preset definition`}).prop(`customTemplates`,{type:`array`,items:{type:`object`,additionalProperties:!0},description:`Optional inline custom preset definitions`}).requiredOpenWorld(`sessionId`)),n(`instrumentation_network_replay`,e=>e.desc(`Replay a captured network request inside an instrumentation session.`).string(`sessionId`,`Session ID`).string(`requestId`,`Captured request ID returned by network_get_requests`).object(`headerPatch`,{additionalProperties:{type:`string`}},`Optional request header overrides`).string(`bodyPatch`,`Optional raw request body override`).string(`methodOverride`,`Optional HTTP method override`).string(`urlOverride`,`Optional destination URL override`).object(`authorization`,r,`Optional request-scoped authorization for private-network or insecure-HTTP replay.`).string(`authorizationCapability`,`Optional base64url-encoded request-scoped authorization capability.`).number(`timeoutMs`,`Optional replay timeout in milliseconds`).boolean(`dryRun`,`Preview the replay without sending the request`,{default:!0}).requiredOpenWorld(`sessionId`,`requestId`))],o=`instrumentation`,s=`instrumentationHandlers`,c=t({domain:o,depKey:s,lookup:e(a),entries:[{tool:`instrumentation_session`,method:`handleSessionDispatch`},{tool:`instrumentation_operation`,method:`handleOperationDispatch`},{tool:`instrumentation_artifact`,method:`handleArtifactDispatch`},{tool:`instrumentation_hook_preset`,method:`handleHookPreset`},{tool:`instrumentation_network_replay`,method:`handleNetworkReplay`}]});async function l(e){let{ReverseEvidenceGraph:t}=await import(`./ReverseEvidenceGraph-BhSYYdiI.mjs`).then(e=>e.t),{InstrumentationSessionManager:n}=await import(`./InstrumentationSession-D_G1ZPyd.mjs`),{EvidenceGraphBridge:r}=await import(`./EvidenceGraphBridge-BtbwXsLC.mjs`),{InstrumentationHandlers:i}=await import(`./handlers-B62K4FTc.mjs`),a=e.handlerDeps.hookPresetHandlers,o=e.handlerDeps.advancedHandlers,s=e.getDomainInstance(`evidenceGraph`);s||(s=new t,e.setDomainInstance(`evidenceGraph`,s));let c=e.getDomainInstance(`instrumentationSessionManager`);c||(c=new n,e.setDomainInstance(`instrumentationSessionManager`,c));let l=e.getDomainInstance(`evidenceGraphBridge`);return l||(l=new r(s),e.setDomainInstance(`evidenceGraphBridge`,l)),c.setEvidenceBridge(l),e.instrumentationHandlers||=new i(c,{hookPresetHandlers:a,advancedHandlers:o}),e.instrumentationHandlers}const u={kind:`domain-manifest`,version:1,domain:o,depKey:s,profiles:[`full`],ensure:l,workflowRule:{patterns:[/(hook|intercept|trace|instrument).*(session|unified|manage|all)/i,/(session|统一|会话).*(hook|拦截|追踪|仪器化|instrument)/i],priority:95,tools:[`instrumentation_session`,`instrumentation_operation`,`instrumentation_artifact`,`instrumentation_hook_preset`,`instrumentation_network_replay`],hint:`Instrumentation session: create session → attach hook presets / network replay → record artifacts → query artifacts → destroy when done`},registrations:c};export{u as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./definitions-Bio5XJYy.mjs";const r=`binary-secrets`,i=`binarySecretsHandlers`,a=t({domain:r,depKey:i,lookup:e(n),entries:[{tool:`binary_key_extract`,method:`handleBinaryKeyExtract`}]});async function o(e){let{BinarySecretsHandlers:t}=await import(`./binary-secrets-PdMVoyt0.mjs`);return e.binarySecretsHandlers||=new t,e.binarySecretsHandlers}const s={kind:`domain-manifest`,version:1,domain:r,depKey:i,profiles:[`full`],ensure:o,registrations:a};export{s as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./ensure-browser-core-DxWC-NTp.mjs";import{t as r}from"./definitions-bybDvnG0.mjs";const i=`debugger`,a=`debuggerHandlers`,o=t({domain:i,depKey:a,lookup:e(r),entries:[{tool:`debugger_lifecycle`,method:`handleDebuggerLifecycle`},{tool:`debugger_pause`,method:`handleDebuggerPause`},{tool:`debugger_resume`,method:`handleDebuggerResume`},{tool:`debugger_step`,method:`handleDebuggerStep`},{tool:`breakpoint`,method:`handleBreakpoint`},{tool:`get_call_stack`,method:`handleGetCallStack`},{tool:`debugger_evaluate`,method:`handleDebuggerEvaluateDispatch`},{tool:`debugger_wait_for_paused`,method:`handleDebuggerWaitForPaused`},{tool:`debugger_get_paused_state`,method:`handleDebuggerGetPausedState`},{tool:`get_object_properties`,method:`handleGetObjectProperties`},{tool:`get_scope_variables_enhanced`,method:`handleGetScopeVariablesEnhanced`},{tool:`debugger_session`,method:`handleDebuggerSession`},{tool:`watch`,method:`handleWatch`},{tool:`blackbox_add`,method:`handleBlackboxAdd`},{tool:`blackbox_add_common`,method:`handleBlackboxAddCommon`},{tool:`blackbox_list`,method:`handleBlackboxList`}]});async function s(e){let{DebuggerManager:t,RuntimeInspector:r}=await import(`./modules-BPBcSaM-.mjs`).then(e=>e.t),{DebuggerToolHandlers:i}=await import(`./debugger-DyALjYMk.mjs`);return await n(e),(!e.debuggerManager||!e.runtimeInspector||!e.debuggerHandlers)&&(e.debuggerManager||=new t(e.collector),e.runtimeInspector||=new r(e.collector,e.debuggerManager),e.debuggerHandlers||=new i(e.debuggerManager,e.runtimeInspector,e.eventBus)),e.debuggerHandlers}const c={kind:`domain-manifest`,version:1,domain:i,depKey:a,profiles:[`workflow`,`full`],ensure:s,prerequisites:{debugger_lifecycle:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],breakpoint:[{condition:`Browser must be launched`,fix:`Call browser_launch and debugger_lifecycle(enable) first`}]},registrations:o};export{c as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./ensure-browser-core-DxWC-NTp.mjs";import{t as r}from"./definitions-CB6vmOer.mjs";const i=`encoding`,a=`encodingHandlers`,o=t({domain:i,depKey:a,lookup:e(r),entries:[{tool:`binary_detect_format`,method:`handleBinaryDetectFormat`},{tool:`binary_decode`,method:`handleBinaryDecode`},{tool:`binary_encode`,method:`handleBinaryEncode`},{tool:`binary_entropy_analysis`,method:`handleBinaryEntropyAnalysis`},{tool:`protobuf_decode_raw`,method:`handleProtobufDecodeRaw`}]});async function s(e){let{EncodingToolHandlers:t}=await import(`./encoding-ycOaz8Vr.mjs`);return await n(e),e.encodingHandlers||=new t(e.collector,async t=>e.consoleMonitor?.getResponseBody(t)??null),e.encodingHandlers}const c={kind:`domain-manifest`,version:1,domain:i,depKey:a,profiles:[`workflow`,`full`],ensure:s,registrations:o};export{c as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./tool-builder-qif8M9-K.mjs";const r=[n(`execute_sandbox_script`,e=>e.desc(`Execute JavaScript in an isolated sandbox.`).string(`code`,`JavaScript source code to execute inside the sandbox`).string(`sessionId`,`Session ID for scratchpad persistence across executions`).number(`timeoutMs`,`Execution timeout in ms`,{default:1e3}).boolean(`autoCorrect`,`Retry failed scripts up to 2 times with error context`,{default:!1}).required(`code`))],i=`sandbox`,a=`sandboxHandlers`,o=t({domain:i,depKey:a,lookup:e(r),entries:[{tool:`execute_sandbox_script`,method:`handleExecuteSandboxScript`}]});async function s(e){let{SandboxToolHandlers:t}=await import(`./handlers-mPFiNPe8.mjs`),n=e.getDomainInstance(a);if(n)return n;let r=new t(e);return e.setDomainInstance(a,r),r}const c={kind:`domain-manifest`,version:1,domain:i,depKey:a,profiles:[`full`],ensure:s,registrations:o};export{c as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./definitions-DxFNRQNK2.mjs";const r=`transform`,i=`transformHandlers`,a=t({domain:r,depKey:i,lookup:e(n),entries:[{tool:`ast_transform_preview`,method:`handleAstTransformPreview`},{tool:`ast_transform_chain`,method:`handleAstTransformChain`},{tool:`ast_transform_apply`,method:`handleAstTransformApply`},{tool:`crypto_extract_standalone`,method:`handleCryptoExtractStandalone`},{tool:`crypto_test_harness`,method:`handleCryptoTestHarness`},{tool:`crypto_compare`,method:`handleCryptoCompare`}]});async function o(e){let{CodeCollector:t}=await import(`./collector-Bpl6qy2L.mjs`),{TransformToolHandlers:n}=await import(`./transform-DOxzeWPB.mjs`);return e.collector||(e.collector=new t(e.config.puppeteer),e.registerCaches()),e.transformHandlers||=new n(e.collector),e.transformHandlers}const s={kind:`domain-manifest`,version:1,domain:r,depKey:i,profiles:[`full`],ensure:o,registrations:a};export{s as default};
@@ -1 +0,0 @@
1
- import{i as e}from"./response-C7rKQst4.mjs";import{t}from"./registry-DH4sc1dt.mjs";import{n}from"./bind-helpers-m2U8glkF.mjs";const r=[{name:`skia_detect_renderer`,description:`Detect the active Skia renderer backend from the current page context.`,inputSchema:{type:`object`,properties:{},required:[]}},{name:`skia_extract_scene`,description:`Extract a lightweight Skia scene tree from the selected canvas.`,inputSchema:{type:`object`,properties:{canvasId:{type:`string`}},required:[]}},{name:`skia_correlate_objects`,description:`Correlate requested Skia node identifiers with the extracted scene tree.`,inputSchema:{type:`object`,properties:{canvasId:{type:`string`,description:`Optional canvas element ID to target for correlation.`},skiaNodeIds:{type:`array`,items:{type:`string`},description:`Optional list of Skia node identifiers to correlate.`}},required:[]}}],i=`skia-capture`,a=`skiaCaptureHandlers`,o=[`workflow`,`full`],s=n({domain:i,depKey:a,lookup:t(r),wrapResult:e,entries:[{tool:`skia_detect_renderer`,method:`handleSkiaDetectRenderer`},{tool:`skia_extract_scene`,method:`handleSkiaExtractScene`},{tool:`skia_correlate_objects`,method:`handleSkiaCorrelateObjects`}]});async function c(e){let{SkiaCaptureHandlers:t}=await import(`./handlers-8zN_vBIz.mjs`),n=e.getDomainInstance(a);if(n)return n;let r=new t({pageController:e.pageController??null,eventBus:e.eventBus});return e.setDomainInstance(a,r),r}const l={kind:`domain-manifest`,version:1,domain:i,depKey:a,profiles:o,registrations:s,ensure:c,workflowRule:{patterns:[/\b(skia|gpu|render(er)?|scene\s?(tree|graph)|draw\s?call|raster|paint|layer)\b/i,/skia.*(render|detect|scene)/i,/canvas.*skia/i,/gpu.*backend/i],priority:78,tools:[`skia_detect_renderer`,`skia_extract_scene`,`skia_correlate_objects`],hint:`Skia pipeline analysis: detect GPU backend → dump scene tree → correlate with JS objects.`},prerequisites:{skia_detect_renderer:[{condition:`Browser must be running with CDP attached`,fix:`Call browser_launch or browser_attach first`}],skia_extract_scene:[{condition:`Browser must be running with CDP attached`,fix:`Call browser_launch or browser_attach first`}],skia_correlate_objects:[{condition:`V8 heap snapshot should be available for robust matching`,fix:`Run v8_heap_snapshot_capture before correlation`}]},toolDependencies:[{from:`canvas`,to:`skia-capture`,relation:`uses`,weight:.9},{from:`skia_correlate_objects`,to:`v8_heap_snapshot_capture`,relation:`precedes`,weight:.6}]};export{l as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./ensure-browser-core-DxWC-NTp.mjs";import{t as r}from"./tool-builder-qif8M9-K.mjs";const i=[r(`canvas_engine_fingerprint`,e=>e.desc(`Detect Canvas/WebGL game engines in the page.`).query()),r(`canvas_scene_dump`,e=>e.desc(`Extract the full scene tree / display list from a detected canvas engine.`).string(`canvasId`,`Canvas element ID or index to target`).number(`maxDepth`,`Maximum tree traversal depth`,{default:20}).boolean(`onlyInteractive`,`Only include interactive (mouseEnabled) nodes`,{default:!1}).boolean(`onlyVisible`,`Only include visible nodes`,{default:!1}).query()),r(`canvas_pick_object_at_point`,e=>e.desc(`Pick / hit-test the topmost object at a given screen coordinate using the engine's hit-test system`).number(`x`,`Screen X coordinate`).number(`y`,`Screen Y coordinate`).string(`canvasId`,`Canvas element ID or index to target`).boolean(`highlight`,`Draw a highlight rectangle on the picked object`,{default:!1}).required(`x`,`y`).readOnly()),r(`canvas_trace_click_handler`,e=>e.desc(`Trace a click event from DOM to JS call stack.`).number(`x`,`Screen X coordinate to click`).number(`y`,`Screen Y coordinate to click`).string(`canvasId`,`Canvas element ID or index to target`).enum(`breakpointType`,[`click`,`mousedown`,`pointerdown`],`Event breakpoint type`,{default:`click`}).number(`maxFrames`,`Maximum call stack frames to capture`,{default:50}).requiredOpenWorld(`x`,`y`))],a=`canvas`,o=`canvasHandlers`,s=t({domain:a,depKey:o,lookup:e(i),entries:[{tool:`canvas_engine_fingerprint`,method:`handleFingerprint`},{tool:`canvas_scene_dump`,method:`handleSceneDump`},{tool:`canvas_pick_object_at_point`,method:`handlePick`},{tool:`canvas_trace_click_handler`,method:`handleTraceClick`}]});async function c(e){let{DebuggerManager:t}=await import(`./modules-BPBcSaM-.mjs`).then(e=>e.t),{TraceRecorder:r}=await import(`./TraceRecorder-BiJWBXHX.mjs`),{ReverseEvidenceGraph:i}=await import(`./ReverseEvidenceGraph-BhSYYdiI.mjs`).then(e=>e.t),{CanvasToolHandlers:a}=await import(`./handlers-yo_xYzT8.mjs`);await n(e),e.debuggerManager||=new t(e.collector),e.traceRecorder||=new r;let o=e.getDomainInstance(`evidenceGraph`);return o||(o=new i,e.setDomainInstance(`evidenceGraph`,o)),e.canvasHandlers||=new a({pageController:e.pageController,debuggerManager:e.debuggerManager,traceRecorder:e.traceRecorder,evidenceStore:o}),e.canvasHandlers}const l={kind:`domain-manifest`,version:1,domain:a,depKey:o,profiles:[`full`],ensure:c,workflowRule:{patterns:[/(canvas|scene|engine|game).*(pick|dump|trace|reverse)/i,/(canvas|webgl|webgpu|scene).*(graph|tree|node)/i,/(laya|pixi|phaser|cocos|unity).*(reverse|scene|dump|hook)/i],priority:80,tools:[`canvas_engine_fingerprint`,`canvas_scene_dump`,`canvas_pick_object_at_point`,`canvas_trace_click_handler`],hint:`Canvas reverse: fingerprint engine → dump scene tree → pick object at point → trace click to handler`},prerequisites:{canvas_engine_fingerprint:[{condition:`Browser must be running`,fix:`Call browser_launch or browser_attach first`}],canvas_scene_dump:[{condition:`Browser must be running`,fix:`Call browser_launch or browser_attach first`}],canvas_pick_object_at_point:[{condition:`Browser must be running`,fix:`Call browser_launch or browser_attach first`}],canvas_trace_click_handler:[{condition:`Debugger must be enabled`,fix:`Call debugger_lifecycle({ action: 'enable' }) first`}]},registrations:s};export{l as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./ensure-browser-core-DxWC-NTp.mjs";import{n as r,t as i}from"./definitions-OeLvmlQy.mjs";const a=`hooks`,o=`aiHookHandlers`,s=e([...i,...r]),c=t({domain:a,depKey:o,lookup:s,entries:[{tool:`ai_hook`,method:`handleAIHook`}]}),l=t({domain:a,depKey:`hookPresetHandlers`,lookup:s,entries:[{tool:`hook_preset`,method:`handleHookPreset`}]});async function u(e){let{AIHookToolHandlers:t,HookPresetToolHandlers:r}=await import(`./hooks-D4XLfgtV.mjs`);return await n(e),(!e.aiHookHandlers||!e.hookPresetHandlers)&&(e.aiHookHandlers||=new t(e.pageController),e.hookPresetHandlers||=new r(e.pageController)),e.aiHookHandlers}const d={kind:`domain-manifest`,version:1,domain:a,depKey:o,secondaryDepKeys:[`hookPresetHandlers`],profiles:[`full`],ensure:u,registrations:[...c,...l]};export{d as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{i as n,n as r,r as i,t as a}from"./definitions-Bf3H1EwV.mjs";const o=`maintenance`,s=`coreMaintenanceHandlers`,c=[...n,...r,...a],l=[...i],u=e([...c,...l]),d=t({domain:o,depKey:s,lookup:u,entries:[{tool:`get_token_budget_stats`,method:`handleGetTokenBudgetStats`,profiles:[`workflow`,`full`]},{tool:`manual_token_cleanup`,method:`handleManualTokenCleanup`},{tool:`reset_token_budget`,method:`handleResetTokenBudget`},{tool:`get_cache_stats`,method:`handleGetCacheStats`,profiles:[`workflow`,`full`]},{tool:`smart_cache_cleanup`,method:`handleSmartCacheCleanup`,mapArgs:e=>[e.targetSize]},{tool:`clear_all_caches`,method:`handleClearAllCaches`},{tool:`cleanup_artifacts`,method:`handleCleanupArtifacts`,mapArgs:e=>[{retentionDays:e.retentionDays,maxTotalBytes:e.maxTotalBytes,dryRun:e.dryRun}]},{tool:`doctor_environment`,method:`handleEnvironmentDoctor`,mapArgs:e=>[{includeBridgeHealth:e.includeBridgeHealth}]}]}),f=t({domain:o,depKey:`extensionManagementHandlers`,lookup:u,entries:[{tool:`list_extensions`,method:`handleListExtensions`,profiles:[`workflow`,`full`]},{tool:`reload_extensions`,method:`handleReloadExtensions`},{tool:`browse_extension_registry`,method:`handleBrowseExtensionRegistry`,profiles:[`workflow`,`full`],mapArgs:e=>[e.kind??`all`]},{tool:`install_extension`,method:`handleInstallExtension`,mapArgs:e=>[e.slug,e.targetDir]}]});async function p(e){let{CoreMaintenanceHandlers:t,ExtensionManagementHandlers:n}=await import(`./maintenance-BUpIukhg.mjs`);return(!e.coreMaintenanceHandlers||!e.extensionManagementHandlers)&&(e.coreMaintenanceHandlers||=new t({tokenBudget:e.tokenBudget,unifiedCache:e.unifiedCache}),e.extensionManagementHandlers||=new n(e)),e.coreMaintenanceHandlers}const m={kind:`domain-manifest`,version:1,domain:o,depKey:s,secondaryDepKeys:[`extensionManagementHandlers`],profiles:[`workflow`,`full`],ensure:p,registrations:[...d,...f]};export{m as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./tool-builder-qif8M9-K.mjs";const r=[n(`run_macro`,e=>e.desc(`Execute a registered macro by ID with inline progress and atomic bailout.`).string(`macroId`,`Macro ID to execute`).prop(`inputOverrides`,{type:`object`,description:`Per-step input overrides keyed by step ID`,additionalProperties:{type:`object`,additionalProperties:!0}}).required(`macroId`)),n(`list_macros`,e=>e.desc(`List all available macros.`).query())],i=`macro`,a=`macroHandlers`,o=t({domain:i,depKey:a,lookup:e(r),entries:[{tool:`run_macro`,method:`handleRunMacro`},{tool:`list_macros`,method:`handleListMacros`}]});async function s(e){let{MacroToolHandlers:t}=await import(`./handlers-FJ80VzUI.mjs`),n=e.getDomainInstance(a);if(n)return n;let r=new t(e);return e.setDomainInstance(a,r),r}const c={kind:`domain-manifest`,version:1,domain:i,depKey:a,profiles:[`full`],ensure:s,registrations:o};export{c as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./tool-builder-qif8M9-K.mjs";const r=[n(`adb_device_list`,e=>e.desc(`List all connected Android devices and emulators.`).query()),n(`adb_shell`,e=>e.desc(`Execute an ADB shell command on a specific device.`).string(`serial`,`Android device serial or emulator id`).string(`command`,`Shell command to run (e.g. "getprop ro.build.version.release")`).required(`serial`,`command`)),n(`adb_apk_pull`,e=>e.desc(`Pull an APK from a device to the local filesystem.`).string(`serial`,`Android device serial or emulator id`).string(`packageName`,`Android package name (e.g. com.example.app)`).string(`outputPath`,`Local directory to save the APK (default: current directory)`).required(`serial`,`packageName`)),n(`adb_apk_analyze`,e=>e.desc(`Analyze an installed APK: package, permissions, activities, and security info.`).string(`serial`,`Required. Android device serial or emulator id.`).string(`packageName`,`Required. Android package name, for example com.example.app.`).requiredOpenWorld(`serial`,`packageName`)),n(`adb_pull_native_libs`,e=>e.desc(`Pull native shared libraries (.so) for an installed app from a device.`).string(`serial`,`Required. Android device serial or emulator id.`).string(`packageName`,`Required. Android package name, for example com.example.app.`).string(`outputPath`,`Optional. Local directory to save extracted libraries into (default: current directory).`).boolean(`includeSystemLibs`,`Optional. Include system/nativeLibraryDir entries outside the app package path.`,{default:!1}).requiredOpenWorld(`serial`,`packageName`)),n(`adb_webview_list`,e=>e.desc(`List debuggable WebView targets connected via ADB.`).string(`serial`,`Required. Android device serial or emulator id.`).number(`hostPort`,`Optional. Local port to use for forwarding.`,{default:9222}).requiredOpenWorld(`serial`)),n(`adb_webview_attach`,e=>e.desc(`Attach to a WebView via ADB; returns WebSocket debugger URL for CDP.`).string(`serial`,`Required. Android device serial or emulator id.`).string(`targetId`,`Required. WebView target id returned by adb_webview_list.`).number(`hostPort`,`Optional. Local port to use for forwarding.`,{default:9222}).requiredOpenWorld(`serial`,`targetId`))],i=`adb-bridge`,a=`adbBridgeHandlers`,o=t({domain:i,depKey:a,lookup:e(r),entries:[{tool:`adb_device_list`,method:`handleDeviceList`},{tool:`adb_apk_pull`,method:`handleApkPull`},{tool:`adb_shell`,method:`handleShell`},{tool:`adb_apk_analyze`,method:`handleAnalyzeApk`},{tool:`adb_pull_native_libs`,method:`handlePullNativeLibs`},{tool:`adb_webview_list`,method:`handleWebViewList`},{tool:`adb_webview_attach`,method:`handleWebViewAttach`}]});async function s(e){let{ADBBridgeHandlers:t}=await import(`./handlers-DHO3rjsW.mjs`),n=e.getDomainInstance(a);if(n)return n;let r=new t;return e.setDomainInstance(a,r),r}const c={kind:`domain-manifest`,version:1,domain:i,depKey:a,profiles:[`full`],registrations:o,ensure:s,workflowRule:{patterns:[/(android|adb|mobile|apk|device).*(list|shell|pull|analyze|dump)/i,/(adb|android).*(webview|chrome|debug|cdp|inspect)/i,/(android|adb).*(native|\.so|libapp|libflutter|shared\s+library)/i],priority:75,tools:[`adb_device_list`,`adb_shell`,`adb_apk_pull`,`adb_apk_analyze`,`adb_pull_native_libs`,`adb_webview_list`,`adb_webview_attach`],hint:`Android/ADB: list devices → run shell commands → pull/analyze APK or native libs → debug WebViews via CDP`},prerequisites:{"*":[{condition:`ADB server binary must be in PATH`,fix:`Install Android Platform Tools: https://developer.android.com/studio/command-line/adb`}],adb_webview_list:[{condition:`App must have android:debuggable="true"`,fix:`Use a debug build of the Android app`}],adb_webview_attach:[{condition:`App must have android:debuggable="true"`,fix:`Use a debug build of the Android app`}]},toolDependencies:[{from:`browser`,to:`adb-bridge`,relation:`uses`,weight:.7}]};export{c as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./definitions-DP1vgxEY.mjs";const r=`jadx-search`,i=`jadxSearchHandlers`,a=t({domain:r,depKey:i,lookup:e(n),entries:[{tool:`jadx_search_code`,method:`handleJadxSearchCode`}]});async function o(e){let{JadxSearchHandlers:t}=await import(`./jadx-search-B_Yse0Zh.mjs`);return e.jadxSearchHandlers||=new t,e.jadxSearchHandlers}const s={kind:`domain-manifest`,version:1,domain:r,depKey:i,profiles:[`full`],ensure:o,registrations:a};export{s as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./registry-DH4sc1dt.mjs";import{n as t}from"./bind-helpers-m2U8glkF.mjs";import{t as n}from"./ensure-browser-core-DxWC-NTp.mjs";import{t as r}from"./definitions-RZYGD_Ey.mjs";const i=`streaming`,a=`streamingHandlers`,o=t({domain:i,depKey:a,lookup:e(r),entries:[{tool:`ws_monitor`,method:`handleWsMonitorDispatch`},{tool:`ws_get_frames`,method:`handleWsGetFrames`},{tool:`ws_get_connections`,method:`handleWsGetConnections`},{tool:`sse_monitor_enable`,method:`handleSseMonitorEnable`},{tool:`sse_get_events`,method:`handleSseGetEvents`}]});async function s(e){let{StreamingToolHandlers:t}=await import(`./streaming-BcJ0B6ao.mjs`);return await n(e),e.streamingHandlers||=new t(e.collector),e.streamingHandlers}const c={kind:`domain-manifest`,version:1,domain:i,depKey:a,profiles:[`workflow`,`full`],ensure:s,registrations:o};export{c as default};