@jshookmcp/jshook 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. package/README.md +19 -4
  2. package/README.zh.md +19 -4
  3. package/dist/AntiCheatDetector-B-mz4DK_.mjs +1 -0
  4. package/dist/{BrowserSessionCoordinator-BJ-HOxo0.mjs → BrowserSessionCoordinator-Cdic8FsH.mjs} +1 -1
  5. package/dist/CodeAnalyzerDataFlow-a-NkwcaG.mjs +2 -0
  6. package/dist/CodeInjector-B099WO6x.mjs +1 -0
  7. package/dist/ConsoleMonitor-BZRqrBH-.mjs +306 -0
  8. package/dist/CpuEngine-BC8jayy9.mjs +1 -0
  9. package/dist/DartAotExecutor-B7WVTKsd.mjs +1 -0
  10. package/dist/DartAotLoader-BxdhW-K2.mjs +2 -0
  11. package/dist/DarwinAPI-DzojdfjF.mjs +1 -0
  12. package/dist/DetailedDataManager-Dgh402Gp.mjs +5 -0
  13. package/dist/ExecutionSandbox-QbWQmzuC.mjs +45 -0
  14. package/dist/ExtensionManager.tools-D3h818Xs.mjs +1 -0
  15. package/dist/FingerprintManager-D9Zlr6be.mjs +1 -0
  16. package/dist/HardwareBreakpoint-C_lJ22bj.mjs +1 -0
  17. package/dist/HeapAnalyzer-bJbLvzp6.mjs +1 -0
  18. package/dist/HookPatternScanner-yx4vJ9sd.mjs +1 -0
  19. package/dist/InstrumentationSession-Cv1wikLA.mjs +1 -0
  20. package/dist/IntegrityScanner-BB7sw-SA.mjs +1 -0
  21. package/dist/JScramblerDeobfuscator-NVR5VatT.mjs +1 -0
  22. package/dist/MCPServer.activation.ttl-C2wOCMLV.mjs +1 -0
  23. package/dist/MCPServer.search.helpers-DlassAew.mjs +2 -0
  24. package/dist/MCPServer.search.validation-DnifPCCv.mjs +1 -0
  25. package/dist/MemoryController-CCsGuGJS.mjs +2 -0
  26. package/dist/{MemoryScanSession-DG_F-PjE.mjs → MemoryScanSession-BZ2A9Ph1.mjs} +1 -1
  27. package/dist/MemoryScanner-DAxsq7Sx.mjs +1 -0
  28. package/dist/NativeMemoryManager.impl-BIJzXMqH.mjs +1 -0
  29. package/dist/{NativeMemoryManager.utils-BHy1P_jM.mjs → NativeMemoryManager.utils-CMoul2an.mjs} +1 -1
  30. package/dist/PEAnalyzer-CB_kaTis.mjs +1 -0
  31. package/dist/PackerDeobfuscator-BpwGjxDL.mjs +7 -0
  32. package/dist/PointerChainEngine-B6SYv6ZM.mjs +1 -0
  33. package/dist/ProcessRegistry-C5W1Tkn9.mjs +1 -0
  34. package/dist/{handlers-mPFiNPe8.mjs → QuickJSSandbox-CIde-jzG.mjs} +2 -5
  35. package/dist/{ResponseBuilder-BfWP-uaT.mjs → ResponseBuilder-BLicSCjn.mjs} +1 -1
  36. package/dist/ReverseEvidenceGraph-DJzk0GQz.mjs +2 -0
  37. package/dist/ServerRuntimeState-DGXNv8Ji.mjs +1 -0
  38. package/dist/Speedhack-MGoeq1ZS.mjs +1 -0
  39. package/dist/StructureAnalyzer-CCTWAXR3.mjs +2 -0
  40. package/dist/ToolHandlerMap-C40EmuLT.mjs +1 -0
  41. package/dist/{ToolProbe-C7ZU2x7M.mjs → ToolProbe-B02GC3ZY.mjs} +1 -1
  42. package/dist/ToolRegistry-CzqQxFqf.mjs +1 -0
  43. package/dist/ToolRouter.policy-Bgb3S8jc.mjs +4 -0
  44. package/dist/TraceRecorder-BfeCTQUj.mjs +407 -0
  45. package/dist/VMDeobfuscator-BHtkV850.mjs +1 -0
  46. package/dist/Win32API-G7QPyckq.mjs +1 -0
  47. package/dist/{Win32Debug-CYrIQBvr.mjs → Win32Debug-6yzmtv5b.mjs} +1 -1
  48. package/dist/allocation-track-CiI-CnaI.mjs +1 -0
  49. package/dist/analysis-CojUzwX-.mjs +27 -0
  50. package/dist/antidebug-CgU84TE1.mjs +1 -0
  51. package/dist/apk-DrPBsOq8.mjs +1 -0
  52. package/dist/artifactRetention-Bk6fW2uF.mjs +1 -0
  53. package/dist/artifacts-Bx9GLx4J.mjs +1 -0
  54. package/dist/ast-bridge-BlOrmVAv.mjs +1 -0
  55. package/dist/ast-utils-B9E5k_v1.mjs +1 -0
  56. package/dist/{betterSqlite3-Brtq-SIQ.mjs → betterSqlite3-Bdo_ifuJ.mjs} +1 -1
  57. package/dist/binary-instrument-DiE1BP0x.mjs +12 -0
  58. package/dist/boringssl-inspector-C6M3sOga.mjs +2 -0
  59. package/dist/browser-QDUu5ML9.mjs +29 -0
  60. package/dist/{handlers-yo_xYzT8.mjs → canvas-g5kmLdY-.mjs} +1098 -24
  61. package/dist/{capabilities-CyXuKUl1.mjs → capabilities-DwzyxL2w.mjs} +1 -1
  62. package/dist/cdp-session-Dy4OwMOP.mjs +1 -0
  63. package/dist/collector-Cld4i-E4.mjs +1 -0
  64. package/dist/config-5ODJ3Aj0.mjs +3 -0
  65. package/dist/constants-nvsLpSri.mjs +1 -0
  66. package/dist/coordination-C6y2gM9O.mjs +98 -0
  67. package/dist/coverage-and-block--cWjjEe5.mjs +1 -0
  68. package/dist/dart-inspector-D4IKxZ6u.mjs +0 -0
  69. package/dist/debugger-C2SpiXoO.mjs +1 -0
  70. package/dist/definitions-0mtilYzG.mjs +1 -0
  71. package/dist/definitions-9csunmeX.mjs +1 -0
  72. package/dist/definitions-B11MudW_.mjs +1 -0
  73. package/dist/definitions-BKpRDjcI.mjs +1 -0
  74. package/dist/definitions-BXE3H4re.mjs +1 -0
  75. package/dist/definitions-BlPHe5DX.mjs +1 -0
  76. package/dist/definitions-Bob4XMxI.mjs +27 -0
  77. package/dist/definitions-BpIQN2nm.mjs +1 -0
  78. package/dist/definitions-BvolWeSu.mjs +1 -0
  79. package/dist/definitions-C-6j3Ejl.mjs +1 -0
  80. package/dist/definitions-C-AdFfFu.mjs +1 -0
  81. package/dist/definitions-CArdw_9T.mjs +1 -0
  82. package/dist/definitions-CCvIcRrT.mjs +1 -0
  83. package/dist/definitions-CJPE5PIl.mjs +1 -0
  84. package/dist/definitions-CbqeW06u.mjs +1 -0
  85. package/dist/definitions-Cexmkypg.mjs +1 -0
  86. package/dist/definitions-D1dxl8qt.mjs +1 -0
  87. package/dist/definitions-D3uT-ZbU.mjs +1 -0
  88. package/dist/definitions-DtOY5iUc.mjs +1 -0
  89. package/dist/{definitions-DxFNRQNK2.mjs → definitions-DvrYdDCJ2.mjs} +1 -1
  90. package/dist/{definitions-Cenu6mxo.mjs → definitions-aeRd5DAR.mjs} +1 -1
  91. package/dist/definitions-ihxOqOC4.mjs +1 -0
  92. package/dist/deopt-trace-qnAcC931.mjs +17 -0
  93. package/dist/disasm-DoxSucGp.mjs +1 -0
  94. package/dist/dumpsys-parser-Du-5ruEe.mjs +2 -0
  95. package/dist/encoding-UMtwgy4M.mjs +2 -0
  96. package/dist/ensure-browser-core-BP70x0TB.mjs +285 -0
  97. package/dist/factory-BeND77hf.mjs +2 -0
  98. package/dist/graphql-CF7QKJME.mjs +68 -0
  99. package/dist/grpc-raw-Dp7ps2sv.mjs +1 -0
  100. package/dist/handlers--qCl9vNv.mjs +1 -0
  101. package/dist/handlers-BHIu1LqA.mjs +1 -0
  102. package/dist/{antidebug-7L3ygj_9.mjs → handlers-BQ4K8Jbr.mjs} +2 -2
  103. package/dist/handlers-BxQv-wtf.mjs +8 -0
  104. package/dist/handlers-ByYG27-5.mjs +1 -0
  105. package/dist/handlers-C0I9-BtX.mjs +5 -0
  106. package/dist/handlers-CL0Iokmw.mjs +1 -0
  107. package/dist/handlers-CNbhIdSK.mjs +4 -0
  108. package/dist/handlers-CnTTSJFs.mjs +109 -0
  109. package/dist/handlers-CoDx6akJ2.mjs +49 -0
  110. package/dist/{handlers-0yKLRIfo.mjs → handlers-DASJI0Pn.mjs} +1 -1
  111. package/dist/handlers-DRKMaA-_.mjs +74 -0
  112. package/dist/handlers-Dalu0olz.mjs +2 -0
  113. package/dist/handlers-KY0g31ny.mjs +9 -0
  114. package/dist/handlers-oGo60aVv.mjs +1 -0
  115. package/dist/handlers.impl-BTXLw6Qc.mjs +1 -0
  116. package/dist/heap-sampling-BqdiU-5j.mjs +1 -0
  117. package/dist/{hooks-D4XLfgtV.mjs → hooks-COK3t5rT.mjs} +52 -33
  118. package/dist/index.mjs +11 -11
  119. package/dist/logger-BGCcd-jJ.mjs +1 -0
  120. package/dist/macro-nUYUjKNZ.mjs +2 -0
  121. package/dist/maintenance-CfnE7ZKU.mjs +4 -0
  122. package/dist/manifest-7EOTUc0D.mjs +1 -0
  123. package/dist/manifest-B5ujuQmf.mjs +1 -0
  124. package/dist/manifest-BErXl3zn.mjs +1 -0
  125. package/dist/manifest-BKA-mD3J.mjs +1 -0
  126. package/dist/manifest-BUXj23bX.mjs +1 -0
  127. package/dist/manifest-BfXt9cau.mjs +1 -0
  128. package/dist/manifest-Bx-tpURK.mjs +1 -0
  129. package/dist/manifest-C0owVAdq.mjs +1 -0
  130. package/dist/manifest-C5XqYc9o.mjs +1 -0
  131. package/dist/manifest-CVKzLjsA.mjs +1 -0
  132. package/dist/manifest-CaeFjdhj.mjs +1 -0
  133. package/dist/manifest-CegBgip0.mjs +1 -0
  134. package/dist/manifest-CoJHqlgS.mjs +1 -0
  135. package/dist/manifest-D0dbtDqd.mjs +1 -0
  136. package/dist/manifest-D5Gr8ujd.mjs +12 -0
  137. package/dist/manifest-D82z-5og.mjs +1 -0
  138. package/dist/manifest-DA2afIwh.mjs +1 -0
  139. package/dist/manifest-DAbiFP5o.mjs +1 -0
  140. package/dist/manifest-DEY0s1O72.mjs +1 -0
  141. package/dist/manifest-DTOqNqiA.mjs +1 -0
  142. package/dist/manifest-DZ6ELNgX.mjs +1 -0
  143. package/dist/manifest-DjHkjddT.mjs +1 -0
  144. package/dist/manifest-DocA_itf2.mjs +1 -0
  145. package/dist/manifest-Dpnhvfq0.mjs +1 -0
  146. package/dist/manifest-DucPMG_a.mjs +1 -0
  147. package/dist/manifest-Dw5yYEac.mjs +1 -0
  148. package/dist/manifest-Ic_Cg66S.mjs +1 -0
  149. package/dist/manifest-JHaG6GMN.mjs +1 -0
  150. package/dist/manifest-QdkIzmYM.mjs +1 -0
  151. package/dist/manifest-YZqaCe25.mjs +1 -0
  152. package/dist/manifest-f0lUeXwq.mjs +1 -0
  153. package/dist/manifest-h-Ebisf8.mjs +1 -0
  154. package/dist/manifest-oOfTymBS.mjs +1 -0
  155. package/dist/manifest-qXqrO6KC.mjs +2 -0
  156. package/dist/mapsParser-DrJoeC0c.mjs +1 -0
  157. package/dist/modules-CC_ADmwi.mjs +333 -0
  158. package/dist/mojo-ipc-kVztXYw-.mjs +140 -0
  159. package/dist/native-D9ouskXO.mjs +961 -0
  160. package/dist/native-bridge-Dzd7hYoq.mjs +1 -0
  161. package/dist/network-C5Y-S87J.mjs +7 -0
  162. package/dist/one-gadget-CiWFE17F.mjs +1 -0
  163. package/dist/outputPaths-CHtELDyi.mjs +1 -0
  164. package/dist/parse-args-B6dwWc9k.mjs +1 -0
  165. package/dist/platform-BIXgJaM3.mjs +94 -0
  166. package/dist/process-aDIfLC0v.mjs +6 -0
  167. package/dist/proxy-DsHsQ1I4.mjs +2 -0
  168. package/dist/registry-7h8jJ9y9.mjs +1 -0
  169. package/dist/{registry-DH4sc1dt.mjs → registry-DJDnkQW2.mjs} +1 -1
  170. package/dist/response-R8ghbZSb.mjs +1 -0
  171. package/dist/retry-policy-DtYv0kDi.mjs +1 -0
  172. package/dist/reverseEngineeringConfig-BhZLOa3C.mjs +1 -0
  173. package/dist/safeOutput-Dt4mfjXA.mjs +1 -0
  174. package/dist/search-defaults-BBRJNAzC.mjs +1 -0
  175. package/dist/server/plugin-api.mjs +1 -1
  176. package/dist/server/search/EmbeddingWorker.d.mts +1 -0
  177. package/dist/server/search/EmbeddingWorker.mjs +1 -0
  178. package/dist/shared-BKtWZDGN.mjs +1 -0
  179. package/dist/sourcemap-2VIeVeKw.mjs +3 -0
  180. package/dist/streaming-DkpE3GGU.mjs +15 -0
  181. package/dist/syscall-DGZoYM_U.mjs +1 -0
  182. package/dist/transform-BJqsBC_-.mjs +105 -0
  183. package/dist/turbofan-graph-CbGHNVtl.mjs +1 -0
  184. package/dist/turbofan-inspect--NdCuYXi.mjs +23 -0
  185. package/dist/types-CWSvzmIh.mjs +1 -0
  186. package/dist/v8-inspector-CTJo08-K.mjs +297 -0
  187. package/dist/wasm-DX4Qm2Vs.mjs +235 -0
  188. package/dist/weakrefs-inspect-CnhaF-rN.mjs +57 -0
  189. package/dist/webgpu-D4-DxbxZ.mjs +6 -0
  190. package/dist/workflow-DHktRNF2.mjs +108 -0
  191. package/package.json +33 -27
  192. package/dist/AntiCheatDetector-B6d4Qe9D.mjs +0 -1
  193. package/dist/CodeInjector-Cll_7bLJ.mjs +0 -1
  194. package/dist/ConsoleMonitor-CxDJV15E.mjs +0 -306
  195. package/dist/DOMInspector-C19J4zeq.mjs +0 -95
  196. package/dist/DarwinAPI-ZfQdpLNI.mjs +0 -1
  197. package/dist/DetailedDataManager-DmQ1LT-W.mjs +0 -1
  198. package/dist/ExtensionManager-BD724zkO.mjs +0 -1
  199. package/dist/ExtensionManager.tools-oVMJgPcN.mjs +0 -1
  200. package/dist/FingerprintManager-DT0EAUEo.mjs +0 -1
  201. package/dist/HardwareBreakpoint-BUfPdp0f.mjs +0 -1
  202. package/dist/HeapAnalyzer-B_aqY8oj.mjs +0 -1
  203. package/dist/InstrumentationSession-D_G1ZPyd.mjs +0 -1
  204. package/dist/MCPServer.search.handlers.domain-BbS-6LnX.mjs +0 -1
  205. package/dist/MemoryController-X1XNSn1n.mjs +0 -2
  206. package/dist/MemoryScanner-g1_L1ub5.mjs +0 -1
  207. package/dist/NativeMemoryManager.impl-DniBe2wf.mjs +0 -1
  208. package/dist/NetworkMonitor-B_-au6aV.mjs +0 -185
  209. package/dist/PEAnalyzer-yWQaGrcx.mjs +0 -1
  210. package/dist/PageController-Dfsm1_o7.mjs +0 -1
  211. package/dist/PointerChainEngine-BhCUkmxY.mjs +0 -1
  212. package/dist/PrerequisiteError-BjCQA-gK.mjs +0 -1
  213. package/dist/ProcessRegistry-C-bN48oR.mjs +0 -1
  214. package/dist/ReverseEvidenceGraph-BhSYYdiI.mjs +0 -2
  215. package/dist/ScriptManager-LWGPTdvD.mjs +0 -7
  216. package/dist/ServerRuntimeState-D2bWHqEE.mjs +0 -1
  217. package/dist/Speedhack-yseDPSZ9.mjs +0 -1
  218. package/dist/StructureAnalyzer-C5lpuZkg.mjs +0 -2
  219. package/dist/ToolCatalog-CYdD9F5f.mjs +0 -1
  220. package/dist/ToolRegistry-C5oB8KP8.mjs +0 -1
  221. package/dist/ToolRouter.policy-CfhJczkt.mjs +0 -4
  222. package/dist/TraceRecorder-BiJWBXHX.mjs +0 -272
  223. package/dist/VersionDetector-CHT36Az0.mjs +0 -9
  224. package/dist/Win32API-eUCF57l_.mjs +0 -1
  225. package/dist/WorkflowEngine-D876meOO.mjs +0 -1
  226. package/dist/analysis-D4swdMvq.mjs +0 -6
  227. package/dist/apk-packer-BqXcInnX.mjs +0 -1
  228. package/dist/artifactRetention-BCPQASm7.mjs +0 -1
  229. package/dist/artifacts-CkodUM4j.mjs +0 -1
  230. package/dist/binary-instrument-DU7V6TUM.mjs +0 -7
  231. package/dist/binary-secrets-PdMVoyt0.mjs +0 -1
  232. package/dist/boringssl-inspector-BBaJwwkU.mjs +0 -2
  233. package/dist/browser-Qqco2rOT.mjs +0 -11
  234. package/dist/collector-Bpl6qy2L.mjs +0 -1
  235. package/dist/constants-BYj8Xek8.mjs +0 -1
  236. package/dist/coordination-CWXW1o8K.mjs +0 -1
  237. package/dist/dart-inspector-7AkPeZ_Q.mjs +0 -0
  238. package/dist/debugger-DyALjYMk.mjs +0 -1
  239. package/dist/definitions-BWxBke3r.mjs +0 -1
  240. package/dist/definitions-BYwATKc-.mjs +0 -1
  241. package/dist/definitions-B_83XfNQ.mjs +0 -1
  242. package/dist/definitions-Bf3H1EwV.mjs +0 -1
  243. package/dist/definitions-BftdXgXI.mjs +0 -1
  244. package/dist/definitions-Bio5XJYy.mjs +0 -1
  245. package/dist/definitions-C3qNgSn1.mjs +0 -1
  246. package/dist/definitions-CB6vmOer.mjs +0 -1
  247. package/dist/definitions-CMZRSy3k.mjs +0 -1
  248. package/dist/definitions-CQd7yCQH.mjs +0 -1
  249. package/dist/definitions-CT8ln6GQ.mjs +0 -1
  250. package/dist/definitions-D4g-MS10.mjs +0 -1
  251. package/dist/definitions-D5wl_8HN.mjs +0 -1
  252. package/dist/definitions-DAQm1Xar.mjs +0 -1
  253. package/dist/definitions-DP1vgxEY.mjs +0 -1
  254. package/dist/definitions-Ibci7e_L.mjs +0 -1
  255. package/dist/definitions-OeLvmlQy.mjs +0 -1
  256. package/dist/definitions-RZYGD_Ey.mjs +0 -1
  257. package/dist/definitions-Tls8c0A0.mjs +0 -1
  258. package/dist/definitions-bybDvnG0.mjs +0 -26
  259. package/dist/definitions-l7TjdE6V.mjs +0 -1
  260. package/dist/encoding-ycOaz8Vr.mjs +0 -2
  261. package/dist/ensure-browser-core-DxWC-NTp.mjs +0 -1
  262. package/dist/factory-CKr4fAE1.mjs +0 -1
  263. package/dist/flat-target-session-DvcQX7J5.mjs +0 -1
  264. package/dist/graphql-B2TiPEow.mjs +0 -62
  265. package/dist/handlers-8zN_vBIz.mjs +0 -1
  266. package/dist/handlers-B62K4FTc.mjs +0 -1
  267. package/dist/handlers-BpDlVVVU.mjs +0 -1
  268. package/dist/handlers-CMJK7m1c.mjs +0 -31
  269. package/dist/handlers-D2ZOul9p.mjs +0 -54
  270. package/dist/handlers-D5E40ssn.mjs +0 -5
  271. package/dist/handlers-DGbdQAgD.mjs +0 -4
  272. package/dist/handlers-DHO3rjsW.mjs +0 -1
  273. package/dist/handlers-FJ80VzUI.mjs +0 -2
  274. package/dist/handlers-VHWrxbM_.mjs +0 -1
  275. package/dist/handlers-l8QIKqBj.mjs +0 -2
  276. package/dist/handlers.impl-D9Hh8Bgl.mjs +0 -1
  277. package/dist/jadx-search-B_Yse0Zh.mjs +0 -5
  278. package/dist/logger-sBC6IdRT.mjs +0 -1
  279. package/dist/maintenance-BUpIukhg.mjs +0 -1
  280. package/dist/manifest-0Jpt_AQa.mjs +0 -1
  281. package/dist/manifest-B3fZbSWR.mjs +0 -1
  282. package/dist/manifest-B7NB2rh2.mjs +0 -1
  283. package/dist/manifest-BDi4nbH1.mjs +0 -1
  284. package/dist/manifest-BLDfkE7n.mjs +0 -1
  285. package/dist/manifest-BcXbB4gf.mjs +0 -1
  286. package/dist/manifest-Bdnc_vrc.mjs +0 -1
  287. package/dist/manifest-BuYKgCnp.mjs +0 -1
  288. package/dist/manifest-CBfNnGPV.mjs +0 -1
  289. package/dist/manifest-CPS1Xv69.mjs +0 -1
  290. package/dist/manifest-CQH9FhwI.mjs +0 -1
  291. package/dist/manifest-CRryuZF4.mjs +0 -1
  292. package/dist/manifest-CctIumog.mjs +0 -1
  293. package/dist/manifest-CvTe5ZGV2.mjs +0 -1
  294. package/dist/manifest-D-5GH0DV.mjs +0 -1
  295. package/dist/manifest-D3Ssf3IC.mjs +0 -1
  296. package/dist/manifest-D5ck3NvC.mjs +0 -1
  297. package/dist/manifest-D9jUUJAu.mjs +0 -1
  298. package/dist/manifest-DCx6w2XV.mjs +0 -1
  299. package/dist/manifest-DG19q-Ld.mjs +0 -1
  300. package/dist/manifest-DLMlD0Zc.mjs +0 -1
  301. package/dist/manifest-DYpn8w_h.mjs +0 -1
  302. package/dist/manifest-DYzWI8Xs.mjs +0 -1
  303. package/dist/manifest-D_obs5F4.mjs +0 -1
  304. package/dist/manifest-DujQqEQR.mjs +0 -2
  305. package/dist/manifest-DwL2ik8P.mjs +0 -1
  306. package/dist/manifest-ItF5P8A12.mjs +0 -1
  307. package/dist/manifest-KZphqIyX.mjs +0 -1
  308. package/dist/manifest-LG42zPLY2.mjs +0 -1
  309. package/dist/manifest-LLdI5m4T.mjs +0 -1
  310. package/dist/manifest-QYbQXJn0.mjs +0 -1
  311. package/dist/manifest-RcpX_MyZ.mjs +0 -123
  312. package/dist/manifest-YgVd8Sgz.mjs +0 -1
  313. package/dist/manifest-Zy7Odg5J.mjs +0 -1
  314. package/dist/manifest-ff1H7Pdp.mjs +0 -1
  315. package/dist/manifest-iuhF6pTL2.mjs +0 -1
  316. package/dist/manifest-nXHmtMSp2.mjs +0 -1
  317. package/dist/manifest-xWfu6iLo.mjs +0 -1
  318. package/dist/manifest-yC16OhL2.mjs +0 -1
  319. package/dist/manifest-ztWJoXy4.mjs +0 -1
  320. package/dist/matchesWildcardPattern-BAG6LvX5.mjs +0 -1
  321. package/dist/modules-BPBcSaM-.mjs +0 -333
  322. package/dist/mojo-ipc-BhwsdVUW.mjs +0 -9
  323. package/dist/native-j8l473zn.mjs +0 -961
  324. package/dist/network-T0VRwNPd.mjs +0 -7
  325. package/dist/outputPaths-B4Ic4RZh.mjs +0 -2
  326. package/dist/parse-args-Bw413PlW.mjs +0 -1
  327. package/dist/platform-CzaQtISh.mjs +0 -93
  328. package/dist/playwright-cdp-fallback-DqFdx9-s.mjs +0 -1
  329. package/dist/process-CWhsCWrf.mjs +0 -2
  330. package/dist/proxy-DZFlDsG3.mjs +0 -2
  331. package/dist/renderer-pid-9tJnZ_9N.mjs +0 -1
  332. package/dist/response-C7rKQst4.mjs +0 -1
  333. package/dist/search-defaults-lYBVn_3L.mjs +0 -1
  334. package/dist/shared-state-board-BSjXLUV1.mjs +0 -1
  335. package/dist/sourcemap-Dh3Ai_ur.mjs +0 -1
  336. package/dist/streaming-BcJ0B6ao.mjs +0 -1
  337. package/dist/transform-DOxzeWPB.mjs +0 -103
  338. package/dist/types-D9EiE5o9.mjs +0 -1
  339. package/dist/wasm-CZ_HTfKR.mjs +0 -174
  340. package/dist/webcrack-C1iYG_EX.mjs +0 -46
  341. package/dist/workflow-BdwQmARn.mjs +0 -101
  342. /package/dist/{CacheAdapters-CsNtQIR8.mjs → CacheAdapters-BlDrQg8f.mjs} +0 -0
  343. /package/dist/{EventBus-DL8iLA09.mjs → EventBus-Cm-t-B65.mjs} +0 -0
  344. /package/dist/{EvidenceGraphBridge-BtbwXsLC.mjs → EvidenceGraphBridge-DBDc0wUA.mjs} +0 -0
  345. /package/dist/{HookGeneratorBuilders.core.generators.storage-DzD6dIJd.mjs → HookGeneratorBuilders.core.generators.storage-CWaWpOHa.mjs} +0 -0
  346. /package/dist/{RingBuffer-Dm54ELKT.mjs → RingBuffer-B6RTHmij.mjs} +0 -0
  347. /package/dist/{StealthVerifier-BmcxfwSF.mjs → StealthVerifier-DMBrtkhN.mjs} +0 -0
  348. /package/dist/{ToolError-DWU_z7gp.mjs → ToolError-g3rjWzhx.mjs} +0 -0
  349. /package/dist/{authorization-schema-BOFwSXUN.mjs → authorization-schema-Jtikc5Yt.mjs} +0 -0
  350. /package/dist/{bind-helpers-m2U8glkF.mjs → bind-helpers-D0mGAOof.mjs} +0 -0
  351. /package/dist/{concurrency-DCr8WQ2M.mjs → concurrency-Dehnw4JC.mjs} +0 -0
  352. /package/dist/{evidence-graph-bridge-CV_UdYqj.mjs → evidence-graph-bridge-eT9icP6a.mjs} +0 -0
  353. /package/dist/{formatAddress-vLA_hOJt.mjs → formatAddress-DAcw4Ckg.mjs} +0 -0
  354. /package/dist/{chunk-C_pMuVsO.mjs → rolldown-runtime-88NL7fhV.mjs} +0 -0
  355. /package/dist/{ssrf-policy-CsIJGkpd.mjs → ssrf-policy-B72vdy23.mjs} +0 -0
  356. /package/dist/{tool-builder-qif8M9-K.mjs → tool-builder-CpLh-UQd.mjs} +0 -0
  357. /package/dist/{types-Fz69RzbZ.mjs → types-BzPBzmVB.mjs} +0 -0
@@ -0,0 +1,235 @@
1
+ import{A as e,M as t,N as n,P as r,j as i}from"./constants-nvsLpSri.mjs";import{i as a}from"./artifacts-Bx9GLx4J.mjs";import{i as o}from"./modules-CC_ADmwi.mjs";import{c as s,i as c,l,n as u,u as d}from"./parse-args-B6dwWc9k.mjs";import{r as f,t as p}from"./ResponseBuilder-BLicSCjn.mjs";import{n as m}from"./capabilities-DwzyxL2w.mjs";import{t as h}from"./ToolRegistry-CzqQxFqf.mjs";import"./definitions-D3uT-ZbU.mjs";import{tmpdir as g}from"node:os";import{join as _,normalize as v,resolve as y,sep as b}from"node:path";import{mkdir as x,readFile as S,stat as C,writeFile as w}from"node:fs/promises";import{createHash as T}from"node:crypto";const E=e=>typeof e==`object`&&!!e,D=e=>E(e)&&typeof e.error==`string`;function O(e){let t=y(e),n=v(process.cwd()),r=v(g());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 k=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=O(t);return await w(e,r,`utf-8`),e}let{absolutePath:o,displayPath:s}=await a(n);return await w(o,r,`utf-8`),i===`absolute`?o:s}async resolveArtifactOutputPath(e){let{outputPath:t,artifact:n,pathMode:r=`absolute`}=e;if(t)return O(t);let{absolutePath:i,displayPath:o}=await a(n);return r===`display`?o: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 C(e)).size}catch{return 0}}};function ee(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 A=class extends k{async handleWasmDetectObfuscation(t){let a=d(t,`inputPath`),o=u(t,`verbose`,!1),s=await this.state.runner.run({tool:`wabt.wasm2wat`,args:[a],timeoutMs:n});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>e&&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>i&&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>r&&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=d(e,`inputPath`),r=u(e,`allHooks`,!0),i=l(e,`hooks`),a=s(e,`outputPath`),o=await this.state.runner.run({tool:`wabt.wasm2wat`,args:[t],timeoutMs:n});if(!o.ok)return this.fail(o.stderr);let c=o.stdout,f=r?[`call`,`memory`,`branch`,`loop`,`local`]:i.length>0?i:[`call`],p=c.match(/\(func\s/g)||[],m=c.match(/\(export/g)||[],h=c.match(/\(import/g)||[],g=c.match(/\(table\b/g)||[],_=c.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(c))!==null;)S[1]&&v.push(S[1]);for(;(S=x.exec(c))!==null;)S[1]&&S[2]&&y.push({module:S[1],name:S[2]});let C={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 C),E=`
122
+ const hookedExports = {};
123
+ for (const [k, v] of Object.entries(instance.exports)) { hookedExports[k] = v; }
124
+ `+T.map(e=>C[e]).join(`
125
+ `),D=JSON.stringify(t),k=[...new Set(y.map(({module:e})=>e))].filter(e=>e!==`env`).map(e=>` ${JSON.stringify(e)}: {},`).join(`
126
+ `),A=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
+ `),j=`// 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(${D}).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
+ ${k?`${k}\n`:``} };
146
+
147
+ ${A}
148
+
149
+ const instance = await WebAssembly.instantiate(module, imports);
150
+
151
+ ${E}
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
+ `,M;if(a){let e=O(a);await w(e,j,`utf-8`),M=e}else M=await this.writeTextArtifact({artifact:{category:`wasm`,toolName:`wasm-instrument`,ext:`js`},content:j});let N=ee(t),P=[N?`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),F=P.length>0?P.join(` `):void 0;return this.ok({artifactPath:M,hookTypes:T,functionCount:p.length,exportCount:m.length,importCount:h.length,wrapperSizeBytes:j.length,note:`Wasabi-style instrumentation wrapper generated. Load in browser with WASM module to trace execution.`,metadata:{inputPathKind:N?`local-path`:`url`,wrapperFetchesBrowserUrl:!0,...T.includes(`branch`)?{branchHookMode:`js-table-access-only`,callIndirectSites:_.length,tableCount:g.length}:{}},...F?{warning:F}:{}})}},j=class extends k{async handleWasmDisassemble(e){let t=d(e,`inputPath`),r=s(e,`outputPath`),i=u(e,`foldExprs`,!0),a=[t,`-o`,`/dev/stdout`];i&&a.push(`--fold-exprs`);let o=await this.state.runner.run({tool:`wabt.wasm2wat`,args:a,timeoutMs:n,requireNonEmptyOutput:!0,outputLabel:`wasm text output`});if(!o.ok)return this.fail(o.stderr,o.exitCode??void 0);let c=await this.writeTextArtifact({outputPath:r,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=d(e,`inputPath`),r=s(e,`outputPath`),i=await this.state.runner.run({tool:`wabt.wasm-decompile`,args:[t,`-o`,`/dev/stdout`],timeoutMs:n,requireNonEmptyOutput:!0,outputLabel:`wasm decompile output`});if(!i.ok)return this.fail(i.stderr,i.exitCode??void 0);let a=await this.writeTextArtifact({outputPath:r,artifact:{category:`wasm`,toolName:`wasm-decompile`,ext:`dcmp`},content:i.stdout});return this.ok({artifactPath:a,totalLines:i.stdout.split(`
173
+ `).length,preview:this.preview(i.stdout,60),durationMs:i.durationMs})}async handleWasmInspectSections(e){let t=d(e,`inputPath`),r=({headers:`-h`,details:`-x`,disassemble:`-d`,all:`-h -x -d`}[s(e,`sections`,`details`)]||`-x`).split(` `),i=await this.state.runner.run({tool:`wabt.wasm-objdump`,args:[...r,t],timeoutMs:n,requireNonEmptyOutput:!0,outputLabel:`wasm section dump`});return i.ok?this.ok({totalLines:i.stdout.split(`
174
+ `).length,preview:this.preview(i.stdout,100),durationMs:i.durationMs}):this.fail(i.stderr,i.exitCode??void 0)}async handleWasmToC(e){let t=d(e,`inputPath`),r=s(e,`outputDir`),i=await this.resolveArtifactOutputPath({outputPath:r,artifact:{category:`wasm`,toolName:`wasm2c`,ext:`dir`},pathMode:`absolute`});await x(i,{recursive:!0});let a=y(t).replace(/\.wasm$/i,``).split(/[/\\]/).pop()||`output`,o=_(i,`${a}.c`),c=_(i,`${a}.h`),l=await this.state.runner.run({tool:`wabt.wasm2c`,args:[t,`-o`,o],timeoutMs:n,expectedOutputPaths:[o,c],outputLabel:`wasm2c output`});return l.ok?this.ok({outputDir:i,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)}},M=class extends k{async handleWasmOfflineRun(e){let t=d(e,`inputPath`),n=d(e,`functionName`),r=l(e,`args`),i=s(e,`runtime`,`auto`),a=c(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 u=o===`runtime.wasmtime`?[`run`,`--invoke`,n,t,...r]:[`run`,t,`--invoke`,n,`--`,...r],f=await this.state.runner.run({tool:o,args:u,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 n=d(e,`inputPath`),r=s(e,`outputPath`),i=s(e,`level`,`O2`),a=await this.resolveArtifactOutputPath({outputPath:r,artifact:{category:`wasm`,toolName:`wasm-opt`,ext:`wasm`},pathMode:`absolute`}),o=await this.state.runner.run({tool:`binaryen.wasm-opt`,args:[`-${i}`,n,`-o`,a],timeoutMs:t,expectedOutputPaths:[a],outputLabel:`optimized wasm`});if(!o.ok)return this.fail(o.stderr,o.exitCode??void 0);let c=await this.tryStatSize(n),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})}};const N=[`custom`,`type`,`import`,`function`,`table`,`memory`,`global`,`export`,`start`,`element`,`code`,`data`,`datacount`],P=[0,97,115,109];function F(e,t){let n=0,r=0,i=t;for(;;){if(i>=e.length)throw Error(`truncated LEB128`);let t=e[i++];if(n|=(t&127)<<r,!(t&128))break;if(r+=7,r>35)throw Error(`LEB128 exceeds u32 range`)}return[n>>>0,i]}function I(e,t){let n=0,r=0,i=t,a=0;for(;;){if(i>=e.length)throw Error(`truncated signed LEB128`);if(a=e[i++],n|=(a&127)<<r,r+=7,!(a&128))break;if(r>70)throw Error(`signed LEB128 exceeds i64 range`)}return r<64&&a&64&&(n|=-1<<r),[n,i]}function L(e){if(e.length<8||e[0]!==P[0]||e[1]!==P[1]||e[2]!==P[2]||e[3]!==P[3])throw Error(`Not a valid wasm binary (missing \\0asm magic header)`);let t=[],n=8;for(;n<e.length;){let r=e[n++],[i,a]=F(e,n),o=a+i;if(o>e.length)throw Error(`Section ${r} declares ${i} bytes but only ${e.length-a} remain`);let s=N[r]??`section-${r}`;if(r===0)try{let[t,n]=F(e,a);s=`custom:${e.subarray(n,n+t).toString(`utf8`)||`unnamed`}`}catch{s=`custom:unnamed`}t.push({id:r,name:s,bodyStart:a,bodyEnd:o}),n=o}return t}function R(e,t,n){try{let r=t,[i,a]=F(e,r);r=a+i;let o=[];for(;r<n;){let t=e[r++],[n,i]=F(e,r),a=i+n;if(r=a,t===2){let t=i,[n,r]=F(e,t);t=r;for(let r=0;r<n&&t<a;r++){let[n,r]=F(e,t);t=r;let[i,a]=F(e,t);t=a;let s=e.subarray(t,t+i).toString(`utf8`);t+=i,o.push({index:n,name:s})}}}return o}catch{return[]}}function te(e){let t=[];return(/^https?:\/\//i.test(e)||/^wss?:\/\//i.test(e))&&t.push(`url`),/^\d{1,3}(?:\.\d{1,3}){3}(?::\d+)?$/.test(e)&&t.push(`ip`),/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)&&t.push(`email`),/^[0-9a-fA-F]{32,64}$/.test(e)&&t.push(`hex-hash`),/^[A-Za-z0-9+/]{16,}={0,2}$/.test(e)&&t.push(`base64`),/(?:^|[/\\])[\w.-]+\.(?:js|wasm|json|png|jpe?g|html?|css|so|dex|apk|proto|wat|pem|crt)(?:$|\?)/i.test(e)&&t.push(`file-path`),t}function ne(e,t,n,r){let i=[],a=-1,o=(t,n)=>{n-t>=r&&i.push({value:e.subarray(t,n).toString(`latin1`),offset:t})};for(let r=t;r<n;r++){let t=e[r];t>=32&&t<=126?a<0&&(a=r):a>=0&&(o(a,r),a=-1)}return a>=0&&o(a,n),i}function re(e,t={}){let n=Math.max(1,t.minLength??4),r=Math.max(1,t.maxStrings??200),i=L(e),a=[],o={},s=[];for(let t of i){t.name===`custom:name`&&(s=R(e,t.bodyStart,t.bodyEnd));let r=ne(e,t.bodyStart,t.bodyEnd,n);if(r.length!==0){o[t.name]=(o[t.name]??0)+r.length;for(let e of r)a.push({value:e.value,section:t.name,offset:e.offset,categories:te(e.value)})}}let c={};for(let e of a)for(let t of e.categories)(c[t]??=[]).push(e);let l=a.length>r,u=a.slice(0,r);return{sectionCount:i.length,totalStrings:a.length,returnedStrings:u.length,truncated:l,functionNames:s,bySection:o,classified:c,strings:u}}var ie=class extends k{async handleWasmStringExtract(e){let t=d(e,`inputPath`),n=c(e,`minLength`,4),r=c(e,`maxStrings`,200),i;try{i=await S(t)}catch(e){return this.fail(`Failed to read wasm file: ${e instanceof Error?e.message:String(e)}`)}try{let e=re(i,{minLength:n,maxStrings:r});return this.ok({inputPath:t,...e})}catch(e){return this.fail(e instanceof Error?e.message:String(e))}}};const ae=/^\s*\(func\b/,oe=/^\s*\(import\b/,se=/^\s*\(export\b/,ce=/^\s*\(module\b/;function z(e){let t=0,n=e.indexOf(`(module`);if(n>=0){let r=e.indexOf(`(`,n);r>=0&&(t=r+1)}let r=e.slice(t),i=[],a=0,o=-1,s=!1;for(let e=0;e<r.length;e++){let t=r[e];if(s){t===`"`&&r[e-1]!==`\\`&&(s=!1);continue}if(t===`"`){s=!0;continue}t===`(`?(a===0&&(o=e),a++):t===`)`&&a>0&&(a--,a===0&&o>=0&&(i.push(r.slice(o,e+1)),o=-1))}return i}function le(e){let t=e.slice(e.indexOf(`(func`)+5),n=t.match(/^\s+\$([^\s)]+)/);if(n){let e=n[1];return{key:e,displayName:`$`+e,named:!0}}let r=t.match(/^\s+\(;(\d+);\)/);if(r){let e=r[1];return{key:`__idx_`+e,displayName:`(;`+e+`;)`,named:!1}}let i=t.match(/^\s+\(export\s+"([^"]*)"/);if(i){let e=i[1];return{key:`__exp_`+e,displayName:`(export "`+e+`")`,named:!1}}return{key:`__unnamed__`,displayName:`(unnamed)`,named:!1}}function B(e){let t=z(e),n=[],r=[],i=[],a=[],o=0;for(let e of t)if(ae.test(e)){let t=le(e),r=t.key;!t.named&&r===`__unnamed__`&&(r=`__unnamed_`+o,o++);let i=e.trim();n.push({key:r,displayName:t.displayName,named:t.named,text:i,lines:i.split(`
175
+ `).map(e=>e.replace(/\s+$/g,``))})}else oe.test(e)?r.push(e.trim()):se.test(e)?i.push(e.trim()):ce.test(e)||a.push(e.trim());return{functions:n,imports:r,exports:i,others:a}}function ue(e,t){let n=e.length,r=t.length,i=Array.from({length:n+1},()=>Array.from({length:r+1},()=>0));for(let a=n-1;a>=0;a--){let n=i[a],o=i[a+1],s=e[a];for(let e=r-1;e>=0;e--)s===t[e]?n[e]=o[e+1]+1:n[e]=Math.max(o[e],n[e+1])}let a=[],o=0,s=0;for(;o<n&&s<r;){let n=e[o],r=t[s];n===r?(a.push({type:`eq`,line:n}),o++,s++):i[o+1][s]>=i[o][s+1]?(a.push({type:`del`,line:n}),o++):(a.push({type:`add`,line:r}),s++)}for(;o<n;)a.push({type:`del`,line:e[o]}),o++;for(;s<r;)a.push({type:`add`,line:t[s]}),s++;return a}function de(e,t,n=3){let r=ue(e,t),i=r.length;if(i===0||r.every(e=>e.type===`eq`))return[];let a=Array.from({length:i},()=>!1);for(let e=0;e<i;e++)if(r[e].type!==`eq`){let t=Math.max(0,e-n),r=Math.min(i-1,e+n);for(let e=t;e<=r;e++)a[e]=!0}let o=[];for(let e=0;e<i;e++){if(!a[e])continue;let t=r[e];o.push((t.type===`eq`?` `:t.type===`del`?`-`:`+`)+t.line)}return o}function V(e){return e.map(e=>e.replace(/\$[lL]\d+\b/g,`$local`))}function fe(e,t,n){let r=n?.semantic===!0,i=new Map(e.functions.map(e=>[e.key,e])),a=new Map(t.functions.map(e=>[e.key,e])),o=[],s=[],c=[],l=[];for(let e of t.functions)i.has(e.key)||o.push({key:e.key,displayName:e.displayName});for(let t of e.functions){let e=a.get(t.key);if(!e){s.push({key:t.key,displayName:t.displayName});continue}let n=de(r?V(t.lines):t.lines,r?V(e.lines):e.lines,2),i=n.filter(e=>e.startsWith(`+`)).length,o=n.filter(e=>e.startsWith(`-`)).length;n.length===0?l.push({key:t.key,displayName:t.displayName}):c.push({key:t.key,displayName:t.displayName,unifiedDiff:n,addedLines:i,removedLines:o})}return{addedFunctions:o,removedFunctions:s,changedFunctions:c,unchangedFunctions:l,importDelta:H(e.imports,t.imports),exportDelta:H(e.exports,t.exports),summary:{functionsA:e.functions.length,functionsB:t.functions.length,added:o.length,removed:s.length,changed:c.length,unchanged:l.length}}}function H(e,t){let n=new Set(e),r=new Set(t);return{added:t.filter(e=>!n.has(e)),removed:e.filter(e=>!r.has(e))}}var pe=class extends k{async handleWasmDiff(e){let t=d(e,`inputPathA`),r=d(e,`inputPathB`),i=u(e,`semantic`,!1),a=s(e,`outputPath`),[o,c]=await Promise.all([this.state.runner.run({tool:`wabt.wasm2wat`,args:[t,`-o`,`/dev/stdout`],timeoutMs:n,requireNonEmptyOutput:!0,outputLabel:`wasm text output (A)`}),this.state.runner.run({tool:`wabt.wasm2wat`,args:[r,`-o`,`/dev/stdout`],timeoutMs:n,requireNonEmptyOutput:!0,outputLabel:`wasm text output (B)`})]);if(!o.ok)return this.fail(`wasm2wat failed for inputPathA: ${o.stderr}`,o.exitCode??void 0);if(!c.ok)return this.fail(`wasm2wat failed for inputPathB: ${c.stderr}`,c.exitCode??void 0);let l=fe(B(o.stdout),B(c.stdout),{semantic:i}),f=await this.writeTextArtifact({outputPath:a,artifact:{category:`wasm`,toolName:`wasm-diff`,ext:`json`},content:JSON.stringify(l,null,2)});return this.ok({summary:l.summary,semantic:i,addedFunctions:l.addedFunctions,removedFunctions:l.removedFunctions,unchangedFunctions:l.unchangedFunctions,importDelta:l.importDelta,exportDelta:l.exportDelta,changedFunctions:l.changedFunctions.map(e=>({key:e.key,displayName:e.displayName,addedLines:e.addedLines,removedLines:e.removedLines,unifiedDiffPreview:e.unifiedDiff.slice(0,50)})),artifactPath:f,durationMs:o.durationMs+c.durationMs})}};const me=/^\s*\(func\b/,he=/^\(\s*(?:type|param|result|local|export)\b/;function ge(e,t,n){let r=e.indexOf(`(func`)+5,i=e.length;for(;r<i;){for(;r<i&&/\s/.test(e.charAt(r));)r++;if(r>=i)break;let t=e.charAt(r);if(t===`$`)for(;r<i&&!/[\s()]/.test(e.charAt(r));)r++;else if(t===`(`&&he.test(e.slice(r))){let t=0;for(;r<i;){let n=e.charAt(r);if(n===`(`)t++;else if(n===`)`&&(t--,t===0)){r++;break}r++}}else break}let a=`(call ${n} (i32.const ${t}))`;return`${e.slice(0,r)}\n ${a}\n ${e.slice(r)}`}function _e(e,t){let n=t?.traceFnName??`$__jshook_trace_fn`,r=t?.importModule??`__jshook`,i=t?.importField??`trace_fn`,a=z(e),o=`(import "${r}" "${i}" (func ${n} (param i32)))`,s=0,c=0,l=0,u=[o];for(let e of a)if(me.test(e)){try{u.push(ge(e,s,n)),c++}catch{u.push(e),l++}s++}else u.push(e);let d=e.indexOf(`(module`),f=e.indexOf(`(`,d),p=e.lastIndexOf(`)`),m=e.slice(0,f+1),h=e.slice(p);return{instrumented:`${m}\n ${u.join(`
176
+ `)}\n${h}`,functionsInstrumented:c,functionsSkipped:l}}var ve=class extends k{async handleWasmInstrumentBinary(e){let t=d(e,`inputPath`),r=s(e,`outputPath`),i=await this.state.runner.run({tool:`wabt.wasm2wat`,args:[t,`-o`,`/dev/stdout`],timeoutMs:n,requireNonEmptyOutput:!0,outputLabel:`wasm text output`});if(!i.ok)return this.fail(`wasm2wat failed: ${i.stderr}`,i.exitCode??void 0);let{instrumented:o,functionsInstrumented:c,functionsSkipped:l}=_e(i.stdout),u=await a({category:`wasm`,toolName:`wasm-instrument-binary`,ext:`wat`});await w(u.absolutePath,o,`utf-8`);let f=r?{absolutePath:O(r),displayPath:r}:await a({category:`wasm`,toolName:`wasm-instrument-binary`,ext:`wasm`}),p=await this.state.runner.run({tool:`wabt.wat2wasm`,args:[u.absolutePath,`-o`,f.absolutePath],timeoutMs:n,requireNonEmptyOutput:!1,outputLabel:`instrumented wasm`});if(!p.ok)return this.fail(`wat2wasm reassembly failed: ${p.stderr}`,p.exitCode??void 0);let m=await this.tryStatSize(f.absolutePath);return this.ok({instrumentedPath:f.displayPath,patchedWatPath:u.displayPath,functionsInstrumented:c,functionsSkipped:l,size:m,traceFnImport:{module:`__jshook`,field:`trace_fn`,signature:`(param i32)`},honestBoundary:`Function-ENTRY-level tracing only (not basic-block). Each instrumented function calls the imported $__jshook_trace_fn(i32.const <ordinal>) on entry; the host/runtime must supply a trace_fn import at instantiation. Indirect/branch internal dispatch is still not observed per-block. This is real wasm-level instrumentation (code section rewritten + reassembled via wat2wasm), unlike wasm_instrument_trace which only proxies JS-visible exports.`,durationMs:i.durationMs+p.durationMs})}};const U=/^\s*\(func\b/,ye=/^\(\s*(?:type|param|result|local|export)\b/;function W(e,t){let n=e.length;for(;t<n;){for(;t<n&&/\s/.test(e.charAt(t));)t++;if(t>=n)break;let r=e.charAt(t);if(r===`$`)for(;t<n&&!/[\s()]/.test(e.charAt(t));)t++;else if(r===`(`&&ye.test(e.slice(t))){let r=0;for(;t<n;){let n=e.charAt(t);if(n===`(`)r++;else if(n===`)`&&(r--,r===0)){t++;break}t++}}else break}return t}function G(e){let t=[],n=e.length,r=0;for(;r<n;){for(;r<n&&/\s/.test(e.charAt(r));)r++;if(r>=n)break;let i=e.charAt(r);if(i===`;`&&e.charAt(r+1)===`;`){let t=e.indexOf(`
177
+ `,r);r=t<0?n:t+1;continue}if(i===`(`&&e.charAt(r+1)===`;`){for(r+=2;r<n-1&&!(e.charAt(r)===`;`&&e.charAt(r+1)===`)`);)r++;r+=2;continue}if(i===`"`){for(r++;r<n;){if(e.charAt(r)===`\\`)r++;else if(e.charAt(r)===`"`){r++;break}r++}continue}if(i===`(`){let n=r+1,i=e.slice(n).match(/^\s*(block|loop|if)\b/);if(i){let r=W(e,n+i[0].length);t.push(r)}}r++}return t}function be(e){let t=/\(?\s*br(?:_if|_table)?\b/g,n=0;for(;t.exec(e)!==null;)n++;return n}function xe(e,t,n,r){if(t.length===0)return{text:e,count:0};let i=t.toSorted((e,t)=>t-e),a=e,o=n;for(let e of i){let t=`(call ${r} (i32.const ${o})) `;a=a.slice(0,e)+t+a.slice(e),o++}return{text:a,count:i.length}}function Se(e){let t=e.replace(/(\(elem\b[\s\S]*?\bfunc\s+)(\d+(?:\s+\d+)*)(?=\s*\))/g,(e,t,n)=>`${t}${String(n).replace(/\d+/g,e=>String(Number(e)+1))}`);return t=t.replace(/(\b(?:call|ref\.func)\s+)(\d+)\b/g,(e,t,n)=>`${t}${Number(n)+1}`),t=t.replace(/(\((?:func|start)\s+)(\d+)\b/g,(e,t,n)=>`${t}${Number(n)+1}`),t}function Ce(e,t){let n=t?.traceFnName??`$__jshook_trace_block`,r=t?.importModule??`__jshook`,i=t?.importField??`trace_block`,a=t?.includeFuncEntry??!0,o=z(e),s=`(import "${r}" "${i}" (func ${n} (param i32)))`,c=0,l=0,u=0,d=0,f=[s];for(let e of o){let t=Se(e);if(!U.test(e)){f.push(t);continue}try{let e=W(t,t.indexOf(`(func`)+5),r=G(t),i=r;a&&(i=[e,...r]);let{text:o,count:s}=xe(t,i,c,n);c+=s,l+=r.length,f.push(o),u++}catch{f.push(t),d++}}let p=e.indexOf(`(module`),m=e.lastIndexOf(`)`),h=e.slice(0,p+7),g=e.slice(m);return{instrumented:`${h}\n ${f.join(`
178
+ `)}\n${g}`,functionsInstrumented:u,blocksInstrumented:l,functionsSkipped:d}}function K(e){let t=z(e),n=0,r=0,i=0;for(let e of t)U.test(e)&&(n++,r+=G(e).length,i+=be(e));let a=r+n;return{functions:n,blocks:r,branches:i,instrumentableBlocks:a}}var we=class extends k{async handleWasmInstrumentBlock(e){let t=d(e,`inputPath`),r=s(e,`outputPath`),i=await this.state.runner.run({tool:`wabt.wasm2wat`,args:[t,`-o`,`/dev/stdout`],timeoutMs:n,requireNonEmptyOutput:!0,outputLabel:`wasm text output`});if(!i.ok)return this.fail(`wasm2wat failed: ${i.stderr}`,i.exitCode??void 0);let o=K(i.stdout),{instrumented:c,functionsInstrumented:l,blocksInstrumented:u,functionsSkipped:f}=Ce(i.stdout),p=await a({category:`wasm`,toolName:`wasm-instrument-block`,ext:`wat`});await w(p.absolutePath,c,`utf-8`);let m=r?{absolutePath:O(r),displayPath:r}:await a({category:`wasm`,toolName:`wasm-instrument-block`,ext:`wasm`}),h=await this.state.runner.run({tool:`wabt.wat2wasm`,args:[p.absolutePath,`-o`,m.absolutePath],timeoutMs:n,requireNonEmptyOutput:!1,outputLabel:`instrumented wasm`});if(!h.ok)return this.fail(`wat2wasm reassembly failed: ${h.stderr}`,h.exitCode??void 0);let g=await this.tryStatSize(m.absolutePath);return this.ok({instrumentedPath:m.displayPath,patchedWatPath:p.displayPath,functionsInstrumented:l,blocksInstrumented:u,functionsSkipped:f,analysis:o,size:g,traceFnImport:{module:`__jshook`,field:`trace_block`,signature:`(param i32)`},honestBoundary:`Block/loop/if-ENTRY-level tracing. Each block/loop/if body entry (and optionally each function entry) calls the imported $__jshook_trace_block(i32.const <ordinal>); the host/runtime must supply a trace_block import at instantiation. Branch targets (br/br_if/br_table) are covered because Wasm structured control flow resolves them to block/loop/if labels. Intra-block instruction-level tracing is not provided.`,durationMs:i.durationMs+h.durationMs})}};const Te={127:`i32`,126:`i64`,125:`f32`,124:`f64`,123:`v128`,112:`funcref`,111:`externref`};function q(e){return{raw:e,name:Te[e]??`valtype-0x${e.toString(16)}`}}const Ee={0:`function`,1:`table`,2:`memory`,3:`global`,4:`tag`};function J(e){return Ee[e]??`unknown-${e}`}function Y(e,t){let[n,r]=F(e,t),i=r+n;return[e.subarray(r,i).toString(`utf8`),i]}function X(e,t){let n=e[t++],[r,i]=F(e,t),a,o=i;if(n&1){let[t,n]=F(e,i);a=t,o=n}let s=(n&2)!=0;return[{min:r,...a===void 0?{}:{max:a},shared:s},o]}function Z(e,t){let n=e.length,r=t;for(;r<n;){let t=e[r++];switch(t){case 65:[,r]=I(e,r);break;case 66:[,r]=I(e,r);break;case 67:r+=4;break;case 68:r+=8;break;case 35:case 210:[,r]=F(e,r);break;case 208:r+=1;break;case 11:return r;default:throw Error(`unknown const-expr opcode 0x${t.toString(16)}`)}}throw Error(`const-expr ran past end of section without 0x0b`)}function De(e,t){let n=t.bodyStart,[r,i]=F(e,n);n=i;let a=[];for(let i=0;i<r&&n<t.bodyEnd;i++){let r=e[n++];if(r!==96)throw Error(`unsupported type form 0x${r.toString(16)} (only 0x60 func)`);let[i,o]=F(e,n);n=o;let s=[];for(let r=0;r<i&&n<t.bodyEnd;r++)s.push(q(e[n++]));let[c,l]=F(e,n);n=l;let u=[];for(let r=0;r<c&&n<t.bodyEnd;r++)u.push(q(e[n++]));a.push({form:r,params:s,results:u})}return a}function Oe(e,t){let n=t.bodyStart,[r,i]=F(e,n);n=i;let a=[],o=0;for(let i=0;i<r&&n<t.bodyEnd;i++){let[t,r]=Y(e,n);n=r;let[i,s]=Y(e,n);n=s;let c=e[n++],l={module:t,field:i,kind:J(c)};if(c===0){let[t,r]=F(e,n);l.typeIndex=t,n=r,o++}else if(c===1){l.elementType=q(e[n++]);let[t,r]=X(e,n);l.limits=t,n=r}else if(c===2){let[t,r]=X(e,n);l.limits=t,n=r}else if(c===3)l.valueType=q(e[n++]),l.mutable=e[n++]===1,n=Z(e,n);else if(c===4){n++;let[,t]=F(e,n);n=t}else throw Error(`unknown import kind 0x${c.toString(16)}`);a.push(l)}return{imports:a,importedFunctionCount:o}}function ke(e,t,n,r){let i=t.bodyStart,[a,o]=F(e,i);i=o;let s=[];for(let o=0;o<a&&i<t.bodyEnd;o++){let[t,a]=F(e,i);i=a;let c=n+o,l=r.get(c);s.push({index:c,typeIndex:t,...l===void 0?{}:{name:l}})}return s}function Ae(e,t){let n=t.bodyStart,[r,i]=F(e,n);n=i;let a=[];for(let i=0;i<r&&n<t.bodyEnd;i++){let t=q(e[n++]),[r,i]=X(e,n);n=i,a.push({elementType:t,limits:r})}return a}function je(e,t){let n=t.bodyStart,[r,i]=F(e,n);n=i;let a=[];for(let i=0;i<r&&n<t.bodyEnd;i++){let[t,r]=X(e,n);n=r,a.push({limits:t})}return a}function Me(e,t){let n=t.bodyStart,[r,i]=F(e,n);n=i;let a=[];for(let i=0;i<r&&n<t.bodyEnd;i++){let t=q(e[n++]),r=e[n++]===1;n=Z(e,n),a.push({valueType:t,mutable:r})}return a}function Ne(e,t){let n=t.bodyStart,[r,i]=F(e,n);n=i;let a=[];for(let i=0;i<r&&n<t.bodyEnd;i++){let[t,r]=Y(e,n);n=r;let i=e[n++],[o,s]=F(e,n);n=s,a.push({name:t,kind:J(i),index:o})}return a}function Pe(e,t){let[n]=F(e,t.bodyStart);return n}function Q(e,t){let[n]=F(e,t.bodyStart);return n}function Fe(e,t){let n=t.bodyStart,[r,i]=F(e,n);n=i;let a=0;for(let i=0;i<r&&n<t.bodyEnd;i++){let[t,r]=F(e,n);n=r,a+=t,n+=t}return{functionCount:r,totalCodeBytes:a}}function Ie(e,t,n){try{let r=t,[i,a]=F(e,r);r=a+i;let[o,s]=F(e,r);r=s;let c=[];for(let t=0;t<o&&r<n;t++){let[t,i]=Y(e,r);r=i;let[a,o]=F(e,r);r=o;let s=[];for(let t=0;t<a&&r<n;t++){let[t,n]=Y(e,r);r=n;let[i,a]=Y(e,r);r=a,s.push({name:t,version:i})}c.push({name:t,values:s})}return c}catch{return}}function Le(e,t,n){try{let r=t,[i,a]=F(e,r);r=a+i;let[o,s]=F(e,r);r=s;let c=[];for(let t=0;t<o&&r<n;t++){let t=e[r++],n=t===43?`+`:t===45?`-`:`=`,[i,a]=Y(e,r);r=a,c.push({prefix:n,name:i})}return c}catch{return}}function Re(e,t={}){let n=L(e),r=[],i=e.readUInt32LE(4),a=[];for(let t of n)if(t.name===`custom:name`){a=R(e,t.bodyStart,t.bodyEnd);break}let o=new Map;for(let e of a)o.set(e.index,e.name);let s=[],c=[],l=0,u=[],d=[],f=[],p=[],m=[],h,g=0,_=null,v=0,y=[];for(let t of n)try{switch(t.id){case 0:{let n=t.name.startsWith(`custom:`)?t.name.slice(7):t.name,r=t.bodyEnd-t.bodyStart;try{let[n,i]=F(e,t.bodyStart);r=t.bodyEnd-(i+n)}catch{}let i={name:n,payloadBytes:r};if(n===`name`)i.functionNames=R(e,t.bodyStart,t.bodyEnd);else if(n===`producers`){let n=Ie(e,t.bodyStart,t.bodyEnd);n&&(i.producers=n)}else if(n===`target_features`){let n=Le(e,t.bodyStart,t.bodyEnd);n&&(i.targetFeatures=n)}y.push(i);break}case 1:s=De(e,t);break;case 2:{let n=Oe(e,t);c=n.imports,l=n.importedFunctionCount;break}case 3:u=ke(e,t,l,o);break;case 4:d=Ae(e,t);break;case 5:f=je(e,t);break;case 6:p=Me(e,t);break;case 7:m=Ne(e,t);break;case 8:h=Pe(e,t);break;case 9:g=Q(e,t);break;case 10:_=Fe(e,t);break;case 11:v=Q(e,t);break;default:break}}catch(e){r.push(`${t.name}: ${e instanceof Error?e.message:String(e)}`)}return{version:i,sectionCount:n.length,types:s,imports:c,importedFunctionCount:l,declaredFunctions:u,functionCountTotal:l+u.length,tables:d,memories:f,globals:p,exports:m,...h===void 0?{}:{startFunction:h},elementSegments:g,codeSection:_,dataSegments:v,customSections:y,importCount:c.length,exportCount:m.length,parseErrors:r,honestBoundary:`Structure only — no code-body disassembly (use wasm_disassemble / wabt). Element/data/global-init segments are reported as counts; full initializer decode is deferred. Custom sections beyond name/producers/target_features are reported as name + size only. Parsing is tolerant: malformed sections are recorded in parseErrors and skipped. This is the pure-TS, wabt-independent counterpart to wasm_inspect_sections (wasm-objdump).`}}var ze=class extends k{async handleWasmInspect(e){let t=d(e,`inputPath`),n;try{n=await S(t)}catch(e){return this.fail(`Failed to read wasm file: ${e instanceof Error?e.message:String(e)}`)}try{let e=Re(n),r=n.length;return this.ok({inputPath:t,byteSize:r,...e})}catch(e){return this.fail(e instanceof Error?e.message:String(e))}}},Be=class{conversion;runtime;analysis;stringExtract;diff;instrumentBinary;instrumentBlock;moduleStructure;constructor(e){this.conversion=new j(e),this.runtime=new M(e),this.analysis=new A(e),this.stringExtract=new ie(e),this.diff=new pe(e),this.instrumentBinary=new ve(e),this.instrumentBlock=new we(e),this.moduleStructure=new ze(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)}handleWasmStringExtract(e){return this.stringExtract.handleWasmStringExtract(e)}handleWasmDiff(e){return this.diff.handleWasmDiff(e)}handleWasmInstrumentBinary(e){return this.instrumentBinary.handleWasmInstrumentBinary(e)}handleWasmInstrumentBlock(e){return this.instrumentBlock.handleWasmInstrumentBlock(e)}handleWasmInspect(e){return this.moduleStructure.handleWasmInspect(e)}},Ve=class{state;constructor(e){this.state=e}async handleWasmDump(e){let t=c(e,`moduleIndex`,0),n=s(e,`outputPath`),r=u(e,`autoInject`,!1),i=await this.state.collector.getActivePage(),o=()=>i.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),l=await o();if(D(l)&&r&&(await i.evaluateOnNewDocument(`(function () {
179
+ if (typeof WebAssembly === 'undefined') return;
180
+ window.__wasmModuleStorage = [];
181
+ window.__aiHooks = window.__aiHooks || {};
182
+ window.__aiHooks['preset-webassembly-full'] = [];
183
+ function toBytes(bs) {
184
+ try {
185
+ if (bs instanceof ArrayBuffer) return new Uint8Array(bs);
186
+ if (ArrayBuffer.isView(bs)) return new Uint8Array(bs.buffer, bs.byteOffset, bs.byteLength);
187
+ if (bs && typeof bs.byteLength === 'number') return new Uint8Array(bs);
188
+ } catch (_) {}
189
+ return null;
190
+ }
191
+ function record(bs, inst, importObject) {
192
+ var u8 = toBytes(bs);
193
+ if (u8) window.__wasmModuleStorage.push(Array.from(u8));
194
+ var exp = inst && inst.exports ? Object.keys(inst.exports) : [];
195
+ var imps = importObject && typeof importObject === 'object' ? Object.keys(importObject) : [];
196
+ window.__aiHooks['preset-webassembly-full'].push({
197
+ type: 'instantiated', size: u8 ? u8.length : 0, exports: exp, importMods: imps, ts: Date.now()
198
+ });
199
+ }
200
+ var origInst = WebAssembly.instantiate;
201
+ WebAssembly.instantiate = function (bs, importObject) {
202
+ return origInst.call(this, bs, importObject).then(function (result) {
203
+ var inst = result && result.instance ? result.instance : result;
204
+ record(bs, inst, importObject);
205
+ return result;
206
+ });
207
+ };
208
+ var origInstStream = WebAssembly.instantiateStreaming;
209
+ if (origInstStream) {
210
+ WebAssembly.instantiateStreaming = function (source, importObject) {
211
+ return fetch(source).then(function (r) { return r.arrayBuffer(); }).then(function (buf) {
212
+ return WebAssembly.instantiate(buf, importObject);
213
+ });
214
+ };
215
+ }
216
+ var origCompile = WebAssembly.compile;
217
+ WebAssembly.compile = function (bs) {
218
+ return origCompile.call(this, bs).then(function (mod) {
219
+ var u8 = toBytes(bs);
220
+ if (u8) window.__wasmModuleStorage.push(Array.from(u8));
221
+ window.__aiHooks['preset-webassembly-full'].push({
222
+ type: 'instantiated', size: u8 ? u8.length : 0, exports: [], importMods: [], ts: Date.now()
223
+ });
224
+ return mod;
225
+ });
226
+ };
227
+ var origCompileStream = WebAssembly.compileStreaming;
228
+ if (origCompileStream) {
229
+ WebAssembly.compileStreaming = function (source) {
230
+ return fetch(source).then(function (r) { return r.arrayBuffer(); }).then(function (buf) {
231
+ return WebAssembly.compile(buf);
232
+ });
233
+ };
234
+ }
235
+ })();`),await i.reload({waitUntil:`domcontentloaded`}),l=await o()),D(l))return{content:[{type:`text`,text:JSON.stringify({success:!1,error:l.error})}]};let d=await i.evaluate(e=>{let t=window.__wasmModuleStorage;if(!t?.[e])return null;let n=t[e];return Array.from(new Uint8Array(n))},t),f,p;if(d){let e=Buffer.from(d);if(p=T(`sha256`).update(e).digest(`hex`).substring(0,16),n){let t=O(n);await w(t,e),f=t}else{let{absolutePath:t,displayPath:n}=await a({category:`wasm`,toolName:`wasm-dump`,target:p,ext:`wasm`});await w(t,e),f=n}}else f=`(binary not available — hook did not store raw bytes)`;return{content:[{type:`text`,text:JSON.stringify({success:!0,artifactPath:f,hash:p,size:l.size,exports:l.exports,importModules:l.importMods,totalModules:l.moduleCount,hint:d?`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=c(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 D(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=c(e,`instanceIndex`,0),n=c(e,`offset`,0),r=Math.min(c(e,`length`,256),65536),i=s(e,`format`,`both`),a=s(e,`searchPattern`),o=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.`};let a=i.map((e,t)=>{let n=e&&typeof e==`object`&&`exports`in e?e.exports??{}:{},r=!1;try{r=!!n.memory?.buffer}catch{r=!1}return{idx:t,exports:Object.keys(n),hasMemory:r}});try{let t=i[e.instanceIndex];if(!t)return{error:`instanceIndex ${e.instanceIndex} out of range (totalInstances: ${i.length}). Available instances: ${JSON.stringify(a)}`};let n=t.exports?.memory;if(!n?.buffer)return{error:`WASM instance #${e.instanceIndex} has no exported memory. Available instances: ${JSON.stringify(a)}`};let o=new Uint8Array(n.buffer),s=Array.from(o.slice(e.offset,e.offset+e.length)),c;if(e.searchPattern){c=[];let t=e.searchPattern;if(/^[0-9a-fA-F\s]+$/.test(t)){let n=t.replace(/\s/g,``).match(/.{2}/g)?.map(e=>parseInt(e,16))||[];for(let t=e.offset;t<=Math.min(e.offset+e.length-n.length,o.length-n.length);t++){let e=!0;for(let r=0;r<n.length;r++)if(o[t+r]!==n[r]){e=!1;break}e&&c.push({offset:t})}}else{let n=new TextEncoder().encode(t);for(let t=e.offset;t<=Math.min(e.offset+e.length-n.length,o.length-n.length);t++){let e=!0;for(let r=0;r<n.length;r++)if(o[t+r]!==n[r]){e=!1;break}e&&c.push({offset:t})}}}return{totalMemoryPages:n.buffer.byteLength/65536,totalMemoryBytes:n.buffer.byteLength,requestedOffset:e.offset,requestedLength:e.length,instanceIndex:e.instanceIndex,totalInstances:i.length,availableInstances:a,data:s,searchResults:c,memoryInfo:r[0]||null}}catch(e){return{error:`Failed to read WASM memory: ${e instanceof Error?e.message:String(e)}`}}},{instanceIndex:t,offset:n,length:r,searchPattern:a});if(D(o))return{content:[{type:`text`,text:JSON.stringify({success:!1,error:o.error})}]};let l=o.data,u=``,d=``;if(i===`hex`||i===`both`)for(let e=0;e<l.length;e+=16){let t=l.slice(e,e+16),r=(n+e).toString(16).padStart(8,`0`),i=t.map(e=>e.toString(16).padStart(2,`0`)).join(` `),a=t.map(e=>e>=32&&e<127?String.fromCharCode(e):`.`).join(``);u+=`${r} ${i.padEnd(48)} |${a}|\n`}return i===`ascii`&&(d=l.map(e=>e>=32&&e<127?String.fromCharCode(e):`.`).join(``)),{content:[{type:`text`,text:JSON.stringify({success:!0,totalMemoryPages:o.totalMemoryPages,totalMemoryBytes:o.totalMemoryBytes,instanceIndex:o.instanceIndex,totalInstances:o.totalInstances,availableInstances:o.availableInstances,offset:n,length:l.length,hexDump:i===`ascii`?void 0:u,asciiDump:i===`ascii`?d:void 0,searchResults:o.searchResults},null,2)}]}}};function $(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 He=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 p.raw(m(`wasm_capabilities`,[t,$(`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`]),$(`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`]),$(`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`]),$(`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}}}}},Ue=class{state;externalTools;browser;capabilities;constructor(e){let t=new o(new h);this.state={collector:e,runner:t},this.externalTools=new Be(this.state),this.browser=new Ve(this.state),this.capabilities=new He(this.state)}handleWasmCapabilitiesTool(){return f(async()=>await this.handleWasmCapabilities())}handleWasmCapabilities(){return this.capabilities.handleWasmCapabilities()}handleWasmDumpTool(e){return f(async()=>await this.handleWasmDump(e))}handleWasmDump(e){return this.browser.handleWasmDump(e)}handleWasmDisassembleTool(e){return f(async()=>await this.handleWasmDisassemble(e))}handleWasmDisassemble(e){return this.externalTools.handleWasmDisassemble(e)}handleWasmDecompileTool(e){return f(async()=>await this.handleWasmDecompile(e))}handleWasmDecompile(e){return this.externalTools.handleWasmDecompile(e)}handleWasmInspectSectionsTool(e){return f(async()=>await this.handleWasmInspectSections(e))}handleWasmInspectSections(e){return this.externalTools.handleWasmInspectSections(e)}handleWasmOfflineRunTool(e){return f(async()=>await this.handleWasmOfflineRun(e))}handleWasmOfflineRun(e){return this.externalTools.handleWasmOfflineRun(e)}handleWasmOptimizeTool(e){return f(async()=>await this.handleWasmOptimize(e))}handleWasmOptimize(e){return this.externalTools.handleWasmOptimize(e)}handleWasmVmpTraceTool(e){return f(async()=>await this.handleWasmVmpTrace(e))}handleWasmVmpTrace(e){return this.browser.handleWasmVmpTrace(e)}handleWasmMemoryInspectTool(e){return f(async()=>await this.handleWasmMemoryInspect(e))}handleWasmMemoryInspect(e){return this.browser.handleWasmMemoryInspect(e)}handleWasmToCTool(e){return f(async()=>await this.handleWasmToC(e))}handleWasmToC(e){return this.externalTools.handleWasmToC(e)}handleWasmDetectObfuscationTool(e){return f(async()=>await this.handleWasmDetectObfuscation(e))}handleWasmDetectObfuscation(e){return this.externalTools.handleWasmDetectObfuscation(e)}handleWasmInstrumentTraceTool(e){return f(async()=>await this.handleWasmInstrumentTrace(e))}handleWasmInstrumentTrace(e){return this.externalTools.handleWasmInstrumentTrace(e)}handleWasmStringExtractTool(e){return f(async()=>await this.handleWasmStringExtract(e))}handleWasmStringExtract(e){return this.externalTools.handleWasmStringExtract(e)}handleWasmDiffTool(e){return f(async()=>await this.handleWasmDiff(e))}handleWasmDiff(e){return this.externalTools.handleWasmDiff(e)}handleWasmInstrumentBinaryTool(e){return f(async()=>await this.handleWasmInstrumentBinary(e))}handleWasmInstrumentBinary(e){return this.externalTools.handleWasmInstrumentBinary(e)}handleWasmInstrumentBlockTool(e){return f(async()=>await this.handleWasmInstrumentBlock(e))}handleWasmInstrumentBlock(e){return this.externalTools.handleWasmInstrumentBlock(e)}handleWasmInspectTool(e){return f(async()=>await this.handleWasmInspect(e))}handleWasmInspect(e){return this.externalTools.handleWasmInspect(e)}};export{Ue as WasmToolHandlers};
@@ -0,0 +1,57 @@
1
+ import{i as e}from"./parse-args-B6dwWc9k.mjs";import{n as t,r as n}from"./cdp-session-Dy4OwMOP.mjs";async function r(r,i){let a=Math.min(20,Math.max(1,e(r,`scanDepth`,5))),{session:o,owned:s}=await n(t(i));if(!o)return{success:!1,error:`No CDP session available — browser must be connected via browser_launch or browser_attach`,weakRefCount:0,liveWeakRefs:0,clearedWeakRefs:0,finalizationRegistries:0,registriesWithPending:0,weakRefs:[],registries:[],summary:`CDP session unavailable`};try{let e=(await o.send(`Runtime.evaluate`,{expression:`
2
+ (() => {
3
+ const weakRefs = [];
4
+ const registries = [];
5
+ const visited = new WeakSet();
6
+ const queue = [];
7
+ // Seed from globalThis own properties.
8
+ for (const k of Object.getOwnPropertyNames(globalThis)) {
9
+ try { queue.push({ v: globalThis[k], depth: 0 }); } catch (_) {}
10
+ }
11
+ let steps = 0;
12
+ const MAX_STEPS = ${a*500};
13
+ while (queue.length > 0 && steps++ < MAX_STEPS) {
14
+ const { v, depth } = queue.shift();
15
+ if (v === null || typeof v !== 'object' && typeof v !== 'function') continue;
16
+ if (typeof v === 'object') {
17
+ try { if (visited.has(v)) continue; visited.add(v); } catch (_) { continue; }
18
+ if (v instanceof WeakRef) {
19
+ const target = v.deref();
20
+ weakRefs.push({
21
+ source: depth <= 1 ? 'global' : 'nested',
22
+ isLive: target !== undefined,
23
+ targetClassName: target !== undefined ? (target?.constructor?.name ?? null) : null,
24
+ });
25
+ continue; // don't descend into the WeakRef's referent
26
+ }
27
+ if (v instanceof FinalizationRegistry) {
28
+ registries.push({
29
+ source: depth <= 1 ? 'global' : 'nested',
30
+ constructorName: v.constructor?.name ?? 'FinalizationRegistry',
31
+ // Cannot introspect pending count without unregistering;
32
+ // mark as registered (the registry exists and is active).
33
+ isRegistered: true,
34
+ });
35
+ continue;
36
+ }
37
+ }
38
+ if (depth < ${a}) {
39
+ try {
40
+ const props = [...Object.getOwnPropertyNames(v), ...Object.getOwnPropertySymbols(v)];
41
+ for (const p of props) {
42
+ try {
43
+ const child = v[p];
44
+ if (child !== null && (typeof child === 'object' || typeof child === 'function')) {
45
+ queue.push({ v: child, depth: depth + 1 });
46
+ }
47
+ } catch (_) {}
48
+ }
49
+ } catch (_) {}
50
+ }
51
+ }
52
+ return {
53
+ weakRefs: weakRefs.slice(0, 200),
54
+ registries: registries.slice(0, 50),
55
+ };
56
+ })()
57
+ `,returnByValue:!0,awaitPromise:!1}))?.result?.value,t=Array.isArray(e?.weakRefs)?e.weakRefs:[],n=Array.isArray(e?.registries)?e.registries:[],r=t.filter(e=>e.isLive).length,i=t.length-r;return{success:!0,weakRefCount:t.length,liveWeakRefs:r,clearedWeakRefs:i,finalizationRegistries:n.length,registriesWithPending:n.filter(e=>e.isRegistered).length,weakRefs:t,registries:n,summary:`${t.length} WeakRefs (${r} live, ${i} cleared); ${n.length} FinalizationRegistries`}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e),weakRefCount:0,liveWeakRefs:0,clearedWeakRefs:0,finalizationRegistries:0,registriesWithPending:0,weakRefs:[],registries:[],summary:`WeakRef inspection failed`}}finally{s&&await o.detach().catch(()=>void 0)}}export{r as handleWeakRefsInspect};
@@ -0,0 +1,6 @@
1
+ import{t as e}from"./DetailedDataManager-Dgh402Gp.mjs";import{c as t,i as n,n as r}from"./parse-args-B6dwWc9k.mjs";import{r as i}from"./ResponseBuilder-BLicSCjn.mjs";import"./definitions-CbqeW06u.mjs";import{createHash as a}from"node:crypto";import{setTimeout as o}from"node:timers/promises";var s=class{locks=new Map;async withLock(e,t){for(;this.locks.has(e);)await this.locks.get(e);let n,r=new Promise(e=>{n=e});this.locks.set(e,r);try{return await t()}finally{this.locks.delete(e),n&&n()}}isLocked(e){return this.locks.has(e)}getActiveLockCount(){return this.locks.size}clearAll(){this.locks.clear()}};let c;function l(){return c||=new s,c}async function u(e){let t=await e.createCDPSession();try{await t.send(`Memory.getDOMCounters`);let n=(await t.send(`Performance.getMetrics`)).metrics.find(e=>e.name===`GPUMemoryUsedKB`),r=n?n.value*1024:0,i=!!n;await d(e);let a=await e.evaluate(()=>{let e=window.webgpuHookState;if(!e)return[];let t={1:`MAP_READ`,2:`MAP_WRITE`,4:`COPY_SRC`,8:`COPY_DST`,16:`INDEX`,32:`VERTEX`,64:`UNIFORM`,128:`STORAGE`,256:`INDIRECT`,512:`QUERY_RESOLVE`};function n(e){let n=[];for(let[r,i]of Object.entries(t))e&Number(r)&&n.push(i);return n.length>0?n.join(` | `):String(e)}let r=[];for(let t of e.allocations)t.ref.deref()&&r.push({size:t.size,usage:t.type===`buffer`?n(t.usage):`textureUsage:${t.usage}`,label:t.label,type:t.type,alive:!0});return r}),o=a.reduce((e,t)=>e+t.size,0),s,c;return i?(s=r,c=`cdp`):o>0?(s=o,c=`tracked`):(s=0,c=`estimated`),{heapSize:Math.max((c===`tracked`?o:s)*2,256*1024*1024),usedHeapSize:s,allocations:a,memorySource:c,trackedBytes:o}}finally{await t.detach()}}async function d(e){await e.evaluateOnNewDocument(()=>{if(window.webgpuHookState!==void 0)return;let e={originalSubmit:GPUQueue.prototype.submit,originalCreateCommandEncoder:GPUDevice.prototype.createCommandEncoder,hooksInstalled:!1,commandTrace:null,allocations:[]};if(window.webgpuHookState=e,typeof GPUDevice>`u`)return;let t=GPUDevice.prototype.createBuffer;GPUDevice.prototype.createBuffer=function(n){let r=t.call(this,n);return e.allocations.push({size:n.size??0,usage:n.usage??0,label:n.label,type:`buffer`,ref:new WeakRef(r)}),r};let n=GPUDevice.prototype.createTexture;GPUDevice.prototype.createTexture=function(t){let r=n.call(this,t),i=Array.isArray(t.size)?t.size.reduce((e,t)=>e*t,1):typeof t.size==`number`?t.size:0;return e.allocations.push({size:i,usage:t.usage??0,label:t.label,type:`texture`,ref:new WeakRef(r)}),r}})}function f(){if(window.webgpuHookState!==void 0)return;let e={originalSubmit:GPUQueue.prototype.submit,originalCreateCommandEncoder:GPUDevice.prototype.createCommandEncoder,hooksInstalled:!1,commandTrace:null,allocations:[]};window.webgpuHookState=e}async function p(e){await e.evaluateOnNewDocument(f),await e.evaluate(f)}async function m(e,t){return await p(e),await e.evaluate(e=>{let t=window.webgpuHookState;if(t.commandTrace={commands:[],totalSubmissions:0,startTime:performance.now()},t.hooksInstalled)return;t.originalCreateCommandEncoder||=GPUDevice.prototype.createCommandEncoder,t.originalSubmit||=GPUQueue.prototype.submit;function n(n,r){let i=0,a,o=!1,s=!1,c=[],l=[];for(let e of[`draw`,`drawIndexed`,`drawIndirect`,`drawIndexedIndirect`]){let t=n[e];typeof t==`function`&&(n[e]=function(...e){return i++,t.apply(this,e)})}let u=n.setPipeline;typeof u==`function`&&(n.setPipeline=function(e){return a=e?.label,o=!0,u.call(this,e)});let d=n.setVertexBuffer;typeof d==`function`&&(n.setVertexBuffer=function(e,...t){return c.push(e),d.apply(this,[e,...t])});let f=n.setBindGroup;typeof f==`function`&&(n.setBindGroup=function(e,...t){return l.push(e),f.apply(this,[e,...t])});let p=n.setIndexBuffer;typeof p==`function`&&(n.setIndexBuffer=function(...e){return s=!0,p.apply(this,e)});let m=n.end;return n.end=function(){let n=t.commandTrace;return n&&n.commands.length<e&&i>0&&n.commands.push({type:`render`,drawCalls:i,pipelineLabel:a,passLabel:r,timestamp:performance.now(),pipelineSet:o,vertexBuffers:c.slice(),bindGroups:l.slice(),indexBufferSet:s}),m.call(this)},n}function r(n,r){let i=0,a=0,o=0,s,c=!1,l=[],u=n.dispatchWorkgroups;n.dispatchWorkgroups=function(e,t,n){return i=e,a=t??1,o=n??1,u.call(this,e,t,n)};let d=n.dispatchWorkgroupsIndirect;typeof d==`function`&&(n.dispatchWorkgroupsIndirect=function(...e){return i=-1,a=-1,o=-1,d.apply(this,e)});let f=n.setPipeline;typeof f==`function`&&(n.setPipeline=function(e){return s=e?.label,c=!0,f.call(this,e)});let p=n.setBindGroup;typeof p==`function`&&(n.setBindGroup=function(e,...t){return l.push(e),p.apply(this,[e,...t])});let m=n.end;return n.end=function(){let n=t.commandTrace;return n&&n.commands.length<e&&i>0&&n.commands.push({type:`compute`,dispatches:{x:i,y:a,z:o},pipelineLabel:s,passLabel:r,timestamp:performance.now(),pipelineSet:c,bindGroups:l.slice()}),m.call(this)},n}function i(n,r){let i=0;for(let e of[`copyBufferToBuffer`,`copyBufferToTexture`,`copyTextureToBuffer`,`copyTextureToTexture`]){let t=n[e];typeof t==`function`&&(n[e]=function(...e){return i++,t.apply(this,e)})}let a=n.finish;return n.finish=function(){let n=t.commandTrace;return n&&n.commands.length<e&&i>0&&n.commands.push({type:`copy`,drawCalls:i,pipelineLabel:void 0,passLabel:r,timestamp:performance.now()}),a.call(this)},n}GPUDevice.prototype.createCommandEncoder=function(e){let a=t.originalCreateCommandEncoder.call(this,e),o=e?.label,s=a.beginRenderPass;a.beginRenderPass=function(e){return n(s.call(this,e),e?.label??o)};let c=a.beginComputePass;return a.beginComputePass=function(e){return r(c.call(this,e),e?.label??o)},i(a,o)},GPUQueue.prototype.submit=function(e){let n=t.commandTrace;return n&&(n.totalSubmissions+=1),t.originalSubmit.call(this,e)},t.hooksInstalled=!0},t),async()=>{await h(e)}}async function h(e){await e.evaluate(()=>{let e=window.webgpuHookState;!e||!e.hooksInstalled||(GPUQueue.prototype.submit=e.originalSubmit,GPUDevice.prototype.createCommandEncoder=e.originalCreateCommandEncoder,e.commandTrace=null,e.hooksInstalled=!1)})}async function g(e){return await e.evaluate(()=>{let e=window.webgpuHookState?.commandTrace;return e?{commands:e.commands,totalSubmissions:e.totalSubmissions,captureStartTime:e.startTime,captureEndTime:performance.now()}:null})||{commands:[],totalSubmissions:0,captureStartTime:0,captureEndTime:0}}function _(e){let t=[];for(let n=0;n<e.commands.length;n++){let r=e.commands[n],i=e.commands[n+1],a=i?i.timestamp-r.timestamp:0,o=`render`;a>50?o=`compute`:a<5&&(o=`copy`),t.push({command:r,inferredType:o})}return{...e,inferredTypes:t}}async function v(e,t){let n=t?.powerPreference??`none`;return await e.evaluate(async e=>{let t=navigator.gpu;if(!t)throw Error(`WebGPU not available: navigator.gpu is undefined.`);let n=window,r=n.__webgpuDeviceCache;if(r&&!r.lost&&r.adapter&&r.device)return{adapter:r.adapter,device:r.device,fresh:!1,adapterInfo:r.adapterInfo};n.__webgpuDeviceCache=void 0;let i=e===`none`?{}:{powerPreference:e},a=await t.requestAdapter(i);if(!a)throw Error(`No suitable GPUAdapter available.`);let o=await a.requestDevice(),s=a.info??(typeof a.requestAdapterInfo==`function`?await a.requestAdapterInfo():{}),c={vendor:String(s?.vendor??``),architecture:String(s?.architecture??``),device:String(s?.device??``),description:String(s?.description??``)},l={adapter:a,device:o,adapterInfo:c,lost:!1};return o&&typeof o.lost==`object`&&o.lost!==null&&o.lost.then(()=>{l.lost=!0,l.adapter=null,l.device=null}),n.__webgpuDeviceCache=l,{adapter:a,device:o,fresh:!0,adapterInfo:c}},n)}var y=class{deps;pageLockManager=l();constructor(e,t){this.deps=t}async handle(e){return i(async()=>{let e=await this.getActivePage();if(!e)throw Error(`No active page. Call browser_launch or browser_attach first.`);let t=e.url();return await this.pageLockManager.withLock(t,async()=>({adapter:(await v(e)).adapterInfo}))})}async getActivePage(){if(!this.deps.pageController)return null;try{return await this.deps.pageController.getActivePage()}catch{return null}}},b=class{cache=new Map;ttl;constructor(e=1800*1e3){this.ttl=e}get(e){let t=this.hashCode(e),n=this.cache.get(t);return n?Date.now()-n.timestamp>this.ttl?(this.cache.delete(t),null):n.result:null}set(e,t){let n=this.hashCode(e);this.cache.set(n,{result:t,timestamp:Date.now(),hash:n})}has(e){return this.get(e)!==null}clear(){this.cache.clear()}prune(){let e=Date.now(),t=0;for(let[n,r]of this.cache.entries())e-r.timestamp>this.ttl&&(this.cache.delete(n),t++);return t}getStats(){let e=Array.from(this.cache.values()).map(e=>e.timestamp);return{size:this.cache.size,oldestEntry:e.length>0?Math.min(...e):null,newestEntry:e.length>0?Math.max(...e):null}}hashCode(e){return a(`sha256`).update(e,`utf8`).digest(`hex`)}};let x;function S(){return x||=new b,x}let C;function w(){return C||=new b,C}function T(e){let t=[],n=[],r=[],i=[],a={},o=[],s=new Set,c=e.matchAll(/@vertex\s+fn\s+(\w+)/g);for(let e of c){let n=e[1];n&&t.push({name:n,stage:`vertex`})}let l=e.matchAll(/@fragment\s+fn\s+(\w+)/g);for(let e of l){let n=e[1];n&&t.push({name:n,stage:`fragment`})}let u=e.matchAll(/@compute\s+(?:@workgroup_size\s*\([^)]*\)\s*)?fn\s+(\w+)/g);for(let e of u){let n=e[1];n&&t.push({name:n,stage:`compute`})}for(let t of e.matchAll(/struct\s+(\w+)\s*\{/g)){let n=t[1],a=t.index===void 0?-1:t.index+t[0].length;if(!n||a<0)continue;let c=ee(e,a);c.depthExceeded&&o.push(`struct "${n}" nesting exceeded 15 levels; fields may be incomplete`);let l=te(c.body,n,r,o,s);i.push({name:n,fields:l})}for(let t of e.matchAll(/@group\s*\(\s*(\d+)\s*\)\s*@binding\s*\(\s*(\d+)\s*\)[\s\S]*?\bvar(?:<[^>]*>)?\s+(\w+)\s*:\s*([^\n;]+)/g)){let e=t[1],r=t[2],i=t[3],o=t[4];if(e===void 0||r===void 0||i===void 0||o===void 0)continue;let s=Number(e),c=Number(r),l=o.trim();n.push({name:i,binding:c,group:s});let u=l.split(`<`)[0]?.split(`(`)[0]?.trim()??`unknown`;a[u]=(a[u]??0)+1}for(let t of e.matchAll(/@location\s*\(\s*(\d+)\s*\)\s*(\w+)\s*:/g)){let e=t[1],n=t[2];if(e===void 0||n===void 0)continue;let i=Number(e),a=`${i}:${n}`;s.has(a)||(s.add(a),r.push({location:i,name:n}))}return{entryPoints:t,uniforms:n,attributes:r,structs:i,bindingsByType:a,parseWarnings:o,format:`wgsl`}}function ee(e,t){let n=1,r=!1,i=t,a=null;for(;i<e.length&&n>0;){let o=e[i];if(a!==null){if(o===`\\`){i+=2;continue}o===a&&(a=null),i++;continue}if(o===`"`||o===`'`){a=o,i++;continue}if(o===`/`&&e[i+1]===`/`){for(;i<e.length&&e[i]!==`
2
+ `;)i++;continue}if(o===`/`&&e[i+1]===`*`){for(i+=2;i<e.length&&!(e[i]===`*`&&e[i+1]===`/`);)i++;i+=2;continue}if(o===`{`)n++,n>15&&(r=!0);else if(o===`}`&&(n--,n===0))return{body:e.slice(t,i),depthExceeded:r};i++}return{body:e.slice(t,i),depthExceeded:r||n>0}}function te(e,t,n,r,i){let a=[],o=D(e);for(let e of o){let o=E(e).trim();if(o===``)continue;let s=o.match(/^(?:@\w+(?:\([^)]*\))?\s)*(\w+)\s*:\s*(.+)$/);if(!s){r.push(`struct "${t}": could not parse field "${o.substring(0,40)}"`);continue}let c=s[1],l=s[2]?.trim();if(!c||!l)continue;a.push({name:c,type:l});let u=o.match(/@location\s*\(\s*(\d+)\s*\)/);if(u?.[1]){let e=Number(u[1]),t=`${e}:${c}`;i.has(t)||(i.add(t),n.push({location:e,name:c}))}}return a}function E(e){let t=``,n=0;for(;n<e.length;){if(e[n]===`/`&&e[n+1]===`/`){for(;n<e.length&&e[n]!==`
3
+ `;)n++;continue}if(e[n]===`/`&&e[n+1]===`*`){for(n+=2;n<e.length&&!(e[n]===`*`&&e[n+1]===`/`);)n++;n+=2;continue}t+=e[n],n++}return t}function D(e){let t=[],n=0,r=``,i=null;for(let a=0;a<e.length;a++){let o=e[a];if(i!==null){if(r+=o,o===`\\`){r+=e[a+1]??``,a++;continue}o===i&&(i=null);continue}if(o===`"`||o===`'`){i=o,r+=o;continue}o===`<`||o===`(`||o===`[`||o===`{`?n++:(o===`>`||o===`)`||o===`]`||o===`}`)&&(n=Math.max(0,n-1)),(o===`,`||o===`;`)&&n===0?(t.push(r),r=``):r+=o}return r.trim()!==``&&t.push(r),t}function O(e){let t=T(e),n=[];for(let t of e.matchAll(/\bfn\s+(\w+)/g)){let e=t[1];e&&n.push(e)}return{type:`Module`,functions:n,structs:t.structs,uniforms:t.uniforms,attributes:t.attributes,parseWarnings:t.parseWarnings}}const k=119734787;function A(e){if(e instanceof Uint8Array)return{bytes:e,format:`binary`};if(typeof e!=`string`)return{bytes:new Uint8Array,format:`invalid`};let t=e.trim();if(t.length===0)return{bytes:new Uint8Array,format:`invalid`};let n=(t.startsWith(`0x`)||t.startsWith(`0X`)?t.slice(2):t).replace(/[\s_]/g,``);if(n.length>0&&/^[0-9a-fA-F]+$/.test(n)&&n.length%2==0){let e=new Uint8Array(n.length/2);for(let t=0;t<e.length;t++)e[t]=Number.parseInt(n.slice(t*2,t*2+2),16);return{bytes:e,format:`hex`}}let r=t.replace(/\s/g,``);if(r.length>0&&r.length%4==0&&/^[A-Za-z0-9+/]+={0,2}$/.test(r)){let e=ne(r);if(e!==null)return{bytes:e,format:`base64`}}return{bytes:new Uint8Array,format:`invalid`}}function ne(e){let t=new Int8Array(128).fill(-1);for(let e=0;e<64;e++)t[`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`.charCodeAt(e)]=e;let n=e.replace(/=+$/g,``),r=[],i=0,a=0;for(let e=0;e<n.length;e++){let o=n.charCodeAt(e);if(o>=128)return null;let s=t[o]??-1;if(s<0)return null;i=i<<6|s,a+=6,a>=8&&(a-=8,r.push(i>>a&255))}return Uint8Array.from(r)}function j(e){let{bytes:t}=A(e);return t.length<4?!1:new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0)===k}function M(e){let t=[];if(e.length===0)return N(0,t,[`empty input`]);let n=e,r=e.length%4;if(r!==0&&(t.push(`input length ${e.length} is not a multiple of 4; truncating ${r} trailing byte(s)`),n=e.subarray(0,e.length-r)),n.length<20)return t.push(`input too short for a SPIR-V header (${n.length} bytes)`),N(0,t);let i=new DataView(n.buffer,n.byteOffset,n.byteLength),a=n.length>>>2,o=i.getUint32(0,!0),s=i.getUint32(4,!0),c=i.getUint32(8,!0),l=i.getUint32(12,!0);o!==k&&t.push(`invalid magic 0x${o.toString(16).padStart(8,`0`)} (expected 0x07230203)`);let u=s>>>16&65535,d=s>>>8&255,f=re(i,a,t);if(f.length===0)return{magic:o,versionMajor:u,versionMinor:d,generator:c,bound:l,entryPoints:[],bindings:[],locations:[],structs:[],warnings:t,instructions:[]};let p=new Map,m=new Map,h=new Map,g=new Map,_=new Map;for(let e of f)switch(e.opcode){case 19:if(e.words.length>=3){let t=e.words[1]??0,n=P(e.words,2);n!==null&&p.set(t,n)}break;case 20:if(e.words.length>=4){let t=e.words[1]??0,n=e.words[2]??0,r=P(e.words,3);r!==null&&m.set(`${t}:${n}`,r)}break;case 71:e.words.length>=3&&I(h,e.words[1]??0,e.words[2]??0,e.words,3);break;case 72:if(e.words.length>=4){let t=e.words[1]??0,n=e.words[2]??0,r=e.words[3]??0;I(g,`${t}:${n}`,r,e.words,4)}break;default:break}for(let e of f)ae(e,_);let v=[],y=[],b=[],x=new Set;for(let[e,t]of _)t.kind===`struct`&&x.add(e);let S=new Set;for(let e of f)if(e.opcode===15){if(e.words.length>=4){let t=e.words[1]??0,n=e.words[2]??0,r=P(e.words,3),i=ie(t);v.push({name:r??`<id:${n}>`,stage:i})}}else if(e.opcode===59&&e.words.length>=4){let t=e.words[1]??0,n=e.words[2]??0,r=e.words[3]??0,i=h.get(n);if((i?.binding!==void 0||i?.descriptorSet!==void 0)&&B(r)&&y.push({name:p.get(n)??`<id:${n}>`,group:i?.descriptorSet??0,binding:i?.binding??0,typeId:t}),i?.location!==void 0&&V(r)&&b.push({name:p.get(n)??`<id:${n}>`,location:i.location}),B(r)){let e=L(t,_);e!==null&&S.add(e)}}let C=new Set,w=[],T=e=>{if(C.has(e))return;let t=_.get(e);if(!t||t.kind!==`struct`||!t.memberTypeIds)return;C.add(e);let n=t.memberTypeIds.map((t,n)=>({name:m.get(`${e}:${n}`)??`field${n}`,type:R(t,_)}));w.push({name:p.get(e)??`<struct:${e}>`,fields:n})};for(let e of x){let t=h.get(e);(t?.block||t?.bufferBlock)&&T(e)}for(let e of S)T(e);if(w.length===0)for(let e of x)T(e);return{magic:o,versionMajor:u,versionMinor:d,generator:c,bound:l,entryPoints:v,bindings:y,locations:b,structs:w,warnings:t,instructions:f}}function N(e,t,n=[]){return{magic:e,versionMajor:0,versionMinor:0,generator:0,bound:0,entryPoints:[],bindings:[],locations:[],structs:[],warnings:[...t,...n]}}function re(e,t,n){let r=[],i=5;for(;i<t;){let a=e.getUint32(i*4,!0),o=a>>>16&65535,s=a&65535;if(o===0){n.push(`instruction at word ${i} has zero word count; stopping parse`);break}if(i+o>t){n.push(`instruction at word ${i} (opcode ${s}) declares ${o} words but only ${t-i} remain; stopping parse`);break}let c=[];for(let t=0;t<o;t++)c.push(e.getUint32((i+t)*4,!0));r.push({opcode:s,words:c,offset:i}),i+=o}return r}function P(e,t){if(t>=e.length)return null;let n=[];for(let r=t;r<e.length;r++){let t=e[r]??0,i=t&255,a=t>>>8&255,o=t>>>16&255,s=t>>>24&255;if(i===0||(n.push(i),a===0)||(n.push(a),o===0)||(n.push(o),s===0))return F(n);n.push(s)}return F(n)}function F(e){let t=``,n=0;for(;n<e.length;){let r=e[n++]??0;if(r<128)t+=String.fromCharCode(r);else if(r<192)continue;else if(r<224){let i=e[n++]??0;t+=String.fromCharCode((r&31)<<6|i&63)}else if(r<240){let i=e[n++]??0,a=e[n++]??0;t+=String.fromCharCode((r&15)<<12|(i&63)<<6|a&63)}else{let i=e[n++]??0,a=e[n++]??0,o=e[n++]??0,s=((r&7)<<18|(i&63)<<12|(a&63)<<6|o&63)-65536;t+=String.fromCharCode(55296|s>>10,56320|s&1023)}}return t}function ie(e){switch(e){case 0:return`vertex`;case 1:return`tess-control`;case 2:return`tess-eval`;case 3:return`geometry`;case 4:return`fragment`;case 5:return`gl-compute`;case 6:return`kernel`;case 5311:return`raygen`;case 5312:return`ray-miss`;case 5314:return`ray-hit`;case 5316:return`callable`;default:return`unknown`}}function I(e,t,n,r,i){let a=e.get(t);switch(a||(a={},e.set(t,a)),n){case 31:a.binding=r[i]??0;break;case 32:a.descriptorSet=r[i]??0;break;case 28:a.location=r[i]??0;break;case 1:a.block=!0;break;case 2:a.bufferBlock=!0;break;case 11:a.builtIn=r[i]??0;break;default:break}}function ae(e,t){let n=e.words,r=n[1]??0;if(r!==0)switch(e.opcode){case 17:t.set(r,{kind:`void`});break;case 18:t.set(r,{kind:`bool`});break;case 21:t.set(r,{kind:`int`,width:n[2]??32,signed:(n[3]??0)!==0});break;case 22:t.set(r,{kind:`float`,width:n[2]??32});break;case 23:t.set(r,{kind:`vector`,componentTypeId:n[2]??0,count:n[3]??0});break;case 24:t.set(r,{kind:`matrix`,componentTypeId:n[2]??0,count:n[3]??0});break;case 25:t.set(r,{kind:`image`});break;case 26:t.set(r,{kind:`sampler`});break;case 27:t.set(r,{kind:`sampled-image`});break;case 28:t.set(r,{kind:`array`,elementType:n[2]??0});break;case 29:t.set(r,{kind:`runtime-array`,elementType:n[2]??0});break;case 30:t.set(r,{kind:`struct`,memberTypeIds:n.slice(2)});break;case 32:t.set(r,{kind:`pointer`,storageClass:n[2]??0,elementType:n[3]??0});break;case 33:t.set(r,{kind:`function`});break;default:break}}function L(e,t){let n=t.get(e);if(!n)return null;if(n.kind===`pointer`){let e=n.elementType??0;if(t.get(e)?.kind===`struct`)return e}return n.kind===`struct`?e:null}function R(e,t){let n=t.get(e);if(!n)return`type<id:${e}>`;switch(n.kind){case`void`:return`void`;case`bool`:return`bool`;case`int`:{let e=n.width??32,t=n.signed??!0;return e===32?t?`i32`:`u32`:`${t?`i`:`u`}${e}`}case`float`:{let e=n.width??32;return e===32?`f32`:e===16?`f16`:`f${e}`}case`vector`:{let e=R(n.componentTypeId??0,t);return`vec${n.count??0}<${e}>`}case`matrix`:{let e=R(n.componentTypeId??0,t);return`mat${n.count??0}x${z(n.componentTypeId??0,t)}<${e}>`}case`image`:return`texture`;case`sampler`:return`sampler`;case`sampled-image`:return`sampled-texture`;case`array`:return`array<${R(n.elementType??0,t)}>`;case`runtime-array`:return`array<${R(n.elementType??0,t)}>`;case`struct`:return`struct`;case`pointer`:return`ptr<${R(n.elementType??0,t)}>`;case`function`:return`function`;default:return`type<id:${e}>`}}function z(e,t){let n=t.get(e);return n?.kind===`vector`?n.count??0:0}function B(e){return e===0||e===2||e===12}function V(e){return e===1||e===3}var H=class{deps;pageLockManager=l();compileCache=S();constructor(e,t){this.deps=t}async handle(e){return i(async()=>{let n=t(e,`shaderCode`);if(!n)throw Error(`Missing required argument: shaderCode`);let r=t(e,`format`,`wgsl`);if(r!==`wgsl`&&r!==`spirv`)throw Error(`Unsupported format: "${r}". Only "wgsl" and "spirv" are supported.`);let i=`${r}:${n}`,a=this.compileCache.get(i);if(a)return{...a,_cached:!0};if(r===`spirv`)return this.handleSpirv(n);let o=await this.getActivePage();if(!o)throw Error(`No active page. Call browser_launch or browser_attach first.`);let s=o.url(),c=await this.pageLockManager.withLock(s,async()=>(await v(o),await o.evaluate(async e=>{let t=window.__webgpuDeviceCache;if(!t||!t.device)throw Error(`WebGPU device cache unavailable. Call ensureDevice first.`);let n=t.device;try{return n.createShaderModule({code:e}),{compiled:!0}}catch(e){throw Error(`Shader compilation failed: ${e.message}`,{cause:e})}},n))),l=T(n),u={...c,metadata:l};return this.compileCache.set(i,u),u})}handleSpirv(e){let t=A(e);if(t.format===`invalid`)throw Error(`SPIR-V input could not be decoded. Provide a hex string (e.g. "07230203..."), a base64 string, or ensure the magic number 0x07230203 is present.`);if(!j(t.bytes))throw Error(`Input is not a valid SPIR-V binary: magic 0x07230203 not found at offset 0.`);let n=M(t.bytes),r={entryPoints:n.entryPoints.map(e=>({name:e.name,stage:e.stage===`vertex`?`vertex`:e.stage===`fragment`?`fragment`:`compute`})),uniforms:n.bindings.map(e=>({name:e.name,binding:e.binding,group:e.group})),attributes:n.locations.map(e=>({name:e.name,location:e.location})),structs:n.structs.map(e=>({name:e.name,fields:e.fields})),bindingsByType:{},parseWarnings:n.warnings,format:`spirv`};return{compiled:!1,compilationSkippedReason:`Browsers cannot compile SPIR-V directly (WebGPU accepts only WGSL). Use spirv-cross or spirv-tools to convert SPIR-V to WGSL for GPU-side compilation.`,reflected:!0,spirvInfo:{versionMajor:n.versionMajor,versionMinor:n.versionMinor,generator:n.generator,bound:n.bound},metadata:r}}async getActivePage(){if(!this.deps.pageController)return null;try{return await this.deps.pageController.getActivePage()}catch{return null}}},U=class{ctx;ddm;disassemblyCache=w();constructor(t,n){this.ctx=t,this.ddm=e.getInstance()}async handle(e){return i(async()=>{let n=t(e,`shaderCode`);if(!n)throw Error(`Missing required argument: shaderCode`);let r=t(e,`format`,`wgsl`);if(r!==`wgsl`&&r!==`spirv`)throw Error(`Unsupported format: "${r}". Only "wgsl" and "spirv" are supported.`);let i=`${r}:${n}`,a=this.disassemblyCache.get(i);if(a)return{...a,_cached:!0};let o=e._meta,s=o?t(o,`progressToken`):void 0;s&&n.length>1e4&&this.reportProgress(s,.1,`Parsing shader AST...`);let c;if(r===`spirv`)c=this.disassembleSpirv(n);else{let e=O(n);s&&n.length>1e4&&this.reportProgress(s,.5,`Generating disassembly...`),c={ast:e,disassembly:this.generateDisassembly(n)}}return s&&n.length>1e4&&this.reportProgress(s,1,`Disassembly complete`),this.disassemblyCache.set(i,c),this.ddm.smartHandle(c,25e3)})}disassembleSpirv(e){let t=A(e);if(t.format===`invalid`)throw Error(`SPIR-V input could not be decoded. Provide a hex string (e.g. "07230203..."), a base64 string, or raw bytes.`);if(!j(t.bytes))throw Error(`Input is not a valid SPIR-V binary: magic 0x07230203 not found.`);let n=M(t.bytes),r={type:`Module`,functions:n.entryPoints.map(e=>e.name),structs:n.structs.map(e=>({name:e.name,fields:e.fields})),uniforms:n.bindings.map(e=>({name:e.name,binding:e.binding,group:e.group})),attributes:n.locations.map(e=>({name:e.name,location:e.location})),parseWarnings:n.warnings},i=[];i.push(`; SPIR-V disassembly (reflection)`),i.push(`; version: ${n.versionMajor}.${n.versionMinor}`),i.push(`; generator: ${n.generator}`),i.push(`; bound: ${n.bound}`),i.push(``),i.push(`; Entry Points:`);for(let e of n.entryPoints)i.push(` ${e.stage}: ${e.name}`);i.push(``),i.push(`; Bindings:`);for(let e of n.bindings)i.push(` @group(${e.group}) @binding(${e.binding}) : ${e.name}`);i.push(``),i.push(`; Locations:`);for(let e of n.locations)i.push(` @location(${e.location}) : ${e.name}`);i.push(``),i.push(`; Structs:`);for(let e of n.structs){i.push(` struct ${e.name} {`);for(let t of e.fields)i.push(` ${t.name} : ${t.type}`);i.push(` }`)}if(n.warnings.length>0){i.push(``),i.push(`; Warnings:`);for(let e of n.warnings)i.push(` ; ${e}`)}return{ast:r,disassembly:i.join(`
4
+ `)}}generateDisassembly(e){return e.split(`
5
+ `).map((e,t)=>`${String(t+1).padStart(4,` `)} | ${e}`).join(`
6
+ `)}reportProgress(e,t,n){!e||!this.ctx.eventBus||this.ctx.eventBus.emit(`tool:progress`,{progressToken:e,progress:t,timestamp:new Date().toISOString()})}},W=class{deps;pageLockManager=l();constructor(e,t){this.deps=t}async handle(e){return i(async()=>{let i=n(e,`iterations`);if(!i||i<=0)throw Error(`Missing or invalid required argument: iterations (must be > 0)`);let a=r(e,`detectAnomalies`,!1),o=e._meta;o&&t(o,`progressToken`);let s=await this.getActivePage();if(!s)throw Error(`No active page. Call browser_launch or browser_attach first.`);let c=s.url();return await this.pageLockManager.withLock(c,async()=>(await v(s),await s.evaluate(async({_iterations:e,_detectAnomalies:t})=>{let n=window.__webgpuDeviceCache;if(!n||!n.device)throw Error(`WebGPU device cache unavailable. Call ensureDevice first.`);let r=n.device,i=[];for(let t=0;t<e;t++){let n=performance.now(),a=r.createBuffer({size:1024,usage:globalThis.GPUBufferUsage?.COPY_DST|globalThis.GPUBufferUsage?.MAP_READ||0});await r.queue.onSubmittedWorkDone();let o=performance.now();i.push(o-n),a.destroy();let s=window.webgpuProgressCallback;s&&t%Math.ceil(e/5)===0&&s(t/e)}let a=i.reduce((e,t)=>e+t,0)/i.length,o=i.reduce((e,t)=>e+(t-a)**2,0)/i.length,s=Math.sqrt(o),c={timings:i,mean:a,stddev:s,min:Math.min(...i),max:Math.max(...i)};return t&&(c.anomalies=i.map((e,t)=>({index:t,value:e,deviation:Math.abs(e-a)/s})).filter(e=>e.deviation>2)),c},{_iterations:i,_detectAnomalies:a})))})}async getActivePage(){if(!this.deps.pageController)return null;try{return await this.deps.pageController.getActivePage()}catch{return null}}},G=class{deps;pageLockManager=l();constructor(e,t){this.deps=t}async handle(e){return i(async()=>{let e=await this.getActivePage();if(!e)throw Error(`No active page. Call browser_launch or browser_attach first.`);let t=e.url();return await this.pageLockManager.withLock(t,async()=>{let t=await u(e);return{heapSize:t.heapSize,usedHeapSize:t.usedHeapSize,allocations:t.allocations,memorySource:t.memorySource,trackedBytes:t.trackedBytes}})})}async getActivePage(){if(!this.deps.pageController)return null;try{return await this.deps.pageController.getActivePage()}catch{return null}}},K=class{deps;ddm;pageLockManager=l();constructor(t,n){this.deps=n,this.ddm=e.getInstance()}async handle(e){return i(async()=>{let t=n(e,`captureCount`);if(!t||t<=0)throw Error(`Missing or invalid required argument: captureCount (must be > 0)`);let r=await this.getActivePage();if(!r)throw Error(`No active page. Call browser_launch or browser_attach first.`);let i=r.url();return await this.pageLockManager.withLock(i,async()=>{let e=await m(r,t);try{let e=_(await this.waitForCapturedCommands(r,t)),n={commands:e.commands,totalSubmissions:e.totalSubmissions,captureWindow:{start:e.captureStartTime,end:e.captureEndTime,duration:e.captureEndTime-e.captureStartTime},inferredTypes:e.inferredTypes};return this.ddm.smartHandle(n,25e3)}finally{await e()}})})}async getActivePage(){if(!this.deps.pageController)return null;try{return await this.deps.pageController.getActivePage()}catch{return null}}async waitForCapturedCommands(e,t){let n=Date.now()+5e3,r=await g(e);for(;!this.isCaptureComplete(r,t)&&Date.now()<n;){let t=n-Date.now();await o(Math.min(50,Math.max(t,0))),r=await g(e)}return r}isCaptureComplete(e,t){return e.commands.length>=t||e.totalSubmissions>=t}};function q(){let e=window;e.webgpuShaderHookState===void 0&&(e.webgpuShaderHookState={originalCreateShaderModule:null,installed:!1,shaders:[],totalCreated:0})}async function oe(e){await e.evaluateOnNewDocument(q),await e.evaluate(q)}async function se(e,t){return await oe(e),await e.evaluate(e=>{let t=window.webgpuShaderHookState;if(t.shaders=[],t.totalCreated=0,!t.installed){if(typeof GPUDevice>`u`||!GPUDevice.prototype.createShaderModule)throw Error(`WebGPU (GPUDevice.createShaderModule) is not available in this page`);t.originalCreateShaderModule=GPUDevice.prototype.createShaderModule,GPUDevice.prototype.createShaderModule=function(n){let r=t.originalCreateShaderModule.call(this,n);try{if(t.totalCreated+=1,t.shaders.length<e){let e={code:typeof n?.code==`string`?n.code:``,timestamp:performance.now()};typeof n?.label==`string`&&(e.label=n.label),r&&typeof r.getCompilationInfo==`function`&&r.getCompilationInfo().then(t=>{e.compilationInfo=t},()=>{}),t.shaders.push(e)}}catch{}return r},t.installed=!0}},t),async()=>{await ce(e)}}async function ce(e){await e.evaluate(()=>{let e=window.webgpuShaderHookState;!e||!e.installed||(e.originalCreateShaderModule&&(GPUDevice.prototype.createShaderModule=e.originalCreateShaderModule),e.installed=!1)})}async function J(e){return await e.evaluate(()=>{let e=window.webgpuShaderHookState;return e?{shaders:e.shaders,totalCreated:e.totalCreated}:null})||{shaders:[],totalCreated:0}}var le=class{deps;ddm;pageLockManager=l();constructor(t,n){this.deps=n,this.ddm=e.getInstance()}async handle(e){return i(async()=>{let t=n(e,`captureCount`,10);if(!t||t<=0)throw Error(`Missing or invalid argument: captureCount (must be > 0)`);let r=n(e,`timeoutMs`,5e3),i=await this.getActivePage();if(!i)throw Error(`No active page. Call browser_launch or browser_attach first.`);let a=i.url();return await this.pageLockManager.withLock(a,async()=>{let e=await se(i,t);try{let e=await this.waitForShaders(i,t,r),n={shaders:e.shaders,totalCreated:e.totalCreated,capturedCount:e.shaders.length,captureTimedOut:e.shaders.length<t};return this.ddm.smartHandle(n,25e3)}finally{await e()}})})}async getActivePage(){if(!this.deps.pageController)return null;try{return await this.deps.pageController.getActivePage()}catch{return null}}async waitForShaders(e,t,n){let r=Date.now()+n,i=await J(e);for(;i.shaders.length<t&&Date.now()<r;){let t=r-Date.now();await o(Math.min(50,Math.max(t,0))),i=await J(e)}return i}};function Y(){let e=window;e.webgpuErrorHookState===void 0&&(e.webgpuErrorHookState={installed:!1,errors:[],totalErrors:0,deviceLost:null,errorHandler:null,device:null,wrapped:[],lostRegistered:!1})}async function ue(e){await e.evaluateOnNewDocument(Y),await e.evaluate(Y)}async function de(e,t){return await ue(e),await e.evaluate(async e=>{let t=window,n=t.webgpuErrorHookState;if(n.errors=[],n.totalErrors=0,n.deviceLost=null,n.installed)return;let r=t.__webgpuDeviceCache?.device??null;if(!r){if(typeof navigator>`u`||!navigator.gpu)throw Error(`WebGPU (navigator.gpu) is not available in this page`);let e=await navigator.gpu.requestAdapter();if(!e)throw Error(`No GPU adapter available`);r=await e.requestDevice(),t.__webgpuDeviceCache=t.__webgpuDeviceCache||{},t.__webgpuDeviceCache.device=r}n.device=r;let i=t=>{try{if(n.totalErrors+=1,n.errors.length<e.captureCount){let e=t?.error??{};n.errors.push({type:typeof e.type==`string`?e.type:`unknown`,message:typeof e.message==`string`?e.message:``,timestamp:performance.now()})}}catch{}};if(n.errorHandler=i,r.addEventListener(`uncapturederror`,i),n.lostRegistered||=(r.lost.then(e=>{n.deviceLost={reason:typeof e?.reason==`string`?e.reason:`unknown`,message:typeof e?.message==`string`?e.message:``}},()=>{}),!0),e.wrapAllocations){let t=GPUDevice.prototype,r=r=>{let i=t[r];t[r]=function(t){try{this.pushErrorScope(`validation`);let a=i.call(this,t);return this.popErrorScope().then(i=>{i&&n.errors.length<e.captureCount&&n.errors.push({type:typeof i.type==`string`?i.type:`validation`,message:typeof i.message==`string`?i.message:``,source:r,label:typeof t?.label==`string`?t.label:void 0,timestamp:performance.now()})},()=>{}),a}catch{return i.call(this,t)}},n.wrapped.push({name:r,orig:i})};r(`createBuffer`),r(`createTexture`)}n.installed=!0},t),async()=>{await fe(e)}}async function fe(e){await e.evaluate(()=>{let e=window.webgpuErrorHookState;if(!(!e||!e.installed)){if(e.device&&e.errorHandler)try{e.device.removeEventListener(`uncapturederror`,e.errorHandler)}catch{}if(Array.isArray(e.wrapped)){let t=GPUDevice.prototype;for(let n of e.wrapped)try{t[n.name]=n.orig}catch{}}e.installed=!1}})}async function X(e){return await e.evaluate(()=>{let e=window.webgpuErrorHookState;return e?{errors:e.errors,deviceLost:e.deviceLost,totalErrors:e.totalErrors}:null})||{errors:[],deviceLost:null,totalErrors:0}}var pe=class{deps;ddm;pageLockManager=l();constructor(t,n){this.deps=n,this.ddm=e.getInstance()}async handle(e){return i(async()=>{let t=n(e,`captureCount`,10);if(!t||t<=0)throw Error(`Missing or invalid argument: captureCount (must be > 0)`);let i=n(e,`timeoutMs`,5e3),a=r(e,`wrapAllocations`,!1),o=await this.getActivePage();if(!o)throw Error(`No active page. Call browser_launch or browser_attach first.`);let s=o.url();return await this.pageLockManager.withLock(s,async()=>{let e=await de(o,{captureCount:t,wrapAllocations:a});try{let e=await this.waitForErrors(o,t,i),n={errors:e.errors,deviceLost:e.deviceLost,totalErrors:e.totalErrors,capturedCount:e.errors.length,captureTimedOut:e.errors.length<t,wrapAllocations:a};return this.ddm.smartHandle(n,25e3)}finally{await e()}})})}async getActivePage(){if(!this.deps.pageController)return null;try{return await this.deps.pageController.getActivePage()}catch{return null}}async waitForErrors(e,t,n){let r=Date.now()+n,i=await X(e);for(;i.errors.length<t&&Date.now()<r;){let t=r-Date.now();await o(Math.min(50,Math.max(t,0))),i=await X(e)}return i}};function Z(){let e=window;e.webgpuPipelineHookState===void 0&&(e.webgpuPipelineHookState={installed:!1,pipelines:[],totalCreated:0,wrapped:[]})}async function me(e){await e.evaluateOnNewDocument(Z),await e.evaluate(Z)}async function he(e,t){return await me(e),await e.evaluate(e=>{let t=window.webgpuPipelineHookState;if(t.pipelines=[],t.totalCreated=0,t.installed)return;if(typeof GPUDevice>`u`||!GPUDevice.prototype)throw Error(`WebGPU (GPUDevice.prototype) is not available in this page`);let n=(e,t=0)=>{if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(e=>n(e,t+1));if(t>8)return`<deep>`;let r=typeof e.constructor==`function`?e.constructor.name:``;if(r!==``&&r!==`Object`&&r!==`Array`)return{__gpu:r,label:typeof e.label==`string`?e.label:void 0};let i={};for(let r of Object.keys(e))i[r]=n(e[r],t+1);return i},r=GPUDevice.prototype,i=(i,a)=>{let o=r[i];typeof o==`function`&&(r[i]=function(r){try{if(t.totalCreated+=1,t.pipelines.length<e){let e={kind:a,method:i,descriptor:n(r),timestamp:performance.now()};typeof r?.label==`string`&&(e.label=r.label),t.pipelines.push(e)}}catch{}return o.apply(this,arguments)},t.wrapped.push({name:i,orig:o}))};i(`createRenderPipeline`,`render`),i(`createRenderPipelineAsync`,`render`),i(`createComputePipeline`,`compute`),i(`createComputePipelineAsync`,`compute`),i(`createBindGroupLayout`,`bind-group-layout`),t.installed=!0},t),async()=>{await ge(e)}}async function ge(e){await e.evaluate(()=>{let e=window.webgpuPipelineHookState;if(!e||!e.installed)return;let t=GPUDevice.prototype;if(Array.isArray(e.wrapped))for(let n of e.wrapped)try{t[n.name]=n.orig}catch{}e.installed=!1})}async function Q(e){return await e.evaluate(()=>{let e=window.webgpuPipelineHookState;return e?{pipelines:e.pipelines,totalCreated:e.totalCreated}:null})||{pipelines:[],totalCreated:0}}var $=class{deps;ddm;pageLockManager=l();constructor(t,n){this.deps=n,this.ddm=e.getInstance()}async handle(e){return i(async()=>{let t=n(e,`captureCount`,10);if(!t||t<=0)throw Error(`Missing or invalid argument: captureCount (must be > 0)`);let r=n(e,`timeoutMs`,5e3),i=await this.getActivePage();if(!i)throw Error(`No active page. Call browser_launch or browser_attach first.`);let a=i.url();return await this.pageLockManager.withLock(a,async()=>{let e=await he(i,t);try{let e=await this.waitForPipelines(i,t,r),n={pipelines:e.pipelines,totalCreated:e.totalCreated,capturedCount:e.pipelines.length,captureTimedOut:e.pipelines.length<t};return this.ddm.smartHandle(n,25e3)}finally{await e()}})})}async getActivePage(){if(!this.deps.pageController)return null;try{return await this.deps.pageController.getActivePage()}catch{return null}}async waitForPipelines(e,t,n){let r=Date.now()+n,i=await Q(e);for(;i.pipelines.length<t&&Date.now()<r;){let t=r-Date.now();await o(Math.min(50,Math.max(t,0))),i=await Q(e)}return i}},_e=class{adapterInfoHandler;shaderCompileHandler;shaderDisassembleHandler;timingAnalysisHandler;memoryLayoutHandler;commandCaptureHandler;shaderSourceCaptureHandler;errorCaptureHandler;pipelineDumpHandler;constructor(e,t){let n=t??{pageController:e.pageController};this.adapterInfoHandler=new y(e,n),this.shaderCompileHandler=new H(e,n),this.shaderDisassembleHandler=new U(e,n),this.timingAnalysisHandler=new W(e,n),this.memoryLayoutHandler=new G(e,n),this.commandCaptureHandler=new K(e,n),this.shaderSourceCaptureHandler=new le(e,n),this.errorCaptureHandler=new pe(e,n),this.pipelineDumpHandler=new $(e,n)}async webgpu_adapter_info(e){return this.adapterInfoHandler.handle(e)}async webgpu_shader_compile(e){return this.shaderCompileHandler.handle(e)}async webgpu_shader_disassemble(e){return this.shaderDisassembleHandler.handle(e)}async webgpu_timing_analysis(e){return this.timingAnalysisHandler.handle(e)}async webgpu_memory_layout(e){return this.memoryLayoutHandler.handle(e)}async webgpu_capture_commands(e){return this.commandCaptureHandler.handle(e)}async webgpu_shader_source_capture(e){return this.shaderSourceCaptureHandler.handle(e)}async webgpu_error_capture(e){return this.errorCaptureHandler.handle(e)}async webgpu_pipeline_dump(e){return this.pipelineDumpHandler.handle(e)}};export{_e as WebGPUHandlers};