@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
@@ -1,4 +1,487 @@
1
- import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw413PlW.mjs";function n(e){let t=e.maxDepth??20,n=e.onlyInteractive??!1;return`(function() {
1
+ import{t as e}from"./ToolError-g3rjWzhx.mjs";import{n as t}from"./response-R8ghbZSb.mjs";import{c as n,i as r,l as i,n as a,r as o}from"./parse-args-B6dwWc9k.mjs";import{r as s}from"./ResponseBuilder-BLicSCjn.mjs";import{r as c}from"./capabilities-DwzyxL2w.mjs";import"./definitions-CArdw_9T.mjs";function l(e){let t=e.maxDepth??20,n=e.onlyInteractive??!1;return`(function() {
2
+ function safeProp(obj, key, fallback) {
3
+ try { var v = obj[key]; return v === undefined || v === null ? fallback : v; } catch(e) { return fallback; }
4
+ }
5
+
6
+ function nodeId(node, idx) {
7
+ try {
8
+ if (node.uniqueId !== undefined && node.uniqueId !== null) return 'babylon_' + node.uniqueId;
9
+ } catch(e) {}
10
+ try {
11
+ if (node.id !== undefined && node.id !== null && node.id !== '') return 'babylon_id_' + node.id;
12
+ } catch(e) {}
13
+ var name = node.name || (node.constructor ? node.constructor.name : 'BabylonNode');
14
+ return String(name).replace(/\\s+/g, '_') + '_' + idx;
15
+ }
16
+
17
+ function getType(node) {
18
+ try {
19
+ var t = node.getClassName ? node.getClassName() : null;
20
+ if (t) return t;
21
+ } catch(e) {}
22
+ return node.constructor ? node.constructor.name : 'BabylonNode';
23
+ }
24
+
25
+ function getVec3(node, key) {
26
+ try {
27
+ var v = node[key];
28
+ if (v && typeof v.x === 'number') return { x: v.x, y: v.y, z: v.z };
29
+ } catch(e) {}
30
+ return null;
31
+ }
32
+
33
+ function getMaterialName(node) {
34
+ try {
35
+ var mat = node.material;
36
+ if (!mat) return undefined;
37
+ return mat.name || (mat.getClassName ? mat.getClassName() : (mat.constructor ? mat.constructor.name : 'Material'));
38
+ } catch(e) { return undefined; }
39
+ }
40
+
41
+ function getVertexCount(node) {
42
+ try {
43
+ var geom = node.geometry;
44
+ if (geom && geom.getVerticesData) {
45
+ var positions = geom.getVerticesData('position');
46
+ if (positions && positions.length > 0) return positions.length / 3;
47
+ }
48
+ // Fallback for older API: vertexCount stored on geometry
49
+ if (geom && typeof geom.vertexCount === 'number') return geom.vertexCount;
50
+ } catch(e) {}
51
+ return undefined;
52
+ }
53
+
54
+ function findScene() {
55
+ var BABYLON = window.BABYLON;
56
+ if (!BABYLON || !BABYLON.Engine) return null;
57
+
58
+ // Engine.Instances is the canonical registry
59
+ var instances = BABYLON.Engine.Instances;
60
+ if (instances && instances.length > 0) {
61
+ for (var i = instances.length - 1; i >= 0; i--) {
62
+ var engine = instances[i];
63
+ if (engine && engine.scenes && engine.scenes.length > 0) {
64
+ return engine.scenes[engine.scenes.length - 1];
65
+ }
66
+ }
67
+ }
68
+ // LastCreatedScene convenience (older API)
69
+ try {
70
+ var last = BABYLON.Engine.LastCreatedScene;
71
+ if (last) return last;
72
+ } catch(e) {}
73
+ return null;
74
+ }
75
+
76
+ var totalNodes = 0;
77
+
78
+ function makeNode(node, depth, path, typeOverride) {
79
+ if (!node || depth > ${t}) return null;
80
+ totalNodes++;
81
+
82
+ var visible = safeProp(node, 'isVisible', true);
83
+ if (visible === undefined || visible === null) visible = safeProp(node, 'enabled', true);
84
+ var enabled = safeProp(node, 'isEnabled', true);
85
+ var interactive = !!(safeProp(node, 'isPickable', true));
86
+
87
+ if (${e.onlyVisible??!1} && (visible === false || enabled === false)) return null;
88
+ if (${n} && !interactive) return null;
89
+
90
+ var name = safeProp(node, 'name', undefined);
91
+ var pos = getVec3(node, 'position') || { x: 0, y: 0, z: 0 };
92
+ var rot = getVec3(node, 'rotation') || { x: 0, y: 0, z: 0 };
93
+ var scaling = getVec3(node, 'scaling') || { x: 1, y: 1, z: 1 };
94
+
95
+ // Bounds approximation: Babylon meshes expose boundingInfo in world space
96
+ var wb = { x: pos.x, y: pos.y, width: Math.abs(scaling.x), height: Math.abs(scaling.y) };
97
+ try {
98
+ var bi = node.getBoundingInfo ? node.getBoundingInfo() : null;
99
+ if (bi && bi.boundingBox && bi.boundingBox.minimumWorld && bi.boundingBox.maximumWorld) {
100
+ var mn = bi.boundingBox.minimumWorld;
101
+ var mx = bi.boundingBox.maximumWorld;
102
+ wb.x = mn.x; wb.y = mn.y;
103
+ wb.width = Math.abs(mx.x - mn.x);
104
+ wb.height = Math.abs(mx.y - mn.y);
105
+ }
106
+ } catch(e) {}
107
+
108
+ var result = {
109
+ id: nodeId(node, 0),
110
+ type: typeOverride || getType(node),
111
+ name: name || undefined,
112
+ visible: !!(visible !== false && enabled !== false),
113
+ interactive: interactive,
114
+ alpha: safeProp(node, 'alpha', 1),
115
+ x: pos.x,
116
+ y: pos.y,
117
+ width: wb.width,
118
+ height: wb.height,
119
+ worldBounds: wb,
120
+ path: path || nodeId(node, 0),
121
+ customData: {
122
+ uniqueId: safeProp(node, 'uniqueId', undefined) || undefined,
123
+ posX: pos.x, posY: pos.y, posZ: pos.z,
124
+ rotX: rot.x, rotY: rot.y, rotZ: rot.z,
125
+ scaleX: scaling.x, scaleY: scaling.y, scaleZ: scaling.z,
126
+ materialName: getMaterialName(node),
127
+ vertexCount: getVertexCount(node),
128
+ isEnabled: enabled,
129
+ }
130
+ };
131
+
132
+ if (result.name === undefined) delete result.name;
133
+ if (result.customData.uniqueId === undefined) delete result.customData.uniqueId;
134
+ return result;
135
+ }
136
+
137
+ function traverseTransform(parent, parentPath, depthAcc) {
138
+ // Walk child transform nodes (Babylon's TransformNode hierarchy)
139
+ var children = null;
140
+ try {
141
+ var childTransforms = parent.getChildTransformNodes ? parent.getChildTransformNodes() : null;
142
+ if (childTransforms && childTransforms.length > 0) {
143
+ children = [];
144
+ for (var i = 0; i < childTransforms.length; i++) {
145
+ var ct = childTransforms[i];
146
+ if (!ct) continue;
147
+ var childPath = parentPath + '/' + nodeId(ct, i);
148
+ var node = makeNode(ct, depthAcc + 1, childPath, 'TransformNode');
149
+ if (node) {
150
+ var sub = traverseTransform(ct, childPath, depthAcc + 1);
151
+ if (sub && sub.length > 0) node.children = sub;
152
+ children.push(node);
153
+ }
154
+ }
155
+ }
156
+ } catch(e) {}
157
+ return children;
158
+ }
159
+
160
+ var BABYLON = window.BABYLON;
161
+ if (!BABYLON || !BABYLON.Engine) {
162
+ return {
163
+ engine: 'Babylon.js',
164
+ version: undefined,
165
+ canvas: { width: 0, height: 0, dpr: 1, contextType: 'unknown' },
166
+ sceneTree: null,
167
+ totalNodes: 0,
168
+ completeness: 'partial',
169
+ error: 'window.BABYLON or BABYLON.Engine is undefined'
170
+ };
171
+ }
172
+
173
+ var version = BABYLON.Engine.Version || BABYLON.Engine.EngineVersion || undefined;
174
+ var scene = findScene();
175
+
176
+ var canvasEl = document.querySelector('canvas');
177
+ var canvasInfo = {
178
+ width: canvasEl ? canvasEl.width : 0,
179
+ height: canvasEl ? canvasEl.height : 0,
180
+ dpr: window.devicePixelRatio || 1,
181
+ contextType: 'unknown'
182
+ };
183
+ if (canvasEl) {
184
+ var gl = canvasEl.getContext('webgl2') || canvasEl.getContext('webgl');
185
+ canvasInfo.contextType = gl ? (gl instanceof WebGL2RenderingContext ? 'webgl2' : 'webgl') : '2d';
186
+ }
187
+
188
+ if (!scene) {
189
+ return {
190
+ engine: 'Babylon.js',
191
+ version: version,
192
+ canvas: canvasInfo,
193
+ sceneTree: null,
194
+ totalNodes: 0,
195
+ completeness: 'partial',
196
+ error: 'No Babylon scene found in Engine.Instances or LastCreatedScene'
197
+ };
198
+ }
199
+
200
+ var sceneNode = makeNode(scene, 0, 'Babylon.Scene', 'Scene');
201
+ var sceneChildren = [];
202
+
203
+ // Meshes
204
+ var meshes = safeProp(scene, 'meshes', []);
205
+ if (Array.isArray(meshes)) {
206
+ for (var mi = 0; mi < meshes.length; mi++) {
207
+ var mesh = meshes[mi];
208
+ if (!mesh) continue;
209
+ var meshPath = 'Babylon.Scene/' + nodeId(mesh, mi);
210
+ var meshNode = makeNode(mesh, 1, meshPath, null);
211
+ if (meshNode) {
212
+ var meshKids = traverseTransform(mesh, meshPath, 1);
213
+ if (meshKids && meshKids.length > 0) meshNode.children = meshKids;
214
+ sceneChildren.push(meshNode);
215
+ }
216
+ }
217
+ }
218
+
219
+ // TransformNodes (root-level ones not parented to a mesh)
220
+ var tns = safeProp(scene, 'transformNodes', []);
221
+ if (Array.isArray(tns)) {
222
+ for (var ti = 0; ti < tns.length; ti++) {
223
+ var tn = tns[ti];
224
+ if (!tn) continue;
225
+ var tnPath = 'Babylon.Scene/' + nodeId(tn, ti);
226
+ var tnNode = makeNode(tn, 1, tnPath, 'TransformNode');
227
+ if (tnNode) sceneChildren.push(tnNode);
228
+ }
229
+ }
230
+
231
+ // Cameras
232
+ var cams = safeProp(scene, 'cameras', []);
233
+ if (Array.isArray(cams)) {
234
+ for (var ci = 0; ci < cams.length; ci++) {
235
+ var cam = cams[ci];
236
+ if (!cam) continue;
237
+ var camPath = 'Babylon.Scene/' + nodeId(cam, ci);
238
+ // typeOverride null → makeNode falls back to getClassName() which returns
239
+ // the specific camera subclass (ArcRotateCamera, FreeCamera, ...).
240
+ var camNode = makeNode(cam, 1, camPath, null);
241
+ if (camNode) sceneChildren.push(camNode);
242
+ }
243
+ }
244
+
245
+ // Lights
246
+ var lts = safeProp(scene, 'lights', []);
247
+ if (Array.isArray(lts)) {
248
+ for (var li = 0; li < lts.length; li++) {
249
+ var light = lts[li];
250
+ if (!light) continue;
251
+ var lightPath = 'Babylon.Scene/' + nodeId(light, li);
252
+ // typeOverride null → makeNode falls back to getClassName() which returns
253
+ // the specific light subclass (HemisphericLight, DirectionalLight, ...).
254
+ var lightNode = makeNode(light, 1, lightPath, null);
255
+ if (lightNode) sceneChildren.push(lightNode);
256
+ }
257
+ }
258
+
259
+ if (sceneNode) {
260
+ if (sceneChildren.length > 0) sceneNode.children = sceneChildren;
261
+ } else if (sceneChildren.length > 0) {
262
+ sceneNode = sceneChildren[0];
263
+ }
264
+
265
+ return {
266
+ engine: 'Babylon.js',
267
+ version: version,
268
+ canvas: canvasInfo,
269
+ sceneTree: sceneNode,
270
+ totalNodes: totalNodes,
271
+ completeness: sceneNode ? 'full' : 'partial'
272
+ };
273
+ })()`}function u(e){let t=e.x,n=e.y,r=e.canvasId;return`(function() {
274
+ function safeProp(obj, key, fallback) {
275
+ try { var v = obj[key]; return v === undefined || v === null ? fallback : v; } catch(e) { return fallback; }
276
+ }
277
+
278
+ function nodeId(node, idx) {
279
+ try {
280
+ if (node.uniqueId !== undefined && node.uniqueId !== null) return 'babylon_' + node.uniqueId;
281
+ } catch(e) {}
282
+ try {
283
+ if (node.id !== undefined && node.id !== null && node.id !== '') return 'babylon_id_' + node.id;
284
+ } catch(e) {}
285
+ var name = node.name || (node.constructor ? node.constructor.name : 'BabylonNode');
286
+ return String(name).replace(/\\s+/g, '_') + '_' + idx;
287
+ }
288
+
289
+ function getType(node) {
290
+ try {
291
+ var t = node.getClassName ? node.getClassName() : null;
292
+ if (t) return t;
293
+ } catch(e) {}
294
+ return node.constructor ? node.constructor.name : 'BabylonNode';
295
+ }
296
+
297
+ function findScene() {
298
+ var BABYLON = window.BABYLON;
299
+ if (!BABYLON || !BABYLON.Engine) return null;
300
+ var instances = BABYLON.Engine.Instances;
301
+ if (instances && instances.length > 0) {
302
+ for (var i = instances.length - 1; i >= 0; i--) {
303
+ var engine = instances[i];
304
+ if (engine && engine.scenes && engine.scenes.length > 0) {
305
+ return engine.scenes[engine.scenes.length - 1];
306
+ }
307
+ }
308
+ }
309
+ try {
310
+ var last = BABYLON.Engine.LastCreatedScene;
311
+ if (last) return last;
312
+ } catch(e) {}
313
+ return null;
314
+ }
315
+
316
+ var sx = ${t}, sy = ${n};
317
+
318
+ var canvases = Array.from(document.querySelectorAll('canvas'));
319
+ var targetCanvas = null;
320
+ ${r?`targetCanvas = document.getElementById(${JSON.stringify(r)}) || canvases[parseInt(${JSON.stringify(r)})] || null;`:`
321
+ for (var ci = canvases.length - 1; ci >= 0; ci--) {
322
+ var r = canvases[ci].getBoundingClientRect();
323
+ if (sx >= r.left && sx <= r.right && sy >= r.top && sy <= r.bottom) {
324
+ targetCanvas = canvases[ci];
325
+ break;
326
+ }
327
+ }`}
328
+
329
+ if (!window.BABYLON || !window.BABYLON.Engine) {
330
+ return { success: false, picked: null, candidates: [], coordinates: {
331
+ screen: { x: sx, y: sy }, canvas: { x: sx, y: sy } }, hitTestMethod: 'none' };
332
+ }
333
+
334
+ var scene = findScene();
335
+ if (!scene) {
336
+ return { success: false, picked: null, candidates: [], coordinates: {
337
+ screen: { x: sx, y: sy }, canvas: { x: sx, y: sy } }, hitTestMethod: 'none' };
338
+ }
339
+
340
+ var canvasX = sx, canvasY = sy;
341
+ if (targetCanvas) {
342
+ var rect = targetCanvas.getBoundingClientRect();
343
+ canvasX = (sx - rect.left) * (targetCanvas.width / rect.width);
344
+ canvasY = (sy - rect.top) * (targetCanvas.height / rect.height);
345
+ }
346
+
347
+ var candidates = [];
348
+ var hitTestMethod = 'none';
349
+ var enginePicked = null;
350
+
351
+ // Try scene.pick() — Babylon's native raycast
352
+ try {
353
+ if (typeof scene.pick === 'function') {
354
+ var pickInfo = scene.pick(canvasX, canvasY);
355
+ if (pickInfo && pickInfo.hit && pickInfo.pickedMesh) {
356
+ enginePicked = pickInfo.pickedMesh;
357
+ hitTestMethod = 'engine';
358
+ }
359
+ }
360
+ } catch(e) {}
361
+
362
+ // DFS fallback over meshes using boundingInfo
363
+ function meshBounds(mesh) {
364
+ var pos = mesh.position || { x: 0, y: 0 };
365
+ var scaling = mesh.scaling || { x: 1, y: 1 };
366
+ try {
367
+ var bi = mesh.getBoundingInfo ? mesh.getBoundingInfo() : null;
368
+ if (bi && bi.boundingBox && bi.boundingBox.minimumWorld && bi.boundingBox.maximumWorld) {
369
+ var mn = bi.boundingBox.minimumWorld;
370
+ var mx = bi.boundingBox.maximumWorld;
371
+ return { x: mn.x, y: mn.y, width: Math.abs(mx.x - mn.x), height: Math.abs(mx.y - mn.y) };
372
+ }
373
+ } catch(e) {}
374
+ return { x: pos.x, y: pos.y, width: Math.abs(scaling.x), height: Math.abs(scaling.y) };
375
+ }
376
+
377
+ function hitTestDfs(node, depth, accPath) {
378
+ if (!node) return;
379
+ var visible = safeProp(node, 'isVisible', true);
380
+ var enabled = safeProp(node, 'isEnabled', true);
381
+ if (visible === false || enabled === false) return;
382
+
383
+ var wb = meshBounds(node);
384
+ if (wb.width > 0 && wb.height > 0) {
385
+ var inBounds = canvasX >= wb.x && canvasX <= wb.x + wb.width &&
386
+ canvasY >= wb.y && canvasY <= wb.y + wb.height;
387
+ var interactive = !!(safeProp(node, 'isPickable', true));
388
+ if (inBounds && interactive) {
389
+ candidates.push({
390
+ node: {
391
+ id: nodeId(node, 0),
392
+ type: getType(node),
393
+ name: safeProp(node, 'name', undefined) || undefined,
394
+ visible: true,
395
+ interactive: true,
396
+ alpha: safeProp(node, 'alpha', 1),
397
+ x: wb.x, y: wb.y,
398
+ width: wb.width, height: wb.height,
399
+ worldBounds: wb,
400
+ path: accPath || nodeId(node, 0)
401
+ },
402
+ depth: depth
403
+ });
404
+ }
405
+ }
406
+
407
+ // Recurse into child meshes (Babylon meshes can have child meshes / transform nodes)
408
+ try {
409
+ var kids = node.getChildMeshes ? node.getChildMeshes(false) : null;
410
+ if (kids && Array.isArray(kids)) {
411
+ for (var i = 0; i < kids.length; i++) {
412
+ var cm = kids[i];
413
+ if (!cm) continue;
414
+ var childPath = accPath ? accPath + '/' + nodeId(cm, i) : nodeId(cm, i);
415
+ hitTestDfs(cm, depth + 1, childPath);
416
+ }
417
+ }
418
+ } catch(e) {}
419
+ }
420
+
421
+ // Walk top-level meshes
422
+ var meshes = safeProp(scene, 'meshes', []);
423
+ if (Array.isArray(meshes)) {
424
+ for (var mi = 0; mi < meshes.length; mi++) {
425
+ var mesh = meshes[mi];
426
+ if (!mesh) continue;
427
+ // Skip meshes that have a parent — they'll be reached via DFS
428
+ if (mesh.parent) continue;
429
+ var meshPath = 'Babylon.Scene/' + nodeId(mesh, mi);
430
+ hitTestDfs(mesh, 1, meshPath);
431
+ }
432
+ }
433
+
434
+ var picked = enginePicked ? {
435
+ id: nodeId(enginePicked, 0),
436
+ type: getType(enginePicked),
437
+ name: safeProp(enginePicked, 'name', undefined) || undefined,
438
+ visible: !!(safeProp(enginePicked, 'isVisible', true)),
439
+ interactive: !!(safeProp(enginePicked, 'isPickable', true)),
440
+ alpha: safeProp(enginePicked, 'alpha', 1),
441
+ x: meshBounds(enginePicked).x,
442
+ y: meshBounds(enginePicked).y,
443
+ width: meshBounds(enginePicked).width,
444
+ height: meshBounds(enginePicked).height,
445
+ worldBounds: meshBounds(enginePicked),
446
+ path: 'Babylon.Scene/pick/' + nodeId(enginePicked, 0)
447
+ } : null;
448
+
449
+ if (!picked && candidates.length > 0) {
450
+ candidates.sort(function(a, b) { return a.depth - b.depth; });
451
+ picked = candidates[0].node;
452
+ hitTestMethod = 'manual';
453
+ }
454
+
455
+ return {
456
+ success: !!picked,
457
+ picked: picked,
458
+ candidates: candidates,
459
+ coordinates: {
460
+ screen: { x: sx, y: sy },
461
+ canvas: { x: canvasX, y: canvasY }
462
+ },
463
+ hitTestMethod: hitTestMethod
464
+ };
465
+ })()`}var d=class{id=`babylon`;engine=`Babylon.js`;version;constructor(){this.version=void 0}async detect(e){try{let t=await e.pageController.evaluate(`
466
+ (function() {
467
+ var BABYLON = window.BABYLON;
468
+ if (!BABYLON || !BABYLON.Engine) return { present: false, hasScene: false };
469
+ var version = BABYLON.Engine.Version || BABYLON.Engine.EngineVersion || undefined;
470
+ var hasScene = false;
471
+ var instances = BABYLON.Engine.Instances;
472
+ if (instances && instances.length > 0) {
473
+ for (var i = 0; i < instances.length; i++) {
474
+ if (instances[i] && instances[i].scenes && instances[i].scenes.length > 0) {
475
+ hasScene = true; break;
476
+ }
477
+ }
478
+ }
479
+ if (!hasScene) {
480
+ try { if (BABYLON.Engine.LastCreatedScene) hasScene = true; } catch(e) {}
481
+ }
482
+ return { present: true, version: version, hasScene: hasScene };
483
+ })()
484
+ `);if(!t.present)return null;let n=[`window.BABYLON detected`,`BABYLON.Engine present`];return t.version&&n.push(`Babylon version: `+t.version),t.hasScene?n.push(`Scene reachable via Engine.Instances / LastCreatedScene`):n.push(`No active scene found in Engine.Instances`),{engine:this.engine,version:t.version,confidence:t.hasScene?.95:.9,evidence:n,adapterId:this.id}}catch{return null}}async dumpScene(e,t){let n=l(t),r=await e.pageController.evaluate(n);return{engine:r.engine,version:r.version,canvas:r.canvas,sceneTree:r.sceneTree??{id:`empty`,type:`Scene`,visible:!0,interactive:!1,alpha:1,x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0,worldBounds:{x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0},path:`Babylon.Scene`},totalNodes:r.totalNodes,completeness:r.completeness===`full`?`full`:`partial`}}async pickAt(e,t){let n=u(t),r=await e.pageController.evaluate(n);return{success:r.success,picked:r.picked,candidates:r.candidates,coordinates:r.coordinates,hitTestMethod:r.hitTestMethod}}};function f(e){let t=e.maxDepth??20,n=e.onlyInteractive??!1;return`(function() {
2
485
  function getChildren(node) {
3
486
  if (!node) return [];
4
487
  // v3 uses node.children, v2 uses node._children
@@ -294,7 +777,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
294
777
  completeness: sceneTree ? 'full' : 'partial',
295
778
  _meta: { isV3: isV3 }
296
779
  };
297
- })()`}function r(e){let t=e.x,n=e.y,r=e.canvasId;return`(function() {
780
+ })()`}function p(e){let t=e.x,n=e.y,r=e.canvasId;return`(function() {
298
781
  function getChildren(node) {
299
782
  if (!node) return [];
300
783
  if (node.children && Array.isArray(node.children)) return node.children;
@@ -581,7 +1064,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
581
1064
  },
582
1065
  hitTestMethod: finalMethod
583
1066
  };
584
- })()`}var i=class{id=`cocos`;engine=`CocosCreator`;version;constructor(){this.version=void 0}async detect(e){try{let t=await e.pageController.evaluate(`
1067
+ })()`}var m=class{id=`cocos`;engine=`CocosCreator`;version;constructor(){this.version=void 0}async detect(e){try{let t=await e.pageController.evaluate(`
585
1068
  (function() {
586
1069
  if (typeof window.cc === 'undefined' || window.cc === null) {
587
1070
  return { present: false, hasDirector: false };
@@ -598,7 +1081,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
598
1081
  versionMajor: major
599
1082
  };
600
1083
  })()
601
- `);if(!t.present||!t.hasDirector)return null;let n=[`window.cc detected`,`cc.director present`];return t.versionMajor===2?n.push(`Cocos Creator v2 API`):t.versionMajor===3&&n.push(`Cocos Creator v3 API`),{engine:this.engine,version:t.version,confidence:.95,evidence:n,adapterId:this.id}}catch{return null}}async dumpScene(e,t){let r=n(t),i=await e.pageController.evaluate(r);return{engine:i.engine,version:i.version,canvas:i.canvas,sceneTree:i.sceneTree??{id:`empty`,type:`Scene`,visible:!0,interactive:!1,alpha:1,x:0,y:0,width:i.canvas?.width??0,height:i.canvas?.height??0,worldBounds:{x:0,y:0,width:i.canvas?.width??0,height:i.canvas?.height??0},path:`cc.director.getScene()`},totalNodes:i.totalNodes,completeness:i.completeness===`full`?`full`:`partial`}}async pickAt(e,t){let n=r(t),i=await e.pageController.evaluate(n);return{success:i.success,picked:i.picked,candidates:i.candidates,coordinates:i.coordinates,hitTestMethod:i.hitTestMethod}}};function a(e){let t=e.maxDepth??20,n=e.onlyInteractive??!1;return`(function() {
1084
+ `);if(!t.present||!t.hasDirector)return null;let n=[`window.cc detected`,`cc.director present`];return t.versionMajor===2?n.push(`Cocos Creator v2 API`):t.versionMajor===3&&n.push(`Cocos Creator v3 API`),{engine:this.engine,version:t.version,confidence:.95,evidence:n,adapterId:this.id}}catch{return null}}async dumpScene(e,t){let n=f(t),r=await e.pageController.evaluate(n);return{engine:r.engine,version:r.version,canvas:r.canvas,sceneTree:r.sceneTree??{id:`empty`,type:`Scene`,visible:!0,interactive:!1,alpha:1,x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0,worldBounds:{x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0},path:`cc.director.getScene()`},totalNodes:r.totalNodes,completeness:r.completeness===`full`?`full`:`partial`}}async pickAt(e,t){let n=p(t),r=await e.pageController.evaluate(n);return{success:r.success,picked:r.picked,candidates:r.candidates,coordinates:r.coordinates,hitTestMethod:r.hitTestMethod}}};function h(e){let t=e.maxDepth??20,n=e.onlyInteractive??!1;return`(function() {
602
1085
  function getChildren(node) {
603
1086
  if (!node) return [];
604
1087
  if (node.children && node.numChildren !== undefined) return node.children;
@@ -731,7 +1214,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
731
1214
  completeness: 'full',
732
1215
  _meta: { isLaya3: isLaya3, scaleX: scaleX, scaleY: scaleY }
733
1216
  };
734
- })()`}function o(e){let t=e.x,n=e.y,r=e.canvasId;return`(function() {
1217
+ })()`}function g(e){let t=e.x,n=e.y,r=e.canvasId;return`(function() {
735
1218
  function getChildren(node) {
736
1219
  if (!node) return [];
737
1220
  if (node.children && node.numChildren !== undefined) return node.children;
@@ -918,7 +1401,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
918
1401
  },
919
1402
  hitTestMethod: finalMethod
920
1403
  };
921
- })()`}var s=class{id=`laya`;engine=`LayaAir`;version;constructor(){this.version=void 0}async detect(e){try{let t=await e.pageController.evaluate(`
1404
+ })()`}var ee=class{id=`laya`;engine=`LayaAir`;version;constructor(){this.version=void 0}async detect(e){try{let t=await e.pageController.evaluate(`
922
1405
  (function() {
923
1406
  if (typeof window.Laya === 'undefined' || window.Laya === null) {
924
1407
  return { present: false, hasStage: false, laya2: false, laya3: false };
@@ -931,7 +1414,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
931
1414
  return { present: true, hasStage: hasStage, version: version,
932
1415
  laya2: laya2, laya3: laya3 };
933
1416
  })()
934
- `);if(!t.present||!t.hasStage)return null;let n=[`window.Laya is defined`];return t.laya2&&n.push(`Laya.MouseManager detected (LayaAir 2.x)`),t.laya3&&n.push(`Laya.InputManager detected (LayaAir 3.x)`),n.push(`Laya.stage is present`),{engine:this.engine,version:t.version,confidence:.95,evidence:n,adapterId:this.id}}catch{return null}}async dumpScene(e,t){let n=a(t),r=await e.pageController.evaluate(n);return{engine:r.engine,version:r.version,canvas:r.canvas,sceneTree:r.sceneTree??{id:`empty`,type:`Stage`,visible:!0,interactive:!1,alpha:1,x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0,worldBounds:{x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0},path:`Laya.stage`},totalNodes:r.totalNodes,completeness:r.completeness===`full`?`full`:`partial`}}async pickAt(e,t){let n=o(t),r=await e.pageController.evaluate(n);return{success:r.success,picked:r.picked,candidates:r.candidates,coordinates:r.coordinates,hitTestMethod:r.hitTestMethod}}async traceClick(e,t,n){let{debuggerManager:r,traceRecorder:i,evidenceStore:a}=n,o=`no-recording`;try{o=(await i.start(null,null,{recordMemoryDeltas:!1})).sessionId}catch{}await r.enable(),await r.ensureAdvancedFeatures();let s=await e.pageController.evaluate(`
1417
+ `);if(!t.present||!t.hasStage)return null;let n=[`window.Laya is defined`];return t.laya2&&n.push(`Laya.MouseManager detected (LayaAir 2.x)`),t.laya3&&n.push(`Laya.InputManager detected (LayaAir 3.x)`),n.push(`Laya.stage is present`),{engine:this.engine,version:t.version,confidence:.95,evidence:n,adapterId:this.id}}catch{return null}}async dumpScene(e,t){let n=h(t),r=await e.pageController.evaluate(n);return{engine:r.engine,version:r.version,canvas:r.canvas,sceneTree:r.sceneTree??{id:`empty`,type:`Stage`,visible:!0,interactive:!1,alpha:1,x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0,worldBounds:{x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0},path:`Laya.stage`},totalNodes:r.totalNodes,completeness:r.completeness===`full`?`full`:`partial`}}async pickAt(e,t){let n=g(t),r=await e.pageController.evaluate(n);return{success:r.success,picked:r.picked,candidates:r.candidates,coordinates:r.coordinates,hitTestMethod:r.hitTestMethod}}async traceClick(e,t,n){let{debuggerManager:r,traceRecorder:i,evidenceStore:a}=n,o=`no-recording`;try{o=(await i.start(null,null,{recordMemoryDeltas:!1})).sessionId}catch{}await r.enable(),await r.ensureAdvancedFeatures();let s=await e.pageController.evaluate(`
935
1418
  (function() {
936
1419
  var k = Symbol.for('__laya_event_patched');
937
1420
  var instrumented = [];
@@ -980,7 +1463,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
980
1463
  events.push(${JSON.stringify(c)});
981
1464
  return events;
982
1465
  })()
983
- `),u=await r.waitForPaused(5e3),d=u?.callFrames?u.callFrames.slice(0,t.maxFrames??50).map(e=>({functionName:e.functionName||`(anonymous)`,scriptUrl:e.url,lineNumber:e.location?.lineNumber,columnNumber:e.location?.columnNumber})):[];await r.resume(),a.addNode(`function`,`laya-click-trace:${o}`,{engine:this.engine,version:this.version,handlersFound:d.length,instrumentedPrototypes:s?.instrumented??[]});try{await i.stop()}catch{}return{inputFlow:l,hitTarget:null,domEventChain:d.map(e=>({type:c,target:e.scriptUrl,phase:`at-target`})),engineDispatchChain:s?.instrumented??[],handlerFrames:d,handlersTriggered:d.map(e=>({functionName:e.functionName,scriptUrl:e.scriptUrl,lineNumber:e.lineNumber})),networkEmitted:[]}}};function c(e){let t=e.maxDepth??20,n=e.onlyInteractive??!1;return`(function() {
1466
+ `),u=await r.waitForPaused(5e3),d=u?.callFrames?u.callFrames.slice(0,t.maxFrames??50).map(e=>({functionName:e.functionName||`(anonymous)`,scriptUrl:e.url,lineNumber:e.location?.lineNumber,columnNumber:e.location?.columnNumber})):[];await r.resume(),a.addNode(`function`,`laya-click-trace:${o}`,{engine:this.engine,version:this.version,handlersFound:d.length,instrumentedPrototypes:s?.instrumented??[]});try{await i.stop()}catch{}return{inputFlow:l,hitTarget:null,domEventChain:d.map(e=>({type:c,target:e.scriptUrl,phase:`at-target`})),engineDispatchChain:s?.instrumented??[],handlerFrames:d,handlersTriggered:d.map(e=>({functionName:e.functionName,scriptUrl:e.scriptUrl,lineNumber:e.lineNumber})),networkEmitted:[]}}};function te(e){let t=e.maxDepth??20,n=e.onlyInteractive??!1;return`(function() {
984
1467
  function getChildren(node) {
985
1468
  if (!node) return [];
986
1469
  if (node.list && Array.isArray(node.list)) return node.list;
@@ -1127,7 +1610,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
1127
1610
  totalNodes: totalNodes,
1128
1611
  completeness: sceneTree ? 'full' : 'partial',
1129
1612
  };
1130
- })()`}function l(e){let t=e.x,n=e.y,r=e.canvasId;return`(function() {
1613
+ })()`}function ne(e){let t=e.x,n=e.y,r=e.canvasId;return`(function() {
1131
1614
  function getChildren(node) {
1132
1615
  if (!node) return [];
1133
1616
  if (node.list && Array.isArray(node.list)) return node.list;
@@ -1340,7 +1823,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
1340
1823
  },
1341
1824
  hitTestMethod: hitTestMethod
1342
1825
  };
1343
- })()`}var u=class{id=`phaser`;engine=`Phaser`;version;constructor(){this.version=void 0}async detect(e){try{let t=await e.pageController.evaluate(`
1826
+ })()`}var re=class{id=`phaser`;engine=`Phaser`;version;constructor(){this.version=void 0}async detect(e){try{let t=await e.pageController.evaluate(`
1344
1827
  (function() {
1345
1828
  if (typeof window.Phaser === 'undefined' || window.Phaser === null) {
1346
1829
  return { present: false, hasGames: false };
@@ -1352,7 +1835,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
1352
1835
  version: window.Phaser.VERSION || undefined,
1353
1836
  };
1354
1837
  })()
1355
- `);if(!t.present||!t.hasGames)return null;let n=[`window.Phaser detected`];return n.push(`Phaser.GAMES has entries`),{engine:this.engine,version:t.version,confidence:.95,evidence:n,adapterId:this.id}}catch{return null}}async dumpScene(e,t){let n=c(t),r=await e.pageController.evaluate(n);return{engine:r.engine,version:r.version,canvas:r.canvas,sceneTree:r.sceneTree??{id:`empty`,type:`Game`,visible:!0,interactive:!1,alpha:1,x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0,worldBounds:{x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0},path:`Phaser.Game`},totalNodes:r.totalNodes,completeness:r.completeness===`full`?`full`:`partial`}}async pickAt(e,t){let n=l(t),r=await e.pageController.evaluate(n);return{success:r.success,picked:r.picked,candidates:r.candidates,coordinates:r.coordinates,hitTestMethod:r.hitTestMethod}}};function d(e){let t=e.maxDepth??20,n=e.onlyInteractive??!1;return`(function() {
1838
+ `);if(!t.present||!t.hasGames)return null;let n=[`window.Phaser detected`];return n.push(`Phaser.GAMES has entries`),{engine:this.engine,version:t.version,confidence:.95,evidence:n,adapterId:this.id}}catch{return null}}async dumpScene(e,t){let n=te(t),r=await e.pageController.evaluate(n);return{engine:r.engine,version:r.version,canvas:r.canvas,sceneTree:r.sceneTree??{id:`empty`,type:`Game`,visible:!0,interactive:!1,alpha:1,x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0,worldBounds:{x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0},path:`Phaser.Game`},totalNodes:r.totalNodes,completeness:r.completeness===`full`?`full`:`partial`}}async pickAt(e,t){let n=ne(t),r=await e.pageController.evaluate(n);return{success:r.success,picked:r.picked,candidates:r.candidates,coordinates:r.coordinates,hitTestMethod:r.hitTestMethod}}};function ie(e){let t=e.maxDepth??20,n=e.onlyInteractive??!1;return`(function() {
1356
1839
  function getChildren(node) {
1357
1840
  if (!node) return [];
1358
1841
  if (node.children && node.numChildren !== undefined) return node.children;
@@ -1503,7 +1986,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
1503
1986
  totalNodes: totalNodes,
1504
1987
  completeness: 'full'
1505
1988
  };
1506
- })()`}function f(e){let t=e.x,n=e.y,r=e.canvasId;return`(function() {
1989
+ })()`}function ae(e){let t=e.x,n=e.y,r=e.canvasId;return`(function() {
1507
1990
  function getChildren(node) {
1508
1991
  if (!node) return [];
1509
1992
  if (node.children && node.numChildren !== undefined) return node.children;
@@ -1720,7 +2203,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
1720
2203
  },
1721
2204
  hitTestMethod: finalMethod
1722
2205
  };
1723
- })()`}var p=class{id=`pixi`;engine=`PixiJS`;version;constructor(){this.version=void 0}async detect(e){try{let t=await e.pageController.evaluate(`
2206
+ })()`}var oe=class{id=`pixi`;engine=`PixiJS`;version;constructor(){this.version=void 0}async detect(e){try{let t=await e.pageController.evaluate(`
1724
2207
  (function() {
1725
2208
  if (typeof window.PIXI === 'undefined' || window.PIXI === null) {
1726
2209
  return { present: false, hasApp: false };
@@ -1730,10 +2213,601 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
1730
2213
  var version = pixi.VERSION || pixi.version;
1731
2214
  return { present: true, hasApp: hasApp, version: version };
1732
2215
  })()
1733
- `);if(!t.present||!t.hasApp)return null;let n=[`window.PIXI detected`];return t.version&&n.push(`PIXI.VERSION: `+t.version),n.push(`PIXI.Application detected`),{engine:this.engine,version:t.version,confidence:.95,evidence:n,adapterId:this.id}}catch{return null}}async dumpScene(e,t){let n=d(t),r=await e.pageController.evaluate(n);return{engine:r.engine,version:r.version,canvas:r.canvas,sceneTree:r.sceneTree??{id:`empty`,type:`Container`,visible:!0,interactive:!1,alpha:1,x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0,worldBounds:{x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0},path:`PIXI.Application.stage`},totalNodes:r.totalNodes,completeness:r.completeness===`full`?`full`:`partial`}}async pickAt(e,t){let n=f(t),r=await e.pageController.evaluate(n);return{success:r.success,picked:r.picked,candidates:r.candidates,coordinates:r.coordinates,hitTestMethod:r.hitTestMethod}}};const m=[{pattern:`Laya`,adapterId:`laya`,engine:`LayaAir`},{pattern:`PIXI`,adapterId:`pixi`,engine:`PixiJS`},{pattern:`Phaser`,adapterId:`phaser`,engine:`Phaser`},{pattern:`cc`,adapterId:`cocos`,engine:`CocosCreator`},{pattern:`legacyCC`,adapterId:`cocos`,engine:`CocosCreator`},{pattern:`BABYLON`,adapterId:`babylon`,engine:`Babylon.js`},{pattern:`THREE`,adapterId:`three`,engine:`Three.js`},{pattern:`createUnityInstance`,adapterId:`unity`,engine:`UnityWebGL`}],h=new Map,g={laya:()=>new s,pixi:()=>new p,phaser:()=>new u,cocos:()=>new i};function _(e){if(!e)return null;if(h.has(e.adapterId))return h.get(e.adapterId);let t=g[e.adapterId];if(!t)return null;let n=t();return h.set(e.adapterId,n),n}function v(e){return{pageController:e,cdpSession:null,tabId:`default`}}async function y(e,t){try{let n=await e.evaluate(`
2216
+ `);if(!t.present||!t.hasApp)return null;let n=[`window.PIXI detected`];return t.version&&n.push(`PIXI.VERSION: `+t.version),n.push(`PIXI.Application detected`),{engine:this.engine,version:t.version,confidence:.95,evidence:n,adapterId:this.id}}catch{return null}}async dumpScene(e,t){let n=ie(t),r=await e.pageController.evaluate(n);return{engine:r.engine,version:r.version,canvas:r.canvas,sceneTree:r.sceneTree??{id:`empty`,type:`Container`,visible:!0,interactive:!1,alpha:1,x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0,worldBounds:{x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0},path:`PIXI.Application.stage`},totalNodes:r.totalNodes,completeness:r.completeness===`full`?`full`:`partial`}}async pickAt(e,t){let n=ae(t),r=await e.pageController.evaluate(n);return{success:r.success,picked:r.picked,candidates:r.candidates,coordinates:r.coordinates,hitTestMethod:r.hitTestMethod}}};function _(e){let t=e.maxDepth??20,n=e.onlyInteractive??!1;return`(function() {
2217
+ var THREE = window.THREE;
2218
+
2219
+ function safeProp(obj, key, fallback) {
2220
+ try { var v = obj[key]; return v === undefined || v === null ? fallback : v; } catch(e) { return fallback; }
2221
+ }
2222
+
2223
+ function nodeId(obj, idx) {
2224
+ try {
2225
+ if (obj.uuid !== undefined && obj.uuid !== null && obj.uuid !== '') return 'three_' + obj.uuid;
2226
+ } catch(e) {}
2227
+ try {
2228
+ if (obj.id !== undefined && obj.id !== null) return 'three_id_' + obj.id;
2229
+ } catch(e) {}
2230
+ var t = obj.type || (obj.constructor ? obj.constructor.name : 'Object3D');
2231
+ return t + '_' + idx;
2232
+ }
2233
+
2234
+ function getType(obj) {
2235
+ try {
2236
+ if (obj.type && typeof obj.type === 'string' && obj.type !== '') return obj.type;
2237
+ } catch(e) {}
2238
+ return obj.constructor ? obj.constructor.name : 'Object3D';
2239
+ }
2240
+
2241
+ function decomposeMatrix(matrix) {
2242
+ var r = { posX: 0, posY: 0, posZ: 0, rotX: 0, rotY: 0, rotZ: 0, scaleX: 1, scaleY: 1, scaleZ: 1 };
2243
+ try {
2244
+ if (THREE && THREE.Vector3 && THREE.Quaternion && THREE.Euler && typeof matrix.decompose === 'function') {
2245
+ var pos = new THREE.Vector3();
2246
+ var quat = new THREE.Quaternion();
2247
+ var scale = new THREE.Vector3();
2248
+ matrix.decompose(pos, quat, scale);
2249
+ var euler = new THREE.Euler();
2250
+ euler.setFromQuaternion(quat);
2251
+ r.posX = pos.x; r.posY = pos.y; r.posZ = pos.z;
2252
+ r.rotX = euler.x; r.rotY = euler.y; r.rotZ = euler.z;
2253
+ r.scaleX = scale.x; r.scaleY = scale.y; r.scaleZ = scale.z;
2254
+ return r;
2255
+ }
2256
+ } catch(e) {}
2257
+ // Fallback: read local transform properties
2258
+ r.posX = safeProp(matrix, 'elements', null) ? 0 : safeProp(matrix, 'posX', 0);
2259
+ return r;
2260
+ }
2261
+
2262
+ function getTransform(obj) {
2263
+ var mw = safeProp(obj, 'matrixWorld', null);
2264
+ if (mw && typeof mw.decompose === 'function') {
2265
+ return decomposeMatrix(mw);
2266
+ }
2267
+ // Fallback to local transform props
2268
+ return {
2269
+ posX: safeProp(obj, 'posX', 0) || (obj.position ? safeProp(obj.position, 'x', 0) : 0),
2270
+ posY: safeProp(obj, 'posY', 0) || (obj.position ? safeProp(obj.position, 'y', 0) : 0),
2271
+ posZ: safeProp(obj, 'posZ', 0) || (obj.position ? safeProp(obj.position, 'z', 0) : 0),
2272
+ rotX: obj.rotation ? safeProp(obj.rotation, 'x', 0) : 0,
2273
+ rotY: obj.rotation ? safeProp(obj.rotation, 'y', 0) : 0,
2274
+ rotZ: obj.rotation ? safeProp(obj.rotation, 'z', 0) : 0,
2275
+ scaleX: obj.scale ? safeProp(obj.scale, 'x', 1) : 1,
2276
+ scaleY: obj.scale ? safeProp(obj.scale, 'y', 1) : 1,
2277
+ scaleZ: obj.scale ? safeProp(obj.scale, 'z', 1) : 1,
2278
+ };
2279
+ }
2280
+
2281
+ function getWorldBounds(obj, t) {
2282
+ try {
2283
+ var geom = obj.geometry;
2284
+ if (geom) {
2285
+ if (!geom.boundingBox) {
2286
+ try { geom.computeBoundingBox(); } catch(e) {}
2287
+ }
2288
+ if (geom.boundingBox) {
2289
+ var bb = geom.boundingBox;
2290
+ var minX = bb.min.x * t.scaleX + t.posX;
2291
+ var minY = bb.min.y * t.scaleY + t.posY;
2292
+ var w = Math.abs((bb.max.x - bb.min.x) * t.scaleX);
2293
+ var h = Math.abs((bb.max.y - bb.min.y) * t.scaleY);
2294
+ if (w > 0 || h > 0) {
2295
+ return { x: minX, y: minY, width: w, height: h };
2296
+ }
2297
+ }
2298
+ }
2299
+ } catch(e) {}
2300
+ return {
2301
+ x: t.posX,
2302
+ y: t.posY,
2303
+ width: Math.max(1, Math.abs(t.scaleX)),
2304
+ height: Math.max(1, Math.abs(t.scaleY))
2305
+ };
2306
+ }
2307
+
2308
+ function getMaterialInfo(obj) {
2309
+ try {
2310
+ var mat = obj.material;
2311
+ if (!mat) return undefined;
2312
+ if (Array.isArray(mat)) {
2313
+ return mat.map(function(m) {
2314
+ return m && m.type ? m.type : (m && m.constructor ? m.constructor.name : 'Material');
2315
+ });
2316
+ }
2317
+ return mat.type || (mat.constructor ? mat.constructor.name : 'Material');
2318
+ } catch(e) { return undefined; }
2319
+ }
2320
+
2321
+ function getVertexCount(obj) {
2322
+ try {
2323
+ var geom = obj.geometry;
2324
+ if (geom && geom.attributes && geom.attributes.position) {
2325
+ return geom.attributes.position.count;
2326
+ }
2327
+ } catch(e) {}
2328
+ return undefined;
2329
+ }
2330
+
2331
+ function isSceneLike(value) {
2332
+ if (!value || typeof value !== 'object') return false;
2333
+ try {
2334
+ if (value.isScene === true) return true;
2335
+ } catch(e) {}
2336
+ try {
2337
+ if (value.constructor && value.constructor.name === 'Scene') return true;
2338
+ } catch(e) {}
2339
+ return false;
2340
+ }
2341
+
2342
+ function findScene() {
2343
+ // 1. Dev-tool conventions
2344
+ try {
2345
+ if (window.__threeScene && isSceneLike(window.__threeScene)) return window.__threeScene;
2346
+ } catch(e) {}
2347
+ try {
2348
+ var reg = window.__THREE_DEVTOOLS__;
2349
+ if (reg && reg.scenes && reg.scenes.length > 0 && isSceneLike(reg.scenes[0])) {
2350
+ return reg.scenes[0];
2351
+ }
2352
+ } catch(e) {}
2353
+ // 2. Shallow scan window for a scene-like value (skip DOM nodes / window itself)
2354
+ var seen = new Set();
2355
+ try {
2356
+ var keys = Object.keys(window);
2357
+ for (var i = 0; i < keys.length; i++) {
2358
+ var k = keys[i];
2359
+ try {
2360
+ var v = window[k];
2361
+ if (!v || v === window || v.nodeType || seen.has(v)) continue;
2362
+ seen.add(v);
2363
+ if (isSceneLike(v)) return v;
2364
+ } catch(e) {}
2365
+ }
2366
+ } catch(e) {}
2367
+ return null;
2368
+ }
2369
+
2370
+ var totalNodes = 0;
2371
+
2372
+ function traverse(obj, depth, path) {
2373
+ if (!obj || depth > ${t}) return null;
2374
+ totalNodes++;
2375
+
2376
+ var visible = !!(safeProp(obj, 'visible', true));
2377
+ var interactive = !!(
2378
+ obj.userData && (obj.userData.interactive || obj.userData.clickable || obj.userData.pickable)
2379
+ );
2380
+
2381
+ if (${e.onlyVisible??!1} && !visible) return null;
2382
+ if (${n} && !interactive) return null;
2383
+
2384
+ var childrenArr = safeProp(obj, 'children', []);
2385
+ if (!Array.isArray(childrenArr)) childrenArr = [];
2386
+ var children = null;
2387
+
2388
+ if (childrenArr.length > 0) {
2389
+ children = [];
2390
+ for (var i = 0; i < childrenArr.length; i++) {
2391
+ var cn = childrenArr[i];
2392
+ if (!cn) continue;
2393
+ var childPath = path ? path + '/' + nodeId(cn, i) : nodeId(cn, i);
2394
+ var sub = traverse(cn, depth + 1, childPath);
2395
+ if (sub) children.push(sub);
2396
+ }
2397
+ }
2398
+
2399
+ var t = getTransform(obj);
2400
+ var wb = getWorldBounds(obj, t);
2401
+ var result = {
2402
+ id: nodeId(obj, 0),
2403
+ type: getType(obj),
2404
+ name: safeProp(obj, 'name', undefined) || undefined,
2405
+ visible: visible,
2406
+ interactive: interactive,
2407
+ alpha: 1,
2408
+ x: t.posX,
2409
+ y: t.posY,
2410
+ width: wb.width,
2411
+ height: wb.height,
2412
+ worldBounds: wb,
2413
+ path: path || nodeId(obj, 0),
2414
+ customData: {
2415
+ posX: t.posX, posY: t.posY, posZ: t.posZ,
2416
+ rotX: t.rotX, rotY: t.rotY, rotZ: t.rotZ,
2417
+ scaleX: t.scaleX, scaleY: t.scaleY, scaleZ: t.scaleZ,
2418
+ uuid: safeProp(obj, 'uuid', undefined) || undefined,
2419
+ materialType: getMaterialInfo(obj),
2420
+ vertexCount: getVertexCount(obj),
2421
+ }
2422
+ };
2423
+
2424
+ if (result.name === undefined) delete result.name;
2425
+ if (children && children.length > 0) result.children = children;
2426
+ return result;
2427
+ }
2428
+
2429
+ if (!THREE) {
2430
+ return {
2431
+ engine: 'Three.js',
2432
+ version: undefined,
2433
+ canvas: { width: 0, height: 0, dpr: 1, contextType: 'unknown' },
2434
+ sceneTree: null,
2435
+ totalNodes: 0,
2436
+ completeness: 'partial',
2437
+ error: 'window.THREE is undefined'
2438
+ };
2439
+ }
2440
+
2441
+ var threeVersion = THREE.REVISION ? ('r' + THREE.REVISION) : (THREE.VERSION || undefined);
2442
+ var scene = findScene();
2443
+
2444
+ var canvasEl = document.querySelector('canvas');
2445
+ var canvasInfo = {
2446
+ width: canvasEl ? canvasEl.width : 0,
2447
+ height: canvasEl ? canvasEl.height : 0,
2448
+ dpr: window.devicePixelRatio || 1,
2449
+ contextType: 'unknown'
2450
+ };
2451
+ if (canvasEl) {
2452
+ var gl = canvasEl.getContext('webgl2') || canvasEl.getContext('webgl');
2453
+ canvasInfo.contextType = gl ? (gl instanceof WebGL2RenderingContext ? 'webgl2' : 'webgl') : '2d';
2454
+ }
2455
+
2456
+ if (!scene) {
2457
+ return {
2458
+ engine: 'Three.js',
2459
+ version: threeVersion,
2460
+ canvas: canvasInfo,
2461
+ sceneTree: null,
2462
+ totalNodes: 0,
2463
+ completeness: 'partial',
2464
+ error: 'THREE.Scene not reachable from window — app likely scopes scene to a module closure'
2465
+ };
2466
+ }
2467
+
2468
+ var sceneTree = traverse(scene, 0, 'THREE.Scene');
2469
+
2470
+ return {
2471
+ engine: 'Three.js',
2472
+ version: threeVersion,
2473
+ canvas: canvasInfo,
2474
+ sceneTree: sceneTree,
2475
+ totalNodes: totalNodes,
2476
+ completeness: sceneTree ? 'full' : 'partial'
2477
+ };
2478
+ })()`}function v(e){let t=e.x,n=e.y,r=e.canvasId;return`(function() {
2479
+ var THREE = window.THREE;
2480
+
2481
+ function safeProp(obj, key, fallback) {
2482
+ try { var v = obj[key]; return v === undefined || v === null ? fallback : v; } catch(e) { return fallback; }
2483
+ }
2484
+
2485
+ function nodeId(obj, idx) {
2486
+ try {
2487
+ if (obj.uuid !== undefined && obj.uuid !== null && obj.uuid !== '') return 'three_' + obj.uuid;
2488
+ } catch(e) {}
2489
+ try {
2490
+ if (obj.id !== undefined && obj.id !== null) return 'three_id_' + obj.id;
2491
+ } catch(e) {}
2492
+ var t = obj.type || (obj.constructor ? obj.constructor.name : 'Object3D');
2493
+ return t + '_' + idx;
2494
+ }
2495
+
2496
+ function getType(obj) {
2497
+ try {
2498
+ if (obj.type && typeof obj.type === 'string' && obj.type !== '') return obj.type;
2499
+ } catch(e) {}
2500
+ return obj.constructor ? obj.constructor.name : 'Object3D';
2501
+ }
2502
+
2503
+ function isSceneLike(value) {
2504
+ if (!value || typeof value !== 'object') return false;
2505
+ try { if (value.isScene === true) return true; } catch(e) {}
2506
+ try { if (value.constructor && value.constructor.name === 'Scene') return true; } catch(e) {}
2507
+ return false;
2508
+ }
2509
+
2510
+ function findScene() {
2511
+ try { if (window.__threeScene && isSceneLike(window.__threeScene)) return window.__threeScene; } catch(e) {}
2512
+ try {
2513
+ var reg = window.__THREE_DEVTOOLS__;
2514
+ if (reg && reg.scenes && reg.scenes.length > 0 && isSceneLike(reg.scenes[0])) return reg.scenes[0];
2515
+ } catch(e) {}
2516
+ var seen = new Set();
2517
+ try {
2518
+ var keys = Object.keys(window);
2519
+ for (var i = 0; i < keys.length; i++) {
2520
+ try {
2521
+ var v = window[keys[i]];
2522
+ if (!v || v === window || v.nodeType || seen.has(v)) continue;
2523
+ seen.add(v);
2524
+ if (isSceneLike(v)) return v;
2525
+ } catch(e) {}
2526
+ }
2527
+ } catch(e) {}
2528
+ return null;
2529
+ }
2530
+
2531
+ var sx = ${t}, sy = ${n};
2532
+
2533
+ var canvases = Array.from(document.querySelectorAll('canvas'));
2534
+ var targetCanvas = null;
2535
+ ${r?`targetCanvas = document.getElementById(${JSON.stringify(r)}) || canvases[parseInt(${JSON.stringify(r)})] || null;`:`
2536
+ for (var ci = canvases.length - 1; ci >= 0; ci--) {
2537
+ var r = canvases[ci].getBoundingClientRect();
2538
+ if (sx >= r.left && sx <= r.right && sy >= r.top && sy <= r.bottom) {
2539
+ targetCanvas = canvases[ci];
2540
+ break;
2541
+ }
2542
+ }`}
2543
+
2544
+ if (!THREE) {
2545
+ return { success: false, picked: null, candidates: [], coordinates: {
2546
+ screen: { x: sx, y: sy }, canvas: { x: sx, y: sy } }, hitTestMethod: 'none' };
2547
+ }
2548
+
2549
+ var scene = findScene();
2550
+ if (!scene) {
2551
+ return { success: false, picked: null, candidates: [], coordinates: {
2552
+ screen: { x: sx, y: sy }, canvas: { x: sx, y: sy } }, hitTestMethod: 'none' };
2553
+ }
2554
+
2555
+ var canvasX = sx, canvasY = sy;
2556
+ if (targetCanvas) {
2557
+ var rect = targetCanvas.getBoundingClientRect();
2558
+ canvasX = (sx - rect.left) * (targetCanvas.width / rect.width);
2559
+ canvasY = (sy - rect.top) * (targetCanvas.height / rect.height);
2560
+ }
2561
+
2562
+ var candidates = [];
2563
+ var hitTestMethod = 'none';
2564
+ var enginePicked = null;
2565
+
2566
+ // Try THREE.Raycaster (native) — most accurate
2567
+ try {
2568
+ if (THREE.Vector3 && THREE.Raycaster) {
2569
+ var cam = scene.children.find(function(c) { return c && c.isCamera; }) || null;
2570
+ // Also check cameras stored elsewhere on the scene
2571
+ if (!cam) {
2572
+ for (var ci2 = 0; ci2 < scene.children.length; ci2++) {
2573
+ if (scene.children[ci2] && scene.children[ci2].isCamera) { cam = scene.children[ci2]; break; }
2574
+ }
2575
+ }
2576
+ if (cam) {
2577
+ var ndcX = (canvasX / (targetCanvas ? targetCanvas.width : window.innerWidth)) * 2 - 1;
2578
+ var ndcY = -(canvasY / (targetCanvas ? targetCanvas.height : window.innerHeight)) * 2 + 1;
2579
+ var ray = new THREE.Raycaster();
2580
+ ray.setFromCamera({ x: ndcX, y: ndcY }, cam);
2581
+ var hits = ray.intersectObjects(scene.children, true);
2582
+ if (hits && hits.length > 0 && hits[0].object) {
2583
+ enginePicked = hits[0].object;
2584
+ hitTestMethod = 'engine';
2585
+ }
2586
+ }
2587
+ }
2588
+ } catch(e) {}
2589
+
2590
+ // DFS fallback: world-bounds check
2591
+ function decomposeMatrix(matrix) {
2592
+ var r = { posX: 0, posY: 0, scaleX: 1, scaleY: 1 };
2593
+ try {
2594
+ if (THREE.Vector3 && THREE.Quaternion && typeof matrix.decompose === 'function') {
2595
+ var pos = new THREE.Vector3();
2596
+ var quat = new THREE.Quaternion();
2597
+ var scale = new THREE.Vector3();
2598
+ matrix.decompose(pos, quat, scale);
2599
+ r.posX = pos.x; r.posY = pos.y; r.scaleX = scale.x; r.scaleY = scale.y;
2600
+ }
2601
+ } catch(e) {}
2602
+ return r;
2603
+ }
2604
+
2605
+ function nodeBounds(obj) {
2606
+ var mw = safeProp(obj, 'matrixWorld', null);
2607
+ var t = (mw && typeof mw.decompose === 'function') ? decomposeMatrix(mw) :
2608
+ { posX: obj.position ? safeProp(obj.position, 'x', 0) : 0,
2609
+ posY: obj.position ? safeProp(obj.position, 'y', 0) : 0,
2610
+ scaleX: obj.scale ? safeProp(obj.scale, 'x', 1) : 1,
2611
+ scaleY: obj.scale ? safeProp(obj.scale, 'y', 1) : 1 };
2612
+ try {
2613
+ var geom = obj.geometry;
2614
+ if (geom) {
2615
+ if (!geom.boundingBox) { try { geom.computeBoundingBox(); } catch(e) {} }
2616
+ if (geom.boundingBox) {
2617
+ var bb = geom.boundingBox;
2618
+ return {
2619
+ x: bb.min.x * t.scaleX + t.posX,
2620
+ y: bb.min.y * t.scaleY + t.posY,
2621
+ width: Math.abs((bb.max.x - bb.min.x) * t.scaleX),
2622
+ height: Math.abs((bb.max.y - bb.min.y) * t.scaleY)
2623
+ };
2624
+ }
2625
+ }
2626
+ } catch(e) {}
2627
+ return { x: t.posX, y: t.posY, width: Math.abs(t.scaleX), height: Math.abs(t.scaleY) };
2628
+ }
2629
+
2630
+ function hitTestDfs(obj, depth, accPath) {
2631
+ if (!obj) return;
2632
+ var visible = safeProp(obj, 'visible', true);
2633
+ if (!visible) return;
2634
+
2635
+ var wb = nodeBounds(obj);
2636
+ if (wb.width > 0 && wb.height > 0) {
2637
+ var inBounds = canvasX >= wb.x && canvasX <= wb.x + wb.width &&
2638
+ canvasY >= wb.y && canvasY <= wb.y + wb.height;
2639
+ var interactive = !!(
2640
+ obj.userData && (obj.userData.interactive || obj.userData.clickable || obj.userData.pickable)
2641
+ );
2642
+ if (inBounds && interactive) {
2643
+ candidates.push({
2644
+ node: {
2645
+ id: nodeId(obj, 0),
2646
+ type: getType(obj),
2647
+ name: safeProp(obj, 'name', undefined) || undefined,
2648
+ visible: true,
2649
+ interactive: true,
2650
+ alpha: 1,
2651
+ x: wb.x, y: wb.y,
2652
+ width: wb.width, height: wb.height,
2653
+ worldBounds: wb,
2654
+ path: accPath || nodeId(obj, 0)
2655
+ },
2656
+ depth: depth
2657
+ });
2658
+ }
2659
+ }
2660
+
2661
+ var childrenArr = safeProp(obj, 'children', []);
2662
+ if (Array.isArray(childrenArr)) {
2663
+ for (var i = 0; i < childrenArr.length; i++) {
2664
+ var cn = childrenArr[i];
2665
+ if (!cn) continue;
2666
+ var childPath = accPath ? accPath + '/' + nodeId(cn, i) : nodeId(cn, i);
2667
+ hitTestDfs(cn, depth + 1, childPath);
2668
+ }
2669
+ }
2670
+ }
2671
+
2672
+ hitTestDfs(scene, 0, 'THREE.Scene');
2673
+
2674
+ var picked = enginePicked ? {
2675
+ id: nodeId(enginePicked, 0),
2676
+ type: getType(enginePicked),
2677
+ name: safeProp(enginePicked, 'name', undefined) || undefined,
2678
+ visible: !!(safeProp(enginePicked, 'visible', true)),
2679
+ interactive: !!(enginePicked.userData &&
2680
+ (enginePicked.userData.interactive || enginePicked.userData.clickable)),
2681
+ alpha: 1,
2682
+ x: nodeBounds(enginePicked).x,
2683
+ y: nodeBounds(enginePicked).y,
2684
+ width: nodeBounds(enginePicked).width,
2685
+ height: nodeBounds(enginePicked).height,
2686
+ worldBounds: nodeBounds(enginePicked),
2687
+ path: 'THREE.Scene/raycast/' + nodeId(enginePicked, 0)
2688
+ } : null;
2689
+
2690
+ if (!picked && candidates.length > 0) {
2691
+ candidates.sort(function(a, b) { return a.depth - b.depth; });
2692
+ picked = candidates[0].node;
2693
+ hitTestMethod = 'manual';
2694
+ }
2695
+
2696
+ return {
2697
+ success: !!picked,
2698
+ picked: picked,
2699
+ candidates: candidates,
2700
+ coordinates: {
2701
+ screen: { x: sx, y: sy },
2702
+ canvas: { x: canvasX, y: canvasY }
2703
+ },
2704
+ hitTestMethod: hitTestMethod
2705
+ };
2706
+ })()`}var y=class{id=`three`;engine=`Three.js`;version;constructor(){this.version=void 0}async detect(e){try{let t=await e.pageController.evaluate(`
2707
+ (function() {
2708
+ var THREE = window.THREE;
2709
+ if (!THREE) return { present: false, hasScene: false };
2710
+ var version = THREE.REVISION ? ('r' + THREE.REVISION) : (THREE.VERSION || undefined);
2711
+ function isSceneLike(v) {
2712
+ if (!v || typeof v !== 'object') return false;
2713
+ try { if (v.isScene === true) return true; } catch(e) {}
2714
+ try { if (v.constructor && v.constructor.name === 'Scene') return true; } catch(e) {}
2715
+ return false;
2716
+ }
2717
+ var hasScene = false;
2718
+ try { if (window.__threeScene && isSceneLike(window.__threeScene)) hasScene = true; } catch(e) {}
2719
+ if (!hasScene) {
2720
+ try {
2721
+ var reg = window.__THREE_DEVTOOLS__;
2722
+ if (reg && reg.scenes && reg.scenes.length > 0 && isSceneLike(reg.scenes[0])) hasScene = true;
2723
+ } catch(e) {}
2724
+ }
2725
+ if (!hasScene) {
2726
+ var keys = Object.keys(window);
2727
+ for (var i = 0; i < keys.length; i++) {
2728
+ try {
2729
+ var v = window[keys[i]];
2730
+ if (!v || v === window || v.nodeType) continue;
2731
+ if (isSceneLike(v)) { hasScene = true; break; }
2732
+ } catch(e) {}
2733
+ }
2734
+ }
2735
+ return { present: true, version: version, hasScene: hasScene };
2736
+ })()
2737
+ `);if(!t.present)return null;let n=[`window.THREE detected`];return t.version&&n.push(`THREE.REVISION: `+t.version),t.hasScene?n.push(`THREE.Scene reachable from window`):n.push(`THREE.Scene not reachable from window (scene may be in module closure)`),{engine:this.engine,version:t.version,confidence:t.hasScene?.95:.9,evidence:n,adapterId:this.id}}catch{return null}}async dumpScene(e,t){let n=_(t),r=await e.pageController.evaluate(n);return{engine:r.engine,version:r.version,canvas:r.canvas,sceneTree:r.sceneTree??{id:`empty`,type:`Scene`,visible:!0,interactive:!1,alpha:1,x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0,worldBounds:{x:0,y:0,width:r.canvas?.width??0,height:r.canvas?.height??0},path:`THREE.Scene`},totalNodes:r.totalNodes,completeness:r.completeness===`full`?`full`:`partial`}}async pickAt(e,t){let n=v(t),r=await e.pageController.evaluate(n);return{success:r.success,picked:r.picked,candidates:r.candidates,coordinates:r.coordinates,hitTestMethod:r.hitTestMethod}}async dumpGpuResources(e,t){let n=b();return await e.pageController.evaluate(n)}};function b(){return`(function(){
2738
+ var THREE=window.THREE; if(!THREE) return null;
2739
+
2740
+ function findScene(){
2741
+ try{ if(window.__threeScene&&window.__threeScene.isScene===true) return window.__threeScene; }catch(e){}
2742
+ try{ var dev=window.__THREE_DEVTOOLS__; if(dev&&dev.scenes&&dev.scenes.length>0&&dev.scenes[0].isScene===true) return dev.scenes[0]; }catch(e){}
2743
+ var keys=Object.keys(window);
2744
+ for(var i=0;i<keys.length;i++){
2745
+ try{ var v=window[keys[i]]; if(v&&v.isScene===true) return v; }catch(e){}
2746
+ }
2747
+ return null;
2748
+ }
2749
+
2750
+ function findRenderer(){
2751
+ try{ if(window.__threeRenderer&&window.__threeRenderer.isWebGLRenderer===true) return window.__threeRenderer; }catch(e){}
2752
+ var keys=Object.keys(window);
2753
+ for(var i=0;i<keys.length;i++){
2754
+ try{ var v=window[keys[i]]; if(v&&v.isWebGLRenderer===true) return v; }catch(e){}
2755
+ }
2756
+ return null;
2757
+ }
2758
+
2759
+ var textures=[],programs=[],geometries=[];
2760
+ var renderer=findRenderer();
2761
+
2762
+ if(renderer&&renderer.info&&renderer.info.programs){
2763
+ var progs=renderer.info.programs;
2764
+ for(var i=0;i<Math.min(progs.length,200);i++){
2765
+ var p=progs[i];
2766
+ var pData={ name: p.name||undefined, vertexShader:'', fragmentShader:'', uniforms:{} };
2767
+ try{
2768
+ var gl=renderer.getContext();
2769
+ var dbg=gl.getExtension('WEBGL_debug_shaders');
2770
+ if(dbg&&p.program){
2771
+ try{ pData.vertexShader=dbg.getTranslatedShaderSource(p.vertexShader)||''; }catch(e){}
2772
+ try{ pData.fragmentShader=dbg.getTranslatedShaderSource(p.fragmentShader)||''; }catch(e){}
2773
+ }
2774
+ } catch(e){}
2775
+ programs.push(pData);
2776
+ }
2777
+ }
2778
+
2779
+ if(renderer&&renderer.info&&renderer.info.textures){
2780
+ var texs=renderer.info.textures;
2781
+ for(var i=0;i<Math.min(texs.length,200);i++){
2782
+ var t=texs[i];
2783
+ textures.push({ name:t.name||undefined, width:t.width||0, height:t.height||0, format:'rgba', type:'unsigned_byte' });
2784
+ }
2785
+ }
2786
+
2787
+ var scene=findScene();
2788
+ if(scene){
2789
+ (function walk(obj){
2790
+ if(!obj) return;
2791
+ if(obj.isMesh&&obj.geometry){
2792
+ var g=obj.geometry, attrs=[];
2793
+ if(g.attributes){
2794
+ if(g.attributes.position) attrs.push('position');
2795
+ if(g.attributes.normal) attrs.push('normal');
2796
+ if(g.attributes.uv) attrs.push('uv');
2797
+ }
2798
+ var vc=g.attributes&&g.attributes.position?g.attributes.position.count:0;
2799
+ var tc=g.index?Math.floor(g.index.count/3):Math.floor(vc/3);
2800
+ geometries.push({ name:obj.name||undefined, vertexCount:vc, triangleCount:tc, attributes:attrs });
2801
+ }
2802
+ if(obj.children) for(var j=0;j<obj.children.length;j++) walk(obj.children[j]);
2803
+ })(scene);
2804
+ }
2805
+
2806
+ return { textures:textures, programs:programs, geometries:geometries };
2807
+ })()`}const x=[{pattern:`Laya`,adapterId:`laya`,engine:`LayaAir`},{pattern:`PIXI`,adapterId:`pixi`,engine:`PixiJS`},{pattern:`Phaser`,adapterId:`phaser`,engine:`Phaser`},{pattern:`cc`,adapterId:`cocos`,engine:`CocosCreator`},{pattern:`legacyCC`,adapterId:`cocos`,engine:`CocosCreator`},{pattern:`BABYLON`,adapterId:`babylon`,engine:`Babylon.js`},{pattern:`THREE`,adapterId:`three`,engine:`Three.js`},{pattern:`createUnityInstance`,adapterId:`unity`,engine:`UnityWebGL`}],S=new Map,se={laya:()=>new ee,pixi:()=>new oe,phaser:()=>new re,cocos:()=>new m,three:()=>new y,babylon:()=>new d};function C(e){if(!e)return null;if(S.has(e.adapterId))return S.get(e.adapterId);let t=se[e.adapterId];if(!t)return null;let n=t();return S.set(e.adapterId,n),n}function w(e){return{pageController:e,cdpSession:null,tabId:`default`}}async function T(e,t){try{let n=await e.evaluate(`
1734
2808
  (function() {
1735
2809
  const hits = [];
1736
- ${m.map(({pattern:e,adapterId:t,engine:n})=>`
2810
+ ${x.map(({pattern:e,adapterId:t,engine:n})=>`
1737
2811
  try {
1738
2812
  if (window[${JSON.stringify(e)}] !== undefined) {
1739
2813
  const v = window[${JSON.stringify(e)}];
@@ -1837,10 +2911,10 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
1837
2911
 
1838
2912
  return { hits: hits, selected: hits[0] || null, selectedEvidence: [] };
1839
2913
  })()
1840
- `);if(!n.selected)return null;let r=n.selected;return{engine:r.engine,version:r.version,confidence:n.selectedEvidence.length>0?.95:.9,evidence:[`window global detected`,...n.selectedEvidence],adapterId:r.adapterId}}catch{return null}}async function b(e,t){let n=t.canvasId,r=await e.evaluate(`
2914
+ `);if(!n.selected)return null;let r=n.selected;return{engine:r.engine,version:r.version,confidence:n.selectedEvidence.length>0?.95:.9,evidence:[`window global detected`,...n.selectedEvidence],adapterId:r.adapterId}}catch{return null}}async function ce(e,t){let n=t.canvasId,r=await e.evaluate(`
1841
2915
  (function() {
1842
2916
  const results = [];
1843
- ${m.map(({pattern:e,adapterId:t,engine:n})=>`
2917
+ ${x.map(({pattern:e,adapterId:t,engine:n})=>`
1844
2918
  try {
1845
2919
  const global = window[${JSON.stringify(e)}];
1846
2920
  if (global !== undefined) {
@@ -1878,7 +2952,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
1878
2952
  `);return await e.evaluate(`
1879
2953
  !!(requestAnimationFrame.toString().includes('[native]') &&
1880
2954
  (window.__canvasEngineHint || document.querySelector('[data-engine]')))
1881
- `)&&i.length===0&&i.push({engine:`Unknown Canvas Engine`,confidence:.3,evidence:[`requestAnimationFrame hook detected`,`canvas elements found`],adapterId:`none`}),{candidates:i,canvasCount:a.length,canvasDetails:n===void 0?a:a.filter(e=>e.id===n||a.indexOf(e).toString()===n),fingerprintComplete:i.length>0}}async function x(e,t){let n=t.canvasId,r={canvasId:n,maxDepth:t.maxDepth??20,onlyInteractive:t.onlyInteractive??!1,onlyVisible:t.onlyVisible??!1},i=await y(e,n);if(!i)return S(e,n);let a=_(i);return a?a.dumpScene(v(e),r):S(e,n)}async function S(e,t){let n=await e.evaluate(`
2955
+ `)&&i.length===0&&i.push({engine:`Unknown Canvas Engine`,confidence:.3,evidence:[`requestAnimationFrame hook detected`,`canvas elements found`],adapterId:`none`}),{candidates:i,canvasCount:a.length,canvasDetails:n===void 0?a:a.filter(e=>e.id===n||a.indexOf(e).toString()===n),fingerprintComplete:i.length>0}}async function le(e,t){let n=t.canvasId,r=t.maxDepth??20,i=t.onlyInteractive??!1,a=t.onlyVisible??!1,o=t.includeGPUResources??!1,s={canvasId:n,maxDepth:r,onlyInteractive:i,onlyVisible:a,includeGPUResources:o},c=await T(e,n);if(!c)return D(e,n,null);let l=C(c);if(!l)return D(e,n,c);let u=await l.dumpScene(w(e),s);if(o&&l.dumpGpuResources){let t=await l.dumpGpuResources(w(e),s);t&&(u.gpuResources=t)}return u}function E(e){return e.adapterId===`unity`?{reason:`Unity WebGL adapter not yet available; the engine was detected but scene tree extraction is unsupported.`,fix:`Use page_evaluate with unityInstance.SendMessage to inspect the Unity runtime manually.`}:{reason:`${e.engine||e.adapterId||`unknown engine`} was fingerprinted but no scene-dump adapter is registered for adapterId "${e.adapterId}". Only DOM canvas metadata returned.`,fix:`Use page_evaluate to inspect the engine directly, or request an adapter for this engine.`}}async function D(e,t,n=null){let r=await e.evaluate(`
1882
2956
  (function() {
1883
2957
  return Array.from(document.querySelectorAll('canvas')).map(function(c, i) {
1884
2958
  var ctx2d = c.getContext('2d');
@@ -1892,7 +2966,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
1892
2966
  };
1893
2967
  });
1894
2968
  })()
1895
- `);return{engine:`unknown`,version:void 0,canvas:(t?n.filter(e=>e.id===t||n.indexOf(e).toString()===t):n)[0]??{id:t??``,width:0,height:0,dpr:1,contextType:`unknown`},sceneTree:null,totalNodes:0,completeness:`partial`,partialReason:`No canvas engine detected — only DOM canvas metadata returned`}}async function C(e,t){let n=t.x,r=t.y,i=t.canvasId,a=t.highlight??!1,o={x:n,y:r,canvasId:i},s=await e.evaluate(`
2969
+ `),i=(t?r.filter(e=>e.id===t||r.indexOf(e).toString()===t):r)[0]??{id:t??``,width:0,height:0,dpr:1,contextType:`unknown`},a=n!==null,o=n?.engine??`unknown`,s=n?.version,l=n?.adapterId,u=a?E(n).reason:`No canvas engine detected — only DOM canvas metadata returned`,d=c({tool:`canvas_scene_dump`,stubType:`partial`,reason:u,fix:a?E(n).fix:`Ensure a supported canvas engine is loaded (Pixi, Phaser, Laya, Cocos, Three.js, Babylon.js)`,data:{engine:o,version:s,adapterId:l,canvas:i,sceneTree:null,totalNodes:0,completeness:`partial`,partialReason:u}});return{engine:d.engine,version:d.version,adapterId:d.adapterId,canvas:d.canvas,sceneTree:d.sceneTree,totalNodes:d.totalNodes,completeness:d.completeness,partialReason:d.partialReason,stubType:d.stubType,reason:d.reason,fix:d.fix}}async function ue(e,t){let n=t.x,r=t.y,i=t.canvasId,a=t.highlight??!1,o={x:n,y:r,canvasId:i},s=await e.evaluate(`
1896
2970
  (function() {
1897
2971
  var sx = ${n}, sy = ${r};
1898
2972
  var canvases = Array.from(document.querySelectorAll('canvas'));
@@ -1916,7 +2990,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
1916
2990
  canvasY: (sy - rect.top) * (target.height / rect.height)
1917
2991
  };
1918
2992
  })()
1919
- `),c=await y(e,i);if(!c)return{success:!1,picked:null,candidates:[],coordinates:{screen:s.screen,canvas:{x:s.canvasX,y:s.canvasY}},hitTestMethod:`none`};let l=_(c);if(!l)return{success:!1,picked:null,candidates:[],coordinates:{screen:s.screen,canvas:{x:s.canvasX,y:s.canvasY}},hitTestMethod:`none`};let u=await l.pickAt(v(e),o);return a&&u.picked&&await w(e,u.picked.worldBounds).catch(()=>{}),u}async function w(e,t){await e.evaluate(`
2993
+ `),c=await T(e,i);if(!c)return{success:!1,picked:null,candidates:[],coordinates:{screen:s.screen,canvas:{x:s.canvasX,y:s.canvasY}},hitTestMethod:`none`};let l=C(c);if(!l)return{success:!1,picked:null,candidates:[],coordinates:{screen:s.screen,canvas:{x:s.canvasX,y:s.canvasY}},hitTestMethod:`none`};let u=await l.pickAt(w(e),o);return a&&u.picked&&await O(e,u.picked.worldBounds).catch(()=>{}),u}async function O(e,t){await e.evaluate(`
1920
2994
  (function() {
1921
2995
  var existing = document.getElementById('__canvas-highlight');
1922
2996
  if (existing) existing.remove();
@@ -1931,7 +3005,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
1931
3005
  document.body.appendChild(div);
1932
3006
  setTimeout(function() { div.remove(); }, 3000);
1933
3007
  })()
1934
- `)}async function T(e,t,n,r){let i=r.x,a=r.y,o=r.canvasId,s=r.maxFrames??50,c=r.breakpointType??`click`;await t.enable(),await t.ensureAdvancedFeatures();let l=t.getEventManager(),u=await l.setEventListenerBreakpoint(c),d,f,p,m,h;try{let r=await E(e,i,a,o,c),l=r.result;f=r.completion,d=l.cleanupToken;let u=await t.waitForPaused(5e3),p=[];u?.callFrames&&(p=u.callFrames.slice(0,s).map(e=>({functionName:e.functionName||`(anonymous)`,scriptUrl:e.url,lineNumber:e.location?.lineNumber,columnNumber:e.location?.columnNumber}))),j(n,`canvas_trace`,{engine:l.engine??`unknown`,x:i,y:a,handlerCount:p.length}),h={inputFlow:l.domEventChain??[],hitTarget:null,domEventChain:p.map(e=>({type:c,target:e.scriptUrl,phase:`at-target`})),engineDispatchChain:l.engineChain??[],handlerFrames:p,handlersTriggered:p.map(e=>({functionName:e.functionName,scriptUrl:e.scriptUrl,lineNumber:e.lineNumber})),networkEmitted:[]}}catch(e){p=e}finally{try{await t.resume()}catch{}if(f)try{await f}catch(e){p||(m=e)}if(await k(e,d),typeof l.removeEventListenerBreakpoint==`function`)try{await l.removeEventListenerBreakpoint(u)}catch{}}if(p)throw p;if(m)throw m;if(!h)throw Error(`Canvas trace did not produce a result.`);return h}async function E(e,t,n,r,i=`click`){return i===`click`&&typeof e.click==`function`?D(e,t,n,r,i):O(e,t,n,r,i)}async function D(e,t,n,r,i=`click`){let a=A(i),o=`jshook-trace-${Date.now()}-${Math.random().toString(36).slice(2,10)}`,s=await e.evaluate(`
3008
+ `)}async function k(e,t,n,r){let i=r.x,a=r.y,o=r.canvasId,s=r.maxFrames??50,c=r.breakpointType??`click`;await t.enable(),await t.ensureAdvancedFeatures();let l=t.getEventManager(),u=await l.setEventListenerBreakpoint(c);await new Promise(e=>setTimeout(e,50));let d,f,p,m,h;try{let r=await A(e,i,a,o,c),l=r.result;f=r.completion,d=l.cleanupToken;let u=await t.waitForPaused(5e3),p=[];u?.callFrames&&(p=u.callFrames.slice(0,s).map(e=>({functionName:e.functionName||`(anonymous)`,scriptUrl:e.url,lineNumber:e.location?.lineNumber,columnNumber:e.location?.columnNumber}))),F(n,`canvas_trace`,{engine:l.engine??`unknown`,x:i,y:a,handlerCount:p.length}),h={inputFlow:l.domEventChain??[],hitTarget:null,domEventChain:p.map(e=>({type:c,target:e.scriptUrl,phase:`at-target`})),engineDispatchChain:l.engineChain??[],handlerFrames:p,handlersTriggered:p.map(e=>({functionName:e.functionName,scriptUrl:e.scriptUrl,lineNumber:e.lineNumber})),networkEmitted:[]}}catch(e){p=e}finally{try{await t.resume()}catch{}if(f)try{await f}catch(e){p||(m=e)}if(await N(e,d),typeof l.removeEventListenerBreakpoint==`function`)try{await l.removeEventListenerBreakpoint(u)}catch{}}if(p)throw p;if(m)throw m;if(!h)throw Error(`Canvas trace did not produce a result.`);return h}async function A(e,t,n,r,i=`click`){return i===`click`&&typeof e.click==`function`?j(e,t,n,r,i):M(e,t,n,r,i)}async function j(e,t,n,r,i=`click`){let a=P(i),o=`jshook-trace-${Date.now()}-${Math.random().toString(36).slice(2,10)}`,s=await e.evaluate(`
1935
3009
  (function() {
1936
3010
  var canvases = ${r?`[document.getElementById(${JSON.stringify(r)})]`:`Array.from(document.querySelectorAll("canvas"))`};
1937
3011
  var target = null;
@@ -1962,7 +3036,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
1962
3036
  offset: { x: offsetX, y: offsetY }
1963
3037
  };
1964
3038
  })()
1965
- `);return!s.selector||!s.offset?{result:s,completion:Promise.resolve()}:{result:s,completion:e.click?.(s.selector,{button:`left`,clickCount:1,offset:s.offset})??Promise.resolve()}}async function O(e,t,n,r,i=`click`){let a=A(i),o=`
3039
+ `);return!s.selector||!s.offset?{result:s,completion:Promise.resolve()}:{result:s,completion:e.click?.(s.selector,{button:`left`,clickCount:1,offset:s.offset})??Promise.resolve()}}async function M(e,t,n,r,i=`click`){let a=P(i),o=`
1966
3040
  (function() {
1967
3041
  var canvases = ${r?`[document.getElementById(${JSON.stringify(r)})]`:`Array.from(document.querySelectorAll("canvas"))`};
1968
3042
  var target = null;
@@ -2008,7 +3082,7 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
2008
3082
  engineChain: []
2009
3083
  };
2010
3084
  })()
2011
- `;return{result:await e.evaluate(o),completion:Promise.resolve()}}async function k(e,t){if(t)try{await e.evaluate(`
3085
+ `;return{result:await e.evaluate(o),completion:Promise.resolve()}}async function N(e,t){if(t)try{await e.evaluate(`
2012
3086
  (function() {
2013
3087
  var target = document.querySelector('canvas[data-jshook-trace-token="${t}"]');
2014
3088
  if (target) {
@@ -2016,4 +3090,4 @@ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw41
2016
3090
  }
2017
3091
  return true;
2018
3092
  })()
2019
- `)}catch{}}function A(e){return e===`mousedown`?[`pointerdown`,`mousedown`]:e===`pointerdown`?[`pointerdown`]:[`pointerdown`,`mousedown`,`pointerup`,`mouseup`,`click`]}function j(e,t,n){try{return e.addNode(`function`,t,n).id}catch{return`evidence-unavailable`}}var M=class{pageController;debuggerManager;evidenceStore;constructor(e){this.pageController=e.pageController,this.debuggerManager=e.debuggerManager,this.evidenceStore=e.evidenceStore}async handleFingerprint(t){return e(await b(this.pageController,t))}async handleSceneDump(t){return e(await x(this.pageController,t))}async handlePick(n){let r=t(n,`x`,0),i=t(n,`y`,0);return e(await C(this.pageController,{...n,x:r,y:i}))}async handleTraceClick(t){return e(await T(this.pageController,this.debuggerManager,this.evidenceStore,t))}};export{M as CanvasToolHandlers};
3093
+ `)}catch{}}function P(e){return e===`mousedown`?[`pointerdown`,`mousedown`]:e===`pointerdown`?[`pointerdown`]:[`pointerdown`,`mousedown`,`pointerup`,`mouseup`,`click`]}function F(e,t,n){try{return e.addNode(`function`,t,n).id}catch{return`evidence-unavailable`}}const I=new Set([`name`,`type`,`id`,`children`,`parent`,`x`,`y`,`width`,`height`]),L=new Set([`eq`,`contains`,`gt`,`lt`]);function R(e){return typeof e==`string`?e:e==null?``:String(e)}function z(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function B(e){if(Array.isArray(e))return e.filter(z);if(!z(e))return[];if(e.name!==void 0||e.type!==void 0)return[e];for(let t of[`root`,`tree`,`scene`,`nodes`,`children`]){let n=e[t];if(z(n))return[n];if(Array.isArray(n)){let e=n.filter(z);if(e.length>0)return e}}return[]}function V(e){let t={};for(let[n,r]of Object.entries(e))I.has(n)||(t[n]=r);return t}function H(e){if(e==null)return null;if(!z(e))return{error:`propertyFilter must be an object`};let t=e.key,n=e.op,r=e.value;return typeof t!=`string`||t.length===0?{error:`propertyFilter.key must be a non-empty string`}:typeof n!=`string`||!L.has(n)?{error:`propertyFilter.op must be one of: ${[...L].join(`, `)}`}:r===void 0?{error:`propertyFilter.value is required`}:{key:t,op:n,value:r}}function U(e,t){let n=e[t.key];if(n===void 0)return!1;if(t.op===`eq`)return n===t.value||String(n)===String(t.value);if(t.op===`contains`)return String(n).includes(String(t.value));let r=Number(n),i=Number(t.value);return!Number.isFinite(r)||!Number.isFinite(i)?!1:t.op===`gt`?r>i:r<i}function de(e){if(e==null)return null;if(!z(e))return{error:`bounds must be an object`};let t=e.x,n=e.y,r=e.width,i=e.height;return[t,n,r,i].every(e=>typeof e==`number`&&Number.isFinite(e))?{x:t,y:n,width:r,height:i}:{error:`bounds requires numeric x, y, width, height`}}function W(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}function fe(e,t){let n=W(e,`x`),r=W(e,`y`),i=W(e,`width`),a=W(e,`height`);return n===void 0||r===void 0||i===void 0||a===void 0?!1:n<t.x+t.width&&n+i>t.x&&r<t.y+t.height&&r+a>t.y}async function pe(e){let n=e.sceneTree;if(n==null)return t({success:!1,error:`sceneTree is required (pass the output of canvas_scene_dump)`});let r=typeof e.namePattern==`string`?e.namePattern:void 0,i=typeof e.typeFilter==`string`?e.typeFilter:void 0,a=typeof e.maxResults==`number`&&e.maxResults>0?e.maxResults:100,o=H(e.propertyFilter);if(o&&`error`in o)return t({success:!1,error:o.error});let s=o,c=de(e.bounds);if(c&&`error`in c)return t({success:!1,error:c.error});let l=c,u;if(r)try{u=new RegExp(r,`i`)}catch{return t({success:!1,error:`Invalid namePattern regex: ${r}`})}let d=B(n);if(d.length===0)return t({success:!1,error:`sceneTree did not contain any recognizable scene nodes`});let f=[],p=0,m=(e,t,n)=>{p++;let r=R(e.name),a=R(e.type),o=!u||u.test(r),c=!i||a.toLowerCase()===i.toLowerCase(),d=!s||U(e,s),h=!l||fe(e,l);if(o&&c&&d&&h&&(u||i||s||l)&&f.push({name:r,type:a,path:[...t,r||a||`<anonymous>`],depth:n,...typeof e.id==`string`||typeof e.id==`number`?{id:String(e.id)}:{},properties:V(e)}),Array.isArray(e.children)){let i=[...t,r||a||`<anonymous>`];for(let t of e.children)z(t)&&m(t,i,n+1)}};for(let e of d)if(m(e,[],0),f.length>=a)break;let h=f.length>a,g=f.slice(0,a);return t({success:!0,matchedCount:f.length,truncated:h,matches:g,nodesScanned:p})}const me=new Set([`install`,`read`,`uninstall`]);function he(e){return`(function(){var MAX=${Math.max(1,Math.floor(e))};if(window.__jshookDrawHookInstalled){return{installed:true,alreadyInstalled:true,entryCount:(window.__jshookDrawLog||[]).length};}var log=[];window.__jshookDrawLog=log;var orig={};function ser(args){var out=[];for(var i=0;i<Math.min(args.length,6);i++){var v=args[i];var t=typeof v;if(t==="string"){out.push(v.length>200?v.slice(0,200)+"…":v);}else if(t==="number"||t==="boolean"){out.push(v);}else if(v==null){out.push(null);}else{out.push("["+t+"]");}}return out;}function record(kind,args,ctx){if(log.length>=MAX){log.shift();}var entry={kind:kind,args:ser(args),t:Date.now()};var canvas=ctx&&ctx.canvas;if(canvas&&canvas.id){entry.canvasId=canvas.id;}log.push(entry);}var c2d=window.CanvasRenderingContext2D&&window.CanvasRenderingContext2D.prototype;if(c2d){["drawImage","fillText","strokeText"].forEach(function(fn){if(typeof c2d[fn]!=="function"){return;}orig[fn]=c2d[fn];c2d[fn]=function(){try{record(fn,arguments,this);}catch(e){}return orig[fn].apply(this,arguments);};});}function hookGL(Ctor,name){if(!Ctor||!Ctor.prototype){return;}var p=Ctor.prototype;["drawArrays","drawElements"].forEach(function(fn){if(typeof p[fn]!=="function"){return;}var key=name+"."+fn;orig[key]=p[fn];p[fn]=function(){try{record(fn,arguments,this);}catch(e){}return orig[key].apply(this,arguments);};});}hookGL(window.WebGLRenderingContext,"webgl");hookGL(window.WebGL2RenderingContext,"webgl2");window.__jshookDrawOrig=orig;window.__jshookDrawHookInstalled=true;return{installed:true};})()`}function ge(e){return`(function(){var log=window.__jshookDrawLog||[];var copy=log.slice();if(${e}){log.length=0;}return{entries:copy,count:copy.length,installed:!!window.__jshookDrawHookInstalled};})()`}function _e(){return`(function(){if(!window.__jshookDrawHookInstalled){return{uninstalled:false,notInstalled:true};}var orig=window.__jshookDrawOrig||{};var c2d=window.CanvasRenderingContext2D&&window.CanvasRenderingContext2D.prototype;if(c2d){["drawImage","fillText","strokeText"].forEach(function(fn){if(orig[fn]){c2d[fn]=orig[fn];}});}["webgl","webgl2"].forEach(function(name){var Ctor=name==="webgl"?window.WebGLRenderingContext:window.WebGL2RenderingContext;var p=Ctor&&Ctor.prototype;if(!p){return;}["drawArrays","drawElements"].forEach(function(fn){var key=name+"."+fn;if(orig[key]){p[fn]=orig[key];}});});window.__jshookDrawHookInstalled=false;return{uninstalled:true};})()`}async function ve(e,n){let i=o(n,`action`,me,`install`),s=a(n,`persistent`,!1),c=r(n,`maxEntries`,1e3),l=a(n,`clear`,!1);try{if(i===`install`){let n=he(c),r=e,i=s&&typeof r.evaluateOnNewDocument==`function`;return i&&await r.evaluateOnNewDocument(n),t({action:`install`,persistent:i,...await e.evaluate(n),...s&&!i?{persistentNote:`evaluateOnNewDocument unavailable on this controller; hook installed for the current page only`}:{}})}return t(i===`read`?{action:`read`,clear:l,...await e.evaluate(ge(l))}:{action:`uninstall`,...await e.evaluate(_e())})}catch(e){return t({action:i,success:!1,error:e instanceof Error?e.message:String(e)})}}var ye=class{pageController;debuggerManager;evidenceStore;constructor(e){this.pageController=e.pageController,this.debuggerManager=e.debuggerManager,this.evidenceStore=e.evidenceStore}async handleFingerprintTool(e){return s(async()=>await this.handleFingerprint(e))}async handleSceneDumpTool(e){return s(async()=>await this.handleSceneDump(e))}async handlePickTool(e){return s(async()=>await this.handlePick(e))}async handleTraceClickTool(e){return s(async()=>await this.handleTraceClick(e))}async handleSceneSearchTool(e){return s(async()=>await this.handleSceneSearch(e))}async handleDrawHookTool(e){return s(async()=>await this.handleDrawHook(e))}async handleFingerprint(e){return t(await ce(this.pageController,e))}async handleSceneDump(e){return t(await le(this.pageController,e))}async handlePick(e){let n=r(e,`x`,0),i=r(e,`y`,0);return t(await ue(this.pageController,{...e,x:n,y:i}))}async handleTraceClick(e){return t(await k(this.pageController,this.debuggerManager,this.evidenceStore,e))}async handleSceneSearch(e){return pe(e)}async handleDrawHook(e){return ve(this.pageController,e)}};function G(e){return typeof e!=`object`||!e||!(`evaluate`in e)?!1:typeof e.evaluate==`function`}function be(e){return typeof e!=`object`||!e||!(`getExtension`in e)||!(`getParameter`in e)||!(`RENDERER`in e)||!(`VERSION`in e)?!1:typeof e.getExtension==`function`&&typeof e.getParameter==`function`}function xe(e){let t=(e??``).toLowerCase();return t.includes(`vulkan`)?`vulkan`:t.includes(`metal`)?`metal`:t.includes(`d3d`)||t.includes(`direct3d`)?`direct3d`:t.includes(`angle`)||t.includes(`opengl`)||t.includes(`mesa`)||t.includes(`gl`)?`opengl`:t.includes(`swiftshader`)||t.includes(`software`)||t.includes(`cpu`)?`cpu`:t.length>0?`gpu`:`cpu`}function K(e){let t=0;for(let n of e)t+=1,t+=K(n.children);return t}function Se(e){let t=e.getAttribute(`aria-label`);if(t)return t;if(e.id)return e.id;let n=typeof e.className==`string`?e.className.trim():``;return n.length>0?n:e.tagName.toLowerCase()}function Ce(e){if(typeof e.getBoundingClientRect!=`function`)return;let t=e.getBoundingClientRect();return{x:t.x,y:t.y,width:t.width,height:t.height}}function we(e){if(!(e instanceof HTMLElement)||typeof window>`u`)return;let t=window.getComputedStyle(e);return t.display!==`none`&&t.visibility!==`hidden`}function q(e,t){let n=Array.from(e.children).slice(0,12).map((e,n)=>q(e,`${t}-${n}`));return{id:e.id||t,type:e.tagName.toLowerCase(),label:Se(e),children:n,visible:we(e),bounds:Ce(e)}}function J(){let e=[{id:`mock-root`,type:`canvas`,label:`mock-skia-surface`,visible:!0,bounds:{x:0,y:0,width:640,height:480},children:[{id:`mock-layer`,type:`layer`,label:`mock-layer`,visible:!0,bounds:{x:16,y:16,width:320,height:160},children:[]}]}];return{rootNodes:e,totalNodes:K(e),extractedAt:new Date().toISOString()}}function Te(e){let t=`software`,n=`Raster`;return e.backend===`vulkan`?(t=`vulkan`,n=`Vulkan`):e.backend===`metal`?(t=`metal`,n=`Metal`):(e.backend===`opengl`||e.backend===`direct3d`||e.backend===`gpu`)&&(t=`gl`,n=`OpenGL`),{isSkiaBacked:e.backend!==`cpu`,version:e.version??null,gpuBackend:t,shaderPipeline:n,rendererStrings:e.gpu?[e.gpu]:[],features:e.backend===`cpu`?[]:[`backend:${e.backend}`],confidence:e.backend===`cpu`?.2:.8,evidence:e.gpu?[`Renderer string: ${e.gpu}`]:[`No renderer information available`]}}function Ee(e,t){return e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height}function De(e){let t=(e??``).toLowerCase();return t.includes(`rrect`)||t.includes(`round`)?`drawRRect`:t.includes(`rect`)?`drawRect`:t.includes(`text`)?`drawText`:t.includes(`image`)||t.includes(`sprite`)?`drawImage`:t.includes(`path`)?`drawPath`:t.includes(`circle`)||t.includes(`arc`)?`drawCircle`:t.includes(`line`)?`drawLine`:`unknown`}function Oe(e){let t=e.layers.map((e,t)=>({id:e.id??`layer-${t}`,name:e.name??`layer-${t}`,bounds:e.bounds??{x:0,y:0,width:0,height:0},transform:e.transform??[1,0,0,0,1,0,0,0,1],opacity:e.opacity??1,visible:e.visible??!0,children:[],customData:e.customData})),n=t[0]??null;if(n)for(let e=1;e<t.length;e+=1){let r=t[e];r&&Ee(r.bounds,n.bounds)&&n.children.push(r)}let r=e.drawCommands.map(e=>({type:De(e.type),bounds:e.bounds??{x:0,y:0,width:0,height:0},paintInfo:e.paintInfo??{},layerId:e.layerId}));return{rootLayer:n,layers:t,drawCommands:r,totalLayers:t.length,totalDrawCommands:r.length,canvas:{id:e.canvas.id,width:e.canvas.width??0,height:e.canvas.height??0,dpr:e.canvas.dpr??1,contextType:e.canvas.contextType??`unknown`}}}function Y(e){return{id:e.id,name:e.label,bounds:e.bounds??{x:0,y:0,width:0,height:0},transform:[1,0,0,0,1,0,0,0,1],opacity:1,visible:e.visible??!0,children:e.children.map(e=>Y(e))}}function ke(e){let t=e.rootNodes.map(e=>Y(e));return{rootLayer:t[0]??null,layers:t,drawCommands:[],totalLayers:t.length,totalDrawCommands:0,canvas:{width:t[0]?.bounds.width??0,height:t[0]?.bounds.height??0,dpr:1,contextType:`mock`}}}function Ae(e){for(let t of e){let e=t.match(/(\d+\.\d+(?:\.\d+)?)/);if(e&&e[1])return e[1]}return null}function je(e){let t=e.join(` `).toLowerCase();return t.includes(`metal`)?`metal`:t.includes(`vulkan`)?`vulkan`:t.includes(`swiftshader`)||t.includes(`software`)?`software`:t.length>0?`gl`:`software`}function Me(e){let t=e.join(` `).toLowerCase();return t.includes(`metal`)?`Metal`:t.includes(`vulkan`)?`Vulkan`:t.includes(`swiftshader`)||t.includes(`software`)?`Raster`:t.length>0?`OpenGL`:`Raster`}function Ne(e,t,n){let r=e.flatMap(e=>{let t=[];return e.unmaskedRenderer&&t.push(e.unmaskedRenderer),e.renderer&&t.push(e.renderer),t}),i=[],a=[];t.hasSkiaFontSignatures&&(i.push(`fontBoundingBoxAscent/Descent available`),a.push(`Canvas text metrics expose font bounding boxes`));for(let e of n.engines)i.push(`engine:${e}`),a.push(`Detected known Skia-adjacent engine: ${e}`);for(let t of e)t.hasSkiaBackend&&t.unmaskedRenderer&&a.push(`Renderer probe: ${t.unmaskedRenderer}`);let o=e.some(e=>e.hasSkiaBackend)||n.isSkiaEngine||t.hasSkiaFontSignatures,s=.1;e.some(e=>e.hasSkiaBackend)&&(s+=.5),n.isSkiaEngine&&(s+=.3),t.hasSkiaFontSignatures&&(s+=.1);let c=o?je(r):`software`,l=o?Me(r):`Raster`;return{isSkiaBacked:o,version:Ae(r),gpuBackend:c,shaderPipeline:l,rendererStrings:r,features:i,confidence:Math.min(s,1),evidence:a}}var X=class{detectSkiaRenderer(){if(typeof document>`u`)return{backend:`cpu`,version:`mock`,gpu:`browser-context-unavailable`};let e=document.querySelector(`canvas`);if(!(e instanceof HTMLCanvasElement))return{backend:`cpu`,version:`mock`,gpu:`no-canvas-detected`};let t=e.getContext(`webgl2`)||e.getContext(`webgl`)||e.getContext(`experimental-webgl`);if(!be(t))return{backend:`cpu`,version:`mock`,gpu:`canvas-without-webgl`};let n,r=t.getExtension(`WEBGL_debug_renderer_info`);if(r){let e=t.getParameter(r.UNMASKED_RENDERER_WEBGL);typeof e==`string`&&e.trim().length>0&&(n=e)}if(!n){let e=t.getParameter(t.RENDERER);typeof e==`string`&&e.trim().length>0&&(n=e)}let i,a=t.getParameter(t.VERSION);return typeof a==`string`&&a.trim().length>0&&(i=a),{backend:xe(n),version:i,gpu:n}}extractSceneTree(e){if(typeof document>`u`)return J();let t=e?document.querySelector(e):document.querySelector(`canvas`);if(!(t instanceof HTMLCanvasElement))return J();let n=q(t,`skia-root`);if(t.parentElement){let e=Array.from(t.parentElement.children).filter(e=>e!==t).slice(0,8).map((e,t)=>q(e,`skia-sibling-${t}`));n.children.push(...e)}let r=[n];return{rootNodes:r,totalNodes:K(r),extractedAt:new Date().toISOString()}}};async function Pe(e,t){return G(e)?Ne(await e.evaluate(`(() => { /* UNMASKED_RENDERER_WEBGL ${t??``} */ return []; })()`),await e.evaluate(`(() => { /* fontBoundingBoxAscent */ return { hasSkiaFontSignatures: false, textMetrics: null }; })()`),await e.evaluate(`(() => { /* window.cc window.legacyCC */ return { engines: [], isSkiaEngine: false }; })()`)):Te(new X().detectSkiaRenderer())}async function Z(e,t,n=!0){return G(e)?Oe(await e.evaluate(`(() => { /* drawCommands canvasMeta ${t??``} */ return { canvas: {}, layers: [], drawCommands: [] }; })()`)):ke(new X().extractSceneTree(t))}function Fe(e,t){let n=[],r=new Set,i=new Set,a=Le(e);for(let e of a){let a=null;for(let n of t){let t=Ie(e,n);t&&(!a||t.confidence>a.confidence)&&(a=t)}a&&a.confidence>=.3&&(n.push(a),r.add(a.skiaObjectId),i.add(a.jsObjectId))}let o=[...new Set(a.map(e=>e.id))].filter(e=>!r.has(e)),s=t.filter(e=>!i.has(e.objectId)).map(e=>e.objectId),c=n.reduce((e,t)=>e+t.confidence,0),l=n.length>0?c/n.length:0;return{correlations:n,unmatchedJSObjects:s,unmatchedSkiaObjects:o,summary:{totalSkiaObjects:a.length,totalJSObjects:t.length,matchedCount:n.length,averageConfidence:Math.round(l*100)/100}}}function Ie(e,t){if(e.text){for(let n of t.stringProps)if(n===e.text||n.includes(e.text)&&e.text.length>3)return{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name||t.className,confidence:.85,matchType:`text`,explanation:`Draw text "${e.text.slice(0,50)}" matches JS string property`}}let n=ze(e.bounds,t.numericProps);if(n)return{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name||t.className,confidence:n.confidence,matchType:`dimension`,explanation:n.explanation};if(e.color){for(let n of t.colorProps)if(Ve(n,e.color))return{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name||t.className,confidence:.7,matchType:`color`,explanation:`Color ${e.color} matches JS color property "${n}"`}}if(e.type===`drawImage`){let n=e.color;if(n){for(let r of t.urlProps)if(r===n||r.includes(n))return{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name||t.className,confidence:.8,matchType:`url`,explanation:`Image URL matches JS property`}}}if(e.name){if(t.name&&$(e.name,t.name))return{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name,confidence:.75,matchType:`name`,explanation:`Object name "${e.name}" matches JS object "${t.name}"`};for(let n of t.stringProps)if($(e.name,n))return{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name||t.className,confidence:.6,matchType:`name`,explanation:`Skia layer name matches JS string property`}}let r=Be(e.bounds,t.numericProps);return r?{skiaObjectId:e.id,jsObjectId:t.objectId,jsObjectName:t.name||t.className,confidence:r.confidence,matchType:`geometry`,explanation:r.explanation}:null}function Le(e){let t=[];for(let n of e.layers)t.push({id:n.id,type:`layer`,name:n.name,bounds:n.bounds,color:n.customData?.color});for(let n of e.drawCommands){let e=Re(n.paintInfo),r=Q(n.paintInfo);t.push({id:`cmd_${n.type}_${n.bounds.x}_${n.bounds.y}`,type:n.type,name:`${n.type} at (${n.bounds.x}, ${n.bounds.y})`,text:e,bounds:n.bounds,color:r})}return t}function Re(e){if(typeof e.text==`string`)return e.text;if(typeof e.content==`string`)return e.content}function Q(e){if(typeof e.color==`string`)return e.color;if(typeof e.fillColor==`string`)return e.fillColor;if(typeof e.strokeColor==`string`)return e.strokeColor;if(typeof e.url==`string`)return e.url;if(typeof e.src==`string`)return e.src}function ze(e,t){let n=[`width`,`height`,`w`,`h`,`sizeX`,`sizeY`,`sw`,`sh`],r=!1,i=!1;for(let a of n){let n=t[a];n!==void 0&&((a===`width`||a===`w`||a===`sizeX`||a===`sw`)&&Math.abs(n-e.width)<=2&&(r=!0),(a===`height`||a===`h`||a===`sizeY`||a===`sh`)&&Math.abs(n-e.height)<=2&&(i=!0))}return r&&i?{confidence:.75,explanation:`Dimensions ${e.width}x${e.height} match JS numeric properties`}:r||i?{confidence:.45,explanation:`Partial dimension match for ${e.width}x${e.height}`}:null}function Be(e,t){let n=!1,r=!1;for(let[i,a]of Object.entries(t))(i===`x`||i===`posX`||i===`left`)&&Math.abs(a-e.x)<=5&&(n=!0),(i===`y`||i===`posY`||i===`top`)&&Math.abs(a-e.y)<=5&&(r=!0);return n&&r?{confidence:.5,explanation:`Position (${e.x}, ${e.y}) matches JS numeric properties`}:null}function $(e,t){return e.toLowerCase()===t.toLowerCase()||e.toLowerCase().includes(t.toLowerCase())||t.toLowerCase().includes(e.toLowerCase())}function Ve(e,t){return e.toLowerCase().replace(/\s/g,``)===t.toLowerCase().replace(/\s/g,``)}async function He(e,t){let r=n(t,`canvasId`);return{rendererInfo:await Pe(e,r||void 0),canvasId:r||`auto`,detectionComplete:!0}}async function Ue(e,t){let r=n(t,`canvasId`),i=a(t,`includeDrawCommands`,!0);return{sceneTree:await Z(e,r||void 0,i),canvasId:r||`auto`,extractionComplete:!0}}async function We(t,r,a){let o=n(r,`canvasId`),s=i(r,`skiaNodeIds`),c=await Z(t,o||void 0,!0);if(c.layers.length===0&&c.drawCommands.length===0)throw new e(`PREREQUISITE`,`No Skia scene data available for correlation`);let l=[];if(a)try{l=await a()}catch{l=[]}let u=c;if(s.length>0){let e=new Set(s);u={...c,layers:c.layers.filter(t=>e.has(t.id)),drawCommands:c.drawCommands.filter(t=>{let n=t.layerId;return n===void 0||e.has(n)})}}return{correlations:Fe(u,l),canvasId:o||`auto`,skiaNodeIds:s.length>0?s:void 0,correlationComplete:!0}}var Ge=class{deps;constructor(e){this.deps=e}async handleSkiaDetectRendererTool(e){return s(async()=>await this.handleSkiaDetectRenderer(e))}async handleSkiaExtractSceneTool(e){return s(async()=>await this.handleSkiaExtractScene(e))}async handleSkiaCorrelateObjectsTool(e){return s(async()=>await this.handleSkiaCorrelateObjects(e))}async handleSkiaDetectRenderer(t){if(!this.deps.pageController)throw new e(`PREREQUISITE`,`PageController not available — ensure browser is connected`);return He(this.deps.pageController,t)}async handleSkiaExtractScene(t){if(!this.deps.pageController)throw new e(`PREREQUISITE`,`PageController not available — ensure browser is connected`);let n=await Ue(this.deps.pageController,t),r=n?.sceneTree;return r&&this.deps.eventBus?.emit(`skia:scene_captured`,{canvasId:t.canvasId??`auto`,nodeCount:(r.layers?.length??0)+(r.drawCommands?.length??0),timestamp:new Date().toISOString()}),n}async handleSkiaCorrelateObjects(t){if(!this.deps.pageController)throw new e(`PREREQUISITE`,`PageController not available — ensure browser is connected`);return We(this.deps.pageController,t,this.deps.getJSObjects)}};export{ye as CanvasToolHandlers,Ge as SkiaCaptureHandlers};