@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,29 @@
|
|
|
1
|
+
import{t as e}from"./logger-BGCcd-jJ.mjs";import{Bt as t,Ft as n,It as r,Lt as i,Nt as a,Pt as o,Rt as s,an as c,ln as l,ma as u,on as d,pn as f,zt as p}from"./constants-nvsLpSri.mjs";import{r as m,t as h}from"./config-5ODJ3Aj0.mjs";import{c as g,l as _,s as v}from"./outputPaths-CHtELDyi.mjs";import{i as y,t as b}from"./DetailedDataManager-Dgh402Gp.mjs";import{t as x}from"./ToolError-g3rjWzhx.mjs";import{t as S}from"./response-R8ghbZSb.mjs";import{a as C,n as w,o as T}from"./modules-CC_ADmwi.mjs";import{r as ee}from"./BrowserSessionCoordinator-Cdic8FsH.mjs";import{g as te,v as ne}from"./ensure-browser-core-BP70x0TB.mjs";import{t as re}from"./concurrency-Dehnw4JC.mjs";import{n as ie,t as ae}from"./betterSqlite3-Bdo_ifuJ.mjs";import{c as E,i as D,l as O,n as k,r as A,s as j,u as M}from"./parse-args-B6dwWc9k.mjs";import{r as N,t as P}from"./ResponseBuilder-BLicSCjn.mjs";import{n as oe,r as F}from"./capabilities-DwzyxL2w.mjs";import"./definitions-B11MudW_.mjs";import{join as se}from"path";import{readFileSync as ce}from"node:fs";import{isAbsolute as le,relative as ue,sep as de}from"node:path";import{randomUUID as fe}from"node:crypto";import{readFile as pe,writeFile as me}from"fs/promises";const I=se(m,`.env`),he=new Set([`stable`,`beta`,`dev`,`canary`]),ge=new Set([`chrome`,`camoufox`]),_e=new Set([`launch`,`connect`]);var ve=class{deps;constructor(e){this.deps=e}pickPreferredAttachPage(e,t){if(e.length===0)return{selectedIndex:0,selected:null};if(t!==null&&t>=0&&t<e.length)return{selectedIndex:t,selected:e[t]??null};let n=e.findIndex(e=>e.url.trim().length>0&&e.url!==`about:blank`);return n>=0?{selectedIndex:n,selected:e[n]??null}:{selectedIndex:0,selected:e[0]??null}}markMonitoringContextChanged(t){try{this.deps.consoleMonitor.markContextChanged()}catch(n){e.warn(`[${t}] Failed to mark monitoring context as stale: ${n instanceof Error?n.message:String(n)}`)}}async syncTabRegistryWithCollectorPages(t){try{let e=await this.deps.collector.listPages();this.deps.getTabRegistry().reconcilePages(e.map(()=>null),e)}catch(n){e.warn(`[${t}] Failed to sync attached tabs into TabRegistry: ${n instanceof Error?n.message:String(n)}`)}}parseHeadlessArg(e){if(typeof e==`boolean`)return e;if(typeof e==`number`)return e===1?!0:e===0?!1:void 0;if(typeof e==`string`){let t=e.trim().toLowerCase();if([`true`,`1`,`yes`,`on`].includes(t))return!0;if([`false`,`0`,`no`,`off`].includes(t))return!1}}parseChromeConnectRequest(e){let t=E(e,`channel`);if(t&&!he.has(t))throw Error(`Invalid channel "${t}". Expected one of: stable, beta, dev, canary.`);return{browserURL:E(e,`browserURL`),wsEndpoint:E(e,`wsEndpoint`),autoConnect:k(e,`autoConnect`),userDataDir:E(e,`userDataDir`),channel:t}}parseChromeLaunchRequest(e){let t=O(e,`args`),n=E(e,`sslKeyLogFile`),r=n?[...t??[],`--ssl-key-log=${n}`]:t;return{headless:this.parseHeadlessArg(e.headless),args:r,enableV8NativesSyntax:k(e,`enableV8NativesSyntax`)}}parseBrowserLaunchEnum(e,t,n,r){let i=e[t];if(i===void 0)return r;if(typeof i!=`string`||!n.has(i)){let e=typeof i==`string`?`"${i}"`:String(i);throw Error(`Invalid ${t} ${e}. Expected one of: ${[...n].join(`, `)}.`)}return i}parseBrowserDriver(e){return this.parseBrowserLaunchEnum(e,`driver`,ge,`chrome`)}parseBrowserLaunchMode(e){return this.parseBrowserLaunchEnum(e,`mode`,_e,`launch`)}hasChromeConnectRequest(e){return!!(e.browserURL||e.wsEndpoint||e.autoConnect||e.userDataDir||e.channel)}describeChromeConnectRequest(e){return e.wsEndpoint?e.wsEndpoint:e.browserURL?e.browserURL:e.userDataDir?`autoConnect:${e.userDataDir}`:`autoConnect:${e.channel??`stable`}`}isAutoConnectRequest(e){return!!(e.autoConnect||e.userDataDir||e.channel)}getAutoConnectApprovalHint(e){return this.isAutoConnectRequest(e)?`Chrome 144+ autoConnect may prompt for manual approval. Switch to Chrome and click Allow for this client if prompted.`:null}shouldAttemptLinuxHeadfulFallback(e,t){let n=e===!1||e===void 0&&process.env.PUPPETEER_HEADLESS===`false`,r=process.platform===`linux`||process.env.JSHOOK_FORCE_LINUX_FALLBACK===`true`;if(!n||!r)return!1;let i=t instanceof Error?t.message:String(t);return/Missing X server|cannot open display|Failed to launch the browser process|ozone|No protocol specified|X11|Wayland|DevToolsActivePort/i.test(i)}async persistHeadlessEnv(t){try{let e=``;try{e=await pe(I,`utf-8`)}catch(e){if(e?.code!==`ENOENT`)throw e}let n=`PUPPETEER_HEADLESS=${t}`;await me(I,/^PUPPETEER_HEADLESS=.*$/m.test(e)?e.replace(/^PUPPETEER_HEADLESS=.*$/m,n):`${e.trimEnd()}\n${n}\n`,`utf-8`)}catch(n){e.warn(`Failed to persist PUPPETEER_HEADLESS=${t} to .env: ${String(n)}`)}}async handleBrowserLaunch(t){try{let n=this.parseBrowserDriver(t),r=this.parseBrowserLaunchMode(t);if(n===`camoufox`){if(r===`connect`){let e=E(t,`wsEndpoint`);return e?P.ok().merge({driver:`camoufox`,mode:`connect`,wsEndpoint:e,message:`Connected to Camoufox server. Use page_navigate to begin.`}).json():P.fail(`wsEndpoint is required for connect mode. Use camoufox_server({ action: "launch" }) first to get a wsEndpoint.`).json()}return P.ok().merge({driver:`camoufox`,mode:`launch`,message:`Camoufox (Firefox) browser launched`,note:`Use page_navigate to begin. CDP debugger is limited in Firefox; network_enable and console_monitor({ action: "enable" }) use Playwright events and are fully supported.`}).json()}if(r===`connect`){let e=this.parseChromeConnectRequest(t);if(!this.hasChromeConnectRequest(e))return P.fail(`browserURL, wsEndpoint, autoConnect, userDataDir, or channel is required for chrome connect mode.`).json();await this.deps.collector.connect(e);let n=await this.deps.collector.getStatus();return P.ok().merge({driver:`chrome`,mode:`connect`,endpoint:this.describeChromeConnectRequest(e),autoConnect:this.isAutoConnectRequest(e),channel:e.channel??null,userDataDir:e.userDataDir??null,manualApprovalMayBeRequired:this.isAutoConnectRequest(e),approvalHint:this.getAutoConnectApprovalHint(e),message:`Connected to existing Chrome browser successfully`,status:n}).json()}let i=this.parseChromeLaunchRequest(t);try{let e=await this.deps.collector.launch(i);e.action===`relaunched`&&this.markMonitoringContextChanged(`browser_launch_relaunch`);let t=await this.deps.collector.listPages(),n=this.deps.getTabRegistry();t.length>0&&(await this.deps.collector.selectPage(0),n.setCurrentByIndex(0));let r=t[0];this.deps.onBrowserAttachStateChanged?.({endpoint:null,selectedIndex:t.length>0?0:null,selectedUrl:r?.url??null,selectedTitle:r?.title??null,selectedTargetId:null,browserPid:this.deps.collector.getChromePid(),rendererPid:null,attachedAt:new Date().toISOString()});let a=await this.deps.collector.getStatus();return P.ok().merge({driver:`chrome`,message:e.action===`relaunched`?`Browser relaunched successfully`:`Browser launched successfully`,launchAction:e.action,relaunchReason:e.reason??null,v8NativeSyntaxEnabled:e.launchOptions.v8NativeSyntaxEnabled,launchArgs:e.launchOptions.args,selectedIndex:t.length>0?0:null,currentUrl:r?.url??null,currentTitle:r?.title??null,totalPages:t.length,status:a}).json()}catch(t){if(!this.shouldAttemptLinuxHeadfulFallback(i.headless,t))throw t;let n=t instanceof Error?t.message:String(t);e.warn(`Headful launch failed on Linux, fallback to headless=true: ${n}`),process.env.PUPPETEER_HEADLESS=`true`,await this.persistHeadlessEnv(`true`);let r=await this.deps.collector.launch({...i,headless:!0}),a=await this.deps.collector.listPages(),o=this.deps.getTabRegistry();a.length>0&&(await this.deps.collector.selectPage(0),o.setCurrentByIndex(0));let s=a[0];this.deps.onBrowserAttachStateChanged?.({endpoint:null,selectedIndex:a.length>0?0:null,selectedUrl:s?.url??null,selectedTitle:s?.title??null,selectedTargetId:null,browserPid:this.deps.collector.getChromePid(),rendererPid:null,attachedAt:new Date().toISOString()});let c=await this.deps.collector.getStatus();return P.ok().merge({driver:`chrome`,message:`Browser launched with Linux fallback (headless=true)`,launchAction:r.action,relaunchReason:r.reason??null,v8NativeSyntaxEnabled:r.launchOptions.v8NativeSyntaxEnabled,launchArgs:r.launchOptions.args,selectedIndex:a.length>0?0:null,currentUrl:s?.url??null,currentTitle:s?.title??null,totalPages:a.length,status:c,fallback:{applied:!0,reason:`Headful browser is unavailable in current Linux runtime; switched to headless and updated .env`,newEnv:`PUPPETEER_HEADLESS=true`}}).json()}}catch(e){return P.fail(e).json()}}async handleBrowserClose(e){try{return await this.deps.collector.close(),P.ok().set(`message`,`Browser closed successfully`).json()}catch(e){return P.fail(e).json()}}async handleBrowserStatus(e){try{let e=await this.deps.collector.getStatus();return P.ok().merge({driver:`chrome`,...e}).json()}catch(e){return P.fail(e).json()}}async handleBrowserListTabs(e){let t=this.parseChromeConnectRequest(e);try{this.hasChromeConnectRequest(t)&&await this.deps.collector.connect(t);let e=await this.deps.collector.listPages(),n=this.deps.getTabRegistry();await this.syncTabRegistryWithCollectorPages(`browser_list_tabs`);let r=e.map(e=>{let t=n.getTabByIndex(e.index);return{...e,pageId:t?.pageId??null,aliases:t?.aliases??[]}}),i=n.getContextMeta();return P.ok().merge({count:e.length,pages:r,currentPageId:i.pageId,currentIndex:i.tabIndex,autoConnect:this.isAutoConnectRequest(t),manualApprovalMayBeRequired:this.isAutoConnectRequest(t),approvalHint:this.getAutoConnectApprovalHint(t),hint:`Use browser_select_tab(index=N) to switch to a specific tab`}).json()}catch(e){return P.fail(e).set(`hint`,`Make sure browser is attached via browser_attach first, or provide browserURL/autoConnect. Chrome 144+ autoConnect may require manual approval in the Chrome window.`).set(`approvalHint`,this.getAutoConnectApprovalHint(t)).json()}}async handleBrowserSelectTab(e){try{let t=D(e,`index`),n=E(e,`urlPattern`),r=E(e,`titlePattern`),i=this.deps.getTabRegistry();if(t!==void 0){let e=await this.deps.clearAttachedTargetContext(`browser_select_tab`);await this.deps.collector.selectPage(t);let n=await this.deps.collector.listPages();await this.syncTabRegistryWithCollectorPages(`browser_select_tab`);let r=n[t],a=i.setCurrentByIndex(t);return(a?.pageId||e.detached)&&this.markMonitoringContextChanged(`browser_select_tab`),P.ok().merge({selectedIndex:t,selectedPageId:a?.pageId??null,url:r?.url,title:r?.title,contextSwitched:!0,detachedCdpTarget:e.detached,detachedCdpTargetId:e.targetId,monitoringBindingDeferred:!!a?.pageId,networkMonitoringEnabled:!1,consoleMonitoringEnabled:!1}).json()}let a=await this.deps.collector.listPages(),o=-1;for(let e of a){if(n&&e.url.includes(n)){o=e.index;break}if(r&&e.title.includes(r)){o=e.index;break}}if(o===-1)return P.fail(`No matching tab found`).set(`availablePages`,a).json();let s=await this.deps.clearAttachedTargetContext(`browser_select_tab`);await this.deps.collector.selectPage(o),await this.syncTabRegistryWithCollectorPages(`browser_select_tab`);let c=a[o],l=i.setCurrentByIndex(o);return(l?.pageId||s.detached)&&this.markMonitoringContextChanged(`browser_select_tab`),P.ok().merge({selectedIndex:o,selectedPageId:l?.pageId??null,url:c?.url,title:c?.title,contextSwitched:!0,detachedCdpTarget:s.detached,detachedCdpTargetId:s.targetId,monitoringBindingDeferred:!!l?.pageId,networkMonitoringEnabled:!1,consoleMonitoringEnabled:!1}).json()}catch(e){return P.fail(e).json()}}async handleBrowserAttach(t){let n=null;try{if(n=this.parseChromeConnectRequest(t),!this.hasChromeConnectRequest(n))return P.fail(`browserURL, wsEndpoint, autoConnect, userDataDir, or channel is required`).json();let r=await this.deps.clearAttachedTargetContext(`browser_attach`);await this.deps.collector.connect(n);let i=t.pageIndex,a=i!=null&&!(typeof i==`string`&&i.trim()===``),o=typeof i==`number`?i:typeof i==`string`&&i.trim()!==``?Number(i):0,s=Number.isFinite(o)?o:0,c=await this.deps.collector.listPages(),l=this.pickPreferredAttachPage(c,a?s:null).selectedIndex;c.length>0&&(await this.deps.collector.selectPage(l),s!==l&&e.warn(`[browser_attach] requested pageIndex ${s} resolved to ${l}; preferred non-blank target when available`));let u=this.deps.getTabRegistry();await this.syncTabRegistryWithCollectorPages(`browser_attach`);let d=c.length>0?Math.min(l,c.length-1):0,f=c.length>0?u.setCurrentByIndex(d):null,p=c[d],m=!!f?.pageId,h=this.deps.collector.getChromePid(),g={pageControllerReady:m,v8InspectorReady:m,memoryRendererPidReady:h!==null};m&&this.markMonitoringContextChanged(`browser_attach`);let _=await this.deps.collector.getStatus(),v=this.deps.collector.getAttachedTargetInfo();return this.deps.onBrowserAttachStateChanged?.({endpoint:this.describeChromeConnectRequest(n),selectedIndex:d,selectedUrl:p?.url??null,selectedTitle:p?.title??null,selectedTargetId:v?.targetId??null,browserPid:h,attachedAt:new Date().toISOString()}),P.ok().merge({message:`Attached to existing browser successfully`,endpoint:this.describeChromeConnectRequest(n),autoConnect:this.isAutoConnectRequest(n),channel:n.channel??null,userDataDir:n.userDataDir??null,manualApprovalMayBeRequired:this.isAutoConnectRequest(n),approvalHint:this.getAutoConnectApprovalHint(n),selectedIndex:d,selectedPageId:f?.pageId??null,currentUrl:p?.url??null,currentTitle:p?.title??null,totalPages:c.length,contextSwitched:c.length>0,detachedCdpTarget:r.detached,detachedCdpTargetId:r.targetId,monitoringBindingDeferred:m,networkMonitoringEnabled:!1,consoleMonitoringEnabled:!1,takeoverReady:m,capabilities:g,note:m?`Monitoring will auto-rebind on the next console/network operation for the selected tab.`:`Connected to existing Chrome, but the selected tab does not currently expose a stable Puppeteer Page handle. Tab discovery still works; try selecting a different tab or navigate the tab and retry. V8/page-bound tools will degrade until a stable Page handle is available.`,status:_}).json()}catch(e){return this.deps.onBrowserAttachStateChanged?.({endpoint:n?this.describeChromeConnectRequest(n):null}),P.fail(e).set(`approvalHint`,this.getAutoConnectApprovalHint(n??{})).json()}}};function ye(e){let t=O(e,`addons`),n=O(e,`excludeAddons`),r=O(e,`fonts`);return{headless:k(e,`headless`,!0),os:E(e,`os`,`windows`),geoip:k(e,`geoip`,!1),humanize:k(e,`humanize`,!1),proxy:E(e,`proxy`)||void 0,blockImages:k(e,`blockImages`,!1),blockWebrtc:k(e,`blockWebrtc`,!1),blockWebgl:k(e,`blockWebgl`,!1),locale:E(e,`locale`)||void 0,addons:t.length>0?t:void 0,fonts:r.length>0?r:void 0,excludeAddons:n.length>0?n:void 0,customFontsOnly:k(e,`customFontsOnly`,!1),screen:e.screen,window:e.window,fingerprint:j(e,`fingerprint`),webglConfig:j(e,`webglConfig`),firefoxUserPrefs:j(e,`firefoxUserPrefs`),mainWorldEval:k(e,`mainWorldEval`,!0),enableCache:k(e,`enableCache`,!1)}}async function be(){try{return await import(`camoufox-js`),null}catch(e){let t=e instanceof Error?e.message:String(e);return ie(e)?`Camoufox requires the same native SQLite backend used by trace tooling. ${ae(e)}`:t.includes(`Cannot find package 'camoufox-js'`)?`camoufox-js package is not installed. Run: pnpm add camoufox-js && npx camoufox-js fetch`:`Camoufox dependencies check failed: ${t}`}}var xe=class{deps;constructor(e){this.deps=e}async handleCamoufoxServerLaunch(t){try{let n=await be();if(n)return e.warn(`Camoufox dependencies not available: ${n}`),P.fail(n).set(`hint`,`Camoufox is optional. Use browser_launch with Chrome driver instead, or install dependencies.`).json();let r=D(t,`port`),i=E(t,`ws_path`),a=ye(t),o=this.deps.getCamoufoxManager();o||(o=new T(a),this.deps.setCamoufoxManager(o));let s=await o.launchAsServer(r,i);return P.ok().merge({wsEndpoint:s,config:{os:a.os,headless:a.headless,geoip:a.geoip,locale:a.locale,blockWebgl:a.blockWebgl},message:`Camoufox server launched. Connect with: browser_launch(driver="camoufox", mode="connect", wsEndpoint=<wsEndpoint>)`}).json()}catch(e){return P.fail(e).set(`hint`,`Try running: npx camoufox-js fetch to download browser binaries`).json()}}async handleCamoufoxServerClose(e){try{let e=this.deps.getCamoufoxManager();return e?(await e.closeBrowserServer(),P.ok().set(`message`,`Camoufox server closed.`).json()):P.fail(`No camoufox server is running.`).json()}catch(e){return P.fail(e).json()}}async handleCamoufoxServerStatus(e){try{let e=this.deps.getCamoufoxManager()?.getBrowserServerEndpoint()??null;return P.ok().merge({running:e!==null,wsEndpoint:e}).json()}catch(e){return P.fail(e).json()}}};const Se=new Set(te);function L(e){return A(e,`waitUntil`,Se,`networkidle`)}var Ce=class{deps;constructor(e){this.deps=e}syncCurrentTabMeta(e,t){let n=this.deps.getTabRegistry?.();if(!n||!e||!t.url||t.title===void 0)return;let r=t.url,i=t.title,a=n.upsertPage(e,{url:r,title:i});n.setCurrentPageId(a)}syncRuntimeAttachMeta(e){this.deps.onBrowserAttachStateChanged&&(!e.url||e.title===void 0||this.deps.onBrowserAttachStateChanged({selectedUrl:e.url,selectedTitle:e.title,rendererPid:null}))}async getChromePageIfAvailable(){let e=this.deps.pageController.getPage;return typeof e==`function`?await Reflect.apply(e,this.deps.pageController,[]):null}async getCamoufoxTitleIfAvailable(e){let t=e.title;if(typeof t!=`function`)return;let n=await Reflect.apply(t,e,[]);return typeof n==`string`?n:void 0}getCamoufoxUrlIfAvailable(e){let t=e.url;if(typeof t!=`function`)return;let n=Reflect.apply(t,e,[]);return typeof n==`string`?n:void 0}async handlePageNavigate(e){return N(async()=>{let t=E(e,`url`,``),n=L(e),r=D(e,`timeout`),i=k(e,`enableNetworkMonitoring`);if(this.deps.getActiveDriver()===`camoufox`){let e=await this.deps.getCamoufoxPage();await e.goto(t,{waitUntil:n,timeout:r}),this.deps.consoleMonitor.setPlaywrightPage(e),i&&await this.deps.consoleMonitor.enable({enableNetwork:!0,enableExceptions:!0});let a=this.getCamoufoxUrlIfAvailable(e)??``,o=await this.getCamoufoxTitleIfAvailable(e);return this.syncCurrentTabMeta(e,{url:a,title:o}),this.syncRuntimeAttachMeta({url:a,title:o}),this.deps.eventBus?.emit(`browser:navigated`,{url:a,timestamp:new Date().toISOString()}),{driver:`camoufox`,url:a,title:o??``,network_monitoring:{enabled:this.deps.consoleMonitor.isNetworkEnabled()}}}i&&await this.deps.consoleMonitor.enable({enableNetwork:!0,enableExceptions:!0}),await this.deps.pageController.navigate(t,{waitUntil:n,timeout:r});let a=await this.getChromePageIfAvailable(),o=await this.deps.pageController.getURL(),s=await this.deps.pageController.getTitle();return this.syncCurrentTabMeta(a,{url:o,title:s}),this.syncRuntimeAttachMeta({url:o,title:s}),this.deps.eventBus?.emit(`browser:navigated`,{url:o,timestamp:new Date().toISOString()}),{url:o,title:s,network_monitoring:{enabled:this.deps.consoleMonitor.isNetworkEnabled()}}})}async handlePageReload(e){return N(async()=>{if(this.deps.getActiveDriver()===`camoufox`){let e=await this.deps.getCamoufoxPage();await e.reload();let t=this.getCamoufoxUrlIfAvailable(e),n=await this.getCamoufoxTitleIfAvailable(e);return this.syncCurrentTabMeta(e,{url:t,title:n}),this.syncRuntimeAttachMeta({url:t,title:n}),{message:`Page reloaded`,driver:`camoufox`}}await this.deps.pageController.reload();let e=await this.getChromePageIfAvailable(),t=await this.deps.pageController.getURL(),n=await this.deps.pageController.getTitle();return this.syncCurrentTabMeta(e,{url:t,title:n}),this.syncRuntimeAttachMeta({url:t,title:n}),{message:`Page reloaded`}})}async handlePageBack(e){return N(async()=>{let t=D(e,`timeout`,1e4);if(this.deps.getActiveDriver()===`camoufox`){let e=await this.deps.getCamoufoxPage();await e.goBack();let t=this.getCamoufoxUrlIfAvailable(e),n=await this.getCamoufoxTitleIfAvailable(e);return this.syncCurrentTabMeta(e,{url:t,title:n}),this.syncRuntimeAttachMeta({url:t,title:n}),{url:t,driver:`camoufox`}}await this.deps.pageController.goBack(t);let n=await this.getChromePageIfAvailable(),r=await this.deps.pageController.getURL(),i=await this.deps.pageController.getTitle();return this.syncCurrentTabMeta(n,{url:r,title:i}),this.syncRuntimeAttachMeta({url:r,title:i}),{url:r}})}async handlePageForward(e){return N(async()=>{let t=D(e,`timeout`,1e4);if(this.deps.getActiveDriver()===`camoufox`){let e=await this.deps.getCamoufoxPage();await e.goForward();let t=this.getCamoufoxUrlIfAvailable(e),n=await this.getCamoufoxTitleIfAvailable(e);return this.syncCurrentTabMeta(e,{url:t,title:n}),this.syncRuntimeAttachMeta({url:t,title:n}),{url:t,driver:`camoufox`}}await this.deps.pageController.goForward(t);let n=await this.getChromePageIfAvailable(),r=await this.deps.pageController.getURL(),i=await this.deps.pageController.getTitle();return this.syncCurrentTabMeta(n,{url:r,title:i}),this.syncRuntimeAttachMeta({url:r,title:i}),{url:r}})}},we=class{deps;constructor(e){this.deps=e}toErrorMessage(e){return e instanceof Error?e.message:typeof e==`string`?e:``}parseNumberArg(e,t={}){let n;if(typeof e==`number`&&Number.isFinite(e))n=e;else if(typeof e==`string`){let t=e.trim();if(t.length>0){let e=Number(t);Number.isFinite(e)&&(n=e)}}if(n===void 0&&(n=t.defaultValue),n!==void 0)return t.integer&&(n=Math.trunc(n)),typeof t.min==`number`&&(n=Math.max(t.min,n)),typeof t.max==`number`&&(n=Math.min(t.max,n)),n}parseMouseButton(e){if(typeof e==`string`){let t=e.trim().toLowerCase();if(t===`left`||t===`right`||t===`middle`)return t}return`left`}async getCamoufoxInteractionContext(e){let t=await this.deps.getCamoufoxPage();return!e?.frameUrl&&!e?.frameSelector?t:await this.deps.pageController.resolveFrame(t,e)}async handlePageClick(e){try{let t=E(e,`selector`,``),n=this.parseMouseButton(e.button),r=this.parseNumberArg(e.clickCount,{defaultValue:1,min:1,max:10,integer:!0}),i=this.parseNumberArg(e.delay,{min:0,max:6e4,integer:!0}),a=this.parseNumberArg(e.timeout,{defaultValue:1e4,min:1e3,max:12e4,integer:!0}),o=E(e,`frameUrl`),s=E(e,`frameSelector`),c=o||s?{frameUrl:o||void 0,frameSelector:s||void 0}:void 0;if(!t||typeof t!=`string`||t.trim().length===0)return P.fail(`selector parameter is required`).build();if(this.deps.getActiveDriver()===`camoufox`)return await(await this.getCamoufoxInteractionContext(c)).click(t,{button:n,clickCount:r,delay:i}),P.ok().build({driver:`camoufox`,message:`Clicked: ${t}`,...c?{frame:c}:{}});try{c?await this.deps.pageController.click(t,{button:n,clickCount:r,delay:i,timeout:a},c):await this.deps.pageController.click(t,{button:n,clickCount:r,delay:i,timeout:a})}catch(e){let n=this.toErrorMessage(e);if(n.includes(`detached`)||n.includes(`timed out`)||n.includes(`Execution context was destroyed`)||n.includes(`callFunctionOn`)||n.includes(`Target closed`))return P.ok().build({message:`Clicked ${t} - navigation triggered`,navigated:!0,...c?{frame:c}:{}});throw e}return P.ok().build({message:`Clicked: ${t}`,...c?{frame:c}:{}})}catch(e){return P.fail(e).build()}}async handlePageType(e){return N(async()=>{let t=E(e,`selector`,``),n=E(e,`text`,``),r=D(e,`delay`),i=E(e,`frameUrl`),a=E(e,`frameSelector`),o=i||a?{frameUrl:i||void 0,frameSelector:a||void 0}:void 0;return this.deps.getActiveDriver()===`camoufox`?(await(await this.getCamoufoxInteractionContext(o)).fill(t,n),{driver:`camoufox`,message:`Typed into ${t}`,...o?{frame:o}:{}}):(o?await this.deps.pageController.type(t,n,{delay:r},o):await this.deps.pageController.type(t,n,{delay:r}),{message:`Typed into ${t}`,...o?{frame:o}:{}})})}async handlePageUploadFiles(e){try{let t=E(e,`selector`,``),n=O(e,`paths`).map(e=>e.trim()).filter(Boolean),r=E(e,`frameUrl`),i=E(e,`frameSelector`),a=r||i?{frameUrl:r||void 0,frameSelector:i||void 0}:void 0;if(!t||t.trim().length===0)return P.fail(`selector parameter is required`).build();if(n.length===0)return P.fail(`paths parameter must contain at least one relative file path`).build();let o=n.map(e=>g(e));if(this.deps.getActiveDriver()===`camoufox`){let e=await this.deps.getCamoufoxPage(),r=await(a?await this.deps.pageController.resolveFrame(e,a):e).$(t);return!r||typeof r.setInputFiles!=`function`?P.fail(`File input not found: ${t}`).build({driver:`camoufox`}):(await r.setInputFiles(o),P.ok().build({driver:`camoufox`,selector:t,count:o.length,paths:n,message:`Uploaded ${o.length} file(s) into ${t}`,...a?{frame:a}:{}}))}return await this.deps.pageController.uploadFile(t,o,a),P.ok().build({selector:t,count:o.length,paths:n,message:`Uploaded ${o.length} file(s) into ${t}`,...a?{frame:a}:{}})}catch(e){return P.fail(e).build()}}async handlePageSelect(e){return N(async()=>{let t=E(e,`selector`,``),n=O(e,`values`),r=E(e,`frameUrl`),i=E(e,`frameSelector`),a=r||i?{frameUrl:r||void 0,frameSelector:i||void 0}:void 0;return this.deps.getActiveDriver()===`camoufox`?(await(await this.getCamoufoxInteractionContext(a)).selectOption(t,n),{driver:`camoufox`,message:`Selected in ${t}: ${n.join(`, `)}`,...a?{frame:a}:{}}):(a?await this.deps.pageController.select(t,n,a):await this.deps.pageController.select(t,n),{message:`Selected in ${t}: ${n.join(`, `)}`,...a?{frame:a}:{}})})}async handlePageHover(e){return N(async()=>{let t=E(e,`selector`,``),n=E(e,`frameUrl`),r=E(e,`frameSelector`),i=n||r?{frameUrl:n||void 0,frameSelector:r||void 0}:void 0;return this.deps.getActiveDriver()===`camoufox`?(await(await this.getCamoufoxInteractionContext(i)).hover(t),{driver:`camoufox`,message:`Hovered: ${t}`,...i?{frame:i}:{}}):(i?await this.deps.pageController.hover(t,i):await this.deps.pageController.hover(t),{message:`Hovered: ${t}`,...i?{frame:i}:{}})})}async handlePageScroll(e){return N(async()=>{let t=D(e,`x`,0),n=D(e,`y`,0);return this.deps.getActiveDriver()===`camoufox`?(await(await this.deps.getCamoufoxPage()).evaluate(e=>{window.scrollTo(e.x||0,e.y||0)},{x:t,y:n}),{driver:`camoufox`,message:`Scrolled to: x=${t||0}, y=${n||0}`}):(await this.deps.pageController.scroll({x:t,y:n}),{message:`Scrolled to: x=${t||0}, y=${n||0}`})})}async handlePagePressKey(e){return N(async()=>{let t=E(e,`key`,``);return this.deps.getActiveDriver()===`camoufox`?(await(await this.deps.getCamoufoxPage()).keyboard.press(t),{driver:`camoufox`,key:t}):(await this.deps.pageController.pressKey(t),{key:t})})}};function R(e,t){if(Array.isArray(e))return e.map(e=>R(e,t));if(typeof e==`object`&&e){let n=e,r={};for(let[e,i]of Object.entries(n))t.has(e)||(r[e]=R(i,t));return r}return e}function z(e){if(typeof e==`string`)return/^data:[a-z+-]+\/[a-z+-]+;base64,/i.test(e)?`[base64 ~${Math.round(e.length/1024)}KB stripped]`:e.length>500&&/^[A-Za-z0-9+/=\r\n]+$/.test(e.replace(/\s/g,``))?`[base64 ~${e.length}chars stripped]`:e;if(Array.isArray(e))return e.map(e=>z(e));if(typeof e==`object`&&e){let t=e,n={};for(let[e,r]of Object.entries(t))n[e]=z(r);return n}return e}function B(e,t,n){let r=n.autoSummarize?t.smartHandle(e,n.maxSize):e;return n.fieldFilter&&n.fieldFilter.length>0&&(r=R(r,new Set(n.fieldFilter))),n.stripBase64&&(r=z(r)),r}function Te(e){let{code:t}=e,n=Ee(t);return{evaluateFunction:Function(`return ${n}`)(),wasWrapped:!0,originalCode:t}}function Ee(e){return`(function() {
|
|
2
|
+
"use strict";
|
|
3
|
+
return (0, eval)(${JSON.stringify(e)});
|
|
4
|
+
})`}var De=class{deps;constructor(e){this.deps=e}resolveEvaluationSource(e){let t=E(e,`script`,``)||E(e,`code`,``)||E(e,`expression`,``);return t.trim()?t:null}async getCamoufoxEvaluationContext(e){let t=await this.deps.getCamoufoxPage();return!e?.frameUrl&&!e?.frameSelector?t:await this.deps.pageController.resolveFrame(t,e)}async handlePageEvaluate(e){try{let t=this.resolveEvaluationSource(e),n=k(e,`autoSummarize`,!0),r=D(e,`maxSize`,51200),i=O(e,`fieldFilter`),a=k(e,`stripBase64`,!1),o=E(e,`frameUrl`),s=E(e,`frameSelector`);if(!t)return P.fail(`code, script, or expression is required`).build();let c=o||s?{frameUrl:o||void 0,frameSelector:s||void 0}:void 0;if(this.deps.getActiveDriver()===`camoufox`){let e=await this.getCamoufoxEvaluationContext(c),{evaluateFunction:o}=Te({code:t}),s=B(await e.evaluate(o),this.deps.detailedDataManager,{autoSummarize:n,maxSize:r,fieldFilter:i??void 0,stripBase64:a});return P.ok().build({driver:`camoufox`,...c?{frame:c}:{},result:s})}let l=B(c?await this.deps.pageController.evaluate(t,c):await this.deps.pageController.evaluate(t),this.deps.detailedDataManager,{autoSummarize:n,maxSize:r,fieldFilter:i??void 0,stripBase64:a});return P.ok().build({...c?{frame:c}:{},result:l})}catch(e){return P.fail(e).build()}}async handlePageScreenshot(e){try{let t=E(e,`path`),n=E(e,`type`,`png`),r=D(e,`quality`),i=k(e,`fullPage`,!1),a=j(e,`clip`),o=e.selector,s=[];if(Array.isArray(o))for(let e of o){let t=typeof e==`string`?e.trim():``;t.length>0&&t.toLowerCase()!==`all`&&s.push(t)}else if(typeof o==`string`){let e=o.trim();e.length>0&&e.toLowerCase()!==`all`&&s.push(e)}if(s.length>1)return this.screenshotBatch(s,t,n,r);let c=s[0]??``,{absolutePath:l,displayPath:u,pathRewritten:d}=await _({requestedPath:t,type:n,fallbackName:c?`element`:a?`region`:`page`,fallbackDir:`screenshots/manual`});if(this.deps.getActiveDriver()===`camoufox`){let e=await this.deps.getCamoufoxPage(),t;if(c){let i=await e.$(c);if(!i)return P.fail(`Element not found: ${c}`).build();t=await i.screenshot({path:l,type:n,quality:r})}else t=await e.screenshot({path:l,type:n,quality:r,fullPage:a?!1:i});return P.ok().build({driver:`camoufox`,selector:c||void 0,clip:a||void 0,message:`Screenshot taken: ${u}`,path:u,pathRewritten:d,size:t?.length??0})}let f;if(c){let e=await(await this.deps.pageController.getPage()).$(c);if(!e)return P.fail(`Element not found: ${c}`).build();f=await e.screenshot({path:l,type:n,quality:r})}else f=await this.deps.pageController.screenshot({path:l,type:n,quality:r,fullPage:a?!1:i,clip:a});return P.ok().build({selector:c||void 0,clip:a||void 0,message:`Screenshot taken: ${u}`,path:u,pathRewritten:d,size:f.length})}catch(e){return P.fail(e).build()}}async screenshotBatch(e,t,n,r){let i=this.deps.getActiveDriver()===`camoufox`,a=[];for(let o of e){let{absolutePath:e,displayPath:s}=await _({requestedPath:t?t.replace(/(\.\w+)$/,`-${o.replace(/[^a-zA-Z0-9]/g,`_`)}$1`):void 0,type:n,fallbackName:`element-${o.replace(/[^a-zA-Z0-9]/g,`_`)}`,fallbackDir:`screenshots/manual`});try{let t=0;if(i){let i=await(await this.deps.getCamoufoxPage()).$(o);if(!i){a.push({selector:o,success:!1,error:`Element not found: ${o}`});continue}t=(await i.screenshot({path:e,type:n,quality:r}))?.length??0}else{let i=await(await this.deps.pageController.getPage()).$(o);if(!i){a.push({selector:o,success:!1,error:`Element not found: ${o}`});continue}t=(await i.screenshot({path:e,type:n,quality:r})).length}a.push({selector:o,success:!0,path:s,size:t})}catch(e){a.push({selector:o,success:!1,error:String(e)})}}return P.ok().build({mode:`batch`,total:e.length,succeeded:a.filter(e=>e.success).length,results:a})}async handlePageInjectScript(e){try{let t=E(e,`script`,``);return await this.deps.pageController.injectScript(t),P.ok().build({message:`Script injected`})}catch(e){return P.fail(e).build()}}async handlePageWaitForSelector(e){try{let t=E(e,`selector`,``),n=D(e,`timeout`);if(this.deps.getActiveDriver()===`camoufox`){let e=await this.deps.getCamoufoxPage();try{await e.waitForSelector(t,{timeout:n||3e4});let r=await e.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},t);return P.ok().build({driver:`camoufox`,element:r,message:`Selector appeared: ${t}`})}catch{return P.fail(`Timeout waiting for selector: ${t}`).build({driver:`camoufox`})}}let r=await this.deps.pageController.waitForSelector(t,n);return P.ok().merge(r).build()}catch(e){return P.fail(e).build()}}};function Oe(e){if(!Array.isArray(e))return;let t=e.filter(e=>typeof e==`string`&&e.length>0);return t.length>0?t:void 0}var ke=class{deps;constructor(e){this.deps=e}readCookieInput(e){if(!Array.isArray(e)||e.length===0)throw Error(`cookies must be a non-empty array for action=set`);return e.map((e,t)=>{if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`cookies[${t}] must be an object`);let n=e;if(typeof n.name!=`string`||n.name.trim().length===0)throw Error(`cookies[${t}].name must be a non-empty string`);if(typeof n.value!=`string`)throw Error(`cookies[${t}].value must be a string`);if(n.sameSite!==void 0&&n.sameSite!==`Strict`&&n.sameSite!==`Lax`&&n.sameSite!==`None`)throw Error(`cookies[${t}].sameSite must be Strict, Lax, or None`);if(n.expires!==void 0&&typeof n.expires!=`number`)throw Error(`cookies[${t}].expires must be a number`);return e})}requirePositiveInteger(e,t){let n=D(e,t);if(typeof n!=`number`||!Number.isInteger(n)||n<=0)throw Error(`${t} must be a positive integer`);return n}requireStorageKey(e,t){let n=E(e,`key`,``);if(!n.trim())throw Error(`${t} key must be a non-empty string`);return n}safeOrigin(e){try{return new URL(e).origin}catch{return null}}async listCamoufoxFrames(){let e=this.deps.getCamoufoxPage;if(!e)throw Error(`Camoufox page is not available`);let t=await e(),n=t.frames(),r=t.mainFrame(),i=this.safeOrigin(r.url());return n.map((e,t)=>{let a=e.parentFrame(),o=this.safeOrigin(e.url()),s=a?n.findIndex(e=>e===a):-1;return{frameId:`frame-${t}`,url:e.url(),name:e.name()||``,parentFrameId:s>=0?`frame-${s}`:null,parentUrl:a?.url()||null,isMainFrame:e===r,crossOrigin:!!(e!==r&&o&&i&&o!==i)}})}async handlePageListFrames(e){return N(async()=>{let e=this.deps.getActiveDriver()===`camoufox`?await this.listCamoufoxFrames():await this.deps.pageController.listFrames();return{count:e.length,frames:e}})}async handleGetContent(e){return N(async()=>({html:await this.deps.pageController.getContent()}))}async handleGetTitle(e){return N(async()=>({title:await this.deps.pageController.getTitle()}))}async handleGetUrl(e){return N(async()=>({url:await this.deps.pageController.getURL()}))}async handleGetText(e){return N(async()=>{let t=E(e,`selector`,``);return{selector:t,text:await this.deps.pageController.evaluate(`document.querySelector(${JSON.stringify(t)})?.textContent || ""`)}})}async handleGetOuterHtml(e){return N(async()=>{let t=E(e,`selector`,``);return{selector:t,html:await this.deps.pageController.evaluate(`document.querySelector(${JSON.stringify(t)})?.outerHTML || ""`)}})}async handleGetScrollPosition(e){return N(async()=>await this.deps.pageController.evaluate(`({
|
|
5
|
+
scrollX: window.scrollX,
|
|
6
|
+
scrollY: window.scrollY,
|
|
7
|
+
maxScrollX: document.documentElement.scrollWidth - window.innerWidth,
|
|
8
|
+
maxScrollY: document.documentElement.scrollHeight - window.innerHeight
|
|
9
|
+
})`))}async handlePageSetCookies(e){return N(async()=>{let t=this.readCookieInput(e.cookies);return await this.deps.pageController.setCookies(t),{message:`Set ${t.length} cookies`}})}async handlePageGetCookies(e){return N(async()=>{let t=Oe(e.urls),n=await this.deps.pageController.getCookies(t?{urls:t}:void 0);return{count:n.length,cookies:n}})}async getPageCookieCount(){return(await this.deps.pageController.getCookies()).length}async handlePageClearCookies(e){return N(async()=>(await this.deps.pageController.clearCookies(),{message:`Cookies cleared`}))}async handlePageSetViewport(e){return N(async()=>{let t=this.requirePositiveInteger(e,`width`),n=this.requirePositiveInteger(e,`height`);return await this.deps.pageController.setViewport(t,n),{viewport:{width:t,height:n}}})}async handlePageEmulateDevice(e){return N(async()=>{let t=E(e,`device`,``);return await this.deps.pageController.emulateDevice(t),{device:t}})}async handlePageGetLocalStorage(e){return N(async()=>{let e=await this.deps.pageController.getLocalStorage();return{count:Object.keys(e).length,storage:e}})}async handlePageSetLocalStorage(e){return N(async()=>{let t=this.requireStorageKey(e,`localStorage`),n=E(e,`value`,``);return await this.deps.pageController.setLocalStorage(t,n),{key:t}})}async handlePageClearLocalStorage(){return N(async()=>(await this.deps.pageController.clearLocalStorage(),{message:`localStorage cleared`}))}async handlePageGetSessionStorage(e){return N(async()=>{let e=await this.deps.pageController.getSessionStorage();return{count:Object.keys(e).length,storage:e}})}async handlePageSetSessionStorage(e){return N(async()=>{let t=this.requireStorageKey(e,`sessionStorage`),n=E(e,`value`,``);return await this.deps.pageController.setSessionStorage(t,n),{key:t}})}async handlePageClearSessionStorage(){return N(async()=>(await this.deps.pageController.clearSessionStorage(),{message:`sessionStorage cleared`}))}async handlePageDeleteLocalStorage(e){return N(async()=>{let t=this.requireStorageKey(e,`localStorage`);return await this.deps.pageController.evaluate(`localStorage.removeItem(${JSON.stringify(t)})`),{key:t,deleted:!0}})}async handlePageDeleteSessionStorage(e){return N(async()=>{let t=this.requireStorageKey(e,`sessionStorage`);return await this.deps.pageController.evaluate(`sessionStorage.removeItem(${JSON.stringify(t)})`),{key:t,deleted:!0}})}async handlePageStorageInfo(e){return N(async()=>await this.deps.pageController.evaluate(`(async () => {
|
|
10
|
+
if (!navigator.storage || typeof navigator.storage.estimate !== 'function') {
|
|
11
|
+
return { supported: false, usage: null, quota: null, persisted: null };
|
|
12
|
+
}
|
|
13
|
+
const estimate = await navigator.storage.estimate();
|
|
14
|
+
const persisted = typeof navigator.storage.persisted === 'function'
|
|
15
|
+
? await navigator.storage.persisted()
|
|
16
|
+
: null;
|
|
17
|
+
return {
|
|
18
|
+
supported: true,
|
|
19
|
+
usage: typeof estimate.usage === 'number' ? estimate.usage : null,
|
|
20
|
+
quota: typeof estimate.quota === 'number' ? estimate.quota : null,
|
|
21
|
+
persisted,
|
|
22
|
+
};
|
|
23
|
+
})()`))}async handleBrowserPasskeySeed(e){return N(async()=>{let t=E(e,`relyingPartyId`,``),n=E(e,`credentialId`,``),r=E(e,`userHandle`,``),i=E(e,`privateKey`,``),a=E(e,`publicKey`,``),o=E(e,`userDisplayName`,``);if(!t||!n||!r||!i)throw Error(`relyingPartyId, credentialId, userHandle and privateKey are required`);return{seeded:!0,...await this.deps.pageController.seedWebAuthnCredential({relyingPartyId:t,credentialId:n,userHandle:r,privateKey:i,publicKey:a||void 0,userDisplayName:o||void 0})}})}},Ae=class{deps;constructor(e){this.deps=e}async handleConsoleMonitor(e){return N(async()=>E(e,`action`)===`enable`?(await this.deps.consoleMonitor.enable(),{message:`Console monitoring enabled`}):(await this.deps.consoleMonitor.disable(),{message:`Console monitoring disabled`}))}async handleConsoleGetLogs(e){return N(async()=>{let t=E(e,`type`),n=D(e,`limit`),r=D(e,`since`),i=this.deps.consoleMonitor.getLogs({type:t,limit:n,since:r});return this.deps.detailedDataManager.smartHandle({count:i.length,logs:i},51200)})}async handleConsoleExecute(e){return N(async()=>{let t=E(e,`expression`,``),n=D(e,`maxSize`,10485760),r=k(e,`stripBase64`,!1);if(!t.trim())throw Error(`expression is required`);return{result:B(await this.deps.consoleMonitor.execute(t),this.deps.detailedDataManager,{autoSummarize:!0,maxSize:n,stripBase64:r})}})}},je=class{deps;constructor(e){this.deps=e}async handleGetAllScripts(e){return N(async()=>{let t=k(e,`includeSource`,!1),n=Math.min(D(e,`maxScripts`,t?200:1e3),l),r=await this.deps.scriptManager.getAllScripts(t,n);return this.deps.detailedDataManager.smartHandle({count:r.length,scripts:r})})}async handleGetScriptSource(e){return N(async()=>{let t=E(e,`scriptId`),n=E(e,`url`),r=k(e,`preview`,!0),i=D(e,`maxLines`,100),a=D(e,`startLine`),o=D(e,`endLine`),s=await this.deps.scriptManager.getScriptSource(t,n);if(!s)throw Error(`Script not found`);if(r||a!==void 0||o!==void 0){let e=s.source||``,t=e.split(`
|
|
24
|
+
`),n=t.length,r=e.length,c,l,u;return a!==void 0&&o!==void 0?(l=Math.max(1,a),u=Math.min(n,o),c=t.slice(l-1,u).join(`
|
|
25
|
+
`)):(l=1,u=Math.min(i,n),c=t.slice(0,i).join(`
|
|
26
|
+
`)),{scriptId:s.scriptId,url:s.url,preview:!0,totalLines:n,size:r,sizeKB:(r/1024).toFixed(1)+`KB`,showingLines:`${l}-${u}`,content:c,hint:r>51200?`Script is large (${(r/1024).toFixed(1)}KB). Use startLine/endLine to get specific sections, or set preview=false to get full source (will return detailId).`:`Set preview=false to get full source`}}return this.deps.detailedDataManager.smartHandle(s,51200)})}},Me=class{deps;constructor(e){this.deps=e}async handleCaptchaDetect(e){return N(async()=>{let e=await this.deps.pageController.getPage(),t=await this.deps.captchaDetector.detect(e);return{captcha_detected:t.detected,captcha_info:t}})}async handleCaptchaWait(t){return N(async()=>{let n=D(t,`timeout`,this.deps.captchaTimeout),r=await this.deps.pageController.getPage();if(e.info(`Waiting for CAPTCHA to be solved...`),!await this.deps.captchaDetector.waitForCompletion(r,n))throw Error(`CAPTCHA wait timed out`);return{message:`CAPTCHA solved`}})}async handleCaptchaConfig(e){return N(async()=>(e.autoDetectCaptcha!==void 0&&this.deps.setAutoDetectCaptcha(k(e,`autoDetectCaptcha`,!1)),e.autoSwitchHeadless!==void 0&&this.deps.setAutoSwitchHeadless(k(e,`autoSwitchHeadless`,!1)),e.captchaTimeout!==void 0&&this.deps.setCaptchaTimeout(D(e,`captchaTimeout`,0)),{config:{autoDetectCaptcha:this.deps.autoDetectCaptcha,autoSwitchHeadless:this.deps.autoSwitchHeadless,captchaTimeout:this.deps.captchaTimeout}}))}};const Ne={enabled:!0,minDelayMs:20,maxDelayMs:80,burstMode:!1};var Pe=class t{static instance=null;cachedProfile=null;static DEFAULT_TTL_SEC=1800;static getInstance(){return t.instance||=new t,t.instance}async exportFromPage(n,r={}){let i=await n.cookies(),a=await n.evaluate(()=>{let e=navigator,t=e.userAgentData,n={secChUa:Array.isArray(t?.brands)?t.brands.map(e=>`"${e.brand}";v="${e.version}"`).join(`, `):void 0,secChUaMobile:typeof t?.mobile==`boolean`?t.mobile?`?1`:`?0`:void 0,secChUaPlatform:t?.platform?`"${t.platform}"`:void 0};return{userAgent:e.userAgent,platform:e.platform,acceptLanguage:e.language,referer:document.referrer||void 0,clientHints:n}}),o=r.origin??this.safeOrigin(n.url()),s=r.ttlSec??t.DEFAULT_TTL_SEC,c={cookies:i.map(e=>({name:e.name,value:e.value,domain:e.domain,path:e.path,expires:e.expires,size:e.size,httpOnly:e.httpOnly,secure:e.secure,session:e.session,sameSite:e.sameSite,sourceScheme:e.sourceScheme})),userAgent:a.userAgent,acceptLanguage:a.acceptLanguage,referer:r.referer??a.referer,clientHints:a.clientHints,platform:a.platform,origin:o,collectedAt:Date.now(),ttlSec:s};return this.cachedProfile=c,e.info(`Session profile exported: cookies=${c.cookies.length}, origin=${c.origin??`unknown`}, ttlSec=${c.ttlSec}`),c}serialize(e){return JSON.stringify(e)}deserialize(e){let n=JSON.parse(e);return{cookies:Array.isArray(n.cookies)?n.cookies:[],userAgent:n.userAgent,acceptLanguage:n.acceptLanguage,referer:n.referer,clientHints:n.clientHints,platform:n.platform,origin:n.origin,collectedAt:typeof n.collectedAt==`number`?n.collectedAt:Date.now(),ttlSec:typeof n.ttlSec==`number`&&n.ttlSec>0?n.ttlSec:t.DEFAULT_TTL_SEC}}setProfile(e){this.cachedProfile=e}getProfile(){return this.cachedProfile}getValidProfile(e=Date.now()){return!this.cachedProfile||this.isExpired(this.cachedProfile,e)?null:this.cachedProfile}isExpired(e,t=Date.now()){return e.collectedAt+e.ttlSec*1e3<=t}clearProfile(){this.cachedProfile=null}static resetInstance(){t.instance=null}safeOrigin(e){if(!(!e||e===`about:blank`))try{return new URL(e).origin}catch{return}}};const Fe=[{api:`navigator.webdriver`,method:`property override (configurable:false)`},{api:`window.chrome`,method:`object injection (runtime, loadTimes, csi)`},{api:`navigator.plugins`,method:`PluginArray override (spoofed length/names)`},{api:`Permissions.query`,method:`result filter (returns granted/prompt)`},{api:`HTMLCanvasElement.toDataURL/toBlob`,method:`pixel noise injection`},{api:`WebGLRenderingContext.getParameter`,method:`vendor/renderer override`},{api:`navigator.languages`,method:`array override (locale-specific)`},{api:`navigator.getBattery`,method:`fake BatteryManager`},{api:`MediaDevices.enumerateDevices`,method:`device list filter`},{api:`Notification.permission`,method:`permission override`},{api:`performance.now / Date.now`,method:`timing offset compensation`},{api:`CDP request timing`,method:`jitter compensation proxy`},{api:`document.fonts.check`,method:`spoofed local-font availability (browser_font_fingerprint spoof)`}],V={...Ne};let H=null;const U=Pe.getInstance();async function W(){if(H)return H;try{return H=(await import(`./FingerprintManager-D9Zlr6be.mjs`)).FingerprintManager.getInstance(),H}catch{return null}}var Ie=class{deps;constructor(e){this.deps=e}getDefaultUserAgent(e){let t={windows:`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36`,mac:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36`,linux:`Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36`};return t[e]||t.windows}async handleStealthInject(t){try{if(this.deps.getActiveDriver()===`camoufox`)return P.ok().build({driver:`camoufox`,message:`Camoufox uses C++ engine-level fingerprint spoofing — JS-layer stealth scripts are not needed and have been skipped.`});let t=await this.deps.pageController.getPage(),n=await W(),r=!1;if(n?.isAvailable())try{let e=n.getActiveProfile();e||=await n.generateFingerprint(),e&&(await n.injectFingerprint(t,e),r=!0)}catch(t){e.warn(`Fingerprint injection failed, falling back to StealthScripts:`,t)}if(await w.injectAll(t),r&&n){let e=n.getActiveProfile(),t=U.getValidProfile(),r={cookies:t?.cookies??[],userAgent:e?.headers?.[`User-Agent`]??t?.userAgent,acceptLanguage:e?.headers?.[`Accept-Language`]??t?.acceptLanguage,referer:t?.referer,clientHints:t?.clientHints,platform:e?.os??t?.platform,origin:t?.origin,collectedAt:t?.collectedAt??Date.now(),ttlSec:t?.ttlSec??1800};U.setProfile(r)}return P.ok().build({message:`Stealth scripts injected successfully`,fingerprintApplied:r,patchManifest:Fe,_nextStepHint:`Stealth patches are now active. Next: navigate to your target URL with page_navigate. Do NOT call stealth_inject again — it only needs to run once per page.`})}catch(e){return P.fail(e).build()}}async handleStealthSetUserAgent(e){try{let t=E(e,`platform`,`windows`),n=await this.deps.pageController.getPage();return await w.setRealisticUserAgent(n,t),P.ok().build({platform:t,message:`User-Agent set for ${t}`,_nextStepHint:`User-Agent is now configured. Next: call stealth_inject to apply all anti-detection patches, then page_navigate to your target URL.`})}catch(e){return P.fail(e).build()}}async handleStealthConfigureJitter(e){try{return e.enabled!==void 0&&(V.enabled=!!e.enabled),typeof e.minDelayMs==`number`&&(V.minDelayMs=e.minDelayMs),typeof e.maxDelayMs==`number`&&(V.maxDelayMs=e.maxDelayMs),e.burstMode!==void 0&&(V.burstMode=!!e.burstMode),P.ok().build({jitterOptions:V,message:`CDP timing jitter ${V.enabled?`enabled`:`disabled`}: ${V.minDelayMs}-${V.maxDelayMs}ms${V.burstMode?` (burst mode)`:``}`})}catch(e){return P.fail(e).build()}}async handleStealthGenerateFingerprint(e){try{if(this.deps.getActiveDriver()===`camoufox`)try{let t=await import(`camoufox-js/fingerprints`),n=E(e,`os`,`windows`),r=await t.generateFingerprint(n);return P.ok().build({fingerprint:r,driver:`camoufox`,message:`Fingerprint generated using camoufox native engine. Apply via browser_launch(fingerprint=...) before launching.`})}catch(e){return P.fail(`Camoufox fingerprint generation failed: ${e instanceof Error?e.message:String(e)}`).build()}let t=await W();if(!t?.isAvailable()){let t=E(e,`locale`,`en-US`),n=E(e,`os`,`windows`),r=E(e,`browser`,`chrome`),i={userAgent:this.getDefaultUserAgent(n),acceptLanguage:t,platform:n,browser:r,_note:`Basic profile without fingerprint-generator. Install fingerprint-generator for full profile.`},a=F({tool:`stealth_generate_fingerprint`,stubType:`partial`,reason:`fingerprint-generator/fingerprint-injector packages not installed, using basic profile`,fix:`Install for full fingerprint: pnpm add fingerprint-generator fingerprint-injector`,data:{available:!1,capability:`fingerprint_generator`,status:`partial`,profile:i}});return P.ok().merge(a).merge({profile:i}).build()}let n=await t.generateFingerprint({os:e.os,browser:e.browser??`chrome`,locale:e.locale??`en-US`});return P.ok().build({profile:n,message:`Fingerprint generated and cached. It will be auto-applied on next stealth_inject.`})}catch(e){return P.fail(e).build()}}async handleStealthVerify(e){try{let e=await this.deps.pageController.getPage(),t=await new(await(import(`./StealthVerifier-DMBrtkhN.mjs`))).StealthVerifier().verify(e);return P.ok().merge(t).build()}catch(e){return P.fail(`Stealth verification failed: ${e instanceof Error?e.message:String(e)}`).build()}}async handleBrowserFontFingerprint(e){try{let t=k(e,`useLocalFontApi`,!0),n=k(e,`spoof`,!1),r=Le({useLocalFontApi:t,spoof:n,maxFonts:D(e,`maxFonts`,d),probeList:c}),i=await this.deps.pageController.evaluate(r)??null;if(!i||typeof i!=`object`)return P.fail(`Font fingerprint probe returned no result.`).build();let a=(Array.isArray(i.detected)?i.detected:[]).filter(e=>typeof e==`string`);return P.ok().build({count:a.length,detected:a,hash:typeof i.hash==`string`?i.hash:null,source:typeof i.source==`string`?i.source:t?`unknown`:`probeFallback`,localFontApiAvailable:i.localFontApiAvailable===!0,spoofed:i.spoofed===!0,spoofError:typeof i.spoofError==`string`?i.spoofError:void 0,_nextStepHint:n?`document.fonts.check is now overridden. Re-run with spoof=false to confirm the real fingerprint, or call stealth_verify to check overall stealth posture.`:`Set spoof=true to override document.fonts.check and collapse the font fingerprint entropy.`})}catch(e){return P.fail(`Font fingerprint failed: ${e instanceof Error?e.message:String(e)}`).build()}}async handleCamoufoxGeolocation(e){try{let t=E(e,`locale`);if(!t)return P.fail(`locale is required (e.g. "en-US", "zh-CN")`).build();let n;try{n=await(await import(`camoufox-js/locale`)).getGeolocation(t)}catch(e){let t=F({tool:`camoufox_geolocation`,stubType:`unavailable`,reason:`Camoufox locale module unavailable: ${e instanceof Error?e.message:String(e)}. Ensure camoufox-js is installed.`,fix:`Install camoufox-js and fetch its browser assets: pnpm add camoufox-js && npx camoufox-js fetch`,data:{available:!1,capability:`camoufox_locale`,status:`unavailable`}});return P.fail(t.reason).merge(t).build()}let r=null,i=E(e,`proxy`);if(i)try{r=await(await import(`camoufox-js/ip`)).publicIP(i)}catch{}return P.ok().build({locale:t,geolocation:n,publicIp:r})}catch(e){let t=F({tool:`camoufox_geolocation`,stubType:`unavailable`,reason:`Camoufox locale module unavailable: ${e instanceof Error?e.message:String(e)}`,fix:`Install camoufox-js and fetch its browser assets: pnpm add camoufox-js && npx camoufox-js fetch`,data:{available:!1,capability:`camoufox_locale`,status:`unavailable`}});return P.fail(t.reason).merge(t).build()}}};const G=`probeFallback`;function Le(e){let{useLocalFontApi:t,spoof:n,maxFonts:r,probeList:i}=e,a=JSON.stringify(i),o=Math.max(0,Math.floor(r)),s=[];return s.push(`(() => {`),s.push(` const probeList = `+a+`;`),s.push(` const maxFonts = `+String(o)+`;`),s.push(` const wantLocalApi = `+JSON.stringify(t)+`;`),s.push(` const wantSpoof = `+JSON.stringify(n)+`;`),s.push(` const hashNames = (names) => {`),s.push(` const sorted = names.slice().sort();`),s.push(` let h = 5381;`),s.push(` for (const n of sorted) {`),s.push(` for (let i = 0; i < n.length; i++) { h = ((h << 5) + h + n.charCodeAt(i)) | 0; }`),s.push(` }`),s.push(` return (h >>> 0).toString(16).padStart(8, '0');`),s.push(` };`),s.push(` const fontsApi = typeof document !== 'undefined' && document.fonts && typeof document.fonts.check === 'function';`),s.push(` const probeFallback = () => {`),s.push(` const detected = [];`),s.push(` if (!fontsApi) return detected;`),s.push(` for (const name of probeList) {`),s.push(` try {`),s.push(` if (document.fonts.check('12px "' + name + '"')) detected.push(name);`),s.push(` } catch (_) {}`),s.push(` }`),s.push(` return detected;`),s.push(` };`),s.push(` let localFontApiAvailable = false; let localFontApiError = null;`),s.push(` let spoofed = false; let spoofError = null;`),s.push(` let detected = []; let source = `+JSON.stringify(G)+`;`),s.push(` if (wantSpoof && fontsApi) {`),s.push(` try { document.fonts.check = () => true; spoofed = true; }`),s.push(` catch (e) { spoofError = (e && e.message) ? e.message : String(e); }`),s.push(` }`),s.push(` if (wantLocalApi && typeof queryLocalFonts === 'function') {`),s.push(` localFontApiAvailable = true;`),s.push(` source = `+JSON.stringify(`queryLocalFonts`)+`;`),s.push(` return (async () => {`),s.push(` try {`),s.push(` const fonts = await queryLocalFonts();`),s.push(` const seen = new Set();`),s.push(` for (const f of fonts) {`),s.push(` if (f && typeof f.family === 'string') seen.add(f.family);`),s.push(` if (seen.size >= maxFonts) break;`),s.push(` }`),s.push(` detected = Array.from(seen).slice(0, maxFonts);`),s.push(` } catch (e) {`),s.push(` localFontApiAvailable = false;`),s.push(` localFontApiError = (e && e.message) ? e.message : String(e);`),s.push(` source = `+JSON.stringify(G)+`;`),s.push(` detected = probeFallback();`),s.push(` }`),s.push(` return { detected, count: detected.length, hash: hashNames(detected), source, localFontApiAvailable, localFontApiError, spoofed, spoofError };`),s.push(` })();`),s.push(` }`),s.push(` source = fontsApi ? `+JSON.stringify(G)+` : `+JSON.stringify(`unavailable`)+`;`),s.push(` detected = probeFallback();`),s.push(` return { detected, count: detected.length, hash: hashNames(detected), source, localFontApiAvailable, localFontApiError, spoofed, spoofError };`),s.push(`})()`),s.join(`
|
|
27
|
+
`)}var Re=class{deps;constructor(e){this.deps=e}async handleFrameworkStateExtract(e){let t=E(e,`framework`,`auto`),n=E(e,`selector`,``),r=D(e,`maxDepth`,5);try{let e=await this.deps.getActivePage();try{let t=await e.createCDPSession();await Promise.race([t.send(`Runtime.evaluate`,{expression:`1`,returnByValue:!0}),new Promise((e,t)=>setTimeout(()=>t(Error(`cdp_unreachable`)),3e3))])}catch{throw new ne(`CDP session unresponsive — the debugger may be blocking page evaluation. Call debugger_lifecycle({ action: 'disable' })() before framework_state_extract, or run it before debugger_lifecycle({ action: 'enable' }).`)}let i=e.evaluate(e=>{let t=window;function n(e,t=0){if(t>4)return`[deep]`;if(e==null)return e;if(typeof e==`function`)return`[Function]`;if(typeof e!=`object`)return e;if(Array.isArray(e))return e.slice(0,20).map(e=>n(e,t+1));try{let r={},i=0;for(let a of Object.keys(e)){if(i++>30){r.__truncated__=!0;break}r[a]=n(e[a],t+1)}return r}catch{return`[unserializable]`}}let r=()=>e.selector?document.querySelector(e.selector)??document.body:document.getElementById(`root`)??document.getElementById(`app`)??document.querySelector(`[data-reactroot]`)??document.body,i=()=>{let t=r(),i=Object.keys(t).find(e=>e.startsWith(`__reactFiber`)||e.startsWith(`__reactInternalInstance`)||e.startsWith(`__reactFiberContainer`));if(!i)return null;let a=[],o=new WeakSet,s=(t,r)=>{if(!(!t||r>e.maxDepth||o.has(t))){if(o.add(t),t.memoizedState){let e=[],r=t.memoizedState,i=0;for(;r&&i++<20;){let t=r.queue,i=r.memoizedState===void 0?t?.lastRenderedState:r.memoizedState;i!==void 0&&e.push(n(i)),r=r.next??null}if(e.length>0){let n=t.type,r=typeof n==`object`&&n?String(n.name??`anonymous`):typeof n==`string`?n:`anonymous`;a.push({component:r,state:e})}}s(t.child??null,r+1),s(t.sibling??null,r+1)}};return s(t[i]??null,0),a},a=()=>{let t=r(),i=Object.keys(t).find(e=>e===`__vueParentComponent`||e===`__vue_app__`||e.startsWith(`__vue`));if(!i)return null;let a=t[i];if(!a)return null;let o=[],s=new WeakSet,c=(t,r)=>{if(!t||r>e.maxDepth||s.has(t))return;s.add(t);let i=n(t.setupState??t.ctx),a=n(t.$data??t.data);if(i||a){let e=t.type;o.push({component:e?.__name??`unknown`,setupState:i,data:a})}let l=t.subTree?.children;if(Array.isArray(l))for(let e of l)e?.component&&c(e.component,r+1)};return c(a,0),o},o=()=>{let t=r(),i=Object.keys(t).find(e=>e===`__vue__`);if(!i)return null;let a=t[i];if(!a)return null;let o=[],s=new WeakSet,c=(t,r)=>{if(!t||r>e.maxDepth||s.has(t))return;s.add(t);let i=t.$options;o.push({component:i?.name??`unknown`,data:n(t.$data)});let a=t.$children;if(Array.isArray(a))for(let e of a)c(e,r+1)};return c(a,0),o},s=()=>{let e=[],t=new WeakSet,i=document.querySelectorAll(`[class]`),a=[r(),...Array.from(i)],o=!1;for(let r of a){let i=r;if(!Object.keys(i).some(e=>e===`$$`||e===`__svelte_meta`||e.startsWith(`__s`)))continue;o=!0;let a=i.$$;if(!a||t.has(a))continue;t.add(a);let s=i.__svelte_meta?.loc?.file,c=a.ctx,l={};if(Array.isArray(c)){let e=0;for(let t of c.slice(0,20))t!==void 0&&typeof t!=`function`&&(l[`$${e}`]=n(t)),e++}let u=a.fragment;if((Object.keys(l).length>0||u)&&e.push({component:s??r.tagName?.toLowerCase()??`svelte-component`,state:[l],...s?{file:s}:{}}),e.length>=50)break}return o?e:null},c=()=>{let r=[],i=t._$DX,a=t._$HY;if(!i&&!a){if(!document.querySelector(`[data-hk]`))return null;let e=(()=>{for(let e of Object.keys(t))if(e.startsWith(`_$`)||e.startsWith(`$`)){let n=t[e];if(n&&typeof n==`object`&&`owner`in n)return n}let e=document.querySelectorAll(`[data-hk]`);for(let t of Array.from(e).slice(0,10)){let e=t;for(let t of Object.keys(e))if(t.startsWith(`_$`)||t.startsWith(`$SOLID`)){let n=e[t];if(n&&typeof n==`object`)return n}}return null})();return e?(r.push({component:`SolidRoot`,state:[{_source:`probed-internals`,_note:`State extracted via dynamic introspection (no devtools)`,...n(e)}]}),r):(r.push({component:`SolidRoot`,state:[{_note:`Solid detected via hydration markers; install solid-devtools for full state extraction`,_hydrationNodes:Array.from(document.querySelectorAll(`[data-hk]`)).length}]}),r)}if(i){let t=i.roots;if(t&&typeof t==`object`){let i=t instanceof Map?Array.from(t.values()):Object.values(t),a=0;for(let t of i){if(a++>=e.maxDepth*10)break;let i=t.name??`SolidComponent`,o=t.value??t.state;r.push({component:i,state:o?[n(o)]:[]})}}}return a&&r.length===0&&r.push({component:`SolidHydration`,state:[n(a)]}),r.length>0?r:null},l=()=>{let e=t.ng!==void 0,r=null;try{let e=document.querySelector(`[ng-version]`);if(e&&typeof e.getAttribute==`function`){let t=e.getAttribute(`ng-version`);typeof t==`string`&&(r=t)}}catch{}let i=[];try{let e=document.querySelectorAll(`*`),t=Math.min(e.length,1e3);for(let n=0;n<t;n++){let t=e[n];if(t.__ngContext__!==void 0){let e=[];try{if(t.attributes){let n=t.attributes;for(let t=0;t<n.length&&e.length<20;t++){let r=n[t];r&&r.name.startsWith(`ng-reflect-`)&&e.push({name:r.name,value:r.value})}}}catch{}let n=t.tagName;i.push({tagName:typeof n==`string`?n:`unknown`,contextType:typeof t.__ngContext__,ngReflectAttrs:e})}if(i.length>=10)break}}catch{}if(!(e||r!==null||i.length>0))return null;let a=[];e&&a.push({component:`AngularDebugTools`,state:[{_source:`window.ng`,available:!0}]});for(let e of i){let t={_contextType:e.contextType};if(e.ngReflectAttrs.length>0)for(let r of e.ngReflectAttrs){let e=r.name.replace(/^ng-reflect-/,``).replace(/-([a-z])/g,(e,t)=>t.toUpperCase());t[e]=n(r.value)}a.push({component:e.tagName,state:[t]})}return a.length===0&&r!==null&&a.push({component:`AngularApp`,state:[{_version:r,_note:`Angular detected via [ng-version] attribute only`}]}),a.length>0?a:null},u=()=>{let t=r(),i=Object.keys(t);if(i.some(e=>e.startsWith(`__reactFiber`)||e.startsWith(`__reactInternalInstance`))||!i.some(e=>e===`__k`||e===`__e`||e===`_dom`))return null;let a=[],o=new WeakSet,s=(t,r)=>{if(!t||r>e.maxDepth||o.has(t))return;o.add(t);let i=t.__c;if(i){let e=i.state,r=i.props,o=i.__H,s=[];if(o){let e=o.__;if(Array.isArray(e))for(let t of e.slice(0,20)){let e=t.__??t._value;e!==void 0&&s.push(n(e))}}let c=t.type,l=typeof c==`function`?c.displayName??c.name??`PreactComponent`:typeof c==`string`?c:`PreactComponent`;(e||s.length>0)&&a.push({component:String(l),state:s.length>0?s:e?[n(e)]:[],...r?{props:n(r)}:{}})}let c=t.__k;if(Array.isArray(c))for(let e of c)e&&s(e,r+1)},c=t.__k;if(Array.isArray(c))for(let e of c)e&&s(e,0);else if(t._children){let e=t._children;if(Array.isArray(e))for(let t of e)t&&s(t,0)}return a.length>0?a:null},d=()=>{let e=t.__NEXT_DATA__;if(e)return{framework:`nextjs`,route:e.page,buildId:e.buildId,runtimeConfig:n(e.runtimeConfig),props:n(e.props)};let r=t.__NUXT__;return r?r.config!==void 0||r._errors!==void 0?{framework:`nuxt3`,state:n(r.state),config:n(r.config),payload:n(r.data)}:{framework:`nuxt2`,state:n(r.state),serverRendered:r.serverRendered}:null},f=r(),p=Object.keys(f),m=p.some(e=>e.startsWith(`__reactFiber`)||e.startsWith(`__reactInternalInstance`)||e.startsWith(`__reactFiberContainer`)),h=p.some(e=>e===`__vueParentComponent`||e===`__vue_app__`),g=p.some(e=>e===`__vue__`),_=p.some(e=>e===`$$`||e===`__svelte_meta`||e.startsWith(`__s`)),v=t._$DX!==void 0||t._$HY!==void 0||!!document.querySelector(`[data-hk]`),y=p.some(e=>e===`__k`||e===`__e`||e===`_dom`||e===`_children`),b=t.ng!==void 0||!!document.querySelector(`[ng-version]`),x=e.framework;x===`preact`&&m&&(x=`react`),x===`auto`&&(m?x=`react`:h?x=`vue3`:g?x=`vue2`:_?x=`svelte`:v?x=`solid`:b?x=`angular`:y&&(x=`preact`));let S=null;(x===`react`||x===`auto`)&&(S=i()),!S&&(x===`vue3`||x===`auto`)&&(S=a()),!S&&(x===`vue2`||x===`auto`)&&(S=o()),!S&&(x===`svelte`||x===`auto`)&&(S=s()),!S&&(x===`solid`||x===`auto`)&&(S=c()),!S&&(x===`angular`||x===`auto`)&&(S=l()),!S&&(x===`preact`||x===`auto`)&&(S=u());let C=d();return{detected:x,states:S??[],found:S!==null&&S.length>0,...C?{meta:C}:{}}},{framework:t,selector:n,maxDepth:r}),a=await Promise.race([i,new Promise((e,t)=>setTimeout(()=>t(Error(`page.evaluate timed out after 30000ms`)),3e4))]);return P.ok().build(a)}catch(e){return P.fail(e).build()}}},ze=class{deps;constructor(e){this.deps=e}async handleIndexedDBDump(e){let t=E(e,`database`,``),n=E(e,`store`,``),r=D(e,`maxRecords`,100),i=E(e,`indexName`,``),a=k(e,`count`,!1),o=j(e,`keyRange`),s=j(e,`cursor`);return N(async()=>await(await this.deps.getActivePage()).evaluate(async e=>{let t=await indexedDB.databases(),n={},r=null;if(e.keyRange){let t=e.keyRange,n=t.lower!==void 0,i=t.upper!==void 0;n&&i?r=IDBKeyRange.bound(t.lower,t.upper,t.lowerOpen??!1,t.upperOpen??!1):n?r=IDBKeyRange.lowerBound(t.lower,t.lowerOpen??!1):i&&(r=IDBKeyRange.upperBound(t.upper,t.upperOpen??!1))}for(let i of t){if(!i.name||e.database&&i.name!==e.database)continue;let t=i.name,a;try{a=await new Promise((e,n)=>{let r=i.version?indexedDB.open(t,i.version):indexedDB.open(t);r.addEventListener(`success`,()=>e(r.result),{once:!0}),r.addEventListener(`error`,()=>n(r.error),{once:!0})})}catch{n[t]={__error__:[`failed to open`]};continue}let o=Array.from(a.objectStoreNames),s={};for(let t of o)if(!(e.store&&t!==e.store))try{s[t]=await new Promise((n,i)=>{try{let o=a.transaction(t,`readonly`).objectStore(t),s=e.indexName?o.index(e.indexName):o;if(e.countOnly){let e=s.count(r??void 0);e.addEventListener(`success`,()=>n({count:e.result}),{once:!0}),e.addEventListener(`error`,()=>i(e.error),{once:!0});return}if(e.cursor){let t=e.cursor.offset??0,a=e.cursor.batchSize??e.maxRecords,o=[],c=!1,l=s.openCursor(r??void 0);l.addEventListener(`success`,()=>{let e=l.result;if(!e){n({records:o,hasMore:!1,nextOffset:null});return}if(!c&&t>0){c=!0,e.advance(t);return}o.length<a?(o.push(e.value),e.continue()):n({records:o,hasMore:!0,nextOffset:t+o.length})}),l.addEventListener(`error`,()=>i(l.error),{once:!0});return}let c=s.getAll(r??void 0);c.addEventListener(`success`,()=>n(c.result.slice(0,e.maxRecords)),{once:!0}),c.addEventListener(`error`,()=>i(c.error),{once:!0})}catch(e){i(e)}})}catch{s[t]=[`__error reading store__`]}a.close(),n[t]=s}return n},{database:t,store:n,maxRecords:r,indexName:i,countOnly:a,keyRange:o??null,cursor:s??null}))}},Be=class{deps;constructor(e){this.deps=e}async handleGetDetailedData(e){try{let t=E(e,`detailId`,``),n=E(e,`path`),r=this.deps.detailedDataManager.retrieve(t,n);return P.ok().build({detailId:t,path:n||`full`,data:r})}catch(e){return P.fail(e).set(`hint`,`DetailId may have expired (TTL: 10 minutes) or is invalid`).build()}}async handleGetOffloadedData(e){try{let t=E(e,`path`,``),n=A(e,`encoding`,new Set([`base64`,`utf8`]),`base64`);if(!t)return P.fail(`path is required`).build();let r=g(t),i=ue(y(),r);if(i===``||i===`..`||i.startsWith(`..${de}`)||le(i))return P.fail(`path must point inside the offloaded artifacts directory (artifacts/offloaded/)`).build();let a=ce(r);return P.ok().build({path:t,encoding:n,size:a.length,data:a.toString(n)})}catch(e){return P.fail(e).set(`hint`,`Offloaded file may have been cleaned up by artifact retention, or the path is invalid`).build()}}},Ve=class{deps;constructor(e){this.deps=e}async handleBrowserEvaluateCdpTarget(t){try{let e=E(t,`script`,``)||E(t,`code`,``)||E(t,`expression`,``),n=k(t,`autoSummarize`,!0),r=D(t,`maxSize`,51200),i=O(t,`fieldFilter`),a=k(t,`stripBase64`,!1),o=k(t,`returnByValue`,!0),s=k(t,`awaitPromise`,!0);if(!e.trim())return P.fail(`code, script, or expression is required`).build();let c=this.deps.pageController.getAttachedTargetInfo();if(!c)return P.fail(`No CDP target is currently attached. Call browser_attach_cdp_target(targetId="...") first.`).build();let l=B(await this.deps.pageController.evaluateAttachedTarget(e,{returnByValue:o,awaitPromise:s}),this.deps.detailedDataManager,{autoSummarize:n,maxSize:r,fieldFilter:i??void 0,stripBase64:a});return P.ok().build({target:c,result:l})}catch(t){return e.error(`Failed to evaluate in CDP target:`,t),P.fail(t instanceof Error?t.message:String(t)).build()}}},He=class{deps;constructor(e){this.deps=e}markMonitoringContextChanged(t){try{this.deps.consoleMonitor.markContextChanged()}catch(n){e.warn(`[${t}] Failed to mark monitoring context as stale: ${n instanceof Error?n.message:String(n)}`)}}safeOrigin(e){if(!e)return null;try{return new URL(e).origin}catch{return null}}async syncAttachedPageContext(e){if(e.type!==`page`||!e.targetId)return{contextSwitched:!1,selectedIndex:null,selectedPageId:null,currentUrl:e.url??null,currentTitle:e.title??null};let t=await this.deps.collector.selectResolvedPageByTargetId(e.targetId);if(!t)return{contextSwitched:!1,selectedIndex:null,selectedPageId:null,currentUrl:e.url??null,currentTitle:e.title??null};let n=this.deps.getTabRegistry(),r=n.upsertPage(t.page,{index:t.index,url:t.url,title:t.title});return n.setCurrentPageId(r),{contextSwitched:!0,selectedIndex:t.index,selectedPageId:r,currentUrl:t.url,currentTitle:t.title}}async clearAttachedTargetContext(t){let n=this.deps.collector.getAttachedTargetInfo();if(!n)return{detached:!1,targetId:null,type:null};let r=await this.deps.collector.detachCdpTarget();return r&&e.info(`[${t}] Detached active CDP target ${n.targetId} before switching page context`),{detached:r,targetId:n.targetId,type:n.type??null}}async handleBrowserListCdpTargets(t){try{let e=E(t,`type`),n=O(t,`types`),r=E(t,`targetId`),i=E(t,`urlPattern`),a=E(t,`titlePattern`),o=k(t,`attachedOnly`,!1),s=k(t,`discoverOOPIF`,!0),c=await this.deps.collector.listCdpTargets({type:e??void 0,types:n??void 0,targetId:r??void 0,urlPattern:i??void 0,titlePattern:a??void 0,attachedOnly:o,discoverOOPIF:s}),l=this.deps.collector.getAttachedTargetInfo(),u=this.deps.getTabRegistry().getContextMeta(),d=await this.deps.collector.listPages(),f=typeof u.tabIndex==`number`?d[u.tabIndex]:void 0,p=f?.url??null,m=this.safeOrigin(p),h=c.map(e=>{let t=e.url,n=this.safeOrigin(t),r=p!==null&&t===p,i=m!==null&&n!==null&&m===n,a=l?.targetId===e.targetId,o=[];return a&&o.push(`active_target`),r&&o.push(`matches_current_tab_url`),!r&&i&&o.push(`same_origin_as_current_tab`),e.openerId&&l?.targetId===e.openerId&&o.push(`opened_by_active_target`),e.openerId&&!o.includes(`opened_by_active_target`)&&o.push(`has_opener_target`),e.openerFrameId&&o.push(`has_opener_frame`),{...e,isActiveTarget:a,matchesCurrentTabUrl:r,sameOriginAsCurrentTab:i,relationHints:o}});return P.ok().build({count:h.length,activeTarget:l,currentTab:f?{index:f.index,url:f.url,title:f.title}:null,filters:{type:e??null,types:n??null,targetId:r??null,urlPattern:i??null,titlePattern:a??null,attachedOnly:o},targets:h})}catch(t){return e.error(`Failed to list CDP targets:`,t),P.fail(t instanceof Error?t.message:String(t)).build()}}async handleBrowserAttachCdpTarget(t){try{let e=E(t,`targetId`);if(!e)throw Error(`targetId is required`);let n=await this.deps.collector.attachCdpTarget(e),r=await this.syncAttachedPageContext(n);return this.markMonitoringContextChanged(`browser_attach_cdp_target`),P.ok().build({attached:!0,target:n,...r})}catch(t){return e.error(`Failed to attach CDP target:`,t),P.fail(t instanceof Error?t.message:String(t)).build()}}async handleBrowserDetachCdpTarget(t){try{let e=this.deps.collector.getAttachedTargetInfo(),t=await this.deps.collector.detachCdpTarget();return t&&this.markMonitoringContextChanged(`browser_detach_cdp_target`),P.ok().build({detached:t,targetId:e?.targetId??null})}catch(t){return e.error(`Failed to detach CDP target:`,t),P.fail(t instanceof Error?t.message:String(t)).build()}}classifyWorker(e){switch(e){case`service_worker`:return`service_worker`;case`shared_worker`:return`shared_worker`;case`worker`:return`dedicated_worker`;default:return e}}async handleBrowserListWorkers(t){try{let e=E(t,`urlPattern`),n=k(t,`includeServiceWorkers`,!0),r=k(t,`includeDedicatedWorkers`,!0),i=k(t,`includeSharedWorkers`,!0),a=f.filter(e=>e===`service_worker`?n:e===`shared_worker`?i:r);if(a.length===0)return P.fail(`No worker types selected. Enable at least one of includeServiceWorkers / includeDedicatedWorkers / includeSharedWorkers.`).build();let o=(await this.deps.collector.listCdpTargets({types:[...a],urlPattern:e??void 0,discoverOOPIF:!0})).map(e=>({targetId:e.targetId,category:this.classifyWorker(e.type),type:e.type,title:e.title,url:e.url,attached:e.attached,isServiceWorker:e.type===`service_worker`,openerId:e.openerId??null,browserContextId:e.browserContextId??null}));return P.ok().build({count:o.length,filters:{urlPattern:e??null,includeServiceWorkers:n,includeDedicatedWorkers:r,includeSharedWorkers:i},workers:o,_nextStepHint:o.length>0?`Use browser_worker_scripts(targetId="...") to dump a worker's loaded scripts.`:`No worker targets found. Navigate to a PWA / SW-backed page first, then retry.`})}catch(t){return e.error(`Failed to list workers:`,t),P.fail(t instanceof Error?t.message:String(t)).build()}}async handleBrowserWorkerScripts(t){try{let e=E(t,`targetId`);if(!e)return P.fail(`targetId is required. Call browser_list_workers first to obtain a worker targetId.`).build();let n=k(t,`includeSource`,!1),r=D(t,`maxScripts`),i=await this.deps.collector.dumpTargetScripts(e,{includeSource:n,maxScripts:r??void 0});return P.ok().build({...i,_nextStepHint:n?`Scripts include source (capped per WORKER_SCRIPT_SOURCE_MAX_BYTES). Analyze with the analysis domain.`:`Set includeSource=true to dump each script body (source is byte-capped to protect context).`})}catch(t){return e.error(`Failed to dump worker scripts:`,t),P.fail(t instanceof Error?t.message:String(t)).build()}}async handleServiceWorkerDeliverPush(t){try{let e=E(t,`origin`,``),n=E(t,`registrationId`,``),r=E(t,`data`,``);if(!e||!n)return P.fail(`origin and registrationId are required. Call browser_list_workers to find a service worker target, then use ServiceWorker.register to obtain the registrationId.`).build();let i=this.deps.collector.getAttachedTargetSession();return i?(await i.send(`ServiceWorker.enable`),await i.send(`ServiceWorker.deliverPushMessage`,{origin:e,registrationId:n,data:r}),P.ok().build({delivered:!0,scope:`cdp-arg-level`,verified:!1,origin:e,registrationId:n,note:`CDP ServiceWorker.deliverPushMessage was sent with the provided arguments. Behavioral verification (push event firing in the SW) requires a real Chromium instance with a registered service worker and cannot be CI-verified.`})):P.fail(`No attached CDP target session. Call browser_attach_cdp_target on a service worker target first.`).build()}catch(t){return e.error(`Failed to deliver push message:`,t),P.fail(t instanceof Error?t.message:String(t)).build()}}async handleServiceWorkerDispatchSync(t){try{let e=E(t,`origin`,``),n=E(t,`registrationId`,``),r=E(t,`tag`,``),i=k(t,`lastChance`,!1);if(!e||!n)return P.fail(`origin and registrationId are required. Call browser_list_workers to find a service worker target, then use ServiceWorker.register to obtain the registrationId.`).build();let a=this.deps.collector.getAttachedTargetSession();return a?(await a.send(`ServiceWorker.enable`),await a.send(`ServiceWorker.dispatchSyncEvent`,{origin:e,registrationId:n,tag:r,lastChance:i}),P.ok().build({dispatched:!0,scope:`cdp-arg-level`,verified:!1,origin:e,registrationId:n,tag:r,lastChance:i,note:`CDP ServiceWorker.dispatchSyncEvent was sent with the provided arguments. Behavioral verification (sync event firing in the SW) requires a real Chromium instance with a registered service worker and cannot be CI-verified.`})):P.fail(`No attached CDP target session. Call browser_attach_cdp_target on a service worker target first.`).build()}catch(t){return e.error(`Failed to dispatch sync event:`,t),P.fail(t instanceof Error?t.message:String(t)).build()}}},Ue=class{deps;constructor(e){this.deps=e}async handlePageHandleDialog(e){let t=k(e,`accept`,!0),n=E(e,`promptText`),r=k(e,`dismissAll`,!1),i=await this.deps.pageController.handleDialog({accept:t,promptText:n??void 0,dismissAll:r});return P.ok().build(i)}};const We=[`hidden`,`array`,`string`,`object`,`code`,`closure`,`regexp`,`number`,`native`,`synthetic`,`concatenated string`,`sliced string`,`symbol`,`bigint`];function K(e){return typeof e==`object`&&!!e}function Ge(e){return K(e)&&typeof e.createCDPSession==`function`}function Ke(e){return K(e)&&typeof e.chunk==`string`}var qe=class{deps;detailedDataManager;constructor(e){this.deps=e,this.detailedDataManager=b.getInstance()}async handleJSHeapSearch(t){let n=E(t,`pattern`,``)||E(t,`query`,``),r=D(t,`maxResults`,50),i=k(t,`caseSensitive`,!1);return n?re(async()=>{let t=null,a=!1;try{let o=await this.deps.getActivePage();if(!Ge(o))throw Error(`Active page does not support CDP session creation`);t=await o.createCDPSession(),a=!0,e.info(`[js_heap_search] Taking heap snapshot`,{patternLength:n.length,caseSensitive:i,maxResults:r}),await t.send(`HeapProfiler.enable`);let s=[],c=0;t.on(`HeapProfiler.addHeapSnapshotChunk`,e=>{Ke(e)&&(s.push(e.chunk),c+=e.chunk.length)}),await t.send(`HeapProfiler.takeHeapSnapshot`,{reportProgress:!1,treatGlobalObjectsAsRoots:!0,captureNumericValue:!1}),await t.send(`HeapProfiler.disable`),e.info(`[js_heap_search] Snapshot size: ${(c/1024).toFixed(1)} KB`);let l=s.join(``);s.length=0;let u=await this.searchSnapshot(l,n,r,i),d={success:!0,pattern:n,caseSensitive:i,snapshotSizeKB:Math.round(c/1024),matchCount:u.length,truncated:u.length>=r,matches:u,tip:u.length>0?`Use page_evaluate to inspect the objects at the paths found. E.g., eval the objectPath as a JS expression.`:`No matches found. The value may be encrypted, compressed, or stored in a non-string form.`};return P.ok().build(this.detailedDataManager.smartHandle(d,51200))}catch(t){return e.error(`[js_heap_search] Error:`,t),P.fail(t).build()}finally{if(a&&t)try{await t.detach()}catch{}}}):P.fail(`pattern is required`).build()}async searchSnapshot(t,n,r,i){try{let e;try{e=JSON.parse(t)}catch{return[]}if(typeof e!=`object`||!e||Array.isArray(e))return[];let a=e,o=a.strings,s=a.nodes,c=typeof a.snapshot==`object`&&a.snapshot!==null?a.snapshot:null,l=c&&typeof c.meta==`object`&&c.meta!==null?c.meta:null,u=l?.node_fields,d=l?.node_types;if(!Array.isArray(u)||!Array.isArray(o)||!Array.isArray(s))return[];let f=u.length;if(f===0)return[];let p=u.indexOf(`type`),m=u.indexOf(`name`),h=u.indexOf(`id`);if(p<0||m<0)return[];let g=Array.isArray(d)&&Array.isArray(d[0])?d[0]:[],_=i?n:n.toLowerCase(),v=[],y=Math.floor(s.length/f),b=o;for(let e=0;e<y&&v.length<r;e++){e>0&&e%1e3==0&&await new Promise(e=>setImmediate(e));let t=e*f,n=s[t+p],r=s[t+m];if(typeof r!=`number`||r<0||r>=b.length)continue;let a=g[n],o=(typeof a==`string`?a:void 0)??We[n]??`type_${n}`;if(o!==`string`&&o!==`concatenated string`&&o!==`sliced string`)continue;let c=b[r];if(typeof c!=`string`||!(i?c:c.toLowerCase()).includes(_))continue;let l=h>=0?s[t+h]:void 0,u=l===void 0?e:l;v.push({nodeId:u,nodeType:o,value:c.length>200?`${c.slice(0,200)}…`:c,objectPath:`[HeapNode #${u}]`,nameHint:c.slice(0,80)})}return v}catch(t){return e.warn(`[js_heap_search] Snapshot parse error:`,t),[]}}};const Je=new Set([`alias_bind`,`alias_open`,`navigate`,`wait_for`,`context_set`,`context_get`,`transfer`,`list`,`clear`]);function q(e){return typeof e==`object`&&!!e}function Ye(e){return typeof e==`string`&&Je.has(e)}function J(e){return q(e)&&typeof e.goto==`function`&&typeof e.waitForSelector==`function`&&typeof e.evaluate==`function`&&typeof e.url==`function`&&typeof e.title==`function`}function Y(e){return!J(e)||!q(e)?!1:typeof e.context==`function`}function Xe(e){return q(e)&&typeof e.newPage==`function`&&typeof e.pages==`function`}function X(e){return typeof e==`string`&&e.length>0?e:null}function Ze(e){if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e==`string`&&e.trim()!==``){let t=Number(e);if(Number.isFinite(t))return t}return null}function Qe(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:t}var $e=class{deps;constructor(e){this.deps=e}get registry(){return this.deps.getTabRegistry()}async handleTabWorkflow(t){let n=t.action;try{if(!Ye(n))return P.fail(`Unknown action: "${String(n)}". Valid: list, alias_bind, alias_open, navigate, wait_for, context_set, context_get, transfer, clear`).build();switch(n){case`list`:return this.listAliases();case`clear`:return this.clearState();case`alias_bind`:return await this.aliasBind(t);case`alias_open`:return await this.aliasOpen(t);case`navigate`:return await this.navigateAlias(t);case`wait_for`:return await this.waitFor(t);case`context_set`:return this.contextSet(t);case`context_get`:return this.contextGet(t);case`transfer`:return await this.transfer(t)}}catch(r){let i=r instanceof Error?r.message:String(r);return e.error(`[tab_workflow] Action failed`,{action:typeof n==`string`?n:String(n),alias:typeof t.alias==`string`?t.alias:void 0,fromAlias:typeof t.fromAlias==`string`?t.fromAlias:void 0,error:i}),P.fail(i).build()}}listAliases(){let e=this.registry.getCurrentTabInfo(this.deps.getActiveDriver()),t=this.registry.getSharedContextMap();return P.ok().build({aliases:e.aliases,staleAliases:e.staleAliases,currentPageId:e.currentPageId,currentIndex:e.currentIndex,currentUrl:e.url,context:t})}clearState(){return this.registry.clear(),P.ok().build({cleared:!0})}async aliasBind(e){let t=X(e.alias),n=Ze(e.index);if(!t)return P.fail(`alias is required`).build();if(n===null)return P.fail(`index is required`).build();await this.reconcilePages();let r=this.registry.bindAliasByIndex(t,n);return r?P.ok().build({bound:{alias:t,index:n,pageId:r}}):P.fail(`No active page at index ${n}. Use browser_list_tabs to check available pages.`).build()}async aliasOpen(e){let t=X(e.alias),n=X(e.url);if(!t)return P.fail(`alias is required`).build();if(!n)return P.fail(`url is required`).build();if(this.deps.getActiveDriver()===`camoufox`){let e=await this.deps.getCamoufoxPage();if(!Y(e))return P.fail(`Cannot open new tab: camoufox page context not accessible`).build();let r=e.context(),i=await r.newPage();await i.goto(n,{waitUntil:`domcontentloaded`});let a=r.pages().indexOf(i),o=await i.title(),s=this.registry.registerPage(i,{index:a,url:i.url(),title:o});return this.registry.bindAlias(t,s),P.ok().build({alias:t,index:a,pageId:s,url:i.url(),title:o})}let r=await this.getBrowserFromController();if(!r)return P.fail(`Cannot open new tab: browser instance not accessible via PageController`).build();let i=await r.newPage();await i.goto(n,{waitUntil:`domcontentloaded`});let a=(await r.pages()).indexOf(i),o=await i.title(),s=this.registry.registerPage(i,{index:a,url:i.url(),title:o});return this.registry.bindAlias(t,s),P.ok().build({alias:t,index:a,pageId:s,url:i.url(),title:o})}async navigateAlias(e){let t=X(e.alias),n=X(e.url);if(!t)return P.fail(`alias is required`).build();if(!n)return P.fail(`url is required`).build();let r=await this.getPageByAlias(t);return r?(await r.goto(n,{waitUntil:`domcontentloaded`}),P.ok().build({alias:t,navigated:n,currentUrl:r.url()})):P.fail(`No tab found for alias "${t}". Use alias_bind or alias_open first.`).build()}async waitFor(e){let t=X(e.alias),n=X(e.selector),r=X(e.waitForText),i=Qe(e.timeoutMs,1e4);if(!t)return P.fail(`alias is required`).build();if(!n&&!r)return P.fail(`selector or waitForText is required`).build();let a=await this.getPageByAlias(t);if(!a)return P.fail(`No tab found for alias "${t}"`).build();if(n)return await a.waitForSelector(n,{timeout:i}),P.ok().build({alias:t,waitedFor:n,found:!0});let o=r,s=Date.now();for(;Date.now()-s<i;){let e=await a.evaluate(()=>document.body.innerText);if((typeof e==`string`?e:String(e??``)).includes(o))return P.ok().build({alias:t,waitedForText:o,found:!0});await new Promise(e=>setTimeout(e,500))}return P.fail(`Timeout waiting for text "${o}" in tab "${t}"`).build()}contextSet(e){let t=X(e.key),n=e.value;return t?(this.registry.setSharedContext(t,n),P.ok().build({set:{key:t,value:n}})):P.fail(`key is required`).build()}contextGet(e){let t=X(e.key);if(!t)return P.fail(`key is required`).build();let{value:n,found:r}=this.registry.getSharedContext(t);return P.ok().build({key:t,value:n,found:r})}async transfer(e){let t=X(e.fromAlias),n=X(e.key),r=X(e.expression);if(!t)return P.fail(`fromAlias is required`).build();if(!n)return P.fail(`key is required`).build();if(!r)return P.fail(`expression is required`).build();let i=await this.getPageByAlias(t);if(!i)return P.fail(`No tab found for alias "${t}"`).build();let a=await i.evaluate(r);return this.registry.setSharedContext(n,a),P.ok().build({transferred:{fromAlias:t,key:n,value:a}})}async getPageByAlias(e){let t=this.registry.resolveAlias(e);if(!t)return null;let n=this.registry.getPageById(t);if(n&&J(n))return n;await this.reconcilePages();let r=this.registry.getPageById(t);return r&&J(r)?r:null}async reconcilePages(){if(this.deps.getActiveDriver()===`camoufox`){let e=await this.deps.getCamoufoxPage();if(Y(e)){let t=e.context().pages(),n=await Promise.all(t.map(async(e,t)=>({index:t,url:e.url(),title:await e.title()})));this.registry.reconcilePages(t,n)}return}let e=await this.getBrowserFromController();if(!e)return;let t=await e.pages(),n=await Promise.all(t.map(async(e,t)=>({index:t,url:e.url(),title:await e.title()})));this.registry.reconcilePages(t,n)}async getBrowserFromController(){let e=this.deps.getPageController();if(!q(e)||typeof e.getBrowser!=`function`)return null;let t=await e.getBrowser();return Xe(t)?t:null}};const et=new Set([`none`,`outside-only`,`dangerously`]),tt=new Set([`get`,`set`,`clear`]),nt=10*1024*1024,Z=600*1e3;var rt=class{sessions=new Map;createSessionId(){return fe()}scheduleExpiry(t){let n=setTimeout(()=>{e.debug(`JSDOM session ${t} expired after ${Z}ms`),this.closeSession(t)},Z);return n.unref?.(),n}refreshSessionExpiry(e,t){clearTimeout(t.timer),t.timer=this.scheduleExpiry(e)}getSession(e){let t=this.sessions.get(e);if(!t)throw Error(`JSDOM session not found or expired: ${e}`);return this.refreshSessionExpiry(e,t),t}closeSession(t){let n=this.sessions.get(t);if(n){clearTimeout(n.timer);try{n.dom.window.close()}catch(t){e.debug(`JSDOM window close error: ${String(t)}`)}this.sessions.delete(t)}}closeAll(){for(let e of Array.from(this.sessions.keys()))this.closeSession(e)}async handleJsdomParse(e){try{let t=M(e,`html`);if(Buffer.byteLength(t,`utf8`)>nt)return P.fail(`HTML input exceeds ${nt/1024/1024}MB limit. Provide smaller HTML or use a URL.`).build();let n=E(e,`url`,`about:blank`),r=E(e,`contentType`,`text/html`),i=A(e,`runScripts`,et,`none`),a=k(e,`includeNodeLocations`,!1),o=k(e,`pretendToBeVisual`,!1),s=E(e,`referrer`,``),c=D(e,`storageQuotaBytes`,1e6);if(this.sessions.size>=5)return P.fail(`JSDOM session limit reached (5). Close existing sessions first with browser_jsdom_serialize + drop.`).build();let l={url:n,contentType:r,includeNodeLocations:a,pretendToBeVisual:o,storageQuota:c};i!==`none`&&(l.runScripts=i),s&&(l.referrer=s);let{JSDOM:u}=await import(`jsdom`),d=new u(t,l),f=this.createSessionId(),p={dom:d,url:n,runScripts:i,includeNodeLocations:a,createdAt:Date.now(),timer:this.scheduleExpiry(f)};this.sessions.set(f,p);let m=d.window.document;return P.ok().set(`sessionId`,f).set(`title`,m.title||``).set(`url`,n).set(`contentType`,r).set(`runScripts`,i).set(`ttlMs`,Z).set(`activeSessions`,this.sessions.size).set(`stats`,{elements:m.getElementsByTagName(`*`).length,scripts:m.getElementsByTagName(`script`).length,links:m.getElementsByTagName(`a`).length,images:m.getElementsByTagName(`img`).length,stylesheets:m.querySelectorAll(`link[rel="stylesheet"], style`).length}).build()}catch(e){return P.fail(e).build()}}async handleJsdomQuery(e){try{let t=M(e,`sessionId`),n=M(e,`selector`),r=D(e,`maxResults`,50),i=k(e,`includeHtml`,!1),a=k(e,`includeText`,!0),o=k(e,`includeLocation`,!1),s=O(e,`attributes`),c=this.getSession(t),l=c.dom.window.document,u=Array.from(l.querySelectorAll(n)),d=u.slice(0,r).map(e=>{let t={tag:e.tagName.toLowerCase()};if(s.length>0){let n={};for(let t of s)n[t]=e.getAttribute(t);t.attributes=n}else{let n={};for(let t of Array.from(e.attributes))n[t.name]=t.value;t.attributes=n}if(a&&(t.text=(e.textContent??``).trim()),i&&(t.html=e.outerHTML),o&&c.includeNodeLocations)try{t.location=c.dom.nodeLocation(e)??null}catch{t.location=null}return t});return P.ok().set(`sessionId`,t).set(`selector`,n).set(`matched`,u.length).set(`returned`,d.length).set(`results`,d).build()}catch(e){return P.fail(e).build()}}async handleJsdomExecute(e){try{let t=M(e,`sessionId`),n=M(e,`code`),r=D(e,`timeoutMs`,5e3),i=this.getSession(t);if(i.runScripts===`none`)return P.fail(`JSDOM session was created with runScripts="none". Re-parse with runScripts="outside-only" or "dangerously" to execute code.`).build();let a=await this.executeInSandbox(i,n,r);return a.ok?P.ok().set(`sessionId`,t).set(`result`,a.output).set(`consoleLogs`,a.logs.map(e=>({level:`log`,args:[e]}))).set(`timeoutHintMs`,r).set(`durationMs`,a.durationMs).build():P.fail(a.error??`Execution failed`).set(`consoleLogs`,a.logs.map(e=>({level:`log`,args:[e]}))).set(`timedOut`,a.timedOut).build()}catch(e){return P.fail(e).build()}}async executeInSandbox(e,t,n){let{QuickJSSandbox:r}=await import(`./QuickJSSandbox-CIde-jzG.mjs`).then(e=>e.n),i=new r,a=this.extractDOMGlobals(e);return await i.execute(t,{timeoutMs:n,globals:a})}extractDOMGlobals(e){let t=e.dom.window,n=t.document;return{document:{title:n.title,URL:n.URL,domain:n.domain,documentElement:{tagName:n.documentElement?.tagName,innerHTML:n.documentElement?.innerHTML}},window:{location:{href:t.location.href,protocol:t.location.protocol,host:t.location.host,hostname:t.location.hostname,port:t.location.port,pathname:t.location.pathname,search:t.location.search,hash:t.location.hash},navigator:{userAgent:t.navigator.userAgent,language:t.navigator.language,platform:t.navigator.platform}}}}async handleJsdomSerialize(e){try{let t=M(e,`sessionId`),n=k(e,`pretty`,!1),r=E(e,`selector`,``),i=this.getSession(t),a;if(r){let e=i.dom.window.document.querySelector(r);if(!e)return P.fail(`No element matches selector: ${r}`).build();a=e.outerHTML}else a=i.dom.serialize();return n&&(a=ot(a)),P.ok().set(`sessionId`,t).set(`bytes`,Buffer.byteLength(a,`utf8`)).set(`pretty`,n).set(`html`,a).build()}catch(e){return P.fail(e).build()}}async handleJsdomCookies(e){try{let t=M(e,`sessionId`),n=A(e,`action`,tt,`get`),r=this.getSession(t),i=r.dom.cookieJar,a=E(e,`url`,r.url);if(n===`get`){let e=await i.getCookies(a);return P.ok().set(`sessionId`,t).set(`url`,a).set(`cookies`,e.map(it)).build()}if(n===`set`){let n=j(e,`cookie`);if(!n)return P.fail(`cookie object required for action="set"`).build();let r=typeof n.raw==`string`?n.raw:at(n);return await i.setCookie(r,a),P.ok().set(`sessionId`,t).set(`action`,`set`).set(`cookie`,r).build()}let o=i.store;return o&&typeof o.removeAllCookies==`function`&&await new Promise((e,t)=>o.removeAllCookies(n=>n?t(n):e())),P.ok().set(`sessionId`,t).set(`action`,`clear`).build()}catch(e){return P.fail(e).build()}}};function it(e){return{key:e.key??``,value:e.value??``,domain:e.domain??null,path:e.path??null,expires:e.expires instanceof Date?e.expires.toISOString():e.expires??null,httpOnly:e.httpOnly===!0,secure:e.secure===!0,sameSite:e.sameSite??null}}function at(e){let t=String(e.name??e.key??``),n=String(e.value??``);if(!t)throw Error(`cookie.name (or cookie.key) is required`);let r=[`${t}=${n}`];return typeof e.domain==`string`&&r.push(`Domain=${e.domain}`),typeof e.path==`string`&&r.push(`Path=${e.path}`),typeof e.expires==`string`&&r.push(`Expires=${e.expires}`),typeof e.maxAge==`number`&&r.push(`Max-Age=${e.maxAge}`),e.secure===!0&&r.push(`Secure`),e.httpOnly===!0&&r.push(`HttpOnly`),typeof e.sameSite==`string`&&r.push(`SameSite=${e.sameSite}`),r.join(`; `)}function ot(e){return e.replace(/>(?=<)/g,`>
|
|
28
|
+
`)}function st(e){let t={getActiveDriver:e.getActiveDriver,getCamoufoxPage:e.getCamoufoxPage},n=new ee,r=e.getTabRegistry??(()=>n),i=new He({collector:e.collector,consoleMonitor:e.consoleMonitor,getTabRegistry:r});return{tabRegistry:n,targetControl:i,browserControl:new ve({collector:e.collector,pageController:e.pageController,consoleMonitor:e.consoleMonitor,getActiveDriver:e.getActiveDriver,getCamoufoxManager:e.getCamoufoxManager,getCamoufoxPage:e.getCamoufoxPage,getTabRegistry:r,clearAttachedTargetContext:e=>i.clearAttachedTargetContext(e),onBrowserAttachStateChanged:e.onBrowserAttachStateChanged}),camoufoxBrowser:new xe({getCamoufoxManager:e.getCamoufoxManager,setCamoufoxManager:e.setCamoufoxManager,closeCamoufox:e.closeCamoufox}),pageNavigation:new Ce({pageController:e.pageController,consoleMonitor:e.consoleMonitor,getTabRegistry:r,eventBus:e.eventBus,onBrowserAttachStateChanged:e.onBrowserAttachStateChanged,...t}),pageInteraction:new we({pageController:e.pageController,...t}),pageEvaluation:new De({pageController:e.pageController,detailedDataManager:e.detailedDataManager,...t}),targetEvaluation:new Ve({pageController:e.pageController,detailedDataManager:e.detailedDataManager}),pageData:new ke({pageController:e.pageController,...t}),pageDialog:new Ue({pageController:e.pageController}),consoleHandlers:new Ae({consoleMonitor:e.consoleMonitor,detailedDataManager:e.detailedDataManager}),scriptManagement:new je({scriptManager:e.scriptManager,detailedDataManager:e.detailedDataManager}),captchaHandlers:new Me({pageController:e.pageController,captchaDetector:e.captchaDetector,autoDetectCaptcha:e.getAutoDetectCaptcha(),autoSwitchHeadless:e.getAutoSwitchHeadless(),captchaTimeout:e.getCaptchaTimeout(),setAutoDetectCaptcha:e.setAutoDetectCaptcha,setAutoSwitchHeadless:e.setAutoSwitchHeadless,setCaptchaTimeout:e.setCaptchaTimeout}),stealthInjection:new Ie({pageController:e.pageController,...t}),frameworkState:new Re({getActivePage:()=>e.collector.getActivePage()}),indexedDBDump:new ze({getActivePage:()=>e.collector.getActivePage()}),jsHeapSearch:new qe({getActivePage:()=>e.collector.getActivePage(),getActiveDriver:e.getActiveDriver}),tabWorkflow:new $e({getActiveDriver:e.getActiveDriver,getCamoufoxPage:e.getCamoufoxPage,getPageController:()=>e.pageController,getTabRegistry:r}),detailedData:new Be({detailedDataManager:e.detailedDataManager}),jsdomHandlers:new rt}}function ct(e,t,n,r,i){let a=1-i,o=a*a,s=o*a,c=i*i,l=c*i;return{x:s*e.x+3*o*i*t.x+3*a*c*n.x+l*r.x,y:s*e.y+3*o*i*t.y+3*a*c*n.y+l*r.y}}function lt(e,t){let n=t.x-e.x,r=t.y-e.y,i=-r,a=n,o=Math.sqrt(i*i+a*a)||1,s=(Math.random()-.5)*.4,c=(Math.random()-.5)*.4;return[{x:e.x+n*.3+i/o*Math.abs(n+r)*s,y:e.y+r*.3+a/o*Math.abs(n+r)*s},{x:e.x+n*.7+i/o*Math.abs(n+r)*c,y:e.y+r*.7+a/o*Math.abs(n+r)*c}]}function ut(e,t){switch(t){case`linear`:return e;case`ease-in`:return e*e;case`ease-out`:return 1-(1-e)*(1-e);default:return e<.5?2*e*e:1-(-2*e+2)**2/2}}function Q(e){return new Promise(t=>setTimeout(t,e))}function dt(e){let t=E(e,`frameUrl`),n=E(e,`frameSelector`);if(!(!t&&!n))return{frameUrl:t||void 0,frameSelector:n||void 0}}async function ft(e,t,n){let r=await e.getActivePage();if(!r)return null;if(!n?.frameUrl&&!n?.frameSelector)return{page:r,context:r};if(!t)throw Error(`frameUrl/frameSelector requires PageController`);return{page:r,context:await t.resolveFrame(r,n)}}async function pt(e,t,n){if(t===e||typeof t.frameElement!=`function`)return n;let r=await t.frameElement(),i=r&&typeof r.boundingBox==`function`?await r.boundingBox():null;return i?{x:i.x+n.x,y:i.y+n.y}:n}async function mt(e,t,n){return N(async()=>{let r=dt(e),i=await ft(t,n,r);if(!i)throw Error(`No active page. Use browser_launch or browser_attach first.`);let{page:a,context:o}=i,s=D(e,`toX`),c=D(e,`toY`),l=E(e,`selector`);if(l){let e=await o.evaluate(e=>{let t=document.querySelector(e);if(!t)return null;let n=t.getBoundingClientRect();return{x:n.x+n.width/2,y:n.y+n.height/2}},l);if(!e)throw Error(`Selector not found: ${l}`);let t=await pt(a,o,e);s=t.x,c=t.y}if(s===void 0||c===void 0)throw Error(`Either selector or toX/toY coordinates are required`);let u=D(e,`fromX`,0),d=D(e,`fromY`,0),f=Math.max(1,Math.min(D(e,`steps`,24),500)),p=Math.max(10,Math.min(D(e,`durationMs`,600),3e4)),m=Math.max(0,Math.min(D(e,`jitterPx`,1.5),20)),h=E(e,`curve`,`ease`),g=k(e,`click`,!1),_={x:u,y:d},v={x:s,y:c},[y,b]=lt(_,v),x=p/f;for(let e=0;e<=f;e++){let t=ct(_,y,b,v,ut(e/f,h));e>0&&e<f&&(t.x+=(Math.random()-.5)*2*m,t.y+=(Math.random()-.5)*2*m),t.x=Math.max(0,t.x),t.y=Math.max(0,t.y),await a.mouse.move(t.x,t.y),await Q(x*(.8+Math.random()*.4))}return g&&await a.mouse.click(s,c),{from:{x:u,y:d},to:{x:s,y:c},steps:f,durationMs:p,clicked:g,...r?{frame:r}:{}}})}async function ht(e,t){return N(async()=>{let n=await t.getActivePage();if(!n)throw Error(`No active page.`);let r=Math.max(1,Math.min(D(e,`distance`,500),1e4)),i=E(e,`direction`,`down`),a=Math.max(10,Math.min(D(e,`durationMs`,1500),3e4)),o=Math.max(1,Math.min(D(e,`segments`,8),200)),s=typeof e.pauseMs==`number`&&Number.isFinite(e.pauseMs)?Math.max(0,Math.min(D(e,`pauseMs`,80),5e3)):Math.max(0,Math.min(Math.round(a/o),5e3)),c=Math.max(0,Math.min(D(e,`jitter`,.3),1)),l=E(e,`selector`),u=i===`up`||i===`down`,d=i===`down`||i===`right`?1:-1,f=0;for(let e=0;e<o;e++){let t=1-e/o*.4,i=r/o*t*(1+(Math.random()-.5)*c*2),a=Math.min(i,r-f);if(a<=0)break;let p=u?0:a*d,m=u?a*d:0;l?await n.evaluate((e,t,n)=>{let r=document.querySelector(e);r&&r.scrollBy({left:t,top:n,behavior:`auto`})},l,p,m):await n.evaluate((e,t)=>window.scrollBy({left:e,top:t,behavior:`auto`}),p,m),f+=a,await Q(s*(.5+Math.random()))}return{direction:i,requestedDistance:r,actualScrolled:Math.round(f),durationMs:a,pauseMs:s,segments:o}})}async function gt(e,t,n){return N(async()=>{let r=dt(e),i=await ft(t,n,r);if(!i)throw Error(`No active page.`);let{page:a,context:o}=i,s=E(e,`selector`,``),c=E(e,`text`,``),l=Math.max(10,Math.min(D(e,`wpm`,90),300)),u=Math.max(0,Math.min(D(e,`errorRate`,.02),.3)),d=Math.max(50,Math.min(D(e,`correctDelayMs`,200),2e3)),f=k(e,`clearFirst`,!1);if(!s||!c)throw Error(`selector and text are required`);let p=6e4/(l*5);await o.click(s),f&&await o.evaluate(e=>{let t=document.querySelector(e);t&&(t.value=``)},s);let m=0;for(let e of c){if(Math.random()<u&&e!==` `){let t=String.fromCharCode(e.charCodeAt(0)+(Math.random()>.5?1:-1));await a.keyboard.type(t,{delay:0}),await Q(d*(.5+Math.random())),await a.keyboard.press(`Backspace`),await Q(50+Math.random()*50),m++}await a.keyboard.type(e,{delay:0});let t=p*(.5+Math.random());(e===` `||`.,:;!?`.includes(e))&&(t*=1.5+Math.random()*.5),await Q(t)}return{selector:s,length:c.length,wpm:l,typosSimulated:m,errorRate:u,...r?{frame:r}:{}}})}function _t(e){return new Promise(t=>setTimeout(t,e))}function vt(e){let t=typeof e==`string`?e.toLowerCase():``;return t===`hook`?`hook`:t===`external_service`||t===`2captcha`||t===`anticaptcha`||t===`capsolver`?`external_service`:`manual`}function yt(e){let t=typeof e==`string`?e.toLowerCase():``;return t===`image`?`image`:t===`widget`||t===`recaptcha_v2`||t===`recaptcha_v3`||t===`hcaptcha`||t===`funcaptcha`||t===`turnstile`?`widget`:t===`browser_check`||t===`managed_widget`?`browser_check`:`image`}function bt(e){let t=typeof e==`string`?e.toLowerCase():``;if(t===`image`||t===`recaptcha_v2`||t===`recaptcha_v3`||t===`hcaptcha`||t===`funcaptcha`||t===`turnstile`)return t}function xt(e,t){return bt(e)||(t===`image`?`image`:`recaptcha_v2`)}function St(e){return e!==`image`}function Ct(e){if(!(typeof e!=`string`||!e.trim()))return e.trim().toLowerCase()}function wt(e){let t=Ct(e.provider),n=(process.env.CAPTCHA_PROVIDER||``).trim().toLowerCase();return t||n||`2captcha`}function Tt(e){return e===`2captcha`?process.env.CAPTCHA_SOLVER_BASE_URL?.trim()||process.env.CAPTCHA_2CAPTCHA_BASE_URL?.trim()||u:e===`anticaptcha`?process.env.CAPTCHA_ANTICAPTCHA_BASE_URL?.trim()||``:e===`capsolver`&&process.env.CAPTCHA_CAPSOLVER_BASE_URL?.trim()||``}function Et(e,t){return e===`anticaptcha`?t===`recaptcha_v2`?`RecaptchaV2TaskProxyless`:t===`hcaptcha`?`HCaptchaTaskProxyless`:t===`turnstile`?`TurnstileTaskProxyless`:`ImageToTextTask`:e===`capsolver`?t===`recaptcha_v2`?`ReCaptchaV2TaskProxyLess`:t===`hcaptcha`?`HCaptchaTaskProxyLess`:t===`turnstile`?`AntiTurnstileTaskProxyLess`:`ImageToTextTask`:``}async function Dt(e,n,r,i){let a=Date.now(),o=Tt(e);if(!o)throw Error(`${e} base URL is not configured.`);let c=Et(e,r.taskKind),l=r.taskKind===`image`?{type:c,body:r.imageBase64}:{type:c,websiteURL:r.pageUrl,websiteKey:r.siteKey},u=await(await fetch(`${o}/createTask`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({clientKey:n,task:l}),signal:AbortSignal.timeout(t)})).json();if(u.errorId&&u.errorId!==0)throw Error(`${e} createTask failed: ${String(u.errorCode??u.errorDescription??JSON.stringify(u))}`);let d=u.taskId;if(typeof d!=`number`&&typeof d!=`string`)throw Error(`${e} createTask did not return a taskId.`);for(;;){let t=i-(Date.now()-a);if(t<=0||(await _t(Math.min(s,t)),Date.now()-a>=i))break;let c=await(await fetch(`${o}/getTaskResult`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({clientKey:n,taskId:d}),signal:AbortSignal.timeout(p)})).json();if(c.errorId&&c.errorId!==0)throw Error(`${e} getTaskResult failed: ${String(c.errorCode??c.errorDescription??JSON.stringify(c))}`);if(c.status===`processing`||c.status===`idle`)continue;if(c.status!==`ready`)throw Error(`${e} returned unexpected status: ${String(c.status)}`);let l=typeof c.solution==`object`&&c.solution!==null?c.solution:null,u=typeof l?.gRecaptchaResponse==`string`?l.gRecaptchaResponse:typeof l?.token==`string`?l.token:typeof l?.text==`string`?l.text:``;if(!u)throw Error(`${e} returned ready without a usable solution token.`);return{token:u,challengeType:r.taskKind===`image`?`image`:`widget`,mode:`external_service`,durationMs:Date.now()-a}}throw Error(`${e} solve timeout after ${i}ms`)}async function Ot(e){if(typeof e.screenshot==`function`)return(await e.screenshot({type:`png`})).toString(`base64`);throw Error(`Could not capture image CAPTCHA payload from the current page.`)}function kt(e){if(typeof e!=`string`)return;let t=e.trim();if(t){if(t.startsWith(`data:`)){let e=t.indexOf(`,`);return e>=0?t.slice(e+1):void 0}return t}}function At(e){return{enabled:k(e,`injectToken`,!0),responseSelector:E(e,`responseSelector`,``).trim()||void 0,callbackName:E(e,`callbackName`,``).trim()||void 0}}async function jt(e,t,n){await e.evaluate((e,t)=>{let{responseSelector:n,callbackName:r}=t;if(n){let t=document.querySelector(n);t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement||t instanceof HTMLSelectElement?(t.value=e,t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0}))):t instanceof HTMLElement&&(t.setAttribute(`data-captcha-token`,e),t.dispatchEvent(new CustomEvent(`captcha-token`,{detail:e})))}if(r){let t=window[r];typeof t==`function`&&t(e)}},t,n)}async function Mt(e,n,r){let i=Date.now(),a=Tt(`2captcha`);if(!a)throw Error(`CAPTCHA_SOLVER_BASE_URL must be configured before using external_service mode.`);let o={key:e,json:1};n.taskKind===`turnstile`||n.taskKind===`recaptcha_v2`||n.taskKind===`hcaptcha`?(o.method=n.taskKind===`turnstile`?`turnstile`:n.taskKind===`hcaptcha`?`hcaptcha`:`userrecaptcha`,o.sitekey=n.siteKey,o.pageurl=n.pageUrl):(o.method=`base64`,o.body=n.imageBase64);let c=await(await fetch(`${a}/in.php`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(o),signal:AbortSignal.timeout(t)})).json();if(c.status!==1)throw Error(`2captcha submit failed: ${JSON.stringify(c)}`);let l=c.request,u=s;for(;;){let t=r-(Date.now()-i);if(t<=0||(await _t(Math.min(u,t)),Date.now()-i>=r))break;let o=new URL(`${a}/res.php`);o.searchParams.set(`key`,e),o.searchParams.set(`action`,`get`),o.searchParams.set(`id`,l),o.searchParams.set(`json`,`1`);let s=await(await fetch(o.toString(),{signal:AbortSignal.timeout(p)})).json();if(s.status===1)return{token:s.request,challengeType:n.taskKind===`image`?`image`:`widget`,mode:`external_service`,durationMs:Date.now()-i};if(s.request!==`CAPCHA_NOT_READY`)throw Error(`2captcha solve failed: ${JSON.stringify(s)}`)}throw Error(`2captcha solve timeout after ${r}ms`)}async function Nt(t,s){let c=await s.getActivePage();if(!c)return P.fail(`No active page.`).build();let l=vt(t.mode??t.provider??process.env.CAPTCHA_PROVIDER),u=wt(t),d=E(t,`apiKey`,``)||process.env.CAPTCHA_API_KEY||``,f=yt(t.challengeType??t.typeHint),p=xt(t.taskKind,f),m=Math.min(Math.max(D(t,`timeoutMs`,o),i),r),h=Math.min(Math.max(D(t,`maxRetries`,a),0),n),g=f,_=E(t,`siteKey`),v=E(t,`pageUrl`,``)||c.url();if(St(p)&&!_)return P.fail(`Widget solving requires an explicit siteKey.`).build();if(l===`manual`)return P.ok().build({mode:`manual`,challengeType:g,siteKey:_??null,instruction:`Please solve the CAPTCHA manually in the browser, then continue.`,hint:`Configure an external solver service and CAPTCHA_API_KEY to automate this flow.`});if(!d)return P.fail(`External solver credentials are required. Set CAPTCHA_API_KEY.`).build();if(![`2captcha`,`anticaptcha`,`capsolver`].includes(u))return P.fail(`Unsupported external solver service.`).build();let y=null;for(let n=0;n<=h;n++)try{let e=p===`image`?kt(t.imageBase64)??await Ot(c):void 0,r=u===`2captcha`?await Mt(d,{taskKind:p,siteKey:_,pageUrl:v,imageBase64:e},m):await Dt(u,d,{taskKind:p,siteKey:_,pageUrl:v,imageBase64:e},m);return P.ok().build({token:r.token,challengeType:r.challengeType,mode:r.mode,durationMs:r.durationMs,attempt:n+1})}catch(t){y=t instanceof Error?t:Error(String(t)),e.warn(`[captcha] Attempt ${n+1} failed: ${y.message}`)}return P.fail(y??Error(`All attempts failed`)).merge({challengeType:g,mode:l,maxRetries:h,suggestion:`Try manual mode or adjust the external solver configuration.`}).build()}async function Pt(e,t){let n=await t.getActivePage();if(!n)return P.fail(`No active page.`).build();let r=vt(e.mode??e.provider??process.env.CAPTCHA_PROVIDER),i=wt(e),a=E(e,`apiKey`,``)||process.env.CAPTCHA_API_KEY||``,o=Math.min(Math.max(D(e,`timeoutMs`,12e4),5e3),6e5),s=At(e),c=xt(e.taskKind,`widget`),l=E(e,`siteKey`),u=E(e,`pageUrl`,``)||n.url();if(r===`hook`){if(!l)return P.fail(`Widget solving requires an explicit siteKey.`).build();let t=Math.min(o,3e4),r=E(e,`callbackName`,``).trim();if(!r)return P.fail(`Hook mode requires an explicit callbackName.`).build();let i=await n.evaluate((e,t)=>new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`Hook timeout`)),e),a=window[t];if(typeof a==`function`){let e=a;window[t]=t=>(clearTimeout(i),n(t),e(t))}else clearTimeout(i),r(Error(`The requested callbackName is not a callable function.`))}),t,r).catch(()=>null);if(i)return P.ok().build({token:i,method:`hook`,challengeType:`widget`,siteKey:l,callbackName:r})}if(r===`manual`)return P.ok().build({mode:`manual`,challengeType:`widget`,siteKey:l||null,pageUrl:u,instruction:`Please complete the widget challenge manually.`});if(!l)return P.fail(`Widget solving requires an explicit siteKey.`).build();if(!a)return P.fail(`External solver credentials are required.`).build();try{let e=i===`2captcha`?await Mt(a,{taskKind:c,siteKey:l,pageUrl:u},o):i===`anticaptcha`||i===`capsolver`?await Dt(i,a,{taskKind:c,siteKey:l,pageUrl:u},o):(()=>{throw Error(`Unsupported external solver service.`)})();return s.enabled&&e.token&&await jt(n,e.token,{responseSelector:s.responseSelector,callbackName:s.callbackName}),P.ok().build({token:e.token,challengeType:e.challengeType,siteKey:l,mode:e.mode,durationMs:e.durationMs,taskKind:c,injected:s.enabled,responseSelector:s.responseSelector??null,callbackName:s.callbackName??null})}catch(e){return P.fail(e).merge({siteKey:l,mode:r,suggestion:`Try manual mode or hook mode.`}).build()}}function $(){return(process.env.CAPTCHA_PROVIDER||``).trim().toLowerCase()||`manual`}function Ft(){return process.env.CAPTCHA_SOLVER_BASE_URL?.trim()||process.env.CAPTCHA_2CAPTCHA_BASE_URL?.trim()||``}function It(e){return e===`2captcha`?Ft():e===`anticaptcha`?process.env.CAPTCHA_ANTICAPTCHA_BASE_URL?.trim()||``:process.env.CAPTCHA_CAPSOLVER_BASE_URL?.trim()||``}function Lt(){let e=$(),t=It(`2captcha`),n=!!process.env.CAPTCHA_API_KEY?.trim(),r=t.length>0,i=n&&r;return{capability:`captcha_external_service_2captcha`,status:i?`available`:`unavailable`,reason:i?void 0:`The 2captcha-compatible external path needs both CAPTCHA_API_KEY and CAPTCHA_SOLVER_BASE_URL.`,fix:i?void 0:`Set CAPTCHA_API_KEY and CAPTCHA_SOLVER_BASE_URL to enable external_service mode.`,details:{tools:[`captcha_vision_solve`,`widget_challenge_solve`],configuredProvider:e,defaultExternalProviderSupported:e===`2captcha`,apiKeyConfigured:n,baseUrlConfigured:r,...r?{baseUrl:t}:{}}}}function Rt(e){let t=$(),n=It(e),r=!!process.env.CAPTCHA_API_KEY?.trim(),i=r&&n.length>0;return{capability:`captcha_external_service_${e}`,status:i?`available`:`unavailable`,reason:i?void 0:`${e} requires CAPTCHA_API_KEY and a reachable API base URL.`,fix:i?void 0:`Set CAPTCHA_API_KEY and ${e===`anticaptcha`?`CAPTCHA_ANTICAPTCHA_BASE_URL`:`CAPTCHA_CAPSOLVER_BASE_URL`}.`,details:{tools:[`captcha_vision_solve`,`widget_challenge_solve`],configuredProvider:t,defaultExternalProviderSupported:t===e,apiKeyConfigured:r,baseUrlConfigured:n.length>0,baseUrl:n}}}async function zt(e){let t;try{t=await e.getActivePage()}catch(e){return{capability:`captcha_widget_hook_current_page`,status:`unknown`,reason:`Current page availability check failed: ${e instanceof Error?e.message:String(e)}`,fix:`Attach or launch a browser page before using hook mode.`,details:{tools:[`widget_challenge_solve`],pageAttached:!1}}}return t?{capability:`captcha_widget_hook_current_page`,status:`available`,reason:`Hook mode is available when the caller provides an explicit callbackName.`,details:{tools:[`widget_challenge_solve`],pageAttached:!0,requiresExplicitCallbackName:!0,requiresExplicitSiteKey:!0}}:{capability:`captcha_widget_hook_current_page`,status:`unknown`,reason:`No active page is attached.`,fix:`Attach or launch a browser page before using hook mode.`,details:{tools:[`widget_challenge_solve`],pageAttached:!1}}}async function Bt(e){let t=$(),n=await zt(e);return P.raw(oe(`captcha_solver_capabilities`,[{capability:`captcha_manual`,status:`available`,details:{tools:[`captcha_vision_solve`,`widget_challenge_solve`]}},Lt(),Rt(`anticaptcha`),Rt(`capsolver`),n],{configuredProvider:t}))}function Vt(e){let t=O(e,`addons`),n=O(e,`excludeAddons`),r=O(e,`fonts`);return{headless:k(e,`headless`,!0),os:E(e,`os`,`windows`),geoip:k(e,`geoip`,!1),humanize:k(e,`humanize`,!1),proxy:E(e,`proxy`)||void 0,blockImages:k(e,`blockImages`,!1),blockWebrtc:k(e,`blockWebrtc`,!1),blockWebgl:k(e,`blockWebgl`,!1),locale:E(e,`locale`)||void 0,addons:t.length>0?t:void 0,fonts:r.length>0?r:void 0,excludeAddons:n.length>0?n:void 0,customFontsOnly:k(e,`customFontsOnly`,!1),screen:e.screen,window:e.window,fingerprint:j(e,`fingerprint`),webglConfig:j(e,`webglConfig`),firefoxUserPrefs:j(e,`firefoxUserPrefs`),mainWorldEval:k(e,`mainWorldEval`,!0),enableCache:k(e,`enableCache`,!1)}}async function Ht(e,t){return N(async()=>{let n=Vt(t);if(E(t,`mode`,`launch`)===`connect`){let r=E(t,`wsEndpoint`);if(!r)throw Error(`wsEndpoint is required for connect mode.`);let i=new T(n);return await i.connectToServer(r),e.setCamoufoxManager(i),e.setActiveDriver(`camoufox`),e.clearCamoufoxPage(),{driver:`camoufox`,mode:`connect`,wsEndpoint:r,message:`Connected to Camoufox server.`}}let r=new T(n);return await r.launch(),e.setCamoufoxManager(r),e.setActiveDriver(`camoufox`),e.clearCamoufoxPage(),{driver:`camoufox`,mode:`launch`,config:{os:n.os,headless:n.headless,geoip:n.geoip,humanize:n.humanize,locale:n.locale,blockWebgl:n.blockWebgl,blockImages:n.blockImages,blockWebrtc:n.blockWebrtc},message:`Camoufox (Firefox) browser launched`}})}async function Ut(e,t){return N(async()=>{let n=E(t,`url`,``),r=L(t),i=D(t,`timeout`),a=await e.getCamoufoxPage();return await a.goto(n,{waitUntil:r,timeout:i}),e.setConsoleMonitorPage(a),{driver:`camoufox`,url:a.url(),title:await a.title()}})}const Wt=new Set([`page_navigate`,`page_click`,`page_type`,`page_hover`,`page_scroll`,`page_press_key`,`page_select`,`page_upload_files`,`page_wait_for_selector`]);var Gt=class{collector;pageController;scriptManager;consoleMonitor;captchaDetector;detailedDataManager;camoufoxManager=null;activeDriver=`chrome`;camoufoxPage=null;autoDetectCaptcha=!0;autoSwitchHeadless=!0;captchaTimeout=3e5;browserControl;targetControl;camoufoxBrowser;pageNavigation;pageInteraction;pageEvaluation;targetEvaluation;pageDialog;pageData;consoleHandlers;scriptManagement;captchaHandlers;stealthInjection;frameworkState;indexedDBDump;jsHeapSearch;tabWorkflow;detailedData;jsdomHandlers;tabRegistry;eventBus;getCurrentSessionId;sessionCoordinator;onBrowserAttachStateChanged;codegenStopListening;codegenSteps=[];constructor(e,t,n,r,i,a,o,s){this.collector=e,this.pageController=t,this.scriptManager=n,this.consoleMonitor=r,this.eventBus=i,this.getCurrentSessionId=a,this.sessionCoordinator=o,this.onBrowserAttachStateChanged=s;let c=v(h().paths.captchaScreenshotDir,`screenshots/captcha`);this.captchaDetector=new C(c),this.detailedDataManager=b.getInstance();let l=st({collector:this.collector,pageController:this.pageController,scriptManager:this.scriptManager,consoleMonitor:this.consoleMonitor,eventBus:i,captchaDetector:this.captchaDetector,detailedDataManager:this.detailedDataManager,getActiveDriver:()=>this.activeDriver,getCamoufoxPage:()=>this.getCamoufoxPage(),getCamoufoxManager:()=>this.camoufoxManager,setCamoufoxManager:e=>{this.camoufoxManager=e},closeCamoufox:()=>this.closeCamoufox(),getAutoDetectCaptcha:()=>this.autoDetectCaptcha,getAutoSwitchHeadless:()=>this.autoSwitchHeadless,getCaptchaTimeout:()=>this.captchaTimeout,setAutoDetectCaptcha:e=>{this.autoDetectCaptcha=e},setAutoSwitchHeadless:e=>{this.autoSwitchHeadless=e},setCaptchaTimeout:e=>{this.captchaTimeout=e},getTabRegistry:()=>this.getCurrentTabRegistry(),onBrowserAttachStateChanged:this.onBrowserAttachStateChanged});this.browserControl=l.browserControl,this.targetControl=l.targetControl,this.camoufoxBrowser=l.camoufoxBrowser,this.pageNavigation=l.pageNavigation,this.pageInteraction=l.pageInteraction,this.pageEvaluation=l.pageEvaluation,this.targetEvaluation=l.targetEvaluation,this.pageDialog=l.pageDialog,this.pageData=l.pageData,this.consoleHandlers=l.consoleHandlers,this.scriptManagement=l.scriptManagement,this.captchaHandlers=l.captchaHandlers,this.stealthInjection=l.stealthInjection,this.frameworkState=l.frameworkState,this.indexedDBDump=l.indexedDBDump,this.jsHeapSearch=l.jsHeapSearch,this.tabWorkflow=l.tabWorkflow,this.detailedData=l.detailedData,this.jsdomHandlers=l.jsdomHandlers,this.tabRegistry=l.tabRegistry}makeJsonResponse(e){return{content:[{type:`text`,text:JSON.stringify(e,null,2)}]}}sanitizeCodegenArgs(e){let t={...e};for(let e of[`delay`,`timeout`])t[e]===void 0&&delete t[e];return t}getCurrentTabRegistry(){let e=this.getCurrentSessionId?.()??null;return this.sessionCoordinator?.getTabRegistry(e)??this.tabRegistry}isSameFrameArgs(e,t){return(e.frameUrl??null)===(t.frameUrl??null)&&(e.frameSelector??null)===(t.frameSelector??null)}compactCodegenSteps(e){let t=[];for(let n of e){let e={tool:n.tool,args:this.sanitizeCodegenArgs(n.args),timestamp:n.timestamp},r=t.at(-1);if(!r){t.push(e);continue}if(e.tool===`page_wait_for_selector`&&r.tool===`page_wait_for_selector`&&e.args.selector===r.args.selector&&this.isSameFrameArgs(e.args,r.args)){r.timestamp=e.timestamp;continue}if(!(e.tool===`page_wait_for_selector`&&(r.tool===`page_click`||r.tool===`page_type`)&&e.args.selector===r.args.selector&&this.isSameFrameArgs(e.args,r.args))){if(e.tool===r.tool&&JSON.stringify(e.args)===JSON.stringify(r.args)){r.timestamp=e.timestamp;continue}t.push(e)}}return t}formatCodegenScript(e){return[`const steps = [`,...e.map(e=>` ${JSON.stringify({tool:e.tool,args:e.args},null,0)},`),`];`,``,`for (const step of steps) {`,` await callTool(step.tool, step.args);`,`}`].join(`
|
|
29
|
+
`)}getTabRegistry(){return this.getCurrentTabRegistry()}async getCamoufoxPage(){if(!this.camoufoxManager)throw Error(`Camoufox browser not launched. Call browser_launch(driver="camoufox") first.`);return this.camoufoxPage||=await this.camoufoxManager.newPage(),this.camoufoxPage}async closeCamoufox(){try{await this.consoleMonitor.disable()}catch(t){e.warn(`Failed to reset console monitor before closing Camoufox: ${String(t)}`)}this.consoleMonitor.clearPlaywrightPage(),this.camoufoxManager&&(await this.camoufoxManager.close(),this.camoufoxManager=null,this.camoufoxPage=null)}async handleBrowserLaunch(e){return E(e,`driver`,`chrome`)===`camoufox`?this.handleCamoufoxLaunch(e):(this.activeDriver===`camoufox`&&this.camoufoxManager&&await this.closeCamoufox(),this.activeDriver=`chrome`,this.browserControl.handleBrowserLaunch(e))}async handleBrowserClose(e){return this.activeDriver===`camoufox`&&this.camoufoxManager?(await this.closeCamoufox(),await this.browserControl.handleBrowserClose(e),this.activeDriver=`chrome`,{content:[{type:`text`,text:JSON.stringify({success:!0,message:`Camoufox browser closed`},null,2)}]}):this.browserControl.handleBrowserClose(e)}async handleBrowserStatus(e){if(this.activeDriver===`camoufox`){let e=!!this.camoufoxManager?.getBrowser();return{content:[{type:`text`,text:JSON.stringify({success:!0,driver:`camoufox`,running:e,hasActivePage:!!this.camoufoxPage},null,2)}]}}return this.browserControl.handleBrowserStatus(e)}async handleBrowserListTabs(e){return this.browserControl.handleBrowserListTabs(e)}async handleBrowserListCdpTargets(e){return this.targetControl.handleBrowserListCdpTargets(e)}async handleBrowserSelectTab(e){return this.browserControl.handleBrowserSelectTab(e)}async handleBrowserAttachCdpTarget(e){return this.targetControl.handleBrowserAttachCdpTarget(e)}async handleBrowserDetachCdpTarget(e){return this.targetControl.handleBrowserDetachCdpTarget(e)}async handleBrowserEvaluateCdpTarget(e){return this.targetEvaluation.handleBrowserEvaluateCdpTarget(e)}async handleBrowserListWorkers(e){return this.targetControl.handleBrowserListWorkers(e)}async handleBrowserWorkerScripts(e){return this.targetControl.handleBrowserWorkerScripts(e)}async handleServiceWorkerDeliverPush(e){return this.targetControl.handleServiceWorkerDeliverPush(e)}async handleServiceWorkerDispatchSync(e){return this.targetControl.handleServiceWorkerDispatchSync(e)}async handleBrowserAttach(e){return this.activeDriver===`camoufox`&&this.camoufoxManager&&await this.closeCamoufox(),this.activeDriver=`chrome`,this.browserControl.handleBrowserAttach(e)}async handleCamoufoxServerDispatch(e){switch(String(e.action??``)){case`close`:return this.camoufoxBrowser.handleCamoufoxServerClose(e);case`status`:return this.camoufoxBrowser.handleCamoufoxServerStatus(e);default:return this.camoufoxBrowser.handleCamoufoxServerLaunch(e)}}async handleCamoufoxServerLaunch(e){return this.camoufoxBrowser.handleCamoufoxServerLaunch(e)}async handleCamoufoxServerClose(e){return this.camoufoxBrowser.handleCamoufoxServerClose(e)}async handleCamoufoxServerStatus(e){return this.camoufoxBrowser.handleCamoufoxServerStatus(e)}async handlePageNavigate(e){return this.activeDriver===`camoufox`?this.handleCamoufoxNavigate(e):this.pageNavigation.handlePageNavigate(e)}async handlePageReload(e){return this.pageNavigation.handlePageReload(e)}async handlePageBack(e){return this.pageNavigation.handlePageBack(e)}async handlePageForward(e){return this.pageNavigation.handlePageForward(e)}async handlePageListFrames(e){return this.pageData.handlePageListFrames(e)}async handlePageClick(e){return this.pageInteraction.handlePageClick(e)}async handlePageType(e){return this.pageInteraction.handlePageType(e)}async handlePageUploadFiles(e){return this.pageInteraction.handlePageUploadFiles(e)}async handlePageSelect(e){return this.pageInteraction.handlePageSelect(e)}async handlePageHover(e){return this.pageInteraction.handlePageHover(e)}async handlePageScroll(e){return this.pageInteraction.handlePageScroll(e)}async handlePagePressKey(e){return this.pageInteraction.handlePagePressKey(e)}async handlePageHandleDialog(e){return this.pageDialog.handlePageHandleDialog(e)}async handlePageEvaluate(e){return this.pageEvaluation.handlePageEvaluate(e)}async handlePageScreenshot(e){return this.pageEvaluation.handlePageScreenshot(e)}async handlePageInjectScript(e){return this.pageEvaluation.handlePageInjectScript(e)}async handlePageWaitForSelector(e){return this.pageEvaluation.handlePageWaitForSelector(e)}async handlePageCookiesDispatch(e){let t=String(e.action??``);switch(t){case`get`:return this.pageData.handlePageGetCookies(e);case`set`:return this.pageData.handlePageSetCookies(e);case`clear`:{let t=e.expectedCount;if(typeof t!=`number`||t<0)return S(new x(`VALIDATION`,`action=clear requires expectedCount (number). Call action=get first to obtain the current cookie count.`,{toolName:`page_cookies`}));let n=await this.pageData.getPageCookieCount();return n===t?this.pageData.handlePageClearCookies(e):S(new x(`VALIDATION`,`Cookie count mismatch: expected ${t} but found ${n}. Call action=get to refresh, then retry with the correct count.`,{toolName:`page_cookies`,details:{expected:t,actual:n}}))}default:return S(new x(`VALIDATION`,`Invalid action: "${t}". Expected one of: get, set, clear`,{toolName:`page_cookies`}))}}async handlePageSetViewport(e){return this.pageData.handlePageSetViewport(e)}async handlePageEmulateDevice(e){return this.pageData.handlePageEmulateDevice(e)}async handlePageLocalStorageDispatch(e){let t=String(e.action??``);switch(t){case`get`:return this.pageData.handlePageGetLocalStorage(e);case`set`:return this.pageData.handlePageSetLocalStorage(e);case`delete`:return this.pageData.handlePageDeleteLocalStorage(e);case`clear`:return this.pageData.handlePageClearLocalStorage();default:return S(new x(`VALIDATION`,`Invalid action: "${t}". Expected one of: get, set, delete, clear`,{toolName:`page_local_storage`}))}}async handlePageSessionStorageDispatch(e){let t=String(e.action??``);switch(t){case`get`:return this.pageData.handlePageGetSessionStorage(e);case`set`:return this.pageData.handlePageSetSessionStorage(e);case`delete`:return this.pageData.handlePageDeleteSessionStorage(e);case`clear`:return this.pageData.handlePageClearSessionStorage();default:return S(new x(`VALIDATION`,`Invalid action: "${t}". Expected one of: get, set, delete, clear`,{toolName:`page_session_storage`}))}}async handlePageStorageInfo(e){return this.pageData.handlePageStorageInfo(e)}async handleBrowserPasskeySeed(e){return this.pageData.handleBrowserPasskeySeed(e)}async handleConsoleMonitor(e){return this.consoleHandlers.handleConsoleMonitor(e)}async handleConsoleGetLogs(e){return this.consoleHandlers.handleConsoleGetLogs(e)}async handleConsoleExecute(e){return this.consoleHandlers.handleConsoleExecute(e)}async handleGetAllScripts(e){return this.scriptManagement.handleGetAllScripts(e)}async handleGetScriptSource(e){return this.scriptManagement.handleGetScriptSource(e)}async handleCaptchaDetect(e){return this.captchaHandlers.handleCaptchaDetect(e)}async handleCaptchaWait(e){return this.captchaHandlers.handleCaptchaWait(e)}async handleCaptchaConfig(e){return this.captchaHandlers.handleCaptchaConfig(e)}async handleStealthInject(e){return this.stealthInjection.handleStealthInject(e)}async handleStealthSetUserAgent(e){return this.stealthInjection.handleStealthSetUserAgent(e)}async handleStealthConfigureJitter(e){return this.stealthInjection.handleStealthConfigureJitter(e)}async handleStealthGenerateFingerprint(e){return this.stealthInjection.handleStealthGenerateFingerprint(e)}async handleStealthVerify(e){return this.stealthInjection.handleStealthVerify(e)}async handleBrowserFontFingerprint(e){return this.stealthInjection.handleBrowserFontFingerprint(e)}async handleCamoufoxGeolocation(e){return this.stealthInjection.handleCamoufoxGeolocation(e)}async handleFrameworkStateExtract(e){return this.frameworkState.handleFrameworkStateExtract(e)}async handleIndexedDBDump(e){return this.indexedDBDump.handleIndexedDBDump(e)}async handleJSHeapSearch(e){return this.jsHeapSearch.handleJSHeapSearch(e)}async handleTabWorkflow(e){return this.tabWorkflow.handleTabWorkflow(e)}async handleBrowserCodegenStart(){return this.eventBus?(this.codegenStopListening?.(),this.codegenSteps=[],this.codegenStopListening=this.eventBus.on(`tool:called`,e=>{e.domain!==`browser`||!e.success||e.result?.success===!1||Wt.has(e.toolName)&&this.codegenSteps.push({tool:e.toolName,args:{...e.args},timestamp:e.timestamp})}),this.makeJsonResponse({success:!0,recording:!0,message:`Browser action recording started.`})):this.makeJsonResponse({success:!1,message:`Event bus unavailable for browser codegen recording.`})}async handleBrowserCodegenStop(){this.codegenStopListening?.(),this.codegenStopListening=void 0;let e=[...this.codegenSteps],t=this.compactCodegenSteps(e);return this.codegenSteps=[],this.makeJsonResponse({success:!0,recording:!1,stepCount:t.length,rawStepCount:e.length,steps:t,script:this.formatCodegenScript(t)})}async handleGetDetailedData(e){return this.detailedData.handleGetDetailedData(e)}async handleGetOffloadedData(e){return this.detailedData.handleGetOffloadedData(e)}async handlePageCoverageStart(e){let{handlePageCoverageStart:t}=await import(`./coverage-and-block--cWjjEe5.mjs`);return t({collector:this.collector},e)}async handlePageCoverageStop(e){let{handlePageCoverageStop:t}=await import(`./coverage-and-block--cWjjEe5.mjs`);return t({collector:this.collector},e)}async handlePageBlockScript(e){let{handlePageBlockScript:t}=await import(`./coverage-and-block--cWjjEe5.mjs`);return t(e)}async handleCamoufoxLaunch(e){return Ht({setCamoufoxManager:e=>{this.camoufoxManager=e},setActiveDriver:e=>{this.activeDriver=e},clearCamoufoxPage:()=>{this.camoufoxPage=null}},e)}async handleCamoufoxNavigate(e){return Ut({getCamoufoxPage:()=>this.getCamoufoxPage(),setConsoleMonitorPage:e=>{this.consoleMonitor.setPlaywrightPage(e)}},e)}async handleHumanMouse(e){return mt(e,this.collector,this.pageController)}async handleHumanScroll(e){return ht(e,this.collector)}async handleHumanTyping(e){return gt(e,this.collector,this.pageController)}async handleCaptchaVisionSolve(e){return Nt(e,this.collector)}async handleWidgetChallengeSolve(e){return Pt(e,this.collector)}async handleCaptchaSolverCapabilities(){return Bt(this.collector)}async handleJsdomParse(e){return this.jsdomHandlers.handleJsdomParse(e)}async handleJsdomQuery(e){return this.jsdomHandlers.handleJsdomQuery(e)}async handleJsdomExecute(e){return this.jsdomHandlers.handleJsdomExecute(e)}async handleJsdomSerialize(e){return this.jsdomHandlers.handleJsdomSerialize(e)}async handleJsdomCookies(e){return this.jsdomHandlers.handleJsdomCookies(e)}};export{Gt as BrowserToolHandlers};
|