@jshookmcp/jshook 0.3.1 → 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 (249) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +11 -3
  3. package/README.zh.md +11 -3
  4. package/dist/{AntiCheatDetector-CGVGNfy5.mjs → AntiCheatDetector-CUpZBh5O.mjs} +1 -1
  5. package/dist/BrowserSessionCoordinator-QIt3tetp.mjs +1 -0
  6. package/dist/CodeInjector-Btj9upnf.mjs +1 -0
  7. package/dist/ConsoleMonitor-DIjN5Afa.mjs +306 -0
  8. package/dist/{DarwinAPI-DC4HGGLl.mjs → DarwinAPI-BuMPGzHm.mjs} +1 -1
  9. package/dist/DetailedDataManager-Z77fDl9Z.mjs +5 -0
  10. package/dist/ExtensionManager.tools-CIGOWViz.mjs +1 -0
  11. package/dist/{FingerprintManager-N7BZqjxP.mjs → FingerprintManager-BkDSsjjP.mjs} +1 -1
  12. package/dist/{HardwareBreakpoint-OcJqNFVc.mjs → HardwareBreakpoint-DMAMcPyB.mjs} +1 -1
  13. package/dist/{HeapAnalyzer-CqAxZzeS.mjs → HeapAnalyzer-Yj348FYt.mjs} +1 -1
  14. package/dist/MCPServer.activation.ttl-CEGNBycZ.mjs +1 -0
  15. package/dist/MCPServer.search.helpers-Cs1JpKbu.mjs +1 -0
  16. package/dist/MCPServer.search.validation-DnifPCCv.mjs +1 -0
  17. package/dist/MemoryController-DjtgiING.mjs +2 -0
  18. package/dist/{MemoryScanSession-CaxAjZJf.mjs → MemoryScanSession-zfoVZJB0.mjs} +1 -1
  19. package/dist/MemoryScanner-Dxd657li.mjs +1 -0
  20. package/dist/{NativeMemoryManager.utils-DM4NC3FE.mjs → NativeMemoryManager.utils-Bu8srMEF.mjs} +1 -1
  21. package/dist/{PEAnalyzer-DJyaJTQJ.mjs → PEAnalyzer-CMu9Ua9T.mjs} +1 -1
  22. package/dist/PointerChainEngine-CaSC1Mry.mjs +1 -0
  23. package/dist/ProcessRegistry-D5y1yuP2.mjs +1 -0
  24. package/dist/{ResponseBuilder-B2lu4KEl.mjs → ResponseBuilder-nPXl_khE.mjs} +1 -1
  25. package/dist/{ReverseEvidenceGraph-B931HeoW.mjs → ReverseEvidenceGraph-BksOpsPs.mjs} +1 -1
  26. package/dist/RingBuffer-B6RTHmij.mjs +1 -0
  27. package/dist/ServerRuntimeState-CgqBBwfd.mjs +1 -0
  28. package/dist/{Speedhack-l6s8L2Qw.mjs → Speedhack-pwXTHxOY.mjs} +1 -1
  29. package/dist/{StructureAnalyzer-A-WamfYE.mjs → StructureAnalyzer-BseGzsSl.mjs} +2 -2
  30. package/dist/ToolCatalog-DgmQXdsm.mjs +1 -0
  31. package/dist/ToolHandlerMap-7HWoIgQO.mjs +1 -0
  32. package/dist/ToolProbe-DQiREmNp.mjs +1 -0
  33. package/dist/ToolRegistry-eMZEBiR1.mjs +1 -0
  34. package/dist/ToolRouter.policy-UKBlFlbh.mjs +4 -0
  35. package/dist/{TraceRecorder-Dd8jLXpi.mjs → TraceRecorder-B5ktv3nP.mjs} +2 -2
  36. package/dist/VersionDetector-CmPJmaJg.mjs +1 -0
  37. package/dist/{Win32API-Bhi5xFBe.mjs → Win32API-DoP3MMHS.mjs} +1 -1
  38. package/dist/{Win32Debug-CQteFL4F.mjs → Win32Debug-DwF8mQGm.mjs} +1 -1
  39. package/dist/{WorkflowEngine-CxEp2WXH.mjs → WorkflowEngine-CldHG5b4.mjs} +1 -1
  40. package/dist/analysis-C-ln0Brh.mjs +6 -0
  41. package/dist/antidebug-CsnpOR9z.mjs +1 -0
  42. package/dist/{artifactRetention-NBdncOEW.mjs → artifactRetention-DkYKLOvi.mjs} +1 -1
  43. package/dist/{artifacts-B5xQuEa_.mjs → artifacts-D-4pSS_N.mjs} +1 -1
  44. package/dist/betterSqlite3-Bdo_ifuJ.mjs +1 -0
  45. package/dist/binary-instrument-BeZ224mZ.mjs +9 -0
  46. package/dist/{boringssl-inspector-BST5vtKx.mjs → boringssl-inspector-ZOCkaipa.mjs} +2 -2
  47. package/dist/browser-BUaB25bk.mjs +11 -0
  48. package/dist/{handlers-pVNpaw4A.mjs → canvas-396ieNv5.mjs} +22 -22
  49. package/dist/collector-CB2syQEg.mjs +1 -0
  50. package/dist/constants-DMv3svps.mjs +2 -0
  51. package/dist/coordination-Dbohmj6D.mjs +1 -0
  52. package/dist/dart-inspector-LhEqRITQ.mjs +0 -0
  53. package/dist/debugger-CLzkObIO.mjs +1 -0
  54. package/dist/{definitions-CCP9gphV.mjs → definitions-0hxnrDU72.mjs} +1 -1
  55. package/dist/definitions-B3a9QC2t.mjs +1 -0
  56. package/dist/{definitions-DtE0XLrT.mjs → definitions-BOvju5t2.mjs} +1 -1
  57. package/dist/definitions-CXj_cEVt.mjs +1 -0
  58. package/dist/definitions-Co6AvTjH.mjs +1 -0
  59. package/dist/{definitions-Dds_zrWx.mjs → definitions-Cv5r8xwq.mjs} +1 -1
  60. package/dist/definitions-DBYSxChX.mjs +1 -0
  61. package/dist/{definitions-DI9YXsJk.mjs → definitions-D_dTDX9B.mjs} +1 -1
  62. package/dist/{definitions-Dgrg7f3D.mjs → definitions-Db9t2ddh.mjs} +1 -1
  63. package/dist/{definitions-DZ8uKusP.mjs → definitions-DbN2CjI2.mjs} +1 -1
  64. package/dist/{definitions-jXPaVy4P.mjs → definitions-DlmmHmZc.mjs} +1 -1
  65. package/dist/definitions-DnYpoGig.mjs +1 -0
  66. package/dist/{definitions-CYFbewnd.mjs → definitions-DtZ6Ktx2.mjs} +1 -1
  67. package/dist/{definitions-CuJRsJ6N.mjs → definitions-DuIPS8gq.mjs} +1 -1
  68. package/dist/{definitions-BbxOUiP-.mjs → definitions-DywfwPMb.mjs} +1 -1
  69. package/dist/definitions-EGmqr85H.mjs +1 -0
  70. package/dist/{definitions-LaYTuwQd.mjs → definitions-Fetw_Cge.mjs} +3 -3
  71. package/dist/{definitions-NoVp_9Pm.mjs → definitions-LdkeuOeA.mjs} +1 -1
  72. package/dist/{definitions-DJklW2sS.mjs → definitions-Ym8niHDb.mjs} +1 -1
  73. package/dist/{definitions-BGwNSkVm.mjs → definitions-aeRd5DAR.mjs} +1 -1
  74. package/dist/{definitions-CIO9O-Sw.mjs → definitions-cnG6tj17.mjs} +1 -1
  75. package/dist/{encoding-DGcr6Aj_.mjs → encoding-B4xZWErf.mjs} +2 -2
  76. package/dist/ensure-browser-core-JHwDo5ql.mjs +285 -0
  77. package/dist/{factory-Cx_1LorX.mjs → factory-BxNdBiZa.mjs} +1 -1
  78. package/dist/{graphql-HLf3MS8H.mjs → graphql-GBWsZ9xC.mjs} +4 -4
  79. package/dist/{handlers-DW5AbYs5.mjs → handlers-5nzR8B0a.mjs} +3 -3
  80. package/dist/handlers-6iNsXOVT.mjs +7 -0
  81. package/dist/{handlers-BZoPla6E.mjs → handlers-BZ8n6Hvf.mjs} +1 -1
  82. package/dist/{handlers-Dv_runVv.mjs → handlers-BbLxNbbT.mjs} +1 -1
  83. package/dist/{handlers-BP12ZsWc.mjs → handlers-BbS4hssc.mjs} +2 -2
  84. package/dist/{handlers-BggKiVx9.mjs → handlers-CIKOP4aI.mjs} +2 -2
  85. package/dist/handlers-CWKBBjai.mjs +1 -0
  86. package/dist/handlers-Cmb6SoRC.mjs +1 -0
  87. package/dist/handlers-CrJsKnEI.mjs +1 -0
  88. package/dist/{antidebug-BOTZH6-0.mjs → handlers-DB6xVVWq.mjs} +4 -4
  89. package/dist/{handlers-DmQzIc44.mjs → handlers-DOOCWUNR.mjs} +3 -3
  90. package/dist/{handlers-BLMa4X7l.mjs → handlers-Z_B5aVaU.mjs} +2 -2
  91. package/dist/handlers-gVscChvl.mjs +1 -0
  92. package/dist/handlers-xFvI9P_y.mjs +1 -0
  93. package/dist/handlers.impl-BsFTW6SD.mjs +1 -0
  94. package/dist/{hooks-DDKppogd.mjs → hooks-DPouiS7I.mjs} +9 -9
  95. package/dist/index.mjs +11 -15
  96. package/dist/macro-p8kuJVcm.mjs +2 -0
  97. package/dist/maintenance-DAqADb6Z.mjs +302 -0
  98. package/dist/manifest-4lmM6MZR.mjs +1 -0
  99. package/dist/{manifest-D610kxZr.mjs → manifest-AxaxRSt6.mjs} +2 -2
  100. package/dist/{manifest-CDeUZGUZ.mjs → manifest-BIqRE1Qz.mjs} +1 -1
  101. package/dist/{manifest-Dm0o3i2U.mjs → manifest-Box-jWfr.mjs} +1 -1
  102. package/dist/manifest-Bp33di0Q.mjs +1 -0
  103. package/dist/{manifest-CGq4NpqH2.mjs → manifest-BvRX4nRP.mjs} +1 -1
  104. package/dist/{manifest-yu2xiQqe.mjs → manifest-C6KoB1XE.mjs} +1 -1
  105. package/dist/manifest-C7TdXCWY.mjs +1 -0
  106. package/dist/manifest-CM-n64K0.mjs +1 -0
  107. package/dist/{manifest-DWUUWBz0.mjs → manifest-CUokxCUN.mjs} +1 -1
  108. package/dist/manifest-CWJS45iO.mjs +1 -0
  109. package/dist/{manifest-D44TaRJU.mjs → manifest-Cdxdgo-D.mjs} +1 -1
  110. package/dist/{manifest-DKUorv5M.mjs → manifest-Cf6SmamD.mjs} +1 -1
  111. package/dist/manifest-Cgxu2qdv.mjs +1 -0
  112. package/dist/manifest-CowGSURa2.mjs +1 -0
  113. package/dist/manifest-CsGIrh34.mjs +1 -0
  114. package/dist/manifest-CvDpVToN.mjs +1 -0
  115. package/dist/manifest-D8TL9RLE.mjs +1 -0
  116. package/dist/{manifest-C7qV1z7F.mjs → manifest-DIhtCBe6.mjs} +1 -1
  117. package/dist/{manifest-CeQmtQOY.mjs → manifest-DJbruNOg.mjs} +1 -1
  118. package/dist/manifest-DLGtZH-0.mjs +1 -0
  119. package/dist/manifest-DXHdPt2T.mjs +1 -0
  120. package/dist/{manifest-DMJlcsTR.mjs → manifest-Dg5ScOyW.mjs} +1 -1
  121. package/dist/{manifest-C1nZkTkO.mjs → manifest-DzGoTS0R.mjs} +1 -1
  122. package/dist/manifest-G2H52LKz.mjs +131 -0
  123. package/dist/manifest-P0Futrgb.mjs +1 -0
  124. package/dist/{manifest-CDiCtaQT.mjs → manifest-Qw7xgvjv.mjs} +1 -1
  125. package/dist/{manifest-Dgh0uDW-.mjs → manifest-W3qvVrP2.mjs} +1 -1
  126. package/dist/manifest-dG6MuR1U.mjs +1 -0
  127. package/dist/manifest-nWXtgq5Y2.mjs +1 -0
  128. package/dist/{manifest-BPuE6oH2.mjs → manifest-vp1upSSq.mjs} +1 -1
  129. package/dist/modules-DO3jXCgj.mjs +333 -0
  130. package/dist/{mojo-ipc-VGlv3Qyp.mjs → mojo-ipc-Be-ccWrc.mjs} +1 -1
  131. package/dist/native/scripts/linux/enum-windows.sh +12 -12
  132. package/dist/native/scripts/macos/enum-windows.applescript +22 -22
  133. package/dist/native-g095qhpK.mjs +961 -0
  134. package/dist/network-Dvxm7eEI.mjs +7 -0
  135. package/dist/outputPaths-D2ddHrOJ.mjs +2 -0
  136. package/dist/{parse-args-Cuk7-xUt.mjs → parse-args-ngRrvF9e.mjs} +1 -1
  137. package/dist/platform-DjWbuiF8.mjs +93 -0
  138. package/dist/process-Dq5I-KZW.mjs +2 -0
  139. package/dist/proxy-DPNgM7TE.mjs +2 -0
  140. package/dist/{registry-DUHIPE-v.mjs → registry-xB8Wgmyj.mjs} +1 -1
  141. package/dist/renderer-pid-7jbTR8f5.mjs +1 -0
  142. package/dist/search-defaults-CJik67or.mjs +1 -0
  143. package/dist/server/plugin-api.d.mts +19 -36
  144. package/dist/server/plugin-api.mjs +1 -1
  145. package/dist/sourcemap-DqEW15Ao.mjs +1 -0
  146. package/dist/streaming-Dbk4eStJ.mjs +1 -0
  147. package/dist/transform-D-peM3aO.mjs +103 -0
  148. package/dist/wasm-CZajRaad.mjs +174 -0
  149. package/dist/{webcrack-CsLLJIs9.mjs → webcrack-phEfVt5y.mjs} +3 -3
  150. package/dist/{workflow-CYIXtrWD.mjs → workflow-wkXb3x-U.mjs} +4 -4
  151. package/package.json +16 -15
  152. package/src/native/scripts/linux/enum-windows.sh +12 -12
  153. package/src/native/scripts/macos/enum-windows.applescript +22 -22
  154. package/dist/CodeInjector-BlgyqTOk.mjs +0 -1
  155. package/dist/ConsoleMonitor-Dkqc0HNi.mjs +0 -490
  156. package/dist/DOMInspector-BYY_EJ0C.mjs +0 -95
  157. package/dist/DetailedDataManager-BniBJlVv.mjs +0 -1
  158. package/dist/ExtensionManager-erMpqcLk.mjs +0 -1
  159. package/dist/MCPServer.search.handlers.domain-DVbWL1bT.mjs +0 -1
  160. package/dist/MemoryController-BaqstM5w.mjs +0 -2
  161. package/dist/MemoryScanner-BLYnMJy6.mjs +0 -1
  162. package/dist/NativeMemoryManager.impl-CI554XbY.mjs +0 -1
  163. package/dist/PageController-D9jVkH0i.mjs +0 -1
  164. package/dist/PointerChainEngine-5nF9eNlu.mjs +0 -1
  165. package/dist/PrerequisiteError-Bl3dK8XA.mjs +0 -1
  166. package/dist/ProcessRegistry-Hf12LlR9.mjs +0 -1
  167. package/dist/ScriptManager-fgqiALgj.mjs +0 -7
  168. package/dist/ToolCatalog-D_IKl1Hu.mjs +0 -1
  169. package/dist/ToolProbe-xsfALmN3.mjs +0 -1
  170. package/dist/ToolRegistry-B0Zs-phN.mjs +0 -1
  171. package/dist/ToolRouter.policy-CFHoN_Lw.mjs +0 -4
  172. package/dist/VersionDetector-DMoUWyNm.mjs +0 -9
  173. package/dist/analysis-BuR-NgX8.mjs +0 -5
  174. package/dist/betterSqlite3-CGaxz4AX.mjs +0 -1
  175. package/dist/binary-instrument-Cf9qqLlM.mjs +0 -7
  176. package/dist/browser-C4Le3xqA.mjs +0 -11
  177. package/dist/collector-CKO8RPK8.mjs +0 -1
  178. package/dist/constants-Cp6hBrrx.mjs +0 -1
  179. package/dist/coordination-BbijHEHH.mjs +0 -1
  180. package/dist/debugger-CRJq_krh.mjs +0 -1
  181. package/dist/definitions-BGobEDQa.mjs +0 -1
  182. package/dist/definitions-CdWEuIkI.mjs +0 -1
  183. package/dist/definitions-CoQFbggH.mjs +0 -1
  184. package/dist/definitions-OvGsfxdt.mjs +0 -1
  185. package/dist/ensure-browser-core-Buls24LQ.mjs +0 -1
  186. package/dist/flat-target-session-CO5g78k3.mjs +0 -1
  187. package/dist/handlers-D3iev8g1.mjs +0 -1
  188. package/dist/handlers-D49r1-1P.mjs +0 -1
  189. package/dist/handlers-DCE45Ww8.mjs +0 -2
  190. package/dist/handlers-De5u62Ga2.mjs +0 -1
  191. package/dist/handlers-DnJRGp7t.mjs +0 -302
  192. package/dist/handlers-S9Ws0IGy.mjs +0 -2
  193. package/dist/handlers.impl-CD2_kOcC.mjs +0 -1
  194. package/dist/maintenance-CutEO84j.mjs +0 -1
  195. package/dist/manifest-BFGxlDRh.mjs +0 -123
  196. package/dist/manifest-BXry5N09.mjs +0 -1
  197. package/dist/manifest-BeP_zJGb2.mjs +0 -1
  198. package/dist/manifest-C0g67k6U.mjs +0 -1
  199. package/dist/manifest-CFn0359q2.mjs +0 -1
  200. package/dist/manifest-CJMGt7Qy.mjs +0 -1
  201. package/dist/manifest-CRIJq4Hs.mjs +0 -1
  202. package/dist/manifest-C_hEIjSx.mjs +0 -1
  203. package/dist/manifest-Cq0j7GZt.mjs +0 -1
  204. package/dist/manifest-CtPmHAdn.mjs +0 -1
  205. package/dist/manifest-Cx2IVMUY.mjs +0 -1
  206. package/dist/manifest-D16xPXro.mjs +0 -1
  207. package/dist/manifest-DC-SMF6b.mjs +0 -1
  208. package/dist/manifest-DD3rtxvV.mjs +0 -1
  209. package/dist/manifest-De-6Wf2R.mjs +0 -1
  210. package/dist/manifest-DsVh7Y4U.mjs +0 -1
  211. package/dist/manifest-DtEFSRaq.mjs +0 -1
  212. package/dist/manifest-H-EpAyZQ.mjs +0 -1
  213. package/dist/manifest-ais9Afrw.mjs +0 -1
  214. package/dist/manifest-tmb54wmA.mjs +0 -1
  215. package/dist/manifest-zrbrpKCC.mjs +0 -1
  216. package/dist/matchesWildcardPattern-BGqLSmEs.mjs +0 -1
  217. package/dist/modules-p-PUNv9r.mjs +0 -332
  218. package/dist/network-BjZ1Y-GB.mjs +0 -7
  219. package/dist/outputPaths-BonGThuc.mjs +0 -2
  220. package/dist/platform-C446Lf97.mjs +0 -93
  221. package/dist/playwright-cdp-fallback-BwVR-_T3.mjs +0 -1
  222. package/dist/process-C9f2A5zk.mjs +0 -962
  223. package/dist/proxy-CvRepxgV.mjs +0 -1
  224. package/dist/search-defaults-D2bY-rzH.mjs +0 -1
  225. package/dist/shared-state-board-Cyg-xh_k.mjs +0 -1
  226. package/dist/sourcemap-D6Q1UuAp.mjs +0 -1
  227. package/dist/streaming-CTX58tbb.mjs +0 -1
  228. package/dist/transform-Cv9P2vVD.mjs +0 -103
  229. package/dist/types-DtThH00r.mjs +0 -1
  230. package/dist/wasm-DaJa8J0V.mjs +0 -174
  231. /package/dist/{CacheAdapters-CdAxBmVW.mjs → CacheAdapters-BlDrQg8f.mjs} +0 -0
  232. /package/dist/{EventBus-DgciURGg.mjs → EventBus-Cm-t-B65.mjs} +0 -0
  233. /package/dist/{EvidenceGraphBridge-BIfgB7HP.mjs → EvidenceGraphBridge-DBDc0wUA.mjs} +0 -0
  234. /package/dist/{HookGeneratorBuilders.core.generators.storage-Bf1fbrNK.mjs → HookGeneratorBuilders.core.generators.storage-CWaWpOHa.mjs} +0 -0
  235. /package/dist/{InstrumentationSession-DxXs0sCp.mjs → InstrumentationSession-c5qZyp7d.mjs} +0 -0
  236. /package/dist/{StealthVerifier-Dhbj4B4P.mjs → StealthVerifier-DMBrtkhN.mjs} +0 -0
  237. /package/dist/{ToolError-DWU_z7gp.mjs → ToolError-g3rjWzhx.mjs} +0 -0
  238. /package/dist/{authorization-schema-B40obG1A.mjs → authorization-schema-Jtikc5Yt.mjs} +0 -0
  239. /package/dist/{bind-helpers-BlAOQrFQ.mjs → bind-helpers-D0mGAOof.mjs} +0 -0
  240. /package/dist/{capabilities-DbYCv-HF.mjs → capabilities-L1ax5EHS.mjs} +0 -0
  241. /package/dist/{chunk-C_pMuVsO.mjs → chunk-88NL7fhV.mjs} +0 -0
  242. /package/dist/{concurrency-CcK46d0h.mjs → concurrency-Dehnw4JC.mjs} +0 -0
  243. /package/dist/{evidence-graph-bridge-B0yhGPcs.mjs → evidence-graph-bridge-eT9icP6a.mjs} +0 -0
  244. /package/dist/{formatAddress-C7j2fDlM.mjs → formatAddress-DAcw4Ckg.mjs} +0 -0
  245. /package/dist/{logger-sBC6IdRT.mjs → logger-CCikqqvj.mjs} +0 -0
  246. /package/dist/{response-C7rKQst4.mjs → response-B1RuVVfD.mjs} +0 -0
  247. /package/dist/{ssrf-policy-T96MR3r6.mjs → ssrf-policy-B72vdy23.mjs} +0 -0
  248. /package/dist/{tool-builder-CI9914Tf.mjs → tool-builder-CpLh-UQd.mjs} +0 -0
  249. /package/dist/{types-CuyefmGT.mjs → types-BzPBzmVB.mjs} +0 -0
@@ -1 +0,0 @@
1
- import{t as e}from"./tool-builder-CI9914Tf.mjs";const t=[e(`process_windows`,e=>e.desc(`Get all window handles for a process.`).number(`pid`,`Process ID to get windows for`).required(`pid`)),e(`process_check_debug_port`,e=>e.desc(`Check if a process has a debug port enabled for CDP attachment.`).number(`pid`,`Process ID to check`).required(`pid`)),e(`process_launch_debug`,e=>e.desc(`Launch an executable with remote debugging port enabled.`).string(`executablePath`,`Full path to the executable to launch`).number(`debugPort`,`Debug port to use`,{default:9222,minimum:1,maximum:65535}).array(`args`,{type:`string`},`Additional command line arguments`).required(`executablePath`)),e(`memory_read`,e=>e.desc(`Read memory from a process at a specific address. Requires elevated privileges.`).number(`pid`,`Target process ID`).string(`address`,`Memory address to read (hex string like "0x12345678")`).number(`size`,`Number of bytes to read`).required(`pid`,`address`,`size`)),e(`memory_write`,e=>e.desc(`Write data to process memory at a given address.`).number(`pid`,`Target process ID`).string(`address`,`Memory address to write to (hex string like "0x12345678")`).string(`data`,`Data to write (hex string or base64)`).enum(`encoding`,[`hex`,`base64`],`Encoding of the data parameter`,{default:`hex`}).required(`pid`,`address`,`data`)),e(`memory_scan`,e=>e.desc(`Scan process memory for a pattern or value. Requires elevated privileges.`).number(`pid`,`Target process ID`).string(`pattern`,`Pattern to search for (hex bytes like "48 8B 05" or value)`).enum(`patternType`,[`hex`,`int32`,`int64`,`float`,`double`,`string`],`Type of pattern to search`,{default:`hex`}).boolean(`suspendTarget`,`Suspend the target process during scan for a consistent memory snapshot (default: false)`,{default:!1}).required(`pid`,`pattern`)),e(`memory_check_protection`,e=>e.desc(`Check memory protection flags at a specific address.`).number(`pid`,`Target process ID`).string(`address`,`Memory address to check (hex string like "0x12345678")`).required(`pid`,`address`)),e(`memory_scan_filtered`,e=>e.desc(`Refine a previous memory scan with filtered addresses.`).number(`pid`,`Target process ID`).string(`pattern`,`Pattern to search for`).array(`addresses`,{type:`string`},`List of addresses to scan within (from previous scan)`).enum(`patternType`,[`hex`,`int32`,`int64`,`float`,`double`,`string`],`Type of pattern to search`,{default:`hex`}).required(`pid`,`pattern`,`addresses`)),e(`memory_batch_write`,e=>e.desc(`Write multiple memory patches at once.`).number(`pid`,`Target process ID`).array(`patches`,{type:`object`,properties:{address:{type:`string`,description:`Memory address (hex)`},data:{type:`string`,description:`Data to write`},encoding:{type:`string`,enum:[`hex`,`base64`],default:`hex`}},required:[`address`,`data`]},`Array of patches to apply`).required(`pid`,`patches`)),e(`memory_dump_region`,e=>e.desc(`Dump a process memory region to a binary file for offline analysis.`).number(`pid`,`Target process ID`).string(`address`,`Start address (hex)`).number(`size`,`Number of bytes to dump`).string(`outputPath`,`Output file path`).required(`pid`,`address`,`size`,`outputPath`)),e(`memory_list_regions`,e=>e.desc(`List all memory regions in a process with protection flags.`).number(`pid`,`Target process ID`).required(`pid`)),e(`memory_audit_export`,e=>e.desc(`Export the in-memory audit trail for memory operations as JSON.`)),e(`inject_dll`,e=>e.desc(`Inject a DLL into a target process.`).number(`pid`,`Target process ID`).string(`dllPath`,`Full path to the DLL file to inject`).required(`pid`,`dllPath`)),e(`inject_shellcode`,e=>e.desc(`Allocate and execute raw shellcode in a target process.`).number(`pid`,`Target process ID`).string(`shellcode`,`Shellcode bytes (hex string or base64)`).enum(`encoding`,[`hex`,`base64`],`Encoding of shellcode`,{default:`hex`}).required(`pid`,`shellcode`)),e(`check_debug_port`,e=>e.desc(`Check if a process is being debugged using NtQueryInformationProcess (ProcessDebugPort).`).number(`pid`,`Target process ID`).required(`pid`)),e(`enumerate_modules`,e=>e.desc(`List all loaded modules (DLLs) in a process with their base addresses.`).number(`pid`,`Target process ID`).required(`pid`)),e(`electron_attach`,e=>e.desc(`Attach to an Electron CDP port and optionally evaluate in a matching page.`).number(`port`,`CDP port to connect to`,{minimum:1,maximum:65535}).string(`pageUrl`,`Optional URL substring used to pick the target page`).string(`evaluate`,`Optional JavaScript expression to evaluate in the selected page`).string(`wsEndpoint`,`Optional browser WebSocket endpoint override`))];export{t};
@@ -1 +0,0 @@
1
- import{t as e}from"./chunk-C_pMuVsO.mjs";import{t}from"./PageController-D9jVkH0i.mjs";import{n,t as r}from"./DOMInspector-BYY_EJ0C.mjs";import{t as i}from"./ScriptManager-fgqiALgj.mjs";var a=e({ensureBrowserCore:()=>c});let o=null;async function s(){return o||=(await import(`./ConsoleMonitor-Dkqc0HNi.mjs`)).ConsoleMonitor,o}async function c(e){e.collector||(e.collector=new n(e.config.puppeteer),e.registerCaches()),e.pageController||=new t(e.collector),e.domInspector||=new r(e.collector),e.scriptManager||=new i(e.collector),e.consoleMonitor||=new(await(s()))(e.collector)}export{a as n,c as t};
@@ -1 +0,0 @@
1
- function e(e){if(typeof e!=`object`||!e)return null;let t=e.sessionId;return typeof t==`string`&&t.length>0?t:null}function t(e){let t=e.id?.();return typeof t==`string`&&t.length>0?t:null}async function n(t,n){let r=e(await t.send(`Target.attachToTarget`,{targetId:n,flatten:!0}));if(!r)throw Error(`Target.attachToTarget did not return sessionId for ${n}`);let i=t.connection?.();if(!i||typeof i.session!=`function`)throw Error(`CDP connection lookup unavailable for attached target ${n}`);let a=i.session(r);if(!a)throw Error(`CDP attached target session ${r} was not registered for ${n}`);return a}async function r(e,n){let r=t(n);if(!r)throw Error(`CDP attached target session id unavailable for detach`);await e.send(`Target.detachFromTarget`,{sessionId:r})}export{r as n,n as t};
@@ -1 +0,0 @@
1
- import{jr as e}from"./constants-Cp6hBrrx.mjs";import{a as t,c as n,i as r,n as i,o as a,r as o,s}from"./binary-instrument-Cf9qqLlM.mjs";import{n as c,t as l}from"./capabilities-DbYCv-HF.mjs";import{access as u}from"node:fs/promises";import{execFile as d}from"node:child_process";const f={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 p(e){return{content:[{type:`text`,text:e}]}}function m(e){return p(JSON.stringify(e))}function h(e,t){let n=e[t];if(typeof n!=`string`||n.trim().length===0)throw Error(`${t} is required`);return n.trim()}function g(e,t){let n=e[t];return typeof n==`string`&&n.trim().length>0?n.trim():void 0}function _(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}function v(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`&&e.length>0):[]}function y(e){return typeof e==`object`&&!!e}function b(e){return y(e)&&e.extensionPluginsById instanceof Map&&e.extensionPluginRuntimeById instanceof Map}function x(e,t){if(!e)return;let n=e.extensionPluginsById;if(n instanceof Map)return n.has(t)}function S(e){return f[e]}function C(e,t){let n=x(e,t);return n===!0?{status:`available`,fix:S(t)}:n===!1?{status:`unavailable`,reason:`Plugin ${t.replaceAll(`_`,`-`)} is not installed`,fix:S(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 w(e,n,r,i){let a=C(e,n);if(!e||a.status!==`available`)return m({...l(r,n,a.reason??`Plugin ${n.replaceAll(`_`,`-`)} is not available`,a.fix),status:a.status});let o=await t(e,{pluginId:n,toolName:r,args:i});return o.success?m(o):m({...l(r,n,o.error??`Plugin invocation failed`,a.fix)})}function T(e,t){let n=e[t];if(!y(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 E(e){if(!/^\d+$/.test(e))return null;let t=Number.parseInt(e,10);return Number.isNaN(t)?null:t}function D(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,24)}async function O(){let e=process.env.UNIDBG_JAR??``;if(e.length===0)return{available:!1,reason:`UNIDBG_JAR is not configured`,command:`java`,jarPath:``};try{await u(e)}catch{return{available:!1,reason:`UNIDBG_JAR not found: ${e}`,command:`java`,jarPath:e}}return{available:!0,reason:``,command:`java`,jarPath:e}}function k(e,t,n){return new Promise((r,i)=>{d(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 A(e){return y(e)&&Array.isArray(e.functions)&&Array.isArray(e.imports)}function j(e){let t=[];for(let n of e){if(!y(n))continue;let e=M(n,`functionName`),r=M(n,`hookCode`),i=M(n,`description`),a=N(n.parameters);!e||!r||!i||t.push({functionName:e,hookCode:r,description:i,parameters:a})}return t}function M(e,t){let n=e[t];return typeof n==`string`?n:void 0}function N(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!y(n))continue;let e=M(n,`name`),r=M(n,`type`),i=M(n,`description`);e&&r&&i&&t.push({name:e,type:r,description:i})}return t}var P=class{state;constructor(e){this.state=e}async handleFridaAttach(e){let t=g(e,`pid`);if(!g(e,`target`)&&t)return w(this.state.context,`plugin_frida_bridge`,`frida_attach`,e);let n=h(e,`target`),r=this.getFridaSession(),i=await r.getAvailability();if(!i.available){let e=`mock-frida-${D(n)}`;return m({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:E(n),status:`unavailable`}]})}let a;try{a=await r.attach(n)}catch(e){return m({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()}),m({success:!0,available:!0,target:n,sessionId:a,sessions:r.listSessions()})}async handleFridaEnumerateModules(e){let t=h(e,`sessionId`),n=this.getFridaSession(),r=await n.getAvailability();if(!r.available)return m({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 m({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?m({success:!1,available:!0,sessionId:t,reason:a.lastError,modules:i}):m({success:!0,available:!0,sessionId:t,modules:i})}async handleFridaRunScript(e){let t=g(e,`sessionId`);if(!t)return p(`Missing required string argument: sessionId`);let n=h(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?m({success:!1,available:!0,sessionId:t,reason:a.error,execution:a}):m({success:!0,available:!0,sessionId:t,execution:a})}async handleFridaDetach(e){let t=g(e,`sessionId`);if(!t)return p(`Missing required string argument: sessionId`);let n=this.getFridaSession();return(await n.getAvailability()).available&&n.hasSession(t)?(n.useSession(t),await n.detach(),m({success:!0,sessionId:t,detached:!0})):w(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 m({success:!0,available:!0,sessions:r,count:r.length});let i=C(this.state.context,`plugin_frida_bridge`);return r.length>0||i.status===`unavailable`?m({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}):w(this.state.context,`plugin_frida_bridge`,`frida_list_sessions`,e)}async handleFridaGenerateScript(e){let t=g(e,`target`)??`unknown`,n=g(e,`template`)??`trace`,r=g(e,`functionName`)??`target_function`,i=[{functionName:r,hookCode:`console.log('[${n}] ${r} called');`,description:`${n} hook for ${r}`,parameters:[]}];return m({success:!0,target:t,template:n,functionName:r,script:this.state.hookCodeGenerator.exportScript(i,`frida`)})}async handleFridaEnumerateFunctions(e){let t=h(e,`sessionId`),n=h(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?m({success:!1,available:!0,sessionId:t,moduleName:n,reason:o.lastError,functions:a,count:a.length}):m({success:!0,available:!0,sessionId:t,moduleName:n,functions:a,count:a.length})}async handleFridaFindSymbols(e){let t=h(e,`sessionId`),n=h(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?m({success:!1,available:!0,sessionId:t,pattern:n,reason:o.lastError,symbols:a,count:a.length}):m({success:!0,available:!0,sessionId:t,pattern:n,symbols:a,count:a.length})}getFridaSession(){return this.state.fridaSession||(this.state.fridaSession=new n),this.state.fridaSession}},F=class{state;constructor(e){this.state=e}async handleGhidraAnalyze(e){let t=g(e,`targetPath`);if(!g(e,`binaryPath`)&&t)return w(this.state.context,`plugin_ghidra_bridge`,`ghidra_analyze`,e);let n=h(e,`binaryPath`),r=_(e,`timeout`),i=this.getGhidraAnalyzer(),a=await i.getAvailability(),o=await i.analyze(n,r===void 0?void 0:{timeout:r});return a.available?{available:!0,binaryPath:n,analysis:o}:{available:!1,capability:`ghidra_headless`,fix:`Install Ghidra and ensure analyzeHeadless is on PATH.`,binaryPath:n,reason:a.reason??`Ghidra analyzeHeadless is not available`,analysis:o}}async handleGhidraDecompile(e){return w(this.state.context,`plugin_ghidra_bridge`,`ghidra_decompile`,e)}async handleIdaDecompile(e){return w(this.state.context,`plugin_ida_bridge`,`ida_decompile`,e)}async handleJadxDecompile(e){return w(this.state.context,`plugin_jadx_bridge`,`jadx_decompile`,e)}async handleGenerateHooks(e){let t=g(e,`ghidraOutput`);if(t)return this.handleLegacyGenerateHooks(t);let n=e.ghidraOutput;if(y(n))return this.handleLegacyGenerateHooks(JSON.stringify(n));let r=v(e,`symbols`);if(r.length===0)return p(`symbols or ghidraOutput is required`);let i=T(e,`options`),a=this.getHookGenerator().generateFridaHookScript(r,i);return m({available:!0,symbolCount:r.length,script:a})}async handleExportHookScript(e){let t=g(e,`hookTemplates`);if(!t){let e=this.state.hookCodeGenerator.exportScript([],`frida`);return m({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 p(`Invalid JSON`);let n=j(e),r=this.state.hookCodeGenerator.exportScript(n,`frida`);return m({format:`frida`,hookCount:n.length,script:r})}catch{return p(`Invalid JSON`)}}async handleUnidbgEmulate(t){let n=h(t,`binaryPath`),r=h(t,`functionName`),i=v(t,`args`),a=await O();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 k(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=g(e,`soPath`);if(!t)return p(`Missing required string argument: soPath`);let n=g(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=g(e,`sessionId`);if(!t)return p(`Missing required string argument: sessionId`);let n=g(e,`functionName`);if(!n)return p(`Missing required string argument: functionName`);let r=y(e.args)?e.args:{};try{return m(await this.state.unidbgRunner.callFunction(t,n,r))}catch(e){let t=e instanceof Error?e.message:String(e);return p(t.startsWith(`No unidbg session found`)?`${t} (not found)`:t)}}async handleUnidbgTrace(e){let t=g(e,`sessionId`);if(!t)return p(`Missing required string argument: sessionId`);try{return m(await this.state.unidbgRunner.trace(t))}catch(e){let t=e instanceof Error?e.message:String(e);return p(t.startsWith(`No unidbg session found`)?`${t} (not found)`:t)}}async handleGetAvailablePlugins(e){let t=this.state.context?r(this.state.context):[];return m({plugins:t,count:t.length})}getGhidraAnalyzer(){return this.state.ghidra||(this.state.ghidra=new s),this.state.ghidra}getHookGenerator(){return this.state.hookGen||(this.state.hookGen=new o),this.state.hookGen}handleLegacyGenerateHooks(e){let t;try{t=JSON.parse(e)}catch{return p(`Invalid JSON`)}if(!A(t))return p(`ghidraOutput is required`);let n=this.state.hookCodeGenerator.generateHooks(t);return m({count:n.length,hooks:n})}},I=class{state;constructor(e){this.state=e}async handleBinaryInstrumentCapabilities(){let e=await this.getFridaSession().getAvailability(),t=await this.getGhidraAnalyzer().getAvailability(),n=await O();return m(c(`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`,...C(this.state.context,`plugin_frida_bridge`),details:{tools:[`frida_attach`,`frida_detach`,`frida_list_sessions`]}},{capability:`ghidra_headless`,status:t.available?`available`:`unavailable`,reason:t.reason,fix:t.available?void 0:`Install Ghidra and ensure analyzeHeadless is on PATH.`,details:{tools:[`ghidra_analyze`],...t.path?{path:t.path}:{},...t.version?{version:t.version}:{}}},{capability:`plugin_ghidra_bridge`,...C(this.state.context,`plugin_ghidra_bridge`),details:{tools:[`ghidra_decompile`]}},{capability:`plugin_ida_bridge`,...C(this.state.context,`plugin_ida_bridge`),details:{tools:[`ida_decompile`]}},{capability:`plugin_jadx_bridge`,...C(this.state.context,`plugin_jadx_bridge`),details:{tools:[`jadx_decompile`]}},{capability:`unidbg_jar`,status:n.available?`available`:`unavailable`,reason:n.reason||void 0,fix:n.available?void 0:`Set UNIDBG_JAR to a reachable Unidbg JAR path.`,details:{tools:[`unidbg_emulate`,`unidbg_launch`,`unidbg_call`,`unidbg_trace`],command:n.command,jarPath:n.jarPath}}]))}getFridaSession(){return this.state.fridaSession||(this.state.fridaSession=new n),this.state.fridaSession}getGhidraAnalyzer(){return this.state.ghidra||(this.state.ghidra=new s),this.state.ghidra}},L=class{state;frida;analysis;capabilities;constructor(e,t,r){this.state={hookCodeGenerator:new a,unidbgRunner:new i},e instanceof n?this.state.fridaSession=e:b(e)&&(this.state.context=e),t&&(this.state.ghidra=t),r&&(this.state.hookGen=r),this.frida=new P(this.state),this.analysis=new F(this.state),this.capabilities=new I(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)}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{L as BinaryInstrumentHandlers};
@@ -1 +0,0 @@
1
- import{t as e}from"./ToolError-DWU_z7gp.mjs";import{a as t,o as n,t as r}from"./parse-args-Cuk7-xUt.mjs";function i(e){return typeof e!=`object`||!e||!(`evaluate`in e)?!1:typeof e.evaluate==`function`}function a(e){return typeof e!=`object`||!e||!(`getExtension`in e)||!(`getParameter`in e)||!(`RENDERER`in e)||!(`VERSION`in e)?!1:typeof e.getExtension==`function`&&typeof e.getParameter==`function`}function o(e){let t=(e??``).toLowerCase();return t.includes(`vulkan`)?`vulkan`:t.includes(`metal`)?`metal`:t.includes(`d3d`)||t.includes(`direct3d`)?`direct3d`:t.includes(`angle`)||t.includes(`opengl`)||t.includes(`mesa`)||t.includes(`gl`)?`opengl`:t.includes(`swiftshader`)||t.includes(`software`)||t.includes(`cpu`)?`cpu`:t.length>0?`gpu`:`cpu`}function s(e){let t=0;for(let n of e)t+=1,t+=s(n.children);return t}function c(e){let t=e.getAttribute(`aria-label`);if(t)return t;if(e.id)return e.id;let n=typeof e.className==`string`?e.className.trim():``;return n.length>0?n:e.tagName.toLowerCase()}function l(e){if(typeof e.getBoundingClientRect!=`function`)return;let t=e.getBoundingClientRect();return{x:t.x,y:t.y,width:t.width,height:t.height}}function u(e){if(!(e instanceof HTMLElement)||typeof window>`u`)return;let t=window.getComputedStyle(e);return t.display!==`none`&&t.visibility!==`hidden`}function d(e,t){let n=Array.from(e.children).slice(0,12).map((e,n)=>d(e,`${t}-${n}`));return{id:e.id||t,type:e.tagName.toLowerCase(),label:c(e),children:n,visible:u(e),bounds:l(e)}}function f(){let e=[{id:`mock-root`,type:`canvas`,label:`mock-skia-surface`,visible:!0,bounds:{x:0,y:0,width:640,height:480},children:[{id:`mock-layer`,type:`layer`,label:`mock-layer`,visible:!0,bounds:{x:16,y:16,width:320,height:160},children:[]}]}];return{rootNodes:e,totalNodes:s(e),extractedAt:new Date().toISOString()}}function p(e){let t=`software`,n=`Raster`;return e.backend===`vulkan`?(t=`vulkan`,n=`Vulkan`):e.backend===`metal`?(t=`metal`,n=`Metal`):(e.backend===`opengl`||e.backend===`direct3d`||e.backend===`gpu`)&&(t=`gl`,n=`OpenGL`),{isSkiaBacked:e.backend!==`cpu`,version:e.version??null,gpuBackend:t,shaderPipeline:n,rendererStrings:e.gpu?[e.gpu]:[],features:e.backend===`cpu`?[]:[`backend:${e.backend}`],confidence:e.backend===`cpu`?.2:.8,evidence:e.gpu?[`Renderer string: ${e.gpu}`]:[`No renderer information available`]}}function m(e,t){return e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height}function h(e){let t=(e??``).toLowerCase();return t.includes(`rrect`)||t.includes(`round`)?`drawRRect`:t.includes(`rect`)?`drawRect`:t.includes(`text`)?`drawText`:t.includes(`image`)||t.includes(`sprite`)?`drawImage`:t.includes(`path`)?`drawPath`:t.includes(`circle`)||t.includes(`arc`)?`drawCircle`:t.includes(`line`)?`drawLine`:`unknown`}function g(e){let t=e.layers.map((e,t)=>({id:e.id??`layer-${t}`,name:e.name??`layer-${t}`,bounds:e.bounds??{x:0,y:0,width:0,height:0},transform:e.transform??[1,0,0,0,1,0,0,0,1],opacity:e.opacity??1,visible:e.visible??!0,children:[],customData:e.customData})),n=t[0]??null;if(n)for(let e=1;e<t.length;e+=1){let r=t[e];r&&m(r.bounds,n.bounds)&&n.children.push(r)}let r=e.drawCommands.map(e=>({type:h(e.type),bounds:e.bounds??{x:0,y:0,width:0,height:0},paintInfo:e.paintInfo??{},layerId:e.layerId}));return{rootLayer:n,layers:t,drawCommands:r,totalLayers:t.length,totalDrawCommands:r.length,canvas:{id:e.canvas.id,width:e.canvas.width??0,height:e.canvas.height??0,dpr:e.canvas.dpr??1,contextType:e.canvas.contextType??`unknown`}}}function _(e){return{id:e.id,name:e.label,bounds:e.bounds??{x:0,y:0,width:0,height:0},transform:[1,0,0,0,1,0,0,0,1],opacity:1,visible:e.visible??!0,children:e.children.map(e=>_(e))}}function v(e){let t=e.rootNodes.map(e=>_(e));return{rootLayer:t[0]??null,layers:t,drawCommands:[],totalLayers:t.length,totalDrawCommands:0,canvas:{width:t[0]?.bounds.width??0,height:t[0]?.bounds.height??0,dpr:1,contextType:`mock`}}}function y(e){for(let t of e){let e=t.match(/(\d+\.\d+(?:\.\d+)?)/);if(e&&e[1])return e[1]}return null}function b(e){let t=e.join(` `).toLowerCase();return t.includes(`metal`)?`metal`:t.includes(`vulkan`)?`vulkan`:t.includes(`swiftshader`)||t.includes(`software`)?`software`:t.length>0?`gl`:`software`}function x(e){let t=e.join(` `).toLowerCase();return t.includes(`metal`)?`Metal`:t.includes(`vulkan`)?`Vulkan`:t.includes(`swiftshader`)||t.includes(`software`)?`Raster`:t.length>0?`OpenGL`:`Raster`}function S(e,t,n){let r=e.flatMap(e=>{let t=[];return e.unmaskedRenderer&&t.push(e.unmaskedRenderer),e.renderer&&t.push(e.renderer),t}),i=[],a=[];t.hasSkiaFontSignatures&&(i.push(`fontBoundingBoxAscent/Descent available`),a.push(`Canvas text metrics expose font bounding boxes`));for(let e of n.engines)i.push(`engine:${e}`),a.push(`Detected known Skia-adjacent engine: ${e}`);for(let t of e)t.hasSkiaBackend&&t.unmaskedRenderer&&a.push(`Renderer probe: ${t.unmaskedRenderer}`);let o=e.some(e=>e.hasSkiaBackend)||n.isSkiaEngine||t.hasSkiaFontSignatures,s=.1;e.some(e=>e.hasSkiaBackend)&&(s+=.5),n.isSkiaEngine&&(s+=.3),t.hasSkiaFontSignatures&&(s+=.1);let c=o?b(r):`software`,l=o?x(r):`Raster`;return{isSkiaBacked:o,version:y(r),gpuBackend:c,shaderPipeline:l,rendererStrings:r,features:i,confidence:Math.min(s,1),evidence:a}}var C=class{detectSkiaRenderer(){if(typeof document>`u`)return{backend:`cpu`,version:`mock`,gpu:`browser-context-unavailable`};let e=document.querySelector(`canvas`);if(!(e instanceof HTMLCanvasElement))return{backend:`cpu`,version:`mock`,gpu:`no-canvas-detected`};let t=e.getContext(`webgl2`)||e.getContext(`webgl`)||e.getContext(`experimental-webgl`);if(!a(t))return{backend:`cpu`,version:`mock`,gpu:`canvas-without-webgl`};let n,r=t.getExtension(`WEBGL_debug_renderer_info`);if(r){let e=t.getParameter(r.UNMASKED_RENDERER_WEBGL);typeof e==`string`&&e.trim().length>0&&(n=e)}if(!n){let e=t.getParameter(t.RENDERER);typeof e==`string`&&e.trim().length>0&&(n=e)}let i,s=t.getParameter(t.VERSION);return typeof s==`string`&&s.trim().length>0&&(i=s),{backend:o(n),version:i,gpu:n}}extractSceneTree(e){if(typeof document>`u`)return f();let t=e?document.querySelector(e):document.querySelector(`canvas`);if(!(t instanceof HTMLCanvasElement))return f();let n=d(t,`skia-root`);if(t.parentElement){let e=Array.from(t.parentElement.children).filter(e=>e!==t).slice(0,8).map((e,t)=>d(e,`skia-sibling-${t}`));n.children.push(...e)}let r=[n];return{rootNodes:r,totalNodes:s(r),extractedAt:new Date().toISOString()}}};async function w(e,t){return i(e)?S(await e.evaluate(`(() => { /* UNMASKED_RENDERER_WEBGL ${t??``} */ return []; })()`),await e.evaluate(`(() => { /* fontBoundingBoxAscent */ return { hasSkiaFontSignatures: false, textMetrics: null }; })()`),await e.evaluate(`(() => { /* window.cc window.legacyCC */ return { engines: [], isSkiaEngine: false }; })()`)):p(new C().detectSkiaRenderer())}async function T(e,t,n=!0){return i(e)?g(await e.evaluate(`(() => { /* drawCommands canvasMeta ${t??``} */ return { canvas: {}, layers: [], drawCommands: [] }; })()`)):v(new C().extractSceneTree(t))}function E(e,t){let n=[],r=new Set,i=new Set,a=O(e);for(let e of a){let a=null;for(let n of t){let t=D(e,n);t&&(!a||t.confidence>a.confidence)&&(a=t)}a&&a.confidence>=.3&&(n.push(a),r.add(a.skiaObjectId),i.add(a.jsObjectId))}let o=[...new Set(a.map(e=>e.id))].filter(e=>!r.has(e)),s=t.filter(e=>!i.has(e.objectId)).map(e=>e.objectId),c=n.reduce((e,t)=>e+t.confidence,0),l=n.length>0?c/n.length:0;return{correlations:n,unmatchedJSObjects:s,unmatchedSkiaObjects:o,summary:{totalSkiaObjects:a.length,totalJSObjects:t.length,matchedCount:n.length,averageConfidence:Math.round(l*100)/100}}}function D(e,t){if(e.text){for(let n of t.stringProps)if(n===e.text||n.includes(e.text)&&e.text.length>3)return{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name||t.className,confidence:.85,matchType:`text`,explanation:`Draw text "${e.text.slice(0,50)}" matches JS string property`}}let n=j(e.bounds,t.numericProps);if(n)return{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name||t.className,confidence:n.confidence,matchType:`dimension`,explanation:n.explanation};if(e.color){for(let n of t.colorProps)if(P(n,e.color))return{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name||t.className,confidence:.7,matchType:`color`,explanation:`Color ${e.color} matches JS color property "${n}"`}}if(e.type===`drawImage`){let n=e.color;if(n){for(let r of t.urlProps)if(r===n||r.includes(n))return{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name||t.className,confidence:.8,matchType:`url`,explanation:`Image URL matches JS property`}}}if(e.name){if(t.name&&N(e.name,t.name))return{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name,confidence:.75,matchType:`name`,explanation:`Object name "${e.name}" matches JS object "${t.name}"`};for(let n of t.stringProps)if(N(e.name,n))return{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name||t.className,confidence:.6,matchType:`name`,explanation:`Skia layer name matches JS string property`}}let r=M(e.bounds,t.numericProps);return r?{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name||t.className,confidence:r.confidence,matchType:`geometry`,explanation:r.explanation}:null}function O(e){let t=[];for(let n of e.layers)t.push({id:n.id,type:`layer`,name:n.name,bounds:n.bounds,color:n.customData?.color});for(let n of e.drawCommands){let e=k(n.paintInfo),r=A(n.paintInfo);t.push({id:`cmd_${n.type}_${n.bounds.x}_${n.bounds.y}`,type:n.type,name:`${n.type} at (${n.bounds.x}, ${n.bounds.y})`,text:e,bounds:n.bounds,color:r})}return t}function k(e){if(typeof e.text==`string`)return e.text;if(typeof e.content==`string`)return e.content}function A(e){if(typeof e.color==`string`)return e.color;if(typeof e.fillColor==`string`)return e.fillColor;if(typeof e.strokeColor==`string`)return e.strokeColor;if(typeof e.url==`string`)return e.url;if(typeof e.src==`string`)return e.src}function j(e,t){let n=[`width`,`height`,`w`,`h`,`sizeX`,`sizeY`,`sw`,`sh`],r=!1,i=!1;for(let a of n){let n=t[a];n!==void 0&&((a===`width`||a===`w`||a===`sizeX`||a===`sw`)&&Math.abs(n-e.width)<=2&&(r=!0),(a===`height`||a===`h`||a===`sizeY`||a===`sh`)&&Math.abs(n-e.height)<=2&&(i=!0))}return r&&i?{confidence:.75,explanation:`Dimensions ${e.width}x${e.height} match JS numeric properties`}:r||i?{confidence:.45,explanation:`Partial dimension match for ${e.width}x${e.height}`}:null}function M(e,t){let n=!1,r=!1;for(let[i,a]of Object.entries(t))(i===`x`||i===`posX`||i===`left`)&&Math.abs(a-e.x)<=5&&(n=!0),(i===`y`||i===`posY`||i===`top`)&&Math.abs(a-e.y)<=5&&(r=!0);return n&&r?{confidence:.5,explanation:`Position (${e.x}, ${e.y}) matches JS numeric properties`}:null}function N(e,t){return e.toLowerCase()===t.toLowerCase()||e.toLowerCase().includes(t.toLowerCase())||t.toLowerCase().includes(e.toLowerCase())}function P(e,t){return e.toLowerCase().replace(/\s/g,``)===t.toLowerCase().replace(/\s/g,``)}async function F(e,n){let r=t(n,`canvasId`);return{rendererInfo:await w(e,r||void 0),canvasId:r||`auto`,detectionComplete:!0}}async function I(e,n){let i=t(n,`canvasId`),a=r(n,`includeDrawCommands`,!0);return{sceneTree:await T(e,i||void 0,a),canvasId:i||`auto`,extractionComplete:!0}}async function L(r,i,a){let o=t(i,`canvasId`),s=n(i,`skiaNodeIds`),c=await T(r,o||void 0,!0);if(c.layers.length===0&&c.drawCommands.length===0)throw new e(`PREREQUISITE`,`No Skia scene data available for correlation`);let l=[];if(a)try{l=await a()}catch{l=[]}let u=c;if(s.length>0){let e=new Set(s);u={...c,layers:c.layers.filter(t=>e.has(t.id)),drawCommands:c.drawCommands.filter(t=>{let n=t.layerId;return n===void 0||e.has(n)})}}return{correlations:E(u,l),canvasId:o||`auto`,skiaNodeIds:s.length>0?s:void 0,correlationComplete:!0}}var R=class{deps;constructor(e){this.deps=e}async handleSkiaDetectRenderer(t){if(!this.deps.pageController)throw new e(`PREREQUISITE`,`PageController not available — ensure browser is connected`);return F(this.deps.pageController,t)}async handleSkiaExtractScene(t){if(!this.deps.pageController)throw new e(`PREREQUISITE`,`PageController not available — ensure browser is connected`);let n=await I(this.deps.pageController,t),r=n?.sceneTree;return r&&this.deps.eventBus?.emit(`skia:scene_captured`,{canvasId:t.canvasId??`auto`,nodeCount:(r.layers?.length??0)+(r.drawCommands?.length??0),timestamp:new Date().toISOString()}),n}async handleSkiaCorrelateObjects(t){if(!this.deps.pageController)throw new e(`PREREQUISITE`,`PageController not available — ensure browser is connected`);return L(this.deps.pageController,t,this.deps.getJSObjects)}};export{R as SkiaCaptureHandlers};
@@ -1,2 +0,0 @@
1
- import{t as e}from"./logger-sBC6IdRT.mjs";import{vt as t,yt as n}from"./constants-Cp6hBrrx.mjs";import{i as r}from"./outputPaths-BonGThuc.mjs";import{n as i}from"./WorkflowEngine-CxEp2WXH.mjs";import{extname as a,resolve as o}from"node:path";import{readFile as s,readdir as c}from"node:fs/promises";function l(e){return`kind`in e?e:e.build()}function u(e,t){return t?.(e),e}function d(e,t){let n={},r,i,a,o;return n.input=e=>(r=e,n),n.inputFrom=e=>(i=e,n),n.retry=e=>(a=e,n),n.timeout=e=>(o=e,n),n.build=()=>({kind:`tool`,id:e,toolName:t,input:r,inputFrom:i,retry:a,timeoutMs:o}),n}function f(e,t){return t?typeof t==`function`?(t(e),e):(t.input&&e.input(t.input),t.inputFrom&&e.inputFrom(t.inputFrom),t.retry&&e.retry(t.retry),t.timeoutMs!==void 0&&e.timeout(t.timeoutMs),e):e}function p(e,t){return e.step=n=>(t.push(n),e),e.tool=(n,r,i)=>(t.push(f(d(n,r),i)),e),e.sequence=(n,r)=>(t.push(u(m(n),r)),e),e.parallel=(n,r)=>(t.push(u(h(n),r)),e),e.branch=(n,r,i)=>(t.push(u(g(n,r),i)),e),e.fallback=(n,r)=>(t.push(u(_(n),r)),e),e}function m(e){let t=[],n=p({},t);return n.build=()=>({kind:`sequence`,id:e,steps:t.map(l)}),n}function h(e){let t=[],n=p({},t),r=4,i=!1;return n.maxConcurrency=e=>(r=e,n),n.failFast=e=>(i=e,n),n.build=()=>({kind:`parallel`,id:e,steps:t.map(l),maxConcurrency:r,failFast:i}),n}function g(e,t){let n={},r,i,a;return n.predicateFn=e=>(r=e,n),n.whenTrue=e=>(i=e,n),n.whenFalse=e=>(a=e,n),n.build=()=>{if(!i)throw Error(`BranchNode '${e}' requires a whenTrue step`);return{kind:`branch`,id:e,predicateId:t,predicateFn:r,whenTrue:l(i),whenFalse:a?l(a):void 0}},n}function _(e){let t={},n,r;return t.primary=e=>(n=e,t),t.fallback=e=>(r=e,t),t.build=()=>{if(!n)throw Error(`FallbackNode '${e}' requires a primary step`);if(!r)throw Error(`FallbackNode '${e}' requires a fallback step`);return{kind:`fallback`,id:e,primary:l(n),fallback:l(r)}},t}function v(e,t){let n={},r,i,a,o,s,c,l,u,d;return n.description=e=>(r=e,n),n.tags=e=>(i=e,n),n.timeoutMs=e=>(a=e,n),n.defaultMaxConcurrency=e=>(o=e,n),n.route=e=>(s=e,n),n.buildGraph=e=>(c=e,n),n.onStart=e=>(l=e,n),n.onFinish=e=>(u=e,n),n.onError=e=>(d=e,n),n.build=()=>{if(!c)throw Error(`Workflow '${e}' needs a buildGraph() function.`);return{kind:`workflow-contract`,version:1,id:e,displayName:t,description:r,tags:i,timeoutMs:a,defaultMaxConcurrency:o,route:s,build:c,onStart:l,onFinish:u,onError:d}},n}function y(e,t,n){let r=v(e,t);return n(r),r.build()}function b(e,t,n){return f(d(e,t),n).build()}function x(e,t){return u(m(e),t).build()}var S=class{ctx;constructor(e){this.ctx=e}buildWorkflowFromDefinition(e){return y(e.id,e.displayName,t=>t.description(e.description).tags(e.tags).timeoutMs(e.timeoutMs??n).buildGraph(()=>x(`${e.id}-root`,t=>{for(let n of e.steps)t.step(b(n.id,n.toolName,e=>{e.input(n.input??{}).timeout(n.timeoutMs??0),n.inputFrom&&e.inputFrom(n.inputFrom)}))})).onStart(t=>{t.emitSpan(`macro.start`,{macroId:e.id,totalSteps:e.steps.length})}).onError((t,n)=>{t.emitSpan(`macro.error`,{macroId:e.id,error:n.message})}))}async execute(e,t){let n=this.buildWorkflowFromDefinition(e),r=Date.now();try{let r=await i(this.ctx,n,{nodeInputOverrides:t}),a=this.buildProgress(e,r.spans,r.stepResults);return{macroId:e.id,displayName:e.displayName,ok:!0,durationMs:r.durationMs,stepsCompleted:e.steps.length,totalSteps:e.steps.length,stepResults:r.stepResults,progress:a}}catch(t){let n=Date.now()-r,i=t instanceof Error?t.message:String(t),a=this.buildPartialProgress(e,i);return{macroId:e.id,displayName:e.displayName,ok:!1,durationMs:n,stepsCompleted:a.filter(e=>e.status===`complete`).length,totalSteps:e.steps.length,stepResults:{},progress:a,error:i}}}formatProgressReport(e){let t=[];t.push(`**Macro:** ${e.displayName} (\`${e.macroId}\`)`),t.push(``);for(let n of e.progress){let e=n.durationMs===void 0?``:` (${n.durationMs}ms)`,r=n.error?`: ${n.error}`:``,i=n.status===`complete`?`✓`:n.status===`failed`?`✗`:`○`;t.push(`[stage ${n.step}/${n.totalSteps}] ${i} ${n.stepName} — ${n.status}${e}${r}`)}return t.push(``),e.ok?t.push(`✓ Macro complete (${e.stepsCompleted}/${e.totalSteps} steps, ${e.durationMs}ms)`):t.push(`✗ Macro failed at step ${e.stepsCompleted+1}/${e.totalSteps}: ${e.error??`unknown error`}`),t.join(`
2
- `)}buildProgress(e,t,n){return e.steps.map((r,i)=>{let a=t.find(e=>e.name===`workflow.node.start`&&e.attrs?.nodeId===r.id),o=t.find(e=>e.name===`workflow.node.finish`&&e.attrs?.nodeId===r.id),s;a&&o&&(s=new Date(o.at).getTime()-new Date(a.at).getTime());let c=r.id in n;return{step:i+1,totalSteps:e.steps.length,stepName:r.id,status:c?`complete`:`skipped`,durationMs:s}})}buildPartialProgress(e,t){return e.steps.map((n,r)=>({step:r+1,totalSteps:e.steps.length,stepName:n.id,status:`failed`,error:r===0?t:void 0}))}};async function C(t){let n;try{n=await c(t)}catch{return[]}let r=n.filter(e=>a(e)===`.json`),i=[];for(let n of r){let r=o(t,n);try{let t=JSON.parse(await s(r,`utf-8`));w(t)?(i.push(T(t)),e.info(`[macros] Loaded user macro "${t.id}" from ${n}`)):e.warn(`[macros] Skipping ${n}: invalid macro schema`)}catch(t){e.warn(`[macros] Skipping ${n}: ${t instanceof Error?t.message:String(t)}`)}}return i}function w(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.id!=`string`||!t.id||typeof t.displayName!=`string`||!t.displayName||!Array.isArray(t.steps)||t.steps.length===0)return!1;for(let e of t.steps){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.id!=`string`||!t.id||typeof t.toolName!=`string`||!t.toolName)return!1}return!0}function T(e){return{id:e.id,displayName:e.displayName,description:e.description??``,tags:e.tags??[],timeoutMs:e.timeoutMs,steps:e.steps.map(e=>({id:e.id,toolName:e.toolName,input:e.input,inputFrom:e.inputFrom,timeoutMs:e.timeoutMs,optional:e.optional}))}}const E={loadFromDirectory:C,validate:w},D=[{id:`deobfuscate_ast_flow`,displayName:`Deobfuscate AST Flow`,description:`Chain: deobfuscate → optional webcrack unpack → semantic analysis`,tags:[`analysis`,`deobfuscation`,`ast`],timeoutMs:t,steps:[{id:`deobfuscate`,toolName:`deobfuscate`,input:{}},{id:`advanced_deobfuscate`,toolName:`webcrack_unpack`,input:{unpack:!0,unminify:!0},inputFrom:{code:`deobfuscate.code`},optional:!0},{id:`analyze_deobfuscated`,toolName:`understand_code`,inputFrom:{code:`deobfuscate.code`}}]},{id:`unpacker_flow`,displayName:`Unpacker Flow`,description:`Detect packer type → extract inner code → optional deep unpack → normalize output`,tags:[`analysis`,`unpacking`,`deobfuscation`],timeoutMs:9e4,steps:[{id:`detect_and_unpack`,toolName:`deobfuscate`,input:{unpack:!0}},{id:`deep_deobfuscate`,toolName:`webcrack_unpack`,input:{unpack:!0,unminify:!0},inputFrom:{code:`detect_and_unpack.code`},optional:!0},{id:`normalize_output`,toolName:`ast_transform_apply`,input:{transforms:[`dead_code_remove`,`rename_vars`]},inputFrom:{code:`detect_and_unpack.code`}}]}];var O=class{runner;macros=null;constructor(e){this.runner=new S(e)}async ensureMacrosLoaded(){if(this.macros)return this.macros;this.macros=new Map;for(let e of D)this.macros.set(e.id,e);try{let e=await E.loadFromDirectory(o(r(),`macros`));for(let t of e)this.macros.set(t.id,t)}catch{}return this.macros}async handleRunMacro(e){let t=e.macroId,n=e.inputOverrides;if(!t||typeof t!=`string`)return{content:[{type:`text`,text:JSON.stringify({ok:!1,error:`macroId parameter is required`})}]};let r=await this.ensureMacrosLoaded(),i=r.get(t);if(!i)return{content:[{type:`text`,text:JSON.stringify({ok:!1,error:`Macro "${t}" not found`,available:Array.from(r.keys())})}]};let a=await this.runner.execute(i,n);return{content:[{type:`text`,text:this.runner.formatProgressReport(a)}]}}async handleListMacros(){let e=await this.ensureMacrosLoaded(),t=Array.from(e.values()).map(e=>({id:e.id,displayName:e.displayName,description:e.description,tags:e.tags,stepCount:e.steps.length}));return{content:[{type:`text`,text:JSON.stringify({macros:t,count:t.length})}]}}};export{O as MacroToolHandlers};
@@ -1 +0,0 @@
1
- import{a as e}from"./parse-args-Cuk7-xUt.mjs";function t(e){return{content:[{type:`text`,text:JSON.stringify(e,null,2)}]}}var n=class{sessionManager;deps;constructor(e,t={}){this.sessionManager=e,this.deps=t}async handleSessionDispatch(n){let r=e(n,`action`);switch(r){case`create`:return this.handleSessionCreate(n);case`list`:return this.handleSessionList(n);case`destroy`:return this.handleSessionDestroy(n);case`status`:return this.handleSessionStatus(n);default:return t({success:!1,error:`Unknown action: ${r}. Valid: create, list, destroy, status`})}}async handleOperationDispatch(n){let r=e(n,`action`);switch(r){case`register`:return this.handleOperationRegister(n);case`list`:return this.handleOperationList(n);default:return t({success:!1,error:`Unknown action: ${r}. Valid: register, list`})}}async handleArtifactDispatch(n){let r=e(n,`action`);switch(r){case`record`:return this.handleArtifactRecord(n);case`query`:return this.handleArtifactQuery(n);default:return t({success:!1,error:`Unknown action: ${r}. Valid: record, query`})}}async handleSessionCreate(n){try{let r=e(n,`name`);return t({success:!0,session:this.sessionManager.createSession(r||void 0)})}catch(e){return t({success:!1,error:e instanceof Error?e.message:String(e)})}}async handleSessionList(e){try{let e=this.sessionManager.listSessions();return t({success:!0,totalSessions:e.length,sessions:e})}catch(e){return t({success:!1,error:e instanceof Error?e.message:String(e)})}}async handleSessionDestroy(n){try{let r=e(n,`sessionId`,``);return r?(this.sessionManager.destroySession(r),t({success:!0,sessionId:r,message:`Session destroyed`})):t({success:!1,error:`sessionId is required`})}catch(e){return t({success:!1,error:e instanceof Error?e.message:String(e)})}}async handleSessionStatus(n){try{let r=e(n,`sessionId`,``);if(!r)return t({success:!1,error:`sessionId is required`});let i=this.sessionManager.getSession(r);return t(i?{success:!0,session:i,stats:this.sessionManager.getSessionStats(r)}:{success:!1,error:`Session "${r}" not found`})}catch(e){return t({success:!1,error:e instanceof Error?e.message:String(e)})}}async handleOperationList(n){try{let r=e(n,`sessionId`,``);if(!r)return t({success:!1,error:`sessionId is required`});let i=this.sessionManager.getSessionOperations(r),a=e(n,`type`);return a&&(i=i.filter(e=>e.type===a)),t({success:!0,totalOperations:i.length,operations:i})}catch(e){return t({success:!1,error:e instanceof Error?e.message:String(e)})}}async handleOperationRegister(n){try{let r=e(n,`sessionId`,``),i=e(n,`type`,``),a=e(n,`target`,``),o=n.config&&typeof n.config==`object`&&!Array.isArray(n.config)?n.config:{};return t(r?i?a?{success:!0,operation:this.sessionManager.registerOperation(r,i,a,o)}:{success:!1,error:`target is required`}:{success:!1,error:`type is required`}:{success:!1,error:`sessionId is required`})}catch(e){return t({success:!1,error:e instanceof Error?e.message:String(e)})}}async handleArtifactQuery(n){try{let r=e(n,`sessionId`,``);if(!r)return t({success:!1,error:`sessionId is required`});let i=e(n,`type`)||void 0,a=typeof n.limit==`number`?n.limit:50,o=this.sessionManager.getArtifacts(r,i);return a>0&&(o=o.slice(0,a)),t({success:!0,totalArtifacts:o.length,artifacts:o})}catch(e){return t({success:!1,error:e instanceof Error?e.message:String(e)})}}async handleArtifactRecord(n){try{let r=e(n,`operationId`,``),i=n.data&&typeof n.data==`object`&&!Array.isArray(n.data)?n.data:void 0;return t(r?i?{success:!0,artifact:this.sessionManager.recordArtifact(r,i)}:{success:!1,error:`data is required`}:{success:!1,error:`operationId is required`})}catch(e){return t({success:!1,error:e instanceof Error?e.message:String(e)})}}async handleHookPreset(n){try{let r=e(n,`sessionId`,``);if(!r)return t({success:!1,error:`sessionId is required`});if(!this.deps.hookPresetHandlers)return t({success:!1,error:`hookPresetHandlers is not available`});let i={...n};delete i.sessionId;let a=await this.sessionManager.applyHookPreset(r,this.deps.hookPresetHandlers,i);return t({success:a.payload.success!==!1&&a.operation.status===`completed`,operation:a.operation,artifacts:a.artifacts,result:a.payload})}catch(e){return t({success:!1,error:e instanceof Error?e.message:String(e)})}}async handleNetworkReplay(n){try{let r=e(n,`sessionId`,``);if(!r)return t({success:!1,error:`sessionId is required`});if(!this.deps.advancedHandlers)return t({success:!1,error:`advancedHandlers is not available`});let i={...n};delete i.sessionId;let a=await this.sessionManager.replayNetworkRequest(r,this.deps.advancedHandlers,i);return t({success:a.payload.success!==!1&&a.operation.status===`completed`,operation:a.operation,artifacts:a.artifacts,result:a.payload})}catch(e){return t({success:!1,error:e instanceof Error?e.message:String(e)})}}};export{n as InstrumentationHandlers};
@@ -1,302 +0,0 @@
1
- import{Cn as e,Sn as t,xn as n}from"./constants-Cp6hBrrx.mjs";import{randomUUID as r}from"node:crypto";const i=n,a=e*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,2 +0,0 @@
1
- import{c as e,l as t,o as n,s as r}from"./constants-Cp6hBrrx.mjs";import{n as i}from"./response-C7rKQst4.mjs";import{t as a}from"./ToolError-DWU_z7gp.mjs";import{r as o,s}from"./parse-args-Cuk7-xUt.mjs";import{access as c}from"node:fs/promises";import{execFile as l}from"node:child_process";import{promisify as u}from"node:util";import{createServer as d}from"node:net";const f=u(l),p=n,m={encoding:`utf8`,maxBuffer:16*1024*1024,windowsHide:!0};function h(e){return typeof e==`object`&&!!e}function g(e){return typeof e==`string`?e:null}function _(e){return e instanceof Error?e.message:String(e)}function v(e){if(!h(e))return``;let t=g(e.stdout);return[g(e.stderr),t].filter(e=>typeof e==`string`&&e.length>0).join(`
2
- `)}function y(e){return h(e)?g(e.code):null}function b(e,t){if(!e)return null;let n=e[t];return typeof n==`string`&&n.length>0?n:null}function x(e){let t=b(e.match(/Current WebView package.*\(([^()]+)\)/i),1)??b(e.match(/versionName=([^\s]+)/i),1);return t?t.trim():null}var S=class{connectedTarget=null;async ensureLocalFileExists(e){try{await c(e)}catch(t){throw new a(`NOT_FOUND`,`Local file not found: ${e}`,{toolName:`adb-bridge`,details:{filePath:e,reason:_(t)}})}}normalizeError(e,t){if(t instanceof a)return t;if(y(t)===`ENOENT`)return new a(`PREREQUISITE`,"ADB binary not found in PATH. Install Android Platform Tools and ensure `adb` is available.",{toolName:`adb-bridge`});let n=v(t).trim(),r=n.length>0?n:_(t),i=r.toLowerCase();return i.includes(`device not found`)||i.includes(`no devices/emulators found`)||i.includes(`device offline`)||i.includes(`device unauthorized`)?new a(`NOT_FOUND`,r,{toolName:`adb-bridge`,details:{command:[`adb`,...e].join(` `)}}):i.includes(`failed to connect`)||i.includes(`unable to connect`)?new a(`CONNECTION`,r,{toolName:`adb-bridge`,details:{command:[`adb`,...e].join(` `)}}):new a(`RUNTIME`,r,{toolName:`adb-bridge`,details:{command:[`adb`,...e].join(` `)}})}async runAdb(e,t=p){try{let{stdout:n}=await f(process.env.ADB_PATH??`adb`,e,{...m,timeout:t});return n}catch(t){throw this.normalizeError(e,t)}}async connect(e,t){if(typeof e==`string`&&e.trim().length>0){let n=`${e.trim()}:${t??5555}`,r=await this.runAdb([`connect`,n]);if(/(failed|unable)/i.test(r))throw new a(`CONNECTION`,r.trim(),{toolName:`adb-bridge`,details:{target:n}});this.connectedTarget=n;return}await this.runAdb([`start-server`]),this.connectedTarget=null}async disconnect(){if(this.connectedTarget){await this.runAdb([`disconnect`,this.connectedTarget]),this.connectedTarget=null;return}await this.runAdb([`disconnect`])}async listDevices(){let e=await this.runAdb([`devices`,`-l`]),t=[];for(let n of e.split(/\r?\n/)){let e=n.trim();if(e.length===0||e.startsWith(`List of devices attached`)||e.startsWith(`*`))continue;let r=e.split(/\s+/),i=r[0],a=r[1];if(typeof i!=`string`||typeof a!=`string`||a!==`device`)continue;let o=``,s=``,c=``;for(let e of r.slice(2)){let[t,n]=e.split(`:`,2);typeof t!=`string`||typeof n!=`string`||(t===`product`?o=n:t===`model`?s=n:(t===`transport_id`||t===`transport`||t===`usb`)&&(c=n))}t.push({id:i,type:i.startsWith(`emulator-`)?`emulator`:`device`,product:o,model:s,transport:c})}return t}async shell(e,t){return(await this.runAdb([`-s`,e,`shell`,t],r)).replace(/\r?\n$/,``)}async reverse(e,t,n){await this.runAdb([`-s`,e,`reverse`,t,n])}async install(e,t){await this.ensureLocalFileExists(t),await this.runAdb([`-s`,e,`install`,`-r`,t],18e4)}async pull(e,t,n){await this.runAdb([`-s`,e,`pull`,t,n],18e4)}async push(e,t,n){await this.ensureLocalFileExists(t),await this.runAdb([`-s`,e,`push`,t,n],18e4)}async forward(e,t,n){await this.runAdb([`-s`,e,`forward`,t,n])}async getWebViewVersion(e){for(let t of[`cmd webviewupdate getCurrentWebViewPackage`,`dumpsys webviewupdate`,`dumpsys package com.google.android.webview`,`dumpsys package com.android.webview`,`dumpsys package com.android.chrome`])try{let n=x(await this.shell(e,t));if(n)return n}catch{continue}return null}};function C(e){return typeof e==`object`&&!!e}function w(e){return typeof e==`string`?e:null}function T(e,t){if(!e)return null;let n=e[t];return typeof n==`string`&&n.length>0?n:null}function E(e){return C(e)?typeof e.id==`string`&&typeof e.title==`string`&&typeof e.url==`string`:!1}function D(e){return e.startsWith(`@`)?e.slice(1):e}var O=class{adbClient;forwardedPorts=new Map;constructor(e=new S){this.adbClient=e}getPortKey(e,t){return`${e}:${t}`}async getFreePort(){return new Promise((e,t)=>{let n=d();n.once(`error`,t),n.listen(0,`127.0.0.1`,()=>{let r=n.address();if(!r||typeof r==`string`){n.close(),t(new a(`RUNTIME`,`Failed to allocate a local TCP port for WebView debugging.`));return}let{port:i}=r;n.close(n=>{if(n){t(n);return}e(i)})})})}async discoverSockets(e){let t=await this.adbClient.shell(e,`cat /proc/net/unix`),n=new Set;for(let e of t.split(/\r?\n/)){let t=T(e.match(/(@[^\s]*devtools_remote[^\s]*)$/),1);if(!t)continue;let r=D(t);r!==`chrome_devtools_remote`&&n.add(r)}return[...n]}async ensureForward(e,t){let n=this.getPortKey(e,t),r=this.forwardedPorts.get(n);if(typeof r==`number`)return r;let i=await this.getFreePort();return await this.adbClient.forward(e,`tcp:${i}`,`localabstract:${t}`),this.forwardedPorts.set(n,i),i}async fetchTargets(t){let n=await fetch(`http://127.0.0.1:${t}/json/list`,{signal:AbortSignal.timeout(e)});if(!n.ok)throw new a(`CONNECTION`,`Failed to fetch WebView target list on forwarded port ${t}.`,{toolName:`adb_webview`,details:{status:n.status}});let r=await n.json();if(!Array.isArray(r))throw new a(`RUNTIME`,`Unexpected WebView target payload. Expected an array response.`,{toolName:`adb_webview`});return r.filter(E)}async resolveProcessId(e,t){let n=T(t.match(/(?:webview_)?devtools_remote_(\d+)/),1);if(n){let e=Number.parseInt(n,10);if(!Number.isNaN(e))return e}let r=T(t.match(/^(.*)_devtools_remote$/),1);if(!r)return 0;try{let t=(await this.adbClient.shell(e,`pidof -s ${r}`)).split(/\s+/)[0];if(typeof t!=`string`)return 0;let n=Number.parseInt(t,10);return Number.isNaN(n)?0:n}catch{return 0}}async getPrimaryTarget(e,t){let n=await this.ensureForward(e,t),r=await this.fetchTargets(n),i=r.find(e=>e.type===`page`)??r[0];if(!i)throw new a(`NOT_FOUND`,`No debuggable targets found for WebView ${t}.`,{toolName:`adb_webview`,details:{deviceId:e,webviewId:t}});return i}async evaluateViaCdp(e,n){let r=globalThis.WebSocket;if(!r)throw new a(`PREREQUISITE`,`WebSocket API is not available in this Node runtime. Use Node.js 22+ to debug Android WebViews.`,{toolName:`adb_webview`});return new Promise((i,o)=>{let s=new r(e),c=setTimeout(()=>{s.close(),o(new a(`TIMEOUT`,`Timed out while evaluating script inside the Android WebView.`,{toolName:`adb_webview`}))},t),l=e=>{clearTimeout(c),e(),s.close()};s.addEventListener(`open`,()=>{s.send(JSON.stringify({id:1,method:`Runtime.evaluate`,params:{expression:n,returnByValue:!0,awaitPromise:!0}}))}),s.addEventListener(`message`,e=>{let t;try{t=JSON.parse(String(e.data))}catch(e){l(()=>{o(new a(`RUNTIME`,`Failed to parse WebView CDP response: ${String(e)}`,{toolName:`adb_webview`}))});return}if(!C(t)||t.id!==1)return;if(C(t.error)){let e=w(t.error.message)??`Unknown CDP error`;l(()=>{o(new a(`RUNTIME`,e,{toolName:`adb_webview`}))});return}if(!C(t.result)){l(()=>{i(null)});return}if(C(t.result.exceptionDetails)){let e=w(t.result.exceptionDetails.text)??w(t.result.exceptionDetails.description)??`Script execution failed inside the Android WebView.`;l(()=>{o(new a(`RUNTIME`,e,{toolName:`adb_webview`}))});return}if(!C(t.result.result)){l(()=>{i(null)});return}let n=t.result.result;if(`value`in n){l(()=>{i(n.value)});return}let r=w(n.description);l(()=>{i(r)})}),s.addEventListener(`error`,()=>{l(()=>{o(new a(`CONNECTION`,`WebView DevTools socket reported an error while executing script.`,{toolName:`adb_webview`}))})})})}async listWebViews(e){let t=await this.discoverSockets(e),n=[];for(let r of t)try{let t=await this.getPrimaryTarget(e,r);n.push({id:r,url:t.url,title:t.title,processId:await this.resolveProcessId(e,r)})}catch{n.push({id:r,url:``,title:``,processId:await this.resolveProcessId(e,r)})}return n}async attachWebView(e,t){if(!(await this.discoverSockets(e)).includes(t))throw new a(`NOT_FOUND`,`WebView ${t} was not found on device ${e}.`,{toolName:`adb_webview`});await this.getPrimaryTarget(e,t)}async executeScript(e,t,n){await this.attachWebView(e,t);let r=await this.getPrimaryTarget(e,t);if(typeof r.webSocketDebuggerUrl!=`string`||r.webSocketDebuggerUrl.length===0)throw new a(`CONNECTION`,`WebView ${t} does not expose a WebSocket debugger endpoint.`,{toolName:`adb_webview`});return this.evaluateViaCdp(r.webSocketDebuggerUrl,n)}};function k(e){return e instanceof Error?e.message:String(e)}var A=class{adbClient;webviewDbg;constructor(e,t){this.adbClient=e,this.webviewDbg=t}getADBClient(){return this.adbClient||=new S,this.adbClient}getWebViewDebugger(){return this.webviewDbg||=new O(this.getADBClient()),this.webviewDbg}async run(e,t){try{return i(await t())}catch(t){throw t instanceof a?t:new a(`RUNTIME`,k(t),{toolName:e})}}async handleAnalyzeApk(e){return this.run(`adb_apk_analyze`,async()=>{let t=s(e,`serial`),n=s(e,`packageName`),r=await this.getADBClient().shell(t,`dumpsys package ${n}`),i={packageName:n},a=r.match(/versionName=([^\s]+)/);a&&(i.versionName=a[1]);let o=r.match(/versionCode=(\d+)/);o&&(i.versionCode=o[1]);let c=r.match(/minSdk=(\d+)/);c&&(i.minSdk=c[1]);let l=r.match(/targetSdk=(\d+)/);l&&(i.targetSdk=l[1]);let u=[],d=[],f=[],p=[],m=``;for(let e of r.split(/\r?\n/)){if(e.includes(`requested permissions:`)||e.includes(`install permissions:`)){m=`permissions`;continue}if(e.includes(`Activity Resolver Table`)||e.includes(`activities:`)){m=`activities`;continue}if(e.includes(`Service Resolver Table`)||e.includes(`services:`)){m=`services`;continue}if(e.includes(`Receiver Resolver Table`)||e.includes(`receivers:`)){m=`receivers`;continue}let t=e.trim();if(t.startsWith(`android.permission.`)||t.startsWith(`com.`)){let e=t.split(` `)[0];e&&(m===`permissions`?u.push(e):m||u.push(e))}if(m===`activities`&&t.includes(n)){let e=t.match(/(\S+)/);e&&d.push(e[1])}if(m===`services`&&t.includes(n)){let e=t.match(/(\S+)/);e&&f.push(e[1])}if(m===`receivers`&&t.includes(n)){let e=t.match(/(\S+)/);e&&p.push(e[1])}}return i.permissions=[...new Set(u)],i.activities=[...new Set(d)],i.services=[...new Set(f)],i.receivers=[...new Set(p)],{success:!0,serial:t,...i}})}async handleWebViewList(e){return this.run(`adb_webview_list`,async()=>{let t=s(e,`serial`),n=o(e,`hostPort`)??9222;return{success:!0,serial:t,webViewVersion:await this.getADBClient().getWebViewVersion(t),hostPort:n,webviews:(await this.getWebViewDebugger().listWebViews(t)).map(e=>({id:e.id,url:e.url,title:e.title,processId:e.processId}))}})}async handleWebViewAttach(e){return this.run(`adb_webview_attach`,async()=>{let t=s(e,`serial`),n=s(e,`targetId`),r=o(e,`hostPort`)??9222;return await this.getWebViewDebugger().attachWebView(t,n),{success:!0,serial:t,targetId:n,hostPort:r,attached:!0,snapshot:await this.getWebViewDebugger().executeScript(t,n,`(() => ({ title: document.title, url: location.href, readyState: document.readyState }))()`)}})}};export{A as ADBBridgeHandlers};
@@ -1 +0,0 @@
1
- import{Rt as e}from"./constants-Cp6hBrrx.mjs";function t(e){return{content:[{type:`text`,text:JSON.stringify(e,null,2)}]}}function n(e,n){return t({success:!1,tool:e,error:n instanceof Error?n.message:String(n)})}var r=class{sessionManager;constructor(e){this.sessionManager=e}async handleScanList(e){try{let e=this.sessionManager.listSessions();return t({success:!0,sessions:e,count:e.length})}catch(e){return n(`memory_scan_session`,e)}}async handleScanDelete(e){try{return t({success:!0,deleted:this.sessionManager.deleteSession(e.sessionId)})}catch(e){return n(`memory_scan_session`,e)}}async handleScanExport(e){try{return t({success:!0,exportedData:this.sessionManager.exportSession(e.sessionId)})}catch(e){return n(`memory_scan_session`,e)}}};function i(t){return t===void 0||!Number.isFinite(t)||t<=0?e:Math.min(t,e)}function a(e){return{content:[{type:`text`,text:JSON.stringify(e,null,2)}]}}function o(e,t){return a({success:!1,tool:e,error:t instanceof Error?t.message:String(t)})}var s=class{scanner;eventBus;constructor(e,t){this.scanner=e,this.eventBus=t}async handleFirstScan(e){try{let t={valueType:e.valueType,alignment:e.alignment,maxResults:i(e.maxResults),regionFilter:e.regionFilter,onProgress:e.onProgress},n=await this.scanner.firstScan(e.pid,e.value,t);return this.eventBus?.emit(`memory:scan_completed`,{scanType:`first`,resultCount:n.totalMatches??0,timestamp:new Date().toISOString()}),a({success:!0,...n,hint:n.totalMatches>0?`Found ${n.totalMatches} matches. Use memory_next_scan with sessionId "${n.sessionId}" to narrow down.`:`No matches found. Try a different value or type.`})}catch(e){return o(`memory_first_scan`,e)}}async handleNextScan(e){try{let t=await this.scanner.nextScan(e.sessionId,e.mode,e.value,e.value2);return a({success:!0,...t,hint:t.totalMatches<=10?`Few matches remaining — inspect these addresses.`:`${t.totalMatches} matches remain. Continue narrowing with memory_next_scan.`})}catch(e){return o(`memory_next_scan`,e)}}async handleUnknownScan(e){try{let t={valueType:e.valueType,alignment:e.alignment,maxResults:i(e.maxResults),regionFilter:e.regionFilter,onProgress:e.onProgress},n=await this.scanner.unknownInitialScan(e.pid,t);return a({success:!0,...n,hint:`Captured ${n.totalMatches} addresses. Use memory_next_scan with changed/unchanged/increased/decreased to narrow.`})}catch(e){return o(`memory_unknown_scan`,e)}}async handlePointerScan(e){try{return a({success:!0,...await this.scanner.pointerScan(e.pid,e.targetAddress,{maxResults:i(e.maxResults),moduleOnly:e.moduleOnly})})}catch(e){return o(`memory_pointer_scan`,e)}}async handleGroupScan(e){try{return a({success:!0,...await this.scanner.groupScan(e.pid,e.pattern,{alignment:e.alignment,maxResults:i(e.maxResults)})})}catch(e){return o(`memory_group_scan`,e)}}};function c(e){return{content:[{type:`text`,text:JSON.stringify(e,null,2)}]}}function l(e,t){return c({success:!1,tool:e,error:t instanceof Error?t.message:String(t)})}var u=class{ptrEngine;constructor(e){this.ptrEngine=e}async handlePointerChainScan(e){try{let t=await this.ptrEngine.scan(e.pid,e.targetAddress,{maxDepth:e.maxDepth,maxOffset:e.maxOffset,staticOnly:e.staticOnly,modules:e.modules,maxResults:e.maxResults});return c({success:!0,...t,hint:t.totalFound>0?`Found ${t.totalFound} pointer chains. Static chains survive process restarts.`:`No pointer chains found. Try increasing maxDepth or maxOffset.`})}catch(e){return l(`memory_pointer_chain_scan`,e)}}async handlePointerChainValidate(e){try{let t=JSON.parse(e.chains),n=await this.ptrEngine.validateChains(e.pid,t);return c({success:!0,results:n,validCount:n.filter(e=>e.isValid).length,totalChecked:t.length})}catch(e){return l(`memory_pointer_chain_validate`,e)}}async handlePointerChainResolve(e){try{let t=JSON.parse(e.chain),n=await this.ptrEngine.resolveChain(e.pid,t);return c({success:!0,chainId:t.id,resolvedAddress:n,isResolvable:n!==null})}catch(e){return l(`memory_pointer_chain_resolve`,e)}}async handlePointerChainExport(e){try{let t=JSON.parse(e.chains);return c({success:!0,exportedData:this.ptrEngine.exportChains(t),chainCount:t.length})}catch(e){return l(`memory_pointer_chain_export`,e)}}};function d(e){return{content:[{type:`text`,text:JSON.stringify(e,null,2)}]}}function f(e,t){return d({success:!1,tool:e,error:t instanceof Error?t.message:String(t)})}const p={int8_t:`int8`,uint8_t:`uint8`,int16_t:`int16`,uint16_t:`uint16`,int32_t:`int32`,uint32_t:`uint32`,int64_t:`int64`,uint64_t:`uint64`,void_ptr:`pointer`,char_ptr:`string_ptr`};function m(e){if(typeof e!=`string`||e.length===0)return`unknown`;let t=e.toLowerCase().replace(/\s+/g,`_`).replace(/\*/g,`_ptr`);return p[t]??t}function h(e){if(!e||typeof e!=`object`)throw Error(`structure must be a JSON object`);let t=e,n=(Array.isArray(t.fields)?t.fields:[]).map((e,t)=>{let n=e;return{offset:typeof n.offset==`number`?n.offset:0,size:typeof n.size==`number`?n.size:1,type:m(n.type),name:typeof n.name==`string`&&n.name.length>0?n.name:`field_${t}`,value:typeof n.value==`string`?n.value:``,confidence:typeof n.confidence==`number`?n.confidence:1,notes:typeof n.notes==`string`?n.notes:void 0}}),r=n.reduce((e,t)=>Math.max(e,t.offset+t.size),0),i=typeof t.totalSize==`number`?t.totalSize:typeof t.size==`number`?t.size:r;return{baseAddress:typeof t.baseAddress==`string`?t.baseAddress:`0x0`,totalSize:i,fields:n,vtableAddress:typeof t.vtableAddress==`string`?t.vtableAddress:void 0,className:typeof t.className==`string`?t.className:void 0,baseClasses:Array.isArray(t.baseClasses)?t.baseClasses.filter(e=>typeof e==`string`):void 0,timestamp:typeof t.timestamp==`number`?t.timestamp:Date.now()}}var g=class{structAnalyzer;constructor(e){this.structAnalyzer=e}async handleStructureAnalyze(e){try{let t=await this.structAnalyzer.analyzeStructure(e.pid,e.address,{size:e.size,otherInstances:e.otherInstances,parseRtti:e.parseRtti});return d({success:!0,...t,hint:t.className?`Detected class: ${t.className}${t.baseClasses?.length?` (inherits: ${t.baseClasses.join(` → `)})`:``}`:`Inferred ${t.fields.length} fields. Use memory_structure_export_c to export as C struct.`})}catch(e){return f(`memory_structure_analyze`,e)}}async handleVtableParse(e){try{return d({success:!0,...await this.structAnalyzer.parseVtable(e.pid,e.vtableAddress)})}catch(e){return f(`memory_vtable_parse`,e)}}async handleStructureExportC(e){try{let t=h(JSON.parse(e.structure));return d({success:!0,...this.structAnalyzer.exportToCStruct(t,e.name)})}catch(e){return f(`memory_structure_export_c`,e)}}async handleStructureCompare(e){try{let t=await this.structAnalyzer.compareInstances(e.pid,e.address1,e.address2,e.size);return d({success:!0,matchingFieldCount:t.matching.length,differingFieldCount:t.differing.length,...t})}catch(e){return f(`memory_structure_compare`,e)}}};function _(e){return{content:[{type:`text`,text:JSON.stringify(e,null,2)}]}}function v(e,t){return _({success:!1,tool:e,error:t instanceof Error?t.message:String(t)})}var y=class{bpEngine;injector;constructor(e,t){this.bpEngine=e,this.injector=t}async handleBreakpointSet(e){try{return _({success:!0,...await this.bpEngine.setBreakpoint(e.pid,e.address,e.access,e.size??4),hint:`Hardware breakpoint set on DR register. Use memory_breakpoint with action='trace' to collect hits.`})}catch(e){return v(`memory_breakpoint`,e)}}async handleBreakpointRemove(e){try{return _({success:!0,removed:await this.bpEngine.removeBreakpoint(e.breakpointId)})}catch(e){return v(`memory_breakpoint`,e)}}async handleBreakpointList(e){try{let e=this.bpEngine.listBreakpoints();return _({success:!0,breakpoints:e,count:e.length})}catch(e){return v(`memory_breakpoint`,e)}}async handleBreakpointTrace(e){try{let t=await this.bpEngine.traceAccess(e.pid,e.address,e.access,e.maxHits,e.timeoutMs);return _({success:!0,hits:t,hitCount:t.length,hint:t.length>0?`${t.length} accesses captured. Check instructionAddress to find the code accessing this address.`:`No hits captured within timeout.`})}catch(e){return v(`memory_breakpoint`,e)}}async handlePatchBytes(e){try{let t=await this.injector.patchBytes(e.pid,e.address,e.bytes);return _({success:!0,...t,hint:`Patch applied. Use memory_patch_undo with patchId "${t.id}" to restore.`})}catch(e){return v(`memory_patch_bytes`,e)}}async handlePatchNop(e){try{return _({success:!0,...await this.injector.nopBytes(e.pid,e.address,e.count),hint:`${e.count} bytes NOP'd. Use memory_patch_undo to restore.`})}catch(e){return v(`memory_patch_nop`,e)}}async handlePatchUndo(e){try{return _({success:!0,restored:await this.injector.unpatch(e.patchId)})}catch(e){return v(`memory_patch_undo`,e)}}async handleCodeCaves(e){try{let t=await this.injector.findCodeCaves(e.pid,e.minSize);return _({success:!0,caves:t,count:t.length})}catch(e){return v(`memory_code_caves`,e)}}};function b(e){return{content:[{type:`text`,text:JSON.stringify(e,null,2)}]}}function x(e,t){return b({success:!1,tool:e,error:t instanceof Error?t.message:String(t)})}var S=class{memCtrl;constructor(e){this.memCtrl=e}async handleWriteValue(e){try{return b({success:!0,...await this.memCtrl.writeValue(e.pid,e.address,e.value,e.valueType),hint:`Use memory_write_history with action='undo' to revert.`})}catch(e){return x(`memory_write_value`,e)}}async handleFreeze(e){try{let t=await this.memCtrl.freeze(e.pid,e.address,e.value,e.valueType,e.intervalMs);return b({success:!0,...t,hint:`Frozen. Use memory_freeze with action="unfreeze" and freezeId "${t.id}" to stop.`})}catch(e){return x(`memory_freeze`,e)}}async handleUnfreeze(e){try{return b({success:!0,unfrozen:await this.memCtrl.unfreeze(e.freezeId)})}catch(e){return x(`memory_freeze`,e)}}async handleDump(e){try{return b({success:!0,dump:await this.memCtrl.dumpMemoryHex(e.pid,e.address,e.size??256)})}catch(e){return x(`memory_dump`,e)}}async handleWriteUndo(e){try{let e=await this.memCtrl.undo();return b({success:!0,undone:e!==null,entry:e})}catch(e){return x(`memory_write_history`,e)}}async handleWriteRedo(e){try{let e=await this.memCtrl.redo();return b({success:!0,redone:e!==null,entry:e})}catch(e){return x(`memory_write_history`,e)}}};function C(e){return{content:[{type:`text`,text:JSON.stringify(e,null,2)}]}}function w(e,t){return C({success:!1,tool:e,error:t instanceof Error?t.message:String(t)})}var T=class{speedhackEngine;heapAnalyzer;peAnalyzer;antiCheatDetector;constructor(e,t,n,r){this.speedhackEngine=e,this.heapAnalyzer=t,this.peAnalyzer=n,this.antiCheatDetector=r}async handleSpeedhackApply(e){try{return C({...await this.speedhackEngine.apply(e.pid,e.speed),success:!0,hint:`Speedhack active (${e.speed}x). Use memory_speedhack({ action: 'set' }) to adjust.`})}catch(e){return w(`memory_speedhack`,e)}}async handleSpeedhackSet(e){try{return C({success:!0,updated:await this.speedhackEngine.setSpeed(e.pid,e.speed),newSpeed:e.speed})}catch(e){return w(`memory_speedhack`,e)}}async handleHeapEnumerate(e){try{let t=await this.heapAnalyzer.enumerateHeaps(e.pid);return C({success:!0,...t,hint:`Enumerated ${t.heaps.length} heaps. Use memory_heap_stats for statistics or memory_heap_anomalies to check for issues.`})}catch(e){return w(`memory_heap_enumerate`,e)}}async handleHeapStats(e){try{return C({success:!0,...await this.heapAnalyzer.getStats(e.pid)})}catch(e){return w(`memory_heap_stats`,e)}}async handleHeapAnomalies(e){try{let t=await this.heapAnalyzer.detectAnomalies(e.pid);return C({success:!0,anomalies:t,count:t.length,hint:t.length>0?`Found ${t.length} anomalies — inspect types for spray, UAF, or suspicious patterns.`:`No heap anomalies detected.`})}catch(e){return w(`memory_heap_anomalies`,e)}}async handlePEHeaders(e){try{return C({success:!0,...await this.peAnalyzer.parseHeaders(e.pid,e.moduleBase)})}catch(e){return w(`memory_pe_headers`,e)}}async handlePEImportsExports(e){try{let t=e.table||`both`,n=e.moduleBase,r=e.pid,i={success:!0};return(t===`imports`||t===`both`)&&(i.imports=await this.peAnalyzer.parseImports(r,n)),(t===`exports`||t===`both`)&&(i.exports=await this.peAnalyzer.parseExports(r,n)),C(i)}catch(e){return w(`memory_pe_imports_exports`,e)}}async handleInlineHookDetect(e){try{let t=await this.peAnalyzer.detectInlineHooks(e.pid,e.moduleName);return C({success:!0,hooks:t,count:t.length,hint:t.length>0?`Detected ${t.length} inline hooks — check hookType and jumpTarget for each.`:`No inline hooks detected — exports match disk bytes.`})}catch(e){return w(`memory_inline_hook_detect`,e)}}async handleAntiCheatDetect(e){try{let t=await this.antiCheatDetector.detect(e.pid);return C({success:!0,detections:t,count:t.length,hint:t.length>0?`Found ${t.length} anti-debug mechanisms. Each includes a bypassSuggestion.`:`No anti-debug mechanisms detected in imports.`})}catch(e){return w(`memory_anticheat_detect`,e)}}async handleGuardPages(e){try{let{guardPages:t,stats:n}=await this.antiCheatDetector.scanGuardPages(e.pid);return C({success:!0,guardPages:t,count:t.length,scan:n,hint:n.truncated?`Scan stopped after ${n.scannedRegions} regions in ${n.durationMs}ms to avoid hanging. Results may be partial.`:t.length>0?`Found ${t.length} guard page regions — these may indicate anti-tampering.`:`No guard pages found.`})}catch(e){return w(`memory_guard_pages`,e)}}async handleIntegrityCheck(e){try{let{sections:t,stats:n}=await this.antiCheatDetector.scanIntegrity(e.pid,e.moduleName),r=t.filter(e=>e.isModified);return C({success:!0,sections:t,totalChecked:t.length,modifiedCount:r.length,scan:n,hint:n.truncated?`Checked ${n.scannedSections} executable section(s) across ${n.scannedModules} module(s) before hitting safety limits. Results may be partial.`:r.length>0?`${r.length} section(s) modified — code may have been patched or hooked.`:`All checked sections match disk — no runtime modifications detected.`})}catch(e){return w(`memory_integrity_check`,e)}}},E=class{sessions;scans;ptrChains;structures;hooks;readwrite;integrity;constructor(e,t,n,i,a,o,c,l,d,f,p,m){this.sessions=new r(t),this.scans=new s(e,m),this.ptrChains=new u(n),this.structures=new g(i),this.hooks=new y(a,o),this.readwrite=new S(c),this.integrity=new T(l,d,f,p)}handleScanSessionDispatch(e){switch(String(e.action??``)){case`delete`:return this.sessions.handleScanDelete(e);case`export`:return this.sessions.handleScanExport(e);default:return this.sessions.handleScanList(e)}}handleScanList=e=>this.sessions.handleScanList(e);handleScanDelete=e=>this.sessions.handleScanDelete(e);handleScanExport=e=>this.sessions.handleScanExport(e);handleFirstScan=e=>this.scans.handleFirstScan(e);handleNextScan=e=>this.scans.handleNextScan(e);handleUnknownScan=e=>this.scans.handleUnknownScan(e);handlePointerScan=e=>this.scans.handlePointerScan(e);handleGroupScan=e=>this.scans.handleGroupScan(e);handlePointerChainDispatch(e){switch(String(e.action??``)){case`validate`:return this.ptrChains.handlePointerChainValidate(e);case`resolve`:return this.ptrChains.handlePointerChainResolve(e);case`export`:return this.ptrChains.handlePointerChainExport(e);default:return this.ptrChains.handlePointerChainScan(e)}}handlePointerChainScan=e=>this.ptrChains.handlePointerChainScan(e);handlePointerChainValidate=e=>this.ptrChains.handlePointerChainValidate(e);handlePointerChainResolve=e=>this.ptrChains.handlePointerChainResolve(e);handlePointerChainExport=e=>this.ptrChains.handlePointerChainExport(e);handleStructureAnalyze=e=>this.structures.handleStructureAnalyze(e);handleVtableParse=e=>this.structures.handleVtableParse(e);handleStructureExportC=e=>this.structures.handleStructureExportC(e);handleStructureCompare=e=>this.structures.handleStructureCompare(e);handleBreakpointDispatch(e){switch(String(e.action??``)){case`remove`:return this.hooks.handleBreakpointRemove(e);case`list`:return this.hooks.handleBreakpointList(e);case`trace`:return this.hooks.handleBreakpointTrace(e);default:return this.hooks.handleBreakpointSet(e)}}handleBreakpointSet=e=>this.hooks.handleBreakpointSet(e);handleBreakpointRemove=e=>this.hooks.handleBreakpointRemove(e);handleBreakpointList=e=>this.hooks.handleBreakpointList(e);handleBreakpointTrace=e=>this.hooks.handleBreakpointTrace(e);handlePatchBytes=e=>this.hooks.handlePatchBytes(e);handlePatchNop=e=>this.hooks.handlePatchNop(e);handlePatchUndo=e=>this.hooks.handlePatchUndo(e);handleCodeCaves=e=>this.hooks.handleCodeCaves(e);handleFreezeDispatch(e){return String(e.action??``)===`unfreeze`?this.readwrite.handleUnfreeze(e):this.readwrite.handleFreeze(e)}handleWriteHistoryDispatch(e){return String(e.action??``)===`redo`?this.readwrite.handleWriteRedo(e):this.readwrite.handleWriteUndo(e)}handleWriteValue=e=>this.readwrite.handleWriteValue(e);handleFreeze=e=>this.readwrite.handleFreeze(e);handleUnfreeze=e=>this.readwrite.handleUnfreeze(e);handleDump=e=>this.readwrite.handleDump(e);handleWriteUndo=e=>this.readwrite.handleWriteUndo(e);handleWriteRedo=e=>this.readwrite.handleWriteRedo(e);handleSpeedhackDispatch(e){return String(e.action??``)===`set`?this.integrity.handleSpeedhackSet(e):this.integrity.handleSpeedhackApply(e)}handleSpeedhackApply=e=>this.integrity.handleSpeedhackApply(e);handleSpeedhackSet=e=>this.integrity.handleSpeedhackSet(e);handleHeapEnumerate=e=>this.integrity.handleHeapEnumerate(e);handleHeapStats=e=>this.integrity.handleHeapStats(e);handleHeapAnomalies=e=>this.integrity.handleHeapAnomalies(e);handlePEHeaders=e=>this.integrity.handlePEHeaders(e);handlePEImportsExports=e=>this.integrity.handlePEImportsExports(e);handleInlineHookDetect=e=>this.integrity.handleInlineHookDetect(e);handleAntiCheatDetect=e=>this.integrity.handleAntiCheatDetect(e);handleGuardPages=e=>this.integrity.handleGuardPages(e);handleIntegrityCheck=e=>this.integrity.handleIntegrityCheck(e)};export{E as MemoryScanHandlers};
@@ -1 +0,0 @@
1
- import{t as e}from"./logger-sBC6IdRT.mjs";import{$ as t,U as n,W as r,ht as i}from"./constants-Cp6hBrrx.mjs";import{n as a,t as o}from"./artifactRetention-NBdncOEW.mjs";import{a as s,n as c}from"./response-C7rKQst4.mjs";import{t as l}from"./types-CuyefmGT.mjs";import{i as u,l as d}from"./outputPaths-BonGThuc.mjs";import{r as f}from"./betterSqlite3-CGaxz4AX.mjs";import{r as p}from"./concurrency-CcK46d0h.mjs";import{t as m}from"./ToolRegistry-B0Zs-phN.mjs";import"./definitions-CdWEuIkI.mjs";import{createRequire as h}from"node:module";import{existsSync as g}from"node:fs";import{dirname as _,isAbsolute as v,relative as y,resolve as b}from"node:path";import{fileURLToPath as x}from"node:url";import{mkdir as S,readFile as C,writeFile as w}from"node:fs/promises";import{execFile as T}from"node:child_process";import{promisify as E}from"node:util";const D=E(T),O=h(import.meta.url);let k=null,A=0;function j(){let e=Date.now();return(!k||e-A>12e4)&&(k=new m,A=e),k}async function M(e){let n=e?.includeBridgeHealth??!0,r=j().probeAll(!0),o=p(()=>L(`git`,[`--version`])),s=p(()=>L(`python`,[`--version`])),c=p(()=>ee()),l=p(()=>L(`corepack`,[`--version`])),d=n?Promise.all([p(()=>z(`ghidra-bridge`,`${t.replace(/\/$/,``)}/health`)),p(()=>z(`ida-bridge`,`${i.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([r,o,s,c,l,d]),y=te(_,g),b=[N(`@modelcontextprotocol/sdk`),N(`rebrowser-puppeteer-core`),P(),N(`camoufox-js`,`Optional Firefox anti-detect driver`),N(`playwright-core`,`Optional browser automation dependency`),I()],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=ne(),C=re(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 N(e,t){try{let t=O(O.resolve(`${e}/package.json`));return{name:e,status:`ok`,detail:t.version?`installed (${t.version})`:`installed`}}catch{return{name:e,status:`missing`,detail:t??`Not installed`}}}function P(){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 ee(){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 te(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 I(){try{let e=O(O.resolve(`koffi/package.json`)).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 O(`koffi`).load(`/usr/lib/libSystem.B.dylib`).unload(),delete O.cache[O.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 D(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 D(`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 ne(){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 re(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.6.2` 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 ie=class{tokenBudget;unifiedCache;artifactCleanup;environmentDoctor;constructor(e){this.tokenBudget=e.tokenBudget,this.unifiedCache=e.unifiedCache,this.artifactCleanup=e.artifactCleanup??o,this.environmentDoctor=e.environmentDoctor??M}async handleGetTokenBudgetStats(){try{let e=this.tokenBudget.getStats();return c({success:!0,...e,sessionDuration:`${Math.round((Date.now()-e.sessionStartTime)/1e3)}s`})}catch(t){return e.error(`Failed to read token budget stats:`,t),c(s(t))}}async handleManualTokenCleanup(){try{let e=this.tokenBudget.getStats();this.tokenBudget.manualCleanup();let t=this.tokenBudget.getStats(),n=e.currentUsage-t.currentUsage;return c({success:!0,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)}})}catch(t){return e.error(`Failed to perform manual cleanup:`,t),c(s(t))}}async handleResetTokenBudget(){try{return this.tokenBudget.reset(),c({success:!0,message:`Token budget reset successfully`,currentUsage:0,maxTokens:2e5,usagePercentage:0})}catch(t){return e.error(`Failed to reset token budget:`,t),c(s(t))}}async handleGetCacheStats(){try{return c({success:!0,...await this.unifiedCache.getGlobalStats()})}catch(t){return e.error(`Failed to get cache stats:`,t),c(s(t))}}async handleSmartCacheCleanup(t){try{return c({success:!0,...await this.unifiedCache.smartCleanup(t)})}catch(t){return e.error(`Failed to perform cache cleanup:`,t),c(s(t))}}async handleClearAllCaches(){try{return await this.unifiedCache.clearAll(),c({success:!0,message:`All caches cleared`})}catch(t){return e.error(`Failed to clear caches:`,t),c(s(t))}}async handleCleanupArtifacts(t){try{return c(await this.artifactCleanup({retentionDays:t.retentionDays,maxTotalBytes:t.maxTotalBytes,dryRun:t.dryRun}))}catch(t){return e.error(`Failed to cleanup artifacts:`,t),c(s(t))}}async handleEnvironmentDoctor(t){try{return c(await this.environmentDoctor({includeBridgeHealth:t.includeBridgeHealth}))}catch(t){return e.error(`Failed to run environment doctor:`,t),c(s(t))}}};const B=E(T);function V(){return x(new URL(`../../../../`,import.meta.url))}function ae(e){let t=e?.trim();if(t)return t.split(`,`).map(e=>e.trim()).find(e=>e.length>0)}function H(e){let t=e===`workflow`?`MCP_WORKFLOW_ROOTS`:`MCP_PLUGIN_ROOTS`,n=ae(process.env[t]);return n?b(n):b(V(),e===`workflow`?`workflows`:`plugins`)}function U(){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 W(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 G(e,t,n){let r=y(e,t).replace(/\\/g,`/`);if(r===`..`||r.startsWith(`../`)||v(r))throw Error(`Registry source.${n} must stay within ${e}: ${t}`)}function K(e,t){let n=b(e,W(t,`subpath`));return G(e,n,`subpath`),n}function q(e,t){let n=b(e,W(t,`entry`));return G(e,n,`entry`),n}function oe(e){let t=W(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 se(e,t){let n=oe(t);for(let t of n)if(g(q(e,t)))return t;return W(t,`entry`)}async function ce(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:W(t.source.subpath,`subpath`),entry:W(r,`entry`)}},a=b(n,l);return await w(a,`${JSON.stringify(i,null,2)}\n`,`utf8`),a}const J=`@jshookmcp/extension-sdk`,le=b(V(),`packages`,`extension-sdk`);function ue(){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 de(e,t){return process.platform===`win32`?{command:`powershell.exe`,args:[`-NoProfile`,`-NonInteractive`,`-Command`,`${e} ${t.join(` `)}`]}:{command:e,args:t}}async function X(e,t,n){let r=de(e,t);return B(r.command,r.args,{...n,env:{...process.env,...n?.env,CI:`true`}})}async function fe(e){let t=b(e,`package.json`),n=b(e,`pnpm-lock.yaml`),r=b(e,`package-lock.json`);if(g(t))try{let e=await C(t,`utf8`),n=JSON.parse(e).packageManager?.trim().toLowerCase().split(`@`)[0];if(n===`pnpm`)return`pnpm`;if(n===`npm`)return`npm`}catch{}return g(n)?`pnpm`:g(r)?`npm`:`pnpm`}function Z(e){return b(ue(),`registry-${e}.json`)}async function pe(e){let t=Z(e);try{let e=await C(t,`utf8`);return JSON.parse(e)}catch{return null}}async function me(e,t){let n=Z(e);await S(_(n),{recursive:!0}),await w(n,JSON.stringify(t,null,2),`utf8`)}function Q(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 he(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?Z(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 me(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=Q(t,r,a);if(n?.cacheKey){let r=await pe(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)}}async function ge(t){let n=b(t,`package.json`);try{let r=await C(n,`utf8`),i=JSON.parse(r),a=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`],o=`file:${y(t,le).replace(/\\/g,`/`)||`.`}`,s=!1;for(let e of a){let t=i[e];if(!t||typeof t!=`object`)continue;let n=t,r=n[J];typeof r==`string`&&r.startsWith(`workspace:`)&&(n[J]=o,s=!0)}return s?(await w(n,`${JSON.stringify(i,null,2)}\n`,`utf8`),e.info(`[extensions] Rewrote ${J} dependency to local file path for ${t}`),!0):!1}catch(n){return e.warn(`[extensions] Failed to rewrite ${J} dependency for ${t}:`,n),!1}}async function _e(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 ve=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=U(),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(he(t)):c(s(t))}}async handleInstallExtension(t,i){try{let{entry:e,kind:a}=await _e(U(),t),o=a===`workflow`,s=H(o?`workflow`:`plugin`),l=i?b(i):b(s,t),u=K(l,e.source.subpath);if(q(u,e.source.entry),g(l))return c({success:!1,error:`Target directory already exists: ${l}`,hint:`Remove the existing directory first, or specify a different targetDir`});if(await S(_(l),{recursive:!0}),await B(`git`,[`clone`,e.source.repo,l],{timeout:r}),await B(`git`,[`-C`,l,`checkout`,e.source.commit],{timeout:n}),g(b(u,`package.json`))){await ge(u);let e=await fe(u);await X(e,e===`pnpm`?[`--ignore-workspace`,`install`,`--no-frozen-lockfile`,`--ignore-scripts`]:[`install`,`--ignore-scripts`],{cwd:u,timeout:Math.max(r,12e4)}),await X(e,e===`pnpm`?[`--ignore-workspace`,`run`,`--if-present`,`build`]:[`run`,`build`,`--if-present`],{cwd:u,timeout:Math.max(r,12e4)})}let d=se(u,e.source.entry),f=q(u,d);if(!g(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 ce(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{ie as CoreMaintenanceHandlers,ve as ExtensionManagementHandlers};