@jshookmcp/jshook 0.3.0 → 0.3.2

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 (346) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +32 -49
  3. package/README.zh.md +32 -47
  4. package/dist/AntiCheatDetector-B6d4Qe9D.mjs +1 -0
  5. package/dist/BrowserSessionCoordinator-BJ-HOxo0.mjs +1 -0
  6. package/dist/CacheAdapters-CsNtQIR8.mjs +1 -0
  7. package/dist/CodeInjector-Cll_7bLJ.mjs +1 -0
  8. package/dist/ConsoleMonitor-CxDJV15E.mjs +306 -0
  9. package/dist/DOMInspector-C19J4zeq.mjs +95 -0
  10. package/dist/DarwinAPI-ZfQdpLNI.mjs +1 -0
  11. package/dist/DetailedDataManager-DmQ1LT-W.mjs +1 -0
  12. package/dist/EventBus-DL8iLA09.mjs +1 -0
  13. package/dist/EvidenceGraphBridge-BtbwXsLC.mjs +1 -0
  14. package/dist/ExtensionManager-BD724zkO.mjs +1 -0
  15. package/dist/ExtensionManager.tools-oVMJgPcN.mjs +1 -0
  16. package/dist/FingerprintManager-DT0EAUEo.mjs +1 -0
  17. package/dist/HardwareBreakpoint-BUfPdp0f.mjs +1 -0
  18. package/dist/HeapAnalyzer-B_aqY8oj.mjs +1 -0
  19. package/dist/{HookGeneratorBuilders.core.generators.storage-CTbB4Lcx.mjs → HookGeneratorBuilders.core.generators.storage-DzD6dIJd.mjs} +66 -101
  20. package/dist/InstrumentationSession-D_G1ZPyd.mjs +1 -0
  21. package/dist/MCPServer.search.handlers.domain-BbS-6LnX.mjs +1 -0
  22. package/dist/MemoryController-X1XNSn1n.mjs +2 -0
  23. package/dist/MemoryScanSession-DG_F-PjE.mjs +1 -0
  24. package/dist/MemoryScanner-g1_L1ub5.mjs +1 -0
  25. package/dist/NativeMemoryManager.impl-DniBe2wf.mjs +1 -0
  26. package/dist/NativeMemoryManager.utils-BHy1P_jM.mjs +1 -0
  27. package/dist/NetworkMonitor-B_-au6aV.mjs +185 -0
  28. package/dist/PEAnalyzer-yWQaGrcx.mjs +1 -0
  29. package/dist/PageController-Dfsm1_o7.mjs +1 -0
  30. package/dist/PointerChainEngine-BhCUkmxY.mjs +1 -0
  31. package/dist/PrerequisiteError-BjCQA-gK.mjs +1 -0
  32. package/dist/ProcessRegistry-C-bN48oR.mjs +1 -0
  33. package/dist/ResponseBuilder-BfWP-uaT.mjs +1 -0
  34. package/dist/ReverseEvidenceGraph-BhSYYdiI.mjs +2 -0
  35. package/dist/RingBuffer-Dm54ELKT.mjs +1 -0
  36. package/dist/ScriptManager-LWGPTdvD.mjs +7 -0
  37. package/dist/ServerRuntimeState-D2bWHqEE.mjs +1 -0
  38. package/dist/Speedhack-yseDPSZ9.mjs +1 -0
  39. package/dist/StealthVerifier-BmcxfwSF.mjs +1 -0
  40. package/dist/StructureAnalyzer-C5lpuZkg.mjs +2 -0
  41. package/dist/ToolCatalog-CYdD9F5f.mjs +1 -0
  42. package/dist/ToolError-DWU_z7gp.mjs +1 -0
  43. package/dist/ToolProbe-C7ZU2x7M.mjs +1 -0
  44. package/dist/ToolRegistry-C5oB8KP8.mjs +1 -0
  45. package/dist/ToolRouter.policy-CfhJczkt.mjs +4 -0
  46. package/dist/TraceRecorder-BiJWBXHX.mjs +272 -0
  47. package/dist/VersionDetector-CHT36Az0.mjs +9 -0
  48. package/dist/Win32API-eUCF57l_.mjs +1 -0
  49. package/dist/Win32Debug-CYrIQBvr.mjs +1 -0
  50. package/dist/WorkflowEngine-D876meOO.mjs +1 -0
  51. package/dist/analysis-D4swdMvq.mjs +6 -0
  52. package/dist/{antidebug-BRKeyt27.mjs → antidebug-7L3ygj_9.mjs} +8 -259
  53. package/dist/apk-packer-BqXcInnX.mjs +1 -0
  54. package/dist/artifactRetention-BCPQASm7.mjs +1 -0
  55. package/dist/artifacts-CkodUM4j.mjs +1 -0
  56. package/dist/authorization-schema-BOFwSXUN.mjs +1 -0
  57. package/dist/betterSqlite3-Brtq-SIQ.mjs +1 -0
  58. package/dist/binary-instrument-DU7V6TUM.mjs +7 -0
  59. package/dist/binary-secrets-PdMVoyt0.mjs +1 -0
  60. package/dist/bind-helpers-m2U8glkF.mjs +1 -0
  61. package/dist/boringssl-inspector-BBaJwwkU.mjs +2 -0
  62. package/dist/browser-Qqco2rOT.mjs +11 -0
  63. package/dist/capabilities-CyXuKUl1.mjs +1 -0
  64. package/dist/chunk-C_pMuVsO.mjs +1 -0
  65. package/dist/collector-Bpl6qy2L.mjs +1 -0
  66. package/dist/concurrency-DCr8WQ2M.mjs +1 -0
  67. package/dist/constants-BYj8Xek8.mjs +1 -0
  68. package/dist/coordination-CWXW1o8K.mjs +1 -0
  69. package/dist/dart-inspector-7AkPeZ_Q.mjs +0 -0
  70. package/dist/debugger-DyALjYMk.mjs +1 -0
  71. package/dist/definitions-BWxBke3r.mjs +1 -0
  72. package/dist/definitions-BYwATKc-.mjs +1 -0
  73. package/dist/definitions-B_83XfNQ.mjs +1 -0
  74. package/dist/definitions-Bf3H1EwV.mjs +1 -0
  75. package/dist/definitions-BftdXgXI.mjs +1 -0
  76. package/dist/definitions-Bio5XJYy.mjs +1 -0
  77. package/dist/definitions-C3qNgSn1.mjs +1 -0
  78. package/dist/definitions-CB6vmOer.mjs +1 -0
  79. package/dist/definitions-CMZRSy3k.mjs +1 -0
  80. package/dist/definitions-CQd7yCQH.mjs +1 -0
  81. package/dist/definitions-CT8ln6GQ.mjs +1 -0
  82. package/dist/definitions-Cenu6mxo.mjs +1 -0
  83. package/dist/definitions-D4g-MS10.mjs +1 -0
  84. package/dist/definitions-D5wl_8HN.mjs +1 -0
  85. package/dist/definitions-DAQm1Xar.mjs +1 -0
  86. package/dist/definitions-DP1vgxEY.mjs +1 -0
  87. package/dist/definitions-DxFNRQNK2.mjs +1 -0
  88. package/dist/definitions-Ibci7e_L.mjs +1 -0
  89. package/dist/definitions-OeLvmlQy.mjs +1 -0
  90. package/dist/definitions-RZYGD_Ey.mjs +1 -0
  91. package/dist/definitions-Tls8c0A0.mjs +1 -0
  92. package/dist/definitions-bybDvnG0.mjs +26 -0
  93. package/dist/definitions-l7TjdE6V.mjs +1 -0
  94. package/dist/encoding-ycOaz8Vr.mjs +2 -0
  95. package/dist/ensure-browser-core-DxWC-NTp.mjs +1 -0
  96. package/dist/evidence-graph-bridge-CV_UdYqj.mjs +1 -0
  97. package/dist/factory-CKr4fAE1.mjs +1 -0
  98. package/dist/flat-target-session-DvcQX7J5.mjs +1 -0
  99. package/dist/formatAddress-vLA_hOJt.mjs +1 -0
  100. package/dist/graphql-B2TiPEow.mjs +62 -0
  101. package/dist/handlers-0yKLRIfo.mjs +2 -0
  102. package/dist/handlers-8zN_vBIz.mjs +1 -0
  103. package/dist/handlers-B62K4FTc.mjs +1 -0
  104. package/dist/handlers-BpDlVVVU.mjs +1 -0
  105. package/dist/handlers-CMJK7m1c.mjs +31 -0
  106. package/dist/handlers-D2ZOul9p.mjs +54 -0
  107. package/dist/handlers-D5E40ssn.mjs +5 -0
  108. package/dist/handlers-DGbdQAgD.mjs +4 -0
  109. package/dist/handlers-DHO3rjsW.mjs +1 -0
  110. package/dist/handlers-FJ80VzUI.mjs +2 -0
  111. package/dist/handlers-VHWrxbM_.mjs +1 -0
  112. package/dist/handlers-l8QIKqBj.mjs +2 -0
  113. package/dist/handlers-mPFiNPe8.mjs +302 -0
  114. package/dist/{handlers-Dz9PYsCa.mjs → handlers-yo_xYzT8.mjs} +118 -904
  115. package/dist/handlers.impl-D9Hh8Bgl.mjs +1 -0
  116. package/dist/hooks-D4XLfgtV.mjs +600 -0
  117. package/dist/index.mjs +13 -5240
  118. package/dist/jadx-search-B_Yse0Zh.mjs +5 -0
  119. package/dist/logger-sBC6IdRT.mjs +1 -0
  120. package/dist/maintenance-BUpIukhg.mjs +1 -0
  121. package/dist/manifest-0Jpt_AQa.mjs +1 -0
  122. package/dist/manifest-B3fZbSWR.mjs +1 -0
  123. package/dist/manifest-B7NB2rh2.mjs +1 -0
  124. package/dist/manifest-BDi4nbH1.mjs +1 -0
  125. package/dist/manifest-BLDfkE7n.mjs +1 -0
  126. package/dist/manifest-BcXbB4gf.mjs +1 -0
  127. package/dist/manifest-Bdnc_vrc.mjs +1 -0
  128. package/dist/manifest-BuYKgCnp.mjs +1 -0
  129. package/dist/manifest-CBfNnGPV.mjs +1 -0
  130. package/dist/manifest-CPS1Xv69.mjs +1 -0
  131. package/dist/manifest-CQH9FhwI.mjs +1 -0
  132. package/dist/manifest-CRryuZF4.mjs +1 -0
  133. package/dist/manifest-CctIumog.mjs +1 -0
  134. package/dist/manifest-CvTe5ZGV2.mjs +1 -0
  135. package/dist/manifest-D-5GH0DV.mjs +1 -0
  136. package/dist/manifest-D3Ssf3IC.mjs +1 -0
  137. package/dist/manifest-D5ck3NvC.mjs +1 -0
  138. package/dist/manifest-D9jUUJAu.mjs +1 -0
  139. package/dist/manifest-DCx6w2XV.mjs +1 -0
  140. package/dist/manifest-DG19q-Ld.mjs +1 -0
  141. package/dist/manifest-DLMlD0Zc.mjs +1 -0
  142. package/dist/manifest-DYpn8w_h.mjs +1 -0
  143. package/dist/manifest-DYzWI8Xs.mjs +1 -0
  144. package/dist/manifest-D_obs5F4.mjs +1 -0
  145. package/dist/manifest-DujQqEQR.mjs +2 -0
  146. package/dist/manifest-DwL2ik8P.mjs +1 -0
  147. package/dist/manifest-ItF5P8A12.mjs +1 -0
  148. package/dist/manifest-KZphqIyX.mjs +1 -0
  149. package/dist/manifest-LG42zPLY2.mjs +1 -0
  150. package/dist/manifest-LLdI5m4T.mjs +1 -0
  151. package/dist/manifest-QYbQXJn0.mjs +1 -0
  152. package/dist/manifest-RcpX_MyZ.mjs +123 -0
  153. package/dist/manifest-YgVd8Sgz.mjs +1 -0
  154. package/dist/manifest-Zy7Odg5J.mjs +1 -0
  155. package/dist/manifest-ff1H7Pdp.mjs +1 -0
  156. package/dist/manifest-iuhF6pTL2.mjs +1 -0
  157. package/dist/manifest-nXHmtMSp2.mjs +1 -0
  158. package/dist/manifest-xWfu6iLo.mjs +1 -0
  159. package/dist/manifest-yC16OhL2.mjs +1 -0
  160. package/dist/manifest-ztWJoXy4.mjs +1 -0
  161. package/dist/matchesWildcardPattern-BAG6LvX5.mjs +1 -0
  162. package/dist/modules-BPBcSaM-.mjs +333 -0
  163. package/dist/mojo-ipc-BhwsdVUW.mjs +9 -0
  164. package/dist/native/scripts/linux/enum-windows.sh +12 -12
  165. package/dist/native/scripts/macos/enum-windows.applescript +22 -22
  166. package/dist/native-j8l473zn.mjs +961 -0
  167. package/dist/network-T0VRwNPd.mjs +7 -0
  168. package/dist/outputPaths-B4Ic4RZh.mjs +2 -0
  169. package/dist/parse-args-Bw413PlW.mjs +1 -0
  170. package/dist/platform-CzaQtISh.mjs +93 -0
  171. package/dist/playwright-cdp-fallback-DqFdx9-s.mjs +1 -0
  172. package/dist/process-CWhsCWrf.mjs +2 -0
  173. package/dist/proxy-DZFlDsG3.mjs +2 -0
  174. package/dist/registry-DH4sc1dt.mjs +1 -0
  175. package/dist/renderer-pid-9tJnZ_9N.mjs +1 -0
  176. package/dist/response-C7rKQst4.mjs +1 -0
  177. package/dist/search-defaults-lYBVn_3L.mjs +1 -0
  178. package/dist/server/plugin-api.d.mts +19 -36
  179. package/dist/server/plugin-api.mjs +1 -293
  180. package/dist/shared-state-board-BSjXLUV1.mjs +1 -0
  181. package/dist/sourcemap-Dh3Ai_ur.mjs +1 -0
  182. package/dist/ssrf-policy-CsIJGkpd.mjs +1 -0
  183. package/dist/streaming-BcJ0B6ao.mjs +1 -0
  184. package/dist/tool-builder-qif8M9-K.mjs +1 -0
  185. package/dist/transform-DOxzeWPB.mjs +103 -0
  186. package/dist/types-D9EiE5o9.mjs +1 -0
  187. package/dist/types-Fz69RzbZ.mjs +1 -0
  188. package/dist/wasm-CZ_HTfKR.mjs +174 -0
  189. package/dist/webcrack-C1iYG_EX.mjs +46 -0
  190. package/dist/workflow-BdwQmARn.mjs +101 -0
  191. package/package.json +55 -82
  192. package/src/native/scripts/linux/enum-windows.sh +12 -12
  193. package/src/native/scripts/macos/enum-windows.applescript +22 -22
  194. package/dist/AntiCheatDetector-CqGDXmfc.mjs +0 -350
  195. package/dist/CacheAdapters-jJFy20G-.mjs +0 -80
  196. package/dist/CodeInjector-BdjRfNx7.mjs +0 -150
  197. package/dist/ConsoleMonitor-DykL3IAw.mjs +0 -2269
  198. package/dist/DarwinAPI-ETyy0xyo.mjs +0 -363
  199. package/dist/DetailedDataManager-HT49OrvF.mjs +0 -217
  200. package/dist/EventBus-DFKvADm3.mjs +0 -141
  201. package/dist/EvidenceGraphBridge-318Oi0Lf.mjs +0 -153
  202. package/dist/ExtensionManager-BDMsY2Dz.mjs +0 -721
  203. package/dist/FingerprintManager-BN4UQWnX.mjs +0 -96
  204. package/dist/HardwareBreakpoint-Cc2AFq1Y.mjs +0 -239
  205. package/dist/HeapAnalyzer-DruMgsgj.mjs +0 -284
  206. package/dist/InstrumentationSession-DLH0vd-z.mjs +0 -244
  207. package/dist/MemoryController-CMtviNW_.mjs +0 -167
  208. package/dist/MemoryScanSession-ITgb_NMi.mjs +0 -278
  209. package/dist/MemoryScanner-CiL7Z3ey.mjs +0 -428
  210. package/dist/NativeMemoryManager.impl-D9Lkovvn.mjs +0 -485
  211. package/dist/NativeMemoryManager.utils-BBlAixF5.mjs +0 -165
  212. package/dist/PEAnalyzer-DMQ44gen.mjs +0 -385
  213. package/dist/PageController-BPJNqqBN.mjs +0 -431
  214. package/dist/PointerChainEngine-K7wN8Z-w.mjs +0 -325
  215. package/dist/PrerequisiteError-TuyZIs6n.mjs +0 -20
  216. package/dist/ProcessRegistry-zGg12QbE.mjs +0 -74
  217. package/dist/ResponseBuilder-CJXWmWNw.mjs +0 -143
  218. package/dist/ReverseEvidenceGraph-C02-gXOh.mjs +0 -269
  219. package/dist/ScriptManager-ZuWD-0Jg.mjs +0 -3003
  220. package/dist/Speedhack-D-z0umeT.mjs +0 -156
  221. package/dist/StealthVerifier-BWmPgQsv.mjs +0 -135
  222. package/dist/StructureAnalyzer-Cav5AVSL.mjs +0 -429
  223. package/dist/ToolCatalog-5OJdMiF0.mjs +0 -582
  224. package/dist/ToolError-jh9whhMd.mjs +0 -15
  225. package/dist/ToolProbe-DbCFGyrg.mjs +0 -45
  226. package/dist/ToolRegistry-B9krbTtI.mjs +0 -180
  227. package/dist/ToolRouter.policy-BGDAGyeH.mjs +0 -344
  228. package/dist/TraceRecorder-B41Z5XBj.mjs +0 -1286
  229. package/dist/VersionDetector-K3V4vGsw.mjs +0 -104
  230. package/dist/Win32API-C2kjj0ze.mjs +0 -346
  231. package/dist/Win32Debug-CKrGOTpo.mjs +0 -274
  232. package/dist/WorkflowEngine-DJ6M4opp.mjs +0 -569
  233. package/dist/analysis-BHeJW2Nb.mjs +0 -1234
  234. package/dist/artifactRetention-CPXkUJXp.mjs +0 -598
  235. package/dist/artifacts-DkfosXH3.mjs +0 -59
  236. package/dist/authorization-schema-DRqyJMSk.mjs +0 -31
  237. package/dist/betterSqlite3-DLSBZodi.mjs +0 -74
  238. package/dist/binary-instrument--V3MAhJ4.mjs +0 -971
  239. package/dist/bind-helpers-ClV34xdn.mjs +0 -42
  240. package/dist/boringssl-inspector-Bo_LOLaS.mjs +0 -180
  241. package/dist/browser-Dx3_S2cG.mjs +0 -4369
  242. package/dist/capabilities-CcHlvWgK.mjs +0 -33
  243. package/dist/chunk-CjcI7cDX.mjs +0 -15
  244. package/dist/concurrency-Drev_Vz9.mjs +0 -41
  245. package/dist/constants-CDZLOoVv.mjs +0 -534
  246. package/dist/coordination-DgItD9DL.mjs +0 -259
  247. package/dist/debugger-RS3RSAqs.mjs +0 -1288
  248. package/dist/definitions-BEoYofW5.mjs +0 -47
  249. package/dist/definitions-BRaefg3u.mjs +0 -365
  250. package/dist/definitions-BbkvZkiv.mjs +0 -96
  251. package/dist/definitions-BtWSHJ3o.mjs +0 -17
  252. package/dist/definitions-C1gCHO0i.mjs +0 -43
  253. package/dist/definitions-CDOg_b-l.mjs +0 -138
  254. package/dist/definitions-CVPD9hzZ.mjs +0 -54
  255. package/dist/definitions-Cea8Lgl7.mjs +0 -94
  256. package/dist/definitions-DAgIyjxM.mjs +0 -10
  257. package/dist/definitions-DJA27nsL.mjs +0 -66
  258. package/dist/definitions-DKPFU3LW.mjs +0 -25
  259. package/dist/definitions-DPRpZQ96.mjs +0 -47
  260. package/dist/definitions-DUE5gmdn.mjs +0 -18
  261. package/dist/definitions-DYVjOtxa.mjs +0 -26
  262. package/dist/definitions-DcYLVLCo.mjs +0 -37
  263. package/dist/definitions-Pp5LI2H4.mjs +0 -27
  264. package/dist/definitions-j9KdHVNR.mjs +0 -14
  265. package/dist/definitions-uzkjBwa7.mjs +0 -258
  266. package/dist/definitions-va-AnLuQ.mjs +0 -28
  267. package/dist/encoding-DJeqHmpd.mjs +0 -1079
  268. package/dist/evidence-graph-bridge-DcYizFk2.mjs +0 -136
  269. package/dist/factory-C90tBff6.mjs +0 -575
  270. package/dist/flat-target-session-Dgax2Cy3.mjs +0 -29
  271. package/dist/formatAddress-nnMvEohD.mjs +0 -17
  272. package/dist/graphql-CoHrhweh.mjs +0 -1197
  273. package/dist/handlers-4jmR0nMs.mjs +0 -898
  274. package/dist/handlers-BAHPxcch.mjs +0 -789
  275. package/dist/handlers-BOs9b907.mjs +0 -2600
  276. package/dist/handlers-BWXEy6ef.mjs +0 -917
  277. package/dist/handlers-Bndn6QvE.mjs +0 -111
  278. package/dist/handlers-BqC4bD4s.mjs +0 -681
  279. package/dist/handlers-BtYq60bM2.mjs +0 -276
  280. package/dist/handlers-BzgcB4iv.mjs +0 -799
  281. package/dist/handlers-CRyRWj2b.mjs +0 -859
  282. package/dist/handlers-CVv2H1uq.mjs +0 -592
  283. package/dist/handlers-Dl5a7JS4.mjs +0 -572
  284. package/dist/handlers-Dx2d7jt7.mjs +0 -2537
  285. package/dist/handlers-HujRKC3b.mjs +0 -661
  286. package/dist/handlers.impl-XWXkQfyi.mjs +0 -807
  287. package/dist/hooks-B1B8NRHL.mjs +0 -898
  288. package/dist/logger-Dh_xb7_2.mjs +0 -93
  289. package/dist/maintenance-PRMkLVRW.mjs +0 -835
  290. package/dist/manifest-67Bok-Si.mjs +0 -58
  291. package/dist/manifest-6lNTMZAB2.mjs +0 -87
  292. package/dist/manifest-B2duEHiH.mjs +0 -90
  293. package/dist/manifest-B6EY9Vm8.mjs +0 -57
  294. package/dist/manifest-B6nKSbyY.mjs +0 -95
  295. package/dist/manifest-BL8AQNPF.mjs +0 -106
  296. package/dist/manifest-BSZvJJmV.mjs +0 -47
  297. package/dist/manifest-BU7qzUyX.mjs +0 -418
  298. package/dist/manifest-Bl62e8WK.mjs +0 -49
  299. package/dist/manifest-Bo5cXjdt.mjs +0 -82
  300. package/dist/manifest-BpS4gtUK.mjs +0 -1347
  301. package/dist/manifest-Bv65_e2W.mjs +0 -101
  302. package/dist/manifest-BytNIF4Z.mjs +0 -117
  303. package/dist/manifest-C-xtsjS3.mjs +0 -81
  304. package/dist/manifest-CDYl7OhA.mjs +0 -66
  305. package/dist/manifest-CRZ3xmkD.mjs +0 -61
  306. package/dist/manifest-CoW6u4Tp.mjs +0 -132
  307. package/dist/manifest-Cq5zN_8A.mjs +0 -50
  308. package/dist/manifest-D7YZM_2e.mjs +0 -194
  309. package/dist/manifest-DE_VrAeQ.mjs +0 -314
  310. package/dist/manifest-DGsXSCpT.mjs +0 -39
  311. package/dist/manifest-DJ2vfEuW.mjs +0 -156
  312. package/dist/manifest-DPXDYhEu.mjs +0 -80
  313. package/dist/manifest-Dd4fQb0a.mjs +0 -322
  314. package/dist/manifest-Deq6opGg.mjs +0 -223
  315. package/dist/manifest-DfJTafJK.mjs +0 -37
  316. package/dist/manifest-DgOdgN_j.mjs +0 -50
  317. package/dist/manifest-DlbMW4v4.mjs +0 -47
  318. package/dist/manifest-DmVfbH0w.mjs +0 -374
  319. package/dist/manifest-Dog6Ddjr.mjs +0 -109
  320. package/dist/manifest-DvgU5FWb.mjs +0 -58
  321. package/dist/manifest-HsfDBs7j.mjs +0 -50
  322. package/dist/manifest-I8oQHvCG.mjs +0 -186
  323. package/dist/manifest-NvH_a-av.mjs +0 -786
  324. package/dist/manifest-cEJU1v0Z.mjs +0 -129
  325. package/dist/manifest-wOl5XLB12.mjs +0 -112
  326. package/dist/modules-tZozf0LQ.mjs +0 -10635
  327. package/dist/mojo-ipc-DXNEXEqb.mjs +0 -640
  328. package/dist/network-CPVvwvFg.mjs +0 -3852
  329. package/dist/outputPaths-um7lCRY3.mjs +0 -1141
  330. package/dist/parse-args-B4cY5Vx5.mjs +0 -39
  331. package/dist/platform-CYeFoTWp.mjs +0 -2161
  332. package/dist/process-BTbgcVc6.mjs +0 -1306
  333. package/dist/proxy-r8YN6nP1.mjs +0 -192
  334. package/dist/registry-Bl8ZQW61.mjs +0 -34
  335. package/dist/response-CWhh2aLo.mjs +0 -34
  336. package/dist/shared-state-board-BoZnSoj-.mjs +0 -586
  337. package/dist/sourcemap-BIDHUVXy.mjs +0 -934
  338. package/dist/ssrf-policy-Dsqd-DTX.mjs +0 -166
  339. package/dist/streaming-Dal6utPp.mjs +0 -725
  340. package/dist/tool-builder-BHJp32mV.mjs +0 -186
  341. package/dist/transform-DRVgGG90.mjs +0 -1011
  342. package/dist/types-Bx92KJfT.mjs +0 -4
  343. package/dist/types-DDBWs9UP.mjs +0 -37
  344. package/dist/wasm-BYx5UOeG.mjs +0 -1044
  345. package/dist/webcrack-Be0_FccV.mjs +0 -747
  346. package/dist/workflow-BpuKEtvn.mjs +0 -725
@@ -0,0 +1,103 @@
1
+ import{$r as e,Qr as t,Zr as n,ei as r,gi as i,hi as a,mi as o,pi as s,ti as c}from"./constants-BYj8Xek8.mjs";import{a as l,n as u}from"./response-C7rKQst4.mjs";import{t as d}from"./ProcessRegistry-C-bN48oR.mjs";import"./modules-BPBcSaM-.mjs";import{s as f}from"./PageController-Dfsm1_o7.mjs";import{t as p}from"./ScriptManager-LWGPTdvD.mjs";import"./definitions-DxFNRQNK2.mjs";import{Worker as m}from"node:worker_threads";const h=i,g=a,_=s,v=o;var y=class{name;workerScript;minWorkers;maxWorkers;idleTimeoutMs;resourceLimits;workers=new Map;queuedJobs=[];activeJobs=new Map;nextWorkerId=1;nextJobId=1;closed=!1;constructor(e){if(this.name=e.name??`worker-pool`,this.workerScript=e.workerScript,this.minWorkers=e.minWorkers??h,this.maxWorkers=e.maxWorkers??g,this.idleTimeoutMs=e.idleTimeoutMs??_,this.resourceLimits=e.resourceLimits,!this.workerScript||this.workerScript.trim().length===0)throw this.toError(`workerScript must be a non-empty string`);if(!Number.isInteger(this.minWorkers)||this.minWorkers<0)throw this.toError(`minWorkers must be an integer >= 0`);if(!Number.isInteger(this.maxWorkers)||this.maxWorkers<1)throw this.toError(`maxWorkers must be an integer >= 1`);if(this.minWorkers>this.maxWorkers)throw this.toError(`minWorkers cannot be greater than maxWorkers`);this.ensureMinWorkers()}submit(e,t=v){return this.closed?Promise.reject(this.toError(`pool is closed`)):new Promise((n,r)=>{let i={id:this.nextJobId++,payload:e,timeoutMs:t,resolve:n,reject:r};this.queuedJobs.push(i),this.pumpQueue()})}async warmup(e=1){if(this.closed)return;let t=Math.min(e,this.maxWorkers-this.workers.size);for(let e=0;e<t;e++){let e=this.spawnWorker();this.armIdleTimer(e)}}async close(){if(this.closed)return;this.closed=!0;let e=this.toError(`pool is closed`);for(;this.queuedJobs.length>0;)this.queuedJobs.shift()?.reject(e);for(let t of this.activeJobs.values())t.timeoutHandle&&clearTimeout(t.timeoutHandle),t.reject(e);this.activeJobs.clear();let t=Array.from(this.workers.keys());await Promise.all(t.map(e=>this.terminateWorker(e)))}async drainIdle(){if(this.closed)return;let e=[];for(let[t,n]of this.workers)!n.busy&&this.workers.size-e.length>this.minWorkers&&e.push(t);await Promise.all(e.map(e=>this.terminateWorker(e)))}ensureMinWorkers(){if(!this.closed)for(;this.workers.size<this.minWorkers;)this.spawnWorker()}pumpQueue(){if(!this.closed)for(;this.queuedJobs.length>0;){let e=this.findIdleWorker();if(!e)if(this.workers.size<this.maxWorkers)e=this.spawnWorker();else return;let t=this.queuedJobs.shift();if(!t)return;this.dispatchJob(e,t)}}findIdleWorker(){for(let e of this.workers.values())if(!e.busy)return e}spawnWorker(){let e=this.nextWorkerId++,t=new m(this.workerScript,{eval:!0,resourceLimits:this.resourceLimits});typeof t.unref==`function`&&t.unref(),d.register(t);let n={id:e,worker:t,busy:!1,activeJobId:null,idleTimer:null};return t.on(`message`,t=>this.handleWorkerMessage(e,t)),t.on(`error`,t=>this.handleWorkerFailure(e,t)),t.on(`exit`,t=>this.handleWorkerExit(e,t)),this.workers.set(e,n),n}dispatchJob(e,t){e.busy=!0,e.activeJobId=t.id,e.idleTimer&&=(clearTimeout(e.idleTimer),null);let n=setTimeout(()=>{this.handleJobTimeout(t.id,t.timeoutMs)},t.timeoutMs);this.activeJobs.set(t.id,{...t,workerId:e.id,timeoutHandle:n});try{e.worker.postMessage({jobId:t.id,payload:t.payload})}catch(n){let r=this.activeJobs.get(t.id);r?.timeoutHandle&&clearTimeout(r.timeoutHandle),this.activeJobs.delete(t.id),e.busy=!1,e.activeJobId=null,t.reject(this.toError(n instanceof Error?n.message:String(n))),this.terminateWorker(e.id).then(()=>{this.ensureMinWorkers(),this.pumpQueue()})}}handleWorkerMessage(e,t){let n=t;if(!n||typeof n!=`object`||typeof n.jobId!=`number`)return;let r=this.activeJobs.get(n.jobId);if(!r)return;r.timeoutHandle&&clearTimeout(r.timeoutHandle),this.activeJobs.delete(n.jobId);let i=this.workers.get(e);i&&(i.busy=!1,i.activeJobId=null,this.armIdleTimer(i)),n.ok?n.result===void 0?r.reject(this.toError(`worker returned empty result`)):r.resolve(n.result):r.reject(this.toError(n.error??`worker task failed`)),this.pumpQueue()}handleWorkerFailure(e,t){let n=this.workers.get(e);if(!n)return;let r=n.activeJobId;if(r!==null){let e=this.activeJobs.get(r);e&&(e.timeoutHandle&&clearTimeout(e.timeoutHandle),this.activeJobs.delete(r),e.reject(this.toError(t.message)))}this.terminateWorker(e).then(()=>{this.ensureMinWorkers(),this.pumpQueue()})}handleWorkerExit(e,t){let n=this.workers.get(e);if(!n)return;let r=n.activeJobId;if(this.workers.delete(e),n.idleTimer&&clearTimeout(n.idleTimer),r!==null){let e=this.activeJobs.get(r);e&&(e.timeoutHandle&&clearTimeout(e.timeoutHandle),this.activeJobs.delete(r),e.reject(this.toError(`worker exited unexpectedly with code ${t}`)))}this.ensureMinWorkers(),this.pumpQueue()}handleJobTimeout(e,t){let n=this.activeJobs.get(e);n&&(this.activeJobs.delete(e),n.reject(this.toError(`worker task timed out after ${t}ms`)),this.terminateWorker(n.workerId).then(()=>{this.ensureMinWorkers(),this.pumpQueue()}))}armIdleTimer(e){this.idleTimeoutMs<=0||this.workers.size<=this.minWorkers||(e.idleTimer&&clearTimeout(e.idleTimer),e.idleTimer=setTimeout(()=>{let t=this.workers.get(e.id);!t||t.busy||this.workers.size<=this.minWorkers||this.terminateWorker(e.id)},this.idleTimeoutMs))}async terminateWorker(e){let t=this.workers.get(e);if(t){this.workers.delete(e),t.idleTimer&&clearTimeout(t.idleTimer),t.idleTimer=null,t.worker.removeAllListeners(`message`),t.worker.removeAllListeners(`error`),t.worker.removeAllListeners(`exit`);try{await t.worker.terminate()}catch{}}}toError(e){return Error(`[${this.name}] ${e}`)}};const b=new Set([`constant_fold`,`string_decrypt`,`dead_code_remove`,`control_flow_flatten`,`rename_vars`]),x=/\b(-?\d+(?:\.\d+)?)\s*([+\-*/%])\s*(-?\d+(?:\.\d+)?)\b/g,S=/(['"])((?:\\.|(?!\1)[^\\])*)\1\s*\+\s*(['"])((?:\\.|(?!\3)[^\\])*)\3/g,C=/(['"])((?:\\.|(?!\1)[^\\])*)\1/g,w=/if\s*\(\s*(?:false|0|!0\s*===\s*!1)\s*\)\s*\{([\s\S]*?)\}\s*else\s*\{([\s\S]*?)\}/g,T=/if\s*\(\s*(?:false|0|!0\s*===\s*!1)\s*\)\s*\{[\s\S]*?\}/g,E=c,D=[`cryptojs`,`md5`,`sha`,`hmac`,`sign`,`signature`,`encrypt`,`decrypt`,`aes`,`rsa`];function O(i){return{collector:i,chains:new Map,cryptoHarnessPool:new y({name:`crypto-harness`,workerScript:`
2
+ const __bootstrap = async () => {
3
+ const [workerThreads, vm, perfHooks] = await Promise.all([
4
+ import('node:worker_threads'), import('node:vm'), import('node:perf_hooks'),
5
+ ]);
6
+ const parentPort = workerThreads.parentPort;
7
+ const performance = perfHooks.performance;
8
+ if (!parentPort) throw new Error('worker parentPort is unavailable');
9
+ function normalizeOutput(value) {
10
+ if (value === undefined) return '__undefined__';
11
+ if (value === null) return 'null';
12
+ if (typeof value === 'string') return value;
13
+ if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') return String(value);
14
+ try { return JSON.stringify(value); } catch { return String(value); }
15
+ }
16
+ parentPort.on('message', async (msg) => {
17
+ const { jobId, payload } = msg;
18
+ try {
19
+ const { code, functionName, testInputs } = payload;
20
+ const sandbox = Object.create(null);
21
+ sandbox.console = Object.freeze({ log() {}, warn() {}, error() {} });
22
+ sandbox.Buffer = {
23
+ from: (...args) => Buffer.from(...args),
24
+ alloc: (size) => Buffer.alloc(Math.min(size, 1048576)),
25
+ concat: (...args) => Buffer.concat(...args),
26
+ };
27
+ Object.freeze(sandbox.Buffer);
28
+ sandbox.TextEncoder = TextEncoder; sandbox.TextDecoder = TextDecoder;
29
+ sandbox.atob = (v) => Buffer.from(String(v), 'base64').toString('binary');
30
+ sandbox.btoa = (v) => Buffer.from(String(v), 'binary').toString('base64');
31
+ sandbox.globalThis = sandbox; Object.freeze(sandbox);
32
+ const context = vm.createContext(sandbox);
33
+ const isValidIdentifier = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(functionName);
34
+ const targetExpression = isValidIdentifier
35
+ ? "(typeof " + functionName + " !== 'undefined' ? " +
36
+ functionName + " : globalThis[" + JSON.stringify(functionName) + "])"
37
+ : "globalThis[" + JSON.stringify(functionName) + "]";
38
+ const script = new vm.Script(
39
+ "(() => {\\n" + code + "\\n;return " + targetExpression + ";\\n})()",
40
+ { timeout: 5000 },
41
+ );
42
+ const targetFn = script.runInContext(context, { timeout: 5000 });
43
+ if (typeof targetFn !== 'function') throw new Error("Function not found or not callable: " + functionName);
44
+ const rows = [];
45
+ for (const input of testInputs) {
46
+ const started = performance.now();
47
+ try {
48
+ const raw = targetFn(input);
49
+ const resolved = raw && typeof raw.then === 'function' ? await raw : raw;
50
+ rows.push(
51
+ {
52
+ input,
53
+ output: normalizeOutput(resolved),
54
+ duration: Number((performance.now() - started).toFixed(3)),
55
+ }
56
+ );
57
+ } catch (err) {
58
+ rows.push(
59
+ {
60
+ input,
61
+ output: '',
62
+ error: err && err.message ? err.message : String(err),
63
+ duration: Number((performance.now() - started).toFixed(3)),
64
+ }
65
+ );
66
+ }
67
+ }
68
+ parentPort.postMessage({ jobId, ok: true, result: { ok: true, results: rows } });
69
+ } catch (error) {
70
+ parentPort.postMessage(
71
+ {
72
+ jobId,
73
+ ok: true,
74
+ result: { ok: false, error: error && error.message ? error.message : String(error), results: [] },
75
+ }
76
+ );
77
+ }
78
+ });
79
+ };
80
+ __bootstrap().catch((error) => {
81
+ if (typeof console !== 'undefined' && typeof console.error === 'function')
82
+ console.error('crypto harness worker bootstrap failed:', error && error.message ? error.message : String(error));
83
+ });
84
+ `,minWorkers:0,maxWorkers:e,idleTimeoutMs:n,resourceLimits:{maxOldGenerationSizeMb:t,maxYoungGenerationSizeMb:r,stackSizeMb:8}})}}function k(e,t){return u({tool:e,...l(t)})}function A(e){let t=Array.isArray(e)?e.map(e=>String(e).trim()).filter(e=>e.length>0):typeof e==`string`?e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):[];if(t.length===0)throw Error(`transforms must contain at least one transform`);let n=[],r=new Set;for(let e of t){if(!b.has(e))throw Error(`Unsupported transform: ${e}`);r.has(e)||(r.add(e),n.push(e))}return n}function j(e){if(!Array.isArray(e))throw Error(`testInputs must be an array of strings`);let t=e.map(e=>String(e));if(t.length===0)throw Error(`testInputs cannot be empty`);return t}function M(e,t){if(typeof e==`boolean`)return e;if(typeof e==`string`){let t=e.trim().toLowerCase();if([`true`,`1`,`yes`,`on`].includes(t))return!0;if([`false`,`0`,`no`,`off`].includes(t))return!1}if(typeof e==`number`){if(e===1)return!0;if(e===0)return!1}return t}function N(e,t){if(typeof e!=`string`||e.length===0)throw Error(`${t} must be a non-empty string`);return e}function P(e,t){let n=e.replace(/\\/g,`\\\\`).replace(/\r/g,`\\r`).replace(/\n/g,`\\n`).replace(/\t/g,`\\t`);return t===`"`?n.replace(/"/g,`\\"`):n.replace(/'/g,`\\'`)}function F(e){return e.replace(/\\x([0-9a-fA-F]{2})/g,(e,t)=>String.fromCharCode(parseInt(t,16))).replace(/\\u\{([0-9a-fA-F]{1,6})\}/g,(e,t)=>String.fromCodePoint(parseInt(t,16))).replace(/\\u([0-9a-fA-F]{4})/g,(e,t)=>String.fromCharCode(parseInt(t,16))).replace(/\\n/g,`
85
+ `).replace(/\\r/g,`\r`).replace(/\\t/g,` `).replace(/\\v/g,`\v`).replace(/\\f/g,`\f`).replace(/\\0/g,`\0`).replace(/\\"/g,`"`).replace(/\\'/g,`'`).replace(/\\\\/g,`\\`)}async function I(e,t){let n=null;try{n=new p(e);let r=await n.getScriptSource(t);if(r?.source&&r.source.length>0)return r.source}catch{}finally{if(n)try{await n.close()}catch{}}let r=e.getFileByUrl(t);if(r?.content&&r.content.length>0)return r.content;let i=await(await e.getActivePage()).evaluate(async e=>{let t=Array.from(document.scripts),n=Number(e);if(Number.isInteger(n)&&n>=0&&n<t.length){let e=t[n];if(e.textContent&&e.textContent.trim().length>0)return e.textContent;if(e.src)try{let t=await fetch(e.src);if(t.ok)return await t.text()}catch{}}for(let n of t){if(n.id===e||n.dataset?.scriptId===e){if(n.textContent&&n.textContent.trim().length>0)return n.textContent;if(n.src)try{let e=await fetch(n.src);if(e.ok)return await e.text()}catch{}}if(n.src&&n.src.includes(e))try{let e=await fetch(n.src);if(e.ok)return await e.text()}catch{}}return``},t);if(typeof i==`string`&&i.length>0)return i;throw Error(`Unable to resolve source from scriptId: ${t}`)}function L(e){let t=(e.startsWith(`window.`)?e.slice(7):e).split(`.`).filter(Boolean);return t.length>0?t[t.length-1]:``}function R(e,t,n){let r=L(e);if(z(r))return r;let i=L(t);if(z(i))return i;let a=n.match(/function\s+([A-Za-z_$][A-Za-z0-9_$]*)\s*\(/);return a?.[1]&&z(a[1])?a[1]:`extractedCryptoFn`}function z(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)}async function B(e){await e.warmup(1)}function V(){return`const __textEncoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null;
86
+ const __textDecoder = typeof TextDecoder !== 'undefined' ? new TextDecoder() : null;
87
+ if (typeof globalThis.atob === 'undefined') {
88
+ globalThis.atob = (value) => Buffer.from(String(value), 'base64').toString('binary');
89
+ ;
90
+ }
91
+ if (typeof globalThis.btoa === 'undefined') {
92
+ globalThis.btoa = (value) => Buffer.from(String(value), 'binary').toString('base64');
93
+ ;
94
+ }`}async function H(e,t,n,r){try{let i=await e.submit({code:t,functionName:n,testInputs:r},E);if(!i.ok)return{results:r.map(e=>({input:e,output:``,duration:0,error:i.error??`Worker execution failed`})),allPassed:!1};let a=Array.isArray(i.results)?i.results:[];return{results:a,allPassed:a.every(e=>!e.error)}}catch(e){return{results:r.map(t=>({input:t,output:``,duration:0,error:e instanceof Error?e.message:String(e)})),allPassed:!1}}}function U(e,t,n){if(t.length>0){let n=e.get(t);if(!n)throw Error(`Transform chain not found: ${t}`);return[...n.transforms]}return A(n)}function W(e,t){let n=e,r=[];for(let e of t){let t=n;n=G(n,e),n!==t&&r.push(e)}return{transformed:n,appliedTransforms:r}}function G(e,t){switch(t){case`constant_fold`:return K(e);case`string_decrypt`:return q(e);case`dead_code_remove`:return J(e);case`control_flow_flatten`:return Y(e);case`rename_vars`:return X(e);default:return e}}function K(e){let t=e;for(let e=0;e<4;e++){let e=t.replace(x,(e,t,n,r)=>{let i=Number(t),a=Number(r);if(!Number.isFinite(i)||!Number.isFinite(a))return`${t}${n}${r}`;let o=null;switch(n){case`+`:o=i+a;break;case`-`:o=i-a;break;case`*`:o=i*a;break;case`/`:a!==0&&(o=i/a);break;case`%`:a!==0&&(o=i%a);break;default:o=null}return o===null||!Number.isFinite(o)?`${t}${n}${r}`:String(Number.isInteger(o)?o:Number(o.toFixed(12)))}).replace(S,(e,t,n,r,i)=>{let a=t===r?t:`'`;return`${a}${P(`${n}${i}`,a)}${a}`});if(e===t)break;t=e}return t}function q(e){return e.replace(C,(e,t,n)=>{let r=F(n);return r===n?`${t}${n}${t}`:`${t}${P(r,t)}${t}`})}function J(e){return e.replace(w,(e,t,n)=>n).replace(T,``)}function Y(e){return e.replace(/var\s+([A-Za-z_$][A-Za-z0-9_$]*)\s*=\s*['"]([^'"]+)['"]\.split\(\s*['"]\|['"]\s*\)\s*;\s*var\s+([A-Za-z_$][A-Za-z0-9_$]*)\s*=\s*0\s*;\s*while\s*\(\s*!!\[\]\s*\)\s*\{\s*switch\s*\(\s*\1\[\s*\3\+\+\s*\]\s*\)\s*\{([\s\S]*?)\}\s*break;\s*\}/g,(e,t,n,r,i)=>{let a=/case\s*['"]([^'"]+)['"]\s*:\s*([\s\S]*?)(?=case\s*['"]|default\s*:|$)/g,o=new Map,s;for(;(s=a.exec(i))!==null;){let e=s[1],t=(s[2]??``).replace(/\bcontinue\s*;?/g,``).replace(/\bbreak\s*;?/g,``).trim();e&&t.length>0&&o.set(e,t)}let c=n.split(`|`).map(e=>e.trim()).map(e=>o.get(e)).filter(e=>typeof e==`string`&&e.length>0).join(`
95
+ `);return c.length>0?c:e})}function X(e){let t=new Set,n=/\b(?:var|let|const)\s+([A-Za-z])\b/g,r;for(;(r=n.exec(e))!==null;){let e=r[1];e&&t.add(e)}if(t.size===0)return e;let i=new Map,a=1;for(let e of t)i.set(e,`var_${a}`),a+=1;return e.replace(/\b([A-Za-z])\b/g,(e,t,n,r)=>{let a=i.get(t);if(!a)return e;let o=n>0?r[n-1]:``;return o===`.`||o===`'`||o===`"`||o==="`"||o===`$`?e:a})}function Z(e,t){if(e===t)return``;let n=e.split(`
96
+ `),r=t.split(`
97
+ `);if(n.length*r.length>25e4)return Q(n,r);let i=n.length,a=r.length,o=Array.from({length:i+1},()=>Array(a+1).fill(0));for(let e=i-1;e>=0;e--)for(let t=a-1;t>=0;t--)o[e][t]=n[e]===r[t]?o[e+1][t+1]+1:Math.max(o[e+1][t],o[e][t+1]);let s=[],c=0,l=0;for(;c<i&&l<a;){if(n[c]===r[l]){s.push(` ${n[c]}`),c+=1,l+=1;continue}o[c+1][l]>=o[c][l+1]?(s.push(`-${n[c]}`),c+=1):(s.push(`+${r[l]}`),l+=1)}for(;c<i;)s.push(`-${n[c]}`),c+=1;for(;l<a;)s.push(`+${r[l]}`),l+=1;return s.join(`
98
+ `)}function Q(e,t){let n=0;for(;n<e.length&&n<t.length&&e[n]===t[n];)n+=1;let r=e.length-1,i=t.length-1;for(;r>=n&&i>=n&&e[r]===t[i];)--r,--i;let a=e.slice(n,r+1).map(e=>`-${e}`),o=t.slice(n,i+1).map(e=>`+${e}`);return[...a,...o].join(`
99
+ `)}var $=class{state;constructor(e){this.state=e}async handleAstTransformPreview(e){try{let t=N(e.code,`code`),n=A(e.transforms),r=M(e.preview,!0),i=W(t,n),a=r?Z(t,i.transformed):``;return u({original:t,transformed:i.transformed,diff:a,appliedTransforms:i.appliedTransforms})}catch(e){return k(`ast_transform_preview`,e)}}async handleAstTransformChain(e){try{let t=N(e.name,`name`).trim(),n=typeof e.description==`string`&&e.description.trim().length>0?e.description.trim():void 0,r=A(e.transforms);if(t.length===0)throw Error(`name cannot be empty`);return this.state.chains.set(t,{name:t,transforms:r,description:n,createdAt:Date.now()}),u({name:t,transforms:r,created:!0})}catch(e){return k(`ast_transform_chain`,e)}}async handleAstTransformApply(e){try{let t=typeof e.chainName==`string`?e.chainName.trim():``,n=typeof e.code==`string`?e.code:``,r=typeof e.scriptId==`string`?e.scriptId.trim():``,i=n.length>0?n:r.length>0?await I(this.state.collector,r):``;if(i.length===0)throw Error(`Either code or scriptId must be provided`);let a=W(i,U(this.state.chains,t,e.transforms));return u({transformed:a.transformed,stats:{originalSize:i.length,transformedSize:a.transformed.length,transformsApplied:a.appliedTransforms}})}catch(e){return k(`ast_transform_apply`,e)}}},ee=class{state;constructor(e){this.state=e}async runCryptoHarnessProxy(e,t,n){return H(this.state.cryptoHarnessPool,e,t,n)}async handleCryptoExtractStandalone(e){try{let t=N(e.targetFunction,`targetFunction`).trim(),n=M(e.includePolyfills,!0),r=await f(await this.state.collector.getActivePage(),(e,t)=>{let n=(Array.isArray(t)?t:[]).map(e=>String(e).toLowerCase()),r=window,i=(e,t)=>{let r=(e+`
100
+ `+t).toLowerCase(),i=0;for(let e of n)r.includes(e)&&(i+=1);return i},a=[],o=(e,t,n=0)=>{if(typeof t!=`function`)return;let r=Function.prototype.toString.call(t);if(r.includes(`[native code]`))return;let o=i(e,r)+n;o<=0&&n<=0||a.push({path:e,source:r,score:o})};e.length>0&&o(e,(()=>{let t=(e.startsWith(`window.`)?e.slice(7):e).split(`.`).filter(Boolean),n=window;for(let e of t){if(n==null||typeof n!=`object`&&typeof n!=`function`)return;let t=n;if(!(e in t))return;n=t[e]}return n})(),100);let s=Object.getOwnPropertyNames(r).slice(0,800);for(let e of s){let t=r[e];if(o(`window.`+e,t),t&&typeof t==`object`){let n=t,r=Object.keys(n).slice(0,40);for(let t of r)o(`window.`+e+`.`+t,n[t])}}a.sort((e,t)=>t.score-e.score);let c=a[0];if(!c)return{targetPath:null,targetSource:``,candidates:[],dependencies:[],dependencySnippets:[]};let l=/\b[A-Za-z_$][A-Za-z0-9_$]{1,}\b/g,u=new Set(`function.return.const.let.var.if.else.for.while.switch.case.break.continue.new.this.window.globalThis.Math.JSON.Date.Array.Object.String.Number.Boolean.Promise.RegExp.Error.null.undefined.true.false.async.await`.split(`.`)),d=Array.from(new Set((c.source.match(l)??[]).filter(e=>!u.has(e)))).slice(0,30),f=[];for(let e of d){if(!(e in r))continue;let t=r[e];if(typeof t==`function`){let n=Function.prototype.toString.call(t);!n.includes(`[native code]`)&&n.length<5e4&&f.push(`const `+e+` = `+n+`;`);continue}if(t===null||typeof t==`string`||typeof t==`number`||typeof t==`boolean`){f.push(`const `+e+` = `+JSON.stringify(t)+`;`);continue}if(typeof t==`object`)try{let n=JSON.stringify(t);n&&n.length<4e3&&f.push(`const `+e+` = `+n+`;`)}catch{}}return{targetPath:c.path,targetSource:c.source,candidates:a.slice(0,20),dependencies:d,dependencySnippets:f}},t,D);if(!r||r.targetSource.trim().length===0)throw Error(`No crypto/signature-like function found on current page`);let i=R(t,r.targetPath??``,r.targetSource),a=r.dependencySnippets.filter(e=>!e.startsWith(`const ${i} = `)),o=r.dependencies.filter(e=>e!==i),s=[`'use strict';`];n&&s.push(V()),a.length>0&&s.push(a.join(`
101
+ `)),s.push(`const ${i} = ${r.targetSource.trim()};`),s.push(`if (typeof globalThis !== 'undefined') { globalThis.${i} = ${i}; }`);let c=s.filter(e=>e.trim().length>0).join(`
102
+
103
+ `);return u({extractedCode:c,dependencies:o,size:c.length})}catch(e){return k(`crypto_extract_standalone`,e)}}async handleCryptoTestHarness(e){try{let t=N(e.code,`code`),n=N(e.functionName,`functionName`),r=j(e.testInputs);await B(this.state.cryptoHarnessPool);try{let e=await H(this.state.cryptoHarnessPool,t,n,r);return u({results:e.results.map(e=>({input:e.input,output:e.output,duration:e.duration,...e.error?{error:e.error}:{}})),allPassed:e.allPassed})}finally{this.state.cryptoHarnessPool.drainIdle?.()}}catch(e){return k(`crypto_test_harness`,e)}}async handleCryptoCompare(e){try{let t=N(e.code1,`code1`),n=N(e.code2,`code2`),r=N(e.functionName,`functionName`),i=j(e.testInputs);await B(this.state.cryptoHarnessPool);try{let[e,a]=await Promise.all([H(this.state.cryptoHarnessPool,t,r,i),H(this.state.cryptoHarnessPool,n,r,i)]),o=i.map((t,n)=>{let r=e.results[n]??{input:t,output:``,duration:0,error:`missing result from implementation #1`},i=a.results[n]??{input:t,output:``,duration:0,error:`missing result from implementation #2`},o=r.output===i.output,s=!r.error&&!i.error;return{input:t,output1:r.output,output2:i.output,duration1:r.duration,duration2:i.duration,match:o&&s,...r.error?{error1:r.error}:{},...i.error?{error2:i.error}:{}}}),s=o.filter(e=>e.match).length;return u({matches:s,mismatches:o.length-s,results:o})}finally{this.state.cryptoHarnessPool.drainIdle?.()}}catch(e){return k(`crypto_compare`,e)}}},te=class{collector;state;ast;crypto;constructor(e){this.collector=e,this.state=O(e),this.ast=new $(this.state),this.crypto=new ee(this.state)}async close(){await this.state.cryptoHarnessPool.close()}get chains(){return this.state.chains}get cryptoHarnessPool(){return this.state.cryptoHarnessPool}async runCryptoHarness(e,t,n){return this.crypto.runCryptoHarnessProxy(e,t,n)}handleAstTransformPreview=e=>this.ast.handleAstTransformPreview(e);handleAstTransformChain=e=>this.ast.handleAstTransformChain(e);handleAstTransformApply=e=>this.ast.handleAstTransformApply(e);handleCryptoExtractStandalone=e=>this.crypto.handleCryptoExtractStandalone(e);handleCryptoTestHarness=e=>this.crypto.handleCryptoTestHarness(e);handleCryptoCompare=e=>this.crypto.handleCryptoCompare(e)};export{te as TransformToolHandlers};
@@ -0,0 +1 @@
1
+ import{t as e}from"./chunk-C_pMuVsO.mjs";import{exec as t,execFile as n}from"child_process";import{promisify as r}from"util";var i=e({execAsync:()=>a,execFileAsync:()=>o,executePowerShellScript:()=>c});const a=r(t),o=r(n);function s(){return process.platform===`win32`?`powershell.exe`:`powershell`}async function c(e,t={}){let n=[`-NoProfile`,`-ExecutionPolicy`,`Bypass`,`-EncodedCommand`,Buffer.from(e,`utf16le`).toString(`base64`)],{stdout:r,stderr:i}=await o(s(),n,{maxBuffer:t.maxBuffer??1024*1024,timeout:t.timeout,windowsHide:!0});return{stdout:String(r??``),stderr:String(i??``)}}export{i,o as n,c as r,a as t};
@@ -0,0 +1 @@
1
+ const e=`.jshook-install.json`;export{e as t};
@@ -0,0 +1,174 @@
1
+ import{ai as e,ci as t,ii as n,oi as r,si as i}from"./constants-BYj8Xek8.mjs";import{i as a}from"./modules-BPBcSaM-.mjs";import{i as o}from"./artifacts-CkodUM4j.mjs";import{a as s,o as c,r as l,s as u,t as d}from"./parse-args-Bw413PlW.mjs";import{t as f}from"./ResponseBuilder-BfWP-uaT.mjs";import{n as p}from"./capabilities-CyXuKUl1.mjs";import{t as m}from"./ToolRegistry-C5oB8KP8.mjs";import"./definitions-CT8ln6GQ.mjs";import{tmpdir as h}from"node:os";import{createHash as g}from"node:crypto";import{join as _,normalize as v,resolve as y,sep as b}from"node:path";import{mkdir as x,stat as S,writeFile as C}from"node:fs/promises";const w=e=>typeof e==`object`&&!!e,T=e=>w(e)&&typeof e.error==`string`;function E(e){let t=y(e),n=v(process.cwd()),r=v(h());if(!t.startsWith(`${n}${b}`)&&!t.startsWith(`${r}${b}`))throw Error(`Path traversal blocked: outputPath must be under project root or temp directory`);return t}var D=class{state;constructor(e){this.state=e}ok(e){return{content:[{type:`text`,text:JSON.stringify({success:!0,...e},null,2)}]}}fail(e,t){return{content:[{type:`text`,text:JSON.stringify({success:!1,error:e,...t===void 0?{}:{exitCode:t}},null,2)}]}}async writeTextArtifact(e){let{outputPath:t,artifact:n,content:r,pathMode:i=`display`}=e;if(t){let e=E(t);return await C(e,r,`utf-8`),e}let{absolutePath:a,displayPath:s}=await o(n);return await C(a,r,`utf-8`),i===`absolute`?a:s}async resolveArtifactOutputPath(e){let{outputPath:t,artifact:n,pathMode:r=`absolute`}=e;if(t)return E(t);let{absolutePath:i,displayPath:a}=await o(n);return r===`display`?a:i}preview(e,t){let n=e.split(`
2
+ `);return n.slice(0,t).join(`
3
+ `)+(n.length>t?`
4
+ ... (truncated)`:``)}async tryStatSize(e){try{return(await S(e)).size}catch{return 0}}};function O(e){return/^[a-z]:[\\/]/i.test(e)||/^\\\\[^\\]+\\[^\\]+/i.test(e)||/^file:\/\//i.test(e)||/^\/(?:Users|home|tmp|var|etc|opt|usr|srv|mnt|media|private|root|run|dev|proc|sys|Library|Volumes)(?:\/|$)/.test(e)}var k=class extends D{async handleWasmDetectObfuscation(r){let a=u(r,`inputPath`),o=d(r,`verbose`,!1),s=await this.state.runner.run({tool:`wabt.wasm2wat`,args:[a],timeoutMs:i});if(!s.ok)return this.fail(`Failed to disassemble: ${s.stderr}`);let c=s.stdout,l=[],f=(c.match(/br_table/g)||[]).length;f>5&&l.push({type:`control-flow-flattening`,confidence:Math.min(f/20,.95),description:`${f} br_table dispatches detected — likely flattened control flow`});let p=(c.match(/i32\.xor/g)||[]).length,m=(c.match(/i32\.rotl|i32\.rotr/g)||[]).length,h=(c.match(/i32\.shl|i32\.shr_[su]/g)||[]).length;p+m+h>n&&l.push({type:`constant-encoding`,confidence:Math.min((p+m+h)/50,.9),description:`High density of bitwise ops (${p} xor, ${h} shift, ${m} rotate) — constant decoding`});let g=c.match(/br\s+(?:\$\d+|\d+)\s*\n\s*(?!end\b|\))\S.*$/gm)||[];g.length>e&&l.push({type:`dead-code-injection`,confidence:Math.min(g.length/30,.85),description:`${g.length} code blocks after unconditional branches`});let _=/\(loop/.test(c),v=/br_table/.test(c),y=/local\.get\s+\d+/.test(c);if(_&&v&&y){let e=(c.match(/\(loop/g)||[]).length;e>t&&l.push({type:`vm-dispatch`,confidence:.75,description:`Loop + br_table + local.get pattern (${e} loops) — possible WASM VM interpreter`})}let b=(c.match(/\(func\s/g)||[]).length,x=c.length;b>0&&x/b>5e3&&l.push({type:`code-bloat`,confidence:.5,description:`Average ${(x/b).toFixed(0)} chars/function across ${b} functions — unusually large`});let S=(c.match(/\bcall_indirect\b/g)||[]).length,C=(c.match(/\bcall\s+(?!indirect)/g)||[]).length;S>3&&S>=C*.3&&l.push({type:`indirect-call-dispatch`,confidence:Math.min(S/15,.85),description:`${S} call_indirect vs ${C} direct calls — indirect call ratio suggests dispatch-based VM or obfuscation`});let w=(c.match(/\(import\s+"env"\s+"(\w+)"/g)||[]).map(e=>e.split(`"`)[3]??``).filter(e=>![`memory`,`table`,`__linear_memory`,`__indirect_function_table`].includes(e));w.length>20&&l.push({type:`large-import-surface`,confidence:Math.min(w.length/50,.7),description:`${w.length} env imports — large import surface typical of obfuscated/wrapped modules`});let T=l.length>0,E=l.reduce((e,t)=>Math.max(e,t.confidence),0);return this.ok({inputPath:a,hasObfuscation:T,overallConfidence:T?E:0,detectionCount:l.length,detections:l,summary:T?`Detected ${l.length} obfuscation pattern(s). Highest confidence: ${(E*100).toFixed(0)}%`:`No obfuscation patterns detected.`,...o?{watPreview:this.preview(c,200)}:{}})}async handleWasmInstrumentTrace(e){let t=u(e,`inputPath`),n=d(e,`allHooks`,!0),r=c(e,`hooks`),a=s(e,`outputPath`),o=await this.state.runner.run({tool:`wabt.wasm2wat`,args:[t],timeoutMs:i});if(!o.ok)return this.fail(o.stderr);let l=o.stdout,f=n?[`call`,`memory`,`branch`,`loop`,`local`]:r.length>0?r:[`call`],p=l.match(/\(func\s/g)||[],m=l.match(/\(export/g)||[],h=l.match(/\(import/g)||[],g=l.match(/\(table\b/g)||[],_=l.match(/\bcall_indirect\b/g)||[],v=[],y=[],b=/\(export\s+"([^"]+)"\s+\((\w+)\s+(\$?[\w.]+)\)\)/g,x=/\(import\s+"([^"]+)"\s+"([^"]+)"/g,S;for(;(S=b.exec(l))!==null;)S[1]&&v.push(S[1]);for(;(S=x.exec(l))!==null;)S[1]&&S[2]&&y.push({module:S[1],name:S[2]});let w={call:`
5
+ const callLog = [];
6
+ for (const [name, value] of Object.entries(instance.exports)) {
7
+ if (typeof value === 'function') {
8
+ hookedExports[name] = new Proxy(value, {
9
+ apply(target, thisArg, argumentsList) {
10
+ const entry = { type: 'call', name, args: argumentsList.map(String), timestamp: Date.now() };
11
+ callLog.push(entry);
12
+ try {
13
+ const result = Reflect.apply(target, thisArg, argumentsList);
14
+ callLog.push({ type: 'return', name, result: String(result), timestamp: Date.now() });
15
+ return result;
16
+ } catch (err) {
17
+ callLog.push({ type: 'throw', name, error: String(err), timestamp: Date.now() });
18
+ throw err;
19
+ }
20
+ }
21
+ });
22
+ }
23
+ }`,memory:`
24
+ const memoryLog = [];
25
+ const originalMemory = instance.exports.memory || Object.values(instance.exports).find(e => e instanceof WebAssembly.Memory);
26
+ const memTracker = { reads: 0, writes: 0, growEvents: [] };
27
+ if (originalMemory) {
28
+ const memSnapshot = () => {
29
+ const view = new DataView(originalMemory.buffer);
30
+ return { byteLength: view.byteLength, pages: view.byteLength / 65536 };
31
+ };
32
+ memTracker.snapshot = memSnapshot;
33
+ const origGrow = originalMemory.grow?.bind(originalMemory);
34
+ if (origGrow) {
35
+ originalMemory.grow = function(delta) {
36
+ const beforePages = originalMemory.buffer.byteLength / 65536;
37
+ memoryLog.push({ op: 'grow', delta, beforePages, timestamp: Date.now() });
38
+ memTracker.growEvents.push({ delta, beforePages });
39
+ return origGrow(delta);
40
+ };
41
+ }
42
+ const memProxy = new Proxy(originalMemory, {
43
+ get(target, prop) {
44
+ if (prop === 'buffer') {
45
+ memTracker.reads++;
46
+ }
47
+ const val = Reflect.get(target, prop, target);
48
+ return typeof val === 'function' ? val.bind(target) : val;
49
+ }
50
+ });
51
+ const memExportName = Object.entries(instance.exports).find(([, v]) => v === originalMemory)?.[0] || 'memory';
52
+ hookedExports[memExportName] = memProxy;
53
+ memTracker.buffer = originalMemory.buffer;
54
+ }`,branch:`
55
+ // === Branch Hook: Tracks JS-visible WebAssembly.Table access only ===
56
+ // Internal call_indirect dispatch stays inside the Wasm engine and is not observable from JS.
57
+ const branchLog = [];
58
+ for (const [tableName, table] of Object.entries(instance.exports)) {
59
+ if (!(table instanceof WebAssembly.Table)) continue;
60
+ const origGet = table.get.bind(table);
61
+ const origGrow = table.grow?.bind(table);
62
+ hookedExports[tableName] = new Proxy(table, {
63
+ get(t, prop) {
64
+ if (prop === 'get') {
65
+ return (idx) => {
66
+ branchLog.push({ type: 'table_get', table: tableName, index: idx, timestamp: Date.now() });
67
+ return origGet(idx);
68
+ };
69
+ }
70
+ if (prop === 'grow' && origGrow) {
71
+ return (delta) => {
72
+ branchLog.push({ type: 'table_grow', table: tableName, delta, timestamp: Date.now() });
73
+ return origGrow(delta);
74
+ };
75
+ }
76
+ const val = t[prop];
77
+ return typeof val === 'function' ? val.bind(t) : val;
78
+ }
79
+ });
80
+ }`,loop:`
81
+ const loopLog = [];
82
+ const loopCallCounts = {};
83
+ const loopSource = hookedExports;
84
+ for (const [name, value] of Object.entries(loopSource)) {
85
+ if (typeof value === 'function') {
86
+ hookedExports[name] = new Proxy(value, {
87
+ apply(target, thisArg, args) {
88
+ loopCallCounts[name] = (loopCallCounts[name] || 0) + 1;
89
+ if (loopCallCounts[name] > 1) {
90
+ loopLog.push({ type: 'loop-iteration', func: name, count: loopCallCounts[name], timestamp: Date.now() });
91
+ }
92
+ return Reflect.apply(target, thisArg, args);
93
+ }
94
+ });
95
+ }
96
+ }`,local:`
97
+ const localLog = [];
98
+ for (const [globalName, global] of Object.entries(instance.exports)) {
99
+ if (!(global instanceof WebAssembly.Global)) continue;
100
+ hookedExports[globalName] = new Proxy(global, {
101
+ get(target, prop) {
102
+ if (prop === 'valueOf' || prop === Symbol.toPrimitive) {
103
+ return (...args) => Reflect.apply(target.valueOf, target, args);
104
+ }
105
+ const val = Reflect.get(target, prop, target);
106
+ if (prop === 'value' && typeof val === 'function') {
107
+ return target.valueOf();
108
+ }
109
+ return typeof val === 'function' ? val.bind(target) : val;
110
+ },
111
+ set(target, prop, newValue) {
112
+ if (prop === 'value') {
113
+ const oldValue = target.valueOf();
114
+ localLog.push({ type: 'global-set', name: globalName, oldValue, newValue, timestamp: Date.now() });
115
+ target.value = newValue;
116
+ return true;
117
+ }
118
+ return Reflect.set(target, prop, newValue, target);
119
+ }
120
+ });
121
+ }`},T=f.filter(e=>e in w),D=`
122
+ const hookedExports = {};
123
+ for (const [k, v] of Object.entries(instance.exports)) { hookedExports[k] = v; }
124
+ `+T.map(e=>w[e]).join(`
125
+ `),k=JSON.stringify(t),A=[...new Set(y.map(({module:e})=>e))].filter(e=>e!==`env`).map(e=>` ${JSON.stringify(e)}: {},`).join(`
126
+ `),j=y.map(({module:e,name:t})=>{let n=JSON.stringify(e),r=JSON.stringify(t);return`if (!imports[${n}]) imports[${n}] = {};\n if (!imports[${n}][${r}]) imports[${n}][${r}] = () => {};`}).join(`
127
+ `),M=`// WASM Instrumentation Wrapper (Wasabi-style)
128
+ // Generated by jshookmcp wasm_instrument_trace
129
+ // Hooks: ${T.join(`, `)}
130
+ // Functions: ${p.length} | Exports: ${v.join(`, `)||`none`} | Imports: ${y.length}
131
+
132
+ (async function() {
133
+ const wasmBytes = await fetch(${k}).then(r => r.arrayBuffer());
134
+ const module = await WebAssembly.compile(wasmBytes);
135
+
136
+ const imports = {
137
+ env: {
138
+ abort: () => console.warn('[wasabi] abort called'),
139
+ memory: new WebAssembly.Memory({ initial: 256, maximum: 1024 }),
140
+ seed: () => Math.random(),
141
+ 'Math.log': Math.log,
142
+ 'Math.random': Math.random,
143
+ console: { log: (...a) => console.log('[wasabi]', ...a) },
144
+ },
145
+ ${A?`${A}\n`:``} };
146
+
147
+ ${j}
148
+
149
+ const instance = await WebAssembly.instantiate(module, imports);
150
+
151
+ ${D}
152
+
153
+ const tracedExports = hookedExports;
154
+
155
+ return {
156
+ instance,
157
+ exports: tracedExports,
158
+ hooks: {
159
+ ${T.map(e=>` ${e}: ${e===`call`?`callLog`:e===`memory`?`memoryLog`:e===`branch`?`branchLog`:e===`loop`?`loopLog`:`localLog`}`).join(`,
160
+ `)}
161
+ },
162
+ stats: {
163
+ functions: ${p.length},
164
+ exports: ${m.length},
165
+ imports: ${h.length},
166
+ exportNames: ${JSON.stringify(v)},
167
+ hookTypes: ${JSON.stringify(T)}
168
+ }
169
+ };
170
+ })();
171
+ `,N;if(a){let e=E(a);await C(e,M,`utf-8`),N=e}else N=await this.writeTextArtifact({artifact:{category:`wasm`,toolName:`wasm-instrument`,ext:`js`},content:M});let P=O(t),F=[P?`Wrapper embeds the provided inputPath into browser-side fetch(). Local filesystem paths are not browser-accessible; provide an http(s) URL instead, or upload the module with wasm_dump and use the resulting URL.`:void 0,T.includes(`branch`)&&_.length>0?`Branch hook only observes JS-visible WebAssembly.Table access. This module contains ${_.length} call_indirect site(s), which are dispatched inside the Wasm engine and will not appear in branch logs.`:void 0].filter(e=>typeof e==`string`&&e.length>0),I=F.length>0?F.join(` `):void 0;return this.ok({artifactPath:N,hookTypes:T,functionCount:p.length,exportCount:m.length,importCount:h.length,wrapperSizeBytes:M.length,note:`Wasabi-style instrumentation wrapper generated. Load in browser with WASM module to trace execution.`,metadata:{inputPathKind:P?`local-path`:`url`,wrapperFetchesBrowserUrl:!0,...T.includes(`branch`)?{branchHookMode:`js-table-access-only`,callIndirectSites:_.length,tableCount:g.length}:{}},...I?{warning:I}:{}})}},A=class extends D{async handleWasmDisassemble(e){let t=u(e,`inputPath`),n=s(e,`outputPath`),r=d(e,`foldExprs`,!0),a=[t,`-o`,`/dev/stdout`];r&&a.push(`--fold-exprs`);let o=await this.state.runner.run({tool:`wabt.wasm2wat`,args:a,timeoutMs:i,requireNonEmptyOutput:!0,outputLabel:`wasm text output`});if(!o.ok)return this.fail(o.stderr,o.exitCode??void 0);let c=await this.writeTextArtifact({outputPath:n,artifact:{category:`wasm`,toolName:`wasm-disassemble`,ext:`wat`},content:o.stdout});return this.ok({artifactPath:c,totalLines:o.stdout.split(`
172
+ `).length,sizeBytes:o.stdout.length,preview:this.preview(o.stdout,50),durationMs:o.durationMs})}async handleWasmDecompile(e){let t=u(e,`inputPath`),n=s(e,`outputPath`),r=await this.state.runner.run({tool:`wabt.wasm-decompile`,args:[t,`-o`,`/dev/stdout`],timeoutMs:i,requireNonEmptyOutput:!0,outputLabel:`wasm decompile output`});if(!r.ok)return this.fail(r.stderr,r.exitCode??void 0);let a=await this.writeTextArtifact({outputPath:n,artifact:{category:`wasm`,toolName:`wasm-decompile`,ext:`dcmp`},content:r.stdout});return this.ok({artifactPath:a,totalLines:r.stdout.split(`
173
+ `).length,preview:this.preview(r.stdout,60),durationMs:r.durationMs})}async handleWasmInspectSections(e){let t=u(e,`inputPath`),n=({headers:`-h`,details:`-x`,disassemble:`-d`,all:`-h -x -d`}[s(e,`sections`,`details`)]||`-x`).split(` `),r=await this.state.runner.run({tool:`wabt.wasm-objdump`,args:[...n,t],timeoutMs:i,requireNonEmptyOutput:!0,outputLabel:`wasm section dump`});return r.ok?this.ok({totalLines:r.stdout.split(`
174
+ `).length,preview:this.preview(r.stdout,100),durationMs:r.durationMs}):this.fail(r.stderr,r.exitCode??void 0)}async handleWasmToC(e){let t=u(e,`inputPath`),n=s(e,`outputDir`),r=await this.resolveArtifactOutputPath({outputPath:n,artifact:{category:`wasm`,toolName:`wasm2c`,ext:`dir`},pathMode:`absolute`});await x(r,{recursive:!0});let a=y(t).replace(/\.wasm$/i,``).split(/[/\\]/).pop()||`output`,o=_(r,`${a}.c`),c=_(r,`${a}.h`),l=await this.state.runner.run({tool:`wabt.wasm2c`,args:[t,`-o`,o],timeoutMs:i,expectedOutputPaths:[o,c],outputLabel:`wasm2c output`});return l.ok?this.ok({outputDir:r,cFile:o,hFile:c,cSizeBytes:await this.tryStatSize(o),hSizeBytes:await this.tryStatSize(c),durationMs:l.durationMs}):this.fail(l.stderr,l.exitCode??void 0)}},j=class extends D{async handleWasmOfflineRun(e){let t=u(e,`inputPath`),n=u(e,`functionName`),r=c(e,`args`),i=s(e,`runtime`,`auto`),a=l(e,`timeoutMs`,1e4),o;if(i===`auto`){let e=await this.state.runner.probeAll();if(e[`runtime.wasmtime`]?.available)o=`runtime.wasmtime`;else if(e[`runtime.wasmer`]?.available)o=`runtime.wasmer`;else return this.fail(`No WASM runtime found. Install wasmtime or wasmer.`)}else o=i===`wasmer`?`runtime.wasmer`:`runtime.wasmtime`;let d=o===`runtime.wasmtime`?[`run`,`--invoke`,n,t,...r]:[`run`,t,`--invoke`,n,`--`,...r],f=await this.state.runner.run({tool:o,args:d,timeoutMs:a,requireNonEmptyOutput:!0,outputLabel:`runtime output`});return this.ok({runtime:o,functionName:n,args:r,output:f.stdout.trim(),stderr:f.stderr.trim()||void 0,exitCode:f.exitCode,durationMs:f.durationMs,success:f.ok})}async handleWasmOptimize(e){let t=u(e,`inputPath`),n=s(e,`outputPath`),i=s(e,`level`,`O2`),a=await this.resolveArtifactOutputPath({outputPath:n,artifact:{category:`wasm`,toolName:`wasm-opt`,ext:`wasm`},pathMode:`absolute`}),o=await this.state.runner.run({tool:`binaryen.wasm-opt`,args:[`-${i}`,t,`-o`,a],timeoutMs:r,expectedOutputPaths:[a],outputLabel:`optimized wasm`});if(!o.ok)return this.fail(o.stderr,o.exitCode??void 0);let c=await this.tryStatSize(t),l=await this.tryStatSize(a);return this.ok({artifactPath:a,optimizationLevel:i,inputSizeBytes:c,outputSizeBytes:l,reductionPercent:c>0?((1-l/c)*100).toFixed(1):`0`,durationMs:o.durationMs})}},M=class{conversion;runtime;analysis;constructor(e){this.conversion=new A(e),this.runtime=new j(e),this.analysis=new k(e)}handleWasmDisassemble(e){return this.conversion.handleWasmDisassemble(e)}handleWasmDecompile(e){return this.conversion.handleWasmDecompile(e)}handleWasmInspectSections(e){return this.conversion.handleWasmInspectSections(e)}handleWasmOfflineRun(e){return this.runtime.handleWasmOfflineRun(e)}handleWasmOptimize(e){return this.runtime.handleWasmOptimize(e)}handleWasmToC(e){return this.conversion.handleWasmToC(e)}handleWasmDetectObfuscation(e){return this.analysis.handleWasmDetectObfuscation(e)}handleWasmInstrumentTrace(e){return this.analysis.handleWasmInstrumentTrace(e)}},N=class{state;constructor(e){this.state=e}async handleWasmDump(e){let t=l(e,`moduleIndex`,0),n=s(e,`outputPath`),r=await this.state.collector.getActivePage(),i=await r.evaluate(e=>{let t=window.__aiHooks?.[`preset-webassembly-full`];if(!Array.isArray(t)||t.length===0)return{error:`No WASM modules captured. Ensure the webassembly-full hook preset is active and the page has loaded WASM.`};let n=t.filter(e=>e.type===`instantiated`);if(e>=n.length)return{error:`Module index ${e} out of range. Found ${n.length} instantiated modules.`};let r=n[e];return{exports:r.exports,importMods:r.importMods,size:r.size,moduleCount:n.length}},t);if(T(i))return{content:[{type:`text`,text:JSON.stringify({success:!1,error:i.error})}]};let a=await r.evaluate(e=>{let t=window.__wasmModuleStorage;if(!t?.[e])return null;let n=t[e];return Array.from(new Uint8Array(n))},t),c,u;if(a){let e=Buffer.from(a);if(u=g(`sha256`).update(e).digest(`hex`).substring(0,16),n){let t=E(n);await C(t,e),c=t}else{let{absolutePath:t,displayPath:n}=await o({category:`wasm`,toolName:`wasm-dump`,target:u,ext:`wasm`});await C(t,e),c=n}}else c=`(binary not available — hook did not store raw bytes)`;return{content:[{type:`text`,text:JSON.stringify({success:!0,artifactPath:c,hash:u,size:i.size,exports:i.exports,importModules:i.importMods,totalModules:i.moduleCount,hint:a?`Use wasm_disassemble or wasm_decompile on the dumped file for further analysis.`:`Binary not captured. Inject hook_preset("webassembly-full") BEFORE page navigation, with window.__wasmModuleStorage patching.`},null,2)}]}}async handleWasmVmpTrace(e){let t=l(e,`maxEvents`,5e3),n=s(e,`filterModule`),r=await(await this.state.collector.getActivePage()).evaluate(e=>{let t=window.__aiHooks?.[`preset-webassembly-full`];if(!Array.isArray(t)||t.length===0)return{error:`No WASM hook data. Inject hook_preset("webassembly-full") and reload the page.`};let n=t.filter(e=>e.type===`import_call`);e.filterModule&&(n=n.filter(t=>t.mod===e.filterModule));let r=n.slice(0,e.maxEvents),i={};for(let e of r){let t=`${String(e.mod)}.${String(e.fn)}`;i[t]=(i[t]||0)+1}let a=Object.entries(i).toSorted((e,t)=>t[1]-e[1]).slice(0,30).map(([e,t])=>({name:e,count:t}));return{totalEvents:n.length,capturedEvents:r.length,topFunctions:a,trace:r.slice(0,200).map(e=>({mod:e.mod,fn:e.fn,args:e.args,ts:e.ts}))}},{maxEvents:t,filterModule:n});return T(r)?{content:[{type:`text`,text:JSON.stringify({success:!1,error:r.error})}]}:{content:[{type:`text`,text:JSON.stringify({success:!0,...r,hint:`Top functions show VMP handler dispatch patterns. Use wasm_disassemble to analyze their implementation.`},null,2)}]}}async handleWasmMemoryInspect(e){let t=l(e,`offset`,0),n=Math.min(l(e,`length`,256),65536),r=s(e,`format`,`both`),i=s(e,`searchPattern`),a=await(await this.state.collector.getActivePage()).evaluate(e=>{let t=window,n=t.__aiHooks?.[`preset-webassembly-full`],r=(Array.isArray(n)?n:[]).filter(e=>e.type===`memory_created`),i=t.__wasmInstances;if(!Array.isArray(i)||i.length===0)return{error:`No WASM memory available. Ensure the webassembly-full hook is active and a WASM module is instantiated.`};try{let t=i[0].exports?.memory;if(!t?.buffer)return{error:`WASM module has no exported memory.`};let n=new Uint8Array(t.buffer),a=Array.from(n.slice(e.offset,e.offset+e.length)),o;if(e.searchPattern){o=[];let t=e.searchPattern;if(/^[0-9a-fA-F\s]+$/.test(t)){let r=t.replace(/\s/g,``).match(/.{2}/g)?.map(e=>parseInt(e,16))||[];for(let t=e.offset;t<=Math.min(e.offset+e.length-r.length,n.length-r.length);t++){let e=!0;for(let i=0;i<r.length;i++)if(n[t+i]!==r[i]){e=!1;break}e&&o.push({offset:t})}}else{let r=new TextEncoder().encode(t);for(let t=e.offset;t<=Math.min(e.offset+e.length-r.length,n.length-r.length);t++){let e=!0;for(let i=0;i<r.length;i++)if(n[t+i]!==r[i]){e=!1;break}e&&o.push({offset:t})}}}return{totalMemoryPages:t.buffer.byteLength/65536,totalMemoryBytes:t.buffer.byteLength,requestedOffset:e.offset,requestedLength:e.length,data:a,searchResults:o,memoryInfo:r[0]||null}}catch(e){return{error:`Failed to read WASM memory: ${e instanceof Error?e.message:String(e)}`}}},{offset:t,length:n,searchPattern:i});if(T(a))return{content:[{type:`text`,text:JSON.stringify({success:!1,error:a.error})}]};let o=a.data,c=``,u=``;if(r===`hex`||r===`both`)for(let e=0;e<o.length;e+=16){let n=o.slice(e,e+16),r=(t+e).toString(16).padStart(8,`0`),i=n.map(e=>e.toString(16).padStart(2,`0`)).join(` `),a=n.map(e=>e>=32&&e<127?String.fromCharCode(e):`.`).join(``);c+=`${r} ${i.padEnd(48)} |${a}|\n`}return r===`ascii`&&(u=o.map(e=>e>=32&&e<127?String.fromCharCode(e):`.`).join(``)),{content:[{type:`text`,text:JSON.stringify({success:!0,totalMemoryPages:a.totalMemoryPages,totalMemoryBytes:a.totalMemoryBytes,offset:t,length:o.length,hexDump:r===`ascii`?void 0:c,asciiDump:r===`ascii`?u:void 0,searchResults:a.searchResults},null,2)}]}}};function P(e,t,n,r,i,a,o){return{capability:e,status:n?`available`:`unavailable`,reason:r,fix:n?void 0:i,details:{tools:a,...o?.path?{path:o.path}:{},...o?.version?{version:o.version}:{},backend:t}}}var F=class{state;constructor(e){this.state=e}async handleWasmCapabilities(){let e=await this.state.runner.probeAll(),t=await this.getCurrentPageCapability(),n=e[`runtime.wasmtime`]?.available===!0||e[`runtime.wasmer`]?.available===!0;return f.raw(p(`wasm_capabilities`,[t,P(`wabt_wasm2wat`,`wabt.wasm2wat`,e[`wabt.wasm2wat`]?.available===!0,e[`wabt.wasm2wat`]?.reason,`Install WABT so wasm2wat is available on PATH.`,[`wasm_disassemble`],e[`wabt.wasm2wat`]),P(`wabt_wasm_decompile`,`wabt.wasm-decompile`,e[`wabt.wasm-decompile`]?.available===!0,e[`wabt.wasm-decompile`]?.reason,`Install WABT so wasm-decompile is available on PATH.`,[`wasm_decompile`],e[`wabt.wasm-decompile`]),P(`wabt_wasm_objdump`,`wabt.wasm-objdump`,e[`wabt.wasm-objdump`]?.available===!0,e[`wabt.wasm-objdump`]?.reason,`Install WABT so wasm-objdump is available on PATH.`,[`wasm_inspect_sections`],e[`wabt.wasm-objdump`]),P(`binaryen_wasm_opt`,`binaryen.wasm-opt`,e[`binaryen.wasm-opt`]?.available===!0,e[`binaryen.wasm-opt`]?.reason,`Install Binaryen so wasm-opt is available on PATH.`,[`wasm_optimize`],e[`binaryen.wasm-opt`]),{capability:`wasm_offline_runtime`,status:n?`available`:`unavailable`,reason:n?void 0:`No offline WASM runtime is available on PATH.`,fix:n?void 0:`Install wasmtime or wasmer to enable wasm_offline_run.`,details:{tools:[`wasm_offline_run`],runtimes:{wasmtime:e[`runtime.wasmtime`],wasmer:e[`runtime.wasmer`]},preferredRuntime:e[`runtime.wasmtime`]?.available?`runtime.wasmtime`:e[`runtime.wasmer`]?.available?`runtime.wasmer`:null}}]))}async getCurrentPageCapability(){let e;try{e=await this.state.collector.getActivePage()}catch(e){return{capability:`wasm_browser_capture_current_page`,status:`unknown`,reason:`Current page probe failed: ${e instanceof Error?e.message:String(e)}`,fix:`Attach or launch a browser page before using browser-backed WASM tools.`,details:{tools:[`wasm_dump`,`wasm_vmp_trace`,`wasm_memory_inspect`],pageAttached:!1}}}if(!e)return{capability:`wasm_browser_capture_current_page`,status:`unknown`,reason:`No active page is attached.`,fix:`Attach or launch a browser page before using browser-backed WASM tools.`,details:{tools:[`wasm_dump`,`wasm_vmp_trace`,`wasm_memory_inspect`],pageAttached:!1}};try{let t=await e.evaluate(()=>{let e=window,t=e.__aiHooks?.[`preset-webassembly-full`],n=Array.isArray(t)?t:[];return{url:location.href,hookEventCount:n.length,instantiatedCount:n.filter(e=>e.type===`instantiated`).length,importCallCount:n.filter(e=>e.type===`import_call`).length,memoryEventCount:n.filter(e=>e.type===`memory_created`).length,storageCount:Array.isArray(e.__wasmModuleStorage)?e.__wasmModuleStorage.length:0,instanceCount:Array.isArray(e.__wasmInstances)?e.__wasmInstances.length:0}}),n=t.instantiatedCount>0||t.memoryEventCount>0||t.storageCount>0||t.instanceCount>0;return{capability:`wasm_browser_capture_current_page`,status:n?`available`:`unavailable`,reason:n?void 0:`No captured WASM modules or exported memory are visible on the current page.`,fix:n?void 0:`Load a page that instantiates WASM. For dump/trace flows, inject hook_preset("webassembly-full") before navigation.`,details:{tools:[`wasm_dump`,`wasm_vmp_trace`,`wasm_memory_inspect`],pageAttached:!0,...t}}}catch(e){return{capability:`wasm_browser_capture_current_page`,status:`unknown`,reason:`Current page probe failed: ${e instanceof Error?e.message:String(e)}`,fix:`Ensure an attached page is still reachable before using browser-backed WASM tools.`,details:{tools:[`wasm_dump`,`wasm_vmp_trace`,`wasm_memory_inspect`],pageAttached:!0}}}}},I=class{state;externalTools;browser;capabilities;constructor(e){let t=new a(new m);this.state={collector:e,runner:t},this.externalTools=new M(this.state),this.browser=new N(this.state),this.capabilities=new F(this.state)}handleWasmCapabilities(){return this.capabilities.handleWasmCapabilities()}handleWasmDump(e){return this.browser.handleWasmDump(e)}handleWasmDisassemble(e){return this.externalTools.handleWasmDisassemble(e)}handleWasmDecompile(e){return this.externalTools.handleWasmDecompile(e)}handleWasmInspectSections(e){return this.externalTools.handleWasmInspectSections(e)}handleWasmOfflineRun(e){return this.externalTools.handleWasmOfflineRun(e)}handleWasmOptimize(e){return this.externalTools.handleWasmOptimize(e)}handleWasmVmpTrace(e){return this.browser.handleWasmVmpTrace(e)}handleWasmMemoryInspect(e){return this.browser.handleWasmMemoryInspect(e)}handleWasmToC(e){return this.externalTools.handleWasmToC(e)}handleWasmDetectObfuscation(e){return this.externalTools.handleWasmDetectObfuscation(e)}handleWasmInstrumentTrace(e){return this.externalTools.handleWasmInstrumentTrace(e)}};export{I as WasmToolHandlers};
@@ -0,0 +1,46 @@
1
+ import{t as e}from"./logger-sBC6IdRT.mjs";import{Gn as t,Hn as n,Kn as r,Mt as i,Nt as a,Wn as o}from"./constants-BYj8Xek8.mjs";import{t as s}from"./ProcessRegistry-C-bN48oR.mjs";import{n as c}from"./concurrency-DCr8WQ2M.mjs";import l from"node:path";import{readdir as u,rm as d,stat as f}from"node:fs/promises";import*as p from"@babel/parser";import m from"@babel/traverse";import*as h from"@babel/types";import g from"@babel/generator";import{Worker as _}from"node:worker_threads";var v=class{async execute(e){return c(()=>this.executeInternal(e))}executeInternal(i){let a=i.timeoutMs??n,c=i.memoryLimitMB??o,l=Date.now();return new Promise(n=>{let o=!1,u=setTimeout(()=>{o||(f.terminate(),e.warn(`[ExecutionSandbox] Worker terminated after ${a+r}ms`),p({ok:!1,error:`Execution timed out (worker terminated)`,timedOut:!0}))},a+r),d={eval:!0,workerData:{code:i.code,timeoutMs:a},resourceLimits:{maxOldGenerationSizeMb:c,maxYoungGenerationSizeMb:Math.ceil(c/4),stackSizeMb:t}};d.type=`module`;let f=new _(`
2
+ import { workerData, parentPort } from 'node:worker_threads';
3
+ import * as vm from 'node:vm';
4
+
5
+ const { code, timeoutMs } = workerData;
6
+
7
+ try {
8
+ // Create an isolated context with minimal globals
9
+ const sandbox = {
10
+ // Safe built-ins only
11
+ parseInt, parseFloat, isNaN, isFinite,
12
+ encodeURIComponent, decodeURIComponent,
13
+ encodeURI, decodeURI,
14
+ JSON: { parse: JSON.parse, stringify: JSON.stringify },
15
+ Math,
16
+ String, Number, Boolean, Array, Object, Map, Set,
17
+ Date, RegExp, Error, TypeError, RangeError,
18
+ Promise,
19
+ Symbol,
20
+ undefined,
21
+ NaN,
22
+ Infinity,
23
+ // Explicitly denied: require, process, __filename, __dirname, Buffer, setTimeout, setInterval, fetch
24
+ };
25
+
26
+ const context = vm.createContext(sandbox, {
27
+ name: 'jshook-sandbox',
28
+ codeGeneration: { strings: false, wasm: false },
29
+ });
30
+
31
+ const script = new vm.Script(code, {
32
+ filename: 'sandbox-eval.js',
33
+ timeout: timeoutMs,
34
+ });
35
+
36
+ const result = script.runInContext(context, { timeout: timeoutMs });
37
+ parentPort.postMessage({ ok: true, output: result });
38
+ } catch (err) {
39
+ parentPort.postMessage({
40
+ ok: false,
41
+ error: err.message || String(err),
42
+ timedOut: err.code === 'ERR_SCRIPT_EXECUTION_TIMEOUT',
43
+ });
44
+ }
45
+ `,d);typeof f.unref==`function`&&f.unref(),s.register(f);let p=e=>{o||(o=!0,u&&clearTimeout(u),n({...e,durationMs:Date.now()-l}))};f.on(`message`,e=>{p({ok:e.ok,output:e.output,error:e.error,timedOut:e.timedOut||!1}),f.terminate()}),f.on(`error`,e=>{p({ok:!1,error:`Worker error: ${e.message}`,timedOut:!1})}),f.on(`exit`,e=>{o||p({ok:!1,error:`Worker exited unexpectedly with code ${e}`,timedOut:!1})})})}};async function y(e,t,n,r){let i=[],a=[];return n===`obfuscator.io`?b(e,t,r,i,a):n===`jsfuck`?x(e,t,i):n===`jjencode`?S(e,t,i):C(e,t,r,i,a)}async function b(t,n,r,i,a){let o=n,s=.5;try{let c=n.match(/var\s+(_0x[a-f0-9]+)\s*=\s*(\[.*?\]);/s);if(c){let n=c[1],r=c[2];e.info(` : ${n}`);try{let i=await t.sandbox.execute({code:`return ${r||`[]`};`,timeoutMs:3e3}),a=i.ok?i.output:void 0;if(Array.isArray(a)){e.info(`String array detected, ${a.length} strings found`);let t=RegExp(`${n}\\[(\\d+)\\]`,`g`);o=o.replace(t,(e,t)=>{let n=parseInt(t,10);return n<a.length?JSON.stringify(a[n]):e}),s+=.2}}catch(e){i.push(`: ${e}`),a.push({location:`String Array`,reason:``,suggestion:``})}}return o=o.replace(/\(function\s*\(_0x[a-f0-9]+,\s*_0x[a-f0-9]+\)\s*\{[\s\S]*?\}\(_0x[a-f0-9]+,\s*0x[a-f0-9]+\)\);?/g,``),r&&(o=o.replace(/\(function\s*\(\)\s*\{([\s\S]*)\}\(\)\);?/g,`$1`),s+=.1),o=o.replace(/0x([0-9a-f]+)/gi,(e,t)=>String(parseInt(t,16))),o=o.replace(/;\s*;/g,`;`),o=o.replace(/\{\s*\}/g,`{}`),i.push(`obfuscator.io detected, may need special handling`),{code:o,confidence:Math.min(s,1),warnings:i,unresolvedParts:a.length>0?a:void 0}}catch(e){return i.push(`obfuscator.io: ${e}`),{code:n,confidence:.2,warnings:i,unresolvedParts:a}}}async function x(t,n,r){try{e.info(`JSFuck detected, attempting deobfuscation...`);try{if(n.length>1e5)return r.push(`JSFuck code detected, file too large to process directly.`),r.push(`Consider using an online JSFuck decoder tool.`),{code:n,confidence:.1,warnings:r};let i=await t.sandbox.execute({code:`return ${n};`,timeoutMs:5e3}),a=i.ok?i.output:void 0;return typeof a==`string`?(e.info(` JSFuck`),{code:a,confidence:.9,warnings:[`JSFuck`]}):(r.push(`JSFuck`),{code:n,confidence:.2,warnings:r})}catch(e){return r.push(`JSFuck: ${e}`),r.push(`Consider using an online JSFuck decoder tool.`),{code:n,confidence:.1,warnings:r}}}catch(e){return r.push(`JSFuck: ${e}`),{code:n,confidence:.1,warnings:r}}}async function S(t,n,r){try{e.info(`JJEncode detected, attempting deobfuscation...`);try{let i=n.split(`
46
+ `).filter(e=>e.trim());if((i.length>0?i[i.length-1]:``)?.includes(`$$$$`)){let r=await t.sandbox.execute({code:`${n}; return $$$$()`,timeoutMs:5e3}),i=r.ok?r.output:void 0;if(typeof i==`string`)return e.info(` JJEncode`),{code:i,confidence:.9,warnings:[`JJEncode`]}}let a=await t.sandbox.execute({code:n,timeoutMs:5e3});return a.ok||e.warn(`JJEncode sandbox execution failed:`,a.error),r.push(`JJEncode deobfuscation may be incomplete`),r.push(`Result may still contain JJEncode fragments`),{code:n,confidence:.2,warnings:r}}catch(e){return r.push(`JJEncode: ${e}`),r.push(`Result may contain evaluation artifacts`),{code:n,confidence:.1,warnings:r}}}catch(e){return r.push(`JJEncode: ${e}`),{code:n,confidence:.1,warnings:r}}}async function C(e,t,n,r,i){return r.push(`AI-assisted deobfuscation removed, using fallback directly.`),w(t,n,r,i)}function w(e,t,n,r){let i=e,a=.3;try{return i=i.replace(/if\s*\([^)]*\)\s*\{\s*\}/g,``),i=i.replace(/!!\s*\(/g,`Boolean(`),i=i.replace(/""\s*\+\s*/g,``),t&&(i=i.replace(/debugger;?/g,``),a+=.1,i=i.replace(/\?\s*([^:]+)\s*:\s*\1/g,`$1`),a+=.05),n.push(`Analysis incomplete, partial results may be returned`),n.push(`For better results, configure an LLM API key`),r.push({location:`Custom VM`,reason:`VM`,suggestion:`VM protection detected, LLM-assisted analysis recommended`}),{code:i,confidence:a,warnings:n,unresolvedParts:r.length>0?r:void 0}}catch(t){return n.push(`: ${t}`),{code:e,confidence:.1,warnings:n,unresolvedParts:r}}}var T=class{sandbox=new v;async deobfuscate(t){let n=Date.now(),{code:r,aggressive:o=!1,extractInstructions:s=!1,timeout:c=i,maxIterations:l=a}=t;e.info(` JSVMP...`);try{let t=this.detectJSVMP(r);if(!t)return e.info(`JSVMP`),{isJSVMP:!1,deobfuscatedCode:r,confidence:0,warnings:[`JSVMP`]};e.info(`JSVMP analysis complete, complexity: ${t.complexity}`),e.info(` : ${t.instructionCount}`);let i=this.identifyVMType(r,t);e.info(` : ${i}`);let a;s&&(e.info(` ...`),a=this.extractInstructions(r,t),e.info(` ${a.length} `)),e.info(` ...`);let u=await this.restoreCode(r,t,i,o,c,l),d=Date.now()-n,f={isJSVMP:!0,vmType:i,vmFeatures:t,instructions:a,deobfuscatedCode:u.code,confidence:u.confidence,warnings:u.warnings,unresolvedParts:u.unresolvedParts,stats:{originalSize:r.length,deobfuscatedSize:u.code.length,reductionRate:1-u.code.length/r.length,processingTime:d}};return e.info(`JSVMP deobfuscation complete in ${d}ms`),e.info(` : ${(f.confidence*100).toFixed(1)}%`),f}catch(t){return e.error(`JSVMP`,t),{isJSVMP:!1,deobfuscatedCode:r,confidence:0,warnings:[`: ${t}`]}}}detectJSVMP(t){try{let n=p.parse(t,{sourceType:`unambiguous`,plugins:[`jsx`,`typescript`],errorRecovery:!0}),r=!1,i=!1,a=!1,o=0,s=``,c=0,l=!1,u=!1,d=!1,f=!1;if(m(n,{SwitchStatement(e){let t=e.node.cases.length;t>10&&(r=!0,t>c&&(c=t,o=t,s=`Line ${e.node.loc?.start.line||0}`))},ArrayExpression(e){e.node.elements.length>50&&(i=!0)},UpdateExpression(e){if(e.node.operator===`++`||e.node.operator===`--`){let t=e.node.argument;h.isIdentifier(t)&&t.name.length<=3&&(a=!0)}},CallExpression(e){if(h.isIdentifier(e.node.callee,{name:`parseInt`})&&e.node.arguments.length>=2){let t=e.node.arguments[0];h.isBinaryExpression(t)&&t.operator===`+`&&(f=!0,l=!0)}h.isMemberExpression(e.node.callee)&&h.isIdentifier(e.node.callee.property,{name:`apply`})&&(u=!0)},WhileStatement(e){(h.isBooleanLiteral(e.node.test,{value:!0})||h.isNumericLiteral(e.node.test,{value:1}))&&(d=!0)},ForStatement(e){e.node.test||(d=!0)}}),r&&(i||a)&&(u||d||f)){let t=o>100?`high`:o>50?`medium`:`low`;return e.info(` JSVMP:`),e.info(` - Switch: ${r} (${c} cases)`),e.info(` - : ${i}`),e.info(` - : ${a}`),e.info(` - : ${l}`),e.info(` - Apply: ${u}`),e.info(` - : ${d}`),e.info(` - : ${f}`),{instructionCount:o,interpreterLocation:s,complexity:t,hasSwitch:r,hasInstructionArray:i,hasProgramCounter:a}}return null}catch(n){return e.warn(`JSVMP analysis failed`,n),this.detectJSVMPWithRegex(t)}}detectJSVMPWithRegex(t){let n=(t.match(/switch\s*\(/g)?.length||0)>0,r=/parseInt\s*\(\s*["']?\s*\+\s*\w+\[/g.test(t),i=/\.apply\s*\(/g.test(t),a=/while\s*\(\s*(true|1)\s*\)/g.test(t);return n&&(r||i||a)?(e.info(` JSVMP`),{instructionCount:0,interpreterLocation:`Unknown`,complexity:`medium`,hasSwitch:!0,hasInstructionArray:r,hasProgramCounter:i}):null}identifyVMType(e,t){return e.includes(`_0x`)&&e.includes(`function(_0x`)?`obfuscator.io`:/^\s*\[\s*\]\s*\[\s*\(/.test(e)?`jsfuck`:e.includes(`$=~[];`)?`jjencode`:`custom`}extractInstructions(t,n){let r=[];try{m(p.parse(t,{sourceType:`unambiguous`,plugins:[`jsx`,`typescript`]}),{SwitchStatement:e=>{e.node.cases.length===n.instructionCount&&e.node.cases.forEach((e,t)=>{let n=e.test&&(h.isNumericLiteral(e.test)||h.isStringLiteral(e.test))?e.test.value:t,i=this.inferInstructionType(e);r.push({opcode:n,name:`INST_${n}`,type:i,description:`Instruction ${n}`})})}})}catch(t){e.warn(``,t)}return r}inferInstructionType(e){let t=g(e).code,n=e.consequent,r=!1,i=!1,a=!1,o=!1,s=!1;for(let e of n){if(h.isExpressionStatement(e)){let t=e.expression;h.isAssignmentExpression(t)&&(r=!0),h.isMemberExpression(t)&&h.isNumericLiteral(t.property)&&(i=!0),h.isCallExpression(t)&&(a=!0),h.isBinaryExpression(t)&&[`+`,`-`,`*`,`/`,`%`,`**`].includes(t.operator)&&(o=!0)}(h.isIfStatement(e)||h.isWhileStatement(e)||h.isBreakStatement(e)||h.isContinueStatement(e)||h.isReturnStatement(e))&&(s=!0)}return(t.includes(`push`)||t.includes(`.push(`))&&(i||t.includes(`[`))?`load`:r&&!o&&!a?`store`:o||t.match(/[+\-*/%]/)?`arithmetic`:s||t.includes(`break`)||t.includes(`continue`)?`control`:a||t.includes(`.apply(`)||t.includes(`.call(`)?`call`:`unknown`}async restoreCode(e,t,n,r,i,a){return this.restoreCustomVMBasic,y({sandbox:this.sandbox},e,n,r)}restoreCustomVMBasic(e,t,n,r){return w(e,t,n,r)}};const E={jsx:!0,mangle:!1,unminify:!0,unpack:!0};function D(e){return{jsx:e.jsx??E.jsx,mangle:e.mangle??E.mangle,unminify:e.unminify??E.unminify,unpack:e.unpack??E.unpack}}function O(){let[e=`0`,t=`0`]=process.versions.node.split(`.`),n=Number.parseInt(e,10),r=Number.parseInt(t,10);return!Number.isFinite(n)||!Number.isFinite(r)?!1:n===22?r>=12:n===24}function k(e,t){let n=t.target===`path`?e.path:e.code,r=t.matchType??`includes`;if(r===`exact`)return n===t.pattern;if(r===`regex`)try{return new RegExp(t.pattern,`m`).test(n)}catch{return!1}return n.includes(t.pattern)}function A(e,t){let n=new Map;if(!t||t.length===0)return n;for(let r of e.modules.values())for(let e of t)if(!(!e.path||!e.pattern)&&k(r,e)){r.path!==e.path&&(n.set(r.id,{fromPath:r.path}),r.path=e.path);break}return n}function j(e,t,n){let r=t.maxBundleModules??100,i=Array.from(e.modules.values()).toSorted((e,t)=>e.isEntry===t.isEntry?e.path.localeCompare(t.path):e.isEntry?-1:1).slice(0,r).map(e=>({id:e.id,path:e.path,isEntry:e.isEntry,size:e.code.length,code:t.includeModuleCode?e.code:void 0,mappedPathFrom:n.get(e.id)?.fromPath}));return{type:e.type,entryId:e.entryId,moduleCount:e.modules.size,truncated:e.modules.size>r,mappingsApplied:n.size,modules:i}}async function M(e,t=e){let n=await u(t,{withFileTypes:!0}),r=[];for(let i of n){let n=l.join(t,i.name);if(i.isDirectory()){r.push(...await M(e,n));continue}if(!i.isFile())continue;let a=await f(n);r.push({path:l.relative(e,n).replace(/\\/g,`/`),size:a.size,type:`file`})}return r.toSorted((e,t)=>e.path.localeCompare(t.path))}async function N(t,n){let r=D(n);if(!O()){let n=`webcrack requires Node.js 22.12+ or 24.x; current runtime is ${process.versions.node}`;return e.warn(n),{applied:!1,code:t,optionsUsed:r,reason:n}}try{let{webcrack:e}=await import(`webcrack`),i=await e(t,{jsx:r.jsx,unpack:r.unpack,deobfuscate:!0,unminify:r.unminify,mangle:r.mangle}),a=i.bundle?A(i.bundle,n.mappings):new Map,o,s;if(typeof n.outputDir==`string`&&n.outputDir.trim().length>0){o=l.resolve(n.outputDir);let e=process.cwd(),t=l.relative(e,o);if(l.isAbsolute(t)||t.startsWith(`..`)||o===`/`||o===l.parse(o).root)throw Error(`outputDir must resolve to a path within the project root. Got: ${o}`);n.forceOutput&&await d(o,{recursive:!0,force:!0}),await i.save(o),s=await M(o)}return{applied:!0,code:i.code,bundle:i.bundle?j(i.bundle,{includeModuleCode:n.includeModuleCode,maxBundleModules:n.maxBundleModules},a):void 0,savedTo:o,savedArtifacts:s,optionsUsed:r}}catch(n){let i=n instanceof Error?n.message:String(n);return e.warn(`webcrack execution failed, falling back to legacy pipeline`,n),{applied:!1,code:t,optionsUsed:r,reason:i}}}export{T as n,N as t};
@@ -0,0 +1,101 @@
1
+ import{t as e}from"./logger-sBC6IdRT.mjs";import{_i as t,bi as n,vi as r,xi as i,yi as a}from"./constants-BYj8Xek8.mjs";import{a as o,i as s,r as c,t as l}from"./parse-args-Bw413PlW.mjs";import{t as u}from"./ResponseBuilder-BfWP-uaT.mjs";import{a as d,s as f}from"./ssrf-policy-CsIJGkpd.mjs";import"./definitions-Ibci7e_L.mjs";import{BlockList as p,isIP as m}from"node:net";import{lookup as h}from"node:dns/promises";const g=[{name:`auth_extract`,description:`Extract auth tokens from localStorage and cookies`,code:`(function(){
2
+ var keys=['token','active_token','access_token','jwt','auth_token','userRole','id_token','refresh_token'];
3
+ var r={};
4
+ for(var i=0;i<keys.length;i++){var v=localStorage.getItem(keys[i]);if(v)r[keys[i]]=v;}
5
+ r._cookies=document.cookie;
6
+ return r;
7
+ })()`},{name:`bundle_search`,description:`Fetch a remote JS bundle and search it with regex patterns. params: { url: string, patterns: string[] }`,code:`(async function(){
8
+ var p=typeof __params__!=='undefined'?__params__:{};
9
+ if(!p.url)return{error:'params.url required'};
10
+ var resp=await fetch(p.url);
11
+ var text=await resp.text();
12
+ var patterns=p.patterns||[];
13
+ var results={};
14
+ for(var i=0;i<patterns.length;i++){
15
+ var re=new RegExp(patterns[i],'g');
16
+ var matches=[];var m;
17
+ while((m=re.exec(text))!==null){
18
+ var s=Math.max(0,m.index-80),e=Math.min(text.length,m.index+m[0].length+80);
19
+ matches.push({match:m[0],ctx:text.slice(s,e)});
20
+ if(matches.length>=10)break;
21
+ }
22
+ results[patterns[i]]=matches;
23
+ }
24
+ return{size:text.length,results:results};
25
+ })()`},{name:`react_fill_form`,description:`Fill React controlled form inputs using native setter trick. params: { fields: { "selector": "value" } }`,code:`(function(){
26
+ var p=typeof __params__!=='undefined'?__params__:{};
27
+ var fields=p.fields||{};
28
+ var ns=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,'value').set;
29
+ var r={};
30
+ var entries=Object.entries(fields);
31
+ for(var i=0;i<entries.length;i++){
32
+ var sel=entries[i][0],val=entries[i][1];
33
+ var el=document.querySelector(sel);
34
+ if(!el){r[sel]='not found';continue;}
35
+ ns.call(el,val);
36
+ el.dispatchEvent(new Event('input',{bubbles:true}));
37
+ el.dispatchEvent(new Event('change',{bubbles:true}));
38
+ r[sel]='filled';
39
+ }
40
+ return r;
41
+ })()`},{name:`dom_find_upgrade_buttons`,description:`Scan the current page for upgrade/subscription/tier-related UI elements`,code:`(function(){
42
+ var kw=['upgrade','plus','pro','premium','subscribe','plan','tier','vip','membership'];
43
+ var r=[];
44
+ document.querySelectorAll('button,a,[role=button],[class*=upgrade],[class*=premium],[class*=plus]').forEach(function(el){
45
+ var t=(el.textContent||'').toLowerCase().trim();
46
+ var c=(el.className||'').toLowerCase();
47
+ if(kw.some(function(k){return t.includes(k)||c.includes(k);})){
48
+ r.push({tag:el.tagName,text:t.slice(0,120),cls:c.slice(0,100),href:el.href||null,id:el.id||null});
49
+ }
50
+ });
51
+ return r;
52
+ })()`}];function _(e){let t={deps:e,scriptRegistry:new Map,bundleCache:new Map,bundleCacheBytes:0};return y(t.scriptRegistry),t}const v={BUNDLE_CACHE_TTL_MS:r,MAX_SCRIPTS:100,MAX_BUNDLE_CACHE:50,MAX_BUNDLE_CACHE_BYTES:t};function y(e){for(let t of g)e.set(t.name,{code:t.code,description:t.description,source:`core`,protectedFromEviction:!0})}function b(e){let t=Date.now();for(let[n,r]of e.bundleCache)t-r.cachedAt>=v.BUNDLE_CACHE_TTL_MS&&(e.bundleCacheBytes-=r.text.length,e.bundleCache.delete(n));for(;e.bundleCache.size>=v.MAX_BUNDLE_CACHE||e.bundleCacheBytes>v.MAX_BUNDLE_CACHE_BYTES;){let t=e.bundleCache.keys().next().value;if(t!==void 0){let n=e.bundleCache.get(t);n&&(e.bundleCacheBytes-=n.text.length),e.bundleCache.delete(t)}else break}}function x(e){return e.replace(/[<>/\u2028\u2029]/g,e=>{switch(e){case`<`:return`\\u003C`;case`>`:return`\\u003E`;case`/`:return`\\u002F`;case`\u2028`:return`\\u2028`;case`\u2029`:return`\\u2029`;default:return e}})}function S(e){return typeof e==`string`?e:void 0}function C(e){if(!(typeof e!=`object`||!e||Array.isArray(e)))return e}function w(e){return u.raw(e)}var T=class{state;constructor(e){this.state=e}async handlePageScriptRegister(e){let t=S(e.name),n=S(e.code),r=S(e.description)??``;if(!t||!n)return w({success:!1,error:`name and code are required`});let i=this.state.scriptRegistry.has(t);if(!i&&this.state.scriptRegistry.size>=v.MAX_SCRIPTS){for(let[e,t]of this.state.scriptRegistry)if(!t.protectedFromEviction){this.state.scriptRegistry.delete(e);break}}let a=this.state.scriptRegistry.get(t);return this.state.scriptRegistry.set(t,{code:n,description:r,source:a?.source??`user`,protectedFromEviction:a?.protectedFromEviction??!1}),w({success:!0,action:i?`updated`:`registered`,name:t,description:r,totalScripts:this.state.scriptRegistry.size,available:Array.from(this.state.scriptRegistry.keys())})}async handlePageScriptRun(t){let n=S(t.name),r=C(t.params),i=n?this.state.scriptRegistry.get(n):void 0;if(!i){let e=Array.from(this.state.scriptRegistry.keys());return w({success:!1,error:`Script "${n}" not found`,available:e})}let a;a=r===void 0?i.code:`(function(){const __params__=JSON.parse(${x(JSON.stringify(JSON.stringify(r)))});return(${i.code});})()`;try{return await this.state.deps.browserHandlers.handlePageEvaluate({code:a})}catch(t){return e.error(`[page_script_run] Script "${n}" failed:`,t),w({success:!1,script:n,error:t instanceof Error?t.message:String(t)})}}async handleListExtensionWorkflows(){let e=this.state.deps.serverContext;if(!e)return w({success:!1,error:`Extension workflow runtime is unavailable in this handler context`});let{ensureWorkflowsLoaded:t}=await import(`./ExtensionManager-BD724zkO.mjs`).then(e=>e.t);await t(e);let n=[...e.extensionWorkflowsById.values()].filter(e=>e.route?.kind!==`preset`);n.sort((e,t)=>e.id.localeCompare(t.id));let r=n.map(e=>({id:e.id,displayName:e.displayName,description:e.description,tags:e.tags,timeoutMs:e.timeoutMs,defaultMaxConcurrency:e.defaultMaxConcurrency,source:e.source,route:e.route?{kind:e.route.kind,priority:e.route.priority,requiredDomains:e.route.requiredDomains,triggerPatterns:e.route.triggerPatterns.map(e=>e.source),steps:e.route.steps}:void 0}));return w({success:!0,count:r.length,workflows:r})}async handleRunExtensionWorkflow(t){let n=this.state.deps.serverContext;if(!n)return w({success:!1,error:`Extension workflow runtime is unavailable in this handler context`});let r=S(t.workflowId)??S(t.id);if(!r)return w({success:!1,error:`workflowId is required`});let{ensureWorkflowsLoaded:i}=await import(`./ExtensionManager-BD724zkO.mjs`).then(e=>e.t);await i(n);let a=n.extensionWorkflowRuntimeById.get(r);if(!a){let e=[...n.extensionWorkflowsById.values()].filter(e=>e.route?.kind!==`preset`).map(e=>e.id);return e.sort((e,t)=>e.localeCompare(t)),w({success:!1,error:`Extension workflow "${r}" not found`,available:e})}if(a.route?.kind===`preset`)return w({success:!1,workflowId:r,error:`Extension workflow "${r}" is a routing preset and cannot be executed directly. Use route_tool or the suggested preset steps instead.`});let o=S(t.profile),l=C(t.config),u=s(t,`nodeInputOverrides`),d=c(t,`timeoutMs`);try{let{executeExtensionWorkflow:e}=await import(`./WorkflowEngine-D876meOO.mjs`).then(e=>e.t);return w({success:!0,...await e(n,a.workflow,{profile:o,config:l,nodeInputOverrides:u,timeoutMs:d})})}catch(t){return e.error(`[run_extension_workflow] Workflow "${r}" failed:`,t),w({success:!1,workflowId:r,error:t instanceof Error?t.message:String(t)})}}};function E(e){return e.trim().replace(/^\[|\]$/g,``).toLowerCase()}function D(e){if(e===void 0)return[];let t=typeof e==`string`?(()=>{try{return JSON.parse(e)}catch{return null}})():e;if(!Array.isArray(t))return null;let n=t.filter(e=>typeof e==`string`);return n.length===t.length?n.map(e=>e.trim()).filter(e=>e.length>0):null}function O(e){let t=e.trim(),n=t.includes(`://`)?t:`http://${t}`;try{let e=new URL(n);return e.port.length>0?{scope:`host`,value:e.host.toLowerCase()}:{scope:`hostname`,value:E(e.hostname)}}catch{return{scope:`hostname`,value:E(t)}}}function k(e,t){return e===void 0?{ok:!0,value:!1}:typeof e==`boolean`?{ok:!0,value:e}:{ok:!1,error:`${t} must be a boolean when provided`}}function A(e){let t=e.networkPolicy;if(t===void 0)return{policy:{allowPrivateNetwork:!1,allowInsecureHttp:!1,allowedHosts:[],allowedRedirectHosts:[],allowedCidrs:[],allowedCidrBlockList:new p}};let n=typeof t==`string`?(()=>{try{return JSON.parse(t)}catch{return null}})():t;if(!n||typeof n!=`object`||Array.isArray(n))return{error:`networkPolicy must be an object or valid JSON object string`};let r=n,i=k(r.allowPrivateNetwork,`networkPolicy.allowPrivateNetwork`);if(!i.ok)return{error:i.error};let a=k(r.allowInsecureHttp,`networkPolicy.allowInsecureHttp`);if(!a.ok)return{error:a.error};let o=D(r.allowedHosts);if(o===null)return{error:`networkPolicy.allowedHosts must be an array of strings`};let s=D(r.allowedRedirectHosts);if(s===null)return{error:`networkPolicy.allowedRedirectHosts must be an array of strings`};let c=D(r.allowedCidrs);if(c===null)return{error:`networkPolicy.allowedCidrs must be an array of strings`};let l=new p;for(let e of c){let[t,n]=e.split(`/`);if(!t||!n)return{error:`Invalid CIDR in networkPolicy.allowedCidrs: "${e}"`};let r=m(t);if(r===0)return{error:`Invalid CIDR base address in networkPolicy.allowedCidrs: "${e}"`};let i=Number(n),a=r===4?32:128;if(!Number.isInteger(i)||i<0||i>a)return{error:`Invalid CIDR prefix in networkPolicy.allowedCidrs: "${e}"`};l.addSubnet(t,i,r===4?`ipv4`:`ipv6`)}return{policy:{allowPrivateNetwork:i.value,allowInsecureHttp:a.value,allowedHosts:o.map(O),allowedRedirectHosts:s.map(O),allowedCidrs:c,allowedCidrBlockList:l}}}async function j(e,t,n){let r;try{r=new URL(e)}catch{throw Error(`Invalid ${n.label}: ${e}`)}if(r.protocol!==`http:`&&r.protocol!==`https:`)throw Error(`Unsupported protocol for ${n.label}: ${r.protocol} — only http/https allowed`);let i=E(r.hostname),a=r.host.toLowerCase(),o=m(i),s=o===0?await h(i).then(e=>e.address).catch(t=>{throw Error(`DNS resolution failed for "${e}"`,{cause:t})}):i,c=m(s),l=c!==0&&t.allowedCidrs.length>0&&t.allowedCidrBlockList.check(s,c===4?`ipv4`:`ipv6`),u=n.allowRedirectHosts&&t.allowedRedirectHosts.length>0?t.allowedRedirectHosts:t.allowedHosts,p=u.some(e=>e.scope===`host`?e.value===a:e.value===i),g=u.length>0||t.allowedCidrs.length>0,_=!g||p||l;if(f(i)||f(s)){if(!t.allowPrivateNetwork)throw Error(`Blocked: ${n.label} "${e}" resolves to a private/reserved address`);if(!g||!_)throw Error(`Blocked: ${n.label} "${e}" requires an explicit networkPolicy host or CIDR allow rule`)}else if(g&&!_)throw Error(`Blocked: ${n.label} "${e}" is not authorized by networkPolicy`);let v=d(i)||d(s);if(r.protocol===`http:`&&!v){if(!t.allowInsecureHttp)throw Error(`Blocked: insecure HTTP requires networkPolicy.allowInsecureHttp for "${e}"`);if(!g||!_)throw Error(`Blocked: insecure HTTP target "${e}" requires an explicit networkPolicy host or CIDR allow rule`)}let y={},b=r.toString();if(n.rewriteHttpHostToResolvedIp&&r.protocol===`http:`&&o===0){let e=r.host,t=new URL(r.toString());t.hostname=s.includes(`:`)?`[${s}]`:s,b=t.toString(),y.Host=e}return{parsedUrl:r,resolvedIp:s,fetchUrl:b,headers:y}}var M=class{state;constructor(e){this.state=e}async handleApiProbeBatch(t){let n=typeof t.baseUrl==`string`?t.baseUrl.trim():``;if(n.length===0)return u.fail(`baseUrl is required and must be a non-empty string`).json();let r=A(t);if(!r.policy)return u.fail(r.error).json();let i,a={};try{let e=await j(n,r.policy,{label:`baseUrl`,rewriteHttpHostToResolvedIp:!0});i=e.fetchUrl.replace(/\/$/,``),a=e.headers}catch(e){return u.fail(e).json()}let d=i,f=t.paths,p=Array.isArray(f)?f:typeof f==`string`?(()=>{try{return JSON.parse(f)}catch{return[]}})():[],m=(o(t,`method`)??`GET`).toUpperCase(),h=s(t,`headers`)??{},g=o(t,`bodyTemplate`)??null,_=Array.isArray(t.includeBodyStatuses)?t.includeBodyStatuses.filter(e=>typeof e==`number`):[200,201,204],v=Math.max(0,Math.min(c(t,`maxBodySnippetLength`,500),1e4)),y=l(t,`autoInjectAuth`,!0);if(!p||p.length===0)return u.fail(`paths array is required and must not be empty`).json();let b=`(async function() {
53
+ var baseUrl = ${JSON.stringify(d)};
54
+ var paths = ${JSON.stringify(p)};
55
+ var method = ${JSON.stringify(m)};
56
+ var extraHeaders = ${JSON.stringify(h)};
57
+ var includeBodyStatuses = ${JSON.stringify(_)};
58
+ var maxSnippetLen = ${JSON.stringify(v)};
59
+ var autoInjectAuth = ${JSON.stringify(y)};
60
+ var bodyTemplate = ${JSON.stringify(g)};
61
+ var authHeaders = ${JSON.stringify(a)};
62
+ var headers = Object.assign({'Content-Type':'application/json'}, extraHeaders, authHeaders);
63
+ if (autoInjectAuth) {
64
+ var token = localStorage.getItem('token') || localStorage.getItem('active_token') || localStorage.getItem('access_token');
65
+ if (token) headers['Authorization'] = 'Bearer ' + token;
66
+ }
67
+ var results = {};
68
+ async function probePath(path) {
69
+ try {
70
+ var opts = {method: method, headers: headers, redirect: 'error'};
71
+ if (bodyTemplate && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {
72
+ opts.body = bodyTemplate;
73
+ }
74
+ var resp = await fetch(baseUrl + path, opts);
75
+ var ct = resp.headers.get('content-type') || '';
76
+ var snippet = null;
77
+ if (includeBodyStatuses.indexOf(resp.status) !== -1) {
78
+ var text = await resp.text();
79
+ if (!ct.includes('text/html') && !ct.includes('application/xml')) {
80
+ snippet = text.length > maxSnippetLen ? text.slice(0, maxSnippetLen) + '...[truncated]' : text;
81
+ } else {
82
+ snippet = '[HTML/XML response suppressed]';
83
+ }
84
+ }
85
+ return [path, {status: resp.status, contentType: ct.split(';')[0].trim(), snippet: snippet}];
86
+ } catch(e) {
87
+ return [path, {status: -1, error: e instanceof Error ? e.message : String(e)}];
88
+ }
89
+ }
90
+ var nextIndex = 0;
91
+ var maxConcurrency = Math.min(paths.length, 6);
92
+ await Promise.all(Array.from({ length: maxConcurrency }, async function() {
93
+ while (nextIndex < paths.length) {
94
+ var currentIndex = nextIndex++;
95
+ var currentPath = paths[currentIndex];
96
+ var entry = await probePath(currentPath);
97
+ results[entry[0]] = entry[1];
98
+ }
99
+ }));
100
+ return {probed: paths.length, method: method, baseUrl: baseUrl, results: results};
101
+ })()`;try{let e=await this.state.deps.browserHandlers.handlePageEvaluate({code:b}),t=u.parse(e);return u.ok().merge(t).json()}catch(t){return e.error(`[api_probe_batch] Error:`,t),u.fail(t).json()}}},N=class{state;constructor(e){this.state=e}async handleJsBundleSearch(e){let t=o(e,`url`,``),r=e.patterns,s=Array.isArray(r)?r:typeof r==`string`?(()=>{try{return JSON.parse(r)}catch{return[]}})():[],d=l(e,`cacheBundle`,!0),f=l(e,`stripNoise`,!0),p=c(e,`maxMatches`,10),m=A(e);if(!t||!s||s.length===0)return u.fail(`url and patterns are required`).json();if(!m.policy)return u.fail(m.error).json();let h=m.policy,g=i,_=n,y=async(e,t)=>{let n=e;for(let e=0;e<_;e++){let r=await j(n,h,{label:e===0?`bundle URL`:`redirect target`,allowRedirectHosts:e>0,rewriteHttpHostToResolvedIp:!0}),i=await fetch(r.fetchUrl,{signal:t,redirect:`manual`,headers:r.headers});if(i.status>=300&&i.status<400){let e=i.headers.get(`location`);if(!e)throw Error(`Redirect ${i.status} without Location header`);n=new URL(e,n).toString();continue}return i}throw Error(`Too many redirects (>${_})`)},x,S=!1;try{if(d){let e=this.state.bundleCache.get(t);if(e&&Date.now()-e.cachedAt<v.BUNDLE_CACHE_TTL_MS)x=e.text,S=!0;else{let e=new AbortController,n=setTimeout(()=>e.abort(),a);try{let n=await y(t,e.signal);if(!n.ok)return u.fail(`Fetch failed: ${n.status} ${n.statusText}`).merge({url:t}).json();if(x=await n.text(),x.length>g)return u.fail(`Response too large: ${x.length} bytes exceeds ${g} limit`).merge({url:t}).json();b(this.state),this.state.bundleCache.set(t,{text:x,cachedAt:Date.now()}),this.state.bundleCacheBytes+=x.length}finally{clearTimeout(n)}}}else{let e=new AbortController,n=setTimeout(()=>e.abort(),3e4);try{let n=await y(t,e.signal);if(!n.ok)return u.fail(`Fetch failed: ${n.status} ${n.statusText}`).merge({url:t}).json();if(x=await n.text(),x.length>g)return u.fail(`Response too large: ${x.length} bytes exceeds ${g} limit`).merge({url:t}).json()}finally{clearTimeout(n)}}}catch(e){return u.fail(e).merge({url:t}).json()}let C={};for(let e of s){let t=e.contextBefore??80,n=e.contextAfter??80,r;try{r=new RegExp(e.regex,`g`)}catch(t){C[e.name]=[{match:``,index:-1,context:`Invalid regex: ${t instanceof Error?t.message:String(t)}`}];continue}let i=[],a;for(;(a=r.exec(x))!==null;){let e=Math.max(0,a.index-t),r=Math.min(x.length,a.index+a[0].length+n),o=x.slice(e,r);if(!(f&&(/[Mm]\d{1,6}(?:\.\d+)?[, ]\d{1,6}(?:\.\d+)?[CLHVSQTAZclhvsqtaz]/.test(o)||/data:[a-z+-]+\/[a-z+-]+;base64,/i.test(o)||o.replace(/[^A-Za-z0-9+/=]/g,``).length>o.length*.85&&o.length>200))&&(i.push({match:a[0],index:a.index,context:o}),i.length>=p))break}C[e.name]=i}return u.ok().merge({bundleUrl:t,bundleSize:x.length,cached:S,patternsSearched:s.length,results:C}).json()}},P=class{scripts;api;account;constructor(e){let t=_(e);this.scripts=new T(t),this.api=new M(t),this.account=new N(t)}handlePageScriptRegister(e){return this.scripts.handlePageScriptRegister(e)}handlePageScriptRun(e){return this.scripts.handlePageScriptRun(e)}handleListExtensionWorkflows(){return this.scripts.handleListExtensionWorkflows()}handleRunExtensionWorkflow(e){return this.scripts.handleRunExtensionWorkflow(e)}handleApiProbeBatch(e){return this.api.handleApiProbeBatch(e)}handleJsBundleSearch(e){return this.account.handleJsBundleSearch(e)}};export{P as WorkflowHandlers};