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