@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.
- package/README.md +19 -4
- package/README.zh.md +19 -4
- package/dist/AntiCheatDetector-B-mz4DK_.mjs +1 -0
- package/dist/{BrowserSessionCoordinator-BJ-HOxo0.mjs → BrowserSessionCoordinator-Cdic8FsH.mjs} +1 -1
- package/dist/CodeAnalyzerDataFlow-a-NkwcaG.mjs +2 -0
- package/dist/CodeInjector-B099WO6x.mjs +1 -0
- package/dist/ConsoleMonitor-BZRqrBH-.mjs +306 -0
- package/dist/CpuEngine-BC8jayy9.mjs +1 -0
- package/dist/DartAotExecutor-B7WVTKsd.mjs +1 -0
- package/dist/DartAotLoader-BxdhW-K2.mjs +2 -0
- package/dist/DarwinAPI-DzojdfjF.mjs +1 -0
- package/dist/DetailedDataManager-Dgh402Gp.mjs +5 -0
- package/dist/ExecutionSandbox-QbWQmzuC.mjs +45 -0
- package/dist/ExtensionManager.tools-D3h818Xs.mjs +1 -0
- package/dist/FingerprintManager-D9Zlr6be.mjs +1 -0
- package/dist/HardwareBreakpoint-C_lJ22bj.mjs +1 -0
- package/dist/HeapAnalyzer-bJbLvzp6.mjs +1 -0
- package/dist/HookPatternScanner-yx4vJ9sd.mjs +1 -0
- package/dist/InstrumentationSession-Cv1wikLA.mjs +1 -0
- package/dist/IntegrityScanner-BB7sw-SA.mjs +1 -0
- package/dist/JScramblerDeobfuscator-NVR5VatT.mjs +1 -0
- package/dist/MCPServer.activation.ttl-C2wOCMLV.mjs +1 -0
- package/dist/MCPServer.search.helpers-DlassAew.mjs +2 -0
- package/dist/MCPServer.search.validation-DnifPCCv.mjs +1 -0
- package/dist/MemoryController-CCsGuGJS.mjs +2 -0
- package/dist/{MemoryScanSession-DG_F-PjE.mjs → MemoryScanSession-BZ2A9Ph1.mjs} +1 -1
- package/dist/MemoryScanner-DAxsq7Sx.mjs +1 -0
- package/dist/NativeMemoryManager.impl-BIJzXMqH.mjs +1 -0
- package/dist/{NativeMemoryManager.utils-BHy1P_jM.mjs → NativeMemoryManager.utils-CMoul2an.mjs} +1 -1
- package/dist/PEAnalyzer-CB_kaTis.mjs +1 -0
- package/dist/PackerDeobfuscator-BpwGjxDL.mjs +7 -0
- package/dist/PointerChainEngine-B6SYv6ZM.mjs +1 -0
- package/dist/ProcessRegistry-C5W1Tkn9.mjs +1 -0
- package/dist/{handlers-mPFiNPe8.mjs → QuickJSSandbox-CIde-jzG.mjs} +2 -5
- package/dist/{ResponseBuilder-BfWP-uaT.mjs → ResponseBuilder-BLicSCjn.mjs} +1 -1
- package/dist/ReverseEvidenceGraph-DJzk0GQz.mjs +2 -0
- package/dist/ServerRuntimeState-DGXNv8Ji.mjs +1 -0
- package/dist/Speedhack-MGoeq1ZS.mjs +1 -0
- package/dist/StructureAnalyzer-CCTWAXR3.mjs +2 -0
- package/dist/ToolHandlerMap-C40EmuLT.mjs +1 -0
- package/dist/{ToolProbe-C7ZU2x7M.mjs → ToolProbe-B02GC3ZY.mjs} +1 -1
- package/dist/ToolRegistry-CzqQxFqf.mjs +1 -0
- package/dist/ToolRouter.policy-Bgb3S8jc.mjs +4 -0
- package/dist/TraceRecorder-BfeCTQUj.mjs +407 -0
- package/dist/VMDeobfuscator-BHtkV850.mjs +1 -0
- package/dist/Win32API-G7QPyckq.mjs +1 -0
- package/dist/{Win32Debug-CYrIQBvr.mjs → Win32Debug-6yzmtv5b.mjs} +1 -1
- package/dist/allocation-track-CiI-CnaI.mjs +1 -0
- package/dist/analysis-CojUzwX-.mjs +27 -0
- package/dist/antidebug-CgU84TE1.mjs +1 -0
- package/dist/apk-DrPBsOq8.mjs +1 -0
- package/dist/artifactRetention-Bk6fW2uF.mjs +1 -0
- package/dist/artifacts-Bx9GLx4J.mjs +1 -0
- package/dist/ast-bridge-BlOrmVAv.mjs +1 -0
- package/dist/ast-utils-B9E5k_v1.mjs +1 -0
- package/dist/{betterSqlite3-Brtq-SIQ.mjs → betterSqlite3-Bdo_ifuJ.mjs} +1 -1
- package/dist/binary-instrument-DiE1BP0x.mjs +12 -0
- package/dist/boringssl-inspector-C6M3sOga.mjs +2 -0
- package/dist/browser-QDUu5ML9.mjs +29 -0
- package/dist/{handlers-yo_xYzT8.mjs → canvas-g5kmLdY-.mjs} +1098 -24
- package/dist/{capabilities-CyXuKUl1.mjs → capabilities-DwzyxL2w.mjs} +1 -1
- package/dist/cdp-session-Dy4OwMOP.mjs +1 -0
- package/dist/collector-Cld4i-E4.mjs +1 -0
- package/dist/config-5ODJ3Aj0.mjs +3 -0
- package/dist/constants-nvsLpSri.mjs +1 -0
- package/dist/coordination-C6y2gM9O.mjs +98 -0
- package/dist/coverage-and-block--cWjjEe5.mjs +1 -0
- package/dist/dart-inspector-D4IKxZ6u.mjs +0 -0
- package/dist/debugger-C2SpiXoO.mjs +1 -0
- package/dist/definitions-0mtilYzG.mjs +1 -0
- package/dist/definitions-9csunmeX.mjs +1 -0
- package/dist/definitions-B11MudW_.mjs +1 -0
- package/dist/definitions-BKpRDjcI.mjs +1 -0
- package/dist/definitions-BXE3H4re.mjs +1 -0
- package/dist/definitions-BlPHe5DX.mjs +1 -0
- package/dist/definitions-Bob4XMxI.mjs +27 -0
- package/dist/definitions-BpIQN2nm.mjs +1 -0
- package/dist/definitions-BvolWeSu.mjs +1 -0
- package/dist/definitions-C-6j3Ejl.mjs +1 -0
- package/dist/definitions-C-AdFfFu.mjs +1 -0
- package/dist/definitions-CArdw_9T.mjs +1 -0
- package/dist/definitions-CCvIcRrT.mjs +1 -0
- package/dist/definitions-CJPE5PIl.mjs +1 -0
- package/dist/definitions-CbqeW06u.mjs +1 -0
- package/dist/definitions-Cexmkypg.mjs +1 -0
- package/dist/definitions-D1dxl8qt.mjs +1 -0
- package/dist/definitions-D3uT-ZbU.mjs +1 -0
- package/dist/definitions-DtOY5iUc.mjs +1 -0
- package/dist/{definitions-DxFNRQNK2.mjs → definitions-DvrYdDCJ2.mjs} +1 -1
- package/dist/{definitions-Cenu6mxo.mjs → definitions-aeRd5DAR.mjs} +1 -1
- package/dist/definitions-ihxOqOC4.mjs +1 -0
- package/dist/deopt-trace-qnAcC931.mjs +17 -0
- package/dist/disasm-DoxSucGp.mjs +1 -0
- package/dist/dumpsys-parser-Du-5ruEe.mjs +2 -0
- package/dist/encoding-UMtwgy4M.mjs +2 -0
- package/dist/ensure-browser-core-BP70x0TB.mjs +285 -0
- package/dist/factory-BeND77hf.mjs +2 -0
- package/dist/graphql-CF7QKJME.mjs +68 -0
- package/dist/grpc-raw-Dp7ps2sv.mjs +1 -0
- package/dist/handlers--qCl9vNv.mjs +1 -0
- package/dist/handlers-BHIu1LqA.mjs +1 -0
- package/dist/{antidebug-7L3ygj_9.mjs → handlers-BQ4K8Jbr.mjs} +2 -2
- package/dist/handlers-BxQv-wtf.mjs +8 -0
- package/dist/handlers-ByYG27-5.mjs +1 -0
- package/dist/handlers-C0I9-BtX.mjs +5 -0
- package/dist/handlers-CL0Iokmw.mjs +1 -0
- package/dist/handlers-CNbhIdSK.mjs +4 -0
- package/dist/handlers-CnTTSJFs.mjs +109 -0
- package/dist/handlers-CoDx6akJ2.mjs +49 -0
- package/dist/{handlers-0yKLRIfo.mjs → handlers-DASJI0Pn.mjs} +1 -1
- package/dist/handlers-DRKMaA-_.mjs +74 -0
- package/dist/handlers-Dalu0olz.mjs +2 -0
- package/dist/handlers-KY0g31ny.mjs +9 -0
- package/dist/handlers-oGo60aVv.mjs +1 -0
- package/dist/handlers.impl-BTXLw6Qc.mjs +1 -0
- package/dist/heap-sampling-BqdiU-5j.mjs +1 -0
- package/dist/{hooks-D4XLfgtV.mjs → hooks-COK3t5rT.mjs} +52 -33
- package/dist/index.mjs +11 -11
- package/dist/logger-BGCcd-jJ.mjs +1 -0
- package/dist/macro-nUYUjKNZ.mjs +2 -0
- package/dist/maintenance-CfnE7ZKU.mjs +4 -0
- package/dist/manifest-7EOTUc0D.mjs +1 -0
- package/dist/manifest-B5ujuQmf.mjs +1 -0
- package/dist/manifest-BErXl3zn.mjs +1 -0
- package/dist/manifest-BKA-mD3J.mjs +1 -0
- package/dist/manifest-BUXj23bX.mjs +1 -0
- package/dist/manifest-BfXt9cau.mjs +1 -0
- package/dist/manifest-Bx-tpURK.mjs +1 -0
- package/dist/manifest-C0owVAdq.mjs +1 -0
- package/dist/manifest-C5XqYc9o.mjs +1 -0
- package/dist/manifest-CVKzLjsA.mjs +1 -0
- package/dist/manifest-CaeFjdhj.mjs +1 -0
- package/dist/manifest-CegBgip0.mjs +1 -0
- package/dist/manifest-CoJHqlgS.mjs +1 -0
- package/dist/manifest-D0dbtDqd.mjs +1 -0
- package/dist/manifest-D5Gr8ujd.mjs +12 -0
- package/dist/manifest-D82z-5og.mjs +1 -0
- package/dist/manifest-DA2afIwh.mjs +1 -0
- package/dist/manifest-DAbiFP5o.mjs +1 -0
- package/dist/manifest-DEY0s1O72.mjs +1 -0
- package/dist/manifest-DTOqNqiA.mjs +1 -0
- package/dist/manifest-DZ6ELNgX.mjs +1 -0
- package/dist/manifest-DjHkjddT.mjs +1 -0
- package/dist/manifest-DocA_itf2.mjs +1 -0
- package/dist/manifest-Dpnhvfq0.mjs +1 -0
- package/dist/manifest-DucPMG_a.mjs +1 -0
- package/dist/manifest-Dw5yYEac.mjs +1 -0
- package/dist/manifest-Ic_Cg66S.mjs +1 -0
- package/dist/manifest-JHaG6GMN.mjs +1 -0
- package/dist/manifest-QdkIzmYM.mjs +1 -0
- package/dist/manifest-YZqaCe25.mjs +1 -0
- package/dist/manifest-f0lUeXwq.mjs +1 -0
- package/dist/manifest-h-Ebisf8.mjs +1 -0
- package/dist/manifest-oOfTymBS.mjs +1 -0
- package/dist/manifest-qXqrO6KC.mjs +2 -0
- package/dist/mapsParser-DrJoeC0c.mjs +1 -0
- package/dist/modules-CC_ADmwi.mjs +333 -0
- package/dist/mojo-ipc-kVztXYw-.mjs +140 -0
- package/dist/native-D9ouskXO.mjs +961 -0
- package/dist/native-bridge-Dzd7hYoq.mjs +1 -0
- package/dist/network-C5Y-S87J.mjs +7 -0
- package/dist/one-gadget-CiWFE17F.mjs +1 -0
- package/dist/outputPaths-CHtELDyi.mjs +1 -0
- package/dist/parse-args-B6dwWc9k.mjs +1 -0
- package/dist/platform-BIXgJaM3.mjs +94 -0
- package/dist/process-aDIfLC0v.mjs +6 -0
- package/dist/proxy-DsHsQ1I4.mjs +2 -0
- package/dist/registry-7h8jJ9y9.mjs +1 -0
- package/dist/{registry-DH4sc1dt.mjs → registry-DJDnkQW2.mjs} +1 -1
- package/dist/response-R8ghbZSb.mjs +1 -0
- package/dist/retry-policy-DtYv0kDi.mjs +1 -0
- package/dist/reverseEngineeringConfig-BhZLOa3C.mjs +1 -0
- package/dist/safeOutput-Dt4mfjXA.mjs +1 -0
- package/dist/search-defaults-BBRJNAzC.mjs +1 -0
- package/dist/server/plugin-api.mjs +1 -1
- package/dist/server/search/EmbeddingWorker.d.mts +1 -0
- package/dist/server/search/EmbeddingWorker.mjs +1 -0
- package/dist/shared-BKtWZDGN.mjs +1 -0
- package/dist/sourcemap-2VIeVeKw.mjs +3 -0
- package/dist/streaming-DkpE3GGU.mjs +15 -0
- package/dist/syscall-DGZoYM_U.mjs +1 -0
- package/dist/transform-BJqsBC_-.mjs +105 -0
- package/dist/turbofan-graph-CbGHNVtl.mjs +1 -0
- package/dist/turbofan-inspect--NdCuYXi.mjs +23 -0
- package/dist/types-CWSvzmIh.mjs +1 -0
- package/dist/v8-inspector-CTJo08-K.mjs +297 -0
- package/dist/wasm-DX4Qm2Vs.mjs +235 -0
- package/dist/weakrefs-inspect-CnhaF-rN.mjs +57 -0
- package/dist/webgpu-D4-DxbxZ.mjs +6 -0
- package/dist/workflow-DHktRNF2.mjs +108 -0
- package/package.json +33 -27
- package/dist/AntiCheatDetector-B6d4Qe9D.mjs +0 -1
- package/dist/CodeInjector-Cll_7bLJ.mjs +0 -1
- package/dist/ConsoleMonitor-CxDJV15E.mjs +0 -306
- package/dist/DOMInspector-C19J4zeq.mjs +0 -95
- package/dist/DarwinAPI-ZfQdpLNI.mjs +0 -1
- package/dist/DetailedDataManager-DmQ1LT-W.mjs +0 -1
- package/dist/ExtensionManager-BD724zkO.mjs +0 -1
- package/dist/ExtensionManager.tools-oVMJgPcN.mjs +0 -1
- package/dist/FingerprintManager-DT0EAUEo.mjs +0 -1
- package/dist/HardwareBreakpoint-BUfPdp0f.mjs +0 -1
- package/dist/HeapAnalyzer-B_aqY8oj.mjs +0 -1
- package/dist/InstrumentationSession-D_G1ZPyd.mjs +0 -1
- package/dist/MCPServer.search.handlers.domain-BbS-6LnX.mjs +0 -1
- package/dist/MemoryController-X1XNSn1n.mjs +0 -2
- package/dist/MemoryScanner-g1_L1ub5.mjs +0 -1
- package/dist/NativeMemoryManager.impl-DniBe2wf.mjs +0 -1
- package/dist/NetworkMonitor-B_-au6aV.mjs +0 -185
- package/dist/PEAnalyzer-yWQaGrcx.mjs +0 -1
- package/dist/PageController-Dfsm1_o7.mjs +0 -1
- package/dist/PointerChainEngine-BhCUkmxY.mjs +0 -1
- package/dist/PrerequisiteError-BjCQA-gK.mjs +0 -1
- package/dist/ProcessRegistry-C-bN48oR.mjs +0 -1
- package/dist/ReverseEvidenceGraph-BhSYYdiI.mjs +0 -2
- package/dist/ScriptManager-LWGPTdvD.mjs +0 -7
- package/dist/ServerRuntimeState-D2bWHqEE.mjs +0 -1
- package/dist/Speedhack-yseDPSZ9.mjs +0 -1
- package/dist/StructureAnalyzer-C5lpuZkg.mjs +0 -2
- package/dist/ToolCatalog-CYdD9F5f.mjs +0 -1
- package/dist/ToolRegistry-C5oB8KP8.mjs +0 -1
- package/dist/ToolRouter.policy-CfhJczkt.mjs +0 -4
- package/dist/TraceRecorder-BiJWBXHX.mjs +0 -272
- package/dist/VersionDetector-CHT36Az0.mjs +0 -9
- package/dist/Win32API-eUCF57l_.mjs +0 -1
- package/dist/WorkflowEngine-D876meOO.mjs +0 -1
- package/dist/analysis-D4swdMvq.mjs +0 -6
- package/dist/apk-packer-BqXcInnX.mjs +0 -1
- package/dist/artifactRetention-BCPQASm7.mjs +0 -1
- package/dist/artifacts-CkodUM4j.mjs +0 -1
- package/dist/binary-instrument-DU7V6TUM.mjs +0 -7
- package/dist/binary-secrets-PdMVoyt0.mjs +0 -1
- package/dist/boringssl-inspector-BBaJwwkU.mjs +0 -2
- package/dist/browser-Qqco2rOT.mjs +0 -11
- package/dist/collector-Bpl6qy2L.mjs +0 -1
- package/dist/constants-BYj8Xek8.mjs +0 -1
- package/dist/coordination-CWXW1o8K.mjs +0 -1
- package/dist/dart-inspector-7AkPeZ_Q.mjs +0 -0
- package/dist/debugger-DyALjYMk.mjs +0 -1
- package/dist/definitions-BWxBke3r.mjs +0 -1
- package/dist/definitions-BYwATKc-.mjs +0 -1
- package/dist/definitions-B_83XfNQ.mjs +0 -1
- package/dist/definitions-Bf3H1EwV.mjs +0 -1
- package/dist/definitions-BftdXgXI.mjs +0 -1
- package/dist/definitions-Bio5XJYy.mjs +0 -1
- package/dist/definitions-C3qNgSn1.mjs +0 -1
- package/dist/definitions-CB6vmOer.mjs +0 -1
- package/dist/definitions-CMZRSy3k.mjs +0 -1
- package/dist/definitions-CQd7yCQH.mjs +0 -1
- package/dist/definitions-CT8ln6GQ.mjs +0 -1
- package/dist/definitions-D4g-MS10.mjs +0 -1
- package/dist/definitions-D5wl_8HN.mjs +0 -1
- package/dist/definitions-DAQm1Xar.mjs +0 -1
- package/dist/definitions-DP1vgxEY.mjs +0 -1
- package/dist/definitions-Ibci7e_L.mjs +0 -1
- package/dist/definitions-OeLvmlQy.mjs +0 -1
- package/dist/definitions-RZYGD_Ey.mjs +0 -1
- package/dist/definitions-Tls8c0A0.mjs +0 -1
- package/dist/definitions-bybDvnG0.mjs +0 -26
- package/dist/definitions-l7TjdE6V.mjs +0 -1
- package/dist/encoding-ycOaz8Vr.mjs +0 -2
- package/dist/ensure-browser-core-DxWC-NTp.mjs +0 -1
- package/dist/factory-CKr4fAE1.mjs +0 -1
- package/dist/flat-target-session-DvcQX7J5.mjs +0 -1
- package/dist/graphql-B2TiPEow.mjs +0 -62
- package/dist/handlers-8zN_vBIz.mjs +0 -1
- package/dist/handlers-B62K4FTc.mjs +0 -1
- package/dist/handlers-BpDlVVVU.mjs +0 -1
- package/dist/handlers-CMJK7m1c.mjs +0 -31
- package/dist/handlers-D2ZOul9p.mjs +0 -54
- package/dist/handlers-D5E40ssn.mjs +0 -5
- package/dist/handlers-DGbdQAgD.mjs +0 -4
- package/dist/handlers-DHO3rjsW.mjs +0 -1
- package/dist/handlers-FJ80VzUI.mjs +0 -2
- package/dist/handlers-VHWrxbM_.mjs +0 -1
- package/dist/handlers-l8QIKqBj.mjs +0 -2
- package/dist/handlers.impl-D9Hh8Bgl.mjs +0 -1
- package/dist/jadx-search-B_Yse0Zh.mjs +0 -5
- package/dist/logger-sBC6IdRT.mjs +0 -1
- package/dist/maintenance-BUpIukhg.mjs +0 -1
- package/dist/manifest-0Jpt_AQa.mjs +0 -1
- package/dist/manifest-B3fZbSWR.mjs +0 -1
- package/dist/manifest-B7NB2rh2.mjs +0 -1
- package/dist/manifest-BDi4nbH1.mjs +0 -1
- package/dist/manifest-BLDfkE7n.mjs +0 -1
- package/dist/manifest-BcXbB4gf.mjs +0 -1
- package/dist/manifest-Bdnc_vrc.mjs +0 -1
- package/dist/manifest-BuYKgCnp.mjs +0 -1
- package/dist/manifest-CBfNnGPV.mjs +0 -1
- package/dist/manifest-CPS1Xv69.mjs +0 -1
- package/dist/manifest-CQH9FhwI.mjs +0 -1
- package/dist/manifest-CRryuZF4.mjs +0 -1
- package/dist/manifest-CctIumog.mjs +0 -1
- package/dist/manifest-CvTe5ZGV2.mjs +0 -1
- package/dist/manifest-D-5GH0DV.mjs +0 -1
- package/dist/manifest-D3Ssf3IC.mjs +0 -1
- package/dist/manifest-D5ck3NvC.mjs +0 -1
- package/dist/manifest-D9jUUJAu.mjs +0 -1
- package/dist/manifest-DCx6w2XV.mjs +0 -1
- package/dist/manifest-DG19q-Ld.mjs +0 -1
- package/dist/manifest-DLMlD0Zc.mjs +0 -1
- package/dist/manifest-DYpn8w_h.mjs +0 -1
- package/dist/manifest-DYzWI8Xs.mjs +0 -1
- package/dist/manifest-D_obs5F4.mjs +0 -1
- package/dist/manifest-DujQqEQR.mjs +0 -2
- package/dist/manifest-DwL2ik8P.mjs +0 -1
- package/dist/manifest-ItF5P8A12.mjs +0 -1
- package/dist/manifest-KZphqIyX.mjs +0 -1
- package/dist/manifest-LG42zPLY2.mjs +0 -1
- package/dist/manifest-LLdI5m4T.mjs +0 -1
- package/dist/manifest-QYbQXJn0.mjs +0 -1
- package/dist/manifest-RcpX_MyZ.mjs +0 -123
- package/dist/manifest-YgVd8Sgz.mjs +0 -1
- package/dist/manifest-Zy7Odg5J.mjs +0 -1
- package/dist/manifest-ff1H7Pdp.mjs +0 -1
- package/dist/manifest-iuhF6pTL2.mjs +0 -1
- package/dist/manifest-nXHmtMSp2.mjs +0 -1
- package/dist/manifest-xWfu6iLo.mjs +0 -1
- package/dist/manifest-yC16OhL2.mjs +0 -1
- package/dist/manifest-ztWJoXy4.mjs +0 -1
- package/dist/matchesWildcardPattern-BAG6LvX5.mjs +0 -1
- package/dist/modules-BPBcSaM-.mjs +0 -333
- package/dist/mojo-ipc-BhwsdVUW.mjs +0 -9
- package/dist/native-j8l473zn.mjs +0 -961
- package/dist/network-T0VRwNPd.mjs +0 -7
- package/dist/outputPaths-B4Ic4RZh.mjs +0 -2
- package/dist/parse-args-Bw413PlW.mjs +0 -1
- package/dist/platform-CzaQtISh.mjs +0 -93
- package/dist/playwright-cdp-fallback-DqFdx9-s.mjs +0 -1
- package/dist/process-CWhsCWrf.mjs +0 -2
- package/dist/proxy-DZFlDsG3.mjs +0 -2
- package/dist/renderer-pid-9tJnZ_9N.mjs +0 -1
- package/dist/response-C7rKQst4.mjs +0 -1
- package/dist/search-defaults-lYBVn_3L.mjs +0 -1
- package/dist/shared-state-board-BSjXLUV1.mjs +0 -1
- package/dist/sourcemap-Dh3Ai_ur.mjs +0 -1
- package/dist/streaming-BcJ0B6ao.mjs +0 -1
- package/dist/transform-DOxzeWPB.mjs +0 -103
- package/dist/types-D9EiE5o9.mjs +0 -1
- package/dist/wasm-CZ_HTfKR.mjs +0 -174
- package/dist/webcrack-C1iYG_EX.mjs +0 -46
- package/dist/workflow-BdwQmARn.mjs +0 -101
- /package/dist/{CacheAdapters-CsNtQIR8.mjs → CacheAdapters-BlDrQg8f.mjs} +0 -0
- /package/dist/{EventBus-DL8iLA09.mjs → EventBus-Cm-t-B65.mjs} +0 -0
- /package/dist/{EvidenceGraphBridge-BtbwXsLC.mjs → EvidenceGraphBridge-DBDc0wUA.mjs} +0 -0
- /package/dist/{HookGeneratorBuilders.core.generators.storage-DzD6dIJd.mjs → HookGeneratorBuilders.core.generators.storage-CWaWpOHa.mjs} +0 -0
- /package/dist/{RingBuffer-Dm54ELKT.mjs → RingBuffer-B6RTHmij.mjs} +0 -0
- /package/dist/{StealthVerifier-BmcxfwSF.mjs → StealthVerifier-DMBrtkhN.mjs} +0 -0
- /package/dist/{ToolError-DWU_z7gp.mjs → ToolError-g3rjWzhx.mjs} +0 -0
- /package/dist/{authorization-schema-BOFwSXUN.mjs → authorization-schema-Jtikc5Yt.mjs} +0 -0
- /package/dist/{bind-helpers-m2U8glkF.mjs → bind-helpers-D0mGAOof.mjs} +0 -0
- /package/dist/{concurrency-DCr8WQ2M.mjs → concurrency-Dehnw4JC.mjs} +0 -0
- /package/dist/{evidence-graph-bridge-CV_UdYqj.mjs → evidence-graph-bridge-eT9icP6a.mjs} +0 -0
- /package/dist/{formatAddress-vLA_hOJt.mjs → formatAddress-DAcw4Ckg.mjs} +0 -0
- /package/dist/{chunk-C_pMuVsO.mjs → rolldown-runtime-88NL7fhV.mjs} +0 -0
- /package/dist/{ssrf-policy-CsIJGkpd.mjs → ssrf-policy-B72vdy23.mjs} +0 -0
- /package/dist/{tool-builder-qif8M9-K.mjs → tool-builder-CpLh-UQd.mjs} +0 -0
- /package/dist/{types-Fz69RzbZ.mjs → types-BzPBzmVB.mjs} +0 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-88NL7fhV.mjs";import{t}from"./logger-BGCcd-jJ.mjs";import{cn as n,dn as r,fn as i,in as a,rn as o,sn as s,un as c}from"./constants-nvsLpSri.mjs";import{t as l}from"./outputPaths-CHtELDyi.mjs";import{t as u}from"./ToolError-g3rjWzhx.mjs";import{createRequire as d}from"node:module";import{existsSync as f}from"fs";import p,{join as m}from"path";import h,{createHash as g}from"crypto";import{dirname as _,join as v}from"node:path";import{writeFile as y}from"node:fs/promises";import{promisify as b}from"util";import x,{readFile as S}from"fs/promises";import{gunzip as ee,gzip as te}from"zlib";import{homedir as ne}from"os";import{setImmediate as C,setTimeout as re}from"node:timers/promises";var w=class extends u{constructor(e){super(`PREREQUISITE`,e),this.name=`PrerequisiteError`}};function T(e){return`
|
|
2
|
+
(function() {
|
|
3
|
+
if (window.__xhrInterceptorInstalled) {
|
|
4
|
+
console.log('[XHRInterceptor] Already installed');
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
window.__xhrInterceptorInstalled = true;
|
|
8
|
+
|
|
9
|
+
const originalXHR = window.__originalXMLHttpRequestForHook || window.XMLHttpRequest;
|
|
10
|
+
window.__originalXMLHttpRequestForHook = originalXHR;
|
|
11
|
+
if (!window.__xhrRequests) {
|
|
12
|
+
window.__xhrRequests = [];
|
|
13
|
+
}
|
|
14
|
+
const xhrRequests = window.__xhrRequests;
|
|
15
|
+
|
|
16
|
+
window.XMLHttpRequest = function() {
|
|
17
|
+
const xhr = new originalXHR();
|
|
18
|
+
const requestInfo = {
|
|
19
|
+
method: '',
|
|
20
|
+
url: '',
|
|
21
|
+
requestHeaders: {},
|
|
22
|
+
responseHeaders: {},
|
|
23
|
+
status: 0,
|
|
24
|
+
response: null,
|
|
25
|
+
timestamp: Date.now(),
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const originalOpen = xhr.open;
|
|
29
|
+
xhr.open = function(method, url, ...args) {
|
|
30
|
+
requestInfo.method = method;
|
|
31
|
+
requestInfo.url = url;
|
|
32
|
+
console.log('[XHRInterceptor] XHR opened:', method, url);
|
|
33
|
+
return originalOpen.call(xhr, method, url, ...args);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const originalSetRequestHeader = xhr.setRequestHeader;
|
|
37
|
+
xhr.setRequestHeader = function(header, value) {
|
|
38
|
+
requestInfo.requestHeaders[header] = value;
|
|
39
|
+
return originalSetRequestHeader.call(xhr, header, value);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const originalSend = xhr.send;
|
|
43
|
+
xhr.send = function(body) {
|
|
44
|
+
let bodySize = 0;
|
|
45
|
+
try {
|
|
46
|
+
if (typeof body === 'string') bodySize = body.length;
|
|
47
|
+
else if (body && typeof body.byteLength === 'number') bodySize = body.byteLength;
|
|
48
|
+
else if (body && typeof body.size === 'number') bodySize = body.size;
|
|
49
|
+
} catch {}
|
|
50
|
+
console.log('[XHRInterceptor] XHR sent:', requestInfo.url, 'BodySize:', bodySize);
|
|
51
|
+
|
|
52
|
+
xhr.addEventListener('load', function() {
|
|
53
|
+
requestInfo.status = xhr.status;
|
|
54
|
+
requestInfo.response = xhr.response;
|
|
55
|
+
requestInfo.responseHeaders = xhr.getAllResponseHeaders();
|
|
56
|
+
|
|
57
|
+
xhrRequests.push(requestInfo);
|
|
58
|
+
if (xhrRequests.length > ${e}) {
|
|
59
|
+
xhrRequests.splice(0, xhrRequests.length - ${e});
|
|
60
|
+
}
|
|
61
|
+
console.log('[XHRInterceptor] XHR completed:', requestInfo.url, 'Status:', xhr.status);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
return originalSend.call(xhr, body);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
return xhr;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
window.__getXHRRequests = function() {
|
|
71
|
+
return window.__xhrRequests || [];
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
console.log('[XHRInterceptor] XHR interceptor installed');
|
|
75
|
+
})();
|
|
76
|
+
`}function E(e){return`
|
|
77
|
+
(function() {
|
|
78
|
+
if (window.__fetchInterceptorInstalled) {
|
|
79
|
+
console.log('[FetchInterceptor] Already installed');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
window.__fetchInterceptorInstalled = true;
|
|
83
|
+
|
|
84
|
+
const originalFetch = window.__originalFetchForHook || window.fetch;
|
|
85
|
+
window.__originalFetchForHook = originalFetch;
|
|
86
|
+
if (!window.__fetchRequests) {
|
|
87
|
+
window.__fetchRequests = [];
|
|
88
|
+
}
|
|
89
|
+
const fetchRequests = window.__fetchRequests;
|
|
90
|
+
|
|
91
|
+
window.fetch = function(url, options = {}) {
|
|
92
|
+
const requestInfo = {
|
|
93
|
+
url: typeof url === 'string' ? url : url.url,
|
|
94
|
+
method: options.method || 'GET',
|
|
95
|
+
headers: options.headers || {},
|
|
96
|
+
body: options.body,
|
|
97
|
+
timestamp: Date.now(),
|
|
98
|
+
response: null,
|
|
99
|
+
status: 0,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
console.log('[FetchInterceptor] Fetch called:', requestInfo.method, requestInfo.url);
|
|
103
|
+
|
|
104
|
+
return originalFetch.call(window, url, options).then(async (response) => {
|
|
105
|
+
requestInfo.status = response.status;
|
|
106
|
+
|
|
107
|
+
const clonedResponse = response.clone();
|
|
108
|
+
try {
|
|
109
|
+
requestInfo.response = await clonedResponse.text();
|
|
110
|
+
} catch (e) {
|
|
111
|
+
requestInfo.response = '[Unable to read response]';
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
fetchRequests.push(requestInfo);
|
|
115
|
+
if (fetchRequests.length > ${e}) {
|
|
116
|
+
fetchRequests.splice(0, fetchRequests.length - ${e});
|
|
117
|
+
}
|
|
118
|
+
// Auto-persist compact summary to localStorage so data survives context compression
|
|
119
|
+
try {
|
|
120
|
+
const summary = { url: requestInfo.url, method: requestInfo.method, status: requestInfo.status, ts: requestInfo.timestamp };
|
|
121
|
+
const prev = JSON.parse(localStorage.getItem('__capturedAPIs') || '[]');
|
|
122
|
+
prev.push(summary);
|
|
123
|
+
if (prev.length > 500) prev.splice(0, prev.length - 500);
|
|
124
|
+
localStorage.setItem('__capturedAPIs', JSON.stringify(prev));
|
|
125
|
+
} catch(e) {
|
|
126
|
+
// best-effort persistence only; ignore quota or serialization failures
|
|
127
|
+
}
|
|
128
|
+
console.log('[FetchInterceptor] Fetch completed:', requestInfo.url, 'Status:', response.status);
|
|
129
|
+
|
|
130
|
+
return response;
|
|
131
|
+
}).catch((error) => {
|
|
132
|
+
console.error('[FetchInterceptor] Fetch failed:', requestInfo.url, error);
|
|
133
|
+
throw error;
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
window.__getFetchRequests = function() {
|
|
138
|
+
return window.__fetchRequests || [];
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
console.log('[FetchInterceptor] Fetch interceptor installed');
|
|
142
|
+
})();
|
|
143
|
+
`}const D=e=>typeof e==`object`&&!!e,ie=e=>!D(e)||typeof e.requestId!=`string`||!D(e.request)||typeof e.request.url!=`string`||typeof e.request.method!=`string`||e.request.postData!==void 0&&typeof e.request.postData!=`string`?!1:typeof e.timestamp==`number`,ae=e=>!D(e)||typeof e.requestId!=`string`||!D(e.response)||typeof e.response.url!=`string`||typeof e.response.status!=`number`||typeof e.response.statusText!=`string`||typeof e.response.mimeType!=`string`?!1:typeof e.timestamp==`number`,oe=e=>D(e)&&typeof e.requestId==`string`,O=e=>D(e)&&typeof e.body==`string`&&typeof e.base64Encoded==`boolean`,k=e=>D(e)?e:{},A=e=>{if(!D(e))return;let t=e.result;if(D(t))return t.value},se=(e,t=0)=>typeof e==`number`&&Number.isFinite(e)?e:t,ce=(e,t)=>typeof e==`boolean`?e:t;function le(e){if(!D(e))return;let t=e;return{protocol:typeof t.protocol==`string`?t.protocol:void 0,keyExchange:typeof t.keyExchange==`string`?t.keyExchange:void 0,cipher:typeof t.cipher==`string`?t.cipher:void 0,subjectName:typeof t.subjectName==`string`?t.subjectName:void 0,sanList:Array.isArray(t.sanList)?t.sanList.filter(e=>typeof e==`string`):void 0,issuer:typeof t.issuer==`string`?t.issuer:void 0,validFrom:typeof t.validFrom==`number`?t.validFrom:void 0,validTo:typeof t.validTo==`number`?t.validTo:void 0}}function ue(e,t){if(!(typeof e!=`string`||typeof t!=`number`||Number.isNaN(t)))return{ip:e,port:t}}var j=class{cdpSession;identity;networkEnabled=!1;requests=new Map;responses=new Map;MAX_NETWORK_RECORDS=500;MAX_INJECTED_RECORDS=500;JS_RESPONSE_CONCURRENCY=6;responseBodyCache=new Map;MAX_BODY_CACHE_ENTRIES=200;networkListeners={};constructor(e,n={}){this.cdpSession=e,this.identity=n,this.cdpSession.on(`disconnected`,()=>{t.warn(`NetworkMonitor: CDP session disconnected`),this.networkEnabled=!1,this.networkListeners={}})}async enable(){if(!this.cdpSession)throw Error(`CDP session not initialized`);if(this.networkEnabled){t.warn(`Network monitoring already enabled`);return}try{await this.cdpSession.send(`Network.enable`,{maxTotalBufferSize:1e7,maxResourceBufferSize:5e6,maxPostDataSize:65536}),t.info(`Network domain enabled`),this.networkListeners.requestWillBeSent=e=>{if(!ie(e)){t.debug(`Skipping malformed Network.requestWillBeSent payload`);return}let n=this.toScopedRequestId(e.requestId),r={requestId:n,rawRequestId:e.requestId,sessionId:this.identity.sessionId,targetId:this.identity.targetId,targetType:this.identity.targetType,frameId:e.frameId,url:e.request.url,method:e.request.method,headers:k(e.request.headers),postData:e.request.postData,timestamp:e.timestamp,type:e.type,httpVersion:e.request.httpVersion,initiator:e.initiator};if(this.requests.set(n,r),this.requests.size>this.MAX_NETWORK_RECORDS){let e=this.requests.keys().next().value;e&&this.requests.delete(e)}t.debug(`Network request captured: ${e.request.method} ${e.request.url} [${n}]`)},this.networkListeners.responseReceived=e=>{if(!ae(e)){t.debug(`Skipping malformed Network.responseReceived payload`);return}let n=this.toScopedRequestId(e.requestId),r={requestId:n,rawRequestId:e.requestId,sessionId:this.identity.sessionId,targetId:this.identity.targetId,targetType:this.identity.targetType,frameId:e.frameId,url:e.response.url,status:e.response.status,statusText:e.response.statusText,headers:k(e.response.headers),mimeType:e.response.mimeType,timestamp:e.timestamp,fromCache:e.response.fromDiskCache||e.response.fromServiceWorker,timing:e.response.timing,protocol:e.response.protocol,securityDetails:le(e.response.securityDetails),remoteAddress:ue(e.response.remoteIPAddress,e.response.remotePort)};if(this.responses.set(n,r),this.responses.size>this.MAX_NETWORK_RECORDS){let e=this.responses.keys().next().value;e&&this.responses.delete(e)}t.debug(`Network response captured: ${e.response.status} ${e.response.url} [${n}]`)},this.networkListeners.loadingFinished=e=>{if(!oe(e)){t.debug(`Skipping malformed Network.loadingFinished payload`);return}let n=this.toScopedRequestId(e.requestId);t.debug(`Network loading finished: ${n}`),this.captureResponseBody(n).catch(e=>{t.debug(`[BodyCache] Auto-capture failed for ${n}: ${e instanceof Error?e.message:String(e)}`)})},this.cdpSession.on(`Network.requestWillBeSent`,this.networkListeners.requestWillBeSent),this.cdpSession.on(`Network.responseReceived`,this.networkListeners.responseReceived),this.cdpSession.on(`Network.loadingFinished`,this.networkListeners.loadingFinished),this.networkEnabled=!0,t.info(` Network monitoring enabled successfully`,{requestListeners:!!this.networkListeners.requestWillBeSent,responseListeners:!!this.networkListeners.responseReceived,loadingListeners:!!this.networkListeners.loadingFinished})}catch(e){throw t.error(` Failed to enable network monitoring:`,e),this.networkEnabled=!1,e}}async captureResponseBody(e){if(this.responseBodyCache.has(e))return;let n=this.responses.get(e);if(n&&!n.fromCache)try{let r=await this.cdpSession.send(`Network.getResponseBody`,{requestId:this.toRawRequestId(e)});if(!O(r))return;if(r.body.length>1048576){t.debug(`[BodyCache] Skipping oversized body for ${e} (${r.body.length} chars)`);return}if(this.responseBodyCache.size>=this.MAX_BODY_CACHE_ENTRIES){let e=this.responseBodyCache.keys().next().value;e&&this.responseBodyCache.delete(e)}this.responseBodyCache.set(e,{body:r.body,base64Encoded:r.base64Encoded}),t.debug(`[BodyCache] Cached body for ${e} (${r.body.length} chars, url=${n.url})`)}catch(n){t.debug(`[BodyCache] Could not capture body for ${e}: ${n instanceof Error?n.message:String(n)}`)}}async disable(){if(this.networkEnabled){this.networkListeners.requestWillBeSent&&this.cdpSession.off(`Network.requestWillBeSent`,this.networkListeners.requestWillBeSent),this.networkListeners.responseReceived&&this.cdpSession.off(`Network.responseReceived`,this.networkListeners.responseReceived),this.networkListeners.loadingFinished&&this.cdpSession.off(`Network.loadingFinished`,this.networkListeners.loadingFinished);try{await this.cdpSession.send(`Network.disable`)}catch(e){t.warn(`Failed to disable Network domain:`,e)}this.networkListeners={},this.networkEnabled=!1,t.info(`Network monitoring disabled`)}}isEnabled(){return this.networkEnabled}getStatus(){return{enabled:this.networkEnabled,requestCount:this.requests.size,responseCount:this.responses.size,listenerCount:Object.keys(this.networkListeners).filter(e=>this.networkListeners[e]!==void 0).length,cdpSessionActive:!0}}getRequests(e){let t=Array.from(this.requests.values());return e?.url&&(t=t.filter(t=>t.url.includes(e.url))),e?.method&&(t=t.filter(t=>t.method===e.method)),e?.limit&&(t=t.slice(-e.limit)),t}getResponses(e){let t=Array.from(this.responses.values());return e?.url&&(t=t.filter(t=>t.url.includes(e.url))),e?.status&&(t=t.filter(t=>t.status===e.status)),e?.limit&&(t=t.slice(-e.limit)),t}getActivity(e){return{request:this.requests.get(e),response:this.responses.get(e)}}async getResponseBody(e){if(!this.cdpSession)throw Error(`CDP session not initialized`);if(!this.networkEnabled)return t.error(`Network monitoring is not enabled. Call enable() with enableNetwork: true first.`),null;let n=this.responseBodyCache.get(e);if(n)return this.responseBodyCache.delete(e),this.responseBodyCache.set(e,n),t.debug(`[BodyCache] Cache hit for ${e}`),n;let r=this.requests.get(e),i=this.responses.get(e);if(!r)return t.error(`Request not found: ${e}. Make sure network monitoring was enabled before the request.`),null;if(!i)return t.warn(`Response not yet received for request: ${e}. The request may still be pending.`),null;try{let n=await this.cdpSession.send(`Network.getResponseBody`,{requestId:this.toRawRequestId(e)});return O(n)?(t.info(`Response body retrieved for request: ${e}`,{url:i.url,status:i.status,size:n.body.length,base64:n.base64Encoded}),{body:n.body,base64Encoded:n.base64Encoded}):(t.error(`Unexpected response body payload for ${e}`),null)}catch(n){let r=n instanceof Error?n.message:String(n);return t.error(`Failed to get response body for ${e}:`,{url:i.url,status:i.status,error:r,hint:`The response body may not be available for this request type (e.g., cached, redirected, or failed requests)`}),null}}async getAllJavaScriptResponses(){let e=Array.from(this.responses.entries()).filter(([,e])=>e.mimeType.includes(`javascript`)||e.url.endsWith(`.js`)||e.url.includes(`.js?`)),n=[];for(let t=0;t<e.length;t+=this.JS_RESPONSE_CONCURRENCY){let r=e.slice(t,t+this.JS_RESPONSE_CONCURRENCY),i=await Promise.all(r.map(async([e,t])=>{let n=await this.getResponseBody(e);if(!n)return null;let r=n.base64Encoded?Buffer.from(n.body,`base64`).toString(`utf-8`):n.body;return{url:t.url,content:r,size:r.length,requestId:e}}));n.push(...i.filter(e=>e!==null))}return t.info(`Collected ${n.length} JavaScript responses`),n}clearRecords(){this.requests.clear(),this.responses.clear(),this.responseBodyCache.clear(),t.info(`Network records cleared`)}getStats(){let e={},t={},n={};for(let t of this.requests.values())e[t.method]=(e[t.method]||0)+1,t.type&&(n[t.type]=(n[t.type]||0)+1);for(let e of this.responses.values())t[e.status]=(t[e.status]||0)+1;return{totalRequests:this.requests.size,totalResponses:this.responses.size,byMethod:e,byStatus:t,byType:n}}async injectXHRInterceptor(e){if(!this.cdpSession)throw Error(`CDP session not initialized`);let n=T(this.MAX_INJECTED_RECORDS);e?.persistent?(await this.cdpSession.send(`Page.addScriptToEvaluateOnNewDocument`,{source:n}),t.info(`XHR interceptor injected (persistent)`)):(await this.cdpSession.send(`Runtime.evaluate`,{expression:n}),t.info(`XHR interceptor injected`))}async injectFetchInterceptor(e){if(!this.cdpSession)throw Error(`CDP session not initialized`);let n=E(this.MAX_INJECTED_RECORDS);e?.persistent?(await this.cdpSession.send(`Page.addScriptToEvaluateOnNewDocument`,{source:n}),t.info(`Fetch interceptor injected (persistent)`)):(await this.cdpSession.send(`Runtime.evaluate`,{expression:n}),t.info(`Fetch interceptor injected`))}async getXHRRequests(){if(!this.cdpSession)throw Error(`CDP session not initialized`);try{let e=A(await this.cdpSession.send(`Runtime.evaluate`,{expression:`window.__getXHRRequests ? window.__getXHRRequests() : []`,returnByValue:!0}));return Array.isArray(e)?e.filter(e=>D(e)):[]}catch(e){return t.error(`Failed to get XHR requests:`,e),[]}}async getFetchRequests(){if(!this.cdpSession)throw Error(`CDP session not initialized`);try{let e=A(await this.cdpSession.send(`Runtime.evaluate`,{expression:`window.__getFetchRequests ? window.__getFetchRequests() : []`,returnByValue:!0}));return Array.isArray(e)?e.filter(e=>D(e)):[]}catch(e){return t.error(`Failed to get Fetch requests:`,e),[]}}async clearInjectedBuffers(){if(!this.cdpSession)throw Error(`CDP session not initialized`);try{let e=A(await this.cdpSession.send(`Runtime.evaluate`,{expression:`
|
|
144
|
+
(() => {
|
|
145
|
+
const xhrStore = Array.isArray(window.__xhrRequests)
|
|
146
|
+
? window.__xhrRequests
|
|
147
|
+
: (typeof window.__getXHRRequests === 'function' ? window.__getXHRRequests() : null);
|
|
148
|
+
const fetchStore = Array.isArray(window.__fetchRequests)
|
|
149
|
+
? window.__fetchRequests
|
|
150
|
+
: (typeof window.__getFetchRequests === 'function' ? window.__getFetchRequests() : null);
|
|
151
|
+
|
|
152
|
+
const xhrCleared = Array.isArray(xhrStore) ? xhrStore.length : 0;
|
|
153
|
+
const fetchCleared = Array.isArray(fetchStore) ? fetchStore.length : 0;
|
|
154
|
+
|
|
155
|
+
if (Array.isArray(xhrStore)) xhrStore.length = 0;
|
|
156
|
+
if (Array.isArray(fetchStore)) fetchStore.length = 0;
|
|
157
|
+
|
|
158
|
+
return { xhrCleared, fetchCleared };
|
|
159
|
+
})()
|
|
160
|
+
`,returnByValue:!0}));return D(e)?{xhrCleared:se(e.xhrCleared),fetchCleared:se(e.fetchCleared)}:{xhrCleared:0,fetchCleared:0}}catch(e){return t.error(`Failed to clear injected network buffers:`,e),{xhrCleared:0,fetchCleared:0}}}async resetInjectedInterceptors(){if(!this.cdpSession)throw Error(`CDP session not initialized`);try{let e=A(await this.cdpSession.send(`Runtime.evaluate`,{expression:`
|
|
161
|
+
(() => {
|
|
162
|
+
let xhrReset = false;
|
|
163
|
+
let fetchReset = false;
|
|
164
|
+
|
|
165
|
+
if (window.__originalXMLHttpRequestForHook) {
|
|
166
|
+
window.XMLHttpRequest = window.__originalXMLHttpRequestForHook;
|
|
167
|
+
xhrReset = true;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (window.__originalFetchForHook) {
|
|
171
|
+
window.fetch = window.__originalFetchForHook;
|
|
172
|
+
fetchReset = true;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (Array.isArray(window.__xhrRequests)) window.__xhrRequests.length = 0;
|
|
176
|
+
if (Array.isArray(window.__fetchRequests)) window.__fetchRequests.length = 0;
|
|
177
|
+
|
|
178
|
+
window.__xhrInterceptorInstalled = false;
|
|
179
|
+
window.__fetchInterceptorInstalled = false;
|
|
180
|
+
delete window.__getXHRRequests;
|
|
181
|
+
delete window.__getFetchRequests;
|
|
182
|
+
|
|
183
|
+
return { xhrReset, fetchReset };
|
|
184
|
+
})()
|
|
185
|
+
`,returnByValue:!0}));return D(e)?{xhrReset:ce(e.xhrReset,!1),fetchReset:ce(e.fetchReset,!1)}:{xhrReset:!1,fetchReset:!1}}catch(e){return t.error(`Failed to reset injected network interceptors:`,e),{xhrReset:!1,fetchReset:!1}}}persistsAcrossContextSwitches(){return!1}toScopedRequestId(e){return this.identity.requestIdPrefix&&this.identity.requestIdPrefix.length>0?`${this.identity.requestIdPrefix}:${e}`:this.identity.sessionId&&this.identity.sessionId.length>0?`${this.identity.sessionId}:${e}`:e}toRawRequestId(e){let t=this.identity.requestIdPrefix;if(t&&e.startsWith(`${t}:`))return e.slice(t.length+1);let n=this.identity.sessionId;if(n&&e.startsWith(`${n}:`))return e.slice(n.length+1);let r=this.requests.get(e);if(r?.rawRequestId)return r.rawRequestId;let i=this.responses.get(e);return i?.rawRequestId?i.rawRequestId:e}};const de=[`load`,`domcontentloaded`,`networkidle`,`commit`];function M(e=`networkidle`){return e===`networkidle`?`networkidle2`:e===`commit`?`load`:e}var fe=class e{cacheDir;maxAge;maxSize;memoryCache=new Map;MAX_MEMORY_CACHE_SIZE=100;writesSinceCleanup=0;static CLEANUP_INTERVAL=20;constructor(e={}){this.cacheDir=e.cacheDir||l(),this.maxAge=e.maxAge||1440*60*1e3,this.maxSize=e.maxSize||100*1024*1024}async init(){try{await x.mkdir(this.cacheDir,{recursive:!0}),t.debug(`Cache directory initialized: ${this.cacheDir}`)}catch(e){t.error(`Failed to initialize cache directory:`,e)}}generateKey(e,t){let n=JSON.stringify({url:e,options:t});return h.createHash(`md5`).update(n).digest(`hex`)}getCachePath(e){return p.join(this.cacheDir,`${e}.json`)}getDependenciesOrEmpty(e){return e??{nodes:[],edges:[]}}isExpired(e){return Date.now()-e.timestamp>this.maxAge}async get(e,n){let r=this.generateKey(e,n);if(this.memoryCache.has(r)){let n=this.memoryCache.get(r);if(this.isExpired(n))this.memoryCache.delete(r);else return t.debug(`Cache hit (memory): ${e}`),{files:n.files,dependencies:this.getDependenciesOrEmpty(n.dependencies),totalSize:n.totalSize,collectTime:n.collectTime,summaries:n.summaries}}try{let n=this.getCachePath(r),i=await x.readFile(n,`utf-8`),a=JSON.parse(i);return this.isExpired(a)?(t.debug(`Cache expired: ${e}`),await x.unlink(n),null):(this.memoryCache.set(r,a),t.debug(`Cache hit (disk): ${e}`),{files:a.files,dependencies:this.getDependenciesOrEmpty(a.dependencies),totalSize:a.totalSize,collectTime:a.collectTime,summaries:a.summaries})}catch(n){return t.warn(`Cache read failed for ${e}: ${n instanceof Error?n.message:String(n)}`),null}}async set(n,r,i){let a=this.generateKey(n,i),o=h.createHash(`md5`).update(JSON.stringify(r.files)).digest(`hex`),s={url:n,files:r.files,dependencies:r.dependencies,totalSize:r.totalSize,collectTime:r.collectTime,summaries:r.summaries,timestamp:Date.now(),hash:o};if(this.memoryCache.set(a,s),this.memoryCache.size>this.MAX_MEMORY_CACHE_SIZE){let e=this.memoryCache.keys().next().value;e&&(this.memoryCache.delete(e),t.debug(`Memory cache evicted: ${e}`))}try{let e=this.getCachePath(a);await x.mkdir(this.cacheDir,{recursive:!0}),await x.writeFile(e,JSON.stringify(s,null,2),`utf-8`),t.debug(`Cache saved: ${n} (${(r.totalSize/1024).toFixed(2)} KB)`)}catch(e){t.error(`Failed to save cache:`,e)}++this.writesSinceCleanup>=e.CLEANUP_INTERVAL&&(this.writesSinceCleanup=0,this.cleanup())}async cleanup(){try{let e=await x.readdir(this.cacheDir),n=0,r=[];for(let t of e){if(!t.endsWith(`.json`))continue;let e=p.join(this.cacheDir,t),i=await x.stat(e);n+=i.size,r.push({file:e,mtime:i.mtime,size:i.size})}if(n>this.maxSize){r.sort((e,t)=>e.mtime.getTime()-t.mtime.getTime());let e=0;for(let i of r){if(n-e<=this.maxSize*.8)break;await x.unlink(i.file),e+=i.size,t.debug(`Removed old cache: ${i.file}`)}t.info(`Cache cleanup: removed ${e} bytes`)}}catch(e){t.error(`Failed to cleanup cache:`,e)}}async clear(){try{this.memoryCache.clear();let e=await x.readdir(this.cacheDir);for(let t of e)t.endsWith(`.json`)&&await x.unlink(p.join(this.cacheDir,t));t.info(`All cache cleared`)}catch(e){if(e.code===`ENOENT`)return;t.error(`Failed to clear cache:`,e)}}async getStats(){try{let e=await x.readdir(this.cacheDir),t=0,n=0;for(let r of e){if(!r.endsWith(`.json`))continue;let e=p.join(this.cacheDir,r),i=await x.stat(e);t+=i.size,n++}return{memoryEntries:this.memoryCache.size,diskEntries:n,totalSize:t}}catch(e){return t.error(`Failed to get cache stats:`,e),{memoryEntries:this.memoryCache.size,diskEntries:0,totalSize:0}}}async warmup(e){t.info(`Warming up cache for ${e.length} URLs...`);for(let t of e)await this.get(t);t.info(`Cache warmup completed`)}},pe=class{DEFAULT_MAX_TOTAL_SIZE=512*1024;DEFAULT_MAX_FILE_SIZE=100*1024;PREVIEW_LINES=50;async smartCollect(e,n,r){switch(t.info(`Smart code collection mode: ${r.mode}`),r.mode){case`summary`:return this.collectSummaries(n);case`priority`:return this.collectByPriority(n,r);case`incremental`:return this.collectIncremental(n,r);default:return this.collectWithLimit(n,r)}}async collectSummaries(e){return t.info(`Generating code summaries...`),e.map(e=>{let t=e.content.split(`
|
|
186
|
+
`).slice(0,this.PREVIEW_LINES).join(`
|
|
187
|
+
`);return{url:e.url,size:e.size,type:e.type,hasEncryption:this.detectEncryption(e.content),hasAPI:this.detectAPI(e.content),hasObfuscation:this.detectObfuscation(e.content),functions:this.extractFunctions(e.content),imports:this.extractImports(e.content),preview:t}})}collectByPriority(e,n){let r=n.maxTotalSize||this.DEFAULT_MAX_TOTAL_SIZE,i=n.maxFileSize||this.DEFAULT_MAX_FILE_SIZE,a=e.map(e=>({file:e,score:this.calculatePriority(e,n.priorities||[])}));a.sort((e,t)=>t.score-e.score);let o=[],s=0;for(let{file:e}of a){let a=e.content,c=!1;if(e.size>i&&(a=a.substring(0,i),c=!0),s+a.length>r){t.warn(`Reached max total size limit (${r} bytes), stopping collection`);break}o.push({...e,content:a,size:a.length,metadata:{...e.metadata,truncated:c,originalSize:e.size,priorityScore:this.calculatePriority(e,n.priorities||[])}}),s+=a.length}return t.info(`Collected ${o.length}/${e.length} files by priority (${(s/1024).toFixed(2)} KB)`),o}collectIncremental(e,n){let r=n.includePatterns||[],i=n.excludePatterns||[],a=e.filter(e=>i.some(t=>new RegExp(t).test(e.url))?!1:r.length===0?!0:r.some(t=>new RegExp(t).test(e.url)));return t.info(`Incremental collection: ${a.length}/${e.length} files matched`),this.collectWithLimit(a,n)}collectWithLimit(e,n){let r=n.maxTotalSize||this.DEFAULT_MAX_TOTAL_SIZE,i=n.maxFileSize||this.DEFAULT_MAX_FILE_SIZE,a=[],o=0;for(let n of e){let s=n.content,c=!1;if(n.size>i&&(s=s.substring(0,i),c=!0),o+s.length>r){t.warn(`Reached max total size limit, collected ${a.length}/${e.length} files`);break}a.push({...n,content:s,size:s.length,metadata:{...n.metadata,truncated:c,originalSize:n.size}}),o+=s.length}return a}calculatePriority(e,t){let n=0;e.type===`inline`&&(n+=10),e.type===`external`&&(n+=5);for(let r=0;r<t.length;r++){let i=t[r];i&&new RegExp(i).test(e.url)&&(n+=(t.length-r)*20)}return this.detectEncryption(e.content)&&(n+=50),this.detectAPI(e.content)&&(n+=30),this.detectObfuscation(e.content)&&(n+=20),e.size<10*1024?n+=10:e.size>500*1024&&(n-=20),n}detectEncryption(e){return[/crypto|encrypt|decrypt|cipher|aes|rsa|md5|sha/i,/CryptoJS|forge|sjcl/i,/btoa|atob/i].some(t=>t.test(e))}detectAPI(e){return[/fetch\s*\(/,/XMLHttpRequest/,/axios|request|ajax/i,/\.get\(|\.post\(/].some(t=>t.test(e))}detectObfuscation(e){let t=e.split(`
|
|
188
|
+
`);return!!(e.length/t.length>200||/\\x[0-9a-f]{2}/i.test(e)||/\\u[0-9a-f]{4}/i.test(e)||/eval\s*\(/i.test(e))}extractFunctions(e){let t=[];for(let n of[/function\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g,/const\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*=\s*function/g,/([a-zA-Z_$][a-zA-Z0-9_$]*)\s*:\s*function/g]){let r;for(;(r=n.exec(e))!==null;)r[1]&&!t.includes(r[1])&&t.push(r[1])}return t.slice(0,20)}extractImports(e){let t=[];for(let n of[/import\s+.*?from\s+['"]([^'"]+)['"]/g,/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g]){let r;for(;(r=n.exec(e))!==null;)r[1]&&!t.includes(r[1])&&t.push(r[1])}return t}};const me=b(te),he=b(ee);var ge=class{DEFAULT_LEVEL=6;DEFAULT_CHUNK_SIZE=100*1024;DEFAULT_CONCURRENCY=5;DEFAULT_MAX_RETRIES=3;CACHE_MAX_SIZE=100;CACHE_TTL=3600*1e3;cache=new Map;stats={totalCompressed:0,totalOriginalSize:0,totalCompressedSize:0,averageRatio:0,cacheHits:0,cacheMisses:0,totalTime:0};async compress(e,n={}){let r=Date.now(),i=n.level??this.DEFAULT_LEVEL,a=n.useCache??!0,o=n.maxRetries??this.DEFAULT_MAX_RETRIES,s=this.generateCacheKey(e,i);if(a&&this.cache.has(s)){let n=this.cache.get(s);if(Date.now()-n.timestamp<this.CACHE_TTL)return this.stats.cacheHits++,t.debug(`Cache hit for compression (${e.length} bytes)`),{compressed:n.compressed,originalSize:n.originalSize,compressedSize:n.compressedSize,compressionRatio:n.compressionRatio,level:i};this.cache.delete(s)}this.stats.cacheMisses++;let c=null;for(let n=0;n<o;n++)try{let n=Buffer.from(e,`utf-8`),o=await me(n,{level:i}),c=o.toString(`base64`),l=n.length,u=o.length,d=(1-u/l)*100,f=Date.now()-r;this.stats.totalCompressed++,this.stats.totalOriginalSize+=l,this.stats.totalCompressedSize+=u,this.stats.averageRatio=(1-this.stats.totalCompressedSize/this.stats.totalOriginalSize)*100,this.stats.totalTime+=f;let p={compressed:c,originalSize:l,compressedSize:u,compressionRatio:d,level:i,metadata:{hash:s,timestamp:Date.now(),compressionTime:f}};return a&&this.addToCache(s,{compressed:c,originalSize:l,compressedSize:u,compressionRatio:d,timestamp:Date.now()}),t.debug(`Compressed code: ${l} -> ${u} bytes (${d.toFixed(1)}% reduction, level ${i}, ${f}ms)`),p}catch(e){c=e,t.warn(`Compression attempt ${n+1}/${o} failed:`,e),n<o-1&&await new Promise(e=>setTimeout(e,100*(n+1)))}throw t.error(`Failed to compress code after retries:`,c),c||Error(`Compression failed`)}async decompress(e,n=3){let r=null;for(let i=0;i<n;i++)try{return(await he(Buffer.from(e,`base64`))).toString(`utf-8`)}catch(e){r=e,t.warn(`Decompression attempt ${i+1}/${n} failed:`,e),i<n-1&&await new Promise(e=>setTimeout(e,100*(i+1)))}throw t.error(`Failed to decompress code after retries:`,r),r||Error(`Decompression failed`)}async compressBatch(e,n={}){let r=n.concurrency??this.DEFAULT_CONCURRENCY,i=[];for(let a=0;a<e.length;a+=r){let o=e.slice(a,a+r),s=await Promise.all(o.map(async e=>{try{let t=await this.compress(e.content,n);return n.onFileProgress&&n.onFileProgress(e.url,100),{url:e.url,compressed:t.compressed,originalSize:t.originalSize,compressedSize:t.compressedSize,compressionRatio:t.compressionRatio}}catch(n){return t.error(`Failed to compress ${e.url}:`,n),{url:e.url,compressed:Buffer.from(e.content).toString(`base64`),originalSize:e.content.length,compressedSize:e.content.length,compressionRatio:0}}}));i.push(...s),n.onProgress&&n.onProgress(i.length/e.length*100)}let a=i.reduce((e,t)=>e+t.originalSize,0),o=i.reduce((e,t)=>e+t.compressedSize,0),s=a>0?(1-o/a)*100:0;return t.info(`Batch compression: ${i.length} files, ${(a/1024).toFixed(2)} KB -> ${(o/1024).toFixed(2)} KB (${s.toFixed(1)}% reduction)`),i}shouldCompress(e,t=1024){return e.length>t}selectCompressionLevel(e){return e<10*1024?1:e<100*1024?6:e<1024*1024?9:6}async compressStream(e,n={}){let r=n.chunkSize??this.DEFAULT_CHUNK_SIZE;if(e.length<=r)return this.compress(e,n);let i=Date.now(),a=[];for(let t=0;t<e.length;t+=r){let i=e.substring(t,t+r),o=await this.compress(i,{...n,useCache:!1});a.push(o.compressed),n.onProgress&&n.onProgress(t/e.length*100)}let o=JSON.stringify(a),s=Buffer.from(o).toString(`base64`),c=e.length,l=s.length,u=(1-l/c)*100,d=Date.now()-i;return t.info(`Stream compression: ${a.length} chunks, ${(c/1024).toFixed(2)} KB -> ${(l/1024).toFixed(2)} KB (${u.toFixed(1)}% reduction, ${d}ms)`),{compressed:s,originalSize:c,compressedSize:l,compressionRatio:u,chunks:a.length,metadata:{hash:this.generateCacheKey(e,n.level??this.DEFAULT_LEVEL),timestamp:Date.now(),compressionTime:d}}}getStats(){return{...this.stats}}resetStats(){this.stats={totalCompressed:0,totalOriginalSize:0,totalCompressedSize:0,averageRatio:0,cacheHits:0,cacheMisses:0,totalTime:0}}clearCache(){this.cache.clear(),t.info(`Compression cache cleared`)}getCacheSize(){return this.cache.size}generateCacheKey(e,t){return`${g(`md5`).update(e).digest(`hex`)}-${t}`}addToCache(e,t){if(this.cache.size>=this.CACHE_MAX_SIZE){let e=this.cache.keys().next().value;e&&this.cache.delete(e)}this.cache.set(e,t)}};const N=new Set([`page`,`iframe`]),P=[`page`,`iframe`];function F(e,t){return!t||t.length===0?N.has(e):t.includes(e)}function _e(e,t){return F(e.type,t.targetTypes)}function ve(e,t){return!(t.type&&e.type!==t.type||t.types?.length&&!t.types.includes(e.type)||t.targetId&&e.targetId!==t.targetId||t.attachedOnly&&!e.attached||t.urlPattern&&!e.url.includes(t.urlPattern)||t.titlePattern&&!e.title.includes(t.titlePattern))}function ye(e){let t=typeof e.targetId==`string`?e.targetId:null,n=typeof e.type==`string`?e.type:null,r=typeof e.title==`string`?e.title:``,i=typeof e.url==`string`?e.url:``;return!t||!n?null:{targetId:t,type:n,title:r,url:i,attached:!!e.attached,openerId:typeof e.openerId==`string`?e.openerId:void 0,canAccessOpener:typeof e.canAccessOpener==`boolean`?e.canAccessOpener:void 0,openerFrameId:typeof e.openerFrameId==`string`?e.openerFrameId:void 0,browserContextId:typeof e.browserContextId==`string`?e.browserContextId:void 0,subtype:typeof e.subtype==`string`?e.subtype:void 0}}function be(e){if(!e||typeof e!=`object`)return null;let t=e.sessionId;return typeof t==`string`&&t.length>0?t:null}function xe(e){if(!e||typeof e!=`object`)return null;let t=e.sessionId;return typeof t==`string`&&t.length>0?t:null}function Se(e){if(!e||typeof e!=`object`)return null;let t=e.targetInfo;return t&&typeof t==`object`?t:null}function Ce(e){if(typeof e!=`object`||!e)return null;let t=e.sessionId;return typeof t==`string`&&t.length>0?t:null}function we(e){let t=e.id?.();return typeof t==`string`&&t.length>0?t:null}async function I(e,t){let n=Ce(await e.send(`Target.attachToTarget`,{targetId:t,flatten:!0}));if(!n)throw Error(`Target.attachToTarget did not return sessionId for ${t}`);let r=e.connection?.();if(!r||typeof r.session!=`function`)throw Error(`CDP connection lookup unavailable for attached target ${t}`);let i=r.session(n);if(!i)throw Error(`CDP attached target session ${n} was not registered for ${t}`);return i}async function L(e,t){let n=we(t);if(!n)throw Error(`CDP attached target session id unavailable for detach`);await e.send(`Target.detachFromTarget`,{sessionId:n})}var Te=class{managedSessions=new Map;targetIdToSessionId=new Map;add(e,t){this.managedSessions.set(e,t),this.targetIdToSessionId.set(t.targetInfo.targetId,e)}remove(e){let t=this.managedSessions.get(e);return t&&(this.managedSessions.delete(e),this.targetIdToSessionId.delete(t.targetInfo.targetId)),t}get(e){return this.managedSessions.get(e)}getByTargetId(e){let t=this.targetIdToSessionId.get(e);return t?this.managedSessions.get(t):void 0}all(){return this.managedSessions.values()}mapTargetIdToSession(e,t){this.targetIdToSessionId.set(e,t)}unmapTargetId(e){this.targetIdToSessionId.delete(e)}getPriorSessionId(e){return this.targetIdToSessionId.get(e)}findMatchingTargets(e,t){let n=[];for(let r of this.managedSessions.values())ve(r.targetInfo,e)&&t(r.targetInfo)&&n.push(r.targetInfo);return n}clear(){this.managedSessions.clear(),this.targetIdToSessionId.clear()}},Ee=class{getBrowser;browserSession=null;attachedTargetSession=null;attachedTargetInfo=null;attachedTargetBorrowedFromManaged=!1;autoAttachEnabled=!1;targetListenersBound=!1;aggregatedNetworkEnabled=!1;registry=new Te;persistentScripts=new Map;persistentScriptCounter=0;browserSessionListeners={};constructor(e){this.getBrowser=e}async listTargets(e={}){let t=await this.ensureBrowserSession();e.discoverOOPIF!==!1&&await this.ensureAutoAttachEnabled(t);let n=await t.send(`Target.getTargets`),r=new Set(Array.from(this.registry.all()).map(e=>e.targetInfo.targetId));return this.attachedTargetInfo?.targetId&&r.add(this.attachedTargetInfo.targetId),(Array.isArray(n.targetInfos)?n.targetInfos.map(e=>this.normalizeTargetInfo(e)).filter(e=>e!==null).map(e=>({...e,attached:e.attached||r.has(e.targetId)})):[]).filter(t=>this.matchesFilters(t,e))}async attach(e){let t=this.attachedTargetInfo;if(t?.targetId===e&&this.attachedTargetSession)return t;let n=(await this.listTargets()).find(t=>t.targetId===e);if(!n)throw Error(`CDP target not found: ${e}`);await this.detach();let r=this.registry.getByTargetId(e);if(r)return this.attachedTargetSession=r.session,this.attachedTargetInfo=r.targetInfo,this.attachedTargetBorrowedFromManaged=!0,r.targetInfo;let i=await this.ensureBrowserSession();this.attachedTargetSession=await I(i,e),this.attachedTargetInfo=n,this.attachedTargetBorrowedFromManaged=!1;let a=this.attachedTargetSession.id?.();if(a){let e={sessionId:a,session:this.attachedTargetSession,targetInfo:n,networkMonitor:null,managedByAutoAttach:!1,appliedPersistentScripts:new Map};this.registry.add(a,e),this.aggregatedNetworkEnabled&&this.shouldManageTargetType(n.type)&&await this.ensureSessionNetworkMonitor(this.registry.get(a)),await this.applyPersistentScriptsToEntry(this.registry.get(a))}return n}async detach(){if(!this.attachedTargetSession)return this.attachedTargetInfo=null,this.attachedTargetBorrowedFromManaged=!1,!1;let e=this.attachedTargetSession,t=this.attachedTargetInfo;if(this.attachedTargetBorrowedFromManaged)return this.attachedTargetSession=null,this.attachedTargetInfo=null,this.attachedTargetBorrowedFromManaged=!1,!0;if(!this.browserSession)throw Error(`Browser CDP session unavailable for target detach`);await L(this.browserSession,e),this.attachedTargetSession=null,this.attachedTargetInfo=null,this.attachedTargetBorrowedFromManaged=!1;let n=e.id?.()??(t?.targetId?this.registry.getPriorSessionId(t.targetId):null);if(n){let e=this.registry.get(n);e&&!e.managedByAutoAttach&&(await this.disableEntryNetworkMonitor(e),this.registry.remove(n))}return t?.targetId&&this.registry.unmapTargetId(t.targetId),!0}getAttachedTargetSession(){return this.attachedTargetSession}getAttachedTargetInfo(){return this.attachedTargetInfo}async evaluate(e,t={}){let n=await this.requireAttachedTargetSession().send(`Runtime.evaluate`,{expression:e,returnByValue:t.returnByValue??!0,awaitPromise:t.awaitPromise??!0});if(n.exceptionDetails){let e=n.exceptionDetails;throw Error(e.exception?.description||e.text||`Runtime.evaluate failed in attached target`)}return t.returnByValue===!1?n.result??null:n.result?.value??null}async dumpTargetScripts(e,n={}){let i=n.includeSource??!1,a=Math.max(1,Math.min(n.maxScripts??r,r)),o=(await this.listTargets()).find(t=>t.targetId===e);if(!o)throw Error(`CDP target not found: ${e}`);let s=this.registry.getByTargetId(e),l=!!s,u,d=!1;s?u=s.session:(u=await I(await this.ensureBrowserSession(),e),d=!0);let f=[],p=e=>{let t=this.readScriptParsedPayload(e);t&&f.push(t)};u.on(`Debugger.scriptParsed`,p);try{await u.send(`Debugger.enable`,{}),await this.delay(c)}finally{u.off(`Debugger.scriptParsed`,p)}let m=new Map;for(let e of f)m.has(e.scriptId)||m.set(e.scriptId,e);let h=Array.from(m.values()),g=h.length,_=h.slice(0,a);if(i)for(let e of _)await this.hydrateScriptSource(u,e);try{await u.send(`Debugger.disable`,{})}catch{}if(d)try{let e=this.browserSession;e&&await L(e,u)}catch(n){t.debug(`[BrowserTargetSessionManager] Failed to detach temporary worker session for ${e}: ${n instanceof Error?n.message:String(n)}`)}return{targetId:e,targetType:o.type,borrowedManagedSession:l,totalScripts:g,returnedScripts:_.length,truncated:g>_.length,scripts:_}}readScriptParsedPayload(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.scriptId==`string`?t.scriptId:null;if(!n)return null;let r={scriptId:n,url:typeof t.url==`string`?t.url:``};return typeof t.startLine==`number`&&(r.startLine=t.startLine),typeof t.endLine==`number`&&(r.endLine=t.endLine),typeof t.length==`number`&&(r.length=t.length),typeof t.hash==`string`&&(r.hash=t.hash),typeof t.sourceMapURL==`string`&&t.sourceMapURL.length>0&&(r.sourceMapURL=t.sourceMapURL),r}async hydrateScriptSource(e,n){try{let t=await e.send(`Debugger.getScriptSource`,{scriptId:n.scriptId}),r=typeof t?.scriptSource==`string`?t.scriptSource:``,a=Buffer.byteLength(r,`utf8`);n.sourceBytes=a,a>i?(n.source=r.slice(0,i),n.sourceTruncated=!0):(n.source=r,n.sourceTruncated=!1)}catch(e){n.sourceUnavailable=!0,t.debug(`[BrowserTargetSessionManager] Debugger.getScriptSource failed for ${n.scriptId}: ${e instanceof Error?e.message:String(e)}`)}}async captureScreenshot(e){let t=this.requireAttachedTargetSession();try{await t.send(`Page.enable`,{})}catch{}let n={format:e?.format??`png`};e?.quality!==void 0&&(n.quality=e.quality),e?.clip&&(n.clip={x:e.clip.x,y:e.clip.y,width:e.clip.width,height:e.clip.height,scale:1});let r=await Promise.race([t.send(`Page.captureScreenshot`,n),new Promise((e,t)=>setTimeout(()=>t(Error(`Page.captureScreenshot timed out after 30s`)),3e4))]);if(!r?.data)throw Error(`Page.captureScreenshot returned no data`);return Buffer.from(r.data,`base64`)}async addScriptToEvaluateOnNewDocument(e){return this.registerPersistentScript(e,{evaluateNow:!0,targetTypes:P})}async registerPersistentScript(e,n){let r=n?.id??`managed-script-${++this.persistentScriptCounter}`,i={id:r,source:e,targetTypes:n?.targetTypes?.length?[...n.targetTypes]:void 0};this.persistentScripts.set(r,i);let a=await this.ensureBrowserSession();await this.ensureAutoAttachEnabled(a),await this.bootstrapManagedTargets({targetTypes:i.targetTypes});let o=0;for(let r of this.registry.all())this.matchesScriptTarget(r.targetInfo,i)&&(await this.applyPersistentScriptToEntry(r,i),n?.evaluateNow&&await this.evaluateExpressionInEntry(r,e).catch(e=>{t.debug(`[BrowserTargetSessionManager] Immediate script evaluate failed for ${r.targetInfo.targetId}: ${e instanceof Error?e.message:String(e)}`)}),o+=1);return{identifier:r,appliedTargets:o}}async evaluateInManagedTargets(e,n){let r=await this.ensureBrowserSession();await this.ensureAutoAttachEnabled(r);let i=0;for(let r of this.registry.all())this.matchesTargetTypes(r.targetInfo.type,n?.targetTypes)&&(await this.evaluateExpressionInEntry(r,e).catch(e=>{t.debug(`[BrowserTargetSessionManager] evaluateInManagedTargets failed for ${r.targetInfo.targetId}: ${e instanceof Error?e.message:String(e)}`)}),i+=1);return i}async enable(){let e=await this.ensureBrowserSession();await this.ensureAutoAttachEnabled(e),await this.bootstrapManagedTargets(),this.aggregatedNetworkEnabled=!0;for(let e of this.registry.all())this.shouldManageTargetType(e.targetInfo.type)&&await this.ensureSessionNetworkMonitor(e)}async disable(){this.aggregatedNetworkEnabled=!1;for(let e of this.registry.all())await this.disableEntryNetworkMonitor(e)}isEnabled(){return this.aggregatedNetworkEnabled}getStatus(){let e=0,t=0,n=this.targetListenersBound?3:0;for(let r of this.registry.all()){if(!r.networkMonitor)continue;let i=r.networkMonitor.getStatus();e+=i.requestCount,t+=i.responseCount,n+=i.listenerCount}return{enabled:this.aggregatedNetworkEnabled,requestCount:e,responseCount:t,listenerCount:n,cdpSessionActive:this.browserSession!==null}}getRequests(e){let t=Array.from(this.registry.all()).flatMap(e=>e.networkMonitor?.getRequests()??[]);t.sort((e,t)=>(e.timestamp??0)-(t.timestamp??0));let n=e?.url;typeof n==`string`&&n.length>0&&(t=t.filter(e=>e.url.includes(n)));let r=e?.method;return typeof r==`string`&&r.length>0&&(t=t.filter(e=>e.method===r)),typeof e?.limit==`number`&&Number.isFinite(e.limit)&&(t=t.slice(-e.limit)),t}getResponses(e){let t=Array.from(this.registry.all()).flatMap(e=>e.networkMonitor?.getResponses()??[]);t.sort((e,t)=>(e.timestamp??0)-(t.timestamp??0));let n=e?.url;return typeof n==`string`&&n.length>0&&(t=t.filter(e=>e.url.includes(n))),typeof e?.status==`number`&&(t=t.filter(t=>t.status===e.status)),typeof e?.limit==`number`&&Number.isFinite(e.limit)&&(t=t.slice(-e.limit)),t}getActivity(e){for(let t of this.registry.all()){if(!t.networkMonitor)continue;let n=t.networkMonitor.getActivity(e);if(n.request||n.response)return n}return{}}async getResponseBody(e){for(let t of this.registry.all()){if(!t.networkMonitor)continue;let n=t.networkMonitor.getActivity(e);if(!(!n.request&&!n.response))return t.networkMonitor.getResponseBody(e)}return null}async getAllJavaScriptResponses(){return(await Promise.all(Array.from(this.registry.all()).map(async e=>e.networkMonitor?await e.networkMonitor.getAllJavaScriptResponses():[]))).flat()}clearRecords(){for(let e of this.registry.all())e.networkMonitor?.clearRecords()}async clearInjectedBuffers(){let e=0,t=0;for(let n of this.registry.all()){if(!n.networkMonitor)continue;let r=await n.networkMonitor.clearInjectedBuffers();e+=r.xhrCleared,t+=r.fetchCleared}return{xhrCleared:e,fetchCleared:t}}async resetInjectedInterceptors(){let e=!1,t=!1;for(let n of this.registry.all()){if(!n.networkMonitor)continue;let r=await n.networkMonitor.resetInjectedInterceptors();e||=r.xhrReset,t||=r.fetchReset}return{xhrReset:e,fetchReset:t}}getStats(){let e={},t={},n={},r=0,i=0;for(let a of this.registry.all()){let o=a.networkMonitor?.getStats();if(o){r+=o.totalRequests,i+=o.totalResponses;for(let[t,n]of Object.entries(o.byMethod))e[t]=(e[t]||0)+n;for(let[e,n]of Object.entries(o.byStatus))t[e]=(t[e]||0)+n;for(let[e,t]of Object.entries(o.byType))n[e]=(n[e]||0)+t}}return{totalRequests:r,totalResponses:i,byMethod:e,byStatus:t,byType:n}}async injectXHRInterceptor(e){let n=T(500);if(e?.persistent){await this.registerPersistentScript(n,{id:`network-xhr-interceptor`,evaluateNow:!0,targetTypes:P}),t.info(`XHR interceptor injected (persistent)`);return}await this.evaluateInManagedTargets(n,{targetTypes:P}),t.info(`XHR interceptor injected`)}async injectFetchInterceptor(e){let n=E(500);if(e?.persistent){await this.registerPersistentScript(n,{id:`network-fetch-interceptor`,evaluateNow:!0,targetTypes:P}),t.info(`Fetch interceptor injected (persistent)`);return}await this.evaluateInManagedTargets(n,{targetTypes:P}),t.info(`Fetch interceptor injected`)}async getXHRRequests(){return(await Promise.all(Array.from(this.registry.all()).map(e=>this.getEntryInjectedRequests(e,`xhr`)))).flat()}async getFetchRequests(){return(await Promise.all(Array.from(this.registry.all()).map(e=>this.getEntryInjectedRequests(e,`fetch`)))).flat()}persistsAcrossContextSwitches(){return this.aggregatedNetworkEnabled}async dispose(){try{if(await this.detach(),await this.disable(),this.persistentScripts.clear(),this.browserSession){this.unbindBrowserSessionListeners(this.browserSession);try{await this.browserSession.detach()}catch{}}}finally{this.registry.clear(),this.registry.clear(),this.browserSession=null,this.autoAttachEnabled=!1,this.targetListenersBound=!1}}requireAttachedTargetSession(){if(!this.attachedTargetSession)throw Error(`No CDP target is currently attached`);return this.attachedTargetSession}async ensureBrowserSession(){if(this.browserSession)return this.browserSession;let e=this.getBrowser();if(!e)throw Error(`Browser not connected`);return this.browserSession=await e.target().createCDPSession(),this.browserSession}async ensureAutoAttachEnabled(e){if(this.targetListenersBound||this.bindBrowserSessionListeners(e),!this.autoAttachEnabled)try{await e.send(`Target.setAutoAttach`,{autoAttach:!0,waitForDebuggerOnStart:!1,flatten:!0}),await e.send(`Target.setDiscoverTargets`,{discover:!0}),this.autoAttachEnabled=!0}catch{}}bindBrowserSessionListeners(e){this.targetListenersBound||=(this.browserSessionListeners.attachedToTarget=e=>{this.handleAttachedToTarget(e)},this.browserSessionListeners.detachedFromTarget=e=>{this.handleDetachedFromTarget(e)},this.browserSessionListeners.targetInfoChanged=e=>{this.handleTargetInfoChanged(e)},e.on(`Target.attachedToTarget`,this.browserSessionListeners.attachedToTarget),e.on(`Target.detachedFromTarget`,this.browserSessionListeners.detachedFromTarget),e.on(`Target.targetInfoChanged`,this.browserSessionListeners.targetInfoChanged),!0)}unbindBrowserSessionListeners(e){this.targetListenersBound&&=(this.browserSessionListeners.attachedToTarget&&e.off(`Target.attachedToTarget`,this.browserSessionListeners.attachedToTarget),this.browserSessionListeners.detachedFromTarget&&e.off(`Target.detachedFromTarget`,this.browserSessionListeners.detachedFromTarget),this.browserSessionListeners.targetInfoChanged&&e.off(`Target.targetInfoChanged`,this.browserSessionListeners.targetInfoChanged),this.browserSessionListeners={},!1)}async handleAttachedToTarget(e){let n=this.readAttachedSessionId(e),r=this.readTargetInfoRecord(e),i=r?this.normalizeTargetInfo(r):null;if(!n||!i||!this.shouldManageTargetType(i.type))return;let a=this.browserSession,o=await this.lookupChildSession(a,n);if(!o){t.debug(`[BrowserTargetSessionManager] Auto-attached child session ${n} unavailable for ${i.targetId}`);return}let s=this.registry.get(n);if(s){s.targetInfo=i,this.registry.mapTargetIdToSession(i.targetId,n),this.attachedTargetInfo?.targetId===i.targetId&&this.attachedTargetBorrowedFromManaged&&(this.attachedTargetInfo=i);return}let c=this.registry.getPriorSessionId(i.targetId);if(c&&c!==n){let e=this.registry.get(c);e&&!e.managedByAutoAttach&&(await this.disableEntryNetworkMonitor(e),this.registry.remove(c))}let l={sessionId:n,session:o,targetInfo:i,networkMonitor:null,managedByAutoAttach:!0,appliedPersistentScripts:new Map};this.registry.add(n,l),this.registry.mapTargetIdToSession(i.targetId,n),this.aggregatedNetworkEnabled&&await this.ensureSessionNetworkMonitor(l),await this.applyPersistentScriptsToEntry(l),!this.attachedTargetSession&&this.attachedTargetInfo?.targetId===i.targetId&&(this.attachedTargetSession=o,this.attachedTargetBorrowedFromManaged=!0)}async bootstrapManagedTargets(e){let t=await this.listTargets({discoverOOPIF:!1});for(let n of t)this.shouldManageTargetType(n.type)&&this.matchesTargetTypes(n.type,e?.targetTypes)&&await this.ensureManagedTargetSession(n)}async ensureManagedTargetSession(e){if(this.registry.getByTargetId(e.targetId))return;let t=await I(await this.ensureBrowserSession(),e.targetId),n=t.id?.();if(!n)throw Error(`Managed target session id unavailable for ${e.targetId}`);let r=this.registry.get(n);if(r){r.targetInfo=e,this.registry.mapTargetIdToSession(e.targetId,n);return}let i={sessionId:n,session:t,targetInfo:e,networkMonitor:null,managedByAutoAttach:!1,appliedPersistentScripts:new Map};this.registry.add(n,i),this.registry.mapTargetIdToSession(e.targetId,n),this.aggregatedNetworkEnabled&&await this.ensureSessionNetworkMonitor(i)}async handleDetachedFromTarget(e){let t=this.readDetachedSessionId(e)??this.readAttachedSessionId(e)??null;if(!t)return;let n=this.registry.get(t);n&&(await this.disableEntryNetworkMonitor(n),this.registry.remove(t),this.registry.getPriorSessionId(n.targetInfo.targetId)===t&&this.registry.unmapTargetId(n.targetInfo.targetId),this.attachedTargetSession===n.session&&this.attachedTargetBorrowedFromManaged&&(this.attachedTargetSession=null,this.attachedTargetInfo=null,this.attachedTargetBorrowedFromManaged=!1))}handleTargetInfoChanged(e){let t=this.readTargetInfoRecord(e),n=t?this.normalizeTargetInfo(t):null;if(!n)return;let r=this.registry.getPriorSessionId(n.targetId);if(r){let e=this.registry.get(r);e&&(e.targetInfo=n)}this.attachedTargetInfo?.targetId===n.targetId&&(this.attachedTargetInfo=n)}async ensureSessionNetworkMonitor(e){e.networkMonitor||!this.aggregatedNetworkEnabled||(e.networkMonitor=new j(e.session,{sessionId:e.sessionId,targetId:e.targetInfo.targetId,targetType:e.targetInfo.type,requestIdPrefix:e.targetInfo.targetId}),await e.networkMonitor.enable())}async disableEntryNetworkMonitor(e){if(e.networkMonitor)try{await e.networkMonitor.disable()}catch(n){t.debug(`[BrowserTargetSessionManager] Failed to disable network monitor for ${e.targetInfo.targetId}: ${n instanceof Error?n.message:String(n)}`)}finally{e.networkMonitor=null}}async applyPersistentScriptsToEntry(e){for(let t of this.persistentScripts.values())this.matchesScriptTarget(e.targetInfo,t)&&await this.applyPersistentScriptToEntry(e,t)}async applyPersistentScriptToEntry(e,n){if(e.appliedPersistentScripts.get(n.id)!==n.source)try{await e.session.send(`Page.addScriptToEvaluateOnNewDocument`,{source:n.source}),e.appliedPersistentScripts.set(n.id,n.source)}catch(r){t.debug(`[BrowserTargetSessionManager] Failed to register preload script ${n.id} on ${e.targetInfo.targetId}: ${r instanceof Error?r.message:String(r)}`)}}async evaluateExpressionInEntry(e,t){await e.session.send(`Runtime.evaluate`,{expression:t,returnByValue:!1,awaitPromise:!0})}async getEntryInjectedRequests(e,t){return e.networkMonitor?(t===`xhr`?await e.networkMonitor.getXHRRequests():await e.networkMonitor.getFetchRequests()).map((n,r)=>({...n,sessionId:e.sessionId,targetId:e.targetInfo.targetId,targetType:e.targetInfo.type,requestId:typeof n.requestId==`string`&&n.requestId.length>0?n.requestId:`${e.targetInfo.targetId}:${t}-injected-${r}`})):[]}async lookupChildSession(e,t){for(let n=0;n<5;n+=1){let r=e?.connection?.()?.session(t)??null;if(r)return r;n<4&&await this.delay(25)}return null}async delay(e){await new Promise(t=>{setTimeout(t,e)})}shouldManageTargetType(e){return N.has(e)}matchesScriptTarget(e,t){return _e(e,t)}matchesTargetTypes(e,t){return F(e,t)}matchesFilters(e,t){return ve(e,t)}normalizeTargetInfo(e){return ye(e)}readAttachedSessionId(e){return be(e)}readDetachedSessionId(e){return xe(e)}readTargetInfoRecord(e){return Se(e)}};async function De(e){await e.evaluateOnNewDocument(()=>{let e=window,t=e.Worker;if(typeof t!=`function`)return;let n=Array.isArray(e.__workerUrls)?e.__workerUrls:[];e.Worker=new Proxy(t,{construct(t,r,i){let a=Reflect.construct(t,r,i),[o]=r;return typeof o==`string`?(n.push(o),e.__workerUrls=n):o instanceof URL&&(n.push(o.toString()),e.__workerUrls=n),a}})})}async function Oe(e,n,r){let i=await e.evaluate(e=>Array.from(document.querySelectorAll(`script`)).filter(e=>!e.src&&e.textContent).map((t,n)=>{let r=t.textContent||``,i=r.length,a=!1;return r.length>e&&(r=r.substring(0,e),a=!0),{url:`inline-script-${n}`,content:r,size:r.length,type:`inline`,metadata:{scriptType:t.type||`text/javascript`,async:t.async,defer:t.defer,integrity:t.integrity||void 0,truncated:a,originalSize:a?i:void 0}}}),n),a=i.slice(0,r);i.length>a.length&&t.warn(`Found ${i.length} inline scripts, limiting to ${r}`);let o=a.filter(e=>e.metadata?.truncated).length;return o>0&&t.warn(`${o} inline scripts were truncated due to size limits`),t.debug(`Collected ${a.length} inline scripts`),a}async function ke(e,n=()=>!0){try{let r=await e.evaluate(async()=>{if(!(`serviceWorker`in navigator))return[];let e=await navigator.serviceWorker.getRegistrations(),t=[];for(let n of e){let e=n.active||n.installing||n.waiting;e&&e.scriptURL&&t.push({url:e.scriptURL,scope:n.scope,state:e.state})}return t}),i=[];for(let a of r)if(n(a.url))try{let n=await e.evaluate(async e=>await(await fetch(e)).text(),a.url);n&&(i.push({url:a.url,content:n,size:n.length,type:`service-worker`}),t.debug(`Collected Service Worker: ${a.url}`))}catch(e){t.warn(`Failed to collect Service Worker: ${a.url}`,e)}return i}catch(e){return t.warn(`Service Worker collection failed`,e),[]}}async function Ae(e,n=()=>!0){try{let r=await e.evaluate(()=>{let e=window;return Array.isArray(e.__workerUrls)?e.__workerUrls:[]}),i=[];for(let a of r)try{let r=new URL(a,e.url()).href;if(!n(r))continue;let o=await e.evaluate(async e=>await(await fetch(e)).text(),r);o&&(i.push({url:r,content:o,size:o.length,type:`web-worker`}),t.debug(`Collected Web Worker: ${r}`))}catch(e){t.warn(`Failed to collect Web Worker: ${a}`,e)}return i}catch(e){return t.warn(`Web Worker collection failed`,e),[]}}function je(e){let n=[],r=[];return e.forEach(e=>{n.push({id:e.url,url:e.url,type:e.type})}),e.forEach(t=>{Me(t.content).forEach(n=>{let i=e.find(e=>e.url.includes(n)||e.url.endsWith(n)||e.url.endsWith(`${n}.js`));i&&r.push({from:t.url,to:i.url,type:`import`})})}),t.debug(`Dependency graph: ${n.length} nodes, ${r.length} edges`),{nodes:n,edges:r}}function Me(e){let t=[],n=/import\s+.*?\s+from\s+['"]([^'"]+)['"]/g,r;for(;(r=n.exec(e))!==null;)r[1]&&t.push(r[1]);let i=/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;for(;(r=i.exec(e))!==null;)r[1]&&t.push(r[1]);let a=/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g;for(;(r=a.exec(e))!==null;)r[1]&&t.push(r[1]);return[...new Set(t)]}function Ne(e){let t=0;e.type===`inline`?t+=10:e.type===`external`&&(t+=5),e.size<10*1024?t+=15:e.size<50*1024?t+=10:e.size>200*1024&&(t-=10);let n=e.url.toLowerCase();return(n.includes(`main`)||n.includes(`index`)||n.includes(`app`))&&(t+=20),(n.includes(`crypto`)||n.includes(`encrypt`)||n.includes(`sign`))&&(t+=30),(n.includes(`api`)||n.includes(`request`)||n.includes(`ajax`))&&(t+=25),(n.includes(`core`)||n.includes(`common`)||n.includes(`util`))&&(t+=15),(n.includes(`vendor`)||n.includes(`lib`)||n.includes(`jquery`)||n.includes(`react`))&&(t-=20),(n.includes(`node_modules`)||n.includes(`bundle`))&&(t-=30),t}function R(e){return typeof e==`object`&&!!e}function Pe(e){return R(e)?e:void 0}function Fe(e){return!R(e)||!R(e.response)?!1:typeof e.response.url==`string`&&typeof e.requestId==`string`}function Ie(e){return R(e)?typeof e.url==`string`&&typeof e.size==`number`&&typeof e.type==`string`&&typeof e.hasEncryption==`boolean`&&typeof e.hasAPI==`boolean`&&typeof e.hasObfuscation==`boolean`&&Array.isArray(e.functions)&&Array.isArray(e.imports)&&typeof e.preview==`string`:!1}function Le(e){return R(e)?typeof e.url==`string`&&typeof e.content==`string`&&typeof e.size==`number`&&typeof e.type==`string`:!1}function Re(e){if(!R(e)||typeof e.init!=`function`||typeof e.applyAntiDetection!=`function`||typeof e.shouldCollectUrl!=`function`)throw Error(`Invalid collector context`)}async function ze(e,n){Re(e);let r=Date.now();t.info(`Collecting code from: ${n.url}`);let i=Pe(n);if(e.cacheEnabled){let r=await e.cache.get(n.url,i);if(r)return t.info(` Cache hit for: ${n.url}`),r}if(await e.init(),!e.browser)throw Error(`Browser not initialized`);let a=null,o=(typeof e.listPages==`function`?await e.listPages().catch(()=>[]):[]).length>0&&typeof e.getActivePage==`function`?await e.getActivePage().then(e=>e.browserContext()).catch(e=>(t.debug(`Failed to resolve active browser context before code collection:`,e),null)):null,s=o===null&&typeof e.browser.createBrowserContext==`function`?await e.browser.createBrowserContext():null;if((o!==null||!s)&&typeof e.getActivePageIndex==`function`)try{a=await e.getActivePageIndex()}catch(e){t.debug(`Failed to capture active page index before code collection:`,e)}let c=o===null?s?await s.newPage():await e.browser.newPage():await o.newPage();try{let a=n.timeout??e.config.timeout??3e4;c.setDefaultTimeout(a),await c.setUserAgent(e.userAgent),await e.applyAntiDetection(c),n.includeWebWorker!==!1&&await De(c);let o=[],s=(n,r)=>{let i=e.MAX_FILES_PER_COLLECT-o.length;if(i<=0){t.warn(`Reached max files limit (${e.MAX_FILES_PER_COLLECT}), skipping ${r}`);return}n.length>i&&t.warn(`Collected ${n.length} ${r}, limiting to remaining ${i} files`),o.push(...n.slice(0,i))};e.cdpSession=await c.createCDPSession(),await e.cdpSession.send(`Network.enable`),await e.cdpSession.send(`Runtime.enable`),e.cdpListeners.responseReceived=async r=>{if(!Fe(r))return;let{response:i,requestId:a,type:c}=r,l=i.url;if(o.length>=e.MAX_FILES_PER_COLLECT){o.length===e.MAX_FILES_PER_COLLECT&&t.warn(`Reached max files limit (${e.MAX_FILES_PER_COLLECT}), will skip remaining files`);return}if(e.cleanupCollectedUrls(),c===`Script`||i.mimeType?.includes(`javascript`)||l.endsWith(`.js`)){if(n.includeExternal===!1||!e.shouldCollectUrl(l,n.filterRules))return;try{let n=await e.cdpSession.send(`Network.getResponseBody`,{requestId:a});if(typeof n.body!=`string`)return;let r=n.base64Encoded?Buffer.from(n.body,`base64`).toString(`utf-8`):n.body,i=r.length,c=r,u=!1;if(i>e.MAX_SINGLE_FILE_SIZE&&(c=r.substring(0,e.MAX_SINGLE_FILE_SIZE),u=!0,t.warn(`[CDP] Large file truncated: ${l} (${(i/1024).toFixed(2)} KB -> ${(e.MAX_SINGLE_FILE_SIZE/1024).toFixed(2)} KB)`)),!e.collectedUrls.has(l)){e.collectedUrls.add(l);let n={url:l,content:c,size:c.length,type:`external`,metadata:u?{truncated:!0,originalSize:i,truncatedSize:c.length}:void 0},r=o.length;s([n],`external scripts`),o.length>r&&(e.collectedFilesCache.set(l,n),t.debug(`[CDP] Collected (${o.length}/${e.MAX_FILES_PER_COLLECT}): ${l} (${(c.length/1024).toFixed(2)} KB)${u?` [TRUNCATED]`:``}`))}}catch(e){t.warn(`[CDP] Failed to get response body for: ${l}`,e)}}},e.cdpSession.on(`Network.responseReceived`,e.cdpListeners.responseReceived),t.info(`Navigating to: ${n.url}`),await c.goto(n.url,{waitUntil:M(),timeout:n.timeout||e.config.timeout}),n.includeInline!==!1&&(t.info(`Collecting inline scripts...`),s(await Oe(c,e.MAX_SINGLE_FILE_SIZE,e.MAX_FILES_PER_COLLECT),`inline scripts`)),n.includeServiceWorker!==!1&&(t.info(`Collecting Service Workers...`),s(await ke(c,t=>e.shouldCollectUrl(t,n.filterRules)),`service workers`)),n.includeWebWorker!==!1&&(t.info(`Collecting Web Workers...`),s(await Ae(c,t=>e.shouldCollectUrl(t,n.filterRules)),`web workers`)),n.includeDynamic&&(t.info(`Waiting for dynamic scripts...`),await new Promise(e=>setTimeout(e,3e3))),e.cdpSession&&(e.cdpListeners.responseReceived&&e.cdpSession.off(`Network.responseReceived`,e.cdpListeners.responseReceived),await e.cdpSession.detach(),e.cdpSession=null,e.cdpListeners={});let l=Date.now()-r,u=o.filter(e=>e.metadata?.truncated);u.length>0&&(t.warn(`${u.length} files were truncated due to size limits`),u.forEach(e=>{let n=typeof e.metadata?.originalSize==`number`?e.metadata.originalSize:e.size;t.warn(` - ${e.url}: ${(n/1024).toFixed(2)} KB -> ${(e.size/1024).toFixed(2)} KB`)}));let d=o;if(n.smartMode&&n.smartMode!==`full`)try{t.info(` Applying smart collection mode: ${n.smartMode}`);let i={mode:n.smartMode,maxTotalSize:n.maxTotalSize,maxFileSize:n.maxFileSize,priorities:n.priorities},a=await e.smartCollector.smartCollect(c,o,i);if(n.smartMode===`summary`&&(t.info(` Returning ${a.length} code summaries`),Array.isArray(a)&&a.every(e=>Ie(e))))return{files:[],summaries:a,dependencies:{nodes:[],edges:[]},totalSize:0,collectTime:Date.now()-r};Array.isArray(a)&&a.every(e=>Le(e))?d=a:(t.warn(`Smart collection returned unexpected type, using original files`),d=o)}catch(e){t.error(`Smart collection failed, using original files:`,e),d=o}if(n.compress)try{t.info(`Compressing ${d.length} files with enhanced compressor...`);let n=d.filter(t=>e.compressor.shouldCompress(t.content)).map(e=>({url:e.url,content:e.content}));if(n.length===0)t.info(`No files need compression (all below threshold)`);else{let r=await e.compressor.compressBatch(n,{level:void 0,useCache:!0,maxRetries:3,concurrency:5,onProgress:e=>{e%25==0&&t.debug(`Compression progress: ${e.toFixed(0)}%`)}}),i=new Map(r.map(e=>[e.url,e]));for(let e of d){let t=i.get(e.url);t&&(e.metadata={...e.metadata,compressed:!0,originalSize:t.originalSize,compressedSize:t.compressedSize,compressionRatio:t.compressionRatio})}let a=e.compressor.getStats();t.info(` Compressed ${r.length}/${d.length} files`),t.info(` Compression stats: ${(a.totalOriginalSize/1024).toFixed(2)} KB -> ${(a.totalCompressedSize/1024).toFixed(2)} KB (${a.averageRatio.toFixed(1)}% reduction)`),t.info(` Cache: ${a.cacheHits} hits, ${a.cacheMisses} misses (${a.cacheHits>0?(a.cacheHits/(a.cacheHits+a.cacheMisses)*100).toFixed(1):0}% hit rate)`)}}catch(e){t.error(`Compression failed:`,e)}let f=je(d),p=d.reduce((e,t)=>e+t.size,0);t.success(`Collected ${d.length} files (${(p/1024).toFixed(2)} KB) in ${l}ms`);let m={files:d,dependencies:f,totalSize:p,collectTime:l};return e.cacheEnabled&&(await e.cache.set(n.url,m,i),t.debug(` Saved to cache: ${n.url}`)),m}catch(e){throw t.error(`Code collection failed`,e),e}finally{if(e.cdpSession){try{e.cdpListeners.responseReceived&&e.cdpSession.off(`Network.responseReceived`,e.cdpListeners.responseReceived),await e.cdpSession.detach()}catch{}e.cdpSession=null,e.cdpListeners={}}if(s)try{await s.close()}catch(e){t.debug(`Failed to close temporary browser context after code collection:`,e)}else if(await c.close(),a!==null&&typeof e.selectPage==`function`)try{await e.selectPage(a)}catch(e){t.debug(`Failed to restore active page after code collection:`,e)}}}function z(e,t){if(t.length===0)return!0;let n=t.split(`*`).filter(e=>e.length>0);if(n.length===0)return!0;let r=0;for(let t of n){let n=e.indexOf(t,r);if(n===-1)return!1;r=n+t.length}return!0}function Be(e,t){if(!t||t.length===0)return!0;for(let n of t)if(z(e,n))return!0;return!1}async function Ve(e,n,r,i=3){let a=null;for(let o=0;o<i;o++)try{await e.goto(n,r);return}catch(e){a=e,t.warn(`Navigation attempt ${o+1}/${i} failed: ${e}`),o<i-1&&await new Promise(e=>setTimeout(e,1e3*(o+1)))}throw a||Error(`Navigation failed after retries`)}async function He(e){try{return await e.evaluate(()=>{let e=performance.getEntriesByType(`navigation`)[0];return{domContentLoaded:e.domContentLoadedEventEnd-e.domContentLoadedEventStart,loadComplete:e.loadEventEnd-e.loadEventStart,domInteractive:e.domInteractive-e.fetchStart,totalTime:e.loadEventEnd-e.fetchStart}})}catch(e){return t.warn(`Failed to get performance metrics`,e),{}}}async function Ue(e){try{return await e.evaluate(()=>({title:document.title,url:window.location.href,userAgent:navigator.userAgent,viewport:{width:window.innerWidth,height:window.innerHeight},cookies:document.cookie,localStorage:Object.keys(localStorage).length,sessionStorage:Object.keys(sessionStorage).length}))}catch(e){return t.warn(`Failed to collect page metadata`,e),{}}}let B=!1;function We(){let e=_(d(import.meta.url).resolve(`playwright-core/package.json`));return{playwrightServerPath:v(e,`lib/server/playwright.js`),crBrowserPath:v(e,`lib/server/chromium/crBrowser.js`)}}function Ge(){if(B)return;let e=d(import.meta.url),{playwrightServerPath:n,crBrowserPath:r}=We(),{createPlaywright:i}=e(n);i({sdkLanguage:`javascript`,isInternalPlaywright:!0});let{CRBrowserContext:a}=e(r);if(a.prototype.__jshookElectronCompatPatched){B=!0;return}let o=a.prototype.initialize;a.prototype.initialize=async function(...e){try{return await o.apply(this,e)}catch(e){let n=e instanceof Error?e.message:String(e);if(n.includes(`Browser.setDownloadBehavior`)&&n.includes(`Browser context management is not supported`)){t.warn(`[playwright-cdp-fallback] Swallowed Browser.setDownloadBehavior for legacy Electron CDP endpoint.`);return}throw e}},Object.defineProperty(a.prototype,"__jshookElectronCompatPatched",{value:!0,configurable:!1,enumerable:!1,writable:!1}),B=!0}function Ke(e){return e}function V(e){return e===`networkidle0`||e===`networkidle2`?`networkidle`:e}function qe(e){let t=e.contexts()[0];if(!t)throw Error(`Connected Playwright CDP browser exposes no default context. Cannot create or resolve pages.`);return t}function H(e,n){let r=n.get(e);if(r)return r;let i=new Proxy({async goto(t,n){return await e.goto(t,{...n,waitUntil:V(n?.waitUntil)})},async reload(t){return await e.reload({...t,waitUntil:V(t?.waitUntil)})},async waitForNavigation(t){let n=V(t?.waitUntil);return typeof e.waitForNavigation==`function`?await e.waitForNavigation({...t,waitUntil:n}):await e.waitForLoadState(n??`load`,{timeout:t?.timeout})},async select(t,...n){return await e.selectOption(t,n)},async evaluateOnNewDocument(t,...n){return await e.addInitScript(t,...n)},async createCDPSession(){let t=e.context();if(typeof t.newCDPSession!=`function`)throw Error(`Playwright BrowserContext does not expose newCDPSession() for the attached page.`);return await t.newCDPSession(e)},async setUserAgent(n){let r=e.context();if(typeof r.newCDPSession!=`function`){t.debug(`[playwright-cdp-fallback] Cannot apply UA override: newCDPSession unavailable.`);return}await(await r.newCDPSession(e)).send(`Network.setUserAgentOverride`,{userAgent:n}),t.debug(`[playwright-cdp-fallback] Applied user agent override via CDP session.`)}},{get(t,n,r){if(Reflect.has(t,n)){let e=Reflect.get(t,n,r);return typeof e==`function`?e.bind(t):e}let i=Reflect.get(e,n);return typeof i==`function`?i.bind(e):i}});return n.set(e,i),i}function Je(e,t){return{type:()=>`page`,url:()=>e.url(),page:async()=>H(e,t)}}function Ye(e){let t=new WeakMap;return new Proxy({targets(){return e.contexts().flatMap(e=>e.pages()).map(e=>Je(e,t))},async pages(){return e.contexts().flatMap(e=>e.pages()).map(e=>H(e,t))},async newPage(){return H(await qe(e).newPage(),t)},async disconnect(){await e.close()},async close(){await e.close()}},{get(t,n,r){if(Reflect.has(t,n)){let e=Reflect.get(t,n,r);return typeof e==`function`?e.bind(t):e}let i=Reflect.get(e,n);return typeof i==`function`?i.bind(e):i}})}async function U(e,t){Ge();let{chromium:n}=await import(`playwright-core`);return Ye(await n.connectOverCDP(Ke(e),{timeout:t}))}function Xe(e=`stable`){let t=ne();if(process.platform===`win32`){let n=process.env.LOCALAPPDATA??m(t,`AppData`,`Local`);switch(e){case`beta`:return m(n,`Google`,`Chrome Beta`,`User Data`);case`dev`:return m(n,`Google`,`Chrome Dev`,`User Data`);case`canary`:return m(n,`Google`,`Chrome SxS`,`User Data`);default:return m(n,`Google`,`Chrome`,`User Data`)}}if(process.platform===`darwin`){let n=m(t,`Library`,`Application Support`);switch(e){case`beta`:return m(n,`Google`,`Chrome Beta`);case`dev`:return m(n,`Google`,`Chrome Dev`);case`canary`:return m(n,`Google`,`Chrome Canary`);default:return m(n,`Google`,`Chrome`)}}let n=process.env.XDG_CONFIG_HOME??m(t,`.config`);switch(e){case`beta`:return m(n,`google-chrome-beta`);case`dev`:return m(n,`google-chrome-unstable`);case`canary`:return m(n,`google-chrome-canary`);default:return m(n,`google-chrome`)}}async function Ze(e){let t=e.channel??`stable`,n=m(e.userDataDir??Xe(t),`DevToolsActivePort`),r;try{r=await S(n,`utf8`)}catch(e){throw Error(`Could not read DevToolsActivePort from "${n}". Check if Chrome is running from this profile and remote debugging is enabled at chrome://inspect/#remote-debugging.`,{cause:e})}let[i,a]=r.split(/\r?\n/u).map(e=>e.trim()).filter(Boolean);if(!i||!a)throw Error(`Invalid DevToolsActivePort contents found in "${n}".`);let o=Number.parseInt(i,10);if(!Number.isInteger(o)||o<=0||o>65535)throw Error(`Invalid remote debugging port "${i}" in "${n}".`);return`ws://127.0.0.1:${o}${a}`}async function Qe(e){if(typeof e==`string`){let t=e.trim();if(!t)throw Error(`Connection endpoint cannot be empty.`);return t.startsWith(`ws://`)||t.startsWith(`wss://`)?{browserWSEndpoint:t}:{browserURL:t}}if(e.wsEndpoint)return{browserWSEndpoint:e.wsEndpoint};if(e.browserURL)return{browserURL:e.browserURL};if(e.autoConnect||e.userDataDir||e.channel)return{browserWSEndpoint:await Ze(e)};throw Error(`browserURL, wsEndpoint, autoConnect, userDataDir, or channel is required to connect to an existing browser.`)}function W(e){return typeof e!=`string`&&!!(e.autoConnect||e.userDataDir||e.channel)}function G(e){if(e instanceof Error)return e.message;if(typeof e==`object`&&e){let t=`message`in e&&typeof e.message==`string`?e.message.trim():``;if(t)return t;let n=`error`in e?e.error:void 0;if(n instanceof Error&&n.message)return n.message;if(typeof n==`object`&&n){let e=`message`in n&&typeof n.message==`string`?n.message.trim():``;if(e)return e}let r=JSON.stringify(e);if(r&&r!==`{}`)return r}return String(e)}function $e(e,t,n){let r=G(e);return W(n)&&/ECONNREFUSED/i.test(r)?Error(`Failed to connect to existing browser: ${r}. Chrome is not currently listening at ${t}. DevToolsActivePort may be stale after a browser restart. Re-open Chrome, confirm remote debugging is enabled at chrome://inspect/#remote-debugging, click Allow if prompted, and retry.`):e instanceof Error?e:Error(`Failed to connect to existing browser: ${r}`)}function et(e,t,n){let r=`Timed out after ${n}ms while connecting to existing browser: ${e}. The CDP handshake did not complete in time.`;return W(t)?Error(`${r} If Chrome prompted for remote debugging approval, click Allow in Chrome and then retry the tool call.`):Error(`${r} Verify that the browser debugging endpoint is reachable and retry.`)}function tt(e){let t=G(e);return/ECONNREFUSED|ENOTFOUND|404|stale/i.test(t)?!1:/timed out|handshake|Protocol error|Target closed|ECONNRESET|socket hang up|WebSocket/i.test(t)}async function nt(e,n,r){let i=e.browserWSEndpoint??e.browserURL;if(!i)throw n instanceof Error?n:Error(String(n));t.warn(`[connect-fallback] Rebrowser connect failed. Falling back to Playwright CDP compatibility mode for ${i}.`);try{return await U(i,r)}catch(e){let t=G(n),r=G(e);throw Error(`Failed to connect to existing browser via both rebrowser-puppeteer and Playwright CDP compatibility fallback. Primary error: ${t}. Fallback error: ${r}.`,{cause:e})}}async function rt(e,t,n,r,i){let a=++i.current,{connect:o}=await import(`rebrowser-puppeteer-core`);try{return await new Promise((s,c)=>{let l=!1,u=setTimeout(()=>{l=!0,i.current===a&&(i.current+=1),c(et(t,n,r))},r);o({...e,defaultViewport:null}).then(async e=>{if(l||i.current!==a){try{await e.disconnect()}catch{}return}l=!0,clearTimeout(u),s(e)}).catch(e=>{l||i.current!==a||(l=!0,clearTimeout(u),c($e(e,t,n)))})})}catch(t){if(!tt(t))throw t;return await nt(e,t,r)}}function it(e){let n=Array.from(e.values()).map(e=>({url:e.url,size:e.size,type:e.type,truncated:typeof e.metadata?.truncated==`boolean`?e.metadata.truncated:void 0,originalSize:typeof e.metadata?.originalSize==`number`?e.metadata.originalSize:void 0}));return t.info(`Returning summary of ${n.length} collected files`),n}function at(e,n){let r=e.get(n);return r?(t.info(`Returning file: ${n} (${(r.size/1024).toFixed(2)} KB)`),r):(t.warn(`File not found: ${n}`),null)}function ot(e,n,r,i){let a=new RegExp(n),o=[];for(let t of e.values())a.test(t.url)&&o.push(t);let s=[],c=0,l=!1;for(let e=0;e<o.length&&e<r;e++){let t=o[e];if(t&&c+t.size<=i)s.push(t),c+=t.size;else{l=!0;break}}return(l||o.length>r)&&t.warn(`Pattern "${n}" matched ${o.length} files, returning ${s.length} (limited by size/count)`),t.info(` Pattern "${n}": matched ${o.length}, returning ${s.length} files (${(c/1024).toFixed(2)} KB)`),{files:s,totalSize:c,matched:o.length,returned:s.length,truncated:l}}function st(e,n,r){let i=Array.from(e.values()),a=i.map(e=>({file:e,score:Ne(e)}));a.sort((e,t)=>t.score-e.score);let o=[],s=0;for(let e=0;e<Math.min(n,a.length);e++){let t=a[e];if(t?.file&&s+t.file.size<=r)o.push(t.file),s+=t.file.size;else break}return t.info(`Returning top ${o.length}/${i.length} priority files (${(s/1024).toFixed(2)} KB)`),{files:o,totalSize:s,totalFiles:i.length}}const ct=[`CHROME_PATH`,`PUPPETEER_EXECUTABLE_PATH`,`BROWSER_EXECUTABLE_PATH`];let K=null;function lt(){for(let e of ct){let t=process.env[e]?.trim();if(t&&f(t))return t}}let q=null;async function ut(){try{q||=(await import(`rebrowser-puppeteer-core`)).executablePath;let e=q(`chrome`);if(e&&f(e))return e}catch{}}function dt(){if(K!==null){if(!K||f(K))return K;K=null}return K=lt(),K??void 0}async function ft(){return dt()||(K=await ut()??void 0,K||=void 0,K)}const pt=[`--no-sandbox`,`--disable-setuid-sandbox`,`--disable-dev-shm-usage`,`--disable-blink-features=AutomationControlled`,`--disable-extensions`,`--disable-component-extensions-with-background-pages`,`--disable-web-security`,`--disable-features=IsolateOrigins,site-per-process`,`--ignore-certificate-errors`];function mt(e){return Array.isArray(e)?e.map(e=>e.trim()).filter(e=>e.length>0):[]}function ht(e){return e.split(/\s+/u).map(e=>e.trim()).filter(e=>e.length>0)}function J(e){let t=new Set,n=[];for(let r of e)t.has(r)||(t.add(r),n.push(r));return n}function gt(e,t){let n=[],r=[];for(let t=0;t<e.length;t+=1){let i=e[t];if(i){if(i===`--js-flags`){let n=e[t+1];if(typeof n==`string`){r.push(...ht(n)),t+=1;continue}}if(i.startsWith(`--js-flags=`)){r.push(...ht(i.slice(11)));continue}n.push(i)}}let i=J(r),a=`--allow-natives-syntax`;t!==!1&&!i.includes(a)&&i.push(a);let o=t===!1?i.filter(e=>e!==a):i;return{args:o.length>0?[...J(n),`--js-flags=${o.join(` `)}`]:J(n),v8NativeSyntaxEnabled:o.includes(a)}}function _t(e,t,n,r){let i=gt([...mt(e.args),...mt(t?.args),...pt,`--window-size=${r.width},${r.height}`],t?.enableV8NativesSyntax);return{headless:t?.headless??e.headless,args:i.args,executablePath:n,v8NativeSyntaxEnabled:i.v8NativeSyntaxEnabled}}function vt(e,t){return!e||e.headless!==t.headless||e.executablePath!==t.executablePath||e.v8NativeSyntaxEnabled!==t.v8NativeSyntaxEnabled||e.args.length!==t.args.length?!1:e.args.every((e,n)=>e===t.args[n])}var yt=class e{config;viewport;onDisconnected;browser=null;chromePid=null;currentLaunchOptions=null;connectedToExistingBrowser=!1;currentHeadless=null;static BROWSER_CLOSE_TIMEOUT_MS=5e3;constructor(e,t,n){this.config=e,this.viewport=t,this.onDisconnected=n}getBrowser(){return this.browser}isExistingBrowserConnection(){return this.connectedToExistingBrowser}getChromePid(){return this.chromePid}getCurrentHeadless(){return this.currentHeadless}getCurrentLaunchOptions(){return this.currentLaunchOptions}async launch(e,t){t&&await t;let n=await this.resolveExecutablePath(),r=_t(this.config,e,n,this.viewport);if(this.browser&&e===void 0)return{action:`reused`,launchOptions:this.currentLaunchOptions??r};if(this.browser&&!this.connectedToExistingBrowser&&vt(this.currentLaunchOptions,r))return{action:`reused`,launchOptions:r};let i=this.browser?`relaunched`:`launched`,a=this.browser?this.connectedToExistingBrowser?`replacing-existing-browser-connection`:`launch-options-changed`:void 0;return await this.launchInner(r),{action:i,launchOptions:r,...a?{reason:a}:{}}}async launchInner(e){this.browser&&await this.disposeCurrentBrowser(!1,async()=>{});let n={headless:e.headless,args:e.args,defaultViewport:this.viewport,protocolTimeout:6e4};e.executablePath&&(n.executablePath=e.executablePath),t.info(`Initializing browser with anti-detection...`);let r=await import(`rebrowser-puppeteer-core`),i=r.default?.launch??r.launch;this.browser=await i(n),this.connectedToExistingBrowser=!1,this.chromePid=this.browser.process()?.pid??null,this.chromePid&&t.debug(`Chrome child process PID: ${this.chromePid}`),this.currentHeadless=e.headless,this.currentLaunchOptions=e,this.browser.on(`disconnected`,()=>{this.handleBrowserDisconnected()}),t.success(`Browser initialized with enhanced anti-detection`)}async resolveExecutablePath(){let e=this.config.executablePath?.trim();if(e){if(f(e))return e;throw Error(`Configured browser executable was not found: ${e}. Set a valid executablePath or configure CHROME_PATH / PUPPETEER_EXECUTABLE_PATH / BROWSER_EXECUTABLE_PATH.`)}let n=await ft();if(n)return n;t.info(`No explicit browser executable configured. Falling back to Puppeteer-managed browser resolution.`)}handleBrowserDisconnected(){t.warn(`Browser disconnected`),this.browser=null,this.currentHeadless=null,this.currentLaunchOptions=null,this.connectedToExistingBrowser=!1,this.chromePid=null,this.onDisconnected()}async disposeCurrentBrowser(e,t){await t();let n=this.browser,r=this.connectedToExistingBrowser,i=this.chromePid;this.browser=null,this.currentHeadless=null,this.currentLaunchOptions=null,this.connectedToExistingBrowser=!1,this.chromePid=null,n&&(r?await n.disconnect():await this.closeBrowserWithForceKill(n,i))}async close(e){await this.disposeCurrentBrowser(!0,e),t.info(`Browser closed and all data cleared`)}async closeBrowserWithForceKill(n,r){try{await Promise.race([n.close(),new Promise((t,n)=>setTimeout(()=>n(Error(`browser.close() timed out`)),e.BROWSER_CLOSE_TIMEOUT_MS))])}catch(n){t.warn(`browser.close() failed or timed out, attempting force-kill:`,n),e.forceKillPid(r)}}static forceKillPid(e){if(e)try{process.kill(e,`SIGKILL`),t.info(`Force-killed Chrome process PID ${e}`)}catch(n){n.code!==`ESRCH`&&t.warn(`Failed to force-kill Chrome PID ${e}:`,n)}}async connect(e,n,r){this.browser&&await this.disposeCurrentBrowser(!1,async()=>{}),t.info(`Connecting to existing browser: ${r}`),this.browser=await n(e,r),this.connectedToExistingBrowser=!0,this.currentLaunchOptions=null,this.browser.on(`disconnected`,()=>{this.handleBrowserDisconnected()}),t.success(`Connected to existing browser successfully`)}},bt=class{config;lifecycleManager;collectedUrls=new Set;initPromise=null;collectLock=null;connectAttemptRef={current:0};MAX_COLLECTED_URLS;MAX_FILES_PER_COLLECT;MAX_RESPONSE_SIZE;MAX_SINGLE_FILE_SIZE;CONNECT_TIMEOUT_MS;viewport;userAgent;collectedFilesCache=new Map;cache;cacheEnabled=!0;smartCollector;compressor;cdpSession=null;browserTargetSessionManager=null;cdpListeners={};activePageIndex=null;cachedActivePage=null;explicitlyClosed=!1;constructor(e){this.config=e,this.MAX_COLLECTED_URLS=e.maxCollectedUrls??1e4,this.MAX_FILES_PER_COLLECT=e.maxFilesPerCollect??200,this.MAX_RESPONSE_SIZE=e.maxTotalContentSize??512*1024,this.MAX_SINGLE_FILE_SIZE=e.maxSingleFileSize??200*1024,this.CONNECT_TIMEOUT_MS=Number(process.env.JSHOOK_CONNECT_TIMEOUT_MS)||6e4,this.viewport=e.viewport??{width:1920,height:1080},this.userAgent=e.userAgent??`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36`,this.cache=new fe,this.smartCollector=new pe,this.compressor=new ge,this.lifecycleManager=new yt(this.config,this.viewport,this.handleBrowserDisconnected.bind(this)),t.info(` CodeCollector limits: maxCollect=${this.MAX_FILES_PER_COLLECT} files, maxResponse=${(this.MAX_RESPONSE_SIZE/1024).toFixed(0)}KB, maxSingle=${(this.MAX_SINGLE_FILE_SIZE/1024).toFixed(0)}KB`),t.info(` Strategy: Collect ALL files -> Cache -> Return summary/partial data to fit MCP limits`)}setCacheEnabled(e){this.cacheEnabled=e,t.info(`Code cache ${e?`enabled`:`disabled`}`)}async clearFileCache(){await this.cache.clear()}async getFileCacheStats(){return await this.cache.getStats()}async clearAllData(){t.info(`Clearing all collected data...`),await this.cache.clear(),this.compressor.clearCache(),this.compressor.resetStats(),this.collectedUrls.clear(),this.collectedFilesCache.clear(),t.success(`All data cleared`)}async getAllStats(){return{cache:await this.cache.getStats(),compression:{...this.compressor.getStats(),cacheSize:this.compressor.getCacheSize()},collector:{collectedUrls:this.collectedUrls.size,maxCollectedUrls:this.MAX_COLLECTED_URLS}}}getCache(){return this.cache}getCompressor(){return this.compressor}cleanupCollectedUrls(){if(this.collectedUrls.size>this.MAX_COLLECTED_URLS){t.warn(`Collected URLs exceeded ${this.MAX_COLLECTED_URLS}, clearing...`);let e=Array.from(this.collectedUrls);this.collectedUrls.clear(),e.slice(-Math.floor(this.MAX_COLLECTED_URLS/2)).forEach(e=>this.collectedUrls.add(e))}}initGuard=null;async init(e){if(this.initGuard)return this.initGuard;this.initGuard=this.initInner(e);try{await this.initGuard}finally{this.initGuard=null}}async initInner(e){await this.launch(e===void 0?void 0:{headless:e})}async launch(e){return this.explicitlyClosed=!1,await this.lifecycleManager.launch(e,this.initPromise)}async close(){await this.lifecycleManager.close(this.clearAllData.bind(this)),this.explicitlyClosed=!0,this.activePageIndex=null,this.cachedActivePage=null,this.browserTargetSessionManager?.dispose(),this.browserTargetSessionManager=null,this.cdpSession&&(this.cdpSession=null,this.cdpListeners={})}getChromePid(){return this.lifecycleManager.getChromePid()}isExistingBrowserConnection(){return this.lifecycleManager.isExistingBrowserConnection()}static forceKillPid(e){return yt.forceKillPid(e)}handleBrowserDisconnected(){this.activePageIndex=null,this.cachedActivePage=null,this.browserTargetSessionManager?.dispose(),this.browserTargetSessionManager=null,this.cdpSession&&(this.cdpSession=null,this.cdpListeners={})}getPageTargets(){let e=this.lifecycleManager.getBrowser();return e?e.targets().filter(e=>e.type()===`page`):[]}async resolvePageTargetHandle(e,t=5e3){let n=await Promise.race([e.page(),new Promise((e,n)=>{setTimeout(()=>{n(new w(`Timed out after ${t}ms while resolving a Puppeteer Page handle from the attached Chrome target.`))},t)})]);if(!n)throw new w(`Attached browser target does not expose a Puppeteer Page handle in the current Chrome remote debugging mode.`);return n}async getActivePage(){if(this.cachedActivePage)return this.cachedActivePage;if(!this.lifecycleManager.getBrowser()){if(this.explicitlyClosed)throw new w(`Browser was explicitly closed. Call browser_launch or browser_attach first.`);try{await this.init()}catch(e){throw new w(`Browser not available: ${e instanceof Error?e.message:String(e)}`)}}let e=this.getPageTargets();if(e.length===0)return await this.lifecycleManager.getBrowser().newPage();if(this.activePageIndex!==null&&this.activePageIndex<e.length)return await this.resolvePageTargetHandle(e[this.activePageIndex]);let t=e[e.length-1];if(!t)throw Error(`Failed to get active page`);return await this.resolvePageTargetHandle(t)}async getActivePageIndex(){let e=await this.getActivePage(),t=await this.listResolvedPages(),n=t.find(t=>t.page===e);if(n)return n.index;let r=e.url();return t.find(e=>e.url===r)?.index??null}async listPages(){return this.lifecycleManager.getBrowser()?this.getPageTargets().map((e,t)=>({index:t,url:e.url(),title:``})):[]}async listResolvedPages(e=1500){if(!this.lifecycleManager.getBrowser())return[];let t=this.getPageTargets();return(await Promise.all(t.map(async(t,n)=>{try{let r=await this.resolvePageTargetHandle(t,e),i=``;try{i=await Promise.race([r.title(),new Promise(t=>{setTimeout(()=>t(``),e)})])}catch{i=``}return{index:n,url:t.url(),title:i,page:r}}catch{return null}}))).filter(e=>e!==null)}async selectResolvedPageByTargetId(e){if(!this.lifecycleManager.getBrowser())return null;let t=this.getPageTargets();for(let n of t){let t=null;try{t=await n.createCDPSession();let{targetInfo:r}=await t.send(`Target.getTargetInfo`);if(r.targetId===e){let e=(await this.listResolvedPages()).find(e=>e.url===n.url())??null;return e?(this.activePageIndex=e.index,this.cachedActivePage=e.page,e):null}}catch{continue}finally{if(t)try{await t.detach()}catch{}}}return null}async selectPage(e){if(!this.lifecycleManager.getBrowser())throw Error(`Browser not connected`);let n=await this.listPages();if(e<0||e>=n.length)throw Error(`Page index ${e} out of range (0-${n.length-1})`);this.activePageIndex=e;try{let r=this.getPageTargets();this.cachedActivePage=await this.resolvePageTargetHandle(r[e],8e3),t.info(`Active page index set to ${e}: ${n[e].url} (cached)`)}catch(n){this.cachedActivePage=null,t.warn(`Failed to cache page handle for index ${e}: ${n instanceof Error?n.message:String(n)}. Falling back to lazy resolve on next use.`)}}async createPage(e){let n=this.lifecycleManager.getBrowser();n||=(await this.init(),this.lifecycleManager.getBrowser());let r=await n.newPage();return await r.setUserAgent(this.userAgent),await this.applyAntiDetection(r),e&&await r.goto(e,{waitUntil:M(),timeout:this.config.timeout}),t.info(`New page created${e?`: ${e}`:``}`),r}async applyAntiDetection(e){await e.evaluateOnNewDocument(()=>{Object.defineProperty(navigator,"webdriver",{get:()=>!1}),Object.defineProperty(navigator,"plugins",{get:()=>[1,2,3,4,5]}),Object.defineProperty(navigator,"languages",{get:()=>[`en-US`,`en`]});let e=window;e.chrome||={runtime:{},loadTimes:function(){},csi:function(){},app:{}};let t=window.navigator.permissions.query;window.navigator.permissions.query=e=>e.name===`notifications`?Promise.resolve({state:`denied`}):t(e)})}async getStatus(){let e=this.lifecycleManager.getBrowser();if(!e)return{running:!1,pagesCount:0};try{let t=await e.version(),n=this.getPageTargets(),r=this.lifecycleManager.getCurrentHeadless(),i=this.lifecycleManager.getCurrentLaunchOptions(),a=this.lifecycleManager.isExistingBrowserConnection();return{running:!0,pagesCount:n.length,version:t,effectiveHeadless:r??void 0,launchSource:a?`attached`:`launched`,v8NativeSyntaxEnabled:i?.v8NativeSyntaxEnabled,launchArgs:i?.args?[...i.args]:[]}}catch(e){return t.debug(`Browser not running or disconnected:`,e),{running:!1,pagesCount:0}}}async collect(e){for(;this.collectLock;)try{await this.collectLock}catch{}let t,n;this.collectLock=new Promise((e,r)=>{t=e,n=r});try{let n=await this.collectInner(e);return t(n),n}catch(e){throw n(e),e}finally{this.collectLock=null}}async collectInner(e){return ze(this,e)}shouldCollectUrl(e,t){return Be(e,t)}async navigateWithRetry(e,t,n,r=3){return Ve(e,t,n,r)}async getPerformanceMetrics(e){return He(e)}async collectPageMetadata(e){return Ue(e)}async resolveConnectOptions(e){return Qe(e)}async connectWithTimeout(e,t,n){return rt(e,t,n,this.CONNECT_TIMEOUT_MS,this.connectAttemptRef)}async connect(e){this.explicitlyClosed=!1;let t=await this.resolveConnectOptions(e),n=t.browserWSEndpoint??t.browserURL??`auto-detected Chrome debugging endpoint`;await this.lifecycleManager.connect(t,(t,n)=>this.connectWithTimeout(t,n,e),n)}getBrowser(){return this.lifecycleManager.getBrowser()}getBrowserTargetSessionManager(){return this.browserTargetSessionManager||=new Ee(()=>this.lifecycleManager.getBrowser()),this.browserTargetSessionManager}async listCdpTargets(e){return await this.getBrowserTargetSessionManager().listTargets(e)}async attachCdpTarget(e){return await this.getBrowserTargetSessionManager().attach(e)}async dumpTargetScripts(e,t){return await this.getBrowserTargetSessionManager().dumpTargetScripts(e,t)}async detachCdpTarget(){return await this.getBrowserTargetSessionManager().detach()}getAttachedTargetSession(){return this.browserTargetSessionManager?.getAttachedTargetSession()??null}getAttachedTargetInfo(){return this.browserTargetSessionManager?.getAttachedTargetInfo()??null}getCollectionStats(){return{totalCollected:this.collectedUrls.size,uniqueUrls:this.collectedUrls.size}}clearCache(){this.collectedUrls.clear(),t.info(`Collection cache cleared`)}getCollectedFilesSummary(){return it(this.collectedFilesCache)}getFileByUrl(e){return at(this.collectedFilesCache,e)}getFilesByPattern(e,t=20,n=this.MAX_RESPONSE_SIZE){return ot(this.collectedFilesCache,e,t,n)}getTopPriorityFiles(e=10,t=this.MAX_RESPONSE_SIZE){return st(this.collectedFilesCache,e,t)}clearCollectedFilesCache(){let e=this.collectedFilesCache.size;this.collectedFilesCache.clear(),t.info(`Cleared collected files cache (${e} files)`)}},xt=class{collector;pagePersistentScripts=new WeakMap;constructor(e){this.collector=e}getChromeNavigationWaitUntil(e=`networkidle`){return M(e)}async getBrowser(){return this.collector.getBrowser()}hasAttachedTargetSession(){return this.collector.getAttachedTargetSession()!==null}getAttachedTargetInfo(){return this.collector.getAttachedTargetInfo()}async evaluateAttachedTarget(e,t){return await this.collector.getBrowserTargetSessionManager().evaluate(e,t)}async addScriptToAttachedTarget(e){return await this.collector.getBrowserTargetSessionManager().addScriptToEvaluateOnNewDocument(e)}async addPersistentScriptToManagedTargets(e,t){return await this.collector.getBrowserTargetSessionManager().registerPersistentScript(e,t)}async addScriptToPageEvaluateOnNewDocument(e,t){let n=await this.collector.getActivePage();if(!t?.id)return await X(n,e);let r=this.getPagePersistentScriptRegistry(n),i=r.get(t.id);if(i?.source===e)return{identifier:i.identifier,reused:!0};i?.identifier&&await n.removeScriptToEvaluateOnNewDocument(i.identifier).catch(()=>{});let a=await X(n,e);return r.set(t.id,{source:e,identifier:a.identifier}),a}getPagePersistentScriptRegistry(e){let t=this.pagePersistentScripts.get(e);return t||(t=new Map,this.pagePersistentScripts.set(e,t)),t}async navigate(e,n){let r=await this.collector.getActivePage(),i=Date.now();await r.goto(e,{waitUntil:this.getChromeNavigationWaitUntil(n?.waitUntil),timeout:n?.timeout||3e4});let a=Date.now()-i,o=await r.title(),s=r.url();return t.info(`Navigated to: ${e}`),{url:s,title:o,loadTime:a}}async reload(e){await(await this.collector.getActivePage()).reload({waitUntil:this.getChromeNavigationWaitUntil(e?.waitUntil),timeout:e?.timeout||3e4}),t.info(`Page reloaded`)}async goBack(e=1e4){await(await this.collector.getActivePage()).goBack({waitUntil:`domcontentloaded`,timeout:e}),t.info(`Navigated back`)}async goForward(e=1e4){await(await this.collector.getActivePage()).goForward({waitUntil:`domcontentloaded`,timeout:e}),t.info(`Navigated forward`)}async click(e,n,r){let i=await this.collector.getActivePage(),a=await this.resolveFrame(i,r),o=n?.timeout,s={button:n?.button||`left`,clickCount:n?.clickCount||1,delay:n?.delay};if(n?.offset&&(s.offset=n.offset),typeof o==`number`&&Number.isFinite(o)&&o>0){i.setDefaultTimeout(o);try{await a.click(e,s)}finally{i.setDefaultTimeout(this.collector.config?.timeout??3e4)}}else await a.click(e,s);t.info(`Clicked: ${e}${r?.frameUrl||r?.frameSelector?` (in frame)`:``}`)}async type(e,n,r,i){let a=await this.collector.getActivePage();await(await this.resolveFrame(a,i)).type(e,n,{delay:r?.delay}),t.info(`Typed into ${e}: ${n.substring(0,20)}...`)}async select(e,n,r){let i=await this.collector.getActivePage();await(await this.resolveFrame(i,r)).select(e,...n),t.info(`Selected in ${e}: ${n.join(`, `)}`)}async hover(e,n){let r=await this.collector.getActivePage();await(await this.resolveFrame(r,n)).hover(e),t.info(`Hovered: ${e}`)}async scroll(e){await(await this.collector.getActivePage()).evaluate(e=>{window.scrollTo(e.x||0,e.y||0)},e),t.info(`Scrolled to: x=${e.x||0}, y=${e.y||0}`)}async waitForSelector(e,n){try{let r=await this.collector.getActivePage();await r.waitForSelector(e,{timeout:n||3e4});let i=await r.evaluate(e=>{let t=document.querySelector(e);return t?{tagName:t.tagName.toLowerCase(),id:t.id||void 0,className:t.className||void 0,textContent:t.textContent?.trim().substring(0,100)||void 0,attributes:Array.from(t.attributes).reduce((e,t)=>(e[t.name]=t.value,e),{})}:null},e);return t.info(`Selector appeared: ${e}`),{success:!0,element:i,message:`Selector appeared: ${e}`}}catch(n){return t.error(`waitForSelector timeout for ${e}:`,n),{success:!1,message:`Timeout waiting for selector: ${e}`}}}async waitForNavigation(e){await(await this.collector.getActivePage()).waitForNavigation({waitUntil:this.getChromeNavigationWaitUntil(),timeout:e||3e4}),t.info(`Navigation completed`)}async evaluate(e,n){let r=await this.collector.getActivePage();if(n?.frameUrl||n?.frameSelector){let i=await Ct(r,await this.resolveFrame(r,n),e);return t.info(`JavaScript executed (in frame)`),i}let i=await Y(r,e);return t.info(`JavaScript executed`),i}async resolveFrame(e,t){if(!t)return e.mainFrame();if(t.frameUrl){let n=e.frames(),r=n.find(e=>e.url().includes(t.frameUrl));if(!r){let e=n.map(e=>e.url()).filter(e=>e&&e!==`about:blank`);throw Error(`No frame matching URL substring "${t.frameUrl}". Available frames: ${e.join(`, `)||`(none)`}`)}return r}if(t.frameSelector){await e.waitForSelector(t.frameSelector,{timeout:s}).catch(()=>null);let n=await e.$(t.frameSelector);if(!n)throw Error(`No element found for iframe selector: ${t.frameSelector}`);let r=await n.contentFrame();if(!r)throw Error(`Element "${t.frameSelector}" exists but has no content frame (not an iframe or not yet loaded).`);return r}return e.mainFrame()}async listFrames(){let e=await this.collector.getActivePage(),t=e.mainFrame(),n=e.frames(),r=wt(t.url());return n.map(e=>{let n=e._id||e.url(),i=e.parentFrame(),a=i?i._id||i.url():null,o=wt(e.url());return{frameId:n,url:e.url(),name:e.name()||``,parentFrameId:a,parentUrl:i?.url()||null,isMainFrame:e===t,crossOrigin:!!(e!==t&&o&&r&&o!==r)}})}async getURL(){return(await this.collector.getActivePage()).url()}async getTitle(){return await(await this.collector.getActivePage()).title()}async getContent(){return await(await this.collector.getActivePage()).content()}async screenshot(e){if(this.hasAttachedTargetSession()){let n=this.collector.getBrowserTargetSessionManager();if(n){let r=await n.captureScreenshot({format:e?.type??`png`,quality:e?.quality,clip:e?.clip});return t.info(`Screenshot taken via CDP${e?.path?`: ${e.path}`:``}`),e?.path&&await y(e.path,r),r}}let n=await this.collector.getActivePage(),r={path:e?.path,type:e?.type||`png`,quality:e?.quality,fullPage:e?.fullPage||!1};e?.clip&&(r.clip=e.clip,r.fullPage=!1);let i=await n.screenshot(r);return t.info(`Screenshot taken${e?.path?`: ${e.path}`:``}`),i}async getPerformanceMetrics(){let e=await Y(await this.collector.getActivePage(),()=>{let e=performance.getEntriesByType(`navigation`)[0];return{domContentLoaded:e.domContentLoadedEventEnd-e.domContentLoadedEventStart,loadComplete:e.loadEventEnd-e.loadEventStart,dns:e.domainLookupEnd-e.domainLookupStart,tcp:e.connectEnd-e.connectStart,request:e.responseStart-e.requestStart,response:e.responseEnd-e.responseStart,total:e.loadEventEnd-e.fetchStart,resources:performance.getEntriesByType(`resource`).length}});return t.info(`Performance metrics retrieved`),e}async injectScript(e){await Y(await this.collector.getActivePage(),e=>{let t=document.createElement(`script`);t.textContent=e,document.head.appendChild(t)},e),t.info(`Script injected into page`)}async setCookies(e){await(await this.collector.getActivePage()).setCookie(...e),t.info(`Set ${e.length} cookies`)}async getCookies(e={}){let n=await this.collector.getActivePage(),r=e.urls?.filter(e=>e.length>0);if(r&&r.length>0){let e=await n.cookies(...r);return t.info(`Retrieved ${e.length} cookies for ${r.length} URL(s)`),e}let i;try{i=await n.createCDPSession();let e=await i.send(`Network.getAllCookies`);if(Array.isArray(e.cookies))return t.info(`Retrieved ${e.cookies.length} cookies across all origins`),e.cookies}catch(e){t.warn(`Falling back to page-scoped cookie read: ${e instanceof Error?e.message:String(e)}`)}finally{let e=i?.detach;typeof e==`function`&&await e.call(i).catch(()=>void 0)}let a=await n.cookies();return t.info(`Retrieved ${a.length} cookies`),a}async clearCookies(){if(this.collector.isExistingBrowserConnection())throw Error(`Cannot clear cookies on an attached browser. This operation is restricted to browsers launched by jshook to prevent accidental modification of user data.`);let e=await this.collector.getActivePage(),n=await this.getCookies();await e.deleteCookie(...n),t.info(`All cookies cleared`)}async handleDialog(e={}){let n=await this.collector.getActivePage(),r=e.accept!==!1,i=e.dismissAll!==!1,a=e.promptText,o=e=>{let t=e.type(),n=e.message();return r?t===`prompt`&&a!==void 0?e.accept(a).then(()=>({type:t,dialogMessage:n})):e.accept().then(()=>({type:t,dialogMessage:n})):e.dismiss().then(()=>({type:t,dialogMessage:n}))};if(i)return n.on(`dialog`,async e=>{try{await e.dismiss()}catch{}}),{handled:!0,message:`Persistent dialog handler installed — all future dialogs will be auto-dismissed.`};try{let e=await new Promise((e,t)=>{let r=setTimeout(()=>{t(Error(`Timed out waiting for a dialog (30s). No dialog appeared.`))},3e4);n.once(`dialog`,async n=>{clearTimeout(r);try{e(await o(n))}catch(e){t(e)}})});return{handled:!0,message:`${r?`accepted`:`dismissed`} ${e.type} dialog${e.dialogMessage?`: "${e.dialogMessage}"`:``}`,type:e.type,dialogMessage:e.dialogMessage||void 0}}catch(e){let n=e instanceof Error?e.message:String(e);return t.warn(`Dialog handler: ${n}`),{handled:!1,message:n}}}async setViewport(e,n){await(await this.collector.getActivePage()).setViewport({width:e,height:n}),t.info(`Viewport set to ${e}x${n}`)}async emulateDevice(e){let n=await this.collector.getActivePage(),r={iPhone:{viewport:{width:375,height:812,isMobile:!0},userAgent:`Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15`},iPad:{viewport:{width:768,height:1024,isMobile:!0},userAgent:`Mozilla/5.0 (iPad; CPU OS 14_0 like Mac OS X) AppleWebKit/605.1.15`},Android:{viewport:{width:360,height:640,isMobile:!0},userAgent:`Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 Chrome/91.0.4472.120`}},i=String(e||``).trim().toLowerCase(),a=null;if(i.includes(`iphone`)?a=`iPhone`:i.includes(`ipad`)?a=`iPad`:(i.includes(`android`)||i.includes(`pixel`))&&(a=`Android`),!a)throw Error(`Unsupported device "${e}". Supported values include: iPhone, iPad, Android (aliases like "iPhone 13" are accepted).`);let o=r[a];return await n.setViewport(o.viewport),await n.setUserAgent(o.userAgent),t.info(`Emulating ${a} (input: ${e})`),a}async waitForNetworkIdle(e=n){await(await this.collector.getActivePage()).waitForNetworkIdle({timeout:e}),t.info(`Network is idle`)}async getLocalStorage(){let e=await(await this.collector.getActivePage()).evaluate(()=>{let e={};for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n&&(e[n]=localStorage.getItem(n)||``)}return e});return t.info(`Retrieved ${Object.keys(e).length} localStorage items`),e}async setLocalStorage(e,n){await(await this.collector.getActivePage()).evaluate((e,t)=>{localStorage.setItem(e,t)},e,n),t.info(`Set localStorage: ${e}`)}async clearLocalStorage(){if(this.collector.isExistingBrowserConnection())throw Error(`Cannot clear localStorage on an attached browser. This operation is restricted to browsers launched by jshook to prevent accidental modification of user data.`);await(await this.collector.getActivePage()).evaluate(()=>{localStorage.clear()}),t.info(`LocalStorage cleared`)}async getSessionStorage(){let e=await(await this.collector.getActivePage()).evaluate(()=>{let e={};for(let t=0;t<sessionStorage.length;t++){let n=sessionStorage.key(t);n&&(e[n]=sessionStorage.getItem(n)||``)}return e});return t.info(`Retrieved ${Object.keys(e).length} sessionStorage items`),e}async setSessionStorage(e,n){await(await this.collector.getActivePage()).evaluate((e,t)=>{sessionStorage.setItem(e,t)},e,n),t.info(`Set sessionStorage: ${e}`)}async clearSessionStorage(){if(this.collector.isExistingBrowserConnection())throw Error(`Cannot clear sessionStorage on an attached browser. This operation is restricted to browsers launched by jshook to prevent accidental modification of user data.`);await(await this.collector.getActivePage()).evaluate(()=>{sessionStorage.clear()}),t.info(`SessionStorage cleared`)}async seedWebAuthnCredential(e){let n=await(await this.collector.getActivePage()).createCDPSession();try{await n.send(`WebAuthn.enable`,{enableUI:!0});let r=await n.send(`WebAuthn.addVirtualAuthenticator`,{options:{protocol:`ctap2`,transport:`internal`,hasResidentKey:!0,hasUserVerification:!0,isUserVerified:!0,automaticPresenceSimulation:!0}});return await n.send(`WebAuthn.addCredential`,{authenticatorId:r.authenticatorId,credential:{credentialId:e.credentialId,isResidentCredential:!0,privateKey:e.privateKey,signCount:0,rpId:e.relyingPartyId,userHandle:e.userHandle,userDisplayName:e.userDisplayName??`jshook user`,...e.publicKey?{publicKey:e.publicKey}:{}}}),t.info(`Seeded WebAuthn credential for ${e.relyingPartyId}`),{authenticatorId:r.authenticatorId,credentialId:e.credentialId}}finally{await n.detach().catch(()=>{})}}async pressKey(e){await(await this.collector.getActivePage()).keyboard.press(e),t.info(`Pressed key: ${e}`)}async uploadFile(e,n,r){let i=await this.collector.getActivePage(),a=await(r?await this.resolveFrame(i,r):i).$(e);if(!a)throw Error(`File input not found: ${e}`);let o=Array.isArray(n)?n:[n];await a.uploadFile(...o),t.info(`File uploaded: ${o.join(`, `)}`)}async getAllLinks(){let e=await(await this.collector.getActivePage()).evaluate(()=>{let e=document.querySelectorAll(`a[href]`),t=[];for(let n=0;n<e.length;n++){let r=e[n];t.push({text:r.textContent?.trim()||``,href:r.href})}return t});return t.info(`Found ${e.length} links`),e}async getPage(){return await this.collector.getActivePage()}async getActivePage(){return await this.collector.getActivePage()}};async function St(e,t=500){let n=new AbortController,r=re(t,void 0,{signal:n.signal}).then(()=>{throw Error(`cdp_unreachable`)}),i=null;try{i=await Promise.race([e.createCDPSession(),r]),await Promise.race([i.send(`Runtime.evaluate`,{expression:`1`,returnByValue:!0}),r])}catch(e){throw(e instanceof Error?e.message:String(e))===`cdp_unreachable`?Error(`CDP session unresponsive — the debugger may be blocking page evaluation. Call debugger_lifecycle({ action: 'disable' })() before this tool, or run it before debugger_lifecycle({ action: 'enable' })().`,{cause:e}):e}finally{if(n.abort(),i)try{await i.detach()}catch{}}}async function Ct(e,t,n,...r){let i=3e4;await St(e);let a;try{return await Promise.race([t.evaluate(n,...r),new Promise((e,t)=>{a=setTimeout(()=>t(Error(`page.evaluate timed out after ${i}ms`)),i)})])}finally{a!==void 0&&clearTimeout(a)}}async function Y(e,t,...n){return Ct(e,e,t,...n)}async function X(e,t,...n){let r=3e4;return await St(e),Promise.race([e.evaluateOnNewDocument(t,...n),new Promise((e,t)=>setTimeout(()=>t(Error(`page.evaluateOnNewDocument timed out after ${r}ms`)),r))])}function wt(e){try{return new URL(e).origin}catch{return null}}async function Tt(e,t){let n=3e4;return Promise.race([e.coverage.startJSCoverage(t),new Promise((e,t)=>setTimeout(()=>t(Error(`coverage.startJSCoverage timed out after ${n}ms`)),n))])}async function Et(e,t){let n=3e4;return Promise.race([e.coverage.startCSSCoverage(t),new Promise((e,t)=>setTimeout(()=>t(Error(`coverage.startCSSCoverage timed out after ${n}ms`)),n))])}async function Dt(e){let t=3e4;return Promise.race([e.coverage.stopJSCoverage(),new Promise((e,n)=>setTimeout(()=>n(Error(`coverage.stopJSCoverage timed out after ${t}ms`)),t))])}async function Ot(e){let t=3e4;return Promise.race([e.coverage.stopCSSCoverage(),new Promise((e,n)=>setTimeout(()=>n(Error(`coverage.stopCSSCoverage timed out after ${t}ms`)),t))])}const Z=e=>e===void 0?`undefined`:JSON.stringify(e),kt=`const walkShadowRoots = () => {
|
|
189
|
+
const roots = [document];
|
|
190
|
+
const queue = [document];
|
|
191
|
+
let shadowRootCount = 0;
|
|
192
|
+
while (queue.length > 0) {
|
|
193
|
+
const root = queue.shift();
|
|
194
|
+
if (!root) continue;
|
|
195
|
+
for (const element of Array.from(root.querySelectorAll('*'))) {
|
|
196
|
+
const shadowRoot = element.shadowRoot;
|
|
197
|
+
if (shadowRoot) {
|
|
198
|
+
roots.push(shadowRoot);
|
|
199
|
+
queue.push(shadowRoot);
|
|
200
|
+
shadowRootCount += 1;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return { roots, shadowRootCount };
|
|
205
|
+
};`;function At(e,t){return`
|
|
206
|
+
${kt}
|
|
207
|
+
const selector = ${Z(e)};
|
|
208
|
+
const maxLimit = ${Z(t)};
|
|
209
|
+
const { roots, shadowRootCount } = walkShadowRoots();
|
|
210
|
+
const seen = new Set();
|
|
211
|
+
const results = [];
|
|
212
|
+
let totalMatches = 0;
|
|
213
|
+
for (const root of roots) {
|
|
214
|
+
const nodeList = Array.from(root.querySelectorAll(selector));
|
|
215
|
+
totalMatches += nodeList.length;
|
|
216
|
+
for (const element of nodeList) {
|
|
217
|
+
if (seen.has(element)) continue;
|
|
218
|
+
seen.add(element);
|
|
219
|
+
const attributes = {};
|
|
220
|
+
for (const attr of Array.from(element.attributes)) {
|
|
221
|
+
attributes[attr.name] = attr.value;
|
|
222
|
+
}
|
|
223
|
+
const rect = element.getBoundingClientRect();
|
|
224
|
+
const style = window.getComputedStyle(element);
|
|
225
|
+
const textContent = element.textContent?.trim() || '';
|
|
226
|
+
results.push({
|
|
227
|
+
found: true,
|
|
228
|
+
nodeName: element.nodeName,
|
|
229
|
+
attributes,
|
|
230
|
+
textContent: textContent.length > 500 ? textContent.substring(0, 500) + '...[truncated]' : textContent,
|
|
231
|
+
boundingBox: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },
|
|
232
|
+
visible: style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0',
|
|
233
|
+
});
|
|
234
|
+
if (results.length >= maxLimit) break;
|
|
235
|
+
}
|
|
236
|
+
if (results.length >= maxLimit) break;
|
|
237
|
+
}
|
|
238
|
+
if (totalMatches > maxLimit) {
|
|
239
|
+
console.warn('[DOMInspector] Found ' + totalMatches + ' elements for "' + selector + '", limiting to ' + maxLimit);
|
|
240
|
+
}
|
|
241
|
+
return { elements: results, diagnostics: { readyState: document.readyState, shadowRootCount } };
|
|
242
|
+
`.trim()}function jt(e){return`
|
|
243
|
+
${kt}
|
|
244
|
+
const filter = ${Z(e)};
|
|
245
|
+
const normalizedFilter = filter?.toLowerCase();
|
|
246
|
+
const { roots, shadowRootCount } = walkShadowRoots();
|
|
247
|
+
const results = [];
|
|
248
|
+
const seen = new Set();
|
|
249
|
+
const appendClickable = (element, type, fallbackSelector) => {
|
|
250
|
+
if (seen.has(element)) return;
|
|
251
|
+
seen.add(element);
|
|
252
|
+
const text = element.textContent?.trim() || (element.value ?? '').trim() || '';
|
|
253
|
+
if (normalizedFilter && !text.toLowerCase().includes(normalizedFilter)) return;
|
|
254
|
+
const rect = element.getBoundingClientRect();
|
|
255
|
+
const style = window.getComputedStyle(element);
|
|
256
|
+
let selector = fallbackSelector;
|
|
257
|
+
if (element.id) selector = '#' + element.id;
|
|
258
|
+
else if (element.className) selector = fallbackSelector + '.' + element.className.split(' ')[0];
|
|
259
|
+
results.push({
|
|
260
|
+
selector,
|
|
261
|
+
text,
|
|
262
|
+
type,
|
|
263
|
+
visible:
|
|
264
|
+
style.display !== 'none' &&
|
|
265
|
+
style.visibility !== 'hidden' &&
|
|
266
|
+
style.opacity !== '0' &&
|
|
267
|
+
rect.width > 0 &&
|
|
268
|
+
rect.height > 0,
|
|
269
|
+
boundingBox: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },
|
|
270
|
+
});
|
|
271
|
+
};
|
|
272
|
+
for (const root of roots) {
|
|
273
|
+
root
|
|
274
|
+
.querySelectorAll('button, input[type="button"], input[type="submit"], input[type="reset"]')
|
|
275
|
+
.forEach((button) => appendClickable(button, 'button', button.tagName.toLowerCase()));
|
|
276
|
+
root.querySelectorAll('a[href]').forEach((link) => appendClickable(link, 'link', 'a'));
|
|
277
|
+
}
|
|
278
|
+
return { elements: results, diagnostics: { readyState: document.readyState, shadowRootCount } };
|
|
279
|
+
`.trim()}function Mt(e){let t=document.querySelector(e);if(!t)return{found:!1};let n={};for(let e of Array.from(t.attributes))n[e.name]=e.value;let r=t.getBoundingClientRect(),i=window.getComputedStyle(t);return{found:!0,nodeName:t.nodeName,attributes:n,textContent:t.textContent?.trim()||``,boundingBox:{x:r.x,y:r.y,width:r.width,height:r.height},visible:i.display!==`none`&&i.visibility!==`hidden`&&i.opacity!==`0`}}function Nt(e,t){let n=(r,i)=>{if(i>e)return null;let a={tag:r.tagName,id:r.id||void 0,class:r.className||void 0};t&&r.childNodes.length===1&&r.childNodes[0]?.nodeType===3&&(a.text=r.textContent?.trim());let o=Array.from(r.children).map(e=>n(e,i+1)).filter(e=>e!==null);return o.length>0&&(a.children=o),a};return n(document.body,0)}function Pt(e){let t=document.querySelector(e);if(!t)return null;let n=window.getComputedStyle(t),r={};for(let e of[`display`,`visibility`,`opacity`,`position`,`zIndex`,`width`,`height`,`top`,`left`,`right`,`bottom`,`color`,`backgroundColor`,`fontSize`,`fontFamily`,`border`,`padding`,`margin`,`overflow`])r[e]=n.getPropertyValue(e);return r}function Ft(e){let t=e.selector?document.querySelector(e.selector):document.body;if(!t){console.error(`Target node not found for MutationObserver`);return}let n=new MutationObserver(e=>{e.forEach(e=>{console.warn(`[DOM Change]`,{type:e.type,target:e.target,addedNodes:e.addedNodes.length,removedNodes:e.removedNodes.length,attributeName:e.attributeName})})});n.observe(t,{childList:e.childList!==!1,attributes:e.attributes!==!1,characterData:e.characterData!==!1,subtree:e.subtree!==!1}),window.__domObserver=n}function It(){let e=window;e.__domObserver&&(e.__domObserver.disconnect(),delete e.__domObserver)}function Lt(e,t){let n=t?`//${t}[contains(text(), "${e}")]`:`//*[contains(text(), "${e}")]`,r=document.evaluate(n,document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),i=[];for(let e=0;e<Math.min(r.snapshotLength,100);e++){let t=r.snapshotItem(e);if(!t)continue;let n=t.getBoundingClientRect(),a=window.getComputedStyle(t),o=t.tagName.toLowerCase();if(t.id)o=`#${t.id}`;else if(t.className){let e=t.className.split(` `).filter(Boolean);e.length>0&&(o=`${t.tagName.toLowerCase()}.${e[0]}`)}i.push({found:!0,nodeName:t.tagName,textContent:t.textContent?.trim(),selector:o,boundingBox:{x:n.x,y:n.y,width:n.width,height:n.height},visible:a.display!==`none`&&a.visibility!==`hidden`&&a.opacity!==`0`})}return i}function Rt(e){let t=document.querySelector(e);if(!t)return null;let n=[],r=t;for(;r&&r!==document.body&&r!==document.documentElement;){if(r.id)return n.unshift(`//*[@id="${r.id}"]`),n.join(``);let e=0,t=r.parentElement?.children;if(t)for(let n=0;n<t.length;n++){let i=t[n];if(i){if(i===r)break;i.tagName===r.tagName&&(e+=1)}}n.unshift(`/${r.tagName.toLowerCase()}[${e+1}]`),r=r.parentElement}return`/html/body`+n.join(``)}function zt(e){let t=document.querySelector(e);if(!t)return!1;let n=t.getBoundingClientRect();return n.top>=0&&n.left>=0&&n.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&n.right<=(window.innerWidth||document.documentElement.clientWidth)}var Bt=class{collector;cdpSession=null;constructor(e){this.collector=e}async waitForReadyState(e,t=3e3){let n=Date.now()+t,r=!1,i=`unknown`;for(;Date.now()<=n&&(i=await e.evaluate(()=>document.readyState).catch(()=>`unknown`),i!==`complete`);)r=!0,await new Promise(e=>setTimeout(e,100));return{readyState:i,waitedForReadyState:r,frameCount:typeof e.frames==`function`?e.frames().length:1}}async querySelector(e,n=!0){try{let n=await(await this.collector.getActivePage()).evaluate(Mt,e);return t.info(`querySelector: ${e} - ${n.found?`found`:`not found`}`),n}catch(n){return t.error(`querySelector failed for ${e}:`,n),{found:!1}}}async querySelectorAll(e,n=o){try{let r=await this.collector.getActivePage(),i=await this.waitForReadyState(r),a=async()=>r.evaluate(Function(At(e,n))),o=await a(),s=!1;o.elements.length===0&&o.diagnostics.readyState===`complete`&&(s=!0,await new Promise(e=>setTimeout(e,500)),o=await a());let c={readyState:o.diagnostics.readyState??i.readyState,frameCount:i.frameCount,shadowRootCount:o.diagnostics.shadowRootCount??0,retried:s,waitedForReadyState:i.waitedForReadyState};return t.info(`querySelectorAll: ${e} - found ${o.elements.length} elements (limit: ${n}, readyState: ${c.readyState}, shadowRoots: ${c.shadowRootCount}, retried: ${s})`),{elements:o.elements,diagnostics:c}}catch(n){return t.error(`querySelectorAll failed for ${e}:`,n),{elements:[],diagnostics:{readyState:`error`,frameCount:0,shadowRootCount:0,retried:!1,waitedForReadyState:!1}}}}async getStructure(e=3,n=!0){try{let r=await(await this.collector.getActivePage()).evaluate(Nt,e,n);return t.info(`DOM structure retrieved`),r}catch(e){return t.error(`getStructure failed:`,e),null}}async findClickable(e){try{let n=await this.collector.getActivePage(),r=await this.waitForReadyState(n),i=async()=>n.evaluate(Function(jt(e))),a=await i(),o=!1;a.elements.length===0&&a.diagnostics.readyState===`complete`&&(o=!0,await new Promise(e=>setTimeout(e,500)),a=await i());let s={readyState:a.diagnostics.readyState??r.readyState,frameCount:r.frameCount,shadowRootCount:a.diagnostics.shadowRootCount??0,retried:o,waitedForReadyState:r.waitedForReadyState};return t.info(`findClickable: found ${a.elements.length} elements${e?` (filtered by: ${e})`:``} (readyState: ${s.readyState}, shadowRoots: ${s.shadowRootCount}, retried: ${o})`),{elements:a.elements,diagnostics:s}}catch(e){return t.error(`findClickable failed:`,e),{elements:[],diagnostics:{readyState:`error`,frameCount:0,shadowRootCount:0,retried:!1,waitedForReadyState:!1}}}}async getComputedStyle(e){try{let n=await(await this.collector.getActivePage()).evaluate(Pt,e);return t.info(`getComputedStyle: ${e} - ${n?`found`:`not found`}`),n}catch(n){return t.error(`getComputedStyle failed for ${e}:`,n),null}}async waitForElement(e,n=a){try{return await(await this.collector.getActivePage()).waitForSelector(e,{timeout:n}),await this.querySelector(e)}catch(n){return t.error(`waitForElement timeout for ${e}:`,n),null}}async observeDOMChanges(e={}){await(await this.collector.getActivePage()).evaluate(Ft,e),t.info(`DOM change observer started`)}async stopObservingDOM(){await(await this.collector.getActivePage()).evaluate(It),t.info(`DOM change observer stopped`)}async findByText(e,n){try{let r=await(await this.collector.getActivePage()).evaluate(Lt,e,n);return t.info(`findByText: "${e}" - found ${r.length} elements`),r}catch(n){return t.error(`findByText failed for "${e}":`,n),[]}}async getXPath(e){try{let n=await(await this.collector.getActivePage()).evaluate(Rt,e);return t.info(`getXPath: ${e} -> ${n}`),n}catch(n){return t.error(`getXPath failed for ${e}:`,n),null}}async isInViewport(e){try{let n=await(await this.collector.getActivePage()).evaluate(zt,e);return t.info(`isInViewport: ${e} - ${n}`),n}catch(n){return t.error(`isInViewport failed for ${e}:`,n),!1}}async close(){this.cdpSession&&(await this.cdpSession.detach(),this.cdpSession=null,t.info(`DOM Inspector CDP session closed`))}};const Vt=e=>e instanceof Error?e.message:String(e),Ht=e=>typeof e==`object`&&e?e:null,Q=e=>typeof e==`function`?e:null,Ut=(e,t)=>{let n=Ht(e),r=n?.default;return Q(Ht(r)?.default)??Q(r)??Q(n?.[t])??Q(e)};async function Wt(e,n,r,i={}){let{maxDepth:a=3,maxSize:o=500,includeComments:s=!0}=i,c=await e.getScriptSource(n);if(!c?.source)throw Error(`Script not found: ${n}`);let l,u,d,f;try{l=await import(`@babel/parser`);let e=Ut(await import(`@babel/traverse`),`traverse`);if(typeof e!=`function`)throw Error(`Invalid @babel/traverse export shape`);u=e;let t=Ut(await import(`@babel/generator`),`generate`);if(typeof t!=`function`)throw Error(`Invalid @babel/generator export shape`);d=t,f=await import(`@babel/types`)}catch(e){throw Error(`Failed to load Babel dependencies. Please install: npm install @babel/parser @babel/traverse @babel/generator @babel/types\nError: ${Vt(e)}`,{cause:e})}let p;try{p=l.parse(c.source,{sourceType:`unambiguous`,plugins:[`jsx`,`typescript`]})}catch(e){throw Error(`Failed to parse script ${n}: ${Vt(e)}`,{cause:e})}let m=new Map,h={},g=e=>{let t=new Set;return e.traverse({CallExpression(e){f.isIdentifier(e.node.callee)&&t.add(e.node.callee.name)}}),Array.from(t)};u(p,{FunctionDeclaration(e){let t=e.node.id?.name;if(!t)return;let n=d(e.node,{comments:s}).code,r=g(e);m.set(t,{name:t,code:n,startLine:e.node.loc?.start.line||0,endLine:e.node.loc?.end.line||0,dependencies:r,size:n.length}),h[t]=r},VariableDeclarator(e){if(f.isIdentifier(e.node.id)&&(f.isFunctionExpression(e.node.init)||f.isArrowFunctionExpression(e.node.init))){let t=e.node.id.name,n=d(e.node,{comments:s}).code,r=g(e);m.set(t,{name:t,code:n,startLine:e.node.loc?.start.line||0,endLine:e.node.loc?.end.line||0,dependencies:r,size:n.length}),h[t]=r}}});let _=new Set,v=[r],y=0;for(;v.length>0&&y<a;){let e=v.shift();if(_.has(e))continue;let t=m.get(e);if(t){_.add(e);for(let e of t.dependencies)!_.has(e)&&m.has(e)&&v.push(e);y++}}let b=Array.from(_).map(e=>m.get(e)).filter(Boolean),x=b.map(e=>e.code).join(`
|
|
280
|
+
|
|
281
|
+
`),S=x.length;return S>o*1024&&t.warn(`Extracted code size (${(S/1024).toFixed(2)}KB) exceeds limit (${o}KB)`),t.info(`extractFunctionTree: ${r} - extracted ${b.length} functions (${(S/1024).toFixed(2)}KB)`),{mainFunction:r,code:x,functions:b,callGraph:h,totalSize:S,extractedCount:b.length}}var Gt=class e{collector;static SOURCE_LOAD_BATCH_SIZE=8;static SEARCH_LINE_YIELD_INTERVAL=250;static SEARCH_SCRIPT_YIELD_INTERVAL=10;cdpSession=null;scripts=new Map;scriptsByUrl=new Map;initialized=!1;initPromise;keywordIndex=new Map;scriptChunks=new Map;CHUNK_SIZE=100*1024;MAX_KEYWORD_INDEX_ENTRIES=5e4;CDP_HEALTH_PROBE_INTERVAL_MS=3e4;lastHealthProbeAt=0;constructor(e){this.collector=e}async init(){if(!this.initialized){if(this.initPromise)return this.initPromise;this.initPromise=this.doInit();try{return await this.initPromise}finally{this.initPromise=void 0}}}async doInit(){let e=await this.collector.getActivePage();this.cdpSession=await e.createCDPSession(),this.cdpSession.on(`Debugger.scriptParsed`,e=>{let n={scriptId:e.scriptId,url:e.url,startLine:e.startLine,startColumn:e.startColumn,endLine:e.endLine,endColumn:e.endColumn,sourceLength:e.length};this.scripts.set(e.scriptId,n),e.url&&(this.scriptsByUrl.has(e.url)||this.scriptsByUrl.set(e.url,[]),this.scriptsByUrl.get(e.url).push(n)),t.debug(`Script parsed: ${e.url||`inline`} (${e.scriptId})`)}),await this.cdpSession.send(`Debugger.enable`),this.initialized=!0,this.lastHealthProbeAt=Date.now(),t.info(`ScriptManager initialized`)}async loadScriptSourceInternal(e){if(e.source)return!0;try{let{scriptSource:t}=await this.cdpSession.send(`Debugger.getScriptSource`,{scriptId:e.scriptId});return e.source=t,e.sourceLength=t.length,this.buildKeywordIndex(e.scriptId,e.url,t),this.chunkScript(e.scriptId,t),!0}catch(n){return t.warn(`Failed to get source for script ${e.scriptId}:`,n),!1}}async enable(){return this.init()}async ensureCdpSession(){if(!this.cdpSession){await this.init();return}if(!this.initialized){await this.init();return}let e=Date.now();if(!(e-this.lastHealthProbeAt<this.CDP_HEALTH_PROBE_INTERVAL_MS))try{await Promise.race([this.cdpSession.send(`Runtime.evaluate`,{expression:`1`,returnByValue:!0}),new Promise((e,t)=>setTimeout(()=>t(Error(`session_unreachable`)),3e3))]),this.lastHealthProbeAt=e}catch{t.warn(`ScriptManager CDP session unresponsive (zombie), reinitializing...`),this.cdpSession=null,this.initialized=!1,this.lastHealthProbeAt=0,this.scripts.clear(),this.scriptsByUrl.clear(),this.keywordIndex.clear(),this.scriptChunks.clear(),await this.init()}}async getAllScripts(n=!1,r=1e3){await this.ensureCdpSession();let i=Array.from(this.scripts.values());i.length>r&&t.warn(`Found ${i.length} scripts, limiting to ${r}. Increase maxScripts parameter if needed.`);let a=i.slice(0,r);if(n){t.warn(`Loading source code for ${a.length} scripts. This may use significant memory.`);let n=0,r=0,i=a.filter(e=>!e.source);for(let o=0;o<i.length;o+=e.SOURCE_LOAD_BATCH_SIZE){let s=i.slice(o,o+e.SOURCE_LOAD_BATCH_SIZE),c=await Promise.allSettled(s.map(async e=>{await this.loadScriptSourceInternal(e)?(n++,n%10==0&&t.debug(`Loaded ${n}/${a.length} scripts...`)):r++}));for(let e of c)e.status===`rejected`&&r++;await C()}t.info(`getAllScripts: ${a.length} scripts (loaded: ${n}, failed: ${r})`)}else t.info(`getAllScripts: ${a.length} scripts (source not included)`);return a}async getScriptSource(e,n){if(!e&&!n)throw Error(`Either scriptId or url parameter must be provided`);await this.ensureCdpSession();let r;if(e)r=this.scripts.get(e);else if(n){for(let[e,t]of this.scriptsByUrl.entries())if(z(e,n)){r=t[0];break}}return r?!r.source&&!await this.loadScriptSourceInternal(r)?(t.error(`Failed to get script source for ${r.scriptId}`),null):(t.info(`getScriptSource: ${r.url||`inline`} (${r.sourceLength} bytes)`),r):(t.warn(`Script not found: ${e||n}`),null)}async findScriptsByUrl(e){await this.ensureCdpSession();let n=[];for(let[t,r]of this.scriptsByUrl.entries())z(t,e)&&n.push(...r);return t.info(`findScriptsByUrl: ${e} - found ${n.length} scripts`),n}clearCache(){this.clear()}async searchInScripts(n,r={}){await this.ensureCdpSession();let{isRegex:i=!1,caseSensitive:a=!1,contextLines:o=3,maxMatches:s=100}=r,c=i?new RegExp(n,a?`g`:`gi`):new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),a?`g`:`gi`),l=[],u=await this.getAllScripts(!0,500);for(let[t,n]of u.entries()){if(!n.source)continue;if(l.length>=s)break;let r=n.source.split(`
|
|
282
|
+
`);for(let t=0;t<r.length;t++){let i=r[t];if(!i)continue;let a=Array.from(i.matchAll(c));for(let e of a){if(l.length>=s)break;let a=Math.max(0,t-o),c=Math.min(r.length-1,t+o),u=r.slice(a,c+1).join(`
|
|
283
|
+
`);if(u.length>2e3){let t=e.index||0,n=Math.max(0,t-100),r=Math.min(i.length,t+100);u=(n>0?`...`:``)+i.substring(n,r)+(r<i.length?`...`:``)}l.push({scriptId:n.scriptId,url:n.url||`inline`,line:t+1,column:e.index||0,matchText:e[0],context:u})}(t+1)%e.SEARCH_LINE_YIELD_INTERVAL===0&&await C()}(t+1)%e.SEARCH_SCRIPT_YIELD_INTERVAL===0&&await C()}return t.info(`searchInScripts: "${n}" - found ${l.length} matches`),{keyword:n,totalMatches:l.length,matches:l}}async extractFunctionTree(e,t,n={}){return Wt(this,e,t,n)}clear(){this.scripts.clear(),this.scriptsByUrl.clear(),this.keywordIndex.clear(),this.scriptChunks.clear(),t.info(` ScriptManager cleared - ready for new website`)}async close(){if(this.initPromise=void 0,this.clear(),this.cdpSession){try{await this.cdpSession.send(`Debugger.disable`),await this.cdpSession.detach(),t.info(`CDP session closed`)}catch(e){t.warn(`Failed to close CDP session:`,e)}this.cdpSession=null}this.initialized=!1,t.info(` ScriptManager closed`)}getStats(){let e=0;for(let t of this.scriptChunks.values())e+=t.length;return{totalScripts:this.scripts.size,totalUrls:this.scriptsByUrl.size,indexedKeywords:this.keywordIndex.size,totalChunks:e}}buildKeywordIndex(e,n,r){let i=r.split(`
|
|
284
|
+
`),a=/\b[a-zA-Z_$][a-zA-Z0-9_$]{2,}\b/g;for(let t=0;t<i.length;t++){let r=i[t];if(!r)continue;let o=Array.from(r.matchAll(a));for(let a of o){let o=a[0].toLowerCase(),s=Math.max(0,t-3),c=Math.min(i.length-1,t+3),l=i.slice(s,c+1).join(`
|
|
285
|
+
`);if(l.length>1e3){let e=a.index||0,t=Math.max(0,e-50),n=Math.min(r.length,e+50);l=(t>0?`...`:``)+r.substring(t,n)+(n<r.length?`...`:``)}let u={scriptId:e,url:n,line:t+1,column:a.index||0,context:l};this.keywordIndex.has(o)||this.keywordIndex.set(o,[]),this.keywordIndex.get(o).push(u)}}if(t.debug(` Indexed ${this.keywordIndex.size} keywords for ${n}`),this.keywordIndex.size>this.MAX_KEYWORD_INDEX_ENTRIES){let e=this.keywordIndex.size-this.MAX_KEYWORD_INDEX_ENTRIES,n=0;for(let[t]of this.keywordIndex){if(n>=e)break;this.keywordIndex.delete(t),n++}t.debug(` Keyword index pruned ${n} entries (cap: ${this.MAX_KEYWORD_INDEX_ENTRIES})`)}}chunkScript(e,n){let r=[],i=0,a=0;for(;i<n.length;){let t=n.substring(i,i+this.CHUNK_SIZE);r.push({scriptId:e,chunkIndex:a,content:t,size:t.length}),i+=this.CHUNK_SIZE,a++}this.scriptChunks.set(e,r),t.debug(` Chunked script ${e} into ${r.length} chunks`)}getScriptChunk(e,t){let n=this.scriptChunks.get(e);if(!n||t>=n.length)return null;let r=n[t];return r?r.content:null}async searchInScriptsEnhanced(e,n={}){let{isRegex:r=!1,caseSensitive:i=!1,maxMatches:a=100}=n,o=i?e:e.toLowerCase(),s=[];if(r)return{...await this.searchInScripts(e,n),searchMethod:`regex`};for(let[e,t]of this.keywordIndex.entries()){if(e.includes(o)){for(let n of t)if(s.push({scriptId:n.scriptId,url:n.url,line:n.line,column:n.column,matchText:e,context:n.context}),s.length>=a)break}if(s.length>=a)break}return t.info(` Enhanced search (indexed) found ${s.length} matches for "${e}"`),{keyword:e,totalMatches:s.length,matches:s,searchMethod:`indexed`}}},Kt=e({ensureBrowserCore:()=>$});let qt=null;async function Jt(){return qt||=(await import(`./ConsoleMonitor-BZRqrBH-.mjs`)).ConsoleMonitor,qt}async function $(e){e.collector||(e.collector=new bt(e.config.puppeteer),e.registerCaches()),e.pageController||=new xt(e.collector),e.domInspector||=new Bt(e.collector),e.scriptManager||=new Gt(e.collector),e.consoleMonitor||=new(await(Jt()))(e.collector)}export{j as _,xt as a,Ot as c,Y as d,bt as f,de as g,L as h,Bt as i,Dt as l,I as m,Kt as n,Et as o,U as p,Gt as r,Tt as s,$ as t,X as u,w as v};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-88NL7fhV.mjs";import{C as t,S as n,_ as r,d as i,g as a,h as o,i as s,l as c,m as l,n as u,p as d,s as f,t as p,w as ee,y as te}from"./Win32API-G7QPyckq.mjs";import{_ as m,a as h,b as g,c as _,d as v,f as y,g as b,h as x,i as ne,l as re,m as ie,n as S,o as C,p as w,r as T,s as E,u as D,v as O,y as k}from"./DarwinAPI-DzojdfjF.mjs";import{n as A}from"./mapsParser-DrJoeC0c.mjs";import j from"node:fs";import M from"koffi";const N=new WeakMap;function P(e){let t=N.get(e);if(t===void 0)throw Error(`Invalid ProcessHandle — not a Win32 handle`);return t}function F(e){let t=0;return e&i.READONLY&&(t|=1),e&i.READWRITE&&(t|=3),e&i.WRITECOPY&&(t|=17),e&i.EXECUTE&&(t|=4),e&i.EXECUTE_READ&&(t|=5),e&i.EXECUTE_READWRITE&&(t|=7),e&i.EXECUTE_WRITECOPY&&(t|=21),e&i.GUARD&&(t|=8),t}function I(e){let t=(e&1)!=0,n=(e&2)!=0,r=(e&4)!=0,a=i.NOACCESS;return t&&n&&r?a=i.EXECUTE_READWRITE:t&&r?a=i.EXECUTE_READ:t&&n?a=i.READWRITE:r?a=i.EXECUTE:t&&(a=i.READONLY),e&8&&(a|=i.GUARD),a}function ae(e){return e===c.COMMIT?`committed`:e===c.RESERVE?`reserved`:`free`}function oe(e){return e===16777216?`image`:e===262144?`mapped`:e===131072?`private`:`unknown`}var se=class{platform=`win32`;async checkAvailability(){return t()?n()?{available:!0,platform:`win32`}:{available:!1,reason:`koffi FFI library not available`,platform:`win32`}:{available:!1,reason:`Not running on Windows`,platform:`win32`}}openProcess(e,t){let n=ee(e,t),r={pid:e,writeAccess:t};return N.set(r,n),r}closeProcess(e){p(P(e))}readMemory(e,t,n){let r=d(P(e),t,n);return{data:r,bytesRead:r.length}}writeMemory(e,t,n){return{bytesWritten:te(P(e),t,n)}}queryRegion(e,t){let{success:n,info:i}=r(P(e),t);if(!n||i.RegionSize===0n)return null;let a=F(i.Protect);return{baseAddress:i.BaseAddress,size:Number(i.RegionSize),protection:a,state:ae(i.State),type:oe(i.Type),isReadable:(a&1)!=0,isWritable:(a&2)!=0,isExecutable:(a&4)!=0}}changeProtection(e,t,n,r){let{success:i,oldProtect:o}=a(P(e),t,n,I(r));if(!i)throw Error(`VirtualProtectEx failed`);return{oldProtection:F(o)}}allocateMemory(e,t,n){let r=P(e),i=I(n),a=l(r,0n,t,c.COMMIT|c.RESERVE,i);if(!a)throw Error(`VirtualAllocEx failed`);return{address:a}}freeMemory(e,t,n){o(P(e),t,0,c.RELEASE)}enumerateModules(e){let t=P(e),{success:n,modules:r,count:i}=u(t);if(!n)throw Error(`EnumProcessModules failed`);let a=[];for(let e=0;e<i;e++){let n=r[e];if(!n)continue;let i=s(t,n),{success:o,info:c}=f(t,n);o&&c&&a.push({name:i,baseAddress:BigInt(c.lpBaseOfDll),size:c.SizeOfImage})}return a}};const L=new WeakMap;function R(e){let t=L.get(e);if(t===void 0)throw Error(`Invalid ProcessHandle — not a Darwin handle`);return t}function z(e){let t=0;return e&h.READ&&(t|=1),e&h.WRITE&&(t|=2),e&h.EXECUTE&&(t|=4),t}function B(e){let t=h.NONE;return e&1&&(t|=h.READ),e&2&&(t|=h.WRITE),e&4&&(t|=h.EXECUTE),t}function V(e){switch(e){case T.PRIVATE:case T.PRIVATE_ALIASED:case T.COW:return`private`;case T.SHARED:case T.TRUESHARED:case T.SHARED_ALIASED:return`mapped`;case T.EMPTY:return`unknown`;default:return`unknown`}}var H=class{platform=`darwin`;async checkAvailability(){if(!re())return{available:!1,reason:`Not running on macOS`,platform:`darwin`};if(!D())return{available:!1,reason:`koffi FFI library cannot load libSystem.B.dylib`,platform:`darwin`};try{let{kr:e}=g(w(),process.pid);if(e!==S.SUCCESS)return{available:!1,reason:`task_for_pid failed (${v(e)}). Run with sudo or add debugger entitlement.`,platform:`darwin`}}catch(e){let t=e instanceof Error?e.message:String(e);return{available:!1,reason:/signal|bus error|segfault|abort/i.test(t)?`Mach API call crashed (${t}). This may be caused by SIP (System Integrity Protection) on ARM64 macOS. Disable SIP or use a code-signed binary with com.apple.security.cs.debugger entitlement.`:`task_for_pid permission check failed: ${t}. Run with sudo or add debugger entitlement.`,platform:`darwin`}}return{available:!0,platform:`darwin`}}openProcess(e,t){let{kr:n,task:r}=g(w(),e);if(n!==S.SUCCESS)throw Error(`Failed to open process ${e}: ${v(n)} (${n}). `+(n===S.FAILURE?`Run with sudo or sign with com.apple.security.cs.debugger entitlement.`:n===S.INVALID_ARGUMENT?`Invalid PID — process may not exist.`:`Check macOS permissions.`));let i={pid:e,writeAccess:t};return L.set(i,{task:r}),i}closeProcess(e){let t=R(e);y(w(),t.task)}readMemory(e,t,n){let{kr:r,data:i,outsize:a}=m(R(e).task,t,n);if(r!==S.SUCCESS)throw Error(`mach_vm_read_overwrite failed at 0x${t.toString(16)}: ${v(r)} (${r})`);return{data:i,bytesRead:Number(a)}}writeMemory(e,t,n){let r=k(R(e).task,t,n);if(r!==S.SUCCESS)throw Error(`mach_vm_write failed at 0x${t.toString(16)}: ${v(r)} (${r})`);return{bytesWritten:n.length}}queryRegion(e,t){let{kr:n,address:r,size:i,info:a}=O(R(e).task,t);if(n!==S.SUCCESS)return null;let o=z(a.protection);return{baseAddress:r,size:Number(i),protection:o,state:`committed`,type:V(a.behavior),isReadable:(o&1)!=0,isWritable:(o&2)!=0,isExecutable:(o&4)!=0}}changeProtection(e,t,n,r){let i=R(e),a=B(r),{kr:o,info:s}=O(i.task,t),c=o===S.SUCCESS?z(s.protection):0;if((a&h.WRITE)!==0&&(a&h.EXECUTE)!==0){let e=b(i.task,t,BigInt(n),!0,h.ALL);if(e!==S.SUCCESS)throw Error(`mach_vm_protect (set_maximum) failed at 0x${t.toString(16)}: ${v(e)} (${e})`)}let l=b(i.task,t,BigInt(n),!1,a);if(l!==S.SUCCESS)throw Error(`mach_vm_protect failed at 0x${t.toString(16)}: ${v(l)} (${l})`);return{oldProtection:c}}allocateMemory(e,t,n){let r=R(e),{kr:i,address:a}=ie(r.task,BigInt(t),ne.ANYWHERE);if(i!==S.SUCCESS)throw Error(`mach_vm_allocate failed: ${v(i)} (${i})`);let o=B(n);if(o!==(h.READ|h.WRITE)){let e=b(r.task,a,BigInt(t),!1,o);if(e!==S.SUCCESS)throw x(r.task,a,BigInt(t)),Error(`mach_vm_protect after allocate failed: ${v(e)} (${e})`)}return{address:a}}freeMemory(e,t,n){let r=x(R(e).task,t,BigInt(n));if(r!==S.SUCCESS)throw Error(`mach_vm_deallocate failed at 0x${t.toString(16)}: ${v(r)} (${r})`)}enumerateModules(e){let t=R(e);return e.pid===process.pid?this.enumerateModulesSelf():this.enumerateModulesRemote(t.task)}enumerateModulesSelf(){let e=_(),t=[];for(let n=0;n<e;n++){let e=E(n),r=C(n);if(!e||r===0n)continue;let i=e.split(`/`).pop()??e;t.push({name:i,baseAddress:r,size:0})}return t}enumerateModulesRemote(e){let t=[],n=0n;for(let r=0;r<1e4;r++){let{kr:r,address:i,size:a,info:o}=O(e,n);if(r!==S.SUCCESS)break;let s=(o.protection&h.READ)!==0,c=(o.protection&h.EXECUTE)!==0;if(s&&c&&a>0n)try{let{kr:n,data:r}=m(e,i,4);if(n===S.SUCCESS&&r.length>=4){let e=r.readUInt32LE(0);(e===4277009103||e===4277009102)&&t.push({name:`module_0x${i.toString(16)}`,baseAddress:i,size:Number(a)})}}catch{}n=i+a}return t}};let U=null;const W=new Map;function G(){return U||=M.load(`libc.so.6`),U}let K=null;function ce(){return K||=G().func(`long ptrace(long, int, void *, void *)`),K}let q=null;function le(){return q||=G().func(`int waitpid(int, _Out_ int *, int)`),q}function J(e,t,n,r){return ce()(BigInt(e),t,n,r)}function Y(e){let t=Buffer.alloc(4);le()(e,M.address(t),0)}function ue(e){let t=W.get(e);if(t)return t;let n=j.readFileSync(`/proc/${e}/maps`,`utf8`);for(let t of n.split(`
|
|
2
|
+
`)){if(!t.includes(`[vdso]`))continue;let[n]=t.split(/\s+/);if(!n)continue;let[r,i]=n.split(`-`).map(e=>BigInt(`0x`+e));if(!r||!i)continue;let a=Number(i-r);if(a<=0||a>1048576)continue;let o=j.openSync(`/proc/${e}/mem`,`r`),s=Buffer.alloc(a);try{j.readSync(o,s,0,a,Number(r))}finally{j.closeSync(o)}for(let t=0;t<a-1;t++)if(s[t]===15&&s[t+1]===5){let n=r+BigInt(t);return W.set(e,n),n}}throw Error(`LinuxPtrace: no syscall gadget in PID ${e} vDSO`)}function X(e,t,n=0n,r=0n,i=0n,a=0n,o=0n,s=0n){J(16,e,null,null),Y(e);let c=Buffer.alloc(216);J(12,e,null,M.address(c));let l=Buffer.from(c);l.writeBigUInt64LE(n,112),l.writeBigUInt64LE(r,104),l.writeBigUInt64LE(i,96),l.writeBigUInt64LE(a,56),l.writeBigUInt64LE(o,72),l.writeBigUInt64LE(s,64),l.writeBigUInt64LE(BigInt(t),120);let u=ue(e);l.writeBigUInt64LE(u,128),J(13,e,null,M.address(l)),J(24,e,null,null),Y(e),J(12,e,null,M.address(l));let d=l.readBigUInt64LE(80);return J(13,e,null,M.address(c)),J(17,e,null,null),{rax:d,error:d>=18446744073709547520n}}function Z(e,t,n){let r=X(e,9,0n,BigInt(t),BigInt(n),BigInt(34),18446744073709551615n,0n);if(r.error)throw Error(`remote mmap failed: errno ${-Number(r.rax)}`);return r.rax}function de(e,t,n,r){let i=X(e,10,t,BigInt(n),BigInt(r));if(i.error)throw Error(`remote mprotect failed: errno ${-Number(i.rax)}`)}function fe(e,t,n){let r=X(e,11,t,BigInt(n));if(r.error)throw Error(`remote munmap failed: errno ${-Number(r.rax)}`)}function pe(){return process.platform===`linux`}function me(e){let t=0;return e.includes(`r`)&&(t|=1),e.includes(`w`)&&(t|=2),e.includes(`x`)&&(t|=4),t}function he(e){let t=me(e.perms);return{baseAddress:e.start,size:Number(e.end-e.start),protection:t,state:`committed`,type:e.path?`mapped`:`private`,isReadable:(t&1)!=0,isWritable:(t&2)!=0,isExecutable:(t&4)!=0}}function ge(e){return Buffer.isBuffer(e)?e:e.startsWith(`0x`)&&e.length%2==0?Buffer.from(e.slice(2),`hex`):Buffer.from(e,`utf8`)}var _e=class{pid;platform=`linux`;constructor(e=process.pid){this.pid=e}isAvailable(){return pe()}async read(e,t){let n=this.openProcess(this.pid,!1);return this.readMemory(n,e,t).data}async write(e,t){let n=this.openProcess(this.pid,!0);return this.writeMemory(n,e,t).bytesWritten===t.length}async scan(e){let t=ge(e),n=this.openProcess(this.pid,!1),r=await this.queryRegions(),i=[];for(let e of r){if(!e.perms.includes(`r`))continue;let r=Number(e.end-e.start);if(!(r<=0))try{let a=this.readMemory(n,e.start,r).data,o=a.indexOf(t);for(;o>=0;)i.push(e.start+BigInt(o)),o=a.indexOf(t,o+1)}catch{continue}}return i}async queryRegions(){let e=`/proc/${this.pid}/maps`;return A(await j.promises.readFile(e,`utf8`)).map(e=>({start:e.start,end:e.end,perms:`${e.permissions.read?`r`:`-`}${e.permissions.write?`w`:`-`}${e.permissions.exec?`x`:`-`}${e.permissions.private?`p`:`s`}`,path:e.pathname||void 0}))}async checkAvailability(){return this.isAvailable()?{available:!0,platform:`linux`}:{available:!1,platform:`linux`,reason:`Not running on Linux`}}openProcess(e,t){return{pid:e,writeAccess:t}}closeProcess(e){}readMemory(e,t,n){let r=`/proc/${e.pid}/mem`,i=j.openSync(r,e.writeAccess?`r+`:`r`),a=Buffer.alloc(n);try{let e=j.readSync(i,a,0,n,Number(t));return{data:a.subarray(0,e),bytesRead:e}}finally{j.closeSync(i)}}writeMemory(e,t,n){let r=`/proc/${e.pid}/mem`,i=j.openSync(r,`r+`);try{return{bytesWritten:j.writeSync(i,n,0,n.length,Number(t))}}finally{j.closeSync(i)}}queryRegion(e,t){let n=`/proc/${e.pid}/maps`,r=A(j.readFileSync(n,`utf8`));for(let e of r)if(t>=e.start&&t<e.end)return he({start:e.start,end:e.end,perms:`${e.permissions.read?`r`:`-`}${e.permissions.write?`w`:`-`}${e.permissions.exec?`x`:`-`}${e.permissions.private?`p`:`s`}`,path:e.pathname||void 0});return null}changeProtection(e,t,n,r){let i=this.queryRegion(e,t)?.protection??0,a=0;return r&1&&(a|=1),r&2&&(a|=2),r&4&&(a|=4),de(e.pid,t,n,a),{oldProtection:i}}allocateMemory(e,t,n){let r=0;return n&1&&(r|=1),n&2&&(r|=2),n&4&&(r|=4),{address:Z(e.pid,t,r)}}freeMemory(e,t,n){fe(e.pid,t,n)}enumerateModules(e){let t=`/proc/${e.pid}/maps`,n=A(j.readFileSync(t,`utf8`)),r=new Map;for(let e of n){if(!e.pathname||e.pathname.startsWith(`[`))continue;let t=r.get(e.pathname);if(t){let n=Number(e.end-t.baseAddress);r.set(e.pathname,{...t,size:n>t.size?n:t.size});continue}r.set(e.pathname,{name:e.pathname.split(`/`).pop()??e.pathname,baseAddress:e.start,size:Number(e.end-e.start)})}return[...r.values()]}},ve=class extends _e{},ye=e({createPlatformProvider:()=>$});let Q=null;function $(){if(Q)return Q;switch(process.platform){case`win32`:Q=new se;break;case`darwin`:Q=new H;break;case`linux`:Q=new ve;break;default:throw Error(`Unsupported platform: ${process.platform}. Memory operations require Windows, macOS, or Linux.`)}if(!Q)throw Error(`Failed to create memory provider`);return Q}export{ye as n,$ as t};
|